diff --git a/tag_fw/Makefile b/tag_fw/Makefile index 927d382d..fae0f459 100644 --- a/tag_fw/Makefile +++ b/tag_fw/Makefile @@ -5,7 +5,7 @@ BUILD ?= zbs29v033 SOURCES += main.c eeprom.c drawing.c SOURCES += comms.c SOURCES += syncedproto.c epd.c userinterface.c -SOURCES += powermgt.c +SOURCES += powermgt.c barcode.c all: #make sure it is the first target diff --git a/tag_fw/barcode.c b/tag_fw/barcode.c new file mode 100644 index 00000000..c431d148 --- /dev/null +++ b/tag_fw/barcode.c @@ -0,0 +1,101 @@ +#include +#include "barcode.h" +#include "asmUtil.h" + +//code128 generator (c) 2021 Dmitry Grinberg https://dmitry.gr +//non-commercial use only, contact licensing@dmitry.gr for other options + +#pragma nogcse + +static const uint16_t __code mCode128[] = { + 0b00110011011, 0b00110110011, 0b01100110011, 0b00011001001, 0b00110001001, 0b00110010001, 0b00010011001, 0b00100011001, + 0b00100110001, 0b00010010011, 0b00100010011, 0b00100100011, 0b00111001101, 0b00111011001, 0b01110011001, 0b00110011101, + 0b00110111001, 0b01100111001, 0b01001110011, 0b00111010011, 0b01110010011, 0b00100111011, 0b00101110011, 0b01110110111, + 0b00110010111, 0b00110100111, 0b01100100111, 0b00100110111, 0b00101100111, 0b01001100111, 0b00011011011, 0b01100011011, + 0b01101100011, 0b00011000101, 0b00011010001, 0b01100010001, 0b00010001101, 0b00010110001, 0b01000110001, 0b00010001011, + 0b00010100011, 0b01000100011, 0b00011101101, 0b01110001101, 0b01110110001, 0b00011011101, 0b01100011101, 0b01101110001, + 0b01101110111, 0b01110001011, 0b01110100011, 0b00010111011, 0b01000111011, 0b01110111011, 0b00011010111, 0b01100010111, + 0b01101000111, 0b00010110111, 0b01000110111, 0b01011000111, 0b01011110111, 0b01000010011, 0b01010001111, 0b00001100101, + 0b00110000101, 0b00001101001, 0b01100001001, 0b00110100001, 0b01100100001, 0b00001001101, 0b00100001101, 0b00001011001, + 0b01000011001, 0b00101100001, 0b01001100001, 0b01001000011, 0b00001010011, 0b01011101111, 0b00101000011, 0b01011110001, + 0b00111100101, 0b00111101001, 0b01111001001, 0b00100111101, 0b00101111001, 0b01001111001, 0b00100101111, 0b00101001111, + 0b01001001111, 0b01111011011, 0b01101111011, 0b01101101111, 0b00011110101, 0b01111000101, 0b01111010001, 0b00010111101, + 0b01000111101, 0b00010101111, 0b01000101111, 0b01111011101, 0b01110111101, 0b01111010111, 0b01110101111 +}; + + +#define CODE128_START_B (0b00001001011) +#define CODE128_STOP (0b1101011100011) + +#define CODE128_IDX_START_A (103) +#define CODE128_IDX_START_B (104) +#define CODE128_IDX_START_C (105) +#define CODE128_IDX_CODE_STOP (106) + + +enum BarCodeState { + BarCodeInit, + BarCodeEmittingChar, + BarCodeEmittingChecksum, + BarCodeEmittingStop, + BarCodeDone, +}; + + + + +__bit barcodeIsDone(struct BarcodeInfo __xdata *bci) +{ + return bci->state == BarCodeDone; +} + +__bit barcodeNextBar(struct BarcodeInfo __xdata *bci) +{ + uint8_t t; + __bit ret; + + if (!bci->barsLeft) switch (bci->state) { + case BarCodeInit: + bci->curBars = CODE128_START_B; + bci->barsLeft = 11; + bci->state = BarCodeEmittingChar; + bci->csum = CODE128_IDX_START_B; + break; + + case BarCodeEmittingChar: + t = charsPrvDerefAndIncGenericPtr(&bci->str); + if (t) { + t -= 0x20; + if (t >= 0x60) + t = '?' - 0x20; + bci->csum = mathPrvMod16x8(mathPrvMul8x8(++bci->csumMul, t) + bci->csum, 103); + } + else { + + bci->state = BarCodeEmittingChecksum; + t = bci->csum; + } + bci->curBars = mCode128[t]; + bci->barsLeft = 11; + break; + + case BarCodeEmittingChecksum: + bci->state = BarCodeEmittingStop; + bci->curBars = CODE128_STOP; + bci->barsLeft = 13; + break; + + case BarCodeEmittingStop: + bci->state = BarCodeDone; + //fallthrough + + case BarCodeDone: + default: + return false; + } + + ret = bci->curBars & 1; + bci->curBars >>= 1; + bci->barsLeft--; + return ret; +} diff --git a/tag_fw/barcode.h b/tag_fw/barcode.h new file mode 100644 index 00000000..f6d784b9 --- /dev/null +++ b/tag_fw/barcode.h @@ -0,0 +1,29 @@ +#ifndef _BARCODE_H_ +#define _BARCODE_H_ + +#include + +//code128 generator (c) 2021 Dmitry Grinberg https://dmitry.gr +//non-commercial use only, contact licensing@dmitry.gr for other options + + +struct BarcodeInfo { //zero-init this except the string ptr + const char *str; + uint16_t curBars; + uint8_t barsLeft; + uint8_t state; + uint8_t csum; + uint8_t csumMul; +}; + +#define barcodeWidth(nChars) (11 * (nChars) + 11 /*start */+ 11 /*check sum */ + 13 /* stop */) + +#pragma callee_saves barcodeIsDone +__bit barcodeIsDone(struct BarcodeInfo __xdata *bci); + +#pragma callee_saves barcodeNextBar +__bit barcodeNextBar(struct BarcodeInfo __xdata *bci); + + + +#endif diff --git a/tag_fw/bitmaps.h b/tag_fw/bitmaps.h index d8766259..d16feecf 100644 --- a/tag_fw/bitmaps.h +++ b/tag_fw/bitmaps.h @@ -94,4 +94,117 @@ static const uint8_t __code hacked[] = { 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; +static const uint8_t __code receive[] = { + 56, 56, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xe0, + 0x00, 0x00, 0x7f, 0x80, 0x00, 0x7f, 0xf0, + 0x00, 0x00, 0xfe, 0x00, 0x03, 0xff, 0xf0, + 0x00, 0x01, 0xfc, 0x00, 0x0f, 0xff, 0xf0, + 0x00, 0x01, 0xf8, 0x00, 0x3f, 0xff, 0xf0, + 0x00, 0x03, 0xf8, 0x00, 0xff, 0xff, 0x80, + 0x00, 0x07, 0xf0, 0x01, 0xff, 0xe0, 0x00, + 0x00, 0x0f, 0xe0, 0x03, 0xff, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x0f, 0xf8, 0x00, 0x00, + 0x00, 0x1f, 0x80, 0x1f, 0xf0, 0x00, 0x00, + 0x00, 0x1f, 0x80, 0x3f, 0xc0, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0xfe, 0x00, 0x07, 0xe0, + 0x00, 0x7e, 0x01, 0xfc, 0x00, 0x1f, 0xf0, + 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x7f, 0xf0, + 0x00, 0xfc, 0x03, 0xf0, 0x01, 0xff, 0xf0, + 0x00, 0xf8, 0x03, 0xf0, 0x03, 0xff, 0xf0, + 0x01, 0xf8, 0x07, 0xe0, 0x07, 0xff, 0x00, + 0x01, 0xf8, 0x07, 0xe0, 0x0f, 0xf0, 0x00, + 0x01, 0xf0, 0x0f, 0xc0, 0x1f, 0xe0, 0x00, + 0x01, 0xf0, 0x0f, 0xc0, 0x3f, 0x80, 0x00, + 0x03, 0xf0, 0x0f, 0x80, 0x3f, 0x00, 0x00, + 0x03, 0xf0, 0x1f, 0x80, 0x7e, 0x00, 0x00, + 0x03, 0xe0, 0x1f, 0x80, 0x7e, 0x00, 0x00, + 0x03, 0xe0, 0x1f, 0x00, 0xfc, 0x01, 0xe0, + 0x03, 0xe0, 0x1f, 0x00, 0xfc, 0x07, 0xf8, + 0x03, 0xe0, 0x1f, 0x00, 0xf8, 0x0f, 0xfc, + 0x03, 0xe0, 0x3f, 0x00, 0xf8, 0x0f, 0xfc, + 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, + 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, + 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, + 0x03, 0xc0, 0x3e, 0x01, 0xf0, 0x1f, 0xfe, + 0x01, 0xc0, 0x1e, 0x00, 0xf0, 0x0f, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + + +static const uint8_t __code failed[] = { + 48, 48, + 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, + 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, + 0x00, 0x7f, 0xf0, 0x0f, 0xfe, 0x00, + 0x00, 0xff, 0x80, 0x01, 0xff, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x7f, 0x80, + 0x03, 0xf8, 0x00, 0x00, 0x1f, 0xc0, + 0x07, 0xf0, 0x00, 0x00, 0x3f, 0xe0, + 0x0f, 0xe0, 0x00, 0x00, 0x7f, 0xf0, + 0x0f, 0xc0, 0x00, 0x00, 0xff, 0xf0, + 0x1f, 0x80, 0x00, 0x01, 0xff, 0xf8, + 0x1f, 0x00, 0x00, 0x03, 0xff, 0xf8, + 0x3f, 0x00, 0x00, 0x07, 0xfe, 0xfc, + 0x3e, 0x00, 0x00, 0x0f, 0xfc, 0x7c, + 0x7e, 0x00, 0x00, 0x1f, 0xf8, 0x7e, + 0x7c, 0x00, 0x00, 0x3f, 0xf0, 0x3e, + 0x7c, 0x00, 0x00, 0x7f, 0xe0, 0x3e, + 0xfc, 0x00, 0x00, 0xff, 0xc0, 0x3f, + 0xf8, 0x00, 0x01, 0xff, 0x80, 0x1f, + 0xf8, 0x00, 0x03, 0xff, 0x00, 0x1f, + 0xf8, 0x00, 0x07, 0xfe, 0x00, 0x1f, + 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0x1f, + 0xf8, 0x00, 0x1f, 0xf8, 0x00, 0x1f, + 0xf8, 0x00, 0x3f, 0xf0, 0x00, 0x1f, + 0xf8, 0x00, 0x7f, 0xe0, 0x00, 0x1f, + 0xf8, 0x00, 0xff, 0xc0, 0x00, 0x1f, + 0xfc, 0x01, 0xff, 0x80, 0x00, 0x3f, + 0x7c, 0x03, 0xff, 0x00, 0x00, 0x3e, + 0x7c, 0x07, 0xfe, 0x00, 0x00, 0x3e, + 0x7e, 0x0f, 0xfc, 0x00, 0x00, 0x7e, + 0x3e, 0x1f, 0xf8, 0x00, 0x00, 0x7c, + 0x3f, 0x3f, 0xf0, 0x00, 0x00, 0xfc, + 0x3f, 0x7f, 0xe0, 0x00, 0x00, 0xfc, + 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xf8, + 0x0f, 0xff, 0x80, 0x00, 0x03, 0xf0, + 0x0f, 0xff, 0x00, 0x00, 0x07, 0xf0, + 0x07, 0xfe, 0x00, 0x00, 0x0f, 0xe0, + 0x03, 0xfc, 0x00, 0x00, 0x1f, 0xc0, + 0x01, 0xfe, 0x00, 0x00, 0x7f, 0x80, + 0x00, 0xff, 0x80, 0x01, 0xff, 0x00, + 0x00, 0x7f, 0xf0, 0x0f, 0xfe, 0x00, + 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, + 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, +}; + #endif \ No newline at end of file diff --git a/tag_fw/epd.c b/tag_fw/epd.c index 48388629..a5baff0a 100644 --- a/tag_fw/epd.c +++ b/tag_fw/epd.c @@ -4,6 +4,7 @@ #include #include "asmUtil.h" +#include "barcode.h" #include "board.h" #include "cpu.h" #include "font.h" @@ -299,11 +300,17 @@ static void readLut() { } void selectLUT(uint8_t lut) { + if (lut == 2) { + sendCustomLut(lut29, 70); + return; + } + if (SCREEN_WIDTH == 152) { sendCustomLut(lut154, 100); } else { sendCustomLut(lutorig, 70); } + return; readLut(); // dump((uint8_t*)&waveform, 96); dump(blockXferBuffer, 512); @@ -356,6 +363,7 @@ void clearScreen() { setWindowX(0, SCREEN_WIDTH); setWindowY(0, SCREEN_HEIGHT); setPosXY(0, 0); + shortCommand1(CMD_DATA_ENTRY_MODE, 3); // was 3 shortCommand1(CMD_WRITE_PATTERN_BW, 0x66); epdBusyWait(TIMER_TICKS_PER_MS * 100); shortCommand1(CMD_WRITE_PATTERN_RED, 0x66); @@ -372,6 +380,9 @@ void drawNoWait() { // shortCommand1(0x22, SCREEN_CMD_REFRESH); shortCommand(0x20); } +void epdWaitRdy() { + epdBusyWait(TIMER_TICKS_PER_SECOND * 120); +} void drawLineHorizontal(bool color, uint16_t x1, uint16_t x2, uint16_t y) { setWindowX(x1, x2); setWindowY(y, y + 1); @@ -436,7 +447,26 @@ void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color) { } commandEnd(); } - +void printBarcode(const uint8_t* string, uint16_t x, uint16_t y) { + setWindowY(y, 1); + setWindowX(x, x + 8); + setPosXY(x, y); + shortCommand1(CMD_DATA_ENTRY_MODE, 1); + commandBegin(CMD_WRITE_FB_BW); + struct BarcodeInfo __xdata bci = { + .str = string, + }; + while (!barcodeIsDone(&bci)) { + if (barcodeNextBar(&bci)) { + pr("1"); + epdSend(0xFF); + } else { + pr("0"); + epdSend(0x00); + } + } + commandEnd(); +} // stuff for printing text static void pushXFontBytesToEPD(uint8_t byte1, uint8_t byte2) { if (epdCharSize == 1) { diff --git a/tag_fw/epd.h b/tag_fw/epd.h index 52c62f46..94de8eb2 100644 --- a/tag_fw/epd.h +++ b/tag_fw/epd.h @@ -39,6 +39,7 @@ void clearWindow(bool color); void clearScreen(); void draw(); void drawNoWait(); +void epdWaitRdy(); void drawLineHorizontal(bool color, uint16_t x1, uint16_t x2, uint16_t y); void drawLineVertical(bool color, uint16_t x, uint16_t y1, uint16_t y2); @@ -46,6 +47,7 @@ void beginFullscreenImage(); void beginWriteFramebuffer(bool color); void endWriteFramebuffer(); void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color); +void printBarcode(const uint8_t* string, uint16_t x, uint16_t y); void selectLUT(uint8_t lut); diff --git a/tag_fw/main.c b/tag_fw/main.c index b17711d3..35a967fc 100644 --- a/tag_fw/main.c +++ b/tag_fw/main.c @@ -6,18 +6,47 @@ #include #include "asmUtil.h" +#include "comms.h" // for mLastLqi and mLastRSSI #include "eeprom.h" #include "epd.h" #include "powermgt.h" #include "printf.h" #include "proto.h" #include "radio.h" -#include "comms.h" // for mLastLqi and mLastRSSI #include "syncedproto.h" #include "timer.h" #include "userinterface.h" #include "wdt.h" +uint8_t showChannelSelect() { + uint8_t __xdata result[16]; + memset(result, 0, sizeof(result)); + showScanningWindow(); + for (uint8_t i = 0; i < 3; i++) { + for (uint8_t c = 11; c < 27; c++) { + if (probeChannel(c)) { + if (mLastLqi > result[c - 11]) result[c - 11] = mLastLqi; + pr("Channel: %d - LQI: %d RSSI %d\n", c, mLastLqi, mLastRSSI); + } + } + epdWaitRdy(); + for (uint8_t c = 0; c < 16; c++) { + addScanResult(11 + c, result[c]); + } + drawNoWait(); + } + uint8_t __xdata highestLqi = 0; + uint8_t __xdata highestSlot = 0; + for (uint8_t c = 0; c < sizeof(result); c++) { + if (result[c] > highestLqi) { + highestSlot = c + 11; + highestLqi = result[c]; + } + } + epdWaitRdy(); + return highestSlot; +} + void mainProtocolLoop(void) { clockingAndIntsInit(); timerInit(); @@ -28,13 +57,6 @@ void mainProtocolLoop(void) { while (1) ; } else { - /* - for (uint8_t c = 0; c < 8; c++) { - mSelfMac[c] = c + 5; - } - */ - // really... if I do the call below, it'll cost me 8 bytes IRAM. Not the kind of 'optimization' I ever dreamed of doing - // pr("MAC>%02X%02X%02X%02X%02X%02X%02X%02X\n", mSelfMac[0], mSelfMac[1], mSelfMac[2], mSelfMac[3], mSelfMac[4], mSelfMac[5], mSelfMac[6], mSelfMac[7]); pr("MAC>%02X%02X", mSelfMac[0], mSelfMac[1]); pr("%02X%02X", mSelfMac[2], mSelfMac[3]); pr("%02X%02X", mSelfMac[4], mSelfMac[5]); @@ -53,25 +75,27 @@ void mainProtocolLoop(void) { } else { initializeProto(); } - + eepromDeepPowerDown(); // initialize Powers-saving-attempt-array with the default value; initPowerSaving(); // show the splashscreen showSplashScreen(); - epdEnterSleep(); eepromDeepPowerDown(); initRadio(); - for (uint8_t c = 25; c > 10; c--) { - if (probeChannel(c)) { - pr("Channel: %d - LQI: %d RSSI %d\n", c, mLastLqi, mLastRSSI); - } else { - pr("Channel %d - nothing.\n", c); - } + currentChannel = showChannelSelect(); + if (currentChannel == 0) { + // couldn't find an AP :() + showNoAP(); + } else { + // Found an AP. + showAPFound(); } + epdEnterSleep(); + P1CHSTA &= ~(1 << 0); while (1) { diff --git a/tag_fw/syncedproto.h b/tag_fw/syncedproto.h index 0093d02f..583296dc 100644 --- a/tag_fw/syncedproto.h +++ b/tag_fw/syncedproto.h @@ -4,10 +4,14 @@ #include +extern uint8_t __xdata mSelfMac[8]; +extern uint8_t __xdata currentChannel; +extern uint8_t __xdata APmac[]; + extern void initRadio(); extern void killRadio(); -extern uint8_t __xdata mSelfMac[]; + extern struct AvailDataInfo *__xdata getAvailDataInfo(); extern bool doDataDownload(struct AvailDataInfo *__xdata avail); extern void initializeProto(); diff --git a/tag_fw/userinterface.c b/tag_fw/userinterface.c index 42bb44c0..1b55306b 100644 --- a/tag_fw/userinterface.c +++ b/tag_fw/userinterface.c @@ -1,3 +1,5 @@ + + #include "userinterface.h" #include @@ -6,18 +8,22 @@ #include "asmUtil.h" #include "bitmaps.h" #include "board.h" +#include "comms.h" #include "cpu.h" #include "epd.h" #include "font.h" #include "lut.h" #include "printf.h" #include "screen.h" +#include "settings.h" #include "sleep.h" #include "spi.h" +#include "syncedproto.h" // for APmac / Channel #include "timer.h" -#include "settings.h" -extern uint8_t mSelfMac[]; +extern uint8_t __xdata mSelfMac[8]; +extern uint8_t __xdata currentChannel; +extern uint8_t __xdata APmac[]; static const uint8_t __code fwVersion = FW_VERSION; static const char __code fwVersionSuffix[] = FW_VERSION_SUFFIX; @@ -45,12 +51,11 @@ 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("zbs154v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); epdPrintEnd(); draw(); #endif - #if (SCREEN_WIDTH == 128) // 2.9" selectLUT(1); clearScreen(); @@ -60,24 +65,32 @@ void showSplashScreen() { epdpr("Starting!"); epdPrintEnd(); - epdPrintBegin(115, 295, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_RED); + epdPrintBegin(80, 295, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("zbs29v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + epdPrintEnd(); + + epdPrintBegin(105, 270, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_RED); epdpr("MAC: %02X:%02X", mSelfMac[7], mSelfMac[6]); epdpr(":%02X:%02X", mSelfMac[5], mSelfMac[4]); epdpr(":%02X:%02X", mSelfMac[3], mSelfMac[2]); epdpr(":%02X:%02X", mSelfMac[1], mSelfMac[0]); epdPrintEnd(); - epdPrintBegin(96, 295, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs29v033 %d.%d.%d%s", fwVersion/100, (fwVersion%100)/10, (fwVersion%10),fwVersionSuffix); - epdPrintEnd(); + uint8_t __xdata buffer[17]; + spr(buffer, "%02X%02X", mSelfMac[7], mSelfMac[6]); + spr(buffer + 4, "%02X%02X", mSelfMac[5], mSelfMac[4]); + spr(buffer + 8, "%02X%02X", mSelfMac[3], mSelfMac[2]); + spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); + printBarcode(buffer, 120, 284); loadRawBitmap(solum, 0, 0, EPD_COLOR_BLACK); loadRawBitmap(hacked, 16, 12, EPD_COLOR_RED); - lutTest(); - // drawLineVertical(EPD_COLOR_RED, 64, 10, 286); - // drawLineVertical(EPD_COLOR_BLACK, 65, 10, 286); + // lutTest(); + // drawLineVertical(EPD_COLOR_RED, 64, 10, 286); + // drawLineVertical(EPD_COLOR_BLACK, 65, 10, 286); draw(); + timerDelay(TIMER_TICKS_PER_SECOND * 10); #endif #if (SCREEN_WIDTH == 400) // 2.9" selectLUT(1); @@ -92,9 +105,8 @@ void showSplashScreen() { epdpr("Starting!"); epdPrintEnd(); - epdPrintBegin(16, 252, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs42v033 %d.%d.%d%s", fwVersion/100, (fwVersion%100)/10, (fwVersion%10),fwVersionSuffix); + epdpr("zbs42v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); epdPrintEnd(); epdPrintBegin(16, 284, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); epdpr("MAC: %02X:%02X", mSelfMac[7], mSelfMac[6]); @@ -115,6 +127,8 @@ void showSplashScreen() { void showApplyUpdate() { epdSetup(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + selectLUT(1); clearScreen(); setColorMode(EPD_MODE_IGNORE, EPD_MODE_NORMAL); @@ -122,4 +136,86 @@ void showApplyUpdate() { epdpr("Updating!"); epdPrintEnd(); drawNoWait(); -} \ No newline at end of file +} + +uint8_t __xdata resultcounter = 0; + +void showScanningWindow() { + epdSetup(); + setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); + selectLUT(1); + clearScreen(); + epdPrintBegin(0, 275, EPD_DIRECTION_Y, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); + epdpr("Scanning for APs"); + epdPrintEnd(); + epdPrintBegin(40, 262, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_RED); + epdpr("Channel - Quality"); + epdPrintEnd(); + loadRawBitmap(receive, 36, 24, EPD_COLOR_BLACK); + drawNoWait(); + selectLUT(2); + resultcounter = 0; +} + +void addScanResult(uint8_t channel, uint8_t lqi) { + if (channel == 11) resultcounter = 0; + epdPrintBegin(56 + ((resultcounter % 4) * 16), 282 - (47 * (resultcounter / 4)), EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("%d-%d", channel, lqi); + epdPrintEnd(); + resultcounter++; +} + +void showAPFound() { + pr("Showing AP found"); + selectLUT(1); + clearScreen(); + epdPrintBegin(0, 285, EPD_DIRECTION_Y, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); + epdpr("Waiting for data..."); + epdPrintEnd(); + epdPrintBegin(48, 278, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("Found the following AP:"); + epdPrintEnd(); + epdPrintBegin(64, 293, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("AP MAC: %02X:%02X", APmac[7], APmac[6]); + epdpr(":%02X:%02X", APmac[5], APmac[4]); + epdpr(":%02X:%02X", APmac[3], APmac[2]); + epdpr(":%02X:%02X", APmac[1], APmac[0]); + epdPrintEnd(); + epdPrintBegin(80, 293, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("Ch: %d RSSI: %d LQI: %d", currentChannel, mLastRSSI, mLastLqi); + epdPrintEnd(); + + epdPrintBegin(103, 258, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("Tag MAC: %02X:%02X", mSelfMac[7], mSelfMac[6]); + epdpr(":%02X:%02X", mSelfMac[5], mSelfMac[4]); + epdpr(":%02X:%02X", mSelfMac[3], mSelfMac[2]); + epdpr(":%02X:%02X", mSelfMac[1], mSelfMac[0]); + epdPrintEnd(); + + + uint8_t __xdata buffer[17]; + spr(buffer, "%02X%02X", mSelfMac[7], mSelfMac[6]); + spr(buffer + 4, "%02X%02X", mSelfMac[5], mSelfMac[4]); + spr(buffer + 8, "%02X%02X", mSelfMac[3], mSelfMac[2]); + spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); + printBarcode(buffer, 120, 253); + loadRawBitmap(receive, 36, 14, EPD_COLOR_BLACK); + + draw(); +} + +void showNoAP() { + clearScreen(); + epdPrintBegin(0, 285, EPD_DIRECTION_Y, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); + epdpr("No AP found :("); + epdPrintEnd(); + epdPrintBegin(48, 285, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("We'll try again in a"); + epdPrintEnd(); + epdPrintBegin(64, 285, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); + epdpr("little while..."); + epdPrintEnd(); + loadRawBitmap(receive, 36, 24, EPD_COLOR_BLACK); + loadRawBitmap(failed, 42, 26, EPD_COLOR_RED); + draw(); +} diff --git a/tag_fw/userinterface.h b/tag_fw/userinterface.h index 548affd7..7b697e72 100644 --- a/tag_fw/userinterface.h +++ b/tag_fw/userinterface.h @@ -1,9 +1,11 @@ - #ifndef _UI_H_ #define _UI_H_ +#include void showSplashScreen(); void showApplyUpdate(); - - +void showScanningWindow(); +void addScanResult(uint8_t channel, uint8_t lqi); +void showAPFound(); +void showNoAP(); #endif \ No newline at end of file