From 287cf0520bd28c446b72c6a232ebfee0cf68d188 Mon Sep 17 00:00:00 2001 From: Jelmer Date: Mon, 20 Feb 2023 21:00:49 +0100 Subject: [PATCH] improved bmp draw spd, fixed bug if AP rejects req --- tag_fw/drawing.c | 7 +++--- tag_fw/fw154.bin | Bin 54371 -> 54616 bytes tag_fw/fw29.bin | Bin 54825 -> 55070 bytes tag_fw/fw42.bin | Bin 54839 -> 55084 bytes tag_fw/powermgt.c | 2 +- tag_fw/syncedproto.c | 50 ++++++++++++++++++++++++++++++++----------- 6 files changed, 41 insertions(+), 18 deletions(-) diff --git a/tag_fw/drawing.c b/tag_fw/drawing.c index a0a33d9e..1e0d577a 100644 --- a/tag_fw/drawing.c +++ b/tag_fw/drawing.c @@ -215,7 +215,9 @@ static void drawPrvDecodeImageOnce(void) { uint16_t __xdata bitpoolOut = 0; #endif // get a row + epdDeselect(); eepromRead(mathPrvMul16x16(er, mDrawInfo.stride) + mDrawInfo.dataAddr, rowBuf, mDrawInfo.stride); + epdSelect(); // convert to our format c = mDrawInfo.effectiveW; do { @@ -329,16 +331,13 @@ void ByteDecode(uint8_t byte) { prev |= (mColorMap[mPassNo][byte >> 4] << 1) | mColorMap[mPassNo][byte & 0x0f]; if (++step == 4) { step = 0; - epdSelect(); epdSend(prev); - epdDeselect(); } } void drawImageAtAddress(uint32_t addr, uint8_t lut) { struct EepromImageHeader* __xdata eih = (struct EepromImageHeader*)mClutMap; eepromRead(addr, mClutMap, sizeof(struct EepromImageHeader)); - switch (eih->dataType) { case DATATYPE_IMG_RAW_1BPP: pr("Doing raw 1bpp\n"); @@ -392,7 +391,7 @@ void drawImageAtAddress(uint32_t addr, uint8_t lut) { break; case DATATYPE_IMG_BMP:; uint32_t __xdata clutAddr; - pr("sending to EPD - "); + pr("sending BMP to EPD - "); clutAddr = drawPrvParseHeader(addr); if (!clutAddr) return; diff --git a/tag_fw/fw154.bin b/tag_fw/fw154.bin index 54c796085a579159463c2972fa96395345f35619..e06ead87036f4e671306ceefb8c1a188394336d0 100644 GIT binary patch delta 12454 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 ah}I|^@TfHvn=8xLvFoDGyxj0k?tcN6M3=Y# delta 12175 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 z�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 F{{jM`g9rcs delta 12145 zcmd5iX;>6jwq4cTER6ydyX>2yfV7IT#03;oTv1SQix~H)k;Ll64Z10msGyYIBxdp@ zzC6gxBys;RnyAqhl94b2Qd}ygoY_>~Q0NLK2b6Ilwcj+}i zukSUWQ2gBifqe;B_QUVeC-p`DOr#_IaHkpcJ>X3D0Q%Wz!qfhm8O-8kIxYj8MNZH! z1*O{s-7JlH+*ayI)91l{)AC4$a!`LI8rakDJzDfDvPqe#%0twL%2;X!`J3|Xu`_hs z0AO{qN-G5LmMv_j$S$yR#JDiHAh=!R_k`=jM>d1==1I)UW5_vGQsPP{a%&hpb4JI7 zFe~%;t}eE#O=MPHWuA@ZFR4k!!T@^D38Gbp`R_ULK6ki`zinhSqNzsQ!&Q_qm0GfQ zVYHX_7@rDKFa$9WWORXyiA2zEc?Nr1Z&E31xE;l$$&MX z{%nURo8Kyam{l7cM=`5r9pR3a9TU6w+h-n#4{NL@;gxsLMHP~w@3@ckTi3KtS-~;u zn)b>+l^ngUi9B*2)dvQsNQNdF307(*gs*FY?fA-mctpW}9X52F8i;h90!cs9Oo>|8 z#0$d(OO5cPMrf}QDyiKlt3v+SgKeVqkT}luNKLg3<%LwCvj)8m>fuA?$P1$o+{Fti zLdRZJ=z~H(tEf*sR_2_vM>#I&I?%?Z6L04rlRG|-a~JELx}xB3f5Jw9ktM}9^~=|M zVdqA^?H5Ovt|3qQZPnkjLs16p<^C|@2E#t;3FU8pA#~)s6f&$gp!V5!Y#6}b{#@uN zRDRsWu(7>ypF9-#+g}Uq+S?2}p%+>p|L8wcQ(%Xa>7Kha&v$p5JmbA#w|5X&A4QID z3alOB^)`iG`_4N#ZC%qgH$y*|uh1pgcN+y;NylS1w{q7iG_~Aw?3Al2B}Zir7)zHH z*BSqwSq8~G72W6!2hz5vC-yA z@Gc`9qcWJJ`-FR!n{rcFD{vE2UPspYj6x}I`=m&|kc~)w@tNtDjN7JPDgVnnp~I-& z$5oXvrNt!6H;UfzxOR;%Mfu)!G6JtqK+Kaa|44GkuWDH7n)kT(rSY!|kBtzrXPDA8 z?@BE13^BK+TlilN3SCB59mfEIEb^}1Lz*Ju!{;r!ztUJix zh?Bgq-sj3el9>sF!I^25)lbgRN;>Sn&qdG%_j8d-I^@6T@G3R{CRJq*CEH$aR2pd` zWmGT|z9W}H;_1n6l9rH2kLjnGsnao>r&~xsXbgEA%u+sNLrBVsR3Br1|T3f&CQjbUNoeTqu4iy}wD(r8I-U-Bd@09E%5 zAGFTK9*hIK++8=33GilSfXQ5i7)oRijk0>6d(Mi@vCF{_?Paclqs-JMa=gTkoDI*R zi>?uML}dT63rGvpYUcTcWMo8U#tiw~fK%1Q=*r*FGB%R_{rMY7uv%{<(a+sKUIv@| zjSuk5fgfp)!mtDkITbN{U}bf_>*Eipr7ShH!}L^VrK|NsfitEnA~2}3IyyRE+3~S5 zevi7s#SyEG447Y8-Nr@rK;*l2d`vCx%}%M5_~i7)SS2K3`cWz3>2@eGl7^p4kx9!? zKg(HaDoZ6=OyizZsq9q9&~ld6_QoJX%UPxWUV5L>VL-$!6$D3A4=9-(<)2ttEpt;Q z{Vq4ZZo|A16**_FlM5lM_EzMERH;i8=ni(N9Sd7ldt0fOp^3#Tt$U5gBN%q09ZFoI z$7?oqcXOkI3M#7~L+Ye}w5i07kU6@4q@XmAn<)(k|1D<>8!y9Mc88q@xfGoh0nGUu zp9yiIhv6swM!nEcBSlB|JY!?>(GA;TB7*kl_}fPzG1L4u{)4~qC7z5$B}~z`SG=zbU^f1PjE@ZrSzmFOJ5qL3>|~#ff5K|Uw426u zn8tNNPQ1Q?Y>KV+-hG`n=OM?+>JBNvi5)Zv*=`t=3u*F&K~@=K7T*OTmSR93%N96o z&G(?+iru>&*u81*YOrgvbuHVld&}P4E+5wB+W={S;WfyEln#yv#z}l_62U*73OG9A zj)Rhe{@fsGdVX*q4GMoh_}$(L?~5BLjs2#3?2vD8>;$K=kK+0mdu+&pz{=`&{`N`9 zwuWKy#MWf!{ef zaCc%fPUBc&ggj&LViC-BG8i6RP4Cufw$y7fc@&616svY>>$TS4F=C%OO1sX=uAx`qellN1_NVWN?+s% z03!`WBaLorE%a^8cP;W_qwOSQ`{+;@`^MIAahyb`}S z1~;JNV#|yoA2zWEg(AxHf`aP5kK2n^JDY{arVN@H2n8HN^n;j3?GKZ?I`oPXMWsa4 zBHdkc;kIV=GEaHp5|4*83$J#(IS8-fXdgDiE{&W_3DWd6uVGW{G}d`JPt=P}`N&~j zq#!j(GRSChA$7cD*7Vq^PAurrqj~cPmJ*@CK4V9bC246800+~?4(0Mu6x+Y&DbJe+ zitGSL$l+M!&5@Afkj}IrYN^^q64JBqY7Vo5LuaH?E*X&0bc22la)a#OEq4%a9*WmH z>*@Aj#>`o8_t|XM0mF;s+_sb58U06D4aA8%_HA5zDWxP{RA{Gw1wxLIq z>;bzja`eG`Ork2mVjBAd@@FM)9>CbFBLVlhVh$vQhQ)3kl@Sz1^GFjX8^#Rs9`i$w zN=8C@Fu5=$Cg|zzn?1}eNZ@bW0`-}ZD+x6=+s7M|BsL0^GQ%zCZa)xC7L0wCd@(ky zzf{f8`pZ#8T*f6q648F1rVWATl}dX2lJnlQq5pZf8@Qd1qzwS6Cv(RojkI~gJvWLy zWuGl-YF!UDmXJP2$;y#4;}UZqaFd1h^IgEGUk^$N0|r!q0UPZsWdpt+cX)^tGm`bB zm`NNTt(X1eTrkDDjZ=*S%Q&b7>lqtoF^wAXj|5-5-P+KSq01jN@~u<;Kfi;ax%KJG(H2bkBs}* z%*)@AwHdGZru4jPKv9_ZWX{Dr;MvT9_*0%a1bz^Raj74eq4>#7TO0pjV8LxmfWtgRz_O8feNY!B^f)W<76N zXcD8C2{8!F2Ox_;XrnVrr1ohRl8fdua8&5HcqY??Q8B?&$5p|!ouA{;5C`#=H$e{s zgCzn=dMYFoGByI6F;*c4Xa`!`C!rk$Z5jl87*^we=lOlCHd zx$!s$=W*uR2B>^Q@y+MhIFZ#r-ff$3-P?M5+sO`++1?y2+rerUTi2$XgA#71bRvyP z=#_wN1r7aBZar^DFcY`k$QGk7-bPZNB{YXPrs2--#r_GzsVScucYbyig zPq9<%RyfV7(bOgY3>>S)U!*-^a^f zgpk#7Bf)ayjqHKGnHvvtcrxA>;UxXZ%W$2}TuVOBJ_rYY;iOUUd~H(BfXeE9;tsRB zyt?l~mPy1(WBY)Pn>>*QWZ@)Va&U4eHcwA}$`8}^=6c~th4^5HypC-|1E&Q24tC0v zsQG<(zxh)*Vk`w>YY`R2WZl8(7L8)ELymJ$J-5~7tDw*ewfSQlpj+T}f_Huv&uQ!W zy)-3AKgCE-X~+6Ub`eHsb`jrv2@Op%lVC+$WNBzCne2PEwn}Q(OK=r4S!08%9pGw! z>o^x+W_Zq#HF8A(-CT8gD6pbrU<*%a$e6x{T!LUnMVytgjgxucXf#CEMNOd0OUJoN zeBGp{J3Q&Ex1{1m^XF1=qnTXGNy*MM$*?cwB6~JO5a0ZzbXnM^-i!NKl?#+@*Zc6z zf3ZSCC2-hOEp08>oD5CG zHj0J)Fv?eTqop?D`R319gM8&vFgf9%5-xKJmpSxT^38A&wRR3858ToQST_^kw~CwW zv{LP2x}mU)5c&-abXfGOuj$0ytb1=H4ePlVIeBYZiYf&Ul55knFotNR$57!UX?j=! z>L>_>VB%BkEu0`oh61j&=b#-9+cG_#&RI$RG<|S?m}>WI$dA(_>72u)V|s9qr<^l2 zxEdhIh>_1r$f+iHlHoH3t@MHAEP5Fp!fNN6udr?)5$x3VZ_U^(tJ|a?5#4h~EOgUx zgFphl+KE9)=V!#>^+vu^cg#q^&ghvDG~C4tX6B}bLy1yK?BI^kd|!HhV81FuP7Y4I zmnhyJFTYO1`~-`j;7uaT^oz>r;m3zUFYy7hGN2e>slh#tZ*H-@FoG8n>!EZxD;;fk zcvdWU;M-Y#zA{5xP#7528CYhG7(O8*kZ*2hR=y-Q)sC&Ky`_ z6lQ9!FQ)#3mH;(so+fwL-CcyPB6n!QVNb93Igl3#1W|b-!eGs*A*F716*0dsd06E` z`lzJyJ|HjT6;b0zbKcsFadrcn`kBNK!|VO&Iago+W)E}5@g@y&o-+=a^cQ)PC!U_B z{sJ7Q@5ID+vinJ8{y3jGwGc&Kya`0Y#NpVOb%^|&9}phj-kQ9>gEx5zPoz8^6LS+O zifD<6Hv@+F%#Dw*(Rd3_d>x4*ZA4GcjaNyM_Rh_s=hTv`b4QMxbx3|&D&0O!0|ZM9 zEzfzxm1s~XZC*4z?=pFM-aK^c>3La!;Z`OPTwg!LO{{{eEMs7K zF!R#~{~i*TlPw15`EQX;^JgNz`uS1#b9=tDzBC2FqosxCYK<0qNiRa$gPPS?kJ&SW zH~9;Nuowo>m;=SYlPoHjriWwpGil-dMcS08IBAFa3|1l5198Iw=3hH*U{b8x)B+XJ z0GU#h4wiGA5`|u|PgSL^fAC7|!&j)>;Fg$v;GMf2kpJA|vb^yO$0Pi&UWRM#kPKPF zd)R^qh^Sc$qGFGn(TN6ThCknY*Q!VJecUmdA3{QR|fAkLB$Jfpk?ka6< z65qQEL+H7C2~`;2Im8idAzu}Sy2v_^S&Kq7sdg+WDh&1M?gB4(Q{&a&3SPW8V(HAQU~4G=Y?c=JKhE#=g0~z> z_t}1O10C@vvy7*wHaQv^a}=BPF*H=Lm6N|N4qgPtpAJ%;j89Mf%6Tkp9cyA(ANkBQ z`NA&X2mk)C$tY+B*v#w6hRj|Pg3evt3sJfxV8HtxvZC)~EQE(JOS@x!5P=dSBxfowq&vc4kGGKX- zzvRe&_JNYd^aDhl(}n{v>1Gp3GL{EMAAZ#up#MUHh=oDJ6&NugJ^3*Xqk4p3;lP%dmv2_D`x3Ly7gyv^Da5!Ubs1D>q)+9Z ziPUikSl_gN;{=~*O*~6W=|z^P6+D==2blG(SB}GY-jpS1o1vaUG0We<=Y(bOVp@XU z9xL}{95az83sw%AfK>4AdYMFGf&&o-{w8&9KsCz7Wks9>`o*1jaWEt#mTeIDAm~;G z^Za&lX=QN6#w|Kd!xRm`?_;_ydMGk9tuePU)Kwf^RHEZN;3=t_EoxDQLXwdU42ITO zU!aAoN{<5}0F$*xz2CB`X4xqedGMA+LXjF$qUG<9l2z-#NcUDP@!!Maw+L7umm*mD z7GYNbS+e@?)EJVxCMY1SH7SW-{plup^>_3dZ+gumdTlJdHjNn8Jmo!xH|5H=9{hx% zd>r|oH8~NbYvivR@K_d}Y*h^Fyf?lJw^E6Bc^XMxJ6WCA#<6v^hP6v*de_a`rgaY} ztTuhML8?97-LQo6uAThc5?T`pAyF^ao{kkQhpI92d{#hn8`qNjLL1~`9eh)V*c$Vj z1RxupzrwilO`V*k3r6ljM-^0_Oy8zGeFaAtTC!sH`?&l64 zF#7nI8YdcMp0xtVFY=wB~b4r ztT76AMAjWhamW)u0861w!FE6sFe(Yt!nR8oTBlIgHOj(7iEX3eS4mK#XkwK>s}q$C zf)ypUA+H7nD1?ap|8YjB*#AJJPsqqj%15!f+9=YCeism%{jEK?jzytfCqd*+KpK0!>eC(&+?Oe$Ur{0al_ z)&C*Gr*MGfK|cM7GA07l1A5@_AU~qeBM6{HYBmud#IQX=@41CCxB`PM^pj8Wy@n!l z)E{*QlKa>1`@!&2U9?}>PuD?(b1Pifi0SPHw{tqY=4>snYGV{xxB6Gbn2}~v@~tPp zuZAgpTEs`A_$xfyM3f$PQ_MFMxje{kYBz*5h%ktR7e7sJTS4^2#h%;Yb*PHQCk;=c zDT$$rAtx!xcFBS=-TExDtwc-bT_#6M#;J=xWVWUdu_QrVd<|QX`sdUo9JXH3KbLO! zpfyHQ*2cBQc$dNI+w?(6$%(-y_zzx5&B-z7^?LX>;2(c0+rBFZZLiRVdNRfkhCho9 zGp8Bq`CF3(-!79Y+W? zGG?IzrpKT+98t5K8P>c3YqKwYHP05gHi|7*0ap+IpBv#$>L#QjD|3S)>Z*w@^QdRL z;7P8OO?8pyL!x#JwKeDL&{~_dyLR|fE~+by^bQp{u_LJV{VBBeikt7J(~$yY9r+ppK^H>Kd~Tp_9SABG@xQHU9qF~PZebpy{n)$ey@?PZLP|q$fEtv)wb;) GlKsEhbK>Cu diff --git a/tag_fw/fw42.bin b/tag_fw/fw42.bin index 0d14fcb2fa2dcaa0144561f3691a3a65214376c7..2152652dfaef7cfc42b8865f2ea8f15d2ec219f7 100644 GIT binary patch delta 12517 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 delta 12373 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 imgSlots) nextImgSlot = 0; curImgSlot = nextImgSlot; + pr("Saving to image slot %d\n", curImgSlot); drawWithLut = avail->dataTypeArgument; - eepromErase(getAddressForSlot(curImgSlot), EEPROM_IMG_EACH / EEPROM_ERZ_SECTOR_SZ); + powerUp(INIT_EEPROM); + uint8_t __xdata attempt = 5; + while (attempt--) { + if (eepromErase(getAddressForSlot(curImgSlot), EEPROM_IMG_EACH / EEPROM_ERZ_SECTOR_SZ)) goto eraseSuccess; + } + eepromFail: + powerDown(INIT_RADIO); + powerUp(INIT_EPD); + showNoEEPROM(); + powerDown(INIT_EEPROM | INIT_EPD); + doSleep(-1); + wdtDeviceReset(); + eraseSuccess: pr("new download, writing to slot %d\n", curImgSlot); // start, or restart the transfer. Copy data from the AvailDataInfo struct, and the struct intself. This forces a new transfer @@ -643,6 +656,7 @@ static bool downloadImageDataToEEPROM(const struct AvailDataInfo *__xdata avail) // succesfully downloaded datablock, save to eeprom powerUp(INIT_EEPROM); saveImgBlockData(curImgSlot, curBlock.blockId); + powerDown(INIT_EEPROM); curBlock.blockId++; curDataInfo.dataSize -= dataRequestSize; } else { @@ -650,6 +664,7 @@ static bool downloadImageDataToEEPROM(const struct AvailDataInfo *__xdata avail) return false; } } + // no more data, download complete // borrow the blockXferBuffer temporarily struct EepromImageHeader __xdata *eih = (struct EepromImageHeader __xdata *)blockXferBuffer; @@ -658,12 +673,11 @@ static bool downloadImageDataToEEPROM(const struct AvailDataInfo *__xdata avail) eih->id = ++curHighSlotId; eih->size = imageSize; eih->dataType = curDataInfo.dataType; - eepromWrite(getAddressForSlot(curImgSlot), eih, sizeof(struct EepromImageHeader)); - powerUp(INIT_RADIO); - sendXferComplete(); - powerDown(INIT_RADIO); - // no more data, download complete + powerUp(INIT_EEPROM); + eepromWrite(getAddressForSlot(curImgSlot), eih, sizeof(struct EepromImageHeader)); + powerDown(INIT_EEPROM); + return true; } @@ -707,14 +721,24 @@ bool processAvailDataInfo(const struct AvailDataInfo *__xdata avail) { return true; } else { // not found in cache, prepare to download + pr("downloading to imgslot\n"); drawWithLut = avail->dataTypeArgument; powerUp(INIT_EEPROM); - downloadImageDataToEEPROM(avail); - wdt60s(); - powerUp(INIT_EPD); - drawImageFromEeprom(curImgSlot); - powerDown(INIT_EPD | INIT_EEPROM); - return true; + if (downloadImageDataToEEPROM(avail)) { + pr("download complete!\n"); + powerUp(INIT_RADIO); + sendXferComplete(); + powerDown(INIT_RADIO); + + wdt60s(); + powerUp(INIT_EPD | INIT_EEPROM); + drawImageFromEeprom(curImgSlot); + powerDown(INIT_EPD | INIT_EEPROM); + return true; + } else { + powerDown(INIT_EEPROM); + return false; + } } break; case DATATYPE_FW_UPDATE: