From 01b2109ce100866ee44698fef095d8a1188fd21c Mon Sep 17 00:00:00 2001 From: ranchuan Date: Thu, 13 Jul 2023 18:17:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E6=A3=80=E4=BB=AA?= =?UTF-8?q?=E5=92=8C=E8=B5=8B=E7=A0=81=E4=BB=AA=E8=81=94=E5=8A=A8=E7=9A=84?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=20code=5Fwith=5Fchecker.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/checker_test.py | 6 +- python/code_with_checker.py | 229 ++++++++++++++++++++++++++++++++++ python/file/Ym_Coder_Lock.bin | Bin 0 -> 38484 bytes python/prottcp.py | 30 ++++- 4 files changed, 256 insertions(+), 9 deletions(-) create mode 100644 python/code_with_checker.py create mode 100644 python/file/Ym_Coder_Lock.bin diff --git a/python/checker_test.py b/python/checker_test.py index 48775ed..b1ba1b6 100644 --- a/python/checker_test.py +++ b/python/checker_test.py @@ -174,6 +174,6 @@ class port: if __name__ == "__main__": p=port() # 批检仪测试 - # p.open("com5",115200) - p.open("utcp",9527) - p.checker_test(5000,"file/EX_Coder_Test_2023-07-4.json","file/judge-xt.lua") + p.open("com16",115200) + # p.open("utcp",9527) + p.checker_test(5000,"file/EX_Coder_Test_2023-07-7.json","file/judge-xt.lua") diff --git a/python/code_with_checker.py b/python/code_with_checker.py new file mode 100644 index 0000000..3e55fc7 --- /dev/null +++ b/python/code_with_checker.py @@ -0,0 +1,229 @@ +import serial +import serial.tools.list_ports +import threading +import time +import socket +import checker_save + + + + + +# 使用批检仪和赋码仪联动, +# 批检仪控制电机,赋码仪注码 + + + + + +def crc16(data:bytearray,offset:int,len:int): + if(len>0): + crc=0xffff + for i in range(len-offset): + crc=(crc^data[i+offset])&0xffff + for j in range(8): + if(crc&1)!=0: + crc=((crc>>1)^0xa001)&0xffff + else: + crc=(crc>>1)&0xffff + return crc&0xff,(crc>>8)&0xff + return 0,0 + + + + + +# 把tcp封装为串口 +class utcp: + is_open=False + def __init__(self,port:int)->None: + self.ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.ser.bind(("",port)) + self.ser.settimeout(10) + self.ser.listen(128) + print("wait for mcu connect.") + self.client,self.client_addr=self.ser.accept() + print("client:",self.client_addr) + self.is_open=True + def read(self,len:int): + return self.client.recv(len) + def write(self,data:bytearray): + return self.client.send(data) + def close(self): + self.client.close() + self.ser.close() + self.is_open=False + +class port: + def __init__(self) -> None: + self.cmd=0 + self.cmd_no=0 + self.str_err="" + self.is_big_data=False + self.num_to_recv=0 + self.recv_data=bytearray() + def open(self,name:str,bsp:int): + if(name!="utcp"): + self.ser = serial.Serial(port=name, baudrate=bsp,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE,timeout=None) + else: + self.ser=utcp(bsp) + # 打开赋码仪端口 + def open_code(self,name:str,bsp:int): + if(name!="utcp"): + self.code_ser = serial.Serial(port=name, baudrate=bsp,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE,timeout=None) + else: + self.code_ser=utcp(bsp) + + def start_recv(self): + self.thread_ = threading.Thread(target=self.recv, args=()) + self.thread_.start() + def decode(self,data:bytearray): + self.str_err="ok" + if(len(data)<10): + print("recv data len too less.") + self.str_err="recv data len too less." + return bytearray() + if(data[0]!=0x59 or data[1]!=0x6d or data[2]!=0x43): + print("frame head not 0x59 0x6d.") + self.str_err="frame head not 0x59 0x6d." + return bytearray() + length=data[3]|(data[4]<<8) + if(length==65535): + # 重新设置数据长度 + length=data[7]|(data[8]<<8)|(data[9]<<16)|(data[10]<<24); + self.is_big_data=True + else: + self.is_big_data=False + if(length+7!=len(data)): + print("recv data have lossed") + self.str_err="recv data have lossed" + return bytearray() + a,b=crc16(data,3,length+5) + if(a!=data[-2] or b!=data[-1]): + print("recv data check error.h_crc=%02x %02x,crc=%02x %02x",a,b,data[-2],data[-1]) + self.str_err="recv data check error." + self.cmd_no=data[6]|(data[7]<<8) + self.cmd=data[5] + if(self.is_big_data==False): + return data[8:-2] + else: + return data[12:-2] + def recv(self): + data=bytearray() + while(True): + d=bytes() + try: + d=self.ser.read(1) + except Exception as a: + # print("err:",str(a)) + print("port closed") + return + data+=d + if(len(data)==3): + if(data[0]==0x59 and data[1]==0x6d and data[2]==0x43): + self.num_to_recv=5 + else: + data=data[1:] + self.num_to_recv=0 + elif(len(data)==5): + length=data[3]|(data[4]<<8) + if(length<65535): + self.num_to_recv+=length+2 + self.is_big_data=False + else: + self.num_to_recv=12 + self.is_big_data=True + elif(len(data)==12): + if(self.is_big_data==True): + length=data[8]|(data[9]<<8)|(data[10]<<16)|(data[11]<<24) + self.num_to_recv=5+length+2 + if(self.num_to_recv>0 and self.num_to_recv==len(data)): + # print("recv:",data.hex(" ")) + return self.decode(data) + def recv_code(self,num:int): + d=bytearray() + try: + while(num>len(d)): + d+=self.code_ser.read(num-len(d)) + except Exception as a: + print("port closed") + return 0 + print("recv code:",d.hex(" ")) + # return d[0] + def send_code(self,data:bytearray): + self.code_ser.write(data) + print("send code:",data.hex(' ')) + def encode(self,data:bytearray): + t=bytearray() + length=len(data)+3 + t.append(0x59) + t.append(0x6d) + t.append(length&0xff) + t.append(length>>8) + t.append(self.cmd) + t.append(self.cmd_no&0xff) + t.append(self.cmd_no>>8) + t+=data + a,b=crc16(t,2,length+4) + t.append(a) + t.append(b) + # print("encode:",t.hex(",")) + return t + def send(self,cmd:int,data:bytearray): + self.cmd=cmd + self.cmd_no+=1 + d=self.encode(data) + # print("send:",d.hex(",")) + self.ser.write(d) + # 测试批检仪 + def checker_test(self,times:int,scheme:str,script:str): + print("批检仪测试:") + tick=0 + save=checker_save.save(scheme,script) + data=bytearray() + while(tickWKu-yyy2_`^*Hewx8eU z|M|n`%znStUVH7e*IsMK)yY&|&y<;UO!)=e_u#&{j44lji7D(O|DL*$DPOqQjQ=$9 z_V+SnA>98j-+34Qzn7c&NIT6p{p+%$w|#v2pTfE0O#e-Ud0AJ^BBr=7cAGcYWkWbQ z{g3}2Lc8zPG3A33j^O5(0$srqj!>X$`KsbxevUlet#eDUf9Wa*zC!;}Z?_)2ocjY^ z$h~dzOD-?(eQ2m#XPo;R;9oTK!HKMX=ev3V>*fAhUsi8c@6bDXLH~)Y&^FY2nJ(uC zx+;B&f1wYhnBp&m%i)%L%YEZvrnViEP}jV4JM+D)m-PluD53Q)U5~z1>2g8t{tr$l zL9`Q8(T+PTzh}l$t{~cBBZ|H-vMwwiH(T?|OuY)Ec~ir$o_OPm=gQUQ^NzfFVm@!1Ws*E} zMf>YBs!fX8W)`J}VtfTrXfKIz~?6oT;$35A#EA_%8_Imo3_}KhWi_@G)gSjU&+IcyV7e7-!L3z2_L0 z<^2x8&^Pp7Gpg*2%Cm*h+?mq--0AF4I(~3Gm;b7=`xsl_eaxY@?*}Z9muAAz$re2+ zN}jHn(rl~kYiyd<>&EK(<~w$_yUVfS+4fU!ri{8|@MWe9;tP!2U+M_+Yv$>83!i}R zQ;Q32E@Oul#cTH7f;vBp6x2*Pxs=VJK=2OvW%K5AEuUA;KVw6VQHNfNFJ<Cp%uW`a3JWKWTId%H5ho$h%S z{i_M)^uzsfVu6;Ij%Ntpf_N3~7ZN#|l8!%QvFO(!9@yx%=vOBkW5CKf?xr@`h1`86 ztX@bG#2$+;2VCxom1v-e`mf>*0#+r6>yK58)}&!2U^WM<4Rf$6{|Kz+&%tU#6Tzwo zu=-rAtnSh|SmmDqs~^skvD47{Ud-yL5zxvZxPL6nxQD6t^-8)dWe;%`v{4OoanGS! zgTsL?32DW>IqsY@Qq0`S8Mzs28KIo4wx_pXwd&5hGq<<%n6*yr=aWAK9qwb6p7HBj0M}GfPbG|*l#cnzqZ*xA&4p81 z?^83`HrsKJ-QHk}+Gj!?>9EZL`l)ni{#;GH$$EU{Tsr*eG#^GvHspRUE%$i zbu~LEWiXL^putF&MLJ+MWXJwU6wr#D)v8$#aw5bLBAiu#W6kgCUH9#?dO+JNKbf-CvqJuAoF+_TaK%40_fuP1xo*gN{p zr;aOD*8HOh@MI$P#Pt3B&UO}bwl}|<>V9xvo@c=Gh=(-{dtM+M7~uLtQOUW%n=+nC zaOd@Kds5w}Qi12ft&FLA!i+tGZyoBY9HRIg?H1HsOl>{*1Fd^Dx`Au{s_nz9$vP!D zuR!^4B$?~vcn^H{B@dj)VY$yZ!}D40o)-K{@Ru{m=|$>oXwL(;G!>}0cQ|{7v+8It zYE>ULA?3e!xI}%_^bb*?D)8?>?|_=kQNXuHVY0SmP+h`!ePa;|~1$ zPp!_}JxuS8jD=g+o_6~bwJ&3bpsoUp5Uo2pULp z$356HfV05YHrZ2u=Z$x=Mt{g%;SX|sEUIqWxCx=E{$Uk+a$Uskp-|)6g2rqw>*KE6 ziRvZU<90n9;V#<|i@rIwK14ZpC%7gd2j;P#F^vOqgfW3Y*DU;O6I*cFv^`F zxOc;qL4W(;Djtj888vD4ifEVm97fC32f`L+!LP(_@_Yug`GN3Qm^s$M_xZ@DG0(^2 zOwAqO$gzSw5I&D}&-&H;0j3rV$cS?TPgWsU2zz15s7~5zc@1-}M9k9(d#zMsbGF0( zM8Z~Usc|?jf&V-3%Qc103*rA(;zCgF?BoUB)h&GBlU@n+S_a&z4A(jkRBZ!pW*-PL zWk6N41`hCS#ODm~XO^JUi%ITmg8L`n<08~m7kA`3FkB}Cz!`QKFOR>`wYRkh8|H_Kx z;dwnjZqJ%R$Zdvd!j7Jm6*b{`Zg<6+s`tuww7>g@Yv6ml{V#uD`~Nu2_9v%l*U2FY z;VjgyytWrDW@$|4*2*EbBdFgGlyN&YRy;ebG@Y1SQ}N93Bkjj0TfhOm>R`HEa=X~1 zV~p2+!+m7fa_KeK7I#RiZ&=Ir&jPRaW`jdAYp+W!=HsbzI4BBs{+X@`Sfu#1Q@fcIy zhW}um*)Q6g8oUGH<&3#3N9*8gVJ+Zv+WJ~>M*4n=dRpb(7cOH}J|$Q|>5j6NlyNf2 z)N)Xsa_k{b@(rp@KbGX`e4n~Z@y|otW4usvc*|PY@lIw95qv+<%#ZK}o3_010*}ih zVP)7l*nYccaj^ZJqs`7wsFMCn(vog_LyGO+FUH#^F*TUpXTYXP80{|h z)uG)*qFq+sqPaXbRs4Fm!FPFBb<3lRv6FmjGjrB@?fPG1YM(x;-pO##t@ia}w2Ftu z+|JflE<}Ir`nQmy96LJ7`u%de+S?JaD9&v&1@ zoMT5TVFW#E(}$DAVjk2X(AsecwAZeUg=NMDvfwd-q+}Zzqtl}R5j>}ofcpO1+ShT0TPXj(V zaG!!}*M2yMoj(9}QV*X%%z+ck!Ccu>iuOHVv0eY~q+S10YysxB8)|Je+{p&M>9y(4rr1!?+f4mBYTSiUF5<3HbG~n?!}{o$poKfH{E0*gFetbn%?HqUQ{%4(K*Hly6m zXu!(^?tD??Ry+u0QJD-D`6~HL3A5{)qc@^2&4XU%ul_XhizOP=~X zTzA#AzEI#A-mI4PwcMkWDK(9tS$2IUqO4fz%UVV;OMG_yU4)&!p>VTf6N;Or7#Z?tx*DyG65ps*odzU z6ln7h<}NEJexC2p`Xa=EeyiE=7r@W~wZ@V|$d>+hSOFGLe{e7D+|`T^Yc z@O@WdD(xp4{6s%nN9NNCbicmkqEU-R__;N{p^7y{CLEg0$w0mKg1@loSI4_&@7g5C zxSld%5e5!K(!Z3T-&+&b^ol$gw_wz?B2&gi$<{II6ZRaZ40`^H2!2DVE;9)<*D-b# z_Tt=D?skmid%^8(?4Gp;LL2gs$BjIoKtZBCxfduwUgLJ!y}7Lx@POQD@m|%!^zTQo z6R|`2pb6=EO#Ulmk@N%L7pPyaz*Rt#LkR|cE0;YN&d2A#SHf};Qv`l$y;~ZPp1Is> z(Z3T#J0I4yT?T(3O1{Tvq3+l5wB(ehj#&DAB#Cu1)NkiIIJAFxdV9v`2(n>rvM?xK-NGDa$OQ>_OePF zV(bI9XNc2^MIb!`uf_EDBCICptViGMQ3jXk6_I?jaCRT7` z7+Za6RLuF=xk`}soXABIk-KAb5>@=&v+kZVaUch2j{BZ+2XL(shJkp#)l90AZep!=xyH6#*T<#_*94G(gLO1s_C-=Ac`~9!_ zFZG2WuUh3(F7QEWP{6xZDWAODf1kF}SF(&!I?^dRZxbp1rd{H5iIj`Xl-a=gPl}X) z*6O=Zq@15gXA zRvwjbq$K^xcs}rn`wj`*!H(c=fjmsE2er^cVXH@Oo<9M)eUn?4h;FY}Je}()>fN^V)r@%^HgLt>tV6`l`>Qb*Wf=rkhN6PHM%WcnvX-x?;cGSM5(uyd|o5j4}9L|Wm* zz6v&==CVhWbi9gqoHo$cB>HMa37dv}D;=ixT%Nu$>I0}AR+Gg`E2@@%VI{@=Xx9h7 zW}sVgEo3?=i^rm+j0fRfQN`)Rw%C}EMy<7_9-K&-VlJ2G3aQia?%>8}b7KNqfGBz-6a?4Ju)Vdl#*^D47F)8Li# zvZRDv%?hsnIbZ|FZ#MHUbc=HNOhVWJc~k{*em9{w%i;b#AvsIo_Qh#`ng<`G5xDCp zhVLHizlCr=A7{=2xPL=95AMczCFmE+0&C(^}KM$82$kxnw zZ-MoUc*g;Eh2olcv&2uezA}?4STVI0tu4{mjFOA;iW1E|qebVxY!MtDN})s;Ee12~ z*+p!+E~GfHcPg&myt&qI%Axd;Y>$A46R^>l=cO6eElpHjHggl#7GAcg7blmM_YAXH z_xzVmx~r85C+Oq6%kJoH&;vIXcW?0*X>2x#v|zPu!UB1;b@qvlHsrBsp1kupB-*Ej zM7U-s6JFMFx*f}9GwZp=FWcnTY2U*2SsPa5tAcV71!4Cwmo$Ynce{ic2)ei5pP@0= z$C!$kw$OH>MamAv6TFXBX=oexm2Hrq*(JRvMz@)ck$+v&MRPTEsUKfYlcv$Nvcj(At*)z-wVc&YR^pZwCqZy0qma=oW>bzD z+*@lq*b2yooI)D(&hP+kgV_G}r%9$17=e89c2+MrbG=DpH#pU7xE=8`WxZC!JRT!i zuLZtu#vtppx;z1KUlbUzdPEHklGEi$8ec^X34P26X3qy$LW`Y<0cwf*Cgco*Ezh~ zA?-{WPetzWP_ z$c?zVN=S@W2^kHgJ(Rd#W%@gjTReR4{g4K;-jwlvlH@DI&AQ8jbRVEzBuY{KFQcvt zd=-#7arG0Z{}ZBK)>xpOi?S`a+gahu3Xu%Hw_?Yzq)E-VU9az}*g1Uv()T89%{fz} zptyWu$ip?@;GN4+XLrH^UR@1Qizo?MKL~%2T5Cs2x#mF+zb$&`ah8c5KK_v&eza_F z)sA7-{O6-|2jW?oI(6ssI7g+SQG^j>r=ejN<1!^yxO)$Kft&H26@Y)7qYG(V3d0ZC zs+i9cI8~OLa|Y$qj91@lI{%C?ErJ-Ol9LV{9Zh1ycm`};BP|P+xe92m4h)Wn3q);BVoSadiR`jv(FHkz|qP zfaLGX(lfpk^(__k%+r>N`JT^~i21fpkpyFLI?mc@(WEA5F4VDlnuGh7OiyMvePU`P zHhZ!b@L;aRQ#eh9T%&u2ooKHbU#^BzRA@)L^wvUOUeKy76d``N3?a;VNF6N&1n1++ zC3y#6Doqt5WQDv{K=_CQA@_%?-B!IJ&Q;p`x@VscSoLa*z?fz%GoM9(6V0!fSNI8z z1Ve%)!7(82ax<${!rjOs53S{gB7w1s|3!K~(i@RZb6~~VB|dAg4Du?)Rg{mF|3EX%ub$&?cYjQy1D? zh4c)5{vhlayHMn}f_AXFY)Fv)63?bN-H)>fLPz5^j~(-*;wDuF=STN-&$iD@ntKdG zS%MAZ&A9igN#jo+_D?m9Ka~PADg^#mb$_e}(zHXV9QAdy<35i9d8XTA(>I4pG_@#K&{zc!YNOi${Uz)veOrK8xHnBAu&PL;mV?t(5mkq|r?U)w&!01?gJniP9zMTB-d9qkR=`3`;=Oy9er%O<&l8b3suz_0JcjDZdB#$B)4~tH-LR!g(_`3*WoULplNpV}6Q8LL89A$@Q;BAelHB4UlA;^uYGud@M5? zX3dm}$c%DlH(AHC&_}K&jqMRxv!(mHC6bYLCyoD%g16{5<=rXcgDBniG338h$f+q_ z8Og#uK^aRJ`%<{oN~d3YMjcNI*&pS-dqky?GCn}JlndRwUd1h#>^L->GKki&ftx(p zpv-@XbC=}^X>joRV(oF7BTy%0h}Gv(e#S->;nE474^Yft`;jATzv(00Lq0&Vdpb)j zNcV*ANgCHh?-sIqtf}rD`!1lq1ksNHKpoJp2K1e{0|Nct2&spVws7!~YykK9;9Lp% z0}+n7b%*(nq`f|m+mkRpm%PVganfBL*MAz`AoRc7rp}xm9F_)bPU3j4j@{(Q#vMb# z_(j6*p?>ac=Wo4?-qTKI*Am8q(6}3EXGbh)9h#Hi)JMR9akNjgp+1sFu-% ze;=g&J=7}6E~q||`*#47Z1%sW73;ly5;Rh2gDZt4s`ZRe{g5YFE~f9^`)w=Y_GV zn~cd@Jh?R%QP)>dS1$D!E!c#%8 zRH85cY)o=ZiKssh^~?WcOfu>rIJW?&{|&eKH-X2XxeQ~@ahd`YSiO0t&0J+uw|L~5 z98u?AqL7(30Z#Rghb?Y`INb_85N7a8_&EF|h2?I#&u$U8=0Y2nrowZ$_C~TqmGy6d zX93TL9Z1$6g({_vdJ;o0Oczk!J&*K6-FoRr49*e&=r;ic4MDOUOd;|%=$1XU0swgmL1`Bw3<}FWj}N( zGP{KxtAg_54!@2+LwHjGXmgxVKovmEWkE?;HWM_kdvatDcqYte#|3XU1f3(=MOwi+*2(^k{HkzxF?@1V= zDZ&=YePfdC|GSVOVBHh0)R|*r7@I?^HeiKAap%!KfwMBLdvnZ$Eq2^umod7LUkY87 zgz|3Qx*)vUcTM zjDnby;f}5lqa#Tm-Og_hOJa_4qc#s;LeSz)+;@f`_elKXe#}@S(i(llbZ#ezC|K#VPt)9m5*chu z7~{#YcT!@n&z#W@#TAx0rxQ&tH^&QXW9$^ zZ2K&56_QQS1Hw=0&ynW zZMg7K;xCRyB`q76cS9^6>&D^=3#}6qQ#argp99<^OjQJ?nrC{V85?7eFt94{8t+}r zloGh7agusnh`nko1z`W4r+4=QfW1>J-sZQ4msvHR|nm;4wFv&8FnT0+G0qO**bYf;gw;IIx;@9 z9%s6q8)C0bS0g84|0E^X6#Md)Nqb~{ zD8=famxHr(&rsfRS$ezT&@hK&c@T0C>=om(b_Z--4i4uw{V%XFm-vlF!Uq~}LyYa; zA@ISJVS^ummJ=kG`n@TuQ}Vj2lE&r~@vtp`Y4u3b=msp8pfthK9!nb6q|PDw0{I6~ z@}%*-1X1#&(I_y}dW2{JN8XtzwDIcf+QAtMuZAR^Kciepy^@Y~8^bJLh{ZzxMQMQ<`QlJ_RQ;qR`alPolC$ zBc;9$MRCSS^JTAt7SP>FuE$jbtx?G7)S^Ry+)Xs%q!CRL-Yyn6L^3D3KlPWrF`Tbu zLuTL7mjz8W3$%}t#^1nuS)u=RhmhmF(*FKr>q1vrhPM*sVdqyP`GA}H{wUq=9>tw4 zi!+5ZgT)=SUM+FwLvCqRM^-yDY$-1IXK*JU7ymZXAft1#+Jc&ceew(QR@e2)v)YD( zC$$aE>{n-G%P-xXeR9+?v%Rmx?d-_n`KxVxPh2VY$$GVw*FEdD_T5(a9J9`7^{Di0(rB%gi9b={G^3tkox6~nBT8?|aU@BEjwv3RB_p({dj}uS_t0XDJ{uA8~ z5;PbS?V=6GNCKO%ez?$J4#F0{tt}y=hOvh6nEBf^WtN%?Zr}Jug9e zWlS$kDEkQi8T4*2b8av0o=L7GHT0op6%mpE$%t-iQ%a}1F5vxXMWTY%usPB;3-*u$NjW*@s`x=CtKL+f!rW1Cb%`%doM zDjiir%Uv?g`GY|%NYXNl2emYV-jaT^tlt&p>LS6xy9C!kIn_|y_+f0Dryf1%K@VDD z{hnI*z3?B72J!n?Y{#$*(EdhvIqFywW{r&+(>Fx!9d?HFivD)_2-md&kfoQx8x7wS;8$?hlXlq>Kk}2BZDg?zM*8A5QjcZ)a1TRYZ3gtoJ1BW#R^y z5v~!=(OshKb@p=q`rbDGU?^p1f+jCPx+&vCZ~Ac4i7^naOhoMhS6bn}1{^iv%4cz+ zh#S9vOiJ&+5an8_?z-E3RNfA#wPL()rGg&YlG4L}ddH?)Y*~4QB^&B$AVu0x$Lk#$ zZdy8PAVngV*DE5{Dt<9iVTWiB zXA91-6Hrzlhsky*onzr#@tcp|11BDoX*4&Z=Zi4@xX~D;n*!^;7OY1a0~WKJ#sQk7 zbI3OwBlqr08NW{JIaZ*E>H zP7`EPbcQA3tm?6W0ysusy8@_lk8M!}AjEZxJ*S{}0aqQcJTKM2x4?yjTg`>*fSV0B z7x4;Q1+ERQtjSKuU*RKYNnRdceSxk4$kLlI4wEOdHPxVgS+^*8MGGnxc_dJeKSU}u z+)2UrW~3B8iu+BZI34$kNPgOPFp`z_?T1v-Eb$)^YKx?zPox6qKWutd_4KNvcn1;{Ynwf&Z``%5HXTgmUb7Q zJi)3&w1A^V*1R>hTx;!}a84FaJe$PCD*&zg5J!+jiyH z5%+rUNbJN(>v~`;V9bi{0+W6bqur_w-&S$&$eo9zl<}ohjo0eu>H*l1Y#%PenK&M+ z0zLR!1oCIM_tf{?w1=6y7wu!Dn|G53df~b^#+|g=9e^%wp{EeOacBXPCSGfdLAwe& zAarwSryGuxVeiaEEf0kAST=t18EIJ+Flz7Rm}O7O_;qaS*lJo^(EY$2BT79f3_o;cnTlcyQNA+QGs{8i@3EgS)p3x_QvE?=^qXrr-3bvv)f(aqkEp)fEg- ze@s0T7GSOjjn>%!X6CBGU8)NhX(X^_QjdtR`zD0 zR;O=uyQ{i&Y<}wtP< ziUmwLBb{Y}8}4!4xYZU=g?7H1Zsi25XM?JlL!C_mBHgpqEQJ1Lr*PJW>{0PkKL!4? zR5+D7l_Xw}@W`T%r#N(?n0{l#OZ#YV%MkP*5MCDs57ry(!d-&Tu}leC^k31A2OK2a zG|LX7EF?L)H_`)L9|j!*d1?V%chx+SvqM5HIZ5xjHNu9ZI|&mYcDI+C&;;gy=gg48&f`WacKlL()Hljx^9QC`m!+NQb&lZ6zJ) zV4w@{6>OvT3MiG&r3wvdq|(}vJ-un0{R1T_V+U;ZHMsqWgBs?pn{59T(CN=1o}^+| zCSKOorSnS&uR%PyzQnWIRq1#c;WosRdr@Lg`*b>9LHInxle;YOP3^LDyaVAyh$pu` z5z>6=copGF#FJZ=xLfN?$Gg$LWr+8~ZB7KVOAw!hejbvkJaBiGq=;(b2JMsS6vayR znUoTAq>SRkXS5aR6faV8%rZ!^C4A5+Nxyi2I{pZqP&eEo@r!V7HsgZ`A4WX6zlkr? z>ND~4QpSHGeh}`@jvyXw1LuDiFV)J^DPE-fTBInj z8MN|K==Knv(R>r{#d7gE@Ri_Of%w(4ke zXmx*U7k=g9p{2t)3lLy;^{lQm*yuYo#zyDSAzW-i)JMnE7{6dWss=Rb}d;U26=8W$n z+#X*DzjeGEzmoWc{r9N{v2rdAm3J&atbKewe(|2qsZ>X~`&WpSf?o^Wvm+;D*^!Nu zobfFDD&zV1wT|cER}#N`BIhp4y}b4wtUb^fnmZc9$Iagv<1+Q&p_482;DO^wvLc)i&N}kJ?V+24y0* z1#}OtqlIZDE#*V@-lZLOoOkTK&%@QnaHim}z_o|%+Ub~GB4&g7GW3vSu4Zj;@|a^+rsQ&! z9sdR8&~Z9va)+W(OqRpEho<{O^swJ1-h%*MVGe}cM#znFd|e;5^rWDZK(a})P%ct& zihE1;)ZnaQ1t&yW@G@L4cGzFQY;u+}^?n;p2l(aytkk>4GVg>R%4?DASpEw`B zz3`p)#3$f;3cmB7xB$Mvs7sZczmizZuis^k^L*zI%KC$0(#53Rw-gq;tXI~*5&0xE zGG+gEoy(H28^!BF17s665M@J68crL#890`f7vjbx(3XSEOkk0~!-W%#0uL8V)WaT; zRqq%cIVo>-9IZh}yodly{7$&a=L`9&Dp!%jO`34Pg5=S7+*k~G@@vyy`SSYBw_mrh z?}m-nZ3Lv)YK-xQ-iU+*%(-M-R-@b zH?H5nNHs`(1?M6y4L9f(Kr?*T{Uk{sU)Ftm(aFg`SIRu|tE^G_w&mOG+x**j??7X9 zmuO$Q7Ba%zu4t}d$8P+1xFGOZ_XBv1;_#MXT?Z}$qwKy7H$q) z8E!6IE8IM|Hn{n4?EzLxQhy8dPL$kSxYt$0hLv+pPJW>xj=Q3<$?l5C@KF0tCc)Kc z((_xdeb8<13=dPRvgp*L410!F@C0q(!RhXoyCs~6@t#5I0dV*h_?d3thHb0BIqWC{ zF65NiR{UBSVHz}9Sj>1YG6yI2YElkCi_>0~TZ6It8g1{AzJ?o?4rqp0Ny(HCfWq0AHMGLs)u zhQ^uasY7nYuEZ~AG*;YYC7sX^XZovHNv(heNoCIwxh_2;*X>CwWaujLJty)hBh@0$ z;xqDGpHy&4CqAedGN_dCcVY8J=k_(x(|WoVy(|?oG~Djk!26xn(@hyg;CdOm4szRT zNp}0s^lwPg+YRY&6t7R)V zR^sn+KF(9ma$-buL?V=>>kNp_RIlpdz}<^w^G^bF0x)3}vd z0Bjh0C;4EB3fovAXZ;GKP6dcPF-;f~GyWY`0tZWvRBHRx?J!YJP)I9CnrW{fB`gH31NX07>Mg>xt`tmeU zov^qOEa;otq;EUptz*i_#e`pi9&Ck8IjxP05=<=t z9&Z5LaQ=Ygkn~76PI086T7VGgR7R20h187Rs-!PO2e%X`;X^sJ?p zWzgfdVje-4i-GxBEXc5{IoR**cfhE>#R6SbB1oEw*atXvnXSTlbDrmekHGg1FOKc?UU#k)pmQ>C3<#dZ8QdGQ>AgXK0Su({^=NIKhkQ+T&v&v zNUN#n&7#!{!oC0Jqhp{}o90?QhMWYsy0Bm5JPkP$pUxF+uE1|*ubqgtgTp<@X;ha) zTxCo^>2x{T!}>ksCf-M`P+2)9qb|a<``2yGhj6E86QrohxFj z(T;s`ZF~ddGfr3@(VbA=(vy?ef#+IYh#IaDWw?43YQ0L-W~p0**G9-*39rhX^lnv- z_^UphwpO4pJF-ygHq#x0RjXGO_2Qi;+`{J~pU=$a(5gIh@j}-W+NZCyzlj^ESK8&t z?%B6Ni~by4r{Vn6P@>@tk-66FQ?2Qct&{c{*vjCIAUbK02J0*B?@VSlpFj0d?BuDX z!k%dH6kgPVt<1h*+{^``O&-kEz^jMug{@4ZFF$D2NdM{Hc7C`Xp?dh$(K@d+2njNB zIuV9d%~Ul)R=jsfA%3I+AwZl%R@de}mXnip{0}S`X8WLhuh1Q)1l=IEe|%+X_FULb znYx6MemgXaNtclHJFEi6COu6VpN6J{{yjE#2e%>32N7>Xd=c?S#2YCiBy(o$#xwBn zfrtVMdZPQDeL)YMx=B-bXBq=Og%)?DTihmE+$Ltz#JJ^jBMhCCn=#8F)Oy$4yjP># z9chfa9d+F<>M(bR1yNT2nr0RF28kkCyEWaKj8ZqJTl<2j>qgNU;afaHy928$1c(7nTZ({Y_?3~epniT7f*566xFiQ;7~elhT{ zCS1tCB~ne1%&UJ{sOJ;uGSs(hgwM^?fxZpm-P)hdSPNd9q~Ee5-LvyC?;+^nyXN5d ze-I+Qf7)xw8pyOZF)`%Jk%bylO?x0(K43y^n#fF$v>5?-MIyal#Nk0>3| zfO7nIT-vP!ZmW=Y?`TiWww{4yZK&sLEVGJQAyMPW=~)QXp1~uK1qN9*NV*guofK=+o0Bgh6bmoc zcymj-9U39!IR-hs`SKUtXA(C;noIOX7uG-0ps|NI3PCFX(t*>wh^ZSzDZdF*JC<}i zZ$NiE!6{SEwyrN7Pc$!dbArNs;Bunf5X#CaInm@oF61u@YSJ!Ihe8 z<+1Shhm}j0fnSLkQE1nYX1D|`P)XkshGs(_X>tX|M!vz6+r>J~*nUX*o#^+++kQy8 zKO8lF54~M*(Q~#R6#MbEACm4x{{6@g&U()FgJM6<_G3Bv))F>tKVrroa0g&&^TvP& zAGQ6UI{+urVd*<+hb>e;e3cY-R{AQvQR9Xv>C-h7mV3E=KdeD69Gx#x=lj@)g^sB4 z=_uI%H;U2)DBZ~ODeNrp<)d^bPK*c@=AiUTQMuzn-0f4U-N#No7>F7xgdU{|$nLq6(AxB; zNxqcy$>|Ji?I0fMYf)Izf;laObUrO84! zooUP$@k&PvG1sJPoIBciO5IS3(hZ!sa;I?WADHKD-$IbC^$=uJMgV#+Hm$(t-NN_M zTU8hu(?&K)rDElA zy%|_cRz;-QUMw_J$O`H)UL>q&P+t=Ff#USL0ahRLkvsbgO?09#k8$&*xTx_=>NIxE zgq5>&%t@wOogQP>l)$ROidE+5CZUaB(aO9jBLQFY(7g1R`f;~j?CtC;6muRJEf90P zy@Pa#D+UN8h*uttwW~p>mBCgWw-bx|L6=bE*aVzy6*cu9WD^tcL z=r_H;SM25M1}h6!Ij-%8*6d2WN@>!h4<~c+K3fjT&`$feq!({Cy0<7|g(;o`TWGCt zjq;OjoeMK)!Pu#Bghs3#y8Ebab@pJD z42FBe2wBk@jAIR2_Tt1N?s^1y%+vu>h3YJTdKwx-_%viOPxoh3YV|SUT)6r>k+wwJ8=sgN*J4yHfZ_2 zbow3dQ~R)r7+Z|g#n2w_`=`3+xQ#~nD?YZo%*g7w{GXP$vAaj?u53=T)}rVQKv?>NrWf%m|jY=E%144N}!gOE$K3L3C7Y!D=ki<&Y$k>=iAj2f#_BqPc6 z!!bfsx-mWbk0z3aGui5_MEgHVWhivY_+iBC%Yn-IzT9hNoZW)1+6id8vq2Y!UaezH zywU*bO!Fk^by1Q=o|w+qhT?t#=l+j-my)U4w4|Ck&(x<3AAx%WalKeFugdTftGjrXGW zK!cHVjuJ+9;-hwL7Gc+xFy2p@c5P8(9VBO@17+H^Ny4rzinlaKqcLizaEstpz%60< zS`>D9q~~aH%6p>5Q*mfC^_*$__Wsd~^&5xvTf+EZA{Y2V^mZw1FdeXdD}wbKy?s}L znI$W@`OMr8sJ>g0cENFF*79E5g7=4AT=AGVmzTC1pmk1E{d;)d&rD%RG3hqaa9TLq z)-7u2bhFAxwn{SAbp3)WF)bNvSp7}Hl7XpF<1OUQ&wnS0m zk-2vZqsH5izfgZOxI?-fI2+X4oTOP?mynNd7j}94m|Kn+_s5&Hn86ceuEw`$#V&8I znTi@0h5K9!rf5F?7?;rUE6|;OEH2(5DWo@y>%(kxo_Jjm{m1GpF}GWo)UXtqvYpU!lYfdgQ2Ojne%#?8 zN>+pr?Gmh#_%p2dKH?JaUN2rMy+`mJ1kY?i`C(Cj_d*a}xv*>@) zm=DcpuCKxv7svAiZJ`%%UPxip)@5V&BmUt)rQN4oOEQk23;SQ%o-t}16?!cMZyFEn zf2~dx^x_+dDjzr}>>>XPTRg&nGMwcPZI!1ewp8#Z3kWk#$8IVXT$Z^fGgxVv^vqqA zCvxYAIu4w8L&p1F>lB}F3&)uy6%gaf;1G?^w7;YK0m8+fp}Y&2N!(4n;9Kehp4QFT-#LZ-9jt9|dm#zj z`@87HK9tPxNZ)~f-Wgnv$sy5fd^1{jmi--Y9M-VeSTEP%m44EP&ceKq{aw`Pjc4Y0 zUW_PSb>d>I-81`6>(L?Rk)-LwJ2w>OiTxvK_^`)ACmb_=3w(fWFB`}};XT+vn_PX= zI1jSl%sdl4N#YI!cb&Rd*hhoaUSWA?#lcv^p=I zFYNjF3~W=6k8gVQM3+p~@2>$=drYvFf zftShHlyRNx|H<~AsNmT)Wn8}l_WA3;g`c)5iyB`LHq0~!CDDJhDT5B67$?nr9z{3t)vZZm!|=G)sa;n&2?4e{pnWcVvPT2lwMX?$nx;&aGtZyJgriUin?2zu;42zC93>VOZ|SaF@kX(2Q~N^=<3T-L80*LvY(kBOg|e1>V>H&4e7U+c1g| zZ^^jM|D>$jl8{SC*A7MC{vS3raM) zlDRqfF;A)z&`PwhrqsSF~Vx(3*b%dSGR!Q z0d!r9fFQ9tSJ>$ar!^8++Q{Ke_>DTwui+lp2yA>@5-F z67hn9>WLTwIAMKPoXazKNBW#++A%WyC~n&SU+fr}{swY>tQ}+Ev>hYK<-%x#EYO;T z6rJvL%-bBiQ;}E>4G^->v?R?N);!M=k&E(Xa{WHx{!nT+^L-%h5y82FbN?Pz$M=8> zF22`w)%bGf<2aSZjnAW3j|qMRZ?wYyXnM!^w&0r|7W@eDDql@PlR33xcmSo`l{?zy zqYsd;8h@!}im6{q*Kj3j*o890(cCL|l6yrBc$*OKJf&cpGJxB@U^@53$h{?<`~QgC zcZuAJ`uFKq<0+AEJik=^B=b8t89DJjSi+Wz&M2ah{XjuO5gV9R4OCU7s$w z3ngpQB~?+9-uils+tg*#;!KVmt-_aotxcT2i^j!UQliaUQIcfeG`=EH(!_SVS~7hl z-5NnwW4^n`^v@tKy}L(w?IJJX`(yk{HTieO?ns{j``~8yN}`LWb)C!?VNES3D+?QU z;a;7zoRY?E@tbioPIo&Aqa#V$O&QIm5@5azanWb(B6@_cbQZ_v4>isoFW))?R#ZE)v0Lqf}6Sc+%7K$;MtR>qLz2 z&A{#H1X(qaRTja4+N=_7o`(0&#T_+`ZRCuWzLp^SE24Z^sz1n_*N1xWHWdncM09{++k6n;_l(2=qP*Cv%LvF{RAmwmikDZs! zu>d)0Amfnnt|d6EelBDJaicn>Vm06|Cj?>B;HP&{;>O#tIM%b`^Y%A8uSWPSgnu8G zeIbM?eIk}6?9S-#DUe)R*z)3UERfEWVn!% zb@O=2b;raPwQTi5NMcA&K#ov|UVEg_yvP@{L-ZHFMCi$=A0gbNiO@~a&*3l0+!dhP zXUhAz@Z~6pbE*hk8(D?C;I2gIOVJLk3e?054Tdj7PP|Mf(q0Ikr$Hi-4t+ne1Zg;@ zinQB6$H`8E>VGccL<(#JMd*v+a)e-EB0}q7<(5rnY!R|WvT;*L{**D6v>^pH8X|NE zFR9S~YrvD7g3f4?u&<#PxQ9F5{aJX&V?N~IKK!j2`ipe)S)k%ShpkI+e|8uBof#`2 zodr8G$UA!M_?3EO{K`G1#0BNg!u3Vj8LT(mr`8gV9~So(gdZPW8O8#~ z*N2p{(i+)^mqk+kP-%;qw;yd#|2{syEb`xn{H)T^qy(>m)dqts-X8M}cQ=9yzRx$b>0AEa@ z`n9mLLQT073hJ$PDdSAO-MK^(U3?2#MyUTNB%5k;c&*XEb-qG+EwngxnXwsQrk>t8w>+SKm5Vf?iU(4M{_ z(jWE10vNc59gZ}f*LBG}XT3H~$}892NMEjYa15Ud=f9Rsv} zTip0IWQnJtP5lfT@8O(6_(E%i;O7tJx9%9mie!s1Yk8dhLf}WSC2Sl z3dW6I)Lx0Z;{zev|1Irmz@sSd{5!j|*-2c;LN>xqHpwJ}xP%aw7-*namQ5HEK19BH zQt|2J3nv6+4=Wdy$1a4EP|(Aw6>OiU(N+ptdn8_fw8j|4N7Q;p5_@-8=#9r|0!U2+ zGPC*Ez2AQ(LCVu!?|GU$v-3UgJMa9z-uM0gfB*7RJ8mwg?S^tVIgxDHC8t`X=2I<* zCEgJ9>Al?5?+5*$zRoMo?8t`1z#r)d^CPa7>Z2vUbu@t$N_VWYF8HYSkK-cOU`RQxTOgQs86TlO|CzvQtkq^k{ z3~B!^BXK`uF+QEL_4A6`Dw)(&dD6&Zrb8TwBL(c8j+RC0QQw7EqSdvgESmN%p=P;x)9f` z1v5aeerlmGMZ#nwS~B6OzQciv;#Cn)^89A(o7FNJeAb#C?EUFL0=15WCeG#A5#-jQ!VwTLHc0dFtyf#?w zQTd3Rpm{OFAIFHeT_YsrLnfa5p-}eecdsN0TdpKJRw8HcG}lodW?f<+3@V8d*_iv+0EGhxGni)`Ib^me-ir! zFj|Y@#MU-jPF(+v;0kvNfU2JQ4oH0qIwjPjMrwRC#K)) zdnR-ZzUY<5p265Cjg(Q`z^n^K$@se>j_8y2KBK__q=D)Eb_YeNvi-Tug>tP~zaq%q zsQ&HPVcDxWwfR6V+UA>Jpnu>~GIq7_1@wkj&IV<6Fsk1Yv+foKc!A|oOI5Y*J;$t}(NlRW02}!Fx%vs=a$mKNYHyum%-uSq|ASHL z9>I936Mfv`X8ckvuCo}~G2;hlcG8S+Hti0I^YOKg==np#dVB=&sOl7CoJl$j?_$Iq zcE`3JODTh-gMRu>wDMS7|8yv>KQsg!8T4mZl@;T2OS!9w@JOg9h0(vU7$3w}#Oun} zrYuWS4~CKvahImaqA*JreadA`e;b#g{wqUb8VLK(@eq z6Hjl&&zbN*MeTzOf8dqnHcdj@Z%(=m(V5X6;AEU&LOqs0caDy4H_z$F$V?a+7=!S! z7Mp1k>X_knw|{|pkW8jA6i9E=WA@DOM)XQp|5q3j*DAu~%?%zTS#-__L~`Mi8V{JB z*}JhdkM*~s#!Ql`bp1`lXds#hnUVWy1Hq%Pgy5Z(=+vButdh)QLNgs9%=^h*C(P_4 zbS1@Z&|0h7Wdy^{ex4nDy|4CYNnb^wWTX%rpN`XZNAKt6m75;Tk|Ez9 z+iIfr12o!he+99=kf^|Ni(Binak}r}IO}g4mg#Samb%gVw_a;A>0gH(@|SKX`7M#?a-)JZ3e=&9h`M=-*588nSJCZLpM zpHWs&J&-QJ12kC7L7Uk%*UCjkc6hbV zofqwyP>B*)s7!SQ2$3#OUJt4VGLIod3V{CP!1IMtpw}z; zcnT;n7MyTH-G)Q zv`l`c(M@qZb}iN5KIE~yKEPZ*8{q7NUG)9?TV1k4{=9|HOYLDm9eTcvljVyE(@HMd zF>@nyTL13(?mVNL!~WzX`T(5k z8KW}>-FOkl-izmMrExm}`6@_D!oWiA>x;`5i z-1Ieo&r(iTim)P^ZGSg&1=#|!tFNT3nXcUVCKG#@y2ECyzrhsh72p|SePO8W-k$1T-Yn7tvwa^Crq zBkx2wCA;5lx9@P9vP{=ofXD{=Z7lu`S$x31h{_qaA`ACi2Fb@`gaMR2^>j-4#PFmt zhsrC^E%m^c9q<8Z)5moE;BYbO^bFN$$Ja-nf*zscyRjaCJ|W%Jhb0I4gmlJ zE9iO{eNB&1lq|ucCrI{0xU#-zLDDk&rMDSL#v5f9@_m;#)qx{RAh8wtUhAM;=(+TK z>v@E;O>*;QnZ-IFjopb$ZI?P3r^0s>XdsZcSu>g)WiQq-wek8hXWsBklKGYumI*$w zf!2@%K2E>4j~;5c9~4LLZqn0qT~8WLFv}*)6F=I?1G@TTgquE5YXTMpA)wnoY1$j~ zH8nW20BS!tv;`IzW*4#DKg7-AKnI2J|Gn1x5cE90KRk^O?Xt$F{d)UJkyGpw_B!%PX!Q9zpB|EHCc5<@Mf>WqD-|)4eBP!H>i&%L@pV z((i%oNIl4xny1ppdWQ#G$gq41$VeE8F}QozW#nZIQUP+I2T3&J^;;;>>Rga)S8Mg zY%De|OTjDV$Sk43CzW%+P(xf0`rs1K;4?AjL*q3Gc#^r`*^5Uk`-|v|XqRZ1=nYdN zpgHmris_HV7iT1ZbLNkY z#!iy3Ci>wuRw@z`mL$GmNH*Y~4d z_y;qxs`x+8p-r3O`cp$xZh=|OMqt4G&K#AXw$5yoq|B_hnR6KsB?>>fU~>a^W@*BU zkiz}R25igz&1UX&{#N*LwxDlWTfMmk-+fmq$>I2St(mh-w5sG#4yzl{C}s#wKVF>&{WbTCX#o@JCqCg`-kk#0OMFa5Ke} zTF;;_Sya?iuY@b=IjJ$IC^m^ViV~@mHPizUK|~=5DC>Z%_xizHXG> z%96J>_Vu^lW7gr9ur_;54LMyV>Ef@Vo*cyuP+LvM{PCyIe__1SGkBf{?=;>yCJZa6$fu=gO!j`k8=5wDH6p^ANXE7?lO7YV+M zqtD07O`C%mP1Q}Cr?x4Zo2ujbG4v#Plg{b-?X4=kDP-JP^h2Qcfq6Y&%O0b?rcHiv zOFvuG7%J!{PM8x@pigZK&l(%cBbuit+&lE~1*f}l32^4{96F)`mn4;V0&TK=$huEy zrZx32$M2`_TnBsJ0gIjo@2nVN{*Kc?ijxQRVR-ZtzgxP6unGpzX96~AL57K8nP5+x zn8K7zeq{>Ar<6*MMo+b2gfSUgL31k!TT~)p%K0H%8GfP7Ad`#nv=5*|#`V%5#?mZ) ze|vPic79xQ!sPya=qXaq#wc-`QQ8^c4gs8zltsvzO~WPN3_?4H|I+@L9szo~(O`{- z4I(dW1UwVde>AF^t)^}TeZ*@w38jZCZ(qrtXE}MASG&*1ktV60Y}=)iwnlO1rdKz0 zi>yn~tSx+nk{3eg7ohIAk}-7!erd~zh~IM9%zuEU$#143LZHI8!pLGIGrLcd-5vB% z{suu#fKBh=*a5_vMQu5gHQ<0UrR^kaQ5?6~F1^EH+jbvjRpa{BDAVlPF@eThFP>o? zDq56d>ee9Iq`+)9qX9w#-$x*s3|<;*X>;5m+&-vJ8Ea4RPukOsd%uJpr9Rcyi@SAD zkE2g~Kj?fVGT6njbRgs2M>ysLFFl9l9O$3qGkjmL*vHoVP5X|U_HRC)@K?_Nwfmia z|VEK(dxCcrP39P zq%}1UR!d3QWhwXF;SnBQ>k-cVok#e`yF5bYw>`q|)_8;&>pa5WuTB#Zd6Dy^TwCuE zj@+FlWbr9a7W;(t_we4Fl$Tef3Gegb`ka(=E7OEIy!feGTwE;H6p63phzH%`oNDor zqO?`_7Kt0~_WDykE1Gwhi*qwl-nb=OvZe5WTaL6odi>GjM_P-XpSE^=c2!6XZSy>O zd}sEa=|5Qa%Cy3~Y>`jRc>n2T9H)AnM{b=|cu(Ng>rJ+Z8VIdKO=rHvwY?r;_ER2V zN5mu4Jn0e6{F6`c?($6Dffw2B5$=3CO&E2HS-zA#JAJ~F#YJ9E%DX>=blvZs+~5(K z_oWH1m8N~v==1VoGcS7YNvnCn<1G`p1>zBR%KJY^6Q1*>W$kf!*NWwC(Hl(rtf<%< z6xVO(;;U?_{ItkId$1{3$ffM#^CZ47QfL!@;+nx1N`-dum)Q7D&OY%CtY=7t4)M2i PCQz6pp2ddkw*3DE-|XA1 literal 0 HcmV?d00001 diff --git a/python/prottcp.py b/python/prottcp.py index 018cca9..6544f3a 100644 --- a/python/prottcp.py +++ b/python/prottcp.py @@ -424,6 +424,10 @@ class protu(QObject): # 0x36 升级脚本 # 0xed 主板升级 # 0xee 小板升级 +# 0x40 电机矫正 +# 0x41 小板电阻矫正 +# 0x42 小板电阻测量 +# 0x43 小板硬件版本 # with open("file/judge.lua","rb") as f: # send_file("COM5",0x36,f.name.split('/')[-1],f.read()) @@ -451,18 +455,32 @@ if __name__ == "__main__": # u.init("utcp:7777") # u.send_file(0xee,"file/JQ_JCXB_V54.bin") # u.send_file(0xed,"../Objects/checker_gen1_app_20230602.bin") - u.cmd=0x30 - u.cmd_no=0x15|(0xaf<<8) - print(u.encode(bytearray([0x00])).hex(' ')) + + # 设置电阻 矫正值 + # u.cmd=0x41 + # data=bytearray([1,50,0x00,2,51,0x00,3,52,0x00,4,53,0x00,5,54,0x00,6,55,0x00,7,56,0x00,8,57,0x00,9,58,0x00,10,59,0x00,11,60,0x00,12,61,0x00,13,62,0x00,14,63,0x00,15,64,0x00,16,65,0x00,17,66,0x00,18,67,0x00,19,68,0x00,20,69,0x00]) + # 测量电阻 + # u.cmd=0x42 + # data=bytearray([0]) + # 设置硬件版本号 + # u.cmd=0x43 + # data=bytearray([1,50,0x00,2,51,0x00,3,52,0x00,4,53,0x00,5,54,0x00,6,55,0x00,7,56,0x00,8,57,0x00,9,58,0x00,10,59,0x00,11,60,0x00,12,61,0x00,13,62,0x00,14,63,0x00,15,64,0x00,16,65,0x00,17,66,0x00,18,67,0x00,19,68,0x00,20,69,0x00]) + # 设置电机校正值 + u.cmd=0x40 + # data=bytearray([0x01,100,0]) + # data=bytearray([0x02]) # 上升 + data=bytearray([0x03]) # 下降 + + print(u.encode(data).hex(' ')) # with open("file/EX_Coder_Test_2023-07-6.json","rb") as f: # json_obj=json.loads(f.read()) # d=scheme_to_byte(json_obj) # print("len=",len(d),d.hex(",")) # d+=scheme_to_host(json_obj) - print(int2str(20)) - s="{d:03d}".format(d=2) - print(s) + # print(int2str(20)) + # s="{d:03d}".format(d=2) + # print(s) # 开始检测