Make zbbridge transfer more verbose

Make zbbridge transfer more verbose (#10413)
This commit is contained in:
Theo Arends 2021-01-19 11:54:49 +01:00
parent a0bdf43e11
commit ec74dc3a51

View File

@ -81,6 +81,13 @@ char ZigbeeUploadFlashRead(void) {
ZbUpload.byte_counter++; ZbUpload.byte_counter++;
if (ZbUpload.byte_counter > ZbUpload.ota_size) { if (ZbUpload.byte_counter > ZbUpload.ota_size) {
// static bool padding = true;
// if (padding) {
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Start padding from %d"), ZbUpload.byte_counter);
// padding = false;
// }
// When the source device reaches the last XModem data block, it should be padded to 128 bytes // When the source device reaches the last XModem data block, it should be padded to 128 bytes
// of data using SUB (ASCII 0x1A) characters. // of data using SUB (ASCII 0x1A) characters.
data = XM_SUB; data = XM_SUB;
@ -107,8 +114,8 @@ struct XMODEM {
uint32_t delay = 0; uint32_t delay = 0;
uint32_t flush_delay = 0xFFFFFFFF; uint32_t flush_delay = 0xFFFFFFFF;
uint32_t filepos = 0; uint32_t filepos = 0;
uint32_t packet_no = 1;
int crcBuf = 0; int crcBuf = 0;
uint8_t packetNo = 1;
uint8_t checksumBuf = 0; uint8_t checksumBuf = 0;
bool oldChecksum; bool oldChecksum;
} XModem; } XModem;
@ -142,6 +149,11 @@ char XModemWaitACK(void)
if (i > 200) { return -1; } if (i > 200) { return -1; }
} }
in_char = ZigbeeSerial->read(); in_char = ZigbeeSerial->read();
// if (in_char != XM_ACK) {
// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("XMD: Rcvd3 0x%02X"), in_char);
// }
if (XM_CAN == in_char) { return XM_CAN; } if (XM_CAN == in_char) { return XM_CAN; }
} while ((in_char != XM_NAK) && (in_char != XM_ACK) && (in_char != 'C')); } while ((in_char != XM_NAK) && (in_char != XM_ACK) && (in_char != 'C'));
return in_char; return in_char;
@ -162,10 +174,12 @@ bool XModemSendPacket(uint32_t packet_no) {
XModem.checksumBuf = 0x00; XModem.checksumBuf = 0x00;
XModem.crcBuf = 0x00; XModem.crcBuf = 0x00;
uint8_t packet_num = packet_no;
// Try to send packet, so header first // Try to send packet, so header first
ZigbeeSerial->write(XM_SOH); ZigbeeSerial->write(XM_SOH);
ZigbeeSerial->write(packet_no); ZigbeeSerial->write(packet_num);
ZigbeeSerial->write(~packet_no); ZigbeeSerial->write(~packet_num);
for (uint32_t i = 0; i < XMODEM_PACKET_SIZE; i++) { for (uint32_t i = 0; i < XMODEM_PACKET_SIZE; i++) {
in_char = ZigbeeUploadFlashRead(); in_char = ZigbeeUploadFlashRead();
XModemOutputByte(in_char); XModemOutputByte(in_char);
@ -220,6 +234,13 @@ bool ZigbeeUploadBootloaderPrompt(void) {
yield(); yield();
char bootloader_byte = ZigbeeSerial->read(); char bootloader_byte = ZigbeeSerial->read();
// [cr][lf]
// Gecko Bootloader v1.A.3 or Gecko Bootloader v1.9.1.04[cr][lf]
// 1. upload gbl[cr][lf]
// 2. run[cr][lf]
// 3. ebl info[cr][lf]
// BL >
if (((uint8_t)bootloader_byte >=0) && (buf_len < sizeof(serial_buffer) -2)) { if (((uint8_t)bootloader_byte >=0) && (buf_len < sizeof(serial_buffer) -2)) {
serial_buffer[buf_len++] = bootloader_byte; serial_buffer[buf_len++] = bootloader_byte;
} }
@ -332,17 +353,18 @@ bool ZigbeeUploadXmodem(void) {
} }
} else { } else {
// After the bootloader receives a carriage return from the target device, it displays a menu // After the bootloader receives a carriage return from the target device, it displays a menu
// Gecko Bootloader v1.A.3 // [cr][lf]
// 1. upload gbl // Gecko Bootloader v1.A.3 or Gecko Bootloader v1.9.1.04[cr][lf]
// 2. run // 1. upload gbl[cr][lf]
// 3. ebl info // 2. run[cr][lf]
// 3. ebl info[cr][lf]
// BL > // BL >
if (ZigbeeUploadBootloaderPrompt()) { if (ZigbeeUploadBootloaderPrompt()) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Init sync")); AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Init sync"));
ZigbeeSerial->flush(); ZigbeeSerial->flush();
ZigbeeSerial->write('1'); // upload ebl ZigbeeSerial->write('1'); // upload ebl
if (TasmotaGlobal.sleep > 0) { if (TasmotaGlobal.sleep > 0) {
TasmotaGlobal.sleep = 1; // Speed up loop used for xmodem upload TasmotaGlobal.sleep = 1; // Speed up loop used for xmodem upload
} }
XModem.timeout = millis() + (XMODEM_SYNC_TIMEOUT * 1000); XModem.timeout = millis() + (XMODEM_SYNC_TIMEOUT * 1000);
ZbUpload.ota_step = ZBU_SYNC; ZbUpload.ota_step = ZBU_SYNC;
@ -358,11 +380,17 @@ bool ZigbeeUploadXmodem(void) {
} }
// Wait for either C or NACK as a sync packet. Determines protocol details, checksum algorithm. // Wait for either C or NACK as a sync packet. Determines protocol details, checksum algorithm.
if (ZigbeeSerial->available()) { if (ZigbeeSerial->available()) {
// [cr][lf]
// begin upload[cr][lf]
// C
char xmodem_sync = ZigbeeSerial->read(); char xmodem_sync = ZigbeeSerial->read();
// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("XMD: Rcvd2 0x%02X"), xmodem_sync);
if (('C' == xmodem_sync) || (XM_NAK == xmodem_sync)) { if (('C' == xmodem_sync) || (XM_NAK == xmodem_sync)) {
// Determine which checksum algorithm to use // Determine which checksum algorithm to use
XModem.oldChecksum = (xmodem_sync == XM_NAK); XModem.oldChecksum = (xmodem_sync == XM_NAK);
XModem.packetNo = 1; XModem.packet_no = 1;
ZbUpload.byte_counter = 0; ZbUpload.byte_counter = 0;
ZbUpload.ota_step = ZBU_UPLOAD; ZbUpload.ota_step = ZBU_UPLOAD;
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Init packet send")); AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Init packet send"));
@ -372,12 +400,15 @@ bool ZigbeeUploadXmodem(void) {
} }
case ZBU_UPLOAD: { // *** Handle file upload using XModem - upload case ZBU_UPLOAD: { // *** Handle file upload using XModem - upload
if (ZigbeeUploadAvailable()) { if (ZigbeeUploadAvailable()) {
if (!XModemSendPacket(XModem.packetNo)) { if (ZbUpload.byte_counter && !(ZbUpload.byte_counter % 10240)) { // Show progress every 10kB
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Packet send failed")); AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Progress %d kB"), ZbUpload.byte_counter / 1024);
}
if (!XModemSendPacket(XModem.packet_no)) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Packet %d send failed"), XModem.packet_no);
ZbUpload.ota_step = ZBU_ERROR; ZbUpload.ota_step = ZBU_ERROR;
return true; return true;
} }
XModem.packetNo++; XModem.packet_no++;
} else { } else {
// Once the last block is ACKed by the target, the transfer should be finalized by an // Once the last block is ACKed by the target, the transfer should be finalized by an
// EOT (ASCII 0x04) packet from the source. Once this packet is confirmed via XModem ACK // EOT (ASCII 0x04) packet from the source. Once this packet is confirmed via XModem ACK
@ -385,6 +416,7 @@ bool ZigbeeUploadXmodem(void) {
ZigbeeSerial->write(XM_EOT); ZigbeeSerial->write(XM_EOT);
XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EOT ACK XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EOT ACK
ZbUpload.ota_step = ZBU_EOT; ZbUpload.ota_step = ZBU_EOT;
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Transferred %d bytes"), ZbUpload.ota_size);
} }
break; break;
} }
@ -401,7 +433,12 @@ bool ZigbeeUploadXmodem(void) {
} }
if (ZigbeeSerial->available()) { if (ZigbeeSerial->available()) {
char xmodem_ack = XModemWaitACK(); char xmodem_ack = XModemWaitACK();
if (XM_ACK == xmodem_ack) { if (XM_CAN == xmodem_ack) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: Transfer invalid"));
ZbUpload.ota_step = ZBU_ERROR;
return true;
}
else if (XM_ACK == xmodem_ack) {
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: " D_SUCCESSFUL)); AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: " D_SUCCESSFUL));
XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt XModem.timeout = millis() + (30 * 1000); // Allow 30 seconds to receive EBL prompt
ZbUpload.byte_counter = 0; ZbUpload.byte_counter = 0;
@ -418,28 +455,33 @@ bool ZigbeeUploadXmodem(void) {
} else { } else {
// After an image successfully uploads, the XModem transaction completes and the bootloader displays // After an image successfully uploads, the XModem transaction completes and the bootloader displays
// Serial upload complete before redisplaying the menu // Serial upload complete before redisplaying the menu
// Serial upload complete //
// Gecko Bootloader v1.A.3 // [cr][lf]
// 1. upload gbl // Serial upload complete[cr][lf]
// 2. run // [cr][lf]
// 3. ebl info // Gecko Bootloader v1.A.3 or Gecko Bootloader v1.9.1.04[cr][lf]
// 1. upload gbl[cr][lf]
// 2. run[cr][lf]
// 3. ebl info[cr][lf]
// BL > // BL >
if (ZigbeeUploadBootloaderPrompt()) { if (ZigbeeUploadBootloaderPrompt()) {
ZbUpload.state = ZBU_COMPLETE; ZbUpload.state = ZBU_COMPLETE;
ZbUpload.ota_step = ZBU_DONE; ZbUpload.ota_step = ZBU_DONE;
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: " D_RESTARTING));
} }
} }
break; break;
} }
case ZBU_ERROR: case ZBU_ERROR:
ZbUpload.state = ZBU_ERROR; ZbUpload.state = ZBU_ERROR;
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: " D_FAILED));
case ZBU_DONE: { // *** Clean up and restart to disable bootloader and use new firmware case ZBU_DONE: { // *** Clean up and restart to disable bootloader and use new firmware
AddLog_P(LOG_LEVEL_DEBUG, PSTR("XMD: " D_RESTARTING));
ZigbeeUploadSetBootloader(1); // Disable bootloader and reset MCU - should happen at restart ZigbeeUploadSetBootloader(1); // Disable bootloader and reset MCU - should happen at restart
if (1 == TasmotaGlobal.sleep) { if (1 == TasmotaGlobal.sleep) {
TasmotaGlobal.sleep = Settings.sleep; // Restore loop sleep TasmotaGlobal.sleep = Settings.sleep; // Restore loop sleep
} }
// TasmotaGlobal.restart_flag = 2; // Restart to disable bootloader and use new firmware // TasmotaGlobal.restart_flag = 2; // Restart to disable bootloader and use new firmware
if (ZbUpload.buffer) { free(ZbUpload.buffer); }
ZbUpload.ota_step = ZBU_FINISH; // Never return to zero without a restart to get a sane Zigbee environment ZbUpload.ota_step = ZBU_FINISH; // Never return to zero without a restart to get a sane Zigbee environment
break; break;
} }
@ -472,10 +514,6 @@ void ZigbeeUploadStep1Done(uint32_t data, size_t size) {
ZbUpload.state = ZBU_UPLOAD; // Signal upload done and ready for delayed upload to MCU EFR32 ZbUpload.state = ZBU_UPLOAD; // Signal upload done and ready for delayed upload to MCU EFR32
} }
bool ZigbeeUploadFinish(void) {
return (ZBU_FINISH == ZbUpload.ota_step);
}
#define WEB_HANDLE_ZIGBEE_XFER "zx" #define WEB_HANDLE_ZIGBEE_XFER "zx"
const char HTTP_SCRIPT_XFER_STATE[] PROGMEM = const char HTTP_SCRIPT_XFER_STATE[] PROGMEM =
@ -500,12 +538,12 @@ void HandleZigbeeXfer(void) {
if (!HttpCheckPriviledgedAccess()) { return; } if (!HttpCheckPriviledgedAccess()) { return; }
if (Webserver->hasArg("z")) { // Status refresh requested if (Webserver->hasArg("z")) { // Status refresh requested
WSContentBegin(200, CT_PLAIN);
WSContentSend_P(PSTR("%d"), ZbUpload.state);
WSContentEnd();
if (ZBU_ERROR == ZbUpload.state) { if (ZBU_ERROR == ZbUpload.state) {
Web.upload_error = 7; // Upload aborted (xmodem transfer failed) Web.upload_error = 7; // Upload aborted (xmodem transfer failed)
} }
WSContentBegin(200, CT_PLAIN);
WSContentSend_P(PSTR("%d"), ZbUpload.state);
WSContentEnd();
return; return;
} }