From 533f0cec78f3444aefc4977f2a53bafa972f3cc4 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Tue, 23 May 2023 00:46:32 +0200 Subject: [PATCH] set NFC url / new tagtypes / minor fixes --- .../data/fonts/weathericons70.vlw | Bin 83807 -> 100379 bytes .../data/fonts/weathericons78.vlw | Bin 104727 -> 125005 bytes ESP32_AP-Flasher/data/www/content_cards.json | 51 +++++++++++++--- ESP32_AP-Flasher/data/www/main.js | 9 ++- ESP32_AP-Flasher/include/newproto.h | 1 + ESP32_AP-Flasher/include/tag_db.h | 4 -- ESP32_AP-Flasher/src/contentmanager.cpp | 57 ++++++++++-------- ESP32_AP-Flasher/src/newproto.cpp | 51 +++++++++++++++- ESP32_AP-Flasher/src/tag_db.cpp | 1 - 9 files changed, 129 insertions(+), 45 deletions(-) diff --git a/ESP32_AP-Flasher/data/fonts/weathericons70.vlw b/ESP32_AP-Flasher/data/fonts/weathericons70.vlw index 1807f1ec49fdc2ea03ced8a9d4a53c8b863d2f8f..689a14cd111816996b05cc432a92a40667fe486f 100644 GIT binary patch delta 4836 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 N8Wl&~V&!J3@GpmK)u8|Y delta 256 zcmbO|f$e@DD+>by1OG;rbjHd4j53q;nan4jep)*@AxW`$0`v9>%#2)olOM<6m# zR+)U@Rp8_a%nCrZ+T?_5%F{n6GpbE~kij{5fiU~@35<-wK+y%0A2fJ_IPwrnC%kzG eG@EzwhdC0Hm^CIp5a-@L&y>+ia{9Y=MqL0E3SgoD diff --git a/ESP32_AP-Flasher/data/fonts/weathericons78.vlw b/ESP32_AP-Flasher/data/fonts/weathericons78.vlw index 073f249c9ad8bef8cc6a106fbae998b7eafc57d2..a34ee456e5fe56748f1fc9cf6f72e5cc86d69cfe 100644 GIT binary patch delta 5078 zcmdT|eQaA-70+#LKY#lHciu{ZC;y^Mq5KY+I^sD#fVL%8m!(x z2r0|vsc0ZXTlbx+7q+f4?X(t+33o!OG(i&;jqy*x+Wvq_bd4sVQ6^eX@CT6w<#*nD z_R?*D_!7d(edm6>ckey-p7Z;i6Zwkka#e9OH8r)LckCBW4Wc%Nve}m7koK=OiAvlq z?T~Bi0f^cic=VwpPCyjS|WIic!ly|3S@q070IG+A@<)Mn}Ld7Kx%oy6R)E^K-vZ#wz z(*3Kcl8HcOAfu4oklfz|*#?=Wa;%wtyh)*(u_P@Xh#Hd$rC(1`WvNBh28BWuSCZ7Z zC{+uJ%qb#6g?&M(ZxV`3Z$)cC4N)c4Mb+UpLrX)%4XqO*VQ48sOQ4pb>ct+)ekv); z8$<`y-i=CqSoBbBFv?%3b8)IpcR{vcBJ6Lem8b8a`~@sJ>ZV*GN!bHKw0I*$3t3hu zzD$w2Vyk6sNTew1Nm1>WV^R%?&E^BG%~UOiNS$wy`u%vtGoP?3zbX$InvW{)S;|+1 z*J`e%n%|EzaZ6Pby@nQ`A1q*xq8a@`d1|c)QK>Z}^+8l}i7xc2#-xXe?oLz_kR9~{ zqryx_T_FXHb~M_ku*FN2r=wJRBLO8lP*S*sHkm8p%5p2Qqf9R}j6rro;#e}BkR8VC zII4VWnGck$EWwDzlazn0h197wQV)9N!UhqC} zY5pex%Dv#1dQ3QJ>1vREG3qkTIOGxum2JRDzlq`OJ|~>=rvcFdOK{SPKcELjK-Flo zsZf3_M71F=EewX(2uQyX=WkW2`aE0-qvFPWa)*~EQz$>tLB;nSGM#|l>QpPN~m8t*g6(q+arpemC^gMX0X5k6j2#NBO*@x)%0SS?a)Hp@oIz$PTcHm zo)oWd8IUp+H;>QQ7m*kDm`2Q4hB6G}e@yhs(p}g>L!;XB&Cn=9<*NZwadlOnL;m?m z;gN+qv1K*jk)JsR&%M?Y!-*=QiJl&dusyou14o6Io@?{U)}unjz_G_8Zp%Pn%HKVX zMfP98x$JjPX$^3|!T|OExe~_drexWGhn3#h3ET_g+I7+|KSGrU#*EoLHYyH7c426} z%@@H73y+EZ)qv|>nB55JYeH1`gb#0I@g`H?03$(Ofo%#jTy(&TVapDr}Wk^lw~#x;JvyW zuwKf>!}c-rfCXsjtz(REeyX+Nif)AI;JrS&ycf=V2)jGbV;>{H4!~q_03T}vZ8(a_ z2_fu^+aN6X`Z5~C9azrqqud<>q{l!~%pBP`F4*3=taOVkj@nlr>cddPY7|HM4b6s= zf3}{D^F+*c3NNvxegYq?ObZiP8+&LFDj*Qb4BK)8WEkyrwrWF=Oz2R;B=kPWB-*gH z-|k@G&()oE0HzDuvRwG@HS+GXEa|xMoNEX(B{AbhYev)5HMG~Dy#`W)WdFgz4>5dZ zI5g_z#}KSp0}F$iqu`#owJ2=e>!AC9OuGc5J`>4=)Vsu;RGJ6Hw?{44dJ}A#hyd}n z*ciDD5|*h$v>5Xqs`QU?6^6ud}sEWo0KYPi-GHbymNCMT+m^ zD9=PG>)61Zl>UAgKs<)enZ9xT=N!gaH~suoUb~%2DK8y<%qO4tJShJ18HKK2$NihZ z$!T8OON+a`;6&izE4a^5?7_0CnAr)(K}UnU5x&?BnY;(UYVmu}e6@Tzz<6vC-tJ7D zaQgt)2%P=2mlx{VfkEsa{{4&%He~H ze)OmcV-Ep=II;}M{5s)~FCT|$Z=F+Q;fRR91pzvifjH#N!vdR{5>ctTg^!9?qEy-F zMLg({r#_3Jg-5_GzweKkOodRfld^vqmgR4XPa^?AWc@#C;Q9mDWDqgGi#KuN%dmnH z`U+eAQ*9WLi!rKUZ@`~|IXPU+OQju%wi6R@4F*)*l!fzqQJ=KkWy(yY@G?g)ppuuj z8yd!e%EctR93v{f%ir&4Nd592(%)=BuCf!(g`i{xniZUVjoYO1SqJT&@mi@C(@_{! z!&YJjI_xU_#w>8A;4${D!f+BMX&TU4G!U6t4TXv$y=DhHb|ux1I`S|d9DRFloehDs zw&@i|x;Q3TXBlE~g!zjTl~}!lLp3gTNB-Gfpei8Q!ay^X0m~Vh9rzb!5|q7fllAq& z1k%1tW2|~QE*G|n0V5Ky#;d1WjpxSM7dh}{w}pDsF|5WBKR6LcKgQt_Gp*oUJ(TsxoNR%$B(+d$Cw2@ zBc?>v?G!k`=LpH0epNxX_IEmpc>1;qo`eDHD zMneO#o`wIfn1Bv`DqO=d0^z%#w*6W;aa`bD5Ra5nX<1c;F3S%K@4wjFEEgXX+u7H# zOsC&?3wfn;E0tbIn6h>)0W6&~A`0cwZt5J_K>4TH&K2t*by^sWo7!30m`CHK;vB%) zzUb_CKvpNa&5M)j<6;Bw1R=!@)r8XW5d>kNy8O{;NQ47Nrzl7FQtn0%QURtvB)OR_ zke!elA)|n@xW&h{=OguO$Xxig;NH#(v+)Sbf-~iISxV#7^cV*;PTJFIhANzm@_!?o zhGM3ua4=-1hGM0zm8c>Qt^kadE-6%ci7(4(fD&%L-Aw+UdE|pT1(Mwqr^jr0A1yYn zhAp_vUkS+Q9%QlEe0Lpk5kr~ZA!bAH*7yt4vt3@AeJMz{cDOi~=0#D?`03y!MJ^sj z$E{`s|4T5_Zx4k`GjdSxbjUm%BjUjSB9NxAgAA1w`qN#u>sBoqW9#JLj6*G8+Y)Yi X&dkf9X*5nBcessA+be(fZL#*RSasHT delta 226 zcmX?mfqnWWHWmg32L6pK>5P;88D%ExGnr48_H>+npp8*}@_~t7lh%b!b`X-=Y{2%P zaT2ri { .then(data => { var tagdata = data.tags[0]; $('#cfgalias').value = tagdata.alias; - if (populateSelectTag(tagdata.hwType)) { + if (populateSelectTag(tagdata.hwType, tagdata.capabilities)) { $('#cfgcontent').parentNode.style.display = "block"; $('#cfgcontent').value = tagdata.contentMode; $('#cfgcontent').dataset.json = tagdata.modecfgjson; @@ -438,13 +440,14 @@ function contentselected() { $('#cfgsave').parentNode.style.display = 'block'; } -function populateSelectTag(hwtype) { +function populateSelectTag(hwtype, capabilities) { var selectTag = $("#cfgcontent"); selectTag.innerHTML = ""; var optionsAdded = false; cardconfig.forEach(item => { + var capcheck = item.capabilities ?? 0; var hwtypeArray = item.hwtype; - if (hwtypeArray.includes(hwtype)) { + if (hwtypeArray.includes(hwtype) && (capabilities & capcheck || capcheck == 0)) { var option = document.createElement("option"); option.value = item.id; option.text = item.name; diff --git a/ESP32_AP-Flasher/include/newproto.h b/ESP32_AP-Flasher/include/newproto.h index 5d2e1ecc..59b0f2d9 100644 --- a/ESP32_AP-Flasher/include/newproto.h +++ b/ESP32_AP-Flasher/include/newproto.h @@ -5,6 +5,7 @@ extern bool checkCRC(void* p, uint8_t len); extern void processBlockRequest(struct espBlockRequest* br); extern void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin); +extern void prepareNFCReq(uint8_t* dst, const char* url); extern bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t nextCheckin); extern void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP); extern void processXferComplete(struct espXferComplete* xfc, bool local); diff --git a/ESP32_AP-Flasher/include/tag_db.h b/ESP32_AP-Flasher/include/tag_db.h index 68dd277f..3f0c1cb8 100644 --- a/ESP32_AP-Flasher/include/tag_db.h +++ b/ESP32_AP-Flasher/include/tag_db.h @@ -6,10 +6,6 @@ #pragma pack(push, 1) #pragma once -#define SOLUM_154_033 0 -#define SOLUM_29_033 1 -#define SOLUM_42_033 2 - #define WAKEUP_REASON_TIMED 0 #define WAKEUP_REASON_BOOTUP 1 #define WAKEUP_REASON_GPIO 2 diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index c7ba41c2..6ab6a076 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -53,7 +53,7 @@ void contentRunner() { uint8_t src[8]; *((uint64_t *)src) = swap64(*((uint64_t *)mac8)); - if (taginfo->RSSI && (now >= taginfo->nextupdate || taginfo->wakeupReason == WAKEUP_REASON_GPIO)) { + if (taginfo->RSSI && (now >= taginfo->nextupdate || taginfo->wakeupReason == WAKEUP_REASON_GPIO || taginfo->wakeupReason == WAKEUP_REASON_NFC)) { drawNew(src, (taginfo->wakeupReason == WAKEUP_REASON_GPIO), taginfo); taginfo->wakeupReason = 0; } @@ -241,6 +241,12 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { sendAPSegmentedData(mac, (String)buffer, 0x0000, false, (taginfo->isExternal == false)); taginfo->nextupdate = 3216153600; break; + + case 14: // NFC URL + + prepareNFCReq(mac, cfgobj["url"].as()); + taginfo->nextupdate = 3216153600; + break; } taginfo->modeConfigJson = doc.as(); @@ -299,18 +305,18 @@ void drawDate(String &filename, tagRecord *&taginfo, imgParam &imageParams) { TFT_eSprite spr = TFT_eSprite(&tft); LittleFS.begin(); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); drawString(spr, languageDays[getCurrentLanguage()][timeinfo.tm_wday], 296 / 2, 10, "fonts/calibrib62", TC_DATUM, PAL_RED); drawString(spr, String(timeinfo.tm_mday) + " " + languageMonth[getCurrentLanguage()][timeinfo.tm_mon], 296 / 2, 73, "fonts/calibrib50", TC_DATUM); - } else if (taginfo->hwType == SOLUM_154_033) { + } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); drawString(spr, languageDays[getCurrentLanguage()][timeinfo.tm_wday], 152 / 2, 10, "fonts/calibrib30", TC_DATUM); drawString(spr, String(languageMonth[getCurrentLanguage()][timeinfo.tm_mon]), 152 / 2, 120, "fonts/calibrib30", TC_DATUM); drawString(spr, String(timeinfo.tm_mday), 152 / 2, 42, "fonts/numbers2-1", TC_DATUM, PAL_RED); - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); drawString(spr, languageDays[getCurrentLanguage()][timeinfo.tm_wday], 400 / 2, 30, "fonts/calibrib62", TC_DATUM, PAL_RED); drawString(spr, String(timeinfo.tm_mday) + " " + languageMonth[getCurrentLanguage()][timeinfo.tm_mon], 400 / 2, 113, "fonts/calibrib50", TC_DATUM); @@ -349,7 +355,7 @@ void drawNumber(String &filename, int32_t count, int32_t thresholdred, tagRecord TFT_eSprite spr = TFT_eSprite(&tft); LittleFS.begin(); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); spr.setTextDatum(MC_DATUM); if (count > thresholdred) { @@ -364,7 +370,7 @@ void drawNumber(String &filename, int32_t count, int32_t thresholdred, tagRecord spr.drawString(String(count), 296 / 2, 128 / 2 + 10); spr.unloadFont(); - } else if (taginfo->hwType == SOLUM_154_033) { + } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); spr.setTextDatum(MC_DATUM); if (count > thresholdred) { @@ -379,7 +385,7 @@ void drawNumber(String &filename, int32_t count, int32_t thresholdred, tagRecord spr.drawString(String(count), 152 / 2, 152 / 2 + 7); spr.unloadFont(); - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); spr.setTextDatum(MC_DATUM); if (count > thresholdred) { @@ -420,6 +426,7 @@ void drawWeather(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgP filter["current_weather"]["windspeed"] = true; filter["current_weather"]["winddirection"] = true; filter["current_weather"]["weathercode"] = true; + filter["current_weather"]["is_day"] = true; StaticJsonDocument<1000> doc; DeserializationError error = deserializeJson(doc, http.getString(), DeserializationOption::Filter(filter)); @@ -463,9 +470,9 @@ void drawWeather(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgP "\uf01a", "\uf01a", "-", "-", "\uf064", "\uf064", "-", "-", "-", "-", "-", "-", "-", "-", "\uf01e", "\uf01d", "-", "-", "\uf01e"}; if (isday == 0) { - weatherIcons[0] = "\0uf02e"; - weatherIcons[1] = "\0uf083"; - weatherIcons[2] = "\0uf086"; + weatherIcons[0] = "\uf02e"; + weatherIcons[1] = "\uf083"; + weatherIcons[2] = "\uf086"; } TFT_eSPI tft = TFT_eSPI(); @@ -473,7 +480,7 @@ void drawWeather(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgP LittleFS.begin(); tft.setTextWrap(false, false); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); drawString(spr, cfgobj["location"], 5, 5, "fonts/bahnschrift30"); @@ -505,7 +512,7 @@ void drawWeather(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgP } spr.unloadFont(); - } else if (taginfo->hwType == SOLUM_154_033) { + } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); spr.setTextDatum(TL_DATUM); @@ -541,7 +548,7 @@ void drawWeather(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgP } spr.unloadFont(); - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); drawString(spr, cfgobj["location"], 10, 10, "fonts/bahnschrift30"); @@ -624,7 +631,7 @@ void drawForecast(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, img LittleFS.begin(); tft.setTextWrap(false, false); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); spr.setTextFont(2); @@ -670,7 +677,7 @@ void drawForecast(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, img } } - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); spr.setTextFont(2); spr.setTextColor(PAL_BLACK, PAL_WHITE); @@ -726,17 +733,17 @@ void drawIdentify(String &filename, tagRecord *&taginfo, imgParam &imageParams) TFT_eSprite spr = TFT_eSprite(&tft); LittleFS.begin(); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); drawString(spr, taginfo->alias, 10, 10, "fonts/bahnschrift20"); drawString(spr, mac62hex(taginfo->mac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); - } else if (taginfo->hwType == SOLUM_154_033) { + } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); drawString(spr, taginfo->alias, 5, 5, "fonts/bahnschrift20"); drawString(spr, mac62hex(taginfo->mac), 10, 50, "fonts/bahnschrift20", TL_DATUM, PAL_RED); - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); drawString(spr, taginfo->alias, 20, 20, "fonts/bahnschrift20"); drawString(spr, mac62hex(taginfo->mac), 20, 70, "fonts/bahnschrift20", TL_DATUM, PAL_RED); @@ -799,7 +806,7 @@ bool getRssFeed(String &filename, String URL, String title, tagRecord *&taginfo, U8g2_for_TFT_eSPI u8f; u8f.begin(spr); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); if (title == "" || title == "null") title = "RSS feed"; drawString(spr, title, 5, 3, "fonts/bahnschrift20", TL_DATUM, PAL_RED); @@ -823,7 +830,7 @@ bool getRssFeed(String &filename, String URL, String title, tagRecord *&taginfo, u8f.setCursor(5, 34 + i * 13); u8f.print(reader.itemData[i]); } - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); if (title == "" || title == "null") title = "RSS feed"; drawString(spr, title, 5, 5, "fonts/bahnschrift20", TL_DATUM, PAL_RED); @@ -905,7 +912,7 @@ bool getCalFeed(String &filename, String URL, String title, tagRecord *&taginfo, U8g2_for_TFT_eSPI u8f; u8f.begin(spr); - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); if (title == "" || title == "null") title = "Calendar"; @@ -941,7 +948,7 @@ bool getCalFeed(String &filename, String URL, String title, tagRecord *&taginfo, u8f.setCursor(50, 32 + i * 15); u8f.print(eventtitle); } - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); if (title == "" || title == "null") title = "Calendar"; @@ -998,13 +1005,13 @@ void drawQR(String &filename, String qrcontent, String title, tagRecord *&taginf int size = qrcode.size; int xpos = 0, ypos = 0, dotsize = 1; - if (taginfo->hwType == SOLUM_29_033) { + if (taginfo->hwType == SOLUM_29_SSD1619 || taginfo->hwType == SOLUM_29_UC8151) { initSprite(spr, 296, 128); drawString(spr, title, 10, 5, "fonts/bahnschrift20"); dotsize = int((128 - 25) / size); xpos = 149 - dotsize * size / 2; ypos = 25; - } else if (taginfo->hwType == SOLUM_154_033) { + } else if (taginfo->hwType == SOLUM_154_SSD1619) { initSprite(spr, 152, 152); spr.setTextFont(2); spr.setTextColor(PAL_BLACK, PAL_WHITE); @@ -1012,7 +1019,7 @@ void drawQR(String &filename, String qrcontent, String title, tagRecord *&taginf dotsize = int((152 - 20) / size); xpos = 76 - dotsize * size / 2; ypos = 20; - } else if (taginfo->hwType == SOLUM_42_033) { + } else if (taginfo->hwType == SOLUM_42_SSD1619) { initSprite(spr, 400, 300); drawString(spr, title, 10, 10, "fonts/bahnschrift20"); dotsize = int((300 - 30) / size); diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 94b1b64e..325ef0ae 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -85,6 +85,54 @@ void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin) { } } +void prepareNFCReq(uint8_t* dst, const char* url) { + uint8_t src[8]; + *((uint64_t*)src) = swap64(*((uint64_t*)dst)); + uint8_t mac[6]; + memcpy(mac, src + 2, sizeof(mac)); + + tagRecord* taginfo = nullptr; + taginfo = tagRecord::findByMAC(mac); + if (taginfo == nullptr) { + wsErr("Tag not found, this shouldn't happen."); + return; + } + + clearPending(taginfo); + size_t len = strlen(url); + taginfo->data = new uint8_t[len + 8]; + + // TLV + taginfo->data[0] = 0x03; // NDEF message (TLV type) + taginfo->data[1] = 4 + len + 1; + + // ndef record + taginfo->data[2] = 0xD1; + taginfo->data[3] = 0x01; // well known record type + taginfo->data[4] = len + 1; // payload length + taginfo->data[5] = 0x55; // payload type (URI record) + taginfo->data[6] = 0x00; // URI identifier code (no prepending) + + memcpy(taginfo->data + 7, reinterpret_cast(url), len); + len = 7 + len; + taginfo->data[len] = 0xFE; + len = 1 + len; + + taginfo->pending = true; + taginfo->len = len; + + struct pendingData pending = {0}; + memcpy(pending.targetMac, dst, 8); + pending.availdatainfo.dataSize = len; + pending.availdatainfo.dataType = DATATYPE_NFC_RAW_CONTENT; + pending.availdatainfo.nextCheckIn = 0; + pending.availdatainfo.dataVer = millis(); + pending.attemptsLeft = 10; + + sendDataAvail(&pending); + wsSendTaginfo(mac); +} + bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t nextCheckin) { if (nextCheckin > MIN_RESPONSE_TIME) nextCheckin = MIN_RESPONSE_TIME; if (wsClientCount()) nextCheckin=0; @@ -141,7 +189,7 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t time_t now; time(&now); time_t last_midnight = now - now % (24 * 60 * 60) + 3 * 3600; // somewhere in the middle of the night - if (taginfo->lastfullupdate < last_midnight) { + if (taginfo->lastfullupdate < last_midnight || taginfo->hwType == SOLUM_29_UC8151) { lut = EPD_LUT_DEFAULT; // full update once a day taginfo->lastfullupdate = now; } @@ -164,7 +212,6 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t clearPending(taginfo); taginfo->pending = true; memcpy(taginfo->md5pending, md5bytes, sizeof(md5bytes)); - } else { wsLog("firmware upload pending"); taginfo->filename = *filename; diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index 9985eadc..da97901a 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -218,7 +218,6 @@ uint8_t getTagCount() { void clearPending(tagRecord* taginfo) { if (taginfo->data != nullptr) { free(taginfo->data); - Serial.println("free taginfo->data"); taginfo->data = nullptr; } taginfo->pending = false;