558 lines
55 KiB
Diff
558 lines
55 KiB
Diff
diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc
|
||
index 9511b07143d3f4cfb217ab97f0aeeb0fa0111a0a..add8b197de9d7d6101499cb954538af000e23f8b 100644
|
||
GIT binary patch
|
||
delta 1110
|
||
zcmZuvS5uQw6y(#)Akh#&#HdJ76al*^3bq(P5D<)rx`?rCM6iKau>`Sq@v{r|-W7ZA
|
||
zy*>Eg_~cLU+3~?8<2XK;naw%(p8d}5J@+1SeQ^c9v)QZx`q_8xDUT|t3w9Vk>f)1q
|
||
zfe2y?SQ&(tw4xPT!p2qzrVVxmBZPK@G7w=5L2K2*g*M6~7>c$GgM+Qnj^Sv}Hs~N;
|
||
zBqPv~Z4pHWqJ<bCmhI5VYhn9psiQMHAdZpfqMeS_0X}VYRT||l#xok-7=r}HB9Wbt
|
||
zB)RVFj2>#;Q?k8iptmIYFb;iH>&GrgW>@rAZ2;quqWVB~!yv^}CLoQ87%U4zv>w_l
|
||
zz&ngd-c&l+oreCK;OkKublzy1i;N8a55-{5e;Cfc41+S`Z(^|bKa3IV0~h-uU6wQ0
|
||
z51CBHNcKk-2OwJ*#T4YoYOXBjG0=z6I!C_91ssSm90WI0F_vj4<Y0{B5EO|xUK1MX
|
||
zpU?zl!~EGq4hQH&u`o%T5@9k&z#~kd3saenY0SWMfr6Krm?51~VWzlcLOFd-%;HGQ
|
||
zmcu#B!d$tVr~9v9HY(+EzQ|P~F3{dWj>014i?z2z>!pg-%)v6n<;=wj#g(#`=eOtM
|
||
zXw)ztt5|?qRaSEh*3gZ$9E)`<#CndyhNkmx)ctM}VKa-ch2ybR_q$E&?ZOVVo8WI(
|
||
z$BEcUz*M_kGO=4H+M~Fa#n>n2e&K-Fll<(160etFgV={8c39SrumnfNI>yO3P7h9S
|
||
z3Qp2z;FQ{&R^g0rmQ!&~@x1mfXkZsP4VUzQF3Z#vPRCW@nr75U;=1N@L)@F<-l7+`
|
||
z#lNHcuJ<-)_-)+t-obsA;(=HXb<K}B6OR?2u#DxL#o3&b&bdtFJXWxh^Xsj6$|^il
|
||
zljp3!3s&N#K7A#;mWekKe9HxRCll`__CY87sCJ*s5X&K>(7a^HY5Zxq(A@ZJo^DYb
|
||
zZF4#EGTcs2ktZ`ZyWpGs&oaxCm+f}vyBm$5Ut!izz5S-=U)5j+MkZUohJ@GHzJ^8A
|
||
k*c;O#Pc%2;%<s`DMuO>xDKnDH+L$dyylIc!Zn5i|-?8IXrvLx|
|
||
|
||
delta 1009
|
||
zcmX|AS5uQw6wIe_Mj`>k0w`)w5Qqh(+XXCiL=klXMcsf@DPqAAdsoV**s%9rqGInI
|
||
z%Zq=((f{C!J9#jZopbIvo4b4Nnfy#Um*&@Px7#fG{K)L6{8iNE7i|1#i;Q>oh7WyU
|
||
zqYZu72fp-$op$)q5B~H=00Yohy+EO#^8W0L0Sv@I_CpZ+BbWmaBHkbl#9#&?l))Gx
|
||
z3>Ahk1P+&#gPNs^Fb>9WhGK*&L%fx6WkV~yX#|I1Bprxk7@{~F(UNm=1V-uV(UKiQ
|
||
z17jr-!*GmKZ#*Lq%aMpvFP@P|P(P7TNK#B@G$zoAiOMI*#^fFr*A$L&C7ansh|kpj
|
||
zr&^t+{XexDA@1oMj}*otRjO%>!wkk_CKE7=iI^><GYJ_|%am%CIN5TNqnOKN<Z%M#
|
||
za3b<K33E9a^Ed?s;?38PQ@t}5Dx2ob7H~QiG6jnSh*KmKGu4d}reZPEu!J*E%9&Uy
|
||
zEEAS<7APT?P$qJ@utGns;A~XNU=`C*Eps*6U@bGSQYP!ftrxFBwMJ%QmGUOlR_nY*
|
||
zaV@j3PO+KUSg*Lj<+d`%>u)1-v59$ba}GAEwT1cE%DLFadDzYZ?BIOtRDG8=v|Dix
|
||
z3$d3AuumJ>FPQ_X9n`c7y|=Y+5n2hf>9%%tO$~HNjKeHKhvE_8sMy7BFa4Ork4x}`
|
||
z=$#TfDetFPg43d%;bNTS5}acx&TG9FRJ$l#5-xKot|(rW#5KLwbuPmVt^cM>-QsfG
|
||
z7VhYc?vl8t_wk5(U)%?D;i33lbO+#(>mkd$HXggW@Py@fD#|nM`8ikMh2l$Au##1*
|
||
zW({lU<Vx1Do(-Kgyka9>i~WXmc*}aclfZl7gG_vs;3uxaXPNjSv2G3cRkwXxS03He
|
||
z1pPm3zddHSwcYHpW*G&Z9=&e#G`^d+dlz|}K7Rvk{)WY(ucgs6V?yISHK7-J8WCoo
|
||
YBgu#|GaVI%)4cE4uRJBJ#cCJvAJ_sw;s5{u
|
||
|
||
diff --git a/__pycache__/hardware.cpython-312.pyc b/__pycache__/hardware.cpython-312.pyc
|
||
index 53ebcd2fee7bad7f22713b74ebd83dffe1e0baf5..c2ade48c6faf45a95f4676a3e553018b70b863e4 100644
|
||
GIT binary patch
|
||
delta 1624
|
||
zcmbVM%WD%s7@yhACcB$#-rGlP8*Pgk5uX)Xlv)oOB+`S5;xoo>t!_$`>C{@8H445E
|
||
zk>Us{D(Xq0C`$1l9@K-V^ipUK5-8}=zd;Xv+ji2R*4G@q`R1G7eBbYTFxNMo-)xK;
|
||
zhK^w6&fKuKJTsO@CCSU%qlqmTX~;s3Of~n~U33cQYL>@RhGkbnh_o<l8`FBFETj1+
|
||
z%`5^YTzNaK+tHtG!_u_Pks-S0m(jid5FOcZ@W<aqLmmIY!9%MBL#p!?u{wUhREv(n
|
||
z6e3x;fGwZnW%AhwlkIr|IJ-0NFrGeP#5{oV{0Rjq`z+N_X}$1bX_XYFtO`iGfe)Dp
|
||
z-Wk`LwBLeV?0kXk(rJ@$%rvH#Ywc&c6JVNSSh^Dg5+NWFX2@<9=-GV;lZ!0C^!z^P
|
||
z{bLC+X?W(+iLi*hh<^^pLVl4rDcfQJVS}<k1c9xc#U^M<#1Xga4Dm|r@Y>}TvQR%h
|
||
ziAf!lHuO`8z>U2GvYwYrAml{nM)M11su*Ko;$tyrX%M^{PO#u*Q8<O*<kka2ZGu)P
|
||
zzZf!J^w;esbF^C#nP5~n2!4&?l;btbVA@ns6{ZG|qe55%f|+y7mP#b16z~r-);dSf
|
||
zib*Ui{2_&+C_3z{g5BSZEDJJUel1j{iY^z9tS}4SMplG{Kt@^kHo99ufCU{NT`92k
|
||
zD!#NjRxD2e^fSQxr{G6{sv9$!@#|S6(h$CKVGs?XCPZ6=$7V#5PTW!%%9j6^3T`nL
|
||
z2R_nl7k0xx*XG1e#|PaH5B32(fKJN0(Ev`xJBj-rkxd{{xD@T_rrAR|O1sHmwvXm$
|
||
ze;+q%(n;k+uJ@=_@*VFcUEKv*QoD}iNYBwiPsww*zqgm?YmV^AnkTvp?@OLT$By;#
|
||
z%e8wAlfZZ)ve^~8__tc8ne2D<10YJinK<O2Ys$K!6GWfMA0%q{%f!mS2cUKaO{(>i
|
||
z>e7*~i3r}fV!UD1Q2Jx*hFAU<{@3Y=)~z>t?&WXgAEhQ5TE@2Rgu9OPJO3O1`}9P|
|
||
zjyv>z`eEil=BYm3ylx`7er!*6WJw*x)mJl~Ocfff(lYJxXwuBI$)jybrhVjj{b~uH
|
||
f9{G}7hW+l;kh88h#~T++;!D>Wx8W;%d*jCM8A%qz
|
||
|
||
delta 1471
|
||
zcma)6OHUI~6ux)b=}aHfX{V2Y7Fz^^Vnpy2b)kugLIlG?V-#QYF%>LW^)iT<bFIc0
|
||
z7aBvnx{>$;3>ytQS1w!_NQ_1o+Qj$=T$;G`jP%;70hz_QbI$qZJLfz1w0C+R?K2h(
|
||
zBSi2yyy0=F>xI#6DUVdK+sd?D^mE@umHR0P5{GcrH9VO2xKS}?HE)S8dX3hNO0Q(e
|
||
zxB3ZG^dyo>DJ|Yw*^?@g1{z5v&<Qx|tZ&g{TY;9AFVrNztDk=qvIA~brW*Qd5f2jC
|
||
ziUt}}99pK1#&u9{#X&9QCAxlsK1&xpN+5u!!2eJvF6ihy<gS)1PVnD8{DhR+u#t?o
|
||
zpA5E#mj@$ujl@<W?pjF<VTjBsiyk*1!lMx8rW4{ZY$A?LSU^haB)Wc1Q+5EN5E(r|
|
||
z2xAHXWww^&2}n3}bT7trjQb%W<>R1`Qz0GT`wg}r?vM$3jj|S;PP|d2c%JIaCYQ;7
|
||
zPjyyOU@;9+cn@KukMLMI07>)=^gIz11;rd=6eX~=E50MP#2sl;3MJ*!$Q!BrBHjij
|
||
zgnvy!g;0d>5SBHuSZaxd2r&h;GW}~Yb}Uh}VSUOSe@Up+Z-hWYcPra7h(U04J5DC;
|
||
zc1t1$=QTqd6XIxNV9k)Hfx2pl@u0g&VoRIF6FbpvG~}aTT*u!!PTj1%ncf14ceY&_
|
||
zm?Bf8ow!@&_iG5t^R%M_DI{gAp_4eIvAR-cAM*Z7(l^pmwR4hAl54&pGD$nFL0m#q
|
||
zvJXwCuWAk#-NM<4@xs+hWA2&ZVl{kWd{yDx$Qd?#p*&o*YT<%=sc^Z-&K1k9C^q$(
|
||
z{__)KV^v+^#6r`E#*TWtL!zhoh4|Kd%(hv^3-o&Ch-Yf~LmA#x)oN_4fSIaRE5lBE
|
||
zxKo}PL^E!qX>AohGQH+A?D{78qOba@_rKTs=k{mgG}rYZ*FD|$Y1iIYS6&`}pX+&U
|
||
zf6VQC<4pH`&aa>0b2BY2wIB8e`}1Tz9~{tp^XpOrif=(t2ei44+!lrMxnr#xY50a$
|
||
Y@up{P3$gkOy(_M?9i;cf>$W{V0Wo#~X8-^I
|
||
|
||
diff --git a/__pycache__/laser_manager.cpython-312.pyc b/__pycache__/laser_manager.cpython-312.pyc
|
||
index 51df997b04b0ec2e9f27c48cecec22593806b85e..5a170bdae88e487e0224aec6ea464c93b3ff83cf 100644
|
||
GIT binary patch
|
||
delta 160
|
||
zcmew`mHGWtX5Q1hyj%=Gz~3`1>)%G+G;Zc6d;2Drahr390Yz<n{KGeI<8EeT_qf34
|
||
zd6mO!vjcA!BS^{SnS7V|Cd(`GPOg;on(U+~xA}pr0^{UNCF{-B@=q8i=g9JEwr+ko
|
||
zeeJXT4NqG;A2&4l6(s;obSsqulF>en!LC8E3XX;*U@O8Dg&8NwTW?;X^lcfV_vYCr
|
||
GLm2^9TR1}i
|
||
|
||
delta 145
|
||
zcmaDqmHER|X5Q1hyj%=GutRNX*8h#XY23^&SI?MS#%<0i4ivTZ@O1asyp_9|k=^qG
|
||
zpVw6m@6GnSVT>R(n`iJ{=9?_9$UC`0)@!npqU`1evI>loGnA}1TgyLToSZGoE84pG
|
||
w<@B}B_BT9j?R?zO<X4mcG}3MIL0S3D@rs;`ljN;8FIM`tjL~QFtdpUP0C5gAZvX%Q
|
||
|
||
diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc
|
||
index 7faebb2de6dfc32c4a8a10ba4a8da9df9a50037e..3c856f281e1b88e6280c5db46a86d2c1dbd604b2 100644
|
||
GIT binary patch
|
||
delta 3858
|
||
zcmbVOX>1$E6`tAQl3elH<+Z$)hc1h<Wvih~NtP^Gtz|n+f;g5F)yUzd*jUm!qHL1!
|
||
zq3)JOkyb|uMD74FoWMyDv`7rOg$wpiTcGHl0!3Z43VOIOkXk{a+Lj?%j^nmyP_#3o
|
||
zR%B!;3POVW-W>0H-+OP~EdO*CesC7ruGnl<fPB7l=A81MpW1F)cs>ZgSa2*fCXI#1
|
||
zB4g2l+1k$FA$tqlgx|2&kY~~n#<O-Y5~qgrqcoOe<uglnhZ!Q0j`v|4|JxqI&5{Lo
|
||
z^T+Wny9LL1318+1P%ztpqgJV{v(mVvzYb*A1x7P)K;~uli;>}|#zMdVm7NGq!_ppz
|
||
z4-2u}^s+Go9LPSRBV{+OXa-%Ay|OrsN+TUZGi4vs*VnZ1$^O+g%Hz5Pk@&XN!6;AQ
|
||
zGqzyPteWM(37BSNzh>TmOHdB2#ythoF$f5T|7ZgMWE6lKMI=>5<Sx<DxJuV}*6D#E
|
||
z{41w;^s|!_sf1cas!~m-V8%#DaYQmiR%s^Hl<v$P&{Los)U~oy`tdH8)Vpq3_2g%)
|
||
z*+aTjMOi`0LwvX<f@xtQh~IK;etcad&9V^_9ltD93l6#cE{j|(*IcUAi?AJNR=m$0
|
||
zk*qp9%_a-<JI$1AA;{VA%kCJmt2X=&kq#n%?~a&w!c-(oXFQ%<T(y&<+o(ET2Nw)F
|
||
z63LrgbsT*LfGL<xklntCpwe4rq-*l#qV*PPEjL|YEA07n_VYx_>rf@B^7vIxT;O#e
|
||
zN;5rLq$-L$p~&bf5TssMPB;kzyS(3EgXy|bQ1}(E-Bc`w(u;rSjln*=6q5u?*|x%x
|
||
z6RpIO7LMX<6O&}OQr+;-X+gEit)qmOYLn||K}owltJ762a@zyd__Y|Rv8mQ_{#Vz7
|
||
zxLwXWYA3Y__?~TFtL?kWt(FniZ1Qe7gfIKzte^_nKKyrI6CrK&OHD#KM8bBXGyjx7
|
||
zLPAeY1Ph~n2P|hn>@CB{yyhf7mn>>-{ENWOy&idw<{bc&A(@|y$a^QlL`t$S8I|{C
|
||
zAJx-ygc%QxhsLGx@OWfAdc-I{{IXROvuE{n<@<Qn8Zb;T86$os7>7Rm-Qan2aJdMr
|
||
zp(D6MjN`?S1HT<|VP3Mq9}oixcSu$6Exaq@w$j3Aev;7UWutFO`*Qw?=ov=!O-3g|
|
||
z%8ztkWvTkhaZN;2|ELXsNg^l0M@h@18Pz`-CL`(S?&Xn`eOtGl2<f(}mo`S)Ozw73
|
||
zKA_K%mhp#GR|$wFOZBUsQS!Qy`-*T0)s4R%-rVccoT^`Qk)KBnY3?G(!7>P`+C|-E
|
||
zCEe6x*_GFV@)JB0u6(0i)-B318^<@pA-p7*absk=gLqq={FV$e#pK!3!fBxfKyV05
|
||
zarswIp+n##tO40C>rk~I9n*{?&u)4J;92O-sm4z?;vpaln(<r4DN}xDNjnKof;FKG
|
||
zMMtK5=Q`_US5NB%%2JLMJxdjLz=~^QzN_RK&qjlX*!<F(?#u9NU1o`O12g3RxPmU_
|
||
zhQ9#zj?chWH%QvWa{g&D$g8&UBX_KZ=0L^u_VXCM(AK~H64j*(uPH|=cv?uAN{1nZ
|
||
zN<pq9n9YCbL7K&C8uGvV0twl@n)QJdSBCue9(47o6G>k1<WBOCGi%6;>l~#$nh{^F
|
||
zjc~!0vpZGeVT(r>H;eK1ua=vx!t=fjJTIfxte{qwqNK}DltQCk@X1;}PFur}e{BO~
|
||
zrNp<LBDbycx_xqW(#U^J;l(GlK(RNcOdb?aF5zfhUqAK9=E*8;%yrw*q8V3WNBJEa
|
||
z?0&O?Vf#7^pZZ)3`A98(uHGT7x=8eB$fX!ienu|*kddQ*p+$VD{t+7u3FZG#B3UqO
|
||
z>VvLPVcSUd`NPLvNXbK~fvrkrBvt5d*ai#d<NHmptuWv0X5iEKe-B;4ze&XLbRvlF
|
||
zB(|DOJ^S|`-u>_a9BSz=s4d4J{@3<%Fos`A`d!zA!xfN+k3F9qEWDEpK{iIJ8^ynE
|
||
zZG-19Y<mySw|!#$(BQsmXnNPs^k>61JlEbReryDx>NmU2cg+MEXBs<Ze4R4}&k|D*
|
||
zc9;#OS(kX`(Io~)yJp~rh5vT#hn5i&<b-Qh{*#Xf3t!vy6_l%Dez(Ow-~?CLs)25B
|
||
zh2LF2=m0Z~cBL82w0Q?R(YyBD4P@|_)`lSt{57(Z=vO5(eb(C*1g^G-LrL^EON{8(
|
||
z0-oVIaILvV9Bu;dCBmryxNdM~Byindm)ZiZclWfD!TURU;v-$)gPNX1M#_OX(Q=#z
|
||
zbJYS_nrqpVF@k>tMWWxRVg?-S4JS9yiEaeF1Fh&rD@*lmZqSNuS|EKoxWRUG)8`#*
|
||
zK{s1is&}$OM$;`w3Etwkp#-|+^bT!Bw;GIeW-Ci)5{T+aRsp8mtqwC`K94x13C&x*
|
||
zN&}j&rd#J5SUS^0x6U_n!_{cM-8(Fy+kDTCVV+rVKr&e1nPE4(;AE*Tv1HRi9W&gB
|
||
z7Mi$}h!&FGloKsFS)wlnEU7qJY=HE+g&XNWi`zR!k|=kl*+7E5lVr)%oeo6xF7CJu
|
||
zEtxuwo6%i{uHH4XWah4ouHNOj3_^GPJ&|-5`lyXAf7Hd2se6bn-!pQV0J`TeQr*K+
|
||
zJy4vNxDzb8SKqVs1VHya=9j|EeF>fbPIN!ayj0EJj|RxXKLLA!#TR>j48L9I-!l%4
|
||
OgDi|LJ%{J^F8&_?&=79`
|
||
|
||
delta 3928
|
||
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
|
||
|
||
diff --git a/__pycache__/power.cpython-312.pyc b/__pycache__/power.cpython-312.pyc
|
||
index ef59564bccd92a56978da916c9cf33a9152982b2..08014642e632dada386351d24ccf27c3ea5d738b 100644
|
||
GIT binary patch
|
||
delta 2766
|
||
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
|
||
Ra`9}_gHrXmmbe}h^j{`MvU30c
|
||
|
||
delta 1652
|
||
zcmZuxO>7%g5Z+zK8z<|Z*!gXo2DdRuwsq3rqR@YEeh8t7qdG||BBW*G-8fEcuRC5R
|
||
z<P=&(LI`oF9z~)YH~<F}4j_XBLWnaer%G^G2{@HB2vrC!P$9(3vy%{sm3H=f^Sw9o
|
||
z&Aj(^NBeT#f7j=06!4k6|K`eHJ-7TF(m%qj{^d>6yCfO%R^5WnsNWJ6{Duc@z-U0*
|
||
zWHh1;8VcHw(Q0_N#D!+Vhocrrm=FyAmS6<7C5kEt3$2o1(%Xh_yD1t?MsV9z<+jD@
|
||
z7nzP48#0<X8%Ac2{-|X?*pUrMZDY&gTIF5&J5hG(7A-5sHay3BKNS9;V2?aSYu$vw
|
||
z;)dhXvIRXJAJ)LsjSUDO8)9F3Vxq6|tLJ6u#Sl7xlsIzE%4AG%yxL?kK`W+aMlU<{
|
||
zdir`f3#Q{*ESDT*9kRA*TUy@C19i+%YLgRVV=2eIxM7<mryk6lsh3RlxiTd41numh
|
||
z(%I>!1%4g^<z%uY+XU!CXLsee_k^?=M7T>GgJwe17qtP}$ibs@5IRDp6OH4gl9s^A
|
||
z@2i0>BD>M3F6bf5*FBD?L^Vbt5#S<xwDdqj47nkpa@QY|#CrB;lO1lS#SLV5m37&|
|
||
zk_8Hl``D|&X9tcUR3)Hkj%b!h^j>TwTgckAuEUc^oUc3z9+Tu9go411wp>i}=(H6;
|
||
znX4%RsqqPIWPVn=Ix{twm>7pRQ9O^Un#TqDI-ExD;aUP2)7Efvv^6Vd>$rpGa7wE3
|
||
zRm%^OILzK@?~<QFNBJllYH3aW{Mn8B?|<^((+|!?l4>JA4*$`hkcQFuRBAjq2TxFb
|
||
zE`nOeC2%>8y9n8Wt;%qgMLN_NDdKENMuaWKr`lzOl%>l6X2FI8k}p-t9luMx1Ra;Y
|
||
zSaRG;IZL<yFAH2`uZR0j9t3yq1+T@<mbCP;4w-Br1J5CMv+`qDbSYy9tMMZ2m+na1
|
||
zsjs!g5!ViFQ>f<G@H7`qNR!4HTzsc;=CNE||MLiUsi0k6{Rs-ok0zm=J8#qT&C@W<
|
||
zzU>)kiV&M3!_&{QhG<_iAJ3xmV7u68v{(FstwdK8AI+X7<F5P^U6RfZ6Xt1DM48*)
|
||
z_dZYtgO^k{<Z<k{a%Q0#y+9L3(WnXl;c50t-xbl%?)6;|?^Oc*aS<=~h?<dRb42sN
|
||
zWt!gzMf^CjUM!jgqZ)0UrjS&}RkVtZt5nXz4f2t4xQ+%D@H98cG0pxy*(uW<f+^M&
|
||
z3ri0Lb~d)_r*e|2v`f1Lt88fCbUZ?k_oGCJ2c071CBy6Iajwvi%*X8Zz+?|6Xy~+!
|
||
zB<AMEQ!i+<GoxDK>V$S}GC4ML4PIm7U^u#pQ}71vcUcuP=)ouYjM@orAb>_THh5-}
|
||
zZmr|fb2%%m+opz}Rp5UT56$7Xkp4l{Ye4svUm$*7`N86+f(wKQvHY*V>$*(C!__#R
|
||
h3wg^Z=gdp+7P6usxP;PsEOcsE`b}o`DXWg^`xg+KcxnIu
|
||
|
||
diff --git a/__pycache__/vision.cpython-312.pyc b/__pycache__/vision.cpython-312.pyc
|
||
index 1d101c73bcf7a82cf5981367594af8c435bf9399..9150d27cd7cf3ca2e10ccd6ba71af9e4088d3e0a 100644
|
||
GIT binary patch
|
||
delta 24
|
||
ecmca|fa%HsCf?J$yj%=G@S<*7R`*6;_XPlN@Cd&E
|
||
|
||
delta 24
|
||
ecmca|fa%HsCf?J$yj%=GFx7KfR_I1v_XPlIPY3}3
|
||
|
||
diff --git a/app.yaml b/app.yaml
|
||
index 702e16c..b028360 100644
|
||
--- a/app.yaml
|
||
+++ b/app.yaml
|
||
@@ -18,6 +18,10 @@ files:
|
||
- laser_manager.py
|
||
- logger_manager.py
|
||
- main.py
|
||
+ - model_270820.cvimodel
|
||
+ - model_270820.mud
|
||
+ - model_317211.cvimodel
|
||
+ - model_317211.mud
|
||
- model_317828.cvimodel
|
||
- model_317828.mud
|
||
- network.py
|
||
diff --git a/config.py b/config.py
|
||
index 7df78c0..772305f 100644
|
||
--- a/config.py
|
||
+++ b/config.py
|
||
@@ -98,7 +98,7 @@ ADC_LASER_THRESHOLD = 3000
|
||
|
||
# ==================== 激光配置 ====================
|
||
MODULE_ADDR = 0x00
|
||
-# 激光开关改由 A14 GPIO 控制:低电平开启,高电平关闭。
|
||
+# 激光开关改由 A14 GPIO 控制:高电平开启,低电平关闭。
|
||
LASER_CONTROL_PIN = "A14"
|
||
LASER_CONTROL_GPIO = "GPIOA14"
|
||
LASER_CONTROL_ON_LEVEL = 0
|
||
@@ -267,7 +267,7 @@ TRIANGLE_SAMPLE_RADIUS_CM = 15.0
|
||
TRIANGLE_SAMPLE_ANGLES_DEG = (0, 90, 180, 270)
|
||
TRIANGLE_SAMPLE_PATCH_HALF_PX = 2
|
||
# 开机阶段预加载 YOLO detector;detect 使用 dual_buff=False,避免返回上一帧结果。
|
||
-TRIANGLE_YOLO_PRELOAD_ON_BOOT = False
|
||
+TRIANGLE_YOLO_PRELOAD_ON_BOOT = True # 诊断:本轮仅预加载 317211
|
||
|
||
# YOLO target size classification: class 0=20cm, class 1=40cm.
|
||
TARGET_CLASS_YOLO_ENABLE = True
|
||
@@ -277,7 +277,7 @@ TARGET_CLASS_YOLO_CONF_TH = 0.66
|
||
TARGET_CLASS_YOLO_IOU_TH = 0.45
|
||
TARGET_CLASS_YOLO_RETRY_ON_EMPTY = False
|
||
TARGET_CLASS_YOLO_RETRY_CONF_TH = 0.25
|
||
-TARGET_CLASS_YOLO_PRELOAD_ON_BOOT = True
|
||
+TARGET_CLASS_YOLO_PRELOAD_ON_BOOT = False # 诊断:暂不与 317211 同时加载
|
||
|
||
# ── 第二段 YOLO:仅在 Stage1 裁切出的靶环图上推理(与合成 stage2 训练数据一致)→ 子框内传统算法取直角点 ──
|
||
# Stage1 靶环裁切内如何找黑三角标记(对比耗时时可切换):
|
||
@@ -307,7 +307,7 @@ TRIANGLE_PATCH_APPROXPOLY_FRAC = 0.055
|
||
TRIANGLE_PATCH_APPROXPOLY_RELAX_MULTS = (1.0, 1.3, 1.65)
|
||
# Otsu/Adaptive 前对子框灰度轻模糊:0=关闭;3 或 5=Gaussian ksize(须为奇数),压锯齿利于收成 3 顶点
|
||
TRIANGLE_PATCH_PRE_BLUR_KSIZE = 0
|
||
-TRIANGLE_BLACK_YOLO_PRELOAD_ON_BOOT = True
|
||
+TRIANGLE_BLACK_YOLO_PRELOAD_ON_BOOT = False # 诊断:暂不预加载 270820
|
||
# 每箭是否在日志中打印黑三角 detect 统计(raw/类过滤/是否在环内);调通后可 False 减日志
|
||
TRIANGLE_BLACK_YOLO_LOG_EACH_SHOT = True
|
||
# True=每次射箭将 Stage1 裁切图(黑三角模型输入)存为 JPEG;调试用,量产请 False
|
||
@@ -343,7 +343,7 @@ RAW_IMAGE_MAX_IMAGES = MAX_IMAGES
|
||
# Stage2 调试目录(默认 PHOTO_DIR/stage2_roi)内 JPEG 最多保留张数;None 表示与 MAX_IMAGES 相同
|
||
TRIANGLE_BLACK_YOLO_STAGE2_ROI_MAX_IMAGES = None
|
||
|
||
-SHOW_CAMERA_PHOTO_WHILE_SHOOTING = False # 关闭拍摄实时显示
|
||
+SHOW_CAMERA_PHOTO_WHILE_SHOOTING = True # 关闭拍摄实时显示
|
||
|
||
# ==================== OTA配置 ====================
|
||
MAX_BACKUPS = 5
|
||
@@ -358,7 +358,7 @@ PIN_MAPPINGS = {
|
||
"A28": "UART2_TX",
|
||
"A15": "I2C5_SCL",
|
||
"A27": "I2C5_SDA",
|
||
- "A14": "GPIOA14", # 激光开关:低开、高关
|
||
+ "A14": "GPIOA14", # 激光开关:高开、低关
|
||
"A24": "GPIOA24", # 电源板关机控制
|
||
"A25": "GPIOA25", # 电源状态绿灯
|
||
"A23": "GPIOA23", # 电源状态红灯
|
||
diff --git a/hardware.py b/hardware.py
|
||
index f1f0455..75ed3ac 100644
|
||
--- a/hardware.py
|
||
+++ b/hardware.py
|
||
@@ -120,7 +120,7 @@ class HardwareManager:
|
||
|
||
def _status_led_loop(self):
|
||
from maix import gpio
|
||
- from power import get_bus_voltage, is_charging, voltage_to_percent
|
||
+ from power import get_battery_status
|
||
|
||
try:
|
||
green = None
|
||
@@ -148,9 +148,9 @@ class HardwareManager:
|
||
|
||
while self._status_led_monitor_started:
|
||
if sensor_elapsed >= poll_ms:
|
||
- voltage = get_bus_voltage()
|
||
- percent = voltage_to_percent(voltage) if voltage > 0 else None
|
||
- charging = is_charging()
|
||
+ battery = get_battery_status()
|
||
+ percent = battery.get("percent") if battery.get("valid") else None
|
||
+ charging = bool(battery.get("charging")) if battery.get("valid") else False
|
||
low = percent is not None and percent <= int(config.STATUS_LED_LOW_BATTERY_PERCENT)
|
||
full = percent is not None and percent >= int(config.STATUS_LED_FULL_BATTERY_PERCENT)
|
||
if charging:
|
||
diff --git a/laser_manager.py b/laser_manager.py
|
||
index 21d7bd9..d5df485 100644
|
||
--- a/laser_manager.py
|
||
+++ b/laser_manager.py
|
||
@@ -31,7 +31,7 @@ class LaserManager:
|
||
|
||
# 私有状态
|
||
self._serial = None # 激光串口,由 laser_manager 自己持有
|
||
- self._laser_gpio = None # A14 激光开关,低电平开启、高电平关闭
|
||
+ self._laser_gpio = None # A14 激光开关,高电平开启、低电平关闭
|
||
self._calibration_active = False
|
||
self._calibration_result = None
|
||
self._calibration_lock = threading.Lock()
|
||
@@ -71,7 +71,7 @@ class LaserManager:
|
||
# ==================== 初始化方法 ====================
|
||
|
||
def init_control_gpio(self):
|
||
- """尽早初始化 A14,并拉高确保激光关闭。"""
|
||
+ """尽早初始化 A14,并拉低确保激光关闭。"""
|
||
from maix import gpio, pinmap
|
||
|
||
pinmap.set_pin_function(config.LASER_CONTROL_PIN, config.LASER_CONTROL_GPIO)
|
||
@@ -79,12 +79,12 @@ class LaserManager:
|
||
self._laser_gpio = gpio.GPIO(config.LASER_CONTROL_GPIO, gpio.Mode.OUT)
|
||
self._laser_gpio.value(config.LASER_CONTROL_OFF_LEVEL)
|
||
self._laser_turned_on = False
|
||
- print(f"[LASER] {config.LASER_CONTROL_PIN}=HIGH,激光已关闭")
|
||
+ print(f"[LASER] {config.LASER_CONTROL_PIN}=LOW,激光已关闭")
|
||
|
||
def init(self, serial_device=None, baudrate=None):
|
||
"""
|
||
初始化激光模块(A14 开关 + 测距串口)
|
||
- 初始化时先将 A14 拉高关闭激光,防止开机误触发
|
||
+ 初始化时先将 A14 拉低关闭激光,防止开机误触发
|
||
|
||
Args:
|
||
serial_device: 串口设备路径,默认使用 config.DISTANCE_SERIAL_DEVICE
|
||
@@ -147,7 +147,7 @@ class LaserManager:
|
||
return False
|
||
|
||
def turn_on_laser(self):
|
||
- """A14 输出低电平,开启激光。"""
|
||
+ """A14 输出高电平,开启激光。"""
|
||
if self._laser_gpio is None:
|
||
if self.logger:
|
||
self.logger.error("[LASER] A14 GPIO 未初始化,请先调用 init()")
|
||
@@ -156,7 +156,7 @@ class LaserManager:
|
||
self._laser_gpio.value(config.LASER_CONTROL_ON_LEVEL)
|
||
self._laser_turned_on = True
|
||
if self.logger:
|
||
- self.logger.info("[LASER] A14=LOW,激光开启")
|
||
+ self.logger.info("[LASER] A14=HIGH,激光开启")
|
||
return True
|
||
except Exception as e:
|
||
if self.logger:
|
||
@@ -164,7 +164,7 @@ class LaserManager:
|
||
return False
|
||
|
||
def turn_off_laser(self):
|
||
- """A14 输出高电平,关闭激光。"""
|
||
+ """A14 输出低电平,关闭激光。"""
|
||
if self._laser_gpio is None:
|
||
if self.logger:
|
||
self.logger.error("[LASER] A14 GPIO 未初始化,请先调用 init()")
|
||
@@ -173,7 +173,7 @@ class LaserManager:
|
||
self._laser_gpio.value(config.LASER_CONTROL_OFF_LEVEL)
|
||
self._laser_turned_on = False
|
||
if self.logger:
|
||
- self.logger.info("[LASER] A14=HIGH,激光关闭")
|
||
+ self.logger.info("[LASER] A14=LOW,激光关闭")
|
||
return True
|
||
except Exception as e:
|
||
if self.logger:
|
||
diff --git a/main.py b/main.py
|
||
index e222fc8..ffd9e70 100644
|
||
--- a/main.py
|
||
+++ b/main.py
|
||
@@ -81,7 +81,7 @@ def cmd_str():
|
||
# ==================== 第一阶段:硬件初始化 ====================
|
||
# 按照 main104.py 的顺序,先完成所有硬件初始化
|
||
|
||
- # 开机第一步先拉高 A14 关闭激光,避免其他硬件初始化期间误亮。
|
||
+ # 开机第一步先拉低 A14 关闭激光,避免其他硬件初始化期间误亮。
|
||
laser_manager.init_control_gpio()
|
||
|
||
# 1. 引脚功能映射
|
||
@@ -105,8 +105,6 @@ def cmd_str():
|
||
print(f"[BOOT] init_ina226 开始 wall_s={_w_boot:.3f}")
|
||
init_ina226()
|
||
print(f"[BOOT] init_ina226 结束 wall +{int(round((wall_time.time() - _w_boot) * 1000))} ms")
|
||
- # 启动 A25 绿灯和 A23 红灯状态指示。
|
||
- hardware_manager.start_status_led_monitor()
|
||
|
||
# 4. 初始化显示和相机
|
||
_w_boot = wall_time.time()
|
||
@@ -121,6 +119,8 @@ def cmd_str():
|
||
print(f"[BOOT] init_display 开始 wall_s={_w_boot:.3f}")
|
||
camera_manager.init_display()
|
||
print(f"[BOOT] init_display 结束 wall +{int(round((wall_time.time() - _w_boot) * 1000))} ms")
|
||
+ # 相机和显示初始化完成后再启动状态灯;灯状态复用网络电量上报快照,不访问 I2C。
|
||
+ hardware_manager.start_status_led_monitor()
|
||
|
||
# ==================== 第二阶段:软件初始化 ====================
|
||
|
||
@@ -358,7 +358,7 @@ def cmd_str():
|
||
logger.info("[MAIN] 超过设定时间未检测活动,自动关机")
|
||
network_manager.safe_enqueue({"poweroff": "超过设定时间未检测活动,自动关机"}, 2)
|
||
time.sleep_ms(100)
|
||
- hardware_manager.power_off()
|
||
+ #hardware_manager.power_off()
|
||
time.sleep_ms(2000) # 让关机指令生效
|
||
break
|
||
|
||
diff --git a/network.py b/network.py
|
||
index e8d7d16..9da9b2b 100644
|
||
--- a/network.py
|
||
+++ b/network.py
|
||
@@ -18,7 +18,7 @@ import socket
|
||
import config
|
||
|
||
from hardware import hardware_manager
|
||
-from power import get_bus_voltage, voltage_to_percent, is_charging
|
||
+from power import get_bus_voltage, voltage_to_percent, is_charging, update_battery_status
|
||
from logger_manager import logger_manager
|
||
from wifi import wifi_manager
|
||
import subprocess
|
||
@@ -2139,14 +2139,16 @@ class NetworkManager:
|
||
elif inner_cmd == 4: # 上报电量
|
||
voltage = get_bus_voltage()
|
||
battery_percent = voltage_to_percent(voltage)
|
||
+ charging = is_charging()
|
||
+ update_battery_status(voltage, battery_percent, charging)
|
||
battery_data = {
|
||
"battery": battery_percent,
|
||
"voltage": round(float(voltage), 3),
|
||
"netType": self.network_type,
|
||
}
|
||
self.safe_enqueue(battery_data, 2)
|
||
- self.logger.info(f"电量上报: {battery_percent}% 充电: {is_charging()}")
|
||
- if getattr(config, "CHARGING_AUTO_POWER_OFF_ENABLED", False) and is_charging():
|
||
+ self.logger.info(f"电量上报: {battery_percent}% 充电: {charging}")
|
||
+ if getattr(config, "CHARGING_AUTO_POWER_OFF_ENABLED", False) and charging:
|
||
self.safe_enqueue(
|
||
{
|
||
"cmd": 700,
|
||
@@ -2339,8 +2341,10 @@ class NetworkManager:
|
||
current_time = time.ticks_ms()
|
||
if logged_in and current_time - last_heartbeat_send_time > config.HEARTBEAT_INTERVAL * 1000:
|
||
vol_val = get_bus_voltage()
|
||
+ vol_percent = voltage_to_percent(vol_val)
|
||
+ update_battery_status(vol_val, vol_percent, is_charging())
|
||
if not self.tcp_send_raw(
|
||
- self._netcore.make_packet(4, {"vol": vol_val, "vol_per": voltage_to_percent(vol_val)})):
|
||
+ self._netcore.make_packet(4, {"vol": vol_val, "vol_per": vol_percent})):
|
||
# if not self.tcp_send_raw(self.make_packet(4, {"vol": vol_val, "vol_per": voltage_to_percent(vol_val)})):
|
||
send_hartbeat_fail_count += 1
|
||
# 短暂波动可能导致一次发送失败:连续失败达到阈值才重连,避免重连风暴
|
||
diff --git a/power.py b/power.py
|
||
index fb0ec26..14e8bb8 100644
|
||
--- a/power.py
|
||
+++ b/power.py
|
||
@@ -13,6 +13,31 @@ from maix import time as maix_time
|
||
|
||
_INA226_PRESENT = None
|
||
_INA226_LOCK = _thread.allocate_lock()
|
||
+_BATTERY_STATUS = {"voltage": 0.0, "percent": None, "charging": False, "valid": False}
|
||
+_BATTERY_STATUS_LOCK = _thread.allocate_lock()
|
||
+
|
||
+
|
||
+def update_battery_status(voltage, percent=None, charging=None):
|
||
+ """保存网络电量上报得到的最近状态,供状态灯复用,不重复读 I2C。"""
|
||
+ _BATTERY_STATUS_LOCK.acquire()
|
||
+ try:
|
||
+ _BATTERY_STATUS["voltage"] = float(voltage or 0.0)
|
||
+ _BATTERY_STATUS["percent"] = percent
|
||
+ if charging is not None:
|
||
+ _BATTERY_STATUS["charging"] = bool(charging)
|
||
+ _BATTERY_STATUS["valid"] = _BATTERY_STATUS["voltage"] > 0 and percent is not None
|
||
+ return dict(_BATTERY_STATUS)
|
||
+ finally:
|
||
+ _BATTERY_STATUS_LOCK.release()
|
||
+
|
||
+
|
||
+def get_battery_status():
|
||
+ """返回最近一次电量上报快照;不会触发 I2C 访问。"""
|
||
+ _BATTERY_STATUS_LOCK.acquire()
|
||
+ try:
|
||
+ return dict(_BATTERY_STATUS)
|
||
+ finally:
|
||
+ _BATTERY_STATUS_LOCK.release()
|
||
|
||
|
||
def _ina226_ready() -> bool:
|
||
diff --git a/version.md b/version.md
|
||
index 1fab875..6dfc69d 100644
|
||
--- a/version.md
|
||
+++ b/version.md
|
||
@@ -34,4 +34,5 @@
|
||
# 2.17.1 26-08-19 17:39 压力传感修改 增量方式
|
||
# 2.17.2 26-08-24 17:56 靶纸识别模型更替
|
||
# 2.17.3 26-08-25 9:57 原图拍摄开关
|
||
-# 2.17.4 26-08-25 14:57 模型修改
|
||
+# 2.17.4 26-08-25 14:57 模型修改
|
||
+# 2.18.0 二代
|
||
\ No newline at end of file
|