From 96e8fe866091bc52675d5e1edbf92868ae185bd6 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Sun, 7 Jan 2024 19:32:56 +0100 Subject: [PATCH] geocoding and other small improvements - separated content types for 'not configured', 'static image', 'uploaded image' and 'home assistant' (which is all the same internally, but it confused the users to always see 'static image' - changed channel reported by the AP to the ieee801.15.4 channel instead of the WiFi channel - added geocoding to the 'location' fields (e.g. weather forecast). Now you can choose an ambiguous location from a dropdown. - added 'firmware update rejected' wakeup reason --- ESP32_AP-Flasher/data/tagtypes/00.json | 2 +- ESP32_AP-Flasher/data/tagtypes/01.json | 2 +- ESP32_AP-Flasher/data/tagtypes/02.json | 2 +- ESP32_AP-Flasher/data/tagtypes/05.json | 2 +- ESP32_AP-Flasher/data/tagtypes/11.json | 2 +- ESP32_AP-Flasher/data/tagtypes/21.json | 2 +- ESP32_AP-Flasher/data/tagtypes/2E.json | 2 +- ESP32_AP-Flasher/data/tagtypes/2F.json | 2 +- ESP32_AP-Flasher/data/tagtypes/30.json | 2 +- ESP32_AP-Flasher/data/tagtypes/31.json | 2 +- ESP32_AP-Flasher/data/tagtypes/33.json | 2 +- ESP32_AP-Flasher/data/tagtypes/34.json | 2 +- ESP32_AP-Flasher/data/tagtypes/35.json | 2 +- ESP32_AP-Flasher/data/tagtypes/36.json | 2 +- ESP32_AP-Flasher/data/tagtypes/60.json | 2 +- ESP32_AP-Flasher/data/tagtypes/61.json | 2 +- ESP32_AP-Flasher/data/tagtypes/62.json | 2 +- ESP32_AP-Flasher/data/tagtypes/E0.json | 2 +- .../data/www/content_cards.json.gz | Bin 3223 -> 3330 bytes ESP32_AP-Flasher/data/www/index.html.gz | Bin 5092 -> 5125 bytes ESP32_AP-Flasher/data/www/main.css.gz | Bin 3347 -> 3423 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 11955 -> 12918 bytes ESP32_AP-Flasher/data/www/painter.js.gz | Bin 2946 -> 2957 bytes ESP32_AP-Flasher/include/system.h | 1 + ESP32_AP-Flasher/src/contentmanager.cpp | 6 +- ESP32_AP-Flasher/src/ips_display.cpp | 2 +- ESP32_AP-Flasher/src/newproto.cpp | 2 + ESP32_AP-Flasher/src/web.cpp | 6 +- ESP32_AP-Flasher/wwwroot/content_cards.json | 145 +++++++++++------- ESP32_AP-Flasher/wwwroot/main.css | 16 ++ ESP32_AP-Flasher/wwwroot/main.js | 84 +++++++++- ESP32_AP-Flasher/wwwroot/painter.js | 1 + 32 files changed, 220 insertions(+), 79 deletions(-) diff --git a/ESP32_AP-Flasher/data/tagtypes/00.json b/ESP32_AP-Flasher/data/tagtypes/00.json index af150aac..f6e0f49c 100644 --- a/ESP32_AP-Flasher/data/tagtypes/00.json +++ b/ESP32_AP-Flasher/data/tagtypes/00.json @@ -13,7 +13,7 @@ }, "shortlut": 2, "options": ["button", "customlut"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 10, 14, 15, 17, 18, 19, 20, 21], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 10, 14, 15, 17, 18, 19, 20, 21], "template": { "1": { "weekday": [ 76, 9, "fonts/calibrib30" ], diff --git a/ESP32_AP-Flasher/data/tagtypes/01.json b/ESP32_AP-Flasher/data/tagtypes/01.json index 9773536d..31aec876 100644 --- a/ESP32_AP-Flasher/data/tagtypes/01.json +++ b/ESP32_AP-Flasher/data/tagtypes/01.json @@ -13,7 +13,7 @@ }, "shortlut": 2, "options": ["button", "customlut"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21 ], "template": { "1": { "weekday": [ 148, -3, "Signika-SB.ttf", 60 ], diff --git a/ESP32_AP-Flasher/data/tagtypes/02.json b/ESP32_AP-Flasher/data/tagtypes/02.json index 361416eb..90eeda1c 100644 --- a/ESP32_AP-Flasher/data/tagtypes/02.json +++ b/ESP32_AP-Flasher/data/tagtypes/02.json @@ -13,7 +13,7 @@ }, "shortlut": 1, "options": ["button"], - "contentids": [ 0, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], "template": { "1": { "weekday": [ 200, 0, "Signika-SB.ttf", 70 ], diff --git a/ESP32_AP-Flasher/data/tagtypes/05.json b/ESP32_AP-Flasher/data/tagtypes/05.json index c86bfca5..45681a9a 100644 --- a/ESP32_AP-Flasher/data/tagtypes/05.json +++ b/ESP32_AP-Flasher/data/tagtypes/05.json @@ -13,7 +13,7 @@ }, "shortlut": 1, "options": [], - "contentids": [ 0, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], "template": { "1": { "weekday": [ 320, -5, "Signika-SB.ttf", 100 ], diff --git a/ESP32_AP-Flasher/data/tagtypes/11.json b/ESP32_AP-Flasher/data/tagtypes/11.json index f0a88ef2..1266a8f4 100644 --- a/ESP32_AP-Flasher/data/tagtypes/11.json +++ b/ESP32_AP-Flasher/data/tagtypes/11.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["button"], - "contentids": [ 0, 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], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/21.json b/ESP32_AP-Flasher/data/tagtypes/21.json index 95202a64..f181d0cd 100644 --- a/ESP32_AP-Flasher/data/tagtypes/21.json +++ b/ESP32_AP-Flasher/data/tagtypes/21.json @@ -11,6 +11,6 @@ }, "shortlut": 0, "options": ["button", "customlut"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21 ], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/2E.json b/ESP32_AP-Flasher/data/tagtypes/2E.json index dea87c20..39466d08 100644 --- a/ESP32_AP-Flasher/data/tagtypes/2E.json +++ b/ESP32_AP-Flasher/data/tagtypes/2E.json @@ -13,7 +13,7 @@ }, "shortlut": 0, "options": ["button"], - "contentids": [ 0, 1, 5, 8, 9, 7, 19, 10, 11 ], + "contentids": [ 22, 23, 1, 5, 8, 9, 7, 19, 10, 11 ], "usetemplate": 1, "template": { "1": { diff --git a/ESP32_AP-Flasher/data/tagtypes/2F.json b/ESP32_AP-Flasher/data/tagtypes/2F.json index 52e72bdb..4db62b9a 100644 --- a/ESP32_AP-Flasher/data/tagtypes/2F.json +++ b/ESP32_AP-Flasher/data/tagtypes/2F.json @@ -13,7 +13,7 @@ }, "shortlut": 0, "options": ["button"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 11, 17, 18, 19, 20], "usetemplate": 1, "template": { "1": { diff --git a/ESP32_AP-Flasher/data/tagtypes/30.json b/ESP32_AP-Flasher/data/tagtypes/30.json index 97bf153e..24117480 100644 --- a/ESP32_AP-Flasher/data/tagtypes/30.json +++ b/ESP32_AP-Flasher/data/tagtypes/30.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["button"], - "contentids": [ 0, 1, 2, 3, 4, 8, 7, 19, 10, 21 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 8, 7, 19, 10, 21 ], "usetemplate": 0 } \ No newline at end of file diff --git a/ESP32_AP-Flasher/data/tagtypes/31.json b/ESP32_AP-Flasher/data/tagtypes/31.json index 0ce9c617..cfa83aaa 100644 --- a/ESP32_AP-Flasher/data/tagtypes/31.json +++ b/ESP32_AP-Flasher/data/tagtypes/31.json @@ -13,7 +13,7 @@ }, "shortlut": 0, "options": ["button", "led"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20], "template": { "1": { "weekday": [148, 5, "Signika-SB.ttf", 60], diff --git a/ESP32_AP-Flasher/data/tagtypes/33.json b/ESP32_AP-Flasher/data/tagtypes/33.json index c897e1f9..2d9289c9 100644 --- a/ESP32_AP-Flasher/data/tagtypes/33.json +++ b/ESP32_AP-Flasher/data/tagtypes/33.json @@ -13,7 +13,7 @@ }, "shortlut": 0, "options": ["button", "led"], - "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20], "usetemplate": 1, "template": { "1": { diff --git a/ESP32_AP-Flasher/data/tagtypes/34.json b/ESP32_AP-Flasher/data/tagtypes/34.json index e9d570bd..62a5b72f 100644 --- a/ESP32_AP-Flasher/data/tagtypes/34.json +++ b/ESP32_AP-Flasher/data/tagtypes/34.json @@ -13,6 +13,6 @@ }, "shortlut": 1, "options": ["led"], - "contentids": [ 0, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ], + "contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ], "usetemplate": 2 } \ No newline at end of file diff --git a/ESP32_AP-Flasher/data/tagtypes/35.json b/ESP32_AP-Flasher/data/tagtypes/35.json index a7135c6a..a1dafd5a 100644 --- a/ESP32_AP-Flasher/data/tagtypes/35.json +++ b/ESP32_AP-Flasher/data/tagtypes/35.json @@ -11,7 +11,7 @@ "red": [ 255, 0, 0 ], "gray": [ 150, 150, 150 ] }, - "contentids": [ 0, 1, 4, 5, 8, 9, 7, 19, 10, 11 ], + "contentids": [ 22, 23, 1, 4, 5, 8, 9, 7, 19, 10, 11 ], "usetemplate": 1, "template": { "1": { diff --git a/ESP32_AP-Flasher/data/tagtypes/36.json b/ESP32_AP-Flasher/data/tagtypes/36.json index 64b9d3c0..33c98b3b 100644 --- a/ESP32_AP-Flasher/data/tagtypes/36.json +++ b/ESP32_AP-Flasher/data/tagtypes/36.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["button", "led"], - "contentids": [ 0, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], + "contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/60.json b/ESP32_AP-Flasher/data/tagtypes/60.json index be478c7f..4c9a732d 100644 --- a/ESP32_AP-Flasher/data/tagtypes/60.json +++ b/ESP32_AP-Flasher/data/tagtypes/60.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["led"], - "contentids": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/61.json b/ESP32_AP-Flasher/data/tagtypes/61.json index 892bebe8..61a47369 100644 --- a/ESP32_AP-Flasher/data/tagtypes/61.json +++ b/ESP32_AP-Flasher/data/tagtypes/61.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["led"], - "contentids": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/62.json b/ESP32_AP-Flasher/data/tagtypes/62.json index 7ef160d7..a966c0a1 100644 --- a/ESP32_AP-Flasher/data/tagtypes/62.json +++ b/ESP32_AP-Flasher/data/tagtypes/62.json @@ -13,6 +13,6 @@ }, "shortlut": 0, "options": ["led"], - "contentids": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], + "contentids": [ 22, 23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 ], "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/E0.json b/ESP32_AP-Flasher/data/tagtypes/E0.json index 9f1a3f37..dc6f8d24 100644 --- a/ESP32_AP-Flasher/data/tagtypes/E0.json +++ b/ESP32_AP-Flasher/data/tagtypes/E0.json @@ -13,7 +13,7 @@ }, "shortlut": 0, "options": [], - "contentids": [ 0, 1, 2, 3, 4, 8, 7, 19, 10, 11, 21 ], + "contentids": [ 22, 1, 2, 3, 4, 8, 7, 19, 10, 11, 21 ], "usetemplate": 1, "template": { "21": [ diff --git a/ESP32_AP-Flasher/data/www/content_cards.json.gz b/ESP32_AP-Flasher/data/www/content_cards.json.gz index e9760ed8b8566eeb8ed3ea566e847b1a5daeab41..41cbe7c39df2ed0ad341d471c8b903de6f7870d9 100644 GIT binary patch literal 3330 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 J<1SV^005w!BbWdH diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index 0cc6ebe50d2a59048bb7ecb129fd81f60a758afb..099d1245562d849b1d25c5fb854e201db2451fe8 100644 GIT binary patch delta 5004 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 diff --git a/ESP32_AP-Flasher/data/www/main.css.gz b/ESP32_AP-Flasher/data/www/main.css.gz index 7f23b3d05c35b5babad9abb7939b86adca336933..ccb13a2be9340125789f02add3183bec93fc3fb9 100644 GIT binary patch delta 3415 zcmV-d4XE;y8s8d_DSzXj#qPE!`qsC;6!Sn!l+8vGRY^|bDdxZT@O}|#CyN3_$CJ#6 zA`i)P`Oby(=j7iXKg=4`A4t1PvPXF6P+5}pAfNWMFL5s)YBG%JFrI6ij^_^Vl9slZ zy`ZPDCau*_(RNHfYk%TB8v5-ZZ!-Ox}v z9(M^kjntmcddY{Pb|k1KXuu_O`~LC6#}CJ`sqa31*wgaN8FG{>UuM~ls*ipt=#g)* z-DTdH`76|r`n*g2itA@Qk^EFoZH`0(w6vjmwfs1g^QIAWF!=%JiywX z&a7>u9Y|Je;f0ipdG?N5^!&$?Jnt&fgWQWFsZ0M^Fr>z>DJ&WIhAec9o6Kj22%7*E-UXEnM7UiTydt7tcMq9hrWPc+FJma3RzfM8Q2iWk4Uzyg8 zBW(+L^DBMnu*KG3;ThW^Wi*@wxWC@ z;3P$$3q4Z_HuSq(%%Y|T>YA!vzfz!$WFOxxlYKiH1*O0fAPy2bk`i7$x_X>1Hkk7! z#PH+F=6^z}wyMNsn}a07hyDCH8PR@7KL5;j0RM;Ww<7|j?=PsuvNt5yATW}rA*SwC z&OVQxjEp8p@KUHW74>ZF!6c>O1;!%q~<%X+vDch7>(to9ESo(!%)^oF|K}TFsC{9Uu74rZ` z2U?R-t%8&I_`w*VRQNoTGi!3BQQhZ9+F;n4 z57YUY_hT|*I#~-YYg2PlLv>sCF(&av^>DLc>dZkMT z%PD!_=P|%n5Z5CJ4EpB@JXCc~rGkRP0w#kJ;qe7?yY1b_C@ zqfXKcvc+)p?M&H&lvx*-Gxxw5BL$d@wB2d^2TKM1@B@RbAHF&>Ykwem?@u7f)`eb| z*^1<@2lGj3Tc59Cni#ZrL46BL^q4IP&vdkq!HTlS2t~mAs>lr3s_X^Ou=JFHh}2_-YBqXH!XhMK{KNx>rsp{#W%#%jj+0g3KV9R?)f#CG5CYh#5CfRNZyw<$mb zk=H{Ux0Q!N=`xn0DCuzTUE+fFNFb+op3=Oqz$& zz9FKwB|Fr07=eo~@FeW-QGZEJgNPUSia0faSQ3{6CNXqk()FQfZRcNxoMC~rJh3Ei zak}i})d<#>xdyZ(s(X=1g@Em*P)0%&^nt7x>*D_UIunkI32vLGL9Q+ zgp1Zeq$#uF!E!YBS)?GCdw#^qHOg$Cp$D50C3vV&up;1i9qufh3SLbIydQb=sQ#Zj zR%E8t0ia(8S3vbeELfpj9x6f0>?;`5X*l1+LI|&QWx)o_<-AJlaZw|?ramO=X zZa@qROhv*@^0`-AWuA7-fh3qRP?D+@%=_5HIx|$!Q$9J2=`oNY&se!>T~fODl7m$s zsNBe(hqwplf8x2hN^(ZA z3pVdNfLK*sv3jd!@T_8Mw*KhBjEh~w-seTeK5sfRn{Uf4-r~R^)g<#;!Xvn-`p;mIbBo_bq?Y=eq`8x%0*odM??Gm4fHH{LhS)O{RST*srI zSaKbVJ%1R!m>0ONNjH!o{Vrq!{;f2W~UNnpYgepw)THtbV#KjZQkHYWAxaX2!v5!y3X_LfQ zlY3~hxm+qy+wb*>oJL=?=Mv@y*~{YwWgt#H&4062K~iD~Dcp*ka`3*xpTYy+;m!RW zVEy_o$yeEJEEEfe1wjE$GU2eV78{TiXuW~SU}rHav6$&L&R|gVB~%mhS>SOf5=R8L z%U67=7Y%p^bihL>ft&QHi6?N&-3B^?n!UIVBW+Q`;05#Tndb7O%7IJB_?p3e3&12^ z1Am83{6>TOek2VusOr=ff{1%SC4__fo(g>pL^Ta?3RK5JUA-sV-|B3t4Aw zs&1ihJp~2~MNh>hos+R#oB_#wgiZw%E`NVludh^5amGGQ`JqFw?ogR|sXh9|>>*%k z5&Liobn1Bi&E@CGYTr{pT$DZSjv#@WXYk<&saMyF-VhDun~fh2>S6@Pfd;pyYc;;B zx;0(np+{%;cAz0VxrH{(q62G`SaT`QTwWf3SrA&~)I}vOLg+8{tpq!=WWMAbIlQ!?|%n-dxsfqTA?n8D=nI8|pY;pJ???GDX}(AjV?xjJdNG7#`?p z`uo?^meC=i7+}YX%qd>2g+u|_rCwgQ?EoeFwB~e9#?thXmcLs+5 zb!A^Kz2;d$t_)~o< zNQn|j>(gEG=|oZ;CV#qCm`P&SQdJ=@cyz@NNpIt^sUu4fn)8R@@ft4_F2`bf1#=B9 z36k*k3xBw=O+eT)#0a(|K~pbuC*^HL~iT`+k?Udd4ENYzKj^1nRcbJauUHzX<}%zljJ0w#^8Cur+BJpQU4Y2mpO)Ru{((GNcs&KUW$vWf t5o_cI>SW~AFAoVq;Kj+{b3B}61W)^dwQ4t{SXx~C{vTQ}79#jI006S2rnmqA delta 3339 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 V>!uV-ON!tB13-zwV+40K0068td%6Gs diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index a492598ee34d81f5ef833e039da6ef35cd801e6b..93c2b1a244aafe21bfec13f2d4e87ec0c77d93ca 100644 GIT binary patch literal 12918 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 literal 11955 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 F0064%IQjqp diff --git a/ESP32_AP-Flasher/data/www/painter.js.gz b/ESP32_AP-Flasher/data/www/painter.js.gz index fa1a72c2bc22dce522219947307a11f9613bd8f7..c7ba5c3c5c69cde32ab283baefa42ba7b066782a 100644 GIT binary patch delta 2736 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 delta 2725 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 { - case 0: // Image + case 0: // Not configured + case 22: // Static image + case 23: // Static image (advanced) + case 24: // External image + case 25: // Home Assistant { String configFilename = cfgobj["filename"].as(); if (!util::isEmptyOrNull(configFilename)) { diff --git a/ESP32_AP-Flasher/src/ips_display.cpp b/ESP32_AP-Flasher/src/ips_display.cpp index 39cd14df..92fb1f6f 100644 --- a/ESP32_AP-Flasher/src/ips_display.cpp +++ b/ESP32_AP-Flasher/src/ips_display.cpp @@ -63,7 +63,7 @@ void sendAvail(uint8_t wakeupReason) { WiFi.macAddress(mac); memcpy(&eadr.src, mac, 6); eadr.adr.lastPacketRSSI = WiFi.RSSI(); - eadr.adr.currentChannel = WiFi.channel(); + eadr.adr.currentChannel = config.channel; eadr.adr.hwType = 0xE0; eadr.adr.wakeupReason = wakeupReason; eadr.adr.capabilities = 0; diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 178e0c04..c8c76f04 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -513,6 +513,8 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP reason = "Network scan"; else if (eadr->adr.wakeupReason == WAKEUP_REASON_WDT_RESET) reason = "Watchdog reset"; + else if (eadr->adr.wakeupReason == WAKEUP_REASON_FAILED_OTA_FW) + reason = "Firmware update rejected"; sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X %s", eadr->src[7], eadr->src[6], eadr->src[5], eadr->src[4], eadr->src[3], eadr->src[2], eadr->src[1], eadr->src[0], reason); logLine(buffer); } diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 66f8b801..66672aa9 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -734,7 +734,11 @@ void doImageUpload(AsyncWebServerRequest *request, String filename, size_t index } } taginfo->modeConfigJson = "{\"filename\":\"" + dst + ".jpg\",\"timetolive\":\"" + String(ttl) + "\",\"dither\":\"" + String(dither) + "\",\"delete\":\"1\", \"preload\":\"" + String(preload) + "\", \"preload_lut\":\"" + String(preloadlut) + "\", \"preload_type\":\"" + String(preloadtype) + "\"}"; - taginfo->contentMode = 0; + if (request->hasParam("contentmode", true)) { + taginfo->contentMode = request->getParam("contentmode", true)->value().toInt(); + } else { + taginfo->contentMode = 24; + } taginfo->nextupdate = 0; wsSendTaginfo(mac, SYNC_USERCFG); request->send(200, "text/plain", "Ok, saved"); diff --git a/ESP32_AP-Flasher/wwwroot/content_cards.json b/ESP32_AP-Flasher/wwwroot/content_cards.json index b0aaed83..e9c7e184 100644 --- a/ESP32_AP-Flasher/wwwroot/content_cards.json +++ b/ESP32_AP-Flasher/wwwroot/content_cards.json @@ -1,8 +1,14 @@ [ { "id": 0, + "name": "", + "desc": "Not configured", + "param": [] + }, + { + "id": 22, "name": "Static image", - "desc": "Shows a static image, from file system, painter or external source. Make sure to resize the image to the correct resolution.", + "desc": "Shows a static image, from file system or painter. Make sure to resize the image to the correct resolution.", "param": [ { "key": "filename", @@ -10,12 +16,6 @@ "desc": "Local filename on the littlefs drive", "type": "jpgfile" }, - { - "key": "timetolive", - "name": "TimeToLive", - "desc": "Amount (minutes) that this image will stay valid. The tag might not respond meanwhile", - "type": "int" - }, { "key": "dither", "name": "Dithering", @@ -25,50 +25,21 @@ "0": "off", "1": "on" } - }, - { - "key": "preload", - "name": "Display or Preload", - "desc": "Display now or preload for later use", - "type": "select", - "options": { - "0": "Display", - "1": "Preload" - } - }, - { - "key": "preload_lut", - "name": "Preload LUT", - "desc": "Triggered preload images will display with this LUT", - "type": "select", - "options": { - "0": "Default", - "1": "No Repeats", - "2": "Fast No Reds", - "3": "Fast" - } - }, - { - "key": "preload_type", - "name": "Preload Image type", - "desc": "Preload type to send to tag, for later recall, or special use", - "type": "select", - "options": { - "0": "Normal", - "1": "UI: Splash Screen", - "2": "UI: Lost connection", - "3": "UI: AP Found", - "4": "UI: No AP Found", - "5": "UI: Long Term Sleep", - "15": "Slideshow image", - "16": "Wake: Button 1", - "17": "Wake: Button 2", - "29": "Wake: GPIO", - "30": "Wake: NFC" - } } ] }, + { + "id": 24, + "name": "External image", + "desc": "Image from external source", + "param": [ ] + }, + { + "id": 25, + "name": "Home Assistant", + "desc": "Image from Home Assistant", + "param": [ ] + }, { "id": 1, "name": "Current date", @@ -116,13 +87,13 @@ { "id": 4, "name": "Current weather", - "desc": "Current weather. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, you can alter those manually.", + "desc": "Current weather. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, choose from the drop down list.", "param": [ { "key": "location", "name": "Location", "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title", - "type": "text" + "type": "geoselect" }, { "key": "units", @@ -163,7 +134,7 @@ "key": "location", "name": "Location", "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title", - "type": "text" + "type": "geoselect" }, { "key": "units", @@ -204,7 +175,7 @@ "key": "location", "name": "Location", "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title", - "type": "text" + "type": "geoselect" }, { "key": "#lat", @@ -525,6 +496,76 @@ } ] }, + { + "id": 23, + "name": "Image preload", + "desc": "Preloads an image to be shown at different situations. Make sure to resize the image to the correct resolution.", + "param": [ + { + "key": "filename", + "name": "Filename", + "desc": "Local filename on the littlefs drive", + "type": "jpgfile" + }, + { + "key": "timetolive", + "name": "TimeToLive", + "desc": "Amount (minutes) that this image will stay valid. The tag might not respond meanwhile", + "type": "int" + }, + { + "key": "dither", + "name": "Dithering", + "desc": "Turn halftone dithering on or off. Turn it on when displaying photos. For texts, you better leave if off", + "type": "select", + "options": { + "0": "off", + "1": "on" + } + }, + { + "key": "preload", + "name": "Display or Preload", + "desc": "Display now or preload for later use", + "type": "select", + "options": { + "0": "Display", + "1": "Preload" + } + }, + { + "key": "preload_lut", + "name": "Preload LUT", + "desc": "Triggered preload images will display with this LUT", + "type": "select", + "options": { + "0": "Default", + "1": "No Repeats", + "2": "Fast No Reds", + "3": "Fast" + } + }, + { + "key": "preload_type", + "name": "Preload Image type", + "desc": "Preload type to send to tag, for later recall, or special use", + "type": "select", + "options": { + "0": "Normal", + "1": "UI: Splash Screen", + "2": "UI: Lost connection", + "3": "UI: AP Found", + "4": "UI: No AP Found", + "5": "UI: Long Term Sleep", + "15": "Slideshow image", + "16": "Wake: Button 1", + "17": "Wake: Button 2", + "29": "Wake: GPIO", + "30": "Wake: NFC" + } + } + ] + }, { "id": 21, "name": "Access point info", diff --git a/ESP32_AP-Flasher/wwwroot/main.css b/ESP32_AP-Flasher/wwwroot/main.css index fc3bd1d5..a9a12dd4 100644 --- a/ESP32_AP-Flasher/wwwroot/main.css +++ b/ESP32_AP-Flasher/wwwroot/main.css @@ -675,6 +675,22 @@ ul.messages li.new { color: white; } +#georesults { + position: absolute; + background: white; + cursor: pointer; + width: 240px; + max-height: 115px; + overflow-y: scroll; + padding: 0px 2px 0px 2px; + & div { + display:flex; + } + & div:hover { + background-color: #e0e0e0; + } +} + #paintbutton { padding: 1px 3px; border: 1px solid black; diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index d221946b..04d61148 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -6,6 +6,7 @@ const WAKEUP_REASON_GPIO = 2; const WAKEUP_REASON_NFC = 3; const WAKEUP_REASON_BUTTON1 = 4; const WAKEUP_REASON_BUTTON2 = 5; +const WAKEUP_REASON_FAILED_OTA_FW = 0xE0; const WAKEUP_REASON_FIRSTBOOT = 0xFC; const WAKEUP_REASON_NETWORK_SCAN = 0xFD; const WAKEUP_REASON_WDT_RESET = 0xFE; @@ -326,6 +327,10 @@ function processTags(tagArray) { $('#tag' + tagmac + ' .nextcheckin').innerHTML = "Watchdog reset!" $('#tag' + tagmac).style.background = "#d0a0a0"; break; + case WAKEUP_REASON_FAILED_OTA_FW: + $('#tag' + tagmac + ' .nextcheckin').innerHTML = "Firmware update rejected!" + $('#tag' + tagmac).style.background = "#f0a0a0"; + break; } $('#tag' + tagmac + ' .pendingicon').style.display = (element.pending ? 'inline-block' : 'none'); div.classList.add("tagflash"); @@ -482,8 +487,8 @@ $('#cfgsave').onclick = function() { if (contentMode) { extraoptions?.forEach(element => { - if ($('#opt' + element.key)) { - obj[element.key] = $('#opt' + element.key).value; + if (document.getElementById('opt' + element.key)) { + obj[element.key] = document.getElementById('opt' + element.key).value; } }); formData.append("contentmode", contentMode); @@ -614,9 +619,6 @@ $('#cfgautoupdate').onclick = async function() { else showMessage('Error: auto update failed'); formData.append("contentmode", 5); formData.append("modecfgjson", JSON.stringify(obj)); - formData.append("rotate", $('#cfgrotate').value); - formData.append("lut", $('#cfglut').value); - formData.append("invert", $('#cfginvert').value); fetch("/save_cfg", { method: "POST", body: formData @@ -786,7 +788,7 @@ function contentselected() { if (contentDef) { $('#customoptions').innerHTML = "

" + contentDef?.desc + "

" } - $('#paintbutton').style.display = (contentMode == 0 ? 'inline-block' : 'none'); + $('#paintbutton').style.display = (contentMode == 22 || contentMode == 23 ? 'inline-block' : 'none'); let extraoptions = contentDef?.param ?? null; extraoptions?.forEach(element => { let label = document.createElement("label"); @@ -849,6 +851,11 @@ function contentselected() { input.appendChild(optionElement); } break; + case 'geoselect': + input.type = "text"; + input.classList.add("geoselect"); + input.setAttribute("autocomplete", "off"); + break; } input.id = 'opt' + element.key; input.title = element.desc; @@ -856,6 +863,12 @@ function contentselected() { let p = document.createElement("p"); p.appendChild(label); p.appendChild(input); + if (element.type == 'geoselect') { + input.addEventListener('input', debounce(searchLocations, 300)); + const resultsContainer = document.createElement('div'); + resultsContainer.id = 'georesults'; + p.appendChild(resultsContainer); + } $('#customoptions').appendChild(p); }); } @@ -1469,3 +1482,62 @@ function setFilterAndShow(filter) { GroupSortFilter(); $(`[data-target='tagtab']`).click(); } + +// geocoding typeahead + +async function searchLocations() { + const query = $(".geoselect").value.trim(); + document.getElementById('opt#lat').value = ''; + document.getElementById('opt#lon').value = ''; + if (document.getElementById('opt#tz')) document.getElementById('opt#tz').value = ''; + + if (query.length === 0) { + $('#georesults').innerHTML = ''; + return; + } + + try { + const response = await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${query}&count=10&language=en&format=json`); + const data = await response.json(); + displayResults(data.results); + } catch (error) { + console.error('Error fetching data:', error); + } +} + +function displayResults(results) { + $('#georesults').innerHTML = ''; + $('#georesults').style.top = $(".geoselect").offsetTop + $(".geoselect").offsetHeight + "px"; + $('#georesults').style.left = $(".geoselect").offsetLeft + 'px'; + // $('#georesults').style.width = $(".geoselect").offsetWidth + 'px'; + if (results) { + results.forEach(result => { + const option = document.createElement('div'); + option.textContent = result.name + ', ' + result.admin1 + ', ' + result.country ; + option.addEventListener('click', () => selectLocation(result)); + $('#georesults').appendChild(option); + }); + } +} + +function selectLocation(location) { + $(".geoselect").value = location.name; + document.getElementById('opt#lat').value = location.latitude; + document.getElementById('opt#lon').value = location.longitude; + if (document.getElementById('opt#tz')) document.getElementById('opt#tz').value = location.timezone; + $('#georesults').innerHTML = ''; + console.log('Selected location:', location); +} + +function debounce(func, delay) { + let timeoutId; + return function () { + const context = this; + const args = arguments; + + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + func.apply(context, args); + }, delay); + }; +} \ No newline at end of file diff --git a/ESP32_AP-Flasher/wwwroot/painter.js b/ESP32_AP-Flasher/wwwroot/painter.js index 7cf83afd..aa904c85 100644 --- a/ESP32_AP-Flasher/wwwroot/painter.js +++ b/ESP32_AP-Flasher/wwwroot/painter.js @@ -100,6 +100,7 @@ function startPainter(mac, width, height) { const formData = new FormData(); formData.append('mac', mac); formData.append('dither', '0'); + formData.append('contentmode', '22'); formData.append('file', binaryImage, 'image.jpg'); const xhr = new XMLHttpRequest(); xhr.open('POST', '/imgupload');