From f00761db94415355f12223266a6768363465d77c Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Sun, 14 Jan 2024 14:24:44 +0100 Subject: [PATCH] small improvements - added short date format definition in language.json - changed english date format to mm/dd - added lightgrey (4)/darkgrey (5)/pink (6) colors in jsontemplate (uses pattern dither) - fixed ntp init timing --- ESP32_AP-Flasher/data/languages.json | 72 ++++++++++++------------- ESP32_AP-Flasher/include/language.h | 2 +- ESP32_AP-Flasher/include/makeimage.h | 2 +- ESP32_AP-Flasher/src/contentmanager.cpp | 36 +++++-------- ESP32_AP-Flasher/src/language.cpp | 6 ++- ESP32_AP-Flasher/src/main.cpp | 2 +- ESP32_AP-Flasher/src/makeimage.cpp | 31 ++++++++--- ESP32_AP-Flasher/src/system.cpp | 9 ++-- ESP32_AP-Flasher/src/web.cpp | 6 +-- 9 files changed, 89 insertions(+), 77 deletions(-) diff --git a/ESP32_AP-Flasher/data/languages.json b/ESP32_AP-Flasher/data/languages.json index 3998ced2..74c6d4cc 100644 --- a/ESP32_AP-Flasher/data/languages.json +++ b/ESP32_AP-Flasher/data/languages.json @@ -1,65 +1,65 @@ { "0": { "language": "en", - "daysShort": ["SU", "MO", "TU", "WE", "TH", "FR", "SA"], - "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - "date_format": "%d-%m-%Y" + "daysShort": [ "SU", "MO", "TU", "WE", "TH", "FR", "SA" ], + "days": [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + "months": [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], + "date_format": [ "%m/%d/%Y", "%m/%d" ] }, "1": { "language": "nl", - "daysShort": ["ZO", "MA", "DI", "WO", "DO", "VR", "ZA"], - "days": ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], - "months": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], - "date_format": "%d-%m-%Y" + "daysShort": [ "ZO", "MA", "DI", "WO", "DO", "VR", "ZA" ], + "days": [ "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" ], + "months": [ "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "2": { "language": "de", - "daysShort": ["SO", "MO", "DI", "MI", "DO", "FR", "SA"], - "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], - "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], - "date_format": "%d.%m.%Y" + "daysShort": [ "SO", "MO", "DI", "MI", "DO", "FR", "SA" ], + "days": [ "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" ], + "months": [ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" ], + "date_format": [ "%d.%m.%Y", "%d.%m" ] }, "3": { "language": "no", - "daysShort": ["SØ", "MA", "TI", "ON", "TO", "FR", "LØ"], - "days": ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], - "months": ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], - "date_format": "%d-%m-%Y" + "daysShort": [ "SØ", "MA", "TI", "ON", "TO", "FR", "LØ" ], + "days": [ "Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag" ], + "months": [ "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "5": { "language": "cz", - "daysShort": ["NE", "PO", "ÚT", "ST", "ČT", "PÁ", "SO"], - "days": ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"], - "months": ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"], - "date_format": "%d-%m-%Y" + "daysShort": [ "NE", "PO", "ÚT", "ST", "ČT", "PÁ", "SO" ], + "days": [ "Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota" ], + "months": [ "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "6": { "language": "sk", - "daysShort": ["NE", "PO", "UT", "ST", "ŠT", "PI", "SO"], - "days": ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"], - "months": ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Oktober", "November", "December"], - "date_format": "%d-%m-%Y" + "daysShort": [ "NE", "PO", "UT", "ST", "ŠT", "PI", "SO" ], + "days": [ "Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota" ], + "months": [ "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Oktober", "November", "December" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "7": { "language": "pl", - "daysShort": ["Ni", "Po", "Wt", "Śr", "Cz", "Pt", "So"], - "days": ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"], - "months": ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], - "date_format": "%d-%m-%Y" + "daysShort": [ "Ni", "Po", "Wt", "Śr", "Cz", "Pt", "So" ], + "days": [ "Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota" ], + "months": [ "Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "8": { "language": "es", - "daysShort": ["D", "L", "MA", "MI", "J", "V", "S"], - "days": ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], - "months": ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], - "date_format": "%d-%m-%Y" + "daysShort": [ "D", "L", "MA", "MI", "J", "V", "S" ], + "days": [ "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" ], + "months": [ "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" ], + "date_format": [ "%d-%m-%Y", "%d-%m" ] }, "4": { "language": "fr", - "daysShort": ["DI", "LU", "MA", "ME", "JE", "VE", "SA"], - "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" + "daysShort": [ "DI", "LU", "MA", "ME", "JE", "VE", "SA" ], + "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" ] } } diff --git a/ESP32_AP-Flasher/include/language.h b/ESP32_AP-Flasher/include/language.h index abdaa247..c8fde7c0 100644 --- a/ESP32_AP-Flasher/include/language.h +++ b/ESP32_AP-Flasher/include/language.h @@ -5,7 +5,7 @@ extern String languageDaysShort[7]; extern String languageDays[7]; extern String languageMonth[12]; -extern String languageDateFormat; +extern String languageDateFormat[5]; extern void updateLanguageFromConfig(); diff --git a/ESP32_AP-Flasher/include/makeimage.h b/ESP32_AP-Flasher/include/makeimage.h index 3967a40b..9ca91431 100644 --- a/ESP32_AP-Flasher/include/makeimage.h +++ b/ESP32_AP-Flasher/include/makeimage.h @@ -12,7 +12,7 @@ extern TFT_eSPI tft; struct imgParam { bool hasRed; uint8_t dataType; - bool dither; + uint8_t dither; bool grayLut = false; uint8_t bufferbpp = 8; uint8_t rotate = 0; diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index cf5fcb95..7d3b3ac6 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -197,7 +197,7 @@ void drawNew(const uint8_t mac[8], tagRecord *&taginfo) { imageParams.hasRed = false; imageParams.dataType = DATATYPE_IMG_RAW_1BPP; - imageParams.dither = false; + imageParams.dither = 0; if (taginfo->hasCustomLUT && taginfo->lut != 1) imageParams.grayLut = true; imageParams.invert = taginfo->invert; @@ -232,7 +232,7 @@ void drawNew(const uint8_t mac[8], tagRecord *&taginfo) { configFilename = "/" + configFilename; } if (contentFS->exists(configFilename)) { - imageParams.dither = cfgobj["dither"] && cfgobj["dither"] == "1"; + imageParams.dither = cfgobj["dither"]; imageParams.preload = cfgobj["preload"] && cfgobj["preload"] == "1"; imageParams.preloadlut = cfgobj["preload_lut"]; @@ -637,16 +637,12 @@ void drawTextBox(TFT_eSprite &spr, String &content, int16_t &posx, int16_t &posy bool hasspace = false; while (endPos < length && spr.textWidth(content.substring(startPos, endPos + 1).c_str()) <= boxwidth && content.charAt(endPos) != '\n') { - // Serial.println("try: " + String(startPos) + "-" + String(endPos) + " " + content.substring(startPos, endPos + 1)); if (content.charAt(endPos) == ' ' || content.charAt(endPos) == '-') hasspace = true; endPos++; } while (endPos < length && endPos > startPos && hasspace == true && content.charAt(endPos - 1) != ' ' && content.charAt(endPos - 1) != '-' && content.charAt(endPos) != '\n') { endPos--; - // Serial.println("backtrack: " + String(startPos) + "-" + String(endPos) + " " + content.substring(startPos, endPos)); } - // Serial.println("result: " + String(startPos) + "-" + String(endPos) + " " + content.substring(startPos, endPos)); - // delay(1000); spr.drawString(content.substring(startPos, endPos), posx, posy); posy += spr.gFont.yAdvance * lineheight; @@ -1089,7 +1085,7 @@ char *epoch_to_display(time_t utc) { (local_tm.tm_year == now_tm.tm_year && local_tm.tm_mon == now_tm.tm_mon && local_tm.tm_mday < now_tm.tm_mday) || (local_tm.tm_hour == 0 && local_tm.tm_min == 0) || difftime(utc, now) >= 86400) { - strftime(display, sizeof(display), "%d-%m", &local_tm); + strftime(display, sizeof(display), languageDateFormat[1].c_str(), &local_tm); } else { strftime(display, sizeof(display), "%H:%M", &local_tm); } @@ -1113,7 +1109,7 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa struct tm timeinfo; localtime_r(&now, &timeinfo); char dateString[40]; - strftime(dateString, sizeof(dateString), languageDateFormat.c_str(), &timeinfo); + strftime(dateString, sizeof(dateString), languageDateFormat[0].c_str(), &timeinfo); HTTPClient http; // logLine("http getCalFeed " + URL); @@ -1200,6 +1196,8 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa int calYOffset = loc["gridparam"][1].as(); int lineHeight = loc["gridparam"][5].as(); + imageParams.dither = 2; + // drawString(spr, String(timeinfo.tm_mday), calWidth / 2, -calHeight/5, "Signika-SB.ttf", TC_DATUM, TFT_RED, calHeight * 1.2); for (int i = 0; i < calDays; i++) { @@ -1212,19 +1210,10 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa spr.drawLine(colStart, calTop, colStart, calBottom, TFT_BLACK); drawString(spr, String(languageDaysShort[dayInfo->tm_wday]) + " " + String(dayInfo->tm_mday), colStart + colWidth / 2, calTop, loc["gridparam"][3], TC_DATUM, TFT_BLACK); - int grid = 3; if (dayInfo->tm_wday == 0 || dayInfo->tm_wday == 6) { - for (int y = calTop + calYOffset; y < calHeight; y += 1) { - for (int x = colStart + (y % 2); x < colStart + colWidth; x += 2) { - spr.drawPixel(x, y, TFT_BLACK); - } - } + spr.fillRect(colStart + 1, calTop + calYOffset, colWidth - 1, calHeight - 1, TFT_DARKGREY); } else { - for (int y = calTop + calYOffset; y < calHeight; y += 2) { - for (int x = colStart; x < colStart + colWidth; x += 2) { - spr.drawPixel(x, y, TFT_BLACK); - } - } + spr.fillRect(colStart + 1, calTop + calYOffset, colWidth - 1, calHeight - 1, TFT_LIGHTGREY); } } @@ -1268,7 +1257,6 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa const time_t enddatetime2 = obj2["end"]; if (startdatetime < enddatetime2 && enddatetime > startdatetime2 && line == block[j] && isallday2) { - Serial.printf("overlap %d met %d, %d-%d met %d-%d, block[j]=%d", i, j, startdatetime, enddatetime, startdatetime2, enddatetime2, block[j]); overlap == true; line++; } @@ -1339,8 +1327,6 @@ bool getCalFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa const time_t enddatetime2 = obj2["end"]; if (startdatetime < enddatetime2 && enddatetime > startdatetime2 && indent == block[j] && isallday2 == false) { - Serial.println("overlap met " + String(j) + " (indent " + String(indent) + ")"); - Serial.printf("overlap %d met %d, %d-%d met %d-%d, block[j]=%d", i, j, startdatetime, enddatetime, startdatetime2, enddatetime2, block[j]); overlap == true; indent++; } @@ -1449,7 +1435,6 @@ uint8_t drawBuienradar(String &filename, JsonObject &cfgobj, tagRecord *&taginfo const int bars2 = bars[2].as(); float factor = (float)bars1 / 111; - Serial.println(factor); for (int i = 0; i < imageParams.width; i += 4) { int yCoordinates[] = {1, 20, 29, 39, 49, 55, 59}; for (int y : yCoordinates) { @@ -1710,6 +1695,7 @@ void drawJsonStream(Stream &stream, String &filename, tagRecord *&taginfo, imgPa TFT_eSprite spr = TFT_eSprite(&tft); initSprite(spr, imageParams.width, imageParams.height, imageParams); uint8_t screenCurrentOrientation = 0; + imageParams.dither = 2; DynamicJsonDocument doc(500); if (stream.find("[")) { do { @@ -1799,6 +1785,10 @@ uint16_t getColor(const String &color) { if (color == "0" || color == "white") return TFT_WHITE; if (color == "1" || color == "" || color == "black") return TFT_BLACK; if (color == "2" || color == "red") return TFT_RED; + if (color == "3" || color == "yellow") return TFT_YELLOW; + if (color == "4" || color == "lightgray") return TFT_LIGHTGREY; + if (color == "5" || color == "darkgray") return TFT_DARKGREY; + if (color == "6" || color == "pink") return TFT_PINK; uint16_t r, g, b; if (color.length() == 7 && color[0] == '#' && sscanf(color.c_str(), "#%2hx%2hx%2hx", &r, &g, &b) == 3) { diff --git a/ESP32_AP-Flasher/src/language.cpp b/ESP32_AP-Flasher/src/language.cpp index fa405e4f..f8cd48f6 100644 --- a/ESP32_AP-Flasher/src/language.cpp +++ b/ESP32_AP-Flasher/src/language.cpp @@ -11,7 +11,7 @@ String languageDaysShort[7]; String languageDays[7]; String languageMonth[12]; -String languageDateFormat; +String languageDateFormat[5]; int currentLanguage = 0; @@ -47,6 +47,8 @@ void updateLanguageFromConfig() { for (int i = 0; i < 12; ++i) { languageMonth[i] = languageObject["months"][i].as(); } - languageDateFormat = languageObject["date_format"].as(); + for (int i = 0; i < languageObject["date_format"].size(); i++) { + languageDateFormat[i] = languageObject["date_format"][i].as(); + } } diff --git a/ESP32_AP-Flasher/src/main.cpp b/ESP32_AP-Flasher/src/main.cpp index f29d4bab..adf6d692 100644 --- a/ESP32_AP-Flasher/src/main.cpp +++ b/ESP32_AP-Flasher/src/main.cpp @@ -118,11 +118,11 @@ void setup() { initAPconfig(); - xTaskCreate(initTime, "init time", 5000, NULL, 2, NULL); updateLanguageFromConfig(); updateBrightnessFromConfig(); init_web(); + xTaskCreate(initTime, "init time", 5000, NULL, 2, NULL); #ifdef HAS_RGB_LED rgbIdle(); diff --git a/ESP32_AP-Flasher/src/makeimage.cpp b/ESP32_AP-Flasher/src/makeimage.cpp index d18cf6bd..82d5d957 100644 --- a/ESP32_AP-Flasher/src/makeimage.cpp +++ b/ESP32_AP-Flasher/src/makeimage.cpp @@ -100,14 +100,21 @@ void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t if (imageParams.invert == 1) { std::swap(palette[0], palette[1]); } - if (imageParams.grayLut) { - Color newColor = {160, 160, 160}; - palette.push_back(newColor); + Color color; + if (imageParams.dither == 2) { + color = {128, 128, 128}; + palette.push_back(color); + color = {211, 211, 211}; + palette.push_back(color); + color = {255, 192, 203}; + palette.push_back(color); + } else if (imageParams.grayLut) { + color = {160, 160, 160}; + palette.push_back(color); Serial.println("rendering with gray"); } int num_colors = palette.size(); if (imageParams.bufferbpp == 1) num_colors = 2; - Color color; Error *error_bufferold = new Error[bufw + 4]; Error *error_buffernew = new Error[bufw + 4]; @@ -156,12 +163,22 @@ void spr2color(TFT_eSprite &spr, imgParam &imageParams, uint8_t *buffer, size_t buffer[byteIndex] |= (1 << bitIndex); break; case 3: - buffer[byteIndex] |= (1 << bitIndex); - imageParams.hasRed = true; + if (imageParams.grayLut) { + buffer[byteIndex] |= (1 << bitIndex); + imageParams.hasRed = true; + } else { + if (!is_red && (x + y) % 2) buffer[byteIndex] |= (1 << bitIndex); + } + break; + case 4: + if (!is_red && (x % 2 == 0) && (y % 2 == 0)) buffer[byteIndex] |= (1 << bitIndex); + break; + case 5: + if (is_red && (x + y) % 2) buffer[byteIndex] |= (1 << bitIndex); break; } - if (imageParams.dither) { + if (imageParams.dither == 1) { Error error = { color.r + error_bufferold[x].r - palette[best_color_index].r, color.g + error_bufferold[x].g - palette[best_color_index].g, diff --git a/ESP32_AP-Flasher/src/system.cpp b/ESP32_AP-Flasher/src/system.cpp index f9cf361e..44d7cb93 100644 --- a/ESP32_AP-Flasher/src/system.cpp +++ b/ESP32_AP-Flasher/src/system.cpp @@ -7,15 +7,18 @@ #include "storage.h" #include "tag_db.h" +#include "wifimanager.h" void timeSyncCallback(struct timeval* tv) { Serial.println("time succesfully synced"); } void initTime(void* parameter) { - sntp_set_time_sync_notification_cb(timeSyncCallback); - sntp_set_sync_interval(300 * 1000); - configTzTime(config.timeZone, "nl.pool.ntp.org", "europe.pool.ntp.org", "time.nist.gov"); + if (WiFi.status() == WL_CONNECTED) { + sntp_set_time_sync_notification_cb(timeSyncCallback); + sntp_set_sync_interval(300 * 1000); + configTzTime(config.timeZone, "nl.pool.ntp.org", "europe.pool.ntp.org", "time.nist.gov"); + } logStartUp(); struct tm timeinfo; while (millis() < 30000) { diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 1aab0829..a97e9369 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -100,7 +100,7 @@ void wsSendSysteminfo() { if (day != timeinfo.tm_mday) { day = timeinfo.tm_mday; char timeBuffer[80]; - strftime(timeBuffer, sizeof(timeBuffer), languageDateFormat.c_str(), &timeinfo); + strftime(timeBuffer, sizeof(timeBuffer), languageDateFormat[0].c_str(), &timeinfo); setVarDB("ap_date", timeBuffer); } setVarDB("ap_ip", WiFi.localIP().toString()); @@ -721,9 +721,9 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index if (hex2mac(dst, mac)) { tagRecord *taginfo = tagRecord::findByMAC(mac); if (taginfo != nullptr) { - bool dither = true; + uint8_t dither = 1; if (request->hasParam("dither", true)) { - if (request->getParam("dither", true)->value() == "0") dither = false; + dither = request->getParam("dither", true)->value().toInt(); } uint32_t ttl = 0; if (request->hasParam("ttl", true)) {