fWV%T6=7M~v~ zCfun-%SO@XatoXg6P*wt(TUryOIYkAZN4gK$<$atTOzFN64!Vi{S5@@ZL-=U(OH5W z+s^}rJ8zB)RLs^gwy{BKwd1W_LcfFUVpsW#gvDUCg4ISM)s;IYY$5CDEew+zBXay;H;m~oa8>QC zZu}>K#(oMb@T47|_Tf@9Yp`2Zz8V}pT!|wAk$>-5rEd*7=58G48BOmbtV#*PgMHQ@ zmgMR*CI7~4(Zvb8H+}`oIAvw;U6p%N%1l>od`i}YII _sK)X9SKiR;^gj1OF;k03`jYfX-pvTv`{~PK)R2 zv3ExcL4gWl1Ymc8St)C<1&b5vx_dc@fq^!*1BY& Gqd6zov}|W0vvw`bK}vf(8D{vIS)o{`nozzRt+9 zrmmjILwE@HG_@}4>}u-j4EyKr^3U&$HZN;huz-0ZJ>5+q;wo!mwM({d-mr1)cESmv zbR*O4%VD^hTEjieVY%D8I(PZSt*^7UZC7Wc+27U~1%<~cgfRQ5MkvahI}831avTnK zZ);ai)Sq0<$wh6atWB`f>H@pddRg2@sH)SQQb}r&gmhY>6~oe4rLnWQt8Zs}1X7$W z?OkE0>T?QJ6`qGeZ5`dAP^e>PsHv|f)Dhmt9KF8(DVlFb47=R_4e%jARzCp7c&K-O zZz$5!)85t#ai>Z;K$FN$V434|F{zzq3l8_}YGRH;L&!|T?q!Z5BljX|JFQFNPAzGU zepCd@Ok?tI1@ZUd{__NuNax B ^zCMZnU zu)c2f`T%n?-yT?Mxu*D@fvMi!o~BS+GjmOK6`+Her F~qa}|jvhi3+n zrn_l8IlUddyF%@ePUe~+s4kXGVqJcd9GJ5NFp@*D?+t3BH4;V(b8@Lc=50cYc%9}d zaS_oHJ?5J0`Vk(|nVYmAP>d- _n=990|G)DT+PxM?d(iz8_k z34t%2$}e7LGyL{i>e0Z@2*jAc_*SG7q#bXwFEzSY3^ zT&sKsNfstF=6YO20D3jt*^K<@3Z}h65?CIMAOa^*#e^FL%%rtMAP9m zGpC}d%Jqj$_A;gx4o+=+%6)tUSJGwe@`13^n~>(Fk4=leM8{d!(1EF zTS#Sz>g$xqO#)fq?TKJsqe+^%8YcY}s`@93stVUAa1W+Wrb$}Kds0-b%#%1<;AVlX z%FF)@S+FI24w4Jr+U1eeq*9WpWRROY{P(0R%@b)Xo6L1>HD3i<#xQ0FWI2_Cnlpci z)r{=f)bK?tBcxYtK>P$Z+u=({5mGhPHNik=RbyQpvW^HWO=?)ZF0i4o0a-`mgPUco zRn@EO?2sk?czCIh)ktVVVYXrYrhpx}$+Y^qtxUx(5!O}L)orLz15gDp;n8wn%j!)H zcKj;b`V9>VpB~q8V*mp=ZkLCda@4m+BHhf@ 5i$3g`D7w3h)R**G@>ta7 LMSh-= zCEK_i7 0Om+H{AT_Jnsu z!~&QZUo%{^A)t#kA9NWf{{{+4qrVY1`WeMGTXM-BJv+|mgeI8LCrzg92VL8A%sk{( zCifY0qzSCZtGH?u7n#tnO( 12BK6adFpWYLJ9$kjW=#CS6losTko=A5j9F6O-Ug|-cH@Y^fAz_>xfXN~-)*JJZ z^jL3HDLsn*Rn?+xC|%^W`ncCtqbup619-Zm-i_L8MMH|=1xaVpjx9!pv}3!pW1IcF zh1jG+r76ALaYL3#Luf}zSKOg#*w+a|mZdm!S&Bnfq&jp}ibI2OhtAd+DydiJNhN5D zOc%X;qsut?d0UBj#sf*-oM$Yvy}3r!dP`Ok-YkoI^F>9r^Mmx}LhVh|N(eUbeU>pr z>O DpV`V~8)DX{oKy@dYN#A#&7v%g=TeoEW|F<3u0Di) zw(*cmTm>?5WgAtJX}e5Zxpv}emEo0V_i}Th|L9zS21`2>HKn3-I6~JqWC2D00RvNb z(KL$e Q0yP2;g79Ze&kbex6L7-l$)>5^VLD<+@Ib3}5km>F&B zhzL8K#&YTDN@<77wxgXDi|AA)Bo30xViuqiAG%iQaQHlC#5ptzT%MuqC=qsCE>UKb z2!CH*sH`XvT3%kJj3^OGUYRL%^v@w3WoKNekUEym6_dtK^_*d0ZlUW9S+FTc9seVf zMlJGJQJ$jygH4sIOEHyQokH3=PHdSX0`Qv3!S!HuTC^0D*3%5jj0?hGI_{z?9%7H= zD1$HLBpH06Fv;KxCAPt0PP|Z|44xwr?u8|))1+}fQpUAT5$X3`m5rMd6bkJO_hL3a zD72yjIlA6brExNdv!4>-sDt*Xl>Kn9EJ>|{kJ)O`-r6`=E2#w~Ld!!1QcJ(o^3W{F zTsK85#Y43GHx8?*p-VdPQ@Jt;)lU&YL;c5$FS%uR?2z_+TiLU{bVMmkE~l#$YE%Cm zQB!^^E4rvwc?%_nApfoE-e$%g5CPiSAKFC|)gB+EAUdn0Ynv=EyuJasA}aUTQ8|}r zMu%SMZC7=QR2|t7QMJ WOr8?S)Yd!u51UO4oC;KwCw5s;!266%ewmCv{tN za6{K>Suokw)2VHRo0~(lSQLj;Mzv_po*%nZRpaCVySeHTm3~V;1ENv=m|R0zvh^Cf zbrnM}1oD|NRfr8Maddh`mvM3$&L@S(ruvmwDW}MmGew-ubapkv6~zj 4E*D?<)o?y|BWgF~4RZ8>A>_s(W4>q+&!kualXn55Kj-OW>CxvF-nM$)#EOf** zRh3;(p28?ouN;en_8=#QQI3u>Se$Llv2s18HPy;Ca@;;FiXFww<5> zZeaGr^ uhT8Lmpuwm#bGAsEt=0 z?QJ{DT1iYtxE-fN5^m~=VgubPA1Dn0!WFMA9vL@Sn#$@J!Cr%VU*~3&Pr-`>vx1jX zahRJZj5XZ5n@B~HR6&LH3!7%_KEOS%pXRP8_if|+H20q1`7d$TW$xX}bN6!BX`c2H zT~Br@0m7ncH~!UY=&|e~ssvX;JR7mJy@5m#3fL#@2T3`R!#T%X^wwUDgR=03@jI zh?czDc-}rG(Y?(o=b5idvHh>{bkh?B?;h?M&x_X6!aV&T=xy9|U_ym`(A?$vJona- zk<%- qU`S#|vK~ce=On%qwtb4;Y^_y?$=>b5ARG>k6K_aS#64Bsbl9og2$q z`BX<4?EDo^r_xxqn@_cV%gt+~h3gd0bbUc641Zgfd3u!RujhI2^%0)88;{$0ML$nF z!e=a{yZ0KOxtC8q#S8j*W*@ZL6Rob|3n0p2_V{hf3e9ORD%CSc^^dOMrdj-=Xt0H+ zyZS`uWRN;8$Lw70Lv(yvQQfX>=(cj%ZN$74%*uw0Yh=SD*wALj@;1?z`A2!Bqa>Gm zPVux|+ WiFHNDdw0?xQ^4%B69X{wwZpg)Z;# zyr=jq;ZT2_crJK~yU~q~k6@hne@m!sHt>`}RM-d&aK4bIEfG1*VXpVbJL3^)jb}h4 zm9*`YrjWtXU*~DBa{fFwN)cPgKWaEcxfgkYGNDqq4k=<54be+{)-|39eW{Ne=Kcha zrBB>O+8Lg|pAsG4X7>Mv8>YwK#%)DD%kvOFU!^dZ@f75a@Qfh}-x)}Bcqm@SGpvh* z$bE?CU*VZip0SN*nSEQ(#pQgenX!du)6ki|jTfBeWys7&C~9+#aQJW8QJ#I6moDdl zXL ^eMTx?4nAH}v&3Jj zX5a3v-nM=7dn2v$p=-rF|H{6$_Nag7e*e0*&c`>;-~7lTe|JyU?nqPg0r^z|W7uXe ze4K-?A&q^0uiJWw=677QyHC8r>Y+N*_nf09!{yk19^7$0n{ID4G~cCUzSNzL=G&dj zm%0Jde9tEHrEUr}Ut=;~>R#IBGr#8$jJCb0CjmB}qbpfn>Jf>}XI2|Y@>0))Y(B@S zWO=EFT$(SX-PDsho6mG7x0`yxX!ALKD%+)%CS9q=p@Q%6%yW*Q*LBWtoH?K4o OY `7-Nsr# zvW)|PmdbW 9CV+)wqvp+=#~glg44wt>mQvl6511q^8qxfGS&? z4M^(J2uND=G9bzK6AfL{kQ19BN&OwRITA9lJChKU6ko%c(A9=$(?x$CXNqs;u*m}i zaf**prKA!?Qc0GC{F+*
Pwu1-Vsn%baoTQsy? zQ+H@wvxZtVwO!-7H5Ap sKyOx=r1+(xW;`}L!Z;slN$GuhF;OsFKOH< z4Siixzol_!HS`@#J*RPRX=p@Kf2eU6HT0gQUeUPsHFQ-|KhU`A8v0OEw !mwl|_<7h<3TLoAfaVDtjrcMFJ*=TQP8+vULr-hypoWGt^eqkjLPH!4 zOUbh|guh%>xQ!b6iiXZ;r~@ZBvhEi(6u_IPY0%VQAq{;TP=UbxH6T?( KAQt~G>^b<`T)3_|;PT6jmhE@QQbvJ0-%NiQd)GHdAn`ui~2T0a^TH_9C=$NLS z(YXJvp*tFCK#rAK9RO4&JpM@yeNRJw(tMPGCEr2~)o7?mL%kY04@kB#s&RkNP#W^H zlvkjk$27DCkgVIPp)(qKU-OM>=nonyK)#of*8!4Jnl-LhLq{}pLPK;kChNK|SID{# zXlT2Jo&_ZNj%(Z(G;T!W{zc>NXk12~U3W1c*~WH_+oPf9HT9bs_eYKM;y7GtFb|NF zvQ9(Y8p2Q&%Qugn%MA86z{wgkP9GAz@7K6mjSFgAyT)~E+-EiJa~k&@jXS4tA84GN zF%9vmS+?uLibv|Q2#~~8YTR~>+o5qsHEu}bPHEiNHSRr)yP|QlzLIUwNvmvk9w3RU z(6|PT+oEwtHEu}bPHEiNHSRr)yP|P-G!Baj)ow8$*>0)Em9@0tqds~4`xs-pjQ9a) zlfnxO-o|1mkudRNY`3Bs%#RPP)I& =pycZvr6)QFJoLYLx{?|2^kc z9k@?$scM*v!9)LxM^#E-^(r28J$SyHK#7C-iU+{}o)vLI0yInUWC|Yo|2w4#R0) F&YjkS(clHYe5Uh;%e{?@#54B=L0j zMSE=yDY*~yvgXLnzFncV&Xz744)5GaXIqLA?g@A9iuBr#$xrQVoe`VTi$7S9kyL!( zzyTZE(i6tF0g11ARkji@rUjhz2Hd8q_wV*2z4sTe_z+Tj6`>y`Vf@!Cnjw_%agIRJ zDH^^giZh5aJ4M=?^x>UG;thBF>#+oE(&uq;iHV N5?CmW_u((JQ4@x`jDocJAP zTweU!Pc1Eu`hU}jQW^TtSAN7RjxfXB-Spv%fSV)j5qt_xCzJG%IKFYj-xY|b)(F03 Hl+XVM?KBoA literal 0 HcmV?d00001 diff --git a/build/list.o b/build/list.o new file mode 100644 index 0000000000000000000000000000000000000000..f195381c37955e6ae780ee9d095ee57cb6df7075 GIT binary patch literal 4621 zcmbVPU2Ggz6+U-o?(R72U9W#g>?DmQ!AV_+*X!7EoHQYu#7WkQTCA!jLJHc-qUjKTqiQqX=UIy_B z^1=!Gmmix9BLEx&bdmQ5&)yzX=OJ@(Y H<62gRQom>$>A7Nis2{h zO`a5WKRbf<-bUVx$HS`Rojm1JKCu+`rluqMJl6h}j6i4)<2`jc0=|#6;ckG(J-;&E z{Kfgg#)pOVk8_2M$1=a5!TX4s6*ewED6D_=0kjiuQ2pM4!fixu&u0o786m!t*94K^ z_21^c^qa7u!p8g{vIYwqZ+-OQ*47r9+eCAlfw>D<%LKIv nAFaD>+dNlpIOYkg7*4r*&Tf<&wxN$M>Z2{Ua;`i+4&61Y z WJQ4Ez8q8mJoA zZlM(S8pSk)stFb^R}BXeTB6pl7j==f?UuD@n-$%%UDWW7hJg4owLrg0Y4D$9B9>@X z8;+|-o2gv1R%L6Fx%LyJbL|6>CoqzPn%LGz_96;0EvS2aRV$5lsb*q(b)nWUu#*{8 zbkf7MV$rHMi^XESR4lihV%=B)wUs%BF1z+)_EY@!{0zH+BU5axwu+|X(71s5>amwm zCqWxgP+uFSo+f>ZhO<}(b%+ULVRQ-9hgg3Mk3X(yA}3D)V;LJF *b z?Ip`;*q}Zv&G=211I2OK*jF?c>rEGXc!KqjLmyuD@l)(m zUaXik(=~z3#A!QGT9*Z|m%f2N##GfbDyZI1mDmfA63d&-9HZqOdqGRvjS4oul9Kvr zy6Kopz^;1rn>Y_IBhz=*a-GI1u&Fq0WJ)u#KyUx*c$+%ldGoAK`__ACHYw>M2S|(k z#UAaI4Q~3LnhvdXHWH^pgwhpRpr1UR3tm(sLs37U@%=zXY*3@wG;NH&w~KiG+0+h9 z{i N7911ZLi692-H#@5JCl&30*30@5nSD58{Y=r4$ur4Elc$rc9}lP$D4ML!_D|!V zT hV9#=12I-`$x(Kj0{Yh|=$R!8wH$Q{=&wym10msa)1Ec@#9(d$!_dedp#GRy8G z@}~?ifPvvnZHob0(Yq7c4{3Zc4a*|P{XKXgop~;HDHV^+{0`Y2p0D@!XuxYmdE1YL zfOjFv+kQ;>yr(5C=->9k)91yWlEglYK*vvo4=|^i3V+A^u#mDC?GYip5=dATt5Xs8 z7+R-_sM7^n5%(gA(WO~RG=@@3HzkQ33?x0!(wIu^NFdRUkZtKUCAIWqk <0<0Ne-wCkq2iThdb~nJX3l`pMWctq*z#{AHT@Mz;4X?sLhZxS>ZmEhO ztxCZW1Q&B!e;wp$tkFvAAm2oU)|5oTuVr$hFgmF?N}UvbDbrb@5OG@yzmjoUcISj% z$T%g)IlIjYK=^e`y^tJw6L(TJ^fIOyRTx>@nP?^`;fanMdKX7;@}zr(GEB4r6h?32 zo#}NC>cUcCw2FfhGa$d^N#sFc^cLP}>W?0$TX4>MwP^94SEbjT!rsR`+GlxqdnCZM z0pdPF8$~2S797)GVu%s)A(q*SS!yp9EqkHi%SNe0S1M0qIEKAww)|?%vQ1ycyA{Y$ vA6{Eq^U(#zsGH)CQ}k{W;&$O(ZG yw!NogMiv18@vi literal 0 HcmV?d00001 diff --git a/build/port_self.o b/build/port_self.o new file mode 100644 index 0000000000000000000000000000000000000000..37fbaefc0c051489c72ca5ac043fc7933793bd5b GIT binary patch literal 36697 zcmeHweSBM2dH=bVWy^A6OMXeL#A%f_X c@UfZ%zU>j^~-A1=`Fb0JU*h;hSbI!d- z=Sqs{kL|DDC)XeAKKFUP&vV|-J?A+`N12 v@I)(DC6VcYq}leh!- oeB34p89{w#1i%{*=u6%$I}-ZaMArcUU#Vp=fIQow;4O2hU)-sWW F_N*f6L^6Z|U>5 zOuCo8HnTLjd1lG~O5nDY6#i-Y=za{(w@wZRmrgBx9s-hZ!Q&(i-1zkH8@})x*ms}Z zO!PHI^M{Dd#fF){<0CtF@!|?B`Cp#-vj0CR>fz1Zk50O~AN4yzxA|ZGvTuXi4u$a2 zQ=X--EIq}Of#lxme}yNFDvv2?QJFM%;5I9yEO0CP)EQiXrKbY7a?Y7k??NWHn;~Bl z=zquDQrNL{3Pm@7;u`QQJ&6)?{24{ql%85FhrjH9g~UJDg2V^j7kKK0)&S*!NTha( zKdjtu7`V~@igx3hUTL}h8 HMR_M|n~Y z$0dQs=X0r|8y_go7XpuSvS?>`I^F%K)dO7jqo+Vo9J?QVGH_e?1u9=^D#4|%dLE~? z*;vHrIE4LXHb@_G=HWT#c^s|jH!!jHG JQ*Xv5}u`@k({|If(K={sIM zbLOQV;X}` Ns)tNI! z3%Juj=_MMtt-l9B2bLTjuJI|z8P6SA YZuP&=(7wSu-HiF;X3Q7V zK7=&uo`0-98$B|*t#_F& d0sM7lmKZjGP1f$!+|cj)&|)EjQpJjXeg z1Ltz!Tn?Pefpa- Wk=Zo&CVmY7L$MV^N`wI8Q%r^IYW!AlKV+BrsF88LY>vhssoL$ed x0p<2 z>VWC_Ofp?8%;aXJffsMN>%~uh>ieI% ?#m>V@Sa%4TVtrJPI^D_tyF$NH*$sfEJC)xC&~zu?FRg6Qo&3L- zgQh$Ah6AAK-U$aYt+dcRhX13W>0ZJ=EmY9`M*N=uP4~O-e-miBe-X~;cY&t+%UDgg z8?<|SDxaGzq>J JV3PCTT_>A5QkMU;HXy?xfby;99wkscXgD`dqPN;BWS zYo{WygV$1x;zsF%qHJ6(T3dQ9Rc0-=_I$B0>*gN|g$k0A&A4-gDkRpLgcz1Z(nvxw zJ@7E>w6wHW=1^JPCbd>BYPE6`t-=J+)>3t@oK0nrJGsJ4k+pn8+x!byX|uhG&vq$H z<+CKORLcwLDm$vRd`5G81bJ_}kb?ZI*8UvstRtUB-Opr8so5-R`JCqXcN9sh;O6tG zYBrfJv6d$U-$wkoR3VcG_DRiYMLw?}UM|C0p3*wD;&}tth2m_ne3G?%S+ni~H(;l5 z^0{MB{E7(LrrGDGlj((Waz1r}wR}}@S7<;M3&)d4Y90-LCS6>hJp7tw`!~eQVTcP0 z^NREtAssNJ^TmQ9eO5@_x|Fp%r#Y`iq&92zboFE@JECB}F0jLfh_(E=);k68Ud>+O zXx4H{bG-qa{lv-7r;tD2&<4_!O5!YV&hvs3r7)A#+&uDep^RGcO>NCPfjq3qa-5&m z%khu3jZdO{+H7CKXQwDfU8oo03Y58CtVx~aXn8<$3?gSbWPNy0>v@3}t+f27S`ROI zW~HVB3(2ak-tsZc^4AD%MKv`W@+N~m*4FZf=D3LrE{0Nt*#%xNKB4tcZ3NFt#X$x8 zNx^C%Rwf(eutx>2m05+Ymd7;99++C`Zuz`s`A0pL2%oilLF=SvSQIg0El+D*FM(qd z_4A9GotJmVVyzB*N$>`cMMbE#+3w??RF7L)+f9w9s~?$6|J~Th!K@^2Y?xh?Osbta zsO#N$K2Uq^ czCWhTb_2LwB)T8} zJg5%z39Xsp!ZhVXYwJwDm_ikIwDKtGd`B{wn=d7kNu`lkDh|q&Hrr`fa&}P${?f3C zwvnuytR%DLaz0l taZ<73b2>*8a=tgYIVH7jj=v#fMV9RPNG?Vfp&UX+xzaq zlZ~yiwb|xDS#%w%%|ef>?*UZP+OBl`HJ *8=`?`~4 z=@3`i+c(HZ42G#G&fVWPNJBf`9NG@sKZvLY`q&yuF2%)^MoLK+W$ghFdLtd6bhaI_ zOe6gkKBTPVv)K}BD?4&Pp%=pEdDr1%E#)P1)G+AsDM=@K4?${4MgtSRP>i)-we~)) z_z_ZkgcSKpxHoy&8%-oV-b64m!5r-#`x(gk52s7jiG_LAKH5uN8S9VdX8E(XgVb6% zz>}`#(A3&}EAN1gjdhV(dk16ZqwSLg01~Nb);@k78C7|_FK6w6F0!Ty;<@XxtUajn z$8u%V@v*2s87yQ@u=WEwA5kGLYd^>t79R#mK4!aZ9Yxj>iXMvKbz*zJliGsOo9VC6 zj*ACBiYT_(=*?=#7RBqe<1#KYxFv%<&e>hm^S;EB*ZQ}(0anN^iq~*Q^gNR2EdCzu zxY}Tqs;Fgrz|;|Qy}%QkELDwHWJlaZZ%C-l=8MxQ%v9(#No{eV!a5RqijB7?di%m` zHp4n54MDDutLC_x2;$J@S49vt0k=nEF@cy`LvL-29`%u;7(}*M#Ym73^a38#8b7n& zsqsAQO^#0@M;)ELj*XqD4L*!`M_6ZHzo;DaxRZ7E^EY)Xm+oSntN3FZf85PFS35}+ zwS*eM9+14Mw=)Yj-8o?S4))HqlE4x~Se@}MqFcv_;SI%!b&X&hCe~OuL9A)PItEq` z8A^sdhm+CBls}e?dkzIB#^cQX$Gz6knmjmBFaHx&o;VT>dOe|f%tv+1L?juX9378E zCZi%x><{P?Pe@madjtNkKdy@(RE_h933)Q=kHsSso=`AxgxUX8MNwls mJ0uDBU~mAwICYu95I>yoQn5GCgKs)Is+I_coN9cCsYhtKx9fHjOxMc zPpTk2p1QeE#Cxz-08gnv88?x6qy7NeGjiH!e$4)P6+VF)DOG|K(MhE~enAED3STqw zbc3u(ZTw;bh&MsmLcY`>ADxV$MFhtuA~Dq002*r`5<=ViasyIET87K)Ur|x Z_l&_f}33TS8M{3#pj4GX+@FWuc313nKBa`&33JL^A{V@QQruSTP`Isl3 zi0?*)r>f5EUsqAySTLdVt%;atA`T8Unm<=@@gwnsKb-VTd5(l5KGd>Ps#Mgnn(!Nq zLR3zkVqQtnzMgM{#1h`*l; F8u4fjU>KN#9mMyfAf$KDe^~ zg$m%=T?hC}6)+h`cRi8t$HqKfe;x3zRA4CR^M)dEzcGljf2U3wiTd?-p5AJ|s{%%; z{A21% COORPf3rL= >B}5WqUhhF>|Mz8Zqmc++iAFsC Vt^)=|#3c03t<~8Wa@QlJ_eaZ~0)|;3jDFZW< zwAY|SvpKSYmw3x-fn#!~!!54?F4G|@dFyLXk*N?W*4Loo85={7mN=3O1ml=097#$W zc(a4S>}|h^6{SkG|G(%@`Dx<88;tEW=tT};Dvb$WDEN90pZ1+K6&?Q*Yf5VDzlj|s zRh_?yz7qb5=K4ls P<^26jbJjs zJquz^(5GVf1kjjVVmK|v kU2ZHXiKt1tjSiaWRt04aby>pX#=8r{? zvzTWFCKJMua)FMGlD-^*iPF)%XYN(v#bSo|B2+MXIqJyu3bHovGa0);fynUUNuMX- z(T!ZFAfyo!VnZDQlP)g`hWb<8#>Qn3{=+)xA_bHP_+w#Dh#CQ=#AtCkW|M-U=)$L? zWE1zA+BYj0-Hu)q=G@sLaF!_b5*`#n!V^m*QKb-ZKU?w4nkU@k6aOMU*PMVO`&%H^ z-VB1g>CJVXUH?IVEU_roZqcm>hw;i$?k{#@P1hTtx85ju-r8IFg4LZ}p7o5auL+Xj z$xtFF%=>)^%n_W*6%tq%uZ*TD+2rxz VEU@k=jr_k3xRsNh%E>~yCiyIv^pGUz&8I4ru~fQBy9c`GHANIol`C_pJaZIO z?nF`YCtDP>XEvA5MyB70vj>>tJq?mrb|zcS7SdVfcwQCi#&$Btc8g*y%zgXJ@vzE_ zS2H?1NE gUm5*t*MEek)nGPQ7~8# z7L6QrtZ1t#2L0F(AtiJ5l6bY8E6ieLuw7A!XaDa)wm|C^5NA{K%yFMdtTV$lMJHBD zd$Iaa$mT~EW{`! {6t9x&y`HG3L0}B+2KHkMS(F zc;u=lnd1xHidsBd#;S8oIPXw|NK2$dm7~HOy-r0i&X=L2>`zr$96L#hvpn7Fdm40j zHJM4Jvsm@R{sPC63PHxD=dd(S3w(~AUPW1v1jG&>$M2j)?mv#yGRNPaMT{C>P35rV zfH^#U%|i$;;1Cq%_?Rm8rqCMm;cRuTnDL^yAxF;ZSJZjc38xC!X#&gdP(=hc`V5C{ zm7;|F4P^5r(wH&vv-vDKH@*3a;zoeqP%%@fT$Q)P5@qAI)rwh9CR0w7Q|V)9RFvFu z5#7@J>Jk1E>HI 0@>?C83@6@w>V#|o*fJ?!9i}MM- zAq;U5{m_QBiWn^+ovl=YSfG^AcvuCDr7G3fLLoz)w4;4cQPpz?c8&hwfGVb3pGF=` z<*IWN#aI@VqKq;;nJ9WnrF<@(qI!*Y9CLK6TgCf+zBV{9845Ay%Dy 1kBlO=2H`9PKUxIj!`?DPDKDKyf R$h~y zS(JnE#$nDistf|&KCsv?6SY C@PoEIp3Uv_$7mN_r1XXzEsxj_g-4n^aLrT%Jn zZd9`&8uyB>n6{iaFRB+|Xkn;rGRuO6XdYcAZKl9UMb6DlrDNsPJcL`!LSH#G>nj&a z%(>Mp7|j(j-s%bFyx7dAY|fTb7~xcybDJuQW4}QzjV>@XgTV`PZf_L&a;W!1Iv zk<@D&}F4Id`aVpBLlvG&Oyr**k|-x%ma-98qPcO+sAvE^+QuQRsLmi8QWo?otI% z7q1BCZk3G+v5?ABL#gWGJ*rrF0a1*_8^n2u3ZZUSrsj33#Ow8qVLRBtav{&0d+Q{q z>UaZGPx4KQ&P(g0r02sJsEB0jtCJy#^LQDKE>x=+zd0{!6i*jNizwpD>m&*6{NjQu z>IB}oZ2B0NTv;axrKYop{8e>qF$6GTu)j_k!uB(6%~L0cr}0k8k78r8bF@x0UM?<_ zxRSSCLXAI_H|LkH87N16s* R$F+&1%5F TP zpsP(Fv|>Z7cYHCEoZ5{65G^Zil8={j(twaBO!BGt0Z$p-U0!S+c21h4@spKmc3$Wm zQYFC*O %k{1xE^jJA-4DRTqby!72bLr|rIh(BYvqzeV{e`(2;`PlC zyf3~+NchkOo;dO``I+ M%f8@{2OCMSTqox4J*=f| zY8NK&hZ0GDI0{!EC;5O%BW7?XYvK3Z*q)2$*lyO!?|Ye*?$`{_Mt3+{;13{b6y6SI z<2*RYJaEsk4tj!Pm3-nH0?#4qBnq(!df }I_jvX}J<#$MLX88Ev_a6qjlif Bj^7hzqk@ja;I3rengDLL$mjvTH^F=cqQ>$Qi%c1qF=BYf z*f_uQt#$z-;o~MJCi(0{aKQ^n6AvOLXS(V65Q0I0F$X<}oM3JaJQDMd;kyb%lb1Ah zh >pauVgnLH#LE@#8tnahyl&OL-*6G`K zzQU!Ejxk>DJK$C%m~a$mda4h{`cBsiF{%(UF^lc{-SvugG+VCF9{0Z71&v&N$k_Ke zRVHKc#tRh I);bwQjl89-FMqKjiWQ4h8IWz8BJpI7 z=PKEFu5gU?J)#JNuSu0wwl`JV$@>0ys3xh`gLr61O&p{wHOlp8^#T!`KAGqn7*X`X z7^@<8k&p0mvA%EWGQP(&8DGFitbCFtxaE01vt)g5*x7fIwv-Blub6HIN}52En5Fr$ zGw@Cr@1`6TK*|L2 >Y_kxvCYWa-lPflZ&6;3`a+z#XSk43s zXEV7J)wE_7kLl2wBbCo*Xr{sXDm#^|hK0OR|Gurt@cNv^6s$F_b!4 zT&UHvAE~lYY?>yA2pML5ckEWw68Hj?r;s6&>8vq=@B6t5iIhlP*5HXfin=dHN61dm z7YWM3`nOf_WI2!a&HBQZC^{IPWM?tbEo9)RDOAW++4mV0keFMTpDv_wd3b8!%Hf&h zc%5Rwhbnh65X6!|umDF6&3^lCRsl57Kt_oey{Jm0hmM?oNHXgS>{Tq2GX^sbIN^9t z`m!qXl<-~Ed2%PtEmXNvrtck>a$W8^4`OC*YD4`WRSZMu<=>p>pH_Y3274##-=aFZ z4Zcw#{ohihQH-y$Xbbe++X 0x9*x-k#^XvcpI&KgnOeG0V zsD5rJ={|u;S`Oh>kE@>U8bCM=j6@BpuIw5}459mf(OhaM|3vk3*OcSr&gj2gbz@V! zbA<)4KcsrF59P9phOu8Z7oZYsRsGZCyNDMT%BZFN&({kQ_^wyB%KEQSoz^uCy^rWW zql)PTh62ODWt8 lGVG^(<72qGQ*q!iZWGR{umFFrN)6 z>%{7p^*TdU!i!~%YL*Og&* W9_3W0FDfQ) )JvRlZ2KB7KwUz>hDK=$q4u*sVJ0DNMsjzj~owqWhZJ z>QkyDmc^H~Ga@E8slIt0NC+;Q)ozoMTz5*0rXaaaNbsGWFqV;%x#~=EzH(wdpB% |jqY%A0Ud9 cRrBLJP6USyrN25mogKCpos z&L*lYED!vm5yRi9yz;VvREKIk5yG5^z9^2o(FHyl$cf5iL|SjI16SCEu5gH>wiy66 zaIJlS77co&h zE0)=8B5 z{9>I*FD~awHOr}3WYmUMs#zW%#m=2-W-=BsW}U9 YVsQ! *fZrH$z@#J@RjF6w@vcYU#AFE9Qf)TN+SeNiHiF-i;L}*V0*`uP+wl z!j$VBI*eCGvAnD=?z!G=wqP#J_n3s{lDyL-GnL|dO``e|{5_MjuJqn#5}Hfy{U(`O zYQJxih$>mj^}9?`b9vrvl9>wY56q$_1$B>(sAa3HC- 04Tf$r^cJy9pegatETN*OX_ zGRR!R>X4I;?9iJRbKRv%bklsu<+@)TO7bdcY;ke*s2fsrB|-?rlV_2V9{~P?3UmEJ zN6^AH#WH|{YM5(JFZY{^VN{KMl{yGDT0L`x)zPQHCM^+(2bL34NnNB4H4S~EYLP#U zxt>@K!d#{?X}tyRadWLv$EVF8sCnsQe5;P@v(2z^xEN@# M@NU3B zNJFz_KB;v*qwXkaK @`L z@~rCc#TjL^TujYRWZH>MO19IG*?4FDlPd7zY%6MwLTF5dTz|A#DDxF0? bv`zU=kjjYcVLCAx*?n_ztZfUlj0*sEA&&3GPrNG#Q2=-3QVb*Dx$hhQ rLXTU@>yX8AlQ@+qw_-JRQb~6`4h&cV+AD>!dBtIHP7d zn$Cr?h1u#HTla^Y*~%;pHr9Q}dIL =D7f!px4P z76m`V`Mj>8b1Yz>O6}Qb6zqKAR}nrd1)#gHD(rkwGrA7pV3_OhyJY+jjTW|npZ_9{ zoY8hW-w0s`9Sy^;jdWs-w$JueoUx&B=|mjuvN|q5pyMy0ei0pDb+N`ao=31q>z7O> zH_-WpNgQgJo|$FZp>8_8ro*xyP`WnFV;2q6?yx?G2RdtyuI)JIgf8uFD^4!l%uj*R z?%)TRwA{|0k3(e*ox{{}yKM^&U1ZvOJ818C%kB9sRle0w-yy2qyMk=A+#cO}ZL6?~ z)mygp!|H<_hUj`dNv={Ks_KLIQ6a`=2zH+?;SZ0g4`0?F$^`pM_2HkD2i8S-+>f~F zMYBmB6v?z3x~S&SF@$tZiWIX?MQ~@QZg7dBgd%>mIqW?GYWdQb%pUag|KFxr?w! zw#c2guheq~M+niuWVadNcC$_8>~V2arB>m=(n*MP(W#4cX?H&@gRPvW2g^3`1CRI- zm)bF|N2e*$)hlk$dqwIUGos73(+ObWkRolSjZR~vi)s#C+TE95jS`=)Fm0w!M44^P z>7eV8p=?Oj;50uElWEB|I^U75adCr{n_*>Jug>19v$y1!meOkxj(^;d!D}!n&VJIO zopjuc@xwwprJ=9G(8au7N7vASQ&j(OGAPrc8y*G-)sGD;M?@v(n09cb@q0uYrI}VN zd~bbTFQMP1bO zy1dzF=}eC$W<2m*@>m{)X}W4P;Ta>AtIV-nWsc>lx>&9<$8wc9maFtw=0y}1 z>BLy3b?_*N2-FTV)$XPahi6oWISL)-D0I|Cp~D=74s#SbWE4iw#WVVMFAR>*F{t#v z{tpL7CUK{KcV+EJ5O?~&pm*KQI6opxe7bK~Gjcol^zYuej%iM9qpi2oVq0r-YCY|a z)hMbBth4h 1s)O&4BJX( z=@O5@-o5Yuc7Q?lxF#{|CI-68&R!rccj5R)ZmhFrY-O+3sXTURTCkS_>0XaW?SL%@ zwiwCCUgaVq&VIHDw;o->gB6lqX&z}KGktnoc~U8A{d&|SV-=+nN6kUAi>Ff896)wZ zDmf76-Eld^RF|*m*EYFCT-RE81`e7`Bh~9nfrEjs8EkS QfZ`GJn8$r}B23Q6|vTdEHZ9S;D+s%Q9Abw8-F{H{&f$tbXE{OCu zL~OVwGg%uMVpQIRE+Zz4?bKN|!x%D{Ixg|@K&4l%mysjQu4ifJ!P=psY5&!=5}z9N zruf%<`*z@n-yQRqRV`k!d&h~rmn1LQy&dFs&f2weM@}r=<2YjUkNh-f9O{cJU9M)b zGnFB9+Kg4InS5?q(DQIP7Sn>JlLJBF67NN9DbOEJ;9xx+pDQe4MwOirkNgZfL4sY- zL9+|FjD#R+5KZIjCjwV4r88-rUaVqOqEeGB;M;SH3br`?##{#9x-fLpWLXc6tLm{R z&J!k8%86&8rqehVIFlDNcEcPmVKr8lq@;i^lnL%aIX_=42pZUu#1!!r8Z6oh2~w0R zrmMPLJXPk?Wg}*Iq75|ynZ`0tCO<14D)fCM8BLg{4HaUHS&?ikRN};8`N*sq>(ECZ z=rubutF>jg_tVxDws%;yBXj)8y5jSobAq;g#@cPW0`%ry>k3PUtp_4Y=Zw{QqgAur zyD08Qj@LbdZ(9$e2MN7m#@cnG)mpXU=+;)tu=Nn#S~lX?PY~JxtM*2yKWNoHy~q*T z=d9WZK|M);BlIz4)plF0pRsn)!{@A*(#`guwU_Qy>t?!LZah&iTFV8!);%26YwZ@O z4FaV vO zV(qu}TAj9j my;b$+0MwfY0r{+5v*>*|B%yESAxNPj>5sddFq zQDjKak(M^J-b$Gt7%di)`8UBljF0kYyvAr`!sMC189M46r-|lESUJNt6!n#NJ_%vo ze6f<%ry}%aEjT>kbDNbLOyppe+A$7kl|wao6g*~4;K#D!%V7LVX zxrXZfje4 b5xO#i_19}5jZ?As-VBqHK!mXdM7`T?Ye5s!v z8Mq_5y+J+S>Ze`?&XCtn>FVY6GfhKolz08a+>l!~x9BlpyATx&t#GdWUVPFJw3US< z53?wC1?Rn6^4IzW%IWG;0eq+6ry$O_uQ||&b%Bed+ zc{%kbphTQM21=yzc~HXg-$?4eK>4_a9YYAA(G5zZauq0{;g-~upoB&kl+cKQ5*kM& zE-k6+LG9#W+ylzbsRuy`-G@O5-EV`UvTJ2@mbQ@6Pd|&;)2ZGfE {o24;S`C~H zl(4cz@`faD52)Q-;}EDzIW-MRlwe*`zXeK!`({ug+z)~h8V`aJW%-z-z645WJOfH- zv|^C9kB4!oqzaOHJE%QedbgxLE~%$LUB;!~kksExiUxxi$YMN((W_2vmQ+AeaC_*| z!;(6IK2_+xSyB*ko&|YnP!z^m{9E`hV33A|IiwV-y3~k)g$+unTS_-bo)JF_AJhuV zl<&eam5QLKOs0ixglKQ%&ekiF|B{kJ ZWL<}nfpr|Z0c3e_7O6pyb`U6S*iKHHr)YFps zhNS*hQa_N?FC?`IRY!z-B`A@Ou;kq%sZUDjUr64+N}e6B7hz?Gq@t3VmDKws^$;i# z+6$8Rb4m5Z40{(#>VTwDlDb|}cS`CLlKKuP5yojrwZ{$K>p_V)-ynIvE2#%1^*vC% zykuI?xP(2Yq=qFGkyKn#*GMWUsaZ)KlT<}gi;{Y$q~0wlR9Lni|DCc&(%34z!9@HZ z;C?ra_ek40&W%qYr5;4^j2=YezriDTC5d~F#8C?sx}TA}CnfLul6PA2R-iQsdk#=S zcemv2mAq>u@2KS6Bzd<;-UE{NkmS*rL4 GKYp{upW!p()H>Y z#%8s;DZdc0-_q|IbL04R{h{vmHas82KgV#{JMsBp6X*SSq9HS3&^_V0AOAEsu5lg# zhlas5&J*C!fVakZ4jdZV);NC!4h>?7gBva?1sbl_I4^@k15?2 JL&MD)rVSy})rEhHhAt2? -_?%6!NXMeRua6Fy zSFfSzO2v4l+_KbyG1zPf-?_o$k6*1E^93n0h@lfT3?c$MA2CGoK2)k _T zp=01?L|CVIIhheyMbj}WIOd^xF@H8DXe&8}M&6BANw?DtkwqIuWCj~RG}5PwVk%;L zD>z2E3J%QyY8)fqw<(&8-HWIFCOaS1 mvLxyQ@`B0 z7R@z`OIYp}H_jB~1tw03_9MxQ?38Ftc*bBEmUl}ngR{SZ6K~*T8#pH$IPYxW+}FT) zpn>yL1Lrx(VMxXI@HCX6b2ac=S~#9cr&H6@=q= iyV-VB-fMTc# ;Et^`XgJPF$5VN+RR(->M1{lb*$MdQ&HzqTlRWH_q>KaO@BzsEC&?+0-) zem*fN_c(A4PZTdn`e{9ZBBc^-Y@5X|pP9IIKvFis!cY4x!jFd#OZk(6DSod}2hh@* HsBZraK<^+D literal 0 HcmV?d00001 diff --git a/config.h b/config.h index b39ffb5..9850bae 100644 --- a/config.h +++ b/config.h @@ -8,4 +8,7 @@ #define u16 unsigned short #define u32 unsigned int +#define UNUSED(x) (void)(x) +#define ERPC_DEBUG(...) printf(__VA_ARGS__) +// #define ERPC_DEBUG(...) #endif /* _CONFIG_H_ */ \ No newline at end of file diff --git a/crc16.c b/crc16.c index 190d082..fd32d26 100644 --- a/crc16.c +++ b/crc16.c @@ -31,13 +31,13 @@ static const uint16_t crc16tab[256] = { 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0}; -uint16_t crc16(const unsigned char *buf, size_t len) { - int counter; - uint16_t crc = 0; - for (counter = 0; counter < len; counter++) - crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ *buf++) & 0x00FF]; - return crc; -} +// uint16_t crc16(const unsigned char *buf, size_t len) { +// int counter; +// uint16_t crc = 0; +// for (counter = 0; counter < (int)len; counter++) +// crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ *buf++) & 0x00FF]; +// return crc; +// } u16 cmd_cal_crc16(erpc_cmd_def_t *cmd) { u16 crc = 0; diff --git a/crc16.o b/crc16.o deleted file mode 100644 index 6f0997b2e66ed2a17d888bc37106f619207130a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2198 zcmYdkV`l(?Cu|H1qF@#agI-B$MG2S }Fz7HcFt`BKfB;B`0z*K8UP@v~B3J}B z;lL1ZKrgAd7`F U3a8aL}tjRi^?}vWFF2oq>a10j9bKKy_VE ze{ce|I4~GE=$oMHWnf@|s)5M>{oxSm(fQP)`Hg@_r!NqPN~9fk{l&m=-1QGg(Q6O> z?XJHLKHzZdJOE;)9elyTzx{+qx2u3hZvZ1uy#W6<2L5da3{L %)kU<{JM+9OIBijwM_aDgKA0T^yO8x r!)@~Wll zkD_I;poh4rBY+1a0ORn2I4F^508T*Nz5*}Q{{8 @VEPL^n{-W;`f@8vm%|9`&sI7!9XM1h4- Qj;_NwKQ(=FQXfB*M)5## zk9a(dXv )!VNeRKBgU9Gj;doy}H=T5KN zmUlJoi=VKakzSx&0pI-p``+KZ|L45)eyjD7^DFv0Ca!Eewej^ro{PE%{XXVDY!Fz; zaLC}X0!x6ZgIhs*!p`OylYcM1wb}Nt%;oyWai2FbO%VF5bjirnNhGK|DXi$#*3(N@ zOzmvV`|AHx=PK{fM<$0=7Kk*mq?Nd*sD!Y(++O}``^@$o)8n7leV09MbN#Z~C$ouc z8^prX%F0CDOu~F_=APvHssHlC%$J>AJ6ErCiAeQet5DB4An}l+$zria?dh1?_OIoB z|Lndod-v*DyGy-7qRg|zsy=dEklL&@$x81p|J$6qzGqkM?Oyw0?#W)Y8upx&7+0S~ zHqAN@WDfGkzqk7zd%ouW?Df0$-|YV}Up&vOF4V6iZnEAcyNi4u B~Y z7% uo}r!r149VV3|=5+VK@k9fyzXP zm^m=rLRfil)(SZ58=M8y0Ipe>f#$$i96%O75Ho|_461jS83f?6B5+xdFCelqaFzmG zRxd3xCl$y8fq(xQ7}6P&i;@k^^pYV$U=l1+l9&YIfb3^x0E>X-fT7Evz`z7_DK-Fd zA1GwOYQPF)fg~uLAtK1NDaZ(BMo_pzYF)5$Ac0(y0wsZJU@{0AxfTUgidfYk)u3Qs zFfxFQLjlOOC#d>iW(3urr~tX<1XY9(HK6(u73e~_;IL=3N0kKfEPxnNtE*I1RWT&z Xro<;F=EOsS7R<{?P0oh$krV;|qGV^` diff --git a/erpc_core.c b/erpc_core.c index 12e6915..93145f1 100644 --- a/erpc_core.c +++ b/erpc_core.c @@ -9,11 +9,14 @@ erpc_sleep erpc_sleep_tick = NULL; static list_t erpc_hw; -void clean_cache(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { +void clean_cache(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { hw->rec_cache->state = ERPC_CMD_NO_ERROR; } - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { hw->send_cache[i].state = ERPC_CMD_NO_ERROR; } } @@ -21,29 +24,35 @@ void clean_cache(erpc_hw_cfg_t *hw) { * 注册 hardware 设备 * 线程不安全 */ -u32 erpc_hw_add(erpc_hw_cfg_t *hw) { +u32 erpc_hw_add(erpc_hw_cfg_t *hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { list->data = (void *)hw; clean_cache(hw); return ERPC_NO_ERROR; } list_t *list_node = malloc(sizeof(list_t)); - if (list_node == NULL) { + if (list_node == NULL) + { return ERPC_ERR_MALLOC_ERROR; } list_node->data = (void *)hw; u8 hw_ord = hw->ord; // 检查hw是否已经存在 - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw_ord) { + if (hw_cfg->ord == hw_ord) + { return ERPC_ERR_HW_EXIST; } list = list->next; } list_t *result = list_append(&erpc_hw, hw); - if (result == NULL) { + if (result == NULL) + { return ERPC_ERR_MALLOC_ERROR; } clean_cache(hw); @@ -53,14 +62,17 @@ u32 erpc_hw_add(erpc_hw_cfg_t *hw) { * 注册命令列表 * 线程不安全 */ -u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) { +u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) +{ list_t *list = &hw->cmd_list; - if (list->data == NULL) { + if (list->data == NULL) + { list->data = (void *)cmd_list; return ERPC_NO_ERROR; } list = list_append(&hw->cmd_list, cmd_list); - if (list == NULL) { + if (list == NULL) + { return ERPC_ERR_MALLOC_ERROR; } return ERPC_NO_ERROR; @@ -69,14 +81,18 @@ u32 erpc_add_cmd_list(erpc_hw_cfg_t *hw, erpc_cmd_list_t *cmd_list) { * 移除 hardware 设备 * 线程不安全 */ -u32 erpc_hw_remove(u8 hw) { +u32 erpc_hw_remove(u8 hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return ERPC_ERR_NOFOND_HW; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw) { + if (hw_cfg->ord == hw) + { list_delete(&erpc_hw, list); free(list); return ERPC_NO_ERROR; @@ -88,27 +104,34 @@ u32 erpc_hw_remove(u8 hw) { /** * 获取 hardware 设备 */ -erpc_hw_cfg_t *erpc_hw_get(u8 hw) { +erpc_hw_cfg_t *erpc_hw_get(u8 hw) +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return NULL; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw_cfg = (erpc_hw_cfg_t *)list->data; - if (hw_cfg->ord == hw) { + if (hw_cfg->ord == hw) + { return hw_cfg; } } return NULL; } u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, - u8 *data, u16 len) { + u8 *data, u16 len) +{ CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); u8 cache_ord = 255; // 查找可用的发送缓存 - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { - if (hw_cfg->send_cache[i].state == ERPC_CMD_NO_ERROR) { - printf("find send cache %d\n", i); + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { + if (hw_cfg->send_cache[i].state == ERPC_CMD_NO_ERROR) + { + ERPC_DEBUG("find send cache %d\n", i); cache_ord = i; break; } @@ -122,13 +145,19 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, cmd->head.dest_id = dest_id; cmd->head.port = port; cmd->head.msg_len = len; - if (data != NULL) { + if (data == NULL) + { cmd->head.msg_len = 0; + len = 0; } cmd->head.type = package_type; cmd->head.src_id = hw_cfg->local_id; - if (len > 0 && data != NULL) { - memcpy(cmd->data, data, len); + if (len > 0 && data != NULL) + { + for (int i = 0; i < len; i++) + { + cmd->data[i] = data[i]; + } } // 计算校验和 cmd_cal_crc16(cmd); @@ -137,29 +166,37 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, hw_cfg->send_cache[cache_ord].state = ERPC_CMD_WAIT_SEND; // 等待数据发送完成 int wait_time = CMD_TIMEOUT; - while (wait_time > 0) { - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_OK) { + while (wait_time > 0) + { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_OK) + { break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_DEST_BUSY) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_DEST_BUSY) + { return ERPC_ERR_DEST_BUSY; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } wait_time--; } u32 ret = ERPC_NO_ERROR; - do { - if (wait_time == 0) { + do + { + if (wait_time == 0) + { ret = ERPC_ERR_SEND_TIMEOUT; break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_ONCE) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_ONCE) + { ret = ERPC_ERR_DEST_NO_RESPONSE; break; } - if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_REPEAT) { + if (hw_cfg->send_cache[cache_ord].state == ERPC_CMD_SEND_REPEAT) + { ret = ERPC_ERR_DEST_NO_RESPONSE; break; } @@ -167,7 +204,8 @@ u32 erpc_send_base(erpc_hw_cfg_t *hw_cfg, u8 dest_id, u16 port, u8 package_type, hw_cfg->send_cache[cache_ord].state = ERPC_CMD_NO_ERROR; return ret; } -u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) { +u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_REQ, data, len); @@ -175,30 +213,42 @@ u32 erpc_send(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) { } u32 erpc_wait_resp_package(u8 hw, u8 dest_id, u16 port, u8 *reply_data, - u16 *reply_len, u32 time_out) { + u16 *reply_len, u32 time_out) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); - while (time_out > 0) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { + while (time_out > 0) + { + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { erpc_data_cache_t *rec_cahce = &hw_cfg->rec_cache[i]; - if (rec_cahce->state != ERPC_CMD_RESP_OK) { + if (rec_cahce->state != ERPC_CMD_RESP_OK) + { continue; } erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&rec_cahce->data[0]; - if (cmd->head.port != port) { + if (cmd->head.port != port) + { continue; } - if (cmd->head.src_id != dest_id) { + if (cmd->head.src_id != dest_id) + { continue; } - if (reply_data != NULL) { - memccpy(reply_data, cmd->data, 0, cmd->head.msg_len); - *reply_len = cmd->head.msg_len; + if (reply_data != NULL) + { + // memccpy(reply_data, cmd->data, 0, cmd->head.msg_len); + memcpy(reply_data, cmd->data, cmd->head.msg_len); + if (reply_len != NULL) + { + *reply_len = cmd->head.msg_len; + } } rec_cahce->state = ERPC_CMD_NO_ERROR; return ERPC_NO_ERROR; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } time_out--; @@ -207,29 +257,34 @@ u32 erpc_wait_resp_package(u8 hw, u8 dest_id, u16 port, u8 *reply_data, return ERPC_NO_ERROR; } u32 erpc_send_wait_reply(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len, - u8 *reply_data, u16 *reply_len, u32 timeout) { + u8 *reply_data, u16 *reply_len, u32 timeout) +{ u32 ret = erpc_send(hw, dest_id, port, data, len); - if (reply_len != NULL) { + if (reply_len != NULL) + { *reply_len = 0; } CHECK_IF_ERROR(ret != ERPC_NO_ERROR, ret); - printf("send ok\n"); ret = erpc_wait_resp_package(hw, dest_id, port, reply_data, reply_len, timeout); CHECK_IF_ERROR(ret != ERPC_NO_ERROR, ret); return ERPC_NO_ERROR; } -u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len) { +u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); - u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_REPEAT, + u32 ret = erpc_send_base(hw_cfg, dest_id, port, PACKAGE_TYPE_CMD_RESP, data_out, len); return ret; } -u32 erpc_send_data(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { - if (hw->send_cache[i].state == ERPC_CMD_WAIT_SEND) { +u32 erpc_send_data(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { + if (hw->send_cache[i].state == ERPC_CMD_WAIT_SEND) + { erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd->head.msg_len; hw->send_lock(); @@ -242,12 +297,16 @@ u32 erpc_send_data(erpc_hw_cfg_t *hw) { return ERPC_NO_ERROR; } -u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { +u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) { + hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) + { erpc_cmd_def_t *cmd_send = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; - if (cmd_rev->head.port == cmd_send->head.port) { + if (cmd_rev->head.port == cmd_send->head.port) + { hw->send_cache[i].state = ERPC_CMD_SEND_OK; return ERPC_NO_ERROR; } @@ -255,7 +314,8 @@ u32 erpc_rev_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { } return ERPC_NO_ERROR; } -u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { +u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ erpc_cmd_def_t cmd_send; cmd_send.head.dest_id = cmd_rev->head.src_id; cmd_send.head.port = cmd_rev->head.port; @@ -271,25 +331,30 @@ u32 erpc_rev_resp_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { return ERPC_NO_ERROR; } // 重发数据包 -u32 erpc_rev_repeat_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { - for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) { +u32 erpc_rev_repeat_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ + for (int i = 0; i < MAX_SEND_CMD_CACHE_NUM; i++) + { if (hw->send_cache[i].state == ERPC_CMD_SEND_ONCE || - hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) { + hw->send_cache[i].state == ERPC_CMD_SEND_REPEAT) + { erpc_cmd_def_t *cmd_send = (erpc_cmd_def_t *)&hw->send_cache[i].data[0]; - if (cmd_rev->head.port == cmd_send->head.port) { + if (cmd_rev->head.port == cmd_send->head.port) + { u32 len = sizeof(erpc_cmd_head_t) + 2 + cmd_send->head.msg_len; hw->send_lock(); u32 ret = hw->write((u8 *)hw->send_cache[i].data, len); hw->send_unlock(); hw->send_cache[i].state = ERPC_CMD_SEND_REPEAT; - CHECK_IF_ERROR(ret, ERPC_ERR_HW_SEND_FAIL); // + CHECK_IF_ERROR(ret, ERPC_ERR_HW_SEND_FAIL); // return ERPC_NO_ERROR; } } } return ERPC_NO_ERROR; } -u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { +u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) +{ erpc_cmd_def_t cmd_send; cmd_send.head.dest_id = cmd_rev->head.src_id; cmd_send.head.port = cmd_rev->head.port; @@ -305,69 +370,87 @@ u32 erpc_send_ack_package(erpc_hw_cfg_t *hw, erpc_cmd_def_t *cmd_rev) { return ERPC_NO_ERROR; } -u32 erpc_rev_package(erpc_hw_cfg_t *hw) { - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { - if (hw->rec_cache[i].state == ERPC_CMD_WAIT_SERVER_DEAL) { +u32 erpc_rev_package(erpc_hw_cfg_t *hw) +{ + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { + if (hw->rec_cache[i].state == ERPC_CMD_WAIT_SERVER_DEAL) + { + ERPC_DEBUG("find cmd wait server deal %d\n", i); erpc_cmd_def_t *cmd = (erpc_cmd_def_t *)&hw->rec_cache[i].data[0]; // 检查crc u8 crc_result = cmd_check_crc16(cmd); // 丢弃错误数据包 - if (crc_result) { + if (crc_result) + { hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; continue; } // 丢弃不是本地数据包 - if (cmd->head.dest_id != hw->local_id) { + if (cmd->head.dest_id != hw->local_id) + { hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; continue; } // 处理数据包 - switch (cmd->head.type) { - case PACKAGE_TYPE_CMD_REQ: - printf("{REQ}\n"); - erpc_send_ack_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_WAIT_TASK_DEAL; - break; - case PACKAGE_TYPE_CMD_REQ_ACK: - case PACKAGE_TYPE_CMD_RESP_ACK: - printf("{ACK}\n"); - erpc_rev_ack_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; - break; - case PACKAGE_TYPE_CMD_REPEAT: - erpc_rev_repeat_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; - break; - case PACKAGE_TYPE_CMD_RESP: - printf("{RESP}\n"); - erpc_rev_resp_package(hw, cmd); - hw->rec_cache[i].state = ERPC_CMD_RESP_OK; - break; - default: + switch (cmd->head.type) + { + case PACKAGE_TYPE_CMD_REQ: + ERPC_DEBUG("{REQ}\n"); + erpc_send_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_WAIT_TASK_DEAL; + break; + case PACKAGE_TYPE_CMD_REQ_ACK: + ERPC_DEBUG("{ACK}\n"); + erpc_rev_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; - break; + case PACKAGE_TYPE_CMD_REPEAT: + erpc_rev_repeat_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; + case PACKAGE_TYPE_CMD_RESP: + ERPC_DEBUG("{RESP}\n"); + erpc_rev_resp_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_RESP_OK; + break; + case PACKAGE_TYPE_CMD_RESP_ACK: + ERPC_DEBUG("{RESP_ACK}\n"); + erpc_rev_ack_package(hw, cmd); + hw->rec_cache[i].state = ERPC_CMD_NO_ERROR; + break; + default: + + break; } } } return ERPC_NO_ERROR; } -void erpc_rev_package_core() { +void erpc_rev_package_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; erpc_rev_package(hw); list = list->next; } } -u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) { +u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) +{ erpc_hw_cfg_t *hw_cfg = erpc_hw_get(hw); CHECK_IF_ERROR(hw_cfg == NULL, ERPC_ERR_NOFOND_HW); - for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) { - if (hw_cfg->rec_cache[i].state == ERPC_CMD_NO_ERROR) { - printf("set rev cache %d\r\n", i); + for (int i = 0; i < MAX_REC_CMD_CACHE_NUM; i++) + { + if (hw_cfg->rec_cache[i].state == ERPC_CMD_NO_ERROR) + { + ERPC_DEBUG("set rev cache %d\r\n", i); memcpy(hw_cfg->rec_cache[i].data, data, len); hw_cfg->rec_cache[i].state = ERPC_CMD_WAIT_SERVER_DEAL; return ERPC_NO_ERROR; @@ -375,59 +458,75 @@ u32 erpc_set_rev_cahce(u8 hw, u8 *data, u16 len) { } return ERPC_ERR_REC_CACHE_FULL; } -void erpc_send_deal_core() { +void erpc_send_deal_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; erpc_send_data(hw); } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } } -void erpc_rev_deal_core() { +void erpc_rev_deal_core() +{ list_t *list = &erpc_hw; - if (list->data == NULL) { + if (list->data == NULL) + { return; } - while (list != NULL) { + while (list != NULL) + { erpc_hw_cfg_t *hw = (erpc_hw_cfg_t *)list->data; - { // 遍历接收缓存 - for (int j = 0; j < MAX_REC_CMD_CACHE_NUM; j++) { - { // 发现等待处理的数据包 - if (hw->rec_cache[j].state != ERPC_CMD_WAIT_TASK_DEAL) { + { // 遍历接收缓存 + for (int j = 0; j < MAX_REC_CMD_CACHE_NUM; j++) + { + { // 发现等待处理的数据包 + if (hw->rec_cache[j].state != ERPC_CMD_WAIT_TASK_DEAL) + { continue; } } - { // 多线程下,抢占处理权限 + { // 多线程下,抢占处理权限 hw->deal_lock(); - if (hw->rec_cache[j].state == ERPC_CMD_WAIT_TASK_DEAL) { + if (hw->rec_cache[j].state == ERPC_CMD_WAIT_TASK_DEAL) + { // 获取指令的处理权限 hw->rec_cache[j].state = ERPC_CMD_WAIT_TASK_DEAL_FINISH; - } else { + } + else + { // 已经有线程抢先执行了 hw->deal_unlock(); continue; } hw->deal_unlock(); } - { // 处理指令 + { // 处理指令 // 搜索指令列表 list_t *cmd_list = &hw->cmd_list; // 链表是空的 - if (cmd_list->data == NULL) { + if (cmd_list->data == NULL) + { continue; } // 获取指令指针 erpc_cmd_def_t *cmd_def = (erpc_cmd_def_t *)hw->rec_cache[j].data; - while (cmd_list != NULL) { // 搜索指令列表 + while (cmd_list != NULL) + { // 搜索指令列表 erpc_cmd_list_t *cmd_obj = (erpc_cmd_list_t *)cmd_list->data; - if (cmd_obj->cmd == cmd_def->head.port) { - if (cmd_obj->handle != NULL) { + if (cmd_obj->cmd == cmd_def->head.port) + { + if (cmd_obj->handle != NULL) + { // 指令调用 cmd_obj->handle(hw->ord, cmd_def->head.src_id, cmd_def->head.dest_id, cmd_def->head.port, @@ -445,7 +544,8 @@ void erpc_rev_deal_core() { } list = list->next; } - if (erpc_sleep_tick != NULL) { + if (erpc_sleep_tick != NULL) + { erpc_sleep_tick(1); } } \ No newline at end of file diff --git a/erpc_core.h b/erpc_core.h index 1834a27..07e1fc5 100644 --- a/erpc_core.h +++ b/erpc_core.h @@ -31,13 +31,14 @@ typedef struct erpc_cmd_head_t { u8 msg_len; } erpc_cmd_head_t; +#define MAX_CMD_LEN (256 - sizeof(erpc_cmd_head_t)) // crc16最大支持256字节 + typedef struct erpc_cmd_def_t { erpc_cmd_head_t head; u8 crc_16[2]; - u8 *data; + u8 data[MAX_CMD_LEN]; } erpc_cmd_def_t; -#define MAX_CMD_LEN (256 - sizeof(erpc_cmd_head_t)) // crc16最大支持256字节 #define CMD_MAX_RETRY 5 // 最大重发次数 #define CMD_TIMEOUT 30 // 超时时间 tick #define MAX_REC_CMD_CACHE_NUM \ diff --git a/erpc_core.o b/erpc_core.o deleted file mode 100644 index 9d0e0bafc42b28563693fc46f2935ac98afee59f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8141 zcmcgx4QyN06~4}2os?j&{4}r$nJqwI#H4H01r%v7Z5}*EBD}61mH2U7=b2=6QY(3; zEf9$0X7if~L=)4PR!u|NBw%bq3^hftEe$LUKN227teQG4LmhJDYD8KlvJ&vVbMJfi zJtvOSNz*Jn-|v0r+;i_e_uPB#wfnxaiP7iSm5goUsD=d%{jkBY_!`^7*o_{>IxZLQ zK@ J9cqji^hn98_3nI=Fvi#4QWBUo1REdWTC5E<*PFC8f#=Yg2;BwR*=cWz5?o zbURRRz2Q>5B>2ZJW2_frrB59m^iR2I2Y;1c3eXDl+#k{lYv$jz^f|v~_V`b!D HHLHOTHK0w@`e8;hVStQenKnM1x=P?M`rs$?`Tk ;_hWB_XdqxI7oNl$M^ROAt9d8jsJ zc6lJl`=-KyxEZSPO{r(lB`}!~9K>~6GP|m%w(qzC-Eclr6;F?zVa5(Ppp6-=R-K7P z1e_R#Z>r}E*}&{!C578=H|OlR6?MEMomJ`>Lf~q<7O!E2z(&KYJ*6&Pg^GpY%9?O= zht~*itW*yt*OHT8#g~>PNSlIz1;_Er6wt+7dT sm4p; z?v2~3 rPJ+mL%p2z8oob(-%Yio4C8maN*=W&Sx6_IH`@ z%6LX3pMzaL9RKV}u}C`xg5g{jW;FmFtFUL;+}qrOd2G=D0-f9y=1l%QsGI6iR$VG- zQ!(evKVp?oi`XD&eKwgnG(+a7nO&k8v4#4^X~Pj~=sb|M_b)sLoK;s!!+atXK#(j_ z81oQD++uzkQYjuf>1hvWvC~c|HSwF(K If7a?gdkO0 zZa3fP6uW>GgO1)b1##S@Rgj05#kO+iWT9pfQD7%0-{alL7go5G4V`v`PCN6BH$jgO zHdi_z6y)Zr$j$XaCvK|8o~dvXxwkvp(_(fv2QY+xe@fG{f PYyi}{g8+Pku<)@61zw{)XoH$b2h^LjGB6{!bS9V@c)P9nO{&Wmu^ ze*VIuj+P;!?mnoOi#pfAVd1Y(75ne10J0AV6gIWK@!vpiZIG4OE|J_Rdr{0xr>7gR zWI!Nl6n`;Cs2gc2i*+ Uk$(4NH= z(pf!=E550mRe{gaCzcYQrBCE6$+&m?E<0xX{aPfAii4&&tTV8;(qXoe-+kln|2MI^ z+V{TkAMz0Rp9e8KDRyFVBRo`bB(rQ&dNeORc;%Y;&biLDW!%bVdA<3TN0k5beA{#V zmkM*8p2ptFI;wo*zlPSDnHFiyI-OAtqvf+`2P|$9W1}B2<4f!L7S@rJ7WVND& Ric1vb^&;3R}xKuW=b;=U285Tt}_XS=c(IuXbf`*%o|9mk{R*b7BGD zs!8|Md0Z^eLALN?PWQ~y@ivC@ru#<*Ydu%{#*?D*yp|nn$MuJAfEBBxzK)4mPh*x* z)*@qyWehL&MLrJ^9{y9s)`eyAqFZ<2LojPPD`szAT>NNjIlb_NsL4&4Dt2r&=bQ4Q zIBh5DKH{*Sd+8KQYc1EE4SBf+KLX7W?9T3!m2g?$9NiGRu!#s&<~t56{P<02q8n#P z^By{yb{5|)TmcEXz*j&X6Pm}lIF58rQ&-7B3<_zLU&88rkKfI=npHm&_{Li~&F^hA zgtF1md+%$Lu8+rCUF+RaQ|$>c#_{)Ec+Wa`J$-lGVOL!@@5XMOEiQdGe<65}tL}RE zMWKTrU{U(Qhsq8F@ 6< z>|<;in93zQZv#{LEk9$YfvGg``|4TX_`pzKU_{4PEE? 74J3@f{v&~&fuY;(YQ1acjzDtw;J5Xd zaebgYxGe}LCt>3Ycxw2_uj8l@^C7q`KrNj6o BkbS0A0`ZyqL2aIO+rvRz3y# zBIl~`)5VuLdL2k`Z%FPe(2ZPrUP_BVl>KYiW?Wi=98CfV%f}>oqK>hfxb!U`A^np? zhY%T}wTFR(Jslnt_QIHNfi8#F;S{v?6ChFJIf;%-L^IUN_5LNf^OB2VzC_(PkkFd} z61{o|kt3vIK*Ad@0*R3qfrQ>pM3q3hB#KJ37x5;fy%M2Ad_7g8|2D!hVDtl4HD7hK z+Nv3hSbEs~Eh$Nal&lIAkkV$!Q8WlC^;cMKliUu8+NHEZa*9M nQPDu2sluk?Tb&2Mr^li!IBzjLuPfPBMMDtR5R&sfX&Pl0aaW$+ $~-zeue%pe%bJPvad4CNn(`4Je( zLJsqDFqDfNhUS *JgfD!o-Jl-Kv6ubdtjZLq^=@h#AxeW62|KCYdr^|FGJYpDwXXwVZ0U4qf)e zhnU~vO?agF!3Q5?v4kESitxjTz0e}jzCM8gBC)}~NMc~bkkVm&@ZbZwe7#?{M09G2 z?2nFEB6<}{hoS>UWLO_bMv~Fkf$04%g@`3fCXNW*VLh3MT9_N;fA8`g0B4p6>X#ZJ za;<5>CiSRMs?9BywNcVDs%{Z{ClX!55erQ{0AKaT+(YQoqY0N9sW_C&(|iyk30+S{ njDgqzMox`HlS%Ru$9;N2H*`i0kCDmY*tVVGtzXBu#ruB%4BhOa diff --git a/erpc设计文档.md b/erpc设计文档.md index d3f5a12..f7d5498 100644 --- a/erpc设计文档.md +++ b/erpc设计文档.md @@ -1 +1,39 @@ +## 协议设计 + +### 指令通讯 +1. 指令发送方法:
+ 采用send-ack模式,即主机发送指令后,等待目标设备的ack确认,确认后才认为指令发送成功。 +2. notify-noreply模式:
+ 接口:
+ ```c + u32 erpc_sand(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len) + ``` + 描述:
+ 主机对目标设备发送一条指令,并不期待回复。其本质就是发送一次指令。 + ![](./picture/1.jpg) +3. notify-reply模式:
+ 接口:
+ ```c + //主机: + u32 erpc_send_wait_reply(u8 hw, u8 dest_id, u16 port, u8 *data, u16 len, u8 *reply_data, u16 *reply_len, u32 timeout); + //目标设备: + u32 erpc_replay(u8 hw, u8 dest_id, u16 port, u8 *data_out, u16 len); + + ``` + 描述:
+ 本质由2条指令组成。
+ 主机发送req指令,从机直接回复。主机开始等待从机指令。
+ 从机处理完成后,向主机发送rep指令,并附带回复数据。
+ 主机收到rep指令后,开始等待rep指令的ack确认。
+ ![](./picture/2.jpg) +4. 指令工作在单线程模式下:
+ 指令发送后,等待ack确认,直到确认后才认为指令发送成功。如果确认超时,则认为指令发送失败。 + 可以在上述的接口中发现 cmd 并不定义为cmd,而是用了port的称呼。port的取值范围为0~65535,可以用来表示不同的指令。
+ +4. 多device通讯方法:
+ 每个port工作是单线程的,这就意味着,如果有多个device需要同时发送指令,则需要多线程或多进程。也就意味着需要定义不同的port号,来区分不同的线程,哪怕他是相同的指令。
+ 例如:节点0x03中挂在了3个电机,需要这3个电机同时运动,此时理论上指令是相同的,但是device不同的。通讯库没有做device id的区分。为此需要将port号划分为cmd + device id的形式。cmd相同的指令,device id不同,这样就可以实现多device通讯。
+ u16(port) = u8(cmd) + u8(device_id);
+ 这样一个cmd号需要链接到多个port上。此时的cmd可叫做cmd组 + ![](./picture/3.jpg) \ No newline at end of file diff --git a/list.c b/list.c index 582a34d..392318c 100644 --- a/list.c +++ b/list.c @@ -1,6 +1,7 @@ #include "list.h" #include "stdio.h" - +#include "stdlib.h" +#include "config.h" list_t *list_create(void *data) { list_t *node = (list_t *)malloc(sizeof(list_t)); @@ -41,7 +42,7 @@ void list_print(list_t *head) list_t *node = head; while (node != NULL) { - printf("%p\n", node->data); + ERPC_DEBUG("%p\n", node->data); node = node->next; } } diff --git a/list.o b/list.o deleted file mode 100644 index e32bab7d9229e02418d4b25af71dbec74cdddd01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1700 zcmb7EL2DCH5PsWDZID_Q5slQtA{8q%YqTLm5nL^yPoxmU*pt*W*=i&<%Vr~KK@h6K zQia~V>VMFSR4w%2#hZBapcdjGC&@vKGjH-XFJ>j*JTV*=N#Hqtk}taRjfxgKvD}XNm_4#v2T_ zhkPF7I(*|{hc(7tqu!e2n_$^27(6fp+_mF^h~|x*)U6L{ARZJFz)JAo-QJ6Cw+rFg z5Uw4Dy9}BUYO}zFz`0IqoUXCsA^~wF;3wOSALJ;sd616_`tYSP$O+;?5%2l)1DGY% zB*TTZecp;lT}CmLRN4YVF};!@3;8}@qGC|_q9neXYvZq4H)K}lbBV?*y~c!chtZ;k z-4yl7Iy?A;;`h`6e8{0XUQroaC|X<}jbD%HTAs20#dyzE+(7Vr3v0Z0#^75?0LGKU zngWdHM_4JqC*A$9_ho)=?t(ep%x0D{>7-k$SDMMXb2sTZ4^lJcl}4rNo6BqFLS=P+ zF}avYo32;8=al@@X4X1uLBK;0>IkeD`wBa1G4>tyqXJoQtH_4E3=udO{wH-{N`(4^ zuwfnKH9~Ya^kOXX9uJWjda+jWPKRhF^kVho#ZQh X)ES7Q zN=M>9qRu}YE0G*!_F+$S4X59rsB;gqAdY+u;#$hg+b1{}ZCI}LOgQ~@4eK71`^9Rt z7QQ^ZGjqMls=p#xXj$YuYl{}~DJA{j_>#UXui+BXfPTluv MYf`B?z*oZj1r~KRA^-pY diff --git a/makefile b/makefile index 61c0a50..158c108 100644 --- a/makefile +++ b/makefile @@ -3,8 +3,8 @@ # 指定编译器 CC = gcc # 指定编译选项 -CFLAGS = -Wall -Wextra -std=c11 - +CFLAGS = -Wall -Wextra -std=c11 -g +BUILD_DIR = build # 源文件 SRCS = erpc_core.c \ port_self.c \ @@ -22,11 +22,11 @@ all: $(Target) # 链接目标 $(Target): $(OBJS) - $(CC) -o $@ $^ + $(CC) -o $@ $(addprefix $(BUILD_DIR)/, $^) # 编译源文件 %.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $(BUILD_DIR)/$@ # 清理目标 clean: diff --git a/picture/1.jpg b/picture/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ec3a8848474f2e1f5e3a8602cbd36f26266d3a9 GIT binary patch literal 9871 zcmeHM2UJtby51B~5KurYNYT&~6r>x9joxbl1P}#63Dtxmh@i(tl@cS;1VRf5geD?Q zP Gl|M9!VF7Ku_ z%569Q3!>Ov?b@{t03GN5Lgt?p)7!vN))aw7%FTzQR8DE^5ehzH_Z^?v#a7?3{4Vx# zcXOx6= 7kY<^)iH z0iX(8+wDK)nL@5u0JyjU05svh%B-RRpzsj@9Pj&8#+L{HhaLjJ>(*aozkK3$6M6G@ zbF`F{+SV2TmeT=%$rJ$CJ^%oN+3!3`@)vD8MPYGL+T}{Q>;NYK4x9qi0T;j;5TPJ( z-~u29NbmFmiU1AuF72i?6r!c0-K7I`bo=P&4=^y$AE2jaU_8XgaFF>RJv|c(6Z4_N zhgl9YFtW0-9%iH9!@EYPb~R~e4^R{jAEZA>Dg75|rvhL(Kn0;HqM-r-)GSmqEL1yH z05@f5`mi7URG?YfM(69iPfv>H$+R@U^*|YsY!Ucl~Vp%Gw`ni*aC^XtL?xFo>u~D_F z?rOOpS=OQj6vmtg*`>3-hObQ~JAz71>ddRu4|H7^HeOw;Ok~&NH~+;@Ju>%PR&tbB z(@_$M2QasEdaaXngl3)Pia37>Y2c_K)pGEsp%)3cuja@02ni+98~?Hpu}27h??2W2 z$7%n=k=A?@|3K)YgRafI<8fEQ=ADrb3>iYbaxpb0r?-dJ-Kp`rvxWBVhN7hL!kxap z+KYJ&xDKb{sxsDdD=w?C>8jCTtkL|JCZuUO%o|} YL=5!}r+3#rLwyWf=`w~7339UxyZv{|B^#4H?@(ud* zpmCE~O@vRM5y7v()|@d(>s@LW7Q%16&|#Av%^rc()Vw^aTM$HgR5vaXgv064Lw|Mn zKIBKl+06x_d3c9A4{rC=UL3D3oM*tiQzdkbR%Z>|%DBLvsHT$s4h5SOH`EDOE5=qU zK?_(;mtZ`U&f4HVP3VTnmY2Tebpe*b5dMm{34Io-tEWG4cWyskGJaJYHmhtzCG>xv zRj_>BaQkfg(o3yc=~T9<62A Ph9n8ScSLLUUF%$mJ$BeY~ zH8O QgQw~R0m-*5AZg|=x MBE#a%*XY8)XE@==ixvzgFY&MQck3jg1d1QUPNn7NllWq*SUG{#< zOdDakp*K^W9)9bEQ<$&g<;v~pLT)!&bnS~psrJpQR=4@L2kpPH|El>+(AfE&W7_>b zZF6Voi&MxPF#c+T=i!Ti8TL!3%EG(&w7c=eY;m2+L(oZlU_)Tv^XY>2BPKIQgY`2K zZeyVG%G2|C2!V +PRNcbYOiBrF2iY(HnW{o>VUu}+2+0a|SxqDnB=^7Og2nS1 zJm9u{Ie`dux~+wL%SxPirHXaLZmV9}Z8+_o>A-FPx%D}{Hr{f`lBICBUo=AFct*ng zR0VWV=FPX+a|=(d2&EAAM7ZDk&br5G6gJb==!8oS-wvShLE}5$DJ*pQn2yp?Bzu{t z0yS5lS< Jr@?x_|;Dw3Y_62utst6b{bS0ii>eh-0&G_;4)-$@AHV19v?Vu?RhVHVn zS< 3_SZKa>7)`>Vr3iMs-S&|kU} zz~7^Y9G(qzutb58DjD{Dq=IL-^WcKBHMJ>PAI6h3YfxWsn$1| w?8OFZ-)>ARXma5NU3Y6KOP>}t&o@L zZiAG8ZW$@&_1$*ajwp9l(P=joM(}gT!ZN`fIfJbG-tqH()cfeB4H-rhd>CB}wdizD z_T8+@_+n2(-g>#%qMEnRAhB@K>zTLXrO?Y7_b(eJB;Gy2^PX4HCnW@Y)+QmS)=h0q z*7KZ Qd*3nUzEevR#%obk&hPPmnl2PR+?;e3<0hHDH?m-y;+w6RR{ULk zWvPCT?9_jXESQ_+rRH;8v _LXzwiX3mNe}IMpZl zY6tjjF}752U!_=o?7&HxLig@l#T(&sH~v3v)@f2rO%xA)f@Q+y!Bx@_f 8KsL%h}N80kPfJnKdszufMg`Z;KYe^&sKHDb02>#FMP`d;3Kp4 zgxthEj=b0yIhqD@S0_Bqo1BY?bhPC9aO09h9| 0@Kcau@d4{U`A6tpYy`aEUKgn!Me5;k42Q zH?&Rf!RJhjRGP4bll+f1U4vF5b^tpr>vhdYXUX9jQ+#%XSf+}>d>vD!=3U6<*^^Lh zF?O(&N%m*K(=b52gCD-BUw`n_NOaJ%JTR<4PWD#*Y=@5Oxy #UB6TrhdbhA0Lgk^Py?$iwRti~y (4?Tr(~@kvcpFChqBoy!0?tPc=c{6CPM^>;Qo9l@}e-A=OJ0y(&cr!!8fV z!pDAIceScCh4~I66{Vm+27!$6fjdD)rB$T^bXpCyPdFH%3*vk-yfI_n+6*J~4o&{> z ;MeUn7lF z$C2Au`id4UlVL>UWKg2%)sD<>_ZkK`+{?UQO$mkSaGFGhM21O-otJnAHe)%h5-Pfn zdu$LD5fIx@WsDW}%UzH--K&d1$KS0yPY3g1Y`QI$#`59jeB*MhW84=d>k%y2f~ik| zB|=IUH%F8EAPXw45bfIDYf9|$rPlsZw}J_jIDeFTEbho-%1)TQINt-5Z-nG6@*N0H zC&1xNj*+%j6}4WWmnQF1^U$;Ug{;J<7kISY%pBu$FK39sW{R*qRKbJIu-N g49s)m}{@#xNhxD(U z>O!A@HOKo}Ht`MF`;JgPTM#e&hIxDB($oiA7NSvf*vNsLk@vrK`l?oW#%4LbvVgES zd^~i|Z3tBH`mJ_yss=QH4x<*-nLZH3{>agAGK#Sg{f(o|F3Iq;mP$ysi?ZrD4+!+G z@(X2mmBnZm<3n)MsS}#RVttaaL9ra-Dlg07PSaLe8sdJEYWgP_{4lIOyyK_cMASka z*URJy9v}taCiO3?T;ZXq$iEe`A{~L$x67S#e(op#Mv(th$JCcI9cN2eZZ2eQoj-NW z2|ci0dN4Iftp<@N@=c{^>G-fCylAR4`+AA}tEQ*xD`3Py3qj*YsG2OL2$S3hkm4Y` z!{lQu%kfTBQWg3sZkSv}l8Ih(qZyMs+SA~nxvk3cdM>FWv5j4bEiXJ15lV*)-tXo0 zFil$p-&FZx1nXwbYf>L5Bg|9jFV@H`+O37i4YhtbLC|M0pOf-hv5?f=0S+$ P>zw+44dkMw(A82)_d?=AW5oVs9jdCor)seqeCpdn-1_W}B}W zRFybv;MPk>n=5Js;w A-m`?=`ziVlfr3W70LBb`S2kbkS;Dj6x^*@^v!f@=OU#3U?%bf)YH41T ze5i)LJ)Le@`#DV2e$yp!l6AAOk&wzA_S`eLaocn>M>;ZpfI#g-s*7Yoii}ms=p*Ec zkz1Z_kqefqmAbP~fYsCan6o}-uWz!Wc^9oSR~bjHu1O?AmXUJ1r-jv(4$QF`aB0GQ z)uaLFRx79>wa`2qUtd1kq^^}GPnl6DcD=Qs8YSzbDr@svP(d>i5fnV3d<|vMJM#}h zQbUn^!^9P6@(wWcRGB)QUM8?;zLoq+{E_Tjr0w?Xqrp?* 0k$jY2s^+6FBn2r8_J$1`lO}}d==%A#BMfzvr95(J`} GYPSv#LYlAtbOiDRDcL3WI-K{usYP^{8l;pDp1+pL= zF3T}q6IZY-(bT iy70+hc6=66!4{Q}4}Q EmC^}khPf;;qo@&UeL^HbR6*bivY;uL$=eWv$Cbtuz={Qmxn6wt=6^Tp{(Kkz z5d7P$%1V)A#o~iyzGx#R9&ixHt}{pITBjpe*d@o*Z=acb>7hi@XZsrOvG&rVtnI_B zIZDu8t&F>i A-fl*Ks3e_Q+PoSH z;3+tht`{rH!!bq#5~SEa3Ez8Lllan0xno&Ka>~BlXu}j7U5CDP xR#w`8G&R|G9DqV0C? )kV*>QuM>dXsZl4QMS1@=T{yeMeR8+ z^Hs1dC@n_toRadlpdK1xZ_j*nZM!2c9Om92DL9>b6l#&_3xSXz3!A!->lWttbgRAo z`kSYbe^UANK)XEAYSPe`alV}S&DS{(8TVw$mr=4Do)}oh%pmuGtW5SP0Ly 2+@WtkC?Z)WnApY>BOnE80ZmyyN> z4UJjiwsPiK(1OsX`A$|vVM?K_7C9EhK@sen)n2-u4E6dVHg#forC&4%E>Y0-A@{RK zu 0uSqf*h5^wA@W0hCSNgDy1; |Npi#TB{r3W`>Iy<}PD2U%|&socrUoUtMa*MK ^0m&AQiB)-q z5dCatYf8_xb+WX$$RCSHMBRv#lNmT>CCkiJT~PAqscN#&iVaLz)ToW6o>k(u{q9t6 ze2BxnL~VIqXo$iW^~#-VQd3tNQq`Ybchr4UoRKy&K3sNT2dKpm4z-Tc6buzPa(=26 z-`DS1SKnMc_5jp<&Y`X`4Hr%xNyaL;e~U>s(n3dxLR75H^}cGMNs^h@^`Y9a_(88| z{zE=;8}4KNw4O7 N$oL$3UN`vl znZd9Zc^=3~ &^+;Qd+P#R$e5Em}^7Q~fp2lG@Gd**nlKdmk0ML;06 zifK5k*c+pdi^*QOZurN-v&U&a;J+N$ luN!BoH(lI{=gKP+NYWpz( zJ|a@=J$OvFj^U9;hE}qA6|PH2JWo8_&?I8qTKb5z;5ZS9JuM#kN}=2=WQtMWsT;}I zE^Jn5z`rhwVz)@|ei@Q=A8U^ R3x4O; zpJ4f5cyMTt++hK}GKx6CU7tGqD$Y{Q^0)r9B3=o@$TYDqUt^65Xo_0vpt6&Is{%*R z3IeQOH%NAjxLDFCZ7qD%buxz3N+)GeSIPy7tJUcQ3E9W+l^$`|mBk`(fm^!w>|+nl z)nDslc9k8DvPklO`_cb5V}6Hj`4y3K-uo4Ta!grHN!+()326%*((dAQZ*#w_>@@3T z^=V2fA}>n=&cU`~5-cpzbx8<6jbGbJ$7hQWA$qbB+43`Yl9PIR#&teK_$XxI2ba9k zF7u)I_y@~2h!LRt=7uMcPFsRVrNzuL-|mHU0%nLt>{vyHGfA?IkGuw>jIO#|d9n@F zr2d&Ba)< E%~Dbv{wx3QDgU=^qW0MQyFb?cr1Cc&{%Gsg z*{U62>Dl(N(MFjQOSiu2Rtx*ZUt1hLxz59|Xln0v`}(1Z_@c6R3oZ+C+U_Lx&N)Bx z1<3H-w^sn}KY%x?%=qr=1_1m4sK_lV7Hj=uzz?uLN{-|;>>3XI06#SUW5PB3f5jJv K8ghW0-v0tHKs4z9 literal 0 HcmV?d00001 diff --git a/picture/2.jpg b/picture/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3984c810b179520d01e5e66ce2ed2db245568758 GIT binary patch literal 18609 zcmdVC1zcQ7vnW1<7!YL83>w@r5ZoaNmKh*~!9Brka19WM;6Atqn8793;E)7&f@=sK zT!QN(yWj36-@E%Z_q}`n@BeCkoKw}OPgQqSpX%;9b+{P4_yQn+%0OfQ7#IKm#^n!i zF^e$@k(AVb0#lTM$V>lzp$%{eSMLD;aBD| A@O%F+=}WLl2LJ^3007MJzsd~a0e}i00O0ocUu6t$0Ra3r006r8ud=^%V*AYg z*>CKwULLQQm;eAfSpWd8CICRx2LNDe|90*2@HcI{b9ssKvRyWpKU07ez!-1`00CG7 z3;`UM7&qV^fD6EXF#(VSU|#tS-;bD=aP|7t?{M?_^=sF$Zen9&-NeGezJ-4a8wU>u z3kw&Bi-%7@03^V^MMy+QKy--{d}o63{Z7oQH!p7_z`??~Ed5Wy#d`qo<`o4DLre@h zz!e|{CJ^JI2|#^0)-V89Fux!F1=nv}yNP)f3*!p*<#j0n0N^^t70hdx*jKM!zpQp? zpDUPGuU)?ZBqXA}NlZfefR0Ov>^8T$# +>$(KIphp<;h_Lp3U z|Kk3Kl<%d$KV|+|Iu5vndD$KyCJ-P2SWh*1+?AYYbHcwYy}oJM%~xDf{NXFAE1r|c z``eDbJtmvo2&J+NssPHPl->0m%)NLwI%!Oj*-j~Rk7>t5jx;_sET4;=RlUsh?x;7P ziV^P?Rz2je*_B*O9y44UK Y>={ei^+DB<*aeSyR80YeDf22f{Srj>Eq}ZxP@oH zT<=?XKUNn1fs0HofV=32$^<`hA rprBabDdYReIqDVN5qHZ37@`z_X6|&iuJ$L65xB%dsr4Rs4lz$pP!FeSv zJH;7Z1E=mM4w$OH>l CdIWA?u!?@XmJ% zR`GOPpL#_JeBB*?F;d4VK}YMP{E4C3r*DBc>`7|5SIuw9zgjbZhBu)qcLMdfDhN&B z=ntqzyg*L>sPMI?c%?Ff3M!qb7Kvaw(A|pZ91 x$QlgZ^Sptu0URj;4j_qzb(_IVH8|E=x~jc;PQgG;PV4^#F#7_SB%i)fPAlD{p@ zPbEXR^X|F}kY=NeGP~KeGKfst3$WA{P2V}&-q5wD^60iGx2Pe=EzXQrrkiENj393+ zG^VhwZD*N!zRnc5uL~Vao+Vc)eLUU7co&g+bz|U2#fnMhaSsp481HWQfDKg~jDa<; zUF` _qeq{(p8LVDQ!n zHR`x6jVM&l>+*$Hdd^H+d?-s}abI>E1HY}58x^aLRVI4pF7oxvu_nN7n=gA~P7HT3 zwKV1%FwUvRu%OYnRiTnqI}t1m0$U@~WUEk2T7rN#MW3id3JPCpb+N~WqQ}UB zI#L{9uOI5z8y4kCqB?nOUbYg4;v4$;y{-AJCzp0qH`-h lRrl~8 eMr#eRBHR?i~`owNGS?lwC1&No2wPf=kbN-on;a-{AfPQeqRpY>nn zy$*_PZfq*3m~fb|Q(qJxyZ|UaS3Qa~JR!hUxvu(Cfm>L)#Ng-X7sjLKO_-_}(Ld7E zhUXNlrV;~4AxK;MWvQ9e^xR$tT&Tf5Kq1f>20{op4F{|6#vRDW=E-rr~} zymIQ;PCJXw{GXWll2~R|b9yg#ula|K8C2G(GPD|iq0d_9q~Ni{<55xBeHIVmK`3VQ zM1;GymiKRp{_}9_=aEFOdK+nh>-nJ^QwhG6Pp`OxtWA*#<5z=q+i;ls)*O8xuj*@?o5xEufe(Eh38Uq>*KEyPGmbd3*>mRl@wC^JLU z&1wXUMk;ubj|HB&Fb(!cMcW^WZ09_JsmMG6AFp9bV? zVq^eLp@=d>Uph=hJ0fC3MsoMpoBd}^+3|;&4(i2;WIKKuXhVux128N5Xd;z;ZugOl zUgpQd&{q- B(HX@VRf`?RuBxg{@HQ`73R=<|aH)7igV zd2bhgohxJ^oJ2M1iMn>9CWuY+Yqn?U^z>SOupbkE+sWA_BVDPjzpInweF{Ak(QNeX zMT29?38fIjoCwHT<`IMA9_^vB`=goGM*a-aK|vNiFH)S`%wpbSP}y?j$D#8ce*HDR zaExf_by{yJ&r0%_gx>&3^;eimp6@k3gDS0;Fp?1)?}4j@w#bd0lHs*7Yiw5Z3W3Yk z6WddAA^G(S3|+x)jM72EA`wh27Ls^bJ}t=)z&M;QBX+q#1%9SrZk2_J+3+>nJONT` zHa)OV$DCGhb;7vpmd*uWf85*r3pXrn9pwAA7N57Z^bk(Vpj0&LYPA60ioP9!0>$RW zanxrVAHA@lQsT)Sw~3zdmHVQy(74Su?L6 XOyt-2uRcVrq}Q!*x~7)Ci-WDdGV;TcW|n;+D-Ap+NpAowU__5G#3thJv?=< z*^?tL+qb~|@SLPe^EIEQ4TIxaHg5+(q5Dj&I=Q7Ulwxz qF(uUU~ngu&dWq z-;OKBcBz*8(vnjZBis4Q<#avfQyc7G2&I|0@2!{!+C(NBH$_=L6>h8XN7mEjccn2s zvt2Jn@!Vdh)s?g7i%j`;5b_jYl$CeJg%pk%U8#M~75?x?2*gCu zG4ujpr|P$I9=FuX!Ni!T+7mZkspHeVAZN8dZTxNtCr9D{f`c)FH!Rn-Jq+qfU+zhn zFE_UkC5?9WOD;BWN8Ai(+aAkHnt#o7Fazc1T`RX0DhA##eD7p~F`}SQT+sQsJ}tk= zoMkkOgSA34T!_2en$u)lg;nLA$}Z#1Fw}{n02%3PDIRF!)8VeXDy^1N_eSl@P5Wwv zmvtn~{R_$SvobJ>aNkO<3UVz{6uQtrVUUqc)4|KXKb)!_V<72UxlGoOM6C9w>8Au{ z#a*a`mV6RZaz}M?9cjYZ0_D%yfr@GKgfabhiN9I!F)Ad$QiN;O%SFw|HHIxCjiT9A z*MmOg!8f_d1 @SQP~V
ZWouRU(F;nTwf+@{ zF8XLMirN?8Pt2n}RD`+hhnX*YkCQ@6IAQ)p-tUOMc`PigSkFy~W_{Uz!P;CQ(d5=w z6MLiR27AM{=V?RbwVx#1`u4 G_<7|I?qhog%qmA6^&++%uf}&DeuG3 zA62 Ygcfk7yx>CNQU| z9m1-;5lX}xD8}(=^)AI@ )AQ8Ip+&YmnGZ5=}KLPMS z#f^8oeHb?aW}L@872NFjhpk-@^|8A0M{q83kHthtl4}r5kUqn3mTn;}#x(}D(~kl} zXVUk>-_wat;@%H%@qVn2L8K}6eD)oRWq*t?D3JR&W{UC >(E1E0*Ro9~>?K z6Bg8IPxgZwpXg!5&yAh(ha*@ Nms`|* zL7d)895nvJo9G{W8K<4jG+xggrUBdzi^AFLfS(-M4gR0T#m~eQ@qQAXgu39-hA83Y z(%VyWKy!#*)97lnnoS4y9zXG 51I7{au+jt{E2;OMFQKA;Au-;yAx=MnwuT<=K zkB96FCi9W-unt6K5i>ui(qC?tt*e93gbZ(jT$w9WyLqsJUQ=jwlcs&;{H=i*_uv^x z&9j(3l#ppqrMi+>>hlmJAp;V s0)Oa?t2bFkM~*))nX7cho=hYfTsq+y z)0o78yZ}rw+`U?Fh&p!3W`R1$b7zj3ar1wU05P4&=*>x@O8Shqq5iTS0SmXQ?3UGv z=c5YJ*csGxLAoO`OI1LkrQQd?-F-a{zYUCh@Ah875uN*8rDCjpk&O?s0vicZWH#}0 zLy0pUR=e*@=1F+Z7oYcODS3(!ht1bx+GoHX=iLci(D?{cG^DeBsMI<#bUl5w@4eZ3 z2|{E6Lm5j{H0ivNdqnuz59<33rM}kvX0j!3GN!{=e0<9MwQWFi+I55$BGoN|yidk> zV-|ciFFKc|Tg7QNnvgl@E^((F{aS4@p}%Wxjt85o0FR+2_wLS3_E4X@0Z@l(u*{q} zx1G`WlkiPlCltKaAy(Ot+!D*FMPYQ4v56=ozi(Cm5^u+74wJ8&H!|{kWXJOlF36GW zK2MS~iEx;?|Ez1?$fvyU`G7+OJu$r2&(or*iKNFJ$`O-aE2zink;`fQj{VZ@3!{%~ zhAmX&{b&lhm|ODEmej^ivP7tXgu^{e@-p3;l6sx+yl^G@vUGKHzbE3(F&<_?m!+LY zEu$W73`g+ Nx4;x-O_I);bk4k54J#JCcu}cdtdvbE5 zL|!pAn32DbRbZnOJTE?9fk;;lf|ou>r>l?!>ohL1ir#hp9_#&ExB&_`y!}}dLse7y zno})b1R|p+&~HNQ?7X9`&HgDSv$|=ZFe7Ei-L8^g+ % z$L_G!A@9x2Bq|22P!f|j1Yry*Yb1Ey8h4z0X0iKq&iK4h0|3&|`*e6!cH(7fbIp5G zPVa#HlsdcHuqbz{0O@9sr<`@D#|;wXRNii*nv*Q=r;afnOqRyQ9Hf-z{;=A+N K8#G}P* z^g|p&rCq38pU*wOEYN=z{_&;OXD*n3Gz{D5=JK0Q0>B+UkZ`}NGu*vEwkbKxiAFC| z$o2=N{X2^B(KsGW|4NOj$1q}KppkwwIp$b 7KlY& m_;20*@;?lU4dyIEV0gU zngTQC1hx3;kpzt;d`G2WkPDl0?;HPiE() s9eIpip+zgln>LvZ`!AcKaT(t*w9WwNLAc zb|gf$W*HZTE f}mI;(x&lf*@uNlbMDH(#{* zK81k_A($H7pcx?mk^h*bs2RULlzG5QdY;D{;UTrX9Fx6*K~Y_rotIzaSUoq2hy@lB zL9Aml^A0!mW~X1r=z4xUz#BMaSNuX{LKdt(crSxbXeyqeU g=r(730+0`vGiIIS0EP>FEAGa|!#KC$$cfou94aJ#GjDn(3v^k@_Gye3 M#a)Lj4k98*YEjHY)D9U F+ zB=e)U?ALiViz(U BIVS{YjRqo=7%RK6g;D7mHJn30F-ET|c5O zpm>BWe>%!|#fr7^EB!93#i94RpZNYxV0_irQ#B+mEn#mrCap$`AW)*_uqrq$6N(1= z(V!>Jq?E~vS$fKA8+lLT7I`#dMz!nLD9X^e=r1GfiQHb~LT}=>Z^P}W)iKDsS*!-5 zP%=hRk=#*36gY6X&=9eHok;TMEnp;b2^JAK`|Z65n6>De22j;4@Mp`2{^=_^kTnaQ zuet^~?~+XimQ^bDHA>wYM?Is N8-j4AZ6XygHu>>>nF0IbAn?uWfM(45xWyFUOBgl4N@)x zJEhoib+TeQqTHm%#QocqSj{c~oD@DBP)=iZIb^!Axt0RE(oNm_{W{-t^S41l$;3%& zIouq&k>s~puyt;4N=n*IB$?T@APXKdbhnK2l^8+bGP8mq?&2x!T{O*eTq!Ww!s<5` z0e5CAePm)g_n~rEBY7mPNjn(s2AECu8}|i&6sIvgwhRcFv>1k%W)qF;bD^!e5(}PP zhHfgZ)g^p2(k4Ib-6VgbQT(*knv$hk_E{8y!W>CR@Fq45=txKX IeJ~ka!7iSz}MW}G6WI#s& z_#vN%(FvkmYkDOfduB4MwlaB&19cuqc0RYY` H{CF zf=p=N#UQ-g*7QD|Emeg+{Yf*w6Tj*o!alW^4Qolh9-WJ;sT`8ew=O;;E@Jj^iWnj( zwPp+In}DFM>k|k4Ea4Y}KX)&^$+*d$JE+i$%<05*yQXz^iqO+v=@VOiYM|*?o1C^) zx;>V_L%^Tjgi=p7axTtCd&Et34Lfk3(86AR49mDIg7kb3M0zInc{?$s%xEk(ls|BJ zej-!FLtM 8XF`-xj7_{T#cj-XM2WGc87$XlC zNvIoz8Vnr^YpBeSk?f teA=yM zEu-PP0C=6L##2vAnLBFik#cHua|kG47h+y3RZ4polc=ar&B!4A^*)aThb20VJ?w6W z!Sb2#P=l{w9;=$%1NO=J5u*2F@$d##DuJ&>O6sr8NmI?oW7)}D6BL4)r0IHKLrjjZ zC*YIe%Q?+9=O>;Yn|@aJkCfu_W>W3z5RVKOMSfRNPU?+Bdr?_L=(o;^tQ!Jh@H&3t zD-yD_%4*Aa_`0FSc=P34cGWF+bVUmp$6Dpp+N+=v%61IV@uw 9LpgDkG-dhZYhiu8WK3^F(sO@suFgSk zmXxeni0LLrrj)Md?9(E?)h9z}p)kpT1mjf5L4f>(I`FQN*>SQ OQuiTLneCT>p#ZLFCWfvOEB$+HM=g|NsCN10gY2^^~jIaZ7YFe6(rJM z;mH2ioPpBbsRNfz@do*k%tngUmaCrF6#u+y7$enEY{g?d8|sPYR^PLGegF@ =+nTAwU~XO1u=_>f$;4xhyO6l@dczG-J%oL m*Qd2@KKw5hN;dWPI}l(%Gz9p09iUnhS k5^SBxnm)=swEM?odUs5X~Ya2*`CM**$)(mS3V#T_g zN$H%>?d~8@M9i6V8@^WcUu)#2|Gq~4K^gxsDp-qJ{dzc*aacyWIGIkLbw#8w@{zqP z)=s;ecz`15L~5g#E8deEDz