mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-22 18:52:30 +00:00
Just start a new PR. Conflicts were too wild
This commit is contained in:
114
src/xmodem.cpp
114
src/xmodem.cpp
@@ -36,13 +36,13 @@ XModemAdapter xModem;
|
||||
|
||||
XModemAdapter::XModemAdapter()
|
||||
{
|
||||
xmodemStore = (meshtastic_XModem *)malloc(meshtastic_XModem_size);
|
||||
}
|
||||
|
||||
unsigned short XModemAdapter::crc16_ccitt(const pb_byte_t *buffer, int length)
|
||||
{
|
||||
unsigned short crc16 = 0;
|
||||
while (length != 0) {
|
||||
while (length != 0)
|
||||
{
|
||||
crc16 = (unsigned char)(crc16 >> 8) | (crc16 << 8);
|
||||
crc16 ^= *buffer;
|
||||
crc16 ^= (unsigned char)(crc16 & 0xff) >> 4;
|
||||
@@ -66,32 +66,32 @@ int XModemAdapter::check(const pb_byte_t *buf, int sz, unsigned short tcrc)
|
||||
|
||||
void XModemAdapter::sendControl(meshtastic_XModem_Control c)
|
||||
{
|
||||
memset(xmodemStore, 0, meshtastic_XModem_size);
|
||||
xmodemStore->control = c;
|
||||
xmodemStore = meshtastic_XModem_init_zero;
|
||||
xmodemStore.control = c;
|
||||
LOG_DEBUG("XModem: Notify Sending control %d.\n", c);
|
||||
packetReady.notifyObservers(packetno);
|
||||
}
|
||||
|
||||
meshtastic_XModem *XModemAdapter::getForPhone()
|
||||
meshtastic_XModem XModemAdapter::getForPhone()
|
||||
{
|
||||
if (xmodemStore) {
|
||||
return xmodemStore;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
return xmodemStore;
|
||||
}
|
||||
|
||||
void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
{
|
||||
switch (xmodemPacket.control) {
|
||||
switch (xmodemPacket.control)
|
||||
{
|
||||
case meshtastic_XModem_Control_SOH:
|
||||
case meshtastic_XModem_Control_STX:
|
||||
if ((xmodemPacket.seq == 0) && !isReceiving && !isTransmitting) {
|
||||
if ((xmodemPacket.seq == 0) && !isReceiving && !isTransmitting)
|
||||
{
|
||||
// NULL packet has the destination filename
|
||||
memcpy(filename, &xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
|
||||
if (xmodemPacket.control == meshtastic_XModem_Control_SOH) { // Receive this file and put to Flash
|
||||
if (xmodemPacket.control == meshtastic_XModem_Control_SOH)
|
||||
{ // Receive this file and put to Flash
|
||||
file = FSCom.open(filename, FILE_O_WRITE);
|
||||
if (file) {
|
||||
if (file)
|
||||
{
|
||||
sendControl(meshtastic_XModem_Control_ACK);
|
||||
isReceiving = true;
|
||||
packetno = 1;
|
||||
@@ -100,19 +100,23 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
sendControl(meshtastic_XModem_Control_NAK);
|
||||
isReceiving = false;
|
||||
break;
|
||||
} else { // Transmit this file from Flash
|
||||
}
|
||||
else
|
||||
{ // Transmit this file from Flash
|
||||
LOG_INFO("XModem: Transmitting file %s\n", filename);
|
||||
file = FSCom.open(filename, FILE_O_READ);
|
||||
if (file) {
|
||||
if (file)
|
||||
{
|
||||
packetno = 1;
|
||||
isTransmitting = true;
|
||||
memset(xmodemStore, 0, meshtastic_XModem_size);
|
||||
xmodemStore->control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore->seq = packetno;
|
||||
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
|
||||
LOG_DEBUG("XModem: STX Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
|
||||
if (xmodemStore->buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes)) {
|
||||
xmodemStore = meshtastic_XModem_init_zero;
|
||||
xmodemStore.control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore.seq = packetno;
|
||||
xmodemStore.buffer.size = file.read(xmodemStore.buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore.crc16 = crc16_ccitt(xmodemStore.buffer.bytes, xmodemStore.buffer.size);
|
||||
LOG_DEBUG("XModem: STX Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore.buffer.size);
|
||||
if (xmodemStore.buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes))
|
||||
{
|
||||
isEOT = true;
|
||||
// send EOT on next Ack
|
||||
}
|
||||
@@ -123,11 +127,15 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
isTransmitting = false;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (isReceiving) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isReceiving)
|
||||
{
|
||||
// normal file data packet
|
||||
if ((xmodemPacket.seq == packetno) &&
|
||||
check(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size, xmodemPacket.crc16)) {
|
||||
check(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size, xmodemPacket.crc16))
|
||||
{
|
||||
// valid packet
|
||||
file.write(xmodemPacket.buffer.bytes, xmodemPacket.buffer.size);
|
||||
sendControl(meshtastic_XModem_Control_ACK);
|
||||
@@ -137,7 +145,9 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
// invalid packet
|
||||
sendControl(meshtastic_XModem_Control_NAK);
|
||||
break;
|
||||
} else if (isTransmitting) {
|
||||
}
|
||||
else if (isTransmitting)
|
||||
{
|
||||
// just received something weird.
|
||||
sendControl(meshtastic_XModem_Control_CAN);
|
||||
isTransmitting = false;
|
||||
@@ -160,8 +170,10 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
break;
|
||||
case meshtastic_XModem_Control_ACK:
|
||||
// Acknowledge Send the next packet
|
||||
if (isTransmitting) {
|
||||
if (isEOT) {
|
||||
if (isTransmitting)
|
||||
{
|
||||
if (isEOT)
|
||||
{
|
||||
sendControl(meshtastic_XModem_Control_EOT);
|
||||
file.close();
|
||||
LOG_INFO("XModem: Finished sending file %s\n", filename);
|
||||
@@ -171,45 +183,53 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
|
||||
}
|
||||
retrans = MAXRETRANS; // reset retransmit counter
|
||||
packetno++;
|
||||
memset(xmodemStore, 0, meshtastic_XModem_size);
|
||||
xmodemStore->control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore->seq = packetno;
|
||||
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
|
||||
LOG_DEBUG("XModem: ACK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
|
||||
if (xmodemStore->buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes)) {
|
||||
xmodemStore = meshtastic_XModem_init_zero;
|
||||
xmodemStore.control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore.seq = packetno;
|
||||
xmodemStore.buffer.size = file.read(xmodemStore.buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore.crc16 = crc16_ccitt(xmodemStore.buffer.bytes, xmodemStore.buffer.size);
|
||||
LOG_DEBUG("XModem: ACK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore.buffer.size);
|
||||
if (xmodemStore.buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes))
|
||||
{
|
||||
isEOT = true;
|
||||
// send EOT on next Ack
|
||||
}
|
||||
packetReady.notifyObservers(packetno);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// just received something weird.
|
||||
sendControl(meshtastic_XModem_Control_CAN);
|
||||
}
|
||||
break;
|
||||
case meshtastic_XModem_Control_NAK:
|
||||
// Negative acknowledge. Send the same buffer again
|
||||
if (isTransmitting) {
|
||||
if (--retrans <= 0) {
|
||||
if (isTransmitting)
|
||||
{
|
||||
if (--retrans <= 0)
|
||||
{
|
||||
sendControl(meshtastic_XModem_Control_CAN);
|
||||
file.close();
|
||||
LOG_INFO("XModem: Retransmit timeout, cancelling file %s\n", filename);
|
||||
isTransmitting = false;
|
||||
break;
|
||||
}
|
||||
memset(xmodemStore, 0, meshtastic_XModem_size);
|
||||
xmodemStore->control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore->seq = packetno;
|
||||
xmodemStore = meshtastic_XModem_init_zero;
|
||||
xmodemStore.control = meshtastic_XModem_Control_SOH;
|
||||
xmodemStore.seq = packetno;
|
||||
file.seek((packetno - 1) * sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore->buffer.size = file.read(xmodemStore->buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore->crc16 = crc16_ccitt(xmodemStore->buffer.bytes, xmodemStore->buffer.size);
|
||||
LOG_DEBUG("XModem: NAK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore->buffer.size);
|
||||
if (xmodemStore->buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes)) {
|
||||
xmodemStore.buffer.size = file.read(xmodemStore.buffer.bytes, sizeof(meshtastic_XModem_buffer_t::bytes));
|
||||
xmodemStore.crc16 = crc16_ccitt(xmodemStore.buffer.bytes, xmodemStore.buffer.size);
|
||||
LOG_DEBUG("XModem: NAK Notify Sending packet %d, %d Bytes.\n", packetno, xmodemStore.buffer.size);
|
||||
if (xmodemStore.buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes))
|
||||
{
|
||||
isEOT = true;
|
||||
// send EOT on next Ack
|
||||
}
|
||||
packetReady.notifyObservers(packetno);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// just received something weird.
|
||||
sendControl(meshtastic_XModem_Control_CAN);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user