From 8eabc532ed9fca057b61343408b825dc12df1a4a Mon Sep 17 00:00:00 2001 From: Stefan Helmert Date: Mon, 6 Jan 2014 00:20:30 +0100 Subject: [PATCH] bug memset size fixed; reading config file working --- UDPclient.depend | 12 ++- bin/Debug/UDPclient | Bin 19096 -> 21518 bytes client.config | 4 + henglong.c | 123 +++++++++++++++++++++++ henglong.h | 20 ++++ main.c | 231 +++++++++++++------------------------------ obj/Debug/henglong.o | Bin 0 -> 7584 bytes obj/Debug/main.o | Bin 16808 -> 17432 bytes 8 files changed, 227 insertions(+), 163 deletions(-) create mode 100644 client.config create mode 100644 henglong.c create mode 100644 henglong.h create mode 100644 obj/Debug/henglong.o diff --git a/UDPclient.depend b/UDPclient.depend index 2df2d25..679bf23 100644 --- a/UDPclient.depend +++ b/UDPclient.depend @@ -1,5 +1,5 @@ # depslib dependency file v1.0 -1388888028 source:/home/stefan/Proj/UDPclient/main.c +1388947181 source:/home/stefan/Proj/UDPclient/main.c @@ -17,5 +17,13 @@ - + + + + +1388951235 source:/home/stefan/Proj/UDPclient/henglong.c + "henglong.h" + +1388951303 /home/stefan/Proj/UDPclient/henglong.h + diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient index ea3b2cc00eb4cc094862002b5d379a260185a71e..740a021831ad76733017672007f40aa6d2cc5c07 100755 GIT binary patch literal 21518 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 WYncLk6Eu^eo}|dyr9YRJDe<4$ZQURM literal 19096 zcmeHve|VJDo$q;P@?-LYWFSKbpk#jvSr&omF~KG-K%bSS}Ux$5`-GN*S4v)%Jy2HRIpDX>|I=1&DI~epU?R* zd1sQ@_SxsTf8Cxu^L~GS&-a}3J?Fgho;R~AP`}n;S;7>D__QF^Q0kW~broWGg(Nj^ zr6?7CQ7h((B5(@v@kO@xH3Z@l<5 zs^AATiZoCNuVm1Uv0l7fl7L$!V&I^TV@N||N0N3mACu~UTP0%PkPgg1(>}J1pMBcj zK8GI^X+MFEY8+CRrQxk)Gx2lPk_7Zi#K4$h3j>YaZLnjUe{3;vZq)VV>le3<-$315 zv3q(!L@fAYYZJoMw>TEvwqp6>So5M-v?H~B(e{-q7OhzBOT>N4WPiEgl6BmC>t^ZP z^nZ!2YAPVRhWS&DPbEIghw1oC!-w)Rd`$5e1duUQ;8TSU>zSbq||7#w;z`RH#o5R;!!@00R zghH+D@s3a;+0>N`g+ynvtt-;h917!_jEK-@x(zPbmlt@GpbkMGBfwhLi zp#-U=Sk_yOOlm#<#B>3v7I+ z)Kr%xHojRaC|POan>B}gzm0F!Q1XK|zFCvVZ?N&rnnix2jc;Ecx7zqzPfcmF@$G9} zr;X3G)RgTuKG$SZcH8)-&neq$<8#e6<$#TEUylyi_*}nDIc($G*ZRk7eC`dV1bZ&H zhI=rA!_zQa!|T!JV9#mSDI*`d?mw!%Vr>3zajl%=2S&P$;*p^-l=*LyW(tf9O8QOG z9Qu)dN&k|xlk^cuzf78`G;&zd|3aEu*2n=#KTn#eFtS_H&yZ#cjC4x+d!#w^BU>f? zKS^`QM;avkH>5e#BYsJLgEWVDWQn97Ce5K8@k;v7Npna?+>-t>X%6Lxko3KzIfNq@ zKLTTZ7ikXN$dIJ(BF!Ni8I<%k(j2Ohe$Y$*ZC(0jUkIk(4ECJ6*sy8cK)-*wUjzqE z9`O(i1gHAN@Kx~p+XDwU7Qx=aFHZN0;GX`ZV{A|kMT@U;&R5_MoBJHGIhcOyb}H_^ z(T$2k>K0g30z2-)omlXJ^Mc^y`_5p`c`JDRnM7?%<(xW!LG8DK>B6_*d(87gsnlEe z8f&`#OxK$)6rKWVvAWOSd8(ylyvktDjib|059>`%JH{v&o9oUKZd5cj1nmQqA*8Lr z^!<;WIE>~E7op_?fe)xX5E$hxXs|c%STG&92#Ak(j-p_CKsp>g3iWj0LeKpd#!}Ny z9HEEPAC8TkU{($P64-&>z^K(93=anPuRqcoxDZVLBt0-Z1W7tD+#49aAuxL1r+WjZ z(}8oUg3T`m(+%j%&4Yk$z%zg~lvN(}&uZxzb*COD)$6~kXVgkPa^5;{;>WDF9zIdQ zGpzc#1Azj+iE*B+>;uS9a}kIWY{KxjfU*7Q`!DDQL!)QNximo4lcSEFp-O`n+3->u zUSY$h8T^AgPw9TG$?}cb_aR+Q4mnCx6+=Z5`G6_>QJTCDek4s{mQD?)H=j$dAF4|S zUaw29Ka+`ZDE)lTn^te&T+fhY^_M)4PV5<)L$5$zKRHx9e+>ReoPoy4As11%L`#U) zNVJrwSE6M^(Q^1GFBw#E=q9A^A4Ok}4#-VLV*Ub7D22*ZT%mHoRj6DW73zVi)@3GX zRDK~+3SM$E-Q`6Zj#eHGT!B%Jr7rIc)FNNYrKaFr)cI0{vj(l!nxjU4lc+^gbCkC! zs$RJto-fk`TcrKnm8&T0okVd)j-rccXFSS|(H^hJQ7pGB%5Kw&b8{5kc178#TJiE6 z#TvV!>}Rd$$x-y!73J7y#i|@duU*lLhRKnu>kWF@V|AE%guUB2EkQPV6y$UTJ1B>& zmy;M&XMqHwE?r;iu1nX|y3(Jj4W$1ykRHT@sK6vtIge$?9o!$dXx5kEC;oG6jHbc# z^8gov(SHBxN)faMmHzF)2QKVoWa)q2j#)JjxWG71yvn6ul{DQ$K2|O)J*nMrG1x0s z{S%c|$+b(O&-g(jj_<-E9eAl_An*nkKI!ZHHJBE`LzPe074EKldXS64kTd;C`s6ET z(`VApqwn4*8Ei=h-slNju&@GJJAWD+2n@kt#>2-svHBgkPJ;9jeC2E~eI{5E7}EB| zJAXD17`B_wm*%Cp<|c*`%zRa~bLTJQQp~=(X7flydRI*co;g^F0b%QcxM_$Hq&b5o3`yzJc^gnNTmwoty1_0eH1A%kQMzoak zW+3poiujBIKUZK-ftM6`QGwG0!To!-N}mJ6fBim3cn^ICd;P9pdJp$~D#(Ew82FQi}1w6q+eXISHNyrnt8%kVMq z(t-ZoK!1AA65y!IOTh1j2yMVGyP;)3avjKe6UiQ@DdP3X}uWzCO zE$Ka1NQVcN-@qY;dA`!0*)WI8AkP!4?2-K{q@I5C#0#>fXS|Fm{T^Ih3Od;F z_PfImT4MMmcAM_Z-h)BeWuDq#??K*71=E{qG5-!WYTV7vI{16UJun=Sx&G|%gC9^Y zaHORt@V14VcpGh434Nm2%Yui3y&PlqRWG}4*%xwvTQdW38s~% znNPKqM>oH1n?~<*8i5WT+WWP_K{O{bkzO?>oPzs19m)td1Mn%Q&Us87UH2H8m<~LF z`Std(L(I7K&-QM9B9j<@{abWaZ{Tod4ciO-J^htmS%-ObKn`i}fzzB=xK|6NW3^}M z)6KO*!TpP_De;Q>{qt)Hz#pzpCu=X(r|+x9%-vFpyU7bH>p%Y1s`Q8J((eXOe&}46 zer@>uOB|YiOJ270fAjvnKK=Xp^t*NGe_u7`c|F*33ipubQ*Q@*w=fZ6weI@f=GvNi zVBY%PWbK0b-ur5o;I?t)smeLK(K>PI)cCz4{i$_8-Pj&*d2t^)I+mPyoR1mheJSs8 z&%-tDS4YQE@0dH#1H8o@u0+G-Eik`ha_ZrEsQTjXl@9_U&0=j+G!|+0CgWay4fjU6 zBOOU^bEG>Oj`&0XU*e-3t-g#^SEMDDF_r!{2G-Vl*KS<3KHy!n2*~=-t*bYF(mVgU z=7rvkn>GRaL@btC=v{rsroio9J|+O`S_)wpfklMUVZh| z-nCs#?GZdDNFcyuB%F*i&-K>F6G?9i1-QoBy|H+>Ddy#)060d?Uj3!@_Q0)m`Qr3u z6%{F;P3TBzYKs(oIoo+d8(Po%hK2tzHpVX(4M@5t2+`$SZ<(VP0M7#QX5(%o^g_Vb z0P6{{sKx+`u?*}3Y{sha1mH{9ihmBc1-beGpa(u!ta~>KYrET;U0&=u0DdiayoEdb z&e)hAw5V{et*H4-W!XKh-QuQMH(Y&f?G@lkojSm8Ax-6jhE)~r2OVpsm}dp_(TvZ1 zh`$j~7`fwi)THd$zNa9+!7lHXV(I@;@P7*VUc21Uld(Sy{wL56u`GFOMt%`^i zn);pZTU20t1!!LwE8r5l{oUjB*Fv6v{7&|RvHyGzzcb5zsssNB`dfaBHgZR#$LajY zp}Z(Pj>kpphG`n!wy*HPqELmur}!@%4>|W2I2tR^9dbOr2E9fs+iFHp`A_9fJ@BU< z_)`!3|JMV!QAC1L{G&&W{2c|503;hzB{cyXM>)Qq~TUTtJao0#~bv~$33FKx&%)3?6 zW^Z^=+nasdJd2+pwS-tu?3b9~yEVJ?j{*{J*ui?`gzM$c&8vaJZcQq_3RrOVC zc%_CbG+e7;Zk#u-S@TKnf}3#{9FKdK`&Rg_^>!}xEnT|M+Zl~4TH?FTx9sDJFY>5f zJBjK-RHH`5B`f3?XO{cSuu5wDatUf$-?|T}Wd)H&*F$a$`SjZqhvnK0vBOd9fsLb} z_ytm~;*$hc(U+yH@MBPS78K$P4YI;tf-3kG)enAw=-;6d$JdD#x{6#qfUr!%vf$T{ zIG3#kr+B6Fx~BkLQ())(ghbmxJ6F<9l+fxlKBZLtgeW*g%j*w2C5wPmgC#u{i-G|d7S32s6BnEp&ipLUva`6< z6jgtb?nZGbn(-@e=7_|A%lz%Hn`k=0jx1Zh#lXMvYi+=uJ#-QJ4nkneVjf@fh#6gQl&=8pdYZl&RUwRAM=5a3bEs~6AB1e=6jAUB@RDV+k>7`-lI6VZF5sC{$;#D4 zXTV!&6HN-f!6^0@;acV=UHZ^^;N`E=-GQrsqCQb}o}rZf`eBN`4G*PfO(?vDEj@Rc zRCJWzM6a{$_>4alyRpX(HY|jX(84I;y0TrzpR#x^6 zR9tH{H2{=1Q!C5?V;^j`Q3d7il4@2mS7m!^hA1z86n>1zU0!daJmp~O#Y2Q^nbLXjfIFTUc`_aP}SE z<)NPCm4WodJnzx}K9*pINDSp^uL=f{s*qp1IL0F&D9;#)&XsWSV=8L8_ zO=G@jqM=&mi>B(UWxi-CSS|BKQ=(eti>6%FGG8?1_Q>XMF#*r8<}npoEfeH%9W1{v zKF46Ml5(PszBY6;Gk&UdmfVzVrm;AVN0BTqK~#i$4rQ6rmeq19r8sVmK6<#wj{A|t z%rlmJn90IEy&fK_lE|a~C09I*`Bdx2G#QkcXjFMd%CZllpTIV`&7oSuKqSR8!~o&_+lenEH6zKc6OFLOv=>m@N+1JjXmW$W~tN)&!-cixL6sx`@NlKi3 z{V~sP7}BLbm$4t%<+++cXmal^&-Y3G_Oz4^?)2;>`8&=5XWx;X9zV%<83`s}N6iv? zevcKg3r1C=x2V+pPgVaDyFCBEkbke5`MDa|==Vu^WV(K+tTuUMx@xMyBh&RGC9AJu zx@scmk?E?bI*&|OP5C`CT_weV@yLADt zT31DG>0Gg{YB7w;sw`*4xOVxt_DXyMm{O1>tylnGmrcPjCDdH1daAjllR{JFRG)QI zxeD*9@^w{giNA=oPAklqIbc?`Jd5;z)NP`4y7VGz$@WqWFE+gy_S(klsu}kt#7s>T zuB)Q!S-N77Ld+hQVL-*keSFVrAuODAR>NrF(^Tv9=VhXbhxFEf_E#4kk zjMvConmQIYbj9ylyt%F+9E;+9S}aZ_x)w(}!m(6yWbw8rUg^r>G$q;>wMIH3UD0s1 zK)%?S#mXWUyGm`MNAxiV;+Q#9-VI{-O@S<1@uZyzNes11uf6Su@+c75k;>-cxNcl5ZPY<O0PIe=t8&%b>4kyPH#5yzG)XPNISt}53pOI?faJ^WqA)m5#i7CQ+pj;p51 z5I$2B?HOmz&oEONrt2M}=(wiJ)$;|{-W{(wr#O~czj4ibONtyTx@9;2%<^Gcl(Alw}k3$#*vGzfQK?da&O&m>*{)lVINJlMLJsPkj`*k(iCpP znGfFeWPtMh$^W7|7VD`**CG9?C~jX9q0S^4(~&?hI5Y~kHFc?qH`bY8&|1|YP!Dr( zQXC!Dd2ggEZfj=73){=lTe^b%qe7D{U)J1|Y!cykb40*dw;V=+wL}Jwj+Ek1C=tCE zjgq6D<&)xNatNd)8sFZTP~qMlxUFH;np*;!^cX~9xEYr{n8gmoA}tsul|7;HZeCNr zAiM!(SmeB?x>X`#KlK<)T+-iFXPb|q^YGVK#cb=U4%liKA8f_ zGhc0G_L7e*lzrKW9H;whm*FMau5R@@Y)6P}cA{Rr?9RtC&&~~TP*rXxRCn9skt3ee zUAAds02znZ=)G(7^ADAzw(JllQlPyA3`&!<*>e$oS+y+1=wZ_?&T`+u#poc-=UCR5oAD z@Fw~Gkv5Q_)W~%?{oM;jsJg`S5o5_ zopc$-b--{7o3S_NBuBKvN3|w(SWMa&Km4YLR~h&PPnJffUqeNk_;c-*REQgZ;QLpm z{_Wa+J8r~T+}be{oNYJtoAZw~;8E4oZ_aV{>I!G)bXX24Zhp8&VP6`1bME8T2SKKtrha2@_+QMiH|IzT zw7ofZqCLL2W$HKfeE7pY(cxy!(fDYE#po$&d>Kd4lVv57!&Z!)VSN>dy?%4HkC1{Ze#D+kYk} ze$)R_373QT*zL{#Q=0#?j2T4@bL;=x9Q%eDeyQ0oLm52r2kL)P+w19K`~OpApW9!# z@jsPg&;MwU1y5sG{*e7~=rBZ6KmVJ7#jWjg>&vD4q08Je_U7Es{9o*lZokP-V{hX6 z5p3=CoBy*K<*VW-Mqg3mwBi2*0=vCAw-sJxal{yEXzUDp4Sc)(5${&1dBiKhAM8Iq zu%$24{(f!W|3})t30u~`1Rr}b_J3w)0;evEf#+?w6zEI!T!rNNHFie#_ds%al&#hF z@0pI$2D!RCSIXs4^~S4}!T-n+=8(dZ$Nt@W^ zzIOtX^Q1t$!1X1&+ycILl78m?FilJm z=3vq+CQXu$OHN6FroK6^-K*sfXuf~CUvkWv)TjC8zD^2pIVAap8i$YP;XenycU&!l z{WuT**WmM?M{~<1Fec-3ADWC`lZU@d@+Z#Im3j1eA32%-sN|#nEB!K5vk!HGKNY`1 zVdlHphIWDPo@5;NmzfJ3#a~n)TS++^O4#Ebu=iz@n5C3uSIbONz*!S}2zm$jnhU8BX=73zj!;ZMl zO8&%sXC#jwb2t{dxqidyRrR3_YuDZ$*c95dYIS`egr~K95`zaLT}?YeJkH2s$o~}) zp}IS6UA2DQ8o>uE>bDhy?K!>rc?Q4V{!0t;&_q92*1yRRPNYKeNssm*fA=BVO8%}x zHY?}XD<=E73jRh!wvqhph-?;rl_HyC|J{gei3*dyZjr;!{c(wGv3^<~TDJi$#91K^ zK-izQUNg_P)qlEVn^R4nTBu*P$QB#Zi48#wiFl~33CB`Ad8pg8VPlB@xWd7ezlOn{ zm(SbOp+vS{z7rG*;bEB`7W*-PI@z!tD9H@TdiqZl9=GvdaIzhnfHS}Pku6p~0g}xN eMdYJ9W62*6$yVThDrIxzZ+xiMWsc~wHU2LId_6t@ diff --git a/client.config b/client.config new file mode 100644 index 0000000..be1d189 --- /dev/null +++ b/client.config @@ -0,0 +1,4 @@ +INPUTDEV /dev/input/event2 +FRAME_US 100000 +SERVER 127.0.0.1:32000 +TIMEOUT 250 diff --git a/henglong.c b/henglong.c new file mode 100644 index 0000000..c440128 --- /dev/null +++ b/henglong.c @@ -0,0 +1,123 @@ + +#include "henglong.h" + +int CRC(int data) +{ + int c; + c = 0; + c ^= data & 0x03; + c ^= (data >> 2) & 0x0F; + c ^= (data >> 6) & 0x0F; + c ^= (data >> 10) & 0x0F; + c ^= (data >> 14) & 0x0F; + c ^= (data >> 18) & 0x0F; + return c; +} + +int data2frame(int data) +{ + int frame; + frame = 0; + frame |= CRC(data) << 2; + frame |= data << 6; + frame |= 0xFE000000; + return frame; +} + + +int values2data(int velocity, int direction, int ignation, int mg, int fire, int turretelev, int turret_left, int turret_right, int recoil) +{ + int data = 0; + data = (mg & 1) | (ignation & 1) << 1 | (direction & 0b11111) << 2 | (fire & 1) << 7 | (turretelev & 1) << 8 | (turret_left & 1) << 9 | (turret_right & 1) << 10 | (recoil & 1) << 11 | (velocity & 0b11111) << 12; + return data; +} + +void inithenglong(henglong_t* henglong) +{ + henglong->velocity = 0b10000; + henglong->direction = 0b01111; + henglong->ignation = 0; + henglong->mg = 0; + henglong->fire = 0; + henglong->turretelev = 0; + henglong->turret_left = 0; + henglong->turret_right = 0; + henglong->recoil = 0; +} + + +int event2data(henglong_t* henglong, struct input_event event) +{ + if(108==event.code){ + if(event.value){ + henglong->velocity = 0b11111; + }else{ + henglong->velocity = 0b10000; + } + } + if(103==event.code){ + if(event.value){ + henglong->velocity = 0b00000; + }else{ + henglong->velocity = 0b10000; + } + } + if(105==event.code){ + if(event.value){ + henglong->direction = 0b00000; + }else{ + henglong->direction = 0b01111; + } + } + if(106==event.code){ + if(event.value){ + henglong->direction = 0b11111; + }else{ + henglong->direction = 0b01111; + } + } + if(23==event.code){ + if(event.value){ + henglong->ignation = 1; + }else{ + henglong->ignation = 0; + } + } + if(34==event.code){ + if(event.value){ + henglong->mg = 1; + }else{ + henglong->mg = 0; + } + } + if(33==event.code){ + if(event.value){ + henglong->fire = 1; + }else{ + henglong->fire = 0; + } + } + if(29==event.code){ + if(event.value){ + henglong->turret_left = 1; + }else{ + henglong->turret_left = 0; + } + } + if(20==event.code){ + if(event.value){ + henglong->turretelev = 1; + }else{ + henglong->turretelev = 0; + } + } + if(19==event.code){ + if(event.value){ + henglong->recoil = 1; + }else{ + henglong->recoil = 0; + } + } + + return values2data(henglong->velocity, henglong->direction, henglong->ignation, henglong->mg, henglong->fire, henglong->turretelev, henglong->turret_left, henglong->turret_right, henglong->recoil); +} diff --git a/henglong.h b/henglong.h new file mode 100644 index 0000000..9dbdd03 --- /dev/null +++ b/henglong.h @@ -0,0 +1,20 @@ +#ifndef HENGLONG_H_INCLUDED +#define HENGLONG_H_INCLUDED + +#include + + +typedef struct henglong_t +{ + int velocity, direction; + int ignation, mg, fire, turretelev, turret_left, turret_right, recoil; +} henglong_t; + +int CRC(int data); +int data2frame(int data); +int values2data(int velocity, int direction, int ignation, int mg, int fire, int turretelev, int turret_left, int turret_right, int recoil); +void inithenglong(henglong_t* henglong); +int event2data(henglong_t* henglong, struct input_event event); + + +#endif // HENGLONG_H_INCLUDED diff --git a/main.c b/main.c index 7ca7461..01a07d4 100644 --- a/main.c +++ b/main.c @@ -16,6 +16,11 @@ #include #include #include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include "henglong.h" typedef struct input_thread_t { @@ -26,14 +31,12 @@ typedef struct input_thread_t void *input_thread_fcn(void * arg) { - printf("pthread started\n"); + printf("pthread input started\n"); struct input_event ev[2]; - int result = 0; int fevdev; int size = sizeof(struct input_event); int rd; - int value; input_thread_t* args; args = (input_thread_t*) arg; @@ -49,152 +52,26 @@ void *input_thread_fcn(void * arg) break; } - value = ev[0].value; args->event = ev[1]; // quit if(16==args->event.code && 1==args->event.value) break; } - printf("Exiting.\n"); - result = ioctl(fevdev, EVIOCGRAB, 1); + printf("Exiting input thread.\n"); + ioctl(fevdev, EVIOCGRAB, 1); close(fevdev); pthread_exit(0); } -int CRC(int data) -{ - int c; - c = 0; - c ^= data & 0x03; - c ^= (data >> 2) & 0x0F; - c ^= (data >> 6) & 0x0F; - c ^= (data >> 10) & 0x0F; - c ^= (data >> 14) & 0x0F; - c ^= (data >> 18) & 0x0F; - return c; -} - -int data2frame(int data) -{ - int frame; - frame = 0; - frame |= CRC(data) << 2; - frame |= data << 6; - frame |= 0xFE000000; - return frame; -} - - -int values2data(int velocity, int direction, int ignation, int mg, int fire, int turretelev, int turret_left, int turret_right, int recoil) -{ - int data = 0; - data = (mg & 1) | (ignation & 1) << 1 | (direction & 0b11111) << 2 | (fire & 1) << 7 | (turretelev & 1) << 8 | (turret_left & 1) << 9 | (turret_right & 1) << 10 | (recoil & 1) << 11 | (velocity & 0b11111) << 12; - return data; -} - -typedef struct henglong_t -{ - int velocity, direction; - int ignation, mg, fire, turretelev, turret_left, turret_right, recoil; -} henglong_t; - -void inithenglong(henglong_t* henglong) -{ - henglong->velocity = 0b10000; - henglong->direction = 0b01111; - henglong->ignation = 0; - henglong->mg = 0; - henglong->fire = 0; - henglong->turretelev = 0; - henglong->turret_left = 0; - henglong->turret_right = 0; - henglong->recoil = 0; -} - - -int event2data(henglong_t* henglong, struct input_event event) -{ - if(108==event.code){ - if(event.value){ - henglong->velocity = 0b11111; - }else{ - henglong->velocity = 0b10000; - } - } - if(103==event.code){ - if(event.value){ - henglong->velocity = 0b00000; - }else{ - henglong->velocity = 0b10000; - } - } - if(105==event.code){ - if(event.value){ - henglong->direction = 0b00000; - }else{ - henglong->direction = 0b01111; - } - } - if(106==event.code){ - if(event.value){ - henglong->direction = 0b11111; - }else{ - henglong->direction = 0b01111; - } - } - if(23==event.code){ - if(event.value){ - henglong->ignation = 1; - }else{ - henglong->ignation = 0; - } - } - if(34==event.code){ - if(event.value){ - henglong->mg = 1; - }else{ - henglong->mg = 0; - } - } - if(33==event.code){ - if(event.value){ - henglong->fire = 1; - }else{ - henglong->fire = 0; - } - } - if(29==event.code){ - if(event.value){ - henglong->turret_left = 1; - }else{ - henglong->turret_left = 0; - } - } - if(20==event.code){ - if(event.value){ - henglong->turretelev = 1; - }else{ - henglong->turretelev = 0; - } - } - if(19==event.code){ - if(event.value){ - henglong->recoil = 1; - }else{ - henglong->recoil = 0; - } - } - - return values2data(henglong->velocity, henglong->direction, henglong->ignation, henglong->mg, henglong->fire, henglong->turretelev, henglong->turret_left, henglong->turret_right, henglong->recoil); -} typedef struct refl_thread_args_t { int sockfd; uint64_t timestamps[256]; uint16_t frame_nbr_send; + uint8_t timeout; } refl_thread_args_t; @@ -231,12 +108,56 @@ void *refl_thread_fcn(void* arg) for(i=0;i<4;i++){ frame_refl |= recvline[i+10] << i*8; } - printf("REFL FRAME -- FRM_NBR: %5d, RTT: %7llu, BYTES recv: %3d, REFL_FRM: %#x\n", frame_nbr_refl, get_us() - time_us_refl, n, frame_refl); - refl_thread_args_ptr->timestamps[frame_nbr_refl&0x0F] = 0; + printf("REFL FRAME -- FRM_NBR: %5d, RTT: %7" PRIu64 ", BYTES recv: %3d, REFL_FRM: %#x\n", frame_nbr_refl, get_us() - time_us_refl, n, frame_refl); + refl_thread_args_ptr->timestamps[frame_nbr_refl % refl_thread_args_ptr->timeout] = 0; } pthread_exit(0); } +typedef struct henglongconf_t +{ + uint32_t frame_us; + char inpdevname[256]; + in_addr_t ip; // v4 only + uint16_t port; + uint8_t timeout; +} henglongconf_t; + +henglongconf_t getconfig(char* conffilename) +{ + FILE *configFile; + char line[256]; + char parameter[16], value[256]; + char ip[16]; + henglongconf_t conf; + configFile = fopen(conffilename, "r"); + + // defaults + conf.timeout = 16; + conf.frame_us = 100000; + strcpy(conf.inpdevname, "/dev/input/event2"); + conf.port = 32000; + conf.ip = inet_addr("127.0.0.1"); + + while(fgets(line, 256, configFile)){ + sscanf(line, "%16s %256s", parameter, value); + if(0==strcmp(parameter,"INPUTDEV")){ + sscanf(value, "%256s", conf.inpdevname); + } + if(0==strcmp(parameter,"FRAME_US")){ + sscanf(value, "%" SCNu32 , &conf.frame_us); + } + if(0==strcmp(parameter,"SERVER")){ + sscanf(value, "%16[^:]:%" SCNu16, ip, &conf.port); + conf.ip = inet_addr(ip); + } + if(0==strcmp(parameter,"TIMEOUT")){ + sscanf(value, "%" SCNu8 , &conf.timeout); + } + } + return conf; +} + int main(int argc, char* argv[]) { @@ -244,29 +165,22 @@ int main(int argc, char* argv[]) pthread_attr_t inp_thread_attr; input_thread_t input_thread_args; refl_thread_args_t refl_thread_args; - int inpdetachstate; int i=0; int frame; uint16_t frame_nbr; - uint16_t frame_nbr_refl; - - int velocity = 0b10000, direction=0b01111; - int ignation = 0, mg = 0, fire = 0, turretelev = 0, turret_left = 0, turret_right = 0, recoil = 0; - - - int sockfd,n, n_send; - struct sockaddr_in servaddr,cliaddr; + int sockfd, n_send; + struct sockaddr_in servaddr; unsigned char sendline[64]; - unsigned char recvline[64]; - unsigned char tmpchr; henglong_t hl1; - - uint64_t time_us, time_us_refl; - int frame_refl; + uint64_t time_us; + henglongconf_t conf; inithenglong(&hl1); - input_thread_args.filename = argv[1]; + + conf = getconfig(argv[1]); + + input_thread_args.filename = conf.inpdevname; pthread_attr_init(&inp_thread_attr); @@ -276,26 +190,26 @@ int main(int argc, char* argv[]) sockfd = socket(AF_INET,SOCK_DGRAM,0); refl_thread_args.sockfd = sockfd; + refl_thread_args.timeout = conf.timeout; bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr=inet_addr(argv[2]); - servaddr.sin_port=htons(32000); + servaddr.sin_addr.s_addr=conf.ip; + servaddr.sin_port=htons(conf.port); if (pthread_create(&refl_thread, NULL, refl_thread_fcn, (void *) &refl_thread_args)) printf("failed to create thread %d\n", i); - memset(refl_thread_args.timestamps, 0, 256); + memset(refl_thread_args.timestamps, 0, 256*sizeof(uint64_t)); frame_nbr = 0; while(1){ - usleep(100000); - //printf("%d %d %d %d %d %d %d %d %d | %d %d %d %d\n", velocity, direction, ignation, mg, fire, turret_left, turret_right, turretelev, recoil, input_thread_args.event.code, input_thread_args.event.value, input_thread_args.event.type, input_thread_args.event.time); + usleep(conf.frame_us); frame = data2frame(event2data(&hl1, input_thread_args.event)); time_us = get_us(); frame_nbr++; refl_thread_args.frame_nbr_send = frame_nbr; - if(refl_thread_args.timestamps[frame_nbr & 0x0F]) printf("*** Frameloss detected! Lost frame from local time: %llu \n", refl_thread_args.timestamps[frame_nbr & 0x0F]); - refl_thread_args.timestamps[frame_nbr & 0x0F] = time_us; + if(refl_thread_args.timestamps[frame_nbr % conf.timeout]) printf("*** Frameloss detected! Lost frame from local time: %" PRIu64 "\n", refl_thread_args.timestamps[frame_nbr % conf.timeout]); + refl_thread_args.timestamps[frame_nbr % conf.timeout] = time_us; for(i=0;i<2;i++){ sendline[i] = (frame_nbr >> i*8) & 0xFF; @@ -307,13 +221,8 @@ int main(int argc, char* argv[]) sendline[i+10] = (frame >> i*8) & 0xFF; } - n_send = sendto(sockfd, sendline, 16, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); - - - - printf("SEND FRAME -- FRM_NBR: %5d, BYTES send: %3d, SEND_FRM: %#x\n", frame_nbr, n_send, frame); if(pthread_kill(inpthread, 0)) break; } diff --git a/obj/Debug/henglong.o b/obj/Debug/henglong.o new file mode 100644 index 0000000000000000000000000000000000000000..bf0af531d5194ea6db36a9887322a4d13ab157be GIT binary patch literal 7584 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 literal 16808 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