diff --git a/binaries/AP_FW_1.54.bin b/binaries/AP_FW_1.54.bin new file mode 100644 index 00000000..dcc86d33 Binary files /dev/null and b/binaries/AP_FW_1.54.bin differ diff --git a/binaries/AP_FW_Nodisplay.bin b/binaries/AP_FW_Nodisplay.bin index 917c8016..10213230 100644 Binary files a/binaries/AP_FW_Nodisplay.bin and b/binaries/AP_FW_Nodisplay.bin differ diff --git a/binaries/AP_FW_Segmented_UK.bin b/binaries/AP_FW_Segmented_UK.bin index 54b6d280..8dd0effd 100644 Binary files a/binaries/AP_FW_Segmented_UK.bin and b/binaries/AP_FW_Segmented_UK.bin differ diff --git a/zbs243_AP_FW/APDisplay.c b/zbs243_AP_FW/APDisplay.c index 0ad145fc..abf18fb2 100755 --- a/zbs243_AP_FW/APDisplay.c +++ b/zbs243_AP_FW/APDisplay.c @@ -19,10 +19,12 @@ #include "uart.h" #include "wdt.h" -// #if (HAS_SCREEN == 1) - uint8_t updateCount = 1; +extern uint8_t __xdata curChannel; +extern uint8_t __xdata curPendingData; +extern uint8_t __xdata curNoUpdate; +#if (SCREEN_WIDTH == 1) void epdInitialize() { epdEnable(); pr("Setting up EPD\n"); @@ -36,11 +38,6 @@ void epdInitialize() { timerDelay(1333); } -extern uint8_t __xdata curChannel; - -extern uint8_t __xdata curPendingData; -extern uint8_t __xdata curNoUpdate; - void epdShowRun() { epdClear(); epdSetPos(0); @@ -71,4 +68,28 @@ void epdShowRun() { } } +#endif + +#if (SCREEN_WIDTH != 1) + +void epdInitialize() { + epdConfigGPIO(true); + spiInit(); + epdSetup(); +} + +void epdShowRun() { + // return; + wdt60s(); + selectLUT(EPD_LUT_NO_REPEATS); + clearScreen(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + epdPrintBegin(16, 55, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); + epdpr("AP Mode"); + epdPrintEnd(); + drawNoWait(); +} + +#endif + #endif \ No newline at end of file diff --git a/zbs243_AP_FW/Makefile b/zbs243_AP_FW/Makefile index a1aa836e..ea233c4b 100644 --- a/zbs243_AP_FW/Makefile +++ b/zbs243_AP_FW/Makefile @@ -5,6 +5,8 @@ BUILD ?= zbs29v033 SOURCES += main.c SOURCES += comms.c SOURCES += APDisplay.c +SOURCES += barcode.c +SOURCES += emulateTag.c all: #make sure it is the first target diff --git a/zbs243_AP_FW/builder.php b/zbs243_AP_FW/builder.php index d93607f6..21af91eb 100644 --- a/zbs243_AP_FW/builder.php +++ b/zbs243_AP_FW/builder.php @@ -23,7 +23,7 @@ $stackdisturbed = false; $mem = checkmem(); while(1){ $errlist = array(); - exec("make BUILD=zbs29v033 CPU=8051 SOC=zbs243 2>&1 | grep error | grep -v make", $errlist); + exec("make BUILD=zbs154v033 CPU=8051 SOC=zbs243 2>&1 | grep error | grep -v make", $errlist); if(checkmem()!=$mem){ $stackdisturbed = true; echo "Stack size was $mem, is now ".checkmem()." !!!\n"; diff --git a/zbs243_AP_FW/buildfw.sh b/zbs243_AP_FW/buildfw.sh index 37ee6f35..f91368c5 100755 --- a/zbs243_AP_FW/buildfw.sh +++ b/zbs243_AP_FW/buildfw.sh @@ -12,7 +12,7 @@ make BUILD=zbs_nodisplay CPU=8051 SOC=zbs243 > /dev/null mv main.bin ../binaries/AP_FW_Nodisplay.bin -v make clean > /dev/null -echo -e "\n\nBuilding 2.9 version..." -make BUILD=zbs29v033 CPU=8051 SOC=zbs243 > /dev/null -mv main.bin ../binaries/AP_FW_2.9.bin -v +echo -e "\n\nBuilding 1.54 version..." +make BUILD=zbs154v033 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ../binaries/AP_FW_1.54.bin -v make clean > /dev/null diff --git a/zbs243_AP_FW/emulateTag.c b/zbs243_AP_FW/emulateTag.c new file mode 100755 index 00000000..4c8d2bd7 --- /dev/null +++ b/zbs243_AP_FW/emulateTag.c @@ -0,0 +1,124 @@ +#define __packed +#include "board.h" + +#if (HAS_SCREEN == 1 && AP_EMULATE_TAG == 1) +#include +#include +#include +#include +#include + +#include "asmUtil.h" +#include "comms.h" +#include "cpu.h" +#include "printf.h" +#include "proto.h" +#include "radio.h" +#include "screen.h" +#include "timer.h" +#include "uart.h" +#include "wdt.h" + +extern uint8_t __xdata fakeTagMac[8] = {0x0, 0x00, 0x55, 0xCE, 0xAC, 0x00, 0x00}; +extern uint8_t __xdata radiorxbuffer[]; +extern uint8_t __xdata blockbuffer[]; +extern void espNotifyAvailDataReq(const struct AvailDataReq *adr, const uint8_t *src); +extern void espBlockRequest(const struct blockRequest *br); +extern void espNotifyXferComplete(const uint8_t *src); + +extern void addCRC(void *p, uint8_t len); +bool __xdata fakeTagTrafficPending = false; + +static struct AvailDataInfo __xdata ad; +static uint8_t blockCount = 0; +static uint32_t __xdata lastRequest = 0; +static bool dataRequested = false; + +static bool validateBlockData() { + struct blockData *bd = (struct blockData *)blockbuffer; + // pr("expected len = %04X, checksum=%04X\n", bd->size, bd->checksum); + uint16_t t = 0; + for (uint16_t c = 0; c < bd->size; c++) { + t += bd->data[c]; + } + return bd->checksum == t; +} + +uint16_t epdByteCounter = 0; +void epdWriteByte(uint8_t b) { + epdSend(b); + epdByteCounter++; + // check if we need to switch to a + if (epdByteCounter == (SCREEN_HEIGHT * SCREEN_WIDTH / 8)) { + epdDeselect(); + endWriteFramebuffer(); + beginWriteFramebuffer(EPD_COLOR_RED); + epdSelect(); + } +} + +void fakeTagGetData() { + if ((timerGet() - lastRequest) > (1200UL * 1333)) { + if (dataRequested == false) { + if (ad.dataSize) { + struct blockRequest br; + br.blockId = blockCount; + br.ver = ad.dataVer; + espBlockRequest(&br); + dataRequested = true; + } + } else { + if (validateBlockData()) { + struct blockData *bd = (struct blockData *)blockbuffer; + if (blockCount == 0) { + epdByteCounter = 0; + clearScreen(); + selectLUT(ad.dataTypeArgument % 3); + beginFullscreenImage(); + beginWriteFramebuffer(EPD_COLOR_BLACK); + epdSelect(); + } + for (uint16_t c = 0; c < bd->size; c++) { + epdWriteByte(bd->data[c]); + } + ad.dataSize -= bd->size; + blockCount++; + } else { + // request data again! + } + if (ad.dataSize) { + } else { + epdDeselect(); + endWriteFramebuffer(); + espNotifyXferComplete(fakeTagMac); + fakeTagTrafficPending = false; + drawNoWait(); + } + dataRequested = false; + } + } +} + +void fakePendingData(struct pendingData *pd) { + if ((pd->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP) || (pd->availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP) || (pd->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP_DIRECT)) { + memcpy(&ad, &(pd->availdatainfo), sizeof(struct AvailDataInfo)); + blockCount = 0; + fakeTagTrafficPending = true; + dataRequested = false; + } +} + +void fakeTagCheckIn() { + struct AvailDataReq *adr = (struct AvailDataReq *)radiorxbuffer; + + memset(adr, 0, sizeof(struct AvailDataReq)); + adr->batteryMv = 1337; + adr->hwType = HW_TYPE; + adr->lastPacketLQI = 100; + adr->lastPacketRSSI = 100; + adr->wakeupReason = 0; + addCRC(adr, sizeof(struct AvailDataReq)); + espNotifyAvailDataReq(adr, fakeTagMac); +} + +#endif \ No newline at end of file diff --git a/zbs243_AP_FW/emulateTag.h b/zbs243_AP_FW/emulateTag.h new file mode 100755 index 00000000..a82aa600 --- /dev/null +++ b/zbs243_AP_FW/emulateTag.h @@ -0,0 +1,11 @@ +#ifndef _AP_EMULATE_H_ +#define _AP_EMULATE_H_ + +void fakeTagCheckIn(); + +extern uint8_t __xdata fakeTagMac[8]; +extern bool __xdata fakeTagTrafficPending; +extern void fakePendingData(struct pendingData* pd); +extern void fakeTagGetData(); + +#endif \ No newline at end of file diff --git a/zbs243_AP_FW/main.c b/zbs243_AP_FW/main.c index 897c5245..c51e3ad8 100755 --- a/zbs243_AP_FW/main.c +++ b/zbs243_AP_FW/main.c @@ -20,6 +20,10 @@ #include "APDisplay.h" #endif +#if (AP_EMULATE_TAG == 1) +#include "emulateTag.h" +#endif + #define MAX_PENDING_MACS 50 #define HOUSEKEEPING_INTERVAL 60UL @@ -75,6 +79,8 @@ uint8_t seq = 0; // holds current seque uint8_t __xdata blockbuffer[BLOCK_XFER_BUFFER_SIZE + 5]; // block transfer buffer uint8_t lastAckMac[8] = {0}; +uint8_t *__xdata blockXferBuffer = blockbuffer; + // these variables hold the current mac were talking to #define CONCURRENT_REQUEST_DELAY 1200UL * TIMER_TICKS_PER_MS uint32_t __xdata lastBlockRequest = 0; @@ -211,7 +217,7 @@ void countSlots() { extern uint8_t *__idata blockp; void processSerial(uint8_t lastchar) { static uint32_t __xdata lastSerial = 0; - if((timerGet() - lastSerial)>(TIMER_TICKS_PER_MS*25)){ + if ((timerGet() - lastSerial) > (TIMER_TICKS_PER_MS * 25)) { RXState = ZBS_RX_WAIT_HEADER; lastSerial = timerGet(); } else { @@ -262,14 +268,23 @@ void processSerial(uint8_t lastchar) { if (bytesRemain == 0) { if (checkCRC(serialbuffer, sizeof(struct pendingData))) { struct pendingData *pd = (struct pendingData *)serialbuffer; - int8_t slot = findSlotForMac(pd->targetMac); - if (slot == -1) slot = findFreeSlot(); - if (slot != -1) { - xMemCopyShort(&(pendingDataArr[slot]), serialbuffer, sizeof(struct pendingData)); +#if (AP_EMULATE_TAG == 1) + if (memcmp(pd->targetMac, fakeTagMac, 8) == 0) { + fakePendingData(pd); pr("ACK>\n"); } else { - pr("NOQ>\n"); +#endif + int8_t slot = findSlotForMac(pd->targetMac); + if (slot == -1) slot = findFreeSlot(); + if (slot != -1) { + xMemCopyShort(&(pendingDataArr[slot]), serialbuffer, sizeof(struct pendingData)); + pr("ACK>\n"); + } else { + pr("NOQ>\n"); + } +#if (AP_EMULATE_TAG == 1) } +#endif } else { pr("NOK>\n"); } @@ -284,8 +299,17 @@ void processSerial(uint8_t lastchar) { if (bytesRemain == 0) { if (checkCRC(serialbuffer, sizeof(struct pendingData))) { struct pendingData *pd = (struct pendingData *)serialbuffer; - deleteAllPendingDataForVer((uint8_t *)&pd->availdatainfo.dataVer); - pr("ACK>\n"); +#if (AP_EMULATE_TAG == 1) + if (memcmp(pd->targetMac, fakeTagMac, 8) == 0) { + fakeTagTrafficPending = false; + pr("ACK>\n"); + } else { +#endif + deleteAllPendingDataForVer((uint8_t *)&pd->availdatainfo.dataVer); + pr("ACK>\n"); +#if (AP_EMULATE_TAG == 1) + } +#endif } else { pr("NOK>\n"); } @@ -367,10 +391,9 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) { // mark this mac as the new current mac we're talking to xMemCopyShort((void *__xdata)lastBlockMac, (void *__xdata)rxHeader->src, 8); lastBlockRequest = timerGet(); - // memcpy(lastBlockRequest, rxHeader->src, 8); } else { // we're talking to another mac, let this mac know we can't accomodate another request right now - pr("not accepting traffic from this tag\n"); + pr("BUSY!\n"); sendCancelXfer(rxHeader->src); return; } @@ -594,13 +617,40 @@ void sendPong(void *__xdata buf) { radioTx(radiotxbuffer); } +#if (AP_EMULATE_TAG == 1) +void attemptFakeTagUpdate() { + if (memcmp(fakeTagMac, lastBlockMac, 8) == 0) { + lastBlockRequest = timerGet(); + fakeTagGetData(); + } else { + // we weren't talking to this mac, see if there was a transfer in progress from another mac, recently + if ((timerGet() - lastBlockRequest) > CONCURRENT_REQUEST_DELAY) { + // mark this mac as the new current mac we're talking to + xMemCopyShort((void *__xdata)lastBlockMac, (void *__xdata)fakeTagMac, 8); + lastBlockRequest = timerGet(); + fakeTagGetData(); + } else { + // we're talking to another mac, let this mac know we can't accomodate another request right now + pr("FAKE TAG BUSY!\n"); + } + } +} +#endif + // main loop void main(void) { clockingAndIntsInit(); timerInit(); boardInit(); + P0FUNC = 0b11001111; // enable uart tx/rx and SPI bus functions + uartInit(); + +#if (HAS_SCREEN == 1) + epdInitialize(); +#endif + irqsOn(); wdt60s(); @@ -617,10 +667,6 @@ void main(void) { radioInit(); radioRxFilterCfg(mSelfMac, 0x10000, PROTO_PAN_ID); -#if (HAS_SCREEN == 1) - epdInitialize(); -#endif - // init the "random" number generation unit rndSeed(mSelfMac[0] ^ (uint8_t)timerGetLowBits(), mSelfMac[1]); radioSetChannel(curChannel); @@ -689,10 +735,15 @@ void main(void) { } loopCount--; if (loopCount == 0) { - #if (HAS_SCREEN == 1) +#if (HAS_SCREEN == 1) + +#if (AP_EMULATE_TAG == 1) + if (fakeTagTrafficPending) attemptFakeTagUpdate(); +#else countSlots(); epdShowRun(); - #endif +#endif +#endif wdt60s(); loopCount = 10000; // every once in a while, especially when handling a lot of traffic, the radio will hang. Calling this every once in while @@ -700,7 +751,9 @@ void main(void) { RADIO_command = RADIO_CMD_RECEIVE; } } - +#if (AP_EMULATE_TAG == 1) + fakeTagCheckIn(); +#endif for (uint8_t __xdata c = 0; c < MAX_PENDING_MACS; c++) { if (pendingDataArr[c].attemptsLeft == 1) { espNotifyTimeOut(pendingDataArr[c].targetMac); @@ -712,4 +765,4 @@ void main(void) { } housekeepingTimer = timerGet(); } -} \ No newline at end of file +} diff --git a/zbs243_Tag_FW/buildfw.sh b/zbs243_Tag_FW/buildfw.sh index 446f602c..ecd94cef 100755 --- a/zbs243_Tag_FW/buildfw.sh +++ b/zbs243_Tag_FW/buildfw.sh @@ -1,18 +1,22 @@ #!/bin/bash -make clean +make clean > /dev/null -make BUILD=zbs154v033 CPU=8051 SOC=zbs243 -mv main.bin ../binaries/Tag_FW_1.54.bin -make clean +echo -e "\nBuilding 1.54 version..." +make BUILD=zbs154v033 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ../binaries/Tag_FW_1.54.bin -v +make clean > /dev/null -make BUILD=zbs29v033 CPU=8051 SOC=zbs243 -mv main.bin ../binaries/Tag_FW_2.9.bin -make clean +echo -e "\n\nBuilding 2.9 (SSD1619) version..." +make BUILD=zbs29v033 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ../binaries/Tag_FW_2.9.bin -v +make clean > /dev/null -make BUILD=zbs42v033 CPU=8051 SOC=zbs243 -mv main.bin ../binaries/Tag_FW_4.2.bin -make clean +echo -e "\n\nBuilding 4.2 version..." +make BUILD=zbs42v033 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ../binaries/Tag_FW_4.2.bin -v +make clean > /dev/null -make BUILD=zbs29_uc8151 CPU=8051 SOC=zbs243 -mv main.bin ../binaries/Tag_FW_2.9-uc8151.bin -make clean +echo -e "\n\nBuilding 2.9 (UC8151) version..." +make BUILD=zbs29_uc8151 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ../binaries/Tag_FW_2.9-uc8151.bin -v +make clean > /dev/null diff --git a/zbs243_shared/board/ssd1619.c b/zbs243_shared/board/ssd1619.c index 89530ec6..dd9d6087 100644 --- a/zbs243_shared/board/ssd1619.c +++ b/zbs243_shared/board/ssd1619.c @@ -10,7 +10,7 @@ #include "lut.h" #include "printf.h" #include "screen.h" -#include "settings.h" +//#include "settings.h" #include "sleep.h" #include "spi.h" #include "timer.h" diff --git a/zbs243_shared/board/zbs154v033/board.h b/zbs243_shared/board/zbs154v033/board.h old mode 100644 new mode 100755 index a6734698..706d78a2 --- a/zbs243_shared/board/zbs154v033/board.h +++ b/zbs243_shared/board/zbs154v033/board.h @@ -22,6 +22,7 @@ #define HAS_EEPROM 1 #define HAS_SCREEN 1 +#define AP_EMULATE_TAG 1 //hw types #define HW_TYPE SOLUM_154_033 diff --git a/zbs243_shared/board/zbs29_uc8151/board.h b/zbs243_shared/board/zbs29_uc8151/board.h old mode 100644 new mode 100755 index b4f4937e..b7282111 --- a/zbs243_shared/board/zbs29_uc8151/board.h +++ b/zbs243_shared/board/zbs29_uc8151/board.h @@ -21,6 +21,7 @@ #define HAS_EEPROM 1 #define HAS_SCREEN 1 +#define AP_EMULATE_TAG 1 //hw types #define HW_TYPE SOLUM_29_033 diff --git a/zbs243_shared/board/zbs29v033/board.h b/zbs243_shared/board/zbs29v033/board.h old mode 100644 new mode 100755 index b4f4937e..b7282111 --- a/zbs243_shared/board/zbs29v033/board.h +++ b/zbs243_shared/board/zbs29v033/board.h @@ -21,6 +21,7 @@ #define HAS_EEPROM 1 #define HAS_SCREEN 1 +#define AP_EMULATE_TAG 1 //hw types #define HW_TYPE SOLUM_29_033 diff --git a/zbs243_shared/board/zbs42v033/board.h b/zbs243_shared/board/zbs42v033/board.h old mode 100644 new mode 100755 index b788aa2f..cdc1d3bd --- a/zbs243_shared/board/zbs42v033/board.h +++ b/zbs243_shared/board/zbs42v033/board.h @@ -22,6 +22,7 @@ #define HAS_EEPROM 1 #define HAS_SCREEN 1 +#define AP_EMULATE_TAG 1 //hw types #define HW_TYPE SOLUM_42_033 diff --git a/zbs243_shared/board/zbs_nodisplay/board.h b/zbs243_shared/board/zbs_nodisplay/board.h old mode 100644 new mode 100755 index 57ad2c75..c9bbe9a9 --- a/zbs243_shared/board/zbs_nodisplay/board.h +++ b/zbs243_shared/board/zbs_nodisplay/board.h @@ -8,6 +8,7 @@ #define HAS_EEPROM 0 #define HAS_SCREEN 0 #define HW_TYPE SOLUM_NODISPLAY +#define AP_EMULATE_TAG 0 #include "../boardCommon.h" diff --git a/zbs243_shared/board/zbs_segmented_uk/board.h b/zbs243_shared/board/zbs_segmented_uk/board.h old mode 100644 new mode 100755 index b597d3fd..4e7ea09b --- a/zbs243_shared/board/zbs_segmented_uk/board.h +++ b/zbs243_shared/board/zbs_segmented_uk/board.h @@ -7,6 +7,7 @@ #define HAS_EEPROM 0 #define HAS_SCREEN 1 +#define AP_EMULATE_TAG 0 #define HW_TYPE SOLUM_SEG_UK diff --git a/zbs243_shared/cpu/8051/cpu.c b/zbs243_shared/cpu/8051/cpu.c index 254cdec1..394537ec 100644 --- a/zbs243_shared/cpu/8051/cpu.c +++ b/zbs243_shared/cpu/8051/cpu.c @@ -1 +1,2 @@ //nothing +#include // if we include something, we won't get a warning at compile time diff --git a/zbs243_shared/soc/zbs243/flash.c b/zbs243_shared/soc/zbs243/flash.c index 69900a24..e8c566e2 100644 --- a/zbs243_shared/soc/zbs243/flash.c +++ b/zbs243_shared/soc/zbs243/flash.c @@ -25,7 +25,7 @@ static uint8_t flashAddrCheck(uint32_t flashAddr, uint16_t len) __reentrant /* t break; case 0x80: - if (pgNo) + if (pgNo)//hmm return 0xff; pgNo = 0x80; break;