From 8d696a9628a8bd78fe4bcde16f2b417b33839886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B5=D0=BD=D0=B8=D1=81=20=D0=9A=D1=83=D0=B7=D0=BD?= =?UTF-8?q?=D0=B5=D1=86=D0=BE=D0=B2?= Date: Wed, 24 May 2023 15:33:24 +0300 Subject: [PATCH] 24.05.2023 --- CurrentInstructionPointer.png | Bin 0 -> 519 bytes CursorFile.png | Bin 0 -> 459 bytes CursorFile32.png | Bin 0 -> 2046 bytes StartLogging.png | Bin 0 -> 565 bytes StartLogging32.png | Bin 0 -> 2337 bytes StopLogging.png | Bin 0 -> 635 bytes StopLogging32.png | Bin 0 -> 2747 bytes piv.cs | 371 ++++++++++++++++++++++++++++++---- util.cs | 247 ++++++++++++++-------- 9 files changed, 496 insertions(+), 122 deletions(-) create mode 100644 CurrentInstructionPointer.png create mode 100644 CursorFile.png create mode 100644 CursorFile32.png create mode 100644 StartLogging.png create mode 100644 StartLogging32.png create mode 100644 StopLogging.png create mode 100644 StopLogging32.png diff --git a/CurrentInstructionPointer.png b/CurrentInstructionPointer.png new file mode 100644 index 0000000000000000000000000000000000000000..59c04331fedebd58f487d75491fa9837555c5620 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4$T;E$SFE76vPb4KJBqX+&gvQtX|LD#W z8|2jT`}@Yyoom$3*(Z6djrjZc^Y!`j_~q?v8WI~8Eqe67x?StTt|w=ns`GfJuCA;3 z`|bAcdwZ*YcYI^wnepP3!I{@wj~_fsy4&?eb`fub3 zfLlaV^#A;OVZYFr-vV zTq8!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4jCP0JchsD8&_h$_ zl!IN9exgByq)U)kY`3puP1|nm)CC@uygk!j@B1D(|M|~StLF{woD7EzbQGR$%ZZ%! zfH`27@QL+)hu>5%E3lcIoy5*yH)Y19nDi1xhQKK?fw$F47#lnuSL>`e(=?00VS=iR z{43^rSvO;ky$`sxutPCaUX}ku`VroQBX930i@aW>VXUXKU#-3_>8?-E{W%%ymCCk# z=2JVWyy3ajx!X7WtSes2tuQ(t`|s4QtK4@RbvJnIUH=y7G1U^+h?11Vl2ohYqEsNo zU}Ruqple{RYh)Q>U}R-vX=Q4mZD3$!VDRC*$YT@@x%nxXX_dG&G)`I*57fZm>FVdQ I&MBb@070jpaR2}S literal 0 HcmV?d00001 diff --git a/CursorFile32.png b/CursorFile32.png new file mode 100644 index 0000000000000000000000000000000000000000..afa8a420b9fe58e328b454d6fc603a0eaca4be44 GIT binary patch literal 2046 zcmVUlvz^$4{AdD+1f?Q`AvR4++9uX!v0b!L z8k&^`VkiC)o0ve>{9qx86Z<{CU;drgj_m}MbW>V{(y^@+NaBEY7! z+SW;xChd=@TVVqd@7$M!nw8LyBK422-}UwLy`Ou|x#yk>qA0?bDe0rDt80_hYOT`g zbd9LaC3Wfb`VJI6b&_gydix<=Z8wn)+spmf?jr9$N;u95@~p0|md0&qX(_)CKqlX@ zW5*whi;Mreb?er9+qZAOvu)e9c@%lxTWU)x-Bum46^CcxE^JQga|3MJp zJ^+$6Z``;sjX$Q#%gZPC?%g}8)oK%Jb;Tu(T0LH&)+C6&r~U55m-ak+u5!zFC58qU`ID85(@09n7jvP0~taG|}6~l5Wj$@T56^m_F`YuUH7Dq(dIKCni zpp!(qTCGkHA4MV&iI8@&xhyASg*`Nc+zc4IAWk)n3S4+B1j zyw~lLIXRDv<#B%t0ud$P^HItK=ptK%L@Nmp;v-@vTum;=3t1r#1AT56SbL)Sr;nch zJ5_fr4Yk)3O6#R+ZQC19wJ<^OxmgH#8HG<|!Nt3Q6-c5HBnj9SghwQz)dHBhV^tfE zjNSypyJ;}Zehl?fXLBr<_k8u$x2QH(00#VyEVL9wa~_0vG63s2UQ~p=3=jyTJ^n(G zZS418oVzEtOs1*&$-jc(N>px1R%lvJt6J$0T7pMQuySG%9w+65Rixs_0C*7rZh-Mh z8q70kocIpZr~U%Q*;BcO*6Fk7N7(%Gw?p^iZ1{#Gq12F@5(I6 zG}KSu0@K{Dp?1odU-wSw&W0a@wW}9AqL3Bza54@j=bjM2OB;@i-CT6R^n%=y`UL7H zZ&Q}kg0kWAZOWK>7phYRMeW-g^c@k1`Dp2yh1h<`tIYEd;m=xFsbaNVat{ zz0R8acyq(}&^MY#zHf6xihLpm!B4j(_4tX%yOfCRu__G0_m{V!!kW5`lP=&^`~)ni z4-w)6e0~6iIkGEGgL$fMf5*@!Ow-Wsr2!X%@!(!NfVn&Na>&vL{Cw3LVp z_V~*Mw(*-#clBSm=jXtjJWH8V*U$*067F8f&e5A^!AhcvJWSx;o$YlxZTX4AJr<%30hu1d4@90h6-$B2P@lO zFKTs!;Fu!{hMu_UxGRw55qT*^uO$fAp$lYv?nM_^dg9-F=Gb{I&ouFBzTszudB&fD z!Zf}c&xRl-r(}`s;!vGE{#+1YW0(W{ZjN#bJVhqug*D^>7ZwvdFMt=L*o&(;;R+P# z?Ss1vodc!jju2>CPC>RMu^x2S8=>~99@ANmhpmM$yXj$-dI`b5NS5_Q_1sf577zcf#yZMbl{3D?I~LP-Nv14}*u2 zK+3z7U4R#bc2c*K(is8rmMfxV0DkF@Wb$6j2LvGQrxhNzC~rVt?`eDU+nXEDPopdT z1~tD4;MuUVvSTO*qo0a;X=)KbTp0k1QahIAX;KrCl5E)mq<$l(T4rHEPB=`ha+-H5 z2+RP&w9>uX%Z~jb2>Pp|a@{q4lkLKH%=UOLNj@ZaxkuCm(#L@V2Sjoy!Arw?2v9)E z=M?}b1d!33Tkc>zvM?r>;b14#M)wvJS`u2^9W`IGU3eZRf5ypqm2Uix2jho-AP676 z3r>*h61lN_)&-vi&9VtGw@W5nbcX{P>@jMCc|w^}H>o^y;x&r&^`m7TEJ%cv0h*he z%gJ30uS+IewUS&K2mmRa9|l1BcpTX4<{;o<;W*s~FSHKBUKH*WI2q`H2uZ!da&h`O c0AHs52Xi!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4{YMUj$urw(xut@_1M^FJ@)L5pR{<$&cqQXAxTTfIs+* zf&Az5?+)<)(SCnn_TdI4`wx;1><(9J%bUMdR*N2BY`7?wvtsMKB0FLB17SfP*D9L( zJuka#4Aa>XwN}VD*gVQha(Tizem9PiBVFc`U#5KjxUj~(uli6^*e1E`#V1eSQYxCf z`?S)*zuC>{?bi}l%(%+>sAl#LHp4iHJZ1!dv4LM+B3Q47XR+edLnnV+V$-YKdz^ zNlIc#s#S7PDv)9@GB7gKH3TB_5F-OCV`D306Kw+nD2 PKn)C@u6{1-oD!M%OozK@*Utizk_xm5|=;*M{ z3Yf+Uo&>JpDE^bEh{tmG=T1}#CPampDQb#o73~MQy}IX(QDel|Y;4o5 z)3s}tX?t^)C-?||nTv84xgKsGyPGZL8aacw zUQDw(ty-Cp1%c*ej-{;}LrXlv@Bn)o+#EEM%h5C|@O&1-Foimu?q{MX#x`%>eDt#= zn1Jz=sERQuBHhf&fbg+6EWRup6no)YDz`|Yt;(7ul`Yno))pdtagkpCK+!7dfuee9 zO;Ly{F6sc=4s^n~PO8|ogL-gPK)-5v5ucxjFwcL(2a?rggl=>nYLrs=l4n;CWlqSoyIgSa}1O zfboQ8tLM5V_~@sa*1CTtc`MFStCqVs$c|~@qVHQQme^*G`@}5)vnaweaD!L*Pe8~u zAp+-mp)>$TdgYMmeQ8vu8Y9w@q(E^hs(F-0&AxiH%l`!G+Ikwb2hIZLfzv4DKZQCQ zE}+M@#ZXJ#4c*sPZsTd%YR+1C!XnEv6?bIdmH?88DVThM5El>z0bsc(o)QP?3zi{c z$kZ-K$>qxtTDt)uUrjRV@X{#clhC#;GHTx91k9+ZJ_EJ-ib2G0QLyT|evK;x0yq#b zmJo0=15kU?15>0ANI#Gsz!4}z1j^9QPxFKL9lVcw3HPwyVS6m!GK7~lWrbD;H13iH zRPjgyOjM7${IzIjpc*EuL2bS*Km}^?u7z_u(eB`fsJZ&OzIf&K+XTcwz{%SM%r@a9 z5g>*^L@$nU{rum#1NgWQr9I*fS~hN5;!JJb(16-%PoeE~@1pIsS5e6O546*F8SMZ< z-jC1@?-k%OYTNQ5YWH77dxA04T=Rjx*yRQR7zCV52)LPnc-Kd7c0ChiVn)SymEFg_ zDGf+Jw1nkh+$OXOHS|}chgf7PTcXJ*FDXr~s2EMHe&|wKZP}mGs>GUtg1-RYcjSDa-rU@!aeFXMbHr4in6_FKPKxtlk zUcRN&vO-{R3CTM7+pn@dCE+qQLPYXlAC&)xK^bV z9XNadJvs6uY7Mk@IxLP@_QLG9XoeO=2?St1gU8qkFaVvf^8vEYQy>6+u7DwR2pv=o zq9J8S(--NZLpwuD*Kb z0-yvGDFFy@&k7h&2higKkE20#5H_x8 zH$V4BKtzcw*f+RuK~#-uYU^t&^78VYr)l~vaJ*=dEw6*)F8~#e7ek;_AP2_$f0%Us z0-{PZN$pdU!D{w&?~!1;v|-JfH78_Q{u}&$zX8r&;9LZOSQr}!WPINQkUzb>y(!UX zRCD<7VKh2Aih{x5E{DSr%gM0Y{D;L1SZMC=?2{ zIGxT|c6RnSltY^kkP6rmcW=6{0$}oFMNv?He}86ocQ*sur6Jfv{>x}Ijh=0Fi4u&>34qim5!>0>>8z@%^158EXCVvkfrwW? zKqEK^B!wghfsF43;sY^AA0(6J@7Jc24Xx5lfRmto<0fV*rrXJhUWxCB9R4T6$}jxk#cC@{jD0F1LJVv zBvDIJM(ReoH^Iz2nY*6EfLJr|YBmYI^+)J|(Cy1Gi3r%ccdrKQ0(cHMD=RC5pmG3G zH3s!M4i3ji=aTh%j~pcp2QkJ-+9BovGI>i&%d$BE|4;r6FW5Xxj#gt900000NkvXX Hu0mjfU+qba literal 0 HcmV?d00001 diff --git a/StopLogging.png b/StopLogging.png new file mode 100644 index 0000000000000000000000000000000000000000..384d53daeca2bf0c7e3769a687b6e83730bfaddc GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4lFzu{ganXur2ppoH!Hz2PB3-qSA_RX?~8vRG-S z$&(8=_!sHE@XzS@$B;Q8;|+gDTidls9b7LT-jZPHZ&x)5S>gQY%ii^_@>+}9*!8Br z-~GMj`<%n73>BYTlf7=FGhAad5Pqll1S^Q2&=~}I$;SPrd zYoh|)EvJ|3ZuwdMDZx5h`}eYFNB<7h|95J-XX(3Kc|3XM{+35q{4V^~ZTY}=>VN@{ z(8~M$<(hLvB(9%XVYry>nfAf8Q~!GWC>Gf1?pQ9^f4p{CW>lxkq01R2%i1PdbA>El zn0d>&x;-_r+NtMMc>|O0Lt4C{Xa#t+h}Q!8fo}%gnYQt+lnS+K2XKtDUt~0yrQ=P_$cHtHs*xcBl0* zTZTuHd-r!EGTQYI-RaC`=F2&`lk@w1&hK$J7gbeNp@#HD=%~U>bs~9Yn^gB^i<0`f zO|HMzDl-hX$qfB13i7g7NgeADV;fJ1)ssJpiBs2=EJx4%r52TM-GbJytq@hMTZaT& z_bRkw!J^Q;iPP9-IhEfoR=(I8rfKs^w3l1NSicvkd@Ul?pf^ENMM;*l%JqG1GTm^iOy_Tv>4lMNl@fuVglBU7kXNqr9g`75 zJyQMNvr^Nz*VPv5OqyM*aoEo2BkhAOyPb=)J2;!&?iXZtI07T$A|oS*S(f#aBst`8 zIL@S{r4?Y)jU4nG-h}U#7#a==lu}`Pb zzJsaNtzi-gPY?t@XU?4ML4e~j-M&_dw!KxZ;{@kDNwfKLxkdg9rR(^<&9(f+%FX=w zrKn{bd<(smE*J-vl=KHLsAynXf%z;OjE{4 zGewy!G#z0y8pmt3+Rv?4D?fk!{Kgw8fP#aZ|Ii}S4Z+Tbzg}GE|M9Ood{>Vg<*s*h z^4Hqhxqt23@4rx1>F-HS8TRU|16^XJzb90E{~N(UX~1#98wW6A#8Em?0_#rE0g$X5;6lrM?;j zfHoWQid4fwv7L-h=KD6)@c%y5%keip!pQlqT;+a#dp~z}QJ&vRI|h4@g8K@o`NlZY zVb}9)3_1`;qH1@UI6waoD)fAYR^+^gmS(?+RxW8q&pyGUqRe6K)Wj!figJ(<%2%O4 zxp_Au5bSf2Y9I&@m&9LOw~4>r-pO&d01RIKiTmg7J=~eh9KV;b4R#|80Cap~3iesd z85E29F@#>39vA0x{2#G>L%5*1|1(UaLp0C5_5(g*M<2_*nv27sm!fEy8LQ5Y_J zL)E_st=1Kr;Qw~%(*Ysp5O!|x(hvN=#Xj!Zv6jH4nr;45kGOqalXU<9{JjY8e`yBs ze#|jE30<%+A z`9*WMwimi!sM8kfgKGC*EUWZE&bgoWyuTUjWo?>5DLb9(}#|(8NhCYP?Da9lQ)i=UI7*+(IxH^C{sk3-mS+8kiWl{v3v5npfG!ob=YAHhs~ zuUPf#_o9e5_GoR7$H&Zw6D6l-hRmD$km*Z=~~Qek*m)J}1pcX_L*J zUT+xxr!i23Ha&*zgCgXh2ww>TbRo^Sb}?SwtRRPvsm*)~&hV{zcCdxC4|_@bK(oO% z*rI2Lyg1`Kf*JY43Il&C9PjB1SLeN_GEmb=yC$5CaVlM|DRh+MVN;ZIHtC9-1)5Do zJ7-Zbu7_YA%Q);(v&j@mXz`DO0I8`vf&iboCWL=(bj|1xt3Ez~!oE9>r2Xwk!FM4g ze-hM7bSxv(`Y05=bIcOX3lFy$(4D1F{h$vg-68 z17dGT5}cc9WHOtbI6)k;v1}mq=0Ws)@pAOmLvu8pA&Q4jBeb<0g`Ma?%7N1&HGeh? z52{x}@I9g0Z!U;cFMl73Wgf)z&L1f4yFLd zKe;Uh!vFKi(o(doun4{O=cm!D&y-5aAA8)8VvBUeh{IeiB&P3|MKIG%wBu2$%{YrR zO2?B_n2BN3ILpGxZ-K*~rXUg&%`nD02%=9D0D$fY0GA0=v3|X{thPqHy0#W8EGwm_ zrKcHnE~gsFWm*&#YCxD$fmtmGcR7*5YSCaOqX~?eY-Y3IoCF63K}-;Yp=fv}h+!BC zWQ93y6#yUwgpdLNNWBRl++;RYSEF)JW>Mkv*hv%X$w)^d!CKd-Y4c_UX?Rg-qzbea zhSIWDq-Ge5plJq-nZR;z_oEK~Cjj_Uy=4p9P_a&wwO~Q&SeNU4lV1Owjb<)JI~?Cf z+3lT9*0#k))8kl^DFSwlvkXI9z&M1L6g1*U5Xs#B{q6wPS5<{VBt*}yT4l@4%1%j| zJo(*7yM2&0nZ98ymQp**Cc;jIZIdwS!MTa~BLT|G%O&dopuWByz3{>d$m8*>h>D8x zYc!fxilU&dEeH(BLH3~I+e7?c-|rb<&6+jg0zgAU18Qn&LM0_71<}#bJceP%0YE(h z5Ds!OLS;k2{hTPLUkcE2CSr@&Aw7}A0S#|{uH7{3cS zg*9L!900}wz+nLJ13<$lz}Br>gJVWUhTG|Meyr2!PQk)vyWM^q7J31q3XHhGfC!`* z3Aqpv{4QjKHA*3k5KSwN;|E7l&@>7Fp%)9|%9Sgl)6>(l5)u;LhA5l|h`#|q9xSj3 zAry=V66W_JVGY<2>L?7-x<|N_!h6BXqX28yt_^lUU0q!;8d+IcWe^Dtx}Y11a1tz( z3I`A9K9CRz=RGJEb}pn#b;oP@@7r+u_U#B>oeE(AFM*c`wOak5!C+{F+#P__9045? z3h5s78R#I`cpID_k;!B}nDZ$qDRrX&6%`esLKoE3)ClPi!TZ|+I0ri5hdzN;2$_&K zp?XKe-K9o /// Ноавя версия ПИВ 1.22 @@ -14,7 +10,7 @@ namespace PIV { public static Byte START = 0x3A; public const Byte STARTTOBON = 0x3C; - public const Byte STARTTOBON0322 = 0x3D; + public const Byte STARTTOBON0322 = 0x3F; public const Byte STARTTOBON0323 = 0x3E; public enum ADDR : UInt16 { @@ -334,6 +330,11 @@ namespace PIV Kod_Oshibki = BitConverter.ToUInt16(Data, 81); CRC16 = BitConverter.ToUInt16(Data, 83); */ } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } /// /// Новый класс пакет 0322 в БОН @@ -344,9 +345,9 @@ namespace PIV private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; - private static Byte _num_pack = 2; - private static Byte _dir_pack = 2; - private static Byte _addr_pack = 3; + private static UInt16 _num_pack = 2; + private static UInt16 _dir_pack = 2; + private static UInt16 _addr_pack = 3; private static UInt16 _id_pack = 0x0322; private static UInt32 _schetchik; @@ -427,9 +428,9 @@ namespace PIV _addr_pack = (Byte)((value & 0xFF00) >> 8); } } - public static Byte num_pack { get => _num_pack; set => _num_pack = value; } - public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } - public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } + public static UInt16 num_pack { get => _num_pack; set => _num_pack = value; } + public static UInt16 dir_pack1 { get => _dir_pack; set => _dir_pack = value; } + public static UInt16 addr_pack { get => _addr_pack; set => _addr_pack = value; } /// /// Счетчик /// @@ -624,6 +625,11 @@ namespace PIV public static void GetData() { } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } /// /// Новый класс пакет 0323 в БОН @@ -807,6 +813,11 @@ namespace PIV Vremya_ustar = BitConverter.ToInt32(Data, 44); CRC16 = BitConverter.ToUInt16(Data, 48); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } public static class OES2BVM { @@ -854,10 +865,10 @@ namespace PIV { get { - _rejim = (UInt16)(_r_ioes); + _rejim = (UInt16)(_r_ioes << 0); _rejim |= (UInt16)(_r_zahvat << 1); - _rejim |= (UInt16)(_r_rejimoes << 3); - _rejim |= (UInt16)(_r_sostoes << 5); + _rejim |= (UInt16)(_r_rejimoes << 2); + _rejim |= (UInt16)(_r_sostoes << 4); _rejim |= (UInt16)(_r_vsktk << 6); _rejim |= (UInt16)(_r_rks << 7); _rejim |= (UInt16)(_r_eizo_recv << 8); @@ -867,7 +878,7 @@ namespace PIV set { _rejim = value; - _r_ioes = (UInt16)(value & 0x0001); + _r_ioes = (UInt16)((value & 0x0001) >> 0); _r_zahvat = (UInt16)((value & 0x0002) >> 1); _r_rejimoes = (UInt16)((value & 0x000C) >> 2); _r_sostoes = (UInt16)((value & 0x0030) >> 4); @@ -927,6 +938,10 @@ namespace PIV public static float usAZ; public static float usUM; public static UInt16 CRC16; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, 30); + } public static Byte[] Data = new Byte[32]; public static void MakeData() @@ -961,9 +976,18 @@ namespace PIV usUM = BitConverter.ToSingle(Data, 26); CRC16 = BitConverter.ToUInt16(Data, 30); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } public static class BVM2OES { + private const UInt16 _len_pack = 42; + private static UInt16 _len_data = _len_pack - 8; + private static UInt16 _len_crc = _len_pack - 2; + private static Byte _num_pack = 1; private static Byte _dir_pack = 1; private static Byte _addr_pack = 2; @@ -1081,8 +1105,12 @@ namespace PIV public static Int16 Xrks; public static Int16 Yrks; public static UInt16 CRC16; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, _len_crc); + } - public static Byte[] Data = new Byte[42]; + public static Byte[] Data = new Byte[_len_pack]; public static void MakeData() { Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); @@ -1126,6 +1154,11 @@ namespace PIV Yrks = BitConverter.ToInt16(Data, 38); CRC16 = BitConverter.ToUInt16(Data, 40); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } public static class BON2BVM { @@ -1413,6 +1446,11 @@ namespace PIV Kod_Oshibki = BitConverter.ToUInt16(Data, 81); CRC16 = BitConverter.ToUInt16(Data, 83); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } /// /// Новый класс пакет обмена данных ИНС от БОН @@ -1653,6 +1691,11 @@ namespace PIV public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, _len_crc); + } + /// /// Функция формирования массива с пакетом /// @@ -1733,6 +1776,11 @@ namespace PIV Vremya_ustar = BitConverter.ToInt32(Data, 68); CRC16 = BitConverter.ToUInt16(Data, 72); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } /// /// Новый класс пакет обмена данных СНС от БОН @@ -1866,6 +1914,11 @@ namespace PIV public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, _len_crc); + } + /// /// Функция формирования массива с пакетом /// @@ -1929,6 +1982,11 @@ namespace PIV public static UInt16 CRC16; public static Byte[] Data = new Byte[8]; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, 6); + } + /// /// Функция формирования массива с пакетом /// @@ -1962,9 +2020,9 @@ namespace PIV private static UInt16 _len_data = _len_pack - 8; private static UInt16 _len_crc = _len_pack - 2; - private static Byte _num_pack = 1; - private static Byte _dir_pack = 2; - private static Byte _addr_pack = 3; + private static UInt16 _num_pack = 1; + private static UInt16 _dir_pack = 2; + private static UInt16 _addr_pack = 3; private static UInt16 _id_pack = 0; public static Byte Start = CONST.START; @@ -1978,25 +2036,30 @@ namespace PIV { get { - _id_pack = (ushort)(_addr_pack << 8); - _id_pack |= (ushort)(_dir_pack << 4); - _id_pack |= (ushort)_num_pack; + _id_pack = (UInt16)(_addr_pack << 8); + _id_pack |= (UInt16)(_dir_pack << 4); + _id_pack |= (UInt16)_num_pack; return _id_pack; } set { _id_pack = value; - _num_pack = (Byte)(value & 0x000F); - _dir_pack = (Byte)((value & 0x00F0) >> 4); - _addr_pack = (Byte)((value & 0xFF00) >> 8); + _num_pack = (UInt16)(value & 0x000F); + _dir_pack = (UInt16)((value & 0x00F0) >> 4); + _addr_pack = (UInt16)((value & 0xFF00) >> 8); } } - public static Byte num_pack { get => _num_pack; set => _num_pack = value; } - public static Byte dir_pack1 { get => _dir_pack; set => _dir_pack = value; } - public static Byte addr_pack { get => _addr_pack; set => _addr_pack = value; } + public static UInt16 num_pack { get => _num_pack; set => _num_pack = value; } + public static UInt16 dir_pack1 { get => _dir_pack; set => _dir_pack = value; } + public static UInt16 addr_pack { get => _addr_pack; set => _addr_pack = value; } public static UInt16 CRC16; public static Byte[] Data = new Byte[_len_pack]; + public static UInt16 CalcCRC() + { + return CONST.CRC16(ref Data, _len_crc); + } + /// /// Функция формирования массива с пакетом /// @@ -2006,6 +2069,7 @@ namespace PIV Array.Copy(BitConverter.GetBytes(Address), 0, Data, 1, 2); Array.Copy(BitConverter.GetBytes(Code), 0, Data, 3, 1); Array.Copy(BitConverter.GetBytes(Lenght), 0, Data, 4, 2); + Array.Copy(BitConverter.GetBytes(Id_Pack), 0, Data, 6, 2); UInt16 _crc16 = CONST.CRC16(ref Data, _len_crc); Array.Copy(BitConverter.GetBytes(_crc16), 0, Data, _len_crc, 2); } @@ -2021,6 +2085,11 @@ namespace PIV Id_Pack = BitConverter.ToUInt16(Data, 6); CRC16 = BitConverter.ToUInt16(Data, _len_crc); } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } } /// /// Служебный класс для пересчета угловых координат @@ -2331,17 +2400,249 @@ namespace PIV /// /// Функция извлечения данных из массива /// + static Byte[] Data = new Byte[8]; public static void GetData(Byte[] arr) { - Byte[] data = new Byte[8]; - Array.Copy(arr, data, 8); - Start = data[0]; - Address = (UInt16)(data[2] << 8 | data[1]); - Code = data[3]; - Lenght = BitConverter.ToUInt16(data, 4); - Id_Pack = BitConverter.ToUInt16(data, 6); + Array.Copy(arr, Data, 8); + Start = Data[0]; + Address = (UInt16)(Data[2] << 8 | Data[1]); + Code = Data[3]; + Lenght = BitConverter.ToUInt16(Data, 4); + Id_Pack = BitConverter.ToUInt16(Data, 6); + } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; } + } + /// + /// Новый класс пакет 0322 в БОН + /// + public static class sTOBON0322 + { + private const UInt16 _len_pack = 49; + + private static UInt16 _infoword = 0; + private static UInt16 _i_vstr_kontr = 0; + private static UInt16 _i_neispr_bon = 0; + private static UInt16 _i_vystavka = 0; + private static UInt16 _i_gotovnost = 0; + private static UInt16 _i_ots_massiv_NV = 0; + private static UInt16 _i_rejim_nav = 0; + private static UInt16 _i_korr_nosit = 0; + private static UInt16 _i_korr_sns = 0; + + private static UInt16 _dostovernost = 0; + private static UInt16 _d_kren_tangaj = 0; + private static UInt16 _d_kurs = 0; + private static UInt16 _d_ugl_sk = 0; + private static UInt16 _d_lin_usk = 0; + private static UInt16 _d_in_coord = 0; + private static UInt16 _d_baro = 0; + private static UInt16 _d_inerc_sk = 0; + private static UInt16 _d_vrem_rabot = 0; + + private static Int16 _kren; + private static Int16 _tangaj; + private static Int16 _kurs; + private static Int16 _vost_sk; + private static Int16 _sev_sk; + private static Int16 _vert_sk; + private static UInt16 _modul_sk; + private static Int32 _shirota; + private static Int32 _dolgota; + private static Int32 _vysota; + private static Int32 _vysota_baro; + private static Int16 _usx; + private static Int16 _usy; + private static Int16 _usz; + private static Int16 _uskx; + private static Int16 _usky; + private static Int16 _uskz; + + private static UInt16 _kod_oshibki; + private static UInt16 _ko_nedop_dvij; + private static UInt16 _ko_sboy; + private static UInt16 _ko_ots_dannyh_sns; + private static UInt16 _ko_ots_dannyh_bch; + private static UInt16 _ko_prev_dop_gyro; + private static UInt16 _ko_prev_dop_axel; + + public static Byte Start = CONST.STARTTOBON0322; + /// + /// Слово информационное + /// + public static UInt16 InfoWord + { + get + { + _infoword = (UInt16)(_i_vstr_kontr << 0); + _infoword |= (UInt16)(_i_neispr_bon << 1); + _infoword |= (UInt16)(_i_vystavka << 2); + _infoword |= (UInt16)(_i_gotovnost << 3); + _infoword |= (UInt16)(_i_ots_massiv_NV << 4); + _infoword |= (UInt16)(_i_rejim_nav << 5); + _infoword |= (UInt16)(_i_korr_nosit << 6); + _infoword |= (UInt16)(_i_korr_sns << 7); + return _infoword; + } + set + { + _infoword = value; + _i_vstr_kontr = (UInt16)(value & 0x01 >> 0); + _i_neispr_bon = (UInt16)((value & 0x02) >> 1); + _i_vystavka = (UInt16)((value & 0x04) >> 2); + _i_gotovnost = (UInt16)((value & 0x08) >> 3); + _i_ots_massiv_NV = (UInt16)((value & 0x10) >> 4); + _i_rejim_nav = (UInt16)((value & 0x20) >> 5); + _i_korr_nosit = (UInt16)((value & 0x40) >> 6); + _i_korr_sns = (UInt16)((value & 0x80) >> 7); + } + } + public static UInt16 I_vstr_kontr { get => _i_vstr_kontr; set => _i_vstr_kontr = value; } + public static UInt16 I_neispr_bon { get => _i_neispr_bon; set => _i_neispr_bon = value; } + public static UInt16 I_vystavka { get => _i_vystavka; set => _i_vystavka = value; } + public static UInt16 I_gotovnost { get => _i_gotovnost; set => _i_gotovnost = value; } + public static UInt16 I_ots_massiv_NV { get => _i_ots_massiv_NV; set => _i_ots_massiv_NV = value; } + public static UInt16 I_rejim_nav { get => _i_rejim_nav; set => _i_rejim_nav = value; } + public static UInt16 I_korr_nosit { get => _i_korr_nosit; set => _i_korr_nosit = value; } + public static UInt16 I_korr_sns { get => _i_korr_sns; set => _i_korr_sns = value; } + /// + /// Достоверность данных + /// + public static UInt16 Dostovernost + { + get + { + _dostovernost = (UInt16)(_d_kren_tangaj); + _dostovernost |= (UInt16)(_d_kurs << 1); + _dostovernost |= (UInt16)(_d_ugl_sk << 2); + _dostovernost |= (UInt16)(_d_lin_usk << 3); + _dostovernost |= (UInt16)(_d_in_coord << 4); + _dostovernost |= (UInt16)(_d_baro << 5); + _dostovernost |= (UInt16)(_d_inerc_sk << 6); + _dostovernost |= (UInt16)(_d_vrem_rabot << 7); + return _dostovernost; + } + set + { + _dostovernost = value; + _d_kren_tangaj = (UInt16)((value & 0x0001) >> 0); + _d_kurs = (UInt16)((value & 0x0002) >> 1); + _d_ugl_sk = (UInt16)((value & 0x0004) >> 2); + _d_lin_usk = (UInt16)((value & 0x0008) >> 3); + _d_in_coord = (UInt16)((value & 0x0010) >> 4); + _d_baro = (UInt16)((value & 0x0020) >> 5); + _d_inerc_sk = (UInt16)((value & 0x0040) >> 6); + _d_vrem_rabot = (UInt16)((value & 0x0080) >> 7); + } + } + public static UInt16 D_kren_tangaj { get => _d_kren_tangaj; set => _d_kren_tangaj = value; } + public static UInt16 D_kurs { get => _d_kurs; set => _d_kurs = value; } + public static UInt16 D_ugl_sk { get => _d_ugl_sk; set => _d_ugl_sk = value; } + public static UInt16 D_lin_usk { get => _d_lin_usk; set => _d_lin_usk = value; } + public static UInt16 D_in_coord { get => _d_in_coord; set => _d_in_coord = value; } + public static UInt16 D_baro { get => _d_baro; set => _d_baro = value; } + public static UInt16 D_inerc_sk { get => _d_inerc_sk; set => _d_inerc_sk = value; } + public static UInt16 D_vrem_rabot { get => _d_vrem_rabot; set => _d_vrem_rabot = value; } + public static Int16 Kren { get => _kren; set => _kren = value; } + public static Int16 Tangaj { get => _tangaj; set => _tangaj = value; } + public static Int16 Kurs { get => _kurs; set => _kurs = value; } + public static Int16 Vost_sk { get => _vost_sk; set => _vost_sk = value; } + public static Int16 Sev_sk { get => _sev_sk; set => _sev_sk = value; } + public static Int16 Vert_sk { get => _vert_sk; set => _vert_sk = value; } + public static UInt16 Modul_sk { get => _modul_sk; set => _modul_sk = value; } + public static Int32 Shirota { get => _shirota; set => _shirota = value; } + public static Int32 Dolgota { get => _dolgota; set => _dolgota = value; } + public static Int32 Vysota { get => _vysota; set => _vysota = value; } + public static Int32 Vysota_baro { get => _vysota_baro; set => _vysota_baro = value; } + public static Int16 UsX { get => _usx; set => _usx = value; } + public static Int16 UsY { get => _usy; set => _usy = value; } + public static Int16 UsZ { get => _usz; set => _usz = value; } + public static Int16 UskX { get => _uskx; set => _uskx = value; } + public static Int16 UskY { get => _usky; set => _usky = value; } + public static Int16 UskZ { get => _uskz; set => _uskz = value; } + /// + /// Код ошибки БИНС + /// + public static UInt16 Kod_Oshibki + { + get + { + _kod_oshibki = (UInt16)(_ko_nedop_dvij << 2); + _kod_oshibki |= (UInt16)(_ko_sboy << 3); + _kod_oshibki |= (UInt16)(_ko_ots_dannyh_sns << 4); + _kod_oshibki |= (UInt16)(_ko_ots_dannyh_bch << 5); + _kod_oshibki |= (UInt16)(_ko_prev_dop_gyro << 6); + _kod_oshibki |= (UInt16)(_ko_prev_dop_axel << 7); + return _kod_oshibki; + } + set + { + _kod_oshibki = value; + _ko_nedop_dvij = (UInt16)((value & 0x0004) >> 2); + _ko_sboy = (UInt16)((value & 0x0008) >> 3); + _ko_ots_dannyh_sns = (UInt16)((value & 0x0010) >> 4); + _ko_ots_dannyh_bch = (UInt16)((value & 0x0020) >> 5); + _ko_prev_dop_gyro = (UInt16)((value & 0x0040) >> 6); + _ko_prev_dop_axel = (UInt16)((value & 0x0080) >> 7); + } + } + public static UInt16 Ko_nedop_dvij { get => _ko_nedop_dvij; set => _ko_nedop_dvij = value; } + public static UInt16 Ko_sboy { get => _ko_sboy; set => _ko_sboy = value; } + public static UInt16 Ko_ots_dannyh_sns { get => _ko_ots_dannyh_sns; set => _ko_ots_dannyh_sns = value; } + public static UInt16 Ko_ots_dannyh_bch { get => _ko_ots_dannyh_bch; set => _ko_ots_dannyh_bch = value; } + public static UInt16 Ko_prev_dop_gyro { get => _ko_prev_dop_gyro; set => _ko_prev_dop_gyro = value; } + public static UInt16 Ko_prev_dop_axel { get => _ko_prev_dop_axel; set => _ko_prev_dop_axel = value; } + /// + /// Время устаревания информации от комплекса + /// + + public static Byte[] Data = new Byte[_len_pack]; + /// + /// Функция формирования массива с пакетом + /// + public static void MakeData() + { + Array.Copy(BitConverter.GetBytes(Start), 0, Data, 0, 1); + Array.Copy(BitConverter.GetBytes(InfoWord), 0, Data, 1, 2); + + Array.Copy(BitConverter.GetBytes(Dostovernost), 0, Data, 3, 2); + + Array.Copy(BitConverter.GetBytes(Kren), 0, Data, 5, 2); + Array.Copy(BitConverter.GetBytes(Tangaj), 0, Data, 7, 2); + Array.Copy(BitConverter.GetBytes(Kurs), 0, Data, 9, 2); + Array.Copy(BitConverter.GetBytes(Vost_sk), 0, Data, 11, 2); + Array.Copy(BitConverter.GetBytes(Sev_sk), 0, Data, 13, 2); + Array.Copy(BitConverter.GetBytes(Vert_sk), 0, Data, 15, 2); + Array.Copy(BitConverter.GetBytes(Modul_sk), 0, Data, 17, 2); + Array.Copy(BitConverter.GetBytes(Shirota), 0, Data, 19, 4); + Array.Copy(BitConverter.GetBytes(Dolgota), 0, Data, 23, 4); + Array.Copy(BitConverter.GetBytes(Vysota), 0, Data, 27, 4); + Array.Copy(BitConverter.GetBytes(Vysota_baro), 0, Data, 31, 4); + Array.Copy(BitConverter.GetBytes(UsX), 0, Data, 35, 2); + Array.Copy(BitConverter.GetBytes(UsY), 0, Data, 37, 2); + Array.Copy(BitConverter.GetBytes(UsZ), 0, Data, 39, 2); + Array.Copy(BitConverter.GetBytes(UskX), 0, Data, 41, 2); + Array.Copy(BitConverter.GetBytes(UskY), 0, Data, 43, 2); + Array.Copy(BitConverter.GetBytes(UskZ), 0, Data, 45, 2); + + Array.Copy(BitConverter.GetBytes(Kod_Oshibki), 0, Data, 47, 2); + } + /// + /// Функция извлечения данных из массива + /// + public static void GetData() + { + } + public static void ClearData() + { + for (int i = 0; i < Data.Length; i++) + Data[i] = 0; + } + } } diff --git a/util.cs b/util.cs index b0cf15b..444df95 100644 --- a/util.cs +++ b/util.cs @@ -9,7 +9,8 @@ using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.ComponentModel; using System.Drawing.Imaging; - +using System.Globalization; +using static System.Net.Mime.MediaTypeNames; namespace UTIL { @@ -339,92 +340,6 @@ namespace UTIL } } - public class AdvancedRadioButton : CheckBox - { - public enum Level { Parent, Form }; - - [Category("AdvancedRadioButton"), - Description("Gets or sets the level that specifies which RadioButton controls are affected."), - DefaultValue(Level.Parent)] - public Level GroupNameLevel { get; set; } - - [Category("AdvancedRadioButton"), - Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")] - public string GroupName { get; set; } - - protected override void OnCheckedChanged(EventArgs e) - { - base.OnCheckedChanged(e); - - if (Checked) - { - var arbControls = (dynamic)null; - switch (GroupNameLevel) - { - case Level.Parent: - if (this.Parent != null) - arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton)); - break; - case Level.Form: - Form form = this.FindForm(); - if (form != null) - arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton)); - break; - } - if (arbControls != null) - foreach (Control control in arbControls) - if (control != this && - (control as AdvancedRadioButton).GroupName == this.GroupName) - (control as AdvancedRadioButton).Checked = false; - } - } - - protected override void OnClick(EventArgs e) - { - if (!Checked) - base.OnClick(e); - } - - protected override void OnPaint(PaintEventArgs pevent) - { - CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this); - - RadioButtonState radioButtonState; - if (Checked) - { - radioButtonState = RadioButtonState.CheckedNormal; - if (Focused) - radioButtonState = RadioButtonState.CheckedHot; - if (!Enabled) - radioButtonState = RadioButtonState.CheckedDisabled; - } - else - { - radioButtonState = RadioButtonState.UncheckedNormal; - if (Focused) - radioButtonState = RadioButtonState.UncheckedHot; - if (!Enabled) - radioButtonState = RadioButtonState.UncheckedDisabled; - } - - Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState); - Rectangle rect = pevent.ClipRectangle; - rect.Width -= glyphSize.Width; - rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top); - - RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState); - } - - private IEnumerable GetAll(Control control, Type type) - { - var controls = control.Controls.Cast(); - - return controls.SelectMany(ctrl => GetAll(ctrl, type)) - .Concat(controls) - .Where(c => c.GetType() == type); - } - } - public class GKalman { double _err_measure = 0.0F; @@ -554,5 +469,163 @@ namespace UTIL public byte green; public byte red; } + public static class Util + { + public static String Val(Object value) + { + // Console.WriteLine(value.GetType()); + // String tmp = value.GetType().ToString().Split(new Char[] { '.' })[1]; + String tmp; + tmp = value.GetType().ToString(); + Console.WriteLine(tmp); + tmp = value.GetType().ToString().Split(new Char[] { '.' })[1]; + Console.WriteLine(tmp); + switch (tmp) + { + case "Double": + case "Single": + case "Decimal": +// return Math.Round(Convert.ToDouble(value), 2).ToString("+0.00;-0.00;+0.00"); + case "UInt64": + case "UInt32": + case "UInt16": + case "Byte": +// return value.ToString(); +// return $"{value:+0;+0;+0}"; + case "Int64": + case "Int32": + case "Int16": + case "SByte": +// return $"{value:+0;-0;+0}"; +// return value.ToString(); + case "String": +// return $"{value}"; +// return value.ToString(); + case "Hex": +// return $"{value}"; +// return value.ToString(); + default: + break; + } + return ""; + } + public static T minmax(T min, T max, T val) + { + dynamic dmin = min; + dynamic dmax = max; + dynamic dval = val; + if (dval <= dmin) + return dmin; + if (dval > dmax) + return dmax; + return dval; + } + public struct Hex + { + private T _Value; + public static implicit operator Hex(T value) + { + return new Hex { _Value = value }; + } + public static implicit operator T(Hex value) + { + return value._Value; + } + public override string ToString() + { + if (_Value.GetType() == typeof(UInt64)) + return $"{_Value:X016}"; + if (_Value.GetType() == typeof(UInt32)) + return $"{_Value:X08}"; + if (_Value.GetType() == typeof(UInt16)) + return $"{_Value:X04}"; + if (_Value.GetType() == typeof(Byte)) + return $"{_Value:X02}"; + return _Value.ToString(); + } + } + public struct Hex0x + { + private T _Value; + private CultureInfo ci;// = new CultureInfo("ru-Ru"); + public static implicit operator Hex0x(T value) + { + return new Hex0x { _Value = value }; + } + public static implicit operator T(Hex0x value) + { + return value._Value; + } + public override string ToString() + { + if (_Value.GetType() == typeof(UInt64)) + return $"0x{_Value:X016}"; + if (_Value.GetType() == typeof(UInt32)) + return $"0x{_Value:X08}"; + if (_Value.GetType() == typeof(UInt16)) + return $"0x{_Value:X04}"; + if (_Value.GetType() == typeof(Byte)) + return $"0x{_Value:X02}"; + return _Value.ToString(); + } + } + public static String printtime(Boolean ms) + { + if (ms == true) + return DateTime.Now.ToString("HH:mm:ss:fff"); + else + return DateTime.Now.ToString("HH:mm:ss"); + } + } + public class CircularBuffer + { + T[] _buffer; + Int32 _head; + Int32 _tail; + Int32 _length; + Int32 _bufferSize; + Object _lock = new object(); + public CircularBuffer(Int32 bufferSize) + { + _buffer = new T[bufferSize]; + _bufferSize = bufferSize; + _head = bufferSize - 1; + } + public bool IsEmpty + { + get { return _length == 0; } + } + public bool IsFull + { + get { return _length == _bufferSize; } + } + public T Dequeue() + { + lock (_lock) + { + if (IsEmpty) throw new InvalidOperationException("Queue exhausted"); + T dequeued = _buffer[_tail]; + _tail = NextPosition(_tail); + _length--; + return dequeued; + } + } + private int NextPosition(int position) + { + return (position + 1) % _bufferSize; + } + public void Enqueue(T toAdd) + { + lock (_lock) + { + _head = NextPosition(_head); + _buffer[_head] = toAdd; + if (IsFull) + _tail = NextPosition(_tail); + else + _length++; + } + } + } }