From 33316c1f3fa998e29a1d0e2bd4b59daf83080b58 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Thu, 9 Feb 2023 22:11:58 +0100 Subject: [PATCH] fix duplicate data and timeout in apfw + implement pinging AP + fix some timings --- ap_fw/apfw.bin | Bin 15975 -> 16192 bytes ap_fw/main.c | 23 +++++++++++++---- esp32_fw/data/www/main.js | 2 +- esp32_fw/include/newproto.h | 1 + esp32_fw/src/contentmanager.cpp | 16 ++++++------ esp32_fw/src/newproto.cpp | 37 ++++++++++++++++++++++++++-- esp32_fw/src/serial.cpp | 42 +++++++++++++++++++++++++++++--- 7 files changed, 102 insertions(+), 19 deletions(-) diff --git a/ap_fw/apfw.bin b/ap_fw/apfw.bin index 8c6b0502a834490477635cf2a40e51cbe2288084..59e55a7acea3e41d3728a01e2304d53b2255af84 100644 GIT binary patch literal 16192 zcmeHud3+PsweV;p*|J$|%aE9`DMBtg7;Fej0(J~Z)0W0Bc3zWo6J=@B*EVi?Cp8Jn zFscZPmwALFKnPI8mjnX%ef>hx1c+4x4N2PKnCE7XC#hr`uQ!W8vOLl|=gy2QL-K{+ z`_@06VXidyo_n@??z!ild&P5)^5gb#_{Wd0VxO~F$#KRf?+{rHf8(uR+HSxZpZuhL z{`&UNMpu8}oL})vt+v}L(?ZfxkK3LXlAZ`lwvgwETcM;+ER`CibB)S5r?7Fcec|gN z$!+Gje_m63aS87p{jgcSg{yj2*slg3`^;ziBgb3!zx%~|p9%XD!K%cichoAbeF^8z zT*C?bmEh+Y@AOwa+rDJ1d+3^Rvcd(a@16d4`>L*gh^xwjXZ%APpsuIKJRwPrJVkqa zwAV-F$lf3nPbsQTiTjj<9NDe(KVk}W?kO8z!_}JV_|8d@;QZ)jX^UqowJ$sxfgZ{v zIz;?nP_Mm8ja2KYqx}3y28sPi5{Kbo*5AFpc3;b{cE^~xxmGzI`$NsdH!?1*>5pA z`O|soI0{R@$Bq!0MGY>DSEnaO)NHOWtEc#-SGP=E7H|drWIFX)@YjVxVlBBIdiL_Qm8QXyJ+Z*-df8#PFD928x8tswN&Hrr)vXlUvTWO^t{Iy=nmJ5 zVX3o74SUKh>DAOq*P7OGVp`X<{_aAxnO;_64|8`}I_|P|EpwZ)hKmR422A}(Qt?L& zw$^edi#aegYgvt{maj8+33T*97ayKLlsPo)LeuxBlid6Xk>DIxLRNRQqYD5QW%Wso z*Dcak&o-C{I=A!Bha|6u8tgWvgLPV$(#q>dPX2_j1X#izrO&6tzU4MoOU|LZaUb2ZEA`{;e0Rsh9*oX z-^E8l-zZWN;2up`{|h3GLsWf;Dn@dq0ILhH5Y4(jmDfKcdHsXIt8Rr>PrcNT(43R0 zxZrd%XrZ^D&GLulFDwTOnlry}naFM8uI^M=Wf}+wTx4XTRz1Y=mJ`+>Kex%rkG%^d zHwF|ns1NG=Nm%bPQJ+%8p@7N=3h;7dA5+#cRHf;zkW>ky^tRmY#&^qquZMAbv6nU^ zGVIn09Ml(K9ehzqG$eR&*|iu3%CQWdcE3_9)p_hi4wPr)Mv^~BK+!>_4z9=|vj$bb z*aoTd+GVROxk@zm4RZT;QLeO^SCap7YR0sFNuMf$beDbXNkRH2R^H0WMNrC-mkf;) z)AYXJq8KcSX1Tr2KKn%`Y{p<`tIF+90w3M>`IFYwu5aJKLCiujsXkI%uT}}ZFq11A zr@M{G(cpqU&AGus6b(y2cc}Pb()FB5@>s(7TEa?=UyVmU#xQ?^=QKP4c+S9c7M?%D z^BO$o;CUUMH{f{_p1;8JSD4Up zP3(Zdk7K~~f+w(pd~5ydBI~){Y5l=lR9t9kaiQ&J@@1vS*OYWuO*#pU_}_IM3(`GI z;@enR%1TY{-6R8uf)mq;W+2h#Ya;qllITZ+h<~4NwiZZ zny8slJGE{axlS{qiM5mJCZl!d7$(CeuE|M;B$OCu+-*ef;4g(oxSb3XAMtyJ)vhXG&W@`C++9Ft0S->zU!DGs6V{ zs`UE|rbE*Md-_8&o>oIM_r^m7`w{_CxrhAhX_B`$xKG1Vwg~xTmV^@~vOQ@lN%RrmJh06hocdR*L*AJi27) zpf^9hsb`da3k<{(0AXnFLA2=q%~VIu^}=Y`Z|u}Z?#m=;{~c18SDngr9Jx-&?bSWn zt{4V1AGgf1iuPd7xG!}|`%|WLatY}*G#2SK=5Wp2+MDX;5xeGiX4THFD|~L&q1p9? z=zcP&zA@6>kF0KmB}UywCNVo~D?z&RIkdgW%=TKr4}Zp{-CUSIo~@qW&a zF6xnf5sUQaKzLq+;rSd02w}I}|4sLU5cU_vpr-#}kZH%j@alp8HmMr+_j=$DW1|QD zCQXfCI13M{~+eZJ_(oT_^sZX-FcPQf;GGi)1@&PR7ImJB}oRRC8iGvu~au)T%> zBqcBnA(#Q9)7Jp>U~IW>yWLps&G~b|aoiL;GB0T_y3I42>Hs`GG_3#QHkG5>lo$c`!Qa&SY#6q7ZjpTE~NXRf2^VC^1X?0>Fi#2@E z8lDf^rUi8iVc0_RX=s6uh9Hd`mgg!=(K+K zB~A;S5lmrRZW5Z~>_rC=xrDFxK_h!rYkL`CZiRh*=`pF^)8nd*_ZGFovMjNQ&OE-C ztkBr|zJ_$&J?q=FsB*OtB0yAmD^?~KI^Ba^QF~1uEMa&s#$tQ5mUm;e-GjExs@qEV z8$0cm@4%Mgdh*LbiGr8h#1nwzFyj{ zYn3+k|Gl(vL)u6@$twgyJ=Y+i?w5>6ie%`{4n{UL_R>RoBfWU_8 z%JrY5U$HgBRXnc69=JdB;e-M|gL7%jpX`p|_M3h!96jGuZ@=jvxDEo7sJ+B~(|;?@ zAv*`nF)9Sa(oagDS=13 zm=bs(n#6hzF{_aD)l+ulM6xp^P5L0U-M&NvD;)#|2NMIi6$W;j2DbETz`m)0-98BH ztt+ubO%Nq8=lYe|oI!G7loIu^RAN_PXMguDwP$y{_o+mnYsb9q9nbgdINiI$0-4Rx zS#sN-?4v)fmjYyC9bG}i$0=0b;Du@&3G+PIv;2b>-3>uroX`;BMSDXVFHUXf;KjKO z-Mn}+f5W{xY<3BM!y~Zyz@(Sfd&oJh2HdJqA>OBdwXYWM)W2RoMqH9Kgdy6}aY3^K z9U{9#gaALu5u7@}@R0XYwS=b*prvd|CiI$^)x%hO)-p+kx!|fyXKuQU3;R zGlY|Mc%U+*yfIztgM2lniwgt9^!Uxe$8RZ{HR|Pr=?1OwBJF_WVpeiCv(uAryN8cH zkuZ(HMYj|8u37x(oD@9_nhwCbKV6QRm9W&9?!>Pa?Q1=rcSV24!usg%w8d6k02>Ap z#VG1#NQbg-(M@c5oAAz22^Y9-NZDe-SB`FC%s}`Hf$pFzoZo79-PdTXft);}u|=b? zMWYejtf(%r43Kb;K-J@*4a{1iR5YPDM76|THt1H5Xrb$aay4&M#` zQ7;|y9HsqoRA&1b$XtNl<>-ziFtiNp$!lM&IaPfUngNAzNZnmw4=+l%N9fug>T-l)@D}RDMu254IIN{FIfSP;VfRvD zr@iSpooPg~lQx;N>-p1WS#45W7ZSlDH4e3kT8G(itb~y7EhXN2JdLl}h3^)6z`VU) z)4j7QZ_V|aXxnkhMyu-jR@Vje`f=DkCE%^X-bHY+om+z zCjDqFvQ=0zuNcf~PPc>}_S zc2Rh(%ClVZ?vm`|N`TtOQ_6R$s7eT82WeHz!PlHXA*SQX_3t z8lAI2EJG+1q05+|t;4-1-+e`m~ZbUVR3j2CP@hmnQAjyHx@MGnH@70t)D@!dt`D!j@U3o3on^ zIg=A(f6By2aYoVoO4tTRpBeCE!ZQTgo|6uF4%1kBU{B=Y)6tH-eVzMafsk!yC}USB zb9ZRSQ)Tac+3=!1Lf*= z;z8Fzl|c?M7e?i;KwcOZK;Pbm@#Jd*5oOLO#b1Fgs zcaz`%CP5q0t?(6=Xpm?G1@s@A%g?Lu`H!^n^DmXZ)+?*iHCFZ0^dzIqhpID}4^?L{ zJ2`DRZAI)ppATZPe0nqi-s?d9_Vm;Bj5Sw0{MTCZw%6<4Kz`q(rEl{G(zn;wB-ST3 zB;=N-6h~XexK|UV@jZ7|(w;lr=>-;5kW5Z=`lqeTK^0hs0cMPv&=-kjIgvo4*47Ml zuEtHlfK?_=a=E9t>{q#A4cVDhi8YCbxkotBR?TTg8M0c0oXagTm0SK5LhzRDkd$nB z4EEFNTqe^xuG_Ua7A$J%C+UHw4c%gbhYmYscDj#Xtg_)bDpv)6_dzuINLnsy3Xqw2%%7RD~4!o`C)KE@X&h*<2 zehv=3k7?dgcLj3G>pheyL7US^Za&!Z5UzMZ!%(hlj@;r0b7V0|uPdB@BhGlQ>mOmM zrzjszNgq??7M1q8K2KJ_P`pWXUk-Lb(y6ZAMVfji>ejAVpJsGuKm8}u*&^RI1uPczLQo*969)`- zVvsgv;tG|CbYbzy++Gh5%#J6bEd$Sb8rLyNZlOx4A`Vmt39h^@R$6C)Qs%svOhc$I z01EwZu{PC8U*mqU`uo5`9tS!|oE1*>uv+!D;&|FJ=0oNQ>pqgz5=Oc9-MaTm-?pJ^jv21`4zxq{TS~b0z|igW7gBFM4H5|> zt)y6Y4iambF4mo2Db^t-*2^fC8^juhVpSMom1|-Nuh~GHEg;Uf*=}m{`&&NP`mQF; zd#Tb~DM2}tpaLZrh7w>Dm=fY7rATsr_aN@?#iWCJcZ$C!CKi)v(MT_hN{o@PI&j;_4jU2uU7hfjOFhm%fpdnePP7d z15903-5O3={Xr-K%>6JFh0+b3%75R>R!?QNtS-lpsPrXKR#)g6yu49pa|*3@3;moB z_e;8=PVECuVho*8kt;G~s+nR!t7?3qft z;gSh(pcE+AV*}n5B0Sp`!Yj+HV{5$N))3sjPg%sCnt`5NG`+RRV>Vfjno)W1!B zK#7Xjm+3cPxFHY&1?>~Jm4PSz0ba`h=lnzMdPcUa{s_N8`1E7^gk@p`KtU^l#{KEF zAj?)vDdYW;A1e?O|48ZgTdT1e&wfX4>D0U-OcB7MI z`W1$E?h{AA;K;aXaC@#Nz|t-{SzIWAtbUY@eGfB|Z{)ra!@GUKzF7OT{)@M$9gE_f zixWuBu;Mvoni7y4yPSaJu+cvEiDQf$Xoqd7QZ7RJIgA8W(Fop~e1u!et%D17kcm%R zXr~u_m?F^5u#@NMkVaFk0)GE1fUlmZ9I@J`-=KIExZYqT3H$Uc$eJt{?0gKcb-e#MY$!b+q+uymlLbiO&CVC5WW2&{C#LW8i@$rJApI52Lej*~ zVy?zAyX#W%a93uGWNxJgr}hzx`2LAs4C|_}xh*7HJWp)mn9tE|P8Zhdx4^?u}63FdOQQyT1lRF&d?}98RR;CdL=+bsV;6*b({T@RsN^F70scUr<(k(GS>$4a9h+@%9 zKZP<(k+Df3S|L`Zbyc+Vi(?uoB+j)?m|%fCK|qNHcd^+c&`eljnrW<2Ib#OD_$#PT zq7_-L*u^s5WsX)**T3Pn0t9N6)ztxk+Lc0li@x8e!JlsCXROq0(CKJSbG((V_?%#V z&dr|Zq}Jy=Rtb(WPrucg=YDUc=pMGx@3wmPd&KiiZ;5XVHGoS0K$a4>`$abeSeU=A*O`pO;^EOL)RtosAH5*%D_VY6#6Kr8659L|Un`b>| zrPt5Gi~%iUR8z;{1o0rAO(vKr_JSHVB|!O3T#mh*c#@@k$h` z+MlCd4?Q>u`cUvEGzd5$l?D+Q*kvF3FIa*$Bjh0(^1zqL8f3Il!I!hp3BLL%z5uf( zqdSkPjI>7cG(vvmu-1J_1nKl$MCy}ZM?n|#5w3`fTtqIW^o8iWt(xcM87?LOvcsbo zB$B@|+7`)Zi#j2~L|U((^}K%WtaQ$4pIrm0u+KiK_@KZk@Hs#GnPe?kyk7m8Rt-}{ zgAVi9X#w`=P3@uhw3ho)TCV7{`>UILyJ0!}GIYM5SEe`9o(s?xfCo;UfDvULVv2%1 z7lM4@F9Re2C5{3cfz~j!Z8F{A9%xyGz%xeloaQ<8F@mePXet^<~Fb|a42KQvN+#?NA1HC}= z1|&>y#clS9eSr{UIUlFEXt7T)L-s=t-~w}H0C#93xrEk6!2t-oNicJQlyl&6@rXcs zA(%{Im7Nuq6t>pfOU<4r%)I_7sTGY}v$WIEY{L}-%$~!g zKD-f}rBTsttm@zn`J&ZLSbU|-#3V?gK-kO)XDR##5kJ%2k}e_>?Ei&`hB%sh141P| zBm7zilyjL49WkxV04XvwDTa!l$AW!_C^{N74i>O8On0+<$r}=Nx;@o`D;@o`D1-o|cXK|f^VH(6$?o3>!K568@ z?-geRAA=7C!)a~pf^Wn_2BUJYJq4BOpBUs?7ER7N#giOe&luC-*r2X0Q=2V+=tsfE#t#(7vU9A@x0eAd2>D9 z5!8v>G`MxhwDT%wcH75i!D*$oRf7u@AN93FaNFi|T+S)Dl#5}MBb;&RIgjAsoMQYl zF-)C@JITd8tza&#MDJmz4jFjb+DWEvJD_+CbnX)nE=i{80^eiTH}GAAQ>v$l~m!A z`oP0MBEW-ZX9I5xv4Ep0tGf&<*v3_xYWRWiflGHOLvYA`7=CqzzawDEjkX^*8CEbY z#R_&AR`9(2Nbb=Qx^3(*YDL)O?lLaYByW_du+ar#__IMsdZ4wiyZo{BTzB9pwRdj~ zvk-`EWOc7L5wxSOg0_r6aBqKbpDJ2vEp>1>vWH1r7%Ysru_+qd*9T4TQ%+gk&kovg zK>cR>LI>tA8sW@zFZ|#J;Qz%vR7b^z9Jl}a)H|S2Jcv0Uz`_Wu%a+vxdg|sG_>COx zoEqyYgd5-on4q$%{RYygJ*d|{qqyNj;h<8gKn_=j33Tr5+E<(lubqLtv}+#{Ilv%3 zdHwh%3Ek$s+Ebm)^A)i$w^M$=$W&-o;of;_fP6TEUf+etS_S z_uV`HiIw>MR}T=!@)avqRg(LE^-~9VaQW)h_pflQe(-@`I>^uN|BZtz|7j+7+nsln zE?ttz-EsSO@4SnB`PD0ryJhd nTLkhg7XZ_8AiDa22Uh@I_;CE{f!}6w>D+(){g(#*^BVXMn@|4{ literal 15975 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 + if (slot == -1) slot = findFreeSlot(); if (slot != -1) { xMemCopyShort(&(pendingDataArr[slot]), serialbuffer, sizeof(struct pendingData)); pr("ACK>\n"); @@ -396,7 +399,17 @@ void espNotifyXferComplete(const uint8_t *src) { uartTx(((uint8_t *)exfc)[c]); } } -void espNotifyTimeOut() { +void espNotifyTimeOut(const uint8_t *src) { + struct espXferComplete exfc; + xMemCopy8(&exfc.src, src); + uartTx('X'); + uartTx('T'); + uartTx('O'); + uartTx('>'); + addCRC(&exfc, sizeof(exfc)); + for (uint8_t c = 0; c < sizeof(exfc); c++) { + uartTx(((uint8_t *)exfc)[c]); + } } // process data from tag @@ -738,7 +751,7 @@ void main(void) { for (uint8_t __xdata c = 0; c < MAX_PENDING_MACS; c++) { if (pendingDataArr[c].attemptsLeft == 1) { - espNotifyTimeOut(); + espNotifyTimeOut(pendingDataArr[c].targetMac); pendingDataArr[c].attemptsLeft = 0; } else if (pendingDataArr[c].attemptsLeft > 1) { pendingDataArr[c].attemptsLeft--; diff --git a/esp32_fw/data/www/main.js b/esp32_fw/data/www/main.js index 27d3529f..504bd8cf 100644 --- a/esp32_fw/data/www/main.js +++ b/esp32_fw/data/www/main.js @@ -139,7 +139,7 @@ function updatecards() { if (item.dataset.lastseen && item.dataset.lastseen > 1672531200) { let idletime = (Date.now() / 1000) + servertimediff - item.dataset.lastseen; $('#tag' + tagmac + ' .lastseen').innerHTML = "last seen"+displayTime(Math.floor(idletime))+" ago"; - if ((Date.now() / 1000) + servertimediff - 60 > item.dataset.nextcheckin) { + if ((Date.now() / 1000) + servertimediff - 300 > item.dataset.nextcheckin) { $('#tag' + tagmac + ' .warningicon').style.display='inline-block'; $('#tag' + tagmac).classList.remove("tagpending") $('#tag' + tagmac).style.background = '#ffffcc'; diff --git a/esp32_fw/include/newproto.h b/esp32_fw/include/newproto.h index c41b3972..5d98df56 100644 --- a/esp32_fw/include/newproto.h +++ b/esp32_fw/include/newproto.h @@ -8,4 +8,5 @@ extern void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin); extern bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t nextCheckin); extern void processJoinNetwork(struct espJoinNetwork* xjn); extern void processXferComplete(struct espXferComplete* xfc); +extern void processXferTimeout(struct espXferComplete* xfc); extern void processDataReq(struct espAvailDataReq* adr); \ No newline at end of file diff --git a/esp32_fw/src/contentmanager.cpp b/esp32_fw/src/contentmanager.cpp index 2d0b1d30..fb5e96df 100644 --- a/esp32_fw/src/contentmanager.cpp +++ b/esp32_fw/src/contentmanager.cpp @@ -88,26 +88,26 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { case Today: drawDate(filename, taginfo); - updateTagImage(filename, mac, (midnight - now) / 60 - 10); taginfo->nextupdate = midnight; + updateTagImage(filename, mac, (midnight - now) / 60 - 10); break; case CountDays: if (buttonPressed) cfgobj["counter"] = 0; drawNumber(filename, (int32_t)cfgobj["counter"], (int32_t)cfgobj["thresholdred"], taginfo); - updateTagImage(filename, mac, (buttonPressed?0:15)); - cfgobj["counter"] = (int32_t)cfgobj["counter"] + 1; taginfo->nextupdate = midnight; + updateTagImage(filename, mac, (buttonPressed ? 0 : 15)); + cfgobj["counter"] = (int32_t)cfgobj["counter"] + 1; break; case CountHours: if (buttonPressed) cfgobj["counter"] = 0; drawNumber(filename, (int32_t)cfgobj["counter"], (int32_t)cfgobj["thresholdred"], taginfo); - updateTagImage(filename, mac, (buttonPressed?0:5)); - cfgobj["counter"] = (int32_t)cfgobj["counter"] + 1; taginfo->nextupdate = now + 3600; + updateTagImage(filename, mac, (buttonPressed ? 0 : 5)); + cfgobj["counter"] = (int32_t)cfgobj["counter"] + 1; break; case Weather: @@ -118,8 +118,8 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { // https://github.com/erikflowers/weather-icons drawWeather(filename, cfgobj["location"], taginfo); - updateTagImage(filename, mac, 15); taginfo->nextupdate = now + 3600; + updateTagImage(filename, mac, 15); break; case Firmware: @@ -142,16 +142,16 @@ void drawNew(uint8_t mac[8], bool buttonPressed, tagRecord *&taginfo) { case Memo: drawIdentify(filename, taginfo); + taginfo->nextupdate = now + 12 * 3600; updateTagImage(filename, mac, 0); - taginfo->nextupdate = now + 12*3600; break; case ImageUrl: if (getImgURL(filename, cfgobj["url"], (time_t)cfgobj["#fetched"])) { + taginfo->nextupdate = now + 60 * (cfgobj["interval"].as() < 5 ? 5 : cfgobj["interval"].as()); updateTagImage(filename, mac, cfgobj["interval"].as()); cfgobj["#fetched"] = now; - taginfo->nextupdate = now + 60 * (cfgobj["interval"].as() < 5 ? 5 : cfgobj["interval"].as()); } else { taginfo->nextupdate = now + 300; } diff --git a/esp32_fw/src/newproto.cpp b/esp32_fw/src/newproto.cpp index bbd2f148..efad9f80 100644 --- a/esp32_fw/src/newproto.cpp +++ b/esp32_fw/src/newproto.cpp @@ -58,7 +58,7 @@ void prepareIdleReq(uint8_t* dst, uint16_t nextCheckin) { memcpy(pending.targetMac, dst, 8); pending.availdatainfo.dataType = DATATYPE_NOUPDATE; pending.availdatainfo.nextCheckIn = nextCheckin; - pending.attemptsLeft = 10; + pending.attemptsLeft = 10 + MIN_RESPONSE_TIME; char buffer[64]; uint8_t src[8]; @@ -124,6 +124,7 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t md5.getBytes(md5bytes); } + uint16_t attempts = 60; uint8_t src[8]; *((uint64_t*)src) = swap64(*((uint64_t*)dst)); uint8_t mac[6]; @@ -131,11 +132,20 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t tagRecord* taginfo = nullptr; taginfo = tagRecord::findByMAC(mac); if (taginfo != nullptr) { + if (memcmp(md5bytes, taginfo->md5pending, 16) == 0) { wsLog("new image is the same as current image. not updating tag."); wsSendTaginfo(mac); return true; } + + time_t now; + time(&now); + uint16_t minutesUntilNextCheckin = 0; + if (taginfo->expectedNextCheckin > now) minutesUntilNextCheckin = (taginfo->expectedNextCheckin - now) / 60; + attempts += minutesUntilNextCheckin; + } else { + wsErr("Tag not found, this shouldn't happen."); } // the message that will be sent to the AP to tell the tag there is data pending @@ -145,7 +155,7 @@ bool prepareDataAvail(String* filename, uint8_t dataType, uint8_t* dst, uint16_t pending.availdatainfo.dataVer = *((uint64_t*)md5bytes); pending.availdatainfo.dataSize = file.size(); pending.availdatainfo.nextCheckIn = nextCheckin; - pending.attemptsLeft = 10; + pending.attemptsLeft = attempts; sendDataAvail(&pending); // data for the cache on the esp32; needs to hold the data longer than the maximum timeout on the AP @@ -284,6 +294,29 @@ void processXferComplete(struct espXferComplete* xfc) { wsSendTaginfo(mac); } +void processXferTimeout(struct espXferComplete* xfc) { + char buffer[64]; + uint8_t src[8]; + *((uint64_t*)src) = swap64(*((uint64_t*)xfc->src)); + sprintf(buffer, "< %02X%02X%02X%02X%02X%02X xfer timeout\n\0", src[2], src[3], src[4], src[5], src[6], src[7]); + wsErr((String)buffer); + Serial.print(buffer); + uint8_t mac[6]; + memcpy(mac, src + 2, sizeof(mac)); + + time_t now; + time(&now); + tagRecord* taginfo = nullptr; + taginfo = tagRecord::findByMAC(mac); + if (taginfo != nullptr) { + taginfo->expectedNextCheckin = now + 60; + taginfo->CheckinInMinPending = 0; + taginfo->pending = false; + memset(taginfo->md5pending, 0, 16 * sizeof(uint8_t)); + } + wsSendTaginfo(mac); +} + void processDataReq(struct espAvailDataReq* eadr) { digitalWrite(ONBOARD_LED, LOW); diff --git a/esp32_fw/src/serial.cpp b/esp32_fw/src/serial.cpp index 6b2c1379..2331151a 100644 --- a/esp32_fw/src/serial.cpp +++ b/esp32_fw/src/serial.cpp @@ -19,6 +19,7 @@ #define ZBS_RX_WAIT_XFERCOMPLETE 8 #define ZBS_RX_WAIT_DATA_REQ 9 #define ZBS_RX_WAIT_JOINNETWORK 10 +#define ZBS_RX_WAIT_XFERTIMEOUT 11 uint8_t restartBlockRequest = 0; @@ -111,6 +112,7 @@ void Ping() { void SerialRXLoop() { if (Serial1.available()) { lastchar = Serial1.read(); + //Serial.write(lastchar); switch (RXState) { case ZBS_RX_WAIT_HEADER: Serial.write(lastchar); @@ -119,8 +121,7 @@ void SerialRXLoop() { cmdbuffer[c] = cmdbuffer[c + 1]; } cmdbuffer[3] = lastchar; - if ((strncmp(cmdbuffer, "VER>", 4) == 0) && waitingForVersion) { - waitingForVersion = 0; + if ((strncmp(cmdbuffer, "VER>", 4) == 0)) { pktindex = 0; RXState = ZBS_RX_WAIT_VER; charindex = 0; @@ -151,6 +152,12 @@ void SerialRXLoop() { packetp = (uint8_t*)calloc(sizeof(struct espXferComplete) + 8, 1); memset(cmdbuffer, 0x00, 4); } + if (strncmp(cmdbuffer, "XTO>", 4) == 0) { + RXState = ZBS_RX_WAIT_XFERTIMEOUT; + pktindex = 0; + packetp = (uint8_t*)calloc(sizeof(struct espXferComplete) + 8, 1); + memset(cmdbuffer, 0x00, 4); + } break; case ZBS_RX_BLOCK_REQUEST: packetp[pktindex] = lastchar; @@ -171,6 +178,16 @@ void SerialRXLoop() { RXState = ZBS_RX_WAIT_HEADER; } break; + case ZBS_RX_WAIT_XFERTIMEOUT: + packetp[pktindex] = lastchar; + pktindex++; + if (pktindex == sizeof(struct espXferComplete)) { + struct espXferComplete* xfc = (struct espXferComplete*)packetp; + processXferTimeout(xfc); + free(packetp); + RXState = ZBS_RX_WAIT_HEADER; + } + break; case ZBS_RX_WAIT_DATA_REQ: packetp[pktindex] = lastchar; pktindex++; @@ -182,6 +199,7 @@ void SerialRXLoop() { } break; case ZBS_RX_WAIT_VER: + waitingForVersion = 0; cmdbuffer[charindex] = lastchar; charindex++; if (charindex == 4) { @@ -214,6 +232,8 @@ void zbsRxTask(void* parameter) { Serial1.begin(230400, SERIAL_8N1, RXD1, TXD1); simplePowerOn(); + bool firstrun = true; + Serial1.print("VER?"); waitingForVersion = esp_timer_get_time(); while (1) { @@ -223,14 +243,30 @@ void zbsRxTask(void* parameter) { Serial1.write(Serial.read()); } vTaskDelay(1 / portTICK_PERIOD_MS); + if (waitingForVersion) { if (esp_timer_get_time() - waitingForVersion > 10000*1000ULL) { - waitingForVersion = esp_timer_get_time(); + waitingForVersion = 0; //performDeviceFlash(); Serial.println("I wasn't able to connect to a ZBS tag, trying to reboot the tag."); Serial.println("If this problem persists, please check wiring and definitions in the settings.h file, and presence of the right firmware"); simplePowerOn(); } } + + if (version && firstrun) { + Serial.printf("ZBS/Zigbee FW version: %04X\n", version); + uint16_t fsversion; + lookupFirmwareFile(fsversion); + if ((fsversion) && (version != fsversion)) { + Serial.printf("Firmware version on LittleFS: %04X\n", fsversion); + Serial.printf("Performing flash update in about 30 seconds"); + vTaskDelay(30000 / portTICK_PERIOD_MS); + performDeviceFlash(); + } else if (!fsversion) { + Serial.println("No ZBS/Zigbee FW binary found on SPIFFS, please upload a zigbeebase000X.bin - format binary to enable flashing"); + } + firstrun = false; + } } }