From ebd6b5289ce754e5ef8cd55022e399f8d887246a Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Fri, 23 Feb 2024 17:08:52 +0100 Subject: [PATCH] lot of small fixes - adds tag serial debug in webflasher and power up/down buttons - fixes bug where esp32-s3 connected via usb cdc slows down when no terminal connection is present - fix: ghost tags reporting a different channel id than the AP are now ignored - webflasher now ramps up/down power to prevent spikes - bugfix: C6 doesn't get reset anoymore by the watchdog during flashing - bugfix: C6 could go in flash mode unintended - a failed connection during swd write blocks is now reported back instead of silently ignored - added 4 areas of Sweden to day ahead price content - new context menu option 'Delete all inactive tags' (only when right clicking on an inactive tag). - adjusted some timings --- ESP32_AP-Flasher/include/powermgt.h | 1 + ESP32_AP-Flasher/include/usbflasher.h | 1 + ESP32_AP-Flasher/include/webflasher.h | 2 + ESP32_AP-Flasher/platformio.ini | 8 ++-- ESP32_AP-Flasher/src/flasher.cpp | 2 +- ESP32_AP-Flasher/src/main.cpp | 3 ++ ESP32_AP-Flasher/src/newproto.cpp | 29 ++++++++++---- ESP32_AP-Flasher/src/ota.cpp | 2 +- ESP32_AP-Flasher/src/powermgt.cpp | 37 +++++++++++------ ESP32_AP-Flasher/src/serialap.cpp | 15 +++++-- ESP32_AP-Flasher/src/swd.cpp | 10 ++--- ESP32_AP-Flasher/src/usbflasher.cpp | 34 ++++++++++------ ESP32_AP-Flasher/src/web.cpp | 14 ++++++- ESP32_AP-Flasher/src/webflasher.cpp | 44 +++++++++++++++++++-- ESP32_AP-Flasher/wwwroot/content_cards.json | 4 ++ ESP32_AP-Flasher/wwwroot/flash.js | 24 +++++++++++ ESP32_AP-Flasher/wwwroot/index.html | 4 +- ESP32_AP-Flasher/wwwroot/main.js | 36 ++++++++++------- Tag_Flasher/OEPL-Flasher.py | 8 +++- 19 files changed, 210 insertions(+), 68 deletions(-) diff --git a/ESP32_AP-Flasher/include/powermgt.h b/ESP32_AP-Flasher/include/powermgt.h index 2fbd68a0..3e8c1b3c 100644 --- a/ESP32_AP-Flasher/include/powermgt.h +++ b/ESP32_AP-Flasher/include/powermgt.h @@ -1,3 +1,4 @@ #include void powerControl(bool powerState, uint8_t* pin, uint8_t pincount); +void rampTagPower(uint8_t* pin, bool up); \ No newline at end of file diff --git a/ESP32_AP-Flasher/include/usbflasher.h b/ESP32_AP-Flasher/include/usbflasher.h index 44aeb248..f62f6c49 100644 --- a/ESP32_AP-Flasher/include/usbflasher.h +++ b/ESP32_AP-Flasher/include/usbflasher.h @@ -8,3 +8,4 @@ void usbFlasherTask(void* parameter); #endif void flasherDataHandler(uint8_t* data, size_t len, uint8_t transportType); void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType); +void tagDebugPassthrough(); \ No newline at end of file diff --git a/ESP32_AP-Flasher/include/webflasher.h b/ESP32_AP-Flasher/include/webflasher.h index f1ccd0f1..248f5831 100644 --- a/ESP32_AP-Flasher/include/webflasher.h +++ b/ESP32_AP-Flasher/include/webflasher.h @@ -8,6 +8,8 @@ #define WEBFLASH_ENABLE_USBFLASHER 2 #define WEBFLASH_FOCUS 3 #define WEBFLASH_BLUR 4 +#define WEBFLASH_POWER_ON 5 +#define WEBFLASH_POWER_OFF 6 class Logger : public Print { public: diff --git a/ESP32_AP-Flasher/platformio.ini b/ESP32_AP-Flasher/platformio.ini index a06a602f..fb362a10 100644 --- a/ESP32_AP-Flasher/platformio.ini +++ b/ESP32_AP-Flasher/platformio.ini @@ -404,8 +404,8 @@ build_flags = -D FLASHER_EXT_MISO=42 -D FLASHER_EXT_RESET=5 -D FLASHER_EXT_POWER={6} - -D FLASHER_EXT_TXD=38 - -D FLASHER_EXT_RXD=39 + -D FLASHER_EXT_TXD=39 + -D FLASHER_EXT_RXD=38 -D FLASHER_EXT_TEST=4 -D FLASHER_ALT_SS=-1 -D FLASHER_ALT_CLK=-1 @@ -436,8 +436,8 @@ build_flags = -D LOAD_GLCD -D MD5_ENABLED=1 -D SERIAL_FLASHER_INTERFACE_UART=1 - -D SERIAL_FLASHER_BOOT_HOLD_TIME_MS=50 - -D SERIAL_FLASHER_RESET_HOLD_TIME_MS=100 + -D SERIAL_FLASHER_BOOT_HOLD_TIME_MS=200 + -D SERIAL_FLASHER_RESET_HOLD_TIME_MS=200 -D C6_OTA_FLASHING build_src_filter = +<*> diff --git a/ESP32_AP-Flasher/src/flasher.cpp b/ESP32_AP-Flasher/src/flasher.cpp index 3882dc12..f740fbde 100644 --- a/ESP32_AP-Flasher/src/flasher.cpp +++ b/ESP32_AP-Flasher/src/flasher.cpp @@ -64,7 +64,7 @@ int8_t pinsAP[] = {FLASHER_AP_CLK, FLASHER_AP_MISO, FLASHER_AP_MOSI, FLASHER_AP_ #ifdef HAS_EXT_FLASHER int8_t powerPinsExt[] = FLASHER_EXT_POWER; int8_t powerPinsAlt[] = FLASHER_ALT_POWER; -uint8_t pinsExt[] = {FLASHER_EXT_CLK, FLASHER_EXT_MISO, FLASHER_EXT_MOSI, FLASHER_EXT_RESET, FLASHER_EXT_RXD, FLASHER_EXT_SS, FLASHER_EXT_TEST, FLASHER_EXT_TXD}; +// uint8_t pinsExt[] = {FLASHER_EXT_CLK, FLASHER_EXT_MISO, FLASHER_EXT_MOSI, FLASHER_EXT_RESET, FLASHER_EXT_RXD, FLASHER_EXT_SS, FLASHER_EXT_TEST, FLASHER_EXT_TXD}; #endif flasher::flasher() { diff --git a/ESP32_AP-Flasher/src/main.cpp b/ESP32_AP-Flasher/src/main.cpp index 1cb6d807..d48620e2 100644 --- a/ESP32_AP-Flasher/src/main.cpp +++ b/ESP32_AP-Flasher/src/main.cpp @@ -47,6 +47,9 @@ void delayedStart(void* parameter) { void setup() { Serial.begin(115200); +#ifdef ARDUINO_USB_CDC_ON_BOOT + Serial.setTxTimeoutMs(0); // workaround bug in USB CDC that slows down serial output when no usb connected +#endif Serial.print(">\n"); #ifdef HAS_TFT extern void yellow_ap_display_init(void); diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 3ee89670..3c813ffe 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -183,7 +183,7 @@ bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgume if (!filename.startsWith("/")) { filename = "/" + filename; } - + if (!contentFS->exists(filename)) { wsErr("File not found. " + filename); return false; @@ -511,6 +511,7 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP tagRecord* taginfo = tagRecord::findByMAC(eadr->src); if (taginfo == nullptr) { if (config.lock == 1 || (config.lock == 2 && eadr->adr.wakeupReason != WAKEUP_REASON_FIRSTBOOT)) return; + if (eadr->adr.currentChannel > 0 && eadr->adr.currentChannel != apInfo.channel) return; taginfo = new tagRecord; memcpy(taginfo->mac, eadr->src, sizeof(taginfo->mac)); taginfo->pendingCount = 0; @@ -926,16 +927,28 @@ bool queueDataAvail(struct pendingData* pending, bool local) { } newPending.len = taginfo->len; - if (countQueueItem(pending->targetMac) == 0) { - enqueueItem(newPending); - // first in line, send to tag - Serial.printf("queue item added, first in line, total %d elements\n", pendingQueue.size()); - if (local) sendDataAvail(pending); + if ((pending->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || pending->availdatainfo.dataType == DATATYPE_IMG_ZLIB) && (pending->availdatainfo.dataTypeArgument & 0xF8) == 0x00) { + // in case of an image (no preload), remove already queued images + pendingQueue.erase(std::remove_if(pendingQueue.begin(), pendingQueue.end(), + [pending](const PendingItem& item) { + bool macMatches = memcmp(item.pendingdata.targetMac, pending->targetMac, sizeof(item.pendingdata.targetMac)) == 0; + bool dataTypeArgumentMatches = (pending->availdatainfo.dataType == item.pendingdata.availdatainfo.dataType) && ((item.pendingdata.availdatainfo.dataTypeArgument & 0xF8) == 0x00); + return macMatches && dataTypeArgumentMatches; + }), + pendingQueue.end()); + } + + enqueueItem(newPending); + taginfo->pendingCount = countQueueItem(pending->targetMac); + if (taginfo->pendingCount == 1) { + Serial.printf("queue item added, first in line\n"); + // if (local) sendDataAvail(pending); } else { - enqueueItem(newPending); - Serial.printf("queue item added, total %d elements\n", pendingQueue.size()); + Serial.printf("queue item added, total %d elements\n", taginfo->pendingCount); // to do: notify C6 to shorten the checkin time for the current SDA } + if (local) checkQueue(pending->targetMac); + return true; } diff --git a/ESP32_AP-Flasher/src/ota.cpp b/ESP32_AP-Flasher/src/ota.cpp index e627e1c1..921958b4 100644 --- a/ESP32_AP-Flasher/src/ota.cpp +++ b/ESP32_AP-Flasher/src/ota.cpp @@ -251,8 +251,8 @@ void C6firmwareUpdateTask(void* parameter) { config.runStatus = RUNSTATUS_STOP; extern bool rxSerialStopTask2; rxSerialStopTask2 = true; + vTaskDelay(500 / portTICK_PERIOD_MS); Serial1.end(); - delay(250); wsSerial("C6 flash starting"); diff --git a/ESP32_AP-Flasher/src/powermgt.cpp b/ESP32_AP-Flasher/src/powermgt.cpp index 6992cf58..7c52b35e 100644 --- a/ESP32_AP-Flasher/src/powermgt.cpp +++ b/ESP32_AP-Flasher/src/powermgt.cpp @@ -33,36 +33,36 @@ void rampTagPower(uint8_t* pin, bool up) { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); #endif if (up) { - ledcSetup(0, 152000, 8); // 141251 okay // 101251 okay + ledcSetup(0, 50000, 8); ledcWrite(0, 254); vTaskDelay(1 / portTICK_PERIOD_MS); - ledcAttachPin(pin[0], 0); pinMode(pin[0], OUTPUT); + pinMode(FLASHER_EXT_RESET, OUTPUT); + digitalWrite(FLASHER_EXT_RESET, LOW); + ledcAttachPin(pin[0], 0); vTaskDelay(10 / portTICK_PERIOD_MS); for (uint8_t c = 254; c != 0xFF; c--) { ledcWrite(0, c); - if (c > 250) { - vTaskDelay(2 / portTICK_PERIOD_MS); - } else { - delayMicroseconds(100); - } + delayMicroseconds(700); } digitalWrite(pin[0], LOW); ledcDetachPin(pin[0]); digitalWrite(pin[0], LOW); + digitalWrite(FLASHER_EXT_RESET, INPUT_PULLUP); } else { - ledcSetup(0, 152000, 8); // 141251 okay // 101251 okay + ledcSetup(0, 50000, 8); ledcWrite(0, 0); vTaskDelay(1 / portTICK_PERIOD_MS); - ledcAttachPin(pin[0], 0); pinMode(pin[0], OUTPUT); + pinMode(FLASHER_EXT_RESET, INPUT_PULLDOWN); + ledcAttachPin(pin[0], 0); vTaskDelay(10 / portTICK_PERIOD_MS); for (uint8_t c = 0; c < 0xFF; c++) { ledcWrite(0, c); if (c > 250) { vTaskDelay(2 / portTICK_PERIOD_MS); } else { - delayMicroseconds(100); + delayMicroseconds(500); } } digitalWrite(pin[0], HIGH); @@ -78,6 +78,10 @@ void powerControl(bool powerState, uint8_t* pin, uint8_t pincount) { if (pincount == 0) return; if (pin == nullptr) return; + static bool currentState = false; + if (currentState == true && powerState == true) return; + currentState = powerState; + #ifdef POWER_RAMPING if (powerState == true) { #ifdef POWER_HIGH_SIDE_DRIVER @@ -86,16 +90,23 @@ void powerControl(bool powerState, uint8_t* pin, uint8_t pincount) { rampTagPower(pin, false); #endif } else { +/* pinMode(pin[0], OUTPUT); #ifdef POWER_HIGH_SIDE_DRIVER digitalWrite(pin[0], HIGH); #else digitalWrite(pin[0], LOW); +#endif +*/ +#ifdef POWER_HIGH_SIDE_DRIVER + rampTagPower(pin, false); +#else + rampTagPower(pin, true); #endif } #else - simpleAPPower(pin, pincount, false); + simpleAPPower(pin, pincount, powerState); delay(500); - simpleAPPower(pin, pincount, true); + // simpleAPPower(pin, pincount, true); #endif -} \ No newline at end of file + } \ No newline at end of file diff --git a/ESP32_AP-Flasher/src/serialap.cpp b/ESP32_AP-Flasher/src/serialap.cpp index f086c726..69954c90 100644 --- a/ESP32_AP-Flasher/src/serialap.cpp +++ b/ESP32_AP-Flasher/src/serialap.cpp @@ -150,6 +150,7 @@ void setAPstate(bool isOnline, uint8_t state) { CRGB::YellowGreen}; rgbIdleColor = colorMap[state]; rgbIdlePeriod = (isOnline ? 767 : 255); + if (isOnline) rgbIdle(); #endif } @@ -159,6 +160,11 @@ void APTagReset() { uint8_t powerPins = sizeof(APpowerPins); if (powerPins > 0 && APpowerPins[0] == -1) powerPins = 0; + +#ifdef FLASHER_DEBUG_PROG + pinMode(FLASHER_DEBUG_PROG, OUTPUT); + digitalWrite(FLASHER_DEBUG_PROG, HIGH); +#endif pinMode(AP_RESET_PIN, OUTPUT); digitalWrite(AP_RESET_PIN, LOW); vTaskDelay(50 / portTICK_PERIOD_MS); @@ -304,7 +310,7 @@ bool sendChannelPower(struct espSetChannelPower* scp) { return false; } bool sendPing() { - if (apInfo.state == AP_STATE_FLASHING) return true; + if (apInfo.state == AP_STATE_FLASHING) return false; Serial.print("ping"); int t = millis(); if (!txStart()) return false; @@ -715,10 +721,10 @@ bool bringAPOnline() { if (!APrdy) { if (apInfo.state == AP_STATE_FLASHING) return false; APTagReset(); - vTaskDelay(500 / portTICK_PERIOD_MS); + vTaskDelay(1000 / portTICK_PERIOD_MS); bootTimeout = millis(); APrdy = false; - while ((!APrdy) && (millis() - bootTimeout < 10 * 1000)) { + while ((!APrdy) && (millis() - bootTimeout < 10 * 1000) && (apInfo.state != AP_STATE_FLASHING)) { APrdy = sendPing(); vTaskDelay(300 / portTICK_PERIOD_MS); } @@ -790,6 +796,7 @@ void APTask(void* parameter) { xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, 2, NULL); #endif + vTaskDelay(500 / portTICK_PERIOD_MS); bringAPOnline(); #ifndef C6_OTA_FLASHING @@ -956,7 +963,7 @@ void APTask(void* parameter) { setAPstate(true, AP_STATE_ONLINE); attempts = 0; } - if (attempts > 5) { + if (attempts > 5 && apInfo.state != AP_STATE_FLASHING) { setAPstate(false, AP_STATE_WAIT_RESET); if (!bringAPOnline()) { // tried to reset the AP, but we failed... Maybe the AP-Tag died? diff --git a/ESP32_AP-Flasher/src/swd.cpp b/ESP32_AP-Flasher/src/swd.cpp index 7508a796..cc683495 100644 --- a/ESP32_AP-Flasher/src/swd.cpp +++ b/ESP32_AP-Flasher/src/swd.cpp @@ -195,7 +195,7 @@ uint32_t nrfswd::nrf_read_port(bool APorDP, uint8_t address) { DP_Read(address, temp); DP_Read(DP_RDBUFF, temp); DP_Read(DP_RDBUFF, temp); - Serial.printf("%s Read reg: 0x%02x : 0x%08x\r\n", APorDP ? "AP" : "DP", address, temp); + // Serial.printf("%s Read reg: 0x%02x : 0x%08x\r\n", APorDP ? "AP" : "DP", address, temp); return temp; } void nrfswd::nrf_write_port(bool APorDP, uint8_t address, uint32_t value) { @@ -206,7 +206,7 @@ void nrfswd::nrf_write_port(bool APorDP, uint8_t address, uint32_t value) { DP_Write(address, value); DP_Read(DP_RDBUFF, temp); DP_Read(DP_RDBUFF, temp); - Serial.printf("%s Write reg: 0x%02x : 0x%08x\r\n", APorDP ? "AP" : "DP", address, value); + // Serial.printf("%s Write reg: 0x%02x : 0x%08x\r\n", APorDP ? "AP" : "DP", address, value); } void nrfswd::nrf_abort_all() { nrf_write_port(0, DP_ABORT, 0x1e); @@ -254,8 +254,7 @@ uint32_t nrfswd::read_register(uint32_t address) { bool state2 = AP_Read(AP_DRW, temp); bool state3 = DP_Read(DP_RDBUFF, temp); bool state4 = DP_Read(DP_RDBUFF, temp); - if (showDebug) - Serial.printf("%i%i%i%i Read Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, state4, address, temp); + // if (showDebug) Serial.printf("%i%i%i%i Read Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, state4, address, temp); return temp; } void nrfswd::write_register(uint32_t address, uint32_t value) { @@ -263,8 +262,7 @@ void nrfswd::write_register(uint32_t address, uint32_t value) { bool state1 = AP_Write(AP_TAR, address); bool state2 = AP_Write(AP_DRW, value); bool state3 = DP_Read(DP_RDBUFF, temp); - if (showDebug) - Serial.printf("%i%i%i Write Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, address, value); + // if (showDebug) Serial.printf("%i%i%i Write Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, address, value); } uint8_t nrfswd::erase_all_flash() { diff --git a/ESP32_AP-Flasher/src/usbflasher.cpp b/ESP32_AP-Flasher/src/usbflasher.cpp index a90f3239..f1fbaac6 100644 --- a/ESP32_AP-Flasher/src/usbflasher.cpp +++ b/ESP32_AP-Flasher/src/usbflasher.cpp @@ -24,7 +24,7 @@ USBCDC USBSerial; QueueHandle_t flasherCmdQueue; uint32_t usbConnectedStartTime = 0; -bool serialPassthroughState = false; +extern bool serialPassthroughState; #define FLASHER_WAIT_A 0 #define FLASHER_WAIT_T 1 @@ -226,7 +226,7 @@ void flasherDataHandler(uint8_t* data, size_t len, uint8_t transportType) { void resetFlasherState() { if (serialPassthroughState) { - Serial2.end(); + Serial0.end(); } serialPassthroughState = false; } @@ -280,7 +280,7 @@ static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t eve uint8_t buf[data->rx.len]; size_t len = cmdSerial.read(buf, data->rx.len); if (serialPassthroughState) { - Serial2.write(buf, len); + Serial0.write(buf, len); } else { flasherDataHandler(buf, len, TRANSPORT_USB); } @@ -320,6 +320,8 @@ typedef enum { CMD_AUTOFLASH = 87, CMD_COMPLETE = 88, + CMD_WRITE_ERROR = 99, + } ZBS_UART_PROTO; uint32_t FLASHER_VERSION = 0x00000031; @@ -514,7 +516,7 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) { } break; case CMD_WRITE_FLASH: - wsSerial("> write flash"); + Serial.println("> write flash"); if (selectedController == CONTROLLER_NRF82511) { if (nrfflasherp == nullptr) return; if (currentFlasherOffset >= nrfflasherp->nrf_info.flash_size) { @@ -530,9 +532,13 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) { c++; } } - nrfflasherp->nrf_write_bank(currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); - Serial.printf("wrote page to nrf\n"); + uint8_t result = nrfflasherp->nrf_write_bank(currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); + Serial.printf("wrote page offset %lu to nrf\n", currentFlasherOffset); currentFlasherOffset += cmd->len; + if (result == 3) { + sendFlasherAnswer(CMD_WRITE_ERROR, NULL, 0, transportType); + return; + } sendFlasherAnswer(CMD_WRITE_FLASH, NULL, 0, transportType); } } else if (selectedController == CONTROLLER_ZBS243) { @@ -553,9 +559,13 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) { if (currentFlasherOffset >= 4096) { sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { - nrfflasherp->nrf_write_bank(0x10001000 + currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); - Serial.printf("wrote page to nrf\n"); + uint8_t result = nrfflasherp->nrf_write_bank(0x10001000 + currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); + Serial.printf("wrote infopage to nrf\n"); currentFlasherOffset += cmd->len; + if (result == 3) { + sendFlasherAnswer(CMD_WRITE_ERROR, NULL, 0, transportType); + return; + } sendFlasherAnswer(CMD_WRITE_INFOPAGE, NULL, 0, transportType); } } else if (selectedController == CONTROLLER_ZBS243) { @@ -571,7 +581,7 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) { break; case CMD_PASS_THROUGH: wsSerial("> pass through"); - Serial2.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); + Serial0.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); cmdSerial.println(">>>"); serialPassthroughState = true; break; @@ -606,12 +616,14 @@ void flasherCommandTimeout() { } void tagDebugPassthrough() { - uint16_t len = Serial2.available(); + uint16_t len = Serial0.available(); if (len > 0) { uint8_t* buf = (uint8_t*)malloc(len); - Serial2.read(buf, len); + Serial0.read(buf, len); Serial.write(buf, len); cmdSerial.write(buf, len); + String dataString((char*)buf, len); + wsSerial(dataString, "cyan"); free(buf); } } diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 9e21ed34..c98bbc68 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -371,6 +371,17 @@ void init_web() { wsSendTaginfo(mac, SYNC_DELETE); deleteRecord(mac); } + if (strcmp(cmdValue, "purge") == 0) { + time_t now; + time(&now); + for (int c = tagDB.size() - 1; c >= 0; --c) { + tagRecord *tag = tagDB.at(c); + if (tag->expectedNextCheckin == 3216153600 || tag->lastseen < now - 24 * 3600 || now > tag->expectedNextCheckin + 600) { + wsSendTaginfo(tag->mac, SYNC_DELETE); + deleteRecord(tag->mac); + } + } + } if (strcmp(cmdValue, "clear") == 0) { clearPending(taginfo); while (dequeueItem(mac)) { @@ -493,10 +504,11 @@ void init_web() { #else response->print("\"hasFlasher\": \"0\", "); #endif - response->print("\"apstate\": \"" + String(apInfo.state) + "\", "); + response->print("\"apstate\": \"" + String(apInfo.state) + "\""); File configFile = contentFS->open("/current/apconfig.json", "r"); if (configFile) { + response->print(", "); configFile.seek(1); const size_t bufferSize = 64; uint8_t buffer[bufferSize]; diff --git a/ESP32_AP-Flasher/src/webflasher.cpp b/ESP32_AP-Flasher/src/webflasher.cpp index 93a4085e..451f9b25 100644 --- a/ESP32_AP-Flasher/src/webflasher.cpp +++ b/ESP32_AP-Flasher/src/webflasher.cpp @@ -11,6 +11,7 @@ #include "ips_display.h" #include "settings.h" // #include "storage.h" + #include "powermgt.h" #include "swd.h" #include "usbflasher.h" @@ -39,6 +40,7 @@ uint8_t webFlashMode = FLASHMODE_OFF; uint8_t autoFlashStep = AUTOFLASH_STEP_IDLE; +bool serialPassthroughState = false; // TaskHandle_t usbFlasherTaskHandle; AsyncServer TCPserver(243); @@ -166,6 +168,9 @@ void onClientConnect(void* arg, AsyncClient* client) { zbsflasherp = nullptr; } + pinMode(FLASHER_EXT_MISO, INPUT); + pinMode(FLASHER_EXT_CLK, INPUT); + #ifdef HAS_TFT if (autoFlashStep == AUTOFLASH_USBFLASHER_RUNNING && tftOverride == true) { tft2.fillRect(0, 62, tft2.width(), 18, TFT_BLUE); @@ -209,8 +214,8 @@ void webFlasherTask(void* parameter) { infoDisplay("Connecting", 0); vTaskDelay(2000 / portTICK_PERIOD_MS); - pinMode(FLASHER_EXT_TEST, OUTPUT); - digitalWrite(FLASHER_EXT_TEST, LOW); + // pinMode(FLASHER_EXT_TEST, OUTPUT); + // digitalWrite(FLASHER_EXT_TEST, LOW); zbsflasherp = new flasher(); errors = 0; @@ -448,7 +453,13 @@ void webFlasherTask(void* parameter) { autoFlashStep = AUTOFLASH_STEP_FINISHED; } } - vTaskDelay(100 / portTICK_PERIOD_MS); + + if (serialPassthroughState) { + tagDebugPassthrough(); + vTaskDelay(1 / portTICK_PERIOD_MS); + } else { + vTaskDelay(100 / portTICK_PERIOD_MS); + } } } @@ -495,6 +506,33 @@ void handleWSdata(uint8_t* data, size_t len, AsyncWebSocketClient* client) { sendAvail(0xFC); #endif break; + case WEBFLASH_POWER_ON: { + wsSerial("Power up", "yellow"); + int8_t powerPins2[] = FLASHER_EXT_POWER; + uint8_t numPowerPins = sizeof(powerPins2); + powerControl(true, (uint8_t*)powerPins2, numPowerPins); + + Serial0.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); + Serial.println(">>>"); + serialPassthroughState = true; + break; + } + case WEBFLASH_POWER_OFF: { + wsSerial("Power down", "yellow"); + serialPassthroughState = false; + vTaskDelay(50 / portTICK_PERIOD_MS); + if (Serial0) Serial0.end(); + pinMode(FLASHER_EXT_MISO, INPUT); + pinMode(FLASHER_EXT_CLK, INPUT); + pinMode(FLASHER_EXT_TEST, INPUT); + pinMode(FLASHER_EXT_RXD, INPUT); + pinMode(FLASHER_EXT_TXD, INPUT); + pinMode(FLASHER_EXT_RESET, INPUT); + int8_t powerPins2[] = FLASHER_EXT_POWER; + uint8_t numPowerPins = sizeof(powerPins2); + powerControl(false, (uint8_t*)powerPins2, numPowerPins); + break; + } } } diff --git a/ESP32_AP-Flasher/wwwroot/content_cards.json b/ESP32_AP-Flasher/wwwroot/content_cards.json index 44f46b29..8c8c3c86 100644 --- a/ESP32_AP-Flasher/wwwroot/content_cards.json +++ b/ESP32_AP-Flasher/wwwroot/content_cards.json @@ -368,6 +368,10 @@ "SK": "Slovakia", "SI": "Slovenia", "ES": "Spain", + "SE1": "Sweden SE1", + "SE2": "Sweden SE2", + "SE3": "Sweden SE3", + "SE4": "Sweden SE4", "CH": "Switzerland" } }, diff --git a/ESP32_AP-Flasher/wwwroot/flash.js b/ESP32_AP-Flasher/wwwroot/flash.js index 67eff900..c8a46e64 100644 --- a/ESP32_AP-Flasher/wwwroot/flash.js +++ b/ESP32_AP-Flasher/wwwroot/flash.js @@ -6,6 +6,8 @@ const WEBFLASH_ENABLE_AUTOFLASH = 1 const WEBFLASH_ENABLE_USBFLASHER = 2 const WEBFLASH_FOCUS = 3 export const WEBFLASH_BLUR = 4 +const WEBFLASH_POWER_ON = 5 +const WEBFLASH_POWER_OFF = 6 export async function init() { wsCmd(WEBFLASH_FOCUS); @@ -42,6 +44,28 @@ $('#doUSBflash').onclick = function () { disableButtons(false); } +$('#doPowerOn').onclick = function () { + if (running) return; + disableButtons(true); + running = true; + + wsCmd(WEBFLASH_POWER_ON); + + running = false; + disableButtons(false); +} + +$('#doPowerOff').onclick = function () { + if (running) return; + disableButtons(true); + running = true; + + wsCmd(WEBFLASH_POWER_OFF); + + running = false; + disableButtons(false); +} + export function print(line, color = "white") { const consoleDiv = document.getElementById('flashconsole'); if (consoleDiv) { diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index 5be2c4e2..a8b1dabe 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -261,8 +261,10 @@ options: --exit Exit eeprom loader after sending data - +

Other actions

+

+

diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index 5c539bd3..8164dc5f 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -723,20 +723,22 @@ document.addEventListener("loadTab", function (event) { fetch("/get_ap_config") .then(response => response.json()) .then(data => { - apConfig = data; - $('#apcfgalias').value = data.alias; - $('#apcfgchid').value = data.channel; - $("#apcfgledbrightness").value = data.led; - $("#apcfgtftbrightness").value = data.tft; - $("#apcfglanguage").value = data.language; - $("#apclatency").value = data.maxsleep; - $("#apcpreventsleep").value = data.stopsleep; - $("#apcpreview").value = data.preview; - $("#apclock").value = data.lock; - $("#apcwifipower").value = data.wifipower; - $("#apctimezone").value = data.timezone; - $("#apcnight1").value = data.sleeptime1; - $("#apcnight2").value = data.sleeptime2; + if (data.alias) { + apConfig = data; + $('#apcfgalias').value = data.alias; + $('#apcfgchid').value = data.channel; + $("#apcfgledbrightness").value = data.led; + $("#apcfgtftbrightness").value = data.tft; + $("#apcfglanguage").value = data.language; + $("#apclatency").value = data.maxsleep; + $("#apcpreventsleep").value = data.stopsleep; + $("#apcpreview").value = data.preview; + $("#apclock").value = data.lock; + $("#apcwifipower").value = data.wifipower; + $("#apctimezone").value = data.timezone; + $("#apcnight1").value = data.sleeptime1; + $("#apcnight2").value = data.sleeptime2; + } }) $('#apcfgmsg').innerHTML = ''; break; @@ -1529,6 +1531,12 @@ $('#taglist').addEventListener('contextmenu', (e) => { contextMenuOptions.push( { id: 'del', label: 'Delete tag from list' } ); + let idletime = (Date.now() / 1000) - servertimediff - clickedGridItem.dataset.lastseen; + if ((Date.now() / 1000) - servertimediff - 600 > clickedGridItem.dataset.nextcheckin || idletime > 24 * 3600 || clickedGridItem.dataset.nextcheckin == 3216153600) { + contextMenuOptions.push( + { id: 'purge', label: 'Delete all inactive tags' } + ); + } contextMenu.innerHTML = ''; contextMenuOptions.forEach(option => { const li = document.createElement('li'); diff --git a/Tag_Flasher/OEPL-Flasher.py b/Tag_Flasher/OEPL-Flasher.py index ed1e343d..9793862f 100644 --- a/Tag_Flasher/OEPL-Flasher.py +++ b/Tag_Flasher/OEPL-Flasher.py @@ -35,6 +35,8 @@ CMD_WRITE_FLASH = 83 CMD_AUTOFLASH = 87 CMD_COMPLETE = 88 +CMD_WRITE_ERROR = 99 + TRANSPORT_SER = 0 TRANSPORT_TCP = 1 @@ -244,7 +246,11 @@ def write_to_serial(filename, args): print(f'\rSent {i} bytes', end='', flush=True) elif (cmd == CMD_COMPLETE): print( - 'Tried to write more bytes than we have room for! \n', end='', flush=True) + '\nTried to write more bytes than we have room for! \n', end='', flush=True) + return + elif (cmd == CMD_WRITE_ERROR): + print( + '\nError writing to the tag. Check your connection. \n', end='', flush=True) return else: print("Some other error, dunno\n")