From b4836e81f33deeff846a9f8f4dd1d042b4fb5b63 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Sun, 4 Feb 2024 20:30:52 +0100 Subject: [PATCH] tag flasher / timestamp content / bugfixes (#217) - added webinterface for tag flasher - added tcp transport for communicating with tag flasher (OTG USB also still works) - added content 'timestamp', makes use of preloaded images and buttons on the 2.9" M3 - webinterface is now aware of C6 and flasher capabilities - AP can run without ieee801.15.4 radio (i.e. flasher only) by shorting FLASHER_AP_TXD and FLASHER_AP_RXD - added tcp transport option to OEPL-Flasher.py (serial also still works) - added new environment OpenEPaperLink_Mini_AP_v4 - lots of finetuning and bug fixes --- .github/workflows/build-test.yml | 8 +- .github/workflows/release.yml | 36 +- ESP32_AP-Flasher/data/tagtypes/33.json | 2 +- ESP32_AP-Flasher/data/tagtypes/E1.json | 29 + .../data/www/content_cards.json.gz | Bin 3919 -> 4357 bytes ESP32_AP-Flasher/data/www/flash.js.gz | Bin 0 -> 1374 bytes ESP32_AP-Flasher/data/www/index.html.gz | Bin 5221 -> 5884 bytes ESP32_AP-Flasher/data/www/main.css.gz | Bin 3453 -> 3474 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 13823 -> 14061 bytes ESP32_AP-Flasher/include/flasher.h | 5 +- ESP32_AP-Flasher/include/ips_display.h | 5 +- ESP32_AP-Flasher/include/leds.h | 4 +- ESP32_AP-Flasher/include/newproto.h | 3 +- ESP32_AP-Flasher/include/powermgt.h | 2 - ESP32_AP-Flasher/include/serialap.h | 1 + ESP32_AP-Flasher/include/settings.h | 2 +- ESP32_AP-Flasher/include/tag_db.h | 2 +- ESP32_AP-Flasher/include/usbflasher.h | 8 +- ESP32_AP-Flasher/include/web.h | 1 + ESP32_AP-Flasher/include/webflasher.h | 30 ++ ESP32_AP-Flasher/include/zbs_interface.h | 2 +- ESP32_AP-Flasher/platformio.ini | 109 +++- ESP32_AP-Flasher/src/contentmanager.cpp | 166 +++++- ESP32_AP-Flasher/src/flasher.cpp | 98 ++-- ESP32_AP-Flasher/src/ips_display.cpp | 53 +- ESP32_AP-Flasher/src/leds.cpp | 23 +- ESP32_AP-Flasher/src/main.cpp | 49 +- ESP32_AP-Flasher/src/makeimage.cpp | 21 +- ESP32_AP-Flasher/src/newproto.cpp | 100 ++-- ESP32_AP-Flasher/src/ota.cpp | 16 +- ESP32_AP-Flasher/src/powermgt.cpp | 6 +- ESP32_AP-Flasher/src/serialap.cpp | 105 +++- ESP32_AP-Flasher/src/system.cpp | 9 +- ESP32_AP-Flasher/src/tag_db.cpp | 35 +- ESP32_AP-Flasher/src/udp.cpp | 2 +- ESP32_AP-Flasher/src/usbflasher.cpp | 234 +++++--- ESP32_AP-Flasher/src/web.cpp | 116 ++-- ESP32_AP-Flasher/src/webflasher.cpp | 506 ++++++++++++++++++ ESP32_AP-Flasher/src/wifimanager.cpp | 15 +- ESP32_AP-Flasher/src/zbs_interface.cpp | 8 +- ESP32_AP-Flasher/wwwroot/content_cards.json | 54 ++ ESP32_AP-Flasher/wwwroot/flash.js | 139 +++++ ESP32_AP-Flasher/wwwroot/index.html | 47 +- ESP32_AP-Flasher/wwwroot/main.css | 8 +- ESP32_AP-Flasher/wwwroot/main.js | 58 +- Tag_Flasher/OEPL-Flasher.py | 182 +++++-- binaries/Tag/Tag_FW_Pack.bin | Bin 245384 -> 407038 bytes zbs243_Tag_FW/packagebinaries.py | 10 +- 48 files changed, 1864 insertions(+), 445 deletions(-) create mode 100644 ESP32_AP-Flasher/data/tagtypes/E1.json create mode 100644 ESP32_AP-Flasher/data/www/flash.js.gz create mode 100644 ESP32_AP-Flasher/include/webflasher.h create mode 100644 ESP32_AP-Flasher/src/webflasher.cpp create mode 100644 ESP32_AP-Flasher/wwwroot/flash.js diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 47777427..407825ec 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -41,8 +41,14 @@ jobs: pio run --environment OpenEPaperLink_AP_and_Flasher pio run --target buildfs --environment OpenEPaperLink_AP_and_Flasher - - name: Build ESP32_S3_16_8_YELLOW_AP] + - name: Build ESP32_S3_16_8_YELLOW_AP run: | cd ESP32_AP-Flasher pio run --environment ESP32_S3_16_8_YELLOW_AP pio run --target buildfs --environment ESP32_S3_16_8_YELLOW_AP + + - name: OpenEPaperLink_Mini_AP_v4 + run: | + cd ESP32_AP-Flasher + pio run --environment OpenEPaperLink_Mini_AP_v4 + pio run --target buildfs --environment OpenEPaperLink_Mini_AP_v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cfbf9a82..a3a1949f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,24 +46,6 @@ jobs: # cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_AP-Flasher # python gzip_wwwfiles.py - - name: Build firmware for Simple_AP - run: | - cd ESP32_AP-Flasher - export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA" - pio run --environment Simple_AP - pio run --target buildfs --environment Simple_AP - mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP - cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP/boot_app0.bin - cp .pio/build/Simple_AP/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP/firmware.bin - cp .pio/build/Simple_AP/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP/bootloader.bin - cp .pio/build/Simple_AP/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP/partitions.bin - cp .pio/build/Simple_AP/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP/littlefs.bin - cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/Simple_AP - esptool.py --chip esp32 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x290000 littlefs.bin - cd /home/runner/work/OpenEPaperLink/OpenEPaperLink - cp Simple_AP/firmware.bin espbinaries/Simple_AP.bin - cp Simple_AP/merged-firmware.bin espbinaries/Simple_AP_full.bin - - name: Build firmware for OpenEPaperLink_Mini_AP run: | cd ESP32_AP-Flasher @@ -176,6 +158,24 @@ jobs: cp OpenEPaperLink_PoE_AP/firmware.bin espbinaries/OpenEPaperLink_PoE_AP.bin cp OpenEPaperLink_PoE_AP/merged-firmware.bin espbinaries/OpenEPaperLink_PoE_AP_full.bin + - name: Build firmware for OpenEPaperLink_Mini_AP_v4 + run: | + cd ESP32_AP-Flasher + export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA" + pio run --environment OpenEPaperLink_Mini_AP_v4 + pio run --target buildfs --environment OpenEPaperLink_Mini_AP_v4 + mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4 + cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4/boot_app0.bin + cp .pio/build/OpenEPaperLink_Mini_AP_v4/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4/firmware.bin + cp .pio/build/OpenEPaperLink_Mini_AP_v4/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4/bootloader.bin + cp .pio/build/OpenEPaperLink_Mini_AP_v4/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4/partitions.bin + cp .pio/build/OpenEPaperLink_Mini_AP_v4/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4/littlefs.bin + cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/OpenEPaperLink_Mini_AP_v4 + esptool.py --chip esp32-s3 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x00910000 littlefs.bin + cd /home/runner/work/OpenEPaperLink/OpenEPaperLink + cp OpenEPaperLink_Mini_AP_v4/firmware.bin espbinaries/OpenEPaperLink_Mini_AP_v4.bin + cp OpenEPaperLink_Mini_AP_v4/merged-firmware.bin espbinaries/OpenEPaperLink_Mini_AP_v4_full.bin + - name: generate release json file run: | mkdir jsonfiles diff --git a/ESP32_AP-Flasher/data/tagtypes/33.json b/ESP32_AP-Flasher/data/tagtypes/33.json index cd3e8dd6..b98a8546 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": [22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 27], + "contentids": [22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27], "usetemplate": 1, "template": { "1": { diff --git a/ESP32_AP-Flasher/data/tagtypes/E1.json b/ESP32_AP-Flasher/data/tagtypes/E1.json new file mode 100644 index 00000000..7d9238cc --- /dev/null +++ b/ESP32_AP-Flasher/data/tagtypes/E1.json @@ -0,0 +1,29 @@ +{ + "name": "TFT 160x80", + "width": 160, + "height": 80, + "rotatebuffer": 1, + "bpp": 16, + "colors": 4, + "colortable": { + "white": [ 255, 255, 255 ], + "black": [ 0, 0, 0 ], + "red": [ 255, 0, 0 ], + "gray": [ 150, 150, 150 ] + }, + "shortlut": 0, + "options": [], + "contentids": [ 22, 21 ], + "template": { + "21": [ + { "box": [ 0, 0, 160, 80, 1 ] }, + { "text": [ 1, 3, "OpenEpaperLink AP", "calibrib16.vlw", 2, 0, 0, 1 ] }, + { "text": [ 1, 28, "IP:", "REFSAN12.vlw", "#888888", 0, 0, 1 ] }, + { "text": [ 45, 28, "{ap_ip}", "REFSAN12.vlw", 0, 0, 0, 1 ] }, + { "text": [ 1, 45, "Ch:", "REFSAN12.vlw", "#888888", 0, 0, 1 ] }, + { "text": [ 45, 45, "{ap_ch}", "REFSAN12.vlw", 0, 0, 0, "1" ] }, + { "text": [ 1, 62, "Tags:", "REFSAN12.vlw", "#888888", 0, 0, 1 ] }, + { "text": [ 45, 62, "{ap_tagcount}", "REFSAN12.vlw", 0, 0, 0, "1" ] } + ] + } +} diff --git a/ESP32_AP-Flasher/data/www/content_cards.json.gz b/ESP32_AP-Flasher/data/www/content_cards.json.gz index 8517eab30d39d787d77c3ce47892c8b1851eac85..4abf9d0c6eff91f3cd4ea6de811b8a1a0dd9ecc9 100644 GIT binary patch literal 4357 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 literal 3919 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 diff --git a/ESP32_AP-Flasher/data/www/flash.js.gz b/ESP32_AP-Flasher/data/www/flash.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..b605a09513b4b9e5b2e2242c6377cef72b3e31f8 GIT binary patch literal 1374 zcmV-k1)=&MiwFn+00002|7L7qb7(GVa{$d(TW{Mo6n+no|G=pMETN9vYtV@(A|lvC{o=-c4|f@iHR(!{U(H%S{=ydd#%g6CHczFFEnd1ef&MVuz5D7Wi7**2(Sb zaUpQb2$o(=p#b1)L&`ak*OT9F3{Eeq>(vTxDPL5oOoOU%ECpjEnTVl)5~bj&5(#UC2u>7CSnye!*Q~{f#Oz67E1yXEw7s2OX%~iQ0B=kU_)*g35%ZC z@2HxNsT^~PSZeh^^}_ewdO>IPG$LQA(m)pDTh&u8d#HvR7)T#*O4_*0W2Q1RSQ{rb zFm~<$P~T`!a9;}-GQ#J20p&c2K>F?sy@BuJ;}+BsuE}gdzUro{-|44N!}^8b8UROa z`=Tz!x>g&6I*PN)EYGSVUes+dg*GlbWZU{u>@z_-dG!vxd5KEGM6A1Cs#3p3?sT^0 zRdPmjyg28{olvI!?ndWllJyY>Hulj9>qSrrujQtS#2unuwt}mZIgdTqp4Oyw97v*8 z@WTRGW15FHq1w7L%1B8Hr(W2HQzoW<5Vg-YC|R1{>wq2TD*x+O{TDhpm;9aq+v~S5 zxAY7o(5oPG73u<#t(d^c$L@rC14gxGWTqZhnFf~)My5nB1l(YIcemq7uU{8VMY1{F zfvd1FXdRG0)KP?D*&@Gd-shulyV}A`)0x_$%907W{oF^MB#GDD=0r*%)$7;M_qKZ; z>Wa#AjU};lgnPl78;m3|{^ybq?gbrt48<5K2NTdl3)=MSSpk#`$Y+0cplu*E`_`7M z@eWgcGpSz!XKRZY?p_0sKVCgN-r;y@Uh2Hs+XWEXDp^mD#^x78t~0YU2#-ZV?mxc2 z5GhpGT!Nh2pyuNHTg6_w_jI;=MQZOI^9obj55|#E4GjuK|0JC!%C37*fTM2?@)l^A z@qL|pnFKXATxjPiM3*@sV3LGkxQ}#|n&gwq_ZC{O)ahU#@j9Htk(^C4MP%%DDxC1? z;OS{Sl^K2FgIn0qqdUAJ5>AliAcgad$N@AGOG=dKZmYw9q`g#cU5&8K?DNbm2_47G gu$<+EfUnSSWP6I*d-3z%BlF?GUvsh=NPrLk0Pl0J{r~^~ literal 0 HcmV?d00001 diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index 32b3bbbe8776f55df4df7cbba8990e9fcda29282..c24f2125390bfc4cc3a211813378a49d1a5e4656 100644 GIT binary patch literal 5884 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 f{KlBM>43i@Wq&r4Ou4y+>f diff --git a/ESP32_AP-Flasher/data/www/main.css.gz b/ESP32_AP-Flasher/data/www/main.css.gz index 7b94706c12b57083c35a4af2d61449e8bc518a7e..8204db0e4633ab6b7b9737fb74cb975d8db24227 100644 GIT binary patch delta 1907 zcmV-(2aNdr8j>5Z{R4kqR5coo3VZyVhI8C`LRfi|7;=eA?I)c{P37%)j<8gr$Cn;; zl6+8FM$m7U)gF}3hPVQ|2Z0&oz+|NDPUAmV_W%1I7@Ga?)tOm`2{C$q0tL4&BD*?J zBzHY{RZ83Xd=2WvON$rOx4@z&cS(4rlZXsB${r&WAq-SSW-xzP6)XUfrDr3o^tqJT z2qjH*Bv1o&1?tOarX!+}%4jArd74H`X|FQN1Yr_h)l5KLWo{-QaL{!Tv&PkEqNN&n z!8V-?Gm|zdz!T7^8Eo_vGJ?#?;zJ2m3&zh=^nmIxAc-<|REHlME1Lk|#Fn{DaU%%G z9uT>Ad4`lOW0il4(hd*mB`#=>1fc4aRE*o#NcdbJMsq0VnFcSOm1Em^f)?W&(olqu zW4ArtL#ZRgVo=Rom-MBDvZVa;ul5*r=T~*Tcp(+B1ncB;oBx4q6vpL_vcM(;Km7mv zTC)1z60j{S%R+@aZJcDcJ~a^0l}9l@f<>t3j2{FL2m*iSaJXPM)P)1L-c6yI$?f5^ zZ-^Le=?--rMiBW6JgEkHRFcym(g@BGrzQ|f;*!85hE7boJ~XZEvdoY(BCyyKEP2f7 zPLtOB*h4y#*e+$YA+=If+M@#q~6CB8Gtzj0LTU4{f7pVtrF}cP$ z!8w0R@b)OuI-HsgZp$|{6CC1iYHiOU+iYl$T?5Zes`Ew(#yZcAbwz>>-c}jM4fTeL z)+W?q)OI14VOA@m-`o2 zyAm2azlXpj(kvwv(he^=4m_vj-?uJ(?Z^ z8S;!(nAV-9d#^ZH1(M2*{Pz%#;QUX#HdjTCz0aUSy93aEX%R4<-&8S3^*b6M-m&DuCrT^5D&DF|RF zdMXy_Z13eVzmOa0lPwA)8=WzDbF+NH?R(mti?XNP5j0TqenU88>eU&klWYnbA|78f zgeOPorZskDQx(hxxdKY3Mp38<|1QP9IXnK(&l-{r_CpnV_3oBJe73UCr&sOI8jsvPQ zuSf06#6H_*Ph)YdMXdKBRb|KmoU&igZLZ>HK1NoXWy(>})gd*esWi!tGe@f3IM$ z!6iWw{(j*XH};O(mhsF80V$`L0{VdEGq1#gy9=hz$Rl~}9U3yH&cdx*?>i@Qe_3sE zeh>1duJ3qax3F7+J~BVpt#rSvjC6@~uK&vuK36?dhC`w%#_Y#ftzgnz@gsxce|c*r z-@NbD#m0J5or;PEVt&*N4<%tGu;UiBxmb;Dk|DvNo!F4xt@ zpG=b$CM_a+g4!~1Ec!uN^bD+@r~5-vL3!QKJz;)>p9%OJWGe}4E%%6w32&SU7n$kr z0y*(78v7eiD<5^x*wvUg0u`G${l8Fl5cWhA+_+s%_% z!xfh5oNb)tyKU)Ns4wl}m-Dv%zKeD}=PM8Hmt53MCs%op#|^{1GdT_7{T7gxIbmyO tw2||)lQ*w^LrM^WC{G4o;^87BxOW-sZM!MQ(vsr${{YdYi_p0@003*roE`uG delta 1891 zcmV-p2b}nl8~qxv{R4mDji1MGE<11GE03^C;wPOlO$FgvxN*e${r&W0q?6KGhnMK6F|e#GX{TF<6KH%gp#H@67Yb! z0`+Ayr4eCAr7n};JI$A+v{#vBcQ6SrUnc0SQZ$4799>;#tZ_A(u&72}uuUhG%%qJ9 zlmr-R1{)@Yj39-w_)vn?g7Fg)J)k-aNWzI7zTwBlN*e$nv1M*kfCwV5hdAzCo(iSQ zSc#&v!=rbJ3)+7pft)(`6yx?a5RC4Fh3{wV+at38I@`BhynUPwhO!8(cC=6@g?g>ku~EU*c|5C1>EmX-du1Z)e- zvQXhp8z-x+PYr}_iQl-4( z!J3JIC{KT4_Vo3RUrHRHui;WK(Cy$@xRw4c7PpjF4J=m$q=!j|Ck_!+hPUM^)VSgu zy(21F9KDz7Pd3c4)8!ZV*&p`kCc8`I-^F%y>t?j7QDUc=kn0pTkQqH6lQg*pwr;h2 zv~-*xqlx?9_$zm^*_=J)>e+us0{w!|;!5}Gt6YZ(lGt>)=k^Cwjl0BV(bVkcRFzgfsuo0`37=ZYnX-R7S(L=Me0FYOs;WGaLy9EJ&N=Q zr>1{{+wx6a1BdvVdf0QwHXGVw*T8d=>by~cu@#gZQ*W^73X=GtJsgm`U!ll;QGjr{izkKp`Iyf#-wj=iCvL%RdeerXXfp5K}k%tUVxrslrW;$gU1F0%aA z@7M~R$8Euu{c9yTjjS!OZ<1{$twNJG2sR3%H{X_9yv2bnw3BxTECEB4qzFS7Y^Zyk z46|nj0gq{Dn&&B@hNK^6Om0Av{sFnd> zGQW^J=94rEBv>6LcyqIS!tHz7or|)k-4QfU^L|4(W9rpms5j)U`DWv1uex=@aiGEN z=~_qfs%=eqJoM=7o>Mf0CuioSHGhCdi8Yt1;^pP{FDpWuoH|y;RS4t7$*PmE3M&=i zDtW$2cMmVHGEG49Yt2DJ;>t-alkf@_2eXpiuq#J4lMM?iRc8|C5Pi>9=K7A4s57re z?aRbI#AZ)pajiwH_aRkf$O4?QU+>IJj4p~n&}7dQ7K3|vwnH56TnD^C_GmRnnK}9q zcM-_3SUzJ;*acn>j5Oo@Lv@pl3nPE$0dsL4@KP*yUJe23%03KxEwY5jT}cr#_Ayar zE6$`{=;R4={S&R1e%F0z*RSBo*oJ`hCb|eWk5UQor}|Wo5+#z>r@Q3SiKIGB{&cNT zlf(|us(sBM24e~b{2 za*8FO4_H0(N+`IyVET$YlGom$AaklL+?w^iJRoJ~wnvnBU-M0{#WrNWxmjJtAYm8)L#nX8KD#PW)ThHstI+_?=*9qrpD! z$N`CegCzJ34^?pl+(x|Y9Yb)wsv})SU3n}?uI+a6WY%y6r8;99XZcrd+j$o1JKK%t zts?{T#TD&(&UY8wZ>y-APA>8wj}wM_V{#hA`zatTbAr~+SR?0UCvRT;s*@lDQJf6E d#KT2KaBni$yLMBGr6tAh{{amgA-IA!005tRnr*J+s44#G&GBm}?$s2(Iy!*TM|HU0 zou0mawE+;17ee#^;z?G7v&%U52G@hJPRw+c zPsi0-!!Q{`Ul#XlkWGMKuhPNmcs$N7E8u%?yvwA#$Y!ONhf$I_hUCwGI+rt>&riJh{j&Ei8jDj|Q|%`G>3wCs{NbLmgT&?1yMG8+?vS{$mLJC@$jY7`l^$V{EZX z}|jIgMZ#=a&oW<6J4`{EvN4X7s)uXVYfu*8{Z9{zNWH9vt5+eD*M_ojhGpwzn8S>2GoDt4eWd$V$cyj`Om;Yk1#YXHb7XxI zzvJJCrTC&b`UQ>g!ZW@0IV;_&ps<#LyDt5s4Pyjd?PsuCPoQ8{G;WE5IylF9nKRK~ z;f8W-B@U0{8^WeyyHssHnsH=or(wSc=oj03jSlQOKwW-7R#VXCYJBAmR7^|lLHLZ+ z0JABAZj+50s|y{FHP_Z^xmKCa#CWd(@)Y(+AlC6*ARJ)dgE-G|)_1%D80t&l&cM2Z zhG^cS;!UsNeb4@Eax`$79>Y-Nu-}5&G{VJ%L(=j#y4@~=VGY^M@Lt2vWU%JwbI>@X zRvInd25TZ5!;uj9$H3Rq24k*X=koH>F$wMW`TO)|*a+TrHuGjvf`ya6%sd!28df+p z;DEtZuurZou)7cn0bPC5&5#V|SMv*3?i*lpUTmsQ!5QtTny)B^Edgza-Gt7fJeAmy`#23~e8dWBdhE1;w1zX%&E>jgfKS??$EY zB9HNuZSZex_&)|D8@Y(X2sYm|P9w$?wd&NEzW+K8K^W{8-op-;7NIX+V%R;{2J~*4 z$6u0cR){ZDNp@N7H0nA#N&z1>Rn)2od*d;jMgWHWFW8jIs(g4?sLj`s&u2|E+Xk8O zFobo>KggBKe>-^1V4Ms-8_Xs~0Ks?ZM;k{1{(T+~!`WEwNkKQB1ji`o&;bfR_R2C( z`m-_)eC@FCjcRPG_K6xUb{xz=;F~bE#hO`D zC=mUwp0GZhu$(3ue$^JtwbjsEZ2?L6Sr-mTTmv+#b90SLc0SFxIF-lcEKfaMs*C!& zP`vE}uSKx0J6EPm)}}`3Bn5S?;KL(j16=({I`bYp@QmL(o}?50XG)b)P*t%CU8Hlh}5%P#$X+xvL`h7io}-w^h>_mS;6 zvE#JOW7cj1vz!FgMJOd8Y7{m`nSnG5U4$(kB1Bt#15R*JmeXR>_jW!1vM4q?9p6Js z0{w-QFvXFx+F#=S3H=Tvj_(!Tiwsu5_nzOmEW`=JYCF!449;3OKE$aZ22>Zz{L8q{ zTjzZOonEn`Mc5|{g`)wSF%)62p(yUpMj(z4E@HqFiCNNVVCNXJ0PPe)Q4SQtN+GcY zzTpZKO#jEp>sM`%#EL2+qyvBu&&y)uYFd@HnCh)HB5H#Gxu7;HZIOKJs7x%Nh8E_g>cF<`w5&1^wJ0GU|H;)T=`i^|91Jq*gx%K9fhVHfL#x zctltIdqnC)rPIkc2H-NDc+WswfgO%#^|nv4;5wP#$mp=` z|Aea__9AFST+;KBf|B-{&KC!MGq^2A$ZooR(HfOdNHiU1vFyax?$Dv zH|NfYQ6n}ZHixK;b5-DC#S9B!Ks_A_l5}XBYyh`w^zUpdun^qVTu`ZQS`7T}gn`ql zFFs2I;=^5S4vPrkvtpYngXaLzPP5AZMFqBA*FAw~Fv|(J$~nSm0*gbk8?I9By*U6H zb%1J3&T&Om{H$qQsMc{?QUe7$&GLyq(R`Uf4ec`=e+iukc>0M`)0c~YOsjmpdHeWd z*HeGP`S{(Si~sX=qnk!74rE>yza%9{yGNje0Dh1T>L3ntSZk7kHPJko)`cB|{Zr|O z-YU16H;s)-=0IT?)`vuXyv2aXe*eMUwrE|@XTVMeHCS zWKlf-$Qmu;5=|r7tPHrE((;}NyU^Szph?EqzXqw64FQfN{q%OWVPpO9=!eG}KlUC& zp~pUNi}H?M+%B`D4)SgwH*0};4g=mwWYf_Axvqd9^_xfS5stV680T6%GbyafQ( zH@5hROw^2F(*Y&AeGRHfR!^2VB&hZpKy+J-Bo}U8La%TbdQYBcqachW!gQG8ofaytTe{BVAc&9{ zB;DKgjBB)&EAo2!ptGZg=K6U&eBJ*9K%=-kke|rR7=tG+=8i2#f1<;2Ad@!ooQS$ESjM=zC3Ck>7m zZfOIv8T}%U_gKfwmJ{@M+;CiP%6=}cpT}?l&-fK#1<7R+l^3|wuh7QFt_EYgHqe9z zK{FhPxN^EEpjh8Fl!Tyj4g{0lF}&P_(_P`4d)+JJ1Dt3lz%SELu<=wX zFJh^Ry~S^s$@HDXmni7A%Zg2vWoM)^)5EOCvdjdiWcTuFt~`Jbr%gSO-6QY8wqM<}G1LS+f8MzXHXd z0Q}-_`bYRRuQ5dE)QdA!^9~Rg`e;JUuU~$t@EfCKR?XS3m7` z(UyuAVVgGud0Q*iW{WAChJ&P}`=AY< zFNKw)5XZ4WzGrB7LJ9c-l={msk4e|`?@Uy8S=E};hc8}-nUoTHa3_y zLCpvVYz^C*==VY3=9jRDw|dCA3`CN!$aHx2`7M2} z)X|pmwqtix;0G5WOz&6&9$Zv_w8LJ(sgH}s5f}>I?vaZ}-EruyFQEG{+@n03r4gC3 zhV-AmwM4tz=;=b7v0_aAuxh*UWB4EEZN+5*=)8a~iH_4Ua7~T0kquxBT|VKP?3n7q z1b^PDgG6uY&ALMAZ@pQO`t9A!dtYHGLl`z@i`!;yzB@-r4ot6~W#zLDmhSj9$ZH0w z-;KI`X=_~EJ9KWpGwtLV&qn-~Bo2NYZuI-Bk;q->?@Ztg^ zCAIelkoxNA;Lc=X$iweG?Rt#Dx7=N?;_@=fKYPU>Oz*b8(2^gmxW8ol#GSkF3p!dw z*@y)v+`A>MQ8$GDtwyU6XL4tHfqP9zh~XeDG6kK3orle>l^fCfZsB)GDC8st$ml+b3nzi{1>^%F{1Vg!iQ)O_Ix(F> zkZ1*?G&UY9kK4eui(7;@JvY^cP=)jG6HM3iB+JXAWDJss!>dN~`VG{5jdeY`Ln1%> zujvl+SmUuoW5X<228gB!d5Eo?|N_bkeg>ebW>Nhw_G{9v17W8)Ff;*#gbcPY~N= zH*w)8)2uryl8=M1V|GI0oqC|h9b|Wdd2Q9Q*To9bZMbsdySN(zR~C)wn~X0m%f3`y z<&wwfJ6Beg<11Inj#^Ij!&S9{G}=#Uhh&+8sV>sz6*YLlrH(?lY+mb@sP7m--E&U6 z21_$^$AoF&GdQ=b0(DEy*1ncnA!?5KMh6Se zU?QgVp|+{@)i!B!>y9J9_(^;CAK*jt+2_ zRqsG)^KIGiZ`jVX!1euFsq!Mb+=pYvs-ho0l`34ev5C@HijXEKsBRpGIqU(v5U-7@ zu$)q`9(QTA?@Y;WnLE4G2Y)o$$7n7P}fm`0n(oVaMF8(zV|2-#2P1Xntj9Ivr}4MM!%guHQ`- z@Wn&pq9lYBLZ);mW9vrqqgZv>&`ln@pW799Gm8?82#`?LwF zoyur93zM{w?<&?)(TTSG;xO9`ZU8|eIeh+)YM2NFUI8p)?NRXz4fDTeRzJe@pOK_qd_Lc zOXirQa025(UL|oTdkg_Ltte)%Y2d@*2~tws+3T)Dr=6;09E#k3M)NbI?r|AX>)fssOoi95 zJdVk4t0sUK(|k}a0xqM#=2xd7491yOaIQyxuYgBQo*vJ-RviG%H836`~W}zP9rgi%Zn`9^!zukPfmS`Z|!H%^`>0sTrplK|CO-vobsRU z3QduS&Xg5KW{g8CAqEd7Y$|K>>MD?ZGHc2d8s}!yQ?#!+Z0`lSjZa9rh6Ol@6o0zQ z_OIRPfZ1pGb@>~lkq@lo511ik8>)l=D2IGvHccU0%Y!-XHYXPcXHR0cEy64(4 z1RaRW#Rrj?{yM(h;=^EJ9*py;wEuh+b~4#i@aORmCiLQKk#jT^^f2vtjJ^|J-vDB% z;70-MYf&Q(zdEDwl#HogKdBs%W9R|u>&K;ttHTn`%1rvJDg4Y^-z6exGRbn5gn4e5 zmS0EMT^QF2A__K~$J300Ke>xK{r>GYukq>AWj~)KpVH22KzR5joW?mO`Dh4|F{E~u zqstag7trbC;bnW2lozx9tcY`dV1r&e>7bQ@P-7;5NeIeQ-svZ4n1e3g0Tz!O6;53^ z6$|7bq)_{MOHyZL5e|$Ia}qGEi(tWxpAJtO-n_|JCu&@#q}=o5F-T;|0xnR+0@(yzdtc2aeb5jsc5V6DH;n*-rqslGSnv+!GCv5#fr!mu z5C+~001;>1^E2M+`I%2%wdX>wWMJFmWlZM>&m;vy?IjW2uY69k%ajXIBAEnF=0~z0 zw#Mhf*&r`tZ6YwYovAu?J;x}G-`J%!my(A`J_$Y^Fa)AiiWfIT%>*e)hN*VyTBY_HoEQTywUfX*E2Mve{1kc+AgqY+j zjX_t&R*(~LqC0e{@`;J_yfhWGlfHY~+F z#+)u}i4oBL$TSX-rE3yBaV`<~&XxzuBV2sst6L zA=*WNaUi6QMM6Q9Z^w#iTj5P~=$h&SQnrhvkqI_VG5Yu2+v5X~D<%-6Hzfik_jx)S z1H8&QBKcAFS!i`w)rjx1d6t>ch|(@3ztaAv{4>lZ33GIB8>dPtizTdP5o)r4JT|y8 zSVhc=Om}4y)gNd5zy#-qQ_p$+t*t37t|!i~296wNg);`x35g&alGD^O=FcF7CB}Q} z?rEbVa#4Jk&d{-52I9!$1tt7OOMEt^{GJHBY3eai_sk}>d9_4xA!ehrA$B@Ttn1MS z#M00cx2PDOxkuu=$K-c~e-$a-jQ`PYY*(Yrpy;1)k*_|&5uArO#%&K*4)W`GGA*x> zKO$b*^#op+voPm3+r@){!S)WrnG>M7R{) zs-`Q_Yp$m2u4In5yLvibP3dI%5W5nt(IK={hV_XI*^ML@Xc}(`tGD+C1g^_nyf0NZ zk30v3X73QA&UG`VZ9%5oWAYqtA%->kOWdErXuwfD9z!#9i=pBMmW+ zqtL&LYz!z;H5gr(C1z8745#wLqJ-0{-nP1}Ij*$RGUAhxGTRrel?>Ag6!SORkUa24 z!SY>l5$G-fwTMul=%)>nYSY71dHnqi(b8#(`ORlvL7bZ~7$Pr@rw z^DSt;=ePyHtb!Td>*^%&r47zM+vH#hOq+7}W`SKM!-O*A+px00s(_w9zvA_&J%aqZ z1YiV6R)5ZP9a9NT{|0;Vj1`DkSOZ1I6z~wGcQsF&Zzmz;r`K!y_26m z?7w*TRvu1fVqi(zmT_fCv$fLY-0h6tx{;{Lb!sf)jI-#qbOz+C)L`<9tYC1V#WjJ& z=rs*?w4_bWaEykb9Q7_#Se@7n9%_(sKj3j;U#-g zmDH!j^S~LEswlrK9uR85gde5HClt6p!>wHZzFA9*d~zEfE#z5ZfG{Q9pg?bM@TBsIYKD9{zcpqFUVCW!e{a4MTp5zl}Us3)xV0vNaW6*FYK| z3&W<$;}224Ve25eDt-$cM04H0m%DWG@*>YJ+0!MIng8R@r>Ae&h~D#9=0r3q%DODk zg2?+ORdU7$ir)y7-cYmRHPY0qU;hW7kpC1qnQ75@|fl@WV9O#c7 z=vl?}`*~jdRmK*H@N8>H$zG{e)Q6)yn^5|Ih0Bgx(x311T0BGX_ym4H_tA&pxQs!y zBA|xUx%4{1?+HJ#ix@5Ct^p`*7V!0LT!0oQ9_!(&6cah;=y&BMsV5NXNhifO%%t-A zGJTV0Qy7-(z;Mct*xS)gD4S8s9(rXi__~^mU20MgA}?ukju> z=Q-Ynpy0BJs>~F|nU+R}9_kRu?!RV}B3Ude9Pbo+0z?ej|KGU(&um=k0EOA$^49m6 zxr?oPPASt9K9xpP819nEG{Y9!9Vmm#LqG= zYI1tDSt_k>y`GyGzqr|>iMI!U7K_dXkzewe@acb;|N^NuPTgz1;CfS-;sXfw{uvMDP;N(H{@ zj<4~i#TVk5kE+P0xA>Y>!+b_5=vp3gPC>KmnRxE+i~*mwIY{NZsPo%z-dVThao>2k z7T8-hGQt_N+P=Z>an9V7jFuhIQMk-c26-|q@&1Df>K37VaEU0wB!#fOsaSQf$yU20k0HO9RBfGj|7qR&LE9MQe6@=e8ZIeS7R35- zcebLk-*ZEW7($U3QuW{~C*D2nJe;n6x-ELh?6T#`I;;bx9S^|*tHz-kqzwYZ9 zhgWV)!?jVnDeIO~CF5{yHKlXv>3>&Vjq}jfWM zL-&6S^2vrn-?egiCKbYvQ0|the6yv&)XONYZQo?_idBk-48$8NIOt*B}yGLlJ z%xVtEc2$GEga$!KtammDD<2u`mnk14kx}NB2-HMX*`|S8&Xr`@`a457Z!DP5SQ9+n zkPyk@>XHyI%a8&^+1%itXWnD@=lkz9`$-~)({0DX;u=d9R$}#g-)f9qqYF(u^!|nA zGzXS6%42+ThX7Uo>qdGm12;)$o|*e=Ec8ZJ;2gzU^~mZE&o^#{sb6Gy3GFd!du3=v zv3@z_hR~BgnIq=!jW6+CSoCA|L^POf1GcK*;pq#8$cMu{s7vYEvB+9=HQ0l<;cwld zZ;OfkT3UKeT8=PdUXW%$NK`cc05Trck`W^%BYZCv1jTzR(K6Scg4H=vDL`@2JrG2O zD{iG#39q)a2b9gU`}#ZREE}Vdy&f}j*%|C_%oO^qyCvf1x2yF29ivl!*{*RT6DEmX z0JnnvmV41BIOft4*%rva!!pkM@hCwT?Z&flBA)hy4*EODaW2Zq_>kgF0?Ob>3Dk^N zKqpz6F<3!}e96fV&i?M7f8X>wBS7yP)&4Qd;9T0dzajFxH3&EV^{g{ab{b79_lP!Q zckdTdSDn41&S^d26xpQw4&%C{WjjwweC0}$(tg;Hf|h`5<5pKo#LzRJDq+VR@m*I- zi;qaYNd3T_>h@|F=Tfh#&CvS|a`f_sFhy@qK6`;VdY5!#UVCY!%@Na=G+u$sbPrhZ z0@jQmpa+Dk_o4!m8cw+=h-ft)W&+__YJ=X80J3NOe8+FLKV?Z8`0ur#XXA>EJr0y$ z)F1wJlJfzkUw@m$vzWPs+;}>S#!K!c#T)kaAY~S1*T3uoRS%5Idi%XX4x(7SYF5iQ zB#wK%DZ`>*rcATIgz!t$!pV>n7jbl)f_@N=UoiIsj$d0*I(;pAKWM8iH=8{)I7_M< z#YHkKb*}Ha6NYn1+>h;Qcfu|)Xt&*;72?^(m1gO7-4bugGc66T&23W6SDu*8hj5Eu zL*y~hoHRVt=%J}i5AT2m@jCtTy`>(HA--CD0I&rMGx<6yQ?a`$0*~I@gGp6duNL0+0OW| z@|$!1>)Sa7xTS2S^6=sDmeOE+kpKjKuD>HRD6dFFqhcZMU6nzj7d4CrhiHXxzb~l7 zS>&3&kGSQXK9jn@0HR_T4{ ziGT=~ehrdda9fluou;O)pc@Y~9;XpW38E{z9xBE?Z&Rqv(iAu98(=irXA;G^_w1SX zW7A_%kLo+VO>_>}ENJnd8|P-^)JGuL`r~u6r2yOB+3_|un%)Did$n=Y#MT}G+CUaQ zVP)MPs0@BR^fuZXkG2*x!)S9h#j!nNE%l6+dUtB6XSIaLDxDD@yN~GOQ-*sP>PLvW z_vDH7(xVbX^);IfhrqJll7-0Rf9Rl~?K41bY&5Tf^ZO9Hzw0dngx++w)Vti%hKZMwfS=;cwCC72R9a%`g6*O8!dmAN`V)ix1kgXiKROJjgGiLS0s8bKjO-`l zPDT!$e&b?vEnvGMIfq#cHgF1qAG~$%6H3s#-Uf~eZjnI1K@$?`!aDGEW5J7$w@T#_DK#3()jdM`P_88Mkg62Y48P?5$2Bi4{)N zmK?~c>{}BZVP=?Qm!=K9Hd8w{8|HPX6Mx-v;7YX66cNyB_PMacBk^W^lB$BoOz#kh z7x>AR4)K;Dl69ux=d8`Y1`?T>nlp^z{DcDFt@>h-aP`G3RFo(TT#Z&41hhyFY4b$s zN_rQ&6%IWkJhP2xS0iXpK{;1T6;FSL{XzkE*h2{7%7fWltXht0f8p;Zbnrb6Q5m$* zFv0gFP8gWLV%2=w)l@xE0E`RY>uju(Hy9Z~0@i^YD)@N+hJMaB@857!5~mffnW7Uk z`UJg}*XTBy^N)Z7DsX`LN5u9~RkZ1JVNedr{&&o+NJL9D*vD|(fs;haLwlHKlR&TR%JI(A zdT*v#8R!q(Hycgu0tVmrm@+-poiLu?mY(7D&$dtC{`n@|VqrYXuJQ)O!BgnAy%}&g zPD1r{-;_J0p^|ecX?-QBWFve8GoP&h>K3L}t)cROo6+bn9Hpy)qJ&6)^C2k?#(wpC3x%vLW=KHs6o*t4CqYl~=HKSfu@y=*y zT8u=}6X`GZVej0ryp&OqzG=fMVU~`ofLvi<6;iuviiZ8wY3MJep?_N%?Hj^Uf5lIpo z3K|c52a`3Qkx)5;i~Z{ZH0k2uK;d@OZ^l{IBrdlHg7In%Cdy1XDdGVaweubI>z1xK zD_Cz=TsJx?uBC&i4)K&HxRuust7fevT1dv6Jb2)V5)vbBl#<58uSMyZ8H6N3e=*=5 zD^r?L725)b9qC|g53uz2VsCkGN{xr1HwFMYg!k|S$>c)9rkvY!FETCPibztl6g&TO zW!yC7JU78|VqOE4EBH<^pBSpd5Z(tkExa`K+4Zh#Vt-0gP{J`d2(F zCP3^BCsluwO=z^}F{gCQTk&N0O?$|mzsG04|EImoCy$-`rbNJmRwcLK6;T-*(u(~$ zpZ+K``b*#AJM-XC7IVcd4cxkM7+5S447lw{1~d?(>Fpl|)`3J*c?H_vmyfasdB0V<*P(iAN< zhSmzD3QTfA@@8N#7yWBudnN$sxm%im@kfda_M3W~gV94M%tKK5ZnE2D?lB8xO(9mu z5Z*Eyjm9xkMvL3zHLFkSCbMBE)mx>-P~X@H8lSX1#^?$fY}Qonf;xD)CuI$hX2__( z*6k#``dMUKx5~}uKYCsM21w<>g(X{jHc$&Lb=xllIXpIrlvITP`lfyfip~C1%Y~WYVMqEU zs`1=c7x65}AFrC<03U(_8!xZ3@t4?s#EkgbJ`Jgd1`Z66hOr2OrkzE?*$(2t)c&%b z#3zM3-f&>0PHlNlx|U!1Djo*EL&uye><{eUs%u!1*(iC+>w8Vls0t9WKXXm^oci641CPL2jI_w^%+FAVm0Yj%SlRF+t zAW8dOpPcGiB2yXnTCdiYF6(?i)smuBP`4B1I&oW-(}e@)m_Pt$NLsXVZ66maa#;>A=tb0ZNDKmV;guWd32t5$lEkcL+@p zjv~F_SABz4zSD^>;8_p1veddoscuF%zvAG#wupo@T);jW<6bhQ|0U$%YX!A0zQIyzbQ#_1&$LdO99n)qa{r$N+>E zv#2I4eJcJ-(Tj#{mM-->>KS={2M!$LIMUh>aa!VN=LSwnR0eq8(uY7eVy`g(SEiZR z_9MggIVR?tD^05tVqcWNCKltu;uNI|6@#fyXtP#HOk@w5mXK)e_sdD7q(#ltb9!)Tfizg{`3bmwCuNoMoW8IZf$8UKsKPCrXziQ z7|)9=715K)NWO5PWs0bIcf(E`*wPXzXcW}FHDM%EAorHH^q54%nFFH)eipL%7=zlI0+V?1Ih_zO;>8v zwUBWhO1{7PURu7BDiGAgmQIHRUsJU>P7`ucrj4az6mAzpt zBn?S*XUG*Ssjf?gvK*_uJwy%^*CNH(A9ICj0^aT9JC%K|{=hW@_4xr^cX!JGggB-j zM%&DEpclv|H`yP$M#CUbO~Fp zOK?^3FJpQU?I-RJpbK6#0x4ydGizyi>X@8rl~?3dOG2vy*CaKW1CNc9GEJYI*XB{! z<+G%Msn@C~SX2>Pp%_~Pds@69+F}Xf;L8!l?}$+8hBt2+@MO-@pbzl3$1m|bmgN>I zQ62rY*qUC~T)Zm2xu6GvBzi|wQFMau-0{2lLeZ}}Oi!9Bc>Zn<1^)tUd$yn_j?sarnI215x9{I7>%$)w}>pn+s~=0|NT6!B6%i1-@6y zXK>99kzCv<-URw{D8$d{eO>m}wSU{U$3Co_#>roQLHmFioHwdirnP_a1+GfZbyK8(V6ykQC6r z+d%)WjC|F8U<1$^jFW>5DxFWSKGsym1zcMf3Kvv$-qf%1Vw749axttlJGNW1NdANV z?1f0i#M4hZ;$nJ6UKTyk*&Q=QB#t~0iMly3FD?A8PuW#AyDVSHnn)g1pE$yu>S*r` zN<6`&7%AWVaGKyW!nbxZ-BKSTdN??ls^kLi+n7}V)1=98VD`oZ-hE&V!HQK}dpKoh zJD&Gx{EC9_EHz&gS@sMJZ}FwQ8uvhvnfkgJ~iZ z1V-szYB51yANAD3*E#`ITfCxOSASYyGHW!1ZQ326A}pz`OmeEbG8I)S-)?>Iue@%j z?9|La$!e>Dat2yccN)3J^BbcW_KL(Q$~Cu(^DWO>7*3 zVRMEy-VZ)f(u8#`tDzSwp3UbUQ8-QbgA_ECu%t(EHps}rg2smsU0fZmfmYg8!()IX zC6>vst>wpM3P2kc=7iBz8zBPn{C6M(XivYgb7^q};!$P=;-!l!mA~SB?NSgEEk{h< zbmbaCPO4>zb-wj!WCN;3PS;!~eMGsY0KrC1(mF8fb_OeIeG->(1~T5H^JSyMre~Md z)cqTxbpC)OyB%zVyj*e$KGBvI=%&@h(>aukY;7QWuLY zS``fn4zq0BD7wtyud=`x(r*e28*zbyV0Q)%QPXyfaPh0ZL;8Ym>0LmzjlJJZC1>nS-zK&}brEJGPJG zINiRJuZf-Q-E}+(B~lg>iPVr(Y`0slaQ9*EpS`cMFK}PsRu#TMP?DW=pZT#p=S(c3 zP$(3DLRFzq7-nfvdUw4YFUp4VX`Ghrf6U|j>NuXn!!pa;gCvatQP$l4^Pm3wryk}yM)fE5q=IAvP_iKt@JwJfb2X(mL zot(UW)dPr!OCkCI@u&vk`To(1!)G5}pX`5l{tNcw^02Ne&yU_7pYZ;4FP|UO(R_IF z%j>s){cwD+|B69AtAYIG*$Mo4e8>?V5|bx!>6PL6$<-__;QRGrn|%vs2U$8w&h>8q z_w1?oAle9LMH!Ycd_Mj2pEj;N`nBcx*=RIL(%5f#!)%h}@FkBU-&?dysMG>F&*M0) zfQ=?$F;3ER4KT~Y^gOOWUW7^Mjk4U!<039K_`zgeh0f!D%oBk0X4yrYd&8^YL?>o8 z&u5crtx=dvpfAgNHq53#uvh8eRXmww7Xbd}Kb^^e%IB$@i~s$f|M&m>*Z+o}*=*)$ zdQsFH{uyiUg(CsB;pQ=rAF`F{{`k|w33MNpGW!}IuW^LS45obl05iZ^*S zjEe%hwd0M#NfGm+BF?|Wd6`V(C>f3T^2CB!n55;4ER5nvRB5q~$K&k6!ZHl=Xh@Te zf5^&knnm-8Y$h9ij!XVy1f&<^I68tJB;f=bsS{Xr2zsBul-Z>0JZ2M{zkE2Yv^r z_z=!M3^_h1*=U#JI1OOt&43JG^R6fUZhtDWG-zs2QCNlufhadNw1tTU)ED@ij64Et zhm#~MnjCoJZs4~k*?HzS+er!(|9tZD1+U2GdCYme0mxI>^;kcUdjjDQ`yRx34)P0-7O+NM z!h(a<7&Jul9u;qS4exvQXOp7=ad!l)$iIY>U_Jx7V`53m>vg+b2E!V%o8i3%)?|~o zO`n6tA+^$I@itf!;RIHB;2*(KO&e_Sc%6%j3&$X|-{o^jqk$QFipx(4)tgAA^JchOpCo%qlp@QND>ycKW zoyQZX)WF}3O5r$JDA1Cou5<1lK6unnZq!8n;jfmWRw1MY3e1=zU{+x4LE z?sxcp4xRZD!}7sK5VP!`T2|CgCKsVD;w@?ww*AQjL<@jnXA3rdvMT508nyYv@%a#m zX4|lXABHeV`3E^o`EQ3{8BUVnXG5~Y2p}XB{bCAm}; zfC4v%)VQlNiGR~Xk^0y!$}3pdhCpz0f`XSecpoSI5a+u50 z>KdXvw3dSlGXlVS3^V&9H1M+vRZ;gNAS3-)r6S``Xg+r#~gUa zQ`H`KnH*uDpn}6#aY2N7HR!*vJI+D>#g4bUNjQjMIX0pO)1Os2^-%$gD*(I$3S?RV zu_;xsMFUmt4W@H%kTy#LRmKq;DG2 z1FwL3b!egimO6;k>gOP5@(AYUJS`EAsLQ_7XRCgto0Fsj({DsHdr!OvWII$kolIf? zF5{{91k@E+;kZ}t_@oPNk~4%X$Q}PDoc*vC!35%(o|hCJxhx`o_xZaQFYZ|VzsO$L1vF5S6j73S6w1VId4)e18W8NjkFa zZ@}&1KKG^R*86w-8@Z2sp*Ybmz{3kqEd*x_V7r3FBBQoC{i9VE{wb@z_$(2K4>pFz zcTrf32N{@$$51dY8aF3|kBaST3Z4N(JIyWvR2A5K-Sh;a;XEhcs^kb~2}}+tZn*up z|KTi?!Mq1QPe;Q3#R~M7yADj$C6)9#3dZjm7`cu}pDH7y@9wa(@8@}V#eJqQ zLj$I=#LRN^U@e(2(qKQIhC^tX1GeGUHggi3KYM!0iqBLzm$zNM;P80?d!33Z`%h=n0qj^ryc#U-e_2!czzAWQB4JGp{Lj`{{JY<)( zlV}utNkR|sV7sg#T~W9pLbVH!GYwth+Qd^Xa_q$&?t&Lk3twr&GB2qGi~Nq2TU!^gjNMP5&5I@@|^te?fB*Mm<0bRL%n@)Nmj9J4~vZB%c1 zHPmn@*kfXgCZm2k4f$TJPlvb1$4C17t1JfrIKIGhOg6`Yu((Qxp5dMs9=l;UIT6A` zUu)7Uf}R{Nq_aeIgcO*~G&Svp_gKfwrW5pc(r}!;$bK%bpU1ER&rxK$kX$5DImW4e zi9Rd(G>*~dttk(JX4nvM=5$d(vA*?`hM;p7OLufwaeQ$Lf=Q1aU2MVbuJA3q?xpbo zcC=%Vm+5)Xdn}c4F;&Id;>Ta)%1z=6RDbHEma<&x776^FOwr=5h(>ggHaG#E+#QYC z2O2H1PtFSbjh?*f4BZ8Rt!QCqonYfb>z-L(uvi~C(N3eg;=hJ!qDGqPgKsgb*Vk&( zS=Z52NpuiZ=$6^)bT|jq{)&3?47u4sT^lfVOeVMU@L~@?i7tzEV_R8+Xh9ppd$q}RD%mNJrron@L?{V+ZgU4#h%RM;eK3+8NT@BpVPPTciY=+cQAQQRp zx4cGwGfK{r5|nS|vNt}llLO-uR_pb*n1|C_EM<@)#%2)t#dfjWV*uP|#W(60wz?O% zcgB3fYowFSS1+J>-h<}a8f!fbO9zQu%t>mDl1sm1*bkP<0A+ZJguVmgu3m}U0*;C zfZgYLHcumRWsT@Re|v>>+3V{{oH1ie`LJ%g@k96@mue=2l&yjON^`X#MtT=Dn|olo7Cv`Qmn15aI6gBnP24$g=WD z2TOPT8ss&M8g!%XK>8Y&_YOm6Z%sSJ-7=2fki_ASquyY!9*I0a_tsQCotGsn-<}5x zxxf>O-<#C_*OJ=*14w=K{NUDPVnFrpKJ0n~^tW7Huj29|%RhU?FidZ^zR;5&t+~Er zboQ;g@CybGMcFwEeZF%;TBB|V|67k%BZ~dj^n&!7k`l`|!94y%N9s4Fd{jgEV#!{| zcm0~ZPHqw$4D5|YLV?_y%w-BT2ip&u+iN$X_uazp&`>Do36N3bJ6BEu72C!cBF@>> z0f`Z|=-M%zN|0y;qsDs=Rk&zi`^7E7o1U9$L#e`X_z8w*K^JKx|p73jEI|Hf&md@mX2D&Ii_pdqP$hZ57{UI}V!oKm15I!2&a z1nl5JqI5%Y`k40-OLXVIIKQA)zyDtH-E_Gq1NVv7f5^CO zA_5m%parf8Vw>zFEwQOz%T&Q=988(&qLpIl$yed^sca#^X?{#frZEZ{`rHA;i}rIpuC9 zBXdr|^8;LB)dNskdD}Mp8@4PhaDA~>s=UZ9p28kuRnd2zN)@iy*hFdaM5q#2Z8(X; z92NkchSy#Zup&~h9*@to4@@Ztmq)tP-(+aCDR^a2rrMrAU=|v0gZ*;cJRzDI)hHPj z1;Ya7F=7*bVT{2lw@es)3DaR5aW|rrSnOO7;k&cThKie6zia*9zi-r3(EQ5IbUM^7 zyL{<|IDfa;RV99@D@sC`A>>DgGB$6tAc}RT4ISgL!zq5p0Tp|#Ye?9|IGMy=V8LM! zw$W-+#R8k4+Lnx7voJ{u+LTdGR-s*%%~PSu!l_s;)N?voy+z9`$VXt|k;bIhTF5LF zm*4C|FCdGzV>SkpO2(}X8%nO&;pn^?tijP6qI1!)0qV;z~75%!U=th>u4y8`N#e?G~LKxZd1z{ctlq_DMC7T$Avv811 zk}`=4Qv-q4xN{a7Tq1S+(Imd~w`(feUDEu$bydV5ePaG|Q4>*ybM8| zj3ar6lBNcXvv6msmTH)NlF0ZSk1JS*8jj?F?=U`&h2 z+{J77YCt6v3h4l31+Ix^Y=9K}{PbYEp+S-u9b}itNeuqVqHq$Z8>S1HR{&;R#16Q` zUb^HC=I8i|oSD@PgRLnjf5V)eQqIDsZ7#i3X?qf<=jE89ZAH|DPRaK>8Y&W9N*mSN zz>6}6c%io8Kmt}N#bc22rM?40V6%vW&E8|i4}N1RzI+>>A70L&Ugz(p-OYd5-+Uf! zj?S)oj~9148e~$uWKl^9CkQT-RT77C#t?ARy1$Fse*;~XDRjanPu*nJO@>&*hASAPQAT7 z3UC$h8HNAxGU1Mhh~e z?r|Mb>)f7HOhw4B+>R+|tL8Rp1FF+4dak3u;#a#NFymA!IMc5(uYpGmo_;xVqsjm+ zFp`plSP_<0CaWD0;ORbBL2EP_T?IfiGZghbY($is)DwsxuMyvr7D=)8=o;kxx+>H0e}FUI5CaOaTaZP{+rjwCq7-)9AweemYnC@ zFkY(vl`!+1`kx*LP1ow2$rg;94u@7M2YxfIsa(zLn?Ux?tQk}2nVZi}(7EPtycZZV zJ|*oMCg3zu^656qzjmbqW}o5L^>5HdKCqHMV1$%os1pCLqVY-GOe4CA8pU|QW_ifF zcH8o+2K<{1_d?r-paXHad?OOWUnjR)oDCM{;Uu3)|Ib%pCznkHe;$uuK*wK;oTI6r zhhfiS44nA-1`taHKPq5fiyCqG)e((nyBF_1S4R-CcgI)?kjn~?zAsA12XON^} z4z_#;L_A7V*mYr7EKq`wLG9};Nt=~jZ(xF$lYlu&ga~f@ba>M67ELBXIj|fdA#CxG zncwuXJS5w-bw81>{#sB&#y!u3f<%_=wgsA4pqpS^@2mNA02ZPpuB{;Zrg3|qDJ`)+ z7QBP8%nw4bA!0Ll0|O5QfQZxX*(q=J?9``_+B0ESGO!&AF{b^4=Rg8hdr3rxE1%Qs zBIQby$c(_#jFIk#t?}`2Hpt6Zn+VK(XR1zJ&+&@JZ|uaHYssS|p9UWf7y{8MU4Axj zva1*7H}m$z`;@!)btLi(hJR~$2uiq|MK;R!>8sZ#hg+CrEx+1MWzm!W$M8+Ysk% z?+t7;pehhNZx;|^da5)ATNztHnKFt)7{j<|BfaDe@D6ZOo(SlRFr_?J=O~}%bUzXB z$1M*weDYv;um5Vp(uK#E(}gWD0@@#$#Ub)bO`}K7DFWZw^k7-2z-W7(OkzHT=^qdW zA8@gVNdvzzr>3teL4{d}ei0BH2&rR{P*CODiK5z8coQ8uruu-C?ICI8f{jzW`upzf z(Sb;O5(v_p5`ohDJY9?dUgaH;@+kW(tU9b}T<)@EmYJT1atI{9()y=lD$FMdV{~T+ zhe{fYCCp}V&twUCjJfiriWn7{yU8YMFv$ji3C=gCzH|TE*icqnU+iBEqAvI>JW}61roSuv>uB-j_LWD6iw`th_?`h2th=80PFR@n8nrfUSBmfo5nT zvp7$gSBiZNn!0hLv1RR(aEhqZ55rTKRPfyk^Xf@B zs7sNkCy3;^p(tA+v6x??(7%gR45(5y7+qyJXl$vE;Y@y5mI`;>(^j`P$CVIQUiS=V zj)T@p?pp;q94C;{aWz8nXy++oN00HiX1XRGuWbFJCRx# zh=PYcvje;uJh*znU=rK6L~EYN5ix6>J>AT=tNTEzi>k)q%NCAaOJ85kN)5I>%L>LK zTV4}ZkY3YRZ7bU3>&a+Xd|O&mtSwcOFT&;3W(cSutsK3Mh%~}a?C3+w z*lGYuF9Cdg8y8?ViMKlV!ofViIYv5pN$LrNdd@=e4HK8VzDVEX*$min6&PU<5_@|# zFUG;CsC0@k5ocCTK((yVbH$hRQ*>gTS{AZI+oA}Rme+U>^5P87AJF5ug~r1S_)N2| zLytO$TiTKJTis zVVHgi3;5|MgEr&bESs?sq*UOW?fRNvT7Lelg@lUSb<0mRHO!}!?ycpqSP=Aro{ERN zP8sl7n}bxoi#osk=ACw19uGyAbAdg2B5xC82H7|GJ8#v!BYg{|8W7UIfceQ5r@d#fPsV0b(1 z7V?frMUPop-|#h?LakmHxI;v55jJaOwA3#>E|)bky2q!7*hX_bRZn z7*ci|`{RREDG6>G0K9HME!~W#S0`#$mrvy)*DL*SCO=R)Fd2-IFV_bOz&>}y)>aee zA+J?BZHA0p)Sc%A-PCQ2s~>Sy>t8okF_nouUma9)y*!SRau4sz?fj+x{9Yd8;3i+qefz`C5IWrgX~7OIH;LoYEEmo7nocYgEx1 zBR05`c6^)O)O1I(vKEqe%LPc!4^%EI>}bGElj62eE37qsBUUZsLQ;R#*lrc`&1WVV zEo-#MP&J^bx8++VoE`yE6+x^Yw-+la(>(W*2o{PQjH(A;Iq>db=eO7Dhuflud@kFr z48J-+yOW67e?FTotkVk@?A5RXDuNN3FS$t>NndOOudfcTJ}w* zugD2zmv2kGX0~MZ&IIK%gZHE~IZLQfhgK$c8Z`_mtuY(hN}vRNM=w)6$iN!HN9)3T zIDWyMMn%he(Cx|%M!X1zzP#dq-BPEl<#l!+*znR3Wmn?^0>ttXp)Q)ewW~EN*LW>M zL9aYB-Y>-0&|I#UTXifZDsB1x3ZT79NCnf?C^FZx zDx>%NN&AYF9)YNi3*@|IGMw0VcBAms7aQqf$N@X z3JomTEai|vXc@|n15wPvp^A~aLuhBrWe&*pRD-^R21Q8BcgBRZw+!~n)DM!#D06EB zYM`oO)4(mqN{Vd#O&=ULc6ZO16a0D~A(F+_DIs2QAp?psr@=o@yod15_up&&lSH!9 z?Z?968c!BhV)gsqipMVQLKFABe_{EuVzHMpoeD z;*EM_^@r#7HgAQGv%G}%nESiJT2ZW@Ot~TSL`x>e{Qb!VzA1|51)jKkW&41wD!6(2 zLLhQ>xS6_=u3d|)b!UUkyq>>(gT5^%`fF+FJ85~2+3A8b145#r`3I2kpq7jnDLKct zHbGImvlcB2{TWeRB2~7ss?RQo)JaAXsaKjfHsR3XDmytJ^_?e4Bh$8JI1+X*RgeVL zK*Vrd)_qz1QA_r3%S#F{T=a+tkx+_zX;pryZSC=0GsV6BhBnK5Xk?1VL|AsV_-iv= zed~5f@A=Uxy*0<^)L)TnT+94Kq8A{opugpQ^a-}Pv_!E5I`F8B^Fe%`U_^A|$s`fa zLP7`qU6eTEaymJr>m31QOQd{d#tV|uEX^3KAVj{J`kiw??;F+rG0$LM z+P&KoIn^43oBw*!nIyZ7rj_bL8?oE>iNWMt>z@1k1auny%uBy$3`wjBp@`f-SZeKnz zf%$M(bYoF_Xr+x2vzIhkfx>hjMDY^Qj38hKgsk_X0@E5!xGIQfH5q0C;aqBi-H-sX zCxd*~Z?->WNgDX?wL8Yf5gU7mC&5d0_}6jH8BD+aHjn2qiwU{*bQn#R+)0Wz?43W# z;>nJG*$1i~80Y5p+khNIiF(znmf%Nh_j*%?N5RZcW`POim#BrEAt}ajbd-X95KdmO zcma-In^8J_EqbeGyDk-)%^Dmf)s14Dj7nYVyUv7RUlQkId)k?>OAXp<59Wn>i3r`74$+$Pn0QHj}n2)F#@L4F09lZKlbJ?gaO;Tg~{-lSi?w=x1V#1|r;&POB6 zFRcL&=o2?H*$X8qa_Ak{-#;Eq!s#rI=!r=VZeNq)b8c5AQ#LiwUnj{x6uL)`F6-{@ zxT`9;$0*~2@gGp6M~jN5&`vp9`N=u|_3Z)!+*&p>c{qE#l{6S%BmjY*>2LN7%S%$x zs930bmu1lCM-Ag~ADSUN=nE=w5qTuO21^L48BIN3Z0%H4At#dmPWB9DGkVSBanpQm zFe!SEpC+Zc8X}smv3l><8ol>DasR+&UxTI>+!SR?r>UtM=*DA+M`=V_g6PVghlX+A z+Y)B8bj6(y3^3yMsYG$+J$d5&*!0*XL-ifs0XhS07PNRgjY~6%=pztp{o$F}Qh;sm z?s~mm)4S(&FMH3M*xCa?8_2>(tgQP3mBFw3Ua#GIu)U-iMw_!Kj_m5TZ;eLx={Gu*3CKS0#|M~|#m6_pyQ&)IA=0+IEWJVd7a!vFJ;%DC(h^ITEDx<0);yQcpBVHf zfc_Ew(P20pM50^`(5D}Pv!9GJ8Ob{R#Kq`Zz*a?a2BR4Ca0r7RyiM;DYS4RL54nO% zBoJ`WghaZu4t(t`d0p|wL^zIQ%(LD>n-S>VYA2FdVMlFAMpkv-n%f#?LPs9+s@G;_rycR?#9#OHwo)xLLj2{Vl1{Fv^WTlK{x;pU53 zs3=hwxEZZ3>^B{eyQp2sa9>tq!)A$|ew{f-w6hWPsGy>&Xqez*4#x~kV6kdG?rOH4C;-WYk7G7ADIAQvAOY*ZE){&d zdrdzVTX(OyFNxEN=SV^+h|mrW;<00c-FRiABZs|>HG%--{Ge$(@PnS^ zeQ1@h6;4Le@T<~GK@Hq)Lt!MIazLKE>QNK5;?O3!jogzc(OBXx@@>8Or)xJqSlayH zX3f*9O@ixSK2bC3858f6Skq!8lA%a{u@C!aj_IYmiu6rmtAts}R{^;OV--@nYl?=a z>(ek;PQ&1)G)Ug;(=!5$9I0#a{eS_qY0bo#NGZ(YfP=cSoQpjdhrp^uqtmQ=yv5V21N7eo$Ou~)F(t~qaXQe0C9Qw!oQPjG9`Ay&m+F}Zio6D6cZ zTq`S$>0iszAu|X`f}WxO4l7fpQ5D;gh#eVWZ8KN~e6feKx1`C#&>IYZ4&gyOK{CaV zu&L-aJ&a7tZz7Tct;Ej%TpKqHIZu|b8aabojeKD+*g8wmR>ign$6}zY5tQuL)f)X| zmyfD>8Ifb;&u#H#P5+8Fyab57;H2$uiV2Mt{l+P6^VWqj{HDDc&mX_DAKTNO!IRt0 zT~i}qN~_Xa@QkR84Q<7K3QvE583U&AC;~Lo!oFX(Mr$NcZ_*et;FfJADa!!lY|fT1 z%buINW4||dJ9@;ka~3%)@~Y--8u?V+ZP`ulP}xleY9{UOu=f^0ifYq~M==>+=uO2M zGVT;~_mX;2<8J2X)J_QPx}^r-T4CII#=1hz4{Hxy^6-<3QA#uBw{@rCETC_L>=HLY z@i$Mr!GP$Tu>mHb_OcUAHHOx@OBI;pg67S@U@Qh#B=$@IvU9gJ1>=uY7wiY@xCEnz zM_7oU3f^SL%RFQj%9=v0kau{??EHKZGh?*4NglEKG-@(EhcdlYo(}bmanSgrtuaPd z&|sscG8fdr%QY!$@QvE6z~=2Vy!=^YH@C{o=QjFX{^myIfrAxTyN*0b=KT9-VKnW{ zI+wp0!+77V%jvKRPFRjv9w4k-Ew+>0dFqMh%{bdhycth|RbW-rSEu8ppu~d7JTJX8 z^JZC5Bovi)uxm8cH_6j{~*arEdR)ActR0A|q8H zfWE0;f?~5j)pFrxxZjb1iHe_3)k!?N=Z|O2Z$J*ghK;A!+2l)XKN?1I?J2R;Lk9=m zkOp1^LDSA5;cN%-U@CoCPvVnG9&b3XQkAy6M_ns0eVq`4-=Sm98TJSEZ{0a89pUCk z=qhMs0quC#9(HGoV7!I4L+5o_ba@8oqC;U`gviLLU2(aZxz2I@s~jiw2}meni>;(< zN+%7Q>O7^q<`~sc(>TAmzlCQU>`;&X9L#3)uO2QyAJj43mUnvA;>;k~!MWjLn#$=| z;k9;eh>w^AUMS{b|DUbOhpTgd5Hc=^x)fsH;u*WB&obY+1fhZ^0}|}0Lh*P6oeLeUDY8+F+3WZgHG({b8U1CWc0fIiz(=%R^N9@*C6L-$_ zI_w~(+FAVm0q;&>=5*YYK$G^nK1J2FMCvpiwqC6*W7auC)s&)HP`480JaK!Ki^W-RHBcG7{L{{xH; z*C_|R;>QBSjw03#0q#(mBIF{ym{)!CRlbXfFV0yHrLt7EMX63kxV+-vd$x*%G>l;# zO>ixl+W!jj@O6ON7inF3-9HQAu=9P1e@DLZ;MZGIn9Xj(R-QMI=M{$8ev*f2f#k`gJcQG}Q>kMIHg3|z^A){P`IfD1gUcpjp^L!7XKWfdsjtQNb}VZ7%(u|Q-z z6N6ztIZUNh7`tEC-8LPicV8!G+pZzaJ-vlW9i!HzX9sF+%C<4ypl>#ErGazwo2q3| zK~yO(+aQuIc!2nnF2G#2ysMUMqNP>VDzXO3jB)}pTQtC&d`%-=z&aWJ^am`obiBhx zOMA*~V`U~l#?Vi*bA5go&v~p=(Ua-9d{IJ66;bofg`GCArDasmD5!heVWX0*?=3yv z5OLw)OxxGc^ETK)VYUWxq~Q_oCFu24bea31jI|I}(>#b%3o$00PqX-3HoT}vF&-;b zE5)UlAUA4<8u{#shSk}43?#g31sqT>XY?-qhzCblur4 z0}$$%z8UQ>*MVLjpSWay=oSrw&}|wK6-@j4%Q&5jWO(e$CbU0qD0i>&`#U_ntP0g= zkcmQ4Ts!>QOwVYW?OH{}7RI9wAuUZ;f9k`~c$s~A;Ps%lY zdRCiAVULfJx=p=NMZvBWu^Eb&i(pNQH#=J_LmYg0ju&{uUFn9mXc_S2&eNa|@VCbg z@jRB}7AjF4{dLxwUe_GFD!I9&2ZAJew^LDcjPJ_vv-v{NuR2Umh$?vgP7U4u5y0l+ zb@N;1-BW2KKoI!N8&VH-=(Rh21n@V#IQQc4S+xhE#)nCkp4V0L0xWGVsf{lh=xl?Z z?A<+lAC`~chJ8nJd8c?27|)>)Kcn|-*|UCmHuY##GyKhM3#IEB4M&UOU{BnRH(l40 zWQly6Bw_=YBvzmXza~#~OOR#9Ou7mjyG>?uPy2ZHnm3X}3n2+`5B2U|gSb$+p^f*Q zWfcvjWZ2THPwFa`gg4RyCAx=wqavW+WJSW$4+x+0sN4df36w)m|IPc}<8L9bQ>=eu zQw=7P0{V9w=--u-ui6i609pe+Imn>W#q9E9O=Xo+so5YW!&;+b zhc%1rKN!zmh-^$ulDIC$^o_(UdZx2mriw@$i6Rnpa$p`>;PdmCUS+Gx5|(U;>{0cZ zBiy-;_TQk!6HJS96}unK5*$YO)=p;I>SII?^(HfwUEqBi(+XgoG#7rnBT9@%MydKC*;m5o$^6@I7 zlYTWN0QO5hCoWrKH*>M9lDanZ#;`%}yr&mGw>tD{Cov92<-PAQr3Q*Wfa&nw-_?ts zbV8Q=+TECVBuH;h((bN;8dEl>tiXCL>@|I_uPGwv92MmYUQ&DGldPzX3ukfq8dhvr zizX2Wnzfm7jZA3z-mqg(h3-ZH2A#RXOi4LOv;@S#k5&((&SjEzolRp86H zjhcJn>g5aT83l}3!z>SC`*riIxZqFg+6%}!v*A>1dF**yqor*l+WLC2Boy2EXy-z^ zGv>%&E3Y@l=@%nrSG^=HVt+T}JHfEa0r-|@{df0TU|L|hh>wnHgE(NQcL79`rvPKlspl{NcwB|9<%5#p_=_?7xAfMY+Nrzvg@G(nvsK zZa7^J-*8$J=DG`p`UHsa|4%5_&vk9yBMF4}n7eq5&I2}qyadWhPuy%PGjEzqV5eli zHDP{*RwGZA1Y6bfIVgtkNsr5#g76)y*n0u`5hz3^YWVNVxip=R!~!0T@(b37TLAf1S0{vhJQdW7M^x7 zP+s_}roM{#Rk{5%!lacv0+0>v%_FDHl$SRPgkHa{Gq8C_L@&|`6d;V%w+Ku&(Q$~i zu(@K6O>7*3VRK$>yc>L^tO=W3SHmb)+?&rnqH>z>7b$2cVM?FJ*)Ssy3pyV{3~_aY z23mPnjfer#lvpamww555831jVm{Ueq?F|vo=f49bKznMH?Murmkc=`bkStwRsr(hs zYgdApXgOl)rYqSHN>VLNtnU7O<(nr*53Q%n1AZ>!MZf7u~Hm7kJXQ1Ov zJ70PoHavSYr|w=8rHgx{A@B6M_r&X!J8^oCiQ^qqBR=Z3`N}84`98y5$|~5F#k*X& zd4216mPO57Y|*M{P)L|ne6N7$=Da;$SyqLU4An<>nT)0NXP5pG{M^^zM)Cp+Rp>G- z!5S>WH||Em&W#lwuE{F)h>XV4B+2=^aHdOZm2IzIxzdby<=bLtDI^ZbX;FM2{}@KF zd-N)wX=dhE2GUjj57vDlfp}+{+KZS52Wzvix~G|iTs%r9=9xpT@vG59x=6Tt0|6)N z!sn!%NAV5iovNRu=Mup;mw&Pu{W;||)}3+Mb}Ul63v9UNC5tOsh0OJhUoiDItbb(_ z>fvWXi>aLY8tz66T^T2ZChK5ZB-coOPHZSd7DPO65c$t!J3K^6{A4l90!j~AMk;XL zO|Amoa*JBx6HoL+ #include -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT extern TFT_eSPI tft2; -extern int32_t tftid; extern uint8_t YellowSense; +extern bool tftOverride; void TFTLog(String text); +void sendAvail(uint8_t wakeupReason); #endif diff --git a/ESP32_AP-Flasher/include/leds.h b/ESP32_AP-Flasher/include/leds.h index 0f094c11..6f9e0434 100644 --- a/ESP32_AP-Flasher/include/leds.h +++ b/ESP32_AP-Flasher/include/leds.h @@ -34,6 +34,8 @@ void shortBlink(CRGB cname); void showColorPattern(CRGB colorone, CRGB colortwo, CRGB colorthree); void rgbIdle(); void addFadeColor(CRGB cname); + #endif -void quickBlink(uint8_t repeat); \ No newline at end of file +void quickBlink(uint8_t repeat); +void addFadeMono(uint8_t value); diff --git a/ESP32_AP-Flasher/include/newproto.h b/ESP32_AP-Flasher/include/newproto.h index 61dc3c95..bdb71e04 100644 --- a/ESP32_AP-Flasher/include/newproto.h +++ b/ESP32_AP-Flasher/include/newproto.h @@ -16,6 +16,7 @@ extern bool checkCRC(void* p, uint8_t len); extern void processBlockRequest(struct espBlockRequest* br); extern void prepareCancelPending(const uint8_t dst[8]); extern void prepareIdleReq(const uint8_t* dst, uint16_t nextCheckin); +extern void prepareDataAvail(const uint8_t* dst); extern void prepareDataAvail(uint8_t* data, uint16_t len, uint8_t dataType, const uint8_t* dst); extern bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgument, const uint8_t* dst, uint16_t nextCheckin, bool resend = false); extern void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP); @@ -41,5 +42,5 @@ uint16_t countQueueItem(const uint8_t* targetMac); extern PendingItem* getQueueItem(const uint8_t* targetMac); extern PendingItem* getQueueItem(const uint8_t* targetMac, const uint64_t dataVer); void checkQueue(const uint8_t* targetMac); -bool queueDataAvail(struct pendingData* pending); +bool queueDataAvail(struct pendingData* pending, bool local); uint8_t* getDataForFile(fs::File& file); diff --git a/ESP32_AP-Flasher/include/powermgt.h b/ESP32_AP-Flasher/include/powermgt.h index 958a4522..2fbd68a0 100644 --- a/ESP32_AP-Flasher/include/powermgt.h +++ b/ESP32_AP-Flasher/include/powermgt.h @@ -1,5 +1,3 @@ #include - -//void doLeds(); void powerControl(bool powerState, uint8_t* pin, uint8_t pincount); diff --git a/ESP32_AP-Flasher/include/serialap.h b/ESP32_AP-Flasher/include/serialap.h index 0c44e3ac..635ad1ce 100644 --- a/ESP32_AP-Flasher/include/serialap.h +++ b/ESP32_AP-Flasher/include/serialap.h @@ -9,6 +9,7 @@ extern struct espSetChannelPower curChannel; #define AP_STATE_REQUIRED_POWER_CYCLE 4 #define AP_STATE_FAILED 5 #define AP_STATE_COMING_ONLINE 6 +#define AP_STATE_NORADIO 7 struct APInfoS { bool isOnline = false; diff --git a/ESP32_AP-Flasher/include/settings.h b/ESP32_AP-Flasher/include/settings.h index 6ca8b425..b24c367d 100644 --- a/ESP32_AP-Flasher/include/settings.h +++ b/ESP32_AP-Flasher/include/settings.h @@ -1,7 +1,7 @@ #include #define FLASHER_AP_PORT 0 -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER #define FLASHER_EXT_PORT 1 #define FLASHER_ALTRADIO_PORT 2 #endif diff --git a/ESP32_AP-Flasher/include/tag_db.h b/ESP32_AP-Flasher/include/tag_db.h index 8563b4c2..910ad43c 100644 --- a/ESP32_AP-Flasher/include/tag_db.h +++ b/ESP32_AP-Flasher/include/tag_db.h @@ -55,7 +55,7 @@ class tagRecord { struct Config { uint8_t channel; char alias[32]; - int16_t led; + uint8_t led; uint8_t tft; uint8_t language; uint8_t maxsleep; diff --git a/ESP32_AP-Flasher/include/usbflasher.h b/ESP32_AP-Flasher/include/usbflasher.h index 037b5cf3..44aeb248 100644 --- a/ESP32_AP-Flasher/include/usbflasher.h +++ b/ESP32_AP-Flasher/include/usbflasher.h @@ -1,4 +1,10 @@ #include +#define TRANSPORT_USB 0 +#define TRANSPORT_TCP 1 -void usbFlasherTask(void* parameter); \ No newline at end of file +#ifdef HAS_USB +void usbFlasherTask(void* parameter); +#endif +void flasherDataHandler(uint8_t* data, size_t len, uint8_t transportType); +void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType); diff --git a/ESP32_AP-Flasher/include/web.h b/ESP32_AP-Flasher/include/web.h index 68338cda..e243626c 100644 --- a/ESP32_AP-Flasher/include/web.h +++ b/ESP32_AP-Flasher/include/web.h @@ -13,6 +13,7 @@ void wsSendTaginfo(const uint8_t *mac, uint8_t syncMode); void wsSendSysteminfo(); void wsSendAPitem(struct APlist *apitem); void wsSerial(const String &text); +void wsSerial(const String &text, const String &color); uint8_t wsClientCount(); extern AsyncWebSocket ws; diff --git a/ESP32_AP-Flasher/include/webflasher.h b/ESP32_AP-Flasher/include/webflasher.h new file mode 100644 index 00000000..f1ccd0f1 --- /dev/null +++ b/ESP32_AP-Flasher/include/webflasher.h @@ -0,0 +1,30 @@ +#include + +#ifdef HAS_EXT_FLASHER + +#include "web.h" + +#define WEBFLASH_ENABLE_AUTOFLASH 1 +#define WEBFLASH_ENABLE_USBFLASHER 2 +#define WEBFLASH_FOCUS 3 +#define WEBFLASH_BLUR 4 + +class Logger : public Print { + public: + Logger(); + + ~Logger(); + + size_t write(uint8_t c) override; + size_t write(const uint8_t* buffer, size_t size) override; + size_t printf(const char* format, ...); + size_t println(const char* text); + + private: +}; + +void webFlasherTask(void* parameter); +void handleWSdata(uint8_t* data, size_t len, AsyncWebSocketClient* client); +void sendDataToClient(const uint8_t* data, size_t len); + +#endif \ No newline at end of file diff --git a/ESP32_AP-Flasher/include/zbs_interface.h b/ESP32_AP-Flasher/include/zbs_interface.h index 2bdaafa4..9cebe9f5 100644 --- a/ESP32_AP-Flasher/include/zbs_interface.h +++ b/ESP32_AP-Flasher/include/zbs_interface.h @@ -13,7 +13,7 @@ public: void setSpeed(uint32_t speed); void set_power(uint8_t state); void enable_debug(); - void reset(); + void reset(bool leavepower = true); void send_byte(uint8_t data); uint8_t read_byte(); void write_byte(uint8_t cmd, uint8_t addr, uint8_t data); diff --git a/ESP32_AP-Flasher/platformio.ini b/ESP32_AP-Flasher/platformio.ini index 927c1b58..da739e78 100644 --- a/ESP32_AP-Flasher/platformio.ini +++ b/ESP32_AP-Flasher/platformio.ini @@ -59,6 +59,7 @@ build_flags = -D BOARD_HAS_PSRAM -D SAVE_SPACE -D POWER_NO_SOFT_POWER + -D SAVE_SPACE -D FLASHER_AP_SS=11 -D FLASHER_AP_CLK=9 -D FLASHER_AP_MOSI=10 @@ -71,7 +72,7 @@ build_flags = -D FLASHER_LED=15 -D FLASHER_RGB_LED=33 build_src_filter = - +<*>---- + +<*>----- board_build.psram_type=qspi_opi board_upload.maximum_size = 4194304 board_upload.maximum_ram_size = 327680 @@ -107,7 +108,7 @@ build_flags = -D FLASHER_LED=15 -D FLASHER_RGB_LED=-1 build_src_filter = - +<*>---- + +<*>----- board_build.psram_type=qspi_opi board_upload.maximum_size = 4194304 board_upload.maximum_ram_size = 327680 @@ -126,7 +127,7 @@ build_unflags = build_flags = -std=gnu++17 ${env.build_flags} - -D OPENEPAPERLINK_PCB + -D HAS_EXT_FLASHER -D ARDUINO_USB_MODE=0 -D CONFIG_ESP32S3_SPIRAM_SUPPORT=1 -D CONFIG_SPIRAM_USE_MALLOC=1 @@ -197,8 +198,9 @@ build_flags = -D FLASHER_AP_TXD=17 -D FLASHER_AP_RXD=16 -D FLASHER_LED=22 + -D SAVE_SPACE build_src_filter = - +<*>---- + +<*>----- ; ---------------------------------------------------------------------------------------- ; !!! this configuration expects an ESP32-S3 16MB Flash 8MB RAM ; ---------------------------------------------------------------------------------------- @@ -215,7 +217,7 @@ lib_deps = build_flags = -std=gnu++17 ${env.build_flags} - -D YELLOW_IPS_AP + -D HAS_TFT -D CORE_DEBUG_LEVEL=0 -D ARDUINO_USB_MODE=0 -D CONFIG_ESP32S3_SPIRAM_SUPPORT=1 @@ -254,8 +256,9 @@ build_flags = -D SERIAL_FLASHER_INTERFACE_UART=1 -D SERIAL_FLASHER_BOOT_HOLD_TIME_MS=50 -D SERIAL_FLASHER_RESET_HOLD_TIME_MS=100 + -D C6_OTA_FLASHING build_src_filter = - +<*>-- + +<*>--- board_build.flash_mode=qio board_build.arduino.memory_type = qio_opi board_build.psram_type=qspi_opi @@ -302,7 +305,7 @@ build_flags = -D SERIAL_FLASHER_RESET_HOLD_TIME_MS=100 -D C6_OTA_FLASHING build_src_filter = - +<*>-- + +<*>--- board_build.flash_mode=qio board_build.arduino.memory_type = qio_opi board_build.psram_type=qspi_opi @@ -348,12 +351,102 @@ build_flags = -D SD_CARD_MOSI=14 -D SD_CARD_SS=12 build_src_filter = - +<*>--- + +<*>---- board_build.flash_mode=qio board_upload.maximum_size = 16777216 board_upload.maximum_ram_size = 327680 board_upload.flash_size = 16MB ; ---------------------------------------------------------------------------------------- +; !!! this configuration expects an ESP32-S3 16MB Flash 8MB RAM +; ---------------------------------------------------------------------------------------- +[env:OpenEPaperLink_Mini_AP_v4] +board = esp32-s3-devkitc-1 +board_build.partitions = large_spiffs_16MB.csv +monitor_dtr = 0 +monitor_rts = 0 +build_unflags = + -std=gnu++11 + -D CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y + -D ILI9341_DRIVER +lib_deps = + ${env.lib_deps} +build_flags = + -std=gnu++17 + ${env.build_flags} + -D HAS_TFT + -D HAS_EXT_FLASHER + -D CORE_DEBUG_LEVEL=1 + -D ARDUINO_USB_CDC_ON_BOOT=1 + -D CONFIG_ESP32S3_SPIRAM_SUPPORT=1 + -D CONFIG_SPIRAM_USE_MALLOC=1 + -D POWER_NO_SOFT_POWER + -D BOARD_HAS_PSRAM + -D POWER_RAMPING + -D POWER_HIGH_SIDE_DRIVER + -D CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y + -D FLASHER_AP_SS=-1 + -D FLASHER_AP_CLK=-1 + -D FLASHER_AP_MOSI=-1 + -D FLASHER_AP_MISO=-1 + -D FLASHER_AP_RESET=47 + -D FLASHER_AP_POWER={-1} + -D FLASHER_AP_TEST=-1 + -D FLASHER_AP_TXD=17 + -D FLASHER_AP_RXD=18 + -D FLASHER_DEBUG_TXD=15 + -D FLASHER_DEBUG_RXD=7 + -D FLASHER_DEBUG_PROG=21 + -D FLASHER_LED=16 + -D FLASHER_EXT_SS=40 + -D FLASHER_EXT_CLK=41 + -D FLASHER_EXT_MOSI=2 + -D FLASHER_EXT_MISO=42 + -D FLASHER_EXT_RESET=5 + -D FLASHER_EXT_POWER={6} + -D FLASHER_EXT_TXD=38 + -D FLASHER_EXT_RXD=39 + -D FLASHER_EXT_TEST=4 + -D FLASHER_ALT_SS=-1 + -D FLASHER_ALT_CLK=-1 + -D FLASHER_ALT_MOSI=-1 + -D FLASHER_ALT_MISO=-1 + -D FLASHER_ALT_RESET=-1 + -D FLASHER_ALT_POWER={-1} + -D FLASHER_ALT_TXD=-1 + -D FLASHER_ALT_RXD=-1 + -D FLASHER_ALT_TEST=-1 + -D HAS_RGB_LED + -D FLASHER_RGB_LED=48 + -D ST7735_DRIVER + -D ST7735_GREENTAB160x80 + -D TFT_INVERSION_ON + -D TFT_WIDTH=80 + -D TFT_HEIGHT=160 + -D TFT_MISO=-1 + -D TFT_MOSI=13 + -D TFT_SCLK=12 + -D TFT_CS=10 + -D TFT_DC=11 + -D TFT_RST=1 + -D TFT_RGB_ORDER=TFT_BGR + -D USE_HSPI_PORT + -D LOAD_FONT2 + -D LOAD_FONT4 + -D LOAD_GLCD + -D MD5_ENABLED=1 + -D SERIAL_FLASHER_INTERFACE_UART=1 + -D SERIAL_FLASHER_BOOT_HOLD_TIME_MS=50 + -D SERIAL_FLASHER_RESET_HOLD_TIME_MS=100 + -D C6_OTA_FLASHING +build_src_filter = + +<*> +board_build.flash_mode=qio +board_build.arduino.memory_type = qio_opi +board_build.psram_type=qspi_opi +board_upload.maximum_size = 16777216 +board_upload.maximum_ram_size = 327680 +board_upload.flash_size = 16MB +; ---------------------------------------------------------------------------------------- ; !!! this configuration expects an SONOFF ZB Bridge-P ; ---------------------------------------------------------------------------------------- ;[env:Sonoff_zb_bridge_P_AP] diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index cbedcba0..014a75ed 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -7,6 +7,7 @@ #define CONTENT_BIGCAL #define CONTENT_NFCLUT #define CONTENT_DAYAHEAD +#define CONTENT_TIMESTAMP #endif #define CONTENT_CAL #define CONTENT_BUIENRADAR @@ -41,6 +42,12 @@ // https://csvjson.com/json_beautifier +bool needRedraw(uint8_t contentMode, uint8_t wakeupReason) { + // contentmode 26, timestamp + if ((wakeupReason == WAKEUP_REASON_BUTTON1 || wakeupReason == WAKEUP_REASON_BUTTON2) && contentMode == 26) return true; + return false; +} + void contentRunner() { if (config.runStatus == RUNSTATUS_STOP) return; @@ -49,11 +56,11 @@ void contentRunner() { for (tagRecord *taginfo : tagDB) { if (taginfo->RSSI && - (now >= taginfo->nextupdate || taginfo->wakeupReason == WAKEUP_REASON_NFC) && + (now >= taginfo->nextupdate || needRedraw(taginfo->contentMode, taginfo->wakeupReason)) && config.runStatus == RUNSTATUS_RUN && Storage.freeSpace() > 31000 && !util::isSleeping(config.sleepTime1, config.sleepTime2)) { drawNew(taginfo->mac, taginfo); - // taginfo->wakeupReason = 0; + taginfo->wakeupReason = 0; } if (taginfo->expectedNextCheckin > now - 10 && taginfo->expectedNextCheckin < now + 30 && taginfo->pendingIdle == 0 && taginfo->pendingCount == 0) { @@ -73,7 +80,7 @@ void contentRunner() { minutesUntilNextUpdate = (nextWakeTime - now) / 60 - 2; } if (minutesUntilNextUpdate > 1 && (wsClientCount() == 0 || config.stopsleep == 0)) { - taginfo->pendingIdle = minutesUntilNextUpdate; + taginfo->pendingIdle = minutesUntilNextUpdate * 60; if (taginfo->isExternal == false) { Serial.printf("sleeping for %d more minutes\n", minutesUntilNextUpdate); prepareIdleReq(taginfo->mac, minutesUntilNextUpdate); @@ -180,7 +187,7 @@ void drawNew(const uint8_t mac[8], tagRecord *&taginfo) { char hexmac[17]; mac2hex(mac, hexmac); String filename = "/temp/" + String(hexmac) + ".raw"; -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT if (isAp) { filename = "direct"; } @@ -287,6 +294,11 @@ void drawNew(const uint8_t mac[8], tagRecord *&taginfo) { } else { wsErr("Error accessing " + filename); } + } else { + // configfilename is empty. Probably the tag needs to redisplay the image after a reboot. + Serial.println("Resend static image"); + // fixme: doesn't work yet + // prepareDataAvail(mac); } taginfo->nextupdate = 3216153600; } break; @@ -508,10 +520,13 @@ void drawNew(const uint8_t mac[8], tagRecord *&taginfo) { taginfo->nextupdate = 3216153600; break; +#ifdef CONTENT_TIMESTAMP case 26: // timestamp + taginfo->nextupdate = 3216153600; drawTimestamp(filename, cfgobj, taginfo, imageParams); updateTagImage(filename, mac, 0, taginfo, imageParams); - taginfo->nextupdate = 3216153600; + break; +#endif #ifdef CONTENT_DAYAHEAD case 27: // Day Ahead: @@ -1459,7 +1474,7 @@ bool getDayAheadFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, StaticJsonDocument<512> loc; getTemplate(loc, 27, taginfo->hwType); - // This is a link to a Google Apps Script script, which fetches (and caches) the tariff from https://transparency.entsoe.eu/ + // This is a link to a Google Apps Script script, which fetches (and caches) the tariff from https://transparency.entsoe.eu/ // I made it available to provide easy access to the data, but please don't use this link in any projects other than OpenEpaperLink. String URL = "https://script.google.com/macros/s/AKfycbwMmeGAaPrWzVZrESSpmPmD--O132PzW_acnBsuEottKNATTqCRn6h8zN0Yts7S56ggsg/exec?country=" + cfgobj["country"].as(); @@ -1546,8 +1561,8 @@ bool getDayAheadFeed(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, spr.fillRect(barX + i * barwidth + 3, 5, barwidth - 6, 10, imageParams.highlightColor); spr.fillTriangle(barX + i * barwidth, 15, barX + i * barwidth + barwidth - 1, 15, - barX + i * barwidth + barwidth / 2, 15 + barwidth, imageParams.highlightColor); - spr.drawLine(barX + i * barwidth + barwidth / 2, 20 + barwidth, barX + i * barwidth + barwidth / 2, spr.height(), getColor("pink")); + barX + i * barwidth + (barwidth - 1) / 2, 15 + barwidth, imageParams.highlightColor); + spr.drawLine(barX + i * barwidth + (barwidth - 1) / 2, 20 + barwidth, barX + i * barwidth + (barwidth - 1) / 2, spr.height(), getColor("pink")); pricenow = price; } } @@ -1702,9 +1717,142 @@ void drawAPinfo(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgPa spr.deleteSprite(); } +#ifdef CONTENT_TIMESTAMP void drawTimestamp(String &filename, JsonObject &cfgobj, tagRecord *&taginfo, imgParam &imageParams) { - // todo + Serial.println("make Timestamp"); + time_t now; + time(&now); + struct tm timeinfo; + + StaticJsonDocument<512> loc; + getTemplate(loc, 1, taginfo->hwType); + + TFT_eSprite spr = TFT_eSprite(&tft); + initSprite(spr, imageParams.width, imageParams.height, imageParams); + + if (!cfgobj["#init"]) { + Serial.println("init"); + // init preload images + + char hexmac[17]; + mac2hex(taginfo->mac, hexmac); + + String filename2 = "/temp/" + String(hexmac) + "-2.raw"; + drawString(spr, cfgobj["button1"].as(), spr.width() / 2, 40, "calibrib30.vlw", TC_DATUM, TFT_BLACK); + drawString(spr, "Well done!", spr.width() / 2, 90, "calibrib30.vlw", TC_DATUM, TFT_BLACK); + spr2buffer(spr, filename2, imageParams); + + struct imageDataTypeArgStruct arg = {0}; + arg.preloadImage = 1; + arg.specialType = 17; // button 2 + arg.lut = 0; + prepareDataAvail(filename2, imageParams.dataType, *((uint8_t *)&arg), taginfo->mac, 5 | 0x8000 ); + + spr.fillRect(0, 0, spr.width(), spr.height(), TFT_WHITE); + + filename2 = "/temp/" + String(hexmac) + "-3.raw"; + drawString(spr, cfgobj["button2"].as(), spr.width() / 2, 40, "calibrib30.vlw", TC_DATUM, TFT_BLACK); + drawString(spr, "Well done!", spr.width() / 2, 90, "calibrib30.vlw", TC_DATUM, TFT_BLACK); + spr2buffer(spr, filename2, imageParams); + + arg.preloadImage = 1; + arg.specialType = 16; // button 1 + arg.lut = 0; + prepareDataAvail(filename2, imageParams.dataType, *((uint8_t *)&arg), taginfo->mac, 5 | 0x8000 ); + + cfgobj["#init"] = "1"; + } + + spr.fillRect(0, 0, spr.width(), spr.height(), TFT_WHITE); + drawString(spr, cfgobj["title"], spr.width() / 2, 10, "calibrib30.vlw", TC_DATUM, TFT_BLACK); + spr.drawLine(0, 40, spr.width(), 40, TFT_BLACK); + drawString(spr, cfgobj["button1"], 32, 145, "calibrib16.vlw", TC_DATUM, TFT_BLACK); + drawString(spr, cfgobj["button2"], 122, 145, "calibrib16.vlw", TC_DATUM, TFT_BLACK); + spr.fillTriangle(27, 160, 37, 160, 32, 165, TFT_BLACK); + spr.fillTriangle(127, 160, 117, 160, 122, 165, TFT_BLACK); + + uint8_t mode = cfgobj["mode"].as(); + switch (taginfo->wakeupReason) { + case WAKEUP_REASON_BUTTON2: + Serial.println("button 1"); + cfgobj["last1"] = now; + if (mode == 0) { + // 1 timestamp + cfgobj["last2"] = cfgobj["button1"].as(); + } + break; + case WAKEUP_REASON_BUTTON1: + Serial.println("button 2"); + if (mode == 0) { + // 1 timestamp + cfgobj["last1"] = now; + cfgobj["last2"] = cfgobj["button2"].as(); + } else { + cfgobj["last2"] = now; + // 2 timestamps + } + break; + } + + char dateString1[40]; + uint32_t nextaction = cfgobj["nextaction"].as(); + String dateformat = languageDateFormat[0] + " %H:%M"; + time_t timestamp = cfgobj["last1"].as(); + localtime_r(×tamp, &timeinfo); + strftime(dateString1, sizeof(dateString1), dateformat.c_str(), &timeinfo); + if (timestamp == 0) strcpy(dateString1, "never"); + + if (mode == 0) { + drawString(spr, "last:", 10, 50, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString1, spr.width() / 2, 50, "bahnschrift30.vlw", TC_DATUM, TFT_BLACK); + drawString(spr, cfgobj["last2"].as(), spr.width() / 2, 80, "bahnschrift30.vlw", TC_DATUM, TFT_BLACK); + + if (nextaction > 0 && timestamp > 0) { + timestamp += nextaction * 24 * 3600; + if (timestamp < taginfo->nextupdate) taginfo->nextupdate = timestamp; + localtime_r(×tamp, &timeinfo); + strftime(dateString1, sizeof(dateString1), languageDateFormat[0].c_str(), &timeinfo); + + drawString(spr, "next:", 10, 115, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString1, 50, 115, "calibrib16.vlw", TL_DATUM, timestamp < now ? imageParams.highlightColor : TFT_BLACK); + } + } else { + drawString(spr, cfgobj["button1"].as(), 10, 50, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString1, 20, 67, "fonts/bahnschrift20", TL_DATUM, TFT_BLACK); + + if (nextaction > 0 && timestamp > 0) { + timestamp += nextaction * 24 * 3600; + if (timestamp < taginfo->nextupdate) taginfo->nextupdate = timestamp; + localtime_r(×tamp, &timeinfo); + strftime(dateString1, sizeof(dateString1), languageDateFormat[0].c_str(), &timeinfo); + + drawString(spr, "next", 200, 50, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString1, 210, 67, "fonts/bahnschrift20", TL_DATUM, timestamp < now ? imageParams.highlightColor : TFT_BLACK); + } + + char dateString2[40]; + time_t timestamp = cfgobj["last2"].as(); + localtime_r(×tamp, &timeinfo); + strftime(dateString2, sizeof(dateString2), dateformat.c_str(), &timeinfo); + if (timestamp == 0) strcpy(dateString2, "never"); + + drawString(spr, cfgobj["button2"].as(), 10, 90, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString2, 20, 107, "fonts/bahnschrift20", TL_DATUM, TFT_BLACK); + + if (nextaction > 0 && timestamp > 0) { + timestamp += nextaction * 24 * 3600; + localtime_r(×tamp, &timeinfo); + strftime(dateString2, sizeof(dateString2), languageDateFormat[0].c_str(), &timeinfo); + + drawString(spr, "next", 200, 90, "calibrib16.vlw", TL_DATUM, TFT_BLACK); + drawString(spr, dateString2, 210, 107, "fonts/bahnschrift20", TL_DATUM, timestamp < now ? imageParams.highlightColor : TFT_BLACK); + } + } + + spr2buffer(spr, filename, imageParams); + spr.deleteSprite(); } +#endif bool getJsonTemplateFile(String &filename, String jsonfile, tagRecord *&taginfo, imgParam &imageParams) { if (jsonfile.c_str()[0] != '/') { diff --git a/ESP32_AP-Flasher/src/flasher.cpp b/ESP32_AP-Flasher/src/flasher.cpp index a32072dd..3882dc12 100644 --- a/ESP32_AP-Flasher/src/flasher.cpp +++ b/ESP32_AP-Flasher/src/flasher.cpp @@ -5,23 +5,29 @@ #include #include "LittleFS.h" -#include "storage.h" -// #include - #include "leds.h" #include "settings.h" +#include "storage.h" #include "time.h" #include "zbs_interface.h" +#ifdef HAS_EXT_FLASHER +#include "webflasher.h" +#define Seriallog logger +extern Logger logger; +#else +#define Seriallog Serial +#endif + #define FINGERPRINT_FLASH_SIZE 10240 -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER bool extTagConnected() { // checks if the TEST (P1.0) pin on the ZBS243 will come up high. If it doesn't, there's probably a tag connected. pinMode(FLASHER_EXT_TEST, INPUT_PULLDOWN); - vTaskDelay(5 / portTICK_PERIOD_MS); + vTaskDelay(10 / portTICK_PERIOD_MS); pinMode(FLASHER_EXT_TEST, INPUT_PULLUP); - vTaskDelay(5 / portTICK_PERIOD_MS); + vTaskDelay(10 / portTICK_PERIOD_MS); return !digitalRead(FLASHER_EXT_TEST); } #endif @@ -55,11 +61,10 @@ void dump(uint8_t *a, uint16_t l) { int8_t powerPinsAP[] = FLASHER_AP_POWER; int8_t pinsAP[] = {FLASHER_AP_CLK, FLASHER_AP_MISO, FLASHER_AP_MOSI, FLASHER_AP_RESET, FLASHER_AP_RXD, FLASHER_AP_SS, FLASHER_AP_TEST, FLASHER_AP_TXD}; -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER int8_t powerPinsExt[] = FLASHER_EXT_POWER; int8_t powerPinsAlt[] = FLASHER_ALT_POWER; uint8_t pinsExt[] = {FLASHER_EXT_CLK, FLASHER_EXT_MISO, FLASHER_EXT_MOSI, FLASHER_EXT_RESET, FLASHER_EXT_RXD, FLASHER_EXT_SS, FLASHER_EXT_TEST, FLASHER_EXT_TXD}; - #endif flasher::flasher() { @@ -90,7 +95,7 @@ bool flasher::connectTag(uint8_t port) { power_pins = validatePowerPinCount(powerPinsAP, sizeof(powerPinsAP)); result = zbs->begin(FLASHER_AP_SS, FLASHER_AP_CLK, FLASHER_AP_MOSI, FLASHER_AP_MISO, FLASHER_AP_RESET, (uint8_t *)powerPinsAP, power_pins, FLASHER_AP_SPEED); break; -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER case 1: power_pins = validatePowerPinCount(powerPinsExt, sizeof(powerPinsExt)); result = zbs->begin(FLASHER_EXT_SS, FLASHER_EXT_CLK, FLASHER_EXT_MOSI, FLASHER_EXT_MISO, FLASHER_EXT_RESET, (uint8_t *)powerPinsExt, power_pins, FLASHER_AP_SPEED); @@ -101,18 +106,17 @@ bool flasher::connectTag(uint8_t port) { break; #endif default: - Serial.printf("Tried to connect to port %d, but this port isn't available. Some dev borked it up, probably Jelmer.\n", port); return false; } if (!result) Serial.printf("I tried connecting to port %d, but I couldn't establish a link to the tag. That's all I know.\n", port); return result; } -void flasher::getFirmwareMD5() { +bool flasher::getFirmwareMD5() { uint8_t *buffer = (uint8_t *)malloc(FINGERPRINT_FLASH_SIZE); if (buffer == nullptr) { - Serial.print("couldn't malloc bytes for firmware MD5\n"); - return; + Seriallog.print("couldn't malloc bytes for firmware MD5\n"); + return false; } zbs->select_flash(0); @@ -131,8 +135,9 @@ void flasher::getFirmwareMD5() { for (uint8_t c = 0; c < 16; c++) { sprintf(md5char + (2 * c), "%02X", md5[c]); } - Serial.printf("MD5=%s\n", md5char); + Seriallog.printf("MD5=%s\n", md5char); free(buffer); + return true; } bool flasher::getInfoBlockMac() { @@ -140,13 +145,11 @@ bool flasher::getInfoBlockMac() { for (uint16_t c = 7; c < 8; c--) { mac[7 - c] = zbs->read_flash(c + 0x10); } - Serial.printf("Infopage mac="); uint16_t macsum = 0; for (uint8_t c = 0; c < 8; c++) { macsum += mac[c]; - Serial.printf("%02X", mac[c]); } - Serial.printf("\n"); + Seriallog.printf("Infopage mac=%02X%02X%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], mac[6], mac[7]); if (macsum == 0) return false; if (macsum > 0x5F9) return false; return true; @@ -162,7 +165,7 @@ bool flasher::getInfoBlockMD5() { macsum += md5[c]; sprintf(md5char + (2 * c), "%02X", md5[c]); } - Serial.printf("Infoblock MD5=%s\n", md5char); + Seriallog.printf("Infoblock MD5=%s\n", md5char); if (macsum == 0) return false; // invalid mac if (macsum > 0xF00) return false; // *probably* an invalid mac return true; @@ -183,9 +186,9 @@ bool flasher::findTagByMD5() { const char *jsonmd5 = elem["MD5"]; if (jsonmd5 != nullptr) { if (strncmp(md5char, jsonmd5, 32) == 0) { - Serial.print("MD5 Matches > "); + Seriallog.print("MD5 Matches > "); const char *name = elem["name"]; - Serial.println(name); + Seriallog.println(name); mac_suffix = strtoul(elem["mac_suffix"], 0, 16); mac_format = elem["mac_format"]; mac_offset = elem["mac_offset"]; @@ -197,7 +200,7 @@ bool flasher::findTagByMD5() { } Serial.print("Failed to find this tag's current firmware MD5 in the json database. If this tag is already OpenEpaperLink, this is to be expected.\n"); } else { - Serial.print("Failed to read json file\n"); + Seriallog.print("Failed to read json file /tag_md5_db.json\n"); } readfile.close(); return false; @@ -212,9 +215,9 @@ bool flasher::findTagByType(uint8_t type) { if (elem["type"] != nullptr) { uint8_t jtype = elem["type"]; if (jtype == type) { - Serial.print("Type Matches > "); + Seriallog.print("Type Matches > "); const char *name = elem["name"]; - Serial.println(name); + Seriallog.println(name); const char *jsonmd5 = elem["MD5"]; for (uint8_t c = 0; c < 16; c++) { @@ -236,9 +239,9 @@ bool flasher::findTagByType(uint8_t type) { } } } - Serial.print("Failed to find this tag's type in the json database.\n"); + Seriallog.print("Failed to find this tag's type in the json database.\n"); } else { - Serial.print("Failed to read json file\n"); + Seriallog.print("Failed to read json file\n"); } readfile.close(); return false; @@ -320,7 +323,7 @@ bool flasher::writeFlash(uint8_t *flashbuffer, uint16_t size) { if (!zbs->select_flash(0)) return false; zbs->erase_flash(); if (!zbs->select_flash(0)) return false; - Serial.printf("Starting flash, size=%d\n", size); + Seriallog.printf("Starting flash, size=%d\n", size); for (uint16_t c = 0; c < size; c++) { if (flashbuffer[c] == 0xFF) goto flashWriteSuccess; for (uint8_t i = 0; i < MAX_WRITE_ATTEMPTS; i++) { @@ -333,11 +336,11 @@ bool flasher::writeFlash(uint8_t *flashbuffer, uint16_t size) { flashWriteSuccess: if (c % 256 == 0) { #ifdef HAS_RGB_LED - shortBlink(CRGB::Yellow); + shortBlink(CRGB::White); #else quickBlink(2); #endif - Serial.printf("\rNow flashing, %d/%d ", c, size); + Seriallog.printf("\rNow flashing, %d/%d ", c, size); vTaskDelay(1 / portTICK_PERIOD_MS); } } @@ -412,7 +415,7 @@ bool flasher::writeFlashFromPackOffset(fs::File *file, uint16_t length) { if (!zbs->select_flash(0)) return false; zbs->erase_flash(); if (!zbs->select_flash(0)) return false; - Serial.printf("Starting flash, size=%d\n", length); + Seriallog.printf("Starting flash, size=%d\n", length); uint8_t *buf = (uint8_t *)malloc(256); uint16_t offset = 0; @@ -425,20 +428,21 @@ bool flasher::writeFlashFromPackOffset(fs::File *file, uint16_t length) { length = 0; } #ifdef HAS_RGB_LED - shortBlink(CRGB::Yellow); + shortBlink(CRGB::White); #else quickBlink(2); #endif - Serial.printf("\rFlashing, %d bytes left ", length); + Seriallog.printf("\r[Flashing %d bytes] ", length); + bool res = writeBlock256(offset, buf); offset += 256; if (!res) { - Serial.printf("Failed writing block to tag, probably a hardware failure\n"); + Seriallog.printf("Failed writing block to tag, probably a hardware failure\n"); return false; } vTaskDelay(1 / portTICK_PERIOD_MS); } - Serial.printf("\nFlashing done\n"); + Seriallog.printf("\nFlashing done\n"); return true; } @@ -452,8 +456,8 @@ bool flasher::writeFlashFromPack(String filename, uint8_t type) { uint8_t jtype = elem["type"]; if (jtype == type) { const char *name = elem["name"]; - Serial.print("Flashing from FW pack: "); - Serial.println(name); + Seriallog.print("Flashing from FW pack: "); + Seriallog.println(name); uint32_t offset = elem["offset"]; uint16_t length = elem["length"]; @@ -464,10 +468,10 @@ bool flasher::writeFlashFromPack(String filename, uint8_t type) { } } } - Serial.print("Failed to find this tag's type in the FW pack database.\n"); + Seriallog.print("Failed to find this tag's type in the FW pack database.\n"); } else { - Serial.println(err.c_str()); - Serial.print("Failed to read json header from FW pack\n"); + Seriallog.println(err.c_str()); + Seriallog.print("Failed to read json header from FW pack\n"); } readfile.close(); return false; @@ -501,6 +505,7 @@ bool flasher::writeBlock(uint16_t offset, uint8_t *data, uint16_t len, bool info return true; } +#ifndef C6_OTA_FLASHING uint16_t getAPUpdateVersion(uint8_t type) { StaticJsonDocument<512> doc; fs::File readfile = contentFS->open("/AP_FW_Pack.bin", "r"); @@ -625,12 +630,13 @@ bool doAPUpdate(uint8_t type) { delete f; return res; } +#endif void flashCountDown(uint8_t c) { - Serial.printf("\r%d ", c); + Seriallog.printf("\r%d ", c); for (c -= 1; c < 254; c--) { vTaskDelay(1000 / portTICK_PERIOD_MS); - Serial.printf("\r%d ", c); + Seriallog.printf("\r%d ", c); } } @@ -639,7 +645,7 @@ void flashCountDown(uint8_t c) { bool doTagFlash() { class flasher *f = new flasher(); if (!f->connectTag(FLASHER_EXT_PORT)) { - Serial.printf("Sorry, failed to connect to this tag...\n"); + Seriallog.printf("Sorry, failed to connect to this tag...\n"); return false; } @@ -647,7 +653,7 @@ bool doTagFlash() { if (f->findTagByMD5()) { // this tag currently contains original firmware, found its fingerprint - Serial.printf("Found original firmware tag, recognized its fingerprint (%s)\n", f->md5char); + Seriallog.printf("Found original firmware tag, recognized its fingerprint (%s)\n", f->md5char); f->readInfoBlock(); f->getFirmwareMac(); f->prepareInfoBlock(); @@ -658,7 +664,7 @@ bool doTagFlash() { // did find an infoblock MD5 that looks valid if (f->findTagByMD5()) { // did find the md5 in the database - Serial.printf("Found an already-flashed tag, recognized its fingerprint (%s)\n", f->md5char); + Seriallog.printf("Found an already-flashed tag, recognized its fingerprint (%s)\n", f->md5char); f->getInfoBlockMac(); f->getInfoBlockType(); f->readInfoBlock(); @@ -666,14 +672,14 @@ bool doTagFlash() { f->zbs->reset(); } else { // couldn't find the md5 from the infoblock - Serial.printf("Found an already-flashed tag, but we couldn't find its fingerprint (%s) in the database\n", f->md5char); + Seriallog.printf("Found an already-flashed tag, but we couldn't find its fingerprint (%s) in the database\n", f->md5char); return false; } } else { // We couldn't recognize the tag from it's fingerprint... - Serial.printf("Found a tag but didn't recognize its fingerprint\n", f->md5char); + Seriallog.printf("Found a tag but didn't recognize its fingerprint\n", f->md5char); f->backupFlash(); - Serial.printf("Saved this MD5 binary to filesystem\n"); + Seriallog.printf("Saved this MD5 binary to filesystem\n"); } delete f; return false; diff --git a/ESP32_AP-Flasher/src/ips_display.cpp b/ESP32_AP-Flasher/src/ips_display.cpp index 380a64bb..dcd7b267 100644 --- a/ESP32_AP-Flasher/src/ips_display.cpp +++ b/ESP32_AP-Flasher/src/ips_display.cpp @@ -7,7 +7,7 @@ #include "storage.h" #include "tag_db.h" -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT #include "ips_display.h" @@ -15,15 +15,17 @@ #define TFT_BACKLIGHT 14 TFT_eSPI tft2 = TFT_eSPI(); -int32_t tftid = -1; uint8_t YellowSense = 0; bool tftLogscreen = true; +bool tftOverride = false; void TFTLog(String text) { if (tftLogscreen == false) { tft2.fillScreen(TFT_BLACK); - tft2.setCursor(0, 5, 2); + tft2.setCursor(0, 0, (tft2.width() == 160 ? 1 : 2)); tftLogscreen = true; + } else { + if (tft2.width() == 160) tft2.setCursor(0, tft2.getCursorY(), 1); } if (text.isEmpty()) return; tft2.setTextColor(TFT_SILVER); @@ -34,12 +36,18 @@ void TFTLog(String text) { int httpIndex = text.indexOf("http"); tft2.print(text.substring(0, httpIndex)); tft2.setTextColor(TFT_YELLOW); - text = text.substring(httpIndex); + if (tft2.width() == 160) { + tft2.setCursor(0, tft2.getCursorY() + 8, 2); + text = text.substring(httpIndex + 7); + } else { + text = text.substring(httpIndex); + } } else if (text.indexOf(":") != -1) { int colonIndex = text.indexOf(":"); tft2.setTextColor(TFT_SILVER); tft2.print(text.substring(0, colonIndex + 1)); tft2.setTextColor(TFT_WHITE); + if (tft2.width() == 160) tft2.setCursor(0, tft2.getCursorY() + 8, 2); text = text.substring(colonIndex + 1); } else if (text.endsWith("!")) { tft2.setTextColor(TFT_GREEN); @@ -64,36 +72,34 @@ void sendAvail(uint8_t wakeupReason) { memcpy(&eadr.src, mac, 6); eadr.adr.lastPacketRSSI = WiFi.RSSI(); eadr.adr.currentChannel = config.channel; - eadr.adr.hwType = 0xE0; + eadr.adr.hwType = (tft2.width() == 160 ? 0xE1 : 0xE0); eadr.adr.wakeupReason = wakeupReason; eadr.adr.capabilities = 0; eadr.adr.tagSoftwareVersion = 0; eadr.adr.customMode = 0; processDataReq(&eadr, true); - if (wakeupReason) tftid = findId(eadr.src); } void yellow_ap_display_init(void) { - pinMode(YELLOW_SENSE, INPUT_PULLDOWN); vTaskDelay(100 / portTICK_PERIOD_MS); if (digitalRead(YELLOW_SENSE) == HIGH) YellowSense = 1; - pinMode(TFT_BACKLIGHT, OUTPUT); - digitalWrite(TFT_BACKLIGHT, HIGH); - - ledcSetup(6, 5000, 8); - ledcAttachPin(TFT_BACKLIGHT, 6); - ledcWrite(6, config.tft); + digitalWrite(TFT_BACKLIGHT, LOW); tft2.init(); tft2.setRotation(YellowSense == 1 ? 1 : 3); - tft2.fillScreen(TFT_BLACK); - tft2.setCursor(10, 5, 2); + tft2.setCursor(12, 0, (tft2.width() == 160 ? 1 : 2)); tft2.setTextColor(TFT_WHITE); - tft2.println("*** Initialising... ***"); tftLogscreen = true; + + ledcSetup(6, 5000, 8); + ledcAttachPin(TFT_BACKLIGHT, 6); + if (tft2.width() == 160) { + GPIO.func_out_sel_cfg[TFT_BACKLIGHT].inv_sel = 1; + } + ledcWrite(6, config.tft); } void yellow_ap_display_loop(void) { @@ -110,9 +116,16 @@ void yellow_ap_display_loop(void) { sendAvail(0xFC); first_run = 1; } - if (millis() - last_update >= 1000) { - tagRecord* tag = tagDB.at(tftid); - if (tag->pendingCount > 0) { + if (millis() - last_update >= 3000) { + uint8_t wifimac[8]; + WiFi.macAddress(wifimac); + memset(&wifimac[6], 0, 2); + tagRecord* tag = tagRecord::findByMAC(wifimac); + if (tag == nullptr) { + last_update = millis(); + return; + } + if (tag->pendingCount > 0 && tftOverride == false) { String filename = tag->filename; fs::File file = contentFS->open(filename); if (!file) { @@ -122,7 +135,7 @@ void yellow_ap_display_loop(void) { } TFT_eSprite spr = TFT_eSprite(&tft2); - if (tag->len == tft2.width() * tft2.height() * 2) spr.setColorDepth(16); + spr.setColorDepth(16); if (tag->len == tft2.width() * tft2.height()) spr.setColorDepth(8); spr.createSprite(tft2.width(), tft2.height()); void* spriteData = spr.getPointer(); diff --git a/ESP32_AP-Flasher/src/leds.cpp b/ESP32_AP-Flasher/src/leds.cpp index c995e3d6..d4729005 100644 --- a/ESP32_AP-Flasher/src/leds.cpp +++ b/ESP32_AP-Flasher/src/leds.cpp @@ -8,6 +8,7 @@ #include "leds.h" #include "settings.h" #include "tag_db.h" +#include "serialap.h" QueueHandle_t ledQueue; int maxledbrightness = 255; @@ -58,7 +59,6 @@ void addFadeColor(CRGB cname) { } void shortBlink(CRGB cname) { -#ifndef YELLOW_IPS_AP struct ledInstructionRGB* rgb = new struct ledInstructionRGB; rgb->ledColor = CRGB::Black; rgb->fadeTime = 0; @@ -75,7 +75,6 @@ void shortBlink(CRGB cname) { rgb->fadeTime = 0; rgb->length = 3; addToRGBQueue(rgb, false); -#endif } void flushRGBQueue() { @@ -91,6 +90,8 @@ void showColorPattern(CRGB colorone, CRGB colortwo, CRGB colorthree) { const int patternLengths[] = {600, 120, 200, 120, 200, 120}; const CRGB patternColors[] = {CRGB::Black, colorone, CRGB::Black, colortwo, CRGB::Black, colorthree}; + while (xQueueReceive(rgbLedQueue, &rgb, 0) == pdPASS) { } + for (int i = 0; i < sizeof(patternLengths) / sizeof(patternLengths[0]); i++) { rgb = new struct ledInstructionRGB; rgb->ledColor = patternColors[i]; @@ -131,7 +132,7 @@ void rgbIdleStep() { void setBrightness(int brightness) { maxledbrightness = brightness; -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT ledcWrite(6, config.tft); #endif #ifdef HAS_RGB_LED @@ -140,14 +141,14 @@ void setBrightness(int brightness) { } void updateBrightnessFromConfig() { - if (config.led != 0) { - int newbrightness = config.led; - if (newbrightness < 0) newbrightness = 0; - if (newbrightness != maxledbrightness) { - setBrightness(newbrightness); - } + int newbrightness = config.led; + if (newbrightness != maxledbrightness) { + setBrightness(newbrightness); } +#ifdef HAS_TFT ledcWrite(6, config.tft); +#endif + if (apInfo.state == AP_STATE_NORADIO) addFadeMono(config.led); } void addToMonoQueue(struct ledInstruction* mono) { @@ -176,7 +177,7 @@ void showMono(uint8_t brightness) { void quickBlink(uint8_t repeat) { for (int i = 0; i < repeat; i++) { struct ledInstruction* mono = new struct ledInstruction; -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT mono->value = 255; #else mono->value = maxledbrightness; @@ -222,7 +223,7 @@ void ledTask(void* parameter) { struct ledInstruction* monoled = nullptr; addFadeMono(0); -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT addFadeMono(255); #else addFadeMono(maxledbrightness); diff --git a/ESP32_AP-Flasher/src/main.cpp b/ESP32_AP-Flasher/src/main.cpp index 2d01252e..fa360274 100644 --- a/ESP32_AP-Flasher/src/main.cpp +++ b/ESP32_AP-Flasher/src/main.cpp @@ -13,7 +13,11 @@ #include "tagdata.h" #include "wifimanager.h" -#ifdef HAS_USB +#ifdef HAS_EXT_FLASHER +#include "webflasher.h" +#endif + +#if defined HAS_USB || defined HAS_EXT_FLASHER #include "usbflasher.h" #endif @@ -28,10 +32,6 @@ util::Timer intervalSysinfo(seconds(5)); util::Timer intervalVars(seconds(10)); util::Timer intervalSaveDB(minutes(5)); -#ifdef OPENEPAPERLINK_PCB -util::Timer tagConnectTimer(seconds(1)); -#endif - SET_LOOP_TASK_STACK_SIZE(16 * 1024); void delayedStart(void* parameter) { @@ -47,7 +47,7 @@ void delayedStart(void* parameter) { void setup() { Serial.begin(115200); Serial.print(">\n"); -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT extern void yellow_ap_display_init(void); yellow_ap_display_init(); #endif @@ -108,16 +108,12 @@ void setup() { } */ -#ifdef HAS_USB - // We'll need to start the 'usbflasher' task for boards with a second (USB) port. This can be used as a 'flasher' interface, using a python script on the host - xTaskCreate(usbFlasherTask, "usbflasher", 10000, NULL, configMAX_PRIORITIES - 10, NULL); -#endif - initAPconfig(); updateLanguageFromConfig(); updateBrightnessFromConfig(); + config.runStatus = RUNSTATUS_INIT; init_web(); xTaskCreate(initTime, "init time", 5000, NULL, 2, NULL); @@ -135,10 +131,18 @@ void setup() { } else { cleanupCurrent(); } - xTaskCreate(APTask, "AP Process", 6000, NULL, 2, NULL); + xTaskCreate(APTask, "AP Process", 6000, NULL, 5, NULL); vTaskDelay(10 / portTICK_PERIOD_MS); - config.runStatus = RUNSTATUS_INIT; +#ifdef HAS_USB + // We'll need to start the 'usbflasher' task for boards with a second (USB) port. This can be used as a 'flasher' interface, using a python script on the host + xTaskCreate(usbFlasherTask, "usbflasher", 10000, NULL, 5, NULL); +#endif + +#ifdef HAS_EXT_FLASHER + xTaskCreate(webFlasherTask, "webflasher", 8000, NULL, 3, NULL); +#endif + esp_reset_reason_t resetReason = esp_reset_reason(); if (resetReason == ESP_RST_PANIC) { Serial.println("Panic! Pausing content generation for 30 seconds"); @@ -164,29 +168,14 @@ void loop() { if (intervalSaveDB.doRun() && config.runStatus != RUNSTATUS_STOP) { saveDB("/current/tagDB.json"); } - if (intervalContentRunner.doRun() && apInfo.state == AP_STATE_ONLINE) { + if (intervalContentRunner.doRun() && (apInfo.state == AP_STATE_ONLINE || apInfo.state == AP_STATE_NORADIO)) { contentRunner(); } -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT extern void yellow_ap_display_loop(void); yellow_ap_display_loop(); #endif -#ifdef OPENEPAPERLINK_PCB - if (tagConnectTimer.doRun() && extTagConnected()) { - flashCountDown(3); - - pinMode(FLASHER_EXT_TEST, OUTPUT); - digitalWrite(FLASHER_EXT_TEST, LOW); - - doTagFlash(); - - vTaskDelay(10000 / portTICK_PERIOD_MS); - pinMode(FLASHER_EXT_TEST, INPUT); - vTaskDelay(1000 / portTICK_PERIOD_MS); - } -#endif - vTaskDelay(100 / portTICK_PERIOD_MS); } diff --git a/ESP32_AP-Flasher/src/makeimage.cpp b/ESP32_AP-Flasher/src/makeimage.cpp index 9b2106b6..16db2718 100644 --- a/ESP32_AP-Flasher/src/makeimage.cpp +++ b/ESP32_AP-Flasher/src/makeimage.cpp @@ -10,6 +10,10 @@ #include "storage.h" #include "util.h" +#ifdef HAS_TFT +#include "ips_display.h" +#endif + TFT_eSPI tft = TFT_eSPI(); TFT_eSprite spr = TFT_eSprite(&tft); @@ -276,11 +280,22 @@ void rewriteHeader(File &f_out) { void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) { long t = millis(); -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT extern uint8_t YellowSense; if (fileout == "direct") { - tft.setRotation(YellowSense == 1 ? 1 : 3); - spr.pushSprite(0, 0); + if (tftOverride == false) { + TFT_eSprite spr2 = TFT_eSprite(&tft2); + tft2.setRotation(YellowSense == 1 ? 1 : 3); + spr2.createSprite(spr.width(), spr.height()); + spr2.setColorDepth(spr.getColorDepth()); + + void *spriteData = spr.getPointer(); + void *spriteData2 = spr2.getPointer(); + size_t dataSize = spr.width() * spr.height() * (spr.getColorDepth() / 8); + memcpy(spriteData2, spriteData, dataSize); + + spr2.pushSprite(0, 0); + } return; } #endif diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index b6d368d2..3ee89670 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -82,10 +82,38 @@ void prepareIdleReq(const uint8_t* dst, uint16_t 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); + queueDataAvail(&pending, true); } } +void prepareDataAvail(const uint8_t* dst) { + // resend + tagRecord* taginfo = tagRecord::findByMAC(dst); + if (taginfo == nullptr) { + if (config.lock) return; + wsErr("Tag not found, this shouldn't happen."); + return; + } + + taginfo->pendingCount++; + taginfo->pendingIdle = 0; + + struct pendingData pending = {0}; + memcpy(pending.targetMac, dst, 8); + pending.availdatainfo.dataSize = taginfo->len; + pending.availdatainfo.dataType = taginfo->dataType; + pending.availdatainfo.nextCheckIn = 0; + memcpy(&pending.availdatainfo.dataVer, taginfo->md5, sizeof(uint64_t)); + pending.attemptsLeft = 10; + + queueDataAvail(&pending, !taginfo->isExternal); + if (taginfo->isExternal) { + udpsync.netSendDataAvail(&pending); + } + + wsSendTaginfo(dst, SYNC_TAGSTATUS); +} + void prepareDataAvail(uint8_t* data, uint16_t len, uint8_t dataType, const uint8_t* dst) { tagRecord* taginfo = tagRecord::findByMAC(dst); if (taginfo == nullptr) { @@ -121,23 +149,22 @@ void prepareDataAvail(uint8_t* data, uint16_t len, uint8_t dataType, const uint8 memcpy(pending.targetMac, dst, 8); pending.availdatainfo.dataSize = len; pending.availdatainfo.dataType = dataType; - pending.availdatainfo.nextCheckIn = 0; + pending.availdatainfo.nextCheckIn = 5 | 0x8000; // 5 seconds pending.availdatainfo.dataVer = *((uint64_t*)md5bytes); pending.attemptsLeft = 10; + queueDataAvail(&pending, !taginfo->isExternal); if (taginfo->isExternal) { udpsync.netSendDataAvail(&pending); - } else { - queueDataAvail(&pending); } wsSendTaginfo(dst, SYNC_TAGSTATUS); } bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgument, const uint8_t* dst, uint16_t nextCheckin, bool resend) { - if (nextCheckin > config.maxsleep) nextCheckin = config.maxsleep; - if (wsClientCount() && config.stopsleep == 1) nextCheckin = 0; -#ifdef YELLOW_IPS_AP + if ((nextCheckin & 0x8000) == 0 && nextCheckin > config.maxsleep) nextCheckin = config.maxsleep; + if ((nextCheckin & 0x8000) == 0 && wsClientCount() && (config.stopsleep == 1)) nextCheckin = 0; +#ifdef HAS_TFT if (filename == "direct") { char dst_path[64]; sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X.raw\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); @@ -196,7 +223,8 @@ bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgume time_t now; time(&now); - taginfo->pendingIdle = nextCheckin * 60 + 60; + + taginfo->pendingIdle = (nextCheckin & 0x8000) ? (nextCheckin & 0x7FFF) + 5 : (nextCheckin * 60) + 60; clearPending(taginfo); } else { wsLog("firmware upload pending"); @@ -216,9 +244,9 @@ bool prepareDataAvail(String& filename, uint8_t dataType, uint8_t dataTypeArgume pending.availdatainfo.nextCheckIn = nextCheckin; pending.attemptsLeft = attempts; checkMirror(taginfo, &pending); + queueDataAvail(&pending, !taginfo->isExternal); if (taginfo->isExternal == false) { Serial.printf(">SDA %02X%02X%02X%02X%02X%02X%02X%02X TYPE 0x%02X\n", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0], pending.availdatainfo.dataType); - queueDataAvail(&pending); } else { udpsync.netSendDataAvail(&pending); } @@ -241,10 +269,12 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { char hexmac[17]; mac2hex(pending->targetMac, hexmac); String filename = "/current/" + String(hexmac) + "_" + String(millis() % 1000000) + ".pending"; - String imageUrl = "http://" + remoteIP.toString() + "/getdata?mac=" + String(hexmac); - wsLog("prepareExternalDataAvail GET " + imageUrl); + char md5[17]; + mac2hex(reinterpret_cast(&pending->availdatainfo.dataVer), md5); + char imageUrl[80]; + snprintf(imageUrl, sizeof(imageUrl), "http://%s/getdata?mac=%s&md5=%s", remoteIP.toString().c_str(), hexmac, md5); + wsLog("prepareExternalDataAvail GET " + String(imageUrl)); HTTPClient http; - logLine("http prepareExternalDataAvail " + imageUrl); http.begin(imageUrl); int httpCode = http.GET(); if (httpCode == 200) { @@ -254,9 +284,9 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { file.close(); xSemaphoreGive(fsMutex); } else if (httpCode == 404) { - imageUrl = "http://" + remoteIP.toString() + "/current/" + String(hexmac) + ".raw"; + snprintf(imageUrl, sizeof(imageUrl), "http://%s/current/%s.raw", remoteIP.toString().c_str(), hexmac); + // imageUrl = "http://" + remoteIP.toString() + "/current/" + String(hexmac) + ".raw"; http.end(); - logLine("http prepareExternalDataAvail " + imageUrl); http.begin(imageUrl); httpCode = http.GET(); if (httpCode == 200) { @@ -266,6 +296,9 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { file.close(); xSemaphoreGive(fsMutex); } + } else { + logLine("prepareExternalDataAvail " + String(imageUrl) + " error " + String(httpCode)); + wsLog("error " + String(httpCode)); } http.end(); @@ -299,10 +332,13 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { case DATATYPE_CUSTOM_LUT_OTA: { char hexmac[17]; mac2hex(pending->targetMac, hexmac); - String dataUrl = "http://" + remoteIP.toString() + "/getdata?mac=" + String(hexmac); - wsLog("GET " + dataUrl); + char dataUrl[80]; + char md5[17]; + mac2hex(reinterpret_cast(&pending->availdatainfo.dataVer), md5); + snprintf(dataUrl, sizeof(dataUrl), "http://%s/getdata?mac=%s&md5=%s", remoteIP.toString().c_str(), hexmac, md5); + wsLog("GET " + String(dataUrl)); HTTPClient http; - logLine("http DATATYPE_CUSTOM_LUT_OTA " + dataUrl); + logLine("http DATATYPE_CUSTOM_LUT_OTA " + String(dataUrl)); http.begin(dataUrl); int httpCode = http.GET(); if (httpCode == 200) { @@ -325,7 +361,7 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { } } checkMirror(taginfo, pending); - queueDataAvail(pending); + queueDataAvail(pending, !taginfo->isExternal); wsSendTaginfo(pending->targetMac, SYNC_NOSYNC); } @@ -365,7 +401,6 @@ void processBlockRequest(struct espBlockRequest* br) { if (br->blockId >= totalblocks) { br->blockId = totalblocks - 1; } - uint32_t len = queueItem->len - (BLOCK_DATA_SIZE * br->blockId); if (len > BLOCK_DATA_SIZE) len = BLOCK_DATA_SIZE; uint16_t checksum = sendBlock(queueItem->data + (br->blockId * BLOCK_DATA_SIZE), len); @@ -431,7 +466,7 @@ void processXferComplete(struct espXferComplete* xfc, bool local) { } // more in the queue? - checkQueue(xfc->src); + if (local) checkQueue(xfc->src); wsSendTaginfo(xfc->src, SYNC_TAGSTATUS); if (local) udpsync.netProcessXferComplete(xfc); @@ -507,7 +542,7 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP taginfo->expectedNextCheckin = 3216153600; taginfo->pendingIdle = 0; } else { - taginfo->expectedNextCheckin = now + 60 * taginfo->pendingIdle; + taginfo->expectedNextCheckin = now + taginfo->pendingIdle; taginfo->pendingIdle = 0; } taginfo->lastseen = now; @@ -537,7 +572,7 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP taginfo->temperature = eadr->adr.temperature; taginfo->batteryMv = eadr->adr.batteryMv; taginfo->hwType = eadr->adr.hwType; - taginfo->wakeupReason = eadr->adr.wakeupReason; + if (eadr->adr.wakeupReason > 0) taginfo->wakeupReason = eadr->adr.wakeupReason; taginfo->capabilities = eadr->adr.capabilities; taginfo->currentChannel = eadr->adr.currentChannel; taginfo->tagSoftwareVersion = eadr->adr.tagSoftwareVersion; @@ -618,8 +653,9 @@ bool sendAPSegmentedData(const uint8_t* dst, String data, uint16_t icons, bool i pending.attemptsLeft = 120; Serial.printf(">AP Segmented Data %02X%02X%02X%02X%02X%02X%02X%02X\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); if (local) { - return queueDataAvail(&pending); + return queueDataAvail(&pending, true); } else { + queueDataAvail(&pending, false); udpsync.netSendDataAvail(&pending); return true; } @@ -636,8 +672,9 @@ bool showAPSegmentedInfo(const uint8_t* dst, bool local) { pending.attemptsLeft = 120; Serial.printf(">SDA %02X%02X%02X%02X%02X%02X%02X%02X\n\0", dst[7], dst[6], dst[5], dst[4], dst[3], dst[2], dst[1], dst[0]); if (local) { - return queueDataAvail(&pending); + return queueDataAvail(&pending, true); } else { + queueDataAvail(&pending, false); udpsync.netSendDataAvail(&pending); return true; } @@ -663,8 +700,9 @@ bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local, const uint8_t* } if (local) { - return queueDataAvail(&pending); + return queueDataAvail(&pending, true); } else { + queueDataAvail(&pending, false); udpsync.netSendDataAvail(&pending); return true; } @@ -755,7 +793,7 @@ bool checkMirror(struct tagRecord* taginfo, struct pendingData* pending) { pending2.attemptsLeft = pending->attemptsLeft; if (taginfo2->isExternal == false) { - queueDataAvail(&pending2); + queueDataAvail(&pending2, true); } else { char dst_path[64]; sprintf(dst_path, "/current/%02X%02X%02X%02X%02X%02X%02X%02X_%lu.pending", taginfo2->mac[7], taginfo2->mac[6], taginfo2->mac[5], taginfo2->mac[4], taginfo2->mac[3], taginfo2->mac[2], taginfo2->mac[1], taginfo2->mac[0], millis() % 1000000); @@ -765,6 +803,7 @@ bool checkMirror(struct tagRecord* taginfo, struct pendingData* pending) { file.write(taginfo2->data, taginfo2->len); file.close(); xSemaphoreGive(fsMutex); + queueDataAvail(&pending2, false); udpsync.netSendDataAvail(&pending2); } else { xSemaphoreGive(fsMutex); @@ -850,12 +889,12 @@ void checkQueue(const uint8_t* targetMac) { if (queueItem == nullptr) { return; } - if (queueCount > 1) queueItem->pendingdata.availdatainfo.nextCheckIn = 0; + if (queueCount > 1) queueItem->pendingdata.availdatainfo.nextCheckIn = 5 | 0x8000; sendDataAvail(&queueItem->pendingdata); } } -bool queueDataAvail(struct pendingData* pending) { +bool queueDataAvail(struct pendingData* pending, bool local) { PendingItem newPending; newPending.pendingdata.availdatainfo = pending->availdatainfo; newPending.pendingdata.attemptsLeft = pending->attemptsLeft; @@ -882,7 +921,7 @@ bool queueDataAvail(struct pendingData* pending) { Serial.println("Reading file " + String(newPending.filename)); file.close(); } else { - Serial.println("Something's wrong... not found: " + String(newPending.filename)); + Serial.println("Warning: not found: " + String(newPending.filename)); } } newPending.len = taginfo->len; @@ -891,10 +930,11 @@ bool queueDataAvail(struct pendingData* pending) { enqueueItem(newPending); // first in line, send to tag Serial.printf("queue item added, first in line, total %d elements\n", pendingQueue.size()); - sendDataAvail(pending); + if (local) sendDataAvail(pending); } else { enqueueItem(newPending); Serial.printf("queue item added, total %d elements\n", pendingQueue.size()); + // to do: notify C6 to shorten the checkin time for the current SDA } return true; diff --git a/ESP32_AP-Flasher/src/ota.cpp b/ESP32_AP-Flasher/src/ota.cpp index d13ee61a..e627e1c1 100644 --- a/ESP32_AP-Flasher/src/ota.cpp +++ b/ESP32_AP-Flasher/src/ota.cpp @@ -41,12 +41,16 @@ void handleSysinfoRequest(AsyncWebServerRequest* request) { doc["psramsize"] = ESP.getPsramSize(); doc["flashsize"] = ESP.getFlashChipSize(); doc["rollback"] = Update.canRollBack(); -#if defined YELLOW_IPS_AP || defined C6_OTA_FLASHING - doc["C6"] = 1; +#if defined C6_OTA_FLASHING + doc["hasC6"] = 1; #else - doc["C6"] = 0; + doc["hasC6"] = 0; +#endif +#ifdef HAS_EXT_FLASHER + doc["hasFlasher"] = 1; +#else + doc["hasFlasher"] = 0; #endif - const size_t bufferSize = measureJson(doc) + 1; AsyncResponseStream* response = request->beginResponseStream("application/json", bufferSize); serializeJson(doc, *response); @@ -266,7 +270,7 @@ void C6firmwareUpdateTask(void* parameter) { Serial1.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); rxSerialStopTask2 = false; #ifdef FLASHER_DEBUG_RXD - xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, configMAX_PRIORITIES - 4, NULL); + xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, 2, NULL); #endif vTaskDelay(1000 / portTICK_PERIOD_MS); @@ -285,7 +289,7 @@ void C6firmwareUpdateTask(void* parameter) { } void handleUpdateC6(AsyncWebServerRequest* request) { -#if defined YELLOW_IPS_AP || defined C6_OTA_FLASHING +#if defined C6_OTA_FLASHING uint8_t doDownload = 1; if (request->hasParam("download", true)) { doDownload = atoi(request->getParam("download", true)->value().c_str()); diff --git a/ESP32_AP-Flasher/src/powermgt.cpp b/ESP32_AP-Flasher/src/powermgt.cpp index dba55014..6992cf58 100644 --- a/ESP32_AP-Flasher/src/powermgt.cpp +++ b/ESP32_AP-Flasher/src/powermgt.cpp @@ -4,7 +4,7 @@ #include "settings.h" -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER #include "soc/rtc_cntl_reg.h" #include "soc/soc.h" #endif @@ -29,7 +29,7 @@ void simpleAPPower(uint8_t* pin, uint8_t pincount, bool state) { // when drained if the board applies power, will cause the 3v3 rail to sag enough to reset the ESP32. This is obviously not great. To prevent this from happening, // we ramp up/down the voltage with PWM. Ramping down really is unnecessary, as the board has a resistor to dump the charge into. void rampTagPower(uint8_t* pin, bool up) { -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); #endif if (up) { @@ -69,7 +69,7 @@ void rampTagPower(uint8_t* pin, bool up) { ledcDetachPin(pin[0]); digitalWrite(pin[0], HIGH); } -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1); #endif } diff --git a/ESP32_AP-Flasher/src/serialap.cpp b/ESP32_AP-Flasher/src/serialap.cpp index fcda1401..f086c726 100644 --- a/ESP32_AP-Flasher/src/serialap.cpp +++ b/ESP32_AP-Flasher/src/serialap.cpp @@ -1,8 +1,8 @@ +#include "serialap.h" + #include #include -#include "serialap.h" - #include "commstructs.h" #include "contentmanager.h" #include "flasher.h" @@ -118,7 +118,7 @@ int8_t APpowerPins[] = FLASHER_AP_POWER; #define AP_RESET_PIN FLASHER_AP_RESET #define AP_POWER_PIN FLASHER_AP_POWER #endif -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER #if (AP_PROCESS_PORT == FLASHER_EXT_PORT) int8_t APpowerPins[] = FLASHER_EXT_POWER; #define AP_RESET_PIN FLASHER_EXT_RESET @@ -172,9 +172,11 @@ void APTagReset() { // Send data to the AP uint16_t sendBlock(const void* data, const uint16_t len) { + time_t timeCanary = millis(); if (!apInfo.isOnline) return false; if (!txStart()) return 0; - for (uint8_t attempt = 0; attempt < 5; attempt++) { + // don't retry now, as it collides with communication from the tag + for (uint8_t attempt = 0; attempt < 1; attempt++) { cmdReplyValue = CMD_REPLY_WAIT; AP_SERIAL_PORT.print(">D>"); if (waitCmdReply()) goto blksend; @@ -190,32 +192,51 @@ blksend: bd->checksum = 0; // calculate checksum + const uint8_t* dataBytes = reinterpret_cast(data); for (uint16_t c = 0; c < len; c++) { - bd->checksum += ((uint8_t*)data)[c]; + bd->checksum += dataBytes[c]; } // send blockData header - for (uint8_t c = 0; c < sizeof(struct blockData); c++) { - AP_SERIAL_PORT.write(0xAA ^ blockbuffer[c]); + dataBytes = reinterpret_cast(&blockbuffer); + const size_t bufferSize = sizeof(struct blockData); + uint8_t* modifiedHeader = static_cast(malloc(bufferSize)); + if (modifiedHeader != nullptr) { + for (size_t i = 0; i < bufferSize; i++) { + modifiedHeader[i] = 0xAA ^ dataBytes[i]; + } + AP_SERIAL_PORT.write(modifiedHeader, bufferSize); + free(modifiedHeader); } // send an entire block of data uint16_t c; - for (c = 0; c < len; c++) { - AP_SERIAL_PORT.write(0xAA ^ ((uint8_t*)data)[c]); + dataBytes = reinterpret_cast(data); + uint8_t* modifiedBuffer = static_cast(malloc(len)); + if (modifiedBuffer != nullptr) { + for (c = 0; c < len; c++) { + modifiedBuffer[c] = 0xAA ^ dataBytes[c]; + } + AP_SERIAL_PORT.write(modifiedBuffer, len); + free(modifiedBuffer); } // fill the rest of the block-length filled with something else (will end up as 0xFF in the buffer) - for (; c < BLOCK_DATA_SIZE; c++) { - AP_SERIAL_PORT.write(0x55); + const size_t remainingBytes = BLOCK_DATA_SIZE - c; + if (remainingBytes > 0) { + uint8_t fillBuffer[remainingBytes]; + memset(fillBuffer, 0x55, remainingBytes); + AP_SERIAL_PORT.write(fillBuffer, remainingBytes); } // dummy bytes in case some bytes were missed, makes sure the AP gets kicked out of data-loading mode - for (c = 0; c < 32; c++) { - AP_SERIAL_PORT.write(0xF5); - } + uint8_t dummyBuffer[32]; + memset(dummyBuffer, 0xF5, 32); + AP_SERIAL_PORT.write(dummyBuffer, 32); + if (apInfo.type != ESP32_C6) delay(10); txEnd(); + Serial.println("Sendblock complete, " + String(millis() - timeCanary) + "ms"); return bd->checksum; } @@ -353,21 +374,21 @@ void rxCmdProcessor(void* parameter) { case RX_CMD_RQB: processBlockRequest((struct espBlockRequest*)rxcmd->data); #ifdef HAS_RGB_LED - shortBlink(CRGB::Blue); + // shortBlink(CRGB::Blue); #endif quickBlink(3); break; case RX_CMD_ADR: processDataReq((struct espAvailDataReq*)rxcmd->data, true); #ifdef HAS_RGB_LED - shortBlink(CRGB::Aqua); + // shortBlink(CRGB::Aqua); #endif quickBlink(1); break; case RX_CMD_XFC: processXferComplete((struct espXferComplete*)rxcmd->data, true); #ifdef HAS_RGB_LED - shortBlink(CRGB::Purple); + // shortBlink(CRGB::Purple); #endif break; case RX_CMD_XTO: @@ -402,7 +423,9 @@ void rxSerialTask(void* parameter) { lastchar = AP_SERIAL_PORT.read(); switch (RXState) { case ZBS_RX_WAIT_HEADER: + Serial.write(lastchar); + // shift characters in for (uint8_t c = 0; c < 3; c++) { cmdbuffer[c] = cmdbuffer[c + 1]; @@ -614,6 +637,8 @@ void rxSerialTask2(void* parameter) { while (Serial2.available()) { lastchar = Serial2.read(); charCount++; + + // debug info Serial.write(lastchar); } vTaskDelay(1 / portTICK_PERIOD_MS); @@ -723,17 +748,34 @@ bool bringAPOnline() { } } +bool checkRadio() { + // make a short between FLASHER_AP_TXD and FLASHER_AP_RXD to indicate that no radio is present + // e.g. for flasher only, or just to use the S3 to generate images for smaller AP's + pinMode(FLASHER_AP_TXD, OUTPUT); + pinMode(FLASHER_AP_RXD, INPUT_PULLDOWN); + digitalWrite(FLASHER_AP_TXD, LOW); + if (digitalRead(FLASHER_AP_RXD) != LOW) return true; + digitalWrite(FLASHER_AP_TXD, HIGH); + if (digitalRead(FLASHER_AP_RXD) != HIGH) return true; + pinMode(FLASHER_AP_TXD, INPUT_PULLDOWN); + return false; +} + void APTask(void* parameter) { - xTaskCreate(rxCmdProcessor, "rxCmdProcessor", 4000, NULL, configMAX_PRIORITIES - 10, NULL); - xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, configMAX_PRIORITIES - 4, NULL); -#ifdef FLASHER_DEBUG_RXD - xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, configMAX_PRIORITIES - 4, NULL); -#endif + if (!checkRadio()) { + // no radio + Serial.println("Working without radio."); + addFadeMono(config.led); + setAPstate(true, AP_STATE_NORADIO); + refreshAllPending(); + vTaskDelete(NULL); + return; + } #if (AP_PROCESS_PORT == FLASHER_AP_PORT) AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); #endif -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER #if (AP_PROCESS_PORT == FLASHER_EXT_PORT) AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); #endif @@ -742,8 +784,15 @@ void APTask(void* parameter) { #endif #endif + xTaskCreate(rxCmdProcessor, "rxCmdProcessor", 6000, NULL, 15, NULL); + xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, 11, NULL); +#ifdef FLASHER_DEBUG_RXD + xTaskCreate(rxSerialTask2, "rxSerialTask2", 1750, NULL, 2, NULL); +#endif + bringAPOnline(); +#ifndef C6_OTA_FLASHING if (checkForcedAPFlash() && FLASHER_AP_MOSI != -1) { if (apInfo.type == SOLUM_SEG_UK && apInfo.isOnline) { notifySegmentedFlash(); @@ -756,6 +805,7 @@ void APTask(void* parameter) { checkWaitPowerCycle(); bringAPOnline(); } +#endif if (apInfo.isOnline) { // AP works! @@ -770,6 +820,7 @@ void APTask(void* parameter) { } uint16_t fsversion; +#ifndef C6_OTA_FLASHING if (FLASHER_AP_MOSI != -1) { fsversion = getAPUpdateVersion(apInfo.type); if ((fsversion) && (apInfo.version != fsversion)) { @@ -805,6 +856,8 @@ void APTask(void* parameter) { } } } +#endif + refreshAllPending(); } else { #ifndef FLASH_TIMEOUT @@ -817,9 +870,10 @@ void APTask(void* parameter) { #ifdef HAS_RGB_LED showColorPattern(CRGB::Red, CRGB::Yellow, CRGB::Red); #endif - if(apInfo.state != AP_STATE_FLASHING)// In case we are flashing already we do not want to end in a failed AP + if (apInfo.state != AP_STATE_FLASHING) // In case we are flashing already we do not want to end in a failed AP setAPstate(false, AP_STATE_FAILED); } else { +#ifndef C6_OTA_FLASHING // AP unavailable, maybe time to flash? setAPstate(false, AP_STATE_OFFLINE); @@ -886,13 +940,14 @@ void APTask(void* parameter) { flashCountDown(30); ESP.restart(); } +#endif #endif } } uint8_t attempts = 0; while (1) { - if (((apInfo.state == AP_STATE_ONLINE)||(apInfo.state == AP_STATE_FAILED)) && (millis() - lastAPActivity > AP_ACTIVITY_MAX_INTERVAL)) { + if (((apInfo.state == AP_STATE_ONLINE) || (apInfo.state == AP_STATE_FAILED)) && (millis() - lastAPActivity > AP_ACTIVITY_MAX_INTERVAL)) { bool reply = sendPing(); if (!reply) { attempts++; diff --git a/ESP32_AP-Flasher/src/system.cpp b/ESP32_AP-Flasher/src/system.cpp index 44d7cb93..95e4732c 100644 --- a/ESP32_AP-Flasher/src/system.cpp +++ b/ESP32_AP-Flasher/src/system.cpp @@ -14,11 +14,12 @@ void timeSyncCallback(struct timeval* tv) { } void initTime(void* parameter) { - 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"); + if (WiFi.status() != WL_CONNECTED) { + vTaskDelay(500 / portTICK_PERIOD_MS); } + sntp_set_time_sync_notification_cb(timeSyncCallback); + sntp_set_sync_interval(300 * 1000); + configTzTime(config.timeZone, "time.cloudflare.com", "pool.ntp.org", "time.nist.gov"); logStartUp(); struct tm timeinfo; while (millis() < 30000) { diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index c6b9086e..a5234315 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -314,22 +314,22 @@ void initAPconfig() { } configFile.close(); } - config.channel = APconfig["channel"] | 0; + config.channel = APconfig.containsKey("channel") ? APconfig["channel"] : 0; if (APconfig["alias"]) strlcpy(config.alias, APconfig["alias"], sizeof(config.alias)); - config.led = APconfig["led"] | 255; - config.tft = APconfig["tft"] | 255; - config.language = APconfig["language"] | 0; - config.maxsleep = APconfig["maxsleep"] | 10; - config.stopsleep = APconfig["stopsleep"] | 1; - config.preview = APconfig["preview"] | 1; - config.lock = APconfig["lock"] | 0; - config.sleepTime1 = APconfig["sleeptime1"] | 0; - config.sleepTime2 = APconfig["sleeptime2"] | 0; + config.led = APconfig.containsKey("led") ? APconfig["led"] : 255; + config.tft = APconfig.containsKey("tft") ? APconfig["tft"] : 255; + config.language = APconfig.containsKey("language") ? APconfig["language"] : 0; + config.maxsleep = APconfig.containsKey("maxsleep") ? APconfig["maxsleep"] : 10; + config.stopsleep = APconfig.containsKey("stopsleep") ? APconfig["stopsleep"] : 1; + config.preview = APconfig.containsKey("preview") ? APconfig["preview"] : 1; + config.lock = APconfig.containsKey("lock") ? APconfig["lock"] : 0; + config.sleepTime1 = APconfig.containsKey("sleeptime1") ? APconfig["sleeptime1"] : 0; + config.sleepTime2 = APconfig.containsKey("sleeptime2") ? APconfig["sleeptime2"] : 0; // default wifi power 8.5 dbM // see https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.h#L111 - config.wifiPower = APconfig["wifipower"] | 34; - config.repo = APconfig["repo"] | "jjwbruijn/OpenEPaperLink"; - config.env = APconfig["env"] | STR(BUILD_ENV_NAME); + config.wifiPower = APconfig.containsKey("wifipower") ? APconfig["wifipower"] : 34; + config.repo = APconfig.containsKey("repo") ? APconfig["repo"].as() : String("jjwbruijn/OpenEPaperLink"); + config.env = APconfig.containsKey("env") ? APconfig["env"].as() : String(STR(BUILD_ENV_NAME)); if (APconfig["timezone"]) { strlcpy(config.timeZone, APconfig["timezone"], sizeof(config.timeZone)); } else { @@ -425,12 +425,14 @@ bool setVarDB(const std::string& key, const String& value, const bool notify) { } String getBaseName(const String& filename) { - int lastDotIndex = filename.lastIndexOf('.'); - return lastDotIndex != -1 ? filename.substring(0, lastDotIndex) : filename; + // int lastDotIndex = filename.lastIndexOf('.'); + // return lastDotIndex != -1 ? filename.substring(0, lastDotIndex) : filename; + return filename.substring(0, 16); } void cleanupCurrent() { // clean unknown previews + Serial.println("Cleaning up temporary files"); File dir = contentFS->open("/current"); File file = dir.openNextFile(); while (file) { @@ -444,9 +446,10 @@ void cleanupCurrent() { break; } } - if (!found) { + if (!found || filename.endsWith(".pending")) { filename = file.path(); file.close(); + Serial.println("remove " + filename); contentFS->remove(filename); } } diff --git a/ESP32_AP-Flasher/src/udp.cpp b/ESP32_AP-Flasher/src/udp.cpp index 739d38ad..6502f5c9 100644 --- a/ESP32_AP-Flasher/src/udp.cpp +++ b/ESP32_AP-Flasher/src/udp.cpp @@ -152,7 +152,7 @@ void UDPcomm::getAPList() { wsSendAPitem(&APitem); if (config.alias == 0) { - xTaskCreate(autoselect, "autoselect", 5000, NULL, configMAX_PRIORITIES - 10, NULL); + xTaskCreate(autoselect, "autoselect", 5000, NULL, 2, NULL); } uint8_t buffer[sizeof(struct APlist) + 1]; diff --git a/ESP32_AP-Flasher/src/usbflasher.cpp b/ESP32_AP-Flasher/src/usbflasher.cpp index 3178119a..a90f3239 100644 --- a/ESP32_AP-Flasher/src/usbflasher.cpp +++ b/ESP32_AP-Flasher/src/usbflasher.cpp @@ -1,14 +1,26 @@ #include +#include "usbflasher.h" + +#ifdef HAS_USB +// flashing via 2nd USB port #include "USB.h" +USBCDC USBSerial; +#define cmdSerial USBSerial +#else +#define cmdSerial Serial +#endif + +// #include "esp32-hal-tinyusb.h" #include "flasher.h" +#include "leds.h" #include "powermgt.h" #include "settings.h" #include "swd.h" +#include "web.h" +#include "webflasher.h" #include "zbs_interface.h" -USBCDC USBSerial; - QueueHandle_t flasherCmdQueue; uint32_t usbConnectedStartTime = 0; @@ -21,6 +33,7 @@ bool serialPassthroughState = false; #define FLASHER_WAIT_DATA 4 #define FLASHER_WAIT_CRCH 5 #define FLASHER_WAIT_CRCL 6 +#define FLASHER_RESET 7 struct flasherCommand { uint8_t command = 0; @@ -29,7 +42,7 @@ struct flasherCommand { }; int8_t powerPins[] = FLASHER_AP_POWER; -#ifdef OPENEPAPERLINK_PCB +#ifdef HAS_EXT_FLASHER int8_t powerPins2[] = FLASHER_EXT_POWER; int8_t powerPins3[] = FLASHER_ALT_POWER; #endif @@ -39,48 +52,48 @@ bool autoFlash(flasher* f) { if (f->findTagByMD5()) { // this tag currently contains original firmware, found its fingerprint - USBSerial.printf("Found original firmware tag, recognized its fingerprint (%s)\n", f->md5char); + cmdSerial.printf("Found original firmware tag, recognized its fingerprint (%s)\n", f->md5char); f->readInfoBlock(); f->getFirmwareMac(); f->prepareInfoBlock(); f->writeInfoBlock(); - USBSerial.printf("Attempting to perform a flash...\n"); + cmdSerial.printf("Attempting to perform a flash...\n"); if (f->writeFlashFromPack("/Tag_FW_Pack.bin", f->tagtype)) { - USBSerial.printf("Successfully flashed the tag!\n"); + cmdSerial.printf("Successfully flashed the tag!\n"); return true; } else { - USBSerial.printf("Couldn't flash the tag, for some reason...\n"); + cmdSerial.printf("Couldn't flash the tag, for some reason...\n"); } } else if (f->getInfoBlockMD5()) { // did find an infoblock MD5 that looks valid if (f->findTagByMD5()) { // did find the md5 in the database - USBSerial.printf("Found an already-flashed tag, recognized its fingerprint (%s)\n", f->md5char); + cmdSerial.printf("Found an already-flashed tag, recognized its fingerprint (%s)\n", f->md5char); f->getInfoBlockMac(); f->getInfoBlockType(); f->readInfoBlock(); - USBSerial.printf("Attempting to perform a flash...\n"); + cmdSerial.printf("Attempting to perform a flash...\n"); if (f->writeFlashFromPack("/Tag_FW_Pack.bin", f->tagtype)) { - USBSerial.printf("Successfully flashed the tag!\n"); + cmdSerial.printf("Successfully flashed the tag!\n"); return true; } else { - USBSerial.printf("Couldn't flash the tag, for some reason...\n"); + cmdSerial.printf("Couldn't flash the tag, for some reason...\n"); } } else { // couldn't find the md5 from the infoblock - USBSerial.printf("Found an already-flashed tag, but we couldn't find its fingerprint (%s) in the database\n", f->md5char); + cmdSerial.printf("Found an already-flashed tag, but we couldn't find its fingerprint (%s) in the database\n", f->md5char); return false; } } else { // We couldn't recognize the tag from it's fingerprint... - USBSerial.printf("Found a tag but didn't recognize its fingerprint\n", f->md5char); + cmdSerial.printf("Found a tag but didn't recognize its fingerprint\n", f->md5char); f->backupFlash(); - USBSerial.printf("Saved this MD5 binary to filesystem\n"); + cmdSerial.printf("Saved this MD5 binary to filesystem\n"); } return false; } -void sendFlasherAnswer(uint8_t answer_cmd, uint8_t* ans_buff, uint32_t len) { +void sendFlasherAnswer(uint8_t answer_cmd, uint8_t* ans_buff, uint32_t len, uint8_t transportType) { uint8_t* answer_buffer = (uint8_t*)calloc(3 + 2 + 2 + len + 2 + 13, 1); if (answer_buffer == nullptr) return; uint32_t CRC_value = 0xAB34; @@ -101,29 +114,42 @@ void sendFlasherAnswer(uint8_t answer_cmd, uint8_t* ans_buff, uint32_t len) { answer_buffer[3 + 2 + 2 + len] = CRC_value >> 8; answer_buffer[3 + 2 + 2 + len + 1] = CRC_value; - USBSerial.write(answer_buffer, 3 + 2 + 2 + len + 2); + if (transportType == TRANSPORT_USB) { + cmdSerial.write(answer_buffer, 3 + 2 + 2 + len + 2); + } else { + sendDataToClient(answer_buffer, 3 + 2 + 2 + len + 2); + } // for(uint16_t c = 0; c< 3+2+2+len+2; c++){ //} free(answer_buffer); } -void flasherUartHandler(uint8_t* data, uint8_t len) { - static struct flasherCommand* cmd; +void flasherDataHandler(uint8_t* data, size_t len, uint8_t transportType) { + static struct flasherCommand* cmd = nullptr; static uint8_t flasherSerialState = FLASHER_WAIT_A; static uint32_t flasherCmdDataIndex = 0; static uint16_t flasherCRC = 0xAB34; static uint32_t flasherLastCmd = 0; static uint8_t curLenIndex = 0; - if ((flasherSerialState != FLASHER_WAIT_A) && (millis() - flasherLastCmd >= 225)) { - flasherSerialState = FLASHER_WAIT_A; - // we should probably do something with stale commands containing data (data leak!) + if ((flasherSerialState != FLASHER_WAIT_A) && (millis() - flasherLastCmd >= 3000)) { + flasherSerialState = FLASHER_RESET; } while (len--) { uint8_t usbbyte = *(data++); switch (flasherSerialState) { + case FLASHER_RESET: + if (transportType == TRANSPORT_TCP && cmd != nullptr) { + if (cmd->data != nullptr) { + free(cmd->data); + cmd->data = nullptr; + } + delete cmd; + cmd = nullptr; + } + flasherSerialState = FLASHER_WAIT_A; case FLASHER_WAIT_A: if (usbbyte == 'A') { flasherSerialState = FLASHER_WAIT_T; @@ -139,7 +165,7 @@ void flasherUartHandler(uint8_t* data, uint8_t len) { flasherCRC = 0xAB34; flasherCmdDataIndex = 0; } else { - flasherSerialState = FLASHER_WAIT_A; + flasherSerialState = FLASHER_RESET; } break; case FLASHER_WAIT_CMD: @@ -158,9 +184,11 @@ void flasherUartHandler(uint8_t* data, uint8_t len) { cmd->data = (uint8_t*)calloc(cmd->len, 1); if (cmd->data == nullptr) { delete cmd; + cmd = nullptr; flasherSerialState = FLASHER_WAIT_A; + } else { + flasherSerialState = FLASHER_WAIT_DATA; } - flasherSerialState = FLASHER_WAIT_DATA; } else { // 0 len, so skip to CRC immediately flasherSerialState = FLASHER_WAIT_CRCH; @@ -181,17 +209,16 @@ void flasherUartHandler(uint8_t* data, uint8_t len) { case FLASHER_WAIT_CRCL: flasherCRC -= ((uint16_t)usbbyte); if (flasherCRC) { - cmd = nullptr; - // we should probably delete the cmd and associated data here (data leak) + flasherSerialState = FLASHER_RESET; + wsSerial("failed CRC"); } else { - BaseType_t queuestatus = xQueueSend(flasherCmdQueue, &cmd, 0); - if (queuestatus == pdFALSE) { - if (cmd->data != nullptr) free(cmd->data); - delete cmd; + if (transportType == TRANSPORT_USB) { + BaseType_t queuestatus = xQueueSend(flasherCmdQueue, &cmd, 0); + } else { + processFlasherCommand(cmd, TRANSPORT_TCP); } - cmd = nullptr; + flasherSerialState = FLASHER_RESET; } - flasherSerialState = FLASHER_WAIT_A; break; } } @@ -204,6 +231,7 @@ void resetFlasherState() { serialPassthroughState = false; } +#ifdef HAS_USB static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_base == ARDUINO_USB_EVENTS) { arduino_usb_event_data_t* data = (arduino_usb_event_data_t*)event_data; @@ -250,11 +278,11 @@ static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t eve // Serial.printf("CDC RX [%u]:", data->rx.len); { uint8_t buf[data->rx.len]; - size_t len = USBSerial.read(buf, data->rx.len); + size_t len = cmdSerial.read(buf, data->rx.len); if (serialPassthroughState) { Serial2.write(buf, len); } else { - flasherUartHandler(buf, len); + flasherDataHandler(buf, len, TRANSPORT_USB); } } break; @@ -267,6 +295,7 @@ static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t eve } } } +#endif typedef enum { CMD_GET_VERSION = 1, @@ -292,51 +321,65 @@ typedef enum { CMD_COMPLETE = 88, } ZBS_UART_PROTO; -uint32_t FLASHER_VERSION = 0x00000030; +uint32_t FLASHER_VERSION = 0x00000031; #define CONTROLLER_ZBS243 0 #define CONTROLLER_NRF82511 1 uint8_t selectedController = 0; uint8_t selectedFlasherPort; uint32_t currentFlasherOffset; -flasher* zbsflasherp; -nrfswd* nrfflasherp; +flasher* zbsflasherp = nullptr; +nrfswd* nrfflasherp = nullptr; -void processFlasherCommand(struct flasherCommand* cmd) { +void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) { uint8_t* tempbuffer; uint8_t temp_buff[16]; uint32_t spi_speed = 0; uint8_t powerPinCount = 1; static uint32_t curspeed = 0; + uint8_t numPowerPins; + +#ifdef HAS_RGB_LED + shortBlink(CRGB::White); +#else + quickBlink(2); +#endif switch (cmd->command) { case CMD_GET_VERSION: + wsSerial("> get version"); temp_buff[0] = FLASHER_VERSION >> 24; temp_buff[1] = FLASHER_VERSION >> 16; temp_buff[2] = FLASHER_VERSION >> 8; temp_buff[3] = FLASHER_VERSION; - sendFlasherAnswer(cmd->command, temp_buff, 4); + sendFlasherAnswer(cmd->command, temp_buff, 4, transportType); break; case CMD_RESET_ESP: - sendFlasherAnswer(cmd->command, NULL, 0); + wsSerial("reset"); + sendFlasherAnswer(cmd->command, NULL, 0, transportType); delay(100); ESP.restart(); break; case CMD_SET_POWER: + wsSerial("> power"); switch (selectedFlasherPort) { case 0: - powerControl(cmd->data[0], (uint8_t*)powerPins, 1); + numPowerPins = sizeof(powerPins); + powerControl(cmd->data[0], (uint8_t*)powerPins, numPowerPins); break; case 1: - powerControl(cmd->data[0], (uint8_t*)powerPins2, 1); + numPowerPins = sizeof(powerPins2); + powerControl(cmd->data[0], (uint8_t*)powerPins2, numPowerPins); break; case 2: - powerControl(cmd->data[0], (uint8_t*)powerPins3, 1); + numPowerPins = sizeof(powerPins3); + powerControl(cmd->data[0], (uint8_t*)powerPins3, numPowerPins); break; } - sendFlasherAnswer(CMD_SET_POWER, NULL, 0); + sendFlasherAnswer(CMD_SET_POWER, NULL, 0, transportType); break; case CMD_RESET: + wsSerial("> reset tag"); if (zbsflasherp != nullptr) { zbsflasherp->zbs->reset(); delete zbsflasherp; @@ -347,124 +390,135 @@ void processFlasherCommand(struct flasherCommand* cmd) { delete nrfflasherp; nrfflasherp = nullptr; } - sendFlasherAnswer(CMD_RESET, NULL, 0); + sendFlasherAnswer(CMD_RESET, NULL, 0, transportType); break; case CMD_ERASE_FLASH: + wsSerial("> erase flash"); if (selectedController == CONTROLLER_NRF82511) { } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; zbsflasherp->zbs->erase_flash(); } - sendFlasherAnswer(CMD_ERASE_FLASH, NULL, 0); + sendFlasherAnswer(CMD_ERASE_FLASH, NULL, 0, transportType); break; case CMD_ERASE_INFOPAGE: + wsSerial("> erase infopage"); if (selectedController == CONTROLLER_NRF82511) { nrfflasherp->erase_uicr(); } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; zbsflasherp->zbs->erase_infoblock(); } - sendFlasherAnswer(CMD_ERASE_INFOPAGE, NULL, 0); + sendFlasherAnswer(CMD_ERASE_INFOPAGE, NULL, 0, transportType); break; case CMD_SELECT_PORT: + wsSerial("> select port"); selectedFlasherPort = cmd->data[0]; Serial.printf("Port selected = %d\n", cmd->data[0]); break; case CMD_SELECT_ZBS243: + wsSerial("> connect zbs"); zbsflasherp = new flasher; temp_buff[0] = zbsflasherp->connectTag(selectedFlasherPort); - sendFlasherAnswer(CMD_SELECT_ZBS243, temp_buff, 1); + sendFlasherAnswer(CMD_SELECT_ZBS243, temp_buff, 1, transportType); currentFlasherOffset = 0; selectedController = CONTROLLER_ZBS243; break; case CMD_SELECT_NRF82511: + wsSerial("> connect nrf"); switch (selectedFlasherPort) { case 0: - powerControl(true, (uint8_t*)powerPins, 1); + numPowerPins = sizeof(powerPins); + powerControl(true, (uint8_t*)powerPins, numPowerPins); nrfflasherp = new nrfswd(FLASHER_AP_MISO, FLASHER_AP_CLK); break; case 1: - powerControl(true, (uint8_t*)powerPins2, 1); + numPowerPins = sizeof(powerPins2); + powerControl(true, (uint8_t*)powerPins2, numPowerPins); nrfflasherp = new nrfswd(FLASHER_EXT_MISO, FLASHER_EXT_CLK); break; case 2: - powerControl(true, (uint8_t*)powerPins3, 1); + numPowerPins = sizeof(powerPins3); + powerControl(true, (uint8_t*)powerPins3, numPowerPins); nrfflasherp = new nrfswd(FLASHER_ALT_MISO, FLASHER_ALT_CLK); break; } nrfflasherp->init(); temp_buff[0] = (nrfflasherp->isConnected && !nrfflasherp->isLocked); - sendFlasherAnswer(CMD_SELECT_NRF82511, temp_buff, 1); + sendFlasherAnswer(CMD_SELECT_NRF82511, temp_buff, 1, transportType); currentFlasherOffset = 0; selectedController = CONTROLLER_NRF82511; break; case CMD_READ_FLASH: + wsSerial("> read flash"); uint8_t* bufferp; uint32_t cur_len; if (selectedController == CONTROLLER_NRF82511) { if (nrfflasherp == nullptr) return; if (currentFlasherOffset >= nrfflasherp->nrf_info.flash_size) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { bufferp = (uint8_t*)malloc(1024); if (bufferp == nullptr) return; cur_len = (nrfflasherp->nrf_info.flash_size - currentFlasherOffset >= 1024) ? 1024 : nrfflasherp->nrf_info.flash_size - currentFlasherOffset; nrfflasherp->nrf_read_bank(currentFlasherOffset, (uint32_t*)bufferp, cur_len); currentFlasherOffset += cur_len; - sendFlasherAnswer(CMD_READ_FLASH, bufferp, cur_len); + sendFlasherAnswer(CMD_READ_FLASH, bufferp, cur_len, transportType); if (bufferp != nullptr) free(bufferp); } } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; if (currentFlasherOffset >= 65536) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { bufferp = (uint8_t*)malloc(1024); if (bufferp == nullptr) return; cur_len = (65536 - currentFlasherOffset >= 1024) ? 1024 : 65536 - currentFlasherOffset; zbsflasherp->readBlock(currentFlasherOffset, bufferp, cur_len, false); currentFlasherOffset += cur_len; - sendFlasherAnswer(CMD_READ_FLASH, bufferp, cur_len); + sendFlasherAnswer(CMD_READ_FLASH, bufferp, cur_len, transportType); if (bufferp != nullptr) free(bufferp); } } break; case CMD_READ_INFOPAGE: + wsSerial("> read infopage"); uint8_t* ibufferp; uint32_t icur_len; if (selectedController == CONTROLLER_NRF82511) { if (nrfflasherp == nullptr) return; if (currentFlasherOffset >= 4096) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { ibufferp = (uint8_t*)malloc(1024); if (ibufferp == nullptr) return; icur_len = (4096 - currentFlasherOffset >= 256) ? 256 : 4096 - currentFlasherOffset; nrfflasherp->nrf_read_bank(0x10001000 + currentFlasherOffset, (uint32_t*)ibufferp, icur_len); currentFlasherOffset += icur_len; - sendFlasherAnswer(CMD_READ_INFOPAGE, ibufferp, icur_len); + sendFlasherAnswer(CMD_READ_INFOPAGE, ibufferp, icur_len, transportType); if (ibufferp != nullptr) free(ibufferp); } } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; if (currentFlasherOffset >= 1024) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { ibufferp = (uint8_t*)malloc(1024); if (ibufferp == nullptr) return; icur_len = (1024 - currentFlasherOffset >= 256) ? 256 : 1024 - currentFlasherOffset; zbsflasherp->readBlock(currentFlasherOffset, ibufferp, icur_len, true); currentFlasherOffset += icur_len; - sendFlasherAnswer(CMD_READ_INFOPAGE, ibufferp, icur_len); + sendFlasherAnswer(CMD_READ_INFOPAGE, ibufferp, icur_len, transportType); if (ibufferp != nullptr) free(ibufferp); } } break; case CMD_WRITE_FLASH: + wsSerial("> write flash"); if (selectedController == CONTROLLER_NRF82511) { if (nrfflasherp == nullptr) return; if (currentFlasherOffset >= nrfflasherp->nrf_info.flash_size) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { for (uint32_t c = currentFlasherOffset; c < (currentFlasherOffset + cmd->len);) { // very ugly and naive way to find out what page we're in, and erase all relevant pages before writing @@ -479,55 +533,58 @@ void processFlasherCommand(struct flasherCommand* cmd) { nrfflasherp->nrf_write_bank(currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); Serial.printf("wrote page to nrf\n"); currentFlasherOffset += cmd->len; - sendFlasherAnswer(CMD_WRITE_FLASH, NULL, 0); + sendFlasherAnswer(CMD_WRITE_FLASH, NULL, 0, transportType); } } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; if (currentFlasherOffset >= 65536) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { zbsflasherp->writeBlock(currentFlasherOffset, cmd->data, cmd->len, false); currentFlasherOffset += cmd->len; - sendFlasherAnswer(CMD_WRITE_FLASH, NULL, 0); + sendFlasherAnswer(CMD_WRITE_FLASH, NULL, 0, transportType); } } break; case CMD_WRITE_INFOPAGE: + wsSerial("> write infopage"); if (selectedController == CONTROLLER_NRF82511) { if (nrfflasherp == nullptr) return; if (currentFlasherOffset >= 4096) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { nrfflasherp->nrf_write_bank(0x10001000 + currentFlasherOffset, (uint32_t*)cmd->data, cmd->len); Serial.printf("wrote page to nrf\n"); currentFlasherOffset += cmd->len; - sendFlasherAnswer(CMD_WRITE_INFOPAGE, NULL, 0); + sendFlasherAnswer(CMD_WRITE_INFOPAGE, NULL, 0, transportType); } } else if (selectedController == CONTROLLER_ZBS243) { if (zbsflasherp == nullptr) return; if (currentFlasherOffset >= 1024) { - sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1, transportType); } else { zbsflasherp->writeBlock(currentFlasherOffset, cmd->data, cmd->len, true); currentFlasherOffset += cmd->len; - sendFlasherAnswer(CMD_WRITE_INFOPAGE, NULL, 0); + sendFlasherAnswer(CMD_WRITE_INFOPAGE, NULL, 0, transportType); } } break; case CMD_PASS_THROUGH: + wsSerial("> pass through"); Serial2.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); - USBSerial.println(">>>"); + cmdSerial.println(">>>"); serialPassthroughState = true; break; case CMD_AUTOFLASH: + wsSerial("> autoflash"); if (selectedController == CONTROLLER_ZBS243) { autoFlash(zbsflasherp); zbsflasherp->zbs->reset(); delete zbsflasherp; - zbsflasherp = 0; - USBSerial.write(0x04); + zbsflasherp = nullptr; + cmdSerial.write(0x04); } else { - USBSerial.println("Not yet implemented!"); + cmdSerial.println("Not yet implemented!"); } break; } @@ -554,41 +611,54 @@ void tagDebugPassthrough() { uint8_t* buf = (uint8_t*)malloc(len); Serial2.read(buf, len); Serial.write(buf, len); - USBSerial.write(buf, len); + cmdSerial.write(buf, len); free(buf); } } +#ifdef HAS_USB void usbFlasherTask(void* parameter) { flasherCmdQueue = xQueueCreate(10, sizeof(struct flasherCommand*)); -#if ARDUINO_USB_MODEflash -#warning Wrong USB mode is in use, check settings in platformio.ini + +#ifndef ARDUINO_USB_MODE +#error This ESP32 SoC has no Native USB interface +#elif ARDUINO_USB_MODE == 1 +#warning This sketch should be used when USB is in OTG mode. Wrong USB mode is in use, check settings in platformio.ini #endif USB.onEvent(usbEventCallback); - USBSerial.onEvent(usbEventCallback); - USBSerial.setTimeout(1000); + cmdSerial.onEvent(usbEventCallback); + cmdSerial.setTimeout(1000); + USB.productName("OpenEpaperLink-flasher"); USB.begin(); - USBSerial.begin(); - - struct flasherCommand* cmd; + cmdSerial.begin(); + Serial.println("Task started"); + uint32_t notificationValue; + struct flasherCommand* cmd = nullptr; while (true) { while (serialPassthroughState) { tagDebugPassthrough(); vTaskDelay(1 / portTICK_PERIOD_MS); } + BaseType_t queuereceive = xQueueReceive(flasherCmdQueue, &cmd, 1000 / portTICK_PERIOD_MS); // timeout every second to make sure the timeout gets triggered after a while if (queuereceive == pdTRUE) { - processFlasherCommand(cmd); + processFlasherCommand(cmd, TRANSPORT_USB); lastCmdTimeStamp = millis(); if (cmd->data != nullptr) { free(cmd->data); + cmd->data = nullptr; } delete cmd; + cmd = nullptr; } else { if (lastCmdTimeStamp) { if (millis() - lastCmdTimeStamp > USBFLASHER_CONNECTION_TIMEOUT) - flasherCommandTimeout(); + flasherCommandTimeout(); } } + + vTaskDelay(50 / portTICK_PERIOD_MS); } -} \ No newline at end of file +} +#endif + diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 4536aa2b..9e21ed34 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -9,6 +9,8 @@ #include #include +#include + #include "AsyncJson.h" #include "LittleFS.h" #include "SPIFFSEditor.h" @@ -25,6 +27,10 @@ #include "udp.h" #include "wifimanager.h" +#ifdef HAS_EXT_FLASHER +#include "webflasher.h" +#endif + extern uint8_t data_to_send[]; AsyncWebServer server(80); @@ -125,17 +131,18 @@ void wsSendSysteminfo() { uint32_t tagcount = getTagCount(timeoutcount); char result[40]; if (timeoutcount > 0) { -#ifdef HAS_RGB_LED - if (apInfo.state == AP_STATE_ONLINE && apInfo.isOnline == true) rgbIdleColor = CRGB::DarkBlue; -#endif - snprintf(result, sizeof(result), "%lu / %lu, %lu timed out", tagcount, tagDB.size(), timeoutcount); + snprintf(result, sizeof(result), "%lu/%lu, %lu timeout", tagcount, tagDB.size(), timeoutcount); } else { -#ifdef HAS_RGB_LED - if (apInfo.state == AP_STATE_ONLINE && apInfo.isOnline == true) rgbIdleColor = CRGB::Green; -#endif snprintf(result, sizeof(result), "%lu / %lu", tagcount, tagDB.size()); } setVarDB("ap_tagcount", result); +#ifdef HAS_RGB_LED + if (timeoutcount > 0) { + if (apInfo.state == AP_STATE_ONLINE && apInfo.isOnline == true) rgbIdleColor = CRGB::DarkBlue; + } else { + if (apInfo.state == AP_STATE_ONLINE && apInfo.isOnline == true) rgbIdleColor = CRGB::Green; + } +#endif tagcounttimer = millis(); } @@ -201,8 +208,13 @@ void wsSendAPitem(struct APlist *apitem) { } void wsSerial(const String &text) { + wsSerial(text, String("")); +} + +void wsSerial(const String &text, const String &color) { StaticJsonDocument<250> doc; doc["console"] = text; + if (!color.isEmpty()) doc["color"] = color; Serial.println(text); if (wsMutex) xSemaphoreTake(wsMutex, portMAX_DELAY); ws.textAll(doc.as()); @@ -274,17 +286,38 @@ void init_web() { if (hex2mac(dst, mac)) { tagRecord *taginfo = tagRecord::findByMAC(mac); if (taginfo != nullptr) { - if (taginfo->data == nullptr) { - fs::File file = contentFS->open(taginfo->filename); - if (!file) { - request->send(404, "text/plain", "File not found"); + if (request->hasParam("md5")) { + uint8_t md5[8]; + if (hex2mac(request->getParam("md5")->value(), md5)) { + PendingItem *queueItem = getQueueItem(mac, *reinterpret_cast(md5)); + if (queueItem->data == nullptr) { + fs::File file = contentFS->open(queueItem->filename); + if (file) { + queueItem->data = getDataForFile(file); + Serial.println("Reading file " + String(queueItem->filename)); + file.close(); + } else { + request->send(404, "text/plain", "File not found"); + return; + } + } + request->send_P(200, "application/octet-stream", queueItem->data, queueItem->len); return; } - taginfo->data = getDataForFile(file); - file.close(); + } else { + // older version without queue + if (taginfo->data == nullptr) { + fs::File file = contentFS->open(taginfo->filename); + if (!file) { + request->send(404, "text/plain", "File not found"); + return; + } + taginfo->data = getDataForFile(file); + file.close(); + } + request->send_P(200, "application/octet-stream", taginfo->data, taginfo->len); + return; } - request->send_P(200, "application/octet-stream", taginfo->data, taginfo->len); - return; } } } @@ -444,30 +477,38 @@ void init_web() { udpsync.getAPList(); AsyncResponseStream *response = request->beginResponseStream("application/json"); - File configFile = contentFS->open("/current/apconfig.json", "r"); - if (!configFile) { - request->send(500, "text/plain", "Error opening apconfig.json file"); - return; - } response->print("{"); -#if defined YELLOW_IPS_AP || defined C6_OTA_FLASHING +#ifdef C6_OTA_FLASHING response->print("\"C6\": \"1\", "); #else response->print("\"C6\": \"1\", "); #endif -#if defined SAVE_SPACE +#ifdef SAVE_SPACE response->print("\"savespace\": \"1\", "); #else response->print("\"savespace\": \"0\", "); #endif - configFile.seek(1); - const size_t bufferSize = 64; - uint8_t buffer[bufferSize]; - while (configFile.available()) { - size_t bytesRead = configFile.read(buffer, bufferSize); - response->write(buffer, bytesRead); +#ifdef HAS_EXT_FLASHER + response->print("\"hasFlasher\": \"1\", "); +#else + response->print("\"hasFlasher\": \"0\", "); +#endif + response->print("\"apstate\": \"" + String(apInfo.state) + "\", "); + + File configFile = contentFS->open("/current/apconfig.json", "r"); + if (configFile) { + configFile.seek(1); + const size_t bufferSize = 64; + uint8_t buffer[bufferSize]; + while (configFile.available()) { + size_t bytesRead = configFile.read(buffer, bufferSize); + response->write(buffer, bytesRead); + } + configFile.close(); + } else { + response->print("}"); } - configFile.close(); + request->send(response); }); @@ -479,15 +520,17 @@ void init_web() { aliasValue.toCharArray(config.alias, aliasLength + 1); config.alias[aliasLength] = '\0'; } + + if (request->hasParam("channel", true)) { config.channel = static_cast(request->getParam("channel", true)->value().toInt()); } if (request->hasParam("led", true)) { - config.led = static_cast(request->getParam("led", true)->value().toInt()); + config.led = static_cast(request->getParam("led", true)->value().toInt()); updateBrightnessFromConfig(); } if (request->hasParam("tft", true)) { - config.tft = static_cast(request->getParam("tft", true)->value().toInt()); + config.tft = static_cast(request->getParam("tft", true)->value().toInt()); updateBrightnessFromConfig(); } if (request->hasParam("language", true)) { @@ -663,6 +706,8 @@ void init_web() { }, dotagDBUpload); + // OTA related calls + server.on("/sysinfo", HTTP_GET, handleSysinfoRequest); server.on("/check_file", HTTP_GET, handleCheckFile); server.on("/rollback", HTTP_POST, handleRollback); @@ -677,6 +722,15 @@ void init_web() { }, handleLittleFSUpload); +#ifdef HAS_EXT_FLASHER + + // Flasher related calls + ws.onEvent([](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { + if (type == WS_EVT_DATA) handleWSdata(data, len, client); + }); + +#endif + server.onNotFound([](AsyncWebServerRequest *request) { if (request->url() == "/" || request->url() == "index.htm") { request->send(200, "text/html", "index.html not found. Did you forget to upload the littlefs partition?"); diff --git a/ESP32_AP-Flasher/src/webflasher.cpp b/ESP32_AP-Flasher/src/webflasher.cpp new file mode 100644 index 00000000..93a4085e --- /dev/null +++ b/ESP32_AP-Flasher/src/webflasher.cpp @@ -0,0 +1,506 @@ +#include "webflasher.h" + +#ifdef HAS_EXT_FLASHER + +#include +#include +// #include +// #include + +#include "flasher.h" +#include "ips_display.h" +#include "settings.h" +// #include "storage.h" +#include "powermgt.h" +#include "swd.h" +#include "usbflasher.h" +#include "util.h" +#include "web.h" +#include "zbs_interface.h" + +#define FLASHMODE_OFF 0 +#define FLASHMODE_AUTO_BACKGROUND 1 +#define FLASHMODE_AUTO_FOCUS 2 + +#define AUTOFLASH_STEP_IDLE 0 +#define AUTOFLASH_STEP_CONNECT 1 +#define AUTOFLASH_STEP_STARTUP 2 +#define AUTOFLASH_STEP_WAITDISCONNECT 3 +#define AUTOFLASH_STEP_FINISHED 4 +#define AUTOFLASH_STEP_ABORT 5 +#define AUTOFLASH_STEP_COUNTDOWN 6 +#define AUTOFLASH_STEP_COUNTING 8 +#define AUTOFLASH_STEP_WRITE 7 +#define AUTOFLASH_START_USBFLASHER 9 +#define AUTOFLASH_USBFLASHER_RUNNING 10 +#define AUTOFLASH_END_USBFLASHER 11 + +#define Seriallog logger + +uint8_t webFlashMode = FLASHMODE_OFF; +uint8_t autoFlashStep = AUTOFLASH_STEP_IDLE; +// TaskHandle_t usbFlasherTaskHandle; + +AsyncServer TCPserver(243); +AsyncClient* connectedClient = NULL; + +Logger::Logger() { +} + +Logger::~Logger() { +} + +size_t Logger::write(uint8_t c) { + wsSerial(String((char)c)); + return 1; +} + +size_t Logger::write(const uint8_t* buffer, size_t size) { + wsSerial(String((const char*)buffer, size)); + return size; +} + +size_t Logger::printf(const char* format, ...) { + char buffer[256]; + va_list args; + va_start(args, format); + size_t len = vsnprintf(buffer, sizeof(buffer), format, args); + va_end(args); + wsSerial(String(buffer)); + +#ifdef HAS_TFT + if (len >= 6 && strncmp(buffer, "\r[", 2) == 0) { + char content[50]; + strncpy(content, buffer + 2, len - 7); + content[len - 7] = '\0'; + tft2.fillRect(0, 50, tft2.width(), 40, TFT_BLUE); + tft2.setCursor(10, 57, 2); + tft2.setTextColor(TFT_YELLOW); + tft2.print(String(content)); + } +#endif + + return len; +} + +size_t Logger::println(const char* text) { + size_t len = print(text); + print('\n'); + return len + 1; +} + +Logger logger; +util::Timer tagConnectTimer(seconds(2)); +extern flasher* zbsflasherp; +uint8_t errors = 0; + +void infoDisplay(String actionName, uint8_t icon) { + wsSerial(" " + actionName, "white"); +#ifdef HAS_TFT + tftOverride = true; + tft2.fillScreen(TFT_PURPLE); + tft2.setCursor(0, 0, 4); + tft2.setTextColor(TFT_WHITE); + tft2.print("Progress:"); + tft2.setCursor(18, 30, 2); + tft2.setTextColor(TFT_WHITE); + tft2.print(actionName); +#endif +} + +bool report(bool result) { + if (result) { + wsSerial("<✔", "green"); +#ifdef HAS_TFT + tft2.setTextColor(TFT_GREEN); + tft2.setCursor(5, 30, 2); + tft2.print("v"); + tft2.setCursor(6, 30, 2); + tft2.print("v"); + vTaskDelay(100 / portTICK_PERIOD_MS); +#endif + } else { + errors++; + autoFlashStep = AUTOFLASH_STEP_ABORT; + wsSerial("<✘", "red"); +#ifdef HAS_TFT + tft2.setTextColor(TFT_RED); + tft2.setCursor(5, 30, 2); + tft2.print("x"); + tft2.setCursor(6, 30, 2); + tft2.print("x"); + vTaskDelay(500 / portTICK_PERIOD_MS); +#endif + } + return result; +} + +void onDataReceived(void* arg, AsyncClient* client, void* data, size_t len) { + flasherDataHandler((uint8_t*)data, len, TRANSPORT_TCP); +} + +void onClientConnect(void* arg, AsyncClient* client) { + Serial.println("New client connected"); + if (autoFlashStep == AUTOFLASH_USBFLASHER_RUNNING) { +#ifdef HAS_TFT + if (tftOverride == true) { + tft2.fillRect(0, 62, tft2.width(), 18, TFT_BLUE); + tft2.setCursor(10, 63, 2); + tft2.setTextColor(TFT_GREEN); + tft2.print("TCP connected"); + } +#endif + } else { + autoFlashStep = AUTOFLASH_START_USBFLASHER; + } + webFlashMode = FLASHMODE_OFF; + if (connectedClient == NULL) { + connectedClient = client; + client->onData(&onDataReceived, NULL); + client->onDisconnect([](void* arg, AsyncClient* c) { + Serial.println("Client disconnected"); + + if (zbsflasherp != nullptr) { + zbsflasherp->zbs->reset(); + delete zbsflasherp; + zbsflasherp = nullptr; + } + +#ifdef HAS_TFT + if (autoFlashStep == AUTOFLASH_USBFLASHER_RUNNING && tftOverride == true) { + tft2.fillRect(0, 62, tft2.width(), 18, TFT_BLUE); + tft2.setCursor(10, 63, 2); + tft2.setTextColor(TFT_YELLOW); + tft2.print("TCP disconnected"); + } +#endif + connectedClient = NULL; + }); + } else { + client->close(true); + } +} + +void sendDataToClient(const uint8_t* data, size_t len) { + if (connectedClient != NULL) { + connectedClient->write(reinterpret_cast(data), len); + } else { + Serial.println("No client connected"); + } +} + +void webFlasherTask(void* parameter) { + TCPserver.begin(); + TCPserver.onClient(&onClientConnect, NULL); + + static int32_t countDownTimer = 0; + while (1) { + switch (autoFlashStep) { + case AUTOFLASH_STEP_IDLE: { + if (webFlashMode != FLASHMODE_OFF && (tagConnectTimer.doRun() || webFlashMode == FLASHMODE_AUTO_FOCUS)) { + Serial.println("check pins"); + if (extTagConnected()) autoFlashStep = AUTOFLASH_STEP_CONNECT; + } + break; + } + + case AUTOFLASH_STEP_CONNECT: { + wsSerial("-", "clear"); + infoDisplay("Connecting", 0); + vTaskDelay(2000 / portTICK_PERIOD_MS); + + pinMode(FLASHER_EXT_TEST, OUTPUT); + digitalWrite(FLASHER_EXT_TEST, LOW); + + zbsflasherp = new flasher(); + errors = 0; + + if (!report(zbsflasherp->connectTag(FLASHER_EXT_PORT))) { + Seriallog.printf("Sorry, failed to connect to this tag...\n"); + break; + + } else { + infoDisplay("Get firmware md5", 0); + report(zbsflasherp->getFirmwareMD5()); + + infoDisplay("Find tag", 0); + if (zbsflasherp->findTagByMD5()) { + // this tag currently contains original firmware, found its fingerprint + Seriallog.printf("Found original firmware tag (fingerprint %s)\n", zbsflasherp->md5char); + + infoDisplay("Read info block", 0); + report(zbsflasherp->readInfoBlock()); + if (errors) break; + + infoDisplay("Get firmware mac", 0); + report(zbsflasherp->getFirmwareMac()); + if (errors) break; + + infoDisplay("Prepare info block", 0); + report(zbsflasherp->prepareInfoBlock()); + if (errors) break; + + zbsflasherp->includeInfoBlock = true; + autoFlashStep = AUTOFLASH_STEP_COUNTDOWN; + break; + + } else if (report(zbsflasherp->getInfoBlockMD5())) { + infoDisplay("Find by md5", 0); + // did find an infoblock MD5 that looks valid + if (report(zbsflasherp->findTagByMD5())) { + // did find the md5 in the database + + infoDisplay("Found tag", 0); + Seriallog.printf("Found an already-flashed tag (fingerprint %s)\n", zbsflasherp->md5char); + + infoDisplay("Get infoblock mac", 0); + report(zbsflasherp->getInfoBlockMac()); + if (errors) break; + + infoDisplay("Get infoblock type", 0); + report(zbsflasherp->getInfoBlockType()); + if (errors) break; + + infoDisplay("Read infoblock", 0); + report(zbsflasherp->readInfoBlock()); + if (errors) break; + + zbsflasherp->includeInfoBlock = false; + autoFlashStep = AUTOFLASH_STEP_COUNTDOWN; + break; + + } else { + infoDisplay("Unknown fingerprint", 0); + report(false); + // couldn't find the md5 from the infoblock + Seriallog.printf("Found an already-flashed tag, but we couldn't find its fingerprint (%s) in the database\n", zbsflasherp->md5char); + break; + } + } else { + // We couldn't recognize the tag from its fingerprint... + Seriallog.printf("Found a tag but didn't recognize its fingerprint (%s)\n", zbsflasherp->md5char); + + infoDisplay("Backup firmware", 0); + report(zbsflasherp->backupFlash()); + + Seriallog.printf("Saved this MD5 binary to filesystem\n"); + + infoDisplay("Unknown tag", 0); + report(false); + break; + } + } + + zbsflasherp->zbs->reset(false); + + delete zbsflasherp; + zbsflasherp = nullptr; + + autoFlashStep = AUTOFLASH_STEP_FINISHED; + break; + } + + case AUTOFLASH_STEP_COUNTDOWN: { + infoDisplay("Final Countdown", 0); + + countDownTimer = millis() + 3000; + autoFlashStep = AUTOFLASH_STEP_COUNTING; + break; + } + + case AUTOFLASH_STEP_COUNTING: { + uint32_t timenow = millis(); + if (timenow >= countDownTimer) { + autoFlashStep = AUTOFLASH_STEP_WRITE; + timenow = countDownTimer; + } + + float timeDifference = countDownTimer - timenow; + char timeString[10]; + snprintf(timeString, sizeof(timeString), "%.1fs", timeDifference / 1000.0); + +#ifdef HAS_TFT + tftOverride = true; + tft2.fillRect(0, 50, tft2.width(), 40, TFT_BLUE); + tft2.setCursor(10, 55, 4); + tft2.setTextColor(TFT_YELLOW); + tft2.print(timeString); +#endif + wsSerial("\r" + String(timeString), "yellow"); + break; + } + + case AUTOFLASH_STEP_WRITE: { + if (zbsflasherp->includeInfoBlock) { + infoDisplay("Write info block", 0); + report(zbsflasherp->writeInfoBlock()); + if (errors) break; + } + + infoDisplay("Write flash", 0); + report(zbsflasherp->writeFlashFromPack("/Tag_FW_Pack.bin", zbsflasherp->tagtype)); + if (errors) break; + + zbsflasherp->zbs->reset(false); + delete zbsflasherp; + zbsflasherp = nullptr; + + infoDisplay("Write successful", 0); + report(true); + + wsSerial("Flashing succeeded", "green"); +#ifdef HAS_TFT + tftOverride = true; + tft2.fillRect(0, 50, tft2.width(), 40, TFT_DARKGREEN); + tft2.setCursor(0, 55, 4); + tft2.setTextColor(TFT_WHITE); + tft2.print("OK, Done!"); + vTaskDelay(500 / portTICK_PERIOD_MS); +#endif + + autoFlashStep = AUTOFLASH_STEP_FINISHED; + break; + } + + case AUTOFLASH_STEP_ABORT: { + wsSerial("Flashing failed", "red"); +#ifdef HAS_TFT + tftOverride = true; + tft2.fillRect(0, 50, tft2.width(), 40, TFT_RED); + tft2.setCursor(0, 55, 4); + tft2.setTextColor(TFT_WHITE); + tft2.print("Flash failed"); + vTaskDelay(500 / portTICK_PERIOD_MS); +#endif + + zbsflasherp->zbs->reset(false); + delete zbsflasherp; + zbsflasherp = nullptr; + + vTaskDelay(100 / portTICK_PERIOD_MS); + pinMode(FLASHER_EXT_TEST, INPUT_PULLDOWN); + vTaskDelay(100 / portTICK_PERIOD_MS); + autoFlashStep = AUTOFLASH_STEP_WAITDISCONNECT; + break; + } + + case AUTOFLASH_STEP_FINISHED: { + Seriallog.printf("You can safely disconnect the tag"); + + vTaskDelay(100 / portTICK_PERIOD_MS); + pinMode(FLASHER_EXT_TEST, INPUT_PULLDOWN); + vTaskDelay(100 / portTICK_PERIOD_MS); + autoFlashStep = AUTOFLASH_STEP_WAITDISCONNECT; + break; + } + + case AUTOFLASH_STEP_WAITDISCONNECT: { + if (!extTagConnected()) autoFlashStep = AUTOFLASH_STEP_STARTUP; + vTaskDelay(500 / portTICK_PERIOD_MS); + break; + } + + case AUTOFLASH_STEP_STARTUP: { + int8_t powerPins2[] = FLASHER_EXT_POWER; + uint8_t numPowerPins = sizeof(powerPins2); + powerControl(false, (uint8_t*)powerPins2, numPowerPins); + +#ifdef HAS_TFT + tftOverride = true; + tft2.fillScreen(TFT_PURPLE); + tft2.setCursor(0, 0, 4); + tft2.setTextColor(TFT_WHITE); + tft2.print("Flasher mode"); + tft2.setCursor(0, 25, 2); + tft2.setTextColor(TFT_WHITE); + tft2.print("Ready to connect a tag."); + tft2.print("When recognized, it will be flashed automatically"); + if (webFlashMode == FLASHMODE_AUTO_BACKGROUND) tftOverride = false; +#endif + wsSerial("Ready to connect a tag. It will be flashed automatically", "silver"); + autoFlashStep = AUTOFLASH_STEP_IDLE; + vTaskDelay(100 / portTICK_PERIOD_MS); + break; + } + + case AUTOFLASH_START_USBFLASHER: { +#ifdef HAS_TFT + tftOverride = true; + tft2.fillScreen(TFT_PURPLE); + tft2.setCursor(0, 0, 4); + tft2.setTextColor(TFT_WHITE); + tft2.print("CMD mode"); + tft2.setCursor(0, 25, 2); + tft2.setTextColor(TFT_WHITE); + tft2.print("Use OEPL-flasher.py to flash a tag"); + if (webFlashMode == FLASHMODE_AUTO_BACKGROUND) tftOverride = false; +#endif + autoFlashStep = AUTOFLASH_USBFLASHER_RUNNING; + break; + } + + case AUTOFLASH_USBFLASHER_RUNNING: { + vTaskDelay(500 / portTICK_PERIOD_MS); + break; + } + + case AUTOFLASH_END_USBFLASHER: { + autoFlashStep = AUTOFLASH_STEP_FINISHED; + } + } + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +void handleWSdata(uint8_t* data, size_t len, AsyncWebSocketClient* client) { + StaticJsonDocument<200> doc; + DeserializationError error = deserializeJson(doc, (const char*)data); + StaticJsonDocument<250> response; + response["flashstatus"] = 1; + + if (error) { + wsSerial("Failed to parse JSON"); + return; + } + + if (doc.containsKey("flashcmd")) { + uint16_t flashcmd = doc["flashcmd"].as(); + switch (flashcmd) { + case WEBFLASH_ENABLE_AUTOFLASH: + wsSerial("Switching to autoflash", "yellow"); + webFlashMode = FLASHMODE_AUTO_FOCUS; + autoFlashStep = AUTOFLASH_STEP_STARTUP; + break; + case WEBFLASH_ENABLE_USBFLASHER: + wsSerial("Switching to usbflasher", "yellow"); + wsSerial("You can now use OEPL-flasher.py to flash your tags", "silver"); + autoFlashStep = AUTOFLASH_START_USBFLASHER; + webFlashMode = FLASHMODE_OFF; + break; + case WEBFLASH_FOCUS: + if (webFlashMode == FLASHMODE_AUTO_BACKGROUND) webFlashMode = FLASHMODE_AUTO_FOCUS; + if (webFlashMode == FLASHMODE_OFF) { + autoFlashStep = AUTOFLASH_START_USBFLASHER; + } else { + autoFlashStep = AUTOFLASH_STEP_STARTUP; + } +#ifdef HAS_TFT + tftOverride = true; +#endif + break; + case WEBFLASH_BLUR: + if (webFlashMode == FLASHMODE_AUTO_FOCUS) webFlashMode = FLASHMODE_AUTO_BACKGROUND; +#ifdef HAS_TFT + tftOverride = false; + sendAvail(0xFC); +#endif + break; + } + } + + String jsonResponse; + serializeJson(response, jsonResponse); + client->text(jsonResponse); +} + +#endif \ No newline at end of file diff --git a/ESP32_AP-Flasher/src/wifimanager.cpp b/ESP32_AP-Flasher/src/wifimanager.cpp index 6441ffc1..7cc365da 100644 --- a/ESP32_AP-Flasher/src/wifimanager.cpp +++ b/ESP32_AP-Flasher/src/wifimanager.cpp @@ -37,7 +37,7 @@ WifiManager::WifiManager() { void WifiManager::terminalLog(String text) { Serial.println(text); -#ifdef YELLOW_IPS_AP +#ifdef HAS_TFT TFTLog(text); #endif } @@ -67,6 +67,8 @@ void WifiManager::poll() { } } +#ifndef HAS_USB + // ap_and_flasher has gpio0 in use as FLASHER_AP_POWER if (digitalRead(0) == LOW) { Serial.println("GPIO0 LOW"); long starttime = millis(); @@ -97,6 +99,7 @@ void WifiManager::poll() { ESP.restart(); } } +#endif pollSerial(); } @@ -107,12 +110,12 @@ bool WifiManager::connectToWifi() { _ssid = preferences.getString("ssid", WiFi_SSID()); _pass = preferences.getString("pw", WiFi_psk()); if (_ssid == "") { - terminalLog("No connection information saved"); + terminalLog("No connection info saved"); logLine("No connection information saved"); startManagementServer(); return false; } - terminalLog("Stored ssid: " + String(_ssid)); + terminalLog("ssid: " + String(_ssid)); String ip = preferences.getString("ip", ""); String mask = preferences.getString("mask", ""); @@ -166,7 +169,7 @@ bool WifiManager::connectToWifi(String ssid, String pass, bool savewhensuccessfu WiFi.setSleep(WIFI_PS_MIN_MODEM); terminalLog("Connecting to WiFi..."); - logLine("Connecting to WiFi..."); + // logLine("Connecting to WiFi..."); WiFi.persistent(savewhensuccessfull); WiFi.begin(_ssid.c_str(), _pass.c_str()); _connected = waitForConnection(); @@ -199,7 +202,7 @@ bool WifiManager::waitForConnection() { WiFi.persistent(true); IPAddress IP = WiFi.localIP(); terminalLog("Connected!"); - logLine("Connected!"); + // logLine("Connected!"); _nextReconnectCheck = millis() + _reconnectIntervalCheck; wifiStatus = CONNECTED; return true; @@ -207,7 +210,7 @@ bool WifiManager::waitForConnection() { void WifiManager::startManagementServer() { if (!_APstarted) { - terminalLog("Starting configuration AP, ssid: OpenEPaperLink"); + terminalLog("Starting config AP, ssid: OpenEPaperLink"); logLine("Starting configuration AP, ssid OpenEPaperLink"); WiFi.disconnect(true, true); delay(100); diff --git a/ESP32_AP-Flasher/src/zbs_interface.cpp b/ESP32_AP-Flasher/src/zbs_interface.cpp index 0e8fd2f6..7eb39c78 100644 --- a/ESP32_AP-Flasher/src/zbs_interface.cpp +++ b/ESP32_AP-Flasher/src/zbs_interface.cpp @@ -57,7 +57,7 @@ void ZBS_interface::setSpeed(uint32_t speed) { } ZBS_interface::~ZBS_interface() { - if (spi) delete spi; + // if (spi) delete spi; } void ZBS_interface::set_power(uint8_t state) { powerControl(state, _POWER_PIN, _POWER_PINS); @@ -91,12 +91,14 @@ void ZBS_interface::enable_debug() { delay(100); } -void ZBS_interface::reset() { +void ZBS_interface::reset(bool leavepower) { + /* if (spi) { spi->end(); delete spi; spi = nullptr; } + */ pinMode(_SS_PIN, INPUT); pinMode(_CLK_PIN, INPUT); pinMode(_MOSI_PIN, INPUT); @@ -105,7 +107,7 @@ void ZBS_interface::reset() { set_power(ZBS_OFF); delay(500); digitalWrite(_RESET_PIN, HIGH); - set_power(ZBS_ON); + if (leavepower) set_power(ZBS_ON); pinMode(_RESET_PIN, INPUT); } diff --git a/ESP32_AP-Flasher/wwwroot/content_cards.json b/ESP32_AP-Flasher/wwwroot/content_cards.json index cdea2301..44f46b29 100644 --- a/ESP32_AP-Flasher/wwwroot/content_cards.json +++ b/ESP32_AP-Flasher/wwwroot/content_cards.json @@ -281,6 +281,60 @@ } ] }, + { + "id": 26, + "name": "Time Stamp", + "desc": "Displays the last date and time when a button press took place. For example, to keep track of the last time somebody let the dog out, or when you last watered the plants, or change the bed sheets.", + "properties": [ "savespace" ], + "param": [ + { + "key": "title", + "name": "Title", + "desc": "Displayed title", + "type": "text" + }, + { + "key": "button1", + "name": "Name for Button 1", + "desc": "Text displayed for button 1 (for example, a name or activity)", + "type": "text" + }, + { + "key": "button2", + "name": "Name for Button 2", + "desc": "Text displayed for button 2 (for example, a name or activity)", + "type": "text" + }, + { + "key": "mode", + "name": "Working mode", + "desc": "With 'keep one time', both buttons reset the same timestamp, recording which button is pressed last. The option for seperate date/time, records two different timestamps, one for each button.", + "type": "select", + "options": { + "0": "keep one timestamp", + "1": "seperate timestamp per button" + } + }, + { + "key": "nextaction", + "name": "Frequency (days)", + "desc": "When is the next action expected to take place (in days after a timestamp). Leave 0 to disable.", + "type": "text" + }, + { + "key": "last1", + "name": "Timestamp 1", + "desc": "The date/time the last event took place", + "type": "ro" + }, + { + "key": "last2", + "name": "Name, or timestamp 2", + "desc": "The name of the button that was pressed, or in case of seperate timestamp, the date/time of the second button press", + "type": "ro" + } + ] + }, { "id": 27, "name": "Dayahead prices", diff --git a/ESP32_AP-Flasher/wwwroot/flash.js b/ESP32_AP-Flasher/wwwroot/flash.js new file mode 100644 index 00000000..67eff900 --- /dev/null +++ b/ESP32_AP-Flasher/wwwroot/flash.js @@ -0,0 +1,139 @@ +const $ = document.querySelector.bind(document); +let running = false; +let buttonState = false; + +const WEBFLASH_ENABLE_AUTOFLASH = 1 +const WEBFLASH_ENABLE_USBFLASHER = 2 +const WEBFLASH_FOCUS = 3 +export const WEBFLASH_BLUR = 4 + +export async function init() { + wsCmd(WEBFLASH_FOCUS); + checkTagFW(); +} + +export function wsCmd(command) { + const dataToSend = { + flashcmd: command, + }; + const jsonData = JSON.stringify(dataToSend); + socket.send(jsonData); +} + +$('#doAutoflash').onclick = function () { + if (running) return; + disableButtons(true); + running = true; + + wsCmd(WEBFLASH_ENABLE_AUTOFLASH); + + running = false; + disableButtons(false); +} + +$('#doUSBflash').onclick = function () { + if (running) return; + disableButtons(true); + running = true; + + wsCmd(WEBFLASH_ENABLE_USBFLASHER); + + running = false; + disableButtons(false); +} + +export function print(line, color = "white") { + const consoleDiv = document.getElementById('flashconsole'); + if (consoleDiv) { + if (color == "clear") { + consoleDiv.innerHTML = ""; + return; + } + + const isScrolledToBottom = consoleDiv.scrollHeight - consoleDiv.clientHeight <= consoleDiv.scrollTop; + const newLine = document.createElement('div'); + newLine.style.color = color; + + if (line.startsWith("<")) { + const existingLines = consoleDiv.getElementsByTagName('div'); + let lastLine; + + for (let i = existingLines.length - 1; i >= 0; i--) { + const lineText = existingLines[i].textContent; + if (lineText.startsWith(" ")) { + lastLine = existingLines[i]; + break; + } + } + if (lastLine) { + lastLine.innerHTML = line.substring(1) + lastLine.innerHTML.substring(line.length - 1); + lastLine.style.color = color; + } + } else if (line.startsWith("\r")) { + const existingLines = consoleDiv.getElementsByTagName('div'); + if (existingLines.length > 0) { + const lastLine = existingLines[existingLines.length - 1]; + lastLine.innerHTML = line.substring(1); + } + } else { + newLine.textContent = line; + consoleDiv.appendChild(newLine); + } + + if (isScrolledToBottom) { + consoleDiv.scrollTop = consoleDiv.scrollHeight; + } + } +} + +function disableButtons(active) { + $("#flashtab").querySelectorAll('button').forEach(button => { + button.disabled = active; + }); + buttonState = active; +} + +const fetchAndPost = async (url, name, path) => { + try { + print("updating " + path); + const response = await fetch(url); + const fileContent = await response.blob(); + + const formData = new FormData(); + formData.append('path', path); + formData.append('file', fileContent, name); + + const uploadResponse = await fetch('/littlefs_put', { + method: 'POST', + body: formData + }); + + if (!uploadResponse.ok) { + print(`${response.status} ${response.body}`, "red"); + errors++; + } else { + print(`Firmware file downloaded`, "green"); + } + } catch (error) { + print('error: ' + error, "red"); + errors++; + } +}; + +async function checkTagFW() { + const fwfile = "/Tag_FW_Pack.bin"; + const url = "/check_file?path=" + encodeURIComponent(fwfile); + const response = await fetch(url); + if (response.ok) { + const data = await response.json(); + if (data.filesize > 0) { + print(`File ${fwfile} found`, "green"); + } else { + print(`File ${fwfile} not found. Downloading...`, "red"); + await fetchAndPost("https://raw.githubusercontent.com/jjwbruijn/OpenEPaperLink/master/binaries/Tag/Tag_FW_Pack.bin", "Tag_FW_Pack.bin", fwfile); + } + } else { + print(`error checking file ${file.path}: ${response.status}`, "red"); + errors++; + } +} diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index 76cc9205..5be2c4e2 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -26,6 +26,7 @@ + @@ -226,6 +227,48 @@ Work in progress... +
+

Tag flasher

+
+
+

Mode

+
+

+ With automatic flash, a tag is flashed to the latest firmware as soon as you connect it. + It sets the mac automatically, tries to recognize the type, and starts flashing. Currently, Solum M2 tags only. +

+

+ Using OEPL-Flasher.py, you have full control over the flashing of the tag.
+ Use the --ip argument to connect to the flasher.
+
+ Usage:
+
+OEPL-Flasher.py [-h] [-t IP] [-f] [-i] [-eep] [-n] [-z]
+[--pt] [--exit] [{read,write,autoflash,debug}] [filename]
+
+{read,write,autoflash,debug} Command to execute
+filename Filename for read/write commands
+
+options:
+-h, --help show this help message and exit
+-t IP, --ip IP IP Address to use
+-f, --flash Write to the flash
+-i, --infopage Write to the infopage/UICR
+-eep, --eeprom EEPROM operations
+-n, --nrf82511 nRF82511 programming
+-z, --zbs243 ZBS243 programming
+--pt, --passthrough Enters serial passthrough for debug output after flashing
+--exit Exit eeprom loader after sending data
+							
+
+ +
+
+
+
+
+
+

Access Point config

@@ -247,7 +290,7 @@

download latest version diff --git a/ESP32_AP-Flasher/wwwroot/main.css b/ESP32_AP-Flasher/wwwroot/main.css index 886761f2..7be7813a 100644 --- a/ESP32_AP-Flasher/wwwroot/main.css +++ b/ESP32_AP-Flasher/wwwroot/main.css @@ -198,7 +198,8 @@ label { #aptab, #configtab, -#updatetab { +#updatetab, +#flashtab { padding: 10px; & p { @@ -206,7 +207,7 @@ label { } } -#updatetab { +#updatetab, #flashtab { &>div { display: flex; gap: 2em; @@ -858,7 +859,7 @@ h4 { display: none; } -.updateCol1 { +.updateCol1, .flashCol1 { flex-grow: 1; } @@ -873,6 +874,7 @@ h4 { overflow-y: scroll; white-space: break-spaces; flex-grow: 1; + max-width: 600px; } .console div { diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index 03a3c2c4..5c539bd3 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -22,11 +22,12 @@ const apstate = [ { state: "wait for reset", color: "blue" }, { state: "requires power cycle", color: "purple" }, { state: "failed", color: "red" }, - { state: "coming online", color: "yellow" } + { state: "coming online", color: "yellow" }, + { state: "AP without radio", color: "green" } ]; const runstate = [ { state: "⏹︎ stopped" }, - { state: "⏸pause" }, + { state: "⏸ pause" }, { state: "" }, // hide running { state: "⏳︎ init" } ]; @@ -36,7 +37,7 @@ let isProcessing = false; let servertimediff = 0; let paintLoaded = false, paintShow = false; let cardconfig; -let otamodule; +let otamodule, flashmodule; let socket; let finishedInitialLoading = false; let getTagtypeBusy = false; @@ -53,6 +54,19 @@ window.addEventListener("loadConfig", function () { this.document.title = data.alias; } if (data.C6) { + var optionToRemove = $("#apcfgchid").querySelector('option[value="27"]'); + if (optionToRemove) $("#apcfgchid").removeChild(optionToRemove); + $('#c6Option').style.display = 'block'; + } + if (data.hasFlasher) { + $('[data-target="flashtab"]').style.display = 'block'; + } + if (data.savespace) { + } + if (data.apstate) { + $("#apstatecolor").style.color = apstate[data.apstate].color; + $("#apstate").innerHTML = apstate[data.apstate].state; + $('#dashboardStatus').innerHTML = apstate[data.apstate].state; } }); }); @@ -86,11 +100,12 @@ window.addEventListener("load", function () { faviconLink.rel = 'icon'; faviconLink.href = 'favicon.ico'; document.head.appendChild(faviconLink); - }); + }); }); /* tabs */ -let activeTab = ''; +let activeTab = '', previousTab = ''; + function initTabs() { const tabLinks = document.querySelectorAll(".tablinks"); const tabContents = document.querySelectorAll(".tabcontent"); @@ -204,7 +219,13 @@ function connect() { populateAPCard(msg.apitem); } if (msg.console) { - if (otamodule && typeof (otamodule.print) === "function") { + if (activeTab == 'flashtab' && flashmodule && typeof (flashmodule.print) === "function") { + let color = (msg.color ? msg.color : "#c0c0c0"); + if (msg.console.startsWith("Fail") || msg.console.startsWith("Err")) { + color = "red"; + } + flashmodule.print(msg.console, color); + } else if (otamodule && typeof (otamodule.print) === "function") { let color = "#c0c0c0"; if (msg.console.startsWith("Fail") || msg.console.startsWith("Err")) { color = "red"; @@ -426,7 +447,7 @@ function updatecards() { let nextcheckin = item.dataset.nextcheckin - ((Date.now() / 1000) - servertimediff); $('#tag' + tagmac + ' .nextcheckin').innerHTML = "expected checkin" + displayTime(Math.floor(nextcheckin)); } else { - $('#tag' + tagmac + ' .nextcheckin').innerHTML = ""; + // $('#tag' + tagmac + ' .nextcheckin').innerHTML = ""; } }) @@ -723,7 +744,15 @@ document.addEventListener("loadTab", function (event) { $('#updateconsole').innerHTML = ''; loadOTA(); break; + case 'flashtab': + $('#flashconsole').innerHTML = ''; + loadFlash(); + break; } + if (previousTab == 'flashtab' && activeTab != 'flashtab' && flashmodule && typeof (flashmodule.wsCmd) === "function") { + flashmodule.wsCmd(flashmodule.WEBFLASH_BLUR); + } + previousTab = activeTab; }); $('#apcfgsave').onclick = function () { @@ -771,16 +800,13 @@ $('#uploadButton').onclick = function () { return response.text(); }) .then(data => { - console.log('File uploaded successfully: ', data); alert('TagDB restored. Webpage will reload.'); location.reload(); }) .catch(error => { - console.error('Error uploading file:', error); alert('Error uploading file: ' + error); }); } else { - console.error('No file selected.'); alert('No file selected'); } } @@ -812,16 +838,14 @@ $('#restoreFromLocal').onclick = function () { return response.text(); }) .then(data => { - console.log('File uploaded successfully: ', data); alert('TagDB restored. Webpage will reload.'); location.reload(); }) .catch(error => { - console.error('Error uploading file:', error); alert('Error uploading file: ' + error); }); } else { - console.log('No data found in localStorage'); + alert('No data found in localStorage'); } } @@ -830,6 +854,11 @@ async function loadOTA() { otamodule.initUpdate(); } +async function loadFlash() { + flashmodule = await import('./flash.js?v=' + Date.now()); + flashmodule.init(); +} + $('#paintbutton').onclick = function () { if (paintShow) { paintShow = false; @@ -1154,7 +1183,7 @@ function processZlib(data) { return inflatedBuffer.subarray(headerSize); } catch (err) { console.log('zlib: ' + err); - } + } } function displayTime(seconds) { @@ -1656,7 +1685,6 @@ function selectLocation(location) { 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) { diff --git a/Tag_Flasher/OEPL-Flasher.py b/Tag_Flasher/OEPL-Flasher.py index a99aa4db..ed1e343d 100644 --- a/Tag_Flasher/OEPL-Flasher.py +++ b/Tag_Flasher/OEPL-Flasher.py @@ -4,6 +4,8 @@ import serial import time from intelhex import IntelHex import os.path +import socket +import sys CMD_GET_VERSION = 1 CMD_RESET_ESP = 2 @@ -33,6 +35,9 @@ CMD_WRITE_FLASH = 83 CMD_AUTOFLASH = 87 CMD_COMPLETE = 88 +TRANSPORT_SER = 0 +TRANSPORT_TCP = 1 + def read_binary_file(file_path): with open(file_path, 'rb') as file: binary_data = file.read() @@ -55,12 +60,20 @@ def send_cmd(cmd, data): for x in return_data: crc_val += x return_data = b"AT" + return_data + to_byte(crc_val & 0xffff, 2) - ser.write(return_data) - + if transport == TRANSPORT_TCP: + tcp_socket.send(return_data) + else: + ser.write(return_data) def wait_for_command(): + if transport == TRANSPORT_TCP: + return wait_for_command_tcp() + else: + return wait_for_command_ser() + +def wait_for_command_ser(): start_time = time.time() - ser.timeout = 50 # Set the timeout to 1 second + ser.timeout = 3 # Set the timeout to 3 seconds while True: if ser.in_waiting > 0: command = ser.read(2) # Read the "AT" prefix @@ -86,23 +99,50 @@ def wait_for_command(): print("timeout waiting for reply") return None, None +def wait_for_command_tcp(): + start_time = time.time() + tcp_socket.settimeout(5) + while True: + try: + if tcp_socket.recv(2) == b"AT": + # Read the command byte + cmd = int.from_bytes(tcp_socket.recv(1), byteorder='big') + data_length = int.from_bytes( + tcp_socket.recv(4), byteorder='big') # Read the data length + data = tcp_socket.recv(data_length) # Read the data + # Read the CRC value + crc = int.from_bytes(tcp_socket.recv(2), byteorder='big') + # Verify CRC + crc_val = 0xAB34 + for x in to_byte(cmd, 1) + to_byte(data_length, 4) + data: + crc_val += x + if crc_val & 0xffff == crc: + return cmd, data + else: + print("Invalid CRC. Discarding command. Got " + + str(crc_val) + " but was expecting " + str(crc)) + print("data was:" + str(data)) + except socket.timeout: + if time.time() - start_time > 1: + print("timeout waiting for reply") + return None, None def list_available_com_ports(): - ports = serial.tools.list_ports.comports() - available_ports = [port.device for port in ports] - print("Specify a serial port to use with -p ") - print("available COM ports:") - for port in available_ports: - print(port) - + available_ports = [port.device for port in serial.tools.list_ports.comports()] + print("Available COM ports:", ', '.join(available_ports)) def validate_arguments(args): - if not (args.nrf82511 or args.zbs243): - print("Either -nrf82511 or -zbs243 option is required.") + if not (args.port or args.ip): + print("Either --port or --ip option is required.") + list_available_com_ports() return False + if args.command: + if not (args.nrf82511 or args.zbs243): + print("Either -nrf82511 or -zbs243 option is required.") + return False if not (args.internalap or args.external or args.altradio): - print("One of -internalap, -external, or -altradio options is required.") - return False + print("Using external port") + args.external = True if args.command in ["read", "write"] and not (args.flash or args.infopage or args.eeprom): print("One of --flash, --infopage or --eeprom arguments is required for read and write commands.") return False @@ -121,7 +161,7 @@ def validate_arguments(args): return True -def read_from_serial(port, filename, args): +def read_from_serial(filename, args): if args.flash: print( f"Reading flash data and saving to file: {filename}.") @@ -158,7 +198,7 @@ def read_from_serial(port, filename, args): print("Failed reading block, timeout?") -def write_to_serial(port, filename, args): +def write_to_serial(filename, args): if (args.flash): print(f"\nErasing flash... ") send_cmd(CMD_ERASE_FLASH, bytearray([])) @@ -204,7 +244,7 @@ def write_to_serial(port, filename, args): print(f'\rSent {i} bytes', end='', flush=True) elif (cmd == CMD_COMPLETE): print( - '\Tried to write more bytes than we have room for! \n', end='', flush=True) + 'Tried to write more bytes than we have room for! \n', end='', flush=True) return else: print("Some other error, dunno\n") @@ -212,23 +252,30 @@ def write_to_serial(port, filename, args): print('\rAll done writing! ', end='', flush=True) -def short_passthough(period_time): +def short_passthrough(period_time): start_time = time.time() while time.time() - start_time < period_time: - data = ser.read() - if data: - print(data.decode('utf-8', errors='ignore'), end='') - if chr(0x04) in data.decode('utf-8', errors='ignore'): - break - + if transport == TRANSPORT_TCP: + try: + data = tcp_socket.recv(1) + except socket.timeout: + pass + else: + try: + data = ser.read(1) + except UnicodeDecodeError: + pass + print(data, end='') + if chr(0x04) in data: + break def main(): try: parser = argparse.ArgumentParser( description="OpenEPaperLink Flasher for AP/Flasher board") parser.add_argument("-p", "--port", help="COM port to use") - parser.add_argument("command", choices=[ - "read", "write", "autoflash", "debug"], help="Command to execute") + parser.add_argument("-t", "--ip", help="IP Address to use") + parser.add_argument("command", nargs="?", choices=["read", "write", "autoflash", "debug"], help="Command to execute") parser.add_argument("filename", nargs="?", help="Filename for read/write commands") parser.add_argument("-f", "--flash", action="store_true", @@ -244,7 +291,7 @@ def main(): parser.add_argument("--internalap", action="store_true", help="Selects the internal accesspoint port") parser.add_argument("-e", "--external", action="store_true", - help="Selects the external(side) port") + help="Selects the external(side) port (default)") parser.add_argument("--altradio", action="store_true", help="Selects the alternate radio port") parser.add_argument("--pt", "--passthrough", action="store_true", @@ -254,22 +301,43 @@ def main(): args = parser.parse_args() if not validate_arguments(args): + program_name = os.path.basename(sys.argv[0]) + print(f"Usage: {program_name} --help") return - if not args.port: - list_available_com_ports() - return - - global ser - ser = serial.Serial(args.port, baudrate=115200) - time.sleep(0.1) # Flush serial data - while (ser.inWaiting() > 0): - data_str = ser.read(ser.inWaiting()) + global transport + if (args.ip): + global tcp_socket + ip_address = args.ip + port = 243 + tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + transport = TRANSPORT_TCP + try: + tcp_socket.connect((ip_address, port)) + print(f"Connected to {ip_address}:{port}") + except Exception as e: + print(f"Error: {e}") + return + else: + global ser + try: + ser = serial.Serial(args.port, baudrate=115200) + print(f"Successfully opened serial port {args.port}") + except serial.SerialException as e: + print(f"Error: {e}") + print("Please check if the specified COM port exists or is accessible.") + list_available_com_ports() + return + transport = TRANSPORT_SER + time.sleep(0.1) # Flush serial data + while (ser.inWaiting() > 0): + data_str = ser.read(ser.inWaiting()) + send_cmd(CMD_GET_VERSION, bytearray([])) cmd, answer = wait_for_command() if (cmd == CMD_GET_VERSION): - print("AP/Flasher version: " + + print("Connection with the flasher established. Version: " + str(answer[0] << 24 | answer[1] << 16 | answer[2] << 8 | answer[3])) else: print( @@ -308,18 +376,19 @@ def main(): print("Connection established to microcontroller") else: print("Failed to establish a connection to the microcontroller") + send_cmd(CMD_SET_POWER, bytearray([0])) exit(0) if args.command == "read": - read_from_serial(ser, args.filename, args) + read_from_serial(args.filename, args) elif args.command == "write": - write_to_serial(ser, args.filename, args) + write_to_serial(args.filename, args) elif args.command == "autoflash": print("Starting automatic tag flash") send_cmd(CMD_AUTOFLASH, bytearray([])) - short_passthough(30) + short_passthrough(30) else: - print("Invalid command!") + print("No command") if(args.eeprom): send_cmd(CMD_SET_TESTP, bytearray([1])) @@ -340,21 +409,28 @@ def main(): print( "---------------------------------------------------------------------------------") while True: - try: - data = ser.read() - if data: - print(data.decode('utf-8', errors='ignore'), end='') - except UnicodeDecodeError: - print(" ") - data = ser.read() - if data: - print(data.decode('utf-8', errors='ignore'), end='') - if chr(0x04) in data.decode('utf-8', errors='ignore'): - break + if transport == TRANSPORT_TCP: + try: + data = tcp_socket.recv(1) + except socket.timeout: + data = "" + pass + else: + try: + data = ser.read(1) + except UnicodeDecodeError: + data = "" + pass + print(data, end='') + if chr(0x04) in data: + break except KeyboardInterrupt: print("\nBye!") - ser.close() + if transport == TRANSPORT_TCP: + tcp_socket.close() + else: + ser.close() exit(1) diff --git a/binaries/Tag/Tag_FW_Pack.bin b/binaries/Tag/Tag_FW_Pack.bin index 18288080c59cfe826517459dde7475339d8c391e..7a4bd811a292a74faf2c88573780ac3e748d11b6 100644 GIT binary patch literal 407038 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 literal 245384 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