From f92915057ad16585911230d0651450c992f896a7 Mon Sep 17 00:00:00 2001 From: chenjintao Date: Wed, 26 Aug 2026 14:49:41 +0800 Subject: [PATCH] feat(lcd): add boundary performance test --- .../src/runtime/control_plane_factory_cli.c | 16 ++ components/domain/include/domain.h | 2 + .../src/runtime/domain_runtime_adapters.c | 20 ++ components/platform/CMakeLists.txt | 16 ++ .../assets/lcd_optimized/lcdtest00.png | Bin 0 -> 2885 bytes .../assets/lcd_optimized/lcdtest01.png | Bin 0 -> 2965 bytes .../assets/lcd_optimized/lcdtest02.png | Bin 0 -> 2982 bytes .../assets/lcd_optimized/lcdtest03.png | Bin 0 -> 3043 bytes .../assets/lcd_optimized/lcdtest04.png | Bin 0 -> 2949 bytes .../assets/lcd_optimized/lcdtest05.png | Bin 0 -> 3225 bytes .../assets/lcd_optimized/lcdtest06.png | Bin 0 -> 3431 bytes .../assets/lcd_optimized/lcdtest07.png | Bin 0 -> 3369 bytes .../assets/lcd_optimized/lcdtest08.png | Bin 0 -> 3299 bytes .../assets/lcd_optimized/lcdtest09.png | Bin 0 -> 3458 bytes .../assets/lcd_optimized/lcdtest10.png | Bin 0 -> 3229 bytes .../assets/lcd_optimized/lcdtest11.png | Bin 0 -> 2966 bytes .../assets/lcd_optimized/lcdtest12.png | Bin 0 -> 2921 bytes .../assets/lcd_optimized/lcdtest13.png | Bin 0 -> 3020 bytes .../assets/lcd_optimized/lcdtest14.png | Bin 0 -> 2986 bytes .../assets/lcd_optimized/lcdtest15.png | Bin 0 -> 3033 bytes .../assets/lcd_optimized/manifest.json | 246 +++++++++++++++++- .../platform/assets/lcd_source/lcdtest00.png | Bin 0 -> 3321 bytes .../platform/assets/lcd_source/lcdtest01.png | Bin 0 -> 3574 bytes .../platform/assets/lcd_source/lcdtest02.png | Bin 0 -> 3767 bytes .../platform/assets/lcd_source/lcdtest03.png | Bin 0 -> 3903 bytes .../platform/assets/lcd_source/lcdtest04.png | Bin 0 -> 3579 bytes .../platform/assets/lcd_source/lcdtest05.png | Bin 0 -> 3996 bytes .../platform/assets/lcd_source/lcdtest06.png | Bin 0 -> 4089 bytes .../platform/assets/lcd_source/lcdtest07.png | Bin 0 -> 3753 bytes .../platform/assets/lcd_source/lcdtest08.png | Bin 0 -> 3860 bytes .../platform/assets/lcd_source/lcdtest09.png | Bin 0 -> 4008 bytes .../platform/assets/lcd_source/lcdtest10.png | Bin 0 -> 3545 bytes .../platform/assets/lcd_source/lcdtest11.png | Bin 0 -> 3169 bytes .../platform/assets/lcd_source/lcdtest12.png | Bin 0 -> 3453 bytes .../platform/assets/lcd_source/lcdtest13.png | Bin 0 -> 3710 bytes .../platform/assets/lcd_source/lcdtest14.png | Bin 0 -> 3443 bytes .../platform/assets/lcd_source/lcdtest15.png | Bin 0 -> 3646 bytes components/platform/src/lcd_direct.c | 133 +++++++++- components/platform/src/lcd_direct_assets.c | 27 ++ docs/lcd-boundary-test-preview.gif | Bin 0 -> 93077 bytes docs/lcd-boundary-test.zh-CN.md | 110 ++++++++ docs/lcd-expressions.md | 1 + tools/generate_lcd_boundary_frames.py | 145 +++++++++++ 43 files changed, 707 insertions(+), 9 deletions(-) create mode 100644 components/platform/assets/lcd_optimized/lcdtest00.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest01.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest02.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest03.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest04.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest05.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest06.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest07.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest08.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest09.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest10.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest11.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest12.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest13.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest14.png create mode 100644 components/platform/assets/lcd_optimized/lcdtest15.png create mode 100644 components/platform/assets/lcd_source/lcdtest00.png create mode 100644 components/platform/assets/lcd_source/lcdtest01.png create mode 100644 components/platform/assets/lcd_source/lcdtest02.png create mode 100644 components/platform/assets/lcd_source/lcdtest03.png create mode 100644 components/platform/assets/lcd_source/lcdtest04.png create mode 100644 components/platform/assets/lcd_source/lcdtest05.png create mode 100644 components/platform/assets/lcd_source/lcdtest06.png create mode 100644 components/platform/assets/lcd_source/lcdtest07.png create mode 100644 components/platform/assets/lcd_source/lcdtest08.png create mode 100644 components/platform/assets/lcd_source/lcdtest09.png create mode 100644 components/platform/assets/lcd_source/lcdtest10.png create mode 100644 components/platform/assets/lcd_source/lcdtest11.png create mode 100644 components/platform/assets/lcd_source/lcdtest12.png create mode 100644 components/platform/assets/lcd_source/lcdtest13.png create mode 100644 components/platform/assets/lcd_source/lcdtest14.png create mode 100644 components/platform/assets/lcd_source/lcdtest15.png create mode 100644 docs/lcd-boundary-test-preview.gif create mode 100644 docs/lcd-boundary-test.zh-CN.md create mode 100644 tools/generate_lcd_boundary_frames.py diff --git a/components/control_plane/src/runtime/control_plane_factory_cli.c b/components/control_plane/src/runtime/control_plane_factory_cli.c index 83416e5..1e8f805 100644 --- a/components/control_plane/src/runtime/control_plane_factory_cli.c +++ b/components/control_plane/src/runtime/control_plane_factory_cli.c @@ -577,6 +577,20 @@ static void handle_log_command(size_t argc, char *argv[]) } } +static void handle_lcd_test(void) +{ + const domain_expression_request_t request = { + .id = DOMAIN_EXPRESSION_LCD_BOUNDARY_TEST, + .trigger = DOMAIN_EXPRESSION_TRIGGER_FACTORY_LCD_TEST, + }; + esp_err_t err = domain_runtime_request_expression(&request); + if (err != ESP_OK) { + cli_write_error("lcd_test_failed"); + return; + } + cli_write_ok(); +} + static void handle_command_line(char *line) { trim_text(line); @@ -661,6 +675,8 @@ static void handle_command_line(char *line) handle_prepare_rotate(key_version); } else if (strcmp(cmd, "log") == 0) { handle_log_command(argc, argv); + } else if (strcmp(cmd, "lcd_test") == 0) { + handle_lcd_test(); } else { cli_write_error("unknown_command"); } diff --git a/components/domain/include/domain.h b/components/domain/include/domain.h index a3c4b6b..fca8f92 100644 --- a/components/domain/include/domain.h +++ b/components/domain/include/domain.h @@ -170,6 +170,7 @@ typedef enum { DOMAIN_EXPRESSION_WUXING, DOMAIN_EXPRESSION_LISTENING, DOMAIN_EXPRESSION_OTA_UPDATE, + DOMAIN_EXPRESSION_LCD_BOUNDARY_TEST, } domain_expression_id_t; typedef enum { @@ -198,6 +199,7 @@ typedef enum { DOMAIN_EXPRESSION_TRIGGER_OTA_UPDATE, DOMAIN_EXPRESSION_TRIGGER_MODEL_LUCKY_COLOR, DOMAIN_EXPRESSION_TRIGGER_PTT_BUTTON, + DOMAIN_EXPRESSION_TRIGGER_FACTORY_LCD_TEST, } domain_expression_trigger_t; typedef struct { diff --git a/components/domain/src/runtime/domain_runtime_adapters.c b/components/domain/src/runtime/domain_runtime_adapters.c index afd3f93..b40a5ee 100644 --- a/components/domain/src/runtime/domain_runtime_adapters.c +++ b/components/domain/src/runtime/domain_runtime_adapters.c @@ -81,6 +81,10 @@ static const uint8_t s_basic_face_frame_order[] = {0, 1, 2}; static const uint8_t s_muyu_frame_order[] = {0, 1, 2, 1}; static const uint8_t s_listening_frame_order[] = {0, 1, 2}; static const uint8_t s_ota_update_frame_order[] = {0, 1, 2}; +static const uint8_t s_lcd_boundary_test_frame_order[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, +}; static const char *const s_chouqian_result_asset_dirs[] = { "chouqian_buyun", "chouqian_heping", @@ -280,6 +284,22 @@ static const domain_expression_catalog_entry_t s_expression_catalog[] = { .frame_ms = 200, }, }, + { + .id = DOMAIN_EXPRESSION_LCD_BOUNDARY_TEST, + .platform_request = { + .kind = PLATFORM_LCD_PRESENTATION_ASSET_SEQUENCE, + .priority = 250, + .interrupt_current = true, + .return_to_idle = true, + .asset_dir = "lcd_boundary_test", + .frame_order = s_lcd_boundary_test_frame_order, + .frame_order_count = sizeof(s_lcd_boundary_test_frame_order) / + sizeof(s_lcd_boundary_test_frame_order[0]), + .repeat_count = 0, + .frame_ms = 1, + .duration_ms = 10000, + }, + }, }; static void snapshot_domain_wifi_behavior_hooks(domain_wifi_behavior_hooks_t *out_hooks) diff --git a/components/platform/CMakeLists.txt b/components/platform/CMakeLists.txt index bd13e81..3479036 100644 --- a/components/platform/CMakeLists.txt +++ b/components/platform/CMakeLists.txt @@ -156,6 +156,22 @@ set(platform_lcd_png_assets charging lowbat qrcode + lcdtest00 + lcdtest01 + lcdtest02 + lcdtest03 + lcdtest04 + lcdtest05 + lcdtest06 + lcdtest07 + lcdtest08 + lcdtest09 + lcdtest10 + lcdtest11 + lcdtest12 + lcdtest13 + lcdtest14 + lcdtest15 ) set(platform_lcd_png_asset_files) foreach(lcd_png_asset IN LISTS platform_lcd_png_assets) diff --git a/components/platform/assets/lcd_optimized/lcdtest00.png b/components/platform/assets/lcd_optimized/lcdtest00.png new file mode 100644 index 0000000000000000000000000000000000000000..cb11aac4d21dd17511e2b9c852a91041117a3777 GIT binary patch literal 2885 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest02.png b/components/platform/assets/lcd_optimized/lcdtest02.png new file mode 100644 index 0000000000000000000000000000000000000000..df813d2cd3aee00ab50905906b4a9004bd4d331f GIT binary patch literal 2982 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest04.png b/components/platform/assets/lcd_optimized/lcdtest04.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0e4c0e0e6af4e41a15b1c07d83672057c618be GIT binary patch literal 2949 zcmeHJSx}S78tp#`TO=f4fG8mQ3y^>_NKuj=$c z+R88-b}kkGfD2!~ECv85K!?8=qIGlVcvL(9Xh2&L7owv8XmtZtGg?eLX8NIh>4C#h)+mZpRj4;rcIkSrEW{j+MTs;&%S+m`w9yR%Sy}6 z)toz5cdn_Ssj0c?+Ldd!Z{69f42r~rRNJ;u*eA-dc~6RP>Ez!miW5j)vj(4cti7e^vk0Y{qG$jc z0J#9YGk^%|h(%h8e;xi0vJ@`r961k8W}o`x(zCnA!zZ<0J(chm zM5+)&_bRIlnCWaQyDWAv{7y9=eyuvOKxC+jfbN z$_EaUY=uh7gnGG#>>osHRaS7fWGg5+Db&v;uzwcis@&kPch8}caxL}?MUwzi#~ENA zmw~2iXX66|n(c7LI3DsGk)cTy9B_1@KSZ+CNwBm_{f`72xLt(PjM;Uj^u5%K=pibVdcyaRP`I7;?66F#o^nnm->~jf-m!6O(2_%XaX^Js7$%6L@mz4A7Vv!pI_lN^q&5|3G zb)N&NU+d$x0oWQ+zjHMu-=TU3meP;iX9K`Y|8vn_zlPtKf z>x_|);bor30r6yU#X0G$K^bAFMu}3zV_v!l44}1jF|2BhaX})HF=3dy&w0yPWd{zm z0`I><;Y^{}{j8xN{D6#NmqHhWzsxj;yZnKTo4`q*kW`4NRg#kp4qjkpMzg||f%?k> zc=AgeBTtkG4W<^8O@*Ck7?tkD^Ee$;AuzD4QJRrk?^^{Bkenyh#Y=mRi$%diMo^Kr zN>>$y^Xan{YIPBfmEq`%aXe*+(&!<#t#&4CV!L>0aCHo+UggmIj%q~lK)gh>%fN3}$zvabY%FsNFHL0qb`j{A1K)HNaM7f7 z3LLGr6u55%Tk4g?E-}9~ez8FA)gL_!^{!IjDuOo@j{EE}Z=%9;$byZ$c+=j#mXyPw zH(G&<>utE6&I;+lU(zw>7SH!hkYu83=%TV=qWGz?|FtZH-x{%1D#xEu7S!kF%W}~~ zhSZ_{pwJ(#j?fVEJH=Jtb-pxmQ8$!@3Um=9^SqO^VJ?C)I`6n!gCWAF9b3tnf#Vd; zadF41IQDdwk@>SB8DqIQBM9+SsVrj<{$JGPWF3k{_`T_ooaqi?we!NOk5@%Qbe+Dd zV{f2nI*S^TZkQbqXU;IMA?baIEhh`Y%^6HnYaY4a{daI`_8lB+FJieC!>xfZjnYG$ z6`&3(Y?RJ&DG2@p?xZV1{JWz!)|Eqz%7Q90P*KCZD4k`qF)S*h%;Bm}gY=Mf68GU{ zz1514)ux>fqr2z|n+wp11GX0pEY~2G-W^7tAg=Bbi+6!X>_iPpl-2ouQ<6>(6CD^B z#-!0%83Wv5Zi6)S7mBN&<~v6_jhe>M%o$I!c9^p;b7KoFCau@``a8hE1#Nl#Kh^R) zM!l~)VNGgzEkZ6ML&CivU56TBy4E;k93=~2^2<04g(p`MG1qd~BqS$d|`NY0%s z>osoW!K?|e>H<;hOrLpLp?_uU-P!Y=*cg_jU)ZYosglKM?h7Rbu`IsD98bF=OF-p~ zKq3On0dfhG&;-ERnA|03-`MS%pBq_j+-+!8=i_`sT628fks(v&R}~TNJ02-a3+b0;q1J8H^J*>k6eWRQgtjq zF}#}<>ms=Lb(I;ypUrRxKGBy6wd(reVWua-@5u~8_}!Ti2p`GRb<5o`EYtq7H|8Io ziWtK8x8o%fScCr7%L$VWoV^?79Cd!_rn9nzm=s?NmDvr3pi0QO`Pot%uU!vT0-c&8 zJ%`%HRpZ@#vhnq86VLX8Q+mppsc98HFC?d)5x~Dqb~mwY;4G|IFe~^=CQV_^YTzCdNq2U`LtAe?rVhPksGq)P8g?{A$;p6^TW* zuXE-tcHg3ox7<78cggRPc>8*rHy;JAKX%Pz4|cwoIsp0YrW&NbFngJ8;_EI-U8j7) zs4BUB2_)(^tsH?2{BSeD=pR2HGWimn6#W7?7f3n!heB%JyBp_x|Hy=gtX$R{#4Pw5 DTbwjY literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest05.png b/components/platform/assets/lcd_optimized/lcdtest05.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc4fe422a4b95f202b8b89aeb580774a090c0f7 GIT binary patch literal 3225 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest07.png b/components/platform/assets/lcd_optimized/lcdtest07.png new file mode 100644 index 0000000000000000000000000000000000000000..df5b7dabf7584bf59585d8e8103093d415a947e4 GIT binary patch literal 3369 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest08.png b/components/platform/assets/lcd_optimized/lcdtest08.png new file mode 100644 index 0000000000000000000000000000000000000000..1151b60a17750ec3af755ba94ffbba03b3485c8f GIT binary patch literal 3299 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 EFFru;UjP6A literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest11.png b/components/platform/assets/lcd_optimized/lcdtest11.png new file mode 100644 index 0000000000000000000000000000000000000000..bfee899c97b45faedae8acf15b1c0142ef9add23 GIT binary patch literal 2966 zcmeH}2~$(q5`b?KP$D9U$Rc4#NJPbD0A&>=ID}0^76~W<;o$;^7~C1Tkbrp_5CKh*8iT@!j+#UbOAR0jhzJj_1YA%s#sIk?+k~n&Rr7wrtD3H^K414a-PP5nPSwc? z+2&`oz;Xcq07e1+lrR85c4foNx0H6i*<_w_K8WrvDxEPA-${WG+>gtki1f z7M=Hx{4;_7j|uo3zAys-2B86z&EaW-lfz%*OI$Geabdj?)?X8T|)4!XY&_3bygsDH)%X3-4kZgnOcoWmVT zLat=~U1PqiJquVeXSgLmnSS4-&Hrrv{osGOef~f|$HDdQ%Zu*~y}#c&OV*5F3M4?b z!szEXwKT=ciELgN2O45tbR()PAU%<+5fRYp3Lw;Lysk_28!QQx9JIfaW}d-#0uXji zt0$W3W$qc}G0QV?gkji_P!E|DrmB`=`sw;rR%F0ntQokFFF_F%UCgG@bY@7V2|)_~ zOt``^-jM;$$8>h1Zj<>ygg!-f1c7dC21ZnujQkz>X!fTB)P+1c@NQC;&hUTX#z*_F zXBefe5R{VJI39e2zmwMJyG!QaALA!57xQ_Dx{q4D$7eV;N5_hftBeW{XjZ>ptLkLj zcqEadcegQ+JzWgM<19|bX%A44VzEiHz~7DGiaT5+;cZ6v62^crs{RwqgNp;Iq znTG%kKR(F-clAs+Eg_#*P_+n1X7E>&_|vMU@{<*8dXS)|{A4Lxa#TN34p-pz{D)1? zAk#4J;=mDCh#>G66}1NM%x=d*H#`PZqmP0U9Y}oHnW_z%?HD(4pj?)qT8Q)mlhh@n zC||HnJz;oM$hLn7Iq9W}ik{L>3iWZ)y;58gAxc#A1-W6CiCHV|7^`9EJtguFWEK-5 zL`AP8c5G8=2ExlqK*iXJcgfM3Ls}>6a8c1)`eIftd{5bx?S+L_F*cKxEc{AwdKTog za+|2x4RKM<#4i``x)9ePk*wI9$ClV;b`%hNMQ;#eCxM5^`*`V-cDfmh4f8DsKJ&Dd z21K<<^cA*bZ|44G0z`ZcypQ{@+8*)+ny`@q2JY7bLDQXnR+9uDJ>Er@*c*&v3AjYg5+U%Q-JVcnklaxp`z z_g#a9*832{)vNd-hVOgzWgXm;h6#kGSc}O)ONYIPvxLj+o7+v=d0K4;c6nO4*frOhEdZ>eB!E~ReBR~NtoRxcu@)BQphGwIr^0%Ny5ODddKyo?vQ;=jML zCInGd$&g=1P>bBD;IPktu4dy$!NF5+O=sD`EhJb!Ct)kP+&KKvRtiiMh- zpSjSu(ga~YiEoEqe}*>*uZ|nSLeE*(Zbcqa={IDtd5s+PHCv)5t)<&FzYqO1ib?Lg zvdH2k3h2xUnE+bfxUm%bGd&LrqOj0U!bH)=XOXVrKa_1@^ki^Vl*H^S*rM5Kjb~`a{-W2JI z8QxD+1mhqbr@ZY;#Z=A`{qxe~aG!52qaEk@zdAp!->`lw?*`J$%?~b!N6)Tna) zz#dcDkNK>OruIt1fqkaXDT5?h2{XsM?kIrciqm1m_&YkvC91`BMD@C8*}$ysv7}JI zvuC6CZHoKMHDN9=uSg+@JuXQ`(>7!$$zqJts-cSw7So78)Y!&fN}O}y?rX~PWl+WuJy%OyjRx6P4P^s~7ujhdN z-l(|T9or08BTmw=!remX(mT$h#qU=S=eR{WQUThR*fcAxYWG3pRl^-xEA~RS-%nU0 z)B4slN_+ba5KxJka`1W5U9BYEE9Q^rxjsh#yX(M$@;QBm@~pCT#)U+MD)E}`>C^_m S@cP_0D8OeM<<2j0*?$5HPGEEZ literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest12.png b/components/platform/assets/lcd_optimized/lcdtest12.png new file mode 100644 index 0000000000000000000000000000000000000000..10979b3c769aead58fb53e4980881c392972dbbb GIT binary patch literal 2921 zcmeHJX;+h35`L2a2@sJ8X|V|^;Km{Wab&XzFcJ_&wjkSJqJRpDVPsWf2pARv0^K63 z2&e%yK(Li%WK4n>af7hfK(m+-MN}HY3pTugKsxmJW#$LWr+z-vt>;$VQ_rb$?yY;- z_mIaLt?#t}09do%bDuu|z+6=R3<{yL#5wN}06+k~2TATK3IIw#ZPfruB}xS}N>^9c z0B2yl+1PlCvDpqYGfOiYYa2IrH?RF(Ufy2*e*XS}{-GhEq2ZzNiSZXMUSOs(nVHO7 zR&H)y?)9?k?3-+M4ZHqc{bSzaXC2R;bw2BU)!i-X9vB>WD}F1RlBuvTx1hpmO;yz; zrE+yqvA^(F2mY@e*luYX0|2Nk`}et$Qii81PDPaO(a(&&xjQ0kaLlnUG4?@NdCKJ# zr6>&D?CORZ>*=-VmiG;7AyZBx-12p40Hi(my5=8U<2jdaMV$T9wR0w54H%$y%YRT{J)aFkq?NWI5m&8 zjRCg;Z%uuUNtN4deN6>|9SBC0$Q1{{u)N7!Fr=_${4y5+BTf#&21GtEgGw@@6+sVR zXwKRSZUYMfD%{$gt}d~Ht^ilxSHee;d~LyQ`F0@ri41M+w}O!zfhvHSm#MH;Lpnkb zDHj0?9b9CIl~PlZ2N}V(y(R#odIUW|w&DjtIA{yxzF3vOcM#lBpsiO$BsvOO{}j;= zBYyZ(1j3-4j0o;q5o!FSHxUF7seG+QeR|P21StX-;0PD6Ocxhk>x*F+JY3NfsErWR zJw-mIk?#z7D;NrEx)RtjS*s+jFD5J>l`P_ctEZKyf)cR;bs~J_Y$!-pZlIJ+^MTtF z>(A1CF^{-PHS6B_O4v`cwvzZzdU{X9GD1KaAp?RNZXah)Fy8>t@`-RBvgGs()-pm(kdak#8H$YV@$*EL=r|yQkpCr>YtYel7SyV^5d3(}! z7S)R$kUs6KFP_8xT@wplDP)Ad!y(Zgfc>a}o6zz1wYqgga7E zO3~BUoh<5c`XrYUmLn~%5W6(i6G879`=!xwt|z!vlDs82UuqaDV2(++MDU8u(36p0 zFzZeVi<#mlfaYzf6Q5r=p^@naBa&#Bp;9D(!HO4QXTC`E%(82oS{W?-20{c9uCH{eQ%Yt{8(PpBkh#E!s3F;Pcvz?&@eFtMYIR?$@vaUhdh1?i`%Ks#C5K<7Zw** zjxVjPg&e!8yCHeI8SetT7I{BX zIEe0PUN%-Fr2A!hgs`}nD&BII;N-U2+HIxdenrw#@S#|A&)m{2?TxBZ8jQJVA8qS_ z0Cw%= zA}I%^(#BVK@8*}T(l&Tcv<|Q7u}ph=;KP^xw5B$j23AP7;qLQmfZf8N)1eV2l;t=U zwZ`E|cc$TWY56(U;O9wXEwt|7{rhx!91H(KAM*$+BTzS_2Wm>n`N|X) zzS<<#pQP%qoBMEr0;rQ7xO3c-|KZArmk`h^?EsZX#LFMX8YwHyYb+#Hp7IRuU=}gE58x%JgMKzl6?+<@AB^L zsF#)}GB2KEnFfK=^Qz2A-L|N_ou{$l>w#*q@r8aI$m$K_Wh!!g6N}o7IW%Py*JI9e z$e9`P&~@QJ$8ptR8`9eAq-}3qJ)is3bzzWo(kWhQ`D9j|l#^$z*(W-I5H2`SQE6qP zy7~Y)$zKpb}@0DG!x+@an3yv*nRL}TRU|4dSoB7Q(280X)Uod<``R`Yz=Dbs# zcuYj2eAa_R8_YSVv7y8*n_;%2fJJRt!Ff>Co<|W-wA{gQ)j{*so@(}+Xp$X z^Y205_2;b`9S&5~m&bv=`;XD7gT5dr(~2sr*krgGD_%EzA1j6rw`0kRNpZqro>4fs zm6{bqyE`&|4=Nha2@3U)33>vI+wl934sb2-HF$K@!|!=B+=PM6`xC{7o>tdLpn1{EAp~`nE~v#bB(Y_dJK6wqm-6- zIgyb(>zpfg&0#MzGzFi}H;@D?yVpu86u1;c1OvhE48Y4-uuK4#3bmkn;Bi+UV82al k!7yy2{dG6>=NPOKv76$Al{7c7S3fBG-4E?+aHFLE0WSG%lK=n! literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_optimized/lcdtest13.png b/components/platform/assets/lcd_optimized/lcdtest13.png new file mode 100644 index 0000000000000000000000000000000000000000..899ed82783c3fcc450314530df9d2266f36f11d3 GIT binary patch literal 3020 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 A<^TWy literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest01.png b/components/platform/assets/lcd_source/lcdtest01.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3e9dbd55e4b38d2a50567c13c58937c228868d GIT binary patch literal 3574 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 Y&ySCJ+1i~0{^vwITzy@doiF_MAEiQb5&!@I literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest02.png b/components/platform/assets/lcd_source/lcdtest02.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6b29f876bb2fd58ba397cd9ef30d81962582a9 GIT binary patch literal 3767 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest06.png b/components/platform/assets/lcd_source/lcdtest06.png new file mode 100644 index 0000000000000000000000000000000000000000..5f23210eb07e4c22eb097d1bf96cb30e39650b20 GIT binary patch literal 4089 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 KtgEfA{q}E`_I*tN literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest11.png b/components/platform/assets/lcd_source/lcdtest11.png new file mode 100644 index 0000000000000000000000000000000000000000..cb459a8c78457b334394584f860f4780b501743e GIT binary patch literal 3169 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest13.png b/components/platform/assets/lcd_source/lcdtest13.png new file mode 100644 index 0000000000000000000000000000000000000000..f9859073aca8663707a329173431c18afbca421e GIT binary patch literal 3710 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 literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest14.png b/components/platform/assets/lcd_source/lcdtest14.png new file mode 100644 index 0000000000000000000000000000000000000000..32667130960304039bd90574acc1bbdcf9fd0374 GIT binary patch literal 3443 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 E06lsG=Kufz literal 0 HcmV?d00001 diff --git a/components/platform/assets/lcd_source/lcdtest15.png b/components/platform/assets/lcd_source/lcdtest15.png new file mode 100644 index 0000000000000000000000000000000000000000..141abd7407c4250cc50e4aef34a380aaccfb3514 GIT binary patch literal 3646 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 == NULL || icons == NULL || - icon_count >= icon_capacity || strstr(image->path, "/qrcode.png") != NULL) { + icon_count >= icon_capacity || strstr(image->path, "/qrcode.png") != NULL || + strstr(image->path, "/lcdtest") != NULL) { return icon_count; } @@ -1011,7 +1021,8 @@ static esp_err_t lcd_direct_draw_png_image(const lcd_direct_image_t *image, combined_icon_count, prepared_icons, sizeof(prepared_icons) / sizeof(prepared_icons[0])); - const bool clock_visible = strstr(image->path, "/qrcode.png") == NULL; + const bool clock_visible = strstr(image->path, "/qrcode.png") == NULL && + strstr(image->path, "/lcdtest") == NULL; char clock_text[LCD_DIRECT_CLOCK_TEXT_LENGTH + 1U] = {0}; if (clock_visible) { lcd_direct_clock_text(clock_text); @@ -1193,6 +1204,9 @@ static uint32_t lcd_direct_asset_sequence_hold_ms(const lcd_direct_request_t *re LCD_DIRECT_BASIC_FACE_LAST_FRAME_HOLD_MS : LCD_DIRECT_BASIC_FACE_FRAME_HOLD_MS; } + if (request != NULL && strcmp(request->asset_dir, "lcd_boundary_test") == 0) { + return frame_ms; + } if (frame_index + 1U != frame_count) { return frame_ms; } @@ -1204,6 +1218,9 @@ static uint32_t lcd_direct_asset_sequence_duration_ms(const lcd_direct_request_t if (request == NULL || request->duration_ms == 0U) { return 0U; } + if (strcmp(request->asset_dir, "lcd_boundary_test") == 0) { + return request->duration_ms; + } const size_t frame_count = request->frame_order_count > 0U ? request->frame_order_count : 1U; const uint32_t frame_ms = lcd_direct_asset_sequence_frame_ms(request); @@ -1284,7 +1301,8 @@ static esp_err_t lcd_direct_draw_asset_sequence_once(const lcd_direct_request_t static esp_err_t lcd_direct_draw_asset_sequence_for_duration(const lcd_direct_request_t *request, TickType_t start_tick, - TickType_t duration_ticks) + TickType_t duration_ticks, + lcd_direct_sequence_perf_t *perf) { ESP_RETURN_ON_FALSE(request != NULL, ESP_ERR_INVALID_ARG, @@ -1312,9 +1330,21 @@ static esp_err_t lcd_direct_draw_asset_sequence_for_duration(const lcd_direct_re request->asset_dir, (unsigned)frame_index); + const int64_t draw_started_us = esp_timer_get_time(); ESP_RETURN_ON_ERROR(lcd_direct_draw_png_image(frame, NULL, 0), TAG, "draw timed asset frame failed"); + const uint32_t draw_us = (uint32_t)(esp_timer_get_time() - draw_started_us); + if (perf != NULL) { + perf->completed_frames++; + perf->total_draw_us += draw_us; + if (draw_us < perf->min_draw_us) { + perf->min_draw_us = draw_us; + } + if (draw_us > perf->max_draw_us) { + perf->max_draw_us = draw_us; + } + } const TickType_t now = xTaskGetTickCount(); const TickType_t elapsed_ticks = now - start_tick; @@ -1332,6 +1362,91 @@ static esp_err_t lcd_direct_draw_asset_sequence_for_duration(const lcd_direct_re return ESP_OK; } +static void lcd_direct_log_sequence_perf(const lcd_direct_request_t *request, + const char *mode, + const lcd_direct_sequence_perf_t *perf, + uint64_t elapsed_us) +{ + if (request == NULL || perf == NULL || perf->completed_frames == 0U || elapsed_us == 0U) { + return; + } + + const uint64_t fps_x100 = + ((uint64_t)perf->completed_frames * 100000000ULL) / elapsed_us; + const uint32_t average_draw_us = + (uint32_t)(perf->total_draw_us / perf->completed_frames); + ESP_LOGI(TAG, + "LCD sequence perf asset=%s mode=%s working_set=%u cache_capacity=%u " + "frames=%u elapsed_ms=%llu fps=%llu.%02llu draw_us_avg=%u " + "draw_us_min=%u draw_us_max=%u hold_ms=%u", + request->asset_dir, + mode, + (unsigned)request->frame_order_count, + (unsigned)LCD_DIRECT_FRAME_CACHE_MAX, + (unsigned)perf->completed_frames, + (unsigned long long)(elapsed_us / 1000ULL), + (unsigned long long)(fps_x100 / 100ULL), + (unsigned long long)(fps_x100 % 100ULL), + (unsigned)average_draw_us, + (unsigned)perf->min_draw_us, + (unsigned)perf->max_draw_us, + (unsigned)lcd_direct_asset_sequence_frame_ms(request)); +} + +static esp_err_t lcd_direct_run_sequence_perf_stage(const lcd_direct_request_t *request, + uint32_t duration_ms, + const char *mode) +{ + const TickType_t start_tick = xTaskGetTickCount(); + const TickType_t duration_ticks = pdMS_TO_TICKS(duration_ms); + const int64_t started_us = esp_timer_get_time(); + lcd_direct_sequence_perf_t perf = { + .min_draw_us = UINT32_MAX, + }; + esp_err_t err = lcd_direct_draw_asset_sequence_for_duration( + request, start_tick, duration_ticks, &perf); + const uint64_t elapsed_us = (uint64_t)(esp_timer_get_time() - started_us); + lcd_direct_log_sequence_perf(request, mode, &perf, elapsed_us); + return err; +} + +static esp_err_t lcd_direct_run_boundary_test(const lcd_direct_request_t *request) +{ + ESP_RETURN_ON_FALSE(request != NULL && + request->frame_order_count > LCD_DIRECT_BOUNDARY_TEST_CACHE_HIT_FRAMES, + ESP_ERR_INVALID_ARG, + TAG, + "invalid LCD boundary test request"); + + lcd_direct_request_t cache_hit_request = *request; + cache_hit_request.frame_order_count = LCD_DIRECT_BOUNDARY_TEST_CACHE_HIT_FRAMES; + + ESP_RETURN_ON_ERROR(lcd_direct_preheat_asset_sequence(&cache_hit_request), + TAG, + "preheat cache-hit frames failed"); + + const uint32_t cache_hit_duration_ms = request->duration_ms / 2U; + const uint32_t cache_thrash_duration_ms = request->duration_ms - cache_hit_duration_ms; + ESP_RETURN_ON_ERROR(lcd_direct_run_sequence_perf_stage( + &cache_hit_request, cache_hit_duration_ms, "cache_hit"), + TAG, + "cache-hit performance stage failed"); + + lcd_direct_request_t cache_thrash_preheat = *request; + cache_thrash_preheat.frame_order_count = LCD_DIRECT_BOUNDARY_TEST_CACHE_HIT_FRAMES; + const size_t first_preheat_frame = + request->frame_order_count - LCD_DIRECT_BOUNDARY_TEST_CACHE_HIT_FRAMES; + memcpy(cache_thrash_preheat.frame_order, + &request->frame_order[first_preheat_frame], + LCD_DIRECT_BOUNDARY_TEST_CACHE_HIT_FRAMES * sizeof(cache_thrash_preheat.frame_order[0])); + ESP_RETURN_ON_ERROR(lcd_direct_preheat_asset_sequence(&cache_thrash_preheat), + TAG, + "preheat cache-thrash frames failed"); + + return lcd_direct_run_sequence_perf_stage( + request, cache_thrash_duration_ms, "cache_thrash"); +} + static esp_err_t lcd_direct_play_asset_sequence(const lcd_direct_request_t *request) { ESP_RETURN_ON_FALSE(request != NULL, @@ -1359,9 +1474,15 @@ static esp_err_t lcd_direct_play_asset_sequence(const lcd_direct_request_t *requ } if (request->duration_ms > 0U) { - const TickType_t start_tick = xTaskGetTickCount(); - const TickType_t duration_ticks = pdMS_TO_TICKS(lcd_direct_asset_sequence_duration_ms(request)); - esp_err_t err = lcd_direct_draw_asset_sequence_for_duration(request, start_tick, duration_ticks); + esp_err_t err; + if (strcmp(request->asset_dir, "lcd_boundary_test") == 0) { + err = lcd_direct_run_boundary_test(request); + } else { + err = lcd_direct_run_sequence_perf_stage( + request, + lcd_direct_asset_sequence_duration_ms(request), + "normal"); + } if (err != ESP_OK) { return err; } diff --git a/components/platform/src/lcd_direct_assets.c b/components/platform/src/lcd_direct_assets.c index e61be78..25f9497 100644 --- a/components/platform/src/lcd_direct_assets.c +++ b/components/platform/src/lcd_direct_assets.c @@ -32,6 +32,25 @@ static const lcd_direct_image_t s_ota_frames[] = { {.path = LCD_ASSET_BASE_PATH "ota3.png"}, }; +static const lcd_direct_image_t s_lcd_boundary_test_frames[] = { + {.path = LCD_ASSET_BASE_PATH "lcdtest00.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest01.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest02.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest03.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest04.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest05.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest06.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest07.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest08.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest09.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest10.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest11.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest12.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest13.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest14.png"}, + {.path = LCD_ASSET_BASE_PATH "lcdtest15.png"}, +}; + static const lcd_direct_image_t s_wifi_connecting_qr_frames[] = { {.path = LCD_ASSET_BASE_PATH "qrcode.png"}, }; @@ -270,6 +289,14 @@ const lcd_direct_image_t *lcd_direct_asset_frame(const char *asset_dir, uint8_t frame_index); } + if (strcmp(asset_dir, "lcd_boundary_test") == 0) { + return lcd_direct_frame_from_array( + s_lcd_boundary_test_frames, + sizeof(s_lcd_boundary_test_frames) / + sizeof(s_lcd_boundary_test_frames[0]), + frame_index); + } + if (strcmp(asset_dir, "wifi_connecting_qr") == 0) { return lcd_direct_frame_from_array( s_wifi_connecting_qr_frames, diff --git a/docs/lcd-boundary-test-preview.gif b/docs/lcd-boundary-test-preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..66090f6db5a74b8b162da90c80b4a0914053dca3 GIT binary patch literal 93077 zcmdShRZyJonyCH8osd8p3lIVcP9Pz;26qS$T!TyF?(PJ4cXx-z-QBx!_u$%_HUGU= zty(kR%$}M0s%GCOU48I$^?TO!d#=7k#YNaTbot@V0R8{~>~8~jetv#>dU||(e0X@c zzrVk{yu7%$I6OSu-Q9&kp*1x%)z#INm6a706@`U`xw*MHIXQklelLdsFo2tzo2#p< zot>STnVG4nskXMZmX?;Lrlz{Ox}2Pxq@<*TgoL=b_?ItVn3$Lt85zmnlfQre{^cYL z03aeFA|xavARu`2<_!)G&Z}3iUcM3FKQrVo3>jfX1wjEh;V+C#2yicF$?p(RQD0u^ z|Moe5drSZ-3;>7vPOLJs(-#$&R%4(tt2+>fLLybHD!Vt7fG&Swpo+pP;=N$VJMrq= z!5C_VVvWJ-yx|0P(UFRBB8iLvnJK9pbzp5>tp)aj*e7I>rB^yT)eSN(9-Ck0Asl`QcZJ`03O|`W} zb!#9_5@vus#c_EtJ?&dR#@q5Ry)5pMu}bu4b}m2Y+UiCMcG*9wyCHQr9~9MgyoTT} zi#nXouiC=k2z2Zb-l$}Xp?pZx(ZAjA$uz*`HCFd)mKM|XZ`Tac4d}5LSof)=q1>>b z+%eR%q|Pt=AVy!mxA6-r4~OFW*9esyBep;BIVN0x7B)@!K-62Jf~1ODhN2&m^o=Fs z=k!HozZ2%UE6Awk$toMh8yKnEEN<&++u-G!{)%pzPD08n+DZ1P<5)@w=xv%z4WC8R zN^;6BqSAJQ-!anhLZ+q83L^}8mmREEPn{Fac}1NYh0I2i*Qa_*y-LZ?5T-JF!E5R@Fn3Oe_Ym z>�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 YhiWxOV;SP9Dn}X(mMb+l=m5Td0bUtn4FCWD literal 0 HcmV?d00001 diff --git a/docs/lcd-boundary-test.zh-CN.md b/docs/lcd-boundary-test.zh-CN.md new file mode 100644 index 0000000..0162744 --- /dev/null +++ b/docs/lcd-boundary-test.zh-CN.md @@ -0,0 +1,110 @@ +# LCD 边界测试动画 + +## 测试资源 + +测试动画包含 16 张 320×240 PNG,对应当前单次播放请求允许的最大帧序列长度。 + +文件名为: + +```text +lcdtest00.png +lcdtest01.png +... +lcdtest15.png +``` + +每帧包含以下测试元素: + +- 1 像素外边框和四色角标,用于检查裁切、偏移和方向; +- RGB565 基础色条,用于检查 RGB/BGR 色序和颜色异常; +- 连续移动的竖直白线和水平黄线,用于观察撕裂和跳帧; +- 旋转红色指针和移动方块,用于观察运动连续性; +- `F00`~`F15` 帧号,用于识别乱序和重复帧; +- 16 格进度条,用于识别丢帧; +- 4 位红绿二进制标记,用于辅助确认帧编号。 + +第 15 帧播放完后可以平滑回到第 0 帧。 + +## 真机触发 + +固件需要启用 Factory CLI。通过 UART0 发送: + +```text +lcd_test +``` + +设备返回: + +```text +OK +``` + +测试动画会: + +- 立即打断当前普通动画; +- 先循环播放 `00 → 05`,再按 `00 → 15` 顺序循环; +- 每次全屏绘制后只等待 1 ms; +- 两个性能阶段各运行约 5 秒,总计约 10 秒(不含预热时间); +- 完成后自动返回待机动画。 + +1 ms 是额外等待时间,不代表 1000 FPS。实际帧率由 PNG 读取和解码、RGB565 转换、缓存命中情况以及 40 MHz SPI 全屏传输共同决定。 + +## 性能日志 + +测试会输出两条性能汇总日志,不会逐帧打印性能日志并干扰测试: + +```text +LCD sequence perf asset=lcd_boundary_test mode=cache_hit working_set=6 cache_capacity=6 frames=120 elapsed_ms=5010 fps=23.95 draw_us_avg=40680 draw_us_min=39520 draw_us_max=48760 hold_ms=1 +LCD sequence perf asset=lcd_boundary_test mode=cache_thrash working_set=16 cache_capacity=6 frames=38 elapsed_ms=5020 fps=7.56 draw_us_avg=131960 draw_us_min=108305 draw_us_max=343547 hold_ms=1 +``` + +`cache_hit` 阶段开始计时前会把第 0~5 帧解码并装入 6 帧缓存,计时期间直接从缓存读取 RGB565 数据。`cache_thrash` 阶段开始计时前会把第 10~15 帧装入缓存,使第 0 帧开始的 16 帧顺序播放持续发生缓存淘汰和重新解码。预热耗时不计入两个阶段的 FPS。 + +为避免时钟、充电和低电量图标占用同一组图片缓存槽位,边界测试帧不绘制这些运行时叠加层。普通动画的叠加层行为不受影响。 + +字段含义: + +| 字段 | 含义 | +| --- | --- | +| `mode` | `cache_hit` 表示缓存命中;`cache_thrash` 表示工作集超过缓存容量 | +| `working_set` | 当前阶段循环使用的不同图片数量 | +| `cache_capacity` | 编译时配置的图片缓存槽位数量 | +| `frames` | 已经完成 SPI 传输的全屏帧数 | +| `elapsed_ms` | 整段测试的实际墙钟时间 | +| `fps` | `frames ÷ elapsed_ms` 得到的真实平均帧率 | +| `draw_us_avg` | 平均每帧读取、解码、转换和 SPI 传输耗时 | +| `draw_us_min` | 最快一帧的绘制耗时 | +| `draw_us_max` | 最慢一帧的绘制耗时 | +| `hold_ms` | 每帧绘制完成后的配置等待时间 | + +示例数值仅用于说明日志格式,必须以真机输出为准。 + +两组结果的用途不同: + +- `cache_hit` 更接近 RGB565 帧已经在内存中时,LCD 合成与 SPI 全屏传输的速度上限; +- `cache_thrash` 代表长动画超过缓存容量后,Flash 读取、PNG 解码、RGB565 转换和 SPI 传输叠加的实际速度。 + +## 观察方法 + +重点观察: + +1. 帧号是否严格按 `F00` 到 `F15` 循环。 +2. 白色竖线和黄色横线是否连续移动。 +3. 指针是否匀速旋转,是否出现明显停顿或倒退。 +4. 屏幕边框和四角标记是否完整可见。 +5. 顶部色条颜色是否正确。 +6. 快速运动过程中是否出现上下区域属于不同帧的撕裂。 +7. 串口日志中是否出现 PNG 解码失败、资源缺失或 LCD 传输错误。 + +## 重新生成测试帧 + +测试帧由确定性脚本生成: + +```bash +python tools/generate_lcd_boundary_frames.py +python tools/optimize_lcd_assets.py generate +python tools/optimize_lcd_assets.py verify +idf.py build +``` + +生成脚本需要 Pillow。普通固件构建仍然不需要 Pillow。 diff --git a/docs/lcd-expressions.md b/docs/lcd-expressions.md index 021063f..3d5d84c 100644 --- a/docs/lcd-expressions.md +++ b/docs/lcd-expressions.md @@ -49,6 +49,7 @@ and legacy animation assets have been removed from the build. | `DOMAIN_EXPRESSION_WEALTH_SPIN` | Model-command direction worker | `PLATFORM_LCD_PRESENTATION_ASSET_SEQUENCE` | Draws a direct backend pattern selected from `spin`. | | `DOMAIN_EXPRESSION_WEALTH_DIRECTION` | Model-command direction worker | `PLATFORM_LCD_PRESENTATION_ASSET_SEQUENCE` | Draws a direct backend pattern selected from the mapped direction asset name. | | `DOMAIN_EXPRESSION_OTA_UPDATE` | OTA update worker | `PLATFORM_LCD_PRESENTATION_ASSET_SEQUENCE` | Loops the three-frame `ota` sequence during firmware download and installation. | +| `DOMAIN_EXPRESSION_LCD_BOUNDARY_TEST` | Factory CLI `lcd_test` | `PLATFORM_LCD_PRESENTATION_ASSET_SEQUENCE` | Measures six preheated cache-resident frames for about 5 seconds, then measures all 16 frames under cache churn for about 5 seconds, using a 1 ms hold between full-screen draws before returning to idle. | Server error currently triggers only from: diff --git a/tools/generate_lcd_boundary_frames.py b/tools/generate_lcd_boundary_frames.py new file mode 100644 index 0000000..fc12148 --- /dev/null +++ b/tools/generate_lcd_boundary_frames.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""Generate deterministic 320x240 frames for LCD boundary testing.""" + +from __future__ import annotations + +import math +from pathlib import Path + +from PIL import Image, ImageDraw, ImageFont + + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +SOURCE_DIR = PROJECT_ROOT / "components" / "platform" / "assets" / "lcd_source" +PREVIEW_PATH = PROJECT_ROOT / "docs" / "lcd-boundary-test-preview.gif" + +WIDTH = 320 +HEIGHT = 240 +FRAME_COUNT = 16 +FRAME_PREFIX = "lcdtest" + +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED = (255, 0, 0) +GREEN = (0, 255, 0) +BLUE = (0, 0, 255) +CYAN = (0, 255, 255) +MAGENTA = (255, 0, 255) +YELLOW = (255, 255, 0) +GRAY = (132, 130, 132) +DARK_GRAY = (33, 32, 33) + + +def draw_corner_targets(draw: ImageDraw.ImageDraw) -> None: + targets = ( + (0, 0, RED), + (WIDTH - 12, 0, GREEN), + (0, HEIGHT - 12, BLUE), + (WIDTH - 12, HEIGHT - 12, YELLOW), + ) + for x, y, color in targets: + draw.rectangle((x, y, x + 11, y + 11), fill=color, outline=WHITE) + + +def draw_color_bars(draw: ImageDraw.ImageDraw) -> None: + colors = (WHITE, YELLOW, CYAN, GREEN, MAGENTA, RED, BLUE, BLACK) + for index, color in enumerate(colors): + x0 = index * (WIDTH // len(colors)) + x1 = (index + 1) * (WIDTH // len(colors)) - 1 + draw.rectangle((x0, 1, x1, 30), fill=color) + + +def draw_motion_field(draw: ImageDraw.ImageDraw, frame_index: int) -> None: + field_top = 32 + field_bottom = 207 + stripe_width = 16 + phase = frame_index * 4 + + draw.rectangle((1, field_top, WIDTH - 2, field_bottom), fill=DARK_GRAY) + for x in range(-HEIGHT, WIDTH + HEIGHT, stripe_width * 2): + shifted = x + phase + draw.polygon( + ( + (shifted, field_top), + (shifted + stripe_width, field_top), + (shifted - 160 + stripe_width, field_bottom), + (shifted - 160, field_bottom), + ), + fill=GRAY, + ) + + vertical_x = frame_index * (WIDTH // FRAME_COUNT) + horizontal_y = field_top + frame_index * ((field_bottom - field_top + 1) // FRAME_COUNT) + draw.rectangle((vertical_x, field_top, vertical_x + 2, field_bottom), fill=WHITE) + draw.rectangle((1, horizontal_y, WIDTH - 2, horizontal_y + 2), fill=YELLOW) + + center_x = WIDTH // 2 + center_y = (field_top + field_bottom) // 2 + angle = (2.0 * math.pi * frame_index / FRAME_COUNT) - (math.pi / 2.0) + pointer_x = round(center_x + math.cos(angle) * 62) + pointer_y = round(center_y + math.sin(angle) * 62) + draw.ellipse((center_x - 65, center_y - 65, center_x + 65, center_y + 65), outline=CYAN, width=2) + draw.line((center_x, center_y, pointer_x, pointer_y), fill=RED, width=4) + draw.ellipse((center_x - 6, center_y - 6, center_x + 6, center_y + 6), fill=WHITE, outline=BLACK) + + moving_x = round(center_x + math.cos(angle) * 92) + moving_y = round(center_y + math.sin(angle) * 50) + draw.rectangle((moving_x - 7, moving_y - 7, moving_x + 7, moving_y + 7), fill=MAGENTA, outline=WHITE) + + +def draw_frame_footer(draw: ImageDraw.ImageDraw, frame_index: int, font: ImageFont.ImageFont) -> None: + footer_top = 209 + draw.rectangle((1, footer_top, WIDTH - 2, HEIGHT - 2), fill=BLACK) + draw.text((16, 211), f"F{frame_index:02d}", font=font, fill=WHITE) + + cell_width = 12 + cell_gap = 2 + strip_x = 102 + strip_y = 214 + for index in range(FRAME_COUNT): + x0 = strip_x + index * (cell_width + cell_gap) + color = WHITE if index == frame_index else DARK_GRAY + draw.rectangle((x0, strip_y, x0 + cell_width - 1, strip_y + 10), fill=color, outline=GRAY) + + for bit in range(4): + x0 = strip_x + bit * 20 + color = GREEN if frame_index & (1 << bit) else RED + draw.rectangle((x0, 229, x0 + 15, 237), fill=color) + + +def generate_frame(frame_index: int, font: ImageFont.ImageFont) -> Image.Image: + image = Image.new("RGB", (WIDTH, HEIGHT), BLACK) + draw = ImageDraw.Draw(image) + draw_color_bars(draw) + draw_motion_field(draw, frame_index) + draw_frame_footer(draw, frame_index, font) + draw.rectangle((0, 0, WIDTH - 1, HEIGHT - 1), outline=WHITE) + draw.rectangle((1, 1, WIDTH - 2, HEIGHT - 2), outline=RED) + draw_corner_targets(draw) + return image + + +def main() -> None: + SOURCE_DIR.mkdir(parents=True, exist_ok=True) + PREVIEW_PATH.parent.mkdir(parents=True, exist_ok=True) + font = ImageFont.load_default(size=22) + frames = [generate_frame(index, font) for index in range(FRAME_COUNT)] + + for index, frame in enumerate(frames): + output_path = SOURCE_DIR / f"{FRAME_PREFIX}{index:02d}.png" + frame.save(output_path, format="PNG", optimize=True, compress_level=9) + + frames[0].save( + PREVIEW_PATH, + format="GIF", + save_all=True, + append_images=frames[1:], + duration=80, + loop=0, + disposal=2, + ) + print(f"Generated {FRAME_COUNT} LCD boundary frames and {PREVIEW_PATH}") + + +if __name__ == "__main__": + main()