From 95d5aac01aa6e5b164733f85075c648a4abb7eaa Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Wed, 13 Nov 2024 15:12:26 +0100 Subject: [PATCH] add support for 3bpp ACeP buffers (7 color epaper) --- ESP32_AP-Flasher/data/www/edit.html.gz | Bin 6475 -> 6622 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 15744 -> 15881 bytes ESP32_AP-Flasher/src/contentmanager.cpp | 51 ++++++++++----- ESP32_AP-Flasher/src/makeimage.cpp | 79 +++++++++++++++++------- ESP32_AP-Flasher/src/newproto.cpp | 7 ++- ESP32_AP-Flasher/wwwroot/edit.html | 20 ++++++ ESP32_AP-Flasher/wwwroot/main.js | 22 +++++++ oepl-definitions.h | 1 + resources/tagtypes/05.json | 4 +- 9 files changed, 144 insertions(+), 40 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/edit.html.gz b/ESP32_AP-Flasher/data/www/edit.html.gz index b94cbe016d09abbf66a2650d41979da8494c2c2d..c033395264a8ea5d89fa571a9b5a5e1984114ed6 100644 GIT binary patch literal 6622 zcmV<486oB$iwFn+00002|7B!pbS`LgZEOJTJ!^N{#&Vz4bNV0FaAE>B2~v{n_)?&ik#O}=O?7VjN1@GSL z^^Rvz!Qj7g##t5zQNm{BJZ43@$S0hoQ>vKpCF98?4SC4+!>CO2-eGXY8J~}Nh=qW5 zbolz<;7HW^lPqJs-rm3d%kI5b?_M7NbhuAsv4F_OL2@>7c;Y|_mhm8jUmLq+RK|R7 z|L9OQv)dOXSQkghCzkVga$ zR1?yDp2l2C@Z+K=qv<7>AqX%5#T8}F%gL-kBucVH+0c>g0cjRYqVlq?UPS+_?F^aB z=Rr)i$^ORkFi3(f`!tc2YCz@Wh!}zF%oXc+F4Zc9vJq74DTWjGHC{2@Y5J0)hvSGpBVkCs(2hnSrHY@ z?qFZry7Gj&b7z5@^374%Eq=1Xw`GvNKcPP+-u*=ur$MN3R(XaQAah}9ZQ-(IT+n7( z4;vfGWFJ4VO?JE}OKq+#6gmB|2dT9YwNk^jP=g(YHZ^jPWjx4(WYQ9e%=lqN%_;p^ z!A>j1hFPrO$87mT4EpFQ&S?u9jld}sn+4@;9kkL4`GRE_5Jve;jN-|lN*F+I^LE3K zo(MUJ-M9OkvLG5X?q@kakNCw+TGcjFv&L2)s#c|fdZOIOY-(d!jg=N7)K;u@S+nB% zH}|XUr(aurc|7>qQl&*n=X0Bb!C+vU-LtAg<0tr6RQDgU?{a?09`;QcP}2s+_T#@i z3&$GcMZDlO3?~0BEef=guPsw}taYN}K;<<_G!KNhiVQOEt%6}R3~~sI(7`rmO;tgLCDW!`YCB_fPmK^Y(KS8 z#K&%*5*d-KPx2@$DIJI5wOM(=a)w`y2Es03`%uX9TFwSpE4KS z9_A=NzJ2q3S!VA!paG@PXv7>aM-I~9q2oz5>riaENG2#p=6Y36F4f@H^}qgvdh5EYXqsnM?kmI zKIErkZ2{-tM@uk{-~_NwcNjij!t+=>3m{3&b(d_HK^xCmZ<7t_c~3m!GAsPYZF;WA&ycF7g*0Vo8ZqQv1Gd{Wq^C#`m;5^gyQ(D{&> z^khSY!N*|va_ladrGqYOolN6Z;H@Yzyd@k^mWE9h#c zrkJ{4LiDu*tE+HLNIy-;tkDelWELc6=&I5|Ou#Nm&a0`hDHkPDyN!$|20W4S7kLal z2D<3tx?2`r!C^%9Y|Y=Qff{k4X2V#H${gK7>8RFtDFydEM{{?bmtuXRhw;qmG6yCW zaWtVMslV)9TwL@pJLy5Yav9TE)2+;_6o{Xces2_%5w^r2;mTEL^w{bMT>&d|c<_K( z92k*o*9>G9P%y>;td&j3w@ogU)JfvPSi4NcI6Jb7Xp=39nfn>xhXP4Z7&1jk5E(Xz z4fQW}Wg6o>TQ*jIjBuwJsD-;LD}z*nr^G9yH`T^ASEYzmYC-A40Zb1+$QixMMJ|DM z$a$BEnU>;@l7M-PE~+A?Xm$!i0fczWRU9!BSC%B}{3uCy{{8XWHvrXnFA?5EMcEN> z5T#|)o{#h2Bz!rG;?R}&p4lGFPeo%i%~fq-xepTzOmnF}JuGpIN;$C8GPqez3rSF3 zho8hjQ6QH-7?A5!(_^bi$f$!wT>dSHDI;9J~sBQ*!EiJ{3*w$b@qYB>Aq+Et-lZbed49Y6I#*~$C$c_b2PhL8h zrd=aWfokzs1m}FE-c+UJQ$0HMT9a3H1jVdV1Gx*g3R&~3Llp-2!?Y+5^K`>lcKpvKK0<}gq=`|sbsdw+syjD&)$<`gm{_-;#WjdTfvqc20#A$T*n zw118Pz?|IIBdq|n=2TOeMaqz^l1e>_sd_0USA-}SZ#+Hc5;0#ysKXD(IMDae0pN$i z?yituZSg|7w)EXJnLxJi$(n+3&Aibg?K!3ZHiQq-I@E_eUIA3e4Vr0(xvGT%ZD8y9 zlg;xbpFnOp4?uPuM3oO6gSs_Pt*3ee#Vdl+Y1h+36BS_@yHwOBOZH698v5^MJTw?| znbG3O;IxZN6pfJS*@~)}*}J2=*cmY`Mjo+<1&m|c_F$xdO+alUYWi|z4rw4`H4(VI zkQ*~`W1O)CMPuqtHLF}9GQcy;`Vlj1WHf^00HYExLIdJ+aIycuqr8q941U!URC3udL?|W7W_;6a7>fJDj*`V!v74EMP8cuNd z=|T5K&R3t|>&iL(wOSssS4*@m%}n#x-HcH<8U2EhEWr+Z zmEsxX&v1jAsIiyW6Ixr4fL#XJ07K?kRI=a<&w5Ssbl$|>?Pq(x>g6$O*wBlQx~zH&SFE4DfYRf1?nLu)*PxPixT zMC8>glRjty7t2IO&PIDWJNIed;>BV*#np{E#+b?x{&U6e#zt5rOdq18eD*R9<{1ya zMN$&SSj?6h6>fSW`hV*G7Dr>Y#|E@crKO9M3l6yow7NH9tytz7yynIBpiHDrKLfOj z046tAW=~F}P-%0tE0y4jozYX=8fkDKAsgii2O{AKo~t{(P5@#*Q%LLUEstHxidCWk z2>e!!?Tw%{%b4^o>!>4lSvQ~2E^B9pRfMITmbix{(LrmpK)Nj5&Q{nl#Vnx74P|}} zm~yx6wJLSj^to<9sK+Yr#I$pjL#XuN8kvkUT>fX9Pi=#ej2D|vUqqM+)Y@$~2=;K5 zML^A#(G#&ZfrCi|vqr;7nhxS4y^)PkU&Q} zO^p0(Y{8P`Pc)rVw!6!odF*#)m*a4G3M6aLmL5P8O7-OGC&;OK{oRo+P;~n%lCP+q!#mTeaqpVxwEC zaIj5#bPA&q?$ryxuYrLE9Q9kRV7pRBk5q%FXh!Z6)~o1w%BXBwsH&<>vP-+0 z8+J=AO+8@lV0mzWO`5HNWf_!vKpEWFCcV+1COih2-`uvjx7oh3J7F8EVH48fEBiXB zx^sGBjholeQO>-A*5)l~ZLOiTbxT@pUMUqvV2>VIHCJn$*Gj&mf2O2__dHa_rp72p zo2+3K7_!DyvT_XnxS@R=ARF2q+^}=2_STW(7LlRh?Kck#f-Ng7VeotgYWmo8JuTRq zxg9y%Cb`x(;2s}6uR5dyW29@ir>49X2TC{Vu2q}Z-I1OD_t#tc>ng7_-4V0eY*AJz zt!_!&uQ8;4WlXQ=1f9$AsGOW$nbxW%k5q3_(7*rCod1WEO%{316Ixq=Y4QRl@N&8j z(|VXJ`|PK5f$@M9!Ia0BEac#8a@tP|rq*ovs`b1^8#A3s{@ z(l~)xytsU+ma5&(WZv=gpoEdlM$7p;J?Em&JZ_$Gs`A#Tz&*sbXrqY9F8`C5>{8n3`J&=4$9aQAAgUQ$bKVsJ7wPN=86x!HCCJ zxlo|1OGUz8BNW`a6Zn6INE)H6n57qTeMUsHbK0ar*19kyrDFnSU<;#j3Etd{66YQ! zc^b#ZX=a|NC&sFp=PPT5RgL-~Wl#Y%8hgX1<%-s*>iO!bYuiI8qrq4-MN;xX&+zpl zo@{7?ElCC@=uaB7>P96{YYz{#+=N)au-gEX+|m~ekJ)l1q~H}lEjVkStB~Y?r^A6M zT+5?0hG`*UCNVNh$rowwe`19JDCZb0kl%BC%g*Xdn#|Kh!P7;#%Kd0tN^5Rc$OgBj zblDzG8AxEnsAtyx1Q;kJs|XN;;N+rY?Evu?cj~58b#Ar7$*XPXH$0fS!ntuntIO~h zmYul(L`$%QQgK*GreH(_5B$ij_P#T8Xrob~=#m-&<^1hv+88F)Y!aV9evT_Nl^Rz}Q0-m9?g=jpEkk39Y$}EYG?%SWtBq z7r4kClrJtzUbv*4I&h6EEL+Wy!m5}ekZT61T1q9g4^iSxdcpITLBUXmQ|aGb@ezHuMt9N<~6#DP+Mj%Nc;c%<23o@T)r9pA318pC9l zNrvpRW@QFzx%s5ev#ZzvHE*(516ct4;>ALQ7NnU*m*kti`qLq6_ndNi+}Q!#J4GX_77L zfExkXXWCdtWlLfa5!Jal*m`UghI33~EYiDd0A4!46x1xY(9mX(iIdKYPM38)(dS$G z{Ej}4>GP02_v!Oz`uyod=hUJU*}EC^6PJ&uLmulhUGmBEZ28eqngfW%r7Qa{p|kYD z{RFcF&w~(t5G^_6CUcKgVi+#Y5cen1=?dY4-=P0M*vid0N6C#lSjM?UaUsAu{CCqs zg7O@nzM)BNfRqwC!?ttXvW;MH<LvKbsanyp4G+fZI%b+o>t#_AHP~q2H43t< zUX;xmMKiu^ww5*!LtYiBU}RkUHMDGA)UB@Qw5YwdO8V#NJxk6Sipd&9XHi2f<9SoU z@;GI!7*Ab(5&4Nrbk%WuYf!i3c!!LonP(Vl3s;Tf$svzlj_pPpH?-GYS82JgQt9Sy zS5_Li6PZ&iP8r*4!;rs<(FDb?a)Ed4=7X_-s80@miMuZ5O{?Zzgjf4-_K)}5ZzBku zXnb#l_u)yfu{GL%0Tqs{D@PmcIfZc|*dpldTq|ib%@r)0;=xe`_#4%dKeGJY6@#2|P zWDVfSKX52r!Rbxma4^0ZWHWOpTFTmn^73XGMoS_>35H^?x{A;~EFqZfF@_b1dzSSV z@5tMiPM_Y&9wyw!2Yqj7=bv#!l-+5hy=rGg#~5+o)sAz2=n5YK zzlhVZOQ%&&F|gAieIe5;@48X*jyL$OTF0T=NZh(ew*JjC>#zPa?)0>dyK?=v;Np6| zd(Fk(I=JK1uCq>J9^~Ryi?IUKE*2Mj>O&sibYR9GLnd%=Xl@m5i(ivp-5cqV!ILh7 zJ32>zNql0L-a=;QI^ahAIsDQtDoIvdKgLiX04XXEB>l2MzakYJ(YB#@r^jpYrnO58 ztj@-Vf*+;R@;De5uCX|_0vf=MU`p+7HQ4+1>Tl6A2q?B5nnfYSeXMsWtSWA+zodcjZ-02;YC@mqXCq1-^r^^Rmq2-chHEXOQqw zfI|tBuOZpM#KU|MiGAf#BwIRgbPYucbEFsVI5Lc=6tSzUD+u2u_@ZO#pZSKZoA(mJ zdU~T?{@m#0&o}R7o2udA12q0NNMIhELjkg4sp`x2H0L+$=@GtprKP{B{LA(l*}8MD zs3vMLLU+yMr+m+;--DO>O2h`ZkXqMhA>$zDf^2bA_o*S7Nmo+mIWLw_qmnJXL z@bV3wKQb>|!~eLd{`qRhc-u`*Z}gFu#PI4Vodm-dy@R=AxHj+hPo6(GeFRgS5qxm`x>vr0_$JM~{^@Ka( z6`lIUobnx=cn7lsvhRrVplAxku-~7A$;SdO%r3%d4AW{1MSXldSwD`(MITLR)8F!+ z;x8X&VdjhZjd_?5#|&2n%8|1ur@d!*$Fsr3UhSQqDoJMTNxD3mgzS%2y+*Pl0Mzz_ zc+%JDCEHeAP+TSx`z1u0HvS_9_B&n(r+U++(W%|O{3j3KCmt>VFAfx||EfV4 zoudZStNr8|Vf6^20ssq8+fhp$*W6TS|l^CKSmfDO+yp|GqPW2LY0j9XH*3&Tbx(2n+^;d0{XBxOb=5 zJDEoXgMa0mvn&pxgw4xE%!+iGPdH1bR59l(#*;}J@{k>dQJLnwqhQ7vUyON(h0yHy z=+(=Y$D-DsWEt!A_W$)?_U^oRdvNm8(IKJ50zw}L$!z5C#DNkl<3R|&w)V=XjQRfI z@saFiuP;ilE{>9qEa&mai6&{{uzAj>BPR^XVAypCq9`w8&dSS-kDQXP%KoG%9Jb(L z6pWl=l5^4F)|Nk6uuu47>-S!ignTt*4+n!?D#_9!Dx)+RvS3`K@v`KiJm%AK$R1}a z@ixA(z~`?1U9rUGTAit_A~BI_ zM0(8Am`e_RSQce8y#zG`1|}f5qRe?YnKzI`NwzE-GO{fo&4Ni(Ue?8n%|B^9Ln8A< z5R-1QfABmElAz1J&7&ahvg4X&_7>^yy(JVtVaz9`sdb>S zb(tgaKKhe}FzD~&O{%y_$)qmtXkA8s)C=Nh25g=13WsUU{x)AUshdVIPl5%nQ;7UU z8h8FAjlr@^B`q;}!W~&Vk4oMH#h#GjUF1O~)c_QJ8l$J0N8tPuV|-N=kK-sSqM|t* z9BbQ99@B7c&2W>yISRYQPS)7AbkcVx^v7&>cbUa$5b8GTEW>n=xzMyWciA#8Xf>_7 zjV-0Jj~?49J6@KhR@WAcoc`F8)JBh5iQ%CTgYAa4b>kq*c#sFlq{S1N{=@Q`Q~I-p zoK}ntwOB)s+4HHG^wCtDvlcQMj#CIW3(EN>XeAZ01xqo&jq;l)#p6L0Fo4_^?TR5S z5n>Q~Y8(co)Klolo(&utF|gMqDfPpbiqALCz9-M`Pi%lRd{-#2+cT^lVPKKk3! zaI9NAkC(jGLNWKV8s$M4Eeq6>uPs%0q-CQ0KxH*ava!MefM^2b&QCRt2j8V6UJmO;tgLC9w^{FFGhfWaFYJbYp| z5g&Vf3S>mEKFOo3q;MRj-=bt+u@MW?$#Ma+qyOJao?jl*><-I`F$mRFb%>M&+hHY+5e!ge9Qj z-%c<{{qgPi1CZi6Z;I6--tiID$;pxb#2+}`F1uor0HP}9azMncZiVXMpFtH(^0Y{& zrNXuz(>zZv2*qKZr@8CU`fm({5KaO6K_!y3WW_Se(!8uO)_0UZO>NR#oN+f$jFhx$ zdCquw7<2sj{PI-@a0-LbezKuGEZ#t^BnqRsg#e~DK>v4s=>~ZoTy`1gc?}^|_z37$ z(ueqTtTo^q>}Unb5u8Hnvt5SIm+(9m&jLtdbKMo&W6;Ml*4t)7dfpe$_&D$szYKcu z2jcvXC13JTau#^srj8{D2TcLo#)zHD&Z#h8CJFdeY!$=>H)=qs<{&btNtSV3vANct zpMj;OXg>fcdiymOl|zFPD5`A3?zqgCvR^XAI{*p}s3>td2b&bS=}E2Kt(aTR12jIw zCN0?zVelbX9gN*omxa1t#qAbz6f(f${}AfQi_!w&2f|jDv9G5GKAj!3<9!6VM_8PIQADo z8B|=wh83(ta0Nks!P$B|N+T2&m@t@&bbw)D2B~UQlW!(Gy5ni~W$eL7bhF^)JPifF zcZVkq+Me^w0qb)rxgue9TjyR?O9djm_5R(fgLDD1MlVC&;{kI<4t%!MSM-u=&;q*J ztqG=Xm*9PE$LgxKCZwMxq}Hg0d@>J`8Jemz5EHPAobzg8Z1P31)b1nWi2+Zj{AC`) zhygE}xE_|(uHY~ud$#01tAiSHA!b8aj>{a)LdmGsc_|t9Jx6tSodc2I=%GJzy3B!v zMI22iNb0Y87Z(>jj81ycuS{b)8-|s6l>qUR!tbquBEl9QBuu$-jUHR?p(|je4)^Xc zivq)w?U|0u0t&`Bfwhte@wQ2&;yQ6$C~KD~A7^`Z;cc>IF?T;9{7^I!7=}z?5=e#( zWJCRnU75;w$L5VS9>d*f0&4E=%8DS>o2x>^Dzu>R;Uz2&-^&%f%S9}K zddPW~iItY3kAi?jj3%l)rs#GGQvtYmj8z=55?7ie>-;E5c>ev#o7Vuuze#v7kK)jk?LD(UTAzx}Xql_}!g3!L7#QZ#czRgk7?pBjr!=@(PKhKa zuftE`peT?^9~8)Ss^ziOB}CN0GA{oS#1xS@eP{ESu#q(&ktS#v5j|+CX&rA?ETGpY zi@9x0qD~D7cLJz#h$OYjT~yg(KOl9xM&P2M#Dc3r-J8z% zwJ=K6$cL9~ z!?bJIDVka|7Qs1RD>qds=~RzSz1F0a9YZne)Ie@St!k|4)vgL1{83tzM|nEoMWG@D z6^vS;s5u1*0CorEIZ*Rv5ObI)oWpnT-o87z-DCT5GDQj3TAWRzann#Zl%r~B1a|xd>Jk-(q6P)P#XaMj- zweGIrUoCkdOF z&*a8R+?Z!TC`$Y+woa_9Eo8zy3jM_Ms^dV zo;I(6t(1<3Q>k;Unq?&@30Z3$=O6m zZbOzw4S^U16?t&sus{A_>KXMA7Gy?VAm$~62Wig3lVElNBgfShpbO$-C=F&Dlen)+ zzHpsV0#vJLY+P2&{{8sv511P%xND=d8Z3f|WSd_s#|5qUU3vsdDqrD7&fBTm>37h3 zYklr*l=2y;@vWl*`V!v74C1~8cuQg z>A~&iL%tx6Bs*%B>FGt&HRFJt6RM!%pZ`Ni3P1@tW37!uE-k_9t7>ov{OMYHW*KimIJr^l>mLnj}}JQQ!d z&mE2QJSA0&avG7*up(Y}t(ecHEpzMM`myHRg3rgDV;RMES&6;=V$`zR@&9>l>S`ON;Ck0 ze^zJvBk0XiCcVo#>d0Nz?WeTM+Sz3lVyUMk?qSL1AT>&mu1dGF6Lw5C3urP!8DB$7 zx!d+imAV_oT-P9!V- zP_tu67dNTD>q~p<<-JOdB?C-PfZI9h! zgVpv+54(Iw+n}oQv8Wq-Lv`?UA5XbG+`XtmWgXu%Myk>2yk49+;@I3=Dj)Wt-5KWt^;!DsUh9@{C;v z$n?3OEgec_(Tc|^-D}lKH-qPWPJ(ePX5X3#P;H5|*O`_vs5TqXO+JVwAE3!o_-X)3 zvWRSLPB7S~Ab}5-n8?{^#@5knSp#>4ZAE7we0Liq?|#F2?1Sf3JN;m2u7ZQkH0F(M zpmf`_$*M<(wA)E>F5p$4<0l~+MacV_n%rg{E)KAGS6Y5 zLNWFf&*`Z(1FQ`o;`Z53=@R_`D}pJHFIfm{nNqGDDC=T{+*hrezHP*G_8>H7MGng# zk(|JfQAZ{w;Hz`**U6X)fQj5s(hC>Ya~+3Kv@miO!Af2Wz~g4S44>tJI8{KWLg@@M zQwQF}v0#Vw_dE4nL^}xrgNt!f@C{FvE~gz*BNKv43p{-Y1Qj z^X!FQ<&M+v(m2LdJik0p`7XCJS#&%-DWPYxo8^1~i%T(P9ybq4R3}HG0yiQ)Z}@ms z=$2!zrSAVp!>=?)W$$jFI|@_*sOL5gsbpe}OS;K5Y-;8s&6LVt$f7I5sK6<`toHIY zaz;RE#)!vOzL2AOj!GxJz35mwbaTU#@%YSa(Og9@n8*=s&6*YrkJ&(>F6+aE$19mb+7 z;*t+?hOZxSd$bLzhQ;1*OsGD5XvDF$QulBND^I+-< z3dt!3YVS8j$;SeP`&82A(fOqc!}5P1vEBl~7!fdq37g7Efnk1cO{xU}S@c*|_>O1$rp2XHB&gD|_-rELU(Yg0FL2cdGk#`?Fu!nA!pz;?+- zyVZ>^b5S3oha^%}id!FA6Zcc_*=RTqrA~`loT9cGH2V3M}!Ev z^{@{%TXWW@xQN7sO5^A)Zuo<{b;?!g4DF(Mxo9bh>t!E`dI`R^rdG6SYX@_6y=9tA z>t#_AHOOeRYZPQzy(pVEispRP>@96H40%G^d<3*Fh@=R8(7>{m!5&nsrIMtb6Yf`uPc#DXo8D|)|g{#IH$B@SdW4qJF zHP4M_-dhg6SF*X?x%WowMCufaql$KJ7~)qkn;;w3CU`e)J{So^ef;oC9GEw+Ycvlu zzc_q-cyic&q*=&BxA)dqA08(eTeJNa5aGzWx3JY7Qy9kzErj0gwVX!PTtl+S9=s}P z@a7ZEOhd6UyXv+Ly~d?Y!MQTsx&2<8+EP-y`K&sujPmHx8`HXYR1c?5I-90mx@3su zH2}TL)5S|E!gj?%RCEUnU-#zxi9@wtXx6L~#KypfkGm~X&5a<%9C$ONI74elnw;AK zagNq-AA<8hyuD%_S_63UD^8_rD7`5hPR2KbY(@@6OIh1gUfwLiXbD6pz)<8>=b785 zB?PlA#?T^hS*!l`4ta&k>C>xSd?BW0V?jXst3S3Rb?a=zTT2pITobJ<7B}l)>B-wD zs$%9Aip;Bdv>>lILpZA82!VUdYGE4hm2u}yETHhB_=NlTpf4Zn{uTGk*sW&Tt9DYf zj}fQlY(Mv>?g1h2^Ee&5bmZ*}9Xp-$6+FH2uA4P)c@5~QbsqX0j$5};Hov}N^ZkLw z#emj%SLS~UF7Eic*W3=QgF8;`PTVBsK`xHQ8yTQ>wzyzZ@ALSk6Epr8GSLR7=2qsm z*frVJospgyJZUnxqjL-`iB25S8;I;&2h6CyfM41~CCX~(C+G?UAbACXq+d4ZS0sXC z+BOs~26!c2*K}!t)ya5Y@Z)q^o&@8 z@B!fQJiR!|qojO8XKP$qNZ3#lakY>{qwX9^si6%GnRNlNEAM-O`~Ew>9D?jF@I`K& zgEEhM$DJ;oLBdA?4kb*!%U}xw5A$sX_Ps3;Y-z{QH3TWtk>1|nNH?NF#IDk=AbgwP z+fr$K=4*OxK1y)w>5WGDb7Pc0-+Yv9qK1d}(D|Dnfpu^W1xSh|sxLdzoZoPy$N2h& zmhr0cFFR@^>(--|yIj^PxDhaax$AIk_Zn|@A#T$}GGjZVS$eam=VqbEpLdyhZDdAV z*2+krZFx0VnmkX#%h!1R$h@@)|1qon>1x+_Wkyb~1(7#R@ctT|1jDyQgSupxn|J%C z&+eT)fF;fdzPu6qxOaBn>(8RD`RWvUe^{4^+rgma*c-j+2hdaDu71;r6?s|9I5j1A zsktv475x+|I{InO7V5I8MnqRv9V~M6%~kn!%H~^59QDRhr}ko#-Fk4U$!SKYMwJTmn`i zZvL9qvMXMV9!BRV0rh?`c}7@00;>SP0@QlcQb)SjQZ7}!rACFY>RhinsY`FBG#f;8 lsTteY*PLa;j@7UO4MhXu2J%2~qc2}J|3BesTDsw0004Y{folK& diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index c13005c6e2cecb514d92af1048cdec1b0e898358..d1336d6ecd88ea371607c04b2831c3b2c4c39508 100644 GIT binary patch literal 15881 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 f{N{Pi`ITCt*daHu^~S5v$Bh36qXxb9N&f%M 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 (bitIndex + imageParams.bpp - 8); + uint8_t lowPart = best_color_index & ((1 << (bitIndex + imageParams.bpp - 8)) - 1); + buffer[byteIndex] |= highPart; + buffer[byteIndex + 1] |= lowPart << (8 - (bitIndex + imageParams.bpp - 8)); + } + bitOffset += imageParams.bpp; + } else { + uint8_t bitIndex = 7 - (x % 8); + uint32_t byteIndex = (y * bufw + x) / 8; + + // this looks a bit ugly, but it's performing better than shorter notations + switch (best_color_index) { + case 1: + if (!is_red) + buffer[byteIndex] |= (1 << bitIndex); + break; + case 2: + imageParams.hasRed = true; + if (is_red) + buffer[byteIndex] |= (1 << bitIndex); + break; + case 3: + imageParams.hasRed = true; buffer[byteIndex] |= (1 << bitIndex); - break; - case 2: - imageParams.hasRed = true; - if (is_red) - buffer[byteIndex] |= (1 << bitIndex); - break; - case 3: - imageParams.hasRed = true; - buffer[byteIndex] |= (1 << bitIndex); - break; + break; + } } if (imageParams.dither == 1) { @@ -226,7 +243,10 @@ size_t prepareHeader(uint8_t headerbuf[], uint16_t bufw, uint16_t bufh, imgParam memcpy(headerbuf + (imageParams.rotatebuffer % 2 == 1 ? 3 : 1), &bufw, sizeof(uint16_t)); memcpy(headerbuf + (imageParams.rotatebuffer % 2 == 1 ? 1 : 3), &bufh, sizeof(uint16_t)); - if (imageParams.hasRed && imageParams.bpp > 1) { + if (imageParams.bpp == 3) { + totalbytes = buffer_size * 3 + headersize; + headerbuf[5] = 3; + } else if (imageParams.hasRed && imageParams.bpp > 1) { totalbytes = buffer_size * 2 + headersize; headerbuf[5] = 2; } else { @@ -370,6 +390,23 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) { free(buffer); } break; + case 3: { + long bufw = spr.width(), bufh = spr.height(); + size_t buffer_size = (bufw * bufh) / 8 * 3; + uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size); + if (!buffer) { + Serial.println("Failed to allocate buffer"); + util::printLargestFreeBlock(); + f_out.close(); + xSemaphoreGive(fsMutex); + return; + } + spr2color(spr, imageParams, buffer, buffer_size, false); + f_out.write(buffer, buffer_size); + + free(buffer); + } break; + case 16: { size_t spriteDataSize = (spr.getColorDepth() == 1) ? (spr.width() * spr.height() / 8) : ((spr.getColorDepth() == 8) ? (spr.width() * spr.height()) : ((spr.getColorDepth() == 16) ? (spr.width() * spr.height() * 2) : 0)); f_out.write((const uint8_t *)spr.getPointer(), spriteDataSize); diff --git a/ESP32_AP-Flasher/src/newproto.cpp b/ESP32_AP-Flasher/src/newproto.cpp index a2edb8c9..9fd3cb3d 100644 --- a/ESP32_AP-Flasher/src/newproto.cpp +++ b/ESP32_AP-Flasher/src/newproto.cpp @@ -273,7 +273,8 @@ void prepareExternalDataAvail(struct pendingData* pending, IPAddress remoteIP) { case DATATYPE_IMG_DIFF: case DATATYPE_IMG_ZLIB: case DATATYPE_IMG_RAW_1BPP: - case DATATYPE_IMG_RAW_2BPP: { + case DATATYPE_IMG_RAW_2BPP: + case DATATYPE_IMG_RAW_3BPP: { char hexmac[17]; mac2hex(pending->targetMac, hexmac); String filename = "/current/" + String(hexmac) + "_" + String(millis() % 1000000) + ".pending"; @@ -445,7 +446,7 @@ void processXferComplete(struct espXferComplete* xfc, bool local) { contentFS->remove(dst_path); } if (contentFS->exists(queueItem->filename)) { - if (config.preview && (queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_ZLIB)) { + if (config.preview && (queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_3BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || queueItem->pendingdata.availdatainfo.dataType == DATATYPE_IMG_ZLIB)) { contentFS->rename(queueItem->filename, String(dst_path)); } else { if (queueItem->pendingdata.availdatainfo.dataType != DATATYPE_FW_UPDATE) contentFS->remove(queueItem->filename); @@ -966,7 +967,7 @@ bool queueDataAvail(struct pendingData* pending, bool local) { } newPending.len = taginfo->len; - if ((pending->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || pending->availdatainfo.dataType == DATATYPE_IMG_ZLIB) && (pending->availdatainfo.dataTypeArgument & 0xF8) == 0x00) { + if ((pending->availdatainfo.dataType == DATATYPE_IMG_RAW_1BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_2BPP || pending->availdatainfo.dataType == DATATYPE_IMG_RAW_3BPP || pending->availdatainfo.dataType == DATATYPE_IMG_ZLIB) && (pending->availdatainfo.dataTypeArgument & 0xF8) == 0x00) { // in case of an image (no preload), remove already queued images pendingQueue.erase(std::remove_if(pendingQueue.begin(), pendingQueue.end(), [pending](const PendingItem& item) { diff --git a/ESP32_AP-Flasher/wwwroot/edit.html b/ESP32_AP-Flasher/wwwroot/edit.html index bfeec7ea..3e7c7109 100644 --- a/ESP32_AP-Flasher/wwwroot/edit.html +++ b/ESP32_AP-Flasher/wwwroot/edit.html @@ -452,7 +452,27 @@ imageData.data[i * 4 + 2] = is16Bit ? (rgb & 0x1F) << 3 : ((rgb & 0x03) << 6) * 1.3; imageData.data[i * 4 + 3] = 255; } + } else if (tagTypes[hwtype].bpp == 3) { + const colorTable = tagTypes[hwtype].colortable; + let pixelIndex = 0; + for (let i = 0; i < data.length; i += 3) { + for (let j = 0; j < 8; j++) { + let bitPos = j * 3; + let bytePos = Math.floor(bitPos / 8); + let bitOffset = bitPos % 8; + let pixelValue = (data[i + bytePos] >> (5 - bitOffset)) & 0x07; + if (bitOffset > 5) { + pixelValue = ((data[i + bytePos] & (0xFF >> bitOffset)) << (bitOffset - 5)) | + (data[i + bytePos + 1] >> (13 - bitOffset)); + } + imageData.data[pixelIndex * 4] = colorTable[pixelValue][0]; + imageData.data[pixelIndex * 4 + 1] = colorTable[pixelValue][1]; + imageData.data[pixelIndex * 4 + 2] = colorTable[pixelValue][2]; + imageData.data[pixelIndex * 4 + 3] = 255; + pixelIndex++; + } + } } else { const offsetRed = (data.length >= (canvas.width * canvas.height / 8) * 2) ? canvas.width * canvas.height / 8 : 0; diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index b8eab990..b6afee26 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -1243,6 +1243,28 @@ function drawCanvas(buffer, canvas, hwtype, tagmac, doRotate) { imageData.data[i * 4 + 3] = 255; } + } else if (tagTypes[hwtype].bpp == 3) { + const colorTable = tagTypes[hwtype].colortable; + + let pixelIndex = 0; + for (let i = 0; i < data.length; i += 3) { + for (let j = 0; j < 8; j++) { + let bitPos = j * 3; + let bytePos = Math.floor(bitPos / 8); + let bitOffset = bitPos % 8; + let pixelValue = (data[i + bytePos] >> (5 - bitOffset)) & 0x07; + if (bitOffset > 5) { + pixelValue = ((data[i + bytePos] & (0xFF >> bitOffset)) << (bitOffset - 5)) | + (data[i + bytePos + 1] >> (13 - bitOffset)); + } + imageData.data[pixelIndex * 4] = colorTable[pixelValue][0]; + imageData.data[pixelIndex * 4 + 1] = colorTable[pixelValue][1]; + imageData.data[pixelIndex * 4 + 2] = colorTable[pixelValue][2]; + imageData.data[pixelIndex * 4 + 3] = 255; + pixelIndex++; + } + } + } else { const offsetRed = (data.length >= (canvas.width * canvas.height / 8) * 2) ? canvas.width * canvas.height / 8 : 0; diff --git a/oepl-definitions.h b/oepl-definitions.h index 7800778c..18ea7457 100755 --- a/oepl-definitions.h +++ b/oepl-definitions.h @@ -117,6 +117,7 @@ #define DATATYPE_IMG_DIFF 0x10 // always 1BPP ** deprecated #define DATATYPE_IMG_RAW_1BPP 0x20 // 2888 bytes for 1.54" / 4736 2.9" / 15000 4.2" #define DATATYPE_IMG_RAW_2BPP 0x21 // 5776 bytes for 1.54" / 9472 2.9" / 30000 4.2" +#define DATATYPE_IMG_RAW_3BPP 0x22 // ACEP #define DATATYPE_IMG_ZLIB 0x30 // compressed format. // [uint32_t uncompressed size][2 byte zlib header][zlib compressed image] // image format: [uint8_t header length][uint16_t width][uint16_t height][uint8_t bpp (lower 4)][img data] diff --git a/resources/tagtypes/05.json b/resources/tagtypes/05.json index 5a73e269..0f992338 100644 --- a/resources/tagtypes/05.json +++ b/resources/tagtypes/05.json @@ -1,5 +1,5 @@ { - "version": 3, + "version": 4, "name": "M2 7.4\"", "width": 640, "height": 384, @@ -54,7 +54,7 @@ "gridparam": [ 3, 17, 30, "calibrib16.vlw", "tahoma9.vlw", 14 ] }, "27": { - "bars": [ 18, 612, 350, 20 ], + "bars": [ 18, 612, 330, 20, 22 ], "time": [ "calibrib16.vlw" ], "yaxis": [ "calibrib16.vlw", 1, 12 ], "head": [ "calibrib30.vlw" ]