From a8934dd1a06ee28506b4890a40e21e9633824dc7 Mon Sep 17 00:00:00 2001 From: Jelmer Date: Sat, 18 Mar 2023 12:04:50 +0100 Subject: [PATCH] no commands yet --- .vscode/settings.json | 3 + ap_fw/main.c | 8 +- ap_fw/soc/zbs243/radio.h | 5 +- esp32_fw/data/www/event.html | 82 ++++++++++++++++ esp32_fw/include/commstructs.h | 8 ++ esp32_fw/include/serial.h | 3 + esp32_fw/src/serial.cpp | 79 +++++++++++++-- esp32_fw/src/web.cpp | 100 +++++++++++++++++-- tag_fw/bitmaps.h | 105 +++++++++++++++++++- tag_fw/board/ssd1619.c | 2 +- tag_fw/fw154.bin | Bin 55407 -> 0 bytes tag_fw/fw29-uc8151.bin | Bin 53990 -> 0 bytes tag_fw/fw29.bin | Bin 55353 -> 0 bytes tag_fw/fw42.bin | Bin 55369 -> 0 bytes tag_fw/main.c | 35 ++++--- tag_fw/soc/zbs243/radio.c | 13 +-- tag_fw/soc/zbs243/radio.h | 3 - tag_fw/syncedproto.c | 23 +++-- tag_fw/userinterface.c | 171 ++++++++++++++++++++++++++++++--- tag_fw/userinterface.h | 2 + 20 files changed, 573 insertions(+), 69 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 esp32_fw/data/www/event.html delete mode 100644 tag_fw/fw154.bin delete mode 100644 tag_fw/fw29-uc8151.bin delete mode 100644 tag_fw/fw29.bin delete mode 100644 tag_fw/fw42.bin diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..f20992b6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.sourceDirectory": "${workspaceFolder}/esp32_fw/.pio/libdeps/lolin32_lite/ESP Async WebServer" +} \ No newline at end of file diff --git a/ap_fw/main.c b/ap_fw/main.c index aed84837..43c52926 100644 --- a/ap_fw/main.c +++ b/ap_fw/main.c @@ -148,7 +148,7 @@ struct espAvailDataReq { } __packed; #define TIMER_TICKS_PER_MS 1333UL -uint16_t __xdata version = 0x0007; +uint16_t __xdata version = 0x000A; #define RAW_PKT_PADDING 2 static uint8_t __xdata mRxBuf[COMMS_MAX_PACKET_SZ]; @@ -307,7 +307,7 @@ void processSerial(uint8_t lastchar) { cmdbuffer[c] = cmdbuffer[c + 1]; } cmdbuffer[3] = lastchar; - if (strncmp(cmdbuffer, "SDA>", 4) == 0) { + if ((strncmp(cmdbuffer, "SDA>", 4) == 0) && (eventMode == false)) { RXState = ZBS_RX_WAIT_SDA; bytesRemain = sizeof(struct pendingData); serialbufferp = serialbuffer; @@ -793,6 +793,10 @@ void main(void) { sendPong(radiorxbuffer); break; case PKT_AVAIL_DATA_SHORTREQ: + if (eventMode == true) { + sendPong(radiorxbuffer); + break; + } // a short AvailDataReq is basically a very short (1 byte payload) packet that requires little preparation on the tx side, for optimal battery use // bytes of the struct are set 0, so it passes the checksum test, and the ESP32 can detect that no interesting payload is sent if (ret == 18) { diff --git a/ap_fw/soc/zbs243/radio.h b/ap_fw/soc/zbs243/radio.h index d5922781..2930b1aa 100644 --- a/ap_fw/soc/zbs243/radio.h +++ b/ap_fw/soc/zbs243/radio.h @@ -8,7 +8,10 @@ void RF_IRQ1(void) __interrupt (4); void RF_IRQ2(void) __interrupt (5); #define RADIO_PAD_LEN_BY 2 - + +extern bool radioChannelClear(); + + #include "../radioCommon.h" diff --git a/esp32_fw/data/www/event.html b/esp32_fw/data/www/event.html new file mode 100644 index 00000000..2f8edc45 --- /dev/null +++ b/esp32_fw/data/www/event.html @@ -0,0 +1,82 @@ + + + + + + +Event Mesh - messages + + + +
+ +
+ +
+ +
    + + +
    + + + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    + ID:
    + Now:- +
    +
    +
    + Next:- +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + ID:
    +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
      +
    + +
    +
    + + +
    + + + + + + \ No newline at end of file diff --git a/esp32_fw/include/commstructs.h b/esp32_fw/include/commstructs.h index a52e6c4b..67789077 100644 --- a/esp32_fw/include/commstructs.h +++ b/esp32_fw/include/commstructs.h @@ -18,6 +18,14 @@ struct blockData { uint8_t data[]; } __packed; +#define EVENT_PKT_SIZE 100 +struct eventData { + uint8_t checksum; + uint8_t eventDataID; + uint8_t data[100]; +} __packed; + + #define SOLUM_154_033 0 #define SOLUM_29_033 1 #define SOLUM_42_033 2 diff --git a/esp32_fw/include/serial.h b/esp32_fw/include/serial.h index 76ed03a1..8855243f 100644 --- a/esp32_fw/include/serial.h +++ b/esp32_fw/include/serial.h @@ -3,6 +3,9 @@ void zbsTx(uint8_t* packetdata, uint8_t len); void zbsRxTask(void* parameter); +void setEventMode(bool on); +bool sendEventData(struct eventData* ed); + void sendCancelPending(struct pendingData* pending); void sendDataAvail(struct pendingData* pending); void Ping(); \ No newline at end of file diff --git a/esp32_fw/src/serial.cpp b/esp32_fw/src/serial.cpp index 9698faf3..da48c4ba 100644 --- a/esp32_fw/src/serial.cpp +++ b/esp32_fw/src/serial.cpp @@ -21,6 +21,8 @@ #define ZBS_RX_WAIT_JOINNETWORK 10 #define ZBS_RX_WAIT_XFERTIMEOUT 11 +static SemaphoreHandle_t serialWait; + uint8_t restartBlockRequest = 0; uint16_t sendBlock(const void* data, const uint16_t len) { @@ -89,7 +91,7 @@ uint8_t pktlen = 0; uint8_t pktindex = 0; char lastchar = 0; uint8_t charindex = 0; -uint64_t waitingForVersion = 0; +uint64_t waitingForVersion = 0; uint16_t version; void ShortRXWaitLoop() { @@ -103,16 +105,75 @@ void ShortRXWaitLoop() { cmdbuffer[3] = lastchar; } } - +int8_t serialWaitReply() { + uint32_t start = millis(); + int8_t ret = -1; + while ((millis() - start) < 100) { + ShortRXWaitLoop(); + if ((strncmp(cmdbuffer, "ACK>", 4) == 0)) { + memset(cmdbuffer, 0x00, 4); + return 1; + } + if ((strncmp(cmdbuffer, "NOK>", 4) == 0)) { + memset(cmdbuffer, 0x00, 4); + return 0; + } + if ((strncmp(cmdbuffer, "NOQ>", 4) == 0)) { + memset(cmdbuffer, 0x00, 4); + return 2; + } + } + Serial.println(cmdbuffer); + return -1; +} +bool sendEventData(struct eventData* ed) { + addCRC(ed, sizeof(struct eventData)); + uint8_t attempts = 5; + xSemaphoreTake(serialWait, portMAX_DELAY); + while (attempts--) { + uint8_t len = sizeof(struct eventData)+5; + uint8_t* sendp = (uint8_t*)ed; + Serial1.print("UED>"); + while(len--){ + Serial1.write(*(sendp++)); + delayMicroseconds(200); + } + if (serialWaitReply() == 1) { + Serial.println("Event Data Sent"); + xSemaphoreGive(serialWait); + return true; + } + vTaskDelay(3 / portTICK_PERIOD_MS); + } + xSemaphoreGive(serialWait); + Serial.println("Failed to send event data"); + return false; +} void Ping() { Serial1.print("VER?"); waitingForVersion = esp_timer_get_time(); } - +void setEventMode(bool on) { + uint8_t attempts = 5; + xSemaphoreTake(serialWait, portMAX_DELAY); + while (attempts--) { + if (on) { + Serial1.print("EEM>"); + } else { + Serial1.print("SEM>"); + } + if (serialWaitReply() == 1) { + xSemaphoreGive(serialWait); + return; + } + } + xSemaphoreGive(serialWait); + Serial.println("Failed to set mode..."); +} void SerialRXLoop() { if (Serial1.available()) { lastchar = Serial1.read(); - //Serial.write(lastchar); + // Serial.write(lastchar); switch (RXState) { case ZBS_RX_WAIT_HEADER: Serial.write(lastchar); @@ -227,7 +288,6 @@ void SerialRXLoop() { } extern uint8_t* getDataForFile(File* file); - void zbsRxTask(void* parameter) { Serial1.begin(230400, SERIAL_8N1, RXD1, TXD1); @@ -236,7 +296,9 @@ void zbsRxTask(void* parameter) { Serial1.print("VER?"); waitingForVersion = esp_timer_get_time(); + serialWait = xSemaphoreCreateMutex(); while (1) { + xSemaphoreTake(serialWait, portMAX_DELAY); SerialRXLoop(); if (Serial.available()) { @@ -245,9 +307,9 @@ void zbsRxTask(void* parameter) { vTaskDelay(1 / portTICK_PERIOD_MS); if (waitingForVersion) { - if (esp_timer_get_time() - waitingForVersion > 10000*1000ULL) { + if (esp_timer_get_time() - waitingForVersion > 10000 * 1000ULL) { waitingForVersion = 0; - //performDeviceFlash(); + // performDeviceFlash(); Serial.println("I wasn't able to connect to a ZBS tag, trying to reboot the tag."); Serial.println("If this problem persists, please check wiring and definitions in the settings.h file, and presence of the right firmware"); simplePowerOn(); @@ -255,7 +317,7 @@ void zbsRxTask(void* parameter) { refreshAllPending(); } } - + if (version && firstrun) { Serial.printf("ZBS/Zigbee FW version: %04X\n", version); uint16_t fsversion; @@ -270,5 +332,6 @@ void zbsRxTask(void* parameter) { } firstrun = false; } + xSemaphoreGive(serialWait); } } diff --git a/esp32_fw/src/web.cpp b/esp32_fw/src/web.cpp index 4da1b13f..d0e4b49e 100644 --- a/esp32_fw/src/web.cpp +++ b/esp32_fw/src/web.cpp @@ -2,7 +2,6 @@ #include #include - #include #include #include @@ -14,6 +13,7 @@ #include "commstructs.h" #include "newproto.h" +#include "serial.h" #include "settings.h" #include "tag_db.h" @@ -157,16 +157,32 @@ void wsSendSysteminfo() { } void wsSendTaginfo(uint8_t mac[6]) { - String json = ""; json = tagDBtoJson(mac); xSemaphoreTake(wsMutex, portMAX_DELAY); ws.textAll(json); xSemaphoreGive(wsMutex); - } +struct eventNowNext { + uint8_t type; + uint8_t nowStartHour; + uint8_t nowStartMinutes; + uint8_t nowEndHour; + uint8_t nowEndMinutes; + uint8_t nextStartHour; + uint8_t nextStartMinutes; + uint8_t nextEndHour; + uint8_t nextEndMinutes; + uint8_t data[]; +}; + +struct eventGeneric { + uint8_t type; + uint8_t data[]; +}; + void init_web() { LittleFS.begin(true); @@ -206,7 +222,7 @@ void init_web() { server.serveStatic("/current", LittleFS, "/current/"); server.serveStatic("/", LittleFS, "/www/").setDefaultFile("index.html"); - + server.on( "/imgupload", HTTP_POST, [](AsyncWebServerRequest *request) { request->send(200); @@ -218,15 +234,15 @@ void init_web() { if (request->hasParam("mac")) { String dst = request->getParam("mac")->value(); uint8_t mac[6]; - if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5])==6) { + if (sscanf(dst.c_str(), "%02X%02X%02X%02X%02X%02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) == 6) { json = tagDBtoJson(mac); } } else { - uint8_t startPos=0; + uint8_t startPos = 0; if (request->hasParam("pos")) { startPos = atoi(request->getParam("pos")->value().c_str()); } - json = tagDBtoJson(nullptr,startPos); + json = tagDBtoJson(nullptr, startPos); } request->send(200, "application/json", json); }); @@ -243,8 +259,8 @@ void init_web() { taginfo->modeConfigJson = request->getParam("modecfgjson", true)->value(); taginfo->contentMode = atoi(request->getParam("contentmode", true)->value().c_str()); taginfo->nextupdate = 0; - //memset(taginfo->md5, 0, 16 * sizeof(uint8_t)); - //memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); + // memset(taginfo->md5, 0, 16 * sizeof(uint8_t)); + // memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); wsSendTaginfo(mac); saveDB("/current/tagDB.json"); request->send(200, "text/plain", "Ok, saved"); @@ -272,6 +288,72 @@ void init_web() { } }); + server.on("/event_start", HTTP_POST, [](AsyncWebServerRequest *request) { + setEventMode(true); + request->send(200, "text/plain", "Mode set"); + }); + + server.on("/event_stop", HTTP_POST, [](AsyncWebServerRequest *request) { + setEventMode(false); + request->send(200, "text/plain", "Mode set"); + }); + + server.on("/event_dataNowNext", HTTP_POST, [](AsyncWebServerRequest *request) { + struct eventData ed; + struct eventNowNext *nownext = (struct eventNowNext *)ed.data; + + sscanf(request->getParam("id", true)->value().c_str(), "%d", &ed.eventDataID); + + sscanf(request->getParam("nowStart", true)->value().c_str(), "%d:%d", &nownext->nowStartHour, &nownext->nowStartMinutes); + sscanf(request->getParam("nowEnd", true)->value().c_str(), "%d:%d", &nownext->nowEndHour, &nownext->nowEndMinutes); + sscanf(request->getParam("nextStart", true)->value().c_str(), "%d:%d", &nownext->nextStartHour, &nownext->nextStartMinutes); + sscanf(request->getParam("nextEnd", true)->value().c_str(), "%d:%d", &nownext->nextEndHour, &nownext->nextEndMinutes); + String data = request->getParam("Row1", true)->value(); + data += "\n"; + data += request->getParam("Row2", true)->value(); + data += "\n"; + data += request->getParam("Row3", true)->value(); + data += "\n"; + data += request->getParam("Row4", true)->value(); + data += "\0"; + nownext->type = 0xB1; + strncpy((char *)nownext->data, data.c_str(), 100 - sizeof(struct eventNowNext)); + bool ret = sendEventData(&ed); + if (ret) { + request->send(200, "text/plain", "event data sent"); + } else { + request->send(200, "text/plain", "Failed sending event data, please try again"); + } + }); + + server.on("/event_dataGeneric", HTTP_POST, [](AsyncWebServerRequest *request) { + struct eventData ed; + struct eventGeneric *generic = (struct eventGeneric *)ed.data; + + sscanf(request->getParam("id", true)->value().c_str(), "%d", &ed.eventDataID); + + String data = request->getParam("Row1", true)->value(); + data += "\n"; + data += request->getParam("Row2", true)->value(); + data += "\n"; + data += request->getParam("Row3", true)->value(); + data += "\n"; + data += request->getParam("Row4", true)->value(); + data += "\n"; + data += request->getParam("Row5", true)->value(); + data += "\n"; + data += request->getParam("Row6", true)->value(); + data += "\0"; + generic->type = 0xB2; + strncpy((char *)generic->data, data.c_str(), 100 - sizeof(struct eventGeneric)); + bool ret = sendEventData(&ed); + if (ret) { + request->send(200, "text/plain", "Event data sent"); + } else { + request->send(200, "text/plain", "Failed sending event data, please try again"); + } + }); + server.onNotFound([](AsyncWebServerRequest *request) { if (request->url() == "/" || request->url() == "index.htm") { request->send(200, "text/html", "-"); diff --git a/tag_fw/bitmaps.h b/tag_fw/bitmaps.h index 56caed91..e78522a5 100644 --- a/tag_fw/bitmaps.h +++ b/tag_fw/bitmaps.h @@ -3,8 +3,36 @@ // images generated by https://lvgl.io/tools/imageconverter, prepended with width, height. "CF_INDEXED_1_BIT"-mode, little-endian #include - #include "screen.h" + +static const uint8_t __code atc1441[] = { +112,9, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x7c, 0xe2, 0x30, 0xc4, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0a, 0x11, 0x16, 0x51, 0x4c, + 0x20, 0xb1, 0xcb, 0x1e, 0x72, 0xce, 0x34, 0x16, 0x44, 0x0a, 0x11, 0x02, 0x51, 0x44, + 0x1c, 0xca, 0x2c, 0xa0, 0x8b, 0x11, 0x4c, 0x19, 0x44, 0x11, 0x11, 0x02, 0x92, 0x44, + 0x02, 0x8a, 0x28, 0x9c, 0x8a, 0x1f, 0x44, 0x11, 0x44, 0x1f, 0x11, 0x02, 0xfb, 0xe4, + 0x22, 0x8a, 0x28, 0x82, 0x8a, 0x10, 0x44, 0x11, 0x28, 0x11, 0x11, 0x12, 0x10, 0x44, + 0x1c, 0xf1, 0xc8, 0xbc, 0x72, 0x0e, 0x3c, 0x1e, 0x10, 0x11, 0x10, 0xe2, 0x10, 0x44, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + + +static const uint8_t __code openepaperlink[] = { +136,9, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x1c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x10, 0x10, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, + 0x44, 0xe4, 0x4e, 0x59, 0xc6, 0x8b, 0x22, 0x22, 0xb1, 0xcb, 0x20, 0xb1, 0xcb, 0x1c, 0xb4, 0x15, 0x92, + 0x79, 0x15, 0x51, 0x62, 0x29, 0x8c, 0xa2, 0x22, 0xca, 0x2c, 0xbc, 0xc8, 0x2c, 0xa2, 0xc4, 0x16, 0x54, + 0x41, 0x15, 0x5f, 0x43, 0xe8, 0x88, 0xa2, 0x22, 0x8b, 0xe8, 0xa0, 0x89, 0xe8, 0xbe, 0x84, 0x14, 0x58, + 0x41, 0x12, 0x90, 0x42, 0x08, 0x88, 0x94, 0x22, 0x8a, 0x08, 0xa0, 0x8a, 0x28, 0xa0, 0x84, 0x14, 0x54, + 0x40, 0xe2, 0x8e, 0x41, 0xc7, 0x8f, 0x08, 0x1c, 0xf1, 0xc8, 0xbe, 0xf1, 0xef, 0x1c, 0x87, 0xd4, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, +}; + + static const uint8_t __code hadberlin[] = { 152,21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -187,7 +215,80 @@ static const uint8_t __code hackaday[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; - +static const uint8_t __code hackadaysmall[] = { +80, 71, + 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, + 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, + 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, + 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, + 0x80, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x04, + 0xc0, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x0c, + 0xe0, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x1c, + 0xf0, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x7c, + 0xfd, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0xfc, + 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf8, + 0x7f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, + 0x1f, 0xff, 0xff, 0xc0, 0x7f, 0xf0, 0x0f, 0xff, 0xff, 0xe0, + 0x0f, 0xff, 0xff, 0xe1, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xc0, + 0x03, 0xff, 0xff, 0xe7, 0xff, 0xff, 0x9f, 0xff, 0xff, 0x00, + 0x00, 0x03, 0xff, 0x8f, 0xff, 0xff, 0xcf, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x9f, 0xff, 0xff, 0xe7, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x7f, 0xff, 0xff, 0xf9, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xfc, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xfc, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xf8, 0x7f, 0xf8, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe0, 0x1f, 0xe0, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xc0, 0x0f, 0xc0, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x80, 0x1f, 0xe0, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x80, 0x3f, 0xf0, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xc0, 0xff, 0xfc, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xc3, 0xff, 0xff, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe7, 0xff, 0xff, 0x9f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xf7, 0xff, 0xff, 0xbf, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xfc, 0xff, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xf8, 0x7f, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1b, 0xff, 0xf8, 0x7f, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x39, 0xff, 0xfb, 0x7f, 0xfe, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x79, 0xff, 0xfb, 0x7f, 0xfe, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x01, 0xfe, 0x7f, 0xff, 0xff, 0xf9, 0xfe, 0x00, 0x00, + 0x00, 0x03, 0xfe, 0x3f, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, + 0x03, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xe3, 0xff, 0xff, 0x00, + 0x0f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0x0f, 0xef, 0xdf, 0xc3, 0xff, 0xff, 0xf8, + 0x7f, 0xff, 0xfe, 0x0f, 0xef, 0xdf, 0xc1, 0xff, 0xff, 0xf8, + 0xfd, 0xff, 0xfc, 0x07, 0xcf, 0xcf, 0x80, 0xff, 0xfe, 0xf8, + 0xf8, 0xff, 0xf0, 0x03, 0x83, 0x07, 0x00, 0x3f, 0xfc, 0x7c, + 0xf0, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x3c, + 0xc0, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x0c, + 0x80, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x04, + 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, + 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, + 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, + 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, +}; static const uint8_t __code oepli[] = { 128, 26, diff --git a/tag_fw/board/ssd1619.c b/tag_fw/board/ssd1619.c index 89530ec6..5976d0af 100644 --- a/tag_fw/board/ssd1619.c +++ b/tag_fw/board/ssd1619.c @@ -701,7 +701,7 @@ void writeCharEPD(uint8_t c) { if (font[c][i]) empty = false; } if (empty) { - for (uint8_t i = 0; i < 8; i++) { + for (uint8_t i = 0; i < 5; i++) { if (directionY) { pushYFontBytesToEPD(0x00, 0x00); } else { diff --git a/tag_fw/fw154.bin b/tag_fw/fw154.bin deleted file mode 100644 index c378db661595ce2f4cc9a7ff354c072816585e5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55407 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 NBHlOt`EP{3e*qRq{i*-} diff --git a/tag_fw/fw29-uc8151.bin b/tag_fw/fw29-uc8151.bin deleted file mode 100644 index abf073b846338d4bdec6c3ed790c1aab277a7c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53990 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 b9)Tx7Ac?Aef=XWXzYq{{VEWg85I+9`#%z}C diff --git a/tag_fw/fw42.bin b/tag_fw/fw42.bin deleted file mode 100644 index 2197c5e4661cd3d0b95ee371fe8f9115d02e0b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55369 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 > eventDataID) || (ed->eventDataID - eventDataID > 128)) { + if ((ed->eventDataID > eventDataID) || (eventDataID - ed->eventDataID > 128)) { eventDataID = ed->eventDataID; // display event logo while we run the AP (we could just skip straight to showing the data, but where's the fun in that) @@ -436,10 +440,19 @@ void eventMode() { doSleep(EVENT_POLL_INTERVAL); } + wdt60s(); // display thank you blah + powerUp(INIT_EPD); + eventEndScreen(); + powerDown(INIT_EPD); + // sleep, wake every 10 minutes to see if an event has started; while (1) { - // sleep forever - doSleep(-1); + doSleep(600000); + wdt10s(); + powerUp(INIT_RADIO); + struct eventData* __xdata ed = getEventData(); + powerDown(INIT_RADIO); + if(ed!=NULL)wdtDeviceReset(); } } \ No newline at end of file diff --git a/tag_fw/soc/zbs243/radio.c b/tag_fw/soc/zbs243/radio.c index 802f2561..e6a5a877 100644 --- a/tag_fw/soc/zbs243/radio.c +++ b/tag_fw/soc/zbs243/radio.c @@ -111,19 +111,14 @@ bool radioTx(const void __xdata *packetP) // waits for tx end uint16_t bkp, wait; __bit irqs; - // this is how to do CCA. we do not bother because fuck it - // this is how WE do CCA. 'Fuck it' still somewhat applies if we don't get a clear channel in a reasonable amount of time - // okay fuck it. - /* + // this is how to do CCA. for (uint8_t i = 0; i < 0x80; i++) { if (!(RADIO_curRfState & 1)) { - //pr("radio CCA fail\n"); - timerDelay(TIMER_TICKS_PER_SECOND / 2000); - //return; + pr("-"); + return false; } } - */ - + mAckTimePassed = false; mGotAck = false; mLastTxedSeq = packet[3]; diff --git a/tag_fw/soc/zbs243/radio.h b/tag_fw/soc/zbs243/radio.h index d5922781..7d118e5f 100644 --- a/tag_fw/soc/zbs243/radio.h +++ b/tag_fw/soc/zbs243/radio.h @@ -12,9 +12,6 @@ void RF_IRQ2(void) __interrupt (5); #include "../radioCommon.h" - - - #endif diff --git a/tag_fw/syncedproto.c b/tag_fw/syncedproto.c index c10760d5..8b0f1cbd 100644 --- a/tag_fw/syncedproto.c +++ b/tag_fw/syncedproto.c @@ -247,6 +247,9 @@ struct AvailDataInfo *__xdata getShortAvailDataInfo() { return (struct AvailDataInfo *)(inBuffer + sizeof(struct MacFrameNormal) + 1); } } + if (getPacketType(inBuffer) == PKT_EVENT_PONG) { + wdtDeviceReset(); + } } } } @@ -814,7 +817,7 @@ void initializeProto() { #define EVENT_AP_TIME 10 #define RAW_PKT_PADDING 2 #define EVENT_PKT_SIZE 100 -#define EVENT_DATA_REQ_RX_WINDOW_SIZE 10 +#define EVENT_DATA_REQ_RX_WINDOW_SIZE 7 static void sendEventPong(const void *__xdata buf) { struct MacFrameBcast *rxframe = (struct MacFrameBcast *)buf; @@ -857,21 +860,19 @@ void eventAPMode() { // received a packet, lets see what it is switch (getPacketType(inBuffer)) { case PKT_PING: - pr("pong rx\n"); sendEventPong(inBuffer); break; case PKT_EVENT_DATA_REQ: - pr("event data reply\n"); sendEventDataReply(inBuffer); break; } } } } -static void sendEventDataReq() { +bool sendEventDataReq() { struct MacFrameBcast __xdata *txframe = (struct MacFrameBcast *)(outBuffer + 1); memset(outBuffer, 0, sizeof(struct MacFrameBcast) + sizeof(struct AvailDataReq) + 2 + 4); - outBuffer[0] = sizeof(struct MacFrameBcast) + 2 + 2; + outBuffer[0] = sizeof(struct MacFrameBcast) + 2 + 2 + 10; // added some random extra bytes, seems to reduce crashes. Probably some timing issue outBuffer[sizeof(struct MacFrameBcast) + 1] = PKT_EVENT_DATA_REQ; memcpy(txframe->src, mSelfMac, 8); txframe->fcs.frameType = 1; @@ -882,16 +883,22 @@ static void sendEventDataReq() { txframe->dstPan = PROTO_PAN_ID; txframe->dstAddr = 0xFFFF; txframe->srcPan = PROTO_PAN_ID; - commsTxNoCpy(outBuffer); + return commsTxNoCpy(outBuffer); } struct eventData *__xdata getEventData() { radioRxEnable(true, true); uint32_t __xdata t; - for (uint8_t c = 0; c < DATA_REQ_MAX_ATTEMPTS; c++) { - sendEventDataReq(); + bool timeExtended = false; + timerDelay(100); + for (uint8_t c = 0; c < 2; c++) { + + if(!sendEventDataReq()) return NULL; + t = timerGet() + (TIMER_TICKS_PER_MS * EVENT_DATA_REQ_RX_WINDOW_SIZE); + while (timerGet() < t) { int8_t __xdata ret = commsRxUnencrypted(inBuffer); + if (ret > 1) { if (getPacketType(inBuffer) == PKT_EVENT_DATA) { if (checkCRC(inBuffer + sizeof(struct MacFrameNormal) + 1, sizeof(struct eventData) + EVENT_PKT_SIZE)) { diff --git a/tag_fw/userinterface.c b/tag_fw/userinterface.c index bb072f09..dee9a153 100644 --- a/tag_fw/userinterface.c +++ b/tag_fw/userinterface.c @@ -63,6 +63,122 @@ void addOverlay() { } } +extern uint8_t __xdata blockXferBuffer[]; +struct eventNowNext { + uint8_t type; + uint8_t nowStartHour; + uint8_t nowStartMinutes; + uint8_t nowEndHour; + uint8_t nowEndMinutes; + uint8_t nextStartHour; + uint8_t nextStartMinutes; + uint8_t nextEndHour; + uint8_t nextEndMinutes; + uint8_t data[]; +}; + +static void eventNowNext() { + struct eventNowNext* enn = (struct eventNowNext*)(blockXferBuffer + sizeof(struct eventData)); + + selectLUT(EPD_LUT_NO_REPEATS); + clearScreen(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + loadRawBitmap(hadberlin, 0, 0, EPD_COLOR_BLACK); + if (blockXferBuffer[1] & 0x01) { + loadRawBitmap(atc1441, 20, 143, EPD_COLOR_BLACK); + } else { + loadRawBitmap(openepaperlink, 8, 143, EPD_COLOR_BLACK); + } + + epdPrintBegin(2, 22, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_RED); + epdpr("Now:"); + epdPrintEnd(); + epdPrintBegin(2, 86, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); + epdpr("Next:"); + epdPrintEnd(); + epdPrintBegin(73, 33, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("%02d:%02d-%02d:%02d", enn->nowStartHour, enn->nowStartMinutes, enn->nowEndHour, enn->nowEndMinutes); + epdPrintEnd(); + + epdPrintBegin(73, 86, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("%02d:%02d-%02d:%02d", enn->nextStartHour, enn->nextStartMinutes, enn->nextEndHour, enn->nextEndMinutes); + epdPrintEnd(); + + char* readp = enn->data; + uint8_t row = 0; + uint8_t currow = 0; + epdPrintBegin(2, 54, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + while (*readp) { + if (*readp == '\n') row++; + if (row != currow) { + readp++; + currow = row; + epdPrintEnd(); + switch (row) { + case 1: + epdPrintBegin(2, 70, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 2: + epdPrintBegin(2, 102, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 3: + epdPrintBegin(2, 118, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + } + } else { + writeCharEPD(*(readp++)); + } + } + epdPrintEnd(); + drawWithSleep(); +} + +static void eventGeneric() { + selectLUT(EPD_LUT_NO_REPEATS); + clearScreen(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + loadRawBitmap(hadberlin, 0, 0, EPD_COLOR_BLACK); + if (blockXferBuffer[1] & 0x01) { + loadRawBitmap(atc1441, 20, 143, EPD_COLOR_BLACK); + } else { + loadRawBitmap(openepaperlink, 8, 143, EPD_COLOR_BLACK); + } + + char* readp = &blockXferBuffer[3]; + uint8_t row = 0; + uint8_t currow = 0; + epdPrintBegin(2, 38, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + while (*readp) { + if (*readp == '\n') row++; + if (row != currow) { + readp++; + currow = row; + epdPrintEnd(); + switch (row) { + case 1: + epdPrintBegin(2, 54, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 2: + epdPrintBegin(2, 70, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 3: + epdPrintBegin(2, 86, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 4: + epdPrintBegin(2, 102, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + case 5: + epdPrintBegin(2, 118, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + break; + } + } else { + writeCharEPD(*(readp++)); + } + } + epdPrintEnd(); + drawWithSleep(); +} + void eventUpdateScreen() { selectLUT(EPD_LUT_FAST_NO_REDS); clearScreen(); @@ -71,20 +187,52 @@ void eventUpdateScreen() { drawNoWait(); } -extern uint8_t __xdata blockXferBuffer[]; - -void eventScreen() { +void eventStartScreen() { selectLUT(EPD_LUT_NO_REPEATS); clearScreen(); setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); - loadRawBitmap(hadberlin, 0, 0, EPD_COLOR_BLACK); + loadRawBitmap(hackadaysmall, 40, 37, EPD_COLOR_BLACK); + epdPrintBegin(20, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_RED); + epdpr("Welcome"); + epdPrintEnd(); - epdPrintBegin(2, 120, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("ID=%d",blockXferBuffer[1]); + epdPrintBegin(10, 117, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("to Hackaday Berlin"); + epdPrintEnd(); + epdPrintBegin(66, 133, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("2023"); + epdPrintEnd(); + drawWithSleep(); +} +void eventEndScreen() { + selectLUT(EPD_LUT_DEFAULT); + clearScreen(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + loadRawBitmap(hadberlin, 0, 131, EPD_COLOR_BLACK); + loadRawBitmap(hackadaysmall, 40, 37, EPD_COLOR_BLACK); + epdPrintBegin(4, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_RED); + epdpr("Thank you"); + epdPrintEnd(); + + epdPrintBegin(36, 117, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("for visiting"); epdPrintEnd(); drawWithSleep(); } +void eventScreen() { + switch (blockXferBuffer[2]) { + case 0xB1: + eventNowNext(); + break; + case 0xB2: + eventGeneric(); + break; + default: + pr("type=%d\n", blockXferBuffer[2]); + break; + } +} void showSplashScreen() { selectLUT(EPD_LUT_NO_REPEATS); @@ -107,7 +255,8 @@ void showSplashScreen() { epdPrintEnd(); epdPrintBegin(2, 120, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs154v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + epdpr("Hackaday Berlin 2023"); + //epdpr("zbs154v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); epdPrintEnd(); #endif @@ -173,7 +322,6 @@ void showSplashScreen() { #endif drawWithSleep(); } - void showApplyUpdate() { setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); selectLUT(1); @@ -195,9 +343,7 @@ void showApplyUpdate() { epdPrintEnd(); drawNoWait(); } - uint8_t __xdata resultcounter = 0; - void showScanningWindow() { setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); selectLUT(EPD_LUT_FAST_NO_REDS); @@ -232,7 +378,6 @@ void showScanningWindow() { selectLUT(EPD_LUT_FAST); resultcounter = 0; } - void addScanResult(uint8_t channel, uint8_t lqi) { if (channel == 11) resultcounter = 0; #if (SCREEN_WIDTH == 128) // 2.9" @@ -248,7 +393,6 @@ void addScanResult(uint8_t channel, uint8_t lqi) { epdPrintEnd(); resultcounter++; } - void showAPFound() { clearScreen(); setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); @@ -354,7 +498,6 @@ void showAPFound() { addOverlay(); drawWithSleep(); } - void showNoAP() { selectLUT(EPD_LUT_NO_REPEATS); setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); @@ -400,7 +543,6 @@ void showNoAP() { addOverlay(); drawWithSleep(); } - void showLongTermSleep() { selectLUT(EPD_LUT_NO_REPEATS); setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); @@ -454,7 +596,6 @@ void showNoEEPROM() { #endif drawWithSleep(); } - void showNoMAC() { selectLUT(EPD_LUT_NO_REPEATS); clearScreen(); diff --git a/tag_fw/userinterface.h b/tag_fw/userinterface.h index 11d41a86..d9ac25fb 100644 --- a/tag_fw/userinterface.h +++ b/tag_fw/userinterface.h @@ -14,8 +14,10 @@ void showLongTermSleep(); void showNoEEPROM(); void showNoMAC(); +void eventStartScreen(); void eventUpdateScreen(); void eventScreen(); +void eventEndScreen();