From a65ddc74a46de0d5b598caf5974eca4505cde377 Mon Sep 17 00:00:00 2001 From: jarvis Date: Fri, 14 Mar 2025 15:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=A8=8B=E5=BA=8F=E5=8F=98=E4=B8=BAC/?= =?UTF-8?q?CPP=E6=B7=B7=E7=BC=96=E5=89=8D=E7=9A=84=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 5 +- SquareLineProj/ESP32S3_UI.sll | 2 +- SquareLineProj/ESP32S3_UI.spj | 4 +- SquareLineProj/backup/ESP32S3_UI_backup06.zip | Bin 53022 -> 52815 bytes components/FluxButton/FluxButton.h | 13 +- components/FluxMod/FluxMod.h | 11 +- components/FluxUI/CMakeLists.txt | 2 - components/FluxUI/ui_events.c | 2 +- components/FluxUart/FluxUart.h | 15 +- main/CMakeLists.txt | 4 +- main/i80_controller_example_main.c | 512 ------------------ main/main.cc | 19 + main/main.h | 41 ++ 13 files changed, 106 insertions(+), 524 deletions(-) delete mode 100644 main/i80_controller_example_main.c create mode 100644 main/main.cc create mode 100644 main/main.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 71ef820..155c8f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,7 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(i80_controller) + +add_compile_options(-Wno-missing-field-initializers) + +project(oxy_fluxdc) diff --git a/SquareLineProj/ESP32S3_UI.sll b/SquareLineProj/ESP32S3_UI.sll index 271b12b..6f77b1f 100644 --- a/SquareLineProj/ESP32S3_UI.sll +++ b/SquareLineProj/ESP32S3_UI.sll @@ -25,7 +25,7 @@ "uiExportFolderPath": "D:\\yuwell_workspace\\FluxDC\\SquareLineProj\\Export", "projectExportFolderPath": "D:\\yuwell_workspace\\FluxDC\\SquareLineProj\\Export", "custom_variable_prefix": "uic", - "backup_cnt": 725, + "backup_cnt": 726, "autosave_cnt": 0, "group_color_cnt": 0, "lvgl_version": "8.3.6", diff --git a/SquareLineProj/ESP32S3_UI.spj b/SquareLineProj/ESP32S3_UI.spj index 2db0b31..d1365c0 100644 --- a/SquareLineProj/ESP32S3_UI.spj +++ b/SquareLineProj/ESP32S3_UI.spj @@ -17164,7 +17164,7 @@ { "nid": 1000311, "strtype": "CALL FUNCTION/Function_name", - "strval": "on_buttonFluxRead_clicked", + "strval": "on_buttonGetWifi_clicked", "InheritedType": 10 }, { @@ -24294,7 +24294,7 @@ "uiExportFolderPath": "D:\\yuwell_workspace\\FluxDC\\SquareLineProj\\Export", "projectExportFolderPath": "D:\\yuwell_workspace\\FluxDC\\SquareLineProj\\Export", "custom_variable_prefix": "uic", - "backup_cnt": 724, + "backup_cnt": 725, "autosave_cnt": 0, "group_color_cnt": 0, "lvgl_version": "8.3.6", diff --git a/SquareLineProj/backup/ESP32S3_UI_backup06.zip b/SquareLineProj/backup/ESP32S3_UI_backup06.zip index fd75fa4621515975be2198a335ad4f0343a1f630..e57fb7f53d29b8bd6f48225285a9d6dfd141bcbe 100644 GIT binary patch delta 30196 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
1$Dila6sN5%~c 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 Dc8VkD delta 30413 zcmYhhb8ukI6E2)=Y;$AVPBz)tw(X706I&bGwvCOQjkB?BJNfed>fW#JKRq)&-KVCy zPW5y@^Zd;O%gzSFR*(h*M+X4`fd;8^x6$gql8DWn0s)Cys>6;&1hh#S4i+16E}UcH zSj;`my$>sGbVY|V`3%VC!cge6@wdd8W+YgL&;&+G(I`j#6OdP10xGqXiZBpMBKs9f zd2G`s=@bot0V|S#H{=YhaB?vzH1i8rm7vs9>Orc1@HvfD`8EFJb#>ppH&W_|6M!Ll@qhv`Z$Ddf~Hqh*l>!1Xr|(dfC5rr5qJ92*j3 z`f|mLx^-76yFP84v-LyRygHm$oow?;LW-4)ylf#VJHDF&OU*K=!2*xjYWk^L%Q0RLLum?OG&GjGV;1Q-K-8{KV zGs`qjurr$pkOh>`+^kItYNqa^os8(+$!5SmSj{6cVG>Y;i3L_h^6Sas-`C{lCGDe0 z$#&HZZgpUB2KF9x1;%z~zg2K{e;n*SB2Cy@XRq=8;Psy6_4d6v``Yte>A^#focOWA##JIcHCJa$+q?%<*1J0Le%xwc=%c3tms?1f ziM}u8oF#VzKaVdN`HJ46w=K9ndI>N7eD9ry6j99l#WvX!p9YJnA1RwgiA!9m(F;?7 zET%iv7VBVetQfg6m!U#X6sCM&j+uJ8v#<{QiYGt0I9sSos~VO!L@5{rjhCg7vLV$JZ2ARId9$w~+%vS%k(1>wVw zvwh}o!1*Z(Lq6yC&<5Th_+UlqGLpvr-^+@UDX^14OYp0hI1#nW*5I;`;iQ2&*cQcr zP?>zNBY!KtKp@$W31;F%K)j{`3!Idh;3yqc?b2^eh2)z5qZ_*$qoYFbhE9VZZ^%^v zXc}_=AA9OiDLSgn_XqW!*GYZv#}?rJT;NT!f~o%hIKy6vv%-z-Bxx!L@n=m0)cazh zhaFO*{+A%MwUm)i1?Nr?+1uzi6J#3^DG1+Pb3Mqpjl~^#6*=l!#DA5oK zxt`oo&P_+-Z@*5FPi-z7SWFr5HDHmG( z1u5sDZaGP2CD1!6VplPvG+)H&;rejmE`B6SVKuf#aVwy`AbZBA=R7h&F|BVY05pu= z5b7F(h{+5Ukc0k?=hsS#hnAy(bMxY6MGGXw0wdK&)bF_#iv~4U#MPBaqZdKP(jnPA zNWuFCBfKy>gbU*l6vQhejNfY*bA>GK?oLYASSR8{Po3U3%E*8{or*dE4R2D(N)Pcn zRY9_oO@w_1bBUQ*8lXbcA~}gB2Vz2}7Q*DgpJgqG_(yl=u52NRHbv>*QO14?={ymo zX}!P&<9~BG6yQ&DTgN=7_D@apCD@&h6SC(bK2y-OR_~LN6oj}nQ!f$&ufE)U6bJcc zEOR3AQ6-N@{B@8tIR$UN5hUC#D7cFX_JY=;4l|9IiVCRcWdvkp7#g#Z;?5Zkc_@rMWuEKMH9J znC}*Js6>dz*-;_LGT=AyuZuB1tw>&=%cu4Qc&@bs^g92!KSOZqP2p*?VGfb0SoK-T zdZaMLq=hoIOQADYqWh?eCuN|4xn`xO}(x_6=JB!G7(>mDzCCGbrjas6~}}XGJH-R)p*ME*NyN z^BFjjA2&Rk^OLr8gl8(e>FM+5@7x82_@M_ETC|>yESXpN#5!`xH?DgwupK2^eKoJ3 z%G?EbaBlVQ6eqU(RzRpuB|C`W;h&`j6QZm186St6x9ep>pMP1{95&dz8mIgJa^Urm zhJSd$o`wFcovz~ZmdW1$Y34ZF!}g~SQ34okYVRS@u|}5>$hevXs|@A}RZc5D7Iamr z{Lodnd^;k4AvEV}^L%tUi6EGL%*$#rhPf}L)FKu@Pr;lf)chg(Na^q~-4qnf@96dT@BQVyIpQ(KnQ^Flmk)Y&udGD)Bg&w;uB%@8zwVAMu zqm@<^!k*LX^8>_Ahm@kj_V4J$Mt^NKgW#e|Y)@wHzoi%Ki zicw8bj13l#=Zp`uuUyKe{X6on>lUv$>jJwsOnCaSqL0bpIcuZ;`93hR=Ap{wScmGrmtoS&B93OTY_%t$aISvs=6 zzj6`RRR~C)owBA`vP5_v3zX@2d9&r~CJ=q+<31g`eadu6YN-A;dr(=?WTsoj!on ziQ83^fo#`FGE_o6u}F;rww?6)JvJlx*i5lb z?|n8S^Nz(L6mjU_bBw6^U&ff$Q>1#>vQwl}9s}I5T!$#H+J}5Qnc_M+|63jM8GWv2 zio++6AEHo7d~7zuHjMorLolq+O!3Uyupfb6nhOquJrwaZKJLhWw@*N(Xl6qg*z5t_ zj*A&eg?)gC9Eqz7=n{Q|1}t|Zm*7yQsJFmbrYIh+*Axk&WJW_6C!N(4$wNeXLzolh z^_%^dxEs?Pctje}9Pp<#M-eEcGioc*9B>rY9KdcGtI?eC^SrVgIO#1xsR&IFt8~Pz zJ9Mj%8nYaLQ!oGK1mM=)N~s#lk;*MCtIhuR$&iLHAKf9&K*7tM6VIJ!g3UDq9fZ@v z@5<3!b0YFL?jGvKh+`ZV24scBiC)iv-(@+?9#X)`6AZ@~ln)9ZDe;Ua*)UW>+7cXx zu7!pimNdFj-ZRG4-zz%qMhY^${tFL*m*?Kv?mq1y0WYxH#Q3OjW_V&P$Nv>uIsU29 zVeV%xO2V($?(JrJf5rB{)#0A;S8Tn%oGA&vV!N*Yar4^q-1G5F_<8;a+-9_}7yq0R zsb>3|HX>_IB5ZbBX+0(A+A_gC!VQI!8hGY|HxDO@T@(bvd@XcbZ2)@_m@flE3-(&uS&mfBv#5W0UQNSlTwCba9f4bdjE?@Tk)W*ACi!49)uPs4{WJ16E z$rQM2Uk=oGqpF<5uxWH677oX@0-nE}0 zxql&7Y-qQfLcYE5>uP6Ytif~A))rpZ6 zxjFc7*A`+D63Bl3zM}uxr0BdV$75#3m(9n|N?<;;>(`ie-5L^!08br+qb5>8?V&y8 zCL`kBl2D~)d%&v~&dH@rYNs+WPw&9;prNHHH9*9t#pLu8%ybfO+QE<&%DF-mLEE^3 zzNbS5Yn|@LNo4=wmftgwWg@OS@BDbQzkGbW+kb^aqquIcms@_Z>Ig{AKg$G&4ssTm zKSq;DRR~R0F>6Vdr7mMwpcMYKR0j{wZyvHJf}Rtx=fk0hfp_vPP5WDpnX@1bz3d}L zR7xo=M|5>J0s}s-E=OeFY_0oEFmyPz@R28wXikG(pWEk;+x{H@x+!mpTan5C+p;o$ z`WJN{?A5R5Fd5^83$pl3@q}B8KeHyd72-(gLno`iEz;%(1Py{p&4Wi>gUPU)D7yODWem5Ny`;1UJGERH4$yeEWz=I*J(o3 z%2W`Alju_HYkUSB$&hZvh%@Xh=@WU0+=+NTETQrGeZWLsV?b(}Fg2CMfdZ^#26rL{ zoz;OtI@=hY)RbA8u;umhm$=Cc9mpFXQ&mD^he5{Dtt>ULF;R?{kSv>Fi_gLUD@qd| zU8*J~DC#|5S4A-39&X_=A<& zl!6=pPA3Wz(-I?S51sciV>0Kqdot1z4eCuOiqI*F^glx{eP1hpk73~Tee>Rq+E(dyW?G-q*yX$ZJ$$EGEnW)CVok!$x=5^|4`v5Ds`j2rS>4m z`MP^@lzy&El&JL2fi?f?p9)4C>O8PbfJtJ>i!YF;P`Qy#g-KFFW<{fcfS3%DBDMrr z^JYUtzorRdX$qsubZ9j6`~qk+ve^xRK~m#@b2KP))}SFPh{=JmQ^ZfxaHeGv5m%n4 zzDP=t-a0nNa%iGt_>f+;xkhHOKa9{<5D;B|{IKxO0>E^c;%Fi57r|VL;x>9z<;g2T$mkNLBCmpsV?Qzu z4w?=IQyR~2oDU`WX~>qn zbsrg$)dNFUiBuu#P(9YT9bh|>6+YpLm56?GgUszKPdaG-@Kj>If@owYseuO)s{OP+ zxCw4xXShZm(8f(McIV>?4dkbyN|sr(OMt9l_BIbMrA#4Ufi%*~yM8`}lcn2>>UbbY zK52R52O!Y;l?>LhLB~M$O&dJn!1G4#n(fQscBJY2bp7m#?vVa7cP@+(Qq8$iB zM{lF)Dk3qJoh(1zkq%-}&SJ*81+Wh!MTYW`W4+Lh6rijwbPNjo0J#<3ga8T4;vA=w zBATI4AJL>8-eKiBj3$F{h3uezQ%P+nKPoC)7Zh!68aGV_ssIO1SwG0C?oll!UifGOpoqcb{Eay0R4JUU3 zVR~_SmkvCkl|-ZDfptlm$+0c5$P*$_Z4KtNRt0<+Xg?_Su7AYg>~!ZED;s%;FRb`V4WNp5}vdQ;=Y2T`mucD5*#C zTvLMK+*Hg&;XS@t#!)lvF2E|%&T0eEI9@`kF{+b{QH-SX$hRm^uz5}GLu|oC>{?$f z)0d!=;wrlra1G^@K^TWbRkG&?Lf`B2&9{?|&5skep6AGDt#R)9rr#rrT#0Aj5yzMR zPaI43TK{bqV{ruNNulIT!X9}h=vab31sXCOS+69eS`)iEGkY%soOVz{A%&&{@bP)x zrEB+nw3)+|km%E&DK3!vPqCYi+ky#`AKhs42EBHGq}L?~B(zq(P4;imF0v+bioiB0 zKkyM%2FHZcuOYr;ZGW@V9EJWGmqqQ@PgfY(kxwn0Xw^5P~ZyrEy}VUJl1_0_qdMU2bXO$h1dq z&?Z`JTrVK)!@7MwGGl2&11AheS!S*N3z0trvyIJ9troV~@A7*sJNtCp`)ho$ z)HHt7c6`JeG9I_+RCegwm0Q*Z5v~)D6YhaH6nGeGvFf#wLGT3l6~(ea(lpdyfpDC0 zS7O-DMYpwhv$>wt7>~g~*Q}4hpk*GkaGf~wtq-3Tg0iTCV(Df2Wgzl7FC4isRFLyf z?9Y}}*C^vu40z*nH^CeAu8P-D=R5lF!@wmae@W^RshkwFL@WLUr~?sHnXbCGS~c0C zSA!_pF_@4z?`?ILqPSh=}%_>X8yqwV{|< zx1)c_Yzb{q*RN7pnZpMzPI*lhzg*Bh+AXEY6oJ!ffs4})$2penZX7S}H`&jn@#`&t z4J6wdU(N@w+m{}8_4a~STKb!_LxRf^*X!Z{rR$9-ZXCIbM&1VJ=d(8%W@>E#o#^iM z`;vZn&cMZ*{<4p9TSbZc8c#j$^L>q)Tz&CfecxYMfV+!rx5G^Ofxgxaw?|BK?Na7e zBhUo$AZ}&s@(~657*D0tQUvu0CdtK&Lzj1Wrc1Jkl2PNUzbj|xUmJhTg{$}j( z%J}@nu9L6MVBZD&(2A2SzOH^ORKjR%)o7QiagMyW+XEzgb@v8h%?oGM)O%K&{t#AS z6q*Qxk=ei*=$n^*wJlX+(ca5}{_y#SW) zP^?alo9%e9A7$#uoh=1Y>BMpU@3peJ8%KlhF3!8hej3YFm|_CJM-$v=Gf{KdXtmOW^i=lVguH~m#vU`d<0A*ys zN8wENvn4w``@t5nMgPsk1a29F-2C&WixUL}?uNiG!FRv#4B=zE#qWuaiik%|l7uIm zKfGD6V_)Y8%r?b2X&jTYmQkvQFT(HgtCLu=v#oOwg5U_*si-EJjHXAo#8wA$s9aUq zr$qHwe^rI>`F>VAZO790O@;}g0M!_*dh4;2x%}Iv4&P1t^vdRL$8QUE=a#SzDg6y> z0tDy!zOe>wkY||+ykyS0oI7LLSF(z z16_Z7+$#Fof}MK^(5iDzkrVi{)JCm9$1xgRJGVPe^t7fN7T(MLV?_>~z%9&9tu|72 z7+3gQhTa&kMT&oQ(=Xt>*g6FU;(@2=XBG-o0r)s&>b1rk<(gFHLZ_H#?i%L-&%YXS zdz;p#wIEy0I*@-HnGMd}0R#}n?1-+o=*`q;(2%7R@tJgte`Yxr?;&l^QmM+T@sre` z4NHE~e?OqVu5O{wSp3diZ;T2@KE|DE1XB{jyR6o?KU_;^TBapc6|CH!b;j=tHAw1) z{<|d;3TBz-{tjK<#$yMDWXr~lwt$>kj@`|XmvrzfBe^Uw0knul4$yVGv44?P4`?46 zS66GgPpLgq*0eyAkkTBFD9+=F^C^clb&#QUvn(z*6#vzsORWLBJMX}0hYeUxl<$GK zZ~2TNJjDBJ^zO5P=+!DuX3_Qj%wMlEqsnj1&kOfxY%fqdSBypA)~5!W>7!a z(c+h`eAEI>i|zhm)mnR!c1v=%W53Y01wF}8oA-71YL|P5EMR#ES(^Cp>Z*7T@kdvO z<@ZM%IC2~I%T7erH|Qu=6I0PmxwAw+0%E2i4E)M5OClBCZ_y1A0cmw+5#K;?)$eSg zil_Jb(~GwaY{A%rDbRmP#L!Ch0f}sQ6B_~Ba2F9)j4v4 z?}xd(ICjwNb^l}@^Dkq$y1rCqBj@*5T<>Ch4dzHn&ExThawb}Bg**b$*P{YB*;H<`@Qr%l=$$X0-)J`_zc5myiBU+sk(o5r=Pe&8 zTf5DO5RpvHF4=P4MBMOt1JbL(Qvn{Fnnd;h@E!Ib5gF+R-5-A=)~0&>9Esw)Av(8ZXF`ODR3+T zvbf9hWj4|XTzV}c6pM2tr_>2W6KF8Az*JCPHB9N%b z!Bq|_)%KAYrMBhrc%sFK;#KTn5Ob+a4{-%)z_*JyWT&A;o>w#+=hG1L(tl5mn{$*S zt>}xQCn?C?Peitxbs(hSvQpE`cPoSe`6Ux!JPjhHrN-ko$qTc|A=7zNcOjVH?WTfH z5YIea))m3~kJ@qeZ7783d;Z7=wR72TYh(6oFWWmVe;WBNB^J`@VIP70vsml+F6)~? zkG0qR@=E7d>&>lGu~VZAGhbRsN2!m+TZ?B}hQ2>;Fl5>A2eqDq-+L}4=UYoDV4bFK zzc0z9hx}n9KkiXFMy6(nTE!5qo;*+?)rUdey?EUSiz;z1QRoQnxVxm)s|+jB-1e9) zw;=KGEuD8$um0Y|rrlzL&lX}wFnQ_hQJ2c2ZqJQN6As0`3z?mp`MaeJLXO8z79rOo zjScp-a;@OFiqN?EH!Cth&EPO=;IEVsfy*OFb0 zo19Niw<}q~)R*1qtO{>R|H3G+US|P@+3dHH%ZZ zQ8%bhu0ljp`>wcvQfY6G#rMHvE~FT>By=iB5sY0GxF`%zXHYZzV5!9Y2~7bzl*W2F zj~B)i04Iok-F^hq^tpc}nje(VTk;AX6gL*|Xj6$y8QvZ96_fx4t41c`maUe4T(7Nr6XM_k9(cDTJJu#{B z|F|p#g{%YcyR(k@K=NHut%l`P2-9M<> za_ta>3W*|0sJxIQq2Pz7HwXo&phC5S`b7SA^gh5@GY-S=zGpm3mJkEm5MDSNAnN?= zi-#3_y|k5Vs{7+9iz4v-zFkewcUnC7@gI zpt$pp_J>hN44wtFtwV4MgdmBh_*OKHE-gaCvf#h2|D3pJ^BnAQSQC+2{Q++wh|dEs z#uv^Usa$OtCgie!BEK{n!M+c(f5)408)Si9cx3PGTSAgkL{(M_eTa6|`I6vgaKw;O z)S&k#{!iRAu3d|t(2%PRP7Z(CNt3@lrLvHqSh03#p`QcL=dg9(28Esuphd!{GU=8zSJxvyKlg}C~%F`#5 zgBRLNJ-JK$jVmD-Wfnf_~Pb z+0_IX<%6liism6qi*rxX0{8~u#sLdN2;|~aIH|R1eHeCd=~~*Bz>FoZuKrekGTLGg zB@z44QZzd5GOb)ASfUca95x7KH3;EiBCL_7Ss7R&C50dqTBDJ=S4t48?;j}r`bQ$) zHfTZPUeDE$KIMsF5`?&ThfWSZx0|qwCRG4I} zphnLNt4s7Jab_$6DN61kz%<$x)oIaNFfqQkCSA_!%jw7QAB+C&I~6Jy((Ywb+wN z0&(0q9#bZP0YrQX{4{7fd26y{I-2bIQRw ziF1{862`_5ohPA=Wy#6ttjlaD`hv!F8e3{XBdcEvu@s4X$AX?gRErN~c31@piGnb! z5J(JZ71q9?kfrvC!AJ3cgG5LpV>}Q$##l)SyyHeZ_1{N-KQ38e7r;e&8P*#1Cmb~n z4KEocEdwJmsL*&uL!?Of`yR9osK4** z(=WZj`~7IwM6zAx*E~X)(|rzP^MKXM>C$-hbsg>=G%h`maTT2h^2PZ9}O>wC(Q!xvR}tM^!3^u3-+Y-g6%8Q1IKN8KVS zr{7EP+7-mHn?0vGPeANndsd^k(|V(!iq~s!aOXNY+X9(?v@V{$9=^`rFE2Z9WLvRh z*lg#GoUBK>v(Kc3{uwFP+tRL3DFF^I+bFms%+c_WlJ?T#ChxIZ6unAk{l{qk6|J*w zgW(1Zq6J%#Gff@;+IKhvi-SxuQFEWXtkIkw*!hk*dO3O_fD{oP(p9KA3JVZdNn&u9 zWV@wRsxUZF6!T2pjE#pCs-tQf%6n&6nm&}26&BUhq8mBE|G!c_L%%yDqPd8j`L9w% zF$ZL9q5}?eC7Bkj5iFFouhw3jKdCodmhd+(^NwS<RNZ}ix%~f6joOv6!KO0k1-`FQE5sAd(tO!{XOiXkxUYQFov2|DQj2DO++o}E zifK`{3JXap>;NPhS#Mfe;OQKxc2zIQzCEn`mk?d!5H+! zkHKB8L{3Hj)u|ddZJ-|iw@z&b#nC2O|0hY`_5QSAS@Qa^-kEY3`V4Td9ySXH*6s*L zxPgqURYZ>z#>nlZiRFgqGJ(6TFZ&dr9Cbp6tk?#K<$gR40nLQQa5(Sp?1b7)d9Ac< zx9;n%#1;o@uAN;z!qZcm;(xCv5I6PvuVw707Df)%hc0TX)tB%G8KbJ(7TndVhW^9) zy#9yv6@krNzZ*D!bmF98!D48v{0PKoEoea+&aRUvkA@bGsD{|K2Jfy$ym~n~-8xCZ zD%kwse*^f|gsI`s#aT#o8KcUZg9dSa@ubdTm^T4k7_?JT@9%2mjXoHmHa-k1_OzSj zO#PY%gvD9a^)iF!_}qPo9W6l(jJexQ)E7aYVv_w)cKGP4@0s9Iw4OQQ>KAA08>h66 zW<8iQ>*A#$W_N);IpZHQ$Jd*BI&Zr*!v{ZKEP*{eN(^a?AJP003;1#ca z4S+C00yppca$XEv4*rRj$X`SkVf>R(0=b#x5;-QhhqA{lW!myCW6_8-`AOc0-OKd? zUq#P(GOzht>*azeg8Mv=`EGP}$N7BI*!DM**cEc8htdXdd@O#i`KGY!A17j7^Bq4# z&0~3bxt0qy0>vj&LA8XO4-_L2dn3$pJb}B_{UddGtY80mW&Jn_ye|zdD5K|{->2lA zXGm)h&cZ)wy;{zz7QH)D;GECvUVTR4>6n8V8ojt9ShEZ+RLVE7vD#7>5r;lktr<)t z$g+$Ij(@3Y332YkNMmJa{czBkD2&6WSa+lwpB)Oa=*hn7duDMTi<;tmmk-PU+yX!D z$1}VH0yi&+LRoU0xEXG_&G`>oQxW!@9s;Y~r-S}bk$I6hxk8ehLAx{cA%<#9AkFRT zP^OJ|@an#aSbTRXS{!(U-ABQ9``lh; zAHAP>#x0%WPaGp#O54ND9q*O|s{h97WoDl$H@J?S#G&j(PnzPb`}$w#0D#+`c<1`^ z4XC5e-+53am!%!*%LoUoy_<=NTahDI=}AGh71qh7En>a!h`$P_fHNey?lmv%#rCwF znnv5ru`dt)diwAzUv`_bsV{v>_1-K-t3))FuAuGNGl$DrvP(+!S*9wW+^(;5Z*O(5 zlcdv$`Y+0@ujDA)O+^Nbzofoh90cp>x@8TXvy{Wae;x@YVKl=bSj+fqYh) zo0=Yz{Xi?^@qTgzO+$oulZKKqSOK=$`5Nkc8+?LRW45)-$%PlcWHD1y=H6O_TI zTs>RfN-y^-p3fiW4v%Mm(WAE#`m;v2+Py|RZMZyaeq2_Az!brW!?2MR<(1_7-SGIU zw%44O+3@r2A)%Hl`Q2UIYlUS6^_{{8oyHovf+tl9y;d}_eLl7fL$irLd6r-DbU})- zXBTb4cnmV=`5dM}eJ#0mCLg4>SI(g;XgV3Tj%)cPJd^hMI@TY6odRJGG990LDMGe_ z1S&t1IUl-NwFuj#m8^GVk)v0GdT1~`wn5c_HYHPX!i>B*)tM_FO7#XFjMdKc`+s~XW_9<&fxZluS^DGT zRc(bB3`z;oT6I=LxY`VsljK#Z0zqws>?w^0@rydMCyCrCjU1JQ3!`=`Tk&cN|C|Ej z)pqt$8c5xA7+@ki2~;F$eI3cGa-*F4rM0dfHD@E707+|0Si4_*wh@#{vr<-6mb$QK z>{ZoCd+lm}TKLo2)uIX&RK_#~%Z`wPA&}IXQRSEtG^z+XvPJgZwIc0*yxcc?cgOl5 zzN-zZO+Q~qeKs!Zet7bIV*LUAM$?_u{003wp>SgBWi>+p~(F~WJLd??`p)VPS5$3VD#+BwYv3}4ZI${!UI*_6*N^- zqxIcQ>+?T&ph-b+4+KSS*PUd4i^>CdY9#nVUR3zdQDQ~=3w~d@qw^7fB8m6-{Jv}~ zWz?peOZ@GZtCxdj@G7G!MyfgF|Qk(@YU0L))ywdky zV5lI!N44N!MpYmZSN^H|8OZ`L#B;&XwZ(aAYjj?Kt-&pbVni6w1=kDcinYha* z6A|#Xzqbm4DpbMn?%KFBRIwrQ?`D~T6x?WH7Kc4uLcKKtHEaB{P(vq6dB3UyLyZOx z7L1U&@8D%Ol}T(}VwCjbGhQi(*-1(LpJ8YSQR#mG40Sc?g^C#J+NVul@SX&0I-T7v z3Iq;X5KOUmmFf3nAgbyl*#Ux9>3DP-)~HA!@16hHrx_7ZFOH}vmLd3xP#4pr3d3ZY z;0tk?Sk*c~Zo1Y8q)5+SLKh?g|3@~`+mqA9XPpC2sa~+EZTGQOrW<_~*o|i0SywO1 zg!VFB)Tv#D-}&#Io%y;`Q{^u|@JDYfVJ=1d@^44)j6*aDphf>b0LC+x2K0Qw=omlr z4>Tc#uy@1_TK)AI+KFdK3{hri=o4S^4cM*DSZq(tlD7fp_z=Wzn$*9FzSx&->Wtzo z8zo*27v9X>IIb@(Xy#2Pv+&c1YQB8*-3Ms(T)%FS-hRS+tJvqkbHlk;cq>5{a!h?u z0lwM#2}1!Sx)}tK2doU-y<-%tTuJzHFbp8u-cHCQBIr}uVM9T;O%zI(OnloWX{eLH zOwUVE2ot|py!0rwbXd{>RX4td7kUp-1Py~pfU>WIqBlt^zvr>+9#Q_&kT}iV#m~e? z1VwG4O~B|E{HlBg5iz$AL?q7>cbvZOzVPoD?t6eFy%y=`?$cojV+XtFHH5GV=Ev4r zujqAI_&szrs*w|SSkGk#849N;wLDW0V_G+qM31}^v_R<9se&X?UKc`fwj6j*beqbG zi&7kzZWo)Nl++;d_SMxOG58gVcs$k4e)T4o-{%}L_?a;=uN-;*nzYr&fUqk#N`Pr! zz$ReV$skDzGH@So0C|Wy1OD#_d;UJ+1+>+gx1I(>-$%p0IAP~%iIztr$<+SpX0+vw(C@eJ0rj^ay?gp&32Jo2UDkRrQi8j~+n_xuoUkG(BSXW7YNK zy(kiEyZ`$RBH2BY+CM(pQX01k;4u%JJGxrN)VwV4q_S(jPrn?;F8ACQ7ks^IMjmG` zZLaY4aPb`Dcm43XeJc^rd#HhW05PvV-F6G?y+6~JhvaG$9N|9fjjPQ!NkLCyvn03PbnbGo^ajNs3dnpu_mx$?z9 z!NK^MIUHrw%~Y<1?oU)k{r4$1IwXEwzbsKG>TvXM|irofr* zgsp3HwRRWGD*7pDA+aB%vDK#Kt@%Yg@vuLf>yrG27xz}}&Mhs+&H2|j0v2bJZ#Sc* zjwBP~B}i|5XilVAW66s(Uf3+vUd0~p-=#p{zdFdax{=aRl1yt!SSc8eWbAT#Kh4W< z+%Y8hr?^SeMili1%zCIHS~B5UAJ*QVUU|MWk&v%p{c!+sE5>qn^m6|qwf+x_(j(}K zrf5yrYCI7FtN8|`(L_WFakFys7YNRzoQleYI0>T7m652RzjSc_nzosM4XJzRAPVmO zzeE+(^rdOP*`Y+o@;eW1!Low}A!9kR-ucxCY+$jxY+^dfL6o~UE;-7?(L$oRC7#t! zL?j{roV6u`vW|0X_Ogs2PoY@R59+%K=U?@ut?Ief#=CBr ziMwpcBG(!Y7G^3qT|r3PY@dxGYzoN!JKjz0F)R*9s_o3oUm=v~E!t4f)bI5U2O~S> z;(*imR_BecH%~yLz7&;PJF|mJf#u#09+ydD>=wNVmW1KiMr0WVvRp zkx`q3zMoI!?3qDT29DIkL8m?j6cCqG4fG-_C#HGe2NzsA#-1lxjouG0Lz8#py%U?E zIibDO9lR7?^-6M8j*MMjj1|VNgt2Ko0bq~7vnF(|a?wK|z}W`>)&{tC)gGhY{GH_D z%WH{zeor*qieDF~=b_KD;f*^-e@Q0PxWsuG|A-dP>r!_1{E!`kRL%Vn?((|>W-`zb zQgU)U4JBE#L@CMTmV?EIH3d9L>`7249%2-7b|xL#!t9A-;o4mmQ}onM%fvtFj^a`pFv zpSMIwaq0o1>%^nL(|xT=3!-gJoy`*#1kyJ9QEBErdHehbe3v^?R0_;J3c%WnU_4x$!m@){9`Ax)WL&0(;T*UG5x147O)q;3 zXn)?T!h3C_2KDve1@o0(!Iqm+0Nma#jz8MP zc9>(mLU>*auXi|W$Ft%bL44&(btEpxYqfO-nmrD2lId}IptG~5DYDSqwf!qM=9#L? z$s@J(q&KHWtO|8b4d%!Dq7`j5xBi;9qN|6cjz_jhrfVoP4+y@4cY5O1EDb(7mVOM> zv@yf;EMQP3_n)RqJK3uPs*4^yY@5L&Aq?LMh63{i_YZkRcBx_?FpwjtMA6kdEsW)A z|Gh{*#xTYa!ursZIknxta0Cifo!p!j) z&_w5Dhd=cUyqH=mrci<79cLEy;VJkCG`IDnq(yqJ6Jq;%`!W`zDfmdVuPiw>m~5@1 z5L%E2$v#;5UQVR0GL38#1qPLT6LNvG*G*kpV-2xO4B<5Zqss=z!##!i7o%b|;)_us zYF6^o#_LZq!iykK=3=&=`FvpXolPi_?u#B#-x8F;Y9I<<&69Hk?h=b?n;0q7`ze;zZfPI(yP!iJ{GnqcD0f??Q=G(o;`gYTemxqpA%A zukt4an;|QeZ>X^$B!!WYFF5D-9qrS*2dlRZdiJ;L%M|gw8sM^! zTHl3@tSEO}E({C$pW%!ZKd;qf`Sn<}qh8X2?gOvksPFBvZB}sCI(wwZh?Uxe;y&}7 zPw#iT5CDwBt9u>C-FFPX((QfKo{z1i+Ozs_ap9|xb@^W-%Teos;RR!+O@F{m#$M;b zK4{NtqiY&XJUZ1?A(-TJX+?fg*s0Jrvanz1iBs;hX?3AJ=~K~W=Wv6F0tPGNaC4(z68!;>= zWeO(=ZDRf{1I@5@hoP!6Z77DKj5MSYn1fJYu^0v&hdlomG%LubX&I5D`6xkN6qeh+Fp#Q?CSug>u4Dh$?auEk z2h|$XzVG#0h$H|LR!Qo{%e&8KU%gsi_uOwMLCibZ0em&t;Aqcta=+$J!bw}DV3ETa z{dz-1TcscO!H@P4uhmw>fLG&=b59o1ETr9jdPKuhue0xNxbJ^E3^8x%KY}T42_OYW zA@Gd3G>z`&ssXIi1ht5%}8T3 z9av*Da|&!5&H_Dl)bG8$ACNVHcah8Ic7cZ-p#t)l!6h+{mAl&ZaEy-K#qc;W+GOF3 zY0%t80do`^trSeZ+S$WQU0Pk9EEHKykOEeeE(n}4-~ajZK|RUKQ%MbS(hpKr@Jg0h zG_FH~A)1|^Yy?UqAykUvN}U~V{OIDrjMF~k8(PrWtGy6zHi-pZNdtu1&>{t5?h5n0!UoJluB%h#s5~P+M@)!NQleO~yilE$(x5_&~zD1Mcr8uXe zuRlUOaa+QVb>2vTi|SdT^#zCw99lK6^#=A?xY-J7Lf+Wt2;ct-p+24;*%|x(R6ot( zxxt4b`ay!_JM&g;wZ-2F>N!n6Tu2CEzc0v@@TW~{0P?;^ooX(l<&Ew$idEd8wEqhWiBwoFYhnHnhjQJw$Tueb))4v!a%1F>mFvbBuFHh;qBSctzktn=z0O5J;-< zu9<%k^22T4t0Uq^~U9FSw@m zm&^2?**(6;e8RKBGg)_dB?nE9kzm4TIE!_NnJ6%Td^^GN+O^&{cx3K8FXTT{zQqU8 zM#C@}q;>j%GOmTPsvXs1Il=^-$)Ty1Yrv3^OGnLCIy7(DMBs7~lO<))DqRO-jn~Fm=Rmo9Dk< zd&Ea%DzFy&s^U-9)*HtJuO? z*FVbINKX#KRJ4g=7ici6jKfqw7@~BFVk@A%19J_D5+_A6*fOy7k(@}j4l<-cI({z^ z@TBy8qomN8SP&S(j0da$g)b>`nHI(O{HSSU4;~0@2#+&-D+BnP=PwxQYJ6#Tl#Tx)gVyj?Q0;P)zAHY#{3q zcSwW(#g$so#*{2sQfHD6M;U?jk>(`{T)`NnBcpTFbn?psMz zw-mzwCe+Ws#36&$#268kW^|5#oa@J^bK7Jl(BGA;wb2xUKxtp^qc|<%n)-Mq4>0Piobxi6i~HgCvlgc*Rah(uxLnwL!mIk`&1N@A~~o z3P?^%?Eb`m&<&E$@>fKz~`@Tv(D6mgjOtulv-zqKWY~UEMC1_Ez`k z5!kQDYlA7f*s7=FD1W3MjXfADAfUSOJ2NcRePJPfc^n*V&zwWA80w%-7`*!%Z}Thb z%i4TxwR)dymlN*N$!Jc8C-VrC;uBPCXhN61>mH+C{ZLK%m(kpFwVa+|ngTQsNyn2K z^XmGG(1PhpE217!D{$tXu~liKdAC<~CBxjHq8?JLjehv!^rHx~?yupGLsEW~LjTe_ zn^xY-*yS!eOW9?DQ~2d>;jFqB4@VMVk3XrTNK*7L!8?-m5P$YxG`^6}M%AKvx@~2Y z25sIsAIRNQ52oo~cIcV_V^#+*zjI;?A(vun(JV5lh@D#45TSqo-0hH>LNCXo@O{o}V2{QL)3m;N> z`{Y5D!(}qyfnle(b<4OxBCfH|`Qt+0Q)2+)=7)BR?y%X9Jk?U)5Qct1>R21wF}`-* zcuc&cAD_n!_+VoW&0c8Ph=NSRdy%X zA$Q~m7L zsx|TgGTzcT7+U6BK2ZxFFk;lk=u}6M7KEb!!C$4j{2nZCPy?d_4eg*SG=dlSIK?Q8 zzX`PEn6d@jJ|3J_&ZMnzDJhd-n=KO>#iHcfU#pS3sMcWVFeZq5PP~q&UV~gIn#{Qn zVr+pqffrHV=8&FK)au;Vj2C?;{>Q8R?#AnOF~I!%dF!Ca>-zR&{3`d=`*%0-;$jrg zRui#~47<<(2;r|>18-ORCSrX?4sb#zHOnY^xpVC#nRiuei>Xc9sMUZj+vY>WS`xf3 z1m>&7uKvh6-Wp2j=C{bsC0vA5gVa31su6BVv`k3~n?Lt8 zEa1yTzS&1bctAAvgJMvx%;hkbuH%5UDafCx*d{oBWB4EZe$nvEcw(PquBwBfR|KXY zgZVk(U)XIE%RWwL>M&FOF=?RwBXI*N>Um?`riq5~HBujKo0x{i} z_PlK;0R9-wUo4hl=|5O3$DZM!uudx&jP3sm#*S~*euCGiuVUmi20(0eCKly7yQ4p_ z!pH6U=cU7O`~P5W;kYsdzN?XgAHwMEKDB{G(ah_wP%cQNxvWU`9*}KqTUeL{X&FM6 zGe&8oiaI{)B|FMp{^Y(}n~}g9wimrRT9$9l`KgFI4%)6375w=p^Q8+>f+YC$ zey`iT7a#7Gj1k|_uW-a$eP9cp6dF-H)YdK{M|~|(u6hcIv5uIw$0CSL-#w_)9R8&XH;bcot?)gT8akLq(ugrQD}*~)a2)YQ9~a(E{E3vB?v4P9{>mq> z$^}fQOhP@j ztBoj7DRpr%;y`<;j(5EucUh-#{fto{JYog31YXFm)tWP!nO`kf&b`VnmBtEK_g6Y^ z##XEu)R=XrB^t@9VTlEVda?!;0SVS&J^(XiMEYwDgRf{{7&K=2ThChSa%MBg1SfcO zi(!BfO9svMI}TKLYlV^C;aiE%(&wiL4GI|PM-8pe5kN&gmD>)1)@orI&jj#$)8c~J zjU;D`p%neu7#`&6qYi?t^5d$qzS1+J{JE^3=@_FG{D%Q&3H}-poxup}@r;9>@BDp~ z*(vm`-47-hu;Yi%rk3!C}CBCMIBaE#9%^QqSX>DFtZ zWT3(wVIXw_da}Yjv_;*%bq={lR_#Abt{_Wp@g8I0X*Y$8yjU!Eu0Sv zp;yF=Xo7h}6Tc3b()ID6GF57fhal83^Sq5bIgnwLZgj980zNS>!KEU5+zhGIHg7{I zuGm=YmglU~8@gJmD%=RA2xGe?p*t?0zsxl!kg%}&F<%t$c7(~d!aAjwjf=Z_HURRe z@SvPyX0`m;-bO^A4l>#?I4(k!hxa;K{Bg+BUbZ!i-Mu01N(rNw)^aID9*dvFUVQbaFfFJ$KMwsnSKAskhy(HS*oS(R<@>NiX zSEe#mqB$m_WQ7S``P_i-jjQ{ye*x}(TA5Uz(wpa>k}b*LH#5Dw-#px069!9Zh*W%K zMb^zij;d;$P+W$`%r(VT)@04#v@wr)^y|CE=X|Sfvs^pyu1K^S`_6f>4yY5JMv$XT znSG}a&V^VY5TT_IQ5?CU)~%Jqn_&{{K&?&6`3ikdmqj6GTwwAu%QC1#V!Wu2JWSZ1 zOsiidK8-@$PFW&OD8QOfOQGD3w-u7GlhTS;{}_IJGPRvGT8V zEU2xZT>zGjou|RlF@TAm77=H|ahvjj&h7HoI)Xm2&efcW<70OjPfE9GrT(}c+aUICzx+ee%5>V&p5`#V=wI&`l2&6h zQ;=vYQ=Ckblvn}m9G7V6$1MF*juCPI*`~G!c7MhGeueX|upn!W@H|C4du|)PWz>+k zs2?#9HYL@gUqZw-=t->{YSLkFe ze~0P=Z8*{-MV4my2|5e~rjlX8QSU_{QL1jnQR14rf2&^Nv<5ESejt{wXkAOTd1s*u zb={Y$j^n$f@G`*L5p%jR$ zOnia8oBI7L4-n=T_-3$#r1~Q2JFZ-%V!gz+EsGoo+{lS$al6!_Yd*uP3+E_ z($Hs2`I(x?1oQAM`R)JWoDZ}r)$E@>>(0;+I-t>8AN1!|WDAX{dm=pj)lfM7czuFZ z7S`7awFa{YjfmNkq4Ek*N|d=ctUd9L+({sHb$l>{4d{`RIf?BPK?=VKPSGoIf8f(x z9fp;<4$`5c859$}w_Y~pLsbhu(wNtc{@(PhNAKzM%&L)Us(jDUh<~X;MXi3;oV7~6 zE(_@Z%e|uGgRNmPWio84EoSQWX-K8qlm7d=(uVG0)++nfYGvB?)%1(e2O1tcPgr8GF^TAqnh;aDtsgI`@^y|lN?G>z5{2i#=_o-p zGV!Ob{z{a2G8IQBhE`XwvoKI?e5ab4@+vKmKmA2?%q1w2bZu(6FI4e~Xmt1@X9$`J zJP|B^X;#w@=F9Ij>^{fvnd$oO8ldNtot-*sYy}7h5er<&p4lVahk|&nQ*S(%27Z0{ zf}1h$Wi{`i25d<}<-92AVCFp7f8E%El!yIN5$y9vD^{&oVyA0k9I@x=`lLmm8#XBz zEyX2teLD!i86m;P#vdFefL;St)xBMS=(M{9+Q+Ndd)zvI--qwBz zUPs_%mK|lIw_(qMpabHorve2A67Ru&({-YAAJn)J`G(ORy8!h*4tI+^+PL3nQSas9 z@>zKU`FiEHl4qK8+pPLe%KP7VLazIi;>pSH6SvxFQibx$<#|ex$uqer(q4&*k^KS@ zuf&wejRVo|`5ZI~Ai$-Ien07gbrNT|+k${xR4yh6_28@kovW z?;Yo~OP=uNA|}eg6jqvy5TbM(Cc|)pm{jZYZ+7$7Y2^7?O)ta)?50sfIy|QEWa4a_ zrA^C>D_=2=R>+LuwL)df(cZ&-5BQGZZ%ICT{nK0E=!1;TG~R@R1V|FiTyh|2408-< z;WCx|DQ}AWEe9)%5o;6Pmp7$>k}zR~tg(~Q2TFx=({n*mGB_3Mkt(_atFs2~KaXvT zkgYIW=!tmEcqMNUm^x7Qv5j}1-91Ex85vwWD$Er(d=ObB(aNW}pO_C76%nYoH^{-; z8=9F-O*c&r5ckYkD8}K4|A(*Uz)t5|#tg(MQW3-cw0^+h!r2i65?v?rT#C3_R8h!b z&;@=I8~ywFkz&lK+j_7aa8VfqZZfx8&I(}d#y z-LYAs6^@h8?3M8hi4LnOR>IGmI^QgYp3Za$_ve)W$)M<_h!Y^!W;7Uaz!~je;maL? zDLWF4*XVC~$(CV(GqP#1rg||_`s-o*-gLNksLcBsFr+8Vy(nLJ#6(R6C~~X<%4SO? zUC#Uy@9hctalrXc2n#s>F~=Q*-auwqgrf+J%pLtqB*+!c-(d!V_)|xu3m^D>?%h~2 z?+gXBct=5qrY>jR>8BFf#zwmuT8Ip9sr5l?1f~VO8BPPNSy9FORd`b9ZEUK|gl^66 zdK{f<1U@sYaXgyS6Cvw*SLLBHGno{-D=Dz<1`{9biaLTx)(sO*2v!+Mq{jC%cOtakM>y>52Edzf?SwQEMr=@9B_ok6@ z0Q)g9P00AD>h8J_U~ZQlvQzvZzq&k_WfsP^DQYQ#=XJiZH*m0|2xzgnu>7@b;Z>eH z(eL=b!lLH3E|kwpz&Q0#B{D`ywAu7`Ixr$zmE|dkH_e(&+RE~}h-&JyjX?YUdQNhN-;x z444Sa43-n~=W6S#zb zwqPk-4hIX#*ZfLJL?hvTD?(3os9O3X^(J9EvIf6Rgm?bVXV^(xi3&gfX3h^JQ!58; zwVrvgdZLzpV;Dlt<$6gN+@)Qp{o~A!Ua@tv`|N+`Ex*1KIgg{j-)3n$3uzRpi@0OV zSC-|$WTiTJWzFbY=X9>w34XFPerUWebty42>oL#NvomsMJdoCSz0X#Gl&!(@&6VPW`L+A`$ zxP+|rJC;o=;Zp>pNR|X*OD-EtT!FU9*>)*E;#U27ohntud-R}wcUke(*hQ~B7==*Fju!`IQvgfr9=}w;?M@Q%!(5&(o=lBr9=s_37vdtO2~co8e}^aZ=g)>xE-QO zG?!CdS%vsBqy8HngU9WYu`iBqi~=f^xB%ck{CR1h7S8zf%J>|m>#$G_ApGu@dQO?} z$%Qob?4z>h*9DNHj2u`0xpFTuF@jkoz1VlJ89+yvSh#2zPnql)dxJ1)4UFl>>^>-ptXoZe~thu z#DR1E&ed&Yb1HOtgf{8mofrQIBs*6bT@|_mh0kLhf4zaUu&DwprSB(ufs&XFHGH>j zWHhrk>3z6|*G8z13n4CEyvQcEr)YEp@`J4#vUrR5^h+pJALzfw-Ee%o>FHHg`?^A_ zGGPm$!}+nQPD;yp*S0^}aXT1Ok_z}kQ8^EbvwFKvFIWWWu|Y(k3dSzt%vya8PcaD4 zPMjl8pR1dQ$G*ORP%s%098LT;J#7TlI4z=eT+a?>QV{TUFbmv2n2#VzC&>M%ik+Sj z*?>{Aj=pi3W6!xGYykW<%&r1ndpcfLO)G79IR{}C{LpBl; zOh{xxThXF}Gaw;SoCW-$=oCU}MH@v$aazN;u+0LOH#6CZRaCtzVdgy$RJ)kUX83G~ z?(P)U8@-%2o4K=S@p`AolS6`V2PGRYQAkx%g{h|1KzA z7mezxCqF3)Tnh8l2dMP~dS`$p@C$0-UY2ZlB^vOL-Tz3eTon<|=r0aI(GuOZg7&8aj65O-2*px&rp?c^5GOfs)qg zFsoofvmA5(N1+x9>~c^OT*yt10yZv&D++(BPTd*~v{kHYW*xg-94sJjaIh-YP4fX4 z`Sy;VGvXO64r-EVc>A)sv3j2}kkAW3tHHQ>Uj23f!G$1~nVye-B@y$nQp&+XQq{c= z5ro4)hj7OpTKw+rQcsYK+vkK&#g>cgzcKh*@w z6Ntn@O}^G`pb8naJV(HqQsPD*H~q|}i4QINt#-cTpeqe8f%zMSQddMGgPf*GPtCi^ zEcR2WU_^Z43E^eJB$kE@BPCi~b3W;C62e50D-M52cvA&1C?nlC#iDVDwS>SnUTR`uOfD#j$D3*jh-{4=zvgS zN~_vHMw=tydYt4M#jKM)xfvvb&5zQqMcf@$Ev6kO(0h#onC+dIby|Ap$oHCGR^*^* z_J}eIpzyAN1lWG+P9oGf2VrF>T%C4UadK!^P7nfO)%tE0d14^yyr6+e zr-;1X0hDY3?3~0j*igsD);zx~sSEkIu7!`|(PL`>E`kI-%vv>;!p2m1`N)1PM~@@I zn9f&)a_?UjYryOT=!$qlptpRr?~)G>^f5^3YYG9*7#XlGoM$wtR=#ImAU6TO)td{8 zU^}N`Fv|_5?#fd`tmjOuH73}GdY4%mD@KyVK04satP9WRcP8$w3y4)ED&bJ%!-J8Xmk=+vJRyY8$^Tf zs0Ct@K_xW0d!jWqj^IUIW`Qw63)&4(Z|txtGODB_3^9ZKp$dXTw1Ia|vIzrb?M zFD4S_troL=;F?e2$RFqO6s+nQ^lR3g+HezSoE&6&VwN&HO<^9L&=Q_wCG*H0yNh%xqgxxREejxfLsmG5BD>Nos9+b@qt@i= zf#Hh}Q*4Xb+gQFd%LqzB6O#HKBcBrp)Jk)RH=3E^+1GA~1m0^U8H0-?2edyFR>G2*hvV0X-fpb@=Agg!)YK+EWJgVEyH3RrUa1tuf5r>ylr?WceE~g{ z%@H3|*`og9Pq>g+>b#$B;6mM`K|6tfUNDz`Vi`BW+k9#<`_2PgB>!BF@pAe?aN#pZ zdm>ijh)2=MH>5-=U^GWJ?(HewK{kovYoesgCeuMtn*~EZHO+!9s-E*Ar(>S;pkcoE zA2V<@rfxLT+RkcpzK^!FI-+Hvukv+v9ZpBdknKL?S*em|WESxCy)2Mp2r+#A$nfSW z@R(w4Lcvu8Se|V%V2mAs_mXFA(>8i7O=${Gs}n3ipAzxF{S*A#kF+u$>5xXq@GrPD zXg8~OUzpuwa6U0vB{nAsSS7mR(B(Nykk6${{h8P0>X{6(NbG2J^qggGklEZ22M4em zGWr9MZr_GWt(3SOYAltwr98%mscTD+hkxvRn(>Ty|<* zB^6N9yLyA+yY4;Awy7{s&+W>iLAcg(XUVpfa({+G$E&tzVfSh6qHF(%Vg>DWaF)9y zj%@W}(1PdN%B{hNAotF$d92DH-YJw&_un7%g?N49Xa*(3)Qsp%tNLBlIt9sI^9}~z zshY65r&A&i^INdTDU_&2$px@%23m7^O8NmCsGcR_>#1%P!QBn(Er=5#l)Qoh6g^p_ z@mNUF+Da?1c#{EeQ(uk&Xbz?^R(6BJ((Rr+FAt8)&-H(GR}VC#3@3Qa5ZW+w+~y7C zBorx9Uc}IPtPI}HCbz}E%o@AlpXaH^U z@7==M_U@0Bwrk0TCPS@qA&Q*8bk_v9{=MS% zJXfgqr5k*CEp_}-JFB=tgB+zWIN zT_&tswfMnJs9vVeqTimB(L(O~^%4k&pU%Fm7H$ms_j&ekINX}@Z|RsXKUjPX$HmUP zdlxQGrz=LM=B_mp&fl1zsxi`xC8yS(MLd*@GOKViUZB?I1Sf=|h0zMF=LUHk_ zG`!k8jb@fv%XQ?Ns%EOtw~EzQ6Bff)WEFC1mL-P(1bk(QA>hO26bxSILC$NT@AcXB zPpwKka7nYQSk72dQ6QB@$VVJnbXQx~&okWwenhJVsH8#BVZSDGMQWvlrexp5I%Af_ zl)G`^rtTCKzXplk#68vA&?JL<_l^fEcSTy;XZgQ>Cs?uJ^U*ebT6)N~oop{x#y_xs z$y)?KuTDakRfnrcj@=5~;aTxLxG$7PS2bBLP;=vl6*Y zImg)9oNp~lUH^Oz4#;EPHR=hHiB!^alj4Paa4_YdW8_YfZCSf5=PwXiE7E>P) zY*>fGabL4anDCCb@l2eQnl)xDUtugx6tZCXLCZPp%dvC7$ixzAhB!b5PZmw>iDo4e z780UijoE2~_G04XT8fITn_rEUCh1fc74IH`hO?Ams)kiBT`Dcg1aAM}j^cWodqjVC zZKLQEZoq3?iE7TV*Sm*99n6+rq+(MdA7sQz)3*lVs8v7I@Z`~t7lt;cqAU^f$c03J zqQg=Lw+r@K(S}n?umO#9G;;K5K6t_=lCV`NpVYdo)LU+m#?a;)$*f`4QCXn|ljy_I z-Vs@#5ai}7CQv4^isvD4B9!Da!4IhA@<~*6DZ^Cd$2HMVV{L}9@bAoXziZemO?w@J z*3rvOPJ^#+oNyG0@46Z9T6z5a>{f<{lCKVI(44lU?CrOTN&;w3&S$2*y-Wv+3K~8* zpk`EmnKjox&yHDHU4lNq8S)&pt&K3c;%Q6j62=%jw%|cI6GCS}y{<=RdLir1;np(- z_osg~Jb{)$B<+8;gM4U3$Vet1Lf!#v_vUDl=ryY(r_izoE=K}A*ft#fFlk7HZsP~! z8;w1t+|_=-_gtlqEtid=j{27dlMW2>3vSEN|L#z;WjP3%5TC8KHYch;-VwKDIY)hX z>!f8Z*T1WBnc|gZ$Y0M-y<6V@s^p$De(=^rU?!i&@{<-vp%sKeR?W_Q89%+QE!}%F zzH_Q|67?t?+P4}4psSrq=-#2bP)QSMqL(wbCsM zw~Olnu=FcFn3!9EjT-rLOq-`8vc>KM#18nQI>wKj0UK=?L4 zN6eAHeDdo3nk}O>G#3tBC194Oy(G6AMZ(i%huv8AY#GPaWOvb-!2ei^9Qjm$k>qms zBuM9lc}HyOI_}0*BgB?g8nk0A`hc(F2%DB3wf~9uDFT5x>XXt`=S~(9CkfQg0ZJw? zB1jjSH}V+{GnrMBsp7%6NCnGfu&v>eDMLg?;k%?8+?lqpi~T+@fy|vrC&L~?PUuq3 zq#ma0N0(YA>-UajFZgY#QxmT*SftLHa$jD(3G}1bNgONx?8(b0>JC zN^c+cw1O?IrTC-WSu+|2+5flX&P-fe&6_B+RvJf@)KmW#2Dnskh^)oTIOBiNCejrm z%`^mv5om7THki-+^}!c<*E6`A@B?*uj$0v*x% zytm33rMs8*nYH!??b`N#b$H-jNM3eK615YUvTU77kO@~K{upQQtWS>}C4?rFz`}dA zKA74t>tN{wa(k8WKC|bOe`+FAr(IT#c*W0Vz79O1JixF--nID0=OCpAdB$mp|JdfG8?=&~$k*Xna8ah1ab+y2e-Isb-*fm-lw zN}t^n6)@@TuJV(A_|Uh!$!Wk}ul*$MOPqfCl!rSt2-}xHThu92vb4A(&3fcK0beYY zL^pfJ_|DTXU|YpJ)cUWK;3@^iiHfb9!CE! z#57;jKO+8o;u`~n+XYx$e)x}1zUQSVHL?{JBpetw*xCMTr^TxI9Hy=I)e-7FLwa8^ z{VRK_Xw=Av>mM!xs7lo|dev*YrQd3VZ8M|t>rCr<-*F8bF;FlUXasYc?B>FmqkXupnM-NHvR+hygcqne|uhN4{>@-nI(xhGuRb?r&K14 z%zKhe1v}(`B|*|Rq|2vd=a3)e(2?l#D$E_y7nUf^!vy_En|yce9pRrNYY4e=^^_0^ zk5=J)CQSo2Ed^(-%wxky<*{MpwN7l4vjTYimrtv*_iziPg+2`9-#Ym;I3ItC0=H6R z0S3%5(=e{Ih{TLW!Bh%AzcR`QH#{?DSfm;f?4#TQkDf#nzigi&GGKKTfsH0n6&U7U z3cXY9JUR34q2CyiS+9@cO6hLNOb_M=6a*OGd);cWbn-k7+j>k)5{3!~DM;ikE=A*3 z78||T$Slh!7zFw+I3TG~&+~sPiDl8OD;uj8_QBI`b>rwDj#W&{TP6WF6@eJjFB(&t8dbTT7tFTu23yP-^2i~#sJ($ z0h@#1$4U1{iy_79Y`ZHnu_eO90u!Rnk&I8l!5aE8-%IUq7_fC`#@5h{*ZTzPPM)W& z8MzJbbw0mjUR*U{wz1@#b$YuT{vnxHib({7*4^Z;U?a3AEhn~Dw#$ce4lTI@=36{j zOACk0PaBfHg5BkP)QPhOC%yR1IAL-9&I$gHEI7VlfzHNb+5p4 zWCy%Q0lMEjoZV)gJUCx1To=HP^3V6cpS{(}3EpM7ip;aF=TPuuw}q&{BTJ^T5(J$g}< zLtN9{kGromUKSFY0}^HXx^Dse?2}i|BO&j)Vn158vW*=TgMffGT?55GeE!VD1HV{4 z&0q+BZoQlQ;>$9LLkvK+8xhxfGOu+D1a#PT8+MmCoz*rmyFm#Fi*Dzqd9Zg9XA*7c zE_?Lw96NG;{cYiq*0})!{|TjGEHL_lzjOm0KW}APuvAS>`>r@QTU_sz-wa$GKD#>I zF0RG~5XII$CO4I;b=O{9CzZ|8OzQZH*-J>3Ei#?KFLP%858 YAh96+|6Wm>j61;&I|hDREd<2>0e1yg+W-In diff --git a/components/FluxButton/FluxButton.h b/components/FluxButton/FluxButton.h index 685a51f..11de619 100644 --- a/components/FluxButton/FluxButton.h +++ b/components/FluxButton/FluxButton.h @@ -37,6 +37,17 @@ enum button_cmd_t #define CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE 0 -void button_init_func(uint32_t button_num); +#ifdef __cplusplus +extern "C" { +#endif + + +void button_init_func(uint32_t button_num); void button_init(void); + + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/components/FluxMod/FluxMod.h b/components/FluxMod/FluxMod.h index c71c976..b4555f4 100644 --- a/components/FluxMod/FluxMod.h +++ b/components/FluxMod/FluxMod.h @@ -64,9 +64,18 @@ enum { #define USE_MODBUS_OFFICIAL 0 +#ifdef __cplusplus +extern "C" { +#endif + /*Modbus总线初始化函数*/ esp_err_t modbus_master_init(void); void master_operation_func(void *arg); -static void* master_get_param_data(const mb_parameter_descriptor_t* param_descriptor); \ No newline at end of file +static void* master_get_param_data(const mb_parameter_descriptor_t* param_descriptor); + + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/components/FluxUI/CMakeLists.txt b/components/FluxUI/CMakeLists.txt index 02ced44..76bc965 100644 --- a/components/FluxUI/CMakeLists.txt +++ b/components/FluxUI/CMakeLists.txt @@ -32,5 +32,3 @@ idf_component_register(SRCS ${SOURCES} PRIV_REQUIRES driver lvgl FluxMod FluxWifi FluxUart FluxSD 78__esp-wifi-connect espressif__esp-idf-cxx INCLUDE_DIRS "." "C:/Espressif/tools/xtensa-esp-elf/esp-13.2.0_20240530/xtensa-esp-elf/xtensa-esp-elf/include/" ) - -target_compile_options(${COMPONENT_LIB} PUBLIC -std=gnu++23) diff --git a/components/FluxUI/ui_events.c b/components/FluxUI/ui_events.c index b8b207c..e3660fb 100644 --- a/components/FluxUI/ui_events.c +++ b/components/FluxUI/ui_events.c @@ -173,5 +173,5 @@ void on_buttonReadSDCard_clicked(lv_event_t * e) void on_buttonGetWifi_clicked(lv_event_t * e) { - + } \ No newline at end of file diff --git a/components/FluxUart/FluxUart.h b/components/FluxUart/FluxUart.h index 628c512..4b31dd4 100644 --- a/components/FluxUart/FluxUart.h +++ b/components/FluxUart/FluxUart.h @@ -1,4 +1,11 @@ +#ifndef _FLUX_UART_H +#define _FLUX_UART_H + +#ifdef __cplusplus +extern "C" { +#endif + #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -62,4 +69,10 @@ void uart2_echoTask(void); unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen); -esp_err_t ModbusRTU_Send(uart_port_t uart_num, struct ModbusRTU_Frame *frame); \ No newline at end of file +esp_err_t ModbusRTU_Send(uart_port_t uart_num, struct ModbusRTU_Frame *frame); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index c1dee42..299ddb8 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -3,8 +3,8 @@ if(CONFIG_EXAMPLE_LCD_IMAGE_FROM_EMBEDDED_BINARY) file(GLOB_RECURSE embedded_images images/*.c) endif() -idf_component_register(SRCS "i80_controller_example_main.c" "lvgl_demo_ui.c" ${embedded_images} -REQUIRES FluxUI FluxPower spiffs FluxSD FluxMod FluxButton FluxWifi FluxSpifs FluxUart +idf_component_register(SRCS "main.cc" "lvgl_demo_ui.c" ${embedded_images} +REQUIRES FluxUI FluxPower spiffs FluxSD FluxMod FluxButton FluxWifi FluxSpifs FluxUart 78__esp-wifi-connect nvs_flash INCLUDE_DIRS ".") if(CONFIG_EXAMPLE_LCD_IMAGE_FROM_FILE_SYSTEM) diff --git a/main/i80_controller_example_main.c b/main/i80_controller_example_main.c deleted file mode 100644 index f96369c..0000000 --- a/main/i80_controller_example_main.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: CC0-1.0 - */ - -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#include "esp_timer.h" -#include "esp_err.h" -#include "esp_log.h" -#include "esp_lcd_panel_io.h" -#include "esp_lcd_panel_vendor.h" -#include "esp_lcd_panel_ops.h" -#include "esp_spiffs.h" -#include "driver/gpio.h" -#include "driver/ledc.h" -#include "lvgl.h" - -/*鍖呭惈SD鍗¤鍐欐帶鍒跺ご鏂囦欢*/ -#include "FluxSD.h" - -/*瀵煎叆Modbus鎺у埗澶存枃浠*/ -#include "FluxMod.h" - -//鏂板瑙︽懜灞忛┍鍔ㄥご鏂囦欢 -#include "driver/i2c.h" -#include "esp_lcd_touch_ft5x06.h" - -/*瀵煎叆澶栭儴LVGL椤圭洰*/ -#include "ui.h" - -/*鍖呭惈鎸夐敭鎺у埗澶存枃浠*/ -#include "FluxButton.h" - -/*娣诲姞鐢甸噺鐩戞祴澶存枃浠*/ -#include "FluxPower.h" - -/*娣诲姞WiFi绠$悊澶存枃浠*/ -#include "FluxWifi.h" - -/*鍖呭惈鍐呴儴瀛樺偍鐨勫ご鏂囦欢*/ -#include "FluxSpifs.h" - -/*鍖呭惈涓插彛鎺у埗澶存枃浠*/ -#include "FluxUart.h" - -static const char *TAG = "example"; - -#include "modbus_params.h" - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////// Please update the following configuration according to your LCD spec ////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define EXAMPLE_LCD_PIXEL_CLOCK_HZ CONFIG_EXAMPLE_LCD_PIXEL_CLOCK_HZ - -#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 0 -#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL -/*瀹氫箟鏁版嵁鎺ュ彛*/ -#define EXAMPLE_PIN_NUM_DATA0 18 -#define EXAMPLE_PIN_NUM_DATA1 17 -#define EXAMPLE_PIN_NUM_DATA2 16 -#define EXAMPLE_PIN_NUM_DATA3 15 -#define EXAMPLE_PIN_NUM_DATA4 7 -#define EXAMPLE_PIN_NUM_DATA5 6 -#define EXAMPLE_PIN_NUM_DATA6 5 -#define EXAMPLE_PIN_NUM_DATA7 4 - -/*瀹氫箟灞忓箷鏄剧ず鍏朵粬鎺ュ彛*/ -#define EXAMPLE_PIN_NUM_PCLK 19 - -#if 0 -#define EXAMPLE_PIN_NUM_CS 45 -#define EXAMPLE_PIN_NUM_DC 20 -#define EXAMPLE_PIN_NUM_RST 8 -#define EXAMPLE_PIN_NUM_BK_LIGHT 10 -#elif 1 - -#define EXAMPLE_PIN_NUM_CS 0 -#define EXAMPLE_PIN_NUM_DC 20 -#define EXAMPLE_PIN_NUM_RST 8 -#define EXAMPLE_PIN_NUM_BK_LIGHT 3 -#endif - -// The pixel number in horizontal and vertical -#define EXAMPLE_LCD_H_RES 320 -#define EXAMPLE_LCD_V_RES 480 -// Bit number used to represent command and parameter -#define EXAMPLE_LCD_CMD_BITS 8 -#define EXAMPLE_LCD_PARAM_BITS 8 - -//瀹氫箟鎵浣跨敤瑙︽懜灞忛┍鍔ㄦ帴鍙 -#define EXAMPLE_I2C_NUM 0 // I2C number -#define EXAMPLE_I2C_SCL 39 -#define EXAMPLE_I2C_SDA 38 - -#define EXAMPLE_LVGL_TICK_PERIOD_MS 2 -#define EXAMPLE_LVGL_TASK_MAX_DELAY_MS 500 -#define EXAMPLE_LVGL_TASK_MIN_DELAY_MS 1 -#define EXAMPLE_LVGL_TASK_STACK_SIZE (16 * 1024) -#define EXAMPLE_LVGL_TASK_PRIORITY 2 - -#define EXAMPLE_DMA_BURST_SIZE 64 // 16, 32, 64. Higher burst size can improve the performance when the DMA buffer comes from PSRAM - -static SemaphoreHandle_t lvgl_mux = NULL; - -extern void example_lvgl_demo_ui(lv_disp_t *disp); - -/*鍒╃敤 PWM杩涜鑳屽厜浜害璋冭妭*/ -#define LEDC_TIMER LEDC_TIMER_0 -#define LEDC_MODE LEDC_LOW_SPEED_MODE -#define LEDC_OUTPUT_IO (EXAMPLE_PIN_NUM_BK_LIGHT) // Define the output GPIO -#define LEDC_CHANNEL LEDC_CHANNEL_0 -#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits -#define LEDC_DUTY (4096) // Set duty to 50%. (2 ** 13) * 50% = 4096 -#define LEDC_FREQUENCY (4000) // Frequency in Hertz. Set frequency at 4 kHz - -static void example_ledc_init(void) -{ - // Prepare and then apply the LEDC PWM timer configuration - ledc_timer_config_t ledc_timer = { - .speed_mode = LEDC_MODE, - .duty_resolution = LEDC_DUTY_RES, - .timer_num = LEDC_TIMER, - .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz - .clk_cfg = LEDC_AUTO_CLK - }; - ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); - - // Prepare and then apply the LEDC PWM channel configuration - ledc_channel_config_t ledc_channel = { - .speed_mode = LEDC_MODE, - .channel = LEDC_CHANNEL, - .timer_sel = LEDC_TIMER, - .intr_type = LEDC_INTR_DISABLE, - .gpio_num = LEDC_OUTPUT_IO, - .duty = 0, // Set duty to 0% - .hpoint = 0 - }; - ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); -} - - -static bool example_notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) -{ - lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx; - lv_disp_flush_ready(disp_driver); - return false; -} - -static void example_lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) -{ - esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; - int offsetx1 = area->x1; - int offsetx2 = area->x2; - int offsety1 = area->y1; - int offsety2 = area->y2; - // copy a buffer's content to a specific area of the display - esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map); -} - -/*鏂板鐢靛瑙︽懜灞忕紦瀛*/ -static void example_lvgl_touch_cb(lv_indev_drv_t *drv, lv_indev_data_t *data) -{ - uint16_t touchpad_x[1] = {0}; - uint16_t touchpad_y[1] = {0}; - uint8_t touchpad_cnt = 0; - - /* Read touch controller data */ - esp_lcd_touch_read_data(drv->user_data); - - /* Get coordinates */ - bool touchpad_pressed = esp_lcd_touch_get_coordinates(drv->user_data, touchpad_x, touchpad_y, NULL, &touchpad_cnt, 1); - - if (touchpad_pressed && touchpad_cnt > 0) - { - data->point.x = touchpad_x[0]; - data->point.y = touchpad_y[0]; - data->state = LV_INDEV_STATE_PRESSED; - } - else - { - data->state = LV_INDEV_STATE_RELEASED; - } -} - -static void example_increase_lvgl_tick(void *arg) -{ - /* Tell LVGL how many milliseconds has elapsed */ - lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS); -} - -bool example_lvgl_lock(int timeout_ms) -{ - // Convert timeout in milliseconds to FreeRTOS ticks - // If `timeout_ms` is set to -1, the program will block until the condition is met - const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); - return xSemaphoreTakeRecursive(lvgl_mux, timeout_ticks) == pdTRUE; -} - -void example_lvgl_unlock(void) -{ - xSemaphoreGiveRecursive(lvgl_mux); -} - -static void example_lvgl_port_task(void *arg) -{ - ESP_LOGI(TAG, "Starting LVGL task"); - uint32_t task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; - while (1) { - // Lock the mutex due to the LVGL APIs are not thread-safe - if (example_lvgl_lock(-1)) { - task_delay_ms = lv_timer_handler(); - // Release the mutex - example_lvgl_unlock(); - } - if (task_delay_ms > EXAMPLE_LVGL_TASK_MAX_DELAY_MS) { - task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; - } else if (task_delay_ms < EXAMPLE_LVGL_TASK_MIN_DELAY_MS) { - task_delay_ms = EXAMPLE_LVGL_TASK_MIN_DELAY_MS; - } - vTaskDelay(pdMS_TO_TICKS(task_delay_ms)); - } -} - -#if CONFIG_EXAMPLE_LCD_IMAGE_FROM_FILE_SYSTEM -void example_init_filesystem(void) -{ - ESP_LOGI(TAG, "Initializing filesystem"); - esp_vfs_spiffs_conf_t conf = { - .base_path = "/spiffs", - .partition_label = "storage", - .max_files = 5, - .format_if_mount_failed = true - }; - - // Use settings defined above to initialize and mount SPIFFS filesystem. - // Note: esp_vfs_spiffs_register is an all-in-one convenience function. - esp_err_t ret = esp_vfs_spiffs_register(&conf); - - if (ret != ESP_OK) { - if (ret == ESP_FAIL) { - ESP_LOGE(TAG, "Failed to mount or format filesystem"); - } else if (ret == ESP_ERR_NOT_FOUND) { - ESP_LOGE(TAG, "Failed to find SPIFFS partition"); - } else { - ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret)); - } - return; - } - - size_t total = 0, used = 0; - ret = esp_spiffs_info(conf.partition_label, &total, &used); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s). Formatting...", esp_err_to_name(ret)); - esp_spiffs_format(conf.partition_label); - return; - } else { - ESP_LOGI(TAG, "Partition size: total: %zu, used: %zu", total, used); - } -} -#endif // CONFIG_EXAMPLE_LCD_IMAGE_FROM_FILE_SYSTEM - -void example_init_i80_bus(esp_lcd_panel_io_handle_t *io_handle, void *user_ctx) -{ - ESP_LOGI(TAG, "Initialize Intel 8080 bus"); - esp_lcd_i80_bus_handle_t i80_bus = NULL; - esp_lcd_i80_bus_config_t bus_config = { - .clk_src = LCD_CLK_SRC_DEFAULT, - .dc_gpio_num = EXAMPLE_PIN_NUM_DC, - .wr_gpio_num = EXAMPLE_PIN_NUM_PCLK, - .data_gpio_nums = { - EXAMPLE_PIN_NUM_DATA0, - EXAMPLE_PIN_NUM_DATA1, - EXAMPLE_PIN_NUM_DATA2, - EXAMPLE_PIN_NUM_DATA3, - EXAMPLE_PIN_NUM_DATA4, - EXAMPLE_PIN_NUM_DATA5, - EXAMPLE_PIN_NUM_DATA6, - EXAMPLE_PIN_NUM_DATA7, - }, - .bus_width = CONFIG_EXAMPLE_LCD_I80_BUS_WIDTH, - .max_transfer_bytes = EXAMPLE_LCD_H_RES * 100 * sizeof(uint16_t), - .dma_burst_size = EXAMPLE_DMA_BURST_SIZE, - }; - ESP_ERROR_CHECK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); - - esp_lcd_panel_io_i80_config_t io_config = { - .cs_gpio_num = EXAMPLE_PIN_NUM_CS, - .pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ, - .trans_queue_depth = 10, - .dc_levels = { - .dc_idle_level = 0, - .dc_cmd_level = 0, - .dc_dummy_level = 0, - .dc_data_level = 1, - }, - .flags = { - .swap_color_bytes = !LV_COLOR_16_SWAP, // Swap can be done in LvGL (default) or DMA - }, - .on_color_trans_done = example_notify_lvgl_flush_ready, - .user_ctx = user_ctx, - .lcd_cmd_bits = EXAMPLE_LCD_CMD_BITS, - .lcd_param_bits = EXAMPLE_LCD_PARAM_BITS, - }; - ESP_ERROR_CHECK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, io_handle)); -} - -void example_init_lcd_panel(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_handle_t *panel) -{ - esp_lcd_panel_handle_t panel_handle = NULL; - - ESP_LOGI(TAG, "Install LCD driver of st7789"); - esp_lcd_panel_dev_config_t panel_config = { - .reset_gpio_num = EXAMPLE_PIN_NUM_RST, - .rgb_ele_order = COLOR_RGB_ELEMENT_ORDER_BGR, - .bits_per_pixel = 16, - }; - ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); - - esp_lcd_panel_reset(panel_handle); - esp_lcd_panel_init(panel_handle); - // Set inversion, x/y coordinate order, x/y mirror according to your LCD module spec - // the gap is LCD panel specific, even panels with the same driver IC, can have different gap value - esp_lcd_panel_invert_color(panel_handle, false); - esp_lcd_panel_set_gap(panel_handle, 0, 0); - - esp_lcd_panel_mirror(panel_handle, true, false); - *panel = panel_handle; -} - -/*瀹氫箟瑙︽懜灞忔帶鍒剁殑鍏ㄥ眬鍙橀噺*/ -esp_lcd_touch_handle_t tp = NULL; -/*鍒濆鍖栬Е鎽稿睆椹卞姩*/ -void example_init_touch_panel(void) -{ - esp_lcd_panel_io_handle_t tp_io_handle = NULL; - - ESP_LOGI(TAG, "Initialize I2C"); - const i2c_config_t i2c_conf = { - .mode = I2C_MODE_MASTER, - .sda_io_num = EXAMPLE_I2C_SDA, - .scl_io_num = EXAMPLE_I2C_SCL, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master.clk_speed = 400000, - }; - /* Initialize I2C */ - ESP_ERROR_CHECK(i2c_param_config(EXAMPLE_I2C_NUM, &i2c_conf)); - ESP_ERROR_CHECK(i2c_driver_install(EXAMPLE_I2C_NUM, i2c_conf.mode, 0, 0, 0)); - - esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_FT5x06_CONFIG(); - - ESP_LOGI(TAG, "Initialize touch IO (I2C)"); - - /* Touch IO handle */ - ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)EXAMPLE_I2C_NUM, &tp_io_config, &tp_io_handle)); - - esp_lcd_touch_config_t tp_cfg = { - .x_max = EXAMPLE_LCD_V_RES, - .y_max = EXAMPLE_LCD_H_RES, - .rst_gpio_num = -1, - .int_gpio_num = -1, - .flags = { - .swap_xy = 0, - .mirror_x = 0, - .mirror_y = 0, - }, - }; - - ESP_LOGI(TAG, "Initialize touch controller FT5X06"); - ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_ft5x06(tp_io_handle, &tp_cfg, &tp)); -} - - -void app_main(void) -{ - /*鍒濆鍖朏luxButton - 涓婄數涔嬪悗鐨勭涓浠朵簨*/ - button_init(); - /*鎷夎捣寮鏈虹姸鎬*/ - POWER_ON; - - static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s) - static lv_disp_drv_t disp_drv; // contains callback functions - -#if EXAMPLE_PIN_NUM_BK_LIGHT >= 0 - ESP_LOGI(TAG, "Turn off LCD backlight"); - gpio_config_t bk_gpio_config = { - .mode = GPIO_MODE_OUTPUT, - .pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT - }; - ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); - gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL); -#endif // EXAMPLE_PIN_NUM_BK_LIGHT >= 0 - -#if CONFIG_EXAMPLE_LCD_IMAGE_FROM_FILE_SYSTEM - example_init_filesystem(); -#endif // CONFIG_EXAMPLE_LCD_IMAGE_FROM_FILE_SYSTEM - - esp_lcd_panel_io_handle_t io_handle = NULL; - example_init_i80_bus(&io_handle, &disp_drv); - - esp_lcd_panel_handle_t panel_handle = NULL; - example_init_lcd_panel(io_handle, &panel_handle); - - // Stub: user can flush pre-defined pattern to the screen before we turn on the screen or backlight - - ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); - -#if EXAMPLE_PIN_NUM_BK_LIGHT >= 0 - ESP_LOGI(TAG, "Turn on LCD backlight"); - gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); -#endif // EXAMPLE_PIN_NUM_BK_LIGHT >= 0 - - /*灏嗚Е鎽稿睆椹卞姩鍒濆鍖栨斁缃埌杩欓噷*/ - example_init_touch_panel(); - - ESP_LOGI(TAG, "Initialize LVGL library"); - lv_init(); - // alloc draw buffers used by LVGL - // it's recommended to choose the size of the draw buffer(s) to be at least 1/10 screen sized - uint32_t draw_buf_alloc_caps = 0; - -#if CONFIG_EXAMPLE_LCD_I80_COLOR_IN_PSRAM - draw_buf_alloc_caps |= MALLOC_CAP_SPIRAM; -#endif - lv_color_t *buf1 = esp_lcd_i80_alloc_draw_buffer(io_handle, EXAMPLE_LCD_H_RES * 100 * sizeof(lv_color_t), draw_buf_alloc_caps); - lv_color_t *buf2 = esp_lcd_i80_alloc_draw_buffer(io_handle, EXAMPLE_LCD_H_RES * 100 * sizeof(lv_color_t), draw_buf_alloc_caps); - assert(buf1); - assert(buf2); - ESP_LOGI(TAG, "buf1@%p, buf2@%p", buf1, buf2); - // initialize LVGL draw buffers - lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * 100); - - ESP_LOGI(TAG, "Register display driver to LVGL"); - lv_disp_drv_init(&disp_drv); - disp_drv.hor_res = EXAMPLE_LCD_H_RES; - disp_drv.ver_res = EXAMPLE_LCD_V_RES; - disp_drv.flush_cb = example_lvgl_flush_cb; - disp_drv.draw_buf = &disp_buf; - disp_drv.user_data = panel_handle; - lv_disp_t *disp = lv_disp_drv_register(&disp_drv); - - ESP_LOGI(TAG, "Install LVGL tick timer"); - // Tick interface for LVGL (using esp_timer to generate 2ms periodic event) - const esp_timer_create_args_t lvgl_tick_timer_args = { - .callback = &example_increase_lvgl_tick, - .name = "lvgl_tick" - }; - esp_timer_handle_t lvgl_tick_timer = NULL; - ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); - ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000)); - - /*瀹夎瑙︽懜灞忛┍鍔ㄥ嚱鏁*/ - static lv_indev_drv_t indev_drv; // Input device driver (Touch) - lv_indev_drv_init(&indev_drv); - indev_drv.type = LV_INDEV_TYPE_POINTER; - indev_drv.disp = disp; - indev_drv.read_cb = example_lvgl_touch_cb; - indev_drv.user_data = tp; - - lv_indev_drv_register(&indev_drv); - - lvgl_mux = xSemaphoreCreateRecursiveMutex(); - assert(lvgl_mux); - ESP_LOGI(TAG, "Create LVGL task"); - xTaskCreate(example_lvgl_port_task, "LVGL", EXAMPLE_LVGL_TASK_STACK_SIZE, NULL, EXAMPLE_LVGL_TASK_PRIORITY, NULL); - - ESP_LOGI(TAG, "Display LVGL animation"); - - /*娴嬭瘯git*/ - /*閰嶇疆LEDC杩涜鑳屽厜浜害璋冭妭 */ - example_ledc_init(); - - /*鍒濆鍖朣D鍗*/ - flux_sd_init(); - - /*鐢垫簮绠$悊寮濮*/ - powerInit(); - - /*鍒濆鍖杦ifi鎵弿鐜*/ - wifi_scanInit(); - - // Lock the mutex due to the LVGL APIs are not thread-safe - if (example_lvgl_lock(-1)) { - - //example_lvgl_demo_ui(disp); - ui_init(); - - /*闅愯棌椤堕儴鍔犺浇鍦堝湀*/ - lv_obj_add_flag(ui_pageHome_spinnerStateBusy, LV_OBJ_FLAG_HIDDEN); - lv_event_send(ui_pageSDCard_buttonReadSDCard, LV_EVENT_CLICKED, NULL); - -#if USE_MODBUS_OFFICIAL - /*鍒濆鍖朚odbus*/ - ESP_ERROR_CHECK(modbus_master_init()); -#else - /*鐩存帴浣跨敤涓插彛杩涜鎺у埗*/ - - /*鍒涘缓UART1鍝嶅簲浠诲姟*/ - xTaskCreate(uart1_echoTask, "uart1_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); - - /*鍒涘缓UART2鍝嶅簲浠诲姟*/ - xTaskCreate(uart2_echoTask, "uart2_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); -#endif - - // Release the mutex - example_lvgl_unlock(); - } -} diff --git a/main/main.cc b/main/main.cc new file mode 100644 index 0000000..1cb2c15 --- /dev/null +++ b/main/main.cc @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "main.h" + +/*包含按键控制头文件*/ +#include "FluxButton.h" + +extern "C" void app_main(void) +{ + + + +} + + diff --git a/main/main.h b/main/main.h new file mode 100644 index 0000000..050a487 --- /dev/null +++ b/main/main.h @@ -0,0 +1,41 @@ + +#ifndef __MAIN_H__ +#define __MAIN_H__ + + + +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_timer.h" +#include "esp_err.h" +#include "esp_log.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_spiffs.h" +#include "driver/gpio.h" +#include "driver/ledc.h" +#include "lvgl.h" + + +#include +#include "wifi_station.h" +#include "ssid_manager.h" +#include "dns_server.h" +#include "wifi_configuration_ap.h" + +#include "nvs_flash.h" + + +/*包含串口控制头文件*/ +#include "FluxUart.h" + + + + +#endif + + +