This commit is contained in:
Ben Meadors
2023-01-22 08:49:06 -06:00
parent 4c9f0b2646
commit ac6d4e33d4
4 changed files with 153 additions and 212 deletions

View File

@@ -34,15 +34,12 @@
XModemAdapter xModem;
XModemAdapter::XModemAdapter()
{
}
XModemAdapter::XModemAdapter() {}
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;
@@ -79,19 +76,15 @@ meshtastic_XModem XModemAdapter::getForPhone()
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,13 +93,10 @@ 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;
xmodemStore = meshtastic_XModem_init_zero;
@@ -115,8 +105,7 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
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))
{
if (xmodemStore.buffer.size < sizeof(meshtastic_XModem_buffer_t::bytes)) {
isEOT = true;
// send EOT on next Ack
}
@@ -127,15 +116,11 @@ 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);
@@ -145,9 +130,7 @@ 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;
@@ -170,10 +153,8 @@ 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);
@@ -189,25 +170,20 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
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))
{
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);
@@ -221,15 +197,12 @@ void XModemAdapter::handlePacket(meshtastic_XModem xmodemPacket)
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))
{
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);
}