From d01825a323bfefda782fed6f9e306016727c044c Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Thu, 11 Jan 2024 14:50:35 +0100 Subject: [PATCH] autosave tagDB in localstorage of the browser --- .../data/www/content_cards.json.gz | Bin 3330 -> 3477 bytes ESP32_AP-Flasher/data/www/index.html.gz | Bin 5122 -> 5171 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 13078 -> 13627 bytes ESP32_AP-Flasher/src/main.cpp | 3 +- ESP32_AP-Flasher/wwwroot/index.html | 5 +- ESP32_AP-Flasher/wwwroot/main.js | 56 +++++++++++++++++- 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/content_cards.json.gz b/ESP32_AP-Flasher/data/www/content_cards.json.gz index 41cbe7c39df2ed0ad341d471c8b903de6f7870d9..b0ba24abaf822d9b6a7a0d1aed3ca0d3aa78c812 100644 GIT binary patch literal 3477 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%0DE_P z1^b$(9(WNf=-psQ2H+n2^}mJp1zM7ntg!gt50GNSWOv#sgfbZBKom@r$5?=hq&s7P z!z2m7^ARpYT;QldAY?OGilBqRJ_qS}(T^T~09O+a78!B50*7Jw(;m@*lr6OYcZoTC z!kIY-K{jkrmZgpH)LvzaW}^e*J4?(jX8P>b>7-8yg$DOt!pK7M<9-8Lou5i5$N`yi zKZ0I`Yd{+!3tgzB0NierMSX~<2_6K0gBuk522kJaEc@~ z{@j%jDp_y{fW|QA61-@a7^w+Z;9I9KkPKEws4?mw3Iy&GJ4wWiBq~Ylw`#n4#b^=IX^V#yR^8Yr@jeM>5bP z=NRVNRiyVBO$P=#reklZV=z<>(`yoiu&}o8E+CFd_X_^zrBSfI=w2l@mokP3k69j= zdur`2bzKsRri9Cc`8`Zyp6V&f^-gDOEJUbJ3BGuvcnAA7=D2({=OGC&!?8`23jnnM zx>sNdN_WXI(`B2tbd1@hy#wN&&kH@PLk-&~1q%*j^SB(|L*(J89A3REAC!YVXkiMf z9PB>w+bjp$-p^=Y$uVMxQ*wwHT$LOlAZ=}iETMYu!L=d!2vTo!-v03*JzN2cufEKNyZ`t?G4q4+K+hv`!lh_`iDHY?y|& zX~;}VAIyvdMh$xEr>R6Nn_83WD%Al{Z4HoWJE7WMrMhpac6(q5eXz4HC1Xx8@|V}6 z=Z)8ZyP4o_uHtURxGy5CmadZ5l6l$#_@kF|S zEAn>Lz905To%F$La_M#jf7N@3QOqm4pq!IZ+S&VgI6CS5d@;f_EL9J*T({fd==c^p z-BJt}opQadhohrw>~)PveGo?ZZor=8u>NTkL)?qusIXUmI6CYjv3UKKTdl*G4x!pL=Z8RMh-@d$_4jJ zvY!!Vb0;IOz#)}kA=bAa5N+%22gD0Y{A6!Ghj!nPNzi8I{p)l{@g2+k4GN{w9f^mf zD4zV+=QUVGZ|DOIl$J7{;Pbp;GE&rI^TH0pms+`o;Jea5$l@uzzv@8`_?sHd7D`k< zRJ!*brT&;gz#^;UTKH1|OX;hG7_Wbf@`oY{XQVfW(8k#z+4H;M=z076?gE6MwFg|k z>U9f0a7EDHxd*F`3UW&$uUPi?qyF z9H$RyTwJBI%@~YVayOTtajtanO(uJgp)zZCuXSj@`2f%s66a~_dL@Q&k8SDR={E>V zlagVAoT)exzBt#D$?>w4u4*>j&G*^U$Q@EhE=`T8^AH6e-LbvlBNjehxVkuxxw)_{ zhH`o*DlbXQSybX0X7(Dt!K;_?knxKsKs4vcAQeQfEXEoSbRxxECqQ=ap1~;%mP_b$ zWhw=e%T*IT-c8CjXT`eUusrY;Pcv&c|89IpO~y<8jkyXa_lo&jpJtQYid$AL@vU6d zGqBm)diS<$>E4!T#^W#=m!unrm}o`^!`pVNj0PwcVhM6g*uHL%<2!!IljJAu61*d; z2-Q)%xy)t+h;Yvg95G8)?UI&UV=2BBJOymgSl?XfqO!+ap<@7E%`>HahRzQhHb(02agoX zxf}LhvNa@w$k?G>HD{TMv+ea}@$79uzVnJyHldk;#Y>Xf2q)Fxapp0(6q)zxv*s(H z;N`~dNr!iPojONhwT{~-D6Nd{C#)yseG#~Sa}nRQ%ZN59Ep;E!7`ib`Y-VN*&j(LQ zBl!FxW-)+Z-ayALPrCOfPETH1QkdU2xYM8J>@J@KUJ+T`AzmbF2XPJJvZ-WihjuFh zEMm+9-@SWvKibKR2HMKWhHAhsWCG8(B#?NmKZ(9!s&;Y|_t?tRhH|X+BQD{WVcysT!i*XIwuE#Tv9GK5LGyhaFTFXVE8|IWe`Z%V;Kc-kcozvjcY`a~ z|0`YmyBp4BEU={v_!t+q?CJtTWSR^3An7le?COF_6T7AOoLolR&6>yXa+VE}@CKHS z+WCAM?=$}&E)?jy1X(#H_Aa$+#$(2)c1+`QOtZ(8ONyi^k&T-nZbcAJCsRRJ3?go0 zpIZm#{TG{dOS3214bomg&>O<%um&D*q<=PQ#m^(?=)EA?X9o(WgpT#iBxpl7ZmP?E zPRU}%b(4@Tlc%H^d?oSO7~3xanHYMP2gZhptg+;qSv$gEjusq%n`f6LRFzq zC{z^+?EK;KrayXrJ0Pz{*H_)Y|GUmCoO|$zPmH?o^sF;yAtkdg3~KDRh(DfJ9N~w| z4{PBvU=?ED&MP7N9M-Y_8F6M*Di)qc;iPt4NwN5J&dw{3oGk(&!%W`=cf;Aa%O1JI zYWk&0xX(jQy_#~U$IhEoGN+&UJesEskz!K6(J?eMDx|Jif7S_k=&|lizi!llR5j4@ztCfVe?GN;_%bCjwO9IhRuey^|e zI<40yASksr6=Lc!8gRAeh&gi6 z`sWFqb8mTmO+zL@TF-~e`B-@B`Arl8cIKXnK>c1_OlM*B#p|o9>dU*{<-fG{tNV>c z75+2B=+y0O!{b=EOU)cMF^P}QIxc@Cjz^U`uXth#+!x3e;7v!Lng@--JU#3Dp;jXy z9V=3+#Z4Ik@J$UB0|d`x#R9BCpyU*2gc)^BnNin-9d(7cG^DkV$|-Vw!R?wND!@D8hv2WIAMF$bBPM^Yrax3%Z>pbtR@#AW-Sz zqW`FT9t14RQp-J~R@c|ny4z6!^$B;+D>Cv`2&`1PxsG`t8fX|tcmlNlPk(GS8~gib zojL+^$r@ax>j~-tmlk3jGqtv)&Rh;=Eg35hVUQCrWL8=e?y+$chQi+=ukJ*6U==xycr2k<58WL34QRGegjbyM^GYj2#O|70flBP{?QNn1 z&+`9BI7dgoEX%Nmws70nQz$T_s+@$t!uCZ3Q(r{5@kB|0zT+x;y0#ola(vB1B&Uev zBbd{0Su7jNh&Ej1WOQqK6tePE5qV-UreXM05uLD;R;!)i3z0Ip{0R7q#REXZb|@#E zE3vo$_(Cq8Djn`qC*+Up>Eda%bBrlI^{MyKQ~R&-F_q`bnuqMs3<}E3%hnZ=TvE@Lw`Tf znjL#F9qTj{Pl{$2d@7HbwE;eyLG_V(;8z(un_R1yyn((6LN0uj3k}k_z?Z2MQ9#Da zoM)Jad)DE85QR2gli)&$ij7Zo?+SUOUIcH3ZRrai{Wb_SnMWoO%?Q%c`} z?p(Ocv&3Z{mOBZwD!%z_uxg_2xmsY%*CRK-&UB3 zTl?l=Co^mDL!L_|Wcby(q;#IcvJY+y~Tkd zHw@5H=s&elvFOvxo)jmZpbgV1!VAHyIo!#Y%;skEUs^@B>2RB- zBtBb^Ir!0Z$_Q6vK{@8`Q1M7O(;g=Y1qr~}2OC@I{>h|CsFY$M`E(YZ<+;gcim3Eg zDUN191+mURH+%s*I0#7ZB$_5Ao&fS_0x-#Ta(sMzmg3G2yoAPYcFp5-VoBG0yy}{3 z?;5mOBh%6Vj1W{v$827w=9pp1Cud`-*x`QluHn7Bx%6g(UhkLQ?RBsB_RqgISvx#( z>y!4$tGkB#IBwNneLi+a_syFtz8}fo4(A`{9|HI@sn_d^UjASI)xkv%u=N(bE7S5z z?*c#WE*`GEH@_V<-^-x=;m;3p|J}R(d;jLcaQe%y%fa>g#hdEDT{@{N2Vmu%HdV3p;KRr%Ifc|E2er_bNqJmZ)8*Ls+ zNI{(KvT-y`j9xQu;8K7t#^i*09$B!l65xUXN=YXZo_Ic6ZCm7NYF3%k{AtpVbc(!P z+F=v<+m!?2ubzp=av`V<%vLNd4b}~-X*WhSHh$(cRqi1DhQqpRp6u^68z*~*dxwXe zdaw~Lc294~14oqEUgciY<%!kL^vEKB3P@GEl z?&Sr!8eEdJt!P$O5Nu(%2I3ZzNhx_Z{;>$G-9%9qf;B-*sa6~m<87V*;-g~3tpm;H zI>N7+fp8LL1vq*!`U2^%bl$o+$_O9TxPWp$>sp_%j)L;*t4(`;QVGz~0?n z!M^6H2VMjVdN&x70k{W${cquYftDmCD=a?v1Ed%+*`2lup$vvO5Cs$EF&3aA>CPD7 zFi8UNe1r=T7dUDV2-yslBIsbS&p~=#^rOcgz}3WqMMhk%z+qVav`2IxWlJrN){XfpfSw31TWepMrr~U_|_>5B!krvYK%IF0)hL)P7-k=iAoatc)R8`k7)ZA z;TJni84Xyj3wwtM%_kvAWl<;sm9CGF__&F|0t4CTnA7Ab6pC3hzDG2QOEYY{C}HT4 zgt^e2^@6CvSFnb_u1LvUK>da5Mq@%7oG#um3m5B2@f8`z{Z>R^;}?5037+%RuK~d1 z)PV_M@~qN@0p}x`O^91-h&QR{D3U&beV*WibG9HlWuamt2AUe^jL?KEMMM@9Han2+ zoch=bA4@Iqsxdbpb_&rj7Ag_7R1nmx#BUq46=;H)&Ji!xOx@}0^sST*e}Pi|6IqSQ z2sEKB_XH;Mrb+sY`?#WnTvl}xgy(vF3*R%95Sab2`a1*VM*B}a$*8+T?AQf!N|;F6 zd-g&|*ee!!Oe(~`52&xyR}disb&VNwdwQBcFC7{wW+?cKxq7jTan3%&ny_^Akqk7+ zIfl7*73qCO(}97G>DXK97z~xe^qNE=EUfLj3y7oAy@J1aX%y@)x>t$KrHmoMW0nWz zo?5$0U6;h7Dd93XRc z8Zy(;2QwpqQG=fPX(|!Rrq<-TN_7BKTLYxpPN=q5sqR~<-5wZ1AMET)$(U1&{N?rN zdE+(UZYH>!tGHV+?#l?PrK{w%WS;f_zA5Lgn5Ve^z^mj1_eu$>yRgcJPW3JIEaj@rC4Awwy^2mlah^s-4gPYw+`uKUT^8gTzwk^@UiE z6?waA-w%7FPWs?AxpcdNzv{iiDCQMiP|isy?d<(L9G&!jz8qm1mZ}F@uG{T!bbO1Q zZYhR~PPty!!_m<-_PWNTJ_w_HH(*b4SpT$&A@1dHRM@LO93A$NSiFAAt=8e_V1T^_ z6x>g_g~Kva){9iA3w>bX-oiHjfl*u)m0hH3%?1#!HJfW1y1D>ChRhp-+4Uj%7%p9( zEsNJ15CAiO%Van!BZwL*6D$Qaramhp@7l>}yV1u1G~l7c79&5bN6yh_?0i1LB1xezLcpL%VOtBxp19{&hN}_>SfN28B}Tj>N-K z6i@!^iyEw=H}nApN=q3}@Oj=a87bcL_q!+5@g% z^}2;0xFYE9+=Ep|1-Ye>S1kMcQU7@xE!Y%T*_3zOpzhBPQ_E%fEiw8s+34)~x~a%b zj?;%UF0RtqW(>wFxtmMSI9Iy(CX+qLP?@#6*E+P{d;n+*iSx8|y%NK?$F_9u^c#ew zNy#ul&Qu%;UtZ|Rn)x9wILxhfW7VQ);>z9v_{COnq!JN|+vDMi{P zc=J>ds$*kwMGQV*)gs(814qn4P`jih*I0`0+D-vmG}bq4KYdz^WyC-Eb);&pyW(xv zl<$u|rixzbE+h|x+&+;`eZe32DzQ8Wj2llMvZRs$Z$7ur%<;~1`xo)lnyJrT2bIw809;Ytx4{9*b|deeJfz4GA&zRG7@oKOK0o3A~G3z z)rOVYera8nbG@v_5%*le{6{W@KZl9h%LE_6W&vfO!Cy^Z3dEJ|Mle07vr)UnXIUL) zrD&QmV$6V3-(g-3TDPp2xwQfsttKAmkygh2brqB5TYYC{lak$lETz8W0@h)do@GRu z!7e-xw*zzkWb?#l`t91!ET)SPExmow^^cf*7LiKq>Y7Mag|agLImVNn**Ua4=h({| zg#IR&!fmC0sK;PTgt7j${^16$w^l2sX?1%S!g3t%w3TlBq|cdD7?(w5hmse`dc{_@ zKy7EOex~wPiFnI4LyeodB`UAdXMO)U`JyucM+8(b{VfHQfw?Xn8*R<{pZu{3&a&f3 zXHzW|_a`FfX4w&T>V|-&hF8+{T{3g;ngYE{=~hZQJ8(}ZHV*xkzI)ziG!8SBx3Ddk z{@~|fk#xiUOSXn&5E(nPtCA~I$F;qRE1tbA$ah{m%BBf3uz2-Q8{wqJI?m@MR}J&N za@KqW6nw|nJ?ZdnuT$qJtk!Y+1f`YH{e<WawX4)G#cJKky#mrW&G zI|^G7U=d>;c*NbS`_WEjG|*N~Hq_XCArp9NB!R?h{Ymt_O|_GwxW`teHWWFn9~=q4 zEZ>=X4o1(?dgJU43-iV%lBpT~VuN%Tv9GIjDmU0qOVVz(5ZlPg}kS@RfPd9pzg z-fPmaFrQE3edhl|nZB;j&&nyWcd1=79y8_&#xy=1G<#gRR709**ti+uRs?Z!G8J^i zAmTRmxpi>SKijlhnmy5OkhZX2ZwQ~m8hF5w{xPN%KaZfJcSf|&4irua9qao((1vc@ zR2S2nlEsYcCLvuWPf0WQOaP3#WGd+rx>MKHhrNw6f|dIBo9KP kQThj|KIy%~G@GAos@vaf(m&>8e#Gm40a}rPfZj_008^6eLI3~& diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index 87a551ef44d124f16dded70562d592372526dcce..269c08569578951a74b2b0edcce131094789c52e 100644 GIT binary patch literal 13627 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 N{|^$b*c!Ih000gLiuC{h literal 13078 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�Q#nW35w1BRLg~%;ciEUsVROwRmZgKQZyc> zy#+Z08#W$oX49{+{W1#4wWq{V4;>tMofLS{Xf*9h_|A3^4<-z^(#1QY>Di>E1}KFchx5`+qx3`nq}3dN7xc@7R_RTTz4a{!Zv5xZbJZEh+aY0wFqm4EVP~9StL+Ez+NdPS)YEx0J*;7@Gr1!?;jk%vjekeJ@~FidQ<%+f!d9Ngi03(k*?y9TX#oPq$YgZ0PU?9@c-6|o z&U||&w4k36Is9L`hGn=->9Dw?o`~g9Lm)AZBCQQ^aYgL9-1kW7mH_WN`p^&|v|9|o zl`jPN2vSA;nH2BW8;+@@McOo#EF_rwB`VKNMc{p2u}R$=UZ zWp{mal-^yPoL#$yw8ZolDs_xn7oHvevn|`kP=LPK$fX9((Qm7kMFml%yl8_+I_H7C zGrGBO(ef@^vWb>fS*yqzD6^-SXq%ad4NSV-G_E~wlBrBjsI8?390o1zZJDk5jAqy> zD6@>ApXXzJei-S+*J{tnY%DWeYggWD@^0HH(OTNgaE*exT+>^XOl0pUnRLX3gEJ*r zpx-~YV~uPL3~oRGF0Q86HD{t%+QY@QJrE?(Lt=`eV|?g_ADb77e$`=m(@eqhy!mvIMF5+N z*UfL4KTO`g_dyV-2gWy~9_rBZJNgLVZ+Zgf<>B*c4@8ZR(<~j=Rr4BH+FVf^Gc4481=&QPAsJX+NZe{D}{qZf17C z^q*|1!9-F(f3<=Bs+@e)eqaO88t};{>j)3xzAHIuFq|c`-uG2L0vj z^`m1)9E&U_7;0XKtTIfJxb9o@jYJiC#-lQY* zP5Dd@)Km^S#btr-00uR;gVl59R)TrT7t@uBat+6eb2p#toPL~&9gjWsXSB3ygi&8D zSHxI5pCDUm7nvMcJmodpIQ?n_y+F$`< zj#88CXw}dM5SEAY42FqN5E!NTsKo?*z28^wX6gh`ZSe?aUHy51IepQMwqtjIim;@% zGHJQ)%2ZUTe7*Uhts#1<&C^GT7SiGI+xz{G$M-+>9)0}j<6jS7zI^lR$Ah=9v?%k^ zqc?n~UK!$N%nhgG;yX@j!d!PvPM-iV{`Z7Zyj<0$yOBV6xweb<<2+y!NLzfE-V;~W z%FLT3Q`l$OZ*42MM4OZ6$bpUS#RAky_@oD1%|LWdR8YMDeTAPX{-IZmksvAvqVU2z z_Wlv)+4cbJ)JW^eWfdt);p4!kvODm*f>y;}@bl`L>c*hm6IM`DTipNzeHhub+y)Z^ zyM}*2FP5Hm<4@k?t7bfk`5m}}G{V$ha1O>7*3VRPPDyxsUjSNXTOribCFxHq4DLe)0mdHHE5VM>qV zY?zUM23;2+#;!VI{;ceiM!W&(Su8PJTT2tl%!f8i%o(Gr_UZ>%13!QgpgkPN_NCPo zNJg0zNS3auRQ>}`d)I=PXgOl)rYpq^N>VLZrt|qRBMFQi3byhv>XUdwSPs%Q2tG+`t%(CW^wP;l|C?w1}zE?nWXMjCl*;W6O4An<>nGBNk=NJA8{M=LF zM)DF1RZKG1!yQrARM8;$M zf(eje{VSVL4_*^mOy$hja8_dA%Ooi@SqIx9Iacy9v7r#j@9?xjWWAE@@Bl0ElLaFS kC_NS#sla(Ry=?H7ThtPtc%mmFW7hKj1KT45+-uDM0COj*LI3~& diff --git a/ESP32_AP-Flasher/src/main.cpp b/ESP32_AP-Flasher/src/main.cpp index a33baa11..f29d4bab 100644 --- a/ESP32_AP-Flasher/src/main.cpp +++ b/ESP32_AP-Flasher/src/main.cpp @@ -131,8 +131,9 @@ void setup() { if (!loadDB("/current/tagDB.json")) { Serial.println("unable to load tagDB, reverting to backup"); loadDB("/current/tagDB.json.bak"); + } else { + cleanupCurrent(); } - cleanupCurrent(); xTaskCreate(APTask, "AP Process", 6000, NULL, 2, NULL); vTaskDelay(10 / portTICK_PERIOD_MS); diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index aef4f3fd..7e93d334 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -398,7 +398,10 @@

Download tagDB - + from file +

+

+ Restores the tagDB with the auto-saved version by the browser.

Manage firmware of the ESP32 diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index 32a7cef0..7990b67c 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -558,6 +558,7 @@ $('#cfgsave').onclick = function () { $('#advancedoptions').style.height = '0px'; $('#configbox').close(); + backupTagDB(); } function sendCmd(mac, cmd) { @@ -627,7 +628,7 @@ $('#cfgautoupdate').onclick = async function () { var version = info[0][tagtype]["version"]; var currentversion = $('#tag' + mac).dataset.ver | 0; if (confirm(`Current version: ${currentversion} 0x${currentversion.toString(16)}\nPending version: ${parseInt(version, 16)} 0x${parseInt(version, 16).toString(16)}\n\nNOTE: Every OTA update comes with a risk of bricking the tag, if it is bricked, it only can be recoverd with a tag flasher. Please only update if you need the new features.\n\nPress Cancel if you want to get out of here, or press OK if you want to proceed with the update.`)) { - + var md5 = info[0][tagtype]["md5"]; var fullFilename = name + "_" + version + ".bin"; var filepath = "/" + fullFilename; @@ -786,6 +787,46 @@ $('#uploadButton').onclick = function () { } } +$('#restoreFromLocal').onclick = function () { + var tagDBrestore = localStorage.getItem('tagDB'); + if (tagDBrestore) { + tagDBobj = JSON.parse(tagDBrestore); + var tagResult = []; + + for (var key in tagDBobj) { + if (tagDBobj.hasOwnProperty(key)) { + tagResult.push([tagDBobj[key]]); + } + } + + const blob = new Blob([JSON.stringify(tagResult, null, '\t')], { type: 'application/json' }); + const formData = new FormData(); + formData.append('file', blob, 'tagResult.json'); + + fetch('/restore_db', { + method: 'POST', + body: formData + }) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.text(); + }) + .then(data => { + console.log('File uploaded successfully: ', data); + alert('TagDB restored. Webpage will reload.'); + location.reload(); + }) + .catch(error => { + console.error('Error uploading file:', error); + alert('Error uploading file: ' + error); + }); + } else { + console.log('No data found in localStorage'); + } +} + async function loadOTA() { otamodule = await import('./ota.js?v=' + Date.now()); otamodule.initUpdate(); @@ -1003,7 +1044,7 @@ function showMessage(message, iserr) { div.classList.add("tagxfer"); (function (tagmac) { setTimeout(function () { $('#tag' + tagmac).classList.remove("tagxfer"); }, 200); - })(message.substring(0, 16)); + })(message.substring(0, 16)); } } } @@ -1042,16 +1083,21 @@ function processQueue() { const canvas = $('#tag' + id + ' .tagimg'); canvas.style.display = 'block'; + // console.log('fetch ' + imageSrc); fetch(imageSrc, { cache: "force-cache" }) .then(response => response.arrayBuffer()) .then(buffer => { + // console.log('mac ' + id +' draw ' + imageSrc + ' hwtype ' + hwtype); [canvas.width, canvas.height] = [tagTypes[hwtype].width, tagTypes[hwtype].height] || [0, 0]; if (tagTypes[hwtype].rotatebuffer) [canvas.width, canvas.height] = [canvas.height, canvas.width]; const ctx = canvas.getContext('2d'); const imageData = ctx.createImageData(canvas.width, canvas.height); const data = new Uint8ClampedArray(buffer); - if (data.length == 0) canvas.style.display = 'none'; + if (data.length == 0) { + console.log(imageSrc + ' empty'); + canvas.style.display = 'none'; + } if (tagTypes[hwtype].bpp == 16) { const is16Bit = data.length == tagTypes[hwtype].width * tagTypes[hwtype].height * 2; @@ -1606,4 +1652,8 @@ function debounce(func, delay) { func.apply(context, args); }, delay); }; +} + +function backupTagDB() { + localStorage.setItem("tagDB", JSON.stringify(tagDB)); } \ No newline at end of file