From e24af1e4df82ad3f2614243685a1c93f12c01326 Mon Sep 17 00:00:00 2001 From: Byons Date: Thu, 23 Jul 2026 16:21:44 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84onPreviewScene=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/连续墨点喷码机通信地址.xlsx | Bin 0 -> 37045 bytes docs/项目架构说明文档.md | 125 ++++++++++++++----------------- rfid/rfidmanager.cpp | 2 +- 3 files changed, 58 insertions(+), 69 deletions(-) create mode 100644 docs/连续墨点喷码机通信地址.xlsx diff --git a/docs/连续墨点喷码机通信地址.xlsx b/docs/连续墨点喷码机通信地址.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7fc7d5644680f990217e8814ec4923b9bd577a98 GIT binary patch literal 37045 zcmaI7V_>Ag(l(sk*xuN-ZQIGlwry=}Zfx7;##C~0d%8zn3K#?m=<^jKyTkwa`L7ow;KIn(P~O4T&XG2D3Q1zH4F5PGO4BiFd}^cW_pwv2mxc zEJAT=LMVS>5<*-M_)4ho!QgjHru08_oasR=GYuh|n=6kSu349c8Lb{P4F(AD4hMNL zOrSdlIrN{Se-B^lvZ zs7<1$W03vM3r^$+XGsVDLP9?^(u_%Oj0PPP59|z`Fpua(pv^VA$oDhzvBBUIj&Vx@gIGSp-_3PQ1{6W6EjA`dAyDw?iZEfD=Q<(1kh!yrPt{Xm&9bGT6%uVk}$IdQybDf*E zCw)9`r~G)_veG99BYYQ(HnVNgtA|rjl?C@#vu$h!cHVK=8z(<&VWY3c={jW%uiip_ ztt|4z$W-{Yy}gImZgj3By*-C_^8F{LI_a;T+5k>XzXAav{!dN~Z5@n1N%fAOk?f;K z54r^1%H8`V)z+4qd&+OD3MWj4d?|Qi3*96kk+*TtaSiJQp)2TxA%NG{uwfChW9%^b zv7eDmyz86=8lzV+ZxNV>EAWN9DoA+@u`N}m*APW*C_yjvJG~%QjaddRE^$YW7FG*$ z8_+KCa`(@K!VdJ@L`Tqpkum!C-dqArMCx)$SUz zFtZ4h4v}y0q~%}y4Ttf;_o<^j5Z|vk>093%bG~ymF$h2*nT<2G;rFCAF{Q4b0fXl zfEDfO;r=76FBV47fssha!$}(4KBNV>!1>~>I?f09Ke@1+)MDocaN!5w0{K6bkyVqvSc$U4Reqz+OBW1^<<1@lxu7< z_aR5fPgP>CkMyiufLf)%}-%ElD^Q40fEO>AVKk*q0*<4Aoep17T`BXCY7`O zh8Y?HVUNFWx?daOil`*B2`@cAi9)CGusztgs+dSY#zr_oT$-FF5x@qcc!pAPvj3Am zac1Bs#Kt#@HdCSTwCIDO&=qQ@rLrCW%m7QtR{`;ahV@|}q&`#}jnOUwuS7O!QklK0 zr0)5L7s%-~^Y&uz^3&n}@45%5X+UmPe=FYq8}KOw0G#v0z1x%_Y5b*8)Y<}cZarTwmwXAosXjRuD?43)34l6?7>+3v{sCJ zr)1|$+cVtbS(7noh`m6wE+=sL(&Dwu^m1391CxapgdwsM^$PIxL0Q*Pjv@=}oTRp? zz!@J&fG}tV6&h$Fm6Mnf$-Kr>6G=OK?spIOAAPT%948(2sc2MhL)roew_mRJR66=F z2qey9YB?xsA)knN(?`?jRnod^JvVtzK*-yp)|e+sN?*zAzeWfe+l8uIcPkE~T|(pp ztRklgNifRiS}ER5{St<<2-h%lJRsmpa>1w*(;5e(1TV2P-C@W?;@*cWw z+jZ}x|Bail88YkhKL7sQK7vFKyS^H+b>0lGs>|D?`@tRNiWZ(_bJL~vGS^)F$cE9h z7|em>1ZGdx(q+CI_#Ja|`Kv82-#Ke8TFiW1fxQ|5-e4T%p}ARWz?`Mn4PPl1E{BSM zT0VbaId-_s0`3`tkqhj94-dG1u;Me{zton9ZnaVW-76GBdv#B7!dKdx2lvVx*j z-w2mF;0uv@J1J7?wpYQ(F_Sp-I;MR=a*RU)&E7d0)sjcTP)uu4n$m2c(8r);su(bJ zxMDXUfOT_|H7^<^_9qqg^Kmz5t*Gx5$sR?6RP5HUhYgV8}fmnU`3Wju8(}I>ne{Ykd37uCqp@cF}FuYGZPKlcNb-Pe% z;hh>)4mb~D)kYdTE2w=#7^bX5^AZB{<>*T_yjvI$z0fQ(k_yyC{7psDXn2VysF1j+kREu6{osh;vsjMHxSO@oDDp4%T!`GZe~d9CaFThz z@7&Wg5YP93;{-vR>6Ro1UKyWSuS28oRRo{ui3jLot-02gMuBQunHYx9vf9$46|j0V zvIKh+iyFuc!VR(_*`_<01ijEU)zs!h&{&`49EOZmL{hc)=4=u5nuw}ZgK?p+LA2MC zExXnx0`yd%nk;~0GZPxx7~PF_2GmBute;+Pe)UX*ZTpQ%@Ou=IVAUY`JaLm&lmc4F z{Kb^Ul|xb;Q*!NlL>^sXZomc1{;0-pbd1~zn8NdH7U>T&XE$5jNm~7OvI1!p-s}=UX+p~Ht&M5#9Fm}JFz9o1)o9pwBU>VlO z@t!jHf;V~;7$I;fBP#UAZ?qFZnyxBPcUM{d0^~q0w(~tuD^P=#P^v|x0+x%Cez==T z^bnxk7g4jWc370C3C*VNXNP;@z6kb4sZL0keeaK?-3a>&W}B!}GAM0Vy{KAm_e+rP zehNomS~A079IE%=TA3sdX8u>D!%~9TVe+$(PaFZ}4I$|zM2plnac<$``^T(6T3t4` zmv%3B|2fgF{oo0?17tM3#D7gz#?O)+rL|_WJB;WJAM1;7_p3=ZY(u?zwfcIvZ7QMm6=rKaCl4LN zFAS>IyGV+Gjdwk~4XM0(I&fwBp6J?C@nJ)Bnic=V50ERKtN!x5bU1WOJ-&tatlfhD zljiNdFvhNn*joF83Bh@6WsvUB@5sj}{zJBc5ANpaiP8N+x9Kt@oeSq3@YvSLE4ws@ z^73-LOZWDEdm44uo+2xI+1&SD`BC~YiwE(}j$`Ih3_Ky>D;w>J)Zcy zau5x68O+Hbf_j4$GVTuXHX)R@u;HPtTE5>5&dMG8e&83efP?FZH-{~WM7ucGw|~b# zK%lDJcFWqJ-e_LZ-;VG~Al&yPb2ML#@^+)V0RO0463Z3rgs7-=%w$r<0H==`bq(~B z;4xu8g);G50cKu8*{ESI2j?Jy%4FjLdI-H#)HTGpJyNAwnEO;i&M?WJD3HZ-=wr1m|bd zaF5aREsTgS5C)HCh@`W`NTi}+<6#wko^eAnEQT`ViHh`(h2~ZE)+v26htM>bBhmgk z!Z;B%iUWcnGh2r_bxXx`90?i72&bQJzi3FUGJvm8&bX%{?g)MhvS1*W_|C)jHmlO@ zb|`uY=O4+*1G1m$G}vP-FlhCQa<@XdD#_`HV6TkuZwoBY^|Pw*H78kB5rq4PmQ@zf zKhX@1rD=nq^S+*hnYMPCv2^J*+Z_O5NkQ z&ghlzlVp6NJ7S%z$HPYteB(L zAE#G^itG?N~HpZ^VB;Hmc{GN3(qwPfW^C2Yd^5{cY$ zI+37SFfCmYv+6dlvwQ? zc;8^*j2-V7^TMvv6mHW9!W_HoQqhG-aICwT1Ep?uM-+PcQ2%?-8!peH!evkO>#=13w7XnB}&fmj~KIXsIBnn)AqXG@a?>9GS! zjzzoF4tViK4-rXS>#9&5#@&xosn%j4iRQFZ7wuud%=9no zr_bsyH3cAvA`R)ss|hnRJS-L6EjeG1@){0`8&}9^a%PEB8d|4~{-sLFh#x}+;uN}} z2`7QRPS!r9;%BIt!P&6P@v!BZ0Hlx&yUP$Kl`nabVQksY^BiWx1ss`z+kvF@grtrp zngn`ET_V>Z{8U>OrrA4l(nPx~39?9;*05ly8yvaTG*n4!ZS}mmz?Oc*LM7UUP=0sP zOh%cYe)Qfx(j@U#c|(vH8vZt9dl?uBmhe!ML7z=wti=J!J$6hF6WNDM!Yorvhnevn zPAN;9ynG9j{Of3elZ+r_c-0Z65+j{hHu$X$7%J~nL3W*ljRyIloEpK12t&?p21+k3 ze0lX22Bpw42l$dU8Z%n?W&*1QMRj+wSjnLaZ_dcN=fRR{2roozTxCwoF4-X{FLbP5 z{HP=qk>3F2WW^0)lB z7Joc5Bcl_rsD$JPjdMzjg%@8e7G?BhC7Z#H_-zAEun6J zcqqWcFJ%p+sXYext2uYkOd6hyZFOq>q7EP9@^!4QTV$Etex}djV{(8 zBN{8A$>=hXQB9ztYbjty=)_^WHQ3ik`C+xXP2F_q>&ksWmq_CGriRah0tp)rcj$?# zUlZ@HUX9#SgKJu)T{IK2nz5_)Gpb~ClKX#|X^An6NISm2fbaB{kLYji<3@)&#-ZK6#2O8aems zk5vj~Ff*IW28rE9kc#WqV=BW1SOu54MWKY{j|Bew;W~Gg5jp)-(JtvkQ!huI7|cjEaxwiHC|3)mP_N2&~_< zt@;_oIqqi3Hw0o^Bd%beUffpB26zi(Q)TgvtWkSejq8z|V31bn0FyB@gUcbR-C^N^ z=2yth{a9}E^5)1o@8;fModuANp%DBeZ^uaa2M&LCkCq z8>m+sg~w5}e#C4sV+7UmX;?28lutGq?`Q1X|ZnZ|Gx8}mvAcddl)U@jMGh9J5 z4LAQri}IMI>72ldQrn7^G*)u;0tS$!H{B&2U`GXEi0F@;f!4F?`u3f&_?Zp0t|1Cf zz3`6ik)w{s1+~Z3e#dLDJ+yv-kO`l28Wz`UTBb+G%7vmZQld+hd>X{s6X(j4nI#2b z7(YZgGlmoCwlSjUmIyVXB;4;$NQADA(SFIYe6 zl8IFP;oSOlo@p)#CxF-MFNUv|LJVlsrtqD zhY*NS=ID_9&xai8_RZ;311(J@9wryT>h=C=N=D>PJwu^8&L{{Bm$QflF&%V69wtki zTCoI!W=g1%_jsMJ{h;oylp{QIdX63`#eW&pn{cM0> zCW>I-yGG_92CJ3JLWNViM-tjI`4OTBn$4@U@>FD^0;n4!C^FZw{YW1@L;47Ix{ll2 zD(!-E?E+7pljLANxnq`eUu1r)3qJMKH>Mam;~}=#n794gE2u~3ITpkanKsU2=Xl!$H7;FC=qJE*RvH+qxQD3yJqh`~#f|F@iTQism(Je7QBC50~ zqu^+Ho4YV1Y;{%QOibKd4e%vu@K%pqd3&vT`_TSItPmuZ@+hJG;$Q3Rv3m#A{bHj3r0$CINMY)rYKbql=Z~Y~-5H2_mz8 zt6EBxwN~Dp*Cp(~R@@TmY>y9FyG#Ep3=*x(atd^T`0oil%JR|-}@TK_-;wbEB67R!L zCxEgMmlmg?E1s|QW@Zk4%{?}*GHVV43#hTCXae?l>$F`S;BkrCTbX{j3Qe8^IczUwQJa59& zS7ZD!bGOG1?N*P?cJcOgcp>V7@w;*uJa6#-xl*24JVqjb1_Cl;|F0`$rq7jfV!Ea+ zQ7dB57VsV)gom!gMq4AuScElF0LU^>gjKxv;;^+Qx%lMPn%uE-&= zkk@dl#hHPV5WKETx%}#ha~~_Zc6)}@D6xtCXZ zkEfL@eD?v9#pWF8l|_ed*NlT0P0g37`QARfxR_hGo0AiTeG)bk=34@9k4wAvStc(J zciOi+8xNN?i^}j6GrL56UIT&)uDrN5=bhdcq#+O71G9IOY;&-hhfg`AjI5^}UEc2P z??A}9`u5o|#fFcbUF*v7bNlX_TU%t8OD}tNVJfk(l#6pkj<%0gJTKnOcznEfs=t%h z?yk3wA==St-;Nf!F9-QhHFd|!7`SIW-yN+sFZVw3t2*D;xm~L`GP`+nqs6w-y=>O# zdY&JPH{8A**vd{2XvNOp`gmDSU--YhZ{ec6!^a-;=YGib%e~D!?X!AVWIfszPc{~B zMaylR+H_!$ooAoFY^CjvS%RCQ71?gJ&0WvFu6tR_>TN|GesMIDqbGai;>6pIP2Qbx z|ETSfwsz~#%DC&Z4N0PHDN&+KK6k2m#b$g%43uu#Li8AWbkz3C*+ z!jTz;W zborN|#V>2man3)qtMV~PFQh7FzMeuHGHCG^qsXCths(%{NdR_HpA=09_@)u9$gQHr zVYkPp2)8W4QOI3tmb*_rpcIr?|E$KLm%JZZR5BwtrVw5XMP>R{>(EU*HWGp~1*c)g zA$hH=zt2zQvu6-g?1@XYuaSY%Fzt}AQ`$S~cl0jKp@+6VZkmVvFBt_scBLIG<5sXc zLCf3p20E*cc##2xY&?^+F##(|mV@VN_C!B4oW2z|mY%4PKg__mh~#38h`z!pwg8~3 z?RA7~Ff^q^dy%U}P!Dod$}A6dw!plefeIrnjMjfk3bK0!-TC9+lmT4(qUwmPG~CpNqocM?{>%#HyMLzP)fJ10a3ztrtydp*_-jBU8X z5sgs}`cA$|nfu<(CX_WGB5Y`p>bZk<8n_}?Vob3=l}U!sv%`Fp>DpiD4+f|q>8yXU zJDArF#k3HcB)~j$wvG$tmd zj7pImD4si_aee58lR4*zHAd5mIyyV_S{@cbp%}aPsT8EN^Fq+59kx(E;A|B{dMq(~1IX|q znJFm%-d>8{P#n6@DDdQQLmHp}goyp2%h?0KI?I)X0Mp-;0Ey%Ia^~r>_81s8cWSyQ z$$%34;c6|{Qf>PrN2om>Pi!jWZhT-iR?y>dmISsn_>mU)5ht03aDGT`zVM9l&QYv- z8|)$H#Ui6iUP!Jzx{>`VM7CCE|BTDdefGsQ@b{76aNOX*VM8-Y`vx2jM;wntPQxQV zY&j{XzM2BJGCMnQ62o?eir_D?X~o!tdd~g-SMn$A^iP>E z=hDnSF@9(+KKFI(Ivm%vrFkL#A^N~6l-O3_%Y-5dnRstPPunAL;*Q zrVa?}?IF;)E7j3EnO5qIE9Ue-XNMir%d@M=)Pc^_!E!Il5AmC;fgyzgUt4MH?$@VE z`kxpr=uE8vY3)69?YC^{=bsnB_NkGif4G5(qv2KzwDwUrp0v=IoKt5&ss)jUX=Ymr z{*JU<;-f>oy9~L*)B25ZKwg%ZG-6J#{#Jw>CV#|&+Btn75DTgWx zhnO$7%t!)HGS-J9gA&&6ei;LvWUo{j#^r{F+eneuYGBf77+ffRc0Ak6lrg-_8pK4>;)0_Es96-HLDiP z#*vzmfbaqEq){}UtM^1`MqfyE@>xo{skk~k)B~5aetBX`1FKPF0Z1`jq9lP+zt;NI zfG3TS5&Riu;A=CDjCoRT0><q&OF?L_tH9B*$C>REn`&mAf&ZgB2ACw?DGebh0Lq&oJv1qT9LN2WeONY-rHK_Z_bVQcNo>3qb_gw89kN~&B)>oj z{pWX6zcU1gEnojB9SR84Kk`h~;u5^kLTI{inZTB3W>E3r0JBhKYaR6}9r!6eO~^1f z?AF-lS2nvW!Op?`#~pmi1pllGw-fz@(MdlY6Yzf{`AOP;eGmWiRPi#0d?|LQwQ}01nDJTH z1}@$uoxA>juhESSU47~5^D9t3XCc|zcHjIq-G3VH`XT!7);903tgP<1O8+zt@Oa-@ z{m&+zzWE;iYV!CldjIQR9lk}Kyp_btfB!q2&lY(9=4s;vYvDy<#F4Ymt&Cohp*|hY zdGSqx5TB+enYb@-TL{7}j9lL3Yd6{Pjk8HSI+V8hSClxA(P%$|A_sg4cbz|sJ-?Y55T)a?WBQn$JVoR5ZROIDH8h5A9uZxWY|vbo4y7 z{oNV^cfJPtJ_)-8;_ZcQ)L~yj+wA;dqkJ-8rMX)!cR&0U_jrr4T&&C*cB?LcH9021 z(XGJu8%j)z!znc{wcDvQuh$ne+}b}^u;Z0XPghZ_Zv8ti4$!*pOQ?Mpy*Mh~^`YV0 z?VVSl10i&-Hhs-7Q7b<#c;4N^K8I*f%5(Dznzc(iy?=!{1Mv zf1c_QM@qrIl~u;L3n;?{U73Foea21F>ywF|6o(RHL;mH2&!h_!J7a(#QXLdG>QGd7 zMPvFs?dth0Cfm1bE6A|Ot90M1u8MQm@Yfa|?){d7sJP;bQpFThMZjZdj949^bONcJ zRg|?goZoEXLR*!m^RZ_sYRVyHkdQPLaFT!XJJuH`d3Qlaa*1GJa-4(n`pa1Vw46mX zUAJM`!c5RDM6_MnIN8-X1f z1iHR-zqGfuytKTYZVg<^%q)?Ab@u;+zkFo-!X>5W4+4vy_2(f*J7Y$xuXf_vUgvNE zsbME94V4*UZMTmZX`kB}hi#={HSAT+!bD6q5rLI_yrc9i{JTZErK!>D|047ReCDMU zu>DU9SS$UP?SJOKJBr`eqSx>dysPJZYuu`FcC6~cc9bWK7bGhiPVQ41CHxmzX=B~i zsxN_}VWa0B2GD|;GEzB!skeTixZ4#8GU|{*gb<-jGwx$h!9zYj+;30tKot-gi#q7c zg1qG+b!vC|G*+~_C5cI@0O3le=Hx3b5QZCh6oAGNRGUF2@t}b!Tv5TrRe+GBenE9- z#*Hdc5Ks%N2nqUwhv(I0O0jWsr#!8wPUe3g{KePZD6zxMbL4$YmsA|KR_6~pO7r6E zbKg%YA5baKWUuPp1hlw97o2_WG*A0)$BFrVMySHv*=20MTl{}#sZGw)AzuU`sAOih zRrR&S>ua!5XMk+03ojfHqtZ1ABQ|KHL2-whHIAbjDJ1hEIA!O!y4ChMf`BpYbLBTW z{Q}m$C7aA{+!jj8iE|NkOglLP2hlNY%XQDnxkoX&onsG@vqNvh-MEZ+1kaBbLo{-d zlWkqSdIcYwXAp37!gv`!eN4cKhBER9`Rb#{L3J$VQN$rFH!V!}^9I|imx(-OkqHXw z#$eNVmoC!uhpY^58jD>(LyCQXpKCx^@wVAJo!WZ$?~QKKtEXh=A3@t-mta3GdtdY& z;-bd(&jakWt;iDSZSI0)RcLkC%BloZ{o@*ZeuWf z@2}IR6{2Mu7G>M{2x+Bl3Ew)04L0I83(i<&6|Z2V=|<+mR8@%HPY2pl*Zbg-e|8= z*FIpN8nHn=@;tm7(}nZ!)AsGS11nl?ZbzRt^KR(;s*cOYC++=3H`~Xo=;y7mqu0t= zh~WqGTPL5Kuh;vjE-qj2T=K2vmM$sEwwq7dFKyb()0MLh?^F2n+rFz!Jo7zgb{tl; z=fmUMvsa%JHoDz{KA-QChvh5!^<1(Xz0Y^11~Apt?beqe=SxDq9d@xwU0Yh@AGd24 zZ(dOkYh&5rj}EI|)3rLch!h^Utpilw)O|uW9+)#imd5&A*vHu$U&+_h%cE~=CcgR& za9YXg{`&R7@3(dQ+h^n4HF;~Ouak6MS1}_dCMG22@wV>)y&eHtdA|OA=T{b8Uym(q z`tj|qnxC$0{oznDPNf0)+unQ^uZ%C{;xF<8B}@#CkCl5o)9c3(W4Di1-_91FF0uy$ zPDt&mQ+hAR@vbgznL`4vuFK|J+@G*-*OjJCwxx0JY@^e<68bJbV|}|uy)j=7lIQjc zeK))|bk}P>E-&_P9+(T+5nm3kuA6-xpUwrN+B0N>tCQa@mOs{gPalPS)4mIsaGg<* zzPUOqD}*G^jp*O5{W%05qB;r5qfJXAv>H+g=M>49xGiIkd5^puJ;*gbEWe34oWYFp z(63ahw!*v0z$oUVl`5IP-8KJ{B9DgF;Bc8H_XpAoP{ytU0Ohk6n9-~&XW-M6c+^6^eT_!)CV>saEY5##>~ z<}(2Tjk<=;J`@7;FLXd8t^V;}SmKMOIEx@8pxwTZk6=oI&5IZ5{MKL;5!dL3=9idt zw`b1cV8MDBoQTk4+~&53FO^A5C5*5Af%Zc(n45vP9)e^flaReSsp>#9jiO;@4oqtq zHk923m@#A)!G1QaJfn{mbR@cFq=|k-6z;wwmZAI@f8@*jRdK=Q@D8P2zPNw+*0JhHCnBoDc;TEhz7mm zanQzyc)LFaAzUE7g=;I)Ch!!x2HDLnqkp@O&yQhqBb+uaS8g-E9NI;7!E~nCf%Y@o z(DUU_){X=Gl=-_iML<<6lgWOxkmG}0oKbT{NHM$s8O{X)$s{=ea*gyH>R@=VCNvql zP}9H?XS=v`mL+6KBzk%Rfex`U0;kT%RHXdYNw)Q}a`m<;Hf{{Ws_!pd z{}6cchGUnG)g$eE+Lm7FkY4#yp?*U|R?!|~ha}IrcH(>M#Ny%wp%_~*MQ{Ldy#sE% zB5@}D!y)D4;h@zbt;3$6@jEq#2HJ~b;)~-?#u!k8==sLb7<*BG3vo5~ao19e&jD_| zsR(o%nQ2?rD__@3uOLXx$LfpKf+>(F8sH`_6z9}Gt5UhBisCqSj{BK3U>uqpI;*W` ziKA~_DZ@!;XDIw{q8#G5j4as%_r$fc5)l9qhQ_r==sL{m?#aDbju(EKpwiZaELTqKtLff3u$Pny|=i!ii5&ouKo{FI6>^38z5?IB3T=qw8#&{wIlwZn*ta-i`~Ux z%ePEwjKD5U=P39qiC8Cya9_lb-T}wh-NO#i^-d0mR>f{CJ{6Lf@I*b(;d*2P{dmmUL~>>5o9vEye9CicZsU&S~= zz|7qZaG$GQJc}c77y-sS=?7&;7P5{J(aX9MFTn^N0dN^dY}dvJf$K;wFYif`bUcSz zzf|<3pVhf6TJ14(&TNga+0}W*+o8{pkcb@u$l7vb38};m5~V(^C%*95 zXH3hI?bTrdoM6CCRhNvG-KkQi%|9(Aro5GEYOfPUO4XE%mNal)q5%$AS7b9W_WiD< zP7(H3;q;exd%23xI5K^#+fgKmes?y2^#BFBRe9IP4$H_#iOxTrJ_GG1K3aP{(#)X~ zQWJw}FYJ>ft5Aoq6H?FdO?w5E(NAbk4qszPIvQ0{o)Gbe#S}4OM2TW-ZukQ1N_m>a z-n5ewia77~~Dq?9MWqB`ZHs)+&jIfDs9aYi0_5H9pCv z-X*rarSL;uetTVfJYbg_pC($nMu0Yjr=hj3z%2s+Qq#c3(hrEF_jEv3Uqv|!!XjJ| z!@`aK<%l}32adB{q1L2CC}kDWJ!P0%yA<;1Yw&+{E68dG$SToV`T?qi5T4Mk52G*vbxf2KwOE zKLV1XIx9k{OUG|N%N3R3i`5VBB$+0Pltd@3jAQ_Ph3f{F*xOc(=S88^8~8=OID{*v zg1B-0z*L!xF6-aeZBlta!Ydk>X#v62z}U3*ZP|Kdbpu6RG4-Ebty;Oc&*$t)vR+m5 z@`tsOgsU6t1@sJTQ$?vtkpHPQ`GGlT>o>Z zHkwAw)=laEHmovIyWaSb$(T{IA>v6l(K+0Nd(Cl6#p+;R>#(IPNHP zb`Wq`ly?|LF1e}#0N~#VBZx?F^$Yh*$WGnKC(NIdLfNbvL~}O(kv;t8xZW1IR)q}z z>O{MHh}t?9YztGrHJa$=G@|eaTHqb!Vmg~QMi(iIY;F5A&IWCksqAnFYaEZ>Wxvg` z*On&&?bi7Z`IjhaGox3P_zCkxoK6Rrg9Kus%Z$7@)TnMV<4{(gKW5I9qft5}z%zi4 zO%g#Olqen2FGSFQFQh<3RHIQg^L}w@j5%D)W`T@3*#~+BkW#SDn6tUiO!UPhIGjZJ zh_eJ#lVVz}E+u()?o+Eh;j@o8%wG*rCq6H+HktjSgEy}V5z(V4PxM5N2PT}|v=Ojj zRptSA%QY>*sU$BirXj}vakuK|v(Y&{rr(edDr{E||Dy7Y-8HOeN#1rDbW|){MG4)~ z9gZe%z^{S4>KFy;XY>$J`N=z$K~Ar4KzRxxJQd`fQ8GmIm@3R27tjDf-)WXvphEy^ z;p5rjb`TwX2<3^s$T7np=ejhwBS0%HC1x%Rz$`E@8kREhH-|#R5ap znH|DAo%rGekKN-DPZ?&5#=dj3zrllNef+OY<2|gFbQ}yIpm^{9x;kS0yE@Wdv%!{d z@Min%i~r}Bk?K}@Y(q*}e>d3TVDIS|Q;3B`f2>uiRg}xyJ+A`d0tTYHBokemaMmb0 z28Ml|jr!Zgl&`N(+w=LK=La_rci)W->ZT_t)aL`-Qcq_x;_s zx#Rsm@6UKc&8K|6e-3>;9^dYsPuG%nuf2kBbv8G3eL1qbHa9kZ@py6YZgp*B{KD0p zzB#^o_VOL{)#cmz5C2T;nSu~`)zIQ@MS33@_hT^KIYE;`R@37TTK>zD=UW1 z^nCCBkCQLhM>AcF?pD#}`};Ng{p0ohJJ%rRwLMBilh*U;B5c>;P{`8U+VR}e!SY{`K+oYm9vha_(;H!|mJ4WBR4;mJO~> zWDvA`b30E~h^_76oMS8BmaeZG+hn({t}S23%b!s4(RtlYT)xh(_tJK%4I9^}B*fdT zn4wGCi!If|7u|OkFHYW!7`!;@CDjjCPM(kR?RUtq+O3w4_xADUpO{m{)xI1)obW?r z=sp?**~HF19GO0e7ayoNG=X!=mGrH??0oMo%5E!!cw6tT#AF{}wQJB!AD3bKQ-*DC z_xC5e*K=>p#kY1I&)GvUhjcj(j%rrP_~tYp_RsHhLqk)#ljsl?#kPmVL&>|k(Oo#% zcGEAXiR_;2Jh`T??)R^uH)=Y%JX;^$uP^NntLHYXFBAHWLTK=YkrUdcA*X&+TnN5v ze&rJrCe4?D)9}%nYxaKtKdn*QvhLEa=G!EmqvNF>!(ZyiZB@&Irj!8wA*7hUv4L6Z zgRm=SfU}0+$EN1{GEK9!@g7{li(Wt$s}cwUC7?&!NxcNAq%r{Ys0xwiq+dH4fPqfRWSoMT(2eQ^p;}8?_0q3GaLT}EL>O#EK8c`Z;1yq0 z-j~3X3{s>8G^GU>79nV`ezG1}i-Qut;Z!SgO&2ae%QgP6Lk06S#~wj(*;+A=#a?Ie zv_vBRde7lrA7@T56zxWQHNuGTIxyDf!k?O>};k=F?-QVT6wSh>O1C1W&(Abkt1 zuS+=ll#Bh1lQDxT1aX#_Q{D6wx=?-dUXWV*>v9h zJo|)u8_OCvVNoCs-O!-QuEPRFn%9I+lqU&_oyS>_Sx#Y*A*wCRG4#*Lkz^YcDvBZg zVs;?)Ro?kqCgTvlOA}{^vN%D7YbkD`K$W>8L-yejQ6D5AnK!-2GQ` zY81!S40DCml>Lgi;+$}yD-J+Upt>Ja>>znYEhY6)=?U0M;P)<0K`3#aaFY@NlO!T< zC_bS@`qoJrs4@t=4Y_L&~-#gOX2FHekmPr<<^3Jm@Ga*C7O@o*Puxy$^zARZ#pi$@R zHi@pU=Xq?ckZ$ghco*Y7Ia^2RKhsa;Ba5esa< zIW=g3HOhis9zSCsUtWG-a^&ac21*+8iO)0I2V8mZNq$eq9-a+ z=EjTA@2Cd)w+rjg(aFa|8Dg~x7b`XwDxxEwo@*_ZV!UbiB9!ZWmKAsv;gH{M?hO~J z@Lr0*P>=}|sXS|<3CZu3$xBS^h^gb{!oRD2rHgo34FHv7V4?1#{OgrE2!yUSR*)_k zN-EM}`^iTETta*{B61Sb+#HP@fZ2R|vX*6j-jzDg^9?>)wEkx$ZFk>nA$^v-FwiGz zA0A38Jo=RB{z0Gvi*B=p&oHVH`lV`2S<()}3?16OGu3E_#tWutUq6T3PX>AUaIM^& zRVCta5%-Po8v@l>eG9eVe}uQOHI*67K?-_^mOwD1-zX=$ygZb9ZjJ{h5~QPyPIH=9 zNp4fBN+i5;6UwP+zi^k<&!tLI*9hicoBRxl61Lz_l8)NsB@ZYV5z+CbD(?3?%QW%X zK9%@*WmXip$T)^MGBC*aI{mnJ zoku%*=(Dcc6rdL#f0Vuj0@=2t#T-aCN2^72^M~s3e2iF5@C&5UgHAAfJGODOCpzeF z8Cx*KPmYKxbd!QX)rDX^7o2u(g@8d3OiV8I^Pfe40-b928D2kz77#V+QIL`C{1AN8 zW03?L6PESlP&2cS?=CBJ28+5ID-!J={|8W2ctl3?eiwkLEFFOA4m?W2pgeg=TSUTBcnw1w+(0be?tQSs67#41SJYD!K35$E zUXgJDO=b7F`)1^L4flkZ`tVAsHWX@yj%eNtQ1AFD$)JXvDKk|x$xk!uc9SalR@Hfa) zoANBoe}j%k=ue>q{Oi1x6fJVvVGkJ8_OPi?fFFG=Ep{XJ&=DH&NPufdSt4>N-~@yR z*;4s)(^kyZ<7(N>?v&JFre~-*WKK>F{}YU5O;$%*)h(B+@mIf%fvvW37F6(nqqss7 zsspEodF}%i`2wvm2ka%i9B~d37X}2<4TdTnkwLG*l@m$ifQ;8Wu<%HwFR)-xk?BLB zfcFgyCB2Sa4&Jo-(L+n7u}E98grQ&+mhdzd954*&`5Am&fL8n^CR4k@bQG!VaVX7 zujSO>=T6pW-WCO=gDun<{EzT^;>(rRZdG5u*DN}=e2xe~pUovK%22^u=@fs5ET&kl z^QeR;hkDa7nOo&$d6ln!>x0L^*hCf$+mpSjZ3#Wq6SI3t+l^APoG~=$0@6R>6IBPH z7Jj+CuLs@)z@UYBRA7S7iwRDbmm;GOh;f^pDd`F0rwO^QuP62kirl0g2fY;Oc^Xp` zL7qY?eE*21+kF$cr1bq?S-~sJ6r-M#Nd`Po0Jjx%psw?%Qzt#C3)qrhs>hUn7PtBm zmg@>a+&za>JpMaRk$A+IwxHZQHipyKURHZSJ=1-L~Dm+qP}nw$0P;`}=0*%+xnk z=igJ6O5K&La{zr!vF_TLCB7Ec?$@*lani>>PP5PEfA+AlA1lYW?3yystVTIIfERfb6R z+*Xm(rlbh&l$XafFPt!W<~Mdtvy*)eDbK^ilDbVk`KOCf+xvlac}8`MU2KZdZ1EUG zS`_7RD#arYZ+#DMarZ6kG4Q{$RzJ&)h-0{87>C6&)i&HUd<4{3t;8HB285#WG!m-{ z3XS>^z26x>vB|7~pvEBw#3$8u=08%2n;E&PFiS~h3Dv@pk0?WjbXdTLwg!JFZeFtE z@d0gmlmHFq(=u1b!7$J#Y%2MS`0@hO?Uay=*3+I)!R71OVfmBeSx?-Yj7SpmvoZXe z`!*6HMhn|(O(LN%G|cWyogJsuB5ehdBUSEghd_kl7jdk0u@6fVrwGdEj^89ZUgKwJ zN78G@{)i$pbqMQ=8L;}tF_Avk@z-b|dn#?IWDao$cm{KrSjgC4%a49)*CmMPH;TuF zcm@X-))LcSPxW{HhR5r484T*;&ivDp}s>SMhG3~5ri9i_)Ga;++NfYF+p^)J9O`OfM>vP0Av@^jsPMdg{ZuqwD_oA*=S>0*7?MBr z0>Qy7H?@IEr(h}Ip==>fjK^v~Mg2va!9S7~|D3ki<8lx}X>}FuY`lHNx!uh_Gh$d% z&B1Jvo{!L$PIA@7pHIs<8BqL&YtfumTpDX3`$8`GGuB7|rfaH+UQeG{c%|Y}h8gDS zu(W_1vuM#SF@N_@1GVsn2|;}>C*sq@If6n@EDSNrpZ;l5pIhcEwsyJ!){xaBhnyh; zkRlUhep?rK<6FGsA21pC+8NfMOx(?L-*OpTE|qw)|bbC@=$9%etsz>56#G znUu#gXG}}i)S{kRUQ=esG6L9MH>H37IOnY_N)P>lEO>u6B}JvwYa?m+{eC=X2I^Y|1xuxMO80_gB)R?@>#ubSo#F zvz$Vp*Hpf}?LU|^X_{f{6+DZc!=QF>8DJ9!RR?hVyp40<$a{{wjEsJxZGMm?TDen5S3M~RjG>E)nTuLDFT(VB12J`7O z%&$SO(UykAbhK8y2fsqoFomcg$X+pH8;fZBwV|MZ%_P9vf+4SZSg zmRm{TTV+V*n|&lR+8)My&zq&x4m3(%*3+IJ@O;|iQDs;fC;z~EZ%U}ztU$fLq9n0f zUlwt4nc$S~xhsJUqJ=+>;vJIt0mp&-@xBFOa=3NiE50SRIqZZ@Id>nblV zoXk|&Jy_7sx8>aS732^xaUj@l<_vE8-gbzFYE%u_XqhTLkbW;CZ1WZL7gA%4W% z;JqTx;A6Yo_lYR4vzD|MXhclsxNq9bc0f}CGeWDUF&e9bM06}h`5AIkXXdPDIgDG* z!s4W%4=_LwM!CWnbb0hll%iaQ$R`bJI|yetqVpIb`S|-+aOJ3efKS9_` zVHL07sWA?sVX0^teJQITlcbD`lPz4dB6fKM90Z3(Hqn7J7U5?Z`6p$;@&5Votytbx z6`t(2u6>Sh6%=nr`^qDF#oM6{-4#?PZ=c%wddi#-9Y)=MuYk(EDwCSP1KuDZ~q2DC?D zL@nAw2p0JdQ&9+RPK8OZGq!IP&G8hVPYrM=j*}n0HJbr#7~GR;ELsP749Q^oYy)iQ zD0WK&tU=PUw1!rw!RUBm11!nmBikC;mnl^-vaj1|IBxUBObEKXdB)2=YA`xMVe}un zaHJ&go{H&4`(7Q1B{Bx;`Y*#j6qwuecws*mx&db*GgWpczT!B@z zKQMqb&F#eh_?v?BZo-ZwGNHKUMnu{%6$CqKU0#Egx4dA{YL@1(e8>+D9*fQjeiE>N zr>DIv5o(s=7asE0JFfJ=t7v=G!_qn*#g5$NQN;s`8@*B?TL}DuV@40f^(aVVCqM*G z4+Tb1bJ;}ZdqPKrkh}o`pF=u)wDaZA`Bb` zgE2{3_xfmlZ~}{nWaa$h_KIku>|lWA+mSEqFe_S*Opl)zO;yF+Du}J3P2nGvbc({L+|Iw-O};qZ&Myv31{-iA9n{y_Vu2RiO)5r^5KR{o#NP$$_n zc(Cx|3Ti)8%>G3~?Fbb8`!2A$5adFsx(xqf& zAB+m039BEC_;;1+MhoCj5^g~EgQH-waidL&mFX~URzu&r&5j{?%2z!RVb664j{RPT7Q zAv6RMD|goquDop*o`U%#{E4J3hjO(y)wVt_y{HX@#5hLq7s$2#nm!~ZZ38jgGCl5r`6A^a6}6og7$kgipF3kFU4Sa=P5#_lt6R zZyEI%I#B*dlnXtvci9nsv_jFaL#V+BO0&fqT>K4(LM?u{Pq)CQo+yxz@R~jv->*fJ z)T9k@*b1$EOEv4WzO6d82vN(<(s*zYxr>&Sn%h(#Rsc!kEw%+(*Gtg8SbiZwsTM~@O_-NDPb6TZJ8yX)seXf)km$8H))y&Bil zt<-2cz)W7=kh*?+Y?QIlbOVVb<8P7LwEtE&o7K}25R1BI-I!Lk&8v@RO)J!3MJyHx zMyV62RW@R5nt6c(K#9kZgp-$0;^h(29I@sb_k=f#^@*1=m;)2J7=CWdx1iYSF{j=n_MI?N@e+i4v2jp;3D?%@j24ja)-^37PEwy<@UEYOvVhQr z$#%*7im0Q+5M7RE7$fqk!M;n--a_zY9LcX*{76O`g@aAQInZshCpd-eJU9vsjjMJL ztwUZ7h$}y@^u!}*VV*R5G1_Va)5`6w#2ADnD&RBQa2M%#WK`}*``fikeV-r35Etvi z&lhWt&cSe}#ny)QrF|rg7b4}M z%$_5vGlPg+aiQoB)yPAO{UTTPA^jagG!y!el=1RtQ=?Kl?kUUJ#1&Pe}?$tT+Q7u?aOhi^ZlpAYO=fYgG-Jvp6J1aTpaPY9STbE_!&!IsY zwXTvln>xcIBSP7CaW0-%m}fRFO}b0adQhRd)4^axkJ}kKY-t8==CjTWC_|;Yh0=C+ z=?0QA30sWg_ip0y4pCO%=EXFGh1}p-Q@A(nP8ZNnqSplqCz5JM$`*q$#-(~D4$$h! zbW;G!G=!MjCb1v{H79E$8z0&bgNrmrMu`z~Cz`HCBPN|*P*ZpnqfV8qeSGMfjFQP; z>7w9x0CVm(Bhu7r7UUygAOO<4QE9LO16`9q6J}I*2M;BVSG_9ASLa#d%rXnQi!lyz z2U=0mpPbl=G5gt1n%y32H`o49c#eU3H-DU#wBg#PN}ys5+t61c{lDk8(En`}_D z`dYflWs1!0zh;phl=t?SwjSJp%F~Al2R6O<+H32u*f(SDQniq_)NPR3O<&XNjqnGq zV>C;i@|XWi?&SCXVZH1S-LCP54FC|K^*`Avoy-j!O^lVC9W89loc_6+@6YB{vlenn?Ps2u zT$K6oP7Ia%7>+6@@jml4@J-WDp*oftMeuw8*PPlv9G`IQPHB98Ca=T1Y*C;nzHjwz zf0zbpXC`LLlq+&7cz5yUSa`OuPEn;Hbt*F^%VB!D{q*_f`<~x2tSvOKt!lAL z(V&VRTwjmuFOHKz;~W2j$?*_%0KIAq>5C@19%%$hoJN%%qA+H<7U<94z>^_;>|)XX zdaG@*UB!djtFz`t_o=rp+H4+vak|pzYsc8>YiIG@dt0DUP}AJm;A_Wag;=>X2))!t zWs#*tLHl^{bd%a{NHeV!nKgcO(_Ep{k=>UBy?b>tU5LJ>qQ&@NJP} z`QodWv%z5=RUAng;qbU6Y2vi@m1o`Es@>_?)#kJLWviQQ4dx79wdT}R0GwAnW0M_~R9}*9bP&jW6l4&L`aVcqA1GCzjNUYPTY~gMHY7fr?jw8G|!IuJ` zXVJ^Oj?ND-VKSe<_`ey@cN5vbS-?5)E?;?iR}AgqQq3Cy=M|k=#>P?mt zF5e~GlZ9MoNy97md@8KXZ}~;c(MmW^^T!s z$a5}1QSDBR4gLUhq+Jqdj=%WBn)$W4vgzQCrB3HYg_p$9hM`3RB-RtsSsZ3PxB=4? zbW)KQw7q|0FMM2omxKF+mU(Eu<1ljmRuDJ7=a@7iexFNNld@C7HH_P1JJpsj5?5Vrs)(*zN%_13 zw=x;bZnKr4Uu{NT{S#gHHX)M*fh*y&?E6yn1c8(~s{3jv`s-AoK9R!YyMw&Sm-e{{ zV8K*o+gNh%iD>wfM!~*V)+7ZlS*?b(T1#nu36#uez!J(93y&TJso%7Y!IETX!Z^;H zU#VnIn*2_>f^;FBrFDQAo1AGdA~Tkw6)sTQq);YHl07SoJ*F(urI#YcOcD}-2~>12 zUG^ZoOsTaHx!3qidEi8ND3ucxQ-J7KVY?dgHsvI7Zjb`S0kjQefiXySj5 zS9o|@f#~jZoZHTM_qdt;7@>l#!-CyL87*Ctg%8LED`O1f_^Qf=-sMMPV~s>lngCJP z!&$vu<*;k-a8goE#b33H6ghpynpbqa(G?WABP65!wEQ@XDFbqSqfUxHjDbPt69l9$ z1cWbRYfR^FmO+s`zU@7d?W(JSRvNB;R2$GzbBF?sNmQ0%q}xJt=!C}t26e8Wqey1n*NNHB zVst?di8$?mg6tPPbiAQ8cLoL>>Mt99s>tY?5XQ9bG%j@d7}C()qh38~tl<5js?WZG zo9THf>T~H=`tH@LECX5baTZZ1SelqKCYe9`cBz>D>AWQjD z;I-Q3fnHxUVvpclbSKQeCz#c;(4`vy*DT#eQ1K+pf0{s;RW=QyK%ag?m{8Pcjmlb& ztdB~{bKcpJriWY;Xz$R;&qUd%TY^$^ zlEGl??MT(e36Mpa*awSW33#M1uG3lz#3*CB&-8NWHo9!UWCVGs3< z=bGSkbjR&oTe883nT30NwO1Dce;aL@;Pt5X7T$sUu1u1&GM5jomnr#fV+>EVHn9-} zp%l1Wdf=Mz{X9aGPCfhkOcT`l^spRF+4c%ylMht?2Wo#hv?H8s-U)!~UfwFAx&cJ%c%I0MInSR{(}0W9krEGW9d-+h1Dj+duF{ z4X~;1mqBG$lPTR;LTG|Lxsn8C=^Apw)P!nICA8J|a&)`)2}<;?7hRD^noz|pK_Ubi z@ZxR!ZqvC3_gmu$!~H%eEm6q%Yzv(8s02U)W9QL38w#6d|7Z-49{&YG&xK5 zWcETpK5^l&kUv=N#|T@9gEaK5Y|N3wh>?t|XlTK$`~YSaW4saMEH!^HSJx2}dr<1n z4ba~1$}$!QcW~9cbij@*nLrgvBB0>GIZm8qde-x*Ep*T(`dN6Z&R+ zA)}RzgTJi|C%e8u5{dnwm3q5645qo`#Foch3Ei!ruj2-+(ob2q`r*(Fs8YEVk6TZC z6Q{$JlSjnw7aB4WZIi`W+cTA2Q)GL&Ts}ANd9pTZ^jssgMH7^m+Vz`ioxSArn8f?= zOtl{!r+mJ|dEx7qIc{`8LC$;AM-rW))-_3bg7vO(qdTAyi6SF$4Cs0QgOEL)Mhh^7 z@JI!1@ep(Xf|su}?zM#tFa&M47*Ydiiv0{^3EDb#;e^a5vC;DT4<3tT5XO71r!JV6 zk&U46g*8J*gtj>g<+9f;aqX@-q0_g0bNPc?g*LbXITM=?WZz2^ks#a9}T}-4U-rAHyYwMGm#F8(H@UozX`by z1m$aQ)Wb}$hXpb$wlHLPxz+MlfM@K>E~82v|qQoGNPuUy*DWt*(HU_o7e=wYYco&HNTh2j(0J(%9!@ z@Gy|S`+j%v3=XJw?4okVrhlvP12`5E2jb6+PLZP?-7CC_5yaqA53#ne-e)0mNSR`B6Maotu5W57Py~C({Z=n_B~*}Gqn5zA=0uio~)v3 z`hd3!$hcuPEr_D2Mqatt%+7d%_uHaqM2=Hp9Zdj6fM}$w?t@mbxq^A3)(AF_n^D=^(dEKP)n;U1a=}1b!LlpiD(@swnozOOWWl59E{0=jV zWCBHZ`M|Nw$0Sq>Np<`H5LuLoFo4>y75=~x3=HnG-DLZiD6?PT@%fxVKuF~f%MW%f zg>P?{Ykm7~tum%BH-ftESwphHg)kv|9uMD&%3}~=ObuJ~enyN zrE@8~289UcKThxNHTW~38-No~D=1NG-ijf&ZE`*lh-=d#`be|f8TEw{UC>^hq9_<%9Ni532G(_XjMqFKjcPp_J` zSda`vbEj|q9-|JmDG%;+Qs_0d6h;|uf2#QXJ0u(|^_#Y$&L-H<%Zchhc(qOoIhlr} z=!g9lI=J#u6g#3aEjg{VLkr#o7vrr^=HS4--{504WX>%w=%GrE*&^#R-&Pl8a@kIf ziU{z6rhXI|5}D zE`EcyN!Qai3v|pZTO&bo-gmtzVYODejahaQ04mZ({}kO+r7Kg2-Uz)5OkPA3&zYo3 zT2wN3UwcP64fOJrn%+IL6#RTD2`s8F?{;p*&B6~=X}teq$DSoZ&{#K+mf)dA^WbZ5 zilJkCbgq{>)bFy<1ATxFjMO?@nUlj5Exup?BQ&{c`cs*wKl@vG2@T~ZUAB6EqPs@5?*k}@(`H3!O3D!?HZ;O-e^d66){*W8Z}bca{r1;9qq?NG4F z#*C%&h=%T{L3l6(*j|tZ9BZ0jW{o8!!l@ZAP~i<34w9zrni8vE-=*yUaMk zcJR=YqTxi-K2`)ZvzjU;qW)e+CfD8Q8O*&c%j+w(oT_>Qv!)8@`93QIa%de=dcAHA zc)dx7csd?G6XHMm5M)e6U(B8*x8Q{dz4`dRz|a&;oJ8S?LV%1jQD2mx-00-FrIV$3 z0*{^xda7;LBRV+%0$Lz};cm?QiA+6T`}qB0RI@6NBXLG4I3cvxD=PSs-&X>NCI$oe z!*^*6c)qP;3X1a#DH$2Uj!nY*g+jp^yfrV_OnWMgpIu$x;KFsYp5UDKY_d;a=X4Pa z^N)LWr>f{P83`X#w*sRH4cwgq^e(88W!SDd@f4PJ%Tb$il0dDsfu(SWV*MTI@UZu+ zeJ(lhZipbYG&GQTgS)fQ>?{~2p&#$0shPyFXsUdNA};>2RWDroPAkKh8O}6#M=rkS z#{%?by){GoA+hI$zAS?9&F>_rBZ~(zlf9`O1_JlpLzaQn>xW!-Mg!0dg>K%$7V;c` ztO0qX79bH81dh!z@^VUwhAJ2Qc8Iy-;X>W|=&X^SIOF0=dQ5U9$3EN~?H)(CY)*LO z`XfTvz2O?ssi`l=k1-i#7Tpv_;#o@eWez0KF=SZggcn`j+1Vr6`kDZS*-`3kgZXqk zSe>7(bgBe_Ao#&jU4||%tm+`f0A%-jCwLTruLkgGLmr zLu*3j?DinjWi_I_$@7zkDC^1YQZnO*l(I)Tn3+_^87p(Tz z@XId;3!Gi?x?!QOFley(ie~d4bZ#KFpjYERN8F>UmOvb7N}*%72|1Ta>e*B8b*v~f zut)cu%zC%W&(9B2m47YA7t@%{e`7>PC?UCyHGO;u zUarC~4IaX;4SvsOwXuQpp>-7y=s8H#klYBNJaZJbK16c)1s`m#(wvq+qOP|{42A1I z{e|@j)t~+R_#*`AH~S%jlkdvk^{1PF-I%@$fZD@hQ&nYD`V5yhZU5_6$MM&N+5@Vm zRhYEs4Zsqd0Cn}4bQXnSSj{q845JJ#D5IXSy0HU+jB3!O`jPD(`O1>CTYFA~zwM2X zNuetsX2!XCA*XK|kckS~cGmFWO@A|fRlc;s8k)X7qUk7a*LWr>_ZW3f?<+&I3MK$D zz4antiqgwfzd6vf9{4Uku>!>JnB!V^FJTCJ0XMOIl~eVCPIF^X1VPr2Ri>BB-r<;N z^vQz#BE{^^hN&c|5lwua(fF8w9i%n!13X-#SU#XFx-o*08aW)w_ZGlql0CvwsgquI z&p$OErtkA|#V*OKY|=NS>JKAq;k;hk!YF#bc4rqx3}K!mm7}>QP%t!4Dq!U z@hTo(kL!qtlph@-+6q2yO#~ZoGKQQI+cWI;4ArJHZ|v;6`@$ot{wN_k8+ft%L)7r( z0^6Xq`GUBOY1lo;rkT7wQo7HGe!TJZ068`V?l|lfP510tFW3FDh6^FK(rmM$12J`+ zS#tZG3Ap)6a~wN_QDP+DQT)6X4)cPsH&~CdODypw8mDA1PF(Fsl4H?ej`Hg;d3l9aNC`nxnHz9jtS*khEU#q7Wbir` z1M1pqoz$01R7!p46(=Q|D8Qcc?0AQY$)upTt$k z)$?zbM#7n?jAH|geFLUZb@EX)v6uxLh{PKPLl6=fjFOK3Btb{hsCbE}*l^4OHEd!v ztDzC^RGov45Bh0Bw=>u3r6W^Xymxb1h%dF1{9nSRkR5Gt89~}lUYYj&?b`0?jrg)7 z`Y)ycRvTGKa5j9wcm#v0t10Bj`T$eK#t9=fJZjiF^^% zxA^_W92&+h5-3VD{2=>6=stmbrQPIT9Nrof5 z?2WS52`W@?GCC1L;`rGb*XR5msveHibVX0I2u_}T8k44EpG0+U{?5zHE z;Z@eLLKZ;rM*n~x?;wAVvtAFfmYg%Lok>WYRb!B#j3MG_SeI$%Mv z=!M`Vw@JTj@e8M2;uC$!mba}*?M>$XYz0#|+He0T0C_O@sD8Aej{KZZKS^ z6ugz;v~2Q3}pw_KY7G608^LLAV4LU7XIi!`3Lq8u%bcLeTke z#$R|{pfOsD|XySBe{&h&|8%eYBh_;|QVVP*(Lx7UXqzW!SxbB7 zv@JIjZ8)P8FavDH$dN-NwShb=LFFzXp8n5NLE!$0klM!2*?0$qwER2~8aAihU&c`u z{_po6yN#OfyN2aW$zI`RBlWozmX*QP`;%jd2M=%P^?l3z|j~*-qS*?k zMj){Swu<*GlBIx~3@=zhw`%7x*+b^<CoyzVvpyZ&_N*`}CcD_w}?E4G!%E z)j~fG?Xx(|?Ti^Vs-|&w)zvAwFO>4(6vf)1DxqkhE<_||X-z=yHc?sxpofSYefR@I!5WD*zm z6SdfDK$FnMF*8Regq?shQNto>=;^T}P1b?!2QTgkSedQix;JCBcn|OHX?=b>+<4)1 z(c*G(p_0iOIL*aL*S8o-EYZ!R{$=`q-sT3nx>&|~4$2L)N|H_~7B5Ju($Ot6o zf!1@yVW+554-0=yw1kaJuwOueHpQyQU>Ijqx__u9LwK~t=-b?}WvMYF6nA)o3B1@z z`uFHuP5bTJ*GL_gC$OJ~F&odMJ%%C=b9)m@)7unhDV4@&*D8x3M3Uwx>s8tSmyElW z6Eo(SkQvSI%Fz*v(e&@+0bch`a678H0kF*`4}kru2iVggHoFaq?Ic~|VLtW#>aMT- z@WYO#A)i^MuHS0$QrVOhYFW$UL0`{jkX${cg7^l1^Wayp!}*nu1X@&=$DQ_}w{{w~ zJ6hdh*E+rs)X#Y2JWrHdGvjjT0hAmI+8bA!MFnCPsf5!y>Ki$Hq}rA-dzcj@g4&jP z>PW#?;1pENCpd)yvmBl-vg*;RPc*=BJz)}pAXP07csNBim_o@Ak~=gESy#S24=O~K zNQOyZXsS~hP3vbXD5A^D7qC#HOR!qjKntH)7tmRc|KP1fM52Re3t-UN_Y~kDM1(=(rSv2O;N7<#XU!$x#2fGerG|8$QplsGF zXw+!=MC{a`M0G0?IF^WJzIZxm+9oN^+?x1OM6Tl>V^C`a2lmARha&tmwM3?E#}UFa zw`(-Y)8*s^5xI@1jfI3jN`&e8)V0Z>s;`ozu5S%HfhSPAT`Xnmdt;0!uyE0epIVUZ zVBEu^9!=LP31P2j4{hDJK3=zI%a$QkS9Eq$kE7LGeqhGYwAQH8+1ZYx)wWedKfQG2 z!eoWlCJ{B22UC)4H`JY6$+oMBR%Q6(m!YbVY}XC-l#wJ_UknuGxTFmGryJ<#e9^L? zoLNO?loPb&DTR5WJku^U?o+!j>f#v5v@LtwhjrNzj;St3>fciB>6W8biGpmW|0Uz$ zOZ~nIlfk#;eWY#qKLtAqNdYbr4zWy)`BE5&-;Itdoj=lh2FV#a2kd_>ARzfz`F4D5RtrjqQ3`P@fe2^tpqJyKClP_?3hRR(3 zv@k{V(lpoL-Us1sQr`2or^PfXtMAwPWZFnb&spO|re z=ch$+86o>91kpa33jMV@Y*SUSnmCrQ@!a3JYdo*iPhqfth!d_uAo33)6h^X$VqDpk z@BD18teg1yV63y(1`>61Y`Y;$bg)_G!0%wrZ z&tq)G^kisN&&2R7_OmX1@`hZd>detD1gC_^AU`Vj%2tZLm!;~?y^$kt(-4H6KApCgG~^8lf)`!z2@4ez5Z)GH^&>CZ!#`03N3X4HCBiiYQDVtk8i0 ziU<*lv4@nbPGLl8Y;fX%dS?}@3~7O`Kb0Cou_$CBQtDUonkOidEtd4RTAnae=zv<^ z$fqlUDmcgQNryT-;^pnQCU?uStrRwzq_b zbNiD8)hYfoB+{k)r@FTqbn=XS&yQU%k+g$r`swVJwbQZ4#^bcqck$CB6=-Yf7YEAb z6WEvg+v;Sw&2u(9py#TLt1i*)Tulk^AdRE6|cOgAJDnuCqq}b0z z@+jsI!|xv3{h1UX$0_DP?l5O7e+Jzj;y55;<%GGh@zoZZq_l=Y=}{vYZQVKnaDn4x zJnlAXQJ&d@R?DqW(xY;Lkbp6v813Q0J&pzf@NrLPmQ&W8JBAK@J*za#Mq>%ylXHdl zi17_-MXsR7a%MP_m4P$>ClaDdJ*x5iztS;u_Mx)U=uHT^$-o6W!8j+i?yWcZCwd6i zhcMTQ!qQPJx5^SWO{PlZN`c_bWswXj1wg4Xqq38p_U|1KTUxgHQt~2-)HY?tM<9On zqpahC_{UciKE_HGNG)7&_R5?iu=cDU;@Z)_oGn-%DTR7gl`CKX&6N6ofxy($yQ@TY z5Jc0|ITwI7sm^Q*-TA_v+6{;wa8%K{zkR&E&Nm~Lc7}8Km4ww$D~*s6`isGLy?o3* zsC9R^eK%)g(7eTAcuv(kAE#Dj-TU%o@qV|G10VxK&X5mGu5-NaOELUm zpE@!rhFE_d=X{qy_UQKiN+e{PpebcDpscTAkzOG7{oT(4Vct za~yJ7l9QR!)#m2q@$|KRe1B(5%^O<+AD!0B@xH7_FT3>!6R&g24}hf!ddunilyYjf zmG${${M5V6%~2;8eXz10d>lK)%ia2N0-p_HlPp3c_?*M{iP1B8#dlaai?+nyM0Ehp zME;uc=f>Ixu7JU^DmKSd;+_jHmBISwkwct~6Afu-5;Z_+^&*(O*IuwsKdalz?rp{_ zv~M0*vqyLqC@ulL3pE>Y<_{?n$LIa(sgYjLF$l95q_8RecFyPN=)>%FF+BbR@5e;S zp?e+_@E`?#d=ajVK&;AcX7=a3vCDUNHpiN7h;UG5I`8WSUrtF7RpG$HywbNZg}*2LDV}zT3;E>1hn$q zRv=pJ01C@nOSdn6xnO=7T3y)bvWQrvfZdmSqz%7LMMNa(IqEK~wN@mA5T1QsULjEr zQh6q|s-TX@2gzKp82K&zX_IU*;+u#Zw;tF`AVNOkPNdRZ4lP7S);Vf_tn5})LZ^R= z(*8oGQU8c(P;;B@TDgH_M*nmWa!m8F*v>Cgs0PHs?X=4Q55y9ud%Ng|ZC}b_;DX`? zYS?!M`^rir%qlaoDqam@={9BAhk|vQ#1A|D6KZ$kpQ0W_K%h-A}OQoUma{A(B zR%7|n*4FB5hDqbb7p8ECSLDi2T)xg_M%&n=VuE)D2DhQeEb9>P3ordTZUyw0%Z;v- zC_RQ(Ko>~O>bEmOQSCRanbtS>Kih-<-n#}D$KJT%z-_) zAIWFtBbu4OBpjW|4H^QR`7#PR2<8R*aYgft8ib_*jSP|{u zRHcZGL+x${nzUhUS^Nmn+{st|`T66%-ndzXJ?{7wbl~=nSzhGA^7-aa&yjTu1ua=N^GP6YclWZO8ckWaveSMf;lMxl%Rg8 zqYiU9(oI??kBxs^Qh98pDuq6OfcM)=jpwkcW^?#iG5Jv)1(LkhdbgvjdvsPI|8wbv zWSITeB}ppBMzCoByn#zMoC!7i6!1W$rZ|~M@e2HD1_sX>k=&1R7t-j zbO3T29Qn0)e*#9jM{8*ev%#1c_gW8;5{?yy5)@a_N)$7(6#j@w$+N>y;xK!u-%$i` z*>44F2&p{NM62c}O$h`*`j#s|*=T4S}=OfkxDLx|QzHwp9Fo)bifwAY1ZN;$< zn$k8!y~8u~|NQ{KkL6tb|I@7hW$FL_*{th+7&+vB7j=y-{vYmOUWm@(aX;U=5#m4Y zU|K?Uw$A_0Qu9jULn;eWi(^59A7`hX_B(7K;QHO;kMk4VteAODD>S*~yd4(RG;Cb% z8*+S`O>oBld7TSALY4|hvCMYqwEcd^TFzB+&iU-wwvI!*KLxL3z4C6w860)v{uXRJhWE7U?YvoAH~WFZ`I@wXPqAeklP} ztJD}gG~H-4;qFQg^Hpimmnv$-YaLFueLAa^o%8GC zj!OrmHqVNl;4FNz;U(*|77x)q)%Q+ZvvaEcvB}-HH2V?H$?I=tYB!cn`l(ivr#elm zY3K42!ky8V4P64*yct&I{&TFh)OvmE-j4;Xt><`EF6y6HA~#d#a_;`ed@2{k{xt7@ z@Y$VJ#q|2y$Lcfnne2aC)PAYERd~&$v~sQ1ciy^NJvM)BR^DFz&*Gc!K9xI{+^@I) z50-D2l|SQOEAv-a{`mhR$4}<}p73&c@(*DCW@Hj!Ky2wlk3(RVWng4b0FpP_85pp{ zD8vBVl^e(a1_l8T(G07`&@Dx;>_Cbkma4$@fHMg`%Rr?+1b{6AGE?%C1B&tsKvgTM zC(kwo+*}4ssNBp@mjM++>{Cb9mRL{#O0(#?<7WS5A@X^hew|y@MX4@oSY6M-~gD}t;BYY5ULpSAigKhg4VDR#LqMPyoXfA5A z3~UNg0z(w`=+~_x+#&^RBx5nf7*QS}OhLbl2w{p7usFqH3OI1keT06;3BnXZZLFq% pZ#+Ra1^p~wgem^OD`l~`1$;7afHy0sAI2a9gsi|=nAHj50RXcr+ztQ$ literal 0 HcmV?d00001 diff --git a/docs/项目架构说明文档.md b/docs/项目架构说明文档.md index c7172c2..aea1217 100644 --- a/docs/项目架构说明文档.md +++ b/docs/项目架构说明文档.md @@ -1,10 +1,10 @@ -# QtUI 喷码机项目架构说明文档 +# QtUI 韩国 喷码机项目架构说明文档 -> **版本**: V6.7.4 +> **版本**: V6.7.5 > **目标平台**: ARM Linux (全志H618) / x86 (模拟调试) > **Qt 版本**: Qt 5.x (ARM) / Qt 5.x (x86) > **屏幕分辨率**: 800x600 -> **文档编写日期**: 2026-07-23 +> **文档最后更新日期**: 2026-07-23 --- @@ -20,7 +20,7 @@ 8. [RFID刷卡模块](#8-rfid刷卡模块) 9. [编译构建系统](#9-编译构建系统) 10. [关键配置与宏定义](#10-关键配置与宏定义) -11. [新同事上手指南](#11-新同事上手指南) +11. [上手指南](#11-上手指南) --- @@ -47,7 +47,7 @@ | 语言 | C++ (C++11),部分C | | 构建工具 | qmake | | UI设计 | Qt Designer (.ui文件) | -| 序列化 | XML (作业文件)、INI (配置文件) | +| 序列化 | XML (作业文件) | | 通信 | QSerialPort (RS232/RS485) | | 网络 | Qt Network (WiFi) | | 条码生成 | C语言库 (BarCode目录) | @@ -74,7 +74,6 @@ │ SysPara (系统参数管理) │ │ DevOp (设备操作) │ │ RunTimeCtrl (运行时间统计) │ -│ LogInfoCtrl (日志控制) │ │ RFIDManager (刷卡管理) │ ├─────────────────────────────────────────────────────────┤ │ 通信层 │ @@ -82,7 +81,7 @@ │ Modbus (Modbus协议) │ ├─────────────────────────────────────────────────────────┤ │ 硬件抽象层 │ -│ FPGA (喷印控制、高压、相位检测) │ +│ FPGA (喷印控制、充电电压、相位检测) │ │ STM32 (墨路控制、传感器采集) │ │ RFID读卡器 (IC卡读写) │ └─────────────────────────────────────────────────────────┘ @@ -98,24 +97,21 @@ InkJetPrinter (顶层窗口) │ ├── PrintTextDisplay (打印预览) | └── 其他 ├── TestPrintWidget (编辑界面) - │ ├── PicScene (场景编辑) - │ ├── ItemEditor (图元编辑) - │ ├── ImageLoader (图片加载) - │ ├── BarcodeEditor (条码编辑) - │ └── CounterVarSet (计数器设置) + │ ├── PicScene (场景内容容器) + │ ├── ItemEditor (文本图元编辑) + │ ├── ImageLoader (图片图元加载) + │ ├── BarcodeEditor (条码图元编辑) + | ├── DateVarSet (日期变量设置) + │ ├── CounterVarSet (计数器图元设置) + | └── ScheduleShiftsEditor (班次编辑) ├── SystemManage (系统管理) ├── SystemSetting (系统设置) ├── SystemUpdate (系统升级) - ├── FontSetWidget (字体设置) ├── PrintSetting (打印设置) ├── MainInstruction (主指令) ├── LogInfo (日志信息) ├── OtherInfo (其他信息) - ├── DateVarSet (日期变量设置) - ├── CounterVarSet (计数器变量设置) - ├── QBarCode / dlgQrCode (条码/二维码对话框) - ├── DialogFileOperation (文件操作) - └── ScheduleShiftsEditor (班次编辑) + └── DialogFileOperation (打印文件选择操作) SysPara (系统参数,贯穿所有模块) Serial (串口通信,连接FPGA和STM32) @@ -160,8 +156,7 @@ RunTimeCtrl (运行时间控制) │ ├── DateReplaceEditor.* # 日期替换编辑器 │ ├── ScheduleShiftsEditor.* # 班次编辑器 │ ├── DlgBarcodeFormat.* # 条码格式对话框 -│ ├── DlgQrcodeFormat.* # 二维码格式对话框 -│ └── sceneviewwidget.* # 场景视图封装 +│ └── DlgQrcodeFormat.* # 二维码格式对话框 │ ├── rfid/ # RFID刷卡模块 │ ├── rfidmanager.h/cpp # 刷卡管理核心 @@ -201,12 +196,10 @@ RunTimeCtrl (运行时间控制) │ ├── dm200.cpp # DataMatrix实现 │ └── ... │ -├── qjson/ # JSON解析库 -│ ├── image.qrc # Qt资源文件 ├── *.ts # 多语言翻译文件 │ -├── 0/ ~ 101/ # 字库图片资源 (数字位图) +├── 0/ ~ 101/ # 字库图片资源 (计数器图元 数字占位图) │ └── image/ │ └── digitalWidth*.bmp │ @@ -222,7 +215,7 @@ RunTimeCtrl (运行时间控制) ### 5.1 程序入口 (main.cpp) -[main.cpp](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/main.cpp) +[main.cpp](../main.cpp#L67) 程序启动流程: 1. 读取键盘类型配置(多语言键盘/普通键盘) @@ -234,7 +227,7 @@ RunTimeCtrl (运行时间控制) ### 5.2 主窗口 (InkJetPrinter) -[InkJetPrinter.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/InkJetPrinter.h) | [InkJetPrinter.cpp](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/InkJetPrinter.cpp) +[InkJetPrinter.h](../InkJetPrinter.h) | [InkJetPrinter.cpp](../InkJetPrinter.cpp) **职责**: 顶层窗口,管理所有子页面和核心业务流程。 @@ -247,7 +240,7 @@ RunTimeCtrl (运行时间控制) - `manager_rfid` - RFID刷卡管理器 **核心定时器**: -- `m_Timer` - 主定时器 (200ms),处理设备状态轮询、自动控制 +- `m_Timer` - 主定时器 (10ms),处理设备状态轮询、自动控制 - `viscosity_timer` - 粘度检测定时器 (1s) **设备自动控制**: @@ -258,15 +251,15 @@ RunTimeCtrl (运行时间控制) ### 5.3 打印主界面 (MainWidget) -[mainwidget.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/mainwidget.h) | [mainwidget.cpp](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/mainwidget.cpp) +[mainwidget.h](../mainwidget.h) | [mainwidget.cpp](../mainwidget.cpp) **职责**: 打印操作的主界面,包含打印预览、打印控制、文件管理。 **关键功能**: -- `generatePrintContent()` - 将场景渲染为打印数据并发送到FPGA -- `variableItemsUpdate()` - 更新动态图元(日期、计数器等) -- `imageToPrintData()` - 将QImage转换为FPGA点阵数据 -- `SendPrintDataToFpga()` - 通过串口向FPGA发送打印数据 +- `generatePrintContent()` - 将场景渲染为打印数据并写入缓冲区待发送至FPGA +- `onPreviewScene` - 场景数据转为FPGA点阵数据,解析场景内容生成计数器字模及其它控制信息 +- `variableItemsUpdate()` - 更新动态图元(日期、轮班、条形码/二维码等)并写入缓冲区 +- `SendPrintDataToFpga()` - 通过串口向FPGA发送打印内容数据 **页面切换**: - 通过底部导航按钮(编辑、新增、主界面、管理、消息)切换子页面 @@ -274,27 +267,30 @@ RunTimeCtrl (运行时间控制) ### 5.4 系统参数管理 (SysPara) -[SysPara.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/SysPara.h) +[SysPara.h](../SysPara.h) **职责**: 管理所有系统参数,是系统的数据中枢。所有模块通过 SysPara 读写参数。 **核心数据结构**: - `calandar_and_dat_t` - 日历/计数器数据(发送给FPGA) -- `bcOption_t` - 条形码选项 -- `qrOption_t` - 二维码选项 -- `QRvars_t` - 二维码变量 +- `sysPara_t` - 系统参数设定 +- `sysStatus_t` - 系统状态结构体 +- `vars_t` - 变量类型参数设定 - `stepPrint_t` - 分段打印设定 - `alterPrint_t` - 交替打印设定 - `Cnt1ByGroup_t` - 分段计米设定 - `PrintSettingModel` - 打印设置模型(跟随作业文件保存) +- `voltePara_t` - 旧的 FPGA 墨点充电参数集结构体,用于 67 版本 FPGA +- `voltePara_t_25Dots` - 目前常用的 72 版本 FPGA 所对应的墨点充电数据集结构 +- `voltePara_t_No73` - 96K 40um 喷嘴专用的FPGA墨点充电数据集结构体,专用于73版本(F8.2.1) **参数持久化**: -- 二进制文件: `PARA_ROOT_DIR/sysPara.bin` -- XML文件: `PARA_ROOT_DIR/defPrintSet.xml` +- 二进制文件: `PARA_ROOT_DIR/sysPara.bin` - 对于系统参数的直接二进制保存 +- XML文件: `PARA_ROOT_DIR/defPrintSet.xml` - 默认打印设置保存,新建文件时使用此配置,此配置也可通过[MainInstruction](../MainInstruction.cpp#L25) 打开默认打印设置的设置窗口(实际是复用PrintSetting窗口)。 ### 5.5 设备操作 (DevOp) -[DevOp.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/DevOp.h) +[DevOp.h](../DevOp.h) **职责**: 封装FPGA寄存器的读写操作,提供设备控制的高层接口。 @@ -306,6 +302,7 @@ RunTimeCtrl (运行时间控制) - 计数器读写: 产品计数、同步计数 **FPGA地址空间**: +通信地址与定义位于[连续墨点喷码机通信协议](连续墨点喷码机通信地址.xlsx),大致内存分布如下 - `0x0000-0x01FF`: 状态读取区 - `0xA400-0xA5FF`: 打印控制寄存器 - `0xB000-0xCFFF`: 数据写入区(DAC表、打印数据、日历数据等) @@ -313,7 +310,7 @@ RunTimeCtrl (运行时间控制) ### 5.6 串口通信 (Serial) -[Serial/serial.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/Serial/serial.h) | [Serial/serial.cpp](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/Serial/serial.cpp) +[Serial/serial.h](../Serial/serial.h) | [Serial/serial.cpp](../Serial/serial.cpp) **职责**: 封装与FPGA和STM32的串口通信。 @@ -329,7 +326,7 @@ RunTimeCtrl (运行时间控制) - 发送队列: `queueFPGA` / `queue` - 接收解析: 通过信号槽分发到上层(`receivedFromFPGA` / `receivedFromSTM32`) -### 5.7 日志系统 (Log/) +### 5.7 日志系统 (Log) **职责**: 提供分级日志记录功能。 @@ -347,7 +344,7 @@ qCritical() << "error"; // 错误日志 ### 5.8 运行时间统计 (RunTimeCtrl) -[RunTimeCtrl](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/runtimectrl.h) +[RunTimeCtrl](../runtimectrl.h) **职责**: 统计软件运行时长,用于设备保养提醒。 @@ -375,7 +372,7 @@ qCritical() << "error"; // 错误日志 ### 6.2 设备状态轮询 ``` -timerHandler() (200ms周期) +timerHandler() ├── serialFPGA->readData() # 读取FPGA状态寄存器 ├── serialSTM32->readData() # 读取STM32传感器数据 ├── saveFPGAStatus() # 解析FPGA状态 @@ -458,7 +455,7 @@ PicScene (QGraphicsScene) # 场景,管理所有图元 ### 8.1 模块概述 -[RFIDManager](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/rfid/rfidmanager.h) +[RFIDManager](../rfid/rfidmanager.h) **职责**: 管理IC卡(墨水卡、溶剂卡、保养卡)的读写与验证。 @@ -488,26 +485,13 @@ PicScene (QGraphicsScene) # 场景,管理所有图元 ### 9.1 编译配置 -项目使用 qmake 构建系统,主配置文件为 [QtUI.pro](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/QtUI.pro)。 +项目使用 qmake 构建系统,主配置文件为 [QtUI.pro](../QtUI.pro)。 **目标平台**: - ARM Linux: `TARGET = QtUI` - 交叉编译: 使用 `linux-arm-g++` mkspec - x86桌面: 使用 `linux-g++` mkspec,用于开发调试 -**关键宏定义**: -```makefile -DEFINES += ARM # ARM平台 -DEFINES += QTV3 # Qt版本3兼容 -DEFINES += VNLG # 威利品牌 -DEFINES += WARNING # 警告功能 -DEFINES += COUNTER1_BY_GROUP # 分段计米 -DEFINES += PICSCENE # 场景编辑 -DEFINES += MODBUS # Modbus支持 -DEFINES += __CONVERTERWIFI__ # WiFi支持 -DEFINES += TEMPMIMA # 临时密码 -``` - ### 9.2 模块依赖 ```makefile @@ -530,7 +514,7 @@ make ## 10. 关键配置与宏定义 -### 10.1 全局宏 ([myinclude.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/myinclude.h)) +### 10.1 全局宏 ([myinclude.h](../myinclude.h)) | 宏 | 说明 | |-----|------| @@ -543,7 +527,7 @@ make | `TEST_MODE` | 测试模式 | | `SIMULATE_PRINTING_MODE` | 模拟打印模式 | -### 10.2 路径定义 ([SysPara.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/SysPara.h)) +### 10.2 路径定义 ([SysPara.h](../SysPara.h)) | 路径宏 | 值 | 说明 | |--------|-----|------| @@ -552,7 +536,7 @@ make | `SYS_ROOT_DIR` | `/home/plg/` | 系统根目录 | | `UDISK_DOC_ROOT_DIR` | `/udisk/doc/` | U盘文档目录 | -### 10.3 版本号 ([VerBVersion.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/VerBVersion.h)) +### 10.3 版本号 ([VerBVersion.h](../VerBVersion.h)) ```cpp #define UP_PRINTER_MAJOR_VER 6 @@ -563,7 +547,7 @@ make --- -## 11. 新同事上手指南 +## 11. 上手指南 ### 11.1 开发环境搭建 @@ -580,12 +564,12 @@ make ### 11.2 代码阅读顺序建议 -1. **入门**: [main.cpp](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/main.cpp) → [myinclude.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/myinclude.h) → [InkJetPrinter.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/InkJetPrinter.h) -2. **核心数据**: [SysPara.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/SysPara.h) → [DevOp.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/DevOp.h) -3. **UI页面**: [MainWidget](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/mainwidget.h) → [TestPrintWidget](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/testprintwidget.h) -4. **场景系统**: [scene/picscene.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/scene/picscene.h) → [scene/PicSceneLoader.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/scene/PicSceneLoader.h) → [scene/ViewModels.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/scene/ViewModels.h) -5. **通信层**: [Serial/serial.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/Serial/serial.h) -6. **RFID**: [rfid/rfidmanager.h](file:///mnt/hgfs/share/bSpec/800X600_New_SystemProject-_NewInterface/rfid/rfidmanager.h) +1. **入门**: [main.cpp](../main.cpp) → [myinclude.h](../myinclude.h) → [InkJetPrinter.h](../InkJetPrinter.h) +2. **核心数据**: [SysPara.h](../SysPara.h) → [DevOp.h](../DevOp.h) +3. **UI页面**: [MainWidget](../mainwidget.h) → [TestPrintWidget](../testprintwidget.h) +4. **场景系统**: [scene/picscene.h](../scene/picscene.h) → [scene/PicSceneLoader.h](../scene/PicSceneLoader.h) → [scene/ItemCommon.h](../scene/ItemCommon.h) +5. **通信层**: [Serial/serial.h](../Serial/serial.h) +6. **RFID**: [rfid/rfidmanager.h](../rfid/rfidmanager.h) ### 11.3 常见开发任务 @@ -623,4 +607,9 @@ make --- -> **文档维护**: 本文档应随项目迭代持续更新。如有疑问,请联系项目负责人。 \ No newline at end of file +> **文档维护**: 本文档应随项目迭代持续更新。如有疑问,请联系项目负责人。 + +**文档更新记录** + +- 2026-07-23: 创建此文档 — 卜永仕 + diff --git a/rfid/rfidmanager.cpp b/rfid/rfidmanager.cpp index 64fba12..7ea33a8 100644 --- a/rfid/rfidmanager.cpp +++ b/rfid/rfidmanager.cpp @@ -1151,7 +1151,7 @@ void RFIDManager::markMaintenanceCard(const QString &blockData) sysPara->RFIDPara.runTime = 0; RunTimeCtrl::instance()->updatePara(&sysPara->RFIDPara); sysPara->saveRFIDPara(); - emit sig_showMsg(tr("刷保养卡成功!")); + // emit sig_showMsg(tr("刷保养卡成功!")); } else if(ret == -10) { emit sig_showMsg(tr("刷超级保养卡失败,请联系厂商。"));