mirror of
https://github.com/OpenEPaperLink/OpenEPaperLink.git
synced 2026-03-27 21:05:46 +01:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2c2963b3b | ||
|
|
a5d7282958 | ||
|
|
f233d90b86 | ||
|
|
739625f1c8 | ||
|
|
b527d3e57d | ||
|
|
ba82ab8628 | ||
|
|
085a642ed2 | ||
|
|
e2870825cf | ||
|
|
a4bdb4acab | ||
|
|
058016d208 | ||
|
|
b14cd3909c | ||
|
|
cd09a53e02 | ||
|
|
6bdf99a8e7 | ||
|
|
1b256c3fba | ||
|
|
ec217a94d0 | ||
|
|
2b99ce7139 | ||
|
|
f6a8fa3d4d | ||
|
|
294ed5bd28 | ||
|
|
92c5d60cf8 | ||
|
|
7ca5461c33 | ||
|
|
aebbb22cde | ||
|
|
14e96c72f7 | ||
|
|
ebd1adc0d5 | ||
|
|
f4cb642142 | ||
|
|
9b2d76a6b6 | ||
|
|
ac979a3c52 | ||
|
|
a606c4c1aa | ||
|
|
c22fe0d91b | ||
|
|
b29907a725 | ||
|
|
8da475901d | ||
|
|
e4ed0b13db | ||
|
|
0ffd0fbf0e | ||
|
|
1cba70b9cc | ||
|
|
6b67f6df2b | ||
|
|
f83667bcce | ||
|
|
bee51a23b6 | ||
|
|
a787ac6ddf | ||
|
|
5561f82bf6 | ||
|
|
b07eeb31ce |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -26,3 +26,4 @@
|
||||
sdcc/sdcc
|
||||
|
||||
ESP32_AP-Flasher/.vscode/extensions.json
|
||||
ARM_Tag_FW\Newton_M3_nRF52811\$PROJECT_DIR
|
||||
|
||||
@@ -53,6 +53,7 @@ uint64_t __attribute__((section(".fwmagic"))) magic = FW_MAGIC;
|
||||
|
||||
#define TAG_MODE_CHANSEARCH 0
|
||||
#define TAG_MODE_ASSOCIATED 1
|
||||
#define TAG_MODE_DEEPSLEEP 0x10
|
||||
|
||||
__attribute__((section(".aon"))) uint8_t currentTagMode = TAG_MODE_CHANSEARCH;
|
||||
__attribute__((section(".aon"))) volatile struct zigbeeCalibDataStruct zigbeeCalibData;
|
||||
@@ -444,6 +445,11 @@ void TagChanSearch() {
|
||||
}
|
||||
}
|
||||
|
||||
void tagDeepSleep() {
|
||||
printf("MAIN: long sleepy\n");
|
||||
sleep_with_with_wakeup(1800 * 1000UL);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
(*(volatile unsigned int *)0x20124000) = 0x100004; // On WARM RESET: Goto this address. -> entry
|
||||
(*(volatile unsigned int *)0xE000ED08) = 0x20100000; // Vector table in RAM and offset 0x4000
|
||||
@@ -538,6 +544,9 @@ int main(void) {
|
||||
case TAG_MODE_CHANSEARCH:
|
||||
TagChanSearch();
|
||||
break;
|
||||
case TAG_MODE_DEEPSLEEP:
|
||||
tagDeepSleep();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -592,3 +601,34 @@ void applyUpdate(uint32_t size) {
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
void executeCommand(uint8_t cmd) {
|
||||
printf("executing command %d \n", cmd);
|
||||
delay(20);
|
||||
switch (cmd) {
|
||||
case CMD_DO_REBOOT:
|
||||
NVIC_SystemReset();
|
||||
break;
|
||||
case CMD_DO_RESET_SETTINGS:
|
||||
break;
|
||||
case CMD_DO_SCAN:
|
||||
currentChannel = showChannelSelect();
|
||||
break;
|
||||
case CMD_ERASE_EEPROM_IMAGES:
|
||||
eraseImageBlocks();
|
||||
break;
|
||||
case CMD_GET_BATTERY_VOLTAGE:
|
||||
doVoltageReading();
|
||||
// ensure
|
||||
longDataReqCounter = LONG_DATAREQ_INTERVAL + 1;
|
||||
sleep_with_with_wakeup(2 * 1000UL);
|
||||
break;
|
||||
case CMD_DO_DEEPSLEEP:
|
||||
showLongTermSleep();
|
||||
currentTagMode = TAG_MODE_DEEPSLEEP;
|
||||
break;
|
||||
default:
|
||||
printf("Unimplemented command 0x%02X\n", cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -31,3 +31,4 @@
|
||||
|
||||
#define RADIO_FIRST_CHANNEL (11) //2.4-GHz channels start at 11
|
||||
void applyUpdate(uint32_t len);
|
||||
void executeCommand(uint8_t cmd);
|
||||
@@ -68,3 +68,6 @@ uint32_t timerMs(){
|
||||
return (uint32_t)(diff/TIMER_TICKS_PER_MSEC);
|
||||
}
|
||||
|
||||
uint32_t millis(){
|
||||
return (uint32_t)(timerGet() / TIMER_TICKS_PER_MSEC);
|
||||
}
|
||||
@@ -11,6 +11,8 @@ uint64_t timerGet(void);
|
||||
void timerStop(void);
|
||||
uint32_t timerMs(void);
|
||||
|
||||
uint32_t millis();
|
||||
|
||||
void timerDelay(uint64_t cycles);
|
||||
|
||||
|
||||
|
||||
@@ -31,17 +31,12 @@ extern "C" {
|
||||
#define FW88MZ100
|
||||
|
||||
#define HAL_PacketRX commsRxUnenc
|
||||
#define millis() timerGet()
|
||||
#define HAL_TIMER_TICK (TIMER_TICKS_PER_MSEC)
|
||||
|
||||
|
||||
void inline HAL_msDelay(uint32_t t) {
|
||||
timerDelay(t * TIMER_TICKS_PER_MSEC);
|
||||
}
|
||||
|
||||
void executeCommand(uint8_t c) {
|
||||
}
|
||||
|
||||
void loadSettingsFromBuffer(uint8_t *buffer) {
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ extern "C" {
|
||||
#include "screen.h"
|
||||
#include "mz100/util.h"
|
||||
#include "zigbee.h"
|
||||
#include "mz100/timer.h"
|
||||
}
|
||||
|
||||
__attribute__((section(".aonshadow"))) uint16_t dataReqAttemptArr[POWER_SAVING_SMOOTHING] = {0}; // Holds the amount of attempts required per data_req/check-in
|
||||
@@ -120,9 +121,7 @@ void powerDown(const uint8_t parts) {
|
||||
}
|
||||
|
||||
void doSleep(const uint32_t t) {
|
||||
printf("Sleeping for: %d ms\r\n", t);
|
||||
// sleepForMs(t);
|
||||
delay(t);
|
||||
timerDelay(t*TIMER_TICKS_PER_MSEC);
|
||||
}
|
||||
|
||||
uint32_t getNextScanSleep(const bool increment) {
|
||||
|
||||
@@ -27,13 +27,13 @@
|
||||
// power saving algorithm
|
||||
#define INTERVAL_BASE 40 // interval (in seconds) (when 1 packet is sent/received) for target current (7.2µA)
|
||||
#define INTERVAL_AT_MAX_ATTEMPTS 300 // interval (in seconds) (at max attempts) for target average current
|
||||
#define DATA_REQ_RX_WINDOW_SIZE 5UL // How many milliseconds we should wait for a packet during the data_request.
|
||||
#define DATA_REQ_RX_WINDOW_SIZE 4UL // How many milliseconds we should wait for a packet during the data_request.
|
||||
// If the AP holds a long list of data for tags, it may need a little more time to lookup the mac address
|
||||
#define DATA_REQ_MAX_ATTEMPTS 3 // How many attempts (at most) we should do to get something back from the AP
|
||||
#define POWER_SAVING_SMOOTHING 8 // How many samples we should use to smooth the data request interval
|
||||
#define MINIMUM_INTERVAL 45 // IMPORTANT: Minimum interval for check-in; this determines overal battery life!
|
||||
#define MAXIMUM_PING_ATTEMPTS 3 // How many attempts to discover an AP the tag should do
|
||||
#define PING_REPLY_WINDOW 5UL
|
||||
#define PING_REPLY_WINDOW 10UL
|
||||
|
||||
#define LONG_DATAREQ_INTERVAL 300 // How often (in seconds, approximately) the tag should do a long datareq (including temperature)
|
||||
#define VOLTAGE_CHECK_INTERVAL 288 // How often the tag should do a battery voltage check (multiplied by LONG_DATAREQ_INTERVAL)
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define FW_VERSION 0x0027 // version number (max 2.5.5 :) )
|
||||
#define FW_VERSION_SUFFIX "-zlib" // suffix, like -RC1 or whatever.
|
||||
#define FW_VERSION 0x0028 // version number (max 2.5.5 :) )
|
||||
#define FW_VERSION_SUFFIX "-cmds" // suffix, like -RC1 or whatever.
|
||||
|
||||
// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
|
||||
// #define PRINT_LUT // uncomment if you want the tag to print the LUT for the current temperature bracket
|
||||
|
||||
@@ -83,15 +83,12 @@ void showSplashScreen() {
|
||||
fr.epdPrintf(10, 350, 0, rotation::ROTATE_0, "Tag MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(80, 160, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.setFont((char *)"font/FreeSans9pt7b");
|
||||
fr.epdPrintf(622, 290, 0, rotation::ROTATE_270, "v%04X%s", FW_VERSION, FW_VERSION_SUFFIX);
|
||||
fr.epdPrintf(622, 280, 0, rotation::ROTATE_270, "v%04X%s", FW_VERSION, FW_VERSION_SUFFIX);
|
||||
selectLUT(1);
|
||||
draw();
|
||||
epdEnterSleep();
|
||||
}
|
||||
|
||||
#define FW_VERSION 0x0027 // version number (max 2.5.5 :) )
|
||||
#define FW_VERSION_SUFFIX "-zlib" // suffix, like -RC1 or whatever.
|
||||
|
||||
void showApplyUpdate() {
|
||||
epdSetup();
|
||||
fs->init();
|
||||
@@ -120,7 +117,7 @@ void showAPFound() {
|
||||
fr.epdPrintf(10, 315, 0, rotation::ROTATE_0, "Battery: %d.%dV", batteryVoltage / 1000, batteryVoltage % 1000);
|
||||
fr.epdPrintf(10, 350, 0, rotation::ROTATE_0, "Tag MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.setFont((char *)"font/FreeSans9pt7b");
|
||||
fr.epdPrintf(622, 290, 0, rotation::ROTATE_270, "v%04X%s", FW_VERSION, FW_VERSION_SUFFIX);
|
||||
fr.epdPrintf(622, 280, 0, rotation::ROTATE_270, "v%04X%s", FW_VERSION, FW_VERSION_SUFFIX);
|
||||
addOverlay();
|
||||
|
||||
if (lowBatteryShown) {
|
||||
@@ -154,16 +151,12 @@ void showNoAP() {
|
||||
}
|
||||
|
||||
void showLongTermSleep() {
|
||||
// selectLUT(EPD_LUT_NO_REPEATS);
|
||||
// clearScreen();
|
||||
|
||||
// epdPrintBegin(2, SCREEN_HEIGHT - 16, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK);
|
||||
// epdpr("zZ");
|
||||
// epdPrintEnd();
|
||||
|
||||
addOverlay();
|
||||
// drawWithSleep();
|
||||
epdSetup();
|
||||
selectLUT(0);
|
||||
draw();
|
||||
epdEnterSleep();
|
||||
}
|
||||
|
||||
void showNoEEPROM() {
|
||||
// selectLUT(EPD_LUT_NO_REPEATS);
|
||||
// clearScreen();
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -134,7 +134,7 @@ void getTemperature() {
|
||||
|
||||
temperature = (uint8_t)(temp / 100);
|
||||
|
||||
printf("temp = %lu.%lu\n", temp / 100, temp % 100);
|
||||
//printf("temp = %lu.%lu\n", temp / 100, temp % 100);
|
||||
}
|
||||
|
||||
void boardGetOwnMac(uint8_t *mac) {
|
||||
|
||||
@@ -105,6 +105,7 @@ struct tagSpecs {
|
||||
uint8_t buttonCount = 0;
|
||||
bool hasNFC = false;
|
||||
bool hasLED = false;
|
||||
bool hasThirdColor = false;
|
||||
uint16_t macSuffix = 0x0000;
|
||||
uint8_t OEPLtype = 0;
|
||||
uint8_t solumType = 0;
|
||||
|
||||
@@ -36,6 +36,13 @@ void identifyTagInfo() {
|
||||
CA FE BA DE 15 0B 12 04 00 10 01 E0 01 20 03 39 00 03 81 9D 00 00 4C FF FF FF FF FF FF FF FF FF 7.4 UC8179
|
||||
F3 22 BC 05 15 0A 0D 04 00 19 01 A0 02 C0 03 38 07 07 01 80 00 00 64 FF FF FF FF FF FF FF FF FF 9.7 SSD
|
||||
AD BA FE CA 15 0A 1B 04 00 19 01 A0 02 C0 03 38 07 07 01 80 00 00 64 FF FF FF FF FF FF FF FF FF 9.7 type 2
|
||||
92 C3 80 05 15 08 19 04 00 12 01 18 03 10 01 04 07 07 01 80 00 00 63 FF FF FF FF FF FF FF FF FF 5.85 BWR
|
||||
22 F0 BF 05 15 0A 14 04 00 12 00 18 03 10 01 04 07 07 01 80 00 00 24 FF FF FF FF FF FF FF FF FF 5.85 BW
|
||||
99 78 B1 05 15 0A 06 04 00 0D 01 68 01 B8 00 38 07 07 01 80 00 00 43 FF FF FF FF FF FF FF FF FF 2.6"
|
||||
72 92 1E 7E 15 0B 09 04 00 15 00 80 01 A8 00 38 00 01 01 9C 00 00 22 FF FF FF FF FF FF FF FF FF 2.9" FREEZER
|
||||
31 50 53 06 16 02 19 04 00 12 01 C8 00 C8 00 04 00 07 01 9C 00 00 40 FF FF FF FF FF FF FF FF FF
|
||||
|
||||
|
||||
|
||||
MAC | calib | |?????|Xres |Yres | ??? |capab| |type|
|
||||
|
||||
@@ -49,7 +56,7 @@ void identifyTagInfo() {
|
||||
0x12 - SSD (var1.6)
|
||||
0x15 - SSD (2.9 lite)
|
||||
0x19 - SSD (9.7)
|
||||
|
||||
0x0A - Have third color?
|
||||
0x12 - 0x01 | (0x80 if it has a button)
|
||||
0x13 - 0x80 | (0x10 if it has a LED) | (0x0C ?? ) | (0x01 if it has a button)
|
||||
*/
|
||||
@@ -65,12 +72,20 @@ void identifyTagInfo() {
|
||||
capabilities[1] = getUICRByte(0x13);
|
||||
tag.solumType = getUICRByte(0x16);
|
||||
|
||||
if (getUICRByte(0x0A) == 0x01) {
|
||||
tag.hasThirdColor = true;
|
||||
}
|
||||
|
||||
switch (controllerType) {
|
||||
case 0x0F:
|
||||
case 0x12:
|
||||
case 0x15:
|
||||
case 0x19:
|
||||
epd = new unissd;
|
||||
if (epdXRes == 792 && epdYRes == 272) {
|
||||
epd = new dualssd;
|
||||
} else {
|
||||
epd = new unissd;
|
||||
}
|
||||
break;
|
||||
case 0x0D:
|
||||
epd = new epdvar29;
|
||||
@@ -106,6 +121,28 @@ void identifyTagInfo() {
|
||||
if (capabilities[1] & 0x10) tag.hasLED = true;
|
||||
if (capabilities[0] & 0x01) tag.hasNFC = true;
|
||||
|
||||
#ifdef DEBUG_SHOW_TAGINFO
|
||||
|
||||
printf("TagType report:\n");
|
||||
printf("Resolution: %d*%d Px\n", epd->Xres, epd->Yres);
|
||||
printf("Nb of buttons: %d\n", tag.buttonCount);
|
||||
if (tag.hasLED) {
|
||||
printf("This tag have a led: Yes\n");
|
||||
} else {
|
||||
printf("This tag have a led: No\n");
|
||||
}
|
||||
if (tag.hasNFC) {
|
||||
printf("This tag have NFC: Yes\n");
|
||||
} else {
|
||||
printf("This tag have NFC: No\n");
|
||||
}
|
||||
if (tag.hasThirdColor) {
|
||||
printf("This tag is Black and white only: No\n");
|
||||
} else {
|
||||
printf("This tag is Black and white only: Yes\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
// we'll calculate image slot size here
|
||||
uint32_t imageSize = epd->Xres * epd->Yres / 4;
|
||||
tag.imageSize = ((imageSize + EEPROM_ERZ_SECTOR_SZ - 1) / EEPROM_ERZ_SECTOR_SZ) * EEPROM_ERZ_SECTOR_SZ;
|
||||
@@ -115,6 +152,8 @@ void identifyTagInfo() {
|
||||
tag.macSuffix = 0xB0D0;
|
||||
epd->epdMirrorV = true;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_16;
|
||||
epd->effectiveXRes = epdXRes;
|
||||
epd->effectiveYRes = epdYRes - 1; // Yeah... I wonder why too....
|
||||
break;
|
||||
case STYPE_SIZE_022:
|
||||
tag.macSuffix = 0xB190;
|
||||
@@ -122,6 +161,12 @@ void identifyTagInfo() {
|
||||
tag.OEPLtype = SOLUM_M3_BWR_22;
|
||||
epd->XOffset = 8;
|
||||
break;
|
||||
case STYPE_SIZE_026:
|
||||
tag.macSuffix = 0xB3D0;
|
||||
epd->drawDirectionRight = true;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_26;
|
||||
epd->XOffset = 8;
|
||||
break;
|
||||
case STYPE_SIZE_029:
|
||||
tag.OEPLtype = SOLUM_M3_BWR_29;
|
||||
if (tag.buttonCount == 2) {
|
||||
@@ -134,6 +179,12 @@ void identifyTagInfo() {
|
||||
epd->drawDirectionRight = true;
|
||||
epd->XOffset = 8;
|
||||
break;
|
||||
case STYPE_SIZE_029_FREEZER:
|
||||
tag.OEPLtype = SOLUM_M3_BW_29;
|
||||
tag.macSuffix = 0x82D0;
|
||||
epd->drawDirectionRight = true;
|
||||
epd->XOffset = 8;
|
||||
break;
|
||||
case STYPE_SIZE_042:
|
||||
tag.macSuffix = 0xB6D0;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_42;
|
||||
@@ -145,6 +196,14 @@ void identifyTagInfo() {
|
||||
// epd->mirrorH = true;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_43;
|
||||
break;
|
||||
case STYPE_SIZE_058:
|
||||
tag.macSuffix = 0xE3D0;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_58;
|
||||
break;
|
||||
case STYPE_SIZE_058_FREEZER:
|
||||
tag.macSuffix = 0x84D0;
|
||||
tag.OEPLtype = SOLUM_M3_BW_58;
|
||||
break;
|
||||
case STYPE_SIZE_060:
|
||||
tag.macSuffix = 0xB890;
|
||||
tag.OEPLtype = SOLUM_M3_BWR_60;
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
|
||||
#define BATTERY_VOLTAGE_MINIMUM 2450 // 2600 or below is the best we can do on the EPD
|
||||
|
||||
#define WAKE_SECOND_CHECKIN_DELAY 10000UL
|
||||
|
||||
// power saving when no AP's were found (scanning every X)
|
||||
#define VOLTAGEREADING_DURING_SCAN_INTERVAL 2 // how often we should read voltages; this is done every scan attempt in interval bracket 3
|
||||
#define INTERVAL_1_TIME 3600UL // Try every hour
|
||||
|
||||
@@ -5,12 +5,26 @@
|
||||
|
||||
#define FW_VERSION 0x0027 // version number (max 2.5.5 :) )
|
||||
#define FW_VERSION_SUFFIX "ZLIB" // suffix, like RC1 or whatever.
|
||||
#define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
|
||||
// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
|
||||
#endif
|
||||
|
||||
// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
|
||||
|
||||
// #define DEBUG_SHOW_TAGINFO
|
||||
// #define DEBUG_DRAWING
|
||||
// #define DEBUG_EPD
|
||||
// #define DEBUG_FS
|
||||
// #define DEBUG_COMPRESSION
|
||||
// #define DEBUG_PROTO
|
||||
// #define DEBUG_SETTINGS
|
||||
// #define DEBUG_MAIN
|
||||
// #define DEBUG_FAST_CHECK_IN
|
||||
// #define DEBUG_DONTVALIDATEPROTO
|
||||
|
||||
#if defined(DEBUG_SETTINGS) || defined(DEBUG_EPD) || defined(DEBUGBLOCKS) || defined(DEBUG_PROTO) || defined(DEBUG_COMPRESSION) || defined(DEBUG_FS) || defined(DEBUG_MAIN) || defined(DEBUG_FAST_CHECK_IN) || defined(DEBUG_SHOW_TAGINFO) || defined(DEBUG_DONTVALIDATEPROTO) || defined(DEBUG_DRAWING)
|
||||
#define DEBUG_BUILD
|
||||
#define DEBUG_DRAWING
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define SETTINGS_STRUCT_VERSION 0x01
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[platformio]
|
||||
core_dir = $PROJECT_DIR/core
|
||||
core_dir = D:/Documents/GitHub/OpenEPaperLink/ARM_Tag_FW/Newton_M3_nRF52811/core
|
||||
|
||||
[env]
|
||||
platform = nordicnrf52@9.6.0
|
||||
|
||||
212
ARM_Tag_FW/Newton_M3_nRF52811/src/epd_driver/dualssd.cpp
Normal file
212
ARM_Tag_FW/Newton_M3_nRF52811/src/epd_driver/dualssd.cpp
Normal file
@@ -0,0 +1,212 @@
|
||||
#include <Arduino.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lut.h"
|
||||
#include "settings.h"
|
||||
#include "hal.h"
|
||||
#include "wdt.h"
|
||||
|
||||
#include "drawing.h"
|
||||
#include "dualssd.h"
|
||||
|
||||
#define CMD_DRV_OUTPUT_CTRL 0x01
|
||||
#define CMD_SOFT_START_CTRL 0x0C
|
||||
#define CMD_ENTER_SLEEP 0x10
|
||||
#define CMD_DATA_ENTRY_MODE 0x11
|
||||
#define CMD_SOFT_RESET 0x12
|
||||
#define CMD_SOFT_RESET2 0x13
|
||||
#define CMD_SETUP_VOLT_DETECT 0x15
|
||||
#define CMD_TEMP_SENSOR_CONTROL 0x18
|
||||
#define CMD_ACTIVATION 0x20
|
||||
#define CMD_DISP_UPDATE_CTRL 0x21
|
||||
#define CMD_DISP_UPDATE_CTRL2 0x22
|
||||
#define CMD_WRITE_FB_BW 0x24
|
||||
#define CMD_WRITE_FB_RED 0x26
|
||||
#define CMD_VCOM_GLITCH_CTRL 0x2B
|
||||
#define CMD_LOAD_OTP_LUT 0x31
|
||||
#define CMD_WRITE_LUT 0x32
|
||||
#define CMD_BORDER_WAVEFORM_CTRL 0x3C
|
||||
#define CMD_WINDOW_X_SIZE 0x44
|
||||
#define CMD_WINDOW_Y_SIZE 0x45
|
||||
#define CMD_WRITE_PATTERN_RED 0x46
|
||||
#define CMD_WRITE_PATTERN_BW 0x47
|
||||
#define CMD_XSTART_POS 0x4E
|
||||
#define CMD_YSTART_POS 0x4F
|
||||
#define CMD_ANALOG_BLK_CTRL 0x74
|
||||
#define CMD_DIGITAL_BLK_CTRL 0x7E
|
||||
|
||||
#define SCREEN_CMD_CLOCK_ON 0x80
|
||||
#define SCREEN_CMD_CLOCK_OFF 0x01
|
||||
#define SCREEN_CMD_ANALOG_ON 0x40
|
||||
#define SCREEN_CMD_ANALOG_OFF 0x02
|
||||
#define SCREEN_CMD_LATCH_TEMPERATURE_VAL 0x20
|
||||
#define SCREEN_CMD_LOAD_LUT 0x10
|
||||
#define SCREEN_CMD_USE_MODE_2 0x08 // modified commands 0x10 and 0x04
|
||||
#define SCREEN_CMD_REFRESH 0xC7
|
||||
|
||||
#define CONTROLLER_ONE 0x00
|
||||
#define CONTROLLER_TWO 0x80
|
||||
|
||||
void dualssd::selectLUT(uint8_t lut) {
|
||||
// implement alternative LUTs here. Currently just reset the watchdog to two minutes,
|
||||
// to ensure it doesn't reset during the much longer bootup procedure
|
||||
lut += 1; // make the compiler a happy camper
|
||||
wdt120s();
|
||||
return;
|
||||
}
|
||||
|
||||
void dualssd::epdEnterSleep() {
|
||||
epdWrite(CMD_ENTER_SLEEP, 1, 0x01);
|
||||
}
|
||||
void dualssd::epdSetup() {
|
||||
printf("init epd...\n");
|
||||
epdReset();
|
||||
epdWrite(CMD_SOFT_RESET, 0);
|
||||
delay(10);
|
||||
switch (this->controllerType) {
|
||||
case 0x0F:
|
||||
case 0x12:
|
||||
case 0x15:
|
||||
/* 5.85 INIT SEQUENCE
|
||||
0x11, 0x00
|
||||
0x91, 0x01
|
||||
0x44, 0x31, 0x00
|
||||
0x45, 0x0F, 0x01, 0x00, 0x00
|
||||
0x4E, 0x31
|
||||
0x4F, 0x0F, 0x01
|
||||
0xC4, 0x00, 0x31
|
||||
0xC5, 0x0F, 0x01, 0x00, 0x00
|
||||
0xCE, 0x00
|
||||
0xCF, 0x0F, 0x01
|
||||
0x3C, 0x01
|
||||
|
||||
*/
|
||||
/* 5.85 BW INIT SEQUENCE
|
||||
0x11, 0x00
|
||||
0x91, 0x01
|
||||
0x44, 0x31, 0x00
|
||||
0x45, 0x0F, 0x01, 0x00, 0x00
|
||||
0x4E, 0x31
|
||||
0x4F, 0x0F, 0x01
|
||||
0xC4, 0x00, 0x31
|
||||
0xC5, 0x0F, 0x01, 0x00, 0x00
|
||||
0xCE, 0x00
|
||||
0xCF, 0x0F, 0x01
|
||||
0x3C, 0x01
|
||||
*/
|
||||
|
||||
epdWrite(CMD_DATA_ENTRY_MODE + CONTROLLER_ONE, 1, 0x02);
|
||||
epdWrite(CMD_DATA_ENTRY_MODE + CONTROLLER_TWO, 1, 0x03);
|
||||
|
||||
if (tag.hasThirdColor) {
|
||||
epdWrite(CMD_DISP_UPDATE_CTRL, 2, 0x08, 0x10);
|
||||
} else {
|
||||
epdWrite(CMD_DISP_UPDATE_CTRL, 2, 0x48, 0x10);
|
||||
}
|
||||
|
||||
epdWrite(CMD_WINDOW_X_SIZE + CONTROLLER_ONE, 2, 0x31, 0x00);
|
||||
epdWrite(CMD_WINDOW_Y_SIZE + CONTROLLER_ONE, 4, 0x00, 0x00, 0x0F, 0x01);
|
||||
epdWrite(CMD_XSTART_POS + CONTROLLER_ONE, 1, 0x31);
|
||||
epdWrite(CMD_YSTART_POS + CONTROLLER_ONE, 2, 0x00, 0x00);
|
||||
|
||||
epdWrite(CMD_WINDOW_X_SIZE + CONTROLLER_TWO, 2, 0x00, 0x31);
|
||||
epdWrite(CMD_WINDOW_Y_SIZE + CONTROLLER_TWO, 4, 0x00, 0x00, 0x0F, 0x01);
|
||||
epdWrite(CMD_XSTART_POS + CONTROLLER_TWO, 1, 0x00);
|
||||
epdWrite(CMD_YSTART_POS + CONTROLLER_TWO, 2, 0x0F, 0x01);
|
||||
|
||||
epdWrite(CMD_BORDER_WAVEFORM_CTRL, 1, 0x01);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void dualssd::epdWriteDisplayData() {
|
||||
uint8_t *buf[2] = {0, 0}; // this will hold pointers to odd/even data lines
|
||||
// Those dual SSD controller (SSD1683??) behave as 2 400pxx wide screens, that needs independent data transfers.
|
||||
uint8_t c_increment = 1;
|
||||
if (!tag.hasThirdColor) {
|
||||
c_increment = 2;
|
||||
}
|
||||
for (uint8_t c = 0; c < 4; c = c + c_increment) {
|
||||
delay(10);
|
||||
if (c == 0) epd_cmd(CMD_WRITE_FB_BW + CONTROLLER_ONE); // BW
|
||||
if (c == 1) epd_cmd(CMD_WRITE_FB_RED + CONTROLLER_ONE); // RED
|
||||
if (c == 2) epd_cmd(CMD_WRITE_FB_BW + CONTROLLER_TWO); // BW
|
||||
if (c == 3) epd_cmd(CMD_WRITE_FB_RED + CONTROLLER_TWO); // RED
|
||||
|
||||
delay(10);
|
||||
markData();
|
||||
epdSelect();
|
||||
|
||||
for (uint16_t curY = 0; curY < epd->effectiveYRes; curY += 2) {
|
||||
// Get 'even' screen line
|
||||
buf[0] = (uint8_t *)calloc(epd->effectiveXRes / 8, 1);
|
||||
|
||||
drawItem::renderDrawLine(buf[0], curY, c % 2);
|
||||
|
||||
if (epd->epdMirrorH) drawItem::reverseBytes(buf[0], epd->effectiveXRes / 8);
|
||||
// on the first pass, the second (buf[1]) buffer is unused, so we don't have to wait for it to flush to the display / free it
|
||||
if (buf[1]) {
|
||||
// wait for 'odd' display line to finish writing to the screen
|
||||
epdSPIWait();
|
||||
free(buf[1]);
|
||||
}
|
||||
|
||||
// start transfer of even data line to the screen
|
||||
if (c < 2) {
|
||||
epdSPIAsyncWrite(buf[0] + (epd->effectiveXRes / 16), (epd->effectiveXRes / 16) + 1);
|
||||
} else {
|
||||
epdSPIAsyncWrite(buf[0], (epd->effectiveXRes / 16) + 1);
|
||||
}
|
||||
|
||||
// Get 'odd' screen display line
|
||||
buf[1] = (uint8_t *)calloc(epd->effectiveXRes / 8, 1);
|
||||
|
||||
drawItem::renderDrawLine(buf[1], curY + 1, c % 2);
|
||||
|
||||
if (epd->epdMirrorH) drawItem::reverseBytes(buf[1], epd->effectiveXRes / 8);
|
||||
|
||||
// wait until the 'even' data has finished writing
|
||||
epdSPIWait();
|
||||
free(buf[0]);
|
||||
|
||||
// start transfer of the 'odd' data line
|
||||
if (c < 2) {
|
||||
epdSPIAsyncWrite(buf[1] + (epd->effectiveXRes / 16), (epd->effectiveXRes / 16) + 1);
|
||||
} else {
|
||||
epdSPIAsyncWrite(buf[1], (epd->effectiveXRes / 16) + 1);
|
||||
}
|
||||
}
|
||||
// check if this was the first pass. If it was, we'll need to wait until the last display line finished writing
|
||||
if (c == 0 || c == 2) {
|
||||
epdSPIWait();
|
||||
epdDeselect();
|
||||
free(buf[1]);
|
||||
buf[1] = nullptr;
|
||||
}
|
||||
}
|
||||
// flush the draw list, make sure items don't appear on subsequent screens
|
||||
drawItem::flushDrawItems();
|
||||
|
||||
// wait until the last line of display has finished writing and clean our stuff up
|
||||
epdSPIWait();
|
||||
epdDeselect();
|
||||
if (buf[1]) free(buf[1]);
|
||||
}
|
||||
|
||||
void dualssd::draw() {
|
||||
drawNoWait();
|
||||
getVoltage();
|
||||
epdBusyWaitFalling(120000);
|
||||
}
|
||||
void dualssd::drawNoWait() {
|
||||
epdWriteDisplayData();
|
||||
// epdWrite(CMD_DISP_UPDATE_CTRL2, 1, 0xF7);
|
||||
epdWrite(CMD_ACTIVATION, 0);
|
||||
}
|
||||
void dualssd::epdWaitRdy() {
|
||||
epdBusyWaitFalling(120000);
|
||||
}
|
||||
23
ARM_Tag_FW/Newton_M3_nRF52811/src/epd_driver/dualssd.h
Normal file
23
ARM_Tag_FW/Newton_M3_nRF52811/src/epd_driver/dualssd.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef _EPD_DUALSSD_H_
|
||||
#define _EPD_DUALSSD_H_
|
||||
|
||||
class dualssd : public epdInterface {
|
||||
public:
|
||||
void epdSetup();
|
||||
void epdEnterSleep();
|
||||
void draw();
|
||||
void drawNoWait();
|
||||
void epdWaitRdy();
|
||||
void epdWriteDisplayData();
|
||||
void selectLUT(uint8_t lut);
|
||||
|
||||
protected:
|
||||
void commandReadBegin(uint8_t cmd);
|
||||
void commandReadEnd();
|
||||
uint8_t epdReadByte();
|
||||
void setWindowX(uint16_t start, uint16_t end);
|
||||
void setWindowY(uint16_t start, uint16_t end);
|
||||
void setPosXY(uint16_t x, uint16_t y);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -21,6 +21,7 @@ void selectLUT(uint8_t lut);
|
||||
|
||||
#include "uc_variant_043.h"
|
||||
#include "unissd.h"
|
||||
#include "dualssd.h"
|
||||
#include "uc_variant_029.h"
|
||||
#include "uc8159.h"
|
||||
#include "uc8179.h"
|
||||
|
||||
@@ -75,14 +75,23 @@ void unissd::epdSetup() {
|
||||
case 0x15:
|
||||
// stock init 1.6"
|
||||
epdWrite(CMD_DRV_OUTPUT_CTRL, 3, this->effectiveYRes & 0xFF, this->effectiveYRes >> 8, 0x00);
|
||||
epdWrite(CMD_DATA_ENTRY_MODE, 1, 0x01);
|
||||
if (epd->epdMirrorV) {
|
||||
epdWrite(CMD_DATA_ENTRY_MODE, 1, 0x03);
|
||||
epdWrite(CMD_WINDOW_Y_SIZE, 4, this->YOffset & 0xFF, this->YOffset >> 8, (this->YOffset + this->effectiveYRes) & 0xFF, (this->YOffset + this->effectiveYRes) >> 8);
|
||||
} else {
|
||||
epdWrite(CMD_DATA_ENTRY_MODE, 1, 0x01);
|
||||
epdWrite(CMD_WINDOW_Y_SIZE, 4, (this->YOffset + this->effectiveYRes) & 0xFF, (this->YOffset + this->effectiveYRes) >> 8, this->YOffset & 0xFF, this->YOffset >> 8);
|
||||
}
|
||||
epdWrite(CMD_WINDOW_X_SIZE, 2, this->XOffset / 8, ((this->XOffset + this->effectiveXRes) / 8) - 1);
|
||||
epdWrite(CMD_WINDOW_Y_SIZE, 4, (this->YOffset + this->effectiveYRes) & 0xFF, (this->YOffset + this->effectiveYRes) >> 8, this->YOffset & 0xFF, this->YOffset >> 8);
|
||||
epdWrite(CMD_BORDER_WAVEFORM_CTRL, 1, 0x05);
|
||||
epdWrite(CMD_TEMP_SENSOR_CONTROL, 1, 0x80);
|
||||
// end stock init
|
||||
// added
|
||||
epdWrite(CMD_DISP_UPDATE_CTRL, 2, 0x08, 0x00); // fix reversed image with stock setup
|
||||
if (tag.hasThirdColor) {
|
||||
epdWrite(CMD_DISP_UPDATE_CTRL, 2, 0x08, 0x00); // fix reversed image with stock setup
|
||||
} else {
|
||||
epdWrite(CMD_DISP_UPDATE_CTRL, 2, 0x48, 0x00); // fix reversed image with stock setup
|
||||
}
|
||||
break;
|
||||
case 0x19:
|
||||
// stock init 9.7"
|
||||
@@ -108,13 +117,21 @@ void unissd::epdSetup() {
|
||||
void unissd::epdWriteDisplayData() {
|
||||
// this display expects two entire framebuffers worth of data to be written, one for b/w and one for red
|
||||
uint8_t *buf[2] = {0, 0}; // this will hold pointers to odd/even data lines
|
||||
for (uint8_t c = 0; c < 2; c++) {
|
||||
uint8_t c_end = 2; // The loop must be executed 2 times if BWR, 1 time if BW
|
||||
if (!tag.hasThirdColor) {
|
||||
c_end = 1;
|
||||
}
|
||||
for (uint8_t c = 0; c < c_end; c++) {
|
||||
switch (this->controllerType) {
|
||||
case 0x0F:
|
||||
case 0x12:
|
||||
case 0x15:
|
||||
epdWrite(CMD_XSTART_POS, 1, (this->XOffset / 8));
|
||||
epdWrite(CMD_YSTART_POS, 2, (this->YOffset + this->effectiveYRes) & 0xFF, (this->YOffset + this->effectiveYRes) >> 8);
|
||||
if (epd->epdMirrorV) {
|
||||
epdWrite(CMD_YSTART_POS, 2, this->YOffset & 0xFF, (this->YOffset) >> 8);
|
||||
} else {
|
||||
epdWrite(CMD_YSTART_POS, 2, (this->YOffset + this->effectiveYRes) & 0xFF, (this->YOffset + this->effectiveYRes) >> 8);
|
||||
}
|
||||
break;
|
||||
case 0x19:
|
||||
epdWrite(CMD_XSTART_POS, 2, 0xBF, 0x03);
|
||||
@@ -130,11 +147,8 @@ void unissd::epdWriteDisplayData() {
|
||||
// Get 'even' screen line
|
||||
buf[0] = (uint8_t *)calloc(epd->effectiveXRes / 8, 1);
|
||||
|
||||
if (epd->epdMirrorV) {
|
||||
drawItem::renderDrawLine(buf[0], (epd->effectiveYRes - 1) - curY, c);
|
||||
} else {
|
||||
drawItem::renderDrawLine(buf[0], curY, c);
|
||||
}
|
||||
drawItem::renderDrawLine(buf[0], curY, c);
|
||||
|
||||
if (epd->epdMirrorH) drawItem::reverseBytes(buf[0], epd->effectiveXRes / 8);
|
||||
// on the first pass, the second (buf[1]) buffer is unused, so we don't have to wait for it to flush to the display / free it
|
||||
if (buf[1]) {
|
||||
@@ -148,11 +162,9 @@ void unissd::epdWriteDisplayData() {
|
||||
|
||||
// Get 'odd' screen display line
|
||||
buf[1] = (uint8_t *)calloc(epd->effectiveXRes / 8, 1);
|
||||
if (epd->epdMirrorV) {
|
||||
drawItem::renderDrawLine(buf[1], (epd->effectiveYRes - 1) - (curY + 1), c);
|
||||
} else {
|
||||
drawItem::renderDrawLine(buf[1], curY + 1, c);
|
||||
}
|
||||
|
||||
drawItem::renderDrawLine(buf[1], curY + 1, c);
|
||||
|
||||
if (epd->epdMirrorH) drawItem::reverseBytes(buf[1], epd->effectiveXRes / 8);
|
||||
|
||||
// wait until the 'even' data has finished writing
|
||||
|
||||
@@ -84,25 +84,10 @@ bool displayCustomImage(uint8_t imagetype) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void externalWakeHandler(uint8_t type) {
|
||||
if (displayCustomImage(type)) {
|
||||
doSleep(2000);
|
||||
|
||||
// if something else was previously on the display, draw that
|
||||
if (curImgSlot != 0xFF) {
|
||||
powerUp(INIT_EEPROM);
|
||||
uint8_t lut = getEepromImageDataArgument(curImgSlot);
|
||||
lut &= 0x03;
|
||||
powerUp(INIT_EPD);
|
||||
drawImageFromEeprom(curImgSlot, lut);
|
||||
powerDown(INIT_EPD | INIT_EEPROM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TagAssociated() {
|
||||
// associated
|
||||
bool fastNextCheckin = false;
|
||||
uint32_t fastNextCheckinDelay = WAKE_SECOND_CHECKIN_DELAY;
|
||||
struct AvailDataInfo *avail;
|
||||
static bool buttonCheckOut = false; // send another full request if the previous was a trigger reason (buttons, nfc)
|
||||
// Is there any reason why we should do a long (full) get data request (including reason, status)?
|
||||
@@ -139,23 +124,23 @@ void TagAssociated() {
|
||||
|
||||
switch (wakeUpReason) {
|
||||
case WAKEUP_REASON_BUTTON1:
|
||||
externalWakeHandler(CUSTOM_IMAGE_BUTTON1);
|
||||
if (displayCustomImage(CUSTOM_IMAGE_BUTTON1)) fastNextCheckinDelay = 0;
|
||||
fastNextCheckin = true;
|
||||
break;
|
||||
case WAKEUP_REASON_BUTTON2:
|
||||
externalWakeHandler(CUSTOM_IMAGE_BUTTON2);
|
||||
if (displayCustomImage(CUSTOM_IMAGE_BUTTON2)) fastNextCheckinDelay = 0;
|
||||
fastNextCheckin = true;
|
||||
break;
|
||||
case WAKEUP_REASON_GPIO:
|
||||
externalWakeHandler(CUSTOM_IMAGE_GPIO);
|
||||
if (displayCustomImage(CUSTOM_IMAGE_GPIO)) fastNextCheckinDelay = 0;
|
||||
fastNextCheckin = true;
|
||||
break;
|
||||
case WAKEUP_REASON_RF:
|
||||
externalWakeHandler(CUSTOM_IMAGE_RF_WAKE);
|
||||
if (displayCustomImage(CUSTOM_IMAGE_RF_WAKE)) fastNextCheckinDelay = 0;
|
||||
fastNextCheckin = true;
|
||||
break;
|
||||
case WAKEUP_REASON_NFC:
|
||||
externalWakeHandler(CUSTOM_IMAGE_NFC_WAKE);
|
||||
if (displayCustomImage(CUSTOM_IMAGE_NFC_WAKE)) fastNextCheckinDelay = 0;
|
||||
fastNextCheckin = true;
|
||||
break;
|
||||
}
|
||||
@@ -168,7 +153,7 @@ void TagAssociated() {
|
||||
}
|
||||
|
||||
// since we've had succesful contact, and communicated the wakeup reason succesfully, we can now reset to the 'normal' status
|
||||
if ((wakeUpReason == WAKEUP_REASON_BUTTON1) | (wakeUpReason == WAKEUP_REASON_BUTTON2) | (wakeUpReason == WAKEUP_REASON_NFC) | (wakeUpReason == CUSTOM_IMAGE_RF_WAKE)) {
|
||||
if ((wakeUpReason == WAKEUP_REASON_GPIO) | (wakeUpReason == WAKEUP_REASON_BUTTON1) | (wakeUpReason == WAKEUP_REASON_BUTTON2) | (wakeUpReason == WAKEUP_REASON_NFC) | (wakeUpReason == CUSTOM_IMAGE_RF_WAKE)) {
|
||||
buttonCheckOut = true;
|
||||
}
|
||||
wakeUpReason = WAKEUP_REASON_TIMED;
|
||||
@@ -225,9 +210,13 @@ void TagAssociated() {
|
||||
if (fastNextCheckin) {
|
||||
// do a fast check-in next
|
||||
fastNextCheckin = false;
|
||||
doSleep(100UL);
|
||||
if (fastNextCheckinDelay) {
|
||||
doSleep(fastNextCheckinDelay);
|
||||
} else {
|
||||
doSleep(100UL);
|
||||
}
|
||||
} else {
|
||||
if (nextCheckInFromAP) {
|
||||
if (nextCheckInFromAP & 0x7FFF) {
|
||||
// if the AP told us to sleep for a specific period, do so.
|
||||
if (nextCheckInFromAP & 0x8000) {
|
||||
doSleep((nextCheckInFromAP & 0x7FFF) * 1000UL);
|
||||
|
||||
@@ -25,20 +25,21 @@ struct fwmetadata {
|
||||
|
||||
#define EEPROM_SETTINGS_SIZE 4096
|
||||
|
||||
#define BLOCKSIZE_MS 240 // was 270
|
||||
#define BLOCKSIZE_MS 280 // was 270
|
||||
|
||||
#define FWNRF
|
||||
#define LEDSENABLED
|
||||
#define PERSISTENTVAR
|
||||
#define HAL_TIMER_TICK 1
|
||||
#define PERSISTENTVAR
|
||||
#define EEPROM_IMG_START 0
|
||||
|
||||
|
||||
;
|
||||
#define HAL_PacketRX commsRxUnencrypted
|
||||
#define HAL_msDelay delay
|
||||
|
||||
void dump(const uint8_t *a, const uint16_t l);
|
||||
|
||||
extern void executeCommand(uint8_t cmd); // this is defined in main.c
|
||||
|
||||
static void saveUpdateMetadata(uint32_t size) {
|
||||
struct fwmetadata metadata;
|
||||
metadata.magic1 = MAGIC1;
|
||||
@@ -71,8 +72,12 @@ static bool validateEepromMD5(uint64_t ver, uint32_t eepromstart, uint32_t flen)
|
||||
printf("This is what we got:\n");
|
||||
dump(hash, 16);
|
||||
}
|
||||
|
||||
#ifdef DEBUG_DONTVALIDATEPROTO
|
||||
return true;
|
||||
#else
|
||||
return isValid;
|
||||
#endif
|
||||
}
|
||||
|
||||
#include "../../common/oepl-protocol.cpp"
|
||||
@@ -26,12 +26,19 @@ bool lowBatteryShown = false;
|
||||
bool noAPShown = false;
|
||||
|
||||
void addOverlay() {
|
||||
|
||||
if (currentChannel == 0) {
|
||||
drawMask(epd->Xres - 27, 5, 22, 22, COLOR_BLACK);
|
||||
drawMask(epd->Xres - 27, 5, 22, 22, COLOR_RED);
|
||||
drawRoundedRectangle(epd->Xres - 28, 4, 24, 24, COLOR_RED);
|
||||
addBufferedImage(epd->Xres - 24, 8, COLOR_BLACK, rotation::ROTATE_0, ant, DRAW_NORMAL);
|
||||
addBufferedImage(epd->Xres - 16, 15, COLOR_RED, rotation::ROTATE_0, cross, DRAW_NORMAL);
|
||||
drawMask(epd->Xres - 28, 4, 24, 24, COLOR_BLACK);
|
||||
if(tag.hasThirdColor){
|
||||
drawMask(epd->Xres - 28, 4, 24, 24, COLOR_RED);
|
||||
drawRoundedRectangle(epd->Xres - 28, 4, 24, 24, COLOR_RED);
|
||||
addBufferedImage(epd->Xres - 24, 8, COLOR_BLACK, rotation::ROTATE_0, ant, DRAW_NORMAL);
|
||||
addBufferedImage(epd->Xres - 16, 15, COLOR_RED, rotation::ROTATE_0, cross, DRAW_NORMAL);
|
||||
}else{
|
||||
drawRoundedRectangle(epd->Xres - 28, 4, 24, 24, COLOR_BLACK);
|
||||
addBufferedImage(epd->Xres - 24, 8, COLOR_BLACK, rotation::ROTATE_0, ant, DRAW_NORMAL);
|
||||
addBufferedImage(epd->Xres - 16, 15, COLOR_BLACK, rotation::ROTATE_0, cross, DRAW_NORMAL);
|
||||
}
|
||||
noAPShown = true;
|
||||
} else {
|
||||
noAPShown = false;
|
||||
@@ -39,8 +46,13 @@ void addOverlay() {
|
||||
|
||||
if (lowBattery) {
|
||||
drawMask(epd->Xres - 27, epd->Yres - 26, 22, 22, COLOR_BLACK);
|
||||
drawMask(epd->Xres - 27, epd->Yres - 26, 22, 22, COLOR_RED);
|
||||
drawRoundedRectangle(epd->Xres - 28, epd->Yres - 26, 24, 24, COLOR_RED);
|
||||
if(tag.hasThirdColor){
|
||||
drawMask(epd->Xres - 27, epd->Yres - 26, 22, 22, COLOR_RED);
|
||||
drawRoundedRectangle(epd->Xres - 28, epd->Yres - 26, 24, 24, COLOR_RED);
|
||||
}else{
|
||||
drawMask(epd->Xres - 27, epd->Yres - 26, 22, 22, COLOR_BLACK);
|
||||
drawRoundedRectangle(epd->Xres - 28, epd->Yres - 26, 24, 24, COLOR_BLACK);
|
||||
}
|
||||
addBufferedImage(epd->Xres - 24, epd->Yres - 19, COLOR_BLACK, rotation::ROTATE_0, battery, DRAW_NORMAL);
|
||||
lowBatteryShown = true;
|
||||
} else {
|
||||
@@ -48,10 +60,16 @@ void addOverlay() {
|
||||
}
|
||||
#ifdef DEBUG_BUILD
|
||||
fontrender fr(&FreeSansBold18pt7b);
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_BLACK);
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_RED, rotation::ROTATE_0, "DEBUG");
|
||||
drawMask(15, epd->Yres - 53, 130, 33, COLOR_BLACK);
|
||||
if(tag.hasThirdColor){
|
||||
drawMask(15, epd->Yres - 53, 130, 33, COLOR_RED);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_RED, rotation::ROTATE_0, "DEBUG");
|
||||
}else{
|
||||
drawMask(15, epd->Yres - 53, 130, 33, COLOR_BLACK);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_BLACK);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_BLACK, rotation::ROTATE_0, "DEBUG");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -67,9 +85,9 @@ void showSplashScreen() {
|
||||
case STYPE_SIZE_016:
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
fr.epdPrintf(10, 38, COLOR_RED, rotation::ROTATE_0, "Newton M3 2.2\"");
|
||||
fr.epdPrintf(10, 38, COLOR_RED, rotation::ROTATE_0, "Newton M3 1.6\"");
|
||||
fr.epdPrintf(5, epd->Yres - 40, 0, rotation::ROTATE_0, "FW: %04X-%s", fwVersion, fwVersionSuffix);
|
||||
fr.epdPrintf(2, epd->Yres - 20, 0, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(2, epd->Yres - 20, 0, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_022:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
@@ -81,6 +99,16 @@ void showSplashScreen() {
|
||||
fr.epdPrintf(5, epd->Yres - 20, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_026:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 38, COLOR_RED, rotation::ROTATE_0, "Newton M3 2.6\"");
|
||||
// fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(5, epd->Yres - 40, 0, rotation::ROTATE_0, "FW: %04X-%s", fwVersion, fwVersionSuffix);
|
||||
fr.epdPrintf(5, epd->Yres - 20, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_029:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
@@ -91,6 +119,16 @@ void showSplashScreen() {
|
||||
fr.epdPrintf(5, epd->Yres - 20, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_029_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 38, COLOR_BLACK, rotation::ROTATE_0, "Newton M3 2.9\" Freezer");
|
||||
// fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(epd->Xres - 17, 0, COLOR_BLACK, rotation::ROTATE_270, "FW: %04X-%s", fwVersion, fwVersionSuffix);
|
||||
fr.epdPrintf(5, epd->Yres - 20, COLOR_BLACK, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_042:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
@@ -111,6 +149,26 @@ void showSplashScreen() {
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 32, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_058:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 38, COLOR_RED, rotation::ROTATE_0, "Newton M3 5.85\"");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(epd->Xres - 17, 0, 0, rotation::ROTATE_270, "FW: %04X-%s", fwVersion, fwVersionSuffix);
|
||||
fr.epdPrintf(5, epd->Yres - 20, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_058_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(2, 2, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 38, COLOR_BLACK, rotation::ROTATE_0, "Newton M3 5.85\" Freezer");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(epd->Xres - 17, 0, COLOR_BLACK, rotation::ROTATE_270, "FW: %04X-%s", fwVersion, fwVersionSuffix);
|
||||
fr.epdPrintf(5, epd->Yres - 20, COLOR_BLACK, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_060:
|
||||
fr.setFont(&FreeSansBold24pt7b);
|
||||
fr.epdPrintf(10, 10, COLOR_BLACK, rotation::ROTATE_0, "OpenEPaperLink");
|
||||
@@ -145,12 +203,19 @@ void showSplashScreen() {
|
||||
addQR(260, 160, 3, 7, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUGBLOCKS
|
||||
#ifdef DEBUG_BUILD
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_BLACK);
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_RED, rotation::ROTATE_0, "DEBUG");
|
||||
if(tag.hasThirdColor){
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_RED);
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_RED, rotation::ROTATE_0, "DEBUG");
|
||||
}else{
|
||||
drawMask(15, epd->Yres - 53, 129, 33, COLOR_BLACK);
|
||||
drawRoundedRectangle(15, epd->Yres - 53, 129, 33, COLOR_BLACK);
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(17, epd->Yres - 50, COLOR_BLACK, rotation::ROTATE_0, "DEBUG");
|
||||
}
|
||||
#endif
|
||||
draw();
|
||||
}
|
||||
@@ -198,6 +263,18 @@ void showAPFound() {
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_026:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 53, COLOR_RED, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", APmac[7], APmac[6], APmac[5], APmac[4], APmac[3], APmac[2], APmac[1], APmac[0]);
|
||||
fr.epdPrintf(10, 71, COLOR_RED, rotation::ROTATE_0, "RSSI: %ddBm LQI: %d", mLastRSSI, mLastLqi);
|
||||
fr.epdPrintf(10, 89, COLOR_RED, rotation::ROTATE_0, "Ch %d", currentChannel);
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, epd->Yres - 43, 0, rotation::ROTATE_0, "Battery: %d.%dV Temp: %d'C", batteryVoltage / 1000, batteryVoltage % 1000, temperature);
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_029:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
@@ -210,6 +287,18 @@ void showAPFound() {
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_029_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 53, COLOR_BLACK, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", APmac[7], APmac[6], APmac[5], APmac[4], APmac[3], APmac[2], APmac[1], APmac[0]);
|
||||
fr.epdPrintf(10, 71, COLOR_BLACK, rotation::ROTATE_0, "RSSI: %ddBm LQI: %d", mLastRSSI, mLastLqi);
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "Ch %d", currentChannel);
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, epd->Yres - 43, 0, rotation::ROTATE_0, "Battery: %d.%dV Temp: %d'C", batteryVoltage / 1000, batteryVoltage % 1000, temperature);
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_042:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
@@ -235,6 +324,30 @@ void showAPFound() {
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_058:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 53, COLOR_RED, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", APmac[7], APmac[6], APmac[5], APmac[4], APmac[3], APmac[2], APmac[1], APmac[0]);
|
||||
fr.epdPrintf(10, 71, COLOR_RED, rotation::ROTATE_0, "RSSI: %ddBm LQI: %d", mLastRSSI, mLastLqi);
|
||||
fr.epdPrintf(10, 89, COLOR_RED, rotation::ROTATE_0, "Ch %d", currentChannel);
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, epd->Yres - 43, 0, rotation::ROTATE_0, "Battery: %d.%dV Temp: %d'C", batteryVoltage / 1000, batteryVoltage % 1000, temperature);
|
||||
fr.epdPrintf(10, epd->Yres - 25, 0, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_058_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, 53, COLOR_BLACK, rotation::ROTATE_0, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", APmac[7], APmac[6], APmac[5], APmac[4], APmac[3], APmac[2], APmac[1], APmac[0]);
|
||||
fr.epdPrintf(10, 71, COLOR_BLACK, rotation::ROTATE_0, "RSSI: %ddBm LQI: %d", mLastRSSI, mLastLqi);
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "Ch %d", currentChannel);
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
fr.epdPrintf(10, epd->Yres - 43, COLOR_BLACK, rotation::ROTATE_0, "Battery: %d.%dV Temp: %d'C", batteryVoltage / 1000, batteryVoltage % 1000, temperature);
|
||||
fr.epdPrintf(10, epd->Yres - 25, COLOR_BLACK, rotation::ROTATE_0, "MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
break;
|
||||
case STYPE_SIZE_060:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "AP Found - Waiting for data");
|
||||
@@ -296,6 +409,16 @@ void showNoAP() {
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(10, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by pressing a button");
|
||||
break;
|
||||
case STYPE_SIZE_026:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(10, 69, COLOR_BLACK, rotation::ROTATE_0, "Couldn't find an AP :(");
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(10, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by scanning");
|
||||
fr.epdPrintf(10, 129, COLOR_BLACK, rotation::ROTATE_0, "the NFC-wake area with your phone");
|
||||
break;
|
||||
case STYPE_SIZE_029:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
@@ -305,6 +428,15 @@ void showNoAP() {
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(10, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by pressing a button");
|
||||
break;
|
||||
case STYPE_SIZE_029_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(10, 69, COLOR_BLACK, rotation::ROTATE_0, "Couldn't find an AP :(");
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(10, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by pressing a button");
|
||||
break;
|
||||
case STYPE_SIZE_042:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
@@ -328,6 +460,26 @@ void showNoAP() {
|
||||
fr.epdPrintf(152, 89, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by scanning");
|
||||
fr.epdPrintf(152, 109, COLOR_BLACK, rotation::ROTATE_0, "the NFC-wake area with your phone");
|
||||
break;
|
||||
case STYPE_SIZE_058:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(10, 69, COLOR_BLACK, rotation::ROTATE_0, "Couldn't find an AP :(");
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(152, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by scanning");
|
||||
fr.epdPrintf(152, 129, COLOR_BLACK, rotation::ROTATE_0, "the NFC-wake area with your phone");
|
||||
break;
|
||||
case STYPE_SIZE_058_FREEZER:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found");
|
||||
fr.setFont(&FreeSans9pt7b);
|
||||
addQR(epd->Xres - 120, 42, 3, 3, "https://openepaperlink.eu/tag/0/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(10, 69, COLOR_BLACK, rotation::ROTATE_0, "Couldn't find an AP :(");
|
||||
fr.epdPrintf(10, 89, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(152, 109, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by scanning");
|
||||
fr.epdPrintf(152, 129, COLOR_BLACK, rotation::ROTATE_0, "the NFC-wake area with your phone");
|
||||
break;
|
||||
case STYPE_SIZE_060:
|
||||
fr.setFont(&FreeSansBold18pt7b);
|
||||
fr.epdPrintf(7, 7, COLOR_BLACK, rotation::ROTATE_0, "No AP Found U_U");
|
||||
@@ -357,7 +509,8 @@ void showNoAP() {
|
||||
addQR(epd->Xres - 66, 47, 3, 2, "https://openepaperlink.eu/tag/1/%02X/%02X%02X%02X%02X%02X%02X%02X%02X/", tag.OEPLtype, mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]);
|
||||
fr.epdPrintf(10, 39, COLOR_BLACK, rotation::ROTATE_0, "Couldn't find an AP :(");
|
||||
fr.epdPrintf(10, 58, COLOR_BLACK, rotation::ROTATE_0, "I'll try again in a little while, but you");
|
||||
fr.epdPrintf(10, 77, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by pressing a button");
|
||||
fr.epdPrintf(10, 77, COLOR_BLACK, rotation::ROTATE_0, "can force a retry now by scanning");
|
||||
fr.epdPrintf(10, 98, COLOR_BLACK, rotation::ROTATE_0, "the NFC-wake area with your phone");
|
||||
addFlashImage(200, 128, COLOR_BLACK, rotation::ROTATE_0, pandablack);
|
||||
addFlashImage(312, 274, COLOR_RED, rotation::ROTATE_0, pandared);
|
||||
break;
|
||||
|
||||
@@ -63,7 +63,7 @@ void addBufferedImage(uint16_t x, uint16_t y, bool color, enum rotation ro, cons
|
||||
di->type = drawItem::drawType::DRAW_MASK;
|
||||
else
|
||||
di->type = drawItem::drawType::DRAW_BUFFERED_1BPP;
|
||||
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@ void addFlashImage(uint16_t x, uint16_t y, bool color, enum rotation ro, const u
|
||||
di->color = color;
|
||||
di->cleanUp = false;
|
||||
di->type = drawItem::drawType::DRAW_BUFFERED_1BPP;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
#ifdef ENABLE_OEPLFS
|
||||
@@ -119,6 +120,7 @@ void addFSImage(uint16_t x, uint16_t y, uint8_t color, enum rotation ro, char *n
|
||||
} else {
|
||||
di->type = drawItem::drawType::DRAW_OEPLFS_1BPP;
|
||||
}
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
|
||||
@@ -153,6 +155,7 @@ void addCompressedFSImage(uint16_t x, uint16_t y, enum rotation ro, char *name)
|
||||
di->color = imgheader.bpp;
|
||||
if (di->color == 1) di->color = 0;
|
||||
di->cleanUp = true;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
#endif
|
||||
@@ -207,6 +210,8 @@ void addQR(uint16_t x, uint16_t y, uint8_t version, uint8_t scale, const char *c
|
||||
di->ypos = y;
|
||||
di->color = 0;
|
||||
di->type = drawItem::drawType::DRAW_BUFFERED_1BPP;
|
||||
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
|
||||
@@ -227,8 +232,12 @@ void drawImageAtAddressWrap(uint32_t addr, uint8_t lut) {
|
||||
di->addItem((uint8_t *)addr, epd->effectiveXRes, epd->effectiveYRes);
|
||||
di->type = drawItem::drawType::DRAW_EEPROM_1BPP;
|
||||
di->direction = false;
|
||||
if (di->mirrorH) di->mirrorV = !di->mirrorV;
|
||||
if (di->mirrorH) {
|
||||
di->mirrorH = 0;
|
||||
di->mirrorV = !di->mirrorV;
|
||||
}
|
||||
di->cleanUp = false;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
} break;
|
||||
case DATATYPE_IMG_RAW_2BPP: {
|
||||
@@ -240,8 +249,12 @@ void drawImageAtAddressWrap(uint32_t addr, uint8_t lut) {
|
||||
di->addItem((uint8_t *)addr, epd->effectiveXRes, epd->effectiveYRes);
|
||||
di->type = drawItem::drawType::DRAW_EEPROM_2BPP;
|
||||
di->direction = false;
|
||||
if (di->mirrorH) di->mirrorV = !di->mirrorV;
|
||||
if (di->mirrorH) {
|
||||
di->mirrorH = 0;
|
||||
di->mirrorV = !di->mirrorV;
|
||||
}
|
||||
di->cleanUp = false;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
} break;
|
||||
case DATATYPE_IMG_ZLIB: {
|
||||
@@ -271,10 +284,14 @@ void drawImageAtAddressWrap(uint32_t addr, uint8_t lut) {
|
||||
di->xpos = 0;
|
||||
di->ypos = 0;
|
||||
di->direction = false;
|
||||
if (di->mirrorH) di->mirrorV = !di->mirrorV;
|
||||
if (di->mirrorH) {
|
||||
di->mirrorH = 0;
|
||||
di->mirrorV = !di->mirrorV;
|
||||
}
|
||||
if (imgheader.bpp == 1) di->color = 0;
|
||||
if (imgheader.bpp == 2) di->color = 2;
|
||||
di->cleanUp = true;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
} break;
|
||||
}
|
||||
@@ -291,17 +308,19 @@ void drawImageAtAddress(uint32_t addr, uint8_t lut) {
|
||||
void drawRoundedRectangle(uint16_t xpos, uint16_t ypos, uint16_t width, uint16_t height, bool color) {
|
||||
uint16_t widthBytes = width / 8;
|
||||
if (width % 8) widthBytes++;
|
||||
uint32_t framebufferSize = (widthBytes + 1) * height;
|
||||
uint32_t framebufferSize = widthBytes * height;
|
||||
uint8_t *framebuffer = (uint8_t *)calloc(framebufferSize + 4, 1);
|
||||
if (framebuffer == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
((uint16_t *)framebuffer)[0] = width + 1;
|
||||
uint8_t frameBufferZerosize = width;
|
||||
if ((width % 8) != 0) {
|
||||
frameBufferZerosize++;
|
||||
}
|
||||
((uint16_t *)framebuffer)[0] = frameBufferZerosize;
|
||||
((uint16_t *)framebuffer)[1] = height;
|
||||
|
||||
framebuffer += 4;
|
||||
|
||||
uint16_t w = width - 1;
|
||||
uint16_t x = 1;
|
||||
while (w--) {
|
||||
@@ -453,9 +472,9 @@ void drawItem::getXLine(uint8_t *line, uint16_t y, uint8_t c) {
|
||||
}
|
||||
}
|
||||
if (mirrorH) {
|
||||
copyWithByteShift(line, &buffer[((height - (y - ypos)) * widthBytes)], widthBytes, xpos / 8);
|
||||
copyWithByteShift(line, &buffer[((height - (y - ypos)) * widthBytes)], drawnWidthBytes, xpos / 8);
|
||||
} else {
|
||||
copyWithByteShift(line, &buffer[((y - ypos) * widthBytes)], widthBytes, xpos / 8);
|
||||
copyWithByteShift(line, &buffer[((y - ypos) * widthBytes)], drawnWidthBytes, xpos / 8);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -476,7 +495,7 @@ void drawItem::getXLine(uint8_t *line, uint16_t y, uint8_t c) {
|
||||
if (mirrorV) {
|
||||
reverseBytes(dbuffer, widthBytes);
|
||||
}
|
||||
copyWithByteShift(line, dbuffer, widthBytes, xpos / 8);
|
||||
copyWithByteShift(line, dbuffer, drawnWidthBytes, xpos / 8);
|
||||
free(dbuffer);
|
||||
}
|
||||
break;
|
||||
@@ -496,20 +515,36 @@ void drawItem::getXLine(uint8_t *line, uint16_t y, uint8_t c) {
|
||||
if (mirrorV) {
|
||||
reverseBytes(dbuffer, widthBytes);
|
||||
}
|
||||
copyWithByteShift(line, dbuffer, widthBytes, xpos / 8);
|
||||
copyWithByteShift(line, dbuffer, drawnWidthBytes, xpos / 8);
|
||||
free(dbuffer);
|
||||
}
|
||||
break;
|
||||
case DRAW_EEPROM_1BPP:
|
||||
if (c != color) return;
|
||||
if (epd->drawDirectionRight)
|
||||
if (mirrorH)
|
||||
y = epd->effectiveYRes - 1 - y;
|
||||
HAL_flashRead((uint32_t)buffer + sizeof(struct EepromImageHeader) + (y * (epd->effectiveXRes / 8)), line, (epd->effectiveXRes / 8));
|
||||
if (mirrorV) {
|
||||
uint8_t *dbuffer = (uint8_t *)malloc(widthBytes);
|
||||
HAL_flashRead((uint32_t)buffer + sizeof(struct EepromImageHeader) + (y * (epd->effectiveXRes / 8)), dbuffer, (epd->effectiveXRes / 8));
|
||||
reverseBytes(dbuffer, widthBytes);
|
||||
memcpy(line, dbuffer, widthBytes);
|
||||
free(dbuffer);
|
||||
} else {
|
||||
HAL_flashRead((uint32_t)buffer + sizeof(struct EepromImageHeader) + (y * (epd->effectiveXRes / 8)), line, (epd->effectiveXRes / 8));
|
||||
}
|
||||
break;
|
||||
case DRAW_EEPROM_2BPP:
|
||||
if (epd->drawDirectionRight)
|
||||
if (mirrorH)
|
||||
y = epd->effectiveYRes - 1 - y;
|
||||
HAL_flashRead((uint32_t)(buffer + sizeof(struct EepromImageHeader) + ((y + (c * epd->effectiveYRes)) * (epd->effectiveXRes / 8))), line, (epd->effectiveXRes / 8));
|
||||
if (mirrorV) {
|
||||
uint8_t *dbuffer = (uint8_t *)malloc(widthBytes);
|
||||
HAL_flashRead((uint32_t)(buffer + sizeof(struct EepromImageHeader) + ((y + (c * epd->effectiveYRes)) * (epd->effectiveXRes / 8))), dbuffer, (epd->effectiveXRes / 8));
|
||||
reverseBytes(dbuffer, widthBytes);
|
||||
memcpy(line, dbuffer, widthBytes);
|
||||
free(dbuffer);
|
||||
} else {
|
||||
HAL_flashRead((uint32_t)(buffer + sizeof(struct EepromImageHeader) + ((y + (c * epd->effectiveYRes)) * (epd->effectiveXRes / 8))), line, (epd->effectiveXRes / 8));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("DRAW: Not supported mode!\n");
|
||||
@@ -639,6 +674,16 @@ bool drawItem::addToList() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void drawItem::checkBounds() {
|
||||
drawnWidthBytes = widthBytes;
|
||||
|
||||
// if(!direction){ // draw X lines
|
||||
uint8_t availBytesWidth = epd->effectiveXRes / 8;
|
||||
availBytesWidth -= (xpos / 8);
|
||||
if (widthBytes < availBytesWidth) availBytesWidth = widthBytes;
|
||||
drawnWidthBytes = availBytesWidth;
|
||||
}
|
||||
|
||||
drawItem::~drawItem() {
|
||||
if (cleanUp) {
|
||||
switch (this->type) {
|
||||
@@ -933,5 +978,6 @@ void fontrender::epdPrintf(uint16_t x, uint16_t y, bool color, enum rotation ro,
|
||||
di->xpos = x;
|
||||
di->color = color;
|
||||
di->type = drawItem::drawType::DRAW_FONT;
|
||||
di->checkBounds();
|
||||
di->addToList();
|
||||
}
|
||||
|
||||
@@ -72,6 +72,8 @@ class drawItem {
|
||||
static void renderDrawLine(uint8_t *line, uint16_t number, uint8_t c);
|
||||
static void flushDrawItems();
|
||||
|
||||
void checkBounds();
|
||||
|
||||
// these are also used for rotated screens
|
||||
static void reverseBytes(uint8_t *src, uint8_t src_len);
|
||||
static uint8_t bitReverse(uint8_t byte);
|
||||
@@ -113,6 +115,7 @@ class drawItem {
|
||||
void getXLine(uint8_t *line, uint16_t yPos, uint8_t color);
|
||||
void getYLine(uint8_t *line, uint16_t xPos, uint8_t color);
|
||||
uint8_t widthBytes = 0;
|
||||
uint8_t drawnWidthBytes = 0;
|
||||
uint8_t *buffer = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -23,8 +23,6 @@ volatile uint8_t PERSISTENTVAR currentChannel = 0;
|
||||
static uint8_t inBuffer[128] = {0};
|
||||
static uint8_t outBuffer[128] = {0};
|
||||
|
||||
extern void executeCommand(uint8_t cmd); // this is defined in main.c
|
||||
|
||||
// tools
|
||||
static uint8_t getPacketType(const void *buffer) {
|
||||
const struct MacFcs *fcs = (MacFcs *)buffer;
|
||||
@@ -112,7 +110,7 @@ uint8_t detectAP(const uint8_t channel) {
|
||||
radioRxEnable(true);
|
||||
for (uint8_t c = 1; c <= MAXIMUM_PING_ATTEMPTS; c++) {
|
||||
sendPing();
|
||||
t = millis() + (HAL_TIMER_TICK * (PING_REPLY_WINDOW));
|
||||
t = millis() + PING_REPLY_WINDOW;
|
||||
while (millis() < t) {
|
||||
int8_t ret = HAL_PacketRX(inBuffer);
|
||||
if (ret > 1) {
|
||||
@@ -126,7 +124,7 @@ uint8_t detectAP(const uint8_t channel) {
|
||||
}
|
||||
}
|
||||
}
|
||||
HAL_msDelay(1);
|
||||
HAL_msDelay(10);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -179,7 +177,7 @@ struct AvailDataInfo *getAvailDataInfo() {
|
||||
uint32_t t;
|
||||
for (uint8_t c = 0; c < DATA_REQ_MAX_ATTEMPTS; c++) {
|
||||
sendAvailDataReq();
|
||||
t = millis() + (HAL_TIMER_TICK * (DATA_REQ_RX_WINDOW_SIZE));
|
||||
t = millis() + DATA_REQ_RX_WINDOW_SIZE;
|
||||
while (millis() < t) {
|
||||
int8_t ret = HAL_PacketRX(inBuffer);
|
||||
if (ret > 1) {
|
||||
@@ -203,8 +201,7 @@ struct AvailDataInfo *getShortAvailDataInfo() {
|
||||
uint32_t t;
|
||||
for (uint8_t c = 0; c < DATA_REQ_MAX_ATTEMPTS; c++) {
|
||||
sendShortAvailDataReq();
|
||||
// sendAvailDataReq();
|
||||
t = millis() + (HAL_TIMER_TICK * (DATA_REQ_RX_WINDOW_SIZE));
|
||||
t = millis() + DATA_REQ_RX_WINDOW_SIZE;
|
||||
while (millis() < t) {
|
||||
int8_t ret = HAL_PacketRX(inBuffer);
|
||||
if (ret > 1) {
|
||||
@@ -251,7 +248,7 @@ static bool blockRxLoop(const uint32_t timeout, uint8_t *blockbuffer) {
|
||||
uint32_t t;
|
||||
bool success = false;
|
||||
radioRxEnable(true);
|
||||
t = millis() + (HAL_TIMER_TICK * (timeout + 20));
|
||||
t = millis() + (timeout + 20);
|
||||
|
||||
bool blockComplete = false;
|
||||
|
||||
@@ -316,16 +313,17 @@ static struct blockRequestAck *performBlockRequest() {
|
||||
uint32_t t;
|
||||
radioRxEnable(true);
|
||||
radioRxFlush();
|
||||
for (uint8_t c = 0; c < 30; c++) {
|
||||
for (uint8_t c = 0; c < 10; c++) {
|
||||
sendBlockRequest();
|
||||
t = millis() + (HAL_TIMER_TICK * ((7UL + c / 10)));
|
||||
t = millis() + 6UL;
|
||||
do {
|
||||
int8_t ret = HAL_PacketRX(inBuffer);
|
||||
if (ret > 1) {
|
||||
switch (getPacketType(inBuffer)) {
|
||||
case PKT_BLOCK_REQUEST_ACK:
|
||||
if (checkCRC((inBuffer + sizeof(struct MacFrameNormal) + 1), sizeof(struct blockRequestAck)))
|
||||
if (checkCRC((inBuffer + sizeof(struct MacFrameNormal) + 1), sizeof(struct blockRequestAck))) {
|
||||
return (struct blockRequestAck *)(inBuffer + sizeof(struct MacFrameNormal) + 1);
|
||||
}
|
||||
break;
|
||||
case PKT_BLOCK_PART:
|
||||
return continueToRX();
|
||||
@@ -370,7 +368,7 @@ static void sendXferComplete() {
|
||||
for (uint8_t c = 0; c < 16; c++) {
|
||||
sendXferCompletePacket();
|
||||
uint32_t start = millis();
|
||||
while ((millis() - start) < (HAL_TIMER_TICK * (6UL))) {
|
||||
while ((millis() - start) < (6UL)) {
|
||||
int8_t ret = HAL_PacketRX(inBuffer);
|
||||
if (ret > 1) {
|
||||
if (getPacketType(inBuffer) == PKT_XFER_COMPLETE_ACK) {
|
||||
@@ -591,7 +589,7 @@ static uint8_t *getDataBlock(const uint16_t blockSize) {
|
||||
}
|
||||
|
||||
#ifdef FWNRF
|
||||
doSleep(ack->pleaseWaitMs + 40);
|
||||
doSleep(ack->pleaseWaitMs);
|
||||
powerUp(INIT_UART | INIT_RADIO);
|
||||
radioRxEnable(true);
|
||||
#endif
|
||||
@@ -656,8 +654,8 @@ static uint8_t *getDataBlock(const uint16_t blockSize) {
|
||||
}
|
||||
|
||||
static uint32_t downloadFWUpdate(const struct AvailDataInfo *avail) {
|
||||
uint16_t dataRequestSize = 0;
|
||||
uint32_t curXferSize = 0;
|
||||
static uint32_t PERSISTENTVAR curXferSize = 0;
|
||||
|
||||
// check if we already started the transfer of this information & haven't completed it
|
||||
if (!memcmp((const void *)&avail->dataVer, (const void *)&xferDataInfo.dataVer, 8) && xferDataInfo.dataSize) {
|
||||
// looks like we did. We'll carry on where we left off.
|
||||
@@ -672,6 +670,7 @@ static uint32_t downloadFWUpdate(const struct AvailDataInfo *avail) {
|
||||
}
|
||||
|
||||
while (xferDataInfo.dataSize) {
|
||||
uint16_t dataRequestSize = 0;
|
||||
wdt10s();
|
||||
if (xferDataInfo.dataSize > BLOCK_DATA_SIZE) {
|
||||
// more than one block remaining
|
||||
@@ -709,8 +708,8 @@ static uint32_t downloadFWUpdate(const struct AvailDataInfo *avail) {
|
||||
}
|
||||
|
||||
static bool downloadImageDataToEEPROM(const struct AvailDataInfo *avail) {
|
||||
uint16_t dataRequestSize = 0;
|
||||
uint32_t curXferSize = 0;
|
||||
static uint32_t PERSISTENTVAR curXferSize = 0;
|
||||
|
||||
powerUp(INIT_EEPROM);
|
||||
// check if we already started the transfer of this information & haven't completed it
|
||||
if (!memcmp((const void *)&avail->dataVer, (const void *)&xferDataInfo.dataVer, 8) && xferDataInfo.dataSize) {
|
||||
@@ -772,6 +771,7 @@ static bool downloadImageDataToEEPROM(const struct AvailDataInfo *avail) {
|
||||
}
|
||||
|
||||
while (xferDataInfo.dataSize) {
|
||||
uint16_t dataRequestSize = 0;
|
||||
wdt10s();
|
||||
if (xferDataInfo.dataSize > BLOCK_DATA_SIZE) {
|
||||
// more than one block remaining
|
||||
|
||||
@@ -61,5 +61,26 @@
|
||||
"days": [ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" ],
|
||||
"months": [ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" ],
|
||||
"date_format": [ "%d-%m-%Y", "%d-%m" ]
|
||||
},
|
||||
"9": {
|
||||
"language": "sv",
|
||||
"daysShort": [ "SÖ", "MÅ", "TI", "ON", "TO", "FR", "LÖ" ],
|
||||
"days": [ "Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag" ],
|
||||
"months": [ "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December" ],
|
||||
"date_format": [ "%d-%m-%Y", "%d-%m" ]
|
||||
},
|
||||
"10": {
|
||||
"language": "dk",
|
||||
"daysShort": [ "SØ", "MA", "TI", "ON", "TO", "FR", "LØ" ],
|
||||
"days": [ "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag" ],
|
||||
"months": [ "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December" ],
|
||||
"date_format": [ "%d-%m-%Y", "%d-%m" ]
|
||||
},
|
||||
"11": {
|
||||
"language": "et",
|
||||
"daysShort": [ "P", "E", "T", "K", "N", "R", "L" ],
|
||||
"days": [ "Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev" ],
|
||||
"months": [ "Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember" ],
|
||||
"date_format": [ "%d-%m-%Y", "%d-%m" ]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button"],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 27],
|
||||
"usetemplate": 1
|
||||
}
|
||||
|
||||
18
ESP32_AP-Flasher/data/tagtypes/22.json
Normal file
18
ESP32_AP-Flasher/data/tagtypes/22.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "M2 2.7\"",
|
||||
"width": 264,
|
||||
"height": 176,
|
||||
"rotatebuffer": 1,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button"],
|
||||
"contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20],
|
||||
"usetemplate": 1
|
||||
}
|
||||
@@ -1,20 +1,21 @@
|
||||
{
|
||||
"name": "M3 9.7\"",
|
||||
"width": 960,
|
||||
"height": 672,
|
||||
"rotatebuffer": 0,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button"],
|
||||
"contentids": [ 22, 23, 1, 5, 8, 9, 7, 19, 10, 11 ],
|
||||
"usetemplate": 1,
|
||||
"name": "M3 9.7\"",
|
||||
"width": 960,
|
||||
"height": 672,
|
||||
"rotatebuffer": 2,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button" ],
|
||||
"contentids": [ 22, 23, 1, 5, 8, 9, 7, 19, 10, 11 ],
|
||||
"usetemplate": 1,
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [ 480, -5, "Signika-SB.ttf", 160 ],
|
||||
@@ -37,5 +38,5 @@
|
||||
"days": 7,
|
||||
"gridparam": [ 7, 19, 30, "calibrib16.vlw", "REFSAN12.vlw", 16 ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,19 +2,20 @@
|
||||
"name": "M3 4.3\"",
|
||||
"width": 522,
|
||||
"height": 152,
|
||||
"rotatebuffer": 1,
|
||||
"rotatebuffer": 3,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button"],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 11, 17, 18, 19, 20, 27],
|
||||
"usetemplate": 1,
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button" ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 11, 17, 18, 19, 20, 27 ],
|
||||
"usetemplate": 1,
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [ 160, 5, "Signika-SB.ttf", 60 ],
|
||||
|
||||
@@ -6,13 +6,14 @@
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button"],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 8, 7, 19, 10, 21 ],
|
||||
"usetemplate": 0
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button" ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 8, 7, 19, 10, 21 ],
|
||||
"usetemplate": 0
|
||||
}
|
||||
@@ -2,22 +2,23 @@
|
||||
"name": "M3 2.2\"",
|
||||
"width": 296,
|
||||
"height": 160,
|
||||
"rotatebuffer": 1,
|
||||
"rotatebuffer": 3,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button", "led"],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26],
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button", "led" ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26 ],
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [148, 5, "Signika-SB.ttf", 60],
|
||||
"date": [148, 75, "Signika-SB.ttf", 50]
|
||||
"weekday": [ 148, 5, "Signika-SB.ttf", 60 ],
|
||||
"date": [ 148, 75, "Signika-SB.ttf", 50 ]
|
||||
},
|
||||
"2": {
|
||||
"fonts": [ "Signika-SB.ttf", 150, 150, 110, 80, 60, 50 ],
|
||||
@@ -30,20 +31,20 @@
|
||||
"bars": [ 5, 141, 10 ]
|
||||
},
|
||||
"4": {
|
||||
"location": [5, 5, "fonts/bahnschrift30"],
|
||||
"wind": [280, 5, "fonts/bahnschrift30"],
|
||||
"temp": [5, 65, "fonts/bahnschrift70"],
|
||||
"icon": [285, 20, 70, 2],
|
||||
"dir": [245, -12, 40],
|
||||
"umbrella": [190, -50, 25]
|
||||
"location": [ 5, 5, "fonts/bahnschrift30" ],
|
||||
"wind": [ 280, 5, "fonts/bahnschrift30" ],
|
||||
"temp": [ 5, 65, "fonts/bahnschrift70" ],
|
||||
"icon": [ 285, 20, 70, 2 ],
|
||||
"dir": [ 245, -12, 40 ],
|
||||
"umbrella": [ 190, -50, 25 ]
|
||||
},
|
||||
"8": {
|
||||
"location": [5, 12, "t0_14b_tf"],
|
||||
"column": [5, 59],
|
||||
"day": [30, 18, "fonts/twcondensed20", 41, 108],
|
||||
"icon": [30, 55, 30],
|
||||
"wind": [18, 26],
|
||||
"line": [20, 128]
|
||||
"location": [ 5, 12, "t0_14b_tf" ],
|
||||
"column": [ 5, 59 ],
|
||||
"day": [ 30, 18, "fonts/twcondensed20", 41, 108 ],
|
||||
"icon": [ 30, 55, 30 ],
|
||||
"wind": [ 18, 26 ],
|
||||
"line": [ 20, 128 ]
|
||||
},
|
||||
"9": {
|
||||
"title": [ 5, 4, "bahnschrift20.vlw", 25 ],
|
||||
@@ -52,8 +53,8 @@
|
||||
"desc": [ 0, 5, "", 1 ]
|
||||
},
|
||||
"10": {
|
||||
"title": [149, 5, "fonts/bahnschrift20"],
|
||||
"pos": [149, 30]
|
||||
"title": [ 149, 5, "fonts/bahnschrift20" ],
|
||||
"pos": [ 149, 30 ]
|
||||
},
|
||||
"11": {
|
||||
"mode": 0,
|
||||
|
||||
18
ESP32_AP-Flasher/data/tagtypes/32.json
Normal file
18
ESP32_AP-Flasher/data/tagtypes/32.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "M3 2.6\"",
|
||||
"width": 360,
|
||||
"height": 184,
|
||||
"rotatebuffer": 3,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26 ],
|
||||
"usetemplate": 1
|
||||
}
|
||||
@@ -2,18 +2,19 @@
|
||||
"name": "M3 2.9\"",
|
||||
"width": 384,
|
||||
"height": 168,
|
||||
"rotatebuffer": 1,
|
||||
"rotatebuffer": 3,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button", "led"],
|
||||
"contentids": [22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27],
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button", "led" ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
|
||||
"usetemplate": 1,
|
||||
"template": {
|
||||
"1": {
|
||||
@@ -31,12 +32,12 @@
|
||||
"bars": [ 5, 141, 14 ]
|
||||
},
|
||||
"8": {
|
||||
"location": [5, 12, "t0_14b_tf"],
|
||||
"column": [5, 76],
|
||||
"day": [39, 23, "bahnschrift20.vlw", 48, 140],
|
||||
"icon": [39, 65, 45],
|
||||
"wind": [23, 26],
|
||||
"line": [20, 168]
|
||||
"location": [ 5, 12, "t0_14b_tf" ],
|
||||
"column": [ 5, 76 ],
|
||||
"day": [ 39, 23, "bahnschrift20.vlw", 48, 140 ],
|
||||
"icon": [ 39, 65, 45 ],
|
||||
"wind": [ 23, 26 ],
|
||||
"line": [ 20, 168 ]
|
||||
},
|
||||
"9": {
|
||||
"title": [ 5, 4, "bahnschrift20.vlw", 25 ],
|
||||
@@ -56,12 +57,12 @@
|
||||
"items": 10,
|
||||
"red": [ 0, 21, 384, 16 ],
|
||||
"line": [ 5, 23, 18, "calibrib16.vlw", 55 ]
|
||||
},
|
||||
},
|
||||
"27": {
|
||||
"bars": [ 12, 360, 110, 20 ],
|
||||
"time": [ "calibrib16.vlw" ],
|
||||
"yaxis": [ "BellCent10.vlw", 1, 6 ],
|
||||
"head": [ "calibrib30.vlw" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,13 +6,14 @@
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["led"],
|
||||
"zlib_compression": "27",
|
||||
"options": [ "led" ],
|
||||
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ],
|
||||
"usetemplate": 2
|
||||
}
|
||||
@@ -12,6 +12,7 @@
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"options": [ "led" ],
|
||||
"contentids": [ 22, 23, 1, 4, 5, 8, 9, 7, 19, 10, 11 ],
|
||||
"usetemplate": 1,
|
||||
|
||||
@@ -6,13 +6,14 @@
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": ["button", "led"],
|
||||
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20],
|
||||
"usetemplate": 1
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button", "led" ],
|
||||
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ],
|
||||
"usetemplate": 46
|
||||
}
|
||||
|
||||
18
ESP32_AP-Flasher/data/tagtypes/40.json
Normal file
18
ESP32_AP-Flasher/data/tagtypes/40.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "M3 2.9\" FREEZER",
|
||||
"width": 384,
|
||||
"height": 168,
|
||||
"rotatebuffer": 3,
|
||||
"bpp": 1,
|
||||
"colors": 2,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"options": [ "button", "led" ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
|
||||
"usetemplate": 51
|
||||
}
|
||||
19
ESP32_AP-Flasher/data/tagtypes/41.json
Normal file
19
ESP32_AP-Flasher/data/tagtypes/41.json
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "M3 5.85\"",
|
||||
"width": 792,
|
||||
"height": 272,
|
||||
"rotatebuffer": 0,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"options": [ ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
|
||||
"usetemplate": 51
|
||||
}
|
||||
18
ESP32_AP-Flasher/data/tagtypes/42.json
Normal file
18
ESP32_AP-Flasher/data/tagtypes/42.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "M3 5.85\" FREEZER",
|
||||
"width": 792,
|
||||
"height": 272,
|
||||
"rotatebuffer": 0,
|
||||
"bpp": 1,
|
||||
"colors": 2,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"zlib_compression": "27",
|
||||
"options": [ ],
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
|
||||
"usetemplate": 51
|
||||
}
|
||||
84
ESP32_AP-Flasher/data/tagtypes/55.json
Normal file
84
ESP32_AP-Flasher/data/tagtypes/55.json
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"name": "HS BWR 2.13\"",
|
||||
"width": 256,
|
||||
"height": 128,
|
||||
"rotatebuffer": 1,
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"shortlut": 0,
|
||||
"options": [ "led" ],
|
||||
"contentids": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 27 ],
|
||||
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [ 128, 3, "Signika-SB.ttf", 50 ],
|
||||
"date": [ 128, 62, "Signika-SB.ttf", 40 ]
|
||||
},
|
||||
"2": {
|
||||
"fonts": [ "Signika-SB.ttf", 150, 150, 150, 115, 90, 70 ],
|
||||
"xy": [ 128, 53 ]
|
||||
},
|
||||
"16": {
|
||||
"location": [ 7, 15, "t0_14b_tf" ],
|
||||
"title": [ 210, 11, "glasstown_nbp_tf" ],
|
||||
"cols": [ 4, 121, 10, "glasstown_nbp_tf" ],
|
||||
"bars": [ 10, 110, 8 ]
|
||||
},
|
||||
"4": {
|
||||
"location": [ 5, 3, "fonts/bahnschrift30" ],
|
||||
"wind": [ 245, 3, "fonts/bahnschrift30" ],
|
||||
"temp": [ 10, 60, "fonts/bahnschrift70" ],
|
||||
"icon": [ 240, 20, 70, 2 ],
|
||||
"dir": [ 210, -12, 40 ],
|
||||
"umbrella": [ 175, -50, 25 ]
|
||||
},
|
||||
"8": {
|
||||
"location": [ 5, 12, "t0_14b_tf" ],
|
||||
"column": [ 5, 51 ],
|
||||
"day": [ 28, 18, "fonts/twcondensed20", 41, 108 ],
|
||||
"icon": [ 28, 55, 30 ],
|
||||
"wind": [ 18, 26 ],
|
||||
"line": [ 20, 128 ]
|
||||
},
|
||||
"9": {
|
||||
"title": [ 8, 2, "bahnschrift20.vlw", 25 ],
|
||||
"items": 5,
|
||||
"line": [ 8, 25, "REFSAN12.vlw" ],
|
||||
"desc": [ 0, 5, "", 1 ]
|
||||
},
|
||||
"10": {
|
||||
"title": [ 128, 2, "calibrib16.vlw" ],
|
||||
"pos": [ 128, 16 ]
|
||||
},
|
||||
"11": {
|
||||
"mode": 0,
|
||||
"days": 1,
|
||||
"title": [ 10, 2, "fonts/bahnschrift20" ],
|
||||
"date": [ 245, 2 ],
|
||||
"items": 7,
|
||||
"red": [ 0, 21, 256, 14 ],
|
||||
"line": [ 10, 32, 15, "t0_14b_tf", 50 ]
|
||||
},
|
||||
"21": [
|
||||
{ "text": [ 10, 5, "OpenEpaperLink AP", "bahnschrift20", 1, 0, 0 ] },
|
||||
{ "text": [ 10, 50, "IP address:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 110, 50, "{ap_ip}", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 10, 70, "Channel:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 110, 70, "{ap_ch}", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 10, 90, "Tag count:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 110, 90, "{ap_tagcount}", "t0_14b_tf", 1, 0, 0 ] }
|
||||
],
|
||||
"27": {
|
||||
"bars": [ 26, 216, 80, 20 ],
|
||||
"time": [ "BellCent10.vlw" ],
|
||||
"yaxis": [ "BellCent10.vlw", 6, 6 ],
|
||||
"head": [ "bahnschrift20.vlw" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,76 +6,11 @@
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21, 27 ],
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [ 148, -3, "Signika-SB.ttf", 60 ],
|
||||
"date": [ 148, 65, "Signika-SB.ttf", 48 ]
|
||||
},
|
||||
"2": {
|
||||
"fonts": [ "Signika-SB.ttf", 150, 150, 150, 120, 100, 80 ],
|
||||
"xy": [ 148, 53 ]
|
||||
},
|
||||
"16": {
|
||||
"location": [ 5, 5, "fonts/bahnschrift30" ],
|
||||
"title": [ 247, 11, "glasstown_nbp_tf" ],
|
||||
"cols": [ 1, 125, 12, "glasstown_nbp_tf" ],
|
||||
"bars": [ 5, 111, 10 ]
|
||||
},
|
||||
"4": {
|
||||
"location": [5, 5, "fonts/bahnschrift30"],
|
||||
"wind": [280, 5, "fonts/bahnschrift30"],
|
||||
"temp": [5, 65, "fonts/bahnschrift70"],
|
||||
"icon": [285, 20, 70, 2],
|
||||
"dir": [235, -12, 40],
|
||||
"umbrella": [190, -50, 25]
|
||||
},
|
||||
"8": {
|
||||
"location": [5, 12, "t0_14b_tf"],
|
||||
"column": [5, 59],
|
||||
"day": [30, 18, "fonts/twcondensed20", 41, 108],
|
||||
"icon": [30, 55, 30],
|
||||
"wind": [18, 26],
|
||||
"line": [20, 128]
|
||||
},
|
||||
"9": {
|
||||
"title": [ 2, 0, "bahnschrift20.vlw", 25 ],
|
||||
"items": 8,
|
||||
"line": [ 1, 25, "REFSAN12.vlw" ],
|
||||
"desc": [ 0, 5, "", 1 ]
|
||||
},
|
||||
"10": {
|
||||
"title": [149, 5, "fonts/bahnschrift20"],
|
||||
"pos": [149, 27]
|
||||
},
|
||||
"11": {
|
||||
"mode": 0,
|
||||
"days": 1,
|
||||
"title": [5, 2, "fonts/bahnschrift20"],
|
||||
"date": [290, 2],
|
||||
"items": 7,
|
||||
"red": [0, 21, 296, 14],
|
||||
"line": [5, 32, 15, "t0_14b_tf", 50]
|
||||
},
|
||||
"21": [
|
||||
{ "text": [ 5, 5, "OpenEpaperLink AP", "bahnschrift20", 1, 0, 0 ] },
|
||||
{ "text": [ 5, 50, "IP address:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 120, 50, "{ap_ip}", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 5, 70, "Channel:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 120, 70, "{ap_ch}", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 5, 90, "Tag count:", "t0_14b_tf", 1, 0, 0 ] },
|
||||
{ "text": [ 120, 90, "{ap_tagcount}", "t0_14b_tf", 1, 0, 0 ] }
|
||||
],
|
||||
"27": {
|
||||
"bars": [ 9, 288, 90, 10 ],
|
||||
"time": [ "BellCent10.vlw" ],
|
||||
"yaxis": [ "BellCent10.vlw", 0, 6 ],
|
||||
"head": [ "calibrib30.vlw" ]
|
||||
}
|
||||
}
|
||||
"usetemplate": 1
|
||||
}
|
||||
|
||||
@@ -6,50 +6,11 @@
|
||||
"bpp": 2,
|
||||
"colors": 3,
|
||||
"colortable": {
|
||||
"white": [255, 255, 255],
|
||||
"black": [0, 0, 0],
|
||||
"red": [255, 0, 0],
|
||||
"gray": [150, 150, 150]
|
||||
"white": [ 255, 255, 255 ],
|
||||
"black": [ 0, 0, 0 ],
|
||||
"red": [ 255, 0, 0 ],
|
||||
"gray": [ 150, 150, 150 ]
|
||||
},
|
||||
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20],
|
||||
"template": {
|
||||
"1": {
|
||||
"weekday": [ 200, 0, "Signika-SB.ttf", 70 ],
|
||||
"month": [ 200, 210, "Signika-SB.ttf", 70 ],
|
||||
"day": [ 200, 45, "Signika-SB.ttf", 170 ]
|
||||
},
|
||||
"4": {
|
||||
"location": [ 20, 20, "fonts/calibrib30" ],
|
||||
"wind": [ 90, 83, "fonts/calibrib50" ],
|
||||
"temp": [ 20, 170, "fonts/calibrib100" ],
|
||||
"icon": [ 385, 0, 100, 2 ],
|
||||
"dir": [ 40, 50, 80 ],
|
||||
"umbrella": [ 325, 155, 78 ]
|
||||
},
|
||||
"8": {
|
||||
"location": [ 10, 10, "fonts/calibrib30" ],
|
||||
"column": [ 6, 66 ],
|
||||
"day": [ 33, 60, "fonts/bahnschrift20", 104, 230 ],
|
||||
"rain": [ 34, 260 ],
|
||||
"icon": [ 32, 145, 30 ],
|
||||
"wind": [ 17, 90 ],
|
||||
"line": [ 50, 300 ]
|
||||
},
|
||||
"9": {
|
||||
"title": [ 6, 0, "Signika-SB.ttf", 25 ],
|
||||
"items": 4,
|
||||
"line": [ 9, 40, "calibrib16.vlw" ],
|
||||
"desc": [ 2, 8, "REFSAN12.vlw", 1.2 ]
|
||||
},
|
||||
"10": {
|
||||
"title": [ 200, 10, "fonts/bahnschrift20" ],
|
||||
"pos": [ 200, 35 ]
|
||||
},
|
||||
"11": {
|
||||
"rotate": 0,
|
||||
"mode": 1,
|
||||
"days": 4,
|
||||
"gridparam": [ 5, 17, 20, "calibrib16.vlw", "BellCent10.vlw", 14 ]
|
||||
}
|
||||
}
|
||||
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ],
|
||||
"usetemplate": 2
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -54,6 +54,7 @@ class tagRecord {
|
||||
|
||||
struct Config {
|
||||
uint8_t channel;
|
||||
uint8_t subghzchannel;
|
||||
char alias[32];
|
||||
uint8_t led;
|
||||
uint8_t tft;
|
||||
|
||||
@@ -82,7 +82,6 @@ void contentRunner() {
|
||||
if (minutesUntilNextUpdate > 1 && (wsClientCount() == 0 || config.stopsleep == 0)) {
|
||||
taginfo->pendingIdle = minutesUntilNextUpdate * 60;
|
||||
if (taginfo->isExternal == false) {
|
||||
Serial.printf("sleeping for %d more minutes\n", minutesUntilNextUpdate);
|
||||
prepareIdleReq(taginfo->mac, minutesUntilNextUpdate);
|
||||
}
|
||||
}
|
||||
@@ -1186,7 +1185,7 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa
|
||||
int temp = imageParams.height;
|
||||
imageParams.height = imageParams.width;
|
||||
imageParams.width = temp;
|
||||
imageParams.rotatebuffer = 1 - imageParams.rotatebuffer;
|
||||
imageParams.rotatebuffer = 1 - (imageParams.rotatebuffer%2);
|
||||
initSprite(spr, imageParams.width, imageParams.height, imageParams);
|
||||
} else {
|
||||
initSprite(spr, imageParams.width, imageParams.height, imageParams);
|
||||
@@ -2085,7 +2084,7 @@ void rotateBuffer(uint8_t rotation, uint8_t ¤tOrientation, TFT_eSprite &sp
|
||||
initSprite(spr, sprCpy.width(), sprCpy.height(), imageParams);
|
||||
sprCpy.pushToSprite(&spr, 0, 0);
|
||||
sprCpy.deleteSprite();
|
||||
imageParams.rotatebuffer = 1 - imageParams.rotatebuffer;
|
||||
imageParams.rotatebuffer = 1 - (imageParams.rotatebuffer%2);
|
||||
}
|
||||
currentOrientation = rotation;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ int currentLanguage = 0;
|
||||
|
||||
void updateLanguageFromConfig() {
|
||||
int tempLang = config.language;
|
||||
if (tempLang < 0 || tempLang > 8) {
|
||||
if (tempLang < 0 || tempLang > 11) {
|
||||
Serial.println("Language not supported");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -88,10 +88,16 @@ uint32_t colorDistance(Color &c1, Color &c2, Error &e1) {
|
||||
void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t buffer_size, bool is_red) {
|
||||
uint8_t rotate = imageParams.rotate;
|
||||
long bufw = spr.width(), bufh = spr.height();
|
||||
if (imageParams.rotatebuffer) {
|
||||
|
||||
if (imageParams.rotatebuffer % 2) {
|
||||
//turn the image 90 or 270
|
||||
rotate = (rotate + 3) % 4;
|
||||
rotate = (rotate + (imageParams.rotatebuffer - 1)) % 4;
|
||||
bufw = spr.height();
|
||||
bufh = spr.width();
|
||||
} else {
|
||||
// rotate 180
|
||||
rotate = (rotate + (imageParams.rotatebuffer)) % 4;
|
||||
}
|
||||
|
||||
memset(buffer, 0, buffer_size);
|
||||
@@ -234,8 +240,8 @@ size_t prepareHeader(uint8_t headerbuf[], uint16_t bufw, uint16_t bufh, imgParam
|
||||
uint8_t headersize = 6;
|
||||
|
||||
headerbuf[0] = headersize;
|
||||
memcpy(headerbuf + (imageParams.rotatebuffer == 1 ? 3 : 1), &bufw, sizeof(uint16_t));
|
||||
memcpy(headerbuf + (imageParams.rotatebuffer == 1 ? 1 : 3), &bufh, sizeof(uint16_t));
|
||||
memcpy(headerbuf + (imageParams.rotatebuffer % 2 == 1 ? 3 : 1), &bufw, sizeof(uint16_t));
|
||||
memcpy(headerbuf + (imageParams.rotatebuffer % 2 == 1 ? 1 : 3), &bufh, sizeof(uint16_t));
|
||||
|
||||
if (imageParams.hasRed && imageParams.bpp > 1) {
|
||||
totalbytes = buffer_size * 2 + headersize;
|
||||
@@ -258,7 +264,7 @@ size_t compressAndWrite(Miniz::tdefl_compressor *comp, const void *inbuf, size_t
|
||||
|
||||
uint32_t t = millis();
|
||||
Miniz::tdefl_compressOEPL(comp, inbuf, &inbytes_compressed, zlibbuf, &outbytes_compressed, flush);
|
||||
Serial.printf("zlib: compressed %d into %d bytes in %d ms\n", inbytes_compressed, outbytes_compressed, millis()-t);
|
||||
Serial.printf("zlib: compressed %d into %d bytes in %d ms\n", inbytes_compressed, outbytes_compressed, millis() - t);
|
||||
|
||||
f_out.write((const uint8_t *)zlibbuf, outbytes_compressed);
|
||||
return outbytes_compressed;
|
||||
@@ -266,7 +272,7 @@ size_t compressAndWrite(Miniz::tdefl_compressor *comp, const void *inbuf, size_t
|
||||
|
||||
void rewriteHeader(File &f_out) {
|
||||
// https://www.rfc-editor.org/rfc/rfc1950
|
||||
const uint8_t cmf = 0x48; // 4096
|
||||
const uint8_t cmf = 0x48; // 4096
|
||||
// const uint8_t cmf = 0x58; // 8192
|
||||
uint8_t flg, flevel = 3;
|
||||
uint16_t header = cmf << 8 | (flevel << 6);
|
||||
@@ -277,7 +283,6 @@ void rewriteHeader(File &f_out) {
|
||||
f_out.write(flg);
|
||||
}
|
||||
|
||||
|
||||
void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
|
||||
long t = millis();
|
||||
|
||||
|
||||
@@ -74,15 +74,15 @@ void prepareCancelPending(const uint8_t dst[8]) {
|
||||
}
|
||||
|
||||
void prepareIdleReq(const uint8_t* dst, uint16_t nextCheckin) {
|
||||
if (nextCheckin > 0) {
|
||||
if (nextCheckin > 0 && countQueueItem(dst) == 0) {
|
||||
struct pendingData pending = {0};
|
||||
memcpy(pending.targetMac, dst, 8);
|
||||
pending.availdatainfo.dataType = DATATYPE_NOUPDATE;
|
||||
pending.availdatainfo.nextCheckIn = nextCheckin;
|
||||
pending.attemptsLeft = 10 + config.maxsleep;
|
||||
|
||||
Serial.printf(">SDA %02X%02X%02X%02X%02X%02X%02X%02X NOP\n", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]);
|
||||
queueDataAvail(&pending, true);
|
||||
Serial.printf(">SDA %02X%02X%02X%02X%02X%02X%02X%02X sleeping %d minutes\n", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0], nextCheckin);
|
||||
sendDataAvail(&pending);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@ bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgume
|
||||
file.close();
|
||||
uint16_t attempts = 60 * 24;
|
||||
|
||||
if (memcmp(md5bytes, taginfo->md5, 16) == 0) {
|
||||
wsLog("new image is the same as current image. not updating tag.");
|
||||
wsSendTaginfo(dst, SYNC_TAGSTATUS);
|
||||
if (contentFS->exists(filename) && resend == false) {
|
||||
contentFS->remove(filename);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dataType != DATATYPE_FW_UPDATE) {
|
||||
char dst_path[64];
|
||||
sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X_%lu.pending", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0], millis() % 1000000);
|
||||
@@ -440,7 +449,7 @@ void processXferComplete(struct espXferComplete* xfc, bool local) {
|
||||
if (config.preview && (queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_ZLIB)) {
|
||||
contentFS->rename(queueItem->filename, String(dst_path));
|
||||
} else {
|
||||
contentFS->remove(queueItem->filename);
|
||||
if (queueItem->pendingdata.availdatainfo.dataType != DATATYPE_FW_UPDATE) contentFS->remove(queueItem->filename);
|
||||
}
|
||||
}
|
||||
memcpy(md5bytes, &queueItem->pendingdata.availdatainfo.dataVer, sizeof(uint64_t));
|
||||
@@ -508,10 +517,16 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP
|
||||
}
|
||||
char buffer[64];
|
||||
|
||||
char hexmac[17];
|
||||
mac2hex(eadr->src, hexmac);
|
||||
|
||||
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;
|
||||
if (eadr->adr.currentChannel > 0 && eadr->adr.currentChannel != apInfo.channel) {
|
||||
Serial.printf("Tag %s reports illegal channel %d\n", hexmac, eadr->adr.currentChannel);
|
||||
return;
|
||||
}
|
||||
taginfo = new tagRecord;
|
||||
memcpy(taginfo->mac, eadr->src, sizeof(taginfo->mac));
|
||||
taginfo->pendingCount = 0;
|
||||
@@ -520,9 +535,6 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP
|
||||
time_t now;
|
||||
time(&now);
|
||||
|
||||
char hexmac[17];
|
||||
mac2hex(eadr->src, hexmac);
|
||||
|
||||
if (!local) {
|
||||
if (taginfo->isExternal == false) {
|
||||
wsLog("moved AP from local to external " + String(hexmac));
|
||||
@@ -637,8 +649,11 @@ void setAPchannel() {
|
||||
udpsync.getAPList();
|
||||
} else {
|
||||
if (curChannel.channel != config.channel) {
|
||||
curChannel.channel = config.channel;
|
||||
sendChannelPower(&curChannel);
|
||||
curChannel.channel = config.channel;
|
||||
#ifdef HAS_SUBGHZ
|
||||
curChannel.subghzchannel = config.subghzchannel;
|
||||
#endif
|
||||
sendChannelPower(&curChannel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,10 @@ void logLine(const String& text) {
|
||||
contentFS->remove("/logold.txt");
|
||||
contentFS->rename("/log.txt", "/logold.txt");
|
||||
logFile = contentFS->open("/log.txt", "a");
|
||||
if (!logFile) return;
|
||||
if (!logFile) {
|
||||
xSemaphoreGive(fsMutex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
logFile.print(timeStr);
|
||||
|
||||
@@ -315,6 +315,7 @@ void initAPconfig() {
|
||||
configFile.close();
|
||||
}
|
||||
config.channel = APconfig.containsKey("channel") ? APconfig["channel"] : 0;
|
||||
config.subghzchannel = APconfig.containsKey("subghzchannel") ? APconfig["subghzchannel"] : 0;
|
||||
if (APconfig["alias"]) strlcpy(config.alias, APconfig["alias"], sizeof(config.alias));
|
||||
config.led = APconfig.containsKey("led") ? APconfig["led"] : 255;
|
||||
config.tft = APconfig.containsKey("tft") ? APconfig["tft"] : 255;
|
||||
@@ -343,6 +344,7 @@ void saveAPconfig() {
|
||||
fs::File configFile = contentFS->open("/current/apconfig.json", "w");
|
||||
DynamicJsonDocument APconfig(500);
|
||||
APconfig["channel"] = config.channel;
|
||||
APconfig["subghzchannel"] = config.subghzchannel;
|
||||
APconfig["alias"] = config.alias;
|
||||
APconfig["led"] = config.led;
|
||||
APconfig["tft"] = config.tft;
|
||||
|
||||
@@ -509,6 +509,13 @@ void init_web() {
|
||||
#else
|
||||
response->print("\"hasBLE\": \"0\", ");
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SUBGHZ
|
||||
response->print("\"hasSubGhz\": \"1\", ");
|
||||
#else
|
||||
response->print("\"hasSubGhz\": \"0\", ");
|
||||
#endif
|
||||
|
||||
response->print("\"apstate\": \"" + String(apInfo.state) + "\"");
|
||||
|
||||
File configFile = contentFS->open("/current/apconfig.json", "r");
|
||||
@@ -542,6 +549,9 @@ void init_web() {
|
||||
if (request->hasParam("channel", true)) {
|
||||
config.channel = static_cast<uint8_t>(request->getParam("channel", true)->value().toInt());
|
||||
}
|
||||
if (request->hasParam("subghzchannel", true)) {
|
||||
config.subghzchannel = static_cast<uint8_t>(request->getParam("subghzchannel", true)->value().toInt());
|
||||
}
|
||||
if (request->hasParam("led", true)) {
|
||||
config.led = static_cast<uint8_t>(request->getParam("led", true)->value().toInt());
|
||||
updateBrightnessFromConfig();
|
||||
|
||||
@@ -350,6 +350,8 @@
|
||||
"AT": "Austria",
|
||||
"BE": "Belgium",
|
||||
"CZ": "Czech Republic",
|
||||
"DK1": "Denmark DK1",
|
||||
"DK2": "Denmark DK2",
|
||||
"EE": "Estonia",
|
||||
"FI": "Finland",
|
||||
"FR": "France",
|
||||
@@ -409,7 +411,7 @@
|
||||
{
|
||||
"key": "interval",
|
||||
"name": "Interval",
|
||||
"desc": "In case of an url, wow often (in minutes) the template is being fetched. Minimum is 3 minutes.",
|
||||
"desc": "In case of an url, how often (in minutes) the template is being fetched. Minimum is 3 minutes.",
|
||||
"type": "int"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -435,7 +435,8 @@
|
||||
}
|
||||
|
||||
[canvas.width, canvas.height] = [tagTypes[hwtype].width, tagTypes[hwtype].height] || [0, 0];
|
||||
if (tagTypes[hwtype].rotatebuffer) [canvas.width, canvas.height] = [canvas.height, canvas.width];
|
||||
if (tagTypes[hwtype].rotatebuffer%2) [canvas.width, canvas.height] = [canvas.height, canvas.width];
|
||||
if (tagTypes[hwtype].rotatebuffer>=2) canvas.style.transform='rotate(180deg)';
|
||||
const ctx = canvas.getContext('2d');
|
||||
const imageData = ctx.createImageData(canvas.width, canvas.height);
|
||||
if (data.length == 0) canvas.style.display = 'none';
|
||||
|
||||
@@ -127,7 +127,7 @@ const fetchAndPost = async (url, name, path) => {
|
||||
formData.append('path', path);
|
||||
formData.append('file', fileContent, name);
|
||||
|
||||
const uploadResponse = await fetch('/littlefs_put', {
|
||||
const uploadResponse = await fetch('littlefs_put', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
@@ -146,7 +146,7 @@ const fetchAndPost = async (url, name, path) => {
|
||||
|
||||
async function checkTagFW() {
|
||||
const fwfile = "/Tag_FW_Pack.bin";
|
||||
const url = "/check_file?path=" + encodeURIComponent(fwfile);
|
||||
const url = "check_file?path=" + encodeURIComponent(fwfile);
|
||||
const response = await fetch(url);
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
|
||||
@@ -289,6 +289,24 @@ options:
|
||||
<option value="27">27</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Enable SubGhz support and select channel. This requires an AP that has an optional CC1101 SubGhz radio module attached.">
|
||||
<label for="apcfgsubgigchid">SubGhz channel</label>
|
||||
<select id="apcfgsubgigchid">
|
||||
<option value="0" selected>disabled</option>
|
||||
<option value="100">100 - 864.000 Mhz (Europe, etc)</option>
|
||||
<option value="101">101 - 865.006 Mhz (Europe, etc)</option>
|
||||
<option value="102">102 - 866.014 Mhz (Europe, etc)</option>
|
||||
<option value="103">103 - 867.020 Mhz (Europe, etc)</option>
|
||||
<option value="104">104 - 868.027 Mhz (Europe, etc)</option>
|
||||
<option value="105">105 - 869.034 Mhz (Europe, etc)</option>
|
||||
<option value="200">200 - 903.000 Mhz (US, etc)</option>
|
||||
<option value="201">201 - 907.027 Mhz (US, etc)</option>
|
||||
<option value="202">202 - 911.054 Mhz (US, etc)</option>
|
||||
<option value="203">203 - 915.083 Mhz (US, etc)</option>
|
||||
<option value="204">204 - 919.110 Mhz (US, etc)</option>
|
||||
<option value="205">205 - 923.138 Mhz (US, etc)</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Enable Bluetooth (BLE) support. Only enable this if you have BLE capable tags. Changing this value requires a reboot to take effect.">
|
||||
<label for="apcfgble">Bluetooth</label>
|
||||
<select id="apcfgble">
|
||||
@@ -330,6 +348,9 @@ options:
|
||||
<option value="6">SK Slovenčina</option>
|
||||
<option value="7">PL Polski</option>
|
||||
<option value="8">ES Español</option>
|
||||
<option value="9">SV Svenska</option>
|
||||
<option value="10">DK Dansk</option>
|
||||
<option value="11">ET Eesti</option>
|
||||
</select>
|
||||
</p>
|
||||
<p title="Depending on the content, a tag can sleep for
|
||||
|
||||
@@ -44,7 +44,7 @@ let getTagtypeBusy = false;
|
||||
|
||||
const loadConfig = new Event("loadConfig");
|
||||
window.addEventListener("loadConfig", function () {
|
||||
fetch("/get_ap_config")
|
||||
fetch("get_ap_config")
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
apConfig = data;
|
||||
@@ -53,17 +53,20 @@ window.addEventListener("loadConfig", function () {
|
||||
$(".logo").innerHTML = data.alias;
|
||||
this.document.title = data.alias;
|
||||
}
|
||||
if (data.C6) {
|
||||
if (data.C6 == 1) {
|
||||
var optionToRemove = $("#apcfgchid").querySelector('option[value="27"]');
|
||||
if (optionToRemove) $("#apcfgchid").removeChild(optionToRemove);
|
||||
$('#c6Option').style.display = 'block';
|
||||
}
|
||||
if (data.hasFlasher) {
|
||||
if (data.hasFlasher == 1) {
|
||||
$('[data-target="flashtab"]').style.display = 'block';
|
||||
}
|
||||
if (data.hasBLE == 0) {
|
||||
$("#apcfgble").parentNode.style.display = 'none';
|
||||
}
|
||||
if (data.hasSubGhz == 0) {
|
||||
$("#apcfgsubgigchid").parentNode.style.display = 'none';
|
||||
}
|
||||
if (data.savespace) {
|
||||
}
|
||||
if (data.apstate) {
|
||||
@@ -77,7 +80,7 @@ window.addEventListener("loadConfig", function () {
|
||||
window.addEventListener("load", function () {
|
||||
window.dispatchEvent(loadConfig);
|
||||
initTabs();
|
||||
fetch('/content_cards.json')
|
||||
fetch('content_cards.json')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
cardconfig = data;
|
||||
@@ -133,7 +136,7 @@ function initTabs() {
|
||||
};
|
||||
|
||||
function loadTags(pos) {
|
||||
return fetch("/get_db?pos=" + pos)
|
||||
return fetch("get_db?pos=" + pos)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
processTags(data.tags);
|
||||
@@ -169,7 +172,7 @@ function formatUptime(seconds) {
|
||||
|
||||
function connect() {
|
||||
protocol = location.protocol == "https:" ? "wss://" : "ws://";
|
||||
socket = new WebSocket(protocol + location.host + "/ws");
|
||||
socket = new WebSocket(protocol + location.host + location.pathname + "ws");
|
||||
|
||||
socket.addEventListener("open", (event) => {
|
||||
showMessage("websocket connected");
|
||||
@@ -309,7 +312,7 @@ function processTags(tagArray) {
|
||||
if (element.isexternal && element.contentMode == 12) {
|
||||
loadImage(tagmac, 'http://' + tagDB[tagmac].apip + '/current/' + tagmac + '.raw?' + cachetag);
|
||||
} else {
|
||||
loadImage(tagmac, '/current/' + tagmac + '.raw?' + cachetag);
|
||||
loadImage(tagmac, 'current/' + tagmac + '.raw?' + cachetag);
|
||||
}
|
||||
} else {
|
||||
$('#tag' + tagmac + ' .tagimg').style.display = 'none'
|
||||
@@ -497,7 +500,7 @@ $('#taglist').addEventListener("click", (event) => {
|
||||
function loadContentCard(mac) {
|
||||
$('#cfgmac').innerHTML = mac;
|
||||
$('#cfgmac').dataset.mac = mac;
|
||||
fetch("/get_db?mac=" + mac)
|
||||
fetch("get_db?mac=" + mac)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
const tagdata = data.tags[0];
|
||||
@@ -570,7 +573,7 @@ $('#cfgsave').onclick = function () {
|
||||
formData.append("lut", $('#cfglut').value);
|
||||
formData.append("invert", $('#cfginvert').value);
|
||||
|
||||
fetch("/save_cfg", {
|
||||
fetch("save_cfg", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -587,7 +590,7 @@ function sendCmd(mac, cmd) {
|
||||
let formData = new FormData();
|
||||
formData.append("mac", mac);
|
||||
formData.append("cmd", cmd);
|
||||
fetch("/tag_cmd", {
|
||||
fetch("tag_cmd", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -655,7 +658,7 @@ $('#cfgautoupdate').onclick = async function () {
|
||||
var fullFilename = name + "_" + version + ".bin";
|
||||
var filepath = "/" + fullFilename;
|
||||
var binurl = "https://raw.githubusercontent.com/" + repo + "/master/binaries/Tag/" + fullFilename;
|
||||
var url = "/check_file?path=" + encodeURIComponent(filepath);
|
||||
var url = "check_file?path=" + encodeURIComponent(filepath);
|
||||
var response = await fetch(url);
|
||||
if (response.ok) {
|
||||
var data = await response.json();
|
||||
@@ -666,7 +669,7 @@ $('#cfgautoupdate').onclick = async function () {
|
||||
var formData2 = new FormData();
|
||||
formData2.append('path', filepath);
|
||||
formData2.append('file', fileContent, fullFilename);
|
||||
var uploadResponse = await fetch('/littlefs_put', {
|
||||
var uploadResponse = await fetch('littlefs_put', {
|
||||
method: 'POST',
|
||||
body: formData2
|
||||
});
|
||||
@@ -690,7 +693,7 @@ $('#cfgautoupdate').onclick = async function () {
|
||||
else showMessage('Error: auto update failed', true);
|
||||
formData.append("contentmode", 5);
|
||||
formData.append("modecfgjson", JSON.stringify(obj));
|
||||
fetch("/save_cfg", {
|
||||
fetch("save_cfg", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -705,7 +708,7 @@ $('#rebootbutton').onclick = function (event) {
|
||||
event.preventDefault();
|
||||
if (!confirm('Reboot AP now?')) return;
|
||||
socket.close();
|
||||
fetch("/reboot", {
|
||||
fetch("reboot", {
|
||||
method: "POST"
|
||||
});
|
||||
alert('Rebooted. Webpage will reload.');
|
||||
@@ -723,13 +726,14 @@ document.addEventListener("loadTab", function (event) {
|
||||
switch (event.detail) {
|
||||
case 'configtab':
|
||||
case 'aptab':
|
||||
fetch("/get_ap_config")
|
||||
fetch("get_ap_config")
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data && 'alias' in data) {
|
||||
apConfig = data;
|
||||
$('#apcfgalias').value = data.alias;
|
||||
$('#apcfgchid').value = data.channel;
|
||||
$('#apcfgsubgigchid').value = data.subghzchannel;
|
||||
$('#apcfgble').value = data.ble;
|
||||
$("#apcfgledbrightness").value = data.led;
|
||||
$("#apcfgtftbrightness").value = data.tft;
|
||||
@@ -765,6 +769,7 @@ $('#apcfgsave').onclick = function () {
|
||||
let formData = new FormData();
|
||||
formData.append("alias", $('#apcfgalias').value);
|
||||
formData.append("channel", $('#apcfgchid').value);
|
||||
formData.append("subghzchannel", $('#apcfgsubgigchid').value);
|
||||
formData.append('ble', $('#apcfgble').value);
|
||||
formData.append('led', $('#apcfgledbrightness').value);
|
||||
formData.append('tft', $('#apcfgtftbrightness').value);
|
||||
@@ -778,7 +783,7 @@ $('#apcfgsave').onclick = function () {
|
||||
formData.append('sleeptime1', $('#apcnight1').value);
|
||||
formData.append('sleeptime2', $('#apcnight2').value);
|
||||
|
||||
fetch("/save_apcfg", {
|
||||
fetch("save_apcfg", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -796,7 +801,7 @@ $('#uploadButton').onclick = function () {
|
||||
if (file) {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
fetch('/restore_db', {
|
||||
fetch('restore_db', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
@@ -834,7 +839,7 @@ $('#restoreFromLocal').onclick = function () {
|
||||
const formData = new FormData();
|
||||
formData.append('file', blob, 'tagResult.json');
|
||||
|
||||
fetch('/restore_db', {
|
||||
fetch('restore_db', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
@@ -938,7 +943,7 @@ function contentselected() {
|
||||
case 'binfile':
|
||||
case 'jsonfile':
|
||||
input = document.createElement("select");
|
||||
fetch('/edit?list=%2F&recursive=1')
|
||||
fetch('edit?list=%2F&recursive=1')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
let files = data.filter(item => item.type === "file" && item.name.endsWith(".jpg"));
|
||||
@@ -1133,7 +1138,8 @@ function processQueue() {
|
||||
}
|
||||
|
||||
[canvas.width, canvas.height] = [tagTypes[hwtype].width, tagTypes[hwtype].height] || [0, 0];
|
||||
if (tagTypes[hwtype].rotatebuffer) [canvas.width, canvas.height] = [canvas.height, canvas.width];
|
||||
if (tagTypes[hwtype].rotatebuffer%2) [canvas.width, canvas.height] = [canvas.height, canvas.width];
|
||||
if (tagTypes[hwtype].rotatebuffer>=2) canvas.style.transform='rotate(180deg)';
|
||||
const ctx = canvas.getContext('2d');
|
||||
const imageData = ctx.createImageData(canvas.width, canvas.height);
|
||||
if (data.length == 0) {
|
||||
@@ -1356,7 +1362,7 @@ async function getTagtype(hwtype) {
|
||||
try {
|
||||
getTagtypeBusy = true;
|
||||
tagTypes[hwtype] = { busy: true };
|
||||
const response = await fetch('/tagtypes/' + hwtype.toString(16).padStart(2, '0').toUpperCase() + '.json');
|
||||
const response = await fetch('tagtypes/' + hwtype.toString(16).padStart(2, '0').toUpperCase() + '.json');
|
||||
if (!response.ok) {
|
||||
let data = { name: 'unknown id ' + hwtype.toString(16), width: 0, height: 0, bpp: 0, rotatebuffer: 0, colortable: [], busy: false };
|
||||
tagTypes[hwtype] = data;
|
||||
@@ -1447,7 +1453,7 @@ function dropUpload() {
|
||||
formData.append('file', blob, 'image.jpg');
|
||||
|
||||
try {
|
||||
const response = await fetch('/imgupload', {
|
||||
const response = await fetch('imgupload', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
});
|
||||
@@ -1477,7 +1483,7 @@ function dropUpload() {
|
||||
const formData = new FormData();
|
||||
formData.append('mac', mac);
|
||||
formData.append('json', jsonContent);
|
||||
fetch('/jsonupload', {
|
||||
fetch('jsonupload', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
})
|
||||
@@ -1609,7 +1615,7 @@ function populateAPCard(msg) {
|
||||
|
||||
function populateAPInfo(apip) {
|
||||
let apid = apip.replace(/\./g, "-");
|
||||
fetch('http://' + apip + '/sysinfo')
|
||||
fetch('sysinfo')
|
||||
.then(response => {
|
||||
if (response.status != 200) {
|
||||
$('#ap' + apid + ' .apswversion').innerHTML = "Error fetching sysinfo: " + response.status;
|
||||
|
||||
@@ -10,7 +10,7 @@ let buttonState = false;
|
||||
|
||||
export async function initUpdate() {
|
||||
|
||||
const response = await fetch("/version.txt");
|
||||
const response = await fetch("version.txt");
|
||||
let filesystemversion = await response.text();
|
||||
if (!filesystemversion) filesystemversion = "unknown";
|
||||
$('#repo').value = repo;
|
||||
@@ -30,7 +30,7 @@ export async function initUpdate() {
|
||||
$('#selectRepo').style.display = 'inline-block';
|
||||
$('#repoWarning').style.display = 'none';
|
||||
|
||||
const sysinfoPromise = fetch("/sysinfo")
|
||||
const sysinfoPromise = fetch("sysinfo")
|
||||
.then(response => {
|
||||
if (response.status != 200) {
|
||||
print("Error fetching sysinfo: " + response.status, "red");
|
||||
@@ -167,7 +167,7 @@ export async function updateWebpage(fileUrl, tagname, showReload) {
|
||||
|
||||
print("Updating littleFS partition...");
|
||||
|
||||
fetch("http://openepaperlink.eu/getupdate/?url=" + fileUrl)
|
||||
fetch("//openepaperlink.eu/getupdate/?url=" + fileUrl)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
checkfiles(data);
|
||||
@@ -181,7 +181,7 @@ export async function updateWebpage(fileUrl, tagname, showReload) {
|
||||
if (updateactions) {
|
||||
await fetchAndPost(updateactions.url, updateactions.name, updateactions.path);
|
||||
try {
|
||||
const response = await fetch("/update_actions", {
|
||||
const response = await fetch("update_actions", {
|
||||
method: "POST",
|
||||
body: ''
|
||||
});
|
||||
@@ -200,7 +200,7 @@ export async function updateWebpage(fileUrl, tagname, showReload) {
|
||||
for (const file of files) {
|
||||
try {
|
||||
if (file.name != "update_actions.json") {
|
||||
const url = "/check_file?path=" + encodeURIComponent(file.path);
|
||||
const url = "check_file?path=" + encodeURIComponent(file.path);
|
||||
const response = await fetch(url);
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
@@ -271,7 +271,7 @@ export async function updateESP(fileUrl, showConfirm) {
|
||||
|
||||
while (retryCount < maxRetries) {
|
||||
try {
|
||||
const response = await fetch("http://openepaperlink.eu/getupdate/?url=" + fileUrl + "&env=" + env);
|
||||
const response = await fetch("//openepaperlink.eu/getupdate/?url=" + fileUrl + "&env=" + env);
|
||||
const responseBody = await response.text();
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not OK: " + responseBody);
|
||||
@@ -290,7 +290,7 @@ export async function updateESP(fileUrl, showConfirm) {
|
||||
console.log(`URL for "${file.name}": ${binurl}`);
|
||||
|
||||
try {
|
||||
const response = await fetch('/update_ota', {
|
||||
const response = await fetch('update_ota', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
@@ -342,7 +342,7 @@ $('#rollbackBtn').onclick = function () {
|
||||
|
||||
print("Rolling back...");
|
||||
|
||||
fetch("/rollback", {
|
||||
fetch("rollback", {
|
||||
method: "POST",
|
||||
body: ''
|
||||
})
|
||||
@@ -365,7 +365,7 @@ $('#updateC6Btn').onclick = function () {
|
||||
const formData = new FormData();
|
||||
formData.append('download', isChecked ? '1' : '0'); // Convert to '1' or '0'
|
||||
|
||||
fetch("/update_c6", {
|
||||
fetch("update_c6", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -389,7 +389,7 @@ $('#selectRepo').onclick = function (event) {
|
||||
const filesJsonAsset = assets.find(asset => asset.name === 'filesystem.json');
|
||||
const binariesJsonAsset = assets.find(asset => asset.name === 'binaries.json');
|
||||
if (filesJsonAsset && binariesJsonAsset) {
|
||||
const updateUrl = "http://openepaperlink.eu/getupdate/?url=" + binariesJsonAsset.browser_download_url + "&env=" + $('#repo').value;
|
||||
const updateUrl = "//openepaperlink.eu/getupdate/?url=" + binariesJsonAsset.browser_download_url + "&env=" + $('#repo').value;
|
||||
return fetch(updateUrl);
|
||||
} else {
|
||||
throw new Error("Json file binaries.json and/or filesystem.json not found in the release assets");
|
||||
@@ -443,7 +443,7 @@ $('#confirmSelectRepo').onclick = function (event) {
|
||||
let formData = new FormData();
|
||||
formData.append("repo", repo);
|
||||
formData.append("env", $('#environment').value);
|
||||
fetch("/save_apcfg", {
|
||||
fetch("save_apcfg", {
|
||||
method: "POST",
|
||||
body: formData
|
||||
})
|
||||
@@ -478,7 +478,7 @@ export function print(line, color = "white") {
|
||||
|
||||
export function reboot() {
|
||||
print("Rebooting now... Reloading webpage in 5 seconds...", "yellow");
|
||||
fetch("/reboot", { method: "POST" });
|
||||
fetch("reboot", { method: "POST" });
|
||||
setTimeout(() => {
|
||||
location.reload();
|
||||
}, 5000);
|
||||
@@ -520,7 +520,7 @@ const fetchAndPost = async (url, name, path) => {
|
||||
formData.append('path', path);
|
||||
formData.append('file', fileContent, name);
|
||||
|
||||
const uploadResponse = await fetch('/littlefs_put', {
|
||||
const uploadResponse = await fetch('littlefs_put', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
@@ -544,7 +544,7 @@ const writeVersion = async (content, name, path) => {
|
||||
const blob = new Blob([content]);
|
||||
formData.append('file', blob, name);
|
||||
|
||||
const uploadResponse = await fetch('/littlefs_put', {
|
||||
const uploadResponse = await fetch('littlefs_put', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const $ = document.querySelector.bind(document);
|
||||
|
||||
window.addEventListener("load", function () {
|
||||
fetch("/get_wifi_config")
|
||||
fetch("get_wifi_config")
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
$('#ssid').value = data.ssid || "";
|
||||
@@ -25,7 +25,7 @@ $('#listssid').addEventListener('click', () => {
|
||||
});
|
||||
|
||||
function getSsidList() {
|
||||
fetch("/get_ssid_list")
|
||||
fetch("get_ssid_list")
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.scanstatus < 0) {
|
||||
@@ -64,7 +64,7 @@ $('#connect').addEventListener('click', () => {
|
||||
dns: $('#dns').value
|
||||
};
|
||||
|
||||
fetch('/save_wifi_config', {
|
||||
fetch('save_wifi_config', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
|
||||
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case - Cover.stl
Normal file
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case - Cover.stl
Normal file
Binary file not shown.
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case.skp
Normal file
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case.skp
Normal file
Binary file not shown.
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case.stl
Normal file
BIN
Hardware/MiniAP v3 Case/MiniAP v3 Case.stl
Normal file
Binary file not shown.
5
Hardware/MiniAP v3 Case/README.md
Normal file
5
Hardware/MiniAP v3 Case/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## Alternative case for the MiniAP v3 ##
|
||||
Slim-fit case for the MiniAP v3. This one allows for a cooler S3/C6!
|
||||
|
||||

|
||||

|
||||
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Case.skp
Normal file
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Case.skp
Normal file
Binary file not shown.
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Case.stl
Normal file
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Case.stl
Normal file
Binary file not shown.
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Cover.stl
Normal file
BIN
Hardware/S3_C6_NanoAP Case/NanoAP Cover.stl
Normal file
Binary file not shown.
10
Hardware/S3_C6_NanoAP Case/README.md
Normal file
10
Hardware/S3_C6_NanoAP Case/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
## S3 C6 NanoAP Case ##
|
||||
|
||||
This is a tiny case for the Nano AP, meant for C6 modules with an IPEX connector instead of the PCB antenna. You'll need a small external PCB antenna, which goes into a slot on the side.
|
||||
|
||||
The S3 and C6 are cooled by 20x20mm heatsinks that are stuck on with double-sided heat-conducting tape.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
BIN
binaries/Tag/SOL_M2_154_SSD_0027.bin
Normal file
BIN
binaries/Tag/SOL_M2_154_SSD_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_29_LT_0027.bin
Normal file
BIN
binaries/Tag/SOL_M2_29_LT_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_29_SSD_0027.bin
Normal file
BIN
binaries/Tag/SOL_M2_29_SSD_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_29_UC_0027.bin
Normal file
BIN
binaries/Tag/SOL_M2_29_UC_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_42_SSD_0027.bin
Normal file
BIN
binaries/Tag/SOL_M2_42_SSD_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_75_full_0028.bin
Normal file
BIN
binaries/Tag/SOL_M2_75_full_0028.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M2_75_ota_0028.bin
Normal file
BIN
binaries/Tag/SOL_M2_75_ota_0028.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M3_Uni_full_0027.bin
Normal file
BIN
binaries/Tag/SOL_M3_Uni_full_0027.bin
Normal file
Binary file not shown.
BIN
binaries/Tag/SOL_M3_Uni_ota_0027.bin
Normal file
BIN
binaries/Tag/SOL_M3_Uni_ota_0027.bin
Normal file
Binary file not shown.
Binary file not shown.
@@ -1,74 +1,94 @@
|
||||
[
|
||||
{
|
||||
"00" : {
|
||||
"type": "SOL_M2_154_SSD",
|
||||
"version": "26",
|
||||
"md5": "b6948f6eb87fbb6f21f1254adbaa07ac"
|
||||
},
|
||||
"01" : {
|
||||
"type": "SOL_M2_29_SSD",
|
||||
"version": "26",
|
||||
"md5": "7309496eb0f3da3b450fd7fc121a4982"
|
||||
},
|
||||
"02" : {
|
||||
"type": "SOL_M2_42_SSD",
|
||||
"version": "26",
|
||||
"md5": "add97e450fa020ee994defe15f0c77ae"
|
||||
},
|
||||
"05" : {
|
||||
"type": "SOL_M2_75_ota",
|
||||
"version": "04",
|
||||
"md5": "26c058db1f14c7ee2f301283bcbe7c9d"
|
||||
},
|
||||
"11" : {
|
||||
"type": "SOL_M2_29_UC",
|
||||
"version": "25",
|
||||
"md5": "0c692cfca683948efeb3501a00c8f8bd"
|
||||
},
|
||||
"21" : {
|
||||
"type": "SOL_M2_29_LT",
|
||||
"version": "25",
|
||||
"md5": "8ebc88f2a8de187a81d2f7c4c39b0d8e"
|
||||
},
|
||||
"2E" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"2F" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"30" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"31" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"33" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"34" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"35" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
},
|
||||
"36" : {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "26",
|
||||
"md5": "d234e395a8441779caa2df75ca9a508d"
|
||||
}
|
||||
"00": {
|
||||
"type": "SOL_M2_154_SSD",
|
||||
"version": "0027",
|
||||
"md5": "0cf7b60327ff2b0318185be2e8ba82a0"
|
||||
},
|
||||
"01": {
|
||||
"type": "SOL_M2_29_SSD",
|
||||
"version": "0027",
|
||||
"md5": "a051ee5d5517b3e8d3d09ae1e076eabc"
|
||||
},
|
||||
"02": {
|
||||
"type": "SOL_M2_42_SSD",
|
||||
"version": "0027",
|
||||
"md5": "94aa727296a4c480a6702ea612288b4c"
|
||||
},
|
||||
"05": {
|
||||
"type": "SOL_M2_75_ota",
|
||||
"version": "04",
|
||||
"md5": "26c058db1f14c7ee2f301283bcbe7c9d"
|
||||
},
|
||||
"11": {
|
||||
"type": "SOL_M2_29_UC",
|
||||
"version": "0027",
|
||||
"md5": "aba3e35ef2bb63066d47e924bccd64f0"
|
||||
},
|
||||
"21": {
|
||||
"type": "SOL_M2_29_LT",
|
||||
"version": "0027",
|
||||
"md5": "130203d9ab7905b14166af1cc7260285"
|
||||
},
|
||||
"2E": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"2F": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"30": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"31": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"32": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"33": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"34": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"35": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"36": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"40": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"41": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
},
|
||||
"42": {
|
||||
"type": "SOL_M3_Uni_ota",
|
||||
"version": "0027",
|
||||
"md5": "03311a065fe4e1d20f373df7bc5f8dbe"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -38,8 +38,11 @@
|
||||
#define SOLUM_M3_BWY_26 0x3A
|
||||
#define SOLUM_M3_BWR_29 0x33 // the 'standard' SSD1619 version
|
||||
#define SOLUM_M3_BWY_29 0x3B
|
||||
#define SOLUM_M3_BW_29 0x40
|
||||
#define SOLUM_M3_BWR_42 0x34
|
||||
#define SOLUM_M3_BWY_42 0x3C
|
||||
#define SOLUM_M3_BWR_58 0x41
|
||||
#define SOLUM_M3_BW_58 0x42
|
||||
#define SOLUM_M3_BWR_60 0x35
|
||||
#define SOLUM_M3_BWY_60 0x3D
|
||||
#define SOLUM_M3_BWR_75 0x36
|
||||
@@ -47,6 +50,7 @@
|
||||
#define SOLUM_M3_BWR_116 0x37
|
||||
#define SOLUM_M3_BWY_116 0x3F
|
||||
|
||||
|
||||
// M3 Tags overflow
|
||||
#define SOLUM_M3_BW_29 0x40
|
||||
#define SOLUM_M3_BWR_58 0x41
|
||||
@@ -75,9 +79,13 @@
|
||||
// Solum types - customer data byte 16 in M3 (nRF) UICR
|
||||
#define STYPE_SIZE_016 0x40
|
||||
#define STYPE_SIZE_022 0x41
|
||||
#define STYPE_SIZE_026 0x43
|
||||
#define STYPE_SIZE_029 0x42
|
||||
#define STYPE_SIZE_029_FREEZER 0x22
|
||||
#define STYPE_SIZE_042 0x46
|
||||
#define STYPE_SIZE_043 0x47
|
||||
#define STYPE_SIZE_058 0x63
|
||||
#define STYPE_SIZE_058_FREEZER 0x24
|
||||
#define STYPE_SIZE_060 0x48
|
||||
#define STYPE_SIZE_075 0x4C
|
||||
#define STYPE_SIZE_097 0x64
|
||||
@@ -123,6 +131,7 @@
|
||||
#define CMD_ENTER_SLIDESHOW_GLACIAL 0x09
|
||||
#define CMD_ENTER_NORMAL_MODE 0x0F
|
||||
#define CMD_ENTER_WAIT_RFWAKE 0x20
|
||||
#define CMD_GET_BATTERY_VOLTAGE 0x21
|
||||
|
||||
#define WAKEUP_REASON_TIMED 0
|
||||
#define WAKEUP_REASON_GPIO 2
|
||||
|
||||
@@ -18,6 +18,9 @@ struct espSetChannelPower {
|
||||
uint8_t checksum;
|
||||
uint8_t channel;
|
||||
uint8_t power;
|
||||
#ifdef HAS_SUBGHZ
|
||||
uint8_t subghzchannel;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
struct espAvailDataReq {
|
||||
|
||||
@@ -9,26 +9,26 @@ BINDIR="../binaries/Tag"
|
||||
|
||||
echo -e "\nBuilding 1.54 version..."
|
||||
make BUILD=zbs154_ssd1619 CPU=8051 SOC=zbs243 > /dev/null
|
||||
mv main.bin ${BINDIR}/SOLUM_154_SSD1619-00-${VER}.bin -v
|
||||
mv main.bin ${BINDIR}/SOL_M2_154_SSD_${VER}.bin -v
|
||||
make clean > /dev/null
|
||||
|
||||
echo -e "\n\nBuilding 2.9 (SSD1619) version..."
|
||||
make BUILD=zbs29_ssd1619 CPU=8051 SOC=zbs243 > /dev/null
|
||||
mv main.bin ${BINDIR}/SOLUM_29_SSD1619-01-${VER}.bin -v
|
||||
mv main.bin ${BINDIR}/SOL_M2_29_SSD_${VER}.bin -v
|
||||
make clean > /dev/null
|
||||
|
||||
echo -e "\n\nBuilding 4.2 version..."
|
||||
make BUILD=zbs42_ssd1619 CPU=8051 SOC=zbs243 > /dev/null
|
||||
mv main.bin ${BINDIR}/SOLUM_42_SSD1619-02-${VER}.bin -v
|
||||
mv main.bin ${BINDIR}/SOL_M2_42_SSD_${VER}.bin -v
|
||||
make clean > /dev/null
|
||||
|
||||
echo -e "\n\nBuilding 2.9 (UC8151) version..."
|
||||
make BUILD=zbs29_uc8151 CPU=8051 SOC=zbs243 > /dev/null
|
||||
mv main.bin ${BINDIR}/SOLUM_29_UC8151-11-${VER}.bin -v
|
||||
mv main.bin ${BINDIR}/SOL_M2_29_UC_${VER}.bin -v
|
||||
make clean > /dev/null
|
||||
|
||||
echo -e "\n\nBuilding 2.9 BW (SSD1619 - freezer) version..."
|
||||
make BUILD=zbs29_BW_ssd1619 CPU=8051 SOC=zbs243 > /dev/null
|
||||
mv main.bin ${BINDIR}/SOLUM_29_BW_LOWTEMP-21-${VER}.bin -v
|
||||
mv main.bin ${BINDIR}/SOL_M2_29_LT_${VER}.bin -v
|
||||
make clean > /dev/null
|
||||
|
||||
|
||||
@@ -558,6 +558,10 @@ void executeCommand(uint8_t cmd) {
|
||||
eraseImageBlocks();
|
||||
powerDown(INIT_EEPROM);
|
||||
break;
|
||||
case CMD_GET_BATTERY_VOLTAGE:
|
||||
longDataReqCounter = LONG_DATAREQ_INTERVAL + 1;
|
||||
voltageCheckCounter = VOLTAGE_CHECK_INTERVAL;
|
||||
break;
|
||||
#ifndef LEAN_VERSION
|
||||
case CMD_ENTER_SLIDESHOW_FAST:
|
||||
powerUp(INIT_EEPROM);
|
||||
@@ -757,7 +761,7 @@ void main() {
|
||||
#ifdef DEBUGMAIN
|
||||
pr("MAIN: Ap Found!\n");
|
||||
#endif
|
||||
//showNoAP();
|
||||
// showNoAP();
|
||||
|
||||
showAPFound();
|
||||
// write the settings to the eeprom
|
||||
@@ -772,7 +776,7 @@ void main() {
|
||||
#ifdef DEBUGMAIN
|
||||
pr("MAIN: No AP found...\n");
|
||||
#endif
|
||||
//showAPFound();
|
||||
// showAPFound();
|
||||
showNoAP();
|
||||
// write the settings to the eeprom
|
||||
powerUp(INIT_EEPROM);
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define FW_VERSION 0x0026 // version number
|
||||
#define FW_VERSION_SUFFIX "-MD5" // suffix, like -RC1 or whatever.
|
||||
#define FW_VERSION 0x0027 // version number
|
||||
#define FW_VERSION_SUFFIX "-RDRW" // suffix, like -RC1 or whatever.
|
||||
// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers
|
||||
#define DEBUGPROTO // debug protocol
|
||||
//#define DEBUGPROTO // debug protocol
|
||||
// #define DEBUGOTA // debug OTA FW updates
|
||||
#define DEBUGDRAWING // debug the drawing part
|
||||
#define DEBUGEPD // debug the EPD driver
|
||||
#define DEBUGMAIN // parts in the main loop
|
||||
#define DEBUGNFC // debug NFC functions
|
||||
//#define DEBUGDRAWING // debug the drawing part
|
||||
//#define DEBUGEPD // debug the EPD driver
|
||||
//#define DEBUGMAIN // parts in the main loop
|
||||
//#define DEBUGNFC // debug NFC functions
|
||||
// #define DEBUGGUI // debug GUI drawing (enabled)
|
||||
#define DEBUGSETTINGS // debug settings module (preferences/eeprom)
|
||||
//#define DEBUGSETTINGS // debug settings module (preferences/eeprom)
|
||||
// #define DEBUGEEPROM // eeprom-related debug messages
|
||||
#define VALIDATE_IMAGE_MD5 // The firmware can validate the image MD5 before displaying it. This costs about 8mAS (milliamp-second) for a 1.54, 16
|
||||
// #define PRINT_LUT // uncomment if you want the tag to print the LUT for the current temperature bracket
|
||||
@@ -59,4 +59,4 @@ void writeSettings();
|
||||
void loadSettings();
|
||||
void loadSettingsFromBuffer(uint8_t* p);
|
||||
void invalidateSettingsEEPROM();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -217,9 +217,9 @@ static void sendAvailDataReq() {
|
||||
commsTxNoCpy(outBuffer);
|
||||
}
|
||||
struct AvailDataInfo *__xdata getAvailDataInfo() {
|
||||
#ifdef DEBUGPROTO
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: Full AvailData\n");
|
||||
#endif
|
||||
#endif
|
||||
radioRxEnable(true, true);
|
||||
uint32_t __xdata t;
|
||||
for (uint8_t c = 0; c < DATA_REQ_MAX_ATTEMPTS; c++) {
|
||||
@@ -244,9 +244,9 @@ struct AvailDataInfo *__xdata getAvailDataInfo() {
|
||||
return NULL;
|
||||
}
|
||||
struct AvailDataInfo *__xdata getShortAvailDataInfo() {
|
||||
#ifdef DEBUGPROTO
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: Short AvailData\n");
|
||||
#endif
|
||||
#endif
|
||||
radioRxEnable(true, true);
|
||||
uint32_t __xdata t;
|
||||
for (uint8_t c = 0; c < DATA_REQ_MAX_ATTEMPTS; c++) {
|
||||
@@ -683,9 +683,9 @@ static bool getDataBlock(const uint16_t blockSize) {
|
||||
curBlock.requestedParts[c / 8] |= (1 << (c % 8));
|
||||
}
|
||||
requestPartialBlock = false;
|
||||
#ifdef DEBUGPROTO
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: blk failed validation!\n");
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
#ifndef DEBUGBLOCKS
|
||||
@@ -695,9 +695,9 @@ static bool getDataBlock(const uint16_t blockSize) {
|
||||
requestPartialBlock = true;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUGPROTO
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: failed getting block\n");
|
||||
#endif
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -948,7 +948,9 @@ inline bool processImageDataAvail(struct AvailDataInfo *__xdata avail) {
|
||||
|
||||
} else {
|
||||
// currently not displayed
|
||||
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: currently not shown image\n");
|
||||
#endif
|
||||
// try to find the data in the SPI EEPROM
|
||||
powerUp(INIT_EEPROM);
|
||||
uint8_t findImgSlot = findSlotVer(&(avail->dataVer));
|
||||
@@ -956,6 +958,9 @@ inline bool processImageDataAvail(struct AvailDataInfo *__xdata avail) {
|
||||
|
||||
// Is this image already in a slot somewhere
|
||||
if (findImgSlot != 0xFF) {
|
||||
#ifdef DEBUGPROTO
|
||||
pr("PROTO: Found image in EEPROM\n");
|
||||
#endif
|
||||
// found a (complete)valid image slot for this version
|
||||
powerUp(INIT_RADIO);
|
||||
sendXferComplete();
|
||||
@@ -994,9 +999,8 @@ inline bool processImageDataAvail(struct AvailDataInfo *__xdata avail) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// keep track on what is currently displayed
|
||||
xMemCopy8(curDispDataVer, xferDataInfo.dataVer);
|
||||
// keep track on what is currently displayed
|
||||
xMemCopy8(curDispDataVer, &xferDataInfo.dataVer);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1228,4 +1232,4 @@ bool validateFWMagic() {
|
||||
void initializeProto() {
|
||||
getNumSlots();
|
||||
curHighSlotId = getHighSlotId();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user