From 9929d1646f453727d378af2443d3809acc86b464 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Tue, 29 Aug 2023 22:11:05 +0200 Subject: [PATCH 1/7] small fixes - fixed context menu position - fixed free space sometimes displays 0 - added 12 byte payload to sendCommand --- ESP32_AP-Flasher/data/www/main.js.gz | Bin 9262 -> 9268 bytes ESP32_AP-Flasher/include/newproto.h | 2 +- ESP32_AP-Flasher/include/system.h | 2 ++ ESP32_AP-Flasher/include/tag_db.h | 2 ++ ESP32_AP-Flasher/src/newproto.cpp | 6 +++++- ESP32_AP-Flasher/src/web.cpp | 4 +++- ESP32_AP-Flasher/wwwroot/main.js | 16 ++++++++++++++-- tag_types.h | 2 ++ 8 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index 79187840a725035b9dc33c87ff405471b576f3ec..bc598e22a13702bff415868c4b31bae963caef2d 100644 GIT binary patch literal 9268 zcmV-4B+J_$iwFn+00002|7~GuZZ2wb0M$L)cH2mD&zf`QA7G3#0LK(>zRX0llZ?+93h1ip z>gww1>gwvoIGYuvch}qX;%vM)W3#gJFAJ7m9kG;+%PjAVl35(evexkHufG0jOgO*n z|L*zEZ$G?yzJK)Q^@robSI?gTmEO=@{`Ae8V<_%76#w}4@C_6X8j4@PIDpdo4W%y* z-yI!`3VN3>4w{HOKmO&-yWf2{I@o{BA)hrs{_^Y?{ycgv2tKD)r>ykK==At%&I)*c zy)G7&RCpGCSoXH!8}T4<;yIJSu9c7{N>R!yQokZM|lhkOp;UaA}gb_ zEMBClnr!@;mEvIntQS)jA3_U~D8)+ZjGeObI65ssZ=WuTE2Hr1uP$J4XBV9)j-Q{y z@P3&TC7ZE4^i!Y&{WV$4#$}Stys+h6gXku#98bfb3mgJq`2o2tI-iPc7PO#vt5Z(d zECgMegA74%d!GE8fWnpm6-Q-+5J-1xOSc7h$i(UjWPu3{xl`LA?)w zmHa$P!^Ir%7_rp$`n{e&S@Jr^5wgzm9EOFi6Q?>@@RRodl$r|8)H7rI0#@TUsM;}viQ1}Y3>4P0k;ya3wH)tAI)2~Q0kY9Y5IP~VJQc)zgG z5j}_gMX}TEq6pIrDh9mHGy{Wp&-1$%h0ps#AUiBaHixOJ?S%|qx0EzZp8X3p5|s;% zz^ao_mg}gWaT1OSz|PCj47$xrJ1BMPUvAUS3KZ`@z!cwsVOTH|iUf|`3P4EVRdFf@ zjLEw$ZF4&+2C<0^;$MNyOWV}T4rEd?hX$&$I!bY+F!-d9GI&+8GiYpJJWar@;0glb zz`5!u`4f{AI%!hE0G|{HWoWsp*n8~VCj%=jN@JCei+Kck2c8Rz$`N=0pSQ_RAY-!Y z|A@T`ItFSltSQW}9?j;lzxU$jmoM*Z#xKAGkGojeUSOD|Ewm^AoXjR!U|YL@8Zu?k zyjdhzN~FDSzquSd?0rA<;*nPXNHb16!ty#+&c<0D1Il7na%_pgOQ^ucLLe>6dY1^V z)3oc~hFL*OnL;S~)H_h2(_g8;fmUCf#b#Q2pXTANp00pKop;vGQjX0#TPMrJAIMWCUQYY4f zMl9&N0w$t*cLf5=R3&H*MFm_{w<^4vb&3^K%k;c9nKs91 zRwH#8QTf01w8J4I?}&czG6$p=JTtfhVq$G^FC>oNQ$94FKY_#^JToMF8N5 zF49zv5eo-RJgyU95(nj+vDcuIq4uBGmz+x?+(CjdBwfd!mIbMSTJgK3h+*Z}33;SVuHlW&|9z&ftGgAsVtp93Km zY_^n^aDHAvt56JshYt-YfP-+BoinxMHO8zEJ1PSQilLL~&ysojZ+*RJ#&riX88oX; z3U&#L=vkzMU+XIJOi)}EH_G7PJc&G@gZ1)?Jg$|uA*d}qst-+0hH~l23R`hUtZpR~ zrvOp|v5#5U{pa3wzx`m@1$79t#x*cRL@bu>?0VMnd1FL@$Gf20{V~rL^P?;;UnD6A zJG9h=&pV_9&)DS6=o4VWM1P=OJ-s@NUFxD6WTCgb1~vs0Ofam%tcBm1MZ)_r_2k{r z(V?lBwQ(W=rxzF|lw5+4IJ?f)lQhahSQPJQiso3cRN=o`x*Ye-MQ+Cz~+=-#gP z@!%(%Ru#;$?R^yNR{)8=2E|7Je))UzB|I$!x;5CgZ0_ZN6b^>T`2419vX zY`JhMw26v}DJqFF9r%nvySf?MgXtcN!aMc(5j}ht_o#jY<=$gV?(j@c&@l6KaY+f# zUAs-4Ji2&7Av=RFho3_1+T7cVAqT6*2&o7fSoLl#;%bdEsE~)=(Y<~2{ovvK{-9?K zPy+-6b$`%*)PH#Ykv5#l+A|T2#KpO*g71vDzQD@n=*7~GoHxxD7y%t@$H{3@g8z30 zUJvf{7_SNjc(L^g(fWfO9?$cZD-~TcQyn=J>e|C{j{}H!6k11ogf+rToR-)T_^7kf zFqoy=uU|s-q6Mvu2W~SDjUx?F##1)_oXo6Va?R!@?5^jaP-k>KdKwjF!PpF1(Ep*= zbGypgXas#enj0h_sRh*tmp=lZ?=u$z(xu2Fu7jl$?E@L~+HoJXrNAWbipx6VHQ0;j zGh57a78RKZ&tJcz*EJkNm3JMZqXsXcB?j<#S_3kMyoS>+SIH5qJ8p_5<7~Fts@9io z0(u1EJ_XNq7E{DzLjU>0HJ09KfEq}$2k=kKA;m=ky5)rwy+53lp-bw@439xPt~7-m zKBteM?>-NkATgg{r>Rh79PF%g4~(HuvlbJO2#@CM^4;*g7fBBGY?Ni?<1Uu&`3=My z1U2f#y^)Gmt!^FWTilv=O4i^Kzafj`A13|LXfqaHzc{!xhnO#7F}S8GBQxZ$*`u#n zd6DIxyn8ky`;2jR%JW9<+>qC}7s0u1a)KMFmc!ylaZKi(@@9mw4|PU^Xp7vX({W8J>A_{DoRf;I1#?dN z4|MWDSPgYm+SKygTw9YAiqI85up@a!0z|08td*^gJ#wM=e=T>?N+rx?<%8{~X&9W~ z)Uyq(dJo00Qg|MXr(r_7e`1L*lBM{{o&!$)!WiCF4kvFRmp#Ya61Uq$7#GfA^7 z4<)lL9$Su1Gb0?aA^RwVJ-ZQx9ay(;UgIWMLvq+?G*}6N)&$ikf$G;i z-TBRptFKjq&cntAtn)neM$WS4AFl{FYJ%%}p-G{9N4&yJg)l<2vkdbBL5M=$%gS=0 zNkM8WJLP~`7^X{%TWp>+=Sx}TdOrN zq84kE=R>`KM8+wLa_Bbz&t~H^8GpuP0B>9iEyek_h7@0vS>m3(B};jh!3E4k?hU?~qblo=0w;i!Cr% zV;L<)#xABw%Dk`wcV}1aUh!JRSfE(F1!`DETqi}ztRUNnGr8U~t~gXRt|~Nj4@d`s z_DXJ1Gv7UwR755fP3#q7_7qQ1FtLGg0Q5rP1);K668fr8O2x;M)A|mPAa9l1`*{MQ zk{JkZDKijj_`+mWx#uZ1C{%XfN$7o!xKA=*!uKlyrJzQ#SnkV^1RV8==&QF{l!57=)T8_3MNwvF+6p;L^$o>m zbluYI>O3oX=&mY4USO$3x^T%F-nx{>ngu9}?CHTUFd)e^j9D_92cQSfF+n_V5CP{uz-184+4?;Q2POj+ZucK?#pA3`+2uQS`uuVZc-?23f0 z{`QM#d-DFe|7dx)Yd|K&E54(tX@X%wTcl{{wgnh9m_Z||?CH#S({9!v zmi6Wafw1CY7PZx9wYT9`vrT4jF@@veoh#*FNDFsMLpO2-ZdO|Z^f=Gb^d}AtE*iq_ zC?{iS%B6_TSIfoNwdavd&uu1$HtaJtac=KdxAhSP+{Zl9dmNg=6SO_infK%gWz9(V zj8X^0;Uu08oaJZF_&kMMD=)+&H>$EwzYIW2CWbGU(S2lK7uD~R*GxBUfiOyneJ8m;H8%H5f_Bnmi_XU^X126d- z^o(BX*Ao78`W=~qGn|_}KW3OUyE?~BpUzm`vZH^~ZWe&q)ZDmD7(C4DJrq){UrGd3?$_}`az zsvzVLJwScAT=0yqMVgC>M{rh?H&118Ec6uj-*(_X-#DWr&57s)r!|ow8kvSpA*Rq` zESigfwVpM;gD~Pp4&{Oad?pcWAcx6UCoYC+g^_0$2XvHXm!rd~>Y@ zo5iCXE!_;d+pnOcd<|uSN3+uf9<-}MiuV>c1|(+Vt19eSbV+J&!NTegSAAkU*a&#Q z+l`U1iz={qZGm1SlY|bjSAkW51&*QQKj9+10xjQL!2H;1jb&sP;rn&qK_l=$PiNMs zShX^@N706hlbbmhrXOF|!v?Q|YnzE>Dy0)C0DTJ#1WPy9U<&=S(B-?8m{J=xrcm3} zXi6tFo~gpCk%f-hsQ6+fmQq%Yr(dnal!~hn)tl9gR9dVtdib7ras<=_ip@5tl3@y-Howo1EW0)8Lcm@>zyHn)Y zaX`>`m(6HM?RIy6O;5{$wg&rs{>;k z#yWNC0|(&S1dgzC{RA0GRUbU(#CS^4A}=VXD44QzE)$YCggj7Rk*~Gd)#cf^sw<&K74QSf@3k=Gi7y z@*>bUT&c(AJnSUOt&mN4g`haNl+>1aAR4+9oR{I!U9cCJv`-+OiPU zGE(f7Iv`LghFS=IPH-zkVVKHi0(6SSi0@N`FroG-bIafMjmB(VnL(?sTT{W8lR>4w zD!cNl(6no3T$~`)!JL*X3W}j+T|-0?ArVL@$*?|%hXzdZK%`43D%(*lJ}6a3R?GFl z)ATr=VA3@%61{8>s0fV0NY);#?3L z+b8~{lvz}6l?f9;MS9BAomC&B7H!pE`Ytr%o)doU4sKssdLec=iI6I;t3@>kj3Hm| zvG)Le?%gwd;)J^_t}Y-qAB!7SCy2!H2Y)RYyQB+MeCPc=KQisb46h9>)Wtut{Y{cy zs;y%3ju!S9OQnav3!GBCQHv_=5vPLf_W04Ft{?WY&fRRQa!H1*^z7xz|IF)3s#u3j;HZ2IgBB&G z1;Zy>&ucv6O0{E4@+_{Q+K)d)W9SD|^w5tcu&y7m(*#p2 zg2!nhFS5htPT@oehNT?10CR0I|oTe9v!nK4r-)^nW$> zW36BbKUSZ_ZGJ)TQ7)EH`nulEd{IopYtMu+djF1jg|7@6@)v|2x+P_U=)tM0H8K{Z zHEOsmxSCR30h3c6aqGS$RM0mLt(pAM?YFIAQ|@+EG}ueJ8O1c2l;${fMfbpxID&g3 zJ=dBLpL9lxLf#d%Q77H3ReU;-?it2EtDM^R8gOS1;Z|SI#P=*DYiNbW;1tru*I7Ph z+w|mnYd0q%^y{83CKEidX8@1rm5xxH2&O~;Q9S+i;-k*a5gEsvmzKAd2kVUjAn^C* zoebmhl4c|-mb2Ss83uzmur6;P`HBrnKoa)lP`(XUFl5n*^&aQXuxR<=AdSxEEGDN~ zh`M@luNtm6TAMV&yz{~>!O?t92ihOC?7NMUqW|b=QtBOcSzCiI`CX$c`JFcq%T|}y z3Ugn0Q<80yr0(4PSM2lz2z1Runr8V%5xFq4iNJI7C7T2URGdD{D?!$M z%avawaDvx7Ve^P8U+NeUGh82`7i64Wr9Y!lp@F;nY_yDo@g-CR%YpWH;z)HD57bNK zoSj7p9uPm`V3JA&^HI-O2gm{#b+jwAO7t0!yvu#H1A_=1uY{chX?fMd=cY5dmIL|9z4N_;I2>L{`(yYNaEdb zPwe9|$kgW45ZXZu!>s{N(BX_K33L!63}LvATGquC7&6(1T7}vOHd^L&&H>$k5unwK z5egD{O8phI_N>qD(5MS4SkybMrdugCL#zhg#i4I9Mc%G`_$-fc zO-o<-l9LgOT=vF3j<3_Yi>Fry7~?`a8RG5D)Nb*y7)8syM`PV6foC0Nf|V_Puh)bu{H zx#chEnpYmLqb~m3m^O8}$bnu@oWrdrzO)2fxg5$E6+;`2Z(CP-P>J81;ms`z(W~}1 z2n0oOKaLpI^n35#&;qFrIJJbc&4j_rvU2ZrQOTebnOo-E&OI^z{RvI!yFS0++{f#u z#C%`7Gs?Ub5$`g<*ekeOMKv{agWAY6-lQ^Y$}Q_kW)Zl0=kB&uEyb#PneJ3CX1X0e z@_wcYJ9qg0xBK=Gb*EE9m3Iot*Ci4SAvbZF-w9!)=o$bHC6%+*-*OJBUZNz11>Ism z1xCsQKl3OuHSnu4!|Gi?Wp;X+GVbgbu6t|rZ9K|_OC_w?8K)V z&F>vrH|o>4a@K=%@ZhJyQ}opQAu0~-NnnXzcBv!E?0%)lO}c)s|KE*<7}Xt(9vJ=Lc|I7PHT@>|%x+Yr1lg_`ZXIFCOWo zKS%R9{hHfM^g_pOcf6DLZ6O)!{%wZ@^=CmFKWVC0H41pC<%vyxW`0wmaxzmb!DXX~ zAaA(DrEDfTsk9~9tnR{7AXL!eKvEoaD6x;l!AMkf7%?cR(9r{$H+;q8BBh6!90=0UnpPU|vEGz_w z9q~&k`c_1QwnV!6YE!W{4!-VTY}6rhN9C+1!U}X`8R)*F7oohSXNv>4PBgLVE9!_G?>m#7 zVHHF9`(_O_91H8xtL}1dtGaQ+YhYJ$Wq=Fv+q!0nAW_Q84w$41k-c_C`IMJ!@2ah; zXdB1|BCnv#o~GGIen|@!z$4Q|R;FRqX@9xtT|E^)4%)`$JT4d<+5m*Lf-}hl`e}Y@ z>W6lG&9smv?=?9)<=;jR+6Iz33?ATN@Sv>=>?7g2U}ZdI>C4&E{RLT@aL z1Lp)Di^UjsUNO!0Dlm?&)OOUX9>}3V2YibJZ#OXU_13(@o7t40{Y`p<>{9kg_tTu6 zs*0C2D<(FY8_k%(zzeDqKU>egU{4e*()vdjWBl1Kuz!Aj_Y#8v@{Ta`W=1th@QWEi z!P10(V!X>&BPt_h{Y3ifd;^#70!B!(-WMR#MDN zwl&mn@NVYc=~K?l6Rv%LNKDX8J0=`Jx?|>Kw9A*+W`Vl8jQ?S-XgGwqrjaRCG{3)M zvxPi!&EIT8{fj_f3%cU2>_DIpMw^^28G3X%t~xyzLzOK4QS8E*j#q<2N++0YEaN=1 zxP#g*ulcK{QtPX&ht{ELE)X3OJt3vR>|_{r@_w{7KS2y{USI~WJPHzc%eDzlu_y!h z0G~bi0Tcd(zkt5VyQTNbn;OxuiE*tL?H21itC|l1!46%IrnxzSM^Efm6^eD;RJy25 zgTJE}9_3OCSP?MOH)J$%AZX&Ao+kK=?$Sbn9>(B3(lIWLR+VJ^R(ofSG7c|~{@5|b zG+8m)(nOl0G^uRXi8DaNw*pyp8NTU|G4}$_R>qHauSF$Eyp(E87uMgs2IZ9>+}_%< z?vGR`E%UByA+Qx!j3|p}!dr((6EhULRWlcFvmy~^t7LF+QtrSI2F{_SfAsEwfttnH zg$ULEk*iCY%{9b^X|2S4JuvEFF!UQL%q$oP`Cosxz(h%3|8EJ zUEhq^sCTMaUh;@6ruP-{#J2HC?n;j9z&g2To;$zgIk?1e3NF#{WjnfzSJdM9!=0Y^ W^ppBXbK|kN<^KXGje#|FjsO7Z{otMe literal 9262 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 QIk@Hj0!GMG=Vp!o0Mv>l6aWAK diff --git a/ESP32_AP-Flasher/include/newproto.h b/ESP32_AP-Flasher/include/newproto.h index 8b6abcce..84ceb82a 100644 --- a/ESP32_AP-Flasher/include/newproto.h +++ b/ESP32_AP-Flasher/include/newproto.h @@ -13,7 +13,7 @@ extern void processXferComplete(struct espXferComplete* xfc, bool local); extern void processXferTimeout(struct espXferComplete* xfc, bool local); extern void processDataReq(struct espAvailDataReq* adr, bool local); -extern bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local); +extern bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local, const uint8_t* payload = nullptr); extern bool sendAPSegmentedData(const uint8_t* dst, String data, uint16_t icons, bool inverted, bool local); extern bool showAPSegmentedInfo(const uint8_t* dst, bool local); extern void updateTaginfoitem(struct TagInfo* taginfoitem, IPAddress remoteIP); diff --git a/ESP32_AP-Flasher/include/system.h b/ESP32_AP-Flasher/include/system.h index fd0deca2..e197cee1 100644 --- a/ESP32_AP-Flasher/include/system.h +++ b/ESP32_AP-Flasher/include/system.h @@ -4,6 +4,8 @@ #define WAKEUP_REASON_BOOT 1 #define WAKEUP_REASON_GPIO 2 #define WAKEUP_REASON_NFC 3 +#define WAKEUP_REASON_BUTTON1 4 +#define WAKEUP_REASON_BUTTON2 5 #define WAKEUP_REASON_FIRSTBOOT 0xFC #define WAKEUP_REASON_NETWORK_SCAN 0xFD #define WAKEUP_REASON_WDT_RESET 0xFE diff --git a/ESP32_AP-Flasher/include/tag_db.h b/ESP32_AP-Flasher/include/tag_db.h index 1d415fb7..df19cd22 100644 --- a/ESP32_AP-Flasher/include/tag_db.h +++ b/ESP32_AP-Flasher/include/tag_db.h @@ -11,6 +11,8 @@ #define WAKEUP_REASON_BOOTUP 1 #define WAKEUP_REASON_GPIO 2 #define WAKEUP_REASON_NFC 3 +#define WAKEUP_REASON_BUTTON1 4 +#define WAKEUP_REASON_BUTTON2 5 #define RUNSTATUS_STOP 0 #define RUNSTATUS_PAUSE 1 diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index 47b7af5e..da588b47 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -600,12 +600,16 @@ bool showAPSegmentedInfo(const uint8_t* dst, bool local) { } } -bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local) { +bool sendTagCommand(const uint8_t* dst, uint8_t cmd, bool local, const uint8_t* payload) { struct pendingData pending = {0}; memcpy(pending.targetMac, dst, 8); pending.availdatainfo.dataType = DATATYPE_COMMAND_DATA; pending.availdatainfo.dataTypeArgument = cmd; pending.availdatainfo.nextCheckIn = 0; + if (payload != nullptr) { + memcpy(&pending.availdatainfo.dataVer, payload, sizeof(uint64_t)); + memcpy(&pending.availdatainfo.dataSize, payload + sizeof(uint64_t), sizeof(uint32_t)); + } pending.attemptsLeft = 120; Serial.printf(">Tag CMD %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) { diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index d87ecabb..931c9fee 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -77,14 +77,16 @@ void wsSendSysteminfo() { time_t now; time(&now); static int freeSpaceLastRun = 0; + static size_t freeSpace = Storage.freeSpace(); sys["currtime"] = now; sys["heap"] = ESP.getFreeHeap(); sys["recordcount"] = tagDB.size(); sys["dbsize"] = dbSize(); if (millis() - freeSpaceLastRun > 30000) { - sys["littlefsfree"] = Storage.freeSpace(); + freeSpace = Storage.freeSpace(); freeSpaceLastRun = millis(); } + sys["littlefsfree"] = freeSpace; sys["apstate"] = apInfo.state; sys["runstate"] = config.runStatus; #if !defined(CONFIG_IDF_TARGET_ESP32) diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index 7d49c84e..ff2c98fa 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -4,6 +4,8 @@ const WAKEUP_REASON_TIMED = 0; const WAKEUP_REASON_BOOT = 1; const WAKEUP_REASON_GPIO = 2; const WAKEUP_REASON_NFC = 3; +const WAKEUP_REASON_BUTTON1 = 4; +const WAKEUP_REASON_BUTTON2 = 5; const WAKEUP_REASON_FIRSTBOOT = 0xFC; const WAKEUP_REASON_NETWORK_SCAN = 0xFD; const WAKEUP_REASON_WDT_RESET = 0xFE; @@ -250,6 +252,14 @@ function processTags(tagArray) { $('#tag' + tagmac + ' .nextcheckin').innerHTML = "GPIO wakeup" $('#tag' + tagmac).style.background = "#c8f1bb"; break; + case WAKEUP_REASON_BUTTON1: + $('#tag' + tagmac + ' .nextcheckin').innerHTML = "Button 1 pressed" + $('#tag' + tagmac).style.background = "#c8f1bb"; + break; + case WAKEUP_REASON_BUTTON2: + $('#tag' + tagmac + ' .nextcheckin').innerHTML = "Button 2 pressed" + $('#tag' + tagmac).style.background = "#c8f1bb"; + break; case WAKEUP_REASON_NFC: $('#tag' + tagmac + ' .nextcheckin').innerHTML = "NFC wakeup" break; @@ -1063,7 +1073,6 @@ function dropUpload() { const contextMenu = $('#context-menu'); $('#taglist').addEventListener('contextmenu', (e) => { - console.log("contextmenu"); e.preventDefault(); const clickedGridItem = e.target.closest('.tagcard'); @@ -1095,7 +1104,10 @@ $('#taglist').addEventListener('contextmenu', (e) => { }); contextMenu.appendChild(li); }); - const contextMenuPosition = { left: e.clientX, top: e.clientY }; + const contextMenuPosition = { + left: e.clientX + window.scrollX, + top: e.clientY + window.scrollY + }; contextMenu.style.left = `${contextMenuPosition.left}px`; contextMenu.style.top = `${contextMenuPosition.top}px`; contextMenu.style.display = 'block'; diff --git a/tag_types.h b/tag_types.h index 16b2798d..636df12d 100755 --- a/tag_types.h +++ b/tag_types.h @@ -59,6 +59,8 @@ #define WAKEUP_REASON_TIMED 0 #define WAKEUP_REASON_GPIO 2 #define WAKEUP_REASON_NFC 3 +#define WAKEUP_REASON_BUTTON1 4 +#define WAKEUP_REASON_BUTTON2 5 #define WAKEUP_REASON_FIRSTBOOT 0xFC #define WAKEUP_REASON_NETWORK_SCAN 0xFD #define WAKEUP_REASON_WDT_RESET 0xFE From 714f7fffaec25654cda06b521b74c4196c177c55 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Wed, 30 Aug 2023 22:20:08 +0200 Subject: [PATCH 2/7] clean up - removed the custom printf function (inherited from the zbs code, but easier to just use the native printf) - led flash timer - proper HW_TYPE set, now reported as 0xC6 --- .../OpenEPaperLink_esp32_C6_AP/main/led.c | 62 ++++-- .../OpenEPaperLink_esp32_C6_AP/main/led.h | 4 +- .../OpenEPaperLink_esp32_C6_AP/main/main.c | 82 ++++---- .../OpenEPaperLink_esp32_C6_AP/main/radio.c | 48 ++--- .../OpenEPaperLink_esp32_C6_AP/main/radio.h | 4 +- .../main/second_uart.c | 188 +++--------------- .../main/second_uart.h | 9 +- tag_types.h | 1 + 8 files changed, 144 insertions(+), 254 deletions(-) diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c index 78a8dd71..fa3d7192 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c @@ -1,26 +1,48 @@ -#include -#include -#include -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/queue.h" -#include "driver/gpio.h" #include "led.h" +#include "driver/gpio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#include "freertos/task.h" +#include "freertos/timers.h" #include "proto.h" +#include +#include +#include +#include -void init_led() -{ - gpio_config_t led1 = {}; - led1.intr_type = GPIO_INTR_DISABLE; - led1.mode = GPIO_MODE_OUTPUT; - led1.pin_bit_mask = ((1ULL<= 0 && led_index < NUM_LEDS) { + gpio_set_level(led_pins[led_index], 0); + } } -void led_set(int nr, bool state) -{ - gpio_set_level(nr, state); +void init_led() { + gpio_config_t led1 = {}; + led1.intr_type = GPIO_INTR_DISABLE; + led1.mode = GPIO_MODE_OUTPUT; + led1.pin_bit_mask = ((1ULL << LED1) | (1ULL << LED2)); + led1.pull_down_en = 0; + led1.pull_up_en = 0; + gpio_config(&led1); + + for (int i = 0; i < NUM_LEDS; i++) { + led_timers[i] = xTimerCreate("led_timer", pdMS_TO_TICKS(100), pdFALSE, (void *)i, led_timer_callback); + } +} + +void led_flash(int nr) { + gpio_set_level(led_pins[nr], 1); + if (nr >= 0 && nr < NUM_LEDS) { + xTimerStart(led_timers[nr], 0); + } +} + +void led_set(int nr, bool state) { + gpio_set_level(nr, state); } \ No newline at end of file diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.h b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.h index 5b7e200a..a76467c7 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.h +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.h @@ -1,4 +1,6 @@ #pragma once +#include void init_led(); -void led_set(int nr, bool state); \ No newline at end of file +void led_set(int nr, bool state); +void led_flash(int nr); diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c index 8e7e67af..245e88a4 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c @@ -1,10 +1,6 @@ // Ported to ESP32-C6 By ATC1441(ATCnetz.de) for OpenEPaperLink at ~08.2023 #include "main.h" -#include -#include -#include -#include #include "driver/gpio.h" #include "driver/uart.h" #include "esp_err.h" @@ -16,21 +12,27 @@ #include "freertos/FreeRTOS.h" #include "freertos/queue.h" #include "freertos/task.h" +#include "led.h" #include "proto.h" #include "radio.h" #include "sdkconfig.h" #include "second_uart.h" -#include "soc/uart_struct.h" #include "soc/lp_uart_reg.h" +#include "soc/uart_struct.h" #include "utils.h" -#include "led.h" +#include +#include +#include +#include +#include +#include static const char *TAG = "MAIN"; const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27}; #define DATATYPE_NOUPDATE 0 -#define HW_TYPE 0xFF +#define HW_TYPE 0xC6 #define MAX_PENDING_MACS 250 #define HOUSEKEEPING_INTERVAL 60UL @@ -38,7 +40,7 @@ const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27}; struct pendingData pendingDataArr[MAX_PENDING_MACS]; // VERSION GOES HERE! -uint16_t version = 0x0017; +uint16_t version = 0x0018; #define RAW_PKT_PADDING 2 @@ -206,7 +208,7 @@ void processSerial(uint8_t lastchar) { cmdbuffer[3] = lastchar; if (isSame(cmdbuffer + 1, ">D>", 3)) { - pr("ACK>\n"); + pr("ACK>"); blockStartTime = getMillis(); ESP_LOGI(TAG, "Starting BlkData"); blockPosition = 0; @@ -252,8 +254,15 @@ void processSerial(uint8_t lastchar) { // TODO RESET US HERE RXState = ZBS_RX_WAIT_HEADER; } - break; - case ZBS_RX_WAIT_BLOCKDATA: + if (isSame(cmdbuffer, "HSPD", 4)) { + pr("ACK>"); + ESP_LOGI(TAG, "HSPD In, switching to 921000"); + delay(100); + uart_switch_speed(921000); + RXState = ZBS_RX_WAIT_HEADER; + } + break; + case ZBS_RX_WAIT_BLOCKDATA: blockbuffer[blockPosition++] = 0xAA ^ lastchar; if (blockPosition >= 4100) { ESP_LOGI(TAG, "Blockdata fully received %lu", getMillis() - blockStartTime); @@ -272,12 +281,12 @@ void processSerial(uint8_t lastchar) { if (slot == -1) slot = findFreeSlot(); if (slot != -1) { memcpy(&(pendingDataArr[slot]), serialbuffer, sizeof(struct pendingData)); - pr("ACK>\n"); + pr("ACK>"); } else { - pr("NOQ>\n"); + pr("NOQ>"); } } else { - pr("NOK>\n"); + pr("NOK>"); } RXState = ZBS_RX_WAIT_HEADER; @@ -290,11 +299,10 @@ void processSerial(uint8_t lastchar) { if (bytesRemain == 0) { if (checkCRC(serialbuffer, sizeof(struct pendingData))) { struct pendingData *pd = (struct pendingData *) serialbuffer; - // deleteAllPendingDataForVer((uint8_t *)&pd->availdatainfo.dataVer); deleteAllPendingDataForMac((uint8_t *) &pd->targetMac); - pr("ACK>\n"); + pr("ACK>"); } else { - pr("NOK>\n"); + pr("NOK>"); } RXState = ZBS_RX_WAIT_HEADER; @@ -316,10 +324,10 @@ void processSerial(uint8_t lastchar) { curPower = scp->power; radioSetChannel(scp->channel); radioSetTxPower(scp->power); - pr("ACK>\n"); + pr("ACK>"); } else { SCPfailed: - pr("NOK>\n"); + pr("NOK>"); } RXState = ZBS_RX_WAIT_HEADER; } @@ -381,17 +389,17 @@ void espNotifyTimeOut(const uint8_t *src) { } } void espNotifyAPInfo() { - pr("TYP>%02X\n", HW_TYPE); - pr("VER>%04X\n", version); + pr("TYP>%02X", HW_TYPE); + pr("VER>%04X", version); pr("MAC>%02X%02X", mSelfMac[0], mSelfMac[1]); pr("%02X%02X", mSelfMac[2], mSelfMac[3]); pr("%02X%02X", mSelfMac[4], mSelfMac[5]); - pr("%02X%02X\n", mSelfMac[6], mSelfMac[7]); - pr("ZCH>%02X\n", curChannel); - pr("ZPW>%02X\n", curPower); + pr("%02X%02X", mSelfMac[6], mSelfMac[7]); + pr("ZCH>%02X", curChannel); + pr("ZPW>%02X", curPower); countSlots(); - pr("PEN>%02X\n", curPendingData); - pr("NOP>%02X\n", curNoUpdate); + pr("PEN>%02X", curPendingData); + pr("NOP>%02X", curNoUpdate); } // process data from tag @@ -639,16 +647,16 @@ void app_main(void) { radioSetChannel(curChannel); radioSetTxPower(10); - pr("RES>\n"); - pr("RDY>\n"); + pr("RES>"); + pr("RDY>"); housekeepingTimer = getMillis(); while (1) { while ((getMillis() - housekeepingTimer) < ((1000 * HOUSEKEEPING_INTERVAL) - 100)) { int8_t ret = commsRxUnencrypted(radiorxbuffer); if (ret > 1) { - led_set(LED1, 1); - // received a packet, lets see what it is + led_flash(0); + // received a packet, lets see what it is switch (getPacketType(radiorxbuffer)) { case PKT_AVAIL_DATA_REQ: if (ret == 28) { @@ -683,23 +691,25 @@ void app_main(void) { } break; default: - pr("t=%02X\n", getPacketType(radiorxbuffer)); + ESP_LOGI(TAG, "t=%02X" , getPacketType(radiorxbuffer)); break; - } - led_set(LED1, 0); + } + } else if (blockStartTimer == 0) { + vTaskDelay(10 / portTICK_PERIOD_MS); } + uint8_t curr_char; while (getRxCharSecond(&curr_char)) processSerial(curr_char); if (blockStartTimer) { - // BUG: uint32 overflowing; this will break every once in a while. Don't know how to fix this other than ugly global variables if (getMillis() > blockStartTimer) { sendBlockData(); blockStartTimer = 0; } } - } - for (uint8_t cCount = 0; cCount < MAX_PENDING_MACS; cCount++) { + } + + for (uint8_t cCount = 0; cCount < MAX_PENDING_MACS; cCount++) { if (pendingDataArr[cCount].attemptsLeft == 1) { if (pendingDataArr[cCount].availdatainfo.dataType != DATATYPE_NOUPDATE) { espNotifyTimeOut(pendingDataArr[cCount].targetMac); diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c index 4a9027cf..51d1334b 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c @@ -1,7 +1,4 @@ -#include -#include -#include -#include +#include "radio.h" #include "driver/gpio.h" #include "driver/uart.h" #include "esp_err.h" @@ -13,28 +10,31 @@ #include "freertos/FreeRTOS.h" #include "freertos/queue.h" #include "freertos/task.h" +#include "led.h" #include "main.h" #include "proto.h" #include "sdkconfig.h" -#include "soc/uart_struct.h" #include "soc/lp_uart_reg.h" -#include "radio.h" +#include "soc/uart_struct.h" #include "utils.h" -#include "led.h" +#include +#include +#include +#include static const char *TAG = "RADIO"; uint8_t mSelfMac[8]; volatile uint8_t isInTransmit = 0; -QueueHandle_t packet_bufer = NULL; +QueueHandle_t packet_buffer = NULL; void esp_ieee802154_receive_done(uint8_t *frame, esp_ieee802154_frame_info_t *frame_info) { ESP_EARLY_LOGI(TAG, "RX <- : %d", frame[0]); - BaseType_t xHigherPriorityTaskWoken ; - static uint8_t inner_rxPKT[130]; + BaseType_t xHigherPriorityTaskWoken; + static uint8_t inner_rxPKT[130]; memcpy(inner_rxPKT, &frame[0], frame[0] + 1); - xQueueSendFromISR(packet_bufer, (void *) &inner_rxPKT, &xHigherPriorityTaskWoken ); - portYIELD_FROM_ISR_ARG(xHigherPriorityTaskWoken ); + xQueueSendFromISR(packet_buffer, (void *)&inner_rxPKT, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR_ARG(xHigherPriorityTaskWoken); } void esp_ieee802154_transmit_failed(const uint8_t *frame, esp_ieee802154_tx_error_t error) { @@ -43,13 +43,12 @@ void esp_ieee802154_transmit_failed(const uint8_t *frame, esp_ieee802154_tx_erro } void esp_ieee802154_transmit_done(const uint8_t *frame, const uint8_t *ack, esp_ieee802154_frame_info_t *ack_frame_info) { - isInTransmit = 0; + isInTransmit = 0; ESP_EARLY_LOGI(TAG, "TX -> : %d", frame[0]); } -void radio_init() -{ - packet_bufer = xQueueCreate(32, 130); +void radio_init() { + packet_buffer = xQueueCreate(32, 130); esp_ieee802154_enable(); radioSetChannel(11); esp_ieee802154_set_panid(PROTO_PAN_ID); @@ -64,19 +63,17 @@ void radio_init() } uint32_t lastZbTx = 0; -bool radioTx(uint8_t *packet) -{ - static uint8_t txPKT[130]; - led_set(LED2, 1); +bool radioTx(uint8_t *packet) { + static uint8_t txPKT[130]; + led_flash(1); while (isInTransmit) { } while (getMillis() - lastZbTx < 6) { } memcpy(txPKT, packet, packet[0]); isInTransmit = 1; - lastZbTx = getMillis(); + lastZbTx = getMillis(); esp_ieee802154_transmit(txPKT, false); - led_set(LED2, 0); return true; } @@ -85,11 +82,10 @@ void radioSetChannel(uint8_t ch) { esp_ieee802154_set_channel(ch); } void radioSetTxPower(uint8_t power) {} int8_t commsRxUnencrypted(uint8_t *data) { - static uint8_t inner_rxPKT_out[130]; - if (xQueueReceive(packet_bufer, (void *) &inner_rxPKT_out, pdMS_TO_TICKS(100)) == pdTRUE) { - memcpy(data, &inner_rxPKT_out[1], inner_rxPKT_out[0] + 1); + static uint8_t inner_rxPKT_out[130]; + if (xQueueReceive(packet_buffer, (void *)&inner_rxPKT_out, pdMS_TO_TICKS(100)) == pdTRUE) { + memcpy(data, &inner_rxPKT_out[1], inner_rxPKT_out[0] + 1); return inner_rxPKT_out[0] - 2; } return 0; } - diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.h b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.h index d54d49db..2f50c751 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.h +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.h @@ -1,9 +1,11 @@ #pragma once +#include +#include extern uint8_t mSelfMac[8]; void radio_init(); -bool radioTx(uint8_t *packet); +bool radioTx(uint8_t *packet); void radioSetChannel(uint8_t ch); void radioSetTxPower(uint8_t power); int8_t commsRxUnencrypted(uint8_t *data); \ No newline at end of file diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.c index d9023772..0fa4ee75 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.c @@ -51,6 +51,21 @@ void init_second_uart() { xTaskCreate(uart_event_task, "uart_event_task", 16384, NULL, 12, NULL); } +void uart_switch_speed(int baudrate) { + ESP_ERROR_CHECK(uart_driver_delete(1)); + uart_config_t uart_config = { + .baud_rate = baudrate, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_DEFAULT, + }; + ESP_ERROR_CHECK(uart_driver_install(1, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0)); + ESP_ERROR_CHECK(uart_param_config(1, &uart_config)); + ESP_ERROR_CHECK(uart_set_pin(1, 3, 2, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); +} + void uartTx(uint8_t data) { uart_write_bytes(1, (const char *) &data, 1); } @@ -90,171 +105,16 @@ static void uart_event_task(void *pvParameters) { vTaskDelete(NULL); } -static void printchar(char **str, int c) { - if (str) { - **str = c; - ++(*str); - } else { - uart_write_bytes(1, (const char *) &c, 1); - } -} +void uart_printf(const char *format, ...) { + va_list args; + va_start(args, format); -#define PAD_RIGHT 1 -#define PAD_ZERO 2 + char buffer[128]; + int len = vsnprintf(buffer, sizeof(buffer), format, args); -static int prints(char **out, const char *string, int width, int pad) { - register int pc = 0, padchar = ' '; + va_end(args); - if (width > 0) { - register int len = 0; - register const char *ptr; - for (ptr = string; *ptr; ++ptr) ++len; - if (len >= width) - width = 0; - else - width -= len; - if (pad & PAD_ZERO) padchar = '0'; - } - if (!(pad & PAD_RIGHT)) { - for (; width > 0; --width) { - printchar(out, padchar); - ++pc; - } - } - for (; *string; ++string) { - printchar(out, *string); - ++pc; - } - for (; width > 0; --width) { - printchar(out, padchar); - ++pc; - } - - return pc; -} - -/* the following should be enough for 32 bit int */ -#define PRINT_BUF_LEN 12 - -static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) { - char print_buf[PRINT_BUF_LEN]; - register char *s; - register int t, neg = 0, pc = 0; - register unsigned int u = i; - - if (i == 0) { - print_buf[0] = '0'; - print_buf[1] = '\0'; - return prints(out, print_buf, width, pad); - } - - if (sg && b == 10 && i < 0) { - neg = 1; - u = -i; - } - - s = print_buf + PRINT_BUF_LEN - 1; - *s = '\0'; - - while (u) { - t = u % b; - if (t >= 10) t += letbase - '0' - 10; - *--s = t + '0'; - u /= b; - } - - if (neg) { - if (width && (pad & PAD_ZERO)) { - printchar(out, '-'); - ++pc; - --width; - } else { - *--s = '-'; - } - } - - return pc + prints(out, s, width, pad); -} - -static int print(char **out, const char *format, va_list args) { - register int width, pad; - register int pc = 0; - char scr[2]; - - for (; *format != 0; ++format) { - if (*format == '%') { - ++format; - width = pad = 0; - if (*format == '\0') break; - if (*format == '%') goto out; - if (*format == '-') { - ++format; - pad = PAD_RIGHT; - } - while (*format == '0') { - ++format; - pad |= PAD_ZERO; - } - for (; *format >= '0' && *format <= '9'; ++format) { - width *= 10; - width += *format - '0'; - } - if (*format == 's') { - register char *s = (char *) va_arg(args, int); - pc += prints(out, s ? s : "(null)", width, pad); - continue; - } - if (*format == 'd') { - pc += printi(out, va_arg(args, int), 10, 1, width, pad, 'a'); - continue; - } - if (*format == 'x') { - pc += printi(out, va_arg(args, int), 16, 0, width, pad, 'a'); - continue; - } - if (*format == 'X') { - pc += printi(out, va_arg(args, int), 16, 0, width, pad, 'A'); - continue; - } - if (*format == 'u') { - pc += printi(out, va_arg(args, int), 10, 0, width, pad, 'a'); - continue; - } - if (*format == 'c') { - /* char are converted to int then pushed on the stack */ - scr[0] = (char) va_arg(args, int); - scr[1] = '\0'; - pc += prints(out, scr, width, pad); - continue; - } - } else { - out: - printchar(out, *format); - ++pc; - } - } - if (out) **out = '\0'; - va_end(args); - return pc; -} - -int u_printf(const char *format, ...) { - va_list args; - va_start(args, format); - print(0, format, args); - return 0; -} - -int u_sprintf(char *out, const char *format, ...) { - va_list args; - va_start(args, format); - return print(&out, format, args); -} - -void u_array_printf(unsigned char *data, unsigned int len) { - u_printf("{"); - for (int i = 0; i < len; ++i) { - u_printf("%X%s", data[i], i < (len) -1 ? ":" : " "); - } - u_printf("}\n"); + if (len > 0) { + uart_write_bytes(1, buffer, len); + } } \ No newline at end of file diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.h b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.h index 3eafd1c0..b25d4333 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.h +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/second_uart.h @@ -1,14 +1,11 @@ #pragma once void init_second_uart(); +void uart_switch_speed(int baudrate); void uartTx(uint8_t data); bool getRxCharSecond(uint8_t *newChar); -int u_printf(const char *fmt, ...); -int u_sprintf(char *s, const char *fmt, ...); -void u_array_printf(unsigned char *data, unsigned int len); +void uart_printf(const char *format, ...); -#define pr u_printf -#define sprf u_sprintf -#define array_prf u_array_printf +#define pr uart_printf diff --git a/tag_types.h b/tag_types.h index 636df12d..7b79349d 100755 --- a/tag_types.h +++ b/tag_types.h @@ -5,6 +5,7 @@ #define SOLUM_SEG_UK 0xF0 #define SOLUM_SEG_EU 0xF1 #define SOLUM_NODISPLAY 0xFF +#define ESP32_C6 0xC6 #define SOLUM_M2_BWR_16 0x20 #define SOLUM_M2_BWR_29 0x23 From ab83cb03cca39617fb541d220960caa059429f6d Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Thu, 31 Aug 2023 02:13:45 +0200 Subject: [PATCH 3/7] improvements for yellow ap / esp32-c6 - Wifi connection progress is now visible on the TFT - passthrough serial logging from the C6 to the S3 terminal for easier debugging - no checks on force_flash and APtag-firmware version when C6 is used --- .../OpenEPaperLink_esp32_C6_AP/main/led.c | 2 +- .../OpenEPaperLink_esp32_C6_AP/main/main.c | 3 +- .../OpenEPaperLink_esp32_C6_AP/main/radio.c | 2 +- ESP32_AP-Flasher/data/tagtypes/E0.json | 20 +- ESP32_AP-Flasher/data/www/index.html.gz | Bin 3512 -> 3515 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 9268 -> 9309 bytes ESP32_AP-Flasher/include/ips_display.h | 12 ++ ESP32_AP-Flasher/include/wifimanager.h | 1 + ESP32_AP-Flasher/platformio.ini | 8 +- ESP32_AP-Flasher/src/ips_display.cpp | 78 +++++-- ESP32_AP-Flasher/src/leds.cpp | 9 +- ESP32_AP-Flasher/src/makeimage.cpp | 3 +- ESP32_AP-Flasher/src/serialap.cpp | 198 +++++++++++------- ESP32_AP-Flasher/src/web.cpp | 2 +- ESP32_AP-Flasher/src/wifimanager.cpp | 46 ++-- ESP32_AP-Flasher/wwwroot/index.html | 1 + 16 files changed, 257 insertions(+), 128 deletions(-) create mode 100644 ESP32_AP-Flasher/include/ips_display.h diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c index fa3d7192..87469298 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/led.c @@ -32,7 +32,7 @@ void init_led() { gpio_config(&led1); for (int i = 0; i < NUM_LEDS; i++) { - led_timers[i] = xTimerCreate("led_timer", pdMS_TO_TICKS(100), pdFALSE, (void *)i, led_timer_callback); + led_timers[i] = xTimerCreate("led_timer", pdMS_TO_TICKS(50), pdFALSE, (void *)i, led_timer_callback); } } diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c index 245e88a4..6f7fad6b 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c @@ -324,7 +324,8 @@ void processSerial(uint8_t lastchar) { curPower = scp->power; radioSetChannel(scp->channel); radioSetTxPower(scp->power); - pr("ACK>"); + ESP_LOGI(TAG, "Set channel: %d power: %d", curChannel, curPower); + pr("ACK>"); } else { SCPfailed: pr("NOK>"); diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c index 51d1334b..66ad3db8 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c @@ -65,11 +65,11 @@ void radio_init() { uint32_t lastZbTx = 0; bool radioTx(uint8_t *packet) { static uint8_t txPKT[130]; - led_flash(1); while (isInTransmit) { } while (getMillis() - lastZbTx < 6) { } + led_flash(1); memcpy(txPKT, packet, packet[0]); isInTransmit = 1; lastZbTx = getMillis(); diff --git a/ESP32_AP-Flasher/data/tagtypes/E0.json b/ESP32_AP-Flasher/data/tagtypes/E0.json index 99e04246..d9481fff 100644 --- a/ESP32_AP-Flasher/data/tagtypes/E0.json +++ b/ESP32_AP-Flasher/data/tagtypes/E0.json @@ -1,7 +1,7 @@ { - "name": "TFT 320x170", + "name": "TFT 320x172", "width": 320, - "height": 170, + "height": 172, "rotatebuffer": 0, "bpp": 16, "colors": 4, @@ -16,14 +16,14 @@ "usetemplate": 1, "template": { "21": [ - { "box": [ 0, 0, 320, 170, 1 ] }, - { "text": [ 5, 5, "OpenEpaperLink AP", "calibrib30", 2, 0, 0, 1 ] }, - { "text": [ 5, 60, "IP address:", "bahnschrift20", "#888888", 0, 0, 1 ] }, - { "text": [ 120, 60, "{ap_ip}", "bahnschrift20", 0, 0, 0, 1 ] }, - { "text": [ 5, 85, "Channel:", "bahnschrift20", "#888888", 0, 0, 1 ] }, - { "text": [ 120, 85, "{ap_ch}", "bahnschrift20", 0, 0, 0, "1" ] }, - { "text": [ 5, 110, "Tag count:", "bahnschrift20", "#888888", 0, 0, 1 ] }, - { "text": [ 120, 110, "{ap_tagcount}", "bahnschrift20", 0, 0, 0, "1" ] } + { "box": [ 0, 0, 320, 172, 1 ] }, + { "text": [ 10, 15, "OpenEpaperLink AP", "calibrib30", 2, 0, 0, 1 ] }, + { "text": [ 10, 70, "IP address:", "bahnschrift20", "#888888", 0, 0, 1 ] }, + { "text": [ 120, 70, "{ap_ip}", "bahnschrift20", 0, 0, 0, 1 ] }, + { "text": [ 10, 95, "Channel:", "bahnschrift20", "#888888", 0, 0, 1 ] }, + { "text": [ 120, 95, "{ap_ch}", "bahnschrift20", 0, 0, 0, "1" ] }, + { "text": [ 10, 120, "Tag count:", "bahnschrift20", "#888888", 0, 0, 1 ] }, + { "text": [ 120, 120, "{ap_tagcount}", "bahnschrift20", 0, 0, 0, "1" ] } ] } } diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index fe0ebc5f6cf1785f5b083e5c89abc0b6573672f1..de5a77f980fa2537582e78ec5229bf31c1227465 100644 GIT binary patch delta 2445 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 LC3)D9F8~1m<=(&K delta 2423 zcmV--35fQ)8@L;=Km>p7vpC#W+W1e2>YK;8@3RS9kDtR46E8r>48B!PM$N@nl4mpybz5-I%2P8vu< z)+Mot5(+dVCnVh!R1ijx9TDU@lfIOiUcC$>DB)Cc*Zj|HpRagW(;ZDP@TyCCk*PD;u@2+d*3Z+N$qH z_E3>UlPKZOTKa!?BemE}&l$-`ul}5Pf=W_BLB#$m?J_{L=Xmec%WI=SG^b&RJXl#C zB`iQjNf8+7hP8@0nW=)`R73-pdjJO5Ymjbc>#-LHmst{%92BFp%<%~Ez#IO zMzL5LyF^R{O>h;^g03b&gWxnmX;X{2hc3naLP!D%i?L5O8zHcB+$K0?%V&N+pV;Ie+2nr#1&bJFIc^_qK`U5Y|e2bPNIIWbXh47t`(YIy%&l z^&KFgG-w>}Li12@KiY++4txi@Kpuc$Hd?zt?khPPyFj+~a~81E%%Jdbcbb^0Ja?KG z5Nxi4D{;avkSkCa`8d?k1^pAT4Q```&FFOze4BkOk(NS_Az8#o@_gy}_{BtlYHrKoPZi^R!-v|0*|)y6I?{j@%M-Ax?1+(GZ7FHUu$N)VIp22dtVs z#j2IDYOS)`x2)U_L?|XI=q)G2FC+c-X85}P4k$M=%8gaZ&6M(G;)Rq|&^t~-9cF)_ z)K?@Fls(W2dPCU`)PFw%_4?=Dj*?$f;YA>MAF_G^+r(Y8a}v#TzHs~at&8cPFwY^ z61@%|J4oLNAb+$#iMbhj{_VEDRq@$nL-uI&VhvC2(T{V1!)|IiS;3P-4qldw$N_rvb%mWoPa5Q8#Y zZqlz0m(j>dS~BPDCr3M-9_zCqbAG&zNC)a9*uP+NZX2s}TXA~samzxgdsRzEe`nQ{ z{!#DAsnc@2JYJ=mP)7CY6hX|+$C6%~6reKb>hhpZPqQ-Nw)iuL-)j>OG1N_tmk zTBy@6>>IJYk*#^ye@NoL1JCFyh~_MeaBz8%;-@`o&v$uoUc;;G%&s>DH?8%&1d&PX z03k3M*>-Hxo~^4rWJ=^SeM7U;2)ur}DOGhbFMm#JwK0{G#M|?uY31hGe5+AV5om?s`a1$U=O4KvxR1?Q92OHV!aP`B5TxV@77N2*>s=|d z)BQp^1eGfw6KkqV+#Ey{hHA<0wBKd-toCH^l<6Hq{*o(2xKK0tXdCJ{K<~_>M8M{s zPk-lF#YB4(l#_XRBfr#Q5~jED>JFniB`k3i@QNr%$#MohDX0?l6k$(9VIrYVi7?g& zU#Dn3p}H&L0pX{p5kDdTqX8Ooya03@sFT%GR6j!@6|$^!kp}+-Z0!w)B4?Rr4_XS$H$8Lt3D)XHzUrIH(3H1r zt?*8JS8h&=Hu%IK3qlFlkw4cSgnxb+W~H@vzFJKCz1Aq!T_XQDSM|=x@YFA!3Y>J$ z4fcPYi(UzEPALen(T!)#BGYB}HGCnFJ6-=t{tR-EO}5ta^u>D7<8;?8{6%Sb^L$e< zF{Dgdy|^lCSb+^zCbB*+OjV`7SM+51A_iGSfA6ZL629tTOQs>)C~{6aHGgZ<_(i;7 zbD{I2<(@T*{FmKYg0%UIWJn)284U7hgAXN zNa~eyt3i^5YH|^=B+dSv4+4tP~k+*qL|3B-MG-Yfr008H6m!$vz diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index bc598e22a13702bff415868c4b31bae963caef2d..d2a05bc095e20f5559c67f02b2e8e92c8ac163b3 100644 GIT binary patch literal 9309 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 LqU1Ck50C%=|9mn` literal 9268 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 W^ppBXbK|kN<^KXGje#|FjsO7Z{otMe diff --git a/ESP32_AP-Flasher/include/ips_display.h b/ESP32_AP-Flasher/include/ips_display.h new file mode 100644 index 00000000..eb86a2fe --- /dev/null +++ b/ESP32_AP-Flasher/include/ips_display.h @@ -0,0 +1,12 @@ +#include +#include + +#ifdef YELLOW_IPS_AP + +extern TFT_eSPI tft2; +extern int32_t tftid; +extern uint8_t YellowSense; + +void TFTLog(String text); + +#endif diff --git a/ESP32_AP-Flasher/include/wifimanager.h b/ESP32_AP-Flasher/include/wifimanager.h index ae4294ac..35e47536 100644 --- a/ESP32_AP-Flasher/include/wifimanager.h +++ b/ESP32_AP-Flasher/include/wifimanager.h @@ -40,6 +40,7 @@ class WifiManager { bool waitForConnection(); void pollSerial(); + static void terminalLog(String text); public: WifiManager(); diff --git a/ESP32_AP-Flasher/platformio.ini b/ESP32_AP-Flasher/platformio.ini index 71a16e4f..fb1832c2 100644 --- a/ESP32_AP-Flasher/platformio.ini +++ b/ESP32_AP-Flasher/platformio.ini @@ -280,9 +280,13 @@ build_flags = -D FLASHER_AP_TEST=-1 -D FLASHER_AP_TXD=17 -D FLASHER_AP_RXD=18 - -D FLASHER_LED=14 + -D FLASHER_DEBUG_TXD=19 + -D FLASHER_DEBUG_RXD=20 + -D FLASHER_LED=16 + -D HAS_RGB_LED + -D FLASHER_RGB_LED=48 -D ST7789_DRIVER - -D TFT_WIDTH=170 + -D TFT_WIDTH=172 -D TFT_HEIGHT=320 -D TFT_MISO=-1 -D TFT_MOSI=13 diff --git a/ESP32_AP-Flasher/src/ips_display.cpp b/ESP32_AP-Flasher/src/ips_display.cpp index 4478c9bc..4bbc7dc5 100644 --- a/ESP32_AP-Flasher/src/ips_display.cpp +++ b/ESP32_AP-Flasher/src/ips_display.cpp @@ -1,7 +1,5 @@ -#ifdef YELLOW_IPS_AP #include #include -#include #include #include "commstructs.h" @@ -9,11 +7,45 @@ #include "storage.h" #include "tag_db.h" +#ifdef YELLOW_IPS_AP + +#include "ips_display.h" + +#define YELLOW_SENSE 8 // sense AP hardware +#define TFT_BACKLIGHT 14 + TFT_eSPI tft2 = TFT_eSPI(); -bool first_run = 0; -time_t last_update = 0; -time_t last_checkin = 0; int32_t tftid = -1; +uint8_t YellowSense = 0; +bool tftLogscreen = true; + +void TFTLog(String text) { + if (tftLogscreen == false) { + tft2.fillScreen(TFT_BLACK); + tft2.setCursor(0, 5, 2); + tftLogscreen = true; + } + if (text.isEmpty()) return; + tft2.setTextColor(TFT_SILVER); + if (text.startsWith("!")) { + tft2.setTextColor(TFT_RED); + text = text.substring(1); + } else if (text.indexOf("http") != -1) { + int httpIndex = text.indexOf("http"); + tft2.print(text.substring(0, httpIndex)); + tft2.setTextColor(TFT_YELLOW); + 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); + text = text.substring(colonIndex + 1); + } else if (text.endsWith("!")) { + tft2.setTextColor(TFT_GREEN); + } + tft2.println(text); +} int32_t findId(uint8_t mac[8]) { for (uint32_t c = 0; c < tagDB.size(); c++) { @@ -42,28 +74,43 @@ void sendAvail(uint8_t wakeupReason) { } 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, 255); // config.led + tft2.init(); - tft2.setRotation(3); + tft2.setRotation(YellowSense == 1 ? 1 : 3); tft2.fillScreen(TFT_BLACK); - tft2.setCursor(0, 0, 2); + tft2.setCursor(10, 5, 2); tft2.setTextColor(TFT_WHITE); - tft2.println(" Init\n"); + tft2.println("*** Initialising... ***"); + tftLogscreen = true; } void yellow_ap_display_loop(void) { + static bool first_run = 0; + static time_t last_checkin = 0; + static time_t last_update = 0; + if (millis() - last_checkin >= 60000) { sendAvail(0); last_checkin = millis(); + tftLogscreen = false; + } + if (first_run == 0) { + sendAvail(0xFC); + first_run = 1; } if (millis() - last_update >= 1000) { - if (first_run == 0) { - sendAvail(0xFC); - first_run = 1; - } - - // if ((uint32_t)WiFi.localIP() == (uint32_t)0) {} - tagRecord* tag = tagDB.at(tftid); if (tag->pending) { String filename = tag->filename; @@ -82,6 +129,7 @@ void yellow_ap_display_loop(void) { size_t bytesRead = file.readBytes((char*)spriteData, spr.width() * spr.height() * 2); file.close(); spr.pushSprite(0, 0); + tftLogscreen = false; struct espXferComplete xfc = {0}; memcpy(xfc.src, tag->mac, 8); diff --git a/ESP32_AP-Flasher/src/leds.cpp b/ESP32_AP-Flasher/src/leds.cpp index 77183142..a68b189f 100644 --- a/ESP32_AP-Flasher/src/leds.cpp +++ b/ESP32_AP-Flasher/src/leds.cpp @@ -149,6 +149,9 @@ void rgbIdleStep() { void setBrightness(int brightness) { maxledbrightness = brightness; +#ifdef YELLOW_IPS_AP + // ledcWrite(6, config.led); +#endif #ifdef HAS_RGB_LED FastLED.setBrightness(maxledbrightness); #endif @@ -180,10 +183,10 @@ void addFadeMono(uint8_t value) { } void showMono(uint8_t brightness) { -#ifdef CONFIG_IDF_TARGET_ESP32S2 - ledcWrite(7, gamma8[brightness]); -#else +#ifdef CONFIG_IDF_TARGET_ESP32 ledcWrite(7, 255 - gamma8[brightness]); +#else + ledcWrite(7, gamma8[brightness]); #endif } diff --git a/ESP32_AP-Flasher/src/makeimage.cpp b/ESP32_AP-Flasher/src/makeimage.cpp index ea891d05..35c0bd2d 100644 --- a/ESP32_AP-Flasher/src/makeimage.cpp +++ b/ESP32_AP-Flasher/src/makeimage.cpp @@ -209,8 +209,9 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) { Storage.begin(); #ifdef YELLOW_IPS_AP + extern uint8_t YellowSense; if (fileout == "direct") { - tft.setRotation(3); + tft.setRotation(YellowSense == 1 ? 1 : 3); spr.pushSprite(0, 0); return; } diff --git a/ESP32_AP-Flasher/src/serialap.cpp b/ESP32_AP-Flasher/src/serialap.cpp index de8a2e4a..5be43b3f 100644 --- a/ESP32_AP-Flasher/src/serialap.cpp +++ b/ESP32_AP-Flasher/src/serialap.cpp @@ -88,7 +88,7 @@ void txEnd() { } bool waitCmdReply() { uint32_t val = millis(); - while (millis() < val + 100) { + while (millis() < val + 200) { switch (cmdReplyValue) { case CMD_REPLY_WAIT: break; @@ -135,6 +135,7 @@ void APEnterEarlyReset() { // Reset the tag void APTagReset() { + Serial.println("Resetting tag"); uint8_t powerPins = sizeof(APpowerPins); if (powerPins > 0 && APpowerPins[0] == -1) powerPins = 0; @@ -250,6 +251,8 @@ bool sendChannelPower(struct espSetChannelPower* scp) { } if (waitCmdReply()) { txEnd(); + apInfo.channel = scp->channel; + apInfo.power = scp->power; return true; } Serial.printf("SCP send failed in try %d\n", attempt); @@ -259,10 +262,27 @@ bool sendChannelPower(struct espSetChannelPower* scp) { return false; } bool sendPing() { + Serial.print("ping"); + int t = millis(); if (!txStart()) return false; for (uint8_t attempt = 0; attempt < 5; attempt++) { cmdReplyValue = CMD_REPLY_WAIT; AP_SERIAL_PORT.print("RDY?"); + if (waitCmdReply()) { + txEnd(); + Serial.printf(" ok, %dms\n", millis() - t); + return true; + } + } + txEnd(); + Serial.println(" failed"); + return false; +} +bool sendGetInfo() { + if (!txStart()) return false; + for (uint8_t attempt = 0; attempt < 5; attempt++) { + cmdReplyValue = CMD_REPLY_WAIT; + AP_SERIAL_PORT.print("NFO?"); if (waitCmdReply()) { txEnd(); return true; @@ -271,11 +291,11 @@ bool sendPing() { txEnd(); return false; } -bool sendGetInfo() { +bool sendHighspeed() { if (!txStart()) return false; for (uint8_t attempt = 0; attempt < 5; attempt++) { cmdReplyValue = CMD_REPLY_WAIT; - AP_SERIAL_PORT.print("NFO?"); + AP_SERIAL_PORT.print("HSPD"); if (waitCmdReply()) { txEnd(); return true; @@ -312,17 +332,15 @@ void rxCmdProcessor(void* parameter) { processBlockRequest((struct espBlockRequest*)rxcmd->data); #ifdef HAS_RGB_LED shortBlink(CRGB::Blue); -#else - quickBlink(3); #endif + quickBlink(3); break; case RX_CMD_ADR: processDataReq((struct espAvailDataReq*)rxcmd->data, true); #ifdef HAS_RGB_LED shortBlink(CRGB::Aqua); -#else - quickBlink(1); #endif + quickBlink(1); break; case RX_CMD_XFC: processXferComplete((struct espXferComplete*)rxcmd->data, true); @@ -336,6 +354,7 @@ void rxCmdProcessor(void* parameter) { case RX_CMD_RSET: Serial.println("AP did reset, resending pending\n"); refreshAllPending(); + sendChannelPower(&curChannel); break; } if (rxcmd->data) free(rxcmd->data); @@ -357,7 +376,7 @@ void rxSerialTask(void* parameter) { lastchar = AP_SERIAL_PORT.read(); switch (RXState) { case ZBS_RX_WAIT_HEADER: - // Serial.write(lastchar); + Serial.write(lastchar); // shift characters in for (uint8_t c = 0; c < 3; c++) { cmdbuffer[c] = cmdbuffer[c + 1]; @@ -413,6 +432,7 @@ void rxSerialTask(void* parameter) { pktindex = 0; packetp = (uint8_t*)calloc(sizeof(struct espBlockRequest) + 8, 1); memset(cmdbuffer, 0x00, 4); + lastAPActivity = millis(); } if (strncmp(cmdbuffer, "ADR>", 4) == 0) { RXState = ZBS_RX_WAIT_DATA_REQ; @@ -420,6 +440,7 @@ void rxSerialTask(void* parameter) { pktindex = 0; packetp = (uint8_t*)calloc(sizeof(struct espAvailDataReq) + 8, 1); memset(cmdbuffer, 0x00, 4); + lastAPActivity = millis(); } if (strncmp(cmdbuffer, "XFC>", 4) == 0) { RXState = ZBS_RX_WAIT_XFERCOMPLETE; @@ -536,21 +557,26 @@ void rxSerialTask(void* parameter) { } // end of while(1) } +#ifdef FLASHER_DEBUG_RXD +void rxSerialTask2(void* parameter) { + char lastchar = 0; + Serial2.begin(115200, SERIAL_8N1, FLASHER_DEBUG_TXD, FLASHER_DEBUG_RXD); + while (1) { + while (Serial2.available()) { + lastchar = Serial2.read(); + Serial.write(lastchar); + } + vTaskDelay(1 / portTICK_PERIOD_MS); + } +} +#endif + void ShowAPInfo() { - Serial.printf("| AP Info - type %02X |\n", apInfo.type); + Serial.printf("\n| AP Info - type %02X |\n", apInfo.type); Serial.printf("| Ch | 0x%02X |\n", apInfo.channel); Serial.printf("| Power| %02X |\n", apInfo.power); Serial.printf("| MAC | %02X%02X%02X%02X%02X%02X%02X%02X |\n", apInfo.mac[7], apInfo.mac[6], apInfo.mac[5], apInfo.mac[4], apInfo.mac[3], apInfo.mac[2], apInfo.mac[1], apInfo.mac[0]); Serial.printf("| Ver | 0x%04X |\n", apInfo.version); - - /*if (apInfo.type == SOLUM_154_SSD1619 || apInfo.type == SOLUM_29_SSD1619 || apInfo.type == SOLUM_29_UC8151 || apInfo.type == 0xE0) { - tagRecord* taginfo = nullptr; - taginfo = tagRecord::findByMAC(apInfo.mac); - if (taginfo != nullptr) { - taginfo->contentMode = 21; - taginfo->nextupdate = 0; - } - }*/ } void notifySegmentedFlash() { @@ -595,14 +621,23 @@ void segmentedShowIp() { bool bringAPOnline() { apInfo.isOnline = false; apInfo.state = AP_STATE_OFFLINE; - APTagReset(); - vTaskDelay(500 / portTICK_PERIOD_MS); + // try without rebooting uint32_t bootTimeout = millis(); bool APrdy = false; - while ((!APrdy) && (millis() - bootTimeout < 10 * 1000)) { + while ((!APrdy) && (millis() - bootTimeout < 3 * 1000)) { APrdy = sendPing(); vTaskDelay(300 / portTICK_PERIOD_MS); } + if (!APrdy) { + APTagReset(); + vTaskDelay(500 / portTICK_PERIOD_MS); + bootTimeout = millis(); + APrdy = false; + while ((!APrdy) && (millis() - bootTimeout < 10 * 1000)) { + APrdy = sendPing(); + vTaskDelay(300 / portTICK_PERIOD_MS); + } + } if (!APrdy) { return false; } else { @@ -613,6 +648,16 @@ bool bringAPOnline() { apInfo.state = AP_STATE_OFFLINE; return false; } + /* // work in progress + if (apInfo.type == ESP32_C6) { + if (sendHighspeed()) { + AP_SERIAL_PORT.flush(); + vTaskDelay(10 / portTICK_PERIOD_MS); + AP_SERIAL_PORT.updateBaudRate(921000); + Serial.println("switched to 921000 baud"); + } + } + */ vTaskDelay(200 / portTICK_PERIOD_MS); apInfo.isOnline = true; apInfo.state = AP_STATE_ONLINE; @@ -623,6 +668,9 @@ bool bringAPOnline() { 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 (AP_PROCESS_PORT == FLASHER_AP_PORT) AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); @@ -638,7 +686,7 @@ void APTask(void* parameter) { bringAPOnline(); - if (checkForcedAPFlash()) { + if (checkForcedAPFlash() && FLASHER_AP_MOSI != -1) { if (apInfo.type == SOLUM_SEG_UK && apInfo.isOnline) { notifySegmentedFlash(); } @@ -666,7 +714,7 @@ void APTask(void* parameter) { uint16_t fsversion; fsversion = getAPUpdateVersion(apInfo.type); - if ((fsversion) && (apInfo.version != fsversion)) { + if ((fsversion) && (apInfo.version != fsversion) && (FLASHER_AP_MOSI != -1)) { Serial.printf("Firmware version on LittleFS: %04X\n", fsversion); Serial.printf("We're going to try to update the AP's FW in\n"); @@ -708,72 +756,74 @@ void APTask(void* parameter) { // AP unavailable, maybe time to flash? apInfo.isOnline = false; apInfo.state = AP_STATE_OFFLINE; - Serial.println("I wasn't able to connect to a ZBS (AP) tag.\n"); - Serial.printf("This could be the first time this AP is booted and the AP-tag may be unflashed. We'll try to flash it!\n"); + Serial.printf("I wasn't able to connect to a ZBS (AP) tag.\n"); + Serial.printf("This could be the first time this AP is booted and the AP-tag may be unflashed.\n"); Serial.printf("If this tag was previously flashed succesfully but this message still shows up, there's probably something wrong with the serial connections.\n"); Serial.printf("The build of this firmware expects an AP tag with TXD/RXD on ESP32 pins %d and %d, does this match with your wiring?\n", FLASHER_AP_RXD, FLASHER_AP_TXD); - Serial.printf("Performing firmware flash in about %d seconds!\n", FLASH_TIMEOUT); - flashCountDown(FLASH_TIMEOUT); - if (doAPFlash()) { - checkWaitPowerCycle(); - if (bringAPOnline()) { - // AP works - ShowAPInfo(); - if (apInfo.type == SOLUM_SEG_UK) { - segmentedShowIp(); - showAPSegmentedInfo(apInfo.mac, true); - } - refreshAllPending(); - } else { - Serial.printf("Failed to bring up the AP after successful flashing... That's not supposed to happen!\n"); - Serial.printf("This generally means that the flasher connections (MISO/MOSI/CLK/RESET/CS) are okay,\n"); - Serial.printf("but we can't (yet) talk to the AP over serial lines. Verify the pins mentioned above.\n\n"); + if (FLASHER_AP_MOSI != -1) { + Serial.printf("Performing firmware flash in about %d seconds!\n", FLASH_TIMEOUT); + flashCountDown(FLASH_TIMEOUT); + if (doAPFlash()) { + checkWaitPowerCycle(); + if (bringAPOnline()) { + // AP works + ShowAPInfo(); + if (apInfo.type == SOLUM_SEG_UK) { + segmentedShowIp(); + showAPSegmentedInfo(apInfo.mac, true); + } + refreshAllPending(); + } else { + Serial.printf("Failed to bring up the AP after successful flashing... That's not supposed to happen!\n"); + Serial.printf("This generally means that the flasher connections (MISO/MOSI/CLK/RESET/CS) are okay,\n"); + Serial.printf("but we can't (yet) talk to the AP over serial lines. Verify the pins mentioned above.\n\n"); #ifndef POWER_NO_SOFT_POWER - Serial.printf("The firmware you're using expects soft power control over the AP tag; if it can't\n"); - Serial.printf("power-cycle the AP-tag using GPIO pin %d, this can cause this very same issue.\n", APpowerPins[0]); + Serial.printf("The firmware you're using expects soft power control over the AP tag; if it can't\n"); + Serial.printf("power-cycle the AP-tag using GPIO pin %d, this can cause this very same issue.\n", APpowerPins[0]); #endif #ifdef HAS_RGB_LED - showColorPattern(CRGB::Red, CRGB::Yellow, CRGB::Red); + showColorPattern(CRGB::Red, CRGB::Yellow, CRGB::Red); +#endif + apInfo.isOnline = false; + apInfo.state = AP_STATE_FAILED; + } + } else { + // failed to flash +#ifdef HAS_RGB_LED + showColorPattern(CRGB::Red, CRGB::Red, CRGB::Red); #endif apInfo.isOnline = false; apInfo.state = AP_STATE_FAILED; - } - } else { - // failed to flash -#ifdef HAS_RGB_LED - showColorPattern(CRGB::Red, CRGB::Red, CRGB::Red); -#endif - apInfo.isOnline = false; - apInfo.state = AP_STATE_FAILED; - Serial.println("Failed to flash the AP :("); - Serial.println("Seems like you're running into some issues with the wiring, or (very small chance) the tag itself"); - Serial.println("This ESP32-build expects the following pins connected to the ZBS243:"); - Serial.println("--- ZBS243 based tag ESP32 ---"); - Serial.printf(" TXD ---------------- %02d\n", FLASHER_AP_RXD); - Serial.printf(" RXD ---------------- %02d\n", FLASHER_AP_TXD); - Serial.printf(" CS/SS ---------------- %02d\n", FLASHER_AP_SS); - Serial.printf(" MOSI ---------------- %02d\n", FLASHER_AP_MOSI); - Serial.printf(" MISO ---------------- %02d\n", FLASHER_AP_MISO); - Serial.printf(" CLK ---------------- %02d\n", FLASHER_AP_CLK); - Serial.printf(" RSET ---------------- %02d\n", FLASHER_AP_RESET); + Serial.println("Failed to flash the AP :("); + Serial.println("Seems like you're running into some issues with the wiring, or (very small chance) the tag itself"); + Serial.println("This ESP32-build expects the following pins connected to the ZBS243:"); + Serial.println("--- ZBS243 based tag ESP32 ---"); + Serial.printf(" TXD ---------------- %02d\n", FLASHER_AP_RXD); + Serial.printf(" RXD ---------------- %02d\n", FLASHER_AP_TXD); + Serial.printf(" CS/SS ---------------- %02d\n", FLASHER_AP_SS); + Serial.printf(" MOSI ---------------- %02d\n", FLASHER_AP_MOSI); + Serial.printf(" MISO ---------------- %02d\n", FLASHER_AP_MISO); + Serial.printf(" CLK ---------------- %02d\n", FLASHER_AP_CLK); + Serial.printf(" RSET ---------------- %02d\n", FLASHER_AP_RESET); #ifdef POWER_NO_SOFT_POWER - Serial.printf("Your firmware is configured without soft power control. This means you'll have to manually power-cycle the tag after flashing.\n"); + Serial.printf("Your firmware is configured without soft power control. This means you'll have to manually power-cycle the tag after flashing.\n"); #else - Serial.printf(" POWER ---------------- %02d\n", APpowerPins[0]); + Serial.printf(" POWER ---------------- %02d\n", APpowerPins[0]); #endif - Serial.println("Please verify your wiring and try again!"); - } + Serial.println("Please verify your wiring and try again!"); + } #ifdef HAS_SDCARD - if (SD_CARD_CLK == FLASHER_AP_CLK || - SD_CARD_MISO == FLASHER_AP_MISO || - SD_CARD_MOSI == FLASHER_AP_MOSI) { - Serial.println("Reseting in 30 seconds to restore SPI state!\n"); - flashCountDown(30); - ESP.restart(); - } + if (SD_CARD_CLK == FLASHER_AP_CLK || + SD_CARD_MISO == FLASHER_AP_MISO || + SD_CARD_MOSI == FLASHER_AP_MOSI) { + Serial.println("Reseting in 30 seconds to restore SPI state!\n"); + flashCountDown(30); + ESP.restart(); + } #endif + } } uint8_t attempts = 0; diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 931c9fee..612b0f07 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -100,7 +100,7 @@ void wsSendSysteminfo() { setVarDB("ap_ch", String(apInfo.channel)); static uint32_t tagcounttimer = 0; - if (millis() - tagcounttimer > 60000) { + if (millis() - tagcounttimer > 60000 || tagcounttimer == 0) { uint32_t timeoutcount = 0; uint32_t tagcount = getTagCount(timeoutcount); char result[40]; diff --git a/ESP32_AP-Flasher/src/wifimanager.cpp b/ESP32_AP-Flasher/src/wifimanager.cpp index 1c2e523a..37fd0900 100644 --- a/ESP32_AP-Flasher/src/wifimanager.cpp +++ b/ESP32_AP-Flasher/src/wifimanager.cpp @@ -9,6 +9,7 @@ #include "tag_db.h" #include "udp.h" #include "web.h" +#include "ips_display.h" uint8_t WifiManager::apClients = 0; uint8_t x_buffer[100]; @@ -29,10 +30,17 @@ WifiManager::WifiManager() { WiFi.onEvent(WiFiEvent); } +void WifiManager::terminalLog(String text) { + Serial.println(text); +#ifdef YELLOW_IPS_AP + TFTLog(text); +#endif +} + void WifiManager::poll() { if (wifiStatus == AP && millis() > _nextReconnectCheck && _ssid != "") { if (apClients == 0) { - Serial.println("Attempting to reconnect to WiFi."); + terminalLog("Attempting to reconnect to WiFi."); logLine("Attempting to reconnect to WiFi."); _APstarted = false; wifiStatus = NOINIT; @@ -45,7 +53,7 @@ void WifiManager::poll() { if (wifiStatus == CONNECTED && millis() > _nextReconnectCheck) { if (WiFi.status() != WL_CONNECTED) { _connected = false; - Serial.println("WiFi connection lost. Attempting to reconnect."); + terminalLog("WiFi connection lost. Attempting to reconnect."); logLine("WiFi connection lost. Attempting to reconnect."); WiFi.reconnect(); waitForConnection(); @@ -63,12 +71,12 @@ bool WifiManager::connectToWifi() { _ssid = preferences.getString("ssid", WiFi_SSID()); _pass = preferences.getString("pw", WiFi_psk()); if (_ssid == "") { - Serial.println("No connection information specified"); - logLine("No connection information specified"); + terminalLog("No connection information saved"); + logLine("No connection information saved"); startManagementServer(); return false; } - Serial.println("Stored ssid: " + String(_ssid)); + terminalLog("Stored ssid: " + String(_ssid)); String ip = preferences.getString("ip", ""); String mask = preferences.getString("mask", ""); @@ -80,7 +88,7 @@ bool WifiManager::connectToWifi() { if (staticIP.fromString(ip) && subnetMask.fromString(mask) && gatewayIP.fromString(gw)) { if (dns.length() > 0) dnsIP.fromString(dns); WiFi.config(staticIP, gatewayIP, subnetMask, dnsIP); - Serial.println("Setting static IP"); + terminalLog("Setting static IP: " + ip); } } @@ -98,7 +106,7 @@ bool WifiManager::connectToWifi(String ssid, String pass, bool savewhensuccessfu WiFi.mode(WIFI_STA); WiFi.setSleep(WIFI_PS_NONE); - Serial.println("Connecting to WiFi..."); + terminalLog("Connecting to WiFi..."); logLine("Connecting to WiFi..."); WiFi.persistent(savewhensuccessfull); WiFi.begin(_ssid.c_str(), _pass.c_str()); @@ -112,7 +120,7 @@ bool WifiManager::waitForConnection() { while (WiFi.status() != WL_CONNECTED) { if (millis() > timeout) { - Serial.println("Unable to connect to WiFi"); + terminalLog("!Unable to connect to WiFi"); logLine("Unable to connect to WiFi"); startManagementServer(); return false; @@ -131,8 +139,8 @@ bool WifiManager::waitForConnection() { WiFi.setAutoReconnect(true); WiFi.persistent(true); IPAddress IP = WiFi.localIP(); - Serial.printf("Connected! IP Address: %s\n", IP.toString().c_str()); - logLine("Connected! IP Address: " + String(IP.toString().c_str())); + terminalLog("Connected!"); + logLine("Connected!"); _nextReconnectCheck = millis() + _reconnectIntervalCheck; wifiStatus = CONNECTED; return true; @@ -140,13 +148,13 @@ bool WifiManager::waitForConnection() { void WifiManager::startManagementServer() { if (!_APstarted) { - Serial.println("Starting configuration AP, ssid OpenEPaperLink"); + terminalLog("Starting configuration AP, ssid: OpenEPaperLink"); logLine("Starting configuration AP, ssid OpenEPaperLink"); WiFi.mode(WIFI_AP); WiFi.softAP("OpenEPaperLink", "", 1, false); WiFi.softAPsetHostname("OpenEPaperLink"); IPAddress IP = WiFi.softAPIP(); - Serial.printf("IP Address: %s\n", IP.toString().c_str()); + terminalLog("Connect to it, visit http://" + String(IP.toString().c_str()) + "/setup"); _APstarted = true; _nextReconnectCheck = millis() + _retryIntervalCheck; wifiStatus = AP; @@ -194,7 +202,7 @@ void WifiManager::WiFiEvent(WiFiEvent_t event) { eventname = "Connected to access point"; break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - eventname = "Disconnected from WiFi access point"; + // eventname = "Disconnected from WiFi access point"; break; case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE: eventname = "Authentication mode of access point has changed"; @@ -208,27 +216,27 @@ void WifiManager::WiFiEvent(WiFiEvent_t event) { break; case ARDUINO_EVENT_WIFI_AP_START: - eventname = "WiFi access point started"; + // eventname = "WiFi access point started"; break; case ARDUINO_EVENT_WIFI_AP_STOP: - eventname = "WiFi access point stopped"; + // eventname = "WiFi access point stopped"; break; case ARDUINO_EVENT_WIFI_AP_STACONNECTED: apClients++; - eventname = "Client connected"; + // eventname = "Client connected"; break; case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: apClients--; - eventname = "Client disconnected"; + // eventname = "Client disconnected"; break; case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: - eventname = "Assigned IP address to client"; + // eventname = "Assigned IP address to client"; break; default: break; } - Serial.println(eventname); + terminalLog(eventname); logLine("WiFi event [" + String(event) + "]: " + eventname); } diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index 2ba962c9..02c93df7 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -82,6 +82,7 @@