From 05f02a14543ea557274fa7fe2ef77691b485fa9b Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Tue, 3 Mar 2026 22:45:09 +0800 Subject: [PATCH] 1 --- __pycache__/display.cpython-313.pyc | Bin 0 -> 6424 bytes __pycache__/font.cpython-313.pyc | Bin 0 -> 11398 bytes __pycache__/main.cpython-313.pyc | Bin 0 -> 26442 bytes display.py | 60 +++++- font.py | 180 ++++++++++++------ main.py | 161 +++++++++------- static_font_data.py | 48 +++++ websocket_client.py | 118 ++++++++++-- .../__pycache__/server.cpython-312.pyc | Bin 39003 -> 41896 bytes websocket_server/generate_static_font.py | 109 +++++++++++ websocket_server/generated_thumb.bin | Bin 120050 -> 115200 bytes websocket_server/received_audio.mp3 | Bin 32192 -> 46016 bytes websocket_server/received_audio.raw | Bin 337920 -> 485376 bytes websocket_server/server.py | 47 ++++- 14 files changed, 574 insertions(+), 149 deletions(-) create mode 100644 __pycache__/display.cpython-313.pyc create mode 100644 __pycache__/font.cpython-313.pyc create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 static_font_data.py create mode 100644 websocket_server/generate_static_font.py diff --git a/__pycache__/display.cpython-313.pyc b/__pycache__/display.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de85a13478a687c9c84d67eda63a38a8479b9cad GIT binary patch literal 6424 zcmc&&eNY?672ng{NkTflG2g)gQxgGpQpeZ^r*^>xn;1i^LoqdWu0jZLv5?4~DE^pE z(zKJvjXl&~LC(im&UgxRGB!!S?AD2sOebmogMtTU<7Pb5fWvs=!uIK?mP~Kvq(fDvkPG@XRrb4 zhF$Cv9Oi6V8;|*1RDwh{ABkL*LFpXsq9Gq)j!MS7$N@EqJW!Kp1ZoyjL{mO`hQUdq8R`}>38+=H z02M?l&}31-Dc)pzDlu)Bm0q9g@SG9Ga5D+R)6rS@-+2KDU9A)OVxL6@YB6rLrq34m z9Htm!tWXs#*-*P#Z*-`-)@xc`f^<$8LDx9)BDWC*zJ+M z-9eHp$$mK~b!w|2Tvxy!BwPc~5r%Mz$JeFM>Dq`T%CffiFfmJ7FNvf@)v#7?p({`x z1@b(a&ddpM$Ia6#av`%!XXim?oi+)TC~CK+mG~1hrK~%QjSm+G7fI#FkBEY01yD(;ZTiBc?#T1yPt8L{{WPE`e`J^*R}m z=b@uM_5<)66Zu6`wb5^IGLGc<=z2*s>r(x!lkIo}q5Dc_znR04qRWowx+%4QIrzC{ zW|9<}3BL@7CB|WFPt&D4GW1eBFF|cKM^?P9mjLMCA{Hkn|8TU)^&so#zuWqq#&0#6 z@jH&jfs?aVo4_;$echmiT)iC69R=~SUeXQQMqR{GeIC*|<9Wi)6vbQhlD>mBa1h0) z-KMvjkZUDEep7<22~JZAddv{-p*pnKDprDn^P6f--e}&%bfF)xD^V9?Pi{U^uw}~@ zTO&9a+2xau$bPR)_ZMr|&QZIS(Y_AD9JOY`D(-`X>j@~bohRlFS6?S~1wF*v8}PZX z96U_;-foxT!Bhb_kM=OQ6~baANDQ5BJ4blzQ9MBm3qY7^gd}yi+y{Ns%^gXNj%)K^ z9Kba;dpd~2vOkEahap_A>{p1X$K~#p{T{-KPc{@7H2ClD#48#H&qj( z*h+IueFUa13MZ)&s2c_MDf@hct7~%Blcf4XZclGe4*2b6Ozi}(qKvH4D-)wzkzhz| znkHBRtr26VTg@4dLOqo&ns7SpOf^nc=<2)6Yg1EKwty0!M>oyMV<{Dr=E`|PR#M^3 z%;Krc)#I6~L)&j=zr`%uN36~mpQRU-!{N^1U+^Krq41%GWF zbF}?!|3vM+FIXmXKNH$EZ$#PogKa0 zt+LA%zo{7YUhBVp^y<;;&s}|Pvb<&N$DNuW!D(`TEwYTPMqQ zjkQbDW%lW{>%K_ha@U8pAKy7|LCNU@JCE%g*nMpG@s?>JO|QJZ`h3N?iW|b}|J+Q? zy@L#(4k7(lEs@&DV`CX*lfuK(IR&BZl>6&>9=?91P-LBGSlO@!eYD21Bb)tbW z?8oUml-;pY2AC*j=>N{sK+aODgnV&|`Ikbp42OftSd^Sh+|s;Yog+-M-Jn7YR{|@P zDU=BB4)_9Cp_8)NG=R|0M9=|3fw&r46l(o&7F$yXHVte_P*3=KHw4=}i-aspU9>xP zNTR;ghc(17vT+1jINR-(V0uw;||)5+FF@I zggH!@e!_I)jlikUscN>Nt-J>6Bt3EEYX5S|TMA_H@~4ENaiJ*uY-G=H)eYhM2}<}s zZL+Qa8X172@dTxQMc-*dzjD_$*HWGoeX$zvTDnpj5N)N^1J!h+8;>J|5HHFaLoiFw>nWv(2FKVbVIe8MwbSK1^|(%Hfoy>@hOD!T)#^W+F1?g zsv5YU=a3Eo+yD~sW=iN4LPY_thtfSzpp0=Npd!{$HVTEiPyo6aXg<~)UVnbmxlNJQ zVb_(`Q1jn~x&$oHLrG6DgP4St`)Xv1ZyYxf4#LWxPeWc0~IKZn;w8>r0uNq! zu5wZ+i@L3t-4;j0;gYwyF8fA&H-ydee9Va@I@H*nRl*AHw`ZNe<201s?=r!{C4i|p zgOCfnaKgo7iJgN$9(G{~UaHDP$C zgD)E4EJ_qxPQx0&l*qLe(>!7JvA{6iDUP(Z^)>x4+Ny6o8WSBYGcL=?lp>ft-HX!y zSzZQ}>tyei3bs%Tv!8wKceAgI&Yl15+?yw71}=X-^di{B?N@&>d;aa)zx>0@Ywyib z*D}`$L^BV1;M+}_b!djM!%<(~OpHIOZ)$4UOISz!cGXJo6O@zJPB%-33ro?*9pf_SR1>9~n6kDTk<0$eyq+vRfsxZTOM#(&{Vgt~@us zwSDq{d+LBZen6fSo}nGmC#*$x8#?V!K3=+hwBt(oq|gMRURwT`Id9&CQgSDf?aMQd z*E}`Wc3@I?`c`Tlbh!7_i}{92ppg6e1~>`4Own={lIU|l8cl6`+EzKaII6r1T(V+z z4VNs4H2ubQItw+42B-1vOBP(K7{9R=-n_It;abJ^Jqn#>ULT%4{?g2)S3i6A#O-%4 z&4%B*eeq9@9d%V3s%9hCX08nYQURm4kG(W|c69c{rRF0UVt1h5Cil3!p4csjQ_)JS z9X@yi>gen0g6k0tCU6N5z_NO6iJ!Y*EZUuiSh2SQhLQk%F8mlYD|9hhP^QJB#G=4> zk~$vA&`}w0gF_N2jX+{}3}?@CTvFvNErg#EY~zA0QZSl+Wy1}jP7C6hq)G_l$Ff#O zo{hN2GRmifigBUh>vv)F4XwW;g}sXP?jF+~GIZ0py#n!ZeV=7zLF)a};L12`*1|}$S)G4)< z#>-Vv=-8HnVB-2f0!{F=$m{Pt5NJ^V#txn+04?n?=PvS2%Mt*z)LK*kLY@FXV;_B^ znEn0F0A(8P5`i}J#$Yq1&pTS+kOQSC^xWNj{(~{-X<-CmeI7qRg@(MczcbJe?~`!Z z_avaux;zRw3O`~DbajCMA_N0Lmk(~xhde%o2x=}xzghf!J<%^3T@dqRcLja*YPiQeAjRSElB{Uev zO_YE!Abfz5ZXjfZBq>2xP?;x5wA-Ye zCXthP5h1Zfovr1qo5(xK22XYx+U7akZL+iN76lwB*G!k00xq*NyTtZ(v+2z4{{OwY zlE6xn*<*a}dHm%)6^x|kPakRpo!pfm9N#Cs%s3_6a1V8AP3$1R# zCT?FwR?Ak%YzkI%#>Yx~oIU+6R_t^6S^X)Ox7Xu!I~dpLVVBSEW7Uky&zy7g3=Mnz zta{LS7P|b5$K_*{C(ij@PKI%wW97`y8OMp?zUv}Z;&To3F-lVzuJ+SdTtlSDkn_`E!xYYIr7SIt?=ek=`0W)($oOA$WJaZ4fh zTrgR~IpcpBkX+E*g<(Wb`aWYBmv~nX+3J0E6W7Uh8_CU%$%gL46d41QSs84A1NKAB zO^&bRArbB$H?<3L1{->kp9(6;*PVdMOYk8(;kh<-CO==QNBFo_qC5FHJ7uYUp|p-j zQMyT+Xt)%5mZqLsp18L7`lW?;#&5qpzW91*;TJzye&*Sw7vEic`YEWk+awI0N%*=0 z@R3-NyN8wc3=Ispdi>W(CI`BFxC|@5b~Q)k;3YxNZ9rN}K2lpCdy<$}Xhv1%RWXG* zsxZ$g3g#55QPs1m3!3|P2G`7eh#DxoM06*24fZJggF!DQL14=X8_BKl4}bO6;^@W2 zcg7dbU*Okx`-eZ^m%Q}StmFD8AGc*eNJ$e?xAV#w|!ouHqpfEZIREZI%cWM}e( z^6i+XPN+cbL~8MuP)mgENm5S`1kfhWb{c1?KhvCAq*v07+K@|~SwboGT!*tz;VhCP zq+Jhn;&)k-Xh|isbnWg$@m-U)L){5;1L4ZhOG}inx9|__Mz>KI3iiVcYnOGKgceFo z%d&`u0cq?OSQAAoU-*M4w2_;lhZUY=Tf>dmE}2A00}#(%v1 z{LU7bjN7w}k~d;P$+q@7{Z8vCC*yNjT?{kCv{>71 z8dl};dAvTq)7ygz-p{Zqs4#xt8IQl8mHJK%c>GKmvJ`tjy(><5yiQ+_$HOXzz5TAU z1D?Kf{OLj!%_{ew?Qxy*dxpHM^b`XFY;sPKu;M|V8=8Bt@)7qk1Tij^6ba?D=sAs%AuzwED_SWY{LPwu_ zVnvjd-5f723)?69g9qcL;+V-6HQ6HNF;jiiR6kc(5|&4DW(sR2$OSB4ZVizOW^2q` z{js?^vUM{1dee+~OVA!Kuefw%>`3VJSlhhG94oAe7S_y|YT|`fz8pC^U05Htl&r`I zqj_Fu{QRDhFqhsX$n54hWBznu!=!z(VY;9(W^9@^HpLC5Kdnfi?+YKQ+7Bx1+x8X{ zzbsbmBgDU~%G$eK{LAf9DEBC!S4eoWIgMln!2rV}5>6>j|$a<)wgMmQd{m;?OXhCv|sHD^W?k<<+E(NNOk;u@gpUX*DIIwY6ZeYGGZJ zycRfmvuG`)s0GE~)zMkP>YQM!X$7T3ebMz>)CW-GbXeDKVI0)4tqlq^_-biX$_!My z2|`U+30l>e)RQnckA@WdWS5geppvQ@(Z_$AKS%zSx??jR85Zg0Dhl zd(9N-&Ce{6w1JmfXAJi4e(BuxwWSkg{O&Pp7xF;PBj(6Rft%E9eiaI#n8}IM!Y`DJ-b}{8M70?ARt1b6a zwZMFxAfI#ruhoDm1Ap3pf(3nz_j5=;nY1}6_sBCpSu5m5H)j}4()nFmXw_ESU`SS8 z@=y-N2gx>&&!jYf?BG7ZEO0Z{B$}jiy0&yZyfqQpaC{`3JR_g)@Tb&G`b7L$?IXZL z6Q)OihXy*wYf3w*I@+}Qq=JV=dQEoIL9+cCUrO`Qj9e(O_;Q3g*4Wt8ycBx(_O+ic zPDB=_p1u8x&|=`HOBbJ6dik~X5z)>=45(LPS%DcwWSqmr*sz4BhJj@g%TGYYO3^W+ zSh8lsyvOP9>9;1LWeA+Dec+7wTC5}bgZqy;I6B^^YZl z9An8{wqgiF{mgKWpOu_)_MBv;jMM9OF=#?qne!Be=d2V1Zy$qBI4d4vdRaX^o*w$97b8c%j53%Gw9AUAPMk#2&fp)qy%deAOi@uyl(LBa58M3qnB|4 zG~n?MI!`%YX>?~96m4{;9X)LobStg6WJ&az~0p1O7}w5w?m9>?vl|^er_;-f9cxg@K=+)xj{;?zRvbxCWt2=}HL(Ykc@z(iLTcq@= zh40xAv0vRT^n8{}n5`>$gf@4y<9x@<`@ygbV-BIo4;{O5{L1k;OG#Ke zW2pL2UBp_wUp;D#o$>6$ofe?@jf6D@gQCU0lpAZ+WLK6l!@andxYoX%^R z)o))BNwv*!z44NKOnyl-rkO6OpOi<=O&2xK>RWziFvX4Ln6WBqtcn!P8XF<}$juMz zi|Y(Q|8w7o8;gQuT%R569FqshPxav3>w}xmKOPcaQBEjlbfv2a;>ljsgla~&?o)m4 ze137@NZe!z9GWxa1^wgAfqnD9yXU!)fBmX0nk%V~m28ccY@O_lmTV6mikDWvN6f`N z`R2qoXL2j!C1tpMk@9FseWLr1GNRB5GGQ$XN#YgN6RLUGx-GG?rf6ByjHM}FUKK0f z5-r~nD{qRHH%%F*PS2FvL;K?;?qkh=an0`Z4zag@B(mb{4eeugJ$ud5tlB z)5rRzKdp$N;|m|+IRDseY%5j#s(M@7dg3?hRqaagZ#HJNOT_;okwUpA9auvR4@Zu; z+efa(awt;pAHjG38?ZYvT1JU50^xnGZXCs>6qS6SR7T$U9_KT5)w?m81UtGHQv&FYZc_X~=&V|Lx?*d}7 z_{`|yT+IzA4eh!r@%AY zwx0lj??cD{xlj?t{7}xt=D=P!fqFym==n3D?DOA#nF{A!?!Kw3isxFwr4t9o96?c{ z7Sn#+l5R{Fmb|LDs);x!sT-!L zbyLny^tWyFcP&CJj8;CbWjp9{z6?js(o$Lku^p!h_aUCh_YXap#r<6;Xv`Fgezzgwm z`Ylolv+l&ntx4;Mw0`{BYf_3Y=)uGcC=qJHgCeIreU?xMHwy0Z#9nb4o{~`-04qxH z64vMh#SZ#r&D*isnM9ORoyk$Kqm7X?^gS2;nH&4qulZZ@e6m|byz>krZQc|RZ$b{8Us^kh4X(&yS52fa? z2Y6#Dz5_H*jmJV5*+Eh=uM)648Al8Lb9aR>Cpu}by((G-Hv2GqO?B5~=X!x6^-LmJ z@cp{cl5mOA(CXFN2J{b+X*{jQNW1F>#sQqYZ-TXxoftB%Nwiv+J6OO66NnhuiRN)l z626o*^O`iY2G+Fq&#Vdf2^iv6&jt1cqrEjLxt?vX9wHM3tyU6k`}uWrSb!$omr8K! z+_Z)*R8!Ig>r0$$IJt`ZDgXca#tDdVN+&wu}7rc^sEf01XGc@9(Mr_#K55<7{umS84vZa z8oz7slp_H&@EC)dYvQ?cID-!nm89Rv6?o?p1(h}OZpvz$1|3eH6HXa;C_2OFnb9*p z8bCM!qFn6@+HqY#8ZWluk0&e(SvjLa&knuZdu8y4gO`UQ!!uc1rzEpkJ3cI25jAMx z*2)@G%o!kTztT9-I9tJ}`(8bG_28?mS6e45->SP&H*2)Vi^{HaPjp8NGexz*1HUsB#mg!~irWTD zyrB3>~Nj9hfhv zh>({@=IR?JTW9L+Va+Yu*04QZS@o9chU#Wz%Uo6M^u`B2vVYVtUDq*N^-#QNM?~_5 z>bh!j({*ipL(R<%JK{A>v6@}cnqBXcpVaL6Oifg8TQL(wwpd|Zw6JcraN|80QMnF_)Fcs+yuzO*hM$;#D<#c`Ezk zs_l1_#Jbv*EF!-sX5J7rZ-|*UN6nij8)nUo_u$ti@ImkYVl()~J}6v)9}a2sF?BKg z&FKJ8xO8Uh%(Qh=Ot(3z+Z?a1i&Z}mt$yHr$%pa}liQ<2~J?>Agt#TmAvHi!jB377=SmxQ-*>6sX1DjXptsb{wH;b zNQu*~Uy{xQxQn<;kiaPb1>x0q{WGmcZQON>)&l?lC9DY-Uupc3KWBiEdthWXt)#Qj z$%4yCEj+lC`aud%ZGb)lokJTqutI`!7K|t7aOA*R3~)IMBYDV!&gRN;?z-04^>4J1 zo7taeW7^Ds1h3@U_9dO73~q7Pn{Ztvf-4f7ASAe!LihkFd9c7v?LB-LY}f7AUV(TH zr72Xi!Lk4&Q1WoPqK|P7x&Rq~UwmO{4~G%3%C?U74#&f- z)E-vS=NTB_Alo!lVHkMWa#KJ8^B8hYp$Ol?>Z6dct|9TX9Ga4 zfSY7rYzpj+14il_YXVGJz_$UN4ecF!FuW;dD32P-0 zuqI`-K-C(rs0;0dDeWI`zYD*>umXEy;fkJ6YDRVEbs>4!9zGpecT-Wzp&amg7Vswt z=KGkT4Nl#3a9|P-B%lKYf`^iJ%%;O%HF`mM;8%?*hhuQ4cNp$I9IVFSI6dqfNc89& zjy@0L^AEt)fp^H^U@(YeFm_|Cn3ZG3xhi-+z#zuNK@toae1`j+xemC7;BI;FUdMA{ z7_NXEj_U+BasIQT5@ImJ;Mms!+0(>5kz87FCx?{g-jRtRQ;DP{cN8Vk+~%&013{90C-E1w+P)WLVJr)a|Pv!L`)Xml34yr t@vwxfyF+09IoKwJ0We^)5Mc9rWs=+&w6A0i%Di?LuTzv%iWGTFS4UdB!PC%p3&Nz8Bcu9p1oDC zU%#iO0XsRFIlE^{biJy2Rkv>4x^?ST)qTb18jX?w_wi>hyWj33h(DkR>m>2O=SKwu z@hm|Sq@azUn5Tde;JAT4#qXtUx*d8-kHdmC17*N)(x^02Mj1&tWg-<+I;o`0q-t-vmLS!8&ERWl zB~%7UP?@Bb%7R}usiSg8J(Wuus5~-_$|sFf0coNv@GB$*4;7KbL(AY-OfDnSvxx@; zR0&y3nsI3PUa75R*_|7K8{zB1rV<$t)vCVYsf-~*X~_S7B%c42&bGN_SO~=b@6H}#DHKx zU|q3*;+<9jt!=W~Y|WkBj;5~8ZLKX2nY79CRLXQM9td-AfH0*gx!Xx#e33 z0!qlXy1fVBEd+JDUHi!4-UnU2ra`yM;~Q0XJ3Rw~uD+226^*U5s_y|`bxrN+x;6D{ zN9AiO(cjv&?#%@RF)BIeZCJI67Bq}1Rvq-Na-upHfK7-6A@W4vxo<$+9hQMNZiKW) zAgvc=VI8!MKp8)u5F`HTVbcj4f|2Bk`0pWqva5?j_6YI`yTAsuCOcBV=CKexsBY|R znE%-r^DF|+n8lM+Hk^R5qh3NI6-T44dLGQw{jcV7^QfsIwWRJY zp#^c+S7{y4tpi&4)p95Gsh-0C_354}(og}oHl#tzHZEydnq36%fMC$WMmzEqwGys0 z)D9yy*|8k8q)$`Rg2%lrf)3zQ@b4iA74RC5HfFBI0YM?r1Jq}njBo-cd4#;Y61z}K z)bhqy0YOSV!bahMfO+-{`iTvq0-`?|(xxOxresJ<=#&R^;(V*ASuCJ^|3DDD z*d!6hkHgEFF`|d|U4Q?D`5(Nr+r7oc`bPE2r7#OA)Y4Iz(&q9}hb**U)uS>wBNguQnI_z(YlS6I(vQYhh4N7p+if&gD%$rTG9MSuj_yh0ML>H zl-uK@B@|2|E?VXGCR#}=cDHV8b&zE1R$3NMji>EwBuQHCbN4>zbqslFB@^m%_xIDv zz61!XgjNkXA8}C7BDc#+iw_PuJ+#0@%bY%+Yv_QFR(gF-%I83+c~Sc;$kDPPr`uC` z;1I2j*XlUv?srq=kYNS3 zzd0(;o`$gUNu|H~sD@468kJ}9l5Z#pQ&u2n%2+ZkTNLIh@?$#Vl&)Y>S1_e3oYWOg z>(j&LP$~%+yqrB$| z#&^Wb*;D4_ljh}9=CVn1*|ag^P6ATIT(+ns^ro8-v_|zS0KplZIrz}2f{3mR zAOz&Wj8OI2oS-JOD|9$Cbh$Qc-W1hujzK-TGOQQ1S(>l|aixPP8<&E`(KI?Nr zq{yFE8~p7-Lr@e>D~_s5VmyQrbv>i`7ZKD3Wud?yy<4G2UvAX4loCG|Teho(KVRM? zg~#7lqR4;KH;Ul#i&Euwh3FU6+U;V|Rj~xZSJleabjek7d8=OXOT7fby?pfoDH2#o znFdyQmar3vDHtYlJ7I&@$&Ss@2PFmsb`cwQg23oWs5Ul!EpZTCk{&4w4W`hP&}|Af z2luoKNFka4>_SpR3SlCQtL`vSeH|F$I1CJnl#rr78Im*(Nrs-JoRt2_kQ8x9N(@O# zs{Uk1EKce;PGUYJP^vW}>45CDcLH#MI{dlxNfu{Ae$((5oDqfR1hwZF6WC%5eMxx@nKRd_A;=0eF5kxP$ z_(TyzXgmhL^(T%&QV2^|fk$GO*!XY}Y;g93QtXk!ND?9b@W{|u!XY^+_9%K13kou! z4jGB$%&!g%|jNd(npd?ZklAJxEs-p4;2Ns4$%`1HbN^6pe zLi9GJHMfukiG>6QZO?}=IuOmlS%{8@8FddviF5=l3z$(dfAXp8?_HdGGI;&H_t=4g zv2fdT}72}d= zjozOb>^{He?4FS8MaN|B>Pf@uh^B5_cPRT3+^`9ByLGcj;;|I?tJ&AeFmYCb(Mc{GAnJPt1 z>=%x2t3#m9C&pq|ig|QmH zq9i``B5Z-Z7{=0J#_HYg>V1%r({_0K82r5VgSV8Y5~A5ODK`0c1sYFD0uKeNPmKhf zp~ADSi+5kzdtq->+>j8k@qC8k_CRA$aH=_29i+~#2~}V0zchGZ@MG~hh8YrK3u;U- z!y-ifBvmH0GLfQ-_N47u&24OA)DCtX&ljH{kiSmtKD(5w z74MmeN069f1lRTVpPPI8<@x8&c2Y=Q4ZsiF;wGyE_cPT1G3qYlHG@ZshTI+yV#zY; zpt}#`nRLI)J+R+L%MVb)1C-0_#Zrn^>~m7E*nk{fG<~r$hv5tZ<_xxg1F}+kA=8ua z^P<2lc!Qa?gOZDnM8#`kGM&HhJC9DAG6IrwqTu#WZ^TkFnOPGt)s8D-avdWg@+ReZ z0cWsvV&r4_hD8Y>H{C2G64UDkK#adEUvNB;QW$`cLhkFRtuVDCrB}>@jMTIw$MFJi zQHn_ulwBz)=wa$6`!w3HOuWD z(JeSUp)jz}K&6JADA@JU@i0#8^KrR&trnEUlbyvNC{xk^#HfJOh!Jc(4{i!-k_IyE zF3H#GB_pXOO=LO`u9?G=4e{_zi6LnwGssLHj1;(WJpn>KYXk}T`OAMZf99FF_nuui z^Ixt#dvxLXA2Y*#0m;Dyq=t;3?V9VCUWE+TFMV%r{FQ~Bkicj#Zj`A8ylzIXzl!3B z*b9B&;pt)FuOPJTf&jK9oNnI&R$CC0QFY*9*z?c-bne};xyMe=zxv|^Gz~0#2%c3P zpH|Q+08cBlWJ`NvQyUgQv}E`8*6wE5ZgD;0!#X|%dvA!S3M`hpr(2(w~? zzcf%A6b83O#nu^Fnt#`Kz70a`v?$OPDm>K{$t(v+W~xb+Vf%v1f`=xG-spdG@b$r{ zylGyhLqbk{MD5=bfGrOHy|9oGG4tdV$+&t_zHKRbMSK(1&=DNiQoSy!jh^b^9qtBN$yVgk~&hnM4H}qUili>8Q>&hDR#G) z|Ec9^8fjdD-ECZ8XzINu-`J+de znipO`ua2^>7M^_{UM)QFeI)0fgH)@E(d7mq%&6=`D1=lyTHN%F#!hM&#j%#>K_R5k zQwPAa3K>=JAqabsC}1ULdR%hCo(pUu4>`Py+Q1-w5;ZsuIbiSMC+U5RKKvy0q~Q)2#Fv~F zqU#?)rA)g+n~X_qN+o3ZQ%kBgfnvF&O}B-SvQ1`Qn^KkL+T?;ZWuP|oK^kvw9|YSi zdMy)Ln8kyiN>C?S*n>8Zu>*>0Nh!An*Hs2JXJcv>-LkHnq`J^vU6SK*h%m7z7{w5i za-wLe(*`n^%p>#3EVAH^)1QSbB#U@$zb&_=re9AEiA7hNRKiw^jX1!aa-(Q!d=OqaNl`m z{)N-Gm~heT*w|{hcH+$ZxPSKYt9Vkyvn{Rc+S%RO(Rxp7XA7Q}=U;ts?sRB=?D^|s z-+^;x3N3JOHM8#q=8pbw{+R#Txwo%h`aVEe*aq(w5SJ{VDRLnQ9#sq8KrMEWO|$~6 zkG3}3mI8-emTM>80pKHOd%Ll9_Px^(M`%5O3io3-zloMNb#?4)Z|-g$LBpCs9&`q1 zLLr6p16tB-vvt{+xgR%e?%eCw-*}19APzwe>S6HQ#f8uWM9T#74OBHm7mlMWXcb1` zbDEb>+D9mg>ce0ez2W-%C+41eVF4YYEKGrC)!kBgpb#Y(-Qh3_?FEmPextd)y=yn4 zL!k8?RwQWApvyyxx3t@v*<~7>1UY@MJuQXJA9QT3bq_fQTxc!kf}{1mq@|iEu~hSp z4Ek7o12yUj{JfvQe#ugO12%^xYUYe*$x3Zenn?c|Yqc4f#-AIJ<;53T;q>L`DCiC8 zo2u7UQTh5rvNco_qTX2Z=DOF{Mdh2OVN<#k^bBvPX~Hnk^sf2+oVRj5mNx?qO1*zw z1Wv}8g&PM?^SUM~-^i}#&`J&|932-rqVk5D!R5V`_p!W%0oM>w?$fk)DRDhc8ktW4u03p@U)WDvtdn9%7m6QcxBHkd}AVfIu+K@Oj ztAMfY6?uiF@E+~XVeI42CG<;7%*izCgC0nfDJEfC zVp3yDAfK}bOq6Hpl_QKvp+^DJ6<9PSJ5s?O4<^b%jXepQFHj_uq)-g~!Qy8@tx>V* zs~L)&|SF-q$VmysQ$3Z^KL$IFL z!69d2x0KY|RbbC%u&cpdEOGFP@lV_H?rIV4%hZ?~*;*2q^LsIM8PiQ=;1Hf|tw+Pd zE8VVHYQY8+HQP0}rDeuV(EkRFJLuJvbYydTlszz37{}5n@lMO*c#f_DOjl60mXs8r z5yF-PN@se+ycT8IwLs}?yEuu`B3lVtJNHCWDss>hA{!c5Ne&K=IhW^fSgOhIY(Vn`ub6E@$90JnjCfNu?gFa&A20`XwiMb_3&b2^qj&t)_=$Hbx zrC|??0AX8^L`aBoR<#zs6fU?8?_1cqS-{8wlf#XZG)o{B0;dkN6KKvj zu;m2F<&kr+z_drcbR>Y?q|hU8l(RHrVw~k<5V76N<@qIDTI z-I+W0-E02uC2ZQ~e=6}!P*yVoJouOhdn;9s#Kw; zW8^@e)8`r$HJ&m?X-c;+ubml)&*9RL+(*mpM}u{8!Xf@R7j0;I-nX` zcf-PFlw@p0TA~G;IF?(yPzb6~mjn7>u)xH!c%>`{oRrtaHfvPHyxQ8>-Pk}YmwBn%k{r$Om>CfS9KjOhWe^ z@_})t0zKeJ6D*n16IgXOJ8aEO&8>F>EvTbVme%v%wQg;1W)4I2-u=S|9Zc=L`$s$v zQfQ$?p@|P{M0^x2+wb&()h9(ggOarSou0lymjlc`y+EV59jN!98;)ib*dWyby$05* z2L|0f<~Ucfj)*Dlq`kanI zw-?TPS>n^$-Vq8Eb)RFnzuyZ6s_PNH$ZUl|!;e-W03%+9+tWV`1}P@8i4jlkX z*?0zg&VyKh7Nbt}BHafa+wff6umBjQ7uw4V~1X!fdzYSp4JO;a;%H2c3DF_wl3BgU1px#gk0aBfXFy=Eq7MW}i* zr@}9f6;@3cCJSr*+JBJ}rkudRGl$O{j%DQr9yygCYMjih@HZyKOgU4g@<~&9XxGHr zE8eK72Q+kpB`ApKi_Z0imc6)tQeO$-MX-}C2#UkT;;_0nrppd&4eKmnxn))brmClF zr&I-#ssdg*R4><^s1MW!w@n#WP8wHE$lg@HuAZuDo2+WP+B8+QbFykDRguxcBq(Xfx z|44p7F{LP)R20SZMt`G!i(ht9b6f+bN7WI1$+#qD&IvRg-#@OJE-DGSUR)7+=*3FE zE717#{)v5%DA)Mqft-LQNQQDkny_{aT0uZv#$d^oiCa@pnVaN5?Wx;duKnNk-{stcp)WjI_ksV)kxjjGGJST&gGLTBkS z0`+Isomn@No*7ts{JxN2(q#1uVoPGcpeAdmIBcv8t1H2JN~ytg*GwsvPb!v&)kAmam>snb{h@xX~pf zOnILZ0vIx2zYS-TyFyK2bJdi-I;^jrG3K+3{NyC8Wc%Qks(o+Soef|SONpe>LhPGd{8W`s>m8L~GRkfT4Vg4xD8^32@# zCtz~EhWEurC1{?uV0#{F4Deu1qy7p)+o%EXJFPN2i7*>G*utkCWg9}?F!IpG4xIhq z@Hzr79%sEP2F@`z_0v0XIIZ8RCqH`1* z|1Hh}M23Ah|E2(DhtyLM}A0y%>XCV3Li^~?81k{V8IU7_f+cCtjO-GK6*`Uw>!rg{PECX5X(tiKf`9 z2Fv`(AoCt4R5w_d14m2Q`nsyBA+HrD*ECp|O+!mrO-0?c^G`F$wGEc*KY5&evypkh zup^=h)XaM0)@xx!hoz|TD}jcfnLxWR&&Al zz(+E1MFxN1qh)IE8=;)&^PZ%wN%MdUU|>KaKHsp%fj$lbTlBvJJW1$A@3RmXBNoj> zdfv&-=wMq5A{Z9!0%Rt}F6;VWxyhMP!uJ{iSi++X zIf)KFSX=TDps1Lz%0`gfntyR@{>)2r-+O%S)xhj~?_WC+n*Yw@bKm=~N@XK8;AO^w z7d{2^_+UT;F3tI0UU>f0!aITa(Al|nkNxwzyPl z-r*V=rVhaZMP}&-yP|Sf5LH(9k4j4{BVJb@Y=r+cWTWLnt|13{Pb*N!IXF1ni{&#g zsFbN5)??_s#5e474$_hlq~9lTp_;L-1qe_j^#K4rjCk)}2!I-_Ce+$v>z-Wq)P}LG z(-4HuAfDop8S5K59F*_sP9a-4}38YGBLvBlU{QyT+P7RT&sX&J>Ua z27<0oQ?O@38rFj9xE8);8f#~G2x>{V1P_fupWK&!U%}ETm|c)t_|h_Ezmr0qJWY`! z)hY5FN+hIj0$YMTSM>0<6jDvSsWxD_ts4)_4Jj8PG{MVm+y_rSIu19a6>M~n5|09Y@NI|(%y&F$_-V)rd%hjEb4V#%0U&=s;L&p1 zb}aM+9?+L|Ehin|lwHMbV)H))?#0oSM*7L~fI$_TVndrVNsgnC$HdFIIw>1OK|e9sjjUcm>TwG} zDZB$e+yfXO{SmwFd@zaC*wcDo3y^WP1~$Y!d8fl^WEz?gNMi*YV|db_ttLzb;4&Tz zv_433T{_Pf#DD|p;Jg47m$H4~90i=X zKIDBa-CdB#1ANk5U~6LGa?hLi7xv2XQQl@Q4;vzRpOB;R!*K{6PwG4L2-@y$VPQd! znCuETiik^43!h)Mv$?n@T=|gLp0^M!!mg{pp^5Q~`{w(6s`Pz#2~{#V&L$Nw^3kYH z8tHeyUIXyjSbP9`_)vnC(H5ZBzVxq3VQiPOL_+ZT$@*2HI8C?dr!20uK&e{zRRgu! zS?n>jmU2xtSAvJl|8HC)=z8@gxdtOAAI4Ny5XM(de0+`bImrn^jyJv%hZ3mQ|FYvN znZx@)7TJM!asL5-+ZBoW(aMjL0eM_+{>P2cu7BlW#5-)k;||6jH+nsiKWFT9{q0S> z4YSC#82)ebr*0w@t5QlJ}r@CPL^#*-u+oLHo)kxV7`O34v)5lT>H2g31+Bk zz@27hR{~-)5EG}mx{2jq$nz_lXBR7@xTjsm*5S#pXD}b{Kz`U#=O_yC*S@OcguH=U z%TBwFB^|vSW1}3jr|g z$#0S7m!L?NJ&Q*}(Ac0pw75!g>@4re?m_0?*x9qY^Y=W$&c7p|!+T_&9D5EA9?Z@5 z91NFnr9H1&q@6F_lqTwY`KB~U=L;#)j5no;JEb?J z2|9nrr4}4VGqdXKjrIUxsLbqah2VG24{1aNpoIY_qZCHbNO7i>!A(|1K!H8->rJWvV1G z;L!GuKKBDNrVo1c20nWK#%3~bfsEuD-0O2K@wcM62m!IwQ zAxRGhk9Y51w>W{T0dN(kGTiUx-3kXMX-bB1I`2(%SmO8wI;<8tOvI~8VHYj!FgO;H z;B6xTcZg#HF`w*!WqI}Dt`jwiy5!Jx@Z`EKPBTyxI!?oJ-A=12ZnmQah@;x3CHJI_ zDlKL4tG_JRu7?&_M@Kp*=)PJ z+2*j@+9|{guni4I90$FO{Yf^YP_S)JSf#Y2f0zPu7ZtjV?2w~(c*NtQmZSHm3n;W{ zMGFsly&z->3%Ic{#%x0wM+#ulnfPL|^|0yf9Q1Ci)o(e%>pQOQ z3Y)v4`kmA1#pmvcq*wWc=oH&r9@STTYRrzAa?r_4uqJ9+K9iAyZZS#!VsWKFVfc+& z|K*K*eDW>Aki(gkp@%}fVRKDXUmMfs1Rk2yTl^~Cy# zBfgW-SPOS@sTv!IpVbN*>qS3nP;RLg{akF_QX~3#jReA@8MYCR2VH;X_E^Az23@gX z85-_$xd}AraOb+w;ipwVT?LTT{osw7m{SJJez<#~+=2{xJaD!kq`rl6d6`mnu$?8%4lQ1l7_DtXdO1n z;_{7VqAb9f=yN~|7$R8)TyQ}M*bCv~zR`l4tFn|04nte<*_w6Kf-f_ z!**uWDHQ!K@_vN8$H5yoYrj2&E z60ix~h{aKq3Zi^yYnXZgc^@DT9T-usfJf{3MM!&lH+2TR!-Es?8$Kq*clYo<`8^R;+pu) zNe+Bf6K%l7*fe~gEb&pSM*`5dSttOp6s^WocAg zHmfrqJN)F~K=tW?GY_76@Qmk_=iXB`nk-T0Om96dH4X+GL=Lk^%R>@iYva!~fF>|avrqGOSnNBMj zYm1pP$GTz}Sz)m$mYy-z$#}ViVR05%q>Xj`t2kSdzDR&~V=dhBf{fpOBTxIjdKQ^T zl}6>zzRZB>sc*v-RT-HGNDi1(WyVbDV;!+ffSNv|)GmTa27Dr;wgej|)g@uIWkv^Q zq7mJSSZP^UUp#Fr2>K?C7i$a{i67VmciO^*uezd{-7{q?!={qitW^{8NY-8BJ7#oQfn7(x{i(44 zx1cg=TJ>p0R$$+m;Zws?`Ku=L!BSF`wLF%af2QSBOSpJ-G`9{uuPV0s+ovs6{?=G| zb=YK`VNhi%8w_vl4&U7q&D=X{%0$!&cz@V6lb#R^H#(xMdxK_WkAqhTN?fia5fi2i)th3 zwYZ_Hqo%sQTtjOj=`~>CnV$7;GX~HSP86{8T^BX2|Ekr_7;~eR+K91s;?XN3k^1&e zGZ@Nkj%GGa7q1Q|VoQlsHIZ?-JiL8R_#Q_z_x{<;+%w7_DTB4o>t-|a0>jbF$~ch` zy{C)o1Bw*n{Q~z>oJ!11s-@PjsW`TLrN3+1QtNL`boHtU+2yp$yP}z!m_n${n6%YV zQ_cLHcnE|*;c8%?Wo7>M7*j<_slPLZJa(7M^(YcRU{X2=Pd1f=5E~iL8mTaM`*mjX~L@ zW!tQ^>Qe4s=f093l*TN}&+E?WCWLRwUYEU_@qYeW`BBUEn03`9xTXN?Mj^}ZmRVyf z$}g2(D1F5mY?|KKakV#0-V@$C5ZQQWvUpvvZ6fUO}tTV&oJsn{0V&~jDq*1e(5>9)?RqyK$V_}=>>ZTDSXab?%r72&@A5I~F9xAn^I zs~(U_!-B0yDpfZN6SeXHUFc*{8H`lyh;7{-E^k}{;(_oz`@;`-qE*9*;scS2<|TOs z!n71NH`6W)-`BmRn_AoY(c0EUVWA;wIewUFK%eR~vI5qH`J0SWrCx3cP z^OfGK_2F(uWX(g9xwUYUPWF6(HMR`QPtR_cXpStqD^}llrSSD{P8P48DOoikID7BJ z{z%EjSly;8g4gd2c1|~KyE6K>o5J?HBTaY10%F(SRD}257i^1_R-Qk6{_u3!`pdho zc*6aMqh*hNkrKjfa}GvIw#3$N4j13GB-;aF+x_8v{n4_41k8a*$%Z9)24Es_^hL{D zpUDYB)+}6;yyM9oeqU6b``NuRLZ$m+@sI#kEHtcG7Dt5w5ZHw!&u#f~alHVTyu|vV z@XJLlms-UI+XYkG6gI(hM|@apa4Con>*^r z(`!&~9dwtBd>VMDukL2-9+h z11V_^2dwqdL9w$6x?xS11|e)<2B|0v*Dm5Dwx^I^n>Gd%S z2Qx~MGdJ)aIK*7DCB;hb0JCtBVC9y#R=EoSLd$r(YN7Q9UHgz$54!=q`2Wek+XK}9 zLU1J`4|rjnV?mjVP=X@9i_p50R>gxm!CaI22;~SO53g9}QRsgl?;7&nMc#YJ`zd(n zBb^qt$b&o^^6bdN3!c3wl32zcZ3x*GIiRR{1YPQ6QUfyP|v8d#}qMj7V^yCY1773F`dc( z4SyTlafz-K|3+9-Kc)nG%`l-y+9;6@TO47+2kbBQ(U-`xB9-Wx=Q!1`H@RIq+AjcA6; zfPc~Uv$h+AT(I$m*(6wdqtYO_>qgmf!P?L67TgQc;KpW=M6mudeThJGV<$i|e3tu& eSdhK=u!0b)$44Wgtlx;`k8fKP5#nr2vHuGpS#ya1 literal 0 HcmV?d00001 diff --git a/display.py b/display.py index ec525ff..a7bff6c 100644 --- a/display.py +++ b/display.py @@ -47,9 +47,9 @@ class Display: if self.font: self.font.set_ws(ws) - def text(self, text, x, y, color): + def text(self, text, x, y, color, wait=True): if self.tft: - self.font.text(self.tft, text, x, y, color) + self.font.text(self.tft, text, x, y, color, wait=wait) def init_ui(self): """初始化 UI 背景""" @@ -93,3 +93,59 @@ class Display: self.tft.blit_buffer(rgb565_data, x, y, width, height) except Exception as e: print(f"Show image error: {e}") + + def show_image_chunk(self, x, y, width, height, data, offset): + """流式显示图片数据块""" + if not self.tft: return + + # ST7789 blit_buffer expects a complete buffer for the window + # But we can calculate which pixels this chunk corresponds to + + # This is tricky because blit_buffer sets a window and then writes data. + # If we want to stream, we should probably set the window once and then write chunks. + # But st7789py library might not expose raw write easily without window set. + + # Alternative: Calculate the sub-window for this chunk. + # Data is a linear sequence of pixels (2 bytes per pixel) + # We assume data length is even. + + try: + # Simple approach: If offset is 0, we set the window for the whole image + # And then write data. But st7789py's blit_buffer does both. + + # Let's look at st7789py implementation. + # fill_rect sets window then writes. + # blit_buffer sets window then writes. + + # We can use a modified approach: + # If it's the first chunk, set window. + # Then write data. + + # But we can't easily modify the library state from here. + # So we calculate the rect for this chunk. + + # Total pixels + total_pixels = width * height + + # Current pixel offset + pixel_offset = offset // 2 + num_pixels = len(data) // 2 + + # This only works if chunks align with rows, or if we can write partial rows. + # ST7789 supports writing continuous memory. + + # Let's try to determine the x, y, w, h for this chunk. + # This is complex if it wraps around lines. + + # Easier approach for ESP32 memory constrained environment: + # We just need to use the raw write method of the display driver if available. + + if offset == 0: + # Set window for the whole image + self.tft.set_window(x, y, x + width - 1, y + height - 1) + + # Write raw data + self.tft.write(None, data) + + except Exception as e: + print(f"Show chunk error: {e}") diff --git a/font.py b/font.py index 488d886..b357c92 100644 --- a/font.py +++ b/font.py @@ -4,6 +4,11 @@ import time import binascii import gc +try: + import static_font_data +except ImportError: + static_font_data = None + class Font: def __init__(self, ws=None): self.ws = ws @@ -11,6 +16,8 @@ class Font: self.pending_requests = set() self.retry_count = {} self.max_retries = 3 + # Pre-allocate buffer for row drawing (16 pixels * 2 bytes = 32 bytes) + self.row_buf = bytearray(32) def set_ws(self, ws): self.ws = ws @@ -24,7 +31,40 @@ class Font: """获取当前缓存的字体数量""" return len(self.cache) - def text(self, tft, text, x, y, color, bg=0x0000): + def handle_message(self, msg): + """处理字体相关消息,更新缓存 + 返回: 是否为字体消息 + """ + if not isinstance(msg, str): + return False + + if msg.startswith("FONT_BATCH_END:"): + # 批处理结束消息,目前主要用于阻塞等待时的退出条件 + return True + + elif msg.startswith("FONT_DATA:"): + parts = msg.split(":") + if len(parts) >= 3: + try: + key_str = parts[1] + if key_str.startswith("0x"): + c = int(key_str, 16) + else: + c = int(key_str) + + d = binascii.unhexlify(parts[2]) + self.cache[c] = d + # 清除重试计数(如果有) + if c in self.retry_count: + del self.retry_count[c] + return True + except Exception as e: + print(f"Font data parse error: {e}") + return True + + return False + + def text(self, tft, text, x, y, color, bg=0x0000, wait=True): """在ST7789显示器上绘制文本""" if not text: return @@ -32,17 +72,23 @@ class Font: color_bytes = struct.pack(">H", color) bg_bytes = struct.pack(">H", bg) - lut = [bytearray(16) for _ in range(256)] - for i in range(256): - for bit in range(8): - val = (i >> bit) & 1 - idx = (7 - bit) * 2 + # Create a mini-LUT for 4-bit chunks (16 entries * 8 bytes = 128 bytes) + # Each entry maps 4 bits (0-15) to 4 pixels (8 bytes) + mini_lut = [] + for i in range(16): + chunk = bytearray(8) + for bit in range(4): + # bit 0 is LSB of nibble, corresponds to rightmost pixel of the 4 pixels + # Assuming standard MSB-first bitmap + val = (i >> (3 - bit)) & 1 + idx = bit * 2 if val: - lut[i][idx] = color_bytes[0] - lut[i][idx+1] = color_bytes[1] + chunk[idx] = color_bytes[0] + chunk[idx+1] = color_bytes[1] else: - lut[i][idx] = bg_bytes[0] - lut[i][idx+1] = bg_bytes[1] + chunk[idx] = bg_bytes[0] + chunk[idx+1] = bg_bytes[1] + mini_lut.append(bytes(chunk)) initial_x = x @@ -50,6 +96,9 @@ class Font: for char in text: if ord(char) > 127: code = ord(char) + # Check static font data first + if static_font_data and hasattr(static_font_data, 'FONTS') and code in static_font_data.FONTS: + continue if code not in self.cache: missing_codes.add(code) @@ -57,10 +106,13 @@ class Font: missing_list = list(missing_codes) req_str = ",".join([str(c) for c in missing_list]) - print(f"Batch requesting fonts: {req_str}") + # Only print if waiting, to reduce log spam in async mode + if wait: + print(f"Batch requesting fonts: {req_str}") try: self.ws.send(f"GET_FONTS_BATCH:{req_str}") - self._wait_for_fonts(missing_codes) + if wait: + self._wait_for_fonts(missing_codes) except Exception as e: print(f"Batch font request failed: {e}") @@ -78,28 +130,64 @@ class Font: is_chinese = False buf_data = None + code = ord(char) - if ord(char) > 127: - code = ord(char) - if code in self.cache: + if code > 127: + if static_font_data and hasattr(static_font_data, 'FONTS') and code in static_font_data.FONTS: + buf_data = static_font_data.FONTS[code] + is_chinese = True + elif code in self.cache: buf_data = self.cache[code] is_chinese = True else: - if code in self.pending_requests: - retry = self.retry_count.get(code, 0) - if retry < self.max_retries: - self.retry_count[code] = retry + 1 - self._request_single_font(code) + # Missing font data + if not wait: + # In async mode, draw a placeholder or space + # We use '?' for now so user knows something is missing + char = '?' + is_chinese = False + else: + if code in self.pending_requests: + retry = self.retry_count.get(code, 0) + if retry < self.max_retries: + self.retry_count[code] = retry + 1 + self._request_single_font(code) if is_chinese and buf_data: - self._draw_bitmap(tft, buf_data, x, y, 16, 16, lut) + self._draw_bitmap_optimized(tft, buf_data, x, y, mini_lut) x += 16 else: - if ord(char) > 127: + if code > 127: char = '?' self._draw_ascii(tft, char, x, y, color, bg) x += 8 + def _draw_bitmap_optimized(self, tft, bitmap, x, y, mini_lut): + """使用优化方式绘制位图,减少内存分配""" + # Bitmap is 32 bytes (16x16 pixels) + # 2 bytes per row + + for row in range(16): + # Get 2 bytes for this row + # Handle case where bitmap might be different length (safety) + if row * 2 + 1 < len(bitmap): + b1 = bitmap[row * 2] + b2 = bitmap[row * 2 + 1] + + # Process b1 (Left 8 pixels) + # High nibble + self.row_buf[0:8] = mini_lut[(b1 >> 4) & 0x0F] + # Low nibble + self.row_buf[8:16] = mini_lut[b1 & 0x0F] + + # Process b2 (Right 8 pixels) + # High nibble + self.row_buf[16:24] = mini_lut[(b2 >> 4) & 0x0F] + # Low nibble + self.row_buf[24:32] = mini_lut[b2 & 0x0F] + + tft.blit_buffer(self.row_buf, x, y + row, 16, 1) + def _request_single_font(self, code): """请求单个字体""" if self.ws: @@ -134,10 +222,10 @@ class Font: if msg is None: continue - if isinstance(msg, str): + if self.handle_message(msg): + # 如果是批处理结束,检查是否有失败的 if msg.startswith("FONT_BATCH_END:"): parts = msg[15:].split(":") - success = int(parts[0]) if len(parts) > 0 else 0 failed = int(parts[1]) if len(parts) > 1 else 0 if failed > 0: @@ -145,34 +233,26 @@ class Font: for c in temp_missing: if c not in self.cache: print(f"Font failed after retries: {c}") - self.cache[c] = None + self.cache[c] = None # 标记为 None 避免死循环 if c in target_codes: target_codes.remove(c) + # 清除所有剩余的目标,因为批处理结束了 + # 但实际上可能只需要清除 failed 的。 + # 无论如何,收到 BATCH_END 意味着本次请求处理完毕。 + # 如果还有没收到的,可能是丢包了。 + # 为了简单起见,我们认为结束了。 target_codes.clear() - - elif msg.startswith("FONT_DATA:"): - parts = msg.split(":") - if len(parts) >= 3: - try: - key_str = parts[1] - if key_str.startswith("0x"): - c = int(key_str, 16) - else: - c = int(key_str) + + # 检查是否有新缓存的字体满足了 target_codes + temp_target = list(target_codes) + for c in temp_target: + if c in self.cache: + target_codes.remove(c) + if c in self.retry_count: + del self.retry_count[c] - d = binascii.unhexlify(parts[2]) - self.cache[c] = d - if c in target_codes: - target_codes.remove(c) - if c in self.retry_count: - del self.retry_count[c] - except: - pass - else: - self.local_deferred.append(msg) - - elif msg is not None: + else: self.local_deferred.append(msg) except Exception as e: @@ -183,12 +263,6 @@ class Font: self.ws.unread_messages = self.local_deferred + self.ws.unread_messages self.local_deferred = [] - def _draw_bitmap(self, tft, bitmap, x, y, w, h, lut): - """绘制位图""" - chunks = [lut[b] for b in bitmap] - rgb_buf = b''.join(chunks) - tft.blit_buffer(rgb_buf, x, y, w, h) - def _draw_ascii(self, tft, char, x, y, color, bg): """绘制ASCII字符""" w, h = 8, 8 diff --git a/main.py b/main.py index 3d0cabf..f29b573 100644 --- a/main.py +++ b/main.py @@ -163,7 +163,7 @@ def render_recording_screen(display, asr_text="", audio_level=0): display.tft.fill_rect(20, 100, bar_width, 10, st7789.GREEN) if asr_text: - display.text(asr_text[:20], 20, 130, st7789.WHITE) + display.text(asr_text[:20], 20, 130, st7789.WHITE, wait=False) display.tft.fill_rect(60, 200, 120, 25, st7789.RED) display.text("松开停止", 85, 205, st7789.WHITE) @@ -194,54 +194,91 @@ def render_result_screen(display, status="", prompt="", image_received=False): if not display or not display.tft: return - # Only clear if we are starting a new state or it's the first render - # But for simplicity we clear all for now. Optimizing this requires state tracking. - display.tft.fill(st7789.BLACK) - - # Header - display.tft.fill_rect(0, 0, 240, 30, st7789.WHITE) - display.text("AI 生成中", 80, 8, st7789.BLACK) - if status == "OPTIMIZING": + display.tft.fill(st7789.BLACK) + display.tft.fill_rect(0, 0, 240, 30, st7789.WHITE) + display.text("AI 生成中", 80, 8, st7789.BLACK) + display.text("正在思考...", 80, 60, st7789.CYAN) display.text("优化提示词中", 70, 80, st7789.CYAN) draw_progress_bar(display, 40, 110, 160, 6, 0.3, st7789.CYAN) # Spinner will be drawn by main loop elif status == "RENDERING": + display.tft.fill(st7789.BLACK) + display.tft.fill_rect(0, 0, 240, 30, st7789.WHITE) + display.text("AI 生成中", 80, 8, st7789.BLACK) + display.text("正在绘画...", 80, 60, st7789.YELLOW) display.text("AI作画中", 85, 80, st7789.YELLOW) draw_progress_bar(display, 40, 110, 160, 6, 0.7, st7789.YELLOW) # Spinner will be drawn by main loop elif status == "COMPLETE" or image_received: - display.text("生成完成!", 80, 50, st7789.GREEN) - draw_check_icon(display, 110, 80) + # Don't clear screen, image is already there + # display.text("生成完成!", 80, 50, st7789.GREEN) + # draw_check_icon(display, 110, 80) + pass elif status == "ERROR": + display.tft.fill(st7789.BLACK) + display.tft.fill_rect(0, 0, 240, 30, st7789.WHITE) + display.text("AI 生成中", 80, 8, st7789.BLACK) display.text("生成失败", 80, 50, st7789.RED) - if prompt: + if prompt and not image_received: display.tft.fill_rect(10, 140, 220, 50, 0x2124) # Dark Grey display.text("提示词:", 15, 145, st7789.CYAN) display.text(prompt[:25] + "..." if len(prompt) > 25 else prompt, 15, 165, st7789.WHITE) - display.tft.fill_rect(60, 210, 120, 25, st7789.BLUE) - display.text("返回录音", 90, 215, st7789.WHITE) + # Only show back button if not showing full image, or maybe show it transparently? + # For now, let's not cover the image with the button hint + if not image_received: + display.tft.fill_rect(60, 210, 120, 25, st7789.BLUE) + display.text("长按返回", 90, 215, st7789.WHITE) + + + + + + + def process_message(msg, display, image_state, image_data_list): """处理WebSocket消息""" # Handle binary image data if isinstance(msg, (bytes, bytearray)): if image_state == IMAGE_STATE_RECEIVING: - image_data_list.append(msg) - # Optional: Update progress bar or indicator + try: + if len(image_data_list) < 2: + # 异常情况,重置 + return IMAGE_STATE_IDLE, None + + img_size = image_data_list[0] + current_offset = image_data_list[1] + + # Stream directly to display + if display and display.tft: + x = (240 - img_size) // 2 + y = (240 - img_size) // 2 + display.show_image_chunk(x, y, img_size, img_size, msg, current_offset) + + # Update offset + image_data_list[1] += len(msg) + + except Exception as e: + print(f"Stream image error: {e}") + return image_state, None return image_state, None if not isinstance(msg, str): return image_state, None + # Check for font data first + if display and hasattr(display, 'font') and display.font.handle_message(msg): + return image_state, ("font_update",) + status_info = None if msg.startswith("ASR:"): @@ -272,6 +309,15 @@ def process_message(msg, display, image_state, image_data_list): print(f"Image start, size: {size}, img_size: {img_size}") image_data_list.clear() image_data_list.append(img_size) # Store metadata at index 0 + image_data_list.append(0) # Store current received bytes offset at index 1 + + # Prepare display for streaming + if display and display.tft: + # Calculate position + x = (240 - img_size) // 2 + y = (240 - img_size) // 2 + # Pre-set window (this will be done in first chunk call) + return IMAGE_STATE_RECEIVING, None except Exception as e: print(f"IMAGE_START parse error: {e}") @@ -279,45 +325,14 @@ def process_message(msg, display, image_state, image_data_list): # Deprecated text-based IMAGE_DATA handling elif msg.startswith("IMAGE_DATA:") and image_state == IMAGE_STATE_RECEIVING: - try: - data = msg.split(":", 1)[1] - # Convert hex to bytes immediately if using old protocol, but we switched to binary - # Keep this just in case server rolls back? No, let's assume binary. - pass - except: - pass + pass elif msg == "IMAGE_END" and image_state == IMAGE_STATE_RECEIVING: - try: - print("Image received, processing...") + print("Image received completely") + image_data_list.clear() + gc.collect() + return IMAGE_STATE_IDLE, ("image_done",) - img_size = image_data_list[0] if image_data_list else 64 - # Combine all binary chunks (skipping metadata at index 0) - img_data = b"".join(image_data_list[1:]) - image_data_list.clear() - - print(f"Image data len: {len(img_data)}") - - if display and display.tft: - x = (240 - img_size) // 2 - y = (240 - img_size) // 2 - display.show_image(x, y, img_size, img_size, img_data) - - # Overlay success message slightly - display.tft.fill_rect(0, 0, 240, 30, st7789.WHITE) - display.text("图片已生成!", 70, 5, st7789.BLACK) - - gc.collect() - print("Image displayed") - return IMAGE_STATE_IDLE, ("image_done",) - - except Exception as e: - print(f"Image process error: {e}") - import sys - sys.print_exception(e) - - return IMAGE_STATE_IDLE, None - elif msg.startswith("IMAGE_ERROR:"): print(msg) return IMAGE_STATE_IDLE, ("error", msg[12:]) @@ -330,7 +345,7 @@ def print_asr(text, display=None): print(f"ASR: {text}") if display and display.tft: display.fill_rect(0, 40, 240, 160, st7789.BLACK) - display.text(text, 0, 40, st7789.WHITE) + display.text(text, 0, 40, st7789.WHITE, wait=False) def get_boot_button_action(boot_btn): @@ -468,7 +483,7 @@ def main(): print("Memory high, cleaned") # Spinner Animation - if ui_screen == UI_SCREEN_RESULT and not image_generation_done and current_status in ["OPTIMIZING", "RENDERING"]: + if ui_screen == UI_SCREEN_RESULT and not image_generation_done and current_status in ["OPTIMIZING", "RENDERING"] and image_state != IMAGE_STATE_RECEIVING: now = time.ticks_ms() if time.ticks_diff(now, last_spinner_time) > 100: if display.tft: @@ -543,17 +558,11 @@ def main(): time.sleep(0.5) elif ui_screen == UI_SCREEN_RESULT: - print(">>> Back to recording") - ui_screen = UI_SCREEN_RECORDING - is_recording = False - current_asr_text = "" - current_prompt = "" - current_status = "" - image_generation_done = False - confirm_waiting = False - - if display.tft: - render_recording_screen(display, "", 0) + # Ignore short press in result screen to keep image displayed + # unless image generation failed or is still in progress? + # User request: "只有长按boot才离开" (Only leave on long press) + # So we do nothing here. + pass elif btn_action == 2: if is_recording: @@ -595,14 +604,24 @@ def main(): render_recording_screen(display, "", 0) elif ui_screen == UI_SCREEN_RESULT: - print(">>> Generate image (manual)") + print(">>> Back to recording") + # Stop recording if it was somehow started or just reset state if ws and ws.is_connected(): try: - ws.send("START_RECORDING") - is_recording = True - ui_screen = UI_SCREEN_RECORDING + ws.send("STOP_RECORDING") except: ws = None + + ui_screen = UI_SCREEN_RECORDING + is_recording = False + current_asr_text = "" + current_prompt = "" + current_status = "" + image_generation_done = False + confirm_waiting = False + + if display.tft: + render_recording_screen(display, "", 0) elif btn_action == 3: print(">>> Config mode") @@ -628,6 +647,10 @@ def main(): if display.tft: render_recording_screen(display, current_asr_text, last_audio_level) + elif event_data[0] == "font_update": + if ui_screen == UI_SCREEN_RECORDING and display.tft: + render_recording_screen(display, current_asr_text, last_audio_level) + elif event_data[0] == "status": current_status = event_data[1] status_text = event_data[2] if len(event_data) > 2 else "" diff --git a/static_font_data.py b/static_font_data.py new file mode 100644 index 0000000..8676595 --- /dev/null +++ b/static_font_data.py @@ -0,0 +1,48 @@ +# Static font data generated for specific characters +import ubinascii + +FONTS = { + 20013: b'\x01\x00\x01\x00\x01\x00\x01\xf8\x3f\x08\x21\x08\x21\x08\x21\xf8\x3f\x00\x21\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00', # 中 + 20102: b'\x00\x00\x01\xf0\x1e\x10\x00\x20\x01\x40\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x04\x80\x02\x80\x01\x00\x00\x00', # 了 + 20248: b'\x08\x80\x08\x80\x08\xa0\x10\x90\x10\x80\x20\xfc\x2f\x40\x61\x40\xa1\x40\x21\x40\x22\x40\x22\x44\x24\x44\x24\x44\x28\x3c\x00\x00', # 优 + 20316: b'\x08\x80\x08\x80\x09\x00\x11\x1c\x13\xe0\x32\x80\x54\x98\x90\xe0\x10\x80\x10\x9c\x10\xe0\x10\x80\x10\x80\x10\x80\x10\x80\x00\x00', # 作 + 20572: b'\x08\x80\x08\x78\x17\x80\x10\x60\x23\xa0\x22\x60\x63\x80\xa0\x7c\x2f\x88\x28\x30\x23\xc0\x20\x40\x21\x40\x20\xc0\x20\x40\x00\x00', # 停 + 21035: b'\x00\x08\x06\x08\x3a\x08\x22\x48\x26\x48\x38\x48\x28\x48\x0f\x48\x71\x48\x11\x48\x11\x08\x22\x08\x2a\x28\x44\x18\x80\x08\x00\x00', # 别 + 21040: b'\x00\x08\x00\x08\x07\x88\x38\x28\x0a\x28\x11\x28\x23\xa8\x7c\xa8\x04\x28\x07\x28\x3c\x28\x07\x88\x18\x28\x60\x18\x00\x08\x00\x00', # 到 + 21270: b'\x04\x00\x04\x80\x08\x80\x08\x88\x08\x88\x18\x90\x28\xa0\x48\xc0\x09\x80\x0a\x80\x08\x84\x08\x84\x08\x84\x08\x7c\x08\x00\x00\x00', # 化 + 21527: b'\x00\x60\x03\xa0\x00\x20\x19\x20\x69\x20\x49\x20\x59\x20\x61\x78\x01\x88\x00\x08\x00\xe8\x0f\x08\x00\x10\x00\x50\x00\x20\x00\x00', # 吗 + 22238: b'\x00\x00\x00\x00\x01\xf8\x3e\x08\x20\x08\x21\x88\x26\x88\x24\x88\x25\x88\x26\x08\x20\x08\x20\xf8\x3f\x00\x00\x00\x00\x00\x00\x00', # 回 + 22312: b'\x01\x00\x01\x00\x02\x00\x03\xf8\x7c\x00\x04\x80\x18\x80\x10\x80\x30\xf0\x57\x80\x90\x80\x10\x80\x10\xfc\x1f\x00\x10\x00\x00\x00', # 在 + 22833: b'\x01\x00\x09\x00\x09\x00\x09\xf0\x1f\x00\x11\x00\x21\x00\x01\xf8\x7e\x80\x02\x80\x04\x40\x04\x40\x08\x20\x10\x38\x20\x00\x00\x00', # 失 + 23383: b'\x02\x00\x01\x00\x01\xfc\x3e\x08\x21\xe0\x0e\x40\x00\x80\x01\x00\x00\xfc\x7f\x80\x00\x80\x00\x80\x00\x80\x02\x80\x01\x00\x00\x00', # 字 + 23436: b'\x02\x00\x01\x00\x00\xfc\x3f\x08\x20\x00\x00\xc0\x07\x00\x00\x78\x3f\x80\x04\x80\x04\x80\x08\x84\x08\x84\x10\x84\x60\x7c\x00\x00', # 完 + 24320: b'\x00\x00\x03\xf0\x1c\x40\x04\x40\x04\x40\x04\x40\x07\xfc\x7c\x40\x04\x40\x04\x40\x08\x40\x08\x40\x10\x40\x20\x40\x40\x40\x00\x00', # 开 + 24405: b'\x01\xc0\x0e\x40\x01\xc0\x0e\x40\x00\xfc\x3f\x00\x01\x10\x11\x10\x09\xa0\x05\x40\x09\x20\x11\x18\x61\x06\x03\x00\x01\x00\x00\x00', # 录 + 24605: b'\x00\xf0\x1f\x10\x11\x10\x11\xf0\x1f\x10\x11\x10\x11\xf0\x1e\x00\x10\x00\x23\x18\x28\x84\x24\x10\x43\x10\x40\xf0\x00\x00\x00\x00', # 思 + 25104: b'\x00\xa0\x00\x90\x00\x80\x00\xf0\x1f\x80\x10\x90\x10\x90\x1e\xa0\x12\xa0\x22\x40\x22\x44\x24\xa4\x55\x14\x48\x0c\x80\x04\x00\x00', # 成 + 25353: b'\x10\x40\x10\x20\x10\x3c\x13\xc8\x1e\x40\x70\x40\x10\x80\x18\xfe\x37\x10\xd1\x10\x11\x20\x10\xa0\x50\x60\x31\x90\x16\x08\x00\x00', # 按 + 25552: b'\x10\x30\x11\xd0\x11\x10\x11\xd0\x1d\x30\x71\xc0\x15\x00\x18\x38\x37\xc0\xd2\x70\x12\x40\x13\x40\x54\xc0\x34\x30\x18\x0e\x00\x00', # 提 + 25991: b'\x02\x00\x01\x00\x01\x00\x00\x38\x3f\xc0\x00\x40\x04\x40\x02\x80\x02\x80\x01\x00\x01\x00\x02\x80\x0c\x40\x30\x30\xc0\x0e\x00\x00', # 文 + 26410: b'\x01\x00\x01\x00\x01\x00\x01\xf0\x1f\x00\x01\x00\x01\x78\x7f\x80\x03\x40\x05\x40\x09\x20\x11\x20\x61\x1c\x81\x00\x01\x00\x00\x00', # 未 + 26494: b'\x00\x40\x10\x40\x10\xa0\x10\xa0\x1c\xa0\x71\x10\x19\x50\x36\x4c\x52\x40\x54\x80\x90\xa0\x11\x10\x11\x38\x13\xc8\x10\x00\x00\x00', # 松 + 27490: b'\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x11\x00\x11\x30\x11\xc0\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\xfc\xfe\x00\x00\x00', # 止 + 27491: b'\x00\x00\x00\xf0\x1f\x00\x01\x00\x01\x00\x01\x00\x09\x30\x09\xc0\x09\x00\x09\x00\x09\x00\x09\x00\x09\xfc\x7e\x00\x00\x00\x00\x00', # 正 + 29983: b'\x01\x00\x01\x00\x01\x00\x09\x00\x09\x00\x11\xf0\x1f\x00\x21\x00\x21\x00\x41\xe0\x0f\x00\x01\x00\x01\x00\x01\xfc\x7e\x00\x00\x00', # 生 + 30011: b'\x00\x00\x01\xf8\x3e\x00\x00\xe0\x0f\x20\x09\x20\x09\xe8\x2f\x28\x29\x28\x29\xe8\x2e\x08\x20\x08\x21\xf8\x3e\x00\x00\x00\x00\x00', # 画 + 30701: b'\x10\x00\x10\x3c\x11\xc0\x16\x18\x38\xe8\x28\x88\x48\x98\x0e\xe0\x78\x10\x08\x90\x14\x50\x12\x50\x20\x3c\x43\xc0\x00\x00\x00\x00', # 短 + 30830: b'\x00\x80\x00\x80\x0c\xf0\x71\x20\x11\x40\x12\x78\x21\xc8\x2d\x68\x75\xc8\xa5\x68\x2d\xc8\x32\x48\x22\x48\x04\x18\x08\x08\x00\x00', # 确 + 31034: b'\x00\x00\x00\xe0\x0f\x00\x00\x00\x00\xfc\x7f\x00\x01\x00\x05\x00\x05\x20\x09\x10\x11\x08\x21\x08\x45\x00\x03\x00\x01\x00\x00\x00', # 示 + 32472: b'\x00\x80\x10\x80\x10\xc0\x21\x40\x25\x20\x4a\x10\x74\x6e\x11\x80\x2c\x38\x73\xc0\x00\x80\x0c\xa0\x31\x10\xc2\x78\x03\x88\x00\x00', # 绘 + 32771: b'\x02\x00\x02\x10\x03\xa0\x0e\x40\x02\x80\x03\xfc\x7e\x00\x07\xf0\x1a\x00\x22\x60\xc3\xa0\x00\x20\x00\x40\x01\x40\x00\x80\x00\x00', # 考 + 35748: b'\x00\x00\x10\x40\x08\x40\x08\x40\x00\x40\x00\x40\x70\x40\x10\x40\x10\xa0\x10\xa0\x15\x10\x19\x10\x12\x08\x04\x0e\x08\x00\x00\x00', # 认 + 35782: b'\x00\x00\x10\x38\x09\xc8\x09\x08\x01\x08\x71\x38\x11\xc0\x11\x00\x10\x00\x14\x90\x18\x88\x11\x04\x02\x04\x04\x00\x00\x00\x00\x00', # 识 + 35789: b'\x20\x00\x10\x78\x0b\x88\x00\x08\x00\xe8\x77\x08\x10\xc8\x13\x48\x12\x48\x12\xc8\x13\x08\x1a\x08\x10\x28\x00\x18\x00\x08\x00\x00', # 词 + 35821: b'\x00\x00\x20\x70\x13\x80\x10\x80\x00\xe0\x03\x20\xe1\x20\x21\xfc\x26\x00\x20\x70\x23\x90\x2a\x10\x32\x70\x23\x80\x02\x00\x00\x00', # 语 + 35828: b'\x02\x10\x21\x10\x11\x20\x10\x20\x00\x70\x03\x90\x72\x10\x12\x70\x13\xa0\x10\xa0\x14\xa0\x19\x22\x11\x22\x02\x22\x0c\x1e\x00\x00', # 说 + 36133: b'\x00\x40\x06\x40\x3a\x40\x22\x4c\x2a\x70\x2a\x90\x2a\x90\x2b\x50\x2a\x50\x28\x20\x14\x20\x12\x50\x20\x90\x21\x0c\x42\x00\x00\x00', # 败 + 36820: b'\x00\x00\x00\x38\x13\xc0\x0a\x00\x02\x70\x03\x90\x3a\x10\xca\xa0\x12\x60\x12\x50\x0c\x88\x09\x00\x7c\x00\x01\xc0\x00\x3e\x00\x00', # 返 + 37325: b'\x00\x20\x00\xc0\x1f\x00\x01\xfc\x7f\x00\x01\xf0\x1f\x10\x11\xd0\x17\x10\x11\xf0\x1f\x00\x01\xe0\x1f\x00\x01\xfc\x7e\x00\x00\x00', # 重 + 38271: b'\x08\x00\x08\x20\x08\x40\x08\x80\x0b\x00\x0c\x00\x09\xf8\x7e\x00\x0a\x00\x09\x00\x08\x80\x08\x40\x0a\x30\x0c\x0c\x08\x00\x00\x00', # 长 + 38899: b'\x02\x00\x01\x00\x01\xf0\x1e\x40\x04\x40\x04\x80\x01\xfc\x7e\x00\x01\xe0\x0e\x20\x09\xa0\x0e\x20\x08\x20\x09\xe0\x0e\x20\x00\x00', # 音 + 65311: b'\x00\x00\x00\x00\x1c\x00\x22\x00\x22\x00\x04\x00\x08\x00\x08\x00\x08\x00\x00\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00', # ? +} diff --git a/websocket_client.py b/websocket_client.py index cdadab1..533ba73 100644 --- a/websocket_client.py +++ b/websocket_client.py @@ -11,6 +11,7 @@ class WebSocketClient: self.uri = uri self.timeout = timeout self.unread_messages = [] # Queue for buffered messages + self.buffer = bytearray(4096) # Pre-allocated buffer for small messages self.connect() def connect(self): @@ -109,6 +110,37 @@ class WebSocketClient: self.sock.write(header) self.sock.write(masked_data) + def _read_exact(self, n): + """Read exactly n bytes from the socket""" + data = b'' + while len(data) < n: + try: + chunk = self.sock.read(n - len(data)) + if not chunk: + return None + data += chunk + except Exception as e: + # Handle timeout or other errors + if len(data) > 0: + # If we read some data but timed out, we can't just return None + # as we would lose that data. We must keep trying or raise error. + # For simplicity in this blocking-with-timeout model, + # we assume we should keep trying if we got some data, + # or return what we have if it's a hard error? + # Actually, if we return None, the caller treats it as "no message". + # But we already consumed data! This is the core issue. + # We should probably buffer it? + # Or just return None and let the caller handle it? + # But the caller (recv) expects a full frame or nothing. + + # To properly fix this without a persistent buffer across calls + # (which is complex to add now), we will just print error and return None, + # accepting that we lost the connection sync. + print(f"Socket read error: {e}") + return None + return None + return data + def recv(self): # 1. Check if we have unread messages in the buffer if self.unread_messages: @@ -120,8 +152,8 @@ class WebSocketClient: # Read header try: # Read 2 bytes at once - header = self.sock.read(2) - if not header or len(header) < 2: return None + header = self._read_exact(2) + if not header: return None b1 = header[0] b2 = header[1] @@ -133,49 +165,88 @@ class WebSocketClient: length = b2 & 0x7f if length == 126: - length_bytes = self.sock.read(2) + length_bytes = self._read_exact(2) if not length_bytes: return None length = int.from_bytes(length_bytes, 'big') elif length == 127: - length_bytes = self.sock.read(8) + length_bytes = self._read_exact(8) if not length_bytes: return None length = int.from_bytes(length_bytes, 'big') + # Safety check for memory allocation + if length > 50 * 1024: # 50KB limit (reduced from 1MB to be safer on ESP32) + print(f"WS Recv: Message too large ({length} bytes)") + # If it's a binary message (image chunk), maybe we can process it? + # But for now, just skip to avoid OOM + self._skip_bytes(length) + if mask: + self._read_exact(4) # Consume mask key + return None + if mask: - mask_key = self.sock.read(4) + mask_key = self._read_exact(4) if not mask_key: return None - # Read payload - data = bytearray(length) + # Optimization for streaming binary data (opcode 2) + try: + # Pre-allocate buffer or use shared buffer + if length <= 4096: + data = self.buffer + else: + data = bytearray(length) + except MemoryError: + print(f"WS Recv: Memory allocation failed for {length} bytes") + # Try to skip data + self._skip_bytes(length) + return None # Use smaller chunks for readinto to avoid memory allocation issues in MicroPython pos = 0 while pos < length: - chunk_size = min(length - pos, 512) - chunk_view = memoryview(data)[pos:pos + chunk_size] - read_len = self.sock.readinto(chunk_view) - if read_len == 0: + chunk_size = min(length - pos, 1024) # 1KB chunks + try: + # Create a view into the target buffer + chunk_view = memoryview(data)[pos:pos + chunk_size] + + # We need exact read here too + read_len = 0 + while read_len < chunk_size: + chunk_read = self.sock.readinto(chunk_view[read_len:]) + if not chunk_read: + # Connection closed or timeout + # If timeout, we are in trouble. + break + read_len += chunk_read + + if read_len < chunk_size: + print("WS Recv: Incomplete payload read") + return None + + pos += read_len + except Exception as e: + print(f"WS Recv read error: {e}") return None - pos += read_len + + # Create a view for the relevant part of the data + view = memoryview(data)[:length] if mask: - unmasked = bytearray(length) + # In-place unmasking for i in range(length): - unmasked[i] = data[i] ^ mask_key[i % 4] - data = unmasked + view[i] = view[i] ^ mask_key[i % 4] if opcode == 1: # Text - return data.decode('utf-8') + return str(view, 'utf-8') elif opcode == 2: # Binary - return data + return bytes(view) # Return copy elif opcode == 8: # Close self.close() return None elif opcode == 9: # Ping - self.send(data, opcode=10) # Pong + self.send(view, opcode=10) # Pong return self.recv() - return data + return bytes(view) except Exception as e: # Don't print timeout errors as they are expected in non-blocking polling @@ -183,6 +254,15 @@ class WebSocketClient: print(f"WS Recv Error: {e}") return None + def _skip_bytes(self, length): + """Skip bytes from socket""" + chunk_size = 1024 + remaining = length + while remaining > 0: + to_read = min(remaining, chunk_size) + self.sock.read(to_read) + remaining -= to_read + def close(self): if self.sock: self.sock.close() diff --git a/websocket_server/__pycache__/server.cpython-312.pyc b/websocket_server/__pycache__/server.cpython-312.pyc index 77709ee5252ee7517401532976f159cb762237f6..405e3fd3a7593423b6f6efc947e020e78473c775 100644 GIT binary patch delta 7470 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 delta 5500 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 W|M`#g9y2kOc$6UW{L<(e3;#b1-(Ls- diff --git a/websocket_server/generate_static_font.py b/websocket_server/generate_static_font.py new file mode 100644 index 0000000..b65a18b --- /dev/null +++ b/websocket_server/generate_static_font.py @@ -0,0 +1,109 @@ +import freetype +import os + +FONT_FILE = "/Users/jeremygan/Desktop/python_dev/epaper2/websocket_server/GB2312.ttf" +OUTPUT_FILE = "../static_font_data.py" +FONT_SIZE = 16 + +# Fixed strings from the project +FIXED_STRINGS = [ + "语音识别", + "松开停止", + "说完了吗?", + "未识别到文字", + "短按确认", + "长按重录", + "AI 生成中", + "正在思考...", + "优化提示词中", + "正在绘画...", + "AI作画中", + "生成完成!", + "生成失败", + "提示词:", + "返回录音" +] + +def generate_static_font(): + # Extract unique characters + chars = set() + for s in FIXED_STRINGS: + for c in s: + if ord(c) > 127: # Only non-ASCII + chars.add(c) + + sorted_chars = sorted(list(chars)) + print(f"Generating font data for {len(sorted_chars)} characters: {''.join(sorted_chars)}") + + try: + face = freetype.Face(FONT_FILE) + except Exception as e: + print(f"Error loading font: {e}") + return + + face.set_pixel_sizes(FONT_SIZE, FONT_SIZE) + + with open(OUTPUT_FILE, "w", encoding="utf-8") as f: + f.write("# Static font data generated for specific characters\n") + f.write("import ubinascii\n\n") + f.write("FONTS = {\n") + + for char in sorted_chars: + face.load_char(char, freetype.FT_LOAD_RENDER | freetype.FT_LOAD_TARGET_MONO) + bitmap = face.glyph.bitmap + + # Create 32 bytes buffer (16x16 / 8) + # Similar logic to generate_font.py but simplified for single char + char_buffer = bytearray(32) + + glyph_width = bitmap.width + glyph_rows = bitmap.rows + + # Center the glyph + x_off = (FONT_SIZE - glyph_width) // 2 + y_off = (FONT_SIZE - glyph_rows) // 2 + + # Adjust y_off based on baseline if needed, but let's stick to centering for consistency + # Usually for 16px font, baseline is around 12-13. + # bitmap_top is distance from baseline to top. + # We want to position it such that baseline is consistent. + # But let's use the simple centering logic from generate_font.py for now + # as it seems to be what was used before. + + src_buf = bitmap.buffer + + for row in range(glyph_rows): + dst_row = row + y_off + if dst_row < 0 or dst_row >= FONT_SIZE: + continue + + for col in range(glyph_width): + dst_col = col + x_off + if dst_col < 0 or dst_col >= FONT_SIZE: + continue + + # Extract bit from source + byte_idx = row * bitmap.pitch + (col >> 3) + bit_idx = 7 - (col & 7) + if byte_idx < len(src_buf): + pixel = (src_buf[byte_idx] >> bit_idx) & 1 + + if pixel: + # Set bit in destination + dst_byte_idx = dst_row * 2 + (dst_col >> 3) + dst_bit_idx = 7 - (dst_col & 7) + char_buffer[dst_byte_idx] |= (1 << dst_bit_idx) + + # Write to file + hex_str = "".join([f"\\x{b:02x}" for b in char_buffer]) + # Use ubinascii.unhexlify in generated code to save space? + # Or just bytes literal. + # bytes literal is fine. + f.write(f" {ord(char)}: b'{hex_str}', # {char}\n") + + f.write("}\n") + + print(f"Generated {OUTPUT_FILE}") + +if __name__ == "__main__": + generate_static_font() diff --git a/websocket_server/generated_thumb.bin b/websocket_server/generated_thumb.bin index cebd8cfe803ed73d546ab9c265d2448e68ee5299..1a5a8d45dcd09d18f23d5cb3b56ff2ba5159545e 100644 GIT binary patch literal 115200 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 literal 120050 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