From d53f35522257a46c6d9e1b1fa3d11499bdc354a0 Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Sun, 24 Dec 2023 14:03:40 -0500 Subject: [PATCH 1/8] Test of Dirt Rally Integration --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.suo | Bin 56832 -> 59392 bytes AppCheckThread.cs | 3 +- DataPacket.cs | 2 + ForzaDSXWorker.cs | 56 +- UI.Designer.cs | 4090 +++++++++++---------- UI.resx | 62 +- appsettings.ini | 2 +- obj/ForzaDSX.csproj.nuget.dgspec.json | 42 +- obj/ForzaDSX.csproj.nuget.g.props | 7 +- obj/project.assets.json | 41 +- obj/project.nuget.cache | 41 +- 12 files changed, 2294 insertions(+), 2052 deletions(-) diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index eb28ffe00280b105962d2ebb2be1fe04de2d7d28..afa16bce4c73d0558ff1d0b4b758ebacdea64287 100644 GIT binary patch literal 203145 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®7AC4mah~g$%9bq5WS1 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 H1PhM-f(GVa zo3#QAq6=l(8tC`Wg(X>Td`BBaFcap<7&zS~SQgl#W%zh6R zCd6RE-Lp~UTeTS0%XI!*gZbP3Vhx-UQQdcDz|(lq=CRFm zt<7><{!p9gGJ-3ee1!voS=kRMbu`hLf(8prQrn>Rhb3Y>r{+7EBAr*$V49_`Qt08y zb+m7c$-xpno?1t1JUUNI$1C`<)ZPj({r6>CVZPf^V zlOEhkYo8KqA)sraQtQjbYK|?qSQu%mMrbo##&JgnC?rE^pHcLoSlS)!FG*=%lP%HY zc@au?vVMSsnROlQibEn6HXWwCJ6cv7Q)kw8v{q_NZ=ejTPE4nxqqRh1%5uxr=~}|_ zig#*NSUD`3fQ~lfVDcagFTwKa%m{P>VGNDu=URsg&1O9hUCzx~sibG9;iA!LtDD_o z9|=t63%ZSNcBiYR;cN*EbSSsk4ztV?W<|Es1!sE!9COG%8UAKRs<72SOssWum~ALq z*vGSMTZ=jTwx%qZ4F|9ppN&2eOLAC){RcUi-(fGYqa6m8-c>cdJY!DUO?EPa@|?mg z%XBiKExMR#?Pz(UscfoN#k%>9Hpxa(xRPmMdrO)8=6+1CaRjL2Y;M-FBI9?o4W!m> z(egUmkW^z^6j*8NXtTf))vNo9W!TfihBeKEJ5KDd(e!n+Mxi#!y{L}cc2x~0{yRD_ zKyBNm@2lw*T!h*2S%LEtrO#c!^P~ZEL34h7Gbv>^4akkbf-Qp&dBP# zQ$wwT^fu`lY>Y5h$?(Rn<2eUXhPjIaVqaQE9T{QhhGqjz!_Ez`gNJ9iN5{(K3UnDrB_*fc(U!nW7FL2oPlCVX4wH?RV&V;J?Pkebz6^nzds{~rK;Yb>IOCyg zOp9-4r#f&IZdaoM-)Y#-b?E4-Lu7$fA|3Uj=CtA z1%`@d)!o_ZQ{?h3=s(Otmp~*5`I~Kp;7bcwy0cSfHYUv1Q$UFm@3*5nGVuL2s$dS$ zsvux?`(=(Ve^*`%;&yaA)fgOem}cu}Q(`0xTRpRRkm$#0bu?NcH6= zi!eMmg*tS!SLm!lKl<(}(yoY^myWtT&UUl!blM|N940?iJ@qMI@*6WlZEbc zI$P3270}WCl|!N;Z*Yfrb}D|Rg%0amjC!}DeR$z0@{xF$;NYfq)K3vfHtcrksBcX7 znWT)ijBd&wrY9nDQ#(2h*qAaawH;k3)tH_<5s+QBrwv}3KbX#eX*?Q2L+z=cPEm-a7 zeEtqCSJOvpCERb)(WR_Lv)$3kho(Z8vTm@(9_t;hs)Nk!#y(`MP_PMhyi#^rGyR=w&>1dm3)c^(#+424S zCAXD{+o7A^XT?nIXagd2qlf=-3)>pi@@t{Mv91zbzyp)L=0>5eWf^)D*3!r^%O+qG zEu7^rSy;ESrx$JxDwg1c3^>zu~+XA4UYtXeS! zY4FQ-fWye8bVHucF9I@Ks5XB8m}OOV4b?jMb^U-IIhtKe1gXy9MFTBQ|cvm=myZhGR_W7O4u2KMo)6gk8kYfrm%O@NdKLIrL88?>SJB z(Tnq_yZ~glUap#jTYPXWKaT$JZ_l?NjD+~`5C8rw=`go157J(!#^6`^szVQ?6oEZ4>d~0W8@wzSBdscO?TrzU? z$k5>W?(UwR$l26>xO@`qrTg4qLy7JF$==900%Tlf;RK6Z;`b&&$BH?UU^fXy2K@et zSMGGaGL!ars{C!Sdo`D}!Yu6yu7XRbTIoBA>;58h;8ml1rr;8GRXDPUF9b7#BS;H_ zB+pA5Bg1^^R@~#bWC7;X74(|IRQHkv{m@aXmGw&sdaVjab1YdfTpQ12(^u*NEL2r3?nJ$TuM!XrqJQi#W2z=IGWd(Cf=hMMtXZ()8jogydE)( zw8kCNGADJyNMo`Cm96#8!u}#Z_djyIX^b3i+R+1-srhRPZ8dOkL+mxMtSGCCvwj)# z>PaF!&73OgCCR%+&o- z+(Iv1;)|B$Yvmk?Duuyca2uKuM{Owir3&oN6!%xapWa(7mQvKk1z(j-1gvy!F*swq z>tSBn8rdzgW<|8YTspmayl45uL^{)($z)dcglCc)fmVfCv%B3diB0pH_3GKkmH3y* zif?y(eD!K=WqReRp0&$Y=-q49MuO{zbf8wu^j)Eu4qiT9Tg!fVi{*hyK(F6kg)LhI z*Axk`D8@7$k*?S^wPm;R`Wrs!)-o$5^i|`%+A2-gGm(s6V*M6O>vAKb=Q|=lHFfvh z2eFO(gr+(YE-T4cFLaV1W9ZYkL^yJtRg1>>Fh~o{94FEm)n)XB)=|Xnn>#(dEWztN z0AUaqnnBG8zF9YIL&JoR>M2ZQ6$I#4b&ZA-0zS*JDaw&D>24^M(Bn%=$Gs>Gt zt5KnO&fbNZb{uy(@)rhgp&8-L8#N-dO4pk&ycFE64WaR2Fc+FR-pm>1gzh{z=Bbo< zt$Ad(7a|M_Lo>;nLW@b`ovi!#Kj@%lsKU)1qX`k zjuV3u@hl8ZLQ`9!#;W$7u=9y|vN^jQ7|yFNi~SRk8$`BohP1($tyBfK#zqxfy&^WR zLZx7}W_Kr> zWoXK3?BIFVRy&z_cT2Ir)@SmIF&s;x2?>L^;MRB$XR6AW+uO;KI8xHn>>Nuy!xGaR zvYZ7I26w^j@!-y)E3?P9r{ur1!m9BC)cO3tqP{|*SY;blc;6vo@aF~#gTmle*(h{V zm$B%3sHjaA=^|j6$th(YH$J#^-fT)LGe&)Pe%fS|jodggXfoz|;NR8} z39h|2V^sU#Z^hPNG~{tMQ%U!@W%?>Jg*1CBE_qIZhQVNP>%1A1RA$!Y!*56$7&RA# zvEzz(~ zn$-Djo^6dyaNRvQqq+wlp0Twx1=xPWwohAzPS`V(lJ?u*;QHDrG4u_-e!@nESbn?3 z$RcIS45t5_Aun|auBnX%p=t0@1c?K-%?7TN~r!6Pi0YcWg7v0=~^+y*&Y$yzcSf_Lw|s4|k|JNH?N z=(t#4pDA--8wA>V*1;|FBGAdQ&=#P1P|E!Gp(4+K*E?iD1cX6hXa;#OiTbj<;X6UU z?uePODk-|}PV8!C+vRD)qdPDt;o2b5=Bfm@%Y#8lUq<9ihkR%&pK$TQ1RSHO71A&? z0T&>Nfe9Qd^MMgR^FvtsTgBN**4Z){q zy{MuE*wRtNDQ9a#!g6WbeMDRJ7u+5%+9Z2|*R@T^6Zi5&oZ1XZ9K?r_*Mi&8gfz4x z=eOo-byOf*hQ&?A@{G9eM=qaItjU@G0VVkeme5SGQ70+OYP1o*#QAM9XjgfVHwW#o zA&<`n*H5B>>gRiWq1D_{*7nmJX&I#5g)L)4l*x?mF(q4URN7A%GSh%rnU=1RPBkd>l@6j(k%O! zRPM~^FqjH%g$qTdnylcZLuYHIpygqSBVNNyU&+--RbyNjJO$TZ=BZIfM$!#olSB_J z(O|5*uTtn?DeMpoStHt@$5w?0*Ic5IAU}D$U(4x*3>+}Z-U7NOE|@k5v(??f?U4v`(Usd1c8P0Dj8;mx z6r>?045EBb#kqEPJ&B^a`|iQJCgGX4q$%!kQ8_g*l`=tLkQUq`Ptr_fS@!bXQ}fH; z;8xltFO^}W6wb;|t%v)cb6H+L3i2Eg?Jy_%FTrh*m~+&W+2XtV)+TKJMHWC?%CWot6T~Q`){)Y?X3>MrbZ{FyXk;SIq!`a>xUXv}+ z6j_GG!Fh>40Wrz*?L*r(CI`31n>?#EJHl=>ffky}hKwq#9Y*BQr{G%J8KGJRpVqYJ z8%x%-T_$Wy*8)p!xG?w%ZkL@eH+|Xb4&Hz9B$B=>?0Yp(7Y13ub@wET>K?ow>`Bi+ zIXkTzO9HT8-#}E#z=T0raCSBkx5bk=t1ZDt)9kbj!di5#s%J)E@yFGX{Lw0AVl|+!8xuHbog{zULuZ z9FPZQ=v^|}B+f(PNTD?%45~siz|L5s0l|C3_OdvfEkTa5chM~Udk07uv<0`ufiD+p z#yU_gIW4qbv(4z`r`W?V*a@z&8#`3v;7zYRCv7jl8bYYfGrX9ORLeSC+eA~dbS4}@ zVel2)B0FD>$})?BZ=sO*!^@A2%^vhY7`z16RN}?Z)c5JIeuuQ!FK;-2LxH@VyGE2P zIWi1xf?MFkjch@1$I2|kRjVb&0`_C@p-F}RQCyjd;2JwnVQ3t@ zesbgEii+6Di*+lKlAqy!F6|I#?U=@1Ls0d!vb?`qLCqt41=WL7PydvO0tX} zJd--`v{}pY*4bLD=)*9039hjNFNVg!hf5szpm#g6OEhbE|9b=neQ3^UjBbM?+p>$` zRyc6fs3yxj!5vvAw)84J+LjJy(*;j-YMeGy=$13aY>+Tm3vP`QYc^FoSMG*!yvJJZ z=)*AB=}5UVG!EXIbjV54I5_r&X$~@@!r&&j_6|A6RIzh8=Bk=FSkjtf=)*8r=}3+- zG!DK>(ILld)A!Z%ia1aJM@?yd!H6(;39h+AZb1ckUD*k5VMK>hbhFhNmV%WVjCj&= zg9sH%uvgr`7>j6w zCR@%5uDLT!rslz?{++oIbx+Dt{%{$C$X1PrHrTRds^GRbv(>06%TmGnrrxws-^|*x zhD;S=Z5~{EZ=$I7!TYH)L$$nKrUz8fUpIQz;-Q&+{ExEAt80U6EVE+OIC%fUjgK8{ z*K*_Z))q`!M4J4xKlB>h0yloF76k8UNIY#F-vb2kj*IQ!8q94oh zzW3L)xUK~};zCs(1}sPVo79Dcis$#^SD%)IhdUqRa8jRufks zxPjWB&DNR)w@Bj4O~k-;H$TZ=hrjb{Z)jHRr=Fz5?zSrhuK3bSGue2YO7 zE{C#{Q`P-C{huX>`+a08Ex0h43~pBwCN26hyMp@y9z-61)3E67Lf+>>zs5?Tfe3@V z;I?>>XK2c3^S$=8jS6qGUez*i<}gbL4?4@>D3X^E@RxCX~}Jks4(aYZj*bSYt)ue=(|d7(I235>a{YQG-=sa z&Jx5e0#1N7__Gamg=UbAMi+yEJG8b;h$+F%tT3+1Xv0YhlQtgN24yxMA-DyuTv;p# zp0Pc6;*42uS}_Z&$z}s84CaE{tYGLqeb>u=VUM3xSz%$=OrVN9n;QG3-MD-26I?ja*sVj$T z{IIZ^(P2;&+zJ5C-R_=li47%_HEik)H-kjPo1~~;;4G5F5_E&iXx5b6A22B}l z!Mze+wDIFup-01~BV@m;Q7;p0lG*-}kl+^jBGXiw@f!R(dtbbo+uo$cwvo{`_wU&% zyx>;(;?l4x_`CDPqBQXDojXnN|3|sgRGQ_^;3JE^c-@ufy8(^SQl|Eak8wHre;!oxyd4I?U@p+Va?YJ90rZSEp(;P!@}UTglp!rrrHm; zuF!rp)_l%{0xAq9gWKebNwg_=a{ef+@Dm!EP*^Gb|3sm%DR>9p7lkwjqO;qm@oBZK=9kVE*Sk1#HN02sG|6~UN?~E}8JcmvXf=!r-cRsVS4tj|cTdO! zhe2#`3;i)#&cbqTI4_#_kbMu7hm%*~jtki0qGtwhbtT@>>XNsu_%KKg&0L>c%jO>R zTQ&Gywd%~CmkPrky(6CW-mk%zpj{&^vwt8!E>#SZIqt-DrWE+w)m= zHxMtsxT@9A!U8bq@;yXu%T}Qo;<=~IeS*Cg8Qj%EVA6C!{N{9GunJ^ zDHo}@_@1@Fpu@mHZoG_h=q9kK@ISachl+4`};t?=T^wBow3+eAi( zvFc$&xa-E#Ft`b>vlBOl&cQ1~rwp`BpRDDyvh8{SD?xTl8+6T5-oG#^GFx;T%*{eY zW>b@~6}(b#WsA1TMn#6Hx516AWCqvSH9JwAgI@yXO3Bt~y_{ornlbWmRL3l(CLj!= zf?MKBl&L7QBzRxNm9tT;vbU0=lLiyH;(nHz(fh(&m1+cq!Ci2RT)AshmRS^hMNt#} zXvW4BQD$~ynuNhtaQ&OGMfDFpUetsnsY{HbU=m-!y7{)6KDbp)sFSP;p0S&-*m%(q zcGRSzil8tuUvP_>Fo?>sq8fZK$(=t&5=#Y#!z_7^MTWswa0}e|GA#(+_%z{ZxLD+4 z{Pt#)vqk}7@D<#WCVUx|1g}QjIfMQ8{HPCyW`M?p!BlYl-I+4<4}RRROj22cV;0i% zx)I*B#}n>HEfFR?zQ>`*<+EFZYcA7cQIJ&|;X6Op6o!gvXMyHJoz41wKa*s zt?=T>wBq`(M{#y&xtcy&E9Ll+9eA9i`PgKK=Az}P?j;NQYq@HztY1>lYgM@2aLIz< z+ITLTzEYnVE$-C|m)O_|uC>IDsUFKi!S8XC$`=m(;eB)PcOwtoet59Cfx-2ZctAaa z*J2I?(A(R#SF<_1MFVSLny4ktB&Pl16I_1>Vk|ncToT&Qj?7iIkSXr3z)>-&KT5R+7{+ls*ZB1}}UC5#O z`rcd6;z%gw8Oa;MQ9OHe8@b6=RflGb3t^Hmp{?R^$xn2LD-6ZxmFy(Hm<@a0$etC@ z27k8F7@9#Y{8{y7wc38aJ%ToKUqgZ$GTCZT?1#p~f}NO531B;n%4Ih+1N|^+HPE*c z6^L0{gWxQ71C{M?CwJdNGr^NPYJ%?r*aDGdu3=|+A4gRicnf%2o=jnAhIvvb8Rq-= zoi^DVER<^16dVqjEx}x+=|$bOu(O3E)42D8eSYpUfIJi$IWhPvlkG^Na zGJOACV7VR(uBXgEr&iii0*11MeJsP_N_%{0=85*H2);MKfeJ(8;A7Pe8G@f0Y&p;s zN82ec)<}~d-`==wm?F3Z4*Xb^WN%jY+i~@~xrkEHc!Uh?m|Tk$iX3Y))qYM2Zi53; zb{m2(Ms&zhy9SDBxXnsj0g7EvN}>^CQq+EC3a+~YMTUkfCj}opa-t`nYaj?mzZgMg zTo@Du*WZaEQ^(E~Hy{IZtC*^>7Pp4jFo^0%acj_$Q5Af(j#GXb)~ZwN=W&G*%SrTU z7}NyU*(nbhItRb^!>_?5kCadFESKF8|za zf8IuRvh6F_BafhLQ~#}CR6#) zyl2c%g3I+0)6bJDJ*3 zDHbAU;14-P#v%2{$lMlyRVW1F+-aC*vK@9S->w=Suj$qWwOPw-tOMsF(^IxS^<`IjBOsF1tl}qUn@gN ztB$RQ%&+A$kjIT5pf}*;p*|9j9nguQ)f2wQZQ&;!ncpPw$l|82wy#u5@nRX-*%aJL zk%xSMKYRja2bvl1VH{G9bm3oTHBCEmrguq=oYGh+4ixtna&S(3C9=q5sbPdnoL4I< zt4PBN16ggdP^?t5=^@&1M7sKN zS!f(8k;ArV&}bb-drOhSXiAZj`imu411B1`Y#AD#VtFQV5-VhMI~!b-#Tu=xh1^VJ z&M2!T**A}*cVXwW8TON1pz;Jf3!m?U z@O}tU`1=X*Nxz$fzdrz<^tV3v-Rs1 zJk{|V@HhRvZ$dZ*{{9wxQd_?b;X4q%3*mbZz7OFC5Pk@O;(r9;#}Ix3;inLeh420h zKI!+VP3`;!eP2PoPu~yakbeFgKIy;f*GD4t$es0QJyws`5348Y$$y+!?|LBmNd54> zL-oV!N7U!Q=N$Mv5!ike~SF{ z%tQ70^#$_Nvkui4*3afo&oO>s(V_ae_46Kx{^vW<`uY9!3+flv7uT0i;fVUudWs9n z>fK!EsrPbWd3^;JR@PT>VRd~C7uMF-ap9u+#ay_gekm88TEC17ef9NR=&uiOVMBc* z7cQ@F;=*A43NBn(AL7F1`W7y1tq*hIs`@rAjMPWDu)V&63p?w(xNvp-8ZKO0ALGJx z_3OE?yM6-~wE8#~()A1%^!fxBChJpN$kz98VQ)Rhg?zohg<`$Lg?;rh7b^8C7i#rs zF6^%#;KEG(AQx_|-^7KR>$h;>*7|K+xV?S{7w)V-jSF|x@8-hO>-TWs8TDs!;okbQ zxbW=yeO!1>{eCVyxBdVZo>zZ97apv?fD13IKg5L>)gR`gG8ev5|0);0R{uH|zES@s7rs^hHW$8A|1KB4SN}d2eo+4*7k*U# zF&BPP|0x%KR{uE{eo_A=7k*X$H5YzU|1B4OSN}a1{!srT7yeYQbAii^}!|41atBod91m=NPpa+nYkQIZs5SCkws#3Q0) zju4NGlB0xpbd($;#JN#&tPqcjlH-MVLX?~+#FL`rWFejsC8rAUv?w`Uh-XB}JRv?M zO3oDG{3ux<#IvGgp%BlGl5>Q(C`!&1;(1YWz7Q{nk_&~nI7*fXacPvKgt#n9x`o&i zCA~si9wjS;xH3vs32}9ltP$ecC|M`Oi=yOWAzl(CmkRNzQF56O`=VsM5c{KKK!_Wn zWTOx-kCIJ79E_4Hgm`6?3<+^_lxz{=)+iYk;#EQ#7dM@g;N}egid!yu8LVR|V+$Y56M9KX^d~TFHAjIcI$@7KyV3fQ- zh%bzihlKc|D0x_jk3`9fh4_*vc~pomjgprM@#RtS3L!ogC9f3XtD@x9LVQh>yjF;> zi;~BM`1&Y$gAm^sC2tbqo1^3{LVRnKyiJI2kCJx?@tslfE+M`{Nq@k3GaVIh7bNAeO|B8}-3-Lcu@?RnTFG?aYQUAtBOo;IqIZTL&7)c7T zD@G0%;t?@2M~Fwp$WcN(I!2BW;@lWHR*1*N$niovAx2IV;z==bvJg*+kyC|uT8x}7 z#4}=Ko)DiBBWDV6evB*-;#o1WP>5&8$T>n>6eH&f@w^y0Ux*jP$b~{&93xAFxHLvm zLR=Oj-9qe%kzOG#kC7EZTp1&)gt$6J)(CNJjI0ylMKN-*5HE?5ONIE<7`aS{eKE3L zi2X4#AjAzZvQdba$H*oj4#vn8LcB6YhJ?5|Mz#oXYm5vF@v0cvCd82#85QF87}+7j zoiVaYh*!tRHA1{LM#hAAU5s2W#N9D+gAlbC85d$YMlwRwV`M^zlQA+S#B7Z05#rt$ z$q6wZBLyKAW27X+eKArNVkJhZLafEev=H~l$N?eF#K=J*-WVe{3GwC_xkZS##>j0# zygf$l5aOLN@-!jd6(e^G@#!&gj}V^`BhM7#y)p7EAwD}s?i1p3V&r}yJ~u`l5aRP< zmTr`0^Neg%BT$kyi@wRWb5v zA-*O?UMs}c#mM7Ae0_|(L5OdRkv9qP%`x&8A-*+6-X_Gi$H+T`_|6!4mk{3_BkvL7 zdt>B%LVSOWJR!sn#K;GQ_@Nm2un<2IBOevw$71B;Li|LGd{T&?ijhwX@iQ^q7iSjC@mw--?lM3-LQK@?9Z*FGjvE#2>`S z4~6)n82Pafe-a}<72?lgCMU4DXh`)-FUkmX!G4fj>{w_v-FT_8@$RCCHrx>XV zk;KTKg?K1N{vyP`#>n4<`1ct3hYoFs+V6(@%a@rXE?Bg7-)Kac-O(E5zgCNv{x>$H@vIu8fmaLR=juYlOHqPSy$WqByx&h?m64r9yma zoLnZvzBpMg#Qr!L5aNb7*(k)z<7AT%2jk=lAzm3LLqgmfCtHNLHBN?wcvYNi6XHmm zj0$mkoa_+d&N$g6#H-`v8X;aACu2gqE>5l&;_f)PL5NzMj0-UxCmA8?aWWyq$vBx3 zVm40p2yt(maqBA-+FOo)F>(;^c!u{7{^HSco5qlaC7VV{!6vA$}rGJ}Jac#mT3I z_?bBQtPnpJC!ZJM7vkiLLi|#kd|8NJiIcAi@oRDNbs>HuPQEF`Z^g;Ch4`H~`K}PZ z7boA3!?+*$L41JxFiw61A3u(hpTNgY*mli$ZT93p>U&;JPj|7UKL{3(7JsY4(T{tV#|gug)eD}=v6_&bDuK=?lh|Ag=_ z2>*ug9|-@2@IMHV!!9FH2r&q82!}yPKuAL9f^ay5BOuIya3qAIARG0m6w8PJ(bUgi|1#3gI*er$aac!aN91fp8{-`4ARBI19o;2xmh$2f`u<=R!CS z!ub#`fN&v%#SoT2SPCHpVHt#O2t5#bAuNZm0>VlNt01g~um-|f2*=gm49fDhHwppYaxt5xDLYg5Ozbj0fGi$96}mG27(S@0>UJODF|5zdm!wEkb{ti zP=HW`P=c@zLK#8@LKQ*{!Zd{a5Dq|?fp8GQjSy~va5IEkAlwS!HVC&vxC6qS5S|9% zE(mu+cshi8AUp%YGa=jy;aL!#4dFfr&w+41gy%wd0K)SiJRib?5MBV`g%BQs@FEBg zLwE$jiy^!O!lMvg3gKlCUJl_E5FUf@N(irl@M;LJf$&-guY>S7gx5oO1B5q1coT#- zLwE~>w?cRugttR@2ZVP*co&3sLwFB__d<9dg!e;u0>TF%d=SEiAbc3YM<9F@!p9(d z9Kt6cd=kQ^Abc9aXCQnQ!sj4-9>NzOd=bKzAbc6ZS0H>9!q*^t9l|#td=tXAAbcCb zcOZNh!uKG2AHokH{1C#AAp97@Paymh!p|W59KtUk{1U>iAp9D_Zy@{@!tWsb9>O0W z{1L*RAk-lc2!Dof2*O_={1w9AAp9M|KOp=cgnvT#7leO9_z#5t9!Be#|H1#XhS_)s z{v(mZArej0kAS)c9{e6US@}LZ7ltg`*qEHI}g>KB`siy4Of512~@ z=CnlpQWJA2!?6DWbD6-Lo~U1DVlHDC_CH|O3(Ogb`g#+?r;^zJ@HXb*+jvTXoGHJJ zdE#x5`G{JOAZN*_`G{JGsIwE~92vC`QHv0DZi1XAqZT3Rd_-N4AQ#H0^AWWeQA-kJ zsf=2Ts1%}>B}li7N+GHTQN0PWTt@XEY6YTJCdeuowL+lk1A_V0iTZ%a`~Z79?0;Z> z4gS*F1X(Bl(i%+fB1B!BAeYFfix71wqMn){m&vG05!HvN^$F51qxujvfT#@#vQb72 zAnI~NZAy?q8Fe|Lu0Yh42{I(3u0YggL~TistukseqJ|N5Rf24jQNxHDLDXo1Y?o0Z zh}wauoe8o_M(se<)rh(#L9UfiS0ic+QP(BN^)hMLykiV0GZQ3XWpLsU6IDl%#xqN<3h zCCIdlsv>GXq7Ed;jEvfksDp^QF+pyUQ3nxqGoo%ukXvQc&4{`UQMV_^9Wv@RMBRy~ zrzOZ;GU`r5-HoWHC&)cA>TX0m15wXRkb7m+GZ6JGL_Iq}?vqi^Lez5*b$^09S4KSt zQ4b*Mc?t4-8TA079z@g&66A$4>On+3gs2xK$ip(~Aw)fbs23;5OJvj|hReLB0(OLQ7=c-D-rdo1bMZLdL^P>gQ(Xg$m?X(YY_D~qF$dMZ;(-sBkGNa zdQ*bDSw_7PQEx%iTNC7MGU_dedOM=tks$AsQEx}oyAbv61bL5)dKaSJi>UV{$opl~ zdlB^nqCSuyACyr~AnHSi`f!4LL`HoGQ6ELr#}ee@GU}s<`UIjrnINB%QJ+B6rxEp; z1o^Ct`ZS_Ghp5jd$QNYP=MeQpM13hizAU4@h^Vh1>Z=LzH5v64M137m-$;;e%BZg+ z>RX8Vc7l9IMtuuW-$m5-66E_b>br>g0iu4GAU~2(KS0!v5%rS<`KgThF`|BksGldu zFJ#ou5cNw${VG9zEu(&ksNW#!w+Zq)8TA`P{T@+&NRU6usNW;%Pl&1~2$4~LLe!rT zbtpmpBBTC{sJ|lWZwc~u8TD60{R2_|mmvR?QU5^HzYz8B1o@AQ`WK@9i>Uu4NF*tF zNB>1sG%31;u_TGhsA!V*4xwLo7@`tMl9W-0A*u^ehbPGqGO7zva}af8k{l(Y<{;{5 zL>-ePb7j=gh&mQg$0f<}GU`}Foq(tlljI~BbpoPJM${=ua;l6v8BwPp>hvTzLq?s3 zsCkHbN|Kx@qvj!MKB5*R$yqXLKB5*P>g*&rM@B6~)FMQknLj^FM(sk>wTK!^lIvvDwTQYNQM;4m1{rldqBKN}CrMgHX^6@oN>7pr8I?iQ zB%-F0BrBsP5w!!i zBnM>FG@@n@budY8luLx_pim2O?K;Vhi>PNM$+KnDy@iLLzFiBn@qn?kb7b5DRBzcjHdLg17M${uo@?shFFrr?9s7I6Jr84Rzhh8S0m~*N%C45^=d@D4pEOM$?Ij*>k#z@M7=Rd-Xx>mfT%Yk z>Mcp~RvGnXM7<4BZ%>kU$f&m=>Ya#sSCYJ2M!geJ??KdiljMCe>OF{hKcb#Uk`KtJ z_ao|qi26{Hd{{<(5K$jN)JK!#V>0R^i2699K9MA!lu;i?)Ta>j=_L7#jQSL!K8vW& zCCTSy)MpX(1w?%@NxmebzJRDNBkC(j@>Lo2Wkh`qQD0AzZ^)>xA?llm`c{&BTSk2o zQQtw-ca!9MGU_{s`aYt5kR(5pQQt?@j}Z0aB>9Pq`Vpdjim0C@$J zekG%Rfv8_2>NiR9TN(9hMEwp?zfY1s$f(~T>W_%}Q;-5BT4>GM*SU8|3uWklH}hq>Ys@E52F5?B>$69|3OrwOL!;IE)wgK ze3(d=@J`~0I;@K%WKZDWYEBn9QbrwtsG|^dbQd{BMjeHyxrjQp ziySAT<|68NM4iw@PLxr{BkCkXo!muEkx?fh>QqFX)EfCqb^3&QxSDp7wMBxPes&vMD=%(0U5O(Q5z7ov5QcGGAfIx9HR1Fq#&bmh${>=NyUGV>d z^-~668k_H?1mO(&7vDt*!dVS}o!Ri$BKjBKEeRuPcf)V7B@9;_qDvL(sVgARg$VHX zT==^e{_ch41n{u}Rt&&LH!KQ(k5w@54mgl=~r?E6<~&yY^DNCqLN`Mz&t4# zp#n^Wk{wil*-mmb6<|V>j8S0>gxyrw4Z=7T#zD}jpo1_)g((pBQeiI$1u7Ik*hhtZ zAXKSP1z|rGV7iVRqyo&yk(;RilWycTD!{xNxswVobw=){0?dw)XHWqqz{sfDwQ411i9v zKKU^fVBDVkj0!L`Pku=S7=0(dp#luBliyPT#?Z;1r~t#{M~0{XV{~LI6<`>SY@-5< zw2|#pfWb7fiwZDaMy{m-42hBJsQ{y1M5BTRLWT+%5GJWG3Bn#K>;WN9g**r)DwIH| zP@w|CG!>>nn4!W92scsTCJ=6=!mS|OK?N9@A$L&$24BcMRDkgnaxWEN2!-571sEkE z&!qwkgplV`0meGW3#kCZ8RTIqz=#ET2^C;ag1n3hFz!GeqXG;qkpI`j-9}a!$8i`R z(N9Fg7!fhXG)9bwh={cjW5kFtMnsH=tXDm(hdsB4YSkVpA|hf$L_|bH#268gT|`85 zeRtmU;+*^A_J48So$qx!&RXEp1D*yxAmCZxGXS0kW-z?s7Nz$L;+;Mm|o;GW=O;AG%Z;40v9;1@qv{Dz+5 zYIXbKTIKzEF;?6tZWgyZ;;q}ocrj5-7E^W7zdAVRb*sa-9G@;`irM0h$GtUI%ohvW z#}})IyXEg1xmPT1AHQEL6%UGs9{1M&#~=B5rdh6DR*KceWvy{}+_*fc$)@qq(SNbr4V8h_?F&JU2qczr8Gg2gt!S*;1 z69R!84uKFLWC?}@5<+4&B)hOl47_ERmzUsO5?;*mNV2fYzTM3dUf#YO3wXb;yGv@d zT2kxq48y4OepPpMRsGd<{QqBn{Z)PVrP;s!+QE6hkqmByG*x>4=n2wvUAPU`Q^ftL zlJboA?;kySl)+O0xNN!!R0Hd!Bz{?`Me3G@;isitY)Z>+t~4#z=Eqe?_1)g?b@%&T zwJkxsLyOhOy}+212BkH?9>Z0)bVG$)3Lno!kJMLp;ZyUwClQS9t2lw5cvDgWB}hv$ zpbvEs0?1mtQr<#oimh7wXCkws94v5GN+ZCMkm7iM!hjBQ7edl%w37eC--)Nw04ztz zh`I;Y;5s!+4VVG%J>3g%ET4lgwk3n-!*2y#060ktV;rk)A<|p~hyWI7>CcBhPrGJ5 ze~Igv+WlFYZ`XYBUKitDsW-$w0oN>p1HKdB1u!4se7N@m0)RF^7_ba*31B&31z;s$ z6`&o^0bm_=0lEQ~0+?5?=8JsI{PkL#4Vu46^Q);N=6f#Ev9Iwu20yM{^L`N5!@7Hh zC2^kud6SsG~jl?9e~dO z_5(f#_&k7VzX1PEz?T4b0qzDc`~mo12HdON-w*#Q+VxlA{}tdtz}El|0S*8j20Q}z zI^Y`s=JOc*Zvwsrcw7s60{(XZ-vu1h!Wg&ds;_}^^2a7{S06a38+BaDT>$yxLOc}w zyi`1W_$P4leJw!9Uos?wEI6<%Wx)Fe!0#x9Rdy}FPu?f!Q{@zDzY_6?F$@`O06${v z0LYO1c7VGk6^Sehd4MwN2tqO|03MY1+eyW56WE3!86J`bi)d68Sh@3n+5#D zYeRCY_=%f5h>qjN2-6WR=)dt9?*;wUKRdldUX<;~Geq1TTvOKh2%rTpAFu#$9)P@p zb$LGEqX4!k`_@GOre{B-T-XX&0=N!9`OgIq`BN730rc|UQrzq1KgL~&uvLI|fJm$N zFGcujz#711fXe}E0qX!)0Ime|0{ z5CKF1G9U&R0PFz70fPX>O~4-l3J-^)%eE$i-4cBR?OFp z&&}@dLEt0W11tDlWh4;d=X(ohhR+yw9|9;((rrN9rcl%D0jz8GLAG%O|C9}OqGvm# zi`B>`|G=-bdo}nA+dqzeH-K_*93~`v`?mtS#{{Q7i2YySrmufi>iXMwaGXtjN*z-< z{2bfm9Q98hMTD~eR`D-JT!G(O`XuVNinpX5fY9d3BLF6LstOxi>&nPolt^XB_3!o$I zBsjX42D{{)aw3@;l83Xw-gI(Mj$|{zo@9D=sH?9(chMTjr0|f5r(ZHWl1QwO+}pF+ z)Y2tOGLh}_P$<(n6py5nnPe>68c7Z$)PA+9b7^p6Mowpf zkz{5l9(TBceaVq@L=LW(Q%POuF)c+1^v#c72z17aeh@@UYzIByJRk~bleC|Ao#0aI zaUTJdP_-YZ1&pJ6k1Pz!A*a_Z$LwLZ+i&+o!?Hc#3gb2u2nXDOki#2u-E_;5h0$=- zD~J6)yFV5S*gdj0WDm8419q1)>~Q!!K3Bvan|frSClYr10zRMJ;fTcS2=?1UE=Sbv z4}`olP*Y&{Rk6OoU>_OlcUSI@j8zb zOB=g$FlwjaZjNoT(?2WYzbXHHc;&yz-v3DxCNuwU(*MaV|BiS2cS=jaxi>1Dn*6%S z|HpRzV`cq=vz<~7@_*I(htrVR7A->~e(K|>d$BqLKOgho`N-=OfYtf$Y{V7%KQsKQ z1}KVBL=}6aa^>*>|Jlgz^eXV5S_VJ$kHf&*r;~gUy`Wl0`|B-d zJbKUVzZ6fb`i@p_t1lbssx^JfRJHF+$BGx%RJtmuL7*5($?0rd&IJ49ERs-y$~)?T zg%fY8`2EtLtk634tDOManxzyQ%4?KWp%msTw1iXj&7_31hf8DihFXXW#sz63oJklAl|} z&(!4Ebl0H8qj>AALTj&;TA<_Qilk~0tv+EGSLyQgqo(D50Qdv&Y3E=S|9Zqd13+g@ z|Dwh<`=|bu>nU8*u!{fVhNq*%xR} zQEPfLJ)rh#cr)fsFgg)_oMhx*>N;ROvk*};Ax$s2S*a;XS?QcEGOvGBEid%t6J^tf ziEB~_WB#p0A%z(GfSD4d7*7}Et~lQG>y7Jh&sA{M5{l~{Bg#lfLK`dACrKgnc2HRV zR{9kKjL_{il1wx(*Shqpvm4SwG_Q? zi_Q{3jcNW*`JeSkdnl{;N&6`G(s9IBvVW^U|Eq5Q2G9Sh#{XfP|DA+(tabiZ<$CMr z9*5?zH0f{{{=~DrqmIRn(VkEOOS{VAv9@MB8eJOHR)dvAW~?J~+;Be1@vw0X;+-}1 z3~6*vyRXyl@w5l*j&4u8-P6G!KFdwp%_+8p@L6g)C9uLDDP{#}Fz)#!ip_>Fvq+(q37$6Bat3DQ~v|0A!OqrHq# zvZAC(E=LL6ST>f1?WA|qKb@@QS4;hW7}}rjEu6k?N?nh4`_I?fi{%^d_O~+s;GDXY z-jsC>2j1-iMo4v;ZskIj=9}h+nk5Rs5Tg*|S=PR`5F&>sIp;aQ?Xxk3<>F zV-qoKavRMB~#P@NU0cT|43P(5L{@D=e{jw%<{w?qzOIE7s_p~en&f~o>tP#k{kxJw z{pVyKtMxw@nF_seq5Qi6y+GADa{d!TY0`=%Xz4zP{V!GH*VjL1@w60WjjsbfYW~+F zjBEbvg;$|G)JU>#WKdJ;4v~DVQ2&1(Zu#zX`6s2X^!PU+SD{-C1OE+*ULmdMLRp4N zj{W}xM4Ab(ioX+aMg5P*_+JM6<2nA@fPXTNf6{6({@c;Zx$kWk`XT!^_2H_8fgLoV z6RTrx{Mw;KYs0@E^E|G0rWrl^&jd#YhC|Q_eqcfaMx=ByohhP z1EB92W;@T+-bnrDDqM0+$Ljdk_kSb)KJZ*sBW$e%-2X~j74nou;Lpon#qZBGcB3PH z;uX&L-0Z&G`VXZ7<5msf55*M-a^@kGWSm1CiiME1JuP|Dru>}bu(nXIrbFnQIIL2Oga z)?TwLDH+x9K20e&$oU*_wB%Qe_C{TN5_p1e*O5@e)-DH z=ivIid2jo7?@au59XB2CwXTUMmdOSjp_5L%3ta0PcuqcuyoJfy=J(~!rp%7$9ooRjt@tZ z*K<21jaroS<+0|U=F6QAOlvRpRSwH`SUtM4xs;ymRTp8#K3U|F3LzW>1&vc5yH`_~Y+6`)a&#m>ND%WD$ zBg&i5BC$HTkh*elI;A+fr5vI+)e)%3eS?ieYHU`uZ;B=$r*7ywrj++qPZZ*{{sd0z za}p4jqIpVg-jbiqpzu<#Pg;25d+is0_Sw}3U;XAwr$4g!l(o{~r{C$nZNcAmKfd%A zkuU$@2AT%L^+|!)oaf$u?%cHxKM;N5o^#)BV@y{0L_WV)cYd4fcDIE>IOaF(Z^PNb zIC>Zd0lQ;3G}z@2M|}amKjM{)=eMryQo1;o0n7%g(Ht*-@PjzsfQPrO(P-ZD_iXvq z=dXJ?JNnK&`|W$@J(}IJXml{~`&qO8^^eP+e09xhYz84LzYdM<%g_S;0DGHK*b#4E z4`nD$5)sdhKGT{wvzF!;F|3Y1&Yjl5#y0_~7DpeU^%2*c__Y`D^0cl|^_9yMJG?!x z$LqqC51rDlSV-DoBk2cM>_Er$z)rFgJkqXMO>*yo9pNs->xS<|+JItN>Bj$FR9qA` z=Y@DxeXGEF^yo5WcWYrBQ8x9oD8`+koSW0gvMs|K@XH~Md|TR9)6$GqW-`7=Li?j# zQVVLV7age;e26=O)fM;-#N>=OU;8T?UY`8=SG8rK#;+Yzp8bYHrxRu8sXc57t}vI* zd6~X%kp{D`)2Ew7DgB0Zxf9ek#WN$JL|=9!8c()fh0Az$*M?*=k!jr!PvLJQp6U%n zc7z7x#Vwm~l6pKjyxi$;b?~>ir4zc{k+i&gSRToyLy5&Ly(8g7JaV~=Ja)*#%fm0U zsB57M+x!uqBj&|EdmsKhen-UK=JxpP-cTeKa7V%puk4>GeZ_`7_xSB`cHu;5f4AH2 z_6Iubp7zc*d%Mf!ws*L?yF0wjKv$=`YwxHywq5N1k1P$2D9630LfN5E;U>RyC<5(Y zG;>2R#v|u(aeXqqL)~X*@j!rE>nmL*nHb5U{?c+Hl#TC{m)2a6FV|NPYtuVZo+sl6b#3!Sx#$@2tEUY$q;MH7^nNnAC>{TQIrx?bp z&D$wHqGd9xTCdEi`28+JvSXBuwNuL+4wv5-80CCd@6MEz@A2q@cvKdlt2u-$9f>y^ za+h-A-exg(w)w4fkD`RfG%Ks!#Nl_B>L&N+mNQ!p{SeoR&Sgv(Q*Cp)Ml+_`N^x?p zqA}>zro}dowcb&f>R4pbfF40Yp*qJQD*b8a-_=ybls!Z9q%PE?P6mKv*zkq|2MNgtY%SuyzNg6h6m*q=|7bA8~S4w^K%8Ivy|#G6_Z#U z(QYpeMPvumJ9Q55NG`~G2n)l?XF-HZL-F`DZ0O>X z6+5oGt^=wEn0WNWC!i))7sLh_ER`H}1XQ{0eY$BZySB0KOm#Q!m^1X;9t85h6x|wm){;$k8 z>pn>Kf0;&fB8%Uu!)Jv`FXsy(Rqv0D#6jDhdzhRT#c*XNEHQKf+URW?Cx7tn0h>qXL*?&6~`)_^)du&ulwOL*_T7^_wDUOBd zwpA5EStIfW^oXYYclGB1G~9T*0Vd=P=n9|(IoGuRF1r}l5F_q7OvfA0+D-d!kEghF)rO%+|*TQHEhhJx&G&I1>AL-Cw<`8|C;MR z!AY(EY3l!l^4#hPT8&nh)w~dKOqI4)=lZ&(gmKjWZo_GNJae}GV=S2izl1%YeD^G^ z9c-zd$iD?AIM$1$ugH#5{UX3=n6B)rA^)4EbSh=qs91=q-!8Zm)}?Wrowyyi(#kj6 zf;g#=R-|3Z*@_|5)LK}aMsPRY_TRLBt;hbGv%FGgYg#$Kvi~L8@#6SV)Q}6mN~d)i z&#zpF^D2}0?La;AwU7fza-)8WNdh^mH*Y7-gpdjwe6o$ z_|q`PMlg5YvbraTyV8xLE{Kzojr$<#Jeo~DV&oh`%)S(!&>S+xgTwx$@nj( zG5pG2o*t2}h+QDXaf|E07*cq!yChNR8MYu#1nU=RgiygxNk+f`*+6P>&Oh(_Z~Wi> z<7d3q8@Ok|oZH^~-f6ep_3-=uHsc4qcib8{^}836_!!UmuJZii!VgLqYo)jc8S9DP zq8&78uiELgdK`MG{z1!ya0BtxEB{UO_MhzZr{4BYDAX-aiAZ15%6aB#JZZxj_fDK_ z9|5%Cd~*+e4D%r*ikKng+J~?Z?tFOaz?BOp+=uYo3GgCi2;l)GP8*)d_<0Z-Mi`}I z7xH4>e#8yo%CDqw<1T^{Y``prvKsSi#kf(wirtC%%X*E-3_LaGCpW$LqYeAEpL1Z| zW9N7})_m{Nhrj=KXN?~Ct?S#a7oIgEGWl7Yah^BP=y$#JZ?d<);P?aRW&FOm${!@@ z40M}*3;eTE{j1+;Fy_u(nEPs$+43|`&AoPMh4yo?2E3)JUFcLa4io_jN3ANM(O&P0 z2H?tnZbXu3^Rcag+?4Xdx}26o^o28lCDmXoLhjsJtKgpR1my&dlc%g+wcr!atXcY_ zJ)7R0ap=!4On>%*cWz9-`^@tf&g$E?|2}D=%Rdu+{Em0~qiYKZoJVn8fO8qdJ*Z(A z{5F9or5(1y)U6Y(kBXi9@RGq@BRAiBu)I4)^nb@$bBogS%3ZWXLFUtIXyEn z2S*qD_Z2_C@O4-6&Ua6JBY4uGJGQ^F=JA2&|Mc=5tJr--cNRXws&^vwq#Xa_-GA~k zk!rsBooD`~l`oQXBKpD=4UjVR{hmg*+Z#Hn%Dn;3kdYoT!B(sxE3H#6j$5oHs+|K( z^zpCC=F?Em!(&j-`kuruziz90KCr!h`fKbC=Jfc%>GOX4H~UU`V$G}aKfZeA$vgk| z(dhXHe{=YqU+g*UpXdB=^{??Zwb0{A>n1#3b+Ak=Z7*K>s-1b4n@Jp+{e|DH*zwIb zQ(xTopC7;b7j1{7&wtT(^c$gH-tABRVe#Uv`uD#ARN~-Dog~SJc}E>fuXa1!$nqOo za|Xd{{Mv0ZgOC5q;B)a6|B;pt&z*Ys$!l3E!4KaA zkADmEBXN(_fFwpqMk~4MSzWg<7R|hqsb`iqVn%MnS6mg6#Fg*H&TFmc0rRR*v1HVcs1ONa4 literal 56832 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 0; forzaReport.value = forzaProcesses > 0; - + forzaReport.value = true; + //TODO: CHANGE if (progressReporter != null) { progressReporter.Report(dsxReport); diff --git a/DataPacket.cs b/DataPacket.cs index 31dc4ed..1f3a81c 100644 --- a/DataPacket.cs +++ b/DataPacket.cs @@ -3,6 +3,8 @@ public class DataPacket { // Sled + + public float frontLeftContactPatchV { get; set; } public bool IsRaceOn { get; set; } public uint TimestampMS { get; set; } // Can overflow to 0 eventually public float EngineMaxRpm { get; set; } diff --git a/ForzaDSXWorker.cs b/ForzaDSXWorker.cs index 6f1c2af..b630a60 100644 --- a/ForzaDSXWorker.cs +++ b/ForzaDSXWorker.cs @@ -2,6 +2,7 @@ using System.IO; using System.Net; using System.Net.Sockets; +using System.Runtime.InteropServices; using System.Text; namespace ForzaDSX @@ -297,7 +298,7 @@ void SendData(DataPacket data) if (settings._verbose > 0 && progressReporter != null) { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}, Resistance: {filteredResistance}" )); + progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); } } else @@ -319,7 +320,7 @@ void SendData(DataPacket data) if (settings._verbose > 0 && progressReporter != null) { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}; Throttle Resistance: {filteredResistance}; Accelerator: {data.Accelerator}" )); + progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}\r\n Throttle Resistance: {filteredResistance}\r\n Accelerator: {data.Accelerator}" )); } p.instructions = new Instruction[] { RightTrigger }; @@ -360,7 +361,7 @@ void SendData(DataPacket data) if (settings._verbose > 0 && progressReporter != null) { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}, Resistance: {filteredResistance}" )); + progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); } } else @@ -382,7 +383,7 @@ void SendData(DataPacket data) if (settings._verbose > 0 && progressReporter != null) { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}; Brake Resistance: {filteredResistance}; Tire Slip: {combinedTireSlip}" )); + progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}\r\n Brake Resistance: {filteredResistance}\r\n Tire Slip: {combinedTireSlip} \r\n FLCPS: {data.frontLeftContactPatchV} \r\n speed: {data.Speed}" )); } p.instructions = new Instruction[] { LeftTrigger}; @@ -599,7 +600,8 @@ public void Run() { // return; } - data = ParseData(resultBuffer); + data = parseDirtData(resultBuffer); + if (settings._verbose > 1 && progressReporter != null) { @@ -659,8 +661,48 @@ static int EWMA(int input, int last, float alpha) return (int)Math.Floor(EWMA((float)input, (float)last, alpha)); } - //Parses data from Forza into a DataPacket - DataPacket ParseData(byte[] packet) + DataPacket parseDirtData(byte[] packet) + { + DataPacket data = new DataPacket(); + //data.AccelerationX + + data.IsRaceOn = true; + data.Power = 1; + data.CurrentEngineRpm = PacketParse.GetSingle(packet, 148) * 10.0f; + data.Speed = PacketParse.GetSingle(packet, 28); + data.frontLeftContactPatchV = PacketParse.GetSingle(packet, 108); + data.TireCombinedSlipFrontLeft = calcTireSlip(PacketParse.GetSingle(packet, 108), data.Speed); + data.TireCombinedSlipFrontRight = calcTireSlip(PacketParse.GetSingle(packet, 112), data.Speed); + data.TireCombinedSlipRearLeft = calcTireSlip(PacketParse.GetSingle(packet, 100), data.Speed); + data.TireCombinedSlipRearRight = calcTireSlip(PacketParse.GetSingle(packet, 104), data.Speed); + + + data.CarClass = 0; + + data.CarPerformanceIndex = 0; + + data.AccelerationX = PacketParse.GetSingle(packet, 136); + + data.AccelerationZ = PacketParse.GetSingle(packet, 140); + + data.Accelerator = (uint)(PacketParse.GetSingle(packet, 116)* 255.0f); + + data.Brake = (uint)(PacketParse.GetSingle(packet, 120) * 255.0f); + + data.EngineMaxRpm = PacketParse.GetSingle(packet, 252) * 10.0f; + data.EngineIdleRpm = 0; + return data; + } + static float calcTireSlip(float contactPatchSpeed, float vehicleSpeed) + { + if (Math.Abs(vehicleSpeed) < 0.1f) + { + return 0; + } + return 3.0f * (Math.Abs(Math.Abs(contactPatchSpeed) - vehicleSpeed) / vehicleSpeed); + } + //Parses data from Forza into a DataPacket + DataPacket ParseData(byte[] packet) { DataPacket data = new DataPacket(); diff --git a/UI.Designer.cs b/UI.Designer.cs index 3352e03..aa60a5a 100644 --- a/UI.Designer.cs +++ b/UI.Designer.cs @@ -23,1993 +23,2113 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new Container(); - mainPanel = new System.Windows.Forms.Panel(); - mainTabControl = new System.Windows.Forms.TabControl(); - miscTabPage = new System.Windows.Forms.TabPage(); - miscTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); - forzaPortNumericUpDown = new System.Windows.Forms.NumericUpDown(); - forzaPortLabel = new System.Windows.Forms.Label(); - dsxPortLabel = new System.Windows.Forms.Label(); - appCheckLabel = new System.Windows.Forms.Label(); - rpmLabel = new System.Windows.Forms.Label(); - rpmTrackBar = new System.Windows.Forms.TrackBar(); - appCheckBox = new System.Windows.Forms.CheckBox(); - dsxNumericUpDown = new System.Windows.Forms.NumericUpDown(); - rpmValueNumericUpDown = new System.Windows.Forms.NumericUpDown(); - buttonApplyMisc = new System.Windows.Forms.Button(); - miscDefaultsButton = new System.Windows.Forms.Button(); - brakeConfigTabPage = new System.Windows.Forms.TabPage(); - brakeTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); - brakeResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); - maxBrakeResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); - minBrakeResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); - maxBrakeStifnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); - minBrakeStifnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); - brakeVibrationSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); - maxBrakeVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); - minBrakeVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); - brakeVibrationModeNumericUpDown = new System.Windows.Forms.NumericUpDown(); - brakeVibrationStartNumericUpDown = new System.Windows.Forms.NumericUpDown(); - gripLossNumericUpDown = new System.Windows.Forms.NumericUpDown(); - brakeEffectNumericUpDown = new System.Windows.Forms.NumericUpDown(); - brakeResistanceSmoothingTrackBar = new System.Windows.Forms.TrackBar(); - brakeResistanceSmoothingLabel = new System.Windows.Forms.Label(); - maxBrakeResistanceTrackBar = new System.Windows.Forms.TrackBar(); - maxBrakeResistanceLabel = new System.Windows.Forms.Label(); - minBrakeResistanceTrackBar = new System.Windows.Forms.TrackBar(); - minBrakeResistanceLabel = new System.Windows.Forms.Label(); - maxBrakeStiffnessTrackBar = new System.Windows.Forms.TrackBar(); - maxBrakeStiffnessLabel = new System.Windows.Forms.Label(); - minBrakeStiffnessTrackBar = new System.Windows.Forms.TrackBar(); - minBrakeStiffnessLabel = new System.Windows.Forms.Label(); - vibrationSmoothingTrackBar = new System.Windows.Forms.TrackBar(); - vibrationSmoothingLabel = new System.Windows.Forms.Label(); - maxBrakeVibrationTrackBar = new System.Windows.Forms.TrackBar(); - maxBrakeVibrationLabel = new System.Windows.Forms.Label(); - minBrakeVibrationTrackBar = new System.Windows.Forms.TrackBar(); - minBrakeVibrationLabel = new System.Windows.Forms.Label(); - brakeVibrationModeTrackBar = new System.Windows.Forms.TrackBar(); - brakeVibrationModeStartLabel = new System.Windows.Forms.Label(); - brakeVibrationStartTrackBar = new System.Windows.Forms.TrackBar(); - brakeVibrationStartLabel = new System.Windows.Forms.Label(); - gripLossTrackBar = new System.Windows.Forms.TrackBar(); - gripLossLabel = new System.Windows.Forms.Label(); - brakeEffectIntensityLabel = new System.Windows.Forms.Label(); - brakeEffectIntensityTrackBar = new System.Windows.Forms.TrackBar(); - buttonApply_Brake = new System.Windows.Forms.Button(); - brakeDefaultsButton = new System.Windows.Forms.Button(); - brakeTriggerMode = new System.Windows.Forms.Label(); - brakeTriggerModeComboBox = new System.Windows.Forms.ComboBox(); - throttleConfigTabPage = new System.Windows.Forms.TabPage(); - throttleTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); - throttleTriggerModeComboBox = new System.Windows.Forms.ComboBox(); - throttleTriggerMode = new System.Windows.Forms.Label(); - throttleResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMaxResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMinResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMaxStiffnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMinStiffnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleVibrationSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMaxVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleMinVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleVibrationStartNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleAccelLimitNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleForwardAccelScaleNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleTurnAccelScaleNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleGripLossNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleIntensityNumericUpDown = new System.Windows.Forms.NumericUpDown(); - throttleResistanceSmoothTrackBar = new System.Windows.Forms.TrackBar(); - throttleMaxResistanceTrackBar = new System.Windows.Forms.TrackBar(); - throttleMinResistanceTrackBar = new System.Windows.Forms.TrackBar(); - throttleMaxStiffnessTrackBar = new System.Windows.Forms.TrackBar(); - throttleMinStiffnessTrackBar = new System.Windows.Forms.TrackBar(); - throttleVibrationSmoothTrackBar = new System.Windows.Forms.TrackBar(); - throttleMaxVibrationTrackBar = new System.Windows.Forms.TrackBar(); - throttleMinVibrationTrackBar = new System.Windows.Forms.TrackBar(); - throttleVibrationModeStartTrackBar = new System.Windows.Forms.TrackBar(); - throttleAccelLimitTrackBar = new System.Windows.Forms.TrackBar(); - throttleForwardAccelScaleTrackBar = new System.Windows.Forms.TrackBar(); - throttleTurnAccelScaleTrackBar = new System.Windows.Forms.TrackBar(); - throttleGripLossTrackBar = new System.Windows.Forms.TrackBar(); - throttleIntensityTrackBar = new System.Windows.Forms.TrackBar(); - throttleResistanceSmoothingLabel = new System.Windows.Forms.Label(); - maxThrottleResistanceLabel = new System.Windows.Forms.Label(); - minThrottleResistanceLabel = new System.Windows.Forms.Label(); - maxThrottleStiffnessLabel = new System.Windows.Forms.Label(); - minThrottleStiffnessLabel = new System.Windows.Forms.Label(); - throttleVibrationSmoothingLabel = new System.Windows.Forms.Label(); - maxThrottleVibrationLabel = new System.Windows.Forms.Label(); - minThrottleVibrationLabel = new System.Windows.Forms.Label(); - throttleVibrationStartLabel = new System.Windows.Forms.Label(); - accelerationLimitLabel = new System.Windows.Forms.Label(); - forwardAccelLabel = new System.Windows.Forms.Label(); - turnAccelLabel = new System.Windows.Forms.Label(); - throttleGripLossLabel = new System.Windows.Forms.Label(); - throttleIntensityLabel = new System.Windows.Forms.Label(); - buttonApply_Throttle = new System.Windows.Forms.Button(); - throttleDefaultsButton = new System.Windows.Forms.Button(); - outputTabPage = new System.Windows.Forms.TabPage(); - raceGroupBox = new System.Windows.Forms.GroupBox(); - tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - brakeMsg = new System.Windows.Forms.Label(); - brakeVibrationMsg = new System.Windows.Forms.Label(); - throttleMsg = new System.Windows.Forms.Label(); - throttleVibrationMsg = new System.Windows.Forms.Label(); - noRaceGroupBox = new System.Windows.Forms.GroupBox(); - noRaceText = new System.Windows.Forms.Label(); - outputListBox = new System.Windows.Forms.ListBox(); - toolStripStatusDSX = new System.Windows.Forms.ToolStripStatusLabel(); - toolStripStatusForza = new System.Windows.Forms.ToolStripStatusLabel(); - toolStripVerboseMode = new System.Windows.Forms.ToolStripDropDownButton(); - verboseModeOffToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - verboseModeLowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - verboseModeFullToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - statusStrip1 = new System.Windows.Forms.StatusStrip(); - toolTip = new System.Windows.Forms.ToolTip(components); - mainPanel.SuspendLayout(); - mainTabControl.SuspendLayout(); - miscTabPage.SuspendLayout(); - miscTableLayoutPanel.SuspendLayout(); - ((ISupportInitialize)forzaPortNumericUpDown).BeginInit(); - ((ISupportInitialize)rpmTrackBar).BeginInit(); - ((ISupportInitialize)dsxNumericUpDown).BeginInit(); - ((ISupportInitialize)rpmValueNumericUpDown).BeginInit(); - brakeConfigTabPage.SuspendLayout(); - brakeTableLayoutPanel.SuspendLayout(); - ((ISupportInitialize)brakeResistanceSmoothNumericUpDown).BeginInit(); - ((ISupportInitialize)maxBrakeResistanceNumericUpDown).BeginInit(); - ((ISupportInitialize)minBrakeResistanceNumericUpDown).BeginInit(); - ((ISupportInitialize)maxBrakeStifnessNumericUpDown).BeginInit(); - ((ISupportInitialize)minBrakeStifnessNumericUpDown).BeginInit(); - ((ISupportInitialize)brakeVibrationSmoothNumericUpDown).BeginInit(); - ((ISupportInitialize)maxBrakeVibrationNumericUpDown).BeginInit(); - ((ISupportInitialize)minBrakeVibrationNumericUpDown).BeginInit(); - ((ISupportInitialize)brakeVibrationModeNumericUpDown).BeginInit(); - ((ISupportInitialize)brakeVibrationStartNumericUpDown).BeginInit(); - ((ISupportInitialize)gripLossNumericUpDown).BeginInit(); - ((ISupportInitialize)brakeEffectNumericUpDown).BeginInit(); - ((ISupportInitialize)brakeResistanceSmoothingTrackBar).BeginInit(); - ((ISupportInitialize)maxBrakeResistanceTrackBar).BeginInit(); - ((ISupportInitialize)minBrakeResistanceTrackBar).BeginInit(); - ((ISupportInitialize)maxBrakeStiffnessTrackBar).BeginInit(); - ((ISupportInitialize)minBrakeStiffnessTrackBar).BeginInit(); - ((ISupportInitialize)vibrationSmoothingTrackBar).BeginInit(); - ((ISupportInitialize)maxBrakeVibrationTrackBar).BeginInit(); - ((ISupportInitialize)minBrakeVibrationTrackBar).BeginInit(); - ((ISupportInitialize)brakeVibrationModeTrackBar).BeginInit(); - ((ISupportInitialize)brakeVibrationStartTrackBar).BeginInit(); - ((ISupportInitialize)gripLossTrackBar).BeginInit(); - ((ISupportInitialize)brakeEffectIntensityTrackBar).BeginInit(); - throttleConfigTabPage.SuspendLayout(); - throttleTableLayoutPanel.SuspendLayout(); - ((ISupportInitialize)throttleResistanceSmoothNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMaxResistanceNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMinResistanceNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMaxStiffnessNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMinStiffnessNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleVibrationSmoothNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMaxVibrationNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleMinVibrationNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleVibrationStartNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleAccelLimitNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleForwardAccelScaleNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleTurnAccelScaleNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleGripLossNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleIntensityNumericUpDown).BeginInit(); - ((ISupportInitialize)throttleResistanceSmoothTrackBar).BeginInit(); - ((ISupportInitialize)throttleMaxResistanceTrackBar).BeginInit(); - ((ISupportInitialize)throttleMinResistanceTrackBar).BeginInit(); - ((ISupportInitialize)throttleMaxStiffnessTrackBar).BeginInit(); - ((ISupportInitialize)throttleMinStiffnessTrackBar).BeginInit(); - ((ISupportInitialize)throttleVibrationSmoothTrackBar).BeginInit(); - ((ISupportInitialize)throttleMaxVibrationTrackBar).BeginInit(); - ((ISupportInitialize)throttleMinVibrationTrackBar).BeginInit(); - ((ISupportInitialize)throttleVibrationModeStartTrackBar).BeginInit(); - ((ISupportInitialize)throttleAccelLimitTrackBar).BeginInit(); - ((ISupportInitialize)throttleForwardAccelScaleTrackBar).BeginInit(); - ((ISupportInitialize)throttleTurnAccelScaleTrackBar).BeginInit(); - ((ISupportInitialize)throttleGripLossTrackBar).BeginInit(); - ((ISupportInitialize)throttleIntensityTrackBar).BeginInit(); - outputTabPage.SuspendLayout(); - raceGroupBox.SuspendLayout(); - tableLayoutPanel1.SuspendLayout(); - noRaceGroupBox.SuspendLayout(); - statusStrip1.SuspendLayout(); - SuspendLayout(); - // - // mainPanel - // - mainPanel.Controls.Add(mainTabControl); - mainPanel.Dock = System.Windows.Forms.DockStyle.Fill; - mainPanel.Location = new System.Drawing.Point(0, 0); - mainPanel.Name = "mainPanel"; - mainPanel.Size = new System.Drawing.Size(721, 761); - mainPanel.TabIndex = 0; - // - // mainTabControl - // - mainTabControl.Controls.Add(miscTabPage); - mainTabControl.Controls.Add(brakeConfigTabPage); - mainTabControl.Controls.Add(throttleConfigTabPage); - mainTabControl.Controls.Add(outputTabPage); - mainTabControl.Dock = System.Windows.Forms.DockStyle.Fill; - mainTabControl.Location = new System.Drawing.Point(0, 0); - mainTabControl.Name = "mainTabControl"; - mainTabControl.SelectedIndex = 0; - mainTabControl.Size = new System.Drawing.Size(721, 761); - mainTabControl.TabIndex = 0; - // - // miscTabPage - // - miscTabPage.Controls.Add(miscTableLayoutPanel); - miscTabPage.Location = new System.Drawing.Point(4, 24); - miscTabPage.Name = "miscTabPage"; - miscTabPage.Padding = new System.Windows.Forms.Padding(3); - miscTabPage.Size = new System.Drawing.Size(713, 733); - miscTabPage.TabIndex = 3; - miscTabPage.Text = "Misc"; - miscTabPage.UseVisualStyleBackColor = true; - // - // miscTableLayoutPanel - // - miscTableLayoutPanel.AutoScroll = true; - miscTableLayoutPanel.AutoSize = true; - miscTableLayoutPanel.ColumnCount = 3; - miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - miscTableLayoutPanel.Controls.Add(forzaPortNumericUpDown, 1, 3); - miscTableLayoutPanel.Controls.Add(forzaPortLabel, 0, 3); - miscTableLayoutPanel.Controls.Add(dsxPortLabel, 0, 2); - miscTableLayoutPanel.Controls.Add(appCheckLabel, 0, 1); - miscTableLayoutPanel.Controls.Add(rpmLabel, 0, 0); - miscTableLayoutPanel.Controls.Add(rpmTrackBar, 1, 0); - miscTableLayoutPanel.Controls.Add(appCheckBox, 1, 1); - miscTableLayoutPanel.Controls.Add(dsxNumericUpDown, 1, 2); - miscTableLayoutPanel.Controls.Add(rpmValueNumericUpDown, 2, 0); - miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 4); - miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 4); - miscTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - miscTableLayoutPanel.Location = new System.Drawing.Point(3, 3); - miscTableLayoutPanel.Name = "miscTableLayoutPanel"; - miscTableLayoutPanel.RowCount = 5; - miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - miscTableLayoutPanel.Size = new System.Drawing.Size(707, 727); - miscTableLayoutPanel.TabIndex = 0; - // - // forzaPortNumericUpDown - // - forzaPortNumericUpDown.AutoSize = true; - forzaPortNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - forzaPortNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - forzaPortNumericUpDown.Location = new System.Drawing.Point(120, 103); - forzaPortNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); - forzaPortNumericUpDown.MaximumSize = new System.Drawing.Size(100, 0); - forzaPortNumericUpDown.Name = "forzaPortNumericUpDown"; - forzaPortNumericUpDown.Size = new System.Drawing.Size(100, 23); - forzaPortNumericUpDown.TabIndex = 7; - toolTip.SetToolTip(forzaPortNumericUpDown, "Port for Forza UDP server"); - forzaPortNumericUpDown.ValueChanged += forzaPortNumericUpDown_ValueChanged; - // - // forzaPortLabel - // - forzaPortLabel.AutoSize = true; - forzaPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; - forzaPortLabel.Location = new System.Drawing.Point(3, 100); - forzaPortLabel.Name = "forzaPortLabel"; - forzaPortLabel.Size = new System.Drawing.Size(111, 29); - forzaPortLabel.TabIndex = 6; - forzaPortLabel.Text = "Forza Port"; - forzaPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(forzaPortLabel, "Port for Forza UDP server"); - // - // dsxPortLabel - // - dsxPortLabel.AutoSize = true; - dsxPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; - dsxPortLabel.Location = new System.Drawing.Point(3, 71); - dsxPortLabel.Name = "dsxPortLabel"; - dsxPortLabel.Size = new System.Drawing.Size(111, 29); - dsxPortLabel.TabIndex = 4; - dsxPortLabel.Text = "DSX Port"; - dsxPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(dsxPortLabel, "Port for DSX Port Listener"); - // - // appCheckLabel - // - appCheckLabel.AutoSize = true; - appCheckLabel.Dock = System.Windows.Forms.DockStyle.Fill; - appCheckLabel.Location = new System.Drawing.Point(3, 51); - appCheckLabel.Name = "appCheckLabel"; - appCheckLabel.Size = new System.Drawing.Size(111, 20); - appCheckLabel.TabIndex = 2; - appCheckLabel.Text = "Disable App Check?"; - appCheckLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(appCheckLabel, "Should we disable the check for running applications?"); - // - // rpmLabel - // - rpmLabel.AutoSize = true; - rpmLabel.Dock = System.Windows.Forms.DockStyle.Fill; - rpmLabel.LiveSetting = System.Windows.Forms.Automation.AutomationLiveSetting.Polite; - rpmLabel.Location = new System.Drawing.Point(3, 0); - rpmLabel.Name = "rpmLabel"; - rpmLabel.Size = new System.Drawing.Size(111, 51); - rpmLabel.TabIndex = 0; - rpmLabel.Text = "RPM Redline Ratio"; - rpmLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(rpmLabel, "The percentage of the current RPM when we are in the \"redline\" of the engine"); - // - // rpmTrackBar - // - rpmTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - rpmTrackBar.Cursor = System.Windows.Forms.Cursors.NoMoveHoriz; - rpmTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - rpmTrackBar.LargeChange = 50; - rpmTrackBar.Location = new System.Drawing.Point(120, 3); - rpmTrackBar.Maximum = 100; - rpmTrackBar.Name = "rpmTrackBar"; - rpmTrackBar.Size = new System.Drawing.Size(415, 45); - rpmTrackBar.TabIndex = 1; - rpmTrackBar.TickFrequency = 5; - rpmTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(rpmTrackBar, "The percentage of the current RPM when we are in the \"redline\" of the engine"); - rpmTrackBar.Scroll += rpmTrackBar_Scroll; - // - // appCheckBox - // - appCheckBox.AutoSize = true; - appCheckBox.Dock = System.Windows.Forms.DockStyle.Fill; - appCheckBox.Location = new System.Drawing.Point(120, 54); - appCheckBox.Name = "appCheckBox"; - appCheckBox.Size = new System.Drawing.Size(415, 14); - appCheckBox.TabIndex = 3; - toolTip.SetToolTip(appCheckBox, "Should we disable the check for running applications?"); - appCheckBox.UseVisualStyleBackColor = true; - appCheckBox.CheckedChanged += appCheckBox_CheckedChanged; - // - // dsxNumericUpDown - // - dsxNumericUpDown.AutoSize = true; - dsxNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - dsxNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - dsxNumericUpDown.Location = new System.Drawing.Point(120, 74); - dsxNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); - dsxNumericUpDown.MaximumSize = new System.Drawing.Size(100, 0); - dsxNumericUpDown.Name = "dsxNumericUpDown"; - dsxNumericUpDown.Size = new System.Drawing.Size(100, 23); - dsxNumericUpDown.TabIndex = 5; - toolTip.SetToolTip(dsxNumericUpDown, "Port for DSX Port Listener"); - dsxNumericUpDown.ValueChanged += dsxNumericUpDown_ValueChanged; - // - // rpmValueNumericUpDown - // - rpmValueNumericUpDown.AutoSize = true; - rpmValueNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - rpmValueNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - rpmValueNumericUpDown.Location = new System.Drawing.Point(541, 3); - rpmValueNumericUpDown.Name = "rpmValueNumericUpDown"; - rpmValueNumericUpDown.Size = new System.Drawing.Size(163, 23); - rpmValueNumericUpDown.TabIndex = 8; - toolTip.SetToolTip(rpmValueNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); - rpmValueNumericUpDown.ValueChanged += rpmValueNumericUpDown_ValueChanged; - // - // buttonApplyMisc - // - buttonApplyMisc.Dock = System.Windows.Forms.DockStyle.Top; - buttonApplyMisc.Location = new System.Drawing.Point(120, 132); - buttonApplyMisc.MaximumSize = new System.Drawing.Size(300, 30); - buttonApplyMisc.MinimumSize = new System.Drawing.Size(200, 25); - buttonApplyMisc.Name = "buttonApplyMisc"; - buttonApplyMisc.Size = new System.Drawing.Size(300, 25); - buttonApplyMisc.TabIndex = 9; - buttonApplyMisc.Text = "Apply"; - buttonApplyMisc.UseVisualStyleBackColor = true; - buttonApplyMisc.Click += buttonApplyMisc_Click; - // - // miscDefaultsButton - // - miscDefaultsButton.Location = new System.Drawing.Point(541, 132); - miscDefaultsButton.Name = "miscDefaultsButton"; - miscDefaultsButton.Size = new System.Drawing.Size(75, 23); - miscDefaultsButton.TabIndex = 39; - miscDefaultsButton.Text = "Defaults"; - miscDefaultsButton.UseVisualStyleBackColor = true; - miscDefaultsButton.Click += miscDefaultsButton_Click; - // - // brakeConfigTabPage - // - brakeConfigTabPage.Controls.Add(brakeTableLayoutPanel); - brakeConfigTabPage.Location = new System.Drawing.Point(4, 24); - brakeConfigTabPage.Name = "brakeConfigTabPage"; - brakeConfigTabPage.Size = new System.Drawing.Size(713, 733); - brakeConfigTabPage.TabIndex = 4; - brakeConfigTabPage.Text = "Brake Trigger"; - // - // brakeTableLayoutPanel - // - brakeTableLayoutPanel.AutoScroll = true; - brakeTableLayoutPanel.AutoSize = true; - brakeTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - brakeTableLayoutPanel.BackColor = System.Drawing.SystemColors.ControlLightLight; - brakeTableLayoutPanel.ColumnCount = 3; - brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothNumericUpDown, 2, 12); - brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceNumericUpDown, 2, 11); - brakeTableLayoutPanel.Controls.Add(minBrakeResistanceNumericUpDown, 2, 10); - brakeTableLayoutPanel.Controls.Add(maxBrakeStifnessNumericUpDown, 2, 9); - brakeTableLayoutPanel.Controls.Add(minBrakeStifnessNumericUpDown, 2, 8); - brakeTableLayoutPanel.Controls.Add(brakeVibrationSmoothNumericUpDown, 2, 7); - brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationNumericUpDown, 2, 6); - brakeTableLayoutPanel.Controls.Add(minBrakeVibrationNumericUpDown, 2, 5); - brakeTableLayoutPanel.Controls.Add(brakeVibrationModeNumericUpDown, 2, 4); - brakeTableLayoutPanel.Controls.Add(brakeVibrationStartNumericUpDown, 2, 3); - brakeTableLayoutPanel.Controls.Add(gripLossNumericUpDown, 2, 2); - brakeTableLayoutPanel.Controls.Add(brakeEffectNumericUpDown, 2, 1); - brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothingTrackBar, 1, 12); - brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothingLabel, 0, 12); - brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceTrackBar, 1, 11); - brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceLabel, 0, 11); - brakeTableLayoutPanel.Controls.Add(minBrakeResistanceTrackBar, 1, 10); - brakeTableLayoutPanel.Controls.Add(minBrakeResistanceLabel, 0, 10); - brakeTableLayoutPanel.Controls.Add(maxBrakeStiffnessTrackBar, 1, 9); - brakeTableLayoutPanel.Controls.Add(maxBrakeStiffnessLabel, 0, 9); - brakeTableLayoutPanel.Controls.Add(minBrakeStiffnessTrackBar, 1, 8); - brakeTableLayoutPanel.Controls.Add(minBrakeStiffnessLabel, 0, 8); - brakeTableLayoutPanel.Controls.Add(vibrationSmoothingTrackBar, 1, 7); - brakeTableLayoutPanel.Controls.Add(vibrationSmoothingLabel, 0, 7); - brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationTrackBar, 1, 6); - brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationLabel, 0, 6); - brakeTableLayoutPanel.Controls.Add(minBrakeVibrationTrackBar, 1, 5); - brakeTableLayoutPanel.Controls.Add(minBrakeVibrationLabel, 0, 5); - brakeTableLayoutPanel.Controls.Add(brakeVibrationModeTrackBar, 1, 4); - brakeTableLayoutPanel.Controls.Add(brakeVibrationModeStartLabel, 0, 4); - brakeTableLayoutPanel.Controls.Add(brakeVibrationStartTrackBar, 1, 3); - brakeTableLayoutPanel.Controls.Add(brakeVibrationStartLabel, 0, 3); - brakeTableLayoutPanel.Controls.Add(gripLossTrackBar, 1, 2); - brakeTableLayoutPanel.Controls.Add(gripLossLabel, 0, 2); - brakeTableLayoutPanel.Controls.Add(brakeEffectIntensityLabel, 0, 1); - brakeTableLayoutPanel.Controls.Add(brakeEffectIntensityTrackBar, 1, 1); - brakeTableLayoutPanel.Controls.Add(buttonApply_Brake, 1, 13); - brakeTableLayoutPanel.Controls.Add(brakeDefaultsButton, 2, 13); - brakeTableLayoutPanel.Controls.Add(brakeTriggerMode, 0, 0); - brakeTableLayoutPanel.Controls.Add(brakeTriggerModeComboBox, 1, 0); - brakeTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - brakeTableLayoutPanel.Location = new System.Drawing.Point(0, 0); - brakeTableLayoutPanel.Name = "brakeTableLayoutPanel"; - brakeTableLayoutPanel.RowCount = 15; - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); - brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 8F)); - brakeTableLayoutPanel.Size = new System.Drawing.Size(713, 733); - brakeTableLayoutPanel.TabIndex = 0; - // - // brakeResistanceSmoothNumericUpDown - // - brakeResistanceSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - brakeResistanceSmoothNumericUpDown.AutoSize = true; - brakeResistanceSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - brakeResistanceSmoothNumericUpDown.Location = new System.Drawing.Point(541, 604); - brakeResistanceSmoothNumericUpDown.Maximum = new decimal(new int[] { 500, 0, 0, 0 }); - brakeResistanceSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - brakeResistanceSmoothNumericUpDown.Name = "brakeResistanceSmoothNumericUpDown"; - brakeResistanceSmoothNumericUpDown.Size = new System.Drawing.Size(41, 23); - brakeResistanceSmoothNumericUpDown.TabIndex = 36; - toolTip.SetToolTip(brakeResistanceSmoothNumericUpDown, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); - brakeResistanceSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - brakeResistanceSmoothNumericUpDown.ValueChanged += brakeResistanceSmoothNumericUpDown_ValueChanged; - // - // maxBrakeResistanceNumericUpDown - // - maxBrakeResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - maxBrakeResistanceNumericUpDown.AutoSize = true; - maxBrakeResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - maxBrakeResistanceNumericUpDown.Location = new System.Drawing.Point(541, 553); - maxBrakeResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); - maxBrakeResistanceNumericUpDown.Name = "maxBrakeResistanceNumericUpDown"; - maxBrakeResistanceNumericUpDown.Size = new System.Drawing.Size(29, 23); - maxBrakeResistanceNumericUpDown.TabIndex = 35; - toolTip.SetToolTip(maxBrakeResistanceNumericUpDown, "The Maximum resistance on the Brake (0-7)"); - maxBrakeResistanceNumericUpDown.ValueChanged += maxBrakeResistanceNumericUpDown_ValueChanged; - // - // minBrakeResistanceNumericUpDown - // - minBrakeResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - minBrakeResistanceNumericUpDown.AutoSize = true; - minBrakeResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - minBrakeResistanceNumericUpDown.Location = new System.Drawing.Point(541, 502); - minBrakeResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); - minBrakeResistanceNumericUpDown.Name = "minBrakeResistanceNumericUpDown"; - minBrakeResistanceNumericUpDown.Size = new System.Drawing.Size(29, 23); - minBrakeResistanceNumericUpDown.TabIndex = 34; - toolTip.SetToolTip(minBrakeResistanceNumericUpDown, "The Minimum resistance on the Brake (0-7)"); - minBrakeResistanceNumericUpDown.ValueChanged += minBrakeResistanceNumericUpDown_ValueChanged; - // - // maxBrakeStifnessNumericUpDown - // - maxBrakeStifnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - maxBrakeStifnessNumericUpDown.AutoSize = true; - maxBrakeStifnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - maxBrakeStifnessNumericUpDown.Location = new System.Drawing.Point(541, 451); - maxBrakeStifnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - maxBrakeStifnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - maxBrakeStifnessNumericUpDown.Name = "maxBrakeStifnessNumericUpDown"; - maxBrakeStifnessNumericUpDown.Size = new System.Drawing.Size(41, 23); - maxBrakeStifnessNumericUpDown.TabIndex = 33; - toolTip.SetToolTip(maxBrakeStifnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); - maxBrakeStifnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - maxBrakeStifnessNumericUpDown.ValueChanged += maxBrakeStifnessNumericUpDown_ValueChanged; - // - // minBrakeStifnessNumericUpDown - // - minBrakeStifnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - minBrakeStifnessNumericUpDown.AutoSize = true; - minBrakeStifnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - minBrakeStifnessNumericUpDown.Location = new System.Drawing.Point(541, 400); - minBrakeStifnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - minBrakeStifnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - minBrakeStifnessNumericUpDown.Name = "minBrakeStifnessNumericUpDown"; - minBrakeStifnessNumericUpDown.Size = new System.Drawing.Size(41, 23); - minBrakeStifnessNumericUpDown.TabIndex = 32; - toolTip.SetToolTip(minBrakeStifnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); - minBrakeStifnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - minBrakeStifnessNumericUpDown.ValueChanged += minBrakeStifnessNumericUpDown_ValueChanged; - // - // brakeVibrationSmoothNumericUpDown - // - brakeVibrationSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - brakeVibrationSmoothNumericUpDown.AutoSize = true; - brakeVibrationSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - brakeVibrationSmoothNumericUpDown.Location = new System.Drawing.Point(541, 349); - brakeVibrationSmoothNumericUpDown.Maximum = new decimal(new int[] { 500, 0, 0, 0 }); - brakeVibrationSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - brakeVibrationSmoothNumericUpDown.Name = "brakeVibrationSmoothNumericUpDown"; - brakeVibrationSmoothNumericUpDown.Size = new System.Drawing.Size(41, 23); - brakeVibrationSmoothNumericUpDown.TabIndex = 31; - toolTip.SetToolTip(brakeVibrationSmoothNumericUpDown, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); - brakeVibrationSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - brakeVibrationSmoothNumericUpDown.ValueChanged += brakeVibrationSmoothNumericUpDown_ValueChanged; - // - // maxBrakeVibrationNumericUpDown - // - maxBrakeVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - maxBrakeVibrationNumericUpDown.AutoSize = true; - maxBrakeVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - maxBrakeVibrationNumericUpDown.Location = new System.Drawing.Point(541, 298); - maxBrakeVibrationNumericUpDown.Name = "maxBrakeVibrationNumericUpDown"; - maxBrakeVibrationNumericUpDown.Size = new System.Drawing.Size(41, 23); - maxBrakeVibrationNumericUpDown.TabIndex = 30; - toolTip.SetToolTip(maxBrakeVibrationNumericUpDown, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); - maxBrakeVibrationNumericUpDown.ValueChanged += maxBrakeVibrationNumericUpDown_ValueChanged; - // - // minBrakeVibrationNumericUpDown - // - minBrakeVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - minBrakeVibrationNumericUpDown.AutoSize = true; - minBrakeVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - minBrakeVibrationNumericUpDown.Location = new System.Drawing.Point(541, 247); - minBrakeVibrationNumericUpDown.Name = "minBrakeVibrationNumericUpDown"; - minBrakeVibrationNumericUpDown.Size = new System.Drawing.Size(41, 23); - minBrakeVibrationNumericUpDown.TabIndex = 29; - toolTip.SetToolTip(minBrakeVibrationNumericUpDown, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - minBrakeVibrationNumericUpDown.ValueChanged += minBrakeVibrationNumericUpDown_ValueChanged; - // - // brakeVibrationModeNumericUpDown - // - brakeVibrationModeNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - brakeVibrationModeNumericUpDown.AutoSize = true; - brakeVibrationModeNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - brakeVibrationModeNumericUpDown.Location = new System.Drawing.Point(541, 196); - brakeVibrationModeNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - brakeVibrationModeNumericUpDown.Name = "brakeVibrationModeNumericUpDown"; - brakeVibrationModeNumericUpDown.Size = new System.Drawing.Size(41, 23); - brakeVibrationModeNumericUpDown.TabIndex = 28; - toolTip.SetToolTip(brakeVibrationModeNumericUpDown, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); - brakeVibrationModeNumericUpDown.ValueChanged += brakeVibrationModeNumericUpDown_ValueChanged; - // - // brakeVibrationStartNumericUpDown - // - brakeVibrationStartNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - brakeVibrationStartNumericUpDown.AutoSize = true; - brakeVibrationStartNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - brakeVibrationStartNumericUpDown.Location = new System.Drawing.Point(541, 145); - brakeVibrationStartNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - brakeVibrationStartNumericUpDown.Name = "brakeVibrationStartNumericUpDown"; - brakeVibrationStartNumericUpDown.Size = new System.Drawing.Size(41, 23); - brakeVibrationStartNumericUpDown.TabIndex = 27; - toolTip.SetToolTip(brakeVibrationStartNumericUpDown, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); - brakeVibrationStartNumericUpDown.ValueChanged += brakeVibrationStartNumericUpDown_ValueChanged; - // - // gripLossNumericUpDown - // - gripLossNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - gripLossNumericUpDown.AutoSize = true; - gripLossNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - gripLossNumericUpDown.Location = new System.Drawing.Point(541, 94); - gripLossNumericUpDown.Name = "gripLossNumericUpDown"; - gripLossNumericUpDown.Size = new System.Drawing.Size(41, 23); - gripLossNumericUpDown.TabIndex = 26; - toolTip.SetToolTip(gripLossNumericUpDown, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); - gripLossNumericUpDown.ValueChanged += gripLossNumericUpDown_ValueChanged; - // - // brakeEffectNumericUpDown - // - brakeEffectNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - brakeEffectNumericUpDown.AutoSize = true; - brakeEffectNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - brakeEffectNumericUpDown.Location = new System.Drawing.Point(541, 43); - brakeEffectNumericUpDown.Name = "brakeEffectNumericUpDown"; - brakeEffectNumericUpDown.Size = new System.Drawing.Size(41, 23); - brakeEffectNumericUpDown.TabIndex = 2; - toolTip.SetToolTip(brakeEffectNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); - brakeEffectNumericUpDown.ValueChanged += brakeEffectNumericUpDown_ValueChanged; - // - // brakeResistanceSmoothingTrackBar - // - brakeResistanceSmoothingTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - brakeResistanceSmoothingTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - brakeResistanceSmoothingTrackBar.LargeChange = 50; - brakeResistanceSmoothingTrackBar.Location = new System.Drawing.Point(133, 593); - brakeResistanceSmoothingTrackBar.Maximum = 500; - brakeResistanceSmoothingTrackBar.Minimum = 1; - brakeResistanceSmoothingTrackBar.Name = "brakeResistanceSmoothingTrackBar"; - brakeResistanceSmoothingTrackBar.Size = new System.Drawing.Size(402, 45); - brakeResistanceSmoothingTrackBar.TabIndex = 23; - brakeResistanceSmoothingTrackBar.TickFrequency = 10; - brakeResistanceSmoothingTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(brakeResistanceSmoothingTrackBar, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); - brakeResistanceSmoothingTrackBar.Value = 1; - brakeResistanceSmoothingTrackBar.Scroll += brakeResistanceSmoothingTrackBar_Scroll; - // - // brakeResistanceSmoothingLabel - // - brakeResistanceSmoothingLabel.AutoSize = true; - brakeResistanceSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; - brakeResistanceSmoothingLabel.Location = new System.Drawing.Point(3, 590); - brakeResistanceSmoothingLabel.Name = "brakeResistanceSmoothingLabel"; - brakeResistanceSmoothingLabel.Size = new System.Drawing.Size(124, 51); - brakeResistanceSmoothingLabel.TabIndex = 22; - brakeResistanceSmoothingLabel.Text = "Resistance Smoothing"; - brakeResistanceSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(brakeResistanceSmoothingLabel, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); - // - // maxBrakeResistanceTrackBar - // - maxBrakeResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - maxBrakeResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeResistanceTrackBar.LargeChange = 50; - maxBrakeResistanceTrackBar.Location = new System.Drawing.Point(133, 542); - maxBrakeResistanceTrackBar.Maximum = 7; - maxBrakeResistanceTrackBar.Name = "maxBrakeResistanceTrackBar"; - maxBrakeResistanceTrackBar.Size = new System.Drawing.Size(402, 45); - maxBrakeResistanceTrackBar.TabIndex = 21; - maxBrakeResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(maxBrakeResistanceTrackBar, "The Maximum resistance on the Brake (0-7)"); - maxBrakeResistanceTrackBar.Scroll += maxBrakeResistanceTrackBar_Scroll; - // - // maxBrakeResistanceLabel - // - maxBrakeResistanceLabel.AutoSize = true; - maxBrakeResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeResistanceLabel.Location = new System.Drawing.Point(3, 539); - maxBrakeResistanceLabel.Name = "maxBrakeResistanceLabel"; - maxBrakeResistanceLabel.Size = new System.Drawing.Size(124, 51); - maxBrakeResistanceLabel.TabIndex = 20; - maxBrakeResistanceLabel.Text = "Max Resistance"; - maxBrakeResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxBrakeResistanceLabel, "The Maximum resistance on the Brake (0-7)"); - // - // minBrakeResistanceTrackBar - // - minBrakeResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - minBrakeResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeResistanceTrackBar.LargeChange = 50; - minBrakeResistanceTrackBar.Location = new System.Drawing.Point(133, 491); - minBrakeResistanceTrackBar.Maximum = 7; - minBrakeResistanceTrackBar.Name = "minBrakeResistanceTrackBar"; - minBrakeResistanceTrackBar.Size = new System.Drawing.Size(402, 45); - minBrakeResistanceTrackBar.TabIndex = 19; - minBrakeResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(minBrakeResistanceTrackBar, "The Minimum resistance on the Brake (0-7)"); - minBrakeResistanceTrackBar.Scroll += minBrakeResistanceTrackBar_Scroll; - // - // minBrakeResistanceLabel - // - minBrakeResistanceLabel.AutoSize = true; - minBrakeResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeResistanceLabel.Location = new System.Drawing.Point(3, 488); - minBrakeResistanceLabel.Name = "minBrakeResistanceLabel"; - minBrakeResistanceLabel.Size = new System.Drawing.Size(124, 51); - minBrakeResistanceLabel.TabIndex = 18; - minBrakeResistanceLabel.Text = "Min Resistance"; - minBrakeResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minBrakeResistanceLabel, "The Minimum resistance on the Brake (0-7)"); - // - // maxBrakeStiffnessTrackBar - // - maxBrakeStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - maxBrakeStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeStiffnessTrackBar.LargeChange = 50; - maxBrakeStiffnessTrackBar.Location = new System.Drawing.Point(133, 440); - maxBrakeStiffnessTrackBar.Maximum = 255; - maxBrakeStiffnessTrackBar.Minimum = 1; - maxBrakeStiffnessTrackBar.Name = "maxBrakeStiffnessTrackBar"; - maxBrakeStiffnessTrackBar.Size = new System.Drawing.Size(402, 45); - maxBrakeStiffnessTrackBar.TabIndex = 17; - maxBrakeStiffnessTrackBar.TickFrequency = 5; - maxBrakeStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(maxBrakeStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); - maxBrakeStiffnessTrackBar.Value = 1; - maxBrakeStiffnessTrackBar.Scroll += maxBrakeStiffnessTrackBar_Scroll; - // - // maxBrakeStiffnessLabel - // - maxBrakeStiffnessLabel.AutoSize = true; - maxBrakeStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeStiffnessLabel.Location = new System.Drawing.Point(3, 437); - maxBrakeStiffnessLabel.Name = "maxBrakeStiffnessLabel"; - maxBrakeStiffnessLabel.Size = new System.Drawing.Size(124, 51); - maxBrakeStiffnessLabel.TabIndex = 16; - maxBrakeStiffnessLabel.Text = "Max Stiffness"; - maxBrakeStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxBrakeStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); - // - // minBrakeStiffnessTrackBar - // - minBrakeStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - minBrakeStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeStiffnessTrackBar.LargeChange = 50; - minBrakeStiffnessTrackBar.Location = new System.Drawing.Point(133, 389); - minBrakeStiffnessTrackBar.Maximum = 255; - minBrakeStiffnessTrackBar.Minimum = 1; - minBrakeStiffnessTrackBar.Name = "minBrakeStiffnessTrackBar"; - minBrakeStiffnessTrackBar.Size = new System.Drawing.Size(402, 45); - minBrakeStiffnessTrackBar.TabIndex = 15; - minBrakeStiffnessTrackBar.TickFrequency = 5; - minBrakeStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(minBrakeStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); - minBrakeStiffnessTrackBar.Value = 1; - minBrakeStiffnessTrackBar.Scroll += minBrakeStiffnessTrackBar_Scroll; - // - // minBrakeStiffnessLabel - // - minBrakeStiffnessLabel.AutoSize = true; - minBrakeStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeStiffnessLabel.Location = new System.Drawing.Point(3, 386); - minBrakeStiffnessLabel.Name = "minBrakeStiffnessLabel"; - minBrakeStiffnessLabel.Size = new System.Drawing.Size(124, 51); - minBrakeStiffnessLabel.TabIndex = 14; - minBrakeStiffnessLabel.Text = "Min Stifness"; - minBrakeStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minBrakeStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); - // - // vibrationSmoothingTrackBar - // - vibrationSmoothingTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - vibrationSmoothingTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - vibrationSmoothingTrackBar.LargeChange = 50; - vibrationSmoothingTrackBar.Location = new System.Drawing.Point(133, 338); - vibrationSmoothingTrackBar.Maximum = 500; - vibrationSmoothingTrackBar.Minimum = 1; - vibrationSmoothingTrackBar.Name = "vibrationSmoothingTrackBar"; - vibrationSmoothingTrackBar.Size = new System.Drawing.Size(402, 45); - vibrationSmoothingTrackBar.TabIndex = 13; - vibrationSmoothingTrackBar.TickFrequency = 10; - vibrationSmoothingTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(vibrationSmoothingTrackBar, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); - vibrationSmoothingTrackBar.Value = 1; - vibrationSmoothingTrackBar.Scroll += vibrationSmoothingTrackBar_Scroll; - // - // vibrationSmoothingLabel - // - vibrationSmoothingLabel.AutoSize = true; - vibrationSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; - vibrationSmoothingLabel.Location = new System.Drawing.Point(3, 335); - vibrationSmoothingLabel.Name = "vibrationSmoothingLabel"; - vibrationSmoothingLabel.Size = new System.Drawing.Size(124, 51); - vibrationSmoothingLabel.TabIndex = 12; - vibrationSmoothingLabel.Text = "Vibration Smoothing"; - vibrationSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(vibrationSmoothingLabel, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); - // - // maxBrakeVibrationTrackBar - // - maxBrakeVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - maxBrakeVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeVibrationTrackBar.LargeChange = 50; - maxBrakeVibrationTrackBar.Location = new System.Drawing.Point(133, 287); - maxBrakeVibrationTrackBar.Maximum = 100; - maxBrakeVibrationTrackBar.Name = "maxBrakeVibrationTrackBar"; - maxBrakeVibrationTrackBar.Size = new System.Drawing.Size(402, 45); - maxBrakeVibrationTrackBar.TabIndex = 11; - maxBrakeVibrationTrackBar.TickFrequency = 5; - maxBrakeVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(maxBrakeVibrationTrackBar, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); - maxBrakeVibrationTrackBar.Scroll += maxBrakeVibrationTrackBar_Scroll; - // - // maxBrakeVibrationLabel - // - maxBrakeVibrationLabel.AutoSize = true; - maxBrakeVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxBrakeVibrationLabel.Location = new System.Drawing.Point(3, 284); - maxBrakeVibrationLabel.Name = "maxBrakeVibrationLabel"; - maxBrakeVibrationLabel.Size = new System.Drawing.Size(124, 51); - maxBrakeVibrationLabel.TabIndex = 10; - maxBrakeVibrationLabel.Text = "Max Brake Vibration"; - maxBrakeVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxBrakeVibrationLabel, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); - // - // minBrakeVibrationTrackBar - // - minBrakeVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - minBrakeVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeVibrationTrackBar.LargeChange = 50; - minBrakeVibrationTrackBar.Location = new System.Drawing.Point(133, 236); - minBrakeVibrationTrackBar.Maximum = 100; - minBrakeVibrationTrackBar.Name = "minBrakeVibrationTrackBar"; - minBrakeVibrationTrackBar.Size = new System.Drawing.Size(402, 45); - minBrakeVibrationTrackBar.TabIndex = 9; - minBrakeVibrationTrackBar.TickFrequency = 5; - minBrakeVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(minBrakeVibrationTrackBar, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - minBrakeVibrationTrackBar.Scroll += minBrakeVibrationTrackBar_Scroll; - // - // minBrakeVibrationLabel - // - minBrakeVibrationLabel.AutoSize = true; - minBrakeVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minBrakeVibrationLabel.Location = new System.Drawing.Point(3, 233); - minBrakeVibrationLabel.Name = "minBrakeVibrationLabel"; - minBrakeVibrationLabel.Size = new System.Drawing.Size(124, 51); - minBrakeVibrationLabel.TabIndex = 8; - minBrakeVibrationLabel.Text = "Min Brake Vibration"; - minBrakeVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minBrakeVibrationLabel, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - // - // brakeVibrationModeTrackBar - // - brakeVibrationModeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - brakeVibrationModeTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - brakeVibrationModeTrackBar.LargeChange = 50; - brakeVibrationModeTrackBar.Location = new System.Drawing.Point(133, 185); - brakeVibrationModeTrackBar.Maximum = 255; - brakeVibrationModeTrackBar.Name = "brakeVibrationModeTrackBar"; - brakeVibrationModeTrackBar.Size = new System.Drawing.Size(402, 45); - brakeVibrationModeTrackBar.TabIndex = 7; - brakeVibrationModeTrackBar.TickFrequency = 5; - brakeVibrationModeTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(brakeVibrationModeTrackBar, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); - brakeVibrationModeTrackBar.Scroll += brakeVibrationModeTrackBar_Scroll; - // - // brakeVibrationModeStartLabel - // - brakeVibrationModeStartLabel.AutoSize = true; - brakeVibrationModeStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; - brakeVibrationModeStartLabel.Location = new System.Drawing.Point(3, 182); - brakeVibrationModeStartLabel.Name = "brakeVibrationModeStartLabel"; - brakeVibrationModeStartLabel.Size = new System.Drawing.Size(124, 51); - brakeVibrationModeStartLabel.TabIndex = 6; - brakeVibrationModeStartLabel.Text = "Vibration Mode Start"; - brakeVibrationModeStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(brakeVibrationModeStartLabel, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); - // - // brakeVibrationStartTrackBar - // - brakeVibrationStartTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - brakeVibrationStartTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - brakeVibrationStartTrackBar.LargeChange = 50; - brakeVibrationStartTrackBar.Location = new System.Drawing.Point(133, 134); - brakeVibrationStartTrackBar.Maximum = 255; - brakeVibrationStartTrackBar.Name = "brakeVibrationStartTrackBar"; - brakeVibrationStartTrackBar.Size = new System.Drawing.Size(402, 45); - brakeVibrationStartTrackBar.TabIndex = 5; - brakeVibrationStartTrackBar.TickFrequency = 5; - brakeVibrationStartTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(brakeVibrationStartTrackBar, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); - brakeVibrationStartTrackBar.Scroll += brakeVibrationStartTrackBar_Scroll; - // - // brakeVibrationStartLabel - // - brakeVibrationStartLabel.AutoSize = true; - brakeVibrationStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; - brakeVibrationStartLabel.Location = new System.Drawing.Point(3, 131); - brakeVibrationStartLabel.Name = "brakeVibrationStartLabel"; - brakeVibrationStartLabel.Size = new System.Drawing.Size(124, 51); - brakeVibrationStartLabel.TabIndex = 4; - brakeVibrationStartLabel.Text = "Vibration Start"; - brakeVibrationStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(brakeVibrationStartLabel, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); - // - // gripLossTrackBar - // - gripLossTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - gripLossTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - gripLossTrackBar.Location = new System.Drawing.Point(133, 83); - gripLossTrackBar.Maximum = 100; - gripLossTrackBar.Name = "gripLossTrackBar"; - gripLossTrackBar.Size = new System.Drawing.Size(402, 45); - gripLossTrackBar.TabIndex = 3; - gripLossTrackBar.TickFrequency = 5; - gripLossTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(gripLossTrackBar, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); - gripLossTrackBar.Value = 50; - gripLossTrackBar.Scroll += gripLossTrackBar_Scroll; - // - // gripLossLabel - // - gripLossLabel.AutoSize = true; - gripLossLabel.Dock = System.Windows.Forms.DockStyle.Fill; - gripLossLabel.Location = new System.Drawing.Point(3, 80); - gripLossLabel.Name = "gripLossLabel"; - gripLossLabel.Size = new System.Drawing.Size(124, 51); - gripLossLabel.TabIndex = 2; - gripLossLabel.Text = "Grip Loss Value"; - gripLossLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(gripLossLabel, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); - // - // brakeEffectIntensityLabel - // - brakeEffectIntensityLabel.AutoSize = true; - brakeEffectIntensityLabel.Dock = System.Windows.Forms.DockStyle.Fill; - brakeEffectIntensityLabel.Location = new System.Drawing.Point(3, 29); - brakeEffectIntensityLabel.Name = "brakeEffectIntensityLabel"; - brakeEffectIntensityLabel.Size = new System.Drawing.Size(124, 51); - brakeEffectIntensityLabel.TabIndex = 0; - brakeEffectIntensityLabel.Text = "Effect Intensity"; - brakeEffectIntensityLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(brakeEffectIntensityLabel, "The percentage of the trigger effects"); - // - // brakeEffectIntensityTrackBar - // - brakeEffectIntensityTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - brakeEffectIntensityTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - brakeEffectIntensityTrackBar.LargeChange = 10; - brakeEffectIntensityTrackBar.Location = new System.Drawing.Point(133, 32); - brakeEffectIntensityTrackBar.Maximum = 100; - brakeEffectIntensityTrackBar.Name = "brakeEffectIntensityTrackBar"; - brakeEffectIntensityTrackBar.Size = new System.Drawing.Size(402, 45); - brakeEffectIntensityTrackBar.TabIndex = 1; - brakeEffectIntensityTrackBar.TickFrequency = 5; - brakeEffectIntensityTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(brakeEffectIntensityTrackBar, "The percentage of the trigger effects"); - brakeEffectIntensityTrackBar.Value = 100; - brakeEffectIntensityTrackBar.Scroll += brakeEffectIntensityTrackBar_Scroll; - // - // buttonApply_Brake - // - buttonApply_Brake.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - buttonApply_Brake.AutoSize = true; - buttonApply_Brake.Location = new System.Drawing.Point(133, 644); - buttonApply_Brake.Name = "buttonApply_Brake"; - buttonApply_Brake.Size = new System.Drawing.Size(402, 25); - buttonApply_Brake.TabIndex = 37; - buttonApply_Brake.Text = "Apply"; - buttonApply_Brake.UseVisualStyleBackColor = true; - buttonApply_Brake.Click += buttonApply_Brake_Click; - // - // brakeDefaultsButton - // - brakeDefaultsButton.AutoSize = true; - brakeDefaultsButton.Location = new System.Drawing.Point(541, 644); - brakeDefaultsButton.Name = "brakeDefaultsButton"; - brakeDefaultsButton.Size = new System.Drawing.Size(75, 25); - brakeDefaultsButton.TabIndex = 38; - brakeDefaultsButton.Text = "Defaults"; - brakeDefaultsButton.UseVisualStyleBackColor = true; - brakeDefaultsButton.Click += brakeDefaultsButton_Click; - // - // brakeTriggerMode - // - brakeTriggerMode.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - brakeTriggerMode.AutoSize = true; - brakeTriggerMode.Location = new System.Drawing.Point(18, 0); - brakeTriggerMode.Name = "brakeTriggerMode"; - brakeTriggerMode.Size = new System.Drawing.Size(109, 29); - brakeTriggerMode.TabIndex = 39; - brakeTriggerMode.Text = "Brake Trigger Mode"; - brakeTriggerMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // brakeTriggerModeComboBox - // - brakeTriggerModeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - brakeTriggerModeComboBox.FormattingEnabled = true; - brakeTriggerModeComboBox.Items.AddRange(new object[] { "Off", "Resistance", "Vibration" }); - brakeTriggerModeComboBox.Location = new System.Drawing.Point(133, 3); - brakeTriggerModeComboBox.Name = "brakeTriggerModeComboBox"; - brakeTriggerModeComboBox.Size = new System.Drawing.Size(402, 23); - brakeTriggerModeComboBox.TabIndex = 40; - brakeTriggerModeComboBox.SelectedIndexChanged += brakeTriggerModeComboBox_SelectedIndexChanged; - // - // throttleConfigTabPage - // - throttleConfigTabPage.Controls.Add(throttleTableLayoutPanel); - throttleConfigTabPage.Location = new System.Drawing.Point(4, 24); - throttleConfigTabPage.Name = "throttleConfigTabPage"; - throttleConfigTabPage.Padding = new System.Windows.Forms.Padding(3); - throttleConfigTabPage.Size = new System.Drawing.Size(713, 733); - throttleConfigTabPage.TabIndex = 2; - throttleConfigTabPage.Text = "Throttle Trigger"; - throttleConfigTabPage.UseVisualStyleBackColor = true; - // - // throttleTableLayoutPanel - // - throttleTableLayoutPanel.AutoScroll = true; - throttleTableLayoutPanel.ColumnCount = 3; - throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - throttleTableLayoutPanel.Controls.Add(throttleTriggerModeComboBox, 1, 0); - throttleTableLayoutPanel.Controls.Add(throttleTriggerMode, 0, 0); - throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothNumericUpDown, 2, 14); - throttleTableLayoutPanel.Controls.Add(throttleMaxResistanceNumericUpDown, 2, 13); - throttleTableLayoutPanel.Controls.Add(throttleMinResistanceNumericUpDown, 2, 12); - throttleTableLayoutPanel.Controls.Add(throttleMaxStiffnessNumericUpDown, 2, 11); - throttleTableLayoutPanel.Controls.Add(throttleMinStiffnessNumericUpDown, 2, 10); - throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothNumericUpDown, 2, 9); - throttleTableLayoutPanel.Controls.Add(throttleMaxVibrationNumericUpDown, 2, 8); - throttleTableLayoutPanel.Controls.Add(throttleMinVibrationNumericUpDown, 2, 7); - throttleTableLayoutPanel.Controls.Add(throttleVibrationStartNumericUpDown, 2, 6); - throttleTableLayoutPanel.Controls.Add(throttleAccelLimitNumericUpDown, 2, 5); - throttleTableLayoutPanel.Controls.Add(throttleForwardAccelScaleNumericUpDown, 2, 4); - throttleTableLayoutPanel.Controls.Add(throttleTurnAccelScaleNumericUpDown, 2, 3); - throttleTableLayoutPanel.Controls.Add(throttleGripLossNumericUpDown, 2, 2); - throttleTableLayoutPanel.Controls.Add(throttleIntensityNumericUpDown, 2, 1); - throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothTrackBar, 1, 14); - throttleTableLayoutPanel.Controls.Add(throttleMaxResistanceTrackBar, 1, 13); - throttleTableLayoutPanel.Controls.Add(throttleMinResistanceTrackBar, 1, 12); - throttleTableLayoutPanel.Controls.Add(throttleMaxStiffnessTrackBar, 1, 11); - throttleTableLayoutPanel.Controls.Add(throttleMinStiffnessTrackBar, 1, 10); - throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothTrackBar, 1, 9); - throttleTableLayoutPanel.Controls.Add(throttleMaxVibrationTrackBar, 1, 8); - throttleTableLayoutPanel.Controls.Add(throttleMinVibrationTrackBar, 1, 7); - throttleTableLayoutPanel.Controls.Add(throttleVibrationModeStartTrackBar, 1, 6); - throttleTableLayoutPanel.Controls.Add(throttleAccelLimitTrackBar, 1, 5); - throttleTableLayoutPanel.Controls.Add(throttleForwardAccelScaleTrackBar, 1, 4); - throttleTableLayoutPanel.Controls.Add(throttleTurnAccelScaleTrackBar, 1, 3); - throttleTableLayoutPanel.Controls.Add(throttleGripLossTrackBar, 1, 2); - throttleTableLayoutPanel.Controls.Add(throttleIntensityTrackBar, 1, 1); - throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothingLabel, 0, 14); - throttleTableLayoutPanel.Controls.Add(maxThrottleResistanceLabel, 0, 13); - throttleTableLayoutPanel.Controls.Add(minThrottleResistanceLabel, 0, 12); - throttleTableLayoutPanel.Controls.Add(maxThrottleStiffnessLabel, 0, 11); - throttleTableLayoutPanel.Controls.Add(minThrottleStiffnessLabel, 0, 10); - throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothingLabel, 0, 9); - throttleTableLayoutPanel.Controls.Add(maxThrottleVibrationLabel, 0, 8); - throttleTableLayoutPanel.Controls.Add(minThrottleVibrationLabel, 0, 7); - throttleTableLayoutPanel.Controls.Add(throttleVibrationStartLabel, 0, 6); - throttleTableLayoutPanel.Controls.Add(accelerationLimitLabel, 0, 5); - throttleTableLayoutPanel.Controls.Add(forwardAccelLabel, 0, 4); - throttleTableLayoutPanel.Controls.Add(turnAccelLabel, 0, 3); - throttleTableLayoutPanel.Controls.Add(throttleGripLossLabel, 0, 2); - throttleTableLayoutPanel.Controls.Add(throttleIntensityLabel, 0, 1); - throttleTableLayoutPanel.Controls.Add(buttonApply_Throttle, 1, 15); - throttleTableLayoutPanel.Controls.Add(throttleDefaultsButton, 2, 15); - throttleTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleTableLayoutPanel.Location = new System.Drawing.Point(3, 3); - throttleTableLayoutPanel.Name = "throttleTableLayoutPanel"; - throttleTableLayoutPanel.RowCount = 16; - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.Size = new System.Drawing.Size(707, 727); - throttleTableLayoutPanel.TabIndex = 0; - // - // throttleTriggerModeComboBox - // - throttleTriggerModeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - throttleTriggerModeComboBox.FormattingEnabled = true; - throttleTriggerModeComboBox.Items.AddRange(new object[] { "Off", "Resistance", "Vibration" }); - throttleTriggerModeComboBox.Location = new System.Drawing.Point(141, 3); - throttleTriggerModeComboBox.Name = "throttleTriggerModeComboBox"; - throttleTriggerModeComboBox.Size = new System.Drawing.Size(402, 23); - throttleTriggerModeComboBox.TabIndex = 46; - throttleTriggerModeComboBox.SelectedIndexChanged += throttleTriggerModeComboBox_SelectedIndexChanged; - // - // throttleTriggerMode - // - throttleTriggerMode.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - throttleTriggerMode.AutoSize = true; - throttleTriggerMode.Location = new System.Drawing.Point(14, 0); - throttleTriggerMode.Name = "throttleTriggerMode"; - throttleTriggerMode.Size = new System.Drawing.Size(121, 29); - throttleTriggerMode.TabIndex = 45; - throttleTriggerMode.Text = "Throttle Trigger Mode"; - throttleTriggerMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // throttleResistanceSmoothNumericUpDown - // - throttleResistanceSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleResistanceSmoothNumericUpDown.AutoSize = true; - throttleResistanceSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleResistanceSmoothNumericUpDown.Location = new System.Drawing.Point(549, 706); - throttleResistanceSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - throttleResistanceSmoothNumericUpDown.Name = "throttleResistanceSmoothNumericUpDown"; - throttleResistanceSmoothNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleResistanceSmoothNumericUpDown.TabIndex = 42; - toolTip.SetToolTip(throttleResistanceSmoothNumericUpDown, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); - throttleResistanceSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - throttleResistanceSmoothNumericUpDown.ValueChanged += throttleResistanceSmoothNumericUpDown_ValueChanged; - // - // throttleMaxResistanceNumericUpDown - // - throttleMaxResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMaxResistanceNumericUpDown.AutoSize = true; - throttleMaxResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMaxResistanceNumericUpDown.Location = new System.Drawing.Point(549, 655); - throttleMaxResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); - throttleMaxResistanceNumericUpDown.Name = "throttleMaxResistanceNumericUpDown"; - throttleMaxResistanceNumericUpDown.Size = new System.Drawing.Size(29, 23); - throttleMaxResistanceNumericUpDown.TabIndex = 41; - toolTip.SetToolTip(throttleMaxResistanceNumericUpDown, "The Maximum resistance on the throttle (0-7)"); - throttleMaxResistanceNumericUpDown.ValueChanged += throttleMaxResistanceNumericUpDown_ValueChanged; - // - // throttleMinResistanceNumericUpDown - // - throttleMinResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMinResistanceNumericUpDown.AutoSize = true; - throttleMinResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMinResistanceNumericUpDown.Location = new System.Drawing.Point(549, 604); - throttleMinResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); - throttleMinResistanceNumericUpDown.Name = "throttleMinResistanceNumericUpDown"; - throttleMinResistanceNumericUpDown.Size = new System.Drawing.Size(29, 23); - throttleMinResistanceNumericUpDown.TabIndex = 40; - toolTip.SetToolTip(throttleMinResistanceNumericUpDown, "The Minimum resistance on the throttle (0-7)"); - throttleMinResistanceNumericUpDown.ValueChanged += throttleMinResistanceNumericUpDown_ValueChanged; - // - // throttleMaxStiffnessNumericUpDown - // - throttleMaxStiffnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMaxStiffnessNumericUpDown.AutoSize = true; - throttleMaxStiffnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMaxStiffnessNumericUpDown.Location = new System.Drawing.Point(549, 553); - throttleMaxStiffnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - throttleMaxStiffnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - throttleMaxStiffnessNumericUpDown.Name = "throttleMaxStiffnessNumericUpDown"; - throttleMaxStiffnessNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleMaxStiffnessNumericUpDown.TabIndex = 39; - toolTip.SetToolTip(throttleMaxStiffnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); - throttleMaxStiffnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - throttleMaxStiffnessNumericUpDown.ValueChanged += throttleMaxStiffnessNumericUpDown_ValueChanged; - // - // throttleMinStiffnessNumericUpDown - // - throttleMinStiffnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMinStiffnessNumericUpDown.AutoSize = true; - throttleMinStiffnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMinStiffnessNumericUpDown.Location = new System.Drawing.Point(549, 502); - throttleMinStiffnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - throttleMinStiffnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - throttleMinStiffnessNumericUpDown.Name = "throttleMinStiffnessNumericUpDown"; - throttleMinStiffnessNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleMinStiffnessNumericUpDown.TabIndex = 38; - toolTip.SetToolTip(throttleMinStiffnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); - throttleMinStiffnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - throttleMinStiffnessNumericUpDown.ValueChanged += throttleMinStiffnessNumericUpDown_ValueChanged; - // - // throttleVibrationSmoothNumericUpDown - // - throttleVibrationSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleVibrationSmoothNumericUpDown.AutoSize = true; - throttleVibrationSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleVibrationSmoothNumericUpDown.Location = new System.Drawing.Point(549, 451); - throttleVibrationSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); - throttleVibrationSmoothNumericUpDown.Name = "throttleVibrationSmoothNumericUpDown"; - throttleVibrationSmoothNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleVibrationSmoothNumericUpDown.TabIndex = 37; - toolTip.SetToolTip(throttleVibrationSmoothNumericUpDown, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); - throttleVibrationSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); - throttleVibrationSmoothNumericUpDown.ValueChanged += throttleVibrationSmoothNumericUpDown_ValueChanged; - // - // throttleMaxVibrationNumericUpDown - // - throttleMaxVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMaxVibrationNumericUpDown.AutoSize = true; - throttleMaxVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMaxVibrationNumericUpDown.Location = new System.Drawing.Point(549, 400); - throttleMaxVibrationNumericUpDown.Name = "throttleMaxVibrationNumericUpDown"; - throttleMaxVibrationNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleMaxVibrationNumericUpDown.TabIndex = 36; - toolTip.SetToolTip(throttleMaxVibrationNumericUpDown, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); - throttleMaxVibrationNumericUpDown.ValueChanged += throttleMaxVibrationNumericUpDown_ValueChanged; - // - // throttleMinVibrationNumericUpDown - // - throttleMinVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleMinVibrationNumericUpDown.AutoSize = true; - throttleMinVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleMinVibrationNumericUpDown.Location = new System.Drawing.Point(549, 349); - throttleMinVibrationNumericUpDown.Name = "throttleMinVibrationNumericUpDown"; - throttleMinVibrationNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleMinVibrationNumericUpDown.TabIndex = 35; - toolTip.SetToolTip(throttleMinVibrationNumericUpDown, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - throttleMinVibrationNumericUpDown.ValueChanged += throttleMinVibrationNumericUpDown_ValueChanged; - // - // throttleVibrationStartNumericUpDown - // - throttleVibrationStartNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleVibrationStartNumericUpDown.AutoSize = true; - throttleVibrationStartNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleVibrationStartNumericUpDown.Location = new System.Drawing.Point(549, 298); - throttleVibrationStartNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - throttleVibrationStartNumericUpDown.Name = "throttleVibrationStartNumericUpDown"; - throttleVibrationStartNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleVibrationStartNumericUpDown.TabIndex = 34; - toolTip.SetToolTip(throttleVibrationStartNumericUpDown, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); - throttleVibrationStartNumericUpDown.ValueChanged += throttleVibrationStartNumericUpDown_ValueChanged; - // - // throttleAccelLimitNumericUpDown - // - throttleAccelLimitNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleAccelLimitNumericUpDown.AutoSize = true; - throttleAccelLimitNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleAccelLimitNumericUpDown.Location = new System.Drawing.Point(549, 247); - throttleAccelLimitNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); - throttleAccelLimitNumericUpDown.Name = "throttleAccelLimitNumericUpDown"; - throttleAccelLimitNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleAccelLimitNumericUpDown.TabIndex = 33; - toolTip.SetToolTip(throttleAccelLimitNumericUpDown, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); - throttleAccelLimitNumericUpDown.ValueChanged += throttleAccelLimitNumericUpDown_ValueChanged; - // - // throttleForwardAccelScaleNumericUpDown - // - throttleForwardAccelScaleNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleForwardAccelScaleNumericUpDown.AutoSize = true; - throttleForwardAccelScaleNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleForwardAccelScaleNumericUpDown.Location = new System.Drawing.Point(549, 196); - throttleForwardAccelScaleNumericUpDown.Name = "throttleForwardAccelScaleNumericUpDown"; - throttleForwardAccelScaleNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleForwardAccelScaleNumericUpDown.TabIndex = 32; - toolTip.SetToolTip(throttleForwardAccelScaleNumericUpDown, "How to scale Forward acceleration in determining throttle stiffness."); - throttleForwardAccelScaleNumericUpDown.ValueChanged += throttleForwardAccelScaleNumericUpDown_ValueChanged; - // - // throttleTurnAccelScaleNumericUpDown - // - throttleTurnAccelScaleNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleTurnAccelScaleNumericUpDown.AutoSize = true; - throttleTurnAccelScaleNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleTurnAccelScaleNumericUpDown.Location = new System.Drawing.Point(549, 145); - throttleTurnAccelScaleNumericUpDown.Name = "throttleTurnAccelScaleNumericUpDown"; - throttleTurnAccelScaleNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleTurnAccelScaleNumericUpDown.TabIndex = 31; - toolTip.SetToolTip(throttleTurnAccelScaleNumericUpDown, "How to scale turning acceleration in determining throttle stiffness."); - throttleTurnAccelScaleNumericUpDown.ValueChanged += throttleTurnAccelScaleNumericUpDown_ValueChanged; - // - // throttleGripLossNumericUpDown - // - throttleGripLossNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleGripLossNumericUpDown.AutoSize = true; - throttleGripLossNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleGripLossNumericUpDown.Location = new System.Drawing.Point(549, 94); - throttleGripLossNumericUpDown.Name = "throttleGripLossNumericUpDown"; - throttleGripLossNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleGripLossNumericUpDown.TabIndex = 30; - toolTip.SetToolTip(throttleGripLossNumericUpDown, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); - throttleGripLossNumericUpDown.ValueChanged += throttleGripLossNumericUpDown_ValueChanged; - // - // throttleIntensityNumericUpDown - // - throttleIntensityNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; - throttleIntensityNumericUpDown.AutoSize = true; - throttleIntensityNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - throttleIntensityNumericUpDown.Location = new System.Drawing.Point(549, 43); - throttleIntensityNumericUpDown.Name = "throttleIntensityNumericUpDown"; - throttleIntensityNumericUpDown.Size = new System.Drawing.Size(41, 23); - throttleIntensityNumericUpDown.TabIndex = 29; - toolTip.SetToolTip(throttleIntensityNumericUpDown, "The percentage of the trigger effects"); - throttleIntensityNumericUpDown.ValueChanged += throttleIntensityNumericUpDown_ValueChanged; - // - // throttleResistanceSmoothTrackBar - // - throttleResistanceSmoothTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleResistanceSmoothTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleResistanceSmoothTrackBar.LargeChange = 50; - throttleResistanceSmoothTrackBar.Location = new System.Drawing.Point(141, 695); - throttleResistanceSmoothTrackBar.Maximum = 100; - throttleResistanceSmoothTrackBar.Minimum = 1; - throttleResistanceSmoothTrackBar.Name = "throttleResistanceSmoothTrackBar"; - throttleResistanceSmoothTrackBar.Size = new System.Drawing.Size(402, 45); - throttleResistanceSmoothTrackBar.TabIndex = 28; - throttleResistanceSmoothTrackBar.TickFrequency = 10; - throttleResistanceSmoothTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleResistanceSmoothTrackBar, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); - throttleResistanceSmoothTrackBar.Value = 1; - throttleResistanceSmoothTrackBar.Scroll += throttleResistanceSmoothTrackBar_Scroll; - // - // throttleMaxResistanceTrackBar - // - throttleMaxResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMaxResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMaxResistanceTrackBar.LargeChange = 50; - throttleMaxResistanceTrackBar.Location = new System.Drawing.Point(141, 644); - throttleMaxResistanceTrackBar.Maximum = 7; - throttleMaxResistanceTrackBar.Name = "throttleMaxResistanceTrackBar"; - throttleMaxResistanceTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMaxResistanceTrackBar.TabIndex = 27; - throttleMaxResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMaxResistanceTrackBar, "The Maximum resistance on the throttle (0-7)"); - throttleMaxResistanceTrackBar.Scroll += throttleMaxResistanceTrackBar_Scroll; - // - // throttleMinResistanceTrackBar - // - throttleMinResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMinResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMinResistanceTrackBar.LargeChange = 50; - throttleMinResistanceTrackBar.Location = new System.Drawing.Point(141, 593); - throttleMinResistanceTrackBar.Maximum = 7; - throttleMinResistanceTrackBar.Name = "throttleMinResistanceTrackBar"; - throttleMinResistanceTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMinResistanceTrackBar.TabIndex = 26; - throttleMinResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMinResistanceTrackBar, "The Minimum resistance on the throttle (0-7)"); - throttleMinResistanceTrackBar.Scroll += throttleMinResistanceTrackBar_Scroll; - // - // throttleMaxStiffnessTrackBar - // - throttleMaxStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMaxStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMaxStiffnessTrackBar.LargeChange = 50; - throttleMaxStiffnessTrackBar.Location = new System.Drawing.Point(141, 542); - throttleMaxStiffnessTrackBar.Maximum = 255; - throttleMaxStiffnessTrackBar.Minimum = 1; - throttleMaxStiffnessTrackBar.Name = "throttleMaxStiffnessTrackBar"; - throttleMaxStiffnessTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMaxStiffnessTrackBar.TabIndex = 25; - throttleMaxStiffnessTrackBar.TickFrequency = 5; - throttleMaxStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMaxStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); - throttleMaxStiffnessTrackBar.Value = 1; - throttleMaxStiffnessTrackBar.Scroll += throttleMaxStiffnessTrackBar_Scroll; - // - // throttleMinStiffnessTrackBar - // - throttleMinStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMinStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMinStiffnessTrackBar.LargeChange = 50; - throttleMinStiffnessTrackBar.Location = new System.Drawing.Point(141, 491); - throttleMinStiffnessTrackBar.Maximum = 255; - throttleMinStiffnessTrackBar.Minimum = 1; - throttleMinStiffnessTrackBar.Name = "throttleMinStiffnessTrackBar"; - throttleMinStiffnessTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMinStiffnessTrackBar.TabIndex = 24; - throttleMinStiffnessTrackBar.TickFrequency = 5; - throttleMinStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMinStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); - throttleMinStiffnessTrackBar.Value = 1; - throttleMinStiffnessTrackBar.Scroll += throttleMinStiffnessTrackBar_Scroll; - // - // throttleVibrationSmoothTrackBar - // - throttleVibrationSmoothTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleVibrationSmoothTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleVibrationSmoothTrackBar.LargeChange = 50; - throttleVibrationSmoothTrackBar.Location = new System.Drawing.Point(141, 440); - throttleVibrationSmoothTrackBar.Maximum = 100; - throttleVibrationSmoothTrackBar.Minimum = 1; - throttleVibrationSmoothTrackBar.Name = "throttleVibrationSmoothTrackBar"; - throttleVibrationSmoothTrackBar.Size = new System.Drawing.Size(402, 45); - throttleVibrationSmoothTrackBar.TabIndex = 23; - throttleVibrationSmoothTrackBar.TickFrequency = 10; - throttleVibrationSmoothTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleVibrationSmoothTrackBar, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); - throttleVibrationSmoothTrackBar.Value = 1; - throttleVibrationSmoothTrackBar.Scroll += throttleVibrationSmoothTrackBar_Scroll; - // - // throttleMaxVibrationTrackBar - // - throttleMaxVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMaxVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMaxVibrationTrackBar.LargeChange = 50; - throttleMaxVibrationTrackBar.Location = new System.Drawing.Point(141, 389); - throttleMaxVibrationTrackBar.Maximum = 100; - throttleMaxVibrationTrackBar.Name = "throttleMaxVibrationTrackBar"; - throttleMaxVibrationTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMaxVibrationTrackBar.TabIndex = 22; - throttleMaxVibrationTrackBar.TickFrequency = 5; - throttleMaxVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMaxVibrationTrackBar, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); - throttleMaxVibrationTrackBar.Scroll += throttleMaxVibrationTrackBar_Scroll; - // - // throttleMinVibrationTrackBar - // - throttleMinVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleMinVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleMinVibrationTrackBar.LargeChange = 50; - throttleMinVibrationTrackBar.Location = new System.Drawing.Point(141, 338); - throttleMinVibrationTrackBar.Maximum = 100; - throttleMinVibrationTrackBar.Name = "throttleMinVibrationTrackBar"; - throttleMinVibrationTrackBar.Size = new System.Drawing.Size(402, 45); - throttleMinVibrationTrackBar.TabIndex = 21; - throttleMinVibrationTrackBar.TickFrequency = 5; - throttleMinVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleMinVibrationTrackBar, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - throttleMinVibrationTrackBar.Scroll += throttleMinVibrationTrackBar_Scroll; - // - // throttleVibrationModeStartTrackBar - // - throttleVibrationModeStartTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleVibrationModeStartTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleVibrationModeStartTrackBar.LargeChange = 50; - throttleVibrationModeStartTrackBar.Location = new System.Drawing.Point(141, 287); - throttleVibrationModeStartTrackBar.Maximum = 255; - throttleVibrationModeStartTrackBar.Name = "throttleVibrationModeStartTrackBar"; - throttleVibrationModeStartTrackBar.Size = new System.Drawing.Size(402, 45); - throttleVibrationModeStartTrackBar.TabIndex = 20; - throttleVibrationModeStartTrackBar.TickFrequency = 5; - throttleVibrationModeStartTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleVibrationModeStartTrackBar, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); - throttleVibrationModeStartTrackBar.Scroll += throttleVibrationModeStartTrackBar_Scroll; - // - // throttleAccelLimitTrackBar - // - throttleAccelLimitTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleAccelLimitTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleAccelLimitTrackBar.LargeChange = 50; - throttleAccelLimitTrackBar.Location = new System.Drawing.Point(141, 236); - throttleAccelLimitTrackBar.Maximum = 255; - throttleAccelLimitTrackBar.Name = "throttleAccelLimitTrackBar"; - throttleAccelLimitTrackBar.Size = new System.Drawing.Size(402, 45); - throttleAccelLimitTrackBar.TabIndex = 19; - throttleAccelLimitTrackBar.TickFrequency = 5; - throttleAccelLimitTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleAccelLimitTrackBar, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); - throttleAccelLimitTrackBar.Scroll += throttleAccelLimitTrackBar_Scroll; - // - // throttleForwardAccelScaleTrackBar - // - throttleForwardAccelScaleTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleForwardAccelScaleTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleForwardAccelScaleTrackBar.Location = new System.Drawing.Point(141, 185); - throttleForwardAccelScaleTrackBar.Maximum = 100; - throttleForwardAccelScaleTrackBar.Name = "throttleForwardAccelScaleTrackBar"; - throttleForwardAccelScaleTrackBar.Size = new System.Drawing.Size(402, 45); - throttleForwardAccelScaleTrackBar.TabIndex = 18; - throttleForwardAccelScaleTrackBar.TickFrequency = 5; - throttleForwardAccelScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleForwardAccelScaleTrackBar, "How to scale Forward acceleration in determining throttle stiffness."); - throttleForwardAccelScaleTrackBar.Value = 50; - throttleForwardAccelScaleTrackBar.Scroll += throttleForwardAccelScaleTrackBar_Scroll; - // - // throttleTurnAccelScaleTrackBar - // - throttleTurnAccelScaleTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleTurnAccelScaleTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleTurnAccelScaleTrackBar.Location = new System.Drawing.Point(141, 134); - throttleTurnAccelScaleTrackBar.Maximum = 100; - throttleTurnAccelScaleTrackBar.Name = "throttleTurnAccelScaleTrackBar"; - throttleTurnAccelScaleTrackBar.Size = new System.Drawing.Size(402, 45); - throttleTurnAccelScaleTrackBar.TabIndex = 17; - throttleTurnAccelScaleTrackBar.TickFrequency = 5; - throttleTurnAccelScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleTurnAccelScaleTrackBar, "How to scale turning acceleration in determining throttle stiffness."); - throttleTurnAccelScaleTrackBar.Value = 50; - throttleTurnAccelScaleTrackBar.Scroll += throttleTurnAccelScaleTrackBar_Scroll; - // - // throttleGripLossTrackBar - // - throttleGripLossTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleGripLossTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleGripLossTrackBar.LargeChange = 50; - throttleGripLossTrackBar.Location = new System.Drawing.Point(141, 83); - throttleGripLossTrackBar.Maximum = 100; - throttleGripLossTrackBar.Name = "throttleGripLossTrackBar"; - throttleGripLossTrackBar.Size = new System.Drawing.Size(402, 45); - throttleGripLossTrackBar.TabIndex = 16; - throttleGripLossTrackBar.TickFrequency = 5; - throttleGripLossTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleGripLossTrackBar, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); - throttleGripLossTrackBar.Scroll += throttleGripLossTrackBar_Scroll; - // - // throttleIntensityTrackBar - // - throttleIntensityTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; - throttleIntensityTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; - throttleIntensityTrackBar.LargeChange = 10; - throttleIntensityTrackBar.Location = new System.Drawing.Point(141, 32); - throttleIntensityTrackBar.Maximum = 100; - throttleIntensityTrackBar.Name = "throttleIntensityTrackBar"; - throttleIntensityTrackBar.Size = new System.Drawing.Size(402, 45); - throttleIntensityTrackBar.TabIndex = 2; - throttleIntensityTrackBar.TickFrequency = 5; - throttleIntensityTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; - toolTip.SetToolTip(throttleIntensityTrackBar, "The percentage of the trigger effects"); - throttleIntensityTrackBar.Value = 100; - throttleIntensityTrackBar.Scroll += throttleIntensityTrackBar_Scroll; - // - // throttleResistanceSmoothingLabel - // - throttleResistanceSmoothingLabel.AutoSize = true; - throttleResistanceSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleResistanceSmoothingLabel.Location = new System.Drawing.Point(3, 692); - throttleResistanceSmoothingLabel.Name = "throttleResistanceSmoothingLabel"; - throttleResistanceSmoothingLabel.Size = new System.Drawing.Size(132, 51); - throttleResistanceSmoothingLabel.TabIndex = 15; - throttleResistanceSmoothingLabel.Text = "Resistance Smoothing"; - throttleResistanceSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(throttleResistanceSmoothingLabel, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); - // - // maxThrottleResistanceLabel - // - maxThrottleResistanceLabel.AutoSize = true; - maxThrottleResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxThrottleResistanceLabel.Location = new System.Drawing.Point(3, 641); - maxThrottleResistanceLabel.Name = "maxThrottleResistanceLabel"; - maxThrottleResistanceLabel.Size = new System.Drawing.Size(132, 51); - maxThrottleResistanceLabel.TabIndex = 14; - maxThrottleResistanceLabel.Text = "Max Throttle Resistance"; - maxThrottleResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxThrottleResistanceLabel, "The Maximum resistance on the throttle (0-7)"); - // - // minThrottleResistanceLabel - // - minThrottleResistanceLabel.AutoSize = true; - minThrottleResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minThrottleResistanceLabel.Location = new System.Drawing.Point(3, 590); - minThrottleResistanceLabel.Name = "minThrottleResistanceLabel"; - minThrottleResistanceLabel.Size = new System.Drawing.Size(132, 51); - minThrottleResistanceLabel.TabIndex = 13; - minThrottleResistanceLabel.Text = "Min Throttle Resistance"; - minThrottleResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minThrottleResistanceLabel, "The Minimum resistance on the throttle (0-7)"); - // - // maxThrottleStiffnessLabel - // - maxThrottleStiffnessLabel.AutoSize = true; - maxThrottleStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxThrottleStiffnessLabel.Location = new System.Drawing.Point(3, 539); - maxThrottleStiffnessLabel.Name = "maxThrottleStiffnessLabel"; - maxThrottleStiffnessLabel.Size = new System.Drawing.Size(132, 51); - maxThrottleStiffnessLabel.TabIndex = 12; - maxThrottleStiffnessLabel.Text = "Max Throttle Stiffness"; - maxThrottleStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxThrottleStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); - // - // minThrottleStiffnessLabel - // - minThrottleStiffnessLabel.AutoSize = true; - minThrottleStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minThrottleStiffnessLabel.Location = new System.Drawing.Point(3, 488); - minThrottleStiffnessLabel.Name = "minThrottleStiffnessLabel"; - minThrottleStiffnessLabel.Size = new System.Drawing.Size(132, 51); - minThrottleStiffnessLabel.TabIndex = 11; - minThrottleStiffnessLabel.Text = "Min Throttle Stiffness"; - minThrottleStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minThrottleStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); - // - // throttleVibrationSmoothingLabel - // - throttleVibrationSmoothingLabel.AutoSize = true; - throttleVibrationSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleVibrationSmoothingLabel.Location = new System.Drawing.Point(3, 437); - throttleVibrationSmoothingLabel.Name = "throttleVibrationSmoothingLabel"; - throttleVibrationSmoothingLabel.Size = new System.Drawing.Size(132, 51); - throttleVibrationSmoothingLabel.TabIndex = 10; - throttleVibrationSmoothingLabel.Text = "Vibration Smoothing"; - throttleVibrationSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(throttleVibrationSmoothingLabel, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); - // - // maxThrottleVibrationLabel - // - maxThrottleVibrationLabel.AutoSize = true; - maxThrottleVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; - maxThrottleVibrationLabel.Location = new System.Drawing.Point(3, 386); - maxThrottleVibrationLabel.Name = "maxThrottleVibrationLabel"; - maxThrottleVibrationLabel.Size = new System.Drawing.Size(132, 51); - maxThrottleVibrationLabel.TabIndex = 9; - maxThrottleVibrationLabel.Text = "Max Throttle Vibration"; - maxThrottleVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(maxThrottleVibrationLabel, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); - // - // minThrottleVibrationLabel - // - minThrottleVibrationLabel.AutoSize = true; - minThrottleVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; - minThrottleVibrationLabel.Location = new System.Drawing.Point(3, 335); - minThrottleVibrationLabel.Name = "minThrottleVibrationLabel"; - minThrottleVibrationLabel.Size = new System.Drawing.Size(132, 51); - minThrottleVibrationLabel.TabIndex = 8; - minThrottleVibrationLabel.Text = "Min Throttle Vibration"; - minThrottleVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(minThrottleVibrationLabel, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); - // - // throttleVibrationStartLabel - // - throttleVibrationStartLabel.AutoSize = true; - throttleVibrationStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleVibrationStartLabel.Location = new System.Drawing.Point(3, 284); - throttleVibrationStartLabel.Name = "throttleVibrationStartLabel"; - throttleVibrationStartLabel.Size = new System.Drawing.Size(132, 51); - throttleVibrationStartLabel.TabIndex = 7; - throttleVibrationStartLabel.Text = "Vibration Mode Start"; - throttleVibrationStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(throttleVibrationStartLabel, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); - // - // accelerationLimitLabel - // - accelerationLimitLabel.AutoSize = true; - accelerationLimitLabel.Dock = System.Windows.Forms.DockStyle.Fill; - accelerationLimitLabel.Location = new System.Drawing.Point(3, 233); - accelerationLimitLabel.Name = "accelerationLimitLabel"; - accelerationLimitLabel.Size = new System.Drawing.Size(132, 51); - accelerationLimitLabel.TabIndex = 5; - accelerationLimitLabel.Text = "Accel Limit"; - accelerationLimitLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(accelerationLimitLabel, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); - // - // forwardAccelLabel - // - forwardAccelLabel.AutoSize = true; - forwardAccelLabel.Dock = System.Windows.Forms.DockStyle.Fill; - forwardAccelLabel.Location = new System.Drawing.Point(3, 182); - forwardAccelLabel.Name = "forwardAccelLabel"; - forwardAccelLabel.Size = new System.Drawing.Size(132, 51); - forwardAccelLabel.TabIndex = 6; - forwardAccelLabel.Text = "Forward Accel Scale"; - forwardAccelLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(forwardAccelLabel, "How to scale Forward acceleration in determining throttle stiffness."); - // - // turnAccelLabel - // - turnAccelLabel.AutoSize = true; - turnAccelLabel.Dock = System.Windows.Forms.DockStyle.Fill; - turnAccelLabel.Location = new System.Drawing.Point(3, 131); - turnAccelLabel.Name = "turnAccelLabel"; - turnAccelLabel.Size = new System.Drawing.Size(132, 51); - turnAccelLabel.TabIndex = 4; - turnAccelLabel.Text = "Turn Accel Scale"; - turnAccelLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(turnAccelLabel, "How to scale turning acceleration in determining throttle stiffness."); - // - // throttleGripLossLabel - // - throttleGripLossLabel.AutoSize = true; - throttleGripLossLabel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleGripLossLabel.Location = new System.Drawing.Point(3, 80); - throttleGripLossLabel.Name = "throttleGripLossLabel"; - throttleGripLossLabel.Size = new System.Drawing.Size(132, 51); - throttleGripLossLabel.TabIndex = 3; - throttleGripLossLabel.Text = "Grip Loss Value"; - throttleGripLossLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(throttleGripLossLabel, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); - // - // throttleIntensityLabel - // - throttleIntensityLabel.AutoSize = true; - throttleIntensityLabel.Dock = System.Windows.Forms.DockStyle.Fill; - throttleIntensityLabel.Location = new System.Drawing.Point(3, 29); - throttleIntensityLabel.Name = "throttleIntensityLabel"; - throttleIntensityLabel.Size = new System.Drawing.Size(132, 51); - throttleIntensityLabel.TabIndex = 1; - throttleIntensityLabel.Text = "Effect Intensity"; - throttleIntensityLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(throttleIntensityLabel, "The percentage of the trigger effects"); - // - // buttonApply_Throttle - // - buttonApply_Throttle.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - buttonApply_Throttle.Location = new System.Drawing.Point(141, 746); - buttonApply_Throttle.Name = "buttonApply_Throttle"; - buttonApply_Throttle.Size = new System.Drawing.Size(402, 23); - buttonApply_Throttle.TabIndex = 43; - buttonApply_Throttle.Text = "Apply"; - buttonApply_Throttle.UseVisualStyleBackColor = true; - buttonApply_Throttle.Click += buttonApply_Throttle_Click; - // - // throttleDefaultsButton - // - throttleDefaultsButton.Location = new System.Drawing.Point(549, 746); - throttleDefaultsButton.Name = "throttleDefaultsButton"; - throttleDefaultsButton.Size = new System.Drawing.Size(75, 23); - throttleDefaultsButton.TabIndex = 44; - throttleDefaultsButton.Text = "Defaults"; - throttleDefaultsButton.UseVisualStyleBackColor = true; - throttleDefaultsButton.Click += throttleDefaultsButton_Click; - // - // outputTabPage - // - outputTabPage.Controls.Add(raceGroupBox); - outputTabPage.Controls.Add(noRaceGroupBox); - outputTabPage.Controls.Add(outputListBox); - outputTabPage.Location = new System.Drawing.Point(4, 24); - outputTabPage.Name = "outputTabPage"; - outputTabPage.Padding = new System.Windows.Forms.Padding(3); - outputTabPage.Size = new System.Drawing.Size(713, 733); - outputTabPage.TabIndex = 1; - outputTabPage.Text = "Output"; - outputTabPage.UseVisualStyleBackColor = true; - // - // raceGroupBox - // - raceGroupBox.Controls.Add(tableLayoutPanel1); - raceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; - raceGroupBox.Location = new System.Drawing.Point(3, 530); - raceGroupBox.Name = "raceGroupBox"; - raceGroupBox.Size = new System.Drawing.Size(707, 100); - raceGroupBox.TabIndex = 3; - raceGroupBox.TabStop = false; - raceGroupBox.Text = "Racing"; - // - // tableLayoutPanel1 - // - tableLayoutPanel1.ColumnCount = 1; - tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - tableLayoutPanel1.Controls.Add(brakeMsg, 0, 3); - tableLayoutPanel1.Controls.Add(brakeVibrationMsg, 0, 2); - tableLayoutPanel1.Controls.Add(throttleMsg, 0, 1); - tableLayoutPanel1.Controls.Add(throttleVibrationMsg, 0, 0); - tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - tableLayoutPanel1.Location = new System.Drawing.Point(3, 19); - tableLayoutPanel1.Name = "tableLayoutPanel1"; - tableLayoutPanel1.RowCount = 4; - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.Size = new System.Drawing.Size(701, 78); - tableLayoutPanel1.TabIndex = 0; - // - // brakeMsg - // - brakeMsg.AutoSize = true; - brakeMsg.Location = new System.Drawing.Point(3, 45); - brakeMsg.Name = "brakeMsg"; - brakeMsg.Size = new System.Drawing.Size(38, 15); - brakeMsg.TabIndex = 3; - brakeMsg.Text = "label1"; - // - // brakeVibrationMsg - // - brakeVibrationMsg.AutoSize = true; - brakeVibrationMsg.Location = new System.Drawing.Point(3, 30); - brakeVibrationMsg.Name = "brakeVibrationMsg"; - brakeVibrationMsg.Size = new System.Drawing.Size(38, 15); - brakeVibrationMsg.TabIndex = 2; - brakeVibrationMsg.Text = "label1"; - // - // throttleMsg - // - throttleMsg.AutoSize = true; - throttleMsg.Location = new System.Drawing.Point(3, 15); - throttleMsg.Name = "throttleMsg"; - throttleMsg.Size = new System.Drawing.Size(38, 15); - throttleMsg.TabIndex = 1; - throttleMsg.Text = "label1"; - // - // throttleVibrationMsg - // - throttleVibrationMsg.AutoSize = true; - throttleVibrationMsg.Location = new System.Drawing.Point(3, 0); - throttleVibrationMsg.Name = "throttleVibrationMsg"; - throttleVibrationMsg.Size = new System.Drawing.Size(38, 15); - throttleVibrationMsg.TabIndex = 0; - throttleVibrationMsg.Text = "label1"; - // - // noRaceGroupBox - // - noRaceGroupBox.Controls.Add(noRaceText); - noRaceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; - noRaceGroupBox.Location = new System.Drawing.Point(3, 630); - noRaceGroupBox.Name = "noRaceGroupBox"; - noRaceGroupBox.Size = new System.Drawing.Size(707, 100); - noRaceGroupBox.TabIndex = 2; - noRaceGroupBox.TabStop = false; - noRaceGroupBox.Text = "Menus"; - // - // noRaceText - // - noRaceText.AutoSize = true; - noRaceText.Dock = System.Windows.Forms.DockStyle.Fill; - noRaceText.Location = new System.Drawing.Point(3, 19); - noRaceText.Name = "noRaceText"; - noRaceText.Size = new System.Drawing.Size(38, 15); - noRaceText.TabIndex = 1; - noRaceText.Text = "label1"; - // - // outputListBox - // - outputListBox.Dock = System.Windows.Forms.DockStyle.Top; - outputListBox.FormattingEnabled = true; - outputListBox.ItemHeight = 15; - outputListBox.Location = new System.Drawing.Point(3, 3); - outputListBox.Name = "outputListBox"; - outputListBox.Size = new System.Drawing.Size(707, 634); - outputListBox.TabIndex = 0; - // - // toolStripStatusDSX - // - toolStripStatusDSX.Image = Properties.Resources.redBtn; - toolStripStatusDSX.Name = "toolStripStatusDSX"; - toolStripStatusDSX.Size = new System.Drawing.Size(112, 17); - toolStripStatusDSX.Text = "DSX Connection:"; - toolStripStatusDSX.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; - // - // toolStripStatusForza - // - toolStripStatusForza.Image = Properties.Resources.redBtn; - toolStripStatusForza.Name = "toolStripStatusForza"; - toolStripStatusForza.Size = new System.Drawing.Size(119, 17); - toolStripStatusForza.Text = "Forza Connection:"; - toolStripStatusForza.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; - // - // toolStripVerboseMode - // - toolStripVerboseMode.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - toolStripVerboseMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { verboseModeOffToolStripMenuItem, verboseModeLowToolStripMenuItem, verboseModeFullToolStripMenuItem }); - toolStripVerboseMode.ImageTransparentColor = System.Drawing.Color.Magenta; - toolStripVerboseMode.Name = "toolStripVerboseMode"; - toolStripVerboseMode.Size = new System.Drawing.Size(95, 20); - toolStripVerboseMode.Text = "Verbose Mode"; - // - // verboseModeOffToolStripMenuItem - // - verboseModeOffToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - verboseModeOffToolStripMenuItem.Name = "verboseModeOffToolStripMenuItem"; - verboseModeOffToolStripMenuItem.Size = new System.Drawing.Size(140, 22); - verboseModeOffToolStripMenuItem.Text = "Off"; - verboseModeOffToolStripMenuItem.Click += verboseModeOffToolStripMenuItem_Click; - // - // verboseModeLowToolStripMenuItem - // - verboseModeLowToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - verboseModeLowToolStripMenuItem.Name = "verboseModeLowToolStripMenuItem"; - verboseModeLowToolStripMenuItem.Size = new System.Drawing.Size(140, 22); - verboseModeLowToolStripMenuItem.Text = "Low Verbose"; - verboseModeLowToolStripMenuItem.Click += verboseModeLowToolStripMenuItem_Click; - // - // verboseModeFullToolStripMenuItem - // - verboseModeFullToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - verboseModeFullToolStripMenuItem.Name = "verboseModeFullToolStripMenuItem"; - verboseModeFullToolStripMenuItem.Size = new System.Drawing.Size(140, 22); - verboseModeFullToolStripMenuItem.Text = "Full Verbose"; - verboseModeFullToolStripMenuItem.Click += verboseModeFullToolStripMenuItem_Click; - // - // statusStrip1 - // - statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusDSX, toolStripStatusForza, toolStripVerboseMode }); - statusStrip1.Location = new System.Drawing.Point(0, 761); - statusStrip1.Name = "statusStrip1"; - statusStrip1.Size = new System.Drawing.Size(721, 22); - statusStrip1.TabIndex = 0; - statusStrip1.Text = "statusStrip1"; - // - // UI - // - AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(721, 783); - Controls.Add(mainPanel); - Controls.Add(statusStrip1); - DoubleBuffered = true; - MinimumSize = new System.Drawing.Size(350, 200); - Name = "UI"; - Text = "UI"; - Load += UI_Load; - mainPanel.ResumeLayout(false); - mainTabControl.ResumeLayout(false); - miscTabPage.ResumeLayout(false); - miscTabPage.PerformLayout(); - miscTableLayoutPanel.ResumeLayout(false); - miscTableLayoutPanel.PerformLayout(); - ((ISupportInitialize)forzaPortNumericUpDown).EndInit(); - ((ISupportInitialize)rpmTrackBar).EndInit(); - ((ISupportInitialize)dsxNumericUpDown).EndInit(); - ((ISupportInitialize)rpmValueNumericUpDown).EndInit(); - brakeConfigTabPage.ResumeLayout(false); - brakeConfigTabPage.PerformLayout(); - brakeTableLayoutPanel.ResumeLayout(false); - brakeTableLayoutPanel.PerformLayout(); - ((ISupportInitialize)brakeResistanceSmoothNumericUpDown).EndInit(); - ((ISupportInitialize)maxBrakeResistanceNumericUpDown).EndInit(); - ((ISupportInitialize)minBrakeResistanceNumericUpDown).EndInit(); - ((ISupportInitialize)maxBrakeStifnessNumericUpDown).EndInit(); - ((ISupportInitialize)minBrakeStifnessNumericUpDown).EndInit(); - ((ISupportInitialize)brakeVibrationSmoothNumericUpDown).EndInit(); - ((ISupportInitialize)maxBrakeVibrationNumericUpDown).EndInit(); - ((ISupportInitialize)minBrakeVibrationNumericUpDown).EndInit(); - ((ISupportInitialize)brakeVibrationModeNumericUpDown).EndInit(); - ((ISupportInitialize)brakeVibrationStartNumericUpDown).EndInit(); - ((ISupportInitialize)gripLossNumericUpDown).EndInit(); - ((ISupportInitialize)brakeEffectNumericUpDown).EndInit(); - ((ISupportInitialize)brakeResistanceSmoothingTrackBar).EndInit(); - ((ISupportInitialize)maxBrakeResistanceTrackBar).EndInit(); - ((ISupportInitialize)minBrakeResistanceTrackBar).EndInit(); - ((ISupportInitialize)maxBrakeStiffnessTrackBar).EndInit(); - ((ISupportInitialize)minBrakeStiffnessTrackBar).EndInit(); - ((ISupportInitialize)vibrationSmoothingTrackBar).EndInit(); - ((ISupportInitialize)maxBrakeVibrationTrackBar).EndInit(); - ((ISupportInitialize)minBrakeVibrationTrackBar).EndInit(); - ((ISupportInitialize)brakeVibrationModeTrackBar).EndInit(); - ((ISupportInitialize)brakeVibrationStartTrackBar).EndInit(); - ((ISupportInitialize)gripLossTrackBar).EndInit(); - ((ISupportInitialize)brakeEffectIntensityTrackBar).EndInit(); - throttleConfigTabPage.ResumeLayout(false); - throttleTableLayoutPanel.ResumeLayout(false); - throttleTableLayoutPanel.PerformLayout(); - ((ISupportInitialize)throttleResistanceSmoothNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMaxResistanceNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMinResistanceNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMaxStiffnessNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMinStiffnessNumericUpDown).EndInit(); - ((ISupportInitialize)throttleVibrationSmoothNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMaxVibrationNumericUpDown).EndInit(); - ((ISupportInitialize)throttleMinVibrationNumericUpDown).EndInit(); - ((ISupportInitialize)throttleVibrationStartNumericUpDown).EndInit(); - ((ISupportInitialize)throttleAccelLimitNumericUpDown).EndInit(); - ((ISupportInitialize)throttleForwardAccelScaleNumericUpDown).EndInit(); - ((ISupportInitialize)throttleTurnAccelScaleNumericUpDown).EndInit(); - ((ISupportInitialize)throttleGripLossNumericUpDown).EndInit(); - ((ISupportInitialize)throttleIntensityNumericUpDown).EndInit(); - ((ISupportInitialize)throttleResistanceSmoothTrackBar).EndInit(); - ((ISupportInitialize)throttleMaxResistanceTrackBar).EndInit(); - ((ISupportInitialize)throttleMinResistanceTrackBar).EndInit(); - ((ISupportInitialize)throttleMaxStiffnessTrackBar).EndInit(); - ((ISupportInitialize)throttleMinStiffnessTrackBar).EndInit(); - ((ISupportInitialize)throttleVibrationSmoothTrackBar).EndInit(); - ((ISupportInitialize)throttleMaxVibrationTrackBar).EndInit(); - ((ISupportInitialize)throttleMinVibrationTrackBar).EndInit(); - ((ISupportInitialize)throttleVibrationModeStartTrackBar).EndInit(); - ((ISupportInitialize)throttleAccelLimitTrackBar).EndInit(); - ((ISupportInitialize)throttleForwardAccelScaleTrackBar).EndInit(); - ((ISupportInitialize)throttleTurnAccelScaleTrackBar).EndInit(); - ((ISupportInitialize)throttleGripLossTrackBar).EndInit(); - ((ISupportInitialize)throttleIntensityTrackBar).EndInit(); - outputTabPage.ResumeLayout(false); - raceGroupBox.ResumeLayout(false); - tableLayoutPanel1.ResumeLayout(false); - tableLayoutPanel1.PerformLayout(); - noRaceGroupBox.ResumeLayout(false); - noRaceGroupBox.PerformLayout(); - statusStrip1.ResumeLayout(false); - statusStrip1.PerformLayout(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new Container(); + mainPanel = new System.Windows.Forms.Panel(); + mainTabControl = new System.Windows.Forms.TabControl(); + miscTabPage = new System.Windows.Forms.TabPage(); + miscTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + forzaPortNumericUpDown = new System.Windows.Forms.NumericUpDown(); + forzaPortLabel = new System.Windows.Forms.Label(); + dsxPortLabel = new System.Windows.Forms.Label(); + appCheckLabel = new System.Windows.Forms.Label(); + rpmLabel = new System.Windows.Forms.Label(); + rpmTrackBar = new System.Windows.Forms.TrackBar(); + appCheckBox = new System.Windows.Forms.CheckBox(); + dsxNumericUpDown = new System.Windows.Forms.NumericUpDown(); + rpmValueNumericUpDown = new System.Windows.Forms.NumericUpDown(); + buttonApplyMisc = new System.Windows.Forms.Button(); + miscDefaultsButton = new System.Windows.Forms.Button(); + brakeConfigTabPage = new System.Windows.Forms.TabPage(); + brakeTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + brakeResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); + maxBrakeResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); + minBrakeResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); + maxBrakeStifnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); + minBrakeStifnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); + brakeVibrationSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); + maxBrakeVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); + minBrakeVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); + brakeVibrationModeNumericUpDown = new System.Windows.Forms.NumericUpDown(); + brakeVibrationStartNumericUpDown = new System.Windows.Forms.NumericUpDown(); + gripLossNumericUpDown = new System.Windows.Forms.NumericUpDown(); + brakeEffectNumericUpDown = new System.Windows.Forms.NumericUpDown(); + brakeResistanceSmoothingTrackBar = new System.Windows.Forms.TrackBar(); + brakeResistanceSmoothingLabel = new System.Windows.Forms.Label(); + maxBrakeResistanceTrackBar = new System.Windows.Forms.TrackBar(); + maxBrakeResistanceLabel = new System.Windows.Forms.Label(); + minBrakeResistanceTrackBar = new System.Windows.Forms.TrackBar(); + minBrakeResistanceLabel = new System.Windows.Forms.Label(); + maxBrakeStiffnessTrackBar = new System.Windows.Forms.TrackBar(); + maxBrakeStiffnessLabel = new System.Windows.Forms.Label(); + minBrakeStiffnessTrackBar = new System.Windows.Forms.TrackBar(); + minBrakeStiffnessLabel = new System.Windows.Forms.Label(); + vibrationSmoothingTrackBar = new System.Windows.Forms.TrackBar(); + vibrationSmoothingLabel = new System.Windows.Forms.Label(); + maxBrakeVibrationTrackBar = new System.Windows.Forms.TrackBar(); + maxBrakeVibrationLabel = new System.Windows.Forms.Label(); + minBrakeVibrationTrackBar = new System.Windows.Forms.TrackBar(); + minBrakeVibrationLabel = new System.Windows.Forms.Label(); + brakeVibrationModeTrackBar = new System.Windows.Forms.TrackBar(); + brakeVibrationModeStartLabel = new System.Windows.Forms.Label(); + brakeVibrationStartTrackBar = new System.Windows.Forms.TrackBar(); + brakeVibrationStartLabel = new System.Windows.Forms.Label(); + gripLossTrackBar = new System.Windows.Forms.TrackBar(); + gripLossLabel = new System.Windows.Forms.Label(); + brakeEffectIntensityLabel = new System.Windows.Forms.Label(); + brakeEffectIntensityTrackBar = new System.Windows.Forms.TrackBar(); + buttonApply_Brake = new System.Windows.Forms.Button(); + brakeDefaultsButton = new System.Windows.Forms.Button(); + brakeTriggerMode = new System.Windows.Forms.Label(); + brakeTriggerModeComboBox = new System.Windows.Forms.ComboBox(); + throttleConfigTabPage = new System.Windows.Forms.TabPage(); + throttleTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + throttleTriggerModeComboBox = new System.Windows.Forms.ComboBox(); + throttleTriggerMode = new System.Windows.Forms.Label(); + throttleResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMaxResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMinResistanceNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMaxStiffnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMinStiffnessNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleVibrationSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMaxVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleMinVibrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleVibrationStartNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleAccelLimitNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleForwardAccelScaleNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleTurnAccelScaleNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleGripLossNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleIntensityNumericUpDown = new System.Windows.Forms.NumericUpDown(); + throttleResistanceSmoothTrackBar = new System.Windows.Forms.TrackBar(); + throttleMaxResistanceTrackBar = new System.Windows.Forms.TrackBar(); + throttleMinResistanceTrackBar = new System.Windows.Forms.TrackBar(); + throttleMaxStiffnessTrackBar = new System.Windows.Forms.TrackBar(); + throttleMinStiffnessTrackBar = new System.Windows.Forms.TrackBar(); + throttleVibrationSmoothTrackBar = new System.Windows.Forms.TrackBar(); + throttleMaxVibrationTrackBar = new System.Windows.Forms.TrackBar(); + throttleMinVibrationTrackBar = new System.Windows.Forms.TrackBar(); + throttleVibrationModeStartTrackBar = new System.Windows.Forms.TrackBar(); + throttleAccelLimitTrackBar = new System.Windows.Forms.TrackBar(); + throttleForwardAccelScaleTrackBar = new System.Windows.Forms.TrackBar(); + throttleTurnAccelScaleTrackBar = new System.Windows.Forms.TrackBar(); + throttleGripLossTrackBar = new System.Windows.Forms.TrackBar(); + throttleIntensityTrackBar = new System.Windows.Forms.TrackBar(); + throttleResistanceSmoothingLabel = new System.Windows.Forms.Label(); + maxThrottleResistanceLabel = new System.Windows.Forms.Label(); + minThrottleResistanceLabel = new System.Windows.Forms.Label(); + maxThrottleStiffnessLabel = new System.Windows.Forms.Label(); + minThrottleStiffnessLabel = new System.Windows.Forms.Label(); + throttleVibrationSmoothingLabel = new System.Windows.Forms.Label(); + maxThrottleVibrationLabel = new System.Windows.Forms.Label(); + minThrottleVibrationLabel = new System.Windows.Forms.Label(); + throttleVibrationStartLabel = new System.Windows.Forms.Label(); + accelerationLimitLabel = new System.Windows.Forms.Label(); + forwardAccelLabel = new System.Windows.Forms.Label(); + turnAccelLabel = new System.Windows.Forms.Label(); + throttleGripLossLabel = new System.Windows.Forms.Label(); + throttleIntensityLabel = new System.Windows.Forms.Label(); + buttonApply_Throttle = new System.Windows.Forms.Button(); + throttleDefaultsButton = new System.Windows.Forms.Button(); + outputTabPage = new System.Windows.Forms.TabPage(); + raceGroupBox = new System.Windows.Forms.GroupBox(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + brakeMsg = new System.Windows.Forms.Label(); + brakeVibrationMsg = new System.Windows.Forms.Label(); + throttleMsg = new System.Windows.Forms.Label(); + throttleVibrationMsg = new System.Windows.Forms.Label(); + noRaceGroupBox = new System.Windows.Forms.GroupBox(); + noRaceText = new System.Windows.Forms.Label(); + outputListBox = new System.Windows.Forms.ListBox(); + toolStripStatusDSX = new System.Windows.Forms.ToolStripStatusLabel(); + toolStripStatusForza = new System.Windows.Forms.ToolStripStatusLabel(); + toolStripVerboseMode = new System.Windows.Forms.ToolStripDropDownButton(); + verboseModeOffToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + verboseModeLowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + verboseModeFullToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + statusStrip1 = new System.Windows.Forms.StatusStrip(); + toolTip = new System.Windows.Forms.ToolTip(components); + mainPanel.SuspendLayout(); + mainTabControl.SuspendLayout(); + miscTabPage.SuspendLayout(); + miscTableLayoutPanel.SuspendLayout(); + ((ISupportInitialize)forzaPortNumericUpDown).BeginInit(); + ((ISupportInitialize)rpmTrackBar).BeginInit(); + ((ISupportInitialize)dsxNumericUpDown).BeginInit(); + ((ISupportInitialize)rpmValueNumericUpDown).BeginInit(); + brakeConfigTabPage.SuspendLayout(); + brakeTableLayoutPanel.SuspendLayout(); + ((ISupportInitialize)brakeResistanceSmoothNumericUpDown).BeginInit(); + ((ISupportInitialize)maxBrakeResistanceNumericUpDown).BeginInit(); + ((ISupportInitialize)minBrakeResistanceNumericUpDown).BeginInit(); + ((ISupportInitialize)maxBrakeStifnessNumericUpDown).BeginInit(); + ((ISupportInitialize)minBrakeStifnessNumericUpDown).BeginInit(); + ((ISupportInitialize)brakeVibrationSmoothNumericUpDown).BeginInit(); + ((ISupportInitialize)maxBrakeVibrationNumericUpDown).BeginInit(); + ((ISupportInitialize)minBrakeVibrationNumericUpDown).BeginInit(); + ((ISupportInitialize)brakeVibrationModeNumericUpDown).BeginInit(); + ((ISupportInitialize)brakeVibrationStartNumericUpDown).BeginInit(); + ((ISupportInitialize)gripLossNumericUpDown).BeginInit(); + ((ISupportInitialize)brakeEffectNumericUpDown).BeginInit(); + ((ISupportInitialize)brakeResistanceSmoothingTrackBar).BeginInit(); + ((ISupportInitialize)maxBrakeResistanceTrackBar).BeginInit(); + ((ISupportInitialize)minBrakeResistanceTrackBar).BeginInit(); + ((ISupportInitialize)maxBrakeStiffnessTrackBar).BeginInit(); + ((ISupportInitialize)minBrakeStiffnessTrackBar).BeginInit(); + ((ISupportInitialize)vibrationSmoothingTrackBar).BeginInit(); + ((ISupportInitialize)maxBrakeVibrationTrackBar).BeginInit(); + ((ISupportInitialize)minBrakeVibrationTrackBar).BeginInit(); + ((ISupportInitialize)brakeVibrationModeTrackBar).BeginInit(); + ((ISupportInitialize)brakeVibrationStartTrackBar).BeginInit(); + ((ISupportInitialize)gripLossTrackBar).BeginInit(); + ((ISupportInitialize)brakeEffectIntensityTrackBar).BeginInit(); + throttleConfigTabPage.SuspendLayout(); + throttleTableLayoutPanel.SuspendLayout(); + ((ISupportInitialize)throttleResistanceSmoothNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMaxResistanceNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMinResistanceNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMaxStiffnessNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMinStiffnessNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleVibrationSmoothNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMaxVibrationNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleMinVibrationNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleVibrationStartNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleAccelLimitNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleForwardAccelScaleNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleTurnAccelScaleNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleGripLossNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleIntensityNumericUpDown).BeginInit(); + ((ISupportInitialize)throttleResistanceSmoothTrackBar).BeginInit(); + ((ISupportInitialize)throttleMaxResistanceTrackBar).BeginInit(); + ((ISupportInitialize)throttleMinResistanceTrackBar).BeginInit(); + ((ISupportInitialize)throttleMaxStiffnessTrackBar).BeginInit(); + ((ISupportInitialize)throttleMinStiffnessTrackBar).BeginInit(); + ((ISupportInitialize)throttleVibrationSmoothTrackBar).BeginInit(); + ((ISupportInitialize)throttleMaxVibrationTrackBar).BeginInit(); + ((ISupportInitialize)throttleMinVibrationTrackBar).BeginInit(); + ((ISupportInitialize)throttleVibrationModeStartTrackBar).BeginInit(); + ((ISupportInitialize)throttleAccelLimitTrackBar).BeginInit(); + ((ISupportInitialize)throttleForwardAccelScaleTrackBar).BeginInit(); + ((ISupportInitialize)throttleTurnAccelScaleTrackBar).BeginInit(); + ((ISupportInitialize)throttleGripLossTrackBar).BeginInit(); + ((ISupportInitialize)throttleIntensityTrackBar).BeginInit(); + outputTabPage.SuspendLayout(); + raceGroupBox.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + noRaceGroupBox.SuspendLayout(); + statusStrip1.SuspendLayout(); + SuspendLayout(); + // + // mainPanel + // + mainPanel.Controls.Add(mainTabControl); + mainPanel.Dock = System.Windows.Forms.DockStyle.Fill; + mainPanel.Location = new System.Drawing.Point(0, 0); + mainPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + mainPanel.Name = "mainPanel"; + mainPanel.Size = new System.Drawing.Size(1030, 1273); + mainPanel.TabIndex = 0; + // + // mainTabControl + // + mainTabControl.Controls.Add(miscTabPage); + mainTabControl.Controls.Add(brakeConfigTabPage); + mainTabControl.Controls.Add(throttleConfigTabPage); + mainTabControl.Controls.Add(outputTabPage); + mainTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + mainTabControl.Location = new System.Drawing.Point(0, 0); + mainTabControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + mainTabControl.Name = "mainTabControl"; + mainTabControl.SelectedIndex = 0; + mainTabControl.Size = new System.Drawing.Size(1030, 1273); + mainTabControl.TabIndex = 0; + // + // miscTabPage + // + miscTabPage.Controls.Add(miscTableLayoutPanel); + miscTabPage.Location = new System.Drawing.Point(4, 34); + miscTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + miscTabPage.Name = "miscTabPage"; + miscTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + miscTabPage.Size = new System.Drawing.Size(1022, 1235); + miscTabPage.TabIndex = 3; + miscTabPage.Text = "Misc"; + miscTabPage.UseVisualStyleBackColor = true; + // + // miscTableLayoutPanel + // + miscTableLayoutPanel.AutoScroll = true; + miscTableLayoutPanel.AutoSize = true; + miscTableLayoutPanel.ColumnCount = 3; + miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + miscTableLayoutPanel.Controls.Add(forzaPortNumericUpDown, 1, 3); + miscTableLayoutPanel.Controls.Add(forzaPortLabel, 0, 3); + miscTableLayoutPanel.Controls.Add(dsxPortLabel, 0, 2); + miscTableLayoutPanel.Controls.Add(appCheckLabel, 0, 1); + miscTableLayoutPanel.Controls.Add(rpmLabel, 0, 0); + miscTableLayoutPanel.Controls.Add(rpmTrackBar, 1, 0); + miscTableLayoutPanel.Controls.Add(appCheckBox, 1, 1); + miscTableLayoutPanel.Controls.Add(dsxNumericUpDown, 1, 2); + miscTableLayoutPanel.Controls.Add(rpmValueNumericUpDown, 2, 0); + miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 4); + miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 4); + miscTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + miscTableLayoutPanel.Location = new System.Drawing.Point(4, 5); + miscTableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + miscTableLayoutPanel.Name = "miscTableLayoutPanel"; + miscTableLayoutPanel.RowCount = 5; + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 33F)); + miscTableLayoutPanel.Size = new System.Drawing.Size(1014, 1225); + miscTableLayoutPanel.TabIndex = 0; + // + // forzaPortNumericUpDown + // + forzaPortNumericUpDown.AutoSize = true; + forzaPortNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + forzaPortNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; + forzaPortNumericUpDown.Location = new System.Drawing.Point(181, 156); + forzaPortNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + forzaPortNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); + forzaPortNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); + forzaPortNumericUpDown.Name = "forzaPortNumericUpDown"; + forzaPortNumericUpDown.Size = new System.Drawing.Size(143, 31); + forzaPortNumericUpDown.TabIndex = 7; + toolTip.SetToolTip(forzaPortNumericUpDown, "Port for Forza UDP server"); + forzaPortNumericUpDown.ValueChanged += forzaPortNumericUpDown_ValueChanged; + // + // forzaPortLabel + // + forzaPortLabel.AutoSize = true; + forzaPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; + forzaPortLabel.Location = new System.Drawing.Point(4, 151); + forzaPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + forzaPortLabel.Name = "forzaPortLabel"; + forzaPortLabel.Size = new System.Drawing.Size(169, 41); + forzaPortLabel.TabIndex = 6; + forzaPortLabel.Text = "Forza Port"; + forzaPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(forzaPortLabel, "Port for Forza UDP server"); + // + // dsxPortLabel + // + dsxPortLabel.AutoSize = true; + dsxPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; + dsxPortLabel.Location = new System.Drawing.Point(4, 110); + dsxPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + dsxPortLabel.Name = "dsxPortLabel"; + dsxPortLabel.Size = new System.Drawing.Size(169, 41); + dsxPortLabel.TabIndex = 4; + dsxPortLabel.Text = "DSX Port"; + dsxPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(dsxPortLabel, "Port for DSX Port Listener"); + // + // appCheckLabel + // + appCheckLabel.AutoSize = true; + appCheckLabel.Dock = System.Windows.Forms.DockStyle.Fill; + appCheckLabel.Location = new System.Drawing.Point(4, 79); + appCheckLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + appCheckLabel.Name = "appCheckLabel"; + appCheckLabel.Size = new System.Drawing.Size(169, 31); + appCheckLabel.TabIndex = 2; + appCheckLabel.Text = "Disable App Check?"; + appCheckLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(appCheckLabel, "Should we disable the check for running applications?"); + // + // rpmLabel + // + rpmLabel.AutoSize = true; + rpmLabel.Dock = System.Windows.Forms.DockStyle.Fill; + rpmLabel.LiveSetting = System.Windows.Forms.Automation.AutomationLiveSetting.Polite; + rpmLabel.Location = new System.Drawing.Point(4, 0); + rpmLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + rpmLabel.Name = "rpmLabel"; + rpmLabel.Size = new System.Drawing.Size(169, 79); + rpmLabel.TabIndex = 0; + rpmLabel.Text = "RPM Redline Ratio"; + rpmLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(rpmLabel, "The percentage of the current RPM when we are in the \"redline\" of the engine"); + // + // rpmTrackBar + // + rpmTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + rpmTrackBar.Cursor = System.Windows.Forms.Cursors.NoMoveHoriz; + rpmTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + rpmTrackBar.LargeChange = 50; + rpmTrackBar.Location = new System.Drawing.Point(181, 5); + rpmTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + rpmTrackBar.Maximum = 100; + rpmTrackBar.Name = "rpmTrackBar"; + rpmTrackBar.Size = new System.Drawing.Size(593, 69); + rpmTrackBar.TabIndex = 1; + rpmTrackBar.TickFrequency = 5; + rpmTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(rpmTrackBar, "The percentage of the current RPM when we are in the \"redline\" of the engine"); + rpmTrackBar.Scroll += rpmTrackBar_Scroll; + // + // appCheckBox + // + appCheckBox.AutoSize = true; + appCheckBox.Dock = System.Windows.Forms.DockStyle.Fill; + appCheckBox.Location = new System.Drawing.Point(181, 84); + appCheckBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + appCheckBox.Name = "appCheckBox"; + appCheckBox.Size = new System.Drawing.Size(593, 21); + appCheckBox.TabIndex = 3; + toolTip.SetToolTip(appCheckBox, "Should we disable the check for running applications?"); + appCheckBox.UseVisualStyleBackColor = true; + appCheckBox.CheckedChanged += appCheckBox_CheckedChanged; + // + // dsxNumericUpDown + // + dsxNumericUpDown.AutoSize = true; + dsxNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + dsxNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; + dsxNumericUpDown.Location = new System.Drawing.Point(181, 115); + dsxNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + dsxNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); + dsxNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); + dsxNumericUpDown.Name = "dsxNumericUpDown"; + dsxNumericUpDown.Size = new System.Drawing.Size(143, 31); + dsxNumericUpDown.TabIndex = 5; + toolTip.SetToolTip(dsxNumericUpDown, "Port for DSX Port Listener"); + dsxNumericUpDown.ValueChanged += dsxNumericUpDown_ValueChanged; + // + // rpmValueNumericUpDown + // + rpmValueNumericUpDown.AutoSize = true; + rpmValueNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + rpmValueNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; + rpmValueNumericUpDown.Location = new System.Drawing.Point(782, 5); + rpmValueNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + rpmValueNumericUpDown.Name = "rpmValueNumericUpDown"; + rpmValueNumericUpDown.Size = new System.Drawing.Size(228, 31); + rpmValueNumericUpDown.TabIndex = 8; + toolTip.SetToolTip(rpmValueNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); + rpmValueNumericUpDown.ValueChanged += rpmValueNumericUpDown_ValueChanged; + // + // buttonApplyMisc + // + buttonApplyMisc.Dock = System.Windows.Forms.DockStyle.Top; + buttonApplyMisc.Location = new System.Drawing.Point(181, 197); + buttonApplyMisc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + buttonApplyMisc.MaximumSize = new System.Drawing.Size(429, 50); + buttonApplyMisc.MinimumSize = new System.Drawing.Size(286, 42); + buttonApplyMisc.Name = "buttonApplyMisc"; + buttonApplyMisc.Size = new System.Drawing.Size(429, 42); + buttonApplyMisc.TabIndex = 9; + buttonApplyMisc.Text = "Apply"; + buttonApplyMisc.UseVisualStyleBackColor = true; + buttonApplyMisc.Click += buttonApplyMisc_Click; + // + // miscDefaultsButton + // + miscDefaultsButton.Location = new System.Drawing.Point(782, 197); + miscDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + miscDefaultsButton.Name = "miscDefaultsButton"; + miscDefaultsButton.Size = new System.Drawing.Size(107, 38); + miscDefaultsButton.TabIndex = 39; + miscDefaultsButton.Text = "Defaults"; + miscDefaultsButton.UseVisualStyleBackColor = true; + miscDefaultsButton.Click += miscDefaultsButton_Click; + // + // brakeConfigTabPage + // + brakeConfigTabPage.Controls.Add(brakeTableLayoutPanel); + brakeConfigTabPage.Location = new System.Drawing.Point(4, 34); + brakeConfigTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeConfigTabPage.Name = "brakeConfigTabPage"; + brakeConfigTabPage.Size = new System.Drawing.Size(1022, 1235); + brakeConfigTabPage.TabIndex = 4; + brakeConfigTabPage.Text = "Brake Trigger"; + // + // brakeTableLayoutPanel + // + brakeTableLayoutPanel.AutoScroll = true; + brakeTableLayoutPanel.AutoSize = true; + brakeTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + brakeTableLayoutPanel.BackColor = System.Drawing.SystemColors.ControlLightLight; + brakeTableLayoutPanel.ColumnCount = 3; + brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + brakeTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothNumericUpDown, 2, 12); + brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceNumericUpDown, 2, 11); + brakeTableLayoutPanel.Controls.Add(minBrakeResistanceNumericUpDown, 2, 10); + brakeTableLayoutPanel.Controls.Add(maxBrakeStifnessNumericUpDown, 2, 9); + brakeTableLayoutPanel.Controls.Add(minBrakeStifnessNumericUpDown, 2, 8); + brakeTableLayoutPanel.Controls.Add(brakeVibrationSmoothNumericUpDown, 2, 7); + brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationNumericUpDown, 2, 6); + brakeTableLayoutPanel.Controls.Add(minBrakeVibrationNumericUpDown, 2, 5); + brakeTableLayoutPanel.Controls.Add(brakeVibrationModeNumericUpDown, 2, 4); + brakeTableLayoutPanel.Controls.Add(brakeVibrationStartNumericUpDown, 2, 3); + brakeTableLayoutPanel.Controls.Add(gripLossNumericUpDown, 2, 2); + brakeTableLayoutPanel.Controls.Add(brakeEffectNumericUpDown, 2, 1); + brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothingTrackBar, 1, 12); + brakeTableLayoutPanel.Controls.Add(brakeResistanceSmoothingLabel, 0, 12); + brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceTrackBar, 1, 11); + brakeTableLayoutPanel.Controls.Add(maxBrakeResistanceLabel, 0, 11); + brakeTableLayoutPanel.Controls.Add(minBrakeResistanceTrackBar, 1, 10); + brakeTableLayoutPanel.Controls.Add(minBrakeResistanceLabel, 0, 10); + brakeTableLayoutPanel.Controls.Add(maxBrakeStiffnessTrackBar, 1, 9); + brakeTableLayoutPanel.Controls.Add(maxBrakeStiffnessLabel, 0, 9); + brakeTableLayoutPanel.Controls.Add(minBrakeStiffnessTrackBar, 1, 8); + brakeTableLayoutPanel.Controls.Add(minBrakeStiffnessLabel, 0, 8); + brakeTableLayoutPanel.Controls.Add(vibrationSmoothingTrackBar, 1, 7); + brakeTableLayoutPanel.Controls.Add(vibrationSmoothingLabel, 0, 7); + brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationTrackBar, 1, 6); + brakeTableLayoutPanel.Controls.Add(maxBrakeVibrationLabel, 0, 6); + brakeTableLayoutPanel.Controls.Add(minBrakeVibrationTrackBar, 1, 5); + brakeTableLayoutPanel.Controls.Add(minBrakeVibrationLabel, 0, 5); + brakeTableLayoutPanel.Controls.Add(brakeVibrationModeTrackBar, 1, 4); + brakeTableLayoutPanel.Controls.Add(brakeVibrationModeStartLabel, 0, 4); + brakeTableLayoutPanel.Controls.Add(brakeVibrationStartTrackBar, 1, 3); + brakeTableLayoutPanel.Controls.Add(brakeVibrationStartLabel, 0, 3); + brakeTableLayoutPanel.Controls.Add(gripLossTrackBar, 1, 2); + brakeTableLayoutPanel.Controls.Add(gripLossLabel, 0, 2); + brakeTableLayoutPanel.Controls.Add(brakeEffectIntensityLabel, 0, 1); + brakeTableLayoutPanel.Controls.Add(brakeEffectIntensityTrackBar, 1, 1); + brakeTableLayoutPanel.Controls.Add(buttonApply_Brake, 1, 13); + brakeTableLayoutPanel.Controls.Add(brakeDefaultsButton, 2, 13); + brakeTableLayoutPanel.Controls.Add(brakeTriggerMode, 0, 0); + brakeTableLayoutPanel.Controls.Add(brakeTriggerModeComboBox, 1, 0); + brakeTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + brakeTableLayoutPanel.Location = new System.Drawing.Point(0, 0); + brakeTableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeTableLayoutPanel.Name = "brakeTableLayoutPanel"; + brakeTableLayoutPanel.RowCount = 15; + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 67F)); + brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 13F)); + brakeTableLayoutPanel.Size = new System.Drawing.Size(1022, 1235); + brakeTableLayoutPanel.TabIndex = 0; + // + // brakeResistanceSmoothNumericUpDown + // + brakeResistanceSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + brakeResistanceSmoothNumericUpDown.AutoSize = true; + brakeResistanceSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + brakeResistanceSmoothNumericUpDown.Location = new System.Drawing.Point(781, 936); + brakeResistanceSmoothNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeResistanceSmoothNumericUpDown.Maximum = new decimal(new int[] { 500, 0, 0, 0 }); + brakeResistanceSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + brakeResistanceSmoothNumericUpDown.Name = "brakeResistanceSmoothNumericUpDown"; + brakeResistanceSmoothNumericUpDown.Size = new System.Drawing.Size(66, 31); + brakeResistanceSmoothNumericUpDown.TabIndex = 36; + toolTip.SetToolTip(brakeResistanceSmoothNumericUpDown, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); + brakeResistanceSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + brakeResistanceSmoothNumericUpDown.ValueChanged += brakeResistanceSmoothNumericUpDown_ValueChanged; + // + // maxBrakeResistanceNumericUpDown + // + maxBrakeResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + maxBrakeResistanceNumericUpDown.AutoSize = true; + maxBrakeResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + maxBrakeResistanceNumericUpDown.Location = new System.Drawing.Point(781, 857); + maxBrakeResistanceNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + maxBrakeResistanceNumericUpDown.Name = "maxBrakeResistanceNumericUpDown"; + maxBrakeResistanceNumericUpDown.Size = new System.Drawing.Size(46, 31); + maxBrakeResistanceNumericUpDown.TabIndex = 35; + toolTip.SetToolTip(maxBrakeResistanceNumericUpDown, "The Maximum resistance on the Brake (0-7)"); + maxBrakeResistanceNumericUpDown.ValueChanged += maxBrakeResistanceNumericUpDown_ValueChanged; + // + // minBrakeResistanceNumericUpDown + // + minBrakeResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + minBrakeResistanceNumericUpDown.AutoSize = true; + minBrakeResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + minBrakeResistanceNumericUpDown.Location = new System.Drawing.Point(781, 778); + minBrakeResistanceNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + minBrakeResistanceNumericUpDown.Name = "minBrakeResistanceNumericUpDown"; + minBrakeResistanceNumericUpDown.Size = new System.Drawing.Size(46, 31); + minBrakeResistanceNumericUpDown.TabIndex = 34; + toolTip.SetToolTip(minBrakeResistanceNumericUpDown, "The Minimum resistance on the Brake (0-7)"); + minBrakeResistanceNumericUpDown.ValueChanged += minBrakeResistanceNumericUpDown_ValueChanged; + // + // maxBrakeStifnessNumericUpDown + // + maxBrakeStifnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + maxBrakeStifnessNumericUpDown.AutoSize = true; + maxBrakeStifnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + maxBrakeStifnessNumericUpDown.Location = new System.Drawing.Point(781, 699); + maxBrakeStifnessNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeStifnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + maxBrakeStifnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + maxBrakeStifnessNumericUpDown.Name = "maxBrakeStifnessNumericUpDown"; + maxBrakeStifnessNumericUpDown.Size = new System.Drawing.Size(66, 31); + maxBrakeStifnessNumericUpDown.TabIndex = 33; + toolTip.SetToolTip(maxBrakeStifnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); + maxBrakeStifnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + maxBrakeStifnessNumericUpDown.ValueChanged += maxBrakeStifnessNumericUpDown_ValueChanged; + // + // minBrakeStifnessNumericUpDown + // + minBrakeStifnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + minBrakeStifnessNumericUpDown.AutoSize = true; + minBrakeStifnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + minBrakeStifnessNumericUpDown.Location = new System.Drawing.Point(781, 620); + minBrakeStifnessNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeStifnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + minBrakeStifnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + minBrakeStifnessNumericUpDown.Name = "minBrakeStifnessNumericUpDown"; + minBrakeStifnessNumericUpDown.Size = new System.Drawing.Size(66, 31); + minBrakeStifnessNumericUpDown.TabIndex = 32; + toolTip.SetToolTip(minBrakeStifnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); + minBrakeStifnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + minBrakeStifnessNumericUpDown.ValueChanged += minBrakeStifnessNumericUpDown_ValueChanged; + // + // brakeVibrationSmoothNumericUpDown + // + brakeVibrationSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + brakeVibrationSmoothNumericUpDown.AutoSize = true; + brakeVibrationSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + brakeVibrationSmoothNumericUpDown.Location = new System.Drawing.Point(781, 541); + brakeVibrationSmoothNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeVibrationSmoothNumericUpDown.Maximum = new decimal(new int[] { 500, 0, 0, 0 }); + brakeVibrationSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + brakeVibrationSmoothNumericUpDown.Name = "brakeVibrationSmoothNumericUpDown"; + brakeVibrationSmoothNumericUpDown.Size = new System.Drawing.Size(66, 31); + brakeVibrationSmoothNumericUpDown.TabIndex = 31; + toolTip.SetToolTip(brakeVibrationSmoothNumericUpDown, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); + brakeVibrationSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + brakeVibrationSmoothNumericUpDown.ValueChanged += brakeVibrationSmoothNumericUpDown_ValueChanged; + // + // maxBrakeVibrationNumericUpDown + // + maxBrakeVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + maxBrakeVibrationNumericUpDown.AutoSize = true; + maxBrakeVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + maxBrakeVibrationNumericUpDown.Location = new System.Drawing.Point(781, 462); + maxBrakeVibrationNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeVibrationNumericUpDown.Name = "maxBrakeVibrationNumericUpDown"; + maxBrakeVibrationNumericUpDown.Size = new System.Drawing.Size(66, 31); + maxBrakeVibrationNumericUpDown.TabIndex = 30; + toolTip.SetToolTip(maxBrakeVibrationNumericUpDown, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); + maxBrakeVibrationNumericUpDown.ValueChanged += maxBrakeVibrationNumericUpDown_ValueChanged; + // + // minBrakeVibrationNumericUpDown + // + minBrakeVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + minBrakeVibrationNumericUpDown.AutoSize = true; + minBrakeVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + minBrakeVibrationNumericUpDown.Location = new System.Drawing.Point(781, 383); + minBrakeVibrationNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeVibrationNumericUpDown.Name = "minBrakeVibrationNumericUpDown"; + minBrakeVibrationNumericUpDown.Size = new System.Drawing.Size(66, 31); + minBrakeVibrationNumericUpDown.TabIndex = 29; + toolTip.SetToolTip(minBrakeVibrationNumericUpDown, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + minBrakeVibrationNumericUpDown.ValueChanged += minBrakeVibrationNumericUpDown_ValueChanged; + // + // brakeVibrationModeNumericUpDown + // + brakeVibrationModeNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + brakeVibrationModeNumericUpDown.AutoSize = true; + brakeVibrationModeNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + brakeVibrationModeNumericUpDown.Location = new System.Drawing.Point(781, 304); + brakeVibrationModeNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeVibrationModeNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + brakeVibrationModeNumericUpDown.Name = "brakeVibrationModeNumericUpDown"; + brakeVibrationModeNumericUpDown.Size = new System.Drawing.Size(66, 31); + brakeVibrationModeNumericUpDown.TabIndex = 28; + toolTip.SetToolTip(brakeVibrationModeNumericUpDown, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); + brakeVibrationModeNumericUpDown.ValueChanged += brakeVibrationModeNumericUpDown_ValueChanged; + // + // brakeVibrationStartNumericUpDown + // + brakeVibrationStartNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + brakeVibrationStartNumericUpDown.AutoSize = true; + brakeVibrationStartNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + brakeVibrationStartNumericUpDown.Location = new System.Drawing.Point(781, 225); + brakeVibrationStartNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeVibrationStartNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + brakeVibrationStartNumericUpDown.Name = "brakeVibrationStartNumericUpDown"; + brakeVibrationStartNumericUpDown.Size = new System.Drawing.Size(66, 31); + brakeVibrationStartNumericUpDown.TabIndex = 27; + toolTip.SetToolTip(brakeVibrationStartNumericUpDown, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); + brakeVibrationStartNumericUpDown.ValueChanged += brakeVibrationStartNumericUpDown_ValueChanged; + // + // gripLossNumericUpDown + // + gripLossNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + gripLossNumericUpDown.AutoSize = true; + gripLossNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + gripLossNumericUpDown.Location = new System.Drawing.Point(781, 146); + gripLossNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + gripLossNumericUpDown.Name = "gripLossNumericUpDown"; + gripLossNumericUpDown.Size = new System.Drawing.Size(66, 31); + gripLossNumericUpDown.TabIndex = 26; + toolTip.SetToolTip(gripLossNumericUpDown, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); + gripLossNumericUpDown.ValueChanged += gripLossNumericUpDown_ValueChanged; + // + // brakeEffectNumericUpDown + // + brakeEffectNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + brakeEffectNumericUpDown.AutoSize = true; + brakeEffectNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + brakeEffectNumericUpDown.Location = new System.Drawing.Point(781, 67); + brakeEffectNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeEffectNumericUpDown.Name = "brakeEffectNumericUpDown"; + brakeEffectNumericUpDown.Size = new System.Drawing.Size(66, 31); + brakeEffectNumericUpDown.TabIndex = 2; + toolTip.SetToolTip(brakeEffectNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); + brakeEffectNumericUpDown.ValueChanged += brakeEffectNumericUpDown_ValueChanged; + // + // brakeResistanceSmoothingTrackBar + // + brakeResistanceSmoothingTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + brakeResistanceSmoothingTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + brakeResistanceSmoothingTrackBar.LargeChange = 50; + brakeResistanceSmoothingTrackBar.Location = new System.Drawing.Point(199, 917); + brakeResistanceSmoothingTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeResistanceSmoothingTrackBar.Maximum = 500; + brakeResistanceSmoothingTrackBar.Minimum = 1; + brakeResistanceSmoothingTrackBar.Name = "brakeResistanceSmoothingTrackBar"; + brakeResistanceSmoothingTrackBar.Size = new System.Drawing.Size(574, 69); + brakeResistanceSmoothingTrackBar.TabIndex = 23; + brakeResistanceSmoothingTrackBar.TickFrequency = 10; + brakeResistanceSmoothingTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(brakeResistanceSmoothingTrackBar, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); + brakeResistanceSmoothingTrackBar.Value = 1; + brakeResistanceSmoothingTrackBar.Scroll += brakeResistanceSmoothingTrackBar_Scroll; + // + // brakeResistanceSmoothingLabel + // + brakeResistanceSmoothingLabel.AutoSize = true; + brakeResistanceSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; + brakeResistanceSmoothingLabel.Location = new System.Drawing.Point(4, 912); + brakeResistanceSmoothingLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeResistanceSmoothingLabel.Name = "brakeResistanceSmoothingLabel"; + brakeResistanceSmoothingLabel.Size = new System.Drawing.Size(187, 79); + brakeResistanceSmoothingLabel.TabIndex = 22; + brakeResistanceSmoothingLabel.Text = "Resistance Smoothing"; + brakeResistanceSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(brakeResistanceSmoothingLabel, "Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0"); + // + // maxBrakeResistanceTrackBar + // + maxBrakeResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + maxBrakeResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeResistanceTrackBar.LargeChange = 50; + maxBrakeResistanceTrackBar.Location = new System.Drawing.Point(199, 838); + maxBrakeResistanceTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeResistanceTrackBar.Maximum = 7; + maxBrakeResistanceTrackBar.Name = "maxBrakeResistanceTrackBar"; + maxBrakeResistanceTrackBar.Size = new System.Drawing.Size(574, 69); + maxBrakeResistanceTrackBar.TabIndex = 21; + maxBrakeResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(maxBrakeResistanceTrackBar, "The Maximum resistance on the Brake (0-7)"); + maxBrakeResistanceTrackBar.Scroll += maxBrakeResistanceTrackBar_Scroll; + // + // maxBrakeResistanceLabel + // + maxBrakeResistanceLabel.AutoSize = true; + maxBrakeResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeResistanceLabel.Location = new System.Drawing.Point(4, 833); + maxBrakeResistanceLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxBrakeResistanceLabel.Name = "maxBrakeResistanceLabel"; + maxBrakeResistanceLabel.Size = new System.Drawing.Size(187, 79); + maxBrakeResistanceLabel.TabIndex = 20; + maxBrakeResistanceLabel.Text = "Max Resistance"; + maxBrakeResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxBrakeResistanceLabel, "The Maximum resistance on the Brake (0-7)"); + // + // minBrakeResistanceTrackBar + // + minBrakeResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + minBrakeResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeResistanceTrackBar.LargeChange = 50; + minBrakeResistanceTrackBar.Location = new System.Drawing.Point(199, 759); + minBrakeResistanceTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeResistanceTrackBar.Maximum = 7; + minBrakeResistanceTrackBar.Name = "minBrakeResistanceTrackBar"; + minBrakeResistanceTrackBar.Size = new System.Drawing.Size(574, 69); + minBrakeResistanceTrackBar.TabIndex = 19; + minBrakeResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(minBrakeResistanceTrackBar, "The Minimum resistance on the Brake (0-7)"); + minBrakeResistanceTrackBar.Scroll += minBrakeResistanceTrackBar_Scroll; + // + // minBrakeResistanceLabel + // + minBrakeResistanceLabel.AutoSize = true; + minBrakeResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeResistanceLabel.Location = new System.Drawing.Point(4, 754); + minBrakeResistanceLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minBrakeResistanceLabel.Name = "minBrakeResistanceLabel"; + minBrakeResistanceLabel.Size = new System.Drawing.Size(187, 79); + minBrakeResistanceLabel.TabIndex = 18; + minBrakeResistanceLabel.Text = "Min Resistance"; + minBrakeResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minBrakeResistanceLabel, "The Minimum resistance on the Brake (0-7)"); + // + // maxBrakeStiffnessTrackBar + // + maxBrakeStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + maxBrakeStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeStiffnessTrackBar.LargeChange = 50; + maxBrakeStiffnessTrackBar.Location = new System.Drawing.Point(199, 680); + maxBrakeStiffnessTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeStiffnessTrackBar.Maximum = 255; + maxBrakeStiffnessTrackBar.Minimum = 1; + maxBrakeStiffnessTrackBar.Name = "maxBrakeStiffnessTrackBar"; + maxBrakeStiffnessTrackBar.Size = new System.Drawing.Size(574, 69); + maxBrakeStiffnessTrackBar.TabIndex = 17; + maxBrakeStiffnessTrackBar.TickFrequency = 5; + maxBrakeStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(maxBrakeStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); + maxBrakeStiffnessTrackBar.Value = 1; + maxBrakeStiffnessTrackBar.Scroll += maxBrakeStiffnessTrackBar_Scroll; + // + // maxBrakeStiffnessLabel + // + maxBrakeStiffnessLabel.AutoSize = true; + maxBrakeStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeStiffnessLabel.Location = new System.Drawing.Point(4, 675); + maxBrakeStiffnessLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxBrakeStiffnessLabel.Name = "maxBrakeStiffnessLabel"; + maxBrakeStiffnessLabel.Size = new System.Drawing.Size(187, 79); + maxBrakeStiffnessLabel.TabIndex = 16; + maxBrakeStiffnessLabel.Text = "Max Stiffness"; + maxBrakeStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxBrakeStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); + // + // minBrakeStiffnessTrackBar + // + minBrakeStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + minBrakeStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeStiffnessTrackBar.LargeChange = 50; + minBrakeStiffnessTrackBar.Location = new System.Drawing.Point(199, 601); + minBrakeStiffnessTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeStiffnessTrackBar.Maximum = 255; + minBrakeStiffnessTrackBar.Minimum = 1; + minBrakeStiffnessTrackBar.Name = "minBrakeStiffnessTrackBar"; + minBrakeStiffnessTrackBar.Size = new System.Drawing.Size(574, 69); + minBrakeStiffnessTrackBar.TabIndex = 15; + minBrakeStiffnessTrackBar.TickFrequency = 5; + minBrakeStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(minBrakeStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); + minBrakeStiffnessTrackBar.Value = 1; + minBrakeStiffnessTrackBar.Scroll += minBrakeStiffnessTrackBar_Scroll; + // + // minBrakeStiffnessLabel + // + minBrakeStiffnessLabel.AutoSize = true; + minBrakeStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeStiffnessLabel.Location = new System.Drawing.Point(4, 596); + minBrakeStiffnessLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minBrakeStiffnessLabel.Name = "minBrakeStiffnessLabel"; + minBrakeStiffnessLabel.Size = new System.Drawing.Size(187, 79); + minBrakeStiffnessLabel.TabIndex = 14; + minBrakeStiffnessLabel.Text = "Min Stifness"; + minBrakeStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minBrakeStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); + // + // vibrationSmoothingTrackBar + // + vibrationSmoothingTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + vibrationSmoothingTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + vibrationSmoothingTrackBar.LargeChange = 50; + vibrationSmoothingTrackBar.Location = new System.Drawing.Point(199, 522); + vibrationSmoothingTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + vibrationSmoothingTrackBar.Maximum = 500; + vibrationSmoothingTrackBar.Minimum = 1; + vibrationSmoothingTrackBar.Name = "vibrationSmoothingTrackBar"; + vibrationSmoothingTrackBar.Size = new System.Drawing.Size(574, 69); + vibrationSmoothingTrackBar.TabIndex = 13; + vibrationSmoothingTrackBar.TickFrequency = 10; + vibrationSmoothingTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(vibrationSmoothingTrackBar, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); + vibrationSmoothingTrackBar.Value = 1; + vibrationSmoothingTrackBar.Scroll += vibrationSmoothingTrackBar_Scroll; + // + // vibrationSmoothingLabel + // + vibrationSmoothingLabel.AutoSize = true; + vibrationSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; + vibrationSmoothingLabel.Location = new System.Drawing.Point(4, 517); + vibrationSmoothingLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + vibrationSmoothingLabel.Name = "vibrationSmoothingLabel"; + vibrationSmoothingLabel.Size = new System.Drawing.Size(187, 79); + vibrationSmoothingLabel.TabIndex = 12; + vibrationSmoothingLabel.Text = "Vibration Smoothing"; + vibrationSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(vibrationSmoothingLabel, "Smoothing for Brake Frequency output. Lower = smoother. Must be greater than 0"); + // + // maxBrakeVibrationTrackBar + // + maxBrakeVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + maxBrakeVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeVibrationTrackBar.LargeChange = 50; + maxBrakeVibrationTrackBar.Location = new System.Drawing.Point(199, 443); + maxBrakeVibrationTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + maxBrakeVibrationTrackBar.Maximum = 100; + maxBrakeVibrationTrackBar.Name = "maxBrakeVibrationTrackBar"; + maxBrakeVibrationTrackBar.Size = new System.Drawing.Size(574, 69); + maxBrakeVibrationTrackBar.TabIndex = 11; + maxBrakeVibrationTrackBar.TickFrequency = 5; + maxBrakeVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(maxBrakeVibrationTrackBar, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); + maxBrakeVibrationTrackBar.Scroll += maxBrakeVibrationTrackBar_Scroll; + // + // maxBrakeVibrationLabel + // + maxBrakeVibrationLabel.AutoSize = true; + maxBrakeVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxBrakeVibrationLabel.Location = new System.Drawing.Point(4, 438); + maxBrakeVibrationLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxBrakeVibrationLabel.Name = "maxBrakeVibrationLabel"; + maxBrakeVibrationLabel.Size = new System.Drawing.Size(187, 79); + maxBrakeVibrationLabel.TabIndex = 10; + maxBrakeVibrationLabel.Text = "Max Brake Vibration"; + maxBrakeVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxBrakeVibrationLabel, "The maximum brake frequency in Hz (avoid over 40). Correlates to better grip"); + // + // minBrakeVibrationTrackBar + // + minBrakeVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + minBrakeVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeVibrationTrackBar.LargeChange = 50; + minBrakeVibrationTrackBar.Location = new System.Drawing.Point(199, 364); + minBrakeVibrationTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + minBrakeVibrationTrackBar.Maximum = 100; + minBrakeVibrationTrackBar.Name = "minBrakeVibrationTrackBar"; + minBrakeVibrationTrackBar.Size = new System.Drawing.Size(574, 69); + minBrakeVibrationTrackBar.TabIndex = 9; + minBrakeVibrationTrackBar.TickFrequency = 5; + minBrakeVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(minBrakeVibrationTrackBar, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + minBrakeVibrationTrackBar.Scroll += minBrakeVibrationTrackBar_Scroll; + // + // minBrakeVibrationLabel + // + minBrakeVibrationLabel.AutoSize = true; + minBrakeVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minBrakeVibrationLabel.Location = new System.Drawing.Point(4, 359); + minBrakeVibrationLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minBrakeVibrationLabel.Name = "minBrakeVibrationLabel"; + minBrakeVibrationLabel.Size = new System.Drawing.Size(187, 79); + minBrakeVibrationLabel.TabIndex = 8; + minBrakeVibrationLabel.Text = "Min Brake Vibration"; + minBrakeVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minBrakeVibrationLabel, "The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + // + // brakeVibrationModeTrackBar + // + brakeVibrationModeTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + brakeVibrationModeTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + brakeVibrationModeTrackBar.LargeChange = 50; + brakeVibrationModeTrackBar.Location = new System.Drawing.Point(199, 285); + brakeVibrationModeTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeVibrationModeTrackBar.Maximum = 255; + brakeVibrationModeTrackBar.Name = "brakeVibrationModeTrackBar"; + brakeVibrationModeTrackBar.Size = new System.Drawing.Size(574, 69); + brakeVibrationModeTrackBar.TabIndex = 7; + brakeVibrationModeTrackBar.TickFrequency = 5; + brakeVibrationModeTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(brakeVibrationModeTrackBar, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); + brakeVibrationModeTrackBar.Scroll += brakeVibrationModeTrackBar_Scroll; + // + // brakeVibrationModeStartLabel + // + brakeVibrationModeStartLabel.AutoSize = true; + brakeVibrationModeStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; + brakeVibrationModeStartLabel.Location = new System.Drawing.Point(4, 280); + brakeVibrationModeStartLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeVibrationModeStartLabel.Name = "brakeVibrationModeStartLabel"; + brakeVibrationModeStartLabel.Size = new System.Drawing.Size(187, 79); + brakeVibrationModeStartLabel.TabIndex = 6; + brakeVibrationModeStartLabel.Text = "Vibration Mode Start"; + brakeVibrationModeStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(brakeVibrationModeStartLabel, "The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. "); + // + // brakeVibrationStartTrackBar + // + brakeVibrationStartTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + brakeVibrationStartTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + brakeVibrationStartTrackBar.LargeChange = 50; + brakeVibrationStartTrackBar.Location = new System.Drawing.Point(199, 206); + brakeVibrationStartTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeVibrationStartTrackBar.Maximum = 255; + brakeVibrationStartTrackBar.Name = "brakeVibrationStartTrackBar"; + brakeVibrationStartTrackBar.Size = new System.Drawing.Size(574, 69); + brakeVibrationStartTrackBar.TabIndex = 5; + brakeVibrationStartTrackBar.TickFrequency = 5; + brakeVibrationStartTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(brakeVibrationStartTrackBar, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); + brakeVibrationStartTrackBar.Scroll += brakeVibrationStartTrackBar_Scroll; + // + // brakeVibrationStartLabel + // + brakeVibrationStartLabel.AutoSize = true; + brakeVibrationStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; + brakeVibrationStartLabel.Location = new System.Drawing.Point(4, 201); + brakeVibrationStartLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeVibrationStartLabel.Name = "brakeVibrationStartLabel"; + brakeVibrationStartLabel.Size = new System.Drawing.Size(187, 79); + brakeVibrationStartLabel.TabIndex = 4; + brakeVibrationStartLabel.Text = "Vibration Start"; + brakeVibrationStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(brakeVibrationStartLabel, "The position in the Trigger (0-255) at which the brake should feel engaged with low grip surfaces"); + // + // gripLossTrackBar + // + gripLossTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + gripLossTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + gripLossTrackBar.Location = new System.Drawing.Point(199, 127); + gripLossTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + gripLossTrackBar.Maximum = 100; + gripLossTrackBar.Name = "gripLossTrackBar"; + gripLossTrackBar.Size = new System.Drawing.Size(574, 69); + gripLossTrackBar.TabIndex = 3; + gripLossTrackBar.TickFrequency = 5; + gripLossTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(gripLossTrackBar, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); + gripLossTrackBar.Value = 50; + gripLossTrackBar.Scroll += gripLossTrackBar_Scroll; + // + // gripLossLabel + // + gripLossLabel.AutoSize = true; + gripLossLabel.Dock = System.Windows.Forms.DockStyle.Fill; + gripLossLabel.Location = new System.Drawing.Point(4, 122); + gripLossLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + gripLossLabel.Name = "gripLossLabel"; + gripLossLabel.Size = new System.Drawing.Size(187, 79); + gripLossLabel.TabIndex = 2; + gripLossLabel.Text = "Grip Loss Value"; + gripLossLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(gripLossLabel, "The point at which the brake will begin to become choppy (0 = full grip, 100 = no grip)"); + // + // brakeEffectIntensityLabel + // + brakeEffectIntensityLabel.AutoSize = true; + brakeEffectIntensityLabel.Dock = System.Windows.Forms.DockStyle.Fill; + brakeEffectIntensityLabel.Location = new System.Drawing.Point(4, 43); + brakeEffectIntensityLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeEffectIntensityLabel.Name = "brakeEffectIntensityLabel"; + brakeEffectIntensityLabel.Size = new System.Drawing.Size(187, 79); + brakeEffectIntensityLabel.TabIndex = 0; + brakeEffectIntensityLabel.Text = "Effect Intensity"; + brakeEffectIntensityLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(brakeEffectIntensityLabel, "The percentage of the trigger effects"); + // + // brakeEffectIntensityTrackBar + // + brakeEffectIntensityTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + brakeEffectIntensityTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + brakeEffectIntensityTrackBar.LargeChange = 10; + brakeEffectIntensityTrackBar.Location = new System.Drawing.Point(199, 48); + brakeEffectIntensityTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeEffectIntensityTrackBar.Maximum = 100; + brakeEffectIntensityTrackBar.Name = "brakeEffectIntensityTrackBar"; + brakeEffectIntensityTrackBar.Size = new System.Drawing.Size(574, 69); + brakeEffectIntensityTrackBar.TabIndex = 1; + brakeEffectIntensityTrackBar.TickFrequency = 5; + brakeEffectIntensityTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(brakeEffectIntensityTrackBar, "The percentage of the trigger effects"); + brakeEffectIntensityTrackBar.Value = 100; + brakeEffectIntensityTrackBar.Scroll += brakeEffectIntensityTrackBar_Scroll; + // + // buttonApply_Brake + // + buttonApply_Brake.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + buttonApply_Brake.AutoSize = true; + buttonApply_Brake.Location = new System.Drawing.Point(199, 996); + buttonApply_Brake.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + buttonApply_Brake.Name = "buttonApply_Brake"; + buttonApply_Brake.Size = new System.Drawing.Size(574, 57); + buttonApply_Brake.TabIndex = 37; + buttonApply_Brake.Text = "Apply"; + buttonApply_Brake.UseVisualStyleBackColor = true; + buttonApply_Brake.Click += buttonApply_Brake_Click; + // + // brakeDefaultsButton + // + brakeDefaultsButton.AutoSize = true; + brakeDefaultsButton.Location = new System.Drawing.Point(781, 996); + brakeDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeDefaultsButton.Name = "brakeDefaultsButton"; + brakeDefaultsButton.Size = new System.Drawing.Size(124, 57); + brakeDefaultsButton.TabIndex = 38; + brakeDefaultsButton.Text = "Defaults"; + brakeDefaultsButton.UseVisualStyleBackColor = true; + brakeDefaultsButton.Click += brakeDefaultsButton_Click; + // + // brakeTriggerMode + // + brakeTriggerMode.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + brakeTriggerMode.AutoSize = true; + brakeTriggerMode.Location = new System.Drawing.Point(25, 0); + brakeTriggerMode.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeTriggerMode.Name = "brakeTriggerMode"; + brakeTriggerMode.Size = new System.Drawing.Size(166, 43); + brakeTriggerMode.TabIndex = 39; + brakeTriggerMode.Text = "Brake Trigger Mode"; + brakeTriggerMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // brakeTriggerModeComboBox + // + brakeTriggerModeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + brakeTriggerModeComboBox.FormattingEnabled = true; + brakeTriggerModeComboBox.Items.AddRange(new object[] { "Off", "Resistance", "Vibration" }); + brakeTriggerModeComboBox.Location = new System.Drawing.Point(199, 5); + brakeTriggerModeComboBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + brakeTriggerModeComboBox.Name = "brakeTriggerModeComboBox"; + brakeTriggerModeComboBox.Size = new System.Drawing.Size(574, 33); + brakeTriggerModeComboBox.TabIndex = 40; + brakeTriggerModeComboBox.SelectedIndexChanged += brakeTriggerModeComboBox_SelectedIndexChanged; + // + // throttleConfigTabPage + // + throttleConfigTabPage.Controls.Add(throttleTableLayoutPanel); + throttleConfigTabPage.Location = new System.Drawing.Point(4, 34); + throttleConfigTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleConfigTabPage.Name = "throttleConfigTabPage"; + throttleConfigTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleConfigTabPage.Size = new System.Drawing.Size(1022, 1235); + throttleConfigTabPage.TabIndex = 2; + throttleConfigTabPage.Text = "Throttle Trigger"; + throttleConfigTabPage.UseVisualStyleBackColor = true; + // + // throttleTableLayoutPanel + // + throttleTableLayoutPanel.AutoScroll = true; + throttleTableLayoutPanel.ColumnCount = 3; + throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + throttleTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + throttleTableLayoutPanel.Controls.Add(throttleTriggerModeComboBox, 1, 0); + throttleTableLayoutPanel.Controls.Add(throttleTriggerMode, 0, 0); + throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothNumericUpDown, 2, 14); + throttleTableLayoutPanel.Controls.Add(throttleMaxResistanceNumericUpDown, 2, 13); + throttleTableLayoutPanel.Controls.Add(throttleMinResistanceNumericUpDown, 2, 12); + throttleTableLayoutPanel.Controls.Add(throttleMaxStiffnessNumericUpDown, 2, 11); + throttleTableLayoutPanel.Controls.Add(throttleMinStiffnessNumericUpDown, 2, 10); + throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothNumericUpDown, 2, 9); + throttleTableLayoutPanel.Controls.Add(throttleMaxVibrationNumericUpDown, 2, 8); + throttleTableLayoutPanel.Controls.Add(throttleMinVibrationNumericUpDown, 2, 7); + throttleTableLayoutPanel.Controls.Add(throttleVibrationStartNumericUpDown, 2, 6); + throttleTableLayoutPanel.Controls.Add(throttleAccelLimitNumericUpDown, 2, 5); + throttleTableLayoutPanel.Controls.Add(throttleForwardAccelScaleNumericUpDown, 2, 4); + throttleTableLayoutPanel.Controls.Add(throttleTurnAccelScaleNumericUpDown, 2, 3); + throttleTableLayoutPanel.Controls.Add(throttleGripLossNumericUpDown, 2, 2); + throttleTableLayoutPanel.Controls.Add(throttleIntensityNumericUpDown, 2, 1); + throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothTrackBar, 1, 14); + throttleTableLayoutPanel.Controls.Add(throttleMaxResistanceTrackBar, 1, 13); + throttleTableLayoutPanel.Controls.Add(throttleMinResistanceTrackBar, 1, 12); + throttleTableLayoutPanel.Controls.Add(throttleMaxStiffnessTrackBar, 1, 11); + throttleTableLayoutPanel.Controls.Add(throttleMinStiffnessTrackBar, 1, 10); + throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothTrackBar, 1, 9); + throttleTableLayoutPanel.Controls.Add(throttleMaxVibrationTrackBar, 1, 8); + throttleTableLayoutPanel.Controls.Add(throttleMinVibrationTrackBar, 1, 7); + throttleTableLayoutPanel.Controls.Add(throttleVibrationModeStartTrackBar, 1, 6); + throttleTableLayoutPanel.Controls.Add(throttleAccelLimitTrackBar, 1, 5); + throttleTableLayoutPanel.Controls.Add(throttleForwardAccelScaleTrackBar, 1, 4); + throttleTableLayoutPanel.Controls.Add(throttleTurnAccelScaleTrackBar, 1, 3); + throttleTableLayoutPanel.Controls.Add(throttleGripLossTrackBar, 1, 2); + throttleTableLayoutPanel.Controls.Add(throttleIntensityTrackBar, 1, 1); + throttleTableLayoutPanel.Controls.Add(throttleResistanceSmoothingLabel, 0, 14); + throttleTableLayoutPanel.Controls.Add(maxThrottleResistanceLabel, 0, 13); + throttleTableLayoutPanel.Controls.Add(minThrottleResistanceLabel, 0, 12); + throttleTableLayoutPanel.Controls.Add(maxThrottleStiffnessLabel, 0, 11); + throttleTableLayoutPanel.Controls.Add(minThrottleStiffnessLabel, 0, 10); + throttleTableLayoutPanel.Controls.Add(throttleVibrationSmoothingLabel, 0, 9); + throttleTableLayoutPanel.Controls.Add(maxThrottleVibrationLabel, 0, 8); + throttleTableLayoutPanel.Controls.Add(minThrottleVibrationLabel, 0, 7); + throttleTableLayoutPanel.Controls.Add(throttleVibrationStartLabel, 0, 6); + throttleTableLayoutPanel.Controls.Add(accelerationLimitLabel, 0, 5); + throttleTableLayoutPanel.Controls.Add(forwardAccelLabel, 0, 4); + throttleTableLayoutPanel.Controls.Add(turnAccelLabel, 0, 3); + throttleTableLayoutPanel.Controls.Add(throttleGripLossLabel, 0, 2); + throttleTableLayoutPanel.Controls.Add(throttleIntensityLabel, 0, 1); + throttleTableLayoutPanel.Controls.Add(buttonApply_Throttle, 1, 15); + throttleTableLayoutPanel.Controls.Add(throttleDefaultsButton, 2, 15); + throttleTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleTableLayoutPanel.Location = new System.Drawing.Point(4, 5); + throttleTableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleTableLayoutPanel.Name = "throttleTableLayoutPanel"; + throttleTableLayoutPanel.RowCount = 16; + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + throttleTableLayoutPanel.Size = new System.Drawing.Size(1014, 1225); + throttleTableLayoutPanel.TabIndex = 0; + // + // throttleTriggerModeComboBox + // + throttleTriggerModeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + throttleTriggerModeComboBox.FormattingEnabled = true; + throttleTriggerModeComboBox.Items.AddRange(new object[] { "Off", "Resistance", "Vibration" }); + throttleTriggerModeComboBox.Location = new System.Drawing.Point(209, 5); + throttleTriggerModeComboBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleTriggerModeComboBox.Name = "throttleTriggerModeComboBox"; + throttleTriggerModeComboBox.Size = new System.Drawing.Size(574, 33); + throttleTriggerModeComboBox.TabIndex = 46; + throttleTriggerModeComboBox.SelectedIndexChanged += throttleTriggerModeComboBox_SelectedIndexChanged; + // + // throttleTriggerMode + // + throttleTriggerMode.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + throttleTriggerMode.AutoSize = true; + throttleTriggerMode.Location = new System.Drawing.Point(17, 0); + throttleTriggerMode.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleTriggerMode.Name = "throttleTriggerMode"; + throttleTriggerMode.Size = new System.Drawing.Size(184, 43); + throttleTriggerMode.TabIndex = 45; + throttleTriggerMode.Text = "Throttle Trigger Mode"; + throttleTriggerMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // throttleResistanceSmoothNumericUpDown + // + throttleResistanceSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleResistanceSmoothNumericUpDown.AutoSize = true; + throttleResistanceSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleResistanceSmoothNumericUpDown.Location = new System.Drawing.Point(791, 1094); + throttleResistanceSmoothNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleResistanceSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + throttleResistanceSmoothNumericUpDown.Name = "throttleResistanceSmoothNumericUpDown"; + throttleResistanceSmoothNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleResistanceSmoothNumericUpDown.TabIndex = 42; + toolTip.SetToolTip(throttleResistanceSmoothNumericUpDown, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); + throttleResistanceSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + throttleResistanceSmoothNumericUpDown.ValueChanged += throttleResistanceSmoothNumericUpDown_ValueChanged; + // + // throttleMaxResistanceNumericUpDown + // + throttleMaxResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMaxResistanceNumericUpDown.AutoSize = true; + throttleMaxResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMaxResistanceNumericUpDown.Location = new System.Drawing.Point(791, 1015); + throttleMaxResistanceNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + throttleMaxResistanceNumericUpDown.Name = "throttleMaxResistanceNumericUpDown"; + throttleMaxResistanceNumericUpDown.Size = new System.Drawing.Size(46, 31); + throttleMaxResistanceNumericUpDown.TabIndex = 41; + toolTip.SetToolTip(throttleMaxResistanceNumericUpDown, "The Maximum resistance on the throttle (0-7)"); + throttleMaxResistanceNumericUpDown.ValueChanged += throttleMaxResistanceNumericUpDown_ValueChanged; + // + // throttleMinResistanceNumericUpDown + // + throttleMinResistanceNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMinResistanceNumericUpDown.AutoSize = true; + throttleMinResistanceNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMinResistanceNumericUpDown.Location = new System.Drawing.Point(791, 936); + throttleMinResistanceNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinResistanceNumericUpDown.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + throttleMinResistanceNumericUpDown.Name = "throttleMinResistanceNumericUpDown"; + throttleMinResistanceNumericUpDown.Size = new System.Drawing.Size(46, 31); + throttleMinResistanceNumericUpDown.TabIndex = 40; + toolTip.SetToolTip(throttleMinResistanceNumericUpDown, "The Minimum resistance on the throttle (0-7)"); + throttleMinResistanceNumericUpDown.ValueChanged += throttleMinResistanceNumericUpDown_ValueChanged; + // + // throttleMaxStiffnessNumericUpDown + // + throttleMaxStiffnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMaxStiffnessNumericUpDown.AutoSize = true; + throttleMaxStiffnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMaxStiffnessNumericUpDown.Location = new System.Drawing.Point(791, 857); + throttleMaxStiffnessNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxStiffnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + throttleMaxStiffnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + throttleMaxStiffnessNumericUpDown.Name = "throttleMaxStiffnessNumericUpDown"; + throttleMaxStiffnessNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleMaxStiffnessNumericUpDown.TabIndex = 39; + toolTip.SetToolTip(throttleMaxStiffnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); + throttleMaxStiffnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + throttleMaxStiffnessNumericUpDown.ValueChanged += throttleMaxStiffnessNumericUpDown_ValueChanged; + // + // throttleMinStiffnessNumericUpDown + // + throttleMinStiffnessNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMinStiffnessNumericUpDown.AutoSize = true; + throttleMinStiffnessNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMinStiffnessNumericUpDown.Location = new System.Drawing.Point(791, 778); + throttleMinStiffnessNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinStiffnessNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + throttleMinStiffnessNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + throttleMinStiffnessNumericUpDown.Name = "throttleMinStiffnessNumericUpDown"; + throttleMinStiffnessNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleMinStiffnessNumericUpDown.TabIndex = 38; + toolTip.SetToolTip(throttleMinStiffnessNumericUpDown, "On a scale of 1-255 with 1 being most stiff"); + throttleMinStiffnessNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + throttleMinStiffnessNumericUpDown.ValueChanged += throttleMinStiffnessNumericUpDown_ValueChanged; + // + // throttleVibrationSmoothNumericUpDown + // + throttleVibrationSmoothNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleVibrationSmoothNumericUpDown.AutoSize = true; + throttleVibrationSmoothNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleVibrationSmoothNumericUpDown.Location = new System.Drawing.Point(791, 699); + throttleVibrationSmoothNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleVibrationSmoothNumericUpDown.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + throttleVibrationSmoothNumericUpDown.Name = "throttleVibrationSmoothNumericUpDown"; + throttleVibrationSmoothNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleVibrationSmoothNumericUpDown.TabIndex = 37; + toolTip.SetToolTip(throttleVibrationSmoothNumericUpDown, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); + throttleVibrationSmoothNumericUpDown.Value = new decimal(new int[] { 1, 0, 0, 0 }); + throttleVibrationSmoothNumericUpDown.ValueChanged += throttleVibrationSmoothNumericUpDown_ValueChanged; + // + // throttleMaxVibrationNumericUpDown + // + throttleMaxVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMaxVibrationNumericUpDown.AutoSize = true; + throttleMaxVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMaxVibrationNumericUpDown.Location = new System.Drawing.Point(791, 620); + throttleMaxVibrationNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxVibrationNumericUpDown.Name = "throttleMaxVibrationNumericUpDown"; + throttleMaxVibrationNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleMaxVibrationNumericUpDown.TabIndex = 36; + toolTip.SetToolTip(throttleMaxVibrationNumericUpDown, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); + throttleMaxVibrationNumericUpDown.ValueChanged += throttleMaxVibrationNumericUpDown_ValueChanged; + // + // throttleMinVibrationNumericUpDown + // + throttleMinVibrationNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleMinVibrationNumericUpDown.AutoSize = true; + throttleMinVibrationNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleMinVibrationNumericUpDown.Location = new System.Drawing.Point(791, 541); + throttleMinVibrationNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinVibrationNumericUpDown.Name = "throttleMinVibrationNumericUpDown"; + throttleMinVibrationNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleMinVibrationNumericUpDown.TabIndex = 35; + toolTip.SetToolTip(throttleMinVibrationNumericUpDown, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + throttleMinVibrationNumericUpDown.ValueChanged += throttleMinVibrationNumericUpDown_ValueChanged; + // + // throttleVibrationStartNumericUpDown + // + throttleVibrationStartNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleVibrationStartNumericUpDown.AutoSize = true; + throttleVibrationStartNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleVibrationStartNumericUpDown.Location = new System.Drawing.Point(791, 462); + throttleVibrationStartNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleVibrationStartNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + throttleVibrationStartNumericUpDown.Name = "throttleVibrationStartNumericUpDown"; + throttleVibrationStartNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleVibrationStartNumericUpDown.TabIndex = 34; + toolTip.SetToolTip(throttleVibrationStartNumericUpDown, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); + throttleVibrationStartNumericUpDown.ValueChanged += throttleVibrationStartNumericUpDown_ValueChanged; + // + // throttleAccelLimitNumericUpDown + // + throttleAccelLimitNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleAccelLimitNumericUpDown.AutoSize = true; + throttleAccelLimitNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleAccelLimitNumericUpDown.Location = new System.Drawing.Point(791, 383); + throttleAccelLimitNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleAccelLimitNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 }); + throttleAccelLimitNumericUpDown.Name = "throttleAccelLimitNumericUpDown"; + throttleAccelLimitNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleAccelLimitNumericUpDown.TabIndex = 33; + toolTip.SetToolTip(throttleAccelLimitNumericUpDown, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); + throttleAccelLimitNumericUpDown.ValueChanged += throttleAccelLimitNumericUpDown_ValueChanged; + // + // throttleForwardAccelScaleNumericUpDown + // + throttleForwardAccelScaleNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleForwardAccelScaleNumericUpDown.AutoSize = true; + throttleForwardAccelScaleNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleForwardAccelScaleNumericUpDown.Location = new System.Drawing.Point(791, 304); + throttleForwardAccelScaleNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleForwardAccelScaleNumericUpDown.Name = "throttleForwardAccelScaleNumericUpDown"; + throttleForwardAccelScaleNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleForwardAccelScaleNumericUpDown.TabIndex = 32; + toolTip.SetToolTip(throttleForwardAccelScaleNumericUpDown, "How to scale Forward acceleration in determining throttle stiffness."); + throttleForwardAccelScaleNumericUpDown.ValueChanged += throttleForwardAccelScaleNumericUpDown_ValueChanged; + // + // throttleTurnAccelScaleNumericUpDown + // + throttleTurnAccelScaleNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleTurnAccelScaleNumericUpDown.AutoSize = true; + throttleTurnAccelScaleNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleTurnAccelScaleNumericUpDown.Location = new System.Drawing.Point(791, 225); + throttleTurnAccelScaleNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleTurnAccelScaleNumericUpDown.Name = "throttleTurnAccelScaleNumericUpDown"; + throttleTurnAccelScaleNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleTurnAccelScaleNumericUpDown.TabIndex = 31; + toolTip.SetToolTip(throttleTurnAccelScaleNumericUpDown, "How to scale turning acceleration in determining throttle stiffness."); + throttleTurnAccelScaleNumericUpDown.ValueChanged += throttleTurnAccelScaleNumericUpDown_ValueChanged; + // + // throttleGripLossNumericUpDown + // + throttleGripLossNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleGripLossNumericUpDown.AutoSize = true; + throttleGripLossNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleGripLossNumericUpDown.Location = new System.Drawing.Point(791, 146); + throttleGripLossNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleGripLossNumericUpDown.Name = "throttleGripLossNumericUpDown"; + throttleGripLossNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleGripLossNumericUpDown.TabIndex = 30; + toolTip.SetToolTip(throttleGripLossNumericUpDown, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); + throttleGripLossNumericUpDown.ValueChanged += throttleGripLossNumericUpDown_ValueChanged; + // + // throttleIntensityNumericUpDown + // + throttleIntensityNumericUpDown.Anchor = System.Windows.Forms.AnchorStyles.Left; + throttleIntensityNumericUpDown.AutoSize = true; + throttleIntensityNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; + throttleIntensityNumericUpDown.Location = new System.Drawing.Point(791, 67); + throttleIntensityNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleIntensityNumericUpDown.Name = "throttleIntensityNumericUpDown"; + throttleIntensityNumericUpDown.Size = new System.Drawing.Size(66, 31); + throttleIntensityNumericUpDown.TabIndex = 29; + toolTip.SetToolTip(throttleIntensityNumericUpDown, "The percentage of the trigger effects"); + throttleIntensityNumericUpDown.ValueChanged += throttleIntensityNumericUpDown_ValueChanged; + // + // throttleResistanceSmoothTrackBar + // + throttleResistanceSmoothTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleResistanceSmoothTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleResistanceSmoothTrackBar.LargeChange = 50; + throttleResistanceSmoothTrackBar.Location = new System.Drawing.Point(209, 1075); + throttleResistanceSmoothTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleResistanceSmoothTrackBar.Maximum = 100; + throttleResistanceSmoothTrackBar.Minimum = 1; + throttleResistanceSmoothTrackBar.Name = "throttleResistanceSmoothTrackBar"; + throttleResistanceSmoothTrackBar.Size = new System.Drawing.Size(574, 69); + throttleResistanceSmoothTrackBar.TabIndex = 28; + throttleResistanceSmoothTrackBar.TickFrequency = 10; + throttleResistanceSmoothTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleResistanceSmoothTrackBar, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); + throttleResistanceSmoothTrackBar.Value = 1; + throttleResistanceSmoothTrackBar.Scroll += throttleResistanceSmoothTrackBar_Scroll; + // + // throttleMaxResistanceTrackBar + // + throttleMaxResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMaxResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMaxResistanceTrackBar.LargeChange = 50; + throttleMaxResistanceTrackBar.Location = new System.Drawing.Point(209, 996); + throttleMaxResistanceTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxResistanceTrackBar.Maximum = 7; + throttleMaxResistanceTrackBar.Name = "throttleMaxResistanceTrackBar"; + throttleMaxResistanceTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMaxResistanceTrackBar.TabIndex = 27; + throttleMaxResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMaxResistanceTrackBar, "The Maximum resistance on the throttle (0-7)"); + throttleMaxResistanceTrackBar.Scroll += throttleMaxResistanceTrackBar_Scroll; + // + // throttleMinResistanceTrackBar + // + throttleMinResistanceTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMinResistanceTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMinResistanceTrackBar.LargeChange = 50; + throttleMinResistanceTrackBar.Location = new System.Drawing.Point(209, 917); + throttleMinResistanceTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinResistanceTrackBar.Maximum = 7; + throttleMinResistanceTrackBar.Name = "throttleMinResistanceTrackBar"; + throttleMinResistanceTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMinResistanceTrackBar.TabIndex = 26; + throttleMinResistanceTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMinResistanceTrackBar, "The Minimum resistance on the throttle (0-7)"); + throttleMinResistanceTrackBar.Scroll += throttleMinResistanceTrackBar_Scroll; + // + // throttleMaxStiffnessTrackBar + // + throttleMaxStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMaxStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMaxStiffnessTrackBar.LargeChange = 50; + throttleMaxStiffnessTrackBar.Location = new System.Drawing.Point(209, 838); + throttleMaxStiffnessTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxStiffnessTrackBar.Maximum = 255; + throttleMaxStiffnessTrackBar.Minimum = 1; + throttleMaxStiffnessTrackBar.Name = "throttleMaxStiffnessTrackBar"; + throttleMaxStiffnessTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMaxStiffnessTrackBar.TabIndex = 25; + throttleMaxStiffnessTrackBar.TickFrequency = 5; + throttleMaxStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMaxStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); + throttleMaxStiffnessTrackBar.Value = 1; + throttleMaxStiffnessTrackBar.Scroll += throttleMaxStiffnessTrackBar_Scroll; + // + // throttleMinStiffnessTrackBar + // + throttleMinStiffnessTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMinStiffnessTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMinStiffnessTrackBar.LargeChange = 50; + throttleMinStiffnessTrackBar.Location = new System.Drawing.Point(209, 759); + throttleMinStiffnessTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinStiffnessTrackBar.Maximum = 255; + throttleMinStiffnessTrackBar.Minimum = 1; + throttleMinStiffnessTrackBar.Name = "throttleMinStiffnessTrackBar"; + throttleMinStiffnessTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMinStiffnessTrackBar.TabIndex = 24; + throttleMinStiffnessTrackBar.TickFrequency = 5; + throttleMinStiffnessTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMinStiffnessTrackBar, "On a scale of 1-255 with 1 being most stiff"); + throttleMinStiffnessTrackBar.Value = 1; + throttleMinStiffnessTrackBar.Scroll += throttleMinStiffnessTrackBar_Scroll; + // + // throttleVibrationSmoothTrackBar + // + throttleVibrationSmoothTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleVibrationSmoothTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleVibrationSmoothTrackBar.LargeChange = 50; + throttleVibrationSmoothTrackBar.Location = new System.Drawing.Point(209, 680); + throttleVibrationSmoothTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleVibrationSmoothTrackBar.Maximum = 100; + throttleVibrationSmoothTrackBar.Minimum = 1; + throttleVibrationSmoothTrackBar.Name = "throttleVibrationSmoothTrackBar"; + throttleVibrationSmoothTrackBar.Size = new System.Drawing.Size(574, 69); + throttleVibrationSmoothTrackBar.TabIndex = 23; + throttleVibrationSmoothTrackBar.TickFrequency = 10; + throttleVibrationSmoothTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleVibrationSmoothTrackBar, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); + throttleVibrationSmoothTrackBar.Value = 1; + throttleVibrationSmoothTrackBar.Scroll += throttleVibrationSmoothTrackBar_Scroll; + // + // throttleMaxVibrationTrackBar + // + throttleMaxVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMaxVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMaxVibrationTrackBar.LargeChange = 50; + throttleMaxVibrationTrackBar.Location = new System.Drawing.Point(209, 601); + throttleMaxVibrationTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMaxVibrationTrackBar.Maximum = 100; + throttleMaxVibrationTrackBar.Name = "throttleMaxVibrationTrackBar"; + throttleMaxVibrationTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMaxVibrationTrackBar.TabIndex = 22; + throttleMaxVibrationTrackBar.TickFrequency = 5; + throttleMaxVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMaxVibrationTrackBar, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); + throttleMaxVibrationTrackBar.Scroll += throttleMaxVibrationTrackBar_Scroll; + // + // throttleMinVibrationTrackBar + // + throttleMinVibrationTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleMinVibrationTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleMinVibrationTrackBar.LargeChange = 50; + throttleMinVibrationTrackBar.Location = new System.Drawing.Point(209, 522); + throttleMinVibrationTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleMinVibrationTrackBar.Maximum = 100; + throttleMinVibrationTrackBar.Name = "throttleMinVibrationTrackBar"; + throttleMinVibrationTrackBar.Size = new System.Drawing.Size(574, 69); + throttleMinVibrationTrackBar.TabIndex = 21; + throttleMinVibrationTrackBar.TickFrequency = 5; + throttleMinVibrationTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleMinVibrationTrackBar, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + throttleMinVibrationTrackBar.Scroll += throttleMinVibrationTrackBar_Scroll; + // + // throttleVibrationModeStartTrackBar + // + throttleVibrationModeStartTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleVibrationModeStartTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleVibrationModeStartTrackBar.LargeChange = 50; + throttleVibrationModeStartTrackBar.Location = new System.Drawing.Point(209, 443); + throttleVibrationModeStartTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleVibrationModeStartTrackBar.Maximum = 255; + throttleVibrationModeStartTrackBar.Name = "throttleVibrationModeStartTrackBar"; + throttleVibrationModeStartTrackBar.Size = new System.Drawing.Size(574, 69); + throttleVibrationModeStartTrackBar.TabIndex = 20; + throttleVibrationModeStartTrackBar.TickFrequency = 5; + throttleVibrationModeStartTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleVibrationModeStartTrackBar, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); + throttleVibrationModeStartTrackBar.Scroll += throttleVibrationModeStartTrackBar_Scroll; + // + // throttleAccelLimitTrackBar + // + throttleAccelLimitTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleAccelLimitTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleAccelLimitTrackBar.LargeChange = 50; + throttleAccelLimitTrackBar.Location = new System.Drawing.Point(209, 364); + throttleAccelLimitTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleAccelLimitTrackBar.Maximum = 255; + throttleAccelLimitTrackBar.Name = "throttleAccelLimitTrackBar"; + throttleAccelLimitTrackBar.Size = new System.Drawing.Size(574, 69); + throttleAccelLimitTrackBar.TabIndex = 19; + throttleAccelLimitTrackBar.TickFrequency = 5; + throttleAccelLimitTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleAccelLimitTrackBar, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); + throttleAccelLimitTrackBar.Scroll += throttleAccelLimitTrackBar_Scroll; + // + // throttleForwardAccelScaleTrackBar + // + throttleForwardAccelScaleTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleForwardAccelScaleTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleForwardAccelScaleTrackBar.Location = new System.Drawing.Point(209, 285); + throttleForwardAccelScaleTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleForwardAccelScaleTrackBar.Maximum = 100; + throttleForwardAccelScaleTrackBar.Name = "throttleForwardAccelScaleTrackBar"; + throttleForwardAccelScaleTrackBar.Size = new System.Drawing.Size(574, 69); + throttleForwardAccelScaleTrackBar.TabIndex = 18; + throttleForwardAccelScaleTrackBar.TickFrequency = 5; + throttleForwardAccelScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleForwardAccelScaleTrackBar, "How to scale Forward acceleration in determining throttle stiffness."); + throttleForwardAccelScaleTrackBar.Value = 50; + throttleForwardAccelScaleTrackBar.Scroll += throttleForwardAccelScaleTrackBar_Scroll; + // + // throttleTurnAccelScaleTrackBar + // + throttleTurnAccelScaleTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleTurnAccelScaleTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleTurnAccelScaleTrackBar.Location = new System.Drawing.Point(209, 206); + throttleTurnAccelScaleTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleTurnAccelScaleTrackBar.Maximum = 100; + throttleTurnAccelScaleTrackBar.Name = "throttleTurnAccelScaleTrackBar"; + throttleTurnAccelScaleTrackBar.Size = new System.Drawing.Size(574, 69); + throttleTurnAccelScaleTrackBar.TabIndex = 17; + throttleTurnAccelScaleTrackBar.TickFrequency = 5; + throttleTurnAccelScaleTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleTurnAccelScaleTrackBar, "How to scale turning acceleration in determining throttle stiffness."); + throttleTurnAccelScaleTrackBar.Value = 50; + throttleTurnAccelScaleTrackBar.Scroll += throttleTurnAccelScaleTrackBar_Scroll; + // + // throttleGripLossTrackBar + // + throttleGripLossTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleGripLossTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleGripLossTrackBar.LargeChange = 50; + throttleGripLossTrackBar.Location = new System.Drawing.Point(209, 127); + throttleGripLossTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleGripLossTrackBar.Maximum = 100; + throttleGripLossTrackBar.Name = "throttleGripLossTrackBar"; + throttleGripLossTrackBar.Size = new System.Drawing.Size(574, 69); + throttleGripLossTrackBar.TabIndex = 16; + throttleGripLossTrackBar.TickFrequency = 5; + throttleGripLossTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleGripLossTrackBar, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); + throttleGripLossTrackBar.Scroll += throttleGripLossTrackBar_Scroll; + // + // throttleIntensityTrackBar + // + throttleIntensityTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; + throttleIntensityTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; + throttleIntensityTrackBar.LargeChange = 10; + throttleIntensityTrackBar.Location = new System.Drawing.Point(209, 48); + throttleIntensityTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleIntensityTrackBar.Maximum = 100; + throttleIntensityTrackBar.Name = "throttleIntensityTrackBar"; + throttleIntensityTrackBar.Size = new System.Drawing.Size(574, 69); + throttleIntensityTrackBar.TabIndex = 2; + throttleIntensityTrackBar.TickFrequency = 5; + throttleIntensityTrackBar.TickStyle = System.Windows.Forms.TickStyle.Both; + toolTip.SetToolTip(throttleIntensityTrackBar, "The percentage of the trigger effects"); + throttleIntensityTrackBar.Value = 100; + throttleIntensityTrackBar.Scroll += throttleIntensityTrackBar_Scroll; + // + // throttleResistanceSmoothingLabel + // + throttleResistanceSmoothingLabel.AutoSize = true; + throttleResistanceSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleResistanceSmoothingLabel.Location = new System.Drawing.Point(4, 1070); + throttleResistanceSmoothingLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleResistanceSmoothingLabel.Name = "throttleResistanceSmoothingLabel"; + throttleResistanceSmoothingLabel.Size = new System.Drawing.Size(197, 79); + throttleResistanceSmoothingLabel.TabIndex = 15; + throttleResistanceSmoothingLabel.Text = "Resistance Smoothing"; + throttleResistanceSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(throttleResistanceSmoothingLabel, "Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0"); + // + // maxThrottleResistanceLabel + // + maxThrottleResistanceLabel.AutoSize = true; + maxThrottleResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxThrottleResistanceLabel.Location = new System.Drawing.Point(4, 991); + maxThrottleResistanceLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxThrottleResistanceLabel.Name = "maxThrottleResistanceLabel"; + maxThrottleResistanceLabel.Size = new System.Drawing.Size(197, 79); + maxThrottleResistanceLabel.TabIndex = 14; + maxThrottleResistanceLabel.Text = "Max Throttle Resistance"; + maxThrottleResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxThrottleResistanceLabel, "The Maximum resistance on the throttle (0-7)"); + // + // minThrottleResistanceLabel + // + minThrottleResistanceLabel.AutoSize = true; + minThrottleResistanceLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minThrottleResistanceLabel.Location = new System.Drawing.Point(4, 912); + minThrottleResistanceLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minThrottleResistanceLabel.Name = "minThrottleResistanceLabel"; + minThrottleResistanceLabel.Size = new System.Drawing.Size(197, 79); + minThrottleResistanceLabel.TabIndex = 13; + minThrottleResistanceLabel.Text = "Min Throttle Resistance"; + minThrottleResistanceLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minThrottleResistanceLabel, "The Minimum resistance on the throttle (0-7)"); + // + // maxThrottleStiffnessLabel + // + maxThrottleStiffnessLabel.AutoSize = true; + maxThrottleStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxThrottleStiffnessLabel.Location = new System.Drawing.Point(4, 833); + maxThrottleStiffnessLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxThrottleStiffnessLabel.Name = "maxThrottleStiffnessLabel"; + maxThrottleStiffnessLabel.Size = new System.Drawing.Size(197, 79); + maxThrottleStiffnessLabel.TabIndex = 12; + maxThrottleStiffnessLabel.Text = "Max Throttle Stiffness"; + maxThrottleStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxThrottleStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); + // + // minThrottleStiffnessLabel + // + minThrottleStiffnessLabel.AutoSize = true; + minThrottleStiffnessLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minThrottleStiffnessLabel.Location = new System.Drawing.Point(4, 754); + minThrottleStiffnessLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minThrottleStiffnessLabel.Name = "minThrottleStiffnessLabel"; + minThrottleStiffnessLabel.Size = new System.Drawing.Size(197, 79); + minThrottleStiffnessLabel.TabIndex = 11; + minThrottleStiffnessLabel.Text = "Min Throttle Stiffness"; + minThrottleStiffnessLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minThrottleStiffnessLabel, "On a scale of 1-255 with 1 being most stiff"); + // + // throttleVibrationSmoothingLabel + // + throttleVibrationSmoothingLabel.AutoSize = true; + throttleVibrationSmoothingLabel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleVibrationSmoothingLabel.Location = new System.Drawing.Point(4, 675); + throttleVibrationSmoothingLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleVibrationSmoothingLabel.Name = "throttleVibrationSmoothingLabel"; + throttleVibrationSmoothingLabel.Size = new System.Drawing.Size(197, 79); + throttleVibrationSmoothingLabel.TabIndex = 10; + throttleVibrationSmoothingLabel.Text = "Vibration Smoothing"; + throttleVibrationSmoothingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(throttleVibrationSmoothingLabel, "Smoothing for Throttle Vibration output. Lower = smoother. Must be greater than 0"); + // + // maxThrottleVibrationLabel + // + maxThrottleVibrationLabel.AutoSize = true; + maxThrottleVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; + maxThrottleVibrationLabel.Location = new System.Drawing.Point(4, 596); + maxThrottleVibrationLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + maxThrottleVibrationLabel.Name = "maxThrottleVibrationLabel"; + maxThrottleVibrationLabel.Size = new System.Drawing.Size(197, 79); + maxThrottleVibrationLabel.TabIndex = 9; + maxThrottleVibrationLabel.Text = "Max Throttle Vibration"; + maxThrottleVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(maxThrottleVibrationLabel, "The maximum acceleration frequency in Hz (avoid over 40). Correlates to better grip"); + // + // minThrottleVibrationLabel + // + minThrottleVibrationLabel.AutoSize = true; + minThrottleVibrationLabel.Dock = System.Windows.Forms.DockStyle.Fill; + minThrottleVibrationLabel.Location = new System.Drawing.Point(4, 517); + minThrottleVibrationLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + minThrottleVibrationLabel.Name = "minThrottleVibrationLabel"; + minThrottleVibrationLabel.Size = new System.Drawing.Size(197, 79); + minThrottleVibrationLabel.TabIndex = 8; + minThrottleVibrationLabel.Text = "Min Throttle Vibration"; + minThrottleVibrationLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(minThrottleVibrationLabel, "The minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller"); + // + // throttleVibrationStartLabel + // + throttleVibrationStartLabel.AutoSize = true; + throttleVibrationStartLabel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleVibrationStartLabel.Location = new System.Drawing.Point(4, 438); + throttleVibrationStartLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleVibrationStartLabel.Name = "throttleVibrationStartLabel"; + throttleVibrationStartLabel.Size = new System.Drawing.Size(197, 79); + throttleVibrationStartLabel.TabIndex = 7; + throttleVibrationStartLabel.Text = "Vibration Mode Start"; + throttleVibrationStartLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(throttleVibrationStartLabel, "The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied."); + // + // accelerationLimitLabel + // + accelerationLimitLabel.AutoSize = true; + accelerationLimitLabel.Dock = System.Windows.Forms.DockStyle.Fill; + accelerationLimitLabel.Location = new System.Drawing.Point(4, 359); + accelerationLimitLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + accelerationLimitLabel.Name = "accelerationLimitLabel"; + accelerationLimitLabel.Size = new System.Drawing.Size(197, 79); + accelerationLimitLabel.TabIndex = 5; + accelerationLimitLabel.Text = "Accel Limit"; + accelerationLimitLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(accelerationLimitLabel, "The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance."); + // + // forwardAccelLabel + // + forwardAccelLabel.AutoSize = true; + forwardAccelLabel.Dock = System.Windows.Forms.DockStyle.Fill; + forwardAccelLabel.Location = new System.Drawing.Point(4, 280); + forwardAccelLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + forwardAccelLabel.Name = "forwardAccelLabel"; + forwardAccelLabel.Size = new System.Drawing.Size(197, 79); + forwardAccelLabel.TabIndex = 6; + forwardAccelLabel.Text = "Forward Accel Scale"; + forwardAccelLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(forwardAccelLabel, "How to scale Forward acceleration in determining throttle stiffness."); + // + // turnAccelLabel + // + turnAccelLabel.AutoSize = true; + turnAccelLabel.Dock = System.Windows.Forms.DockStyle.Fill; + turnAccelLabel.Location = new System.Drawing.Point(4, 201); + turnAccelLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + turnAccelLabel.Name = "turnAccelLabel"; + turnAccelLabel.Size = new System.Drawing.Size(197, 79); + turnAccelLabel.TabIndex = 4; + turnAccelLabel.Text = "Turn Accel Scale"; + turnAccelLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(turnAccelLabel, "How to scale turning acceleration in determining throttle stiffness."); + // + // throttleGripLossLabel + // + throttleGripLossLabel.AutoSize = true; + throttleGripLossLabel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleGripLossLabel.Location = new System.Drawing.Point(4, 122); + throttleGripLossLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleGripLossLabel.Name = "throttleGripLossLabel"; + throttleGripLossLabel.Size = new System.Drawing.Size(197, 79); + throttleGripLossLabel.TabIndex = 3; + throttleGripLossLabel.Text = "Grip Loss Value"; + throttleGripLossLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(throttleGripLossLabel, "The point at which the throttle will begin to become choppy (0 = full grip, 100 = no grip)"); + // + // throttleIntensityLabel + // + throttleIntensityLabel.AutoSize = true; + throttleIntensityLabel.Dock = System.Windows.Forms.DockStyle.Fill; + throttleIntensityLabel.Location = new System.Drawing.Point(4, 43); + throttleIntensityLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleIntensityLabel.Name = "throttleIntensityLabel"; + throttleIntensityLabel.Size = new System.Drawing.Size(197, 79); + throttleIntensityLabel.TabIndex = 1; + throttleIntensityLabel.Text = "Effect Intensity"; + throttleIntensityLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(throttleIntensityLabel, "The percentage of the trigger effects"); + // + // buttonApply_Throttle + // + buttonApply_Throttle.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + buttonApply_Throttle.Location = new System.Drawing.Point(209, 1154); + buttonApply_Throttle.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + buttonApply_Throttle.Name = "buttonApply_Throttle"; + buttonApply_Throttle.Size = new System.Drawing.Size(574, 38); + buttonApply_Throttle.TabIndex = 43; + buttonApply_Throttle.Text = "Apply"; + buttonApply_Throttle.UseVisualStyleBackColor = true; + buttonApply_Throttle.Click += buttonApply_Throttle_Click; + // + // throttleDefaultsButton + // + throttleDefaultsButton.Location = new System.Drawing.Point(791, 1154); + throttleDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + throttleDefaultsButton.Name = "throttleDefaultsButton"; + throttleDefaultsButton.Size = new System.Drawing.Size(107, 38); + throttleDefaultsButton.TabIndex = 44; + throttleDefaultsButton.Text = "Defaults"; + throttleDefaultsButton.UseVisualStyleBackColor = true; + throttleDefaultsButton.Click += throttleDefaultsButton_Click; + // + // outputTabPage + // + outputTabPage.Controls.Add(raceGroupBox); + outputTabPage.Controls.Add(noRaceGroupBox); + outputTabPage.Controls.Add(outputListBox); + outputTabPage.Location = new System.Drawing.Point(4, 34); + outputTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + outputTabPage.Name = "outputTabPage"; + outputTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + outputTabPage.Size = new System.Drawing.Size(1022, 1235); + outputTabPage.TabIndex = 1; + outputTabPage.Text = "Output"; + outputTabPage.UseVisualStyleBackColor = true; + // + // raceGroupBox + // + raceGroupBox.Controls.Add(tableLayoutPanel1); + raceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; + raceGroupBox.Location = new System.Drawing.Point(4, 609); + raceGroupBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + raceGroupBox.Name = "raceGroupBox"; + raceGroupBox.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + raceGroupBox.Size = new System.Drawing.Size(1014, 454); + raceGroupBox.TabIndex = 3; + raceGroupBox.TabStop = false; + raceGroupBox.Text = "Racing"; + // + // tableLayoutPanel1 + // + tableLayoutPanel1.ColumnCount = 1; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 29F)); + tableLayoutPanel1.Controls.Add(brakeMsg, 0, 3); + tableLayoutPanel1.Controls.Add(brakeVibrationMsg, 0, 2); + tableLayoutPanel1.Controls.Add(throttleMsg, 0, 1); + tableLayoutPanel1.Controls.Add(throttleVibrationMsg, 0, 0); + tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + tableLayoutPanel1.Location = new System.Drawing.Point(4, 29); + tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 4; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.Size = new System.Drawing.Size(1006, 420); + tableLayoutPanel1.TabIndex = 0; + // + // brakeMsg + // + brakeMsg.AutoSize = true; + brakeMsg.Location = new System.Drawing.Point(4, 75); + brakeMsg.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeMsg.Name = "brakeMsg"; + brakeMsg.Size = new System.Drawing.Size(59, 25); + brakeMsg.TabIndex = 3; + brakeMsg.Text = "label1"; + // + // brakeVibrationMsg + // + brakeVibrationMsg.AutoSize = true; + brakeVibrationMsg.Location = new System.Drawing.Point(4, 50); + brakeVibrationMsg.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + brakeVibrationMsg.Name = "brakeVibrationMsg"; + brakeVibrationMsg.Size = new System.Drawing.Size(59, 25); + brakeVibrationMsg.TabIndex = 2; + brakeVibrationMsg.Text = "label1"; + // + // throttleMsg + // + throttleMsg.AutoSize = true; + throttleMsg.Location = new System.Drawing.Point(4, 25); + throttleMsg.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleMsg.Name = "throttleMsg"; + throttleMsg.Size = new System.Drawing.Size(59, 25); + throttleMsg.TabIndex = 1; + throttleMsg.Text = "label1"; + // + // throttleVibrationMsg + // + throttleVibrationMsg.AutoSize = true; + throttleVibrationMsg.Location = new System.Drawing.Point(4, 0); + throttleVibrationMsg.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + throttleVibrationMsg.Name = "throttleVibrationMsg"; + throttleVibrationMsg.Size = new System.Drawing.Size(59, 25); + throttleVibrationMsg.TabIndex = 0; + throttleVibrationMsg.Text = "label1"; + // + // noRaceGroupBox + // + noRaceGroupBox.Controls.Add(noRaceText); + noRaceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; + noRaceGroupBox.Location = new System.Drawing.Point(4, 1063); + noRaceGroupBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + noRaceGroupBox.Name = "noRaceGroupBox"; + noRaceGroupBox.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); + noRaceGroupBox.Size = new System.Drawing.Size(1014, 167); + noRaceGroupBox.TabIndex = 2; + noRaceGroupBox.TabStop = false; + noRaceGroupBox.Text = "Menus"; + // + // noRaceText + // + noRaceText.AutoSize = true; + noRaceText.Dock = System.Windows.Forms.DockStyle.Fill; + noRaceText.Location = new System.Drawing.Point(4, 29); + noRaceText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + noRaceText.Name = "noRaceText"; + noRaceText.Size = new System.Drawing.Size(59, 25); + noRaceText.TabIndex = 1; + noRaceText.Text = "label1"; + // + // outputListBox + // + outputListBox.Dock = System.Windows.Forms.DockStyle.Top; + outputListBox.FormattingEnabled = true; + outputListBox.ItemHeight = 25; + outputListBox.Location = new System.Drawing.Point(4, 5); + outputListBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + outputListBox.Name = "outputListBox"; + outputListBox.Size = new System.Drawing.Size(1014, 1054); + outputListBox.TabIndex = 0; + // + // toolStripStatusDSX + // + toolStripStatusDSX.Image = Properties.Resources.redBtn; + toolStripStatusDSX.Name = "toolStripStatusDSX"; + toolStripStatusDSX.Size = new System.Drawing.Size(169, 25); + toolStripStatusDSX.Text = "DSX Connection:"; + toolStripStatusDSX.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; + // + // toolStripStatusForza + // + toolStripStatusForza.Image = Properties.Resources.redBtn; + toolStripStatusForza.Name = "toolStripStatusForza"; + toolStripStatusForza.Size = new System.Drawing.Size(178, 25); + toolStripStatusForza.Text = "Forza Connection:"; + toolStripStatusForza.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; + // + // toolStripVerboseMode + // + toolStripVerboseMode.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + toolStripVerboseMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { verboseModeOffToolStripMenuItem, verboseModeLowToolStripMenuItem, verboseModeFullToolStripMenuItem }); + toolStripVerboseMode.ImageTransparentColor = System.Drawing.Color.Magenta; + toolStripVerboseMode.Name = "toolStripVerboseMode"; + toolStripVerboseMode.Size = new System.Drawing.Size(146, 29); + toolStripVerboseMode.Text = "Verbose Mode"; + // + // verboseModeOffToolStripMenuItem + // + verboseModeOffToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + verboseModeOffToolStripMenuItem.Name = "verboseModeOffToolStripMenuItem"; + verboseModeOffToolStripMenuItem.Size = new System.Drawing.Size(215, 34); + verboseModeOffToolStripMenuItem.Text = "Off"; + verboseModeOffToolStripMenuItem.Click += verboseModeOffToolStripMenuItem_Click; + // + // verboseModeLowToolStripMenuItem + // + verboseModeLowToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + verboseModeLowToolStripMenuItem.Name = "verboseModeLowToolStripMenuItem"; + verboseModeLowToolStripMenuItem.Size = new System.Drawing.Size(215, 34); + verboseModeLowToolStripMenuItem.Text = "Low Verbose"; + verboseModeLowToolStripMenuItem.Click += verboseModeLowToolStripMenuItem_Click; + // + // verboseModeFullToolStripMenuItem + // + verboseModeFullToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + verboseModeFullToolStripMenuItem.Name = "verboseModeFullToolStripMenuItem"; + verboseModeFullToolStripMenuItem.Size = new System.Drawing.Size(215, 34); + verboseModeFullToolStripMenuItem.Text = "Full Verbose"; + verboseModeFullToolStripMenuItem.Click += verboseModeFullToolStripMenuItem_Click; + // + // statusStrip1 + // + statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); + statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusDSX, toolStripStatusForza, toolStripVerboseMode }); + statusStrip1.Location = new System.Drawing.Point(0, 1273); + statusStrip1.Name = "statusStrip1"; + statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 20, 0); + statusStrip1.Size = new System.Drawing.Size(1030, 32); + statusStrip1.TabIndex = 0; + statusStrip1.Text = "statusStrip1"; + // + // UI + // + AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(1030, 1305); + Controls.Add(mainPanel); + Controls.Add(statusStrip1); + DoubleBuffered = true; + Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + MinimumSize = new System.Drawing.Size(491, 296); + Name = "UI"; + Text = "UI"; + Load += UI_Load; + mainPanel.ResumeLayout(false); + mainTabControl.ResumeLayout(false); + miscTabPage.ResumeLayout(false); + miscTabPage.PerformLayout(); + miscTableLayoutPanel.ResumeLayout(false); + miscTableLayoutPanel.PerformLayout(); + ((ISupportInitialize)forzaPortNumericUpDown).EndInit(); + ((ISupportInitialize)rpmTrackBar).EndInit(); + ((ISupportInitialize)dsxNumericUpDown).EndInit(); + ((ISupportInitialize)rpmValueNumericUpDown).EndInit(); + brakeConfigTabPage.ResumeLayout(false); + brakeConfigTabPage.PerformLayout(); + brakeTableLayoutPanel.ResumeLayout(false); + brakeTableLayoutPanel.PerformLayout(); + ((ISupportInitialize)brakeResistanceSmoothNumericUpDown).EndInit(); + ((ISupportInitialize)maxBrakeResistanceNumericUpDown).EndInit(); + ((ISupportInitialize)minBrakeResistanceNumericUpDown).EndInit(); + ((ISupportInitialize)maxBrakeStifnessNumericUpDown).EndInit(); + ((ISupportInitialize)minBrakeStifnessNumericUpDown).EndInit(); + ((ISupportInitialize)brakeVibrationSmoothNumericUpDown).EndInit(); + ((ISupportInitialize)maxBrakeVibrationNumericUpDown).EndInit(); + ((ISupportInitialize)minBrakeVibrationNumericUpDown).EndInit(); + ((ISupportInitialize)brakeVibrationModeNumericUpDown).EndInit(); + ((ISupportInitialize)brakeVibrationStartNumericUpDown).EndInit(); + ((ISupportInitialize)gripLossNumericUpDown).EndInit(); + ((ISupportInitialize)brakeEffectNumericUpDown).EndInit(); + ((ISupportInitialize)brakeResistanceSmoothingTrackBar).EndInit(); + ((ISupportInitialize)maxBrakeResistanceTrackBar).EndInit(); + ((ISupportInitialize)minBrakeResistanceTrackBar).EndInit(); + ((ISupportInitialize)maxBrakeStiffnessTrackBar).EndInit(); + ((ISupportInitialize)minBrakeStiffnessTrackBar).EndInit(); + ((ISupportInitialize)vibrationSmoothingTrackBar).EndInit(); + ((ISupportInitialize)maxBrakeVibrationTrackBar).EndInit(); + ((ISupportInitialize)minBrakeVibrationTrackBar).EndInit(); + ((ISupportInitialize)brakeVibrationModeTrackBar).EndInit(); + ((ISupportInitialize)brakeVibrationStartTrackBar).EndInit(); + ((ISupportInitialize)gripLossTrackBar).EndInit(); + ((ISupportInitialize)brakeEffectIntensityTrackBar).EndInit(); + throttleConfigTabPage.ResumeLayout(false); + throttleTableLayoutPanel.ResumeLayout(false); + throttleTableLayoutPanel.PerformLayout(); + ((ISupportInitialize)throttleResistanceSmoothNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMaxResistanceNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMinResistanceNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMaxStiffnessNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMinStiffnessNumericUpDown).EndInit(); + ((ISupportInitialize)throttleVibrationSmoothNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMaxVibrationNumericUpDown).EndInit(); + ((ISupportInitialize)throttleMinVibrationNumericUpDown).EndInit(); + ((ISupportInitialize)throttleVibrationStartNumericUpDown).EndInit(); + ((ISupportInitialize)throttleAccelLimitNumericUpDown).EndInit(); + ((ISupportInitialize)throttleForwardAccelScaleNumericUpDown).EndInit(); + ((ISupportInitialize)throttleTurnAccelScaleNumericUpDown).EndInit(); + ((ISupportInitialize)throttleGripLossNumericUpDown).EndInit(); + ((ISupportInitialize)throttleIntensityNumericUpDown).EndInit(); + ((ISupportInitialize)throttleResistanceSmoothTrackBar).EndInit(); + ((ISupportInitialize)throttleMaxResistanceTrackBar).EndInit(); + ((ISupportInitialize)throttleMinResistanceTrackBar).EndInit(); + ((ISupportInitialize)throttleMaxStiffnessTrackBar).EndInit(); + ((ISupportInitialize)throttleMinStiffnessTrackBar).EndInit(); + ((ISupportInitialize)throttleVibrationSmoothTrackBar).EndInit(); + ((ISupportInitialize)throttleMaxVibrationTrackBar).EndInit(); + ((ISupportInitialize)throttleMinVibrationTrackBar).EndInit(); + ((ISupportInitialize)throttleVibrationModeStartTrackBar).EndInit(); + ((ISupportInitialize)throttleAccelLimitTrackBar).EndInit(); + ((ISupportInitialize)throttleForwardAccelScaleTrackBar).EndInit(); + ((ISupportInitialize)throttleTurnAccelScaleTrackBar).EndInit(); + ((ISupportInitialize)throttleGripLossTrackBar).EndInit(); + ((ISupportInitialize)throttleIntensityTrackBar).EndInit(); + outputTabPage.ResumeLayout(false); + raceGroupBox.ResumeLayout(false); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + noRaceGroupBox.ResumeLayout(false); + noRaceGroupBox.PerformLayout(); + statusStrip1.ResumeLayout(false); + statusStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } - #endregion - //private System.ComponentModel.BackgroundWorker mainWorker; - //private System.ComponentModel.BackgroundWorker connectionWorker; - private System.Windows.Forms.Panel mainPanel; + #endregion + //private System.ComponentModel.BackgroundWorker mainWorker; + //private System.ComponentModel.BackgroundWorker connectionWorker; + private System.Windows.Forms.Panel mainPanel; private System.Windows.Forms.TabControl mainTabControl; private System.Windows.Forms.TabPage brakeConfigTabPage; private System.Windows.Forms.TabPage outputTabPage; diff --git a/UI.resx b/UI.resx index e65af6d..a18f5e1 100644 --- a/UI.resx +++ b/UI.resx @@ -1,4 +1,64 @@ - + + + diff --git a/appsettings.ini b/appsettings.ini index c2581eb..a8986b8 100644 --- a/appsettings.ini +++ b/appsettings.ini @@ -24,7 +24,7 @@ _min_Throttle_Resistance=0 _min_Brake_Resistance=0 ;The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance. _acceleration_Limit=10 -DISABLE_APP_CHECK=false +DISABLE_APP_CHECK=true _dsx_PORT=6969 FORZA_PORT=5300 ;Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0 { 0.01 - 0.99 } diff --git a/obj/ForzaDSX.csproj.nuget.dgspec.json b/obj/ForzaDSX.csproj.nuget.dgspec.json index ffcff4e..0d38648 100644 --- a/obj/ForzaDSX.csproj.nuget.dgspec.json +++ b/obj/ForzaDSX.csproj.nuget.dgspec.json @@ -1,24 +1,20 @@ { "format": 1, "restore": { - "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj": {} + "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj": {} }, "projects": { - "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj": { + "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj", + "projectUniqueName": "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj", "projectName": "ForzaDSX", - "projectPath": "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj", - "packagesPath": "C:\\Users\\Guilherme\\.nuget\\packages\\", - "outputPath": "E:\\Development\\Projects\\ForzaDSX\\obj\\", + "projectPath": "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj", + "packagesPath": "C:\\Users\\patma\\.nuget\\packages\\", + "outputPath": "C:\\Users\\patma\\source\\repos\\RacingDSX\\obj\\", "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], "configFilePaths": [ - "C:\\Users\\Guilherme\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Users\\patma\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ @@ -77,21 +73,33 @@ "assetTargetFallback": true, "warn": true, "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[7.0.14, 7.0.14]" + }, { "name": "Microsoft.AspNetCore.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" }, { - "name": "Microsoft.NETCore.App.Crossgen2.win-x64", - "version": "[7.0.5, 7.0.5]" + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[7.0.14, 7.0.14]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[7.0.14, 7.0.14]" }, { "name": "Microsoft.NETCore.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[7.0.14, 7.0.14]" }, { "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" } ], "frameworkReferences": { @@ -102,7 +110,7 @@ "privateAssets": "none" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.203\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json" } }, "runtimes": { diff --git a/obj/ForzaDSX.csproj.nuget.g.props b/obj/ForzaDSX.csproj.nuget.g.props index 017086d..67cf1ed 100644 --- a/obj/ForzaDSX.csproj.nuget.g.props +++ b/obj/ForzaDSX.csproj.nuget.g.props @@ -5,12 +5,11 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Guilherme\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\patma\.nuget\packages\ PackageReference - 6.5.0 + 6.8.0 - - + \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json index ada8f7a..a4e9ee3 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -746,24 +746,19 @@ ] }, "packageFolders": { - "C:\\Users\\Guilherme\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + "C:\\Users\\patma\\.nuget\\packages\\": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj", + "projectUniqueName": "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj", "projectName": "ForzaDSX", - "projectPath": "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj", - "packagesPath": "C:\\Users\\Guilherme\\.nuget\\packages\\", - "outputPath": "E:\\Development\\Projects\\ForzaDSX\\obj\\", + "projectPath": "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj", + "packagesPath": "C:\\Users\\patma\\.nuget\\packages\\", + "outputPath": "C:\\Users\\patma\\source\\repos\\RacingDSX\\obj\\", "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], "configFilePaths": [ - "C:\\Users\\Guilherme\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Users\\patma\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ @@ -822,21 +817,33 @@ "assetTargetFallback": true, "warn": true, "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[7.0.14, 7.0.14]" + }, { "name": "Microsoft.AspNetCore.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" }, { - "name": "Microsoft.NETCore.App.Crossgen2.win-x64", - "version": "[7.0.5, 7.0.5]" + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[7.0.14, 7.0.14]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[7.0.14, 7.0.14]" }, { "name": "Microsoft.NETCore.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[7.0.14, 7.0.14]" }, { "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", - "version": "[7.0.5, 7.0.5]" + "version": "[7.0.14, 7.0.14]" } ], "frameworkReferences": { @@ -847,7 +854,7 @@ "privateAssets": "none" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.203\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json" } }, "runtimes": { diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 799539e..414c9f1 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,26 +1,29 @@ { "version": 2, - "dgSpecHash": "WxsBahOvKHjPbYG8UO2BsuWvzkm36M/v95iyfaR/c7TCVe4W36b8Y7xdwnf4LwmSUktAgIP9t4AeSG2VTrrhaA==", + "dgSpecHash": "5R7nlSmDq/Kmf9d6HCtVHgLNXiUx9qdKGIET79tdlKI8A0duMgtbstkg1IlysJkqR5Gx4y2peZylY30cKSRPUg==", "success": true, - "projectFilePath": "E:\\Development\\Projects\\ForzaDSX\\ForzaDSX.csproj", + "projectFilePath": "C:\\Users\\patma\\source\\repos\\RacingDSX\\ForzaDSX.csproj", "expectedPackageFiles": [ - "C:\\Users\\Guilherme\\.nuget\\packages\\csvhelper\\27.2.1\\csvhelper.27.2.1.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration\\6.0.0\\microsoft.extensions.configuration.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\6.0.0\\microsoft.extensions.configuration.abstractions.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration.binder\\6.0.0\\microsoft.extensions.configuration.binder.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\6.0.0\\microsoft.extensions.configuration.environmentvariables.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\6.0.0\\microsoft.extensions.configuration.fileextensions.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.configuration.ini\\6.0.0\\microsoft.extensions.configuration.ini.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\6.0.0\\microsoft.extensions.fileproviders.abstractions.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\6.0.0\\microsoft.extensions.fileproviders.physical.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\6.0.0\\microsoft.extensions.filesystemglobbing.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.extensions.primitives\\6.0.0\\microsoft.extensions.primitives.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.netcore.app.crossgen2.win-x64\\7.0.5\\microsoft.netcore.app.crossgen2.win-x64.7.0.5.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.aspnetcore.app.runtime.win-x64\\7.0.5\\microsoft.aspnetcore.app.runtime.win-x64.7.0.5.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.windowsdesktop.app.runtime.win-x64\\7.0.5\\microsoft.windowsdesktop.app.runtime.win-x64.7.0.5.nupkg.sha512", - "C:\\Users\\Guilherme\\.nuget\\packages\\microsoft.netcore.app.runtime.win-x64\\7.0.5\\microsoft.netcore.app.runtime.win-x64.7.0.5.nupkg.sha512" + "C:\\Users\\patma\\.nuget\\packages\\csvhelper\\27.2.1\\csvhelper.27.2.1.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration\\6.0.0\\microsoft.extensions.configuration.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\6.0.0\\microsoft.extensions.configuration.abstractions.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration.binder\\6.0.0\\microsoft.extensions.configuration.binder.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\6.0.0\\microsoft.extensions.configuration.environmentvariables.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\6.0.0\\microsoft.extensions.configuration.fileextensions.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.configuration.ini\\6.0.0\\microsoft.extensions.configuration.ini.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\6.0.0\\microsoft.extensions.fileproviders.abstractions.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\6.0.0\\microsoft.extensions.fileproviders.physical.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\6.0.0\\microsoft.extensions.filesystemglobbing.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.extensions.primitives\\6.0.0\\microsoft.extensions.primitives.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\7.0.14\\microsoft.windowsdesktop.app.ref.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.netcore.app.ref\\7.0.14\\microsoft.netcore.app.ref.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.aspnetcore.app.runtime.win-x64\\7.0.14\\microsoft.aspnetcore.app.runtime.win-x64.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.windowsdesktop.app.runtime.win-x64\\7.0.14\\microsoft.windowsdesktop.app.runtime.win-x64.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\7.0.14\\microsoft.aspnetcore.app.ref.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\7.0.14\\microsoft.netcore.app.host.win-x64.7.0.14.nupkg.sha512", + "C:\\Users\\patma\\.nuget\\packages\\microsoft.netcore.app.runtime.win-x64\\7.0.14\\microsoft.netcore.app.runtime.win-x64.7.0.14.nupkg.sha512" ], "logs": [] } \ No newline at end of file From f52e69ca0590070ef47f9c0bf0f30ea0283fec3f Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Sun, 24 Dec 2023 15:11:41 -0500 Subject: [PATCH 2/8] Initial UI Work --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.futdcache.v2 | Bin 364 -> 594 bytes .vs/ForzaDSX/v17/.suo | Bin 59392 -> 55296 bytes Readme.md | 10 + UI.Designer.cs | 159 +- UI.cs | 1702 +++++++++++---------- UI.resx | 23 + 7 files changed, 1056 insertions(+), 838 deletions(-) diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index afa16bce4c73d0558ff1d0b4b758ebacdea64287..cfa41523d01dec275255334f5f9b11f25e6bd2c2 100644 GIT binary patch delta 16023 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 z

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 I{{~L^8$9|7YybcN literal 59392 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 diff --git a/Readme.md b/Readme.md index bf5c80a..002fcf7 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,15 @@ 💛Thank you for using ForzaDSX💛 💛Currently there are no plans to make it compatible with upcoming mod support on dsx v3, unless someone makes a PR for it💛 +## Notes for allowing multiple different games beyond forza to work: +- Create multiple config files for each game type +- Detect running game and set that profile to active +- allow user to manually set active profile +- Display list of profiles, allow editing and copying of profiles +- Each profile has an associated expected packet format +- Each profile has associated executable name to look for to auto set active +- General app config that Maintains app wide settings(DSX IP/POrt, Whether to auto do app checks, etc) + + 🔺🔺 Note for Forza 4 (THIS IS REQUIRED FOR IT TO WORK) 🔺🔺 1. Install [Window 8 AppContainer Loopback Utility](https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/enableloopbackutility.exe) 2. Start the utility (if it shows a message about orphan sid, you can safely ignore it) diff --git a/UI.Designer.cs b/UI.Designer.cs index aa60a5a..7543f03 100644 --- a/UI.Designer.cs +++ b/UI.Designer.cs @@ -32,7 +32,13 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { components = new Container(); + System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("test"); + System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("test2"); + ComponentResourceManager resources = new ComponentResourceManager(typeof(UI)); mainPanel = new System.Windows.Forms.Panel(); + mainSplitContainer = new System.Windows.Forms.SplitContainer(); + profilesGroupBox = new System.Windows.Forms.GroupBox(); + profilesListView = new System.Windows.Forms.ListView(); mainTabControl = new System.Windows.Forms.TabControl(); miscTabPage = new System.Windows.Forms.TabPage(); miscTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); @@ -154,8 +160,18 @@ private void InitializeComponent() verboseModeLowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); verboseModeFullToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); statusStrip1 = new System.Windows.Forms.StatusStrip(); + toolStripDSXPortButton = new System.Windows.Forms.ToolStripDropDownButton(); + toolStripDSXPortTextBox = new System.Windows.Forms.ToolStripTextBox(); + toolStripAppCheckButton = new System.Windows.Forms.ToolStripDropDownButton(); + toolStripAppCheckOffItem = new System.Windows.Forms.ToolStripMenuItem(); + toolStripAppCheckOnItem = new System.Windows.Forms.ToolStripMenuItem(); toolTip = new System.Windows.Forms.ToolTip(components); mainPanel.SuspendLayout(); + ((ISupportInitialize)mainSplitContainer).BeginInit(); + mainSplitContainer.Panel1.SuspendLayout(); + mainSplitContainer.Panel2.SuspendLayout(); + mainSplitContainer.SuspendLayout(); + profilesGroupBox.SuspendLayout(); mainTabControl.SuspendLayout(); miscTabPage.SuspendLayout(); miscTableLayoutPanel.SuspendLayout(); @@ -228,14 +244,53 @@ private void InitializeComponent() // // mainPanel // - mainPanel.Controls.Add(mainTabControl); + mainPanel.Controls.Add(mainSplitContainer); mainPanel.Dock = System.Windows.Forms.DockStyle.Fill; mainPanel.Location = new System.Drawing.Point(0, 0); mainPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); mainPanel.Name = "mainPanel"; - mainPanel.Size = new System.Drawing.Size(1030, 1273); + mainPanel.Size = new System.Drawing.Size(1848, 1228); mainPanel.TabIndex = 0; // + // mainSplitContainer + // + mainSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + mainSplitContainer.Location = new System.Drawing.Point(0, 0); + mainSplitContainer.Name = "mainSplitContainer"; + // + // mainSplitContainer.Panel1 + // + mainSplitContainer.Panel1.Controls.Add(profilesGroupBox); + // + // mainSplitContainer.Panel2 + // + mainSplitContainer.Panel2.Controls.Add(mainTabControl); + mainSplitContainer.Size = new System.Drawing.Size(1848, 1228); + mainSplitContainer.SplitterDistance = 236; + mainSplitContainer.TabIndex = 1; + // + // profilesGroupBox + // + profilesGroupBox.Controls.Add(profilesListView); + profilesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill; + profilesGroupBox.Location = new System.Drawing.Point(0, 0); + profilesGroupBox.Name = "profilesGroupBox"; + profilesGroupBox.Size = new System.Drawing.Size(236, 1228); + profilesGroupBox.TabIndex = 3; + profilesGroupBox.TabStop = false; + profilesGroupBox.Text = "Profiles"; + // + // profilesListView + // + profilesListView.Dock = System.Windows.Forms.DockStyle.Fill; + profilesListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] { listViewItem1, listViewItem2 }); + profilesListView.Location = new System.Drawing.Point(3, 27); + profilesListView.Name = "profilesListView"; + profilesListView.Size = new System.Drawing.Size(230, 1198); + profilesListView.TabIndex = 0; + profilesListView.UseCompatibleStateImageBehavior = false; + profilesListView.View = System.Windows.Forms.View.List; + // // mainTabControl // mainTabControl.Controls.Add(miscTabPage); @@ -247,7 +302,7 @@ private void InitializeComponent() mainTabControl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); mainTabControl.Name = "mainTabControl"; mainTabControl.SelectedIndex = 0; - mainTabControl.Size = new System.Drawing.Size(1030, 1273); + mainTabControl.Size = new System.Drawing.Size(1608, 1228); mainTabControl.TabIndex = 0; // // miscTabPage @@ -257,7 +312,7 @@ private void InitializeComponent() miscTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscTabPage.Name = "miscTabPage"; miscTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - miscTabPage.Size = new System.Drawing.Size(1022, 1235); + miscTabPage.Size = new System.Drawing.Size(1600, 1190); miscTabPage.TabIndex = 3; miscTabPage.Text = "Misc"; miscTabPage.UseVisualStyleBackColor = true; @@ -291,7 +346,7 @@ private void InitializeComponent() miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 33F)); - miscTableLayoutPanel.Size = new System.Drawing.Size(1014, 1225); + miscTableLayoutPanel.Size = new System.Drawing.Size(1592, 1180); miscTableLayoutPanel.TabIndex = 0; // // forzaPortNumericUpDown @@ -415,7 +470,7 @@ private void InitializeComponent() rpmValueNumericUpDown.Location = new System.Drawing.Point(782, 5); rpmValueNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); rpmValueNumericUpDown.Name = "rpmValueNumericUpDown"; - rpmValueNumericUpDown.Size = new System.Drawing.Size(228, 31); + rpmValueNumericUpDown.Size = new System.Drawing.Size(806, 31); rpmValueNumericUpDown.TabIndex = 8; toolTip.SetToolTip(rpmValueNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); rpmValueNumericUpDown.ValueChanged += rpmValueNumericUpDown_ValueChanged; @@ -451,7 +506,7 @@ private void InitializeComponent() brakeConfigTabPage.Location = new System.Drawing.Point(4, 34); brakeConfigTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); brakeConfigTabPage.Name = "brakeConfigTabPage"; - brakeConfigTabPage.Size = new System.Drawing.Size(1022, 1235); + brakeConfigTabPage.Size = new System.Drawing.Size(1600, 1190); brakeConfigTabPage.TabIndex = 4; brakeConfigTabPage.Text = "Brake Trigger"; // @@ -525,7 +580,7 @@ private void InitializeComponent() brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 67F)); brakeTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 13F)); - brakeTableLayoutPanel.Size = new System.Drawing.Size(1022, 1235); + brakeTableLayoutPanel.Size = new System.Drawing.Size(1600, 1190); brakeTableLayoutPanel.TabIndex = 0; // // brakeResistanceSmoothNumericUpDown @@ -1111,7 +1166,7 @@ private void InitializeComponent() throttleConfigTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); throttleConfigTabPage.Name = "throttleConfigTabPage"; throttleConfigTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - throttleConfigTabPage.Size = new System.Drawing.Size(1022, 1235); + throttleConfigTabPage.Size = new System.Drawing.Size(1600, 1190); throttleConfigTabPage.TabIndex = 2; throttleConfigTabPage.Text = "Throttle Trigger"; throttleConfigTabPage.UseVisualStyleBackColor = true; @@ -1190,7 +1245,7 @@ private void InitializeComponent() throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); throttleTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - throttleTableLayoutPanel.Size = new System.Drawing.Size(1014, 1225); + throttleTableLayoutPanel.Size = new System.Drawing.Size(1592, 1180); throttleTableLayoutPanel.TabIndex = 0; // // throttleTriggerModeComboBox @@ -1858,7 +1913,7 @@ private void InitializeComponent() outputTabPage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); outputTabPage.Name = "outputTabPage"; outputTabPage.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - outputTabPage.Size = new System.Drawing.Size(1022, 1235); + outputTabPage.Size = new System.Drawing.Size(1600, 1190); outputTabPage.TabIndex = 1; outputTabPage.Text = "Output"; outputTabPage.UseVisualStyleBackColor = true; @@ -1867,11 +1922,11 @@ private void InitializeComponent() // raceGroupBox.Controls.Add(tableLayoutPanel1); raceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; - raceGroupBox.Location = new System.Drawing.Point(4, 609); + raceGroupBox.Location = new System.Drawing.Point(4, 564); raceGroupBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); raceGroupBox.Name = "raceGroupBox"; raceGroupBox.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - raceGroupBox.Size = new System.Drawing.Size(1014, 454); + raceGroupBox.Size = new System.Drawing.Size(1592, 454); raceGroupBox.TabIndex = 3; raceGroupBox.TabStop = false; raceGroupBox.Text = "Racing"; @@ -1894,7 +1949,7 @@ private void InitializeComponent() tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - tableLayoutPanel1.Size = new System.Drawing.Size(1006, 420); + tableLayoutPanel1.Size = new System.Drawing.Size(1584, 420); tableLayoutPanel1.TabIndex = 0; // // brakeMsg @@ -1941,11 +1996,11 @@ private void InitializeComponent() // noRaceGroupBox.Controls.Add(noRaceText); noRaceGroupBox.Dock = System.Windows.Forms.DockStyle.Bottom; - noRaceGroupBox.Location = new System.Drawing.Point(4, 1063); + noRaceGroupBox.Location = new System.Drawing.Point(4, 1018); noRaceGroupBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); noRaceGroupBox.Name = "noRaceGroupBox"; noRaceGroupBox.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - noRaceGroupBox.Size = new System.Drawing.Size(1014, 167); + noRaceGroupBox.Size = new System.Drawing.Size(1592, 167); noRaceGroupBox.TabIndex = 2; noRaceGroupBox.TabStop = false; noRaceGroupBox.Text = "Menus"; @@ -1969,7 +2024,7 @@ private void InitializeComponent() outputListBox.Location = new System.Drawing.Point(4, 5); outputListBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); outputListBox.Name = "outputListBox"; - outputListBox.Size = new System.Drawing.Size(1014, 1054); + outputListBox.Size = new System.Drawing.Size(1592, 1054); outputListBox.TabIndex = 0; // // toolStripStatusDSX @@ -1984,8 +2039,8 @@ private void InitializeComponent() // toolStripStatusForza.Image = Properties.Resources.redBtn; toolStripStatusForza.Name = "toolStripStatusForza"; - toolStripStatusForza.Size = new System.Drawing.Size(178, 25); - toolStripStatusForza.Text = "Forza Connection:"; + toolStripStatusForza.Size = new System.Drawing.Size(181, 25); + toolStripStatusForza.Text = "Game Connection:"; toolStripStatusForza.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; // // toolStripVerboseMode @@ -2024,19 +2079,62 @@ private void InitializeComponent() // statusStrip1 // statusStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); - statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusDSX, toolStripStatusForza, toolStripVerboseMode }); - statusStrip1.Location = new System.Drawing.Point(0, 1273); + statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusDSX, toolStripStatusForza, toolStripVerboseMode, toolStripDSXPortButton, toolStripAppCheckButton }); + statusStrip1.Location = new System.Drawing.Point(0, 1228); statusStrip1.Name = "statusStrip1"; statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 20, 0); - statusStrip1.Size = new System.Drawing.Size(1030, 32); + statusStrip1.Size = new System.Drawing.Size(1848, 32); statusStrip1.TabIndex = 0; statusStrip1.Text = "statusStrip1"; // + // toolStripDSXPortButton + // + toolStripDSXPortButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + toolStripDSXPortButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripDSXPortTextBox }); + toolStripDSXPortButton.Image = (System.Drawing.Image)resources.GetObject("toolStripDSXPortButton.Image"); + toolStripDSXPortButton.ImageTransparentColor = System.Drawing.Color.Magenta; + toolStripDSXPortButton.Name = "toolStripDSXPortButton"; + toolStripDSXPortButton.Size = new System.Drawing.Size(101, 29); + toolStripDSXPortButton.Text = "DSX Port"; + toolStripDSXPortButton.Click += toolStripDSXPortButton_Click; + // + // toolStripDSXPortTextBox + // + toolStripDSXPortTextBox.MaxLength = 5; + toolStripDSXPortTextBox.Name = "toolStripDSXPortTextBox"; + toolStripDSXPortTextBox.Size = new System.Drawing.Size(100, 31); + toolStripDSXPortTextBox.Text = "0"; + toolStripDSXPortTextBox.KeyDown += toolStripDSXPortTextBox_KeyDown; + // + // toolStripAppCheckButton + // + toolStripAppCheckButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + toolStripAppCheckButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripAppCheckOffItem, toolStripAppCheckOnItem }); + toolStripAppCheckButton.Image = (System.Drawing.Image)resources.GetObject("toolStripAppCheckButton.Image"); + toolStripAppCheckButton.ImageTransparentColor = System.Drawing.Color.Magenta; + toolStripAppCheckButton.Name = "toolStripAppCheckButton"; + toolStripAppCheckButton.Size = new System.Drawing.Size(184, 29); + toolStripAppCheckButton.Text = "App Check Enabled"; + // + // toolStripAppCheckOffItem + // + toolStripAppCheckOffItem.Name = "toolStripAppCheckOffItem"; + toolStripAppCheckOffItem.Size = new System.Drawing.Size(140, 34); + toolStripAppCheckOffItem.Text = "Off"; + toolStripAppCheckOffItem.Click += toolStripAppCheckOffItem_Click; + // + // toolStripAppCheckOnItem + // + toolStripAppCheckOnItem.Name = "toolStripAppCheckOnItem"; + toolStripAppCheckOnItem.Size = new System.Drawing.Size(140, 34); + toolStripAppCheckOnItem.Text = "On"; + toolStripAppCheckOnItem.Click += toolStripAppCheckOnItem_Click; + // // UI // AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(1030, 1305); + ClientSize = new System.Drawing.Size(1848, 1260); Controls.Add(mainPanel); Controls.Add(statusStrip1); DoubleBuffered = true; @@ -2046,6 +2144,11 @@ private void InitializeComponent() Text = "UI"; Load += UI_Load; mainPanel.ResumeLayout(false); + mainSplitContainer.Panel1.ResumeLayout(false); + mainSplitContainer.Panel2.ResumeLayout(false); + ((ISupportInitialize)mainSplitContainer).EndInit(); + mainSplitContainer.ResumeLayout(false); + profilesGroupBox.ResumeLayout(false); mainTabControl.ResumeLayout(false); miscTabPage.ResumeLayout(false); miscTabPage.PerformLayout(); @@ -2252,5 +2355,13 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox brakeTriggerModeComboBox; private System.Windows.Forms.Label throttleTriggerMode; private System.Windows.Forms.ComboBox throttleTriggerModeComboBox; - } + private System.Windows.Forms.SplitContainer mainSplitContainer; + private System.Windows.Forms.ListView profilesListView; + private System.Windows.Forms.GroupBox profilesGroupBox; + private System.Windows.Forms.ToolStripDropDownButton toolStripDSXPortButton; + private System.Windows.Forms.ToolStripTextBox toolStripDSXPortTextBox; + private System.Windows.Forms.ToolStripDropDownButton toolStripAppCheckButton; + private System.Windows.Forms.ToolStripMenuItem toolStripAppCheckOffItem; + private System.Windows.Forms.ToolStripMenuItem toolStripAppCheckOnItem; + } } \ No newline at end of file diff --git a/UI.cs b/UI.cs index c07d7a6..8978fef 100644 --- a/UI.cs +++ b/UI.cs @@ -7,819 +7,893 @@ namespace ForzaDSX { - public partial class UI : Form - { - protected ForzaDSXWorker forzaDSXWorker; - protected ForzaDSX.Properties.Settings currentSettings; - //protected Configuration config; - public ForzaDSX.Properties.Settings CurrentSettings { get => currentSettings; set => currentSettings = value; } + public partial class UI : Form + { + protected ForzaDSXWorker forzaDSXWorker; + protected ForzaDSX.Properties.Settings currentSettings; + //protected Configuration config; + public ForzaDSX.Properties.Settings CurrentSettings { get => currentSettings; set => currentSettings = value; } - bool bForzaConnected = false; - bool bDsxConnected = false; + bool bForzaConnected = false; + bool bDsxConnected = false; - Thread appCheckThread; - Thread forzaDsxThread; - - CancellationTokenSource appCheckThreadCancellationToken; - CancellationToken appCheckThreadToken; - - CancellationTokenSource forzaThreadCancellationToken; - CancellationToken forzaThreadToken; - - public UI() - { - InitializeComponent(); - - //forzaDSXWorker = new ForzaDSXWorker(this); - } - - void UpdateDSXConnectionStatus(bool bConnected) - { - toolStripStatusDSX.Image = bConnected ? Resources.greenBtn : Resources.redBtn; - bDsxConnected = bConnected; - } - - void UpdateForzaConnectionStatus(bool bConnected) - { - toolStripStatusForza.Image = bConnected ? Resources.greenBtn : Resources.redBtn; - bForzaConnected = bConnected; - } - - public void Output(string Text, bool bShowMessageBox = false) - { - outputListBox.Items.Insert(0, Text); - - if (outputListBox.Items.Count > 50) - { - outputListBox.Items.RemoveAt(50); - } - - if (bShowMessageBox) - { - MessageBox.Show(Text); - } - } - - private void UI_Load(object sender, EventArgs e) - { - this.Text = "ForzaDSX version: " + Program.VERSION; - - LoadSettings(); - - noRaceText.Text = String.Empty; - throttleVibrationMsg.Text = String.Empty; - throttleMsg.Text = String.Empty; - brakeVibrationMsg.Text = String.Empty; - brakeMsg.Text = String.Empty; - - noRaceGroupBox.Visible = currentSettings._verbose > 0; - raceGroupBox.Visible = currentSettings._verbose > 0; - - // Starts the background Worker - //this.connectionWorker.RunWorkerAsync(); - - var progressHandler = new Progress(AppCheckReporter); - - AppCheckThread act = new AppCheckThread(ref currentSettings, progressHandler); - appCheckThreadCancellationToken = new CancellationTokenSource(); - appCheckThreadToken = appCheckThreadCancellationToken.Token; - - appCheckThreadToken.Register(() => act.Stop()); - - appCheckThread = new Thread(new ThreadStart(act.Run)); - appCheckThread.IsBackground = true; - - appCheckThread.Start(); - - var forzaProgressHandler = new Progress(WorkerThreadReporter); - - forzaDSXWorker = new ForzaDSXWorker(currentSettings, forzaProgressHandler); - - forzaThreadCancellationToken = new CancellationTokenSource(); - forzaThreadToken = forzaThreadCancellationToken.Token; - - forzaThreadToken.Register(() => forzaDSXWorker.Stop()); - } - - protected void AppCheckReporter(AppCheckReportStruct value) - { - if (value.type == AppCheckReportStruct.AppType.NONE) - { - Output(value.message); - } - else if (value.type == AppCheckReportStruct.AppType.DSX) - { - UpdateDSXConnectionStatus(value.value); - } - else - { - UpdateForzaConnectionStatus(value.value); - } - - if (forzaDsxThread == null) - { - if (bForzaConnected && bDsxConnected) - { - StartForzaDSXThread(); - } - } - else - { - if (!bForzaConnected || !bDsxConnected) - { - StopForzaDSXThread(); - } - } - } - - protected void StartForzaDSXThread() - { - if (forzaDsxThread != null - || forzaDSXWorker == null) - return; - - forzaDsxThread = new Thread(new ThreadStart(forzaDSXWorker.Run)); - forzaDsxThread.IsBackground = true; - - forzaDsxThread.Start(); - } - - protected void StopForzaDSXThread() - { - try - { - if (forzaDsxThread != null - && forzaThreadCancellationToken != null) - { - forzaThreadCancellationToken.Cancel(); - } - } - catch (Exception) - { - - throw; - } - - forzaDsxThread = null; - } - - protected void WorkerThreadReporter(ForzaDSXReportStruct value) - { - switch (value.type) - { - case ForzaDSXReportStruct.ReportType.VERBOSEMESSAGE: - Output(value.message); - break; - case ForzaDSXReportStruct.ReportType.NORACE: - if (currentSettings._verbose > 0) - { - noRaceGroupBox.Visible = true; - raceGroupBox.Visible = false; - } - - noRaceText.Text = value.message; - break; - case ForzaDSXReportStruct.ReportType.RACING: - if (currentSettings._verbose > 0) - { - noRaceGroupBox.Visible = false; - raceGroupBox.Visible = true; - } - - switch (value.racingType) - { - case ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION: - throttleVibrationMsg.Text = value.message; - break; - case ForzaDSXReportStruct.RacingReportType.THROTTLE: - throttleMsg.Text = value.message; - break; - case ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION: - brakeVibrationMsg.Text = value.message; - break; - case ForzaDSXReportStruct.RacingReportType.BRAKE: - brakeMsg.Text = value.message; - break; - } - break; - } - } - - private void UI_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) - { - appCheckThreadCancellationToken.Cancel(); - appCheckThreadCancellationToken.Dispose(); - - forzaThreadCancellationToken.Cancel(); - forzaThreadCancellationToken.Dispose(); - } - - public void LoadSettings() - { - //// Build a config object, using env vars and JSON providers. - //config = new ConfigurationBuilder() - // .AddIniFile("appsettings.ini") - // .Build(); - - try - { - - // Get values from the config given their key and their target type. - currentSettings = Properties.Settings.Default; - - currentSettings._left_Trigger_Effect_Intensity = Math.Clamp(currentSettings._left_Trigger_Effect_Intensity, 0.0f, 1.0f); - currentSettings._right_Trigger_Effect_Intensity = Math.Clamp(currentSettings._right_Trigger_Effect_Intensity, 0.0f, 1.0f); - - verboseModeOffToolStripMenuItem.Checked = currentSettings._verbose == 0; - verboseModeLowToolStripMenuItem.Checked = currentSettings._verbose == 1; - verboseModeFullToolStripMenuItem.Checked = currentSettings._verbose == 2; - } - catch (Exception e) - { - Output("Invalid Configuration File!\n" + e.Message, true); - } - - SetupUI(); - } - - #region UI Forms control - void SetupUI() - { - // Misc panel - this.rpmTrackBar.Value = DenormalizeValue(currentSettings._rpm_Redline_Ratio); - rpmValueNumericUpDown.Value = rpmTrackBar.Value; - - this.appCheckBox.Checked = currentSettings._disable_App_Check; - this.dsxNumericUpDown.Value = currentSettings._dsx_PORT; - this.forzaPortNumericUpDown.Value = currentSettings._forza_PORT; - - // Brake Panel - this.brakeTriggerModeComboBox.SelectedIndex = currentSettings.BrakeTriggerMode; - this.brakeEffectIntensityTrackBar.Value = DenormalizeValue(currentSettings._left_Trigger_Effect_Intensity); - this.gripLossTrackBar.Value = DenormalizeValue(currentSettings._grip_Loss_Val); - this.brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; - this.brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; - this.minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; - this.maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; - this.vibrationSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake_Freq, 500.0f); - this.minBrakeStiffnessTrackBar.Value = currentSettings._min_Brake_Stiffness; - this.maxBrakeStiffnessTrackBar.Value = currentSettings._max_Brake_Stiffness; - this.minBrakeResistanceTrackBar.Value = currentSettings._min_Brake_Resistance; - this.maxBrakeResistanceTrackBar.Value = currentSettings._max_Brake_Resistance; - this.brakeResistanceSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake, 500.0f); - - this.brakeEffectNumericUpDown.Value = this.brakeEffectIntensityTrackBar.Value; - this.gripLossNumericUpDown.Value = this.gripLossTrackBar.Value; - this.brakeVibrationStartNumericUpDown.Value = this.brakeVibrationStartTrackBar.Value; - this.brakeVibrationModeNumericUpDown.Value = this.brakeVibrationModeTrackBar.Value; - this.minBrakeVibrationNumericUpDown.Value = this.minBrakeVibrationTrackBar.Value; - this.maxBrakeVibrationNumericUpDown.Value = this.maxBrakeVibrationTrackBar.Value; - this.brakeVibrationSmoothNumericUpDown.Value = this.vibrationSmoothingTrackBar.Value; - this.minBrakeStifnessNumericUpDown.Value = this.minBrakeStiffnessTrackBar.Value; - this.maxBrakeStifnessNumericUpDown.Value = this.maxBrakeStiffnessTrackBar.Value; - this.minBrakeResistanceNumericUpDown.Value = this.minBrakeResistanceTrackBar.Value; - this.maxBrakeResistanceNumericUpDown.Value = this.maxBrakeResistanceTrackBar.Value; - this.brakeResistanceSmoothNumericUpDown.Value = this.brakeResistanceSmoothingTrackBar.Value; - - // Throttle Panel - this.throttleTriggerModeComboBox.SelectedIndex = currentSettings.ThrottleTriggerMode; - this.throttleIntensityTrackBar.Value = DenormalizeValue(currentSettings._right_Trigger_Effect_Intensity); - this.throttleGripLossTrackBar.Value = DenormalizeValue(currentSettings._throttle_Grip_Loss_Val); - this.throttleTurnAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._turn_Accel_Mod); - this.throttleForwardAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._forward_Accel_Mod); - this.throttleAccelLimitTrackBar.Value = currentSettings._acceleration_Limit; - this.throttleVibrationModeStartTrackBar.Value = currentSettings._throttle_Vibration_Mode_Start; - this.throttleMinVibrationTrackBar.Value = currentSettings._min_Accel_Griploss_Vibration; - this.throttleMaxVibrationTrackBar.Value = currentSettings._max_Accel_Griploss_Vibration; - this.throttleVibrationSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle_Freq); - this.throttleMinStiffnessTrackBar.Value = currentSettings._min_Accel_Griploss_Stiffness; - this.throttleMaxStiffnessTrackBar.Value = currentSettings._max_Accel_Griploss_Stiffness; - this.throttleMinResistanceTrackBar.Value = currentSettings._min_Throttle_Resistance; - this.throttleMaxResistanceTrackBar.Value = currentSettings._max_Throttle_Resistance; - this.throttleResistanceSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle); - - this.throttleIntensityNumericUpDown.Value = this.throttleIntensityTrackBar.Value; - this.throttleGripLossNumericUpDown.Value = this.throttleGripLossTrackBar.Value; - this.throttleTurnAccelScaleNumericUpDown.Value = this.throttleTurnAccelScaleTrackBar.Value; - this.throttleForwardAccelScaleNumericUpDown.Value = this.throttleForwardAccelScaleTrackBar.Value; - this.throttleAccelLimitNumericUpDown.Value = this.throttleAccelLimitTrackBar.Value; - this.throttleVibrationStartNumericUpDown.Value = this.throttleVibrationModeStartTrackBar.Value; - this.throttleMinVibrationNumericUpDown.Value = this.throttleMinVibrationTrackBar.Value; - this.throttleMaxVibrationNumericUpDown.Value = this.throttleMaxVibrationTrackBar.Value; - this.throttleVibrationSmoothNumericUpDown.Value = this.throttleVibrationSmoothTrackBar.Value; - this.throttleMinStiffnessNumericUpDown.Value = this.throttleMinStiffnessTrackBar.Value; - this.throttleMaxStiffnessNumericUpDown.Value = this.throttleMaxStiffnessTrackBar.Value; - this.throttleMinResistanceNumericUpDown.Value = this.throttleMinResistanceTrackBar.Value; - this.throttleMaxResistanceNumericUpDown.Value = this.throttleMaxResistanceTrackBar.Value; - this.throttleResistanceSmoothNumericUpDown.Value = this.throttleResistanceSmoothTrackBar.Value; - } - - static int DenormalizeValue(float normalizedValue, float scale = 100.0f) - { - return (int)Math.Floor(normalizedValue * scale); - } - - static float NormalizeValue(float value, float scale = 100.0f) - { - if (scale == 0) - return value; - - return value / scale; - } - - private void verboseModeFullToolStripMenuItem_Click(object sender, EventArgs e) - { - currentSettings._verbose = 2; - verboseModeOffToolStripMenuItem.Checked = false; - verboseModeLowToolStripMenuItem.Checked = false; - verboseModeFullToolStripMenuItem.Checked = true; - } - - private void verboseModeLowToolStripMenuItem_Click(object sender, EventArgs e) - { - currentSettings._verbose = 1; - verboseModeOffToolStripMenuItem.Checked = false; - verboseModeLowToolStripMenuItem.Checked = true; - verboseModeFullToolStripMenuItem.Checked = false; - } - - private void verboseModeOffToolStripMenuItem_Click(object sender, EventArgs e) - { - currentSettings._verbose = 0; - verboseModeOffToolStripMenuItem.Checked = true; - verboseModeLowToolStripMenuItem.Checked = false; - verboseModeFullToolStripMenuItem.Checked = false; - - noRaceGroupBox.Visible = false; - raceGroupBox.Visible = false; - } - - #region Misc - private void rpmTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._rpm_Redline_Ratio = NormalizeValue(this.rpmTrackBar.Value); - rpmValueNumericUpDown.Value = rpmTrackBar.Value; - } - - private void rpmValueNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._rpm_Redline_Ratio = NormalizeValue((float)this.rpmValueNumericUpDown.Value); - rpmTrackBar.Value = (int)Math.Floor(rpmValueNumericUpDown.Value); - } - - private void appCheckBox_CheckedChanged(object sender, EventArgs e) - { - currentSettings._disable_App_Check = this.appCheckBox.Checked; - } - - private void dsxNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._dsx_PORT = (int)Math.Floor(this.dsxNumericUpDown.Value); - } - - private void forzaPortNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._forza_PORT = (int)Math.Floor(this.forzaPortNumericUpDown.Value); - } - #endregion - - #region Brake - private void brakeEffectIntensityTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._left_Trigger_Effect_Intensity = NormalizeValue(brakeEffectIntensityTrackBar.Value); - this.brakeEffectNumericUpDown.Value = brakeEffectIntensityTrackBar.Value; - } - - private void brakeEffectNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._left_Trigger_Effect_Intensity = NormalizeValue((float)brakeEffectNumericUpDown.Value); - brakeEffectIntensityTrackBar.Value = (int)Math.Floor(brakeEffectNumericUpDown.Value); - } - - private void gripLossTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._grip_Loss_Val = NormalizeValue(this.gripLossTrackBar.Value); - gripLossNumericUpDown.Value = gripLossTrackBar.Value; - } - - private void gripLossNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._grip_Loss_Val = NormalizeValue((float)gripLossNumericUpDown.Value); - gripLossTrackBar.Value = (int)Math.Floor(gripLossNumericUpDown.Value); - } - - private void brakeVibrationStartTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._brake_Vibration_Start = this.brakeVibrationStartTrackBar.Value; - brakeVibrationStartNumericUpDown.Value = brakeVibrationStartTrackBar.Value; - } - - private void brakeVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._brake_Vibration_Start = (int)Math.Floor(brakeVibrationStartNumericUpDown.Value); - brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; - } - - private void brakeVibrationModeTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._brake_Vibration_Mode_Start = this.brakeVibrationModeTrackBar.Value; - brakeVibrationModeNumericUpDown.Value = brakeVibrationModeTrackBar.Value; - } - - private void brakeVibrationModeNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._brake_Vibration_Mode_Start = (int)Math.Floor(brakeVibrationModeNumericUpDown.Value); - brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; - } - - private void minBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._min_Brake_Vibration = minBrakeVibrationTrackBar.Value; - minBrakeVibrationNumericUpDown.Value = minBrakeVibrationTrackBar.Value; - } - - private void minBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._min_Brake_Vibration = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); - minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; - } - - private void maxBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._max_Brake_Vibration = maxBrakeVibrationTrackBar.Value; - maxBrakeVibrationNumericUpDown.Value = maxBrakeVibrationTrackBar.Value; - } - - private void maxBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._max_Brake_Vibration = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); - maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; - } - - private void vibrationSmoothingTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue(vibrationSmoothingTrackBar.Value, 500); - brakeVibrationSmoothNumericUpDown.Value = vibrationSmoothingTrackBar.Value; - } - - private void brakeVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue((float)brakeVibrationSmoothNumericUpDown.Value, 500); - vibrationSmoothingTrackBar.Value = (int)Math.Floor(brakeVibrationSmoothNumericUpDown.Value); - } - - private void minBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._min_Brake_Stiffness = minBrakeStiffnessTrackBar.Value; - minBrakeStifnessNumericUpDown.Value = minBrakeStiffnessTrackBar.Value; - } - - private void minBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._min_Brake_Stiffness = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); - minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Stiffness; - } - - private void maxBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._max_Brake_Stiffness = maxBrakeStiffnessTrackBar.Value; - maxBrakeStifnessNumericUpDown.Value = maxBrakeStiffnessTrackBar.Value; - } - - private void maxBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._max_Brake_Stiffness = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); - maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Stiffness; - } - - private void minBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) - { - int value = minBrakeResistanceTrackBar.Value; - if (value > currentSettings._max_Brake_Resistance) - value = currentSettings._max_Brake_Resistance; - - currentSettings._min_Brake_Resistance = value; - - minBrakeResistanceTrackBar.Value = value; - minBrakeResistanceNumericUpDown.Value = value; - } - - private void minBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(minBrakeResistanceNumericUpDown.Value); - if (value > currentSettings._max_Brake_Resistance) - value = currentSettings._max_Brake_Resistance; - - currentSettings._min_Brake_Resistance = value; - - minBrakeResistanceTrackBar.Value = value; - minBrakeResistanceNumericUpDown.Value = value; - } - - private void maxBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) - { - int value = maxBrakeResistanceTrackBar.Value; - if (value < currentSettings._min_Brake_Resistance) - value = currentSettings._min_Brake_Resistance; - - currentSettings._max_Brake_Resistance = value; - - maxBrakeResistanceTrackBar.Value = value; - maxBrakeResistanceNumericUpDown.Value = value; - } - - private void maxBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(maxBrakeResistanceNumericUpDown.Value); - if (value < currentSettings._min_Brake_Resistance) - value = currentSettings._min_Brake_Resistance; - - currentSettings._max_Brake_Resistance = value; - - maxBrakeResistanceTrackBar.Value = value; - maxBrakeResistanceNumericUpDown.Value = value; - } - - private void brakeResistanceSmoothingTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._ewma_Alpha_Brake = NormalizeValue(brakeResistanceSmoothingTrackBar.Value, 500); - brakeResistanceSmoothNumericUpDown.Value = brakeResistanceSmoothingTrackBar.Value; - } - - private void brakeResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._ewma_Alpha_Brake = NormalizeValue((float)brakeResistanceSmoothNumericUpDown.Value, 500); - brakeResistanceSmoothingTrackBar.Value = (int)Math.Floor(brakeResistanceSmoothNumericUpDown.Value); - } - #endregion - - #region Throttle - private void throttleIntensityTrackBar_Scroll(object sender, EventArgs e) - { - currentSettings._right_Trigger_Effect_Intensity = NormalizeValue(throttleIntensityTrackBar.Value); - throttleIntensityNumericUpDown.Value = throttleIntensityTrackBar.Value; - } - - private void throttleIntensityNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._right_Trigger_Effect_Intensity = NormalizeValue((float)throttleIntensityNumericUpDown.Value); - throttleIntensityTrackBar.Value = (int)Math.Floor(throttleIntensityNumericUpDown.Value); - } - - private void throttleGripLossTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleGripLossTrackBar.Value; - currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); - throttleGripLossNumericUpDown.Value = value; - } - - private void throttleGripLossNumericUpDown_ValueChanged(object sender, EventArgs e) - { - float value = (float)throttleGripLossNumericUpDown.Value; - currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); - throttleGripLossTrackBar.Value = (int)Math.Floor(value); - } - - private void throttleTurnAccelScaleTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleTurnAccelScaleTrackBar.Value; - currentSettings._turn_Accel_Mod = NormalizeValue(value); - throttleTurnAccelScaleNumericUpDown.Value = value; - } - - private void throttleTurnAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) - { - float value = (float)throttleTurnAccelScaleNumericUpDown.Value; - currentSettings._turn_Accel_Mod = NormalizeValue(value); - throttleTurnAccelScaleTrackBar.Value = (int)Math.Floor(value); - } - - private void throttleForwardAccelScaleTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleForwardAccelScaleTrackBar.Value; - currentSettings._forward_Accel_Mod = NormalizeValue(value); - throttleForwardAccelScaleNumericUpDown.Value = value; - } - - private void throttleForwardAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) - { - float value = (float)throttleForwardAccelScaleNumericUpDown.Value; - currentSettings._forward_Accel_Mod = NormalizeValue(value); - throttleForwardAccelScaleTrackBar.Value = (int)Math.Floor(value); - } - - private void throttleAccelLimitTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleAccelLimitTrackBar.Value; - currentSettings._acceleration_Limit = value; - throttleAccelLimitNumericUpDown.Value = value; - } - - private void throttleAccelLimitNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleAccelLimitNumericUpDown.Value); - currentSettings._acceleration_Limit = value; - throttleAccelLimitTrackBar.Value = value; - } - - private void throttleVibrationModeStartTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleVibrationModeStartTrackBar.Value; - currentSettings._throttle_Vibration_Mode_Start = value; - throttleVibrationStartNumericUpDown.Value = value; - } - - private void throttleVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleVibrationStartNumericUpDown.Value); - currentSettings._throttle_Vibration_Mode_Start = value; - throttleVibrationModeStartTrackBar.Value = value; - } - - private void throttleMinVibrationTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMinVibrationTrackBar.Value; - currentSettings._min_Accel_Griploss_Vibration = value; - throttleMinVibrationNumericUpDown.Value = value; - } - - private void throttleMinVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMinVibrationNumericUpDown.Value); - currentSettings._min_Accel_Griploss_Vibration = value; - throttleMinVibrationTrackBar.Value = value; - } - - private void throttleMaxVibrationTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMaxVibrationTrackBar.Value; - currentSettings._max_Accel_Griploss_Vibration = value; - throttleMaxVibrationNumericUpDown.Value = value; - } - - private void throttleMaxVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMaxVibrationNumericUpDown.Value); - currentSettings._max_Accel_Griploss_Vibration = value; - throttleMaxVibrationTrackBar.Value = value; - } - - private void throttleVibrationSmoothTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleVibrationSmoothTrackBar.Value; - currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); - throttleVibrationSmoothNumericUpDown.Value = value; - } - - private void throttleVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) - { - float value = (float)throttleVibrationSmoothNumericUpDown.Value; - currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); - throttleVibrationSmoothTrackBar.Value = (int)Math.Floor(value); - } - - private void throttleMinStiffnessTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMinStiffnessTrackBar.Value; - currentSettings._min_Accel_Griploss_Stiffness = value; - throttleMinStiffnessNumericUpDown.Value = value; - } - - private void throttleMinStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMinStiffnessNumericUpDown.Value); - currentSettings._min_Accel_Griploss_Stiffness = value; - throttleMinStiffnessTrackBar.Value = value; - } - - private void throttleMaxStiffnessTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMaxStiffnessTrackBar.Value; - currentSettings._max_Accel_Griploss_Stiffness = value; - throttleMaxStiffnessNumericUpDown.Value = value; - } - - private void throttleMaxStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMaxStiffnessNumericUpDown.Value); - currentSettings._max_Accel_Griploss_Stiffness = value; - throttleMaxStiffnessTrackBar.Value = value; - } - - private void throttleMinResistanceTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMinResistanceTrackBar.Value; - currentSettings._min_Throttle_Resistance = value; - throttleMinResistanceNumericUpDown.Value = value; - } - - private void throttleMinResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMinResistanceNumericUpDown.Value); - currentSettings._min_Throttle_Resistance = value; - throttleMinResistanceTrackBar.Value = value; - } - - private void throttleMaxResistanceTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleMaxResistanceTrackBar.Value; - currentSettings._max_Throttle_Resistance = value; - throttleMaxResistanceNumericUpDown.Value = value; - } - - private void throttleMaxResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) - { - int value = (int)Math.Floor(throttleMaxResistanceNumericUpDown.Value); - currentSettings._max_Throttle_Resistance = value; - throttleMaxResistanceTrackBar.Value = value; - } - - private void throttleResistanceSmoothTrackBar_Scroll(object sender, EventArgs e) - { - int value = throttleResistanceSmoothTrackBar.Value; - currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); - throttleResistanceSmoothNumericUpDown.Value = value; - } - - private void throttleResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) - { - float value = (float)throttleResistanceSmoothNumericUpDown.Value; - currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); - throttleResistanceSmoothTrackBar.Value = (int)Math.Floor(value); - } - #endregion - - #endregion - - private void buttonApplyMisc_Click(object sender, EventArgs e) - { - if (forzaDSXWorker != null) - { - CurrentSettings.Save(); - - forzaDSXWorker.SetSettings(CurrentSettings); - } - } - - private void buttonApply_Brake_Click(object sender, EventArgs e) - { - if (forzaDSXWorker != null) - { - CurrentSettings.Save(); - - forzaDSXWorker.SetSettings(CurrentSettings); - } - } - - private void buttonApply_Throttle_Click(object sender, EventArgs e) - { - if (forzaDSXWorker != null) - { - CurrentSettings.Save(); - - forzaDSXWorker.SetSettings(CurrentSettings); - } - } - - private void miscDefaultsButton_Click(object sender, EventArgs e) - { - FullResetValues(); - } - - private void brakeDefaultsButton_Click(object sender, EventArgs e) - { - FullResetValues(); - } - - private void throttleDefaultsButton_Click(object sender, EventArgs e) - { - FullResetValues(); - } - - protected void FullResetValues() - { - CurrentSettings.Reset(); - - SetupUI(); - - if (forzaDSXWorker != null) - { - CurrentSettings.Save(); - - forzaDSXWorker.SetSettings(CurrentSettings); - - StartForzaDSXThread(); - } - } - - private void brakeTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - CurrentSettings.BrakeTriggerMode = (sbyte)brakeTriggerModeComboBox.SelectedIndex; - } - - private void throttleTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - CurrentSettings.ThrottleTriggerMode = (sbyte)throttleTriggerModeComboBox.SelectedIndex; - } - } -} + Thread appCheckThread; + Thread forzaDsxThread; + + CancellationTokenSource appCheckThreadCancellationToken; + CancellationToken appCheckThreadToken; + + CancellationTokenSource forzaThreadCancellationToken; + CancellationToken forzaThreadToken; + + public UI() + { + InitializeComponent(); + + //forzaDSXWorker = new ForzaDSXWorker(this); + } + + void UpdateDSXConnectionStatus(bool bConnected) + { + toolStripStatusDSX.Image = bConnected ? Resources.greenBtn : Resources.redBtn; + bDsxConnected = bConnected; + } + + void UpdateForzaConnectionStatus(bool bConnected) + { + toolStripStatusForza.Image = bConnected ? Resources.greenBtn : Resources.redBtn; + bForzaConnected = bConnected; + } + + public void Output(string Text, bool bShowMessageBox = false) + { + outputListBox.Items.Insert(0, Text); + + if (outputListBox.Items.Count > 50) + { + outputListBox.Items.RemoveAt(50); + } + + if (bShowMessageBox) + { + MessageBox.Show(Text); + } + } + + private void UI_Load(object sender, EventArgs e) + { + this.Text = "ForzaDSX version: " + Program.VERSION; + + LoadSettings(); + + noRaceText.Text = String.Empty; + throttleVibrationMsg.Text = String.Empty; + throttleMsg.Text = String.Empty; + brakeVibrationMsg.Text = String.Empty; + brakeMsg.Text = String.Empty; + + noRaceGroupBox.Visible = currentSettings._verbose > 0; + raceGroupBox.Visible = currentSettings._verbose > 0; + + // Starts the background Worker + //this.connectionWorker.RunWorkerAsync(); + + var progressHandler = new Progress(AppCheckReporter); + + AppCheckThread act = new AppCheckThread(ref currentSettings, progressHandler); + appCheckThreadCancellationToken = new CancellationTokenSource(); + appCheckThreadToken = appCheckThreadCancellationToken.Token; + + appCheckThreadToken.Register(() => act.Stop()); + + appCheckThread = new Thread(new ThreadStart(act.Run)); + appCheckThread.IsBackground = true; + + appCheckThread.Start(); + + var forzaProgressHandler = new Progress(WorkerThreadReporter); + + forzaDSXWorker = new ForzaDSXWorker(currentSettings, forzaProgressHandler); + + forzaThreadCancellationToken = new CancellationTokenSource(); + forzaThreadToken = forzaThreadCancellationToken.Token; + + forzaThreadToken.Register(() => forzaDSXWorker.Stop()); + } + + protected void AppCheckReporter(AppCheckReportStruct value) + { + if (value.type == AppCheckReportStruct.AppType.NONE) + { + Output(value.message); + } + else if (value.type == AppCheckReportStruct.AppType.DSX) + { + UpdateDSXConnectionStatus(value.value); + } + else + { + UpdateForzaConnectionStatus(value.value); + } + + if (forzaDsxThread == null) + { + if (bForzaConnected && bDsxConnected) + { + StartForzaDSXThread(); + } + } + else + { + if (!bForzaConnected || !bDsxConnected) + { + StopForzaDSXThread(); + } + } + } + + protected void StartForzaDSXThread() + { + if (forzaDsxThread != null + || forzaDSXWorker == null) + return; + + forzaDsxThread = new Thread(new ThreadStart(forzaDSXWorker.Run)); + forzaDsxThread.IsBackground = true; + + forzaDsxThread.Start(); + } + + protected void StopForzaDSXThread() + { + try + { + if (forzaDsxThread != null + && forzaThreadCancellationToken != null) + { + forzaThreadCancellationToken.Cancel(); + } + } + catch (Exception) + { + + throw; + } + + forzaDsxThread = null; + } + + protected void WorkerThreadReporter(ForzaDSXReportStruct value) + { + switch (value.type) + { + case ForzaDSXReportStruct.ReportType.VERBOSEMESSAGE: + Output(value.message); + break; + case ForzaDSXReportStruct.ReportType.NORACE: + if (currentSettings._verbose > 0) + { + noRaceGroupBox.Visible = true; + raceGroupBox.Visible = false; + } + + noRaceText.Text = value.message; + break; + case ForzaDSXReportStruct.ReportType.RACING: + if (currentSettings._verbose > 0) + { + noRaceGroupBox.Visible = false; + raceGroupBox.Visible = true; + } + + switch (value.racingType) + { + case ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION: + throttleVibrationMsg.Text = value.message; + break; + case ForzaDSXReportStruct.RacingReportType.THROTTLE: + throttleMsg.Text = value.message; + break; + case ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION: + brakeVibrationMsg.Text = value.message; + break; + case ForzaDSXReportStruct.RacingReportType.BRAKE: + brakeMsg.Text = value.message; + break; + } + break; + } + } + + private void UI_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) + { + appCheckThreadCancellationToken.Cancel(); + appCheckThreadCancellationToken.Dispose(); + + forzaThreadCancellationToken.Cancel(); + forzaThreadCancellationToken.Dispose(); + } + + public void LoadSettings() + { + //// Build a config object, using env vars and JSON providers. + //config = new ConfigurationBuilder() + // .AddIniFile("appsettings.ini") + // .Build(); + + try + { + + // Get values from the config given their key and their target type. + currentSettings = Properties.Settings.Default; + + currentSettings._left_Trigger_Effect_Intensity = Math.Clamp(currentSettings._left_Trigger_Effect_Intensity, 0.0f, 1.0f); + currentSettings._right_Trigger_Effect_Intensity = Math.Clamp(currentSettings._right_Trigger_Effect_Intensity, 0.0f, 1.0f); + + verboseModeOffToolStripMenuItem.Checked = currentSettings._verbose == 0; + verboseModeLowToolStripMenuItem.Checked = currentSettings._verbose == 1; + verboseModeFullToolStripMenuItem.Checked = currentSettings._verbose == 2; + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + } + catch (Exception e) + { + Output("Invalid Configuration File!\n" + e.Message, true); + } + + SetupUI(); + } + + #region UI Forms control + void SetupUI() + { + // Misc panel + this.rpmTrackBar.Value = DenormalizeValue(currentSettings._rpm_Redline_Ratio); + rpmValueNumericUpDown.Value = rpmTrackBar.Value; + + this.appCheckBox.Checked = currentSettings._disable_App_Check; + if (currentSettings._disable_App_Check) + { + toolStripAppCheckOnItem.Checked = false; + toolStripAppCheckOffItem.Checked = true; + toolStripAppCheckButton.Text = "App Check Disabled"; + } + else + { + toolStripAppCheckOnItem.Checked = true; + toolStripAppCheckOffItem.Checked = false; + toolStripAppCheckButton.Text = "App Check Enabled"; + } + + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); + this.dsxNumericUpDown.Value = currentSettings._dsx_PORT; + this.forzaPortNumericUpDown.Value = currentSettings._forza_PORT; + + // Brake Panel + this.brakeTriggerModeComboBox.SelectedIndex = currentSettings.BrakeTriggerMode; + this.brakeEffectIntensityTrackBar.Value = DenormalizeValue(currentSettings._left_Trigger_Effect_Intensity); + this.gripLossTrackBar.Value = DenormalizeValue(currentSettings._grip_Loss_Val); + this.brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; + this.brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; + this.minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; + this.maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; + this.vibrationSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake_Freq, 500.0f); + this.minBrakeStiffnessTrackBar.Value = currentSettings._min_Brake_Stiffness; + this.maxBrakeStiffnessTrackBar.Value = currentSettings._max_Brake_Stiffness; + this.minBrakeResistanceTrackBar.Value = currentSettings._min_Brake_Resistance; + this.maxBrakeResistanceTrackBar.Value = currentSettings._max_Brake_Resistance; + this.brakeResistanceSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake, 500.0f); + + this.brakeEffectNumericUpDown.Value = this.brakeEffectIntensityTrackBar.Value; + this.gripLossNumericUpDown.Value = this.gripLossTrackBar.Value; + this.brakeVibrationStartNumericUpDown.Value = this.brakeVibrationStartTrackBar.Value; + this.brakeVibrationModeNumericUpDown.Value = this.brakeVibrationModeTrackBar.Value; + this.minBrakeVibrationNumericUpDown.Value = this.minBrakeVibrationTrackBar.Value; + this.maxBrakeVibrationNumericUpDown.Value = this.maxBrakeVibrationTrackBar.Value; + this.brakeVibrationSmoothNumericUpDown.Value = this.vibrationSmoothingTrackBar.Value; + this.minBrakeStifnessNumericUpDown.Value = this.minBrakeStiffnessTrackBar.Value; + this.maxBrakeStifnessNumericUpDown.Value = this.maxBrakeStiffnessTrackBar.Value; + this.minBrakeResistanceNumericUpDown.Value = this.minBrakeResistanceTrackBar.Value; + this.maxBrakeResistanceNumericUpDown.Value = this.maxBrakeResistanceTrackBar.Value; + this.brakeResistanceSmoothNumericUpDown.Value = this.brakeResistanceSmoothingTrackBar.Value; + + // Throttle Panel + this.throttleTriggerModeComboBox.SelectedIndex = currentSettings.ThrottleTriggerMode; + this.throttleIntensityTrackBar.Value = DenormalizeValue(currentSettings._right_Trigger_Effect_Intensity); + this.throttleGripLossTrackBar.Value = DenormalizeValue(currentSettings._throttle_Grip_Loss_Val); + this.throttleTurnAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._turn_Accel_Mod); + this.throttleForwardAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._forward_Accel_Mod); + this.throttleAccelLimitTrackBar.Value = currentSettings._acceleration_Limit; + this.throttleVibrationModeStartTrackBar.Value = currentSettings._throttle_Vibration_Mode_Start; + this.throttleMinVibrationTrackBar.Value = currentSettings._min_Accel_Griploss_Vibration; + this.throttleMaxVibrationTrackBar.Value = currentSettings._max_Accel_Griploss_Vibration; + this.throttleVibrationSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle_Freq); + this.throttleMinStiffnessTrackBar.Value = currentSettings._min_Accel_Griploss_Stiffness; + this.throttleMaxStiffnessTrackBar.Value = currentSettings._max_Accel_Griploss_Stiffness; + this.throttleMinResistanceTrackBar.Value = currentSettings._min_Throttle_Resistance; + this.throttleMaxResistanceTrackBar.Value = currentSettings._max_Throttle_Resistance; + this.throttleResistanceSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle); + + this.throttleIntensityNumericUpDown.Value = this.throttleIntensityTrackBar.Value; + this.throttleGripLossNumericUpDown.Value = this.throttleGripLossTrackBar.Value; + this.throttleTurnAccelScaleNumericUpDown.Value = this.throttleTurnAccelScaleTrackBar.Value; + this.throttleForwardAccelScaleNumericUpDown.Value = this.throttleForwardAccelScaleTrackBar.Value; + this.throttleAccelLimitNumericUpDown.Value = this.throttleAccelLimitTrackBar.Value; + this.throttleVibrationStartNumericUpDown.Value = this.throttleVibrationModeStartTrackBar.Value; + this.throttleMinVibrationNumericUpDown.Value = this.throttleMinVibrationTrackBar.Value; + this.throttleMaxVibrationNumericUpDown.Value = this.throttleMaxVibrationTrackBar.Value; + this.throttleVibrationSmoothNumericUpDown.Value = this.throttleVibrationSmoothTrackBar.Value; + this.throttleMinStiffnessNumericUpDown.Value = this.throttleMinStiffnessTrackBar.Value; + this.throttleMaxStiffnessNumericUpDown.Value = this.throttleMaxStiffnessTrackBar.Value; + this.throttleMinResistanceNumericUpDown.Value = this.throttleMinResistanceTrackBar.Value; + this.throttleMaxResistanceNumericUpDown.Value = this.throttleMaxResistanceTrackBar.Value; + this.throttleResistanceSmoothNumericUpDown.Value = this.throttleResistanceSmoothTrackBar.Value; + } + + static int DenormalizeValue(float normalizedValue, float scale = 100.0f) + { + return (int)Math.Floor(normalizedValue * scale); + } + + static float NormalizeValue(float value, float scale = 100.0f) + { + if (scale == 0) + return value; + + return value / scale; + } + + private void verboseModeFullToolStripMenuItem_Click(object sender, EventArgs e) + { + currentSettings._verbose = 2; + verboseModeOffToolStripMenuItem.Checked = false; + verboseModeLowToolStripMenuItem.Checked = false; + verboseModeFullToolStripMenuItem.Checked = true; + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + + } + + private void verboseModeLowToolStripMenuItem_Click(object sender, EventArgs e) + { + currentSettings._verbose = 1; + verboseModeOffToolStripMenuItem.Checked = false; + verboseModeLowToolStripMenuItem.Checked = true; + verboseModeFullToolStripMenuItem.Checked = false; + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + + } + + private void verboseModeOffToolStripMenuItem_Click(object sender, EventArgs e) + { + currentSettings._verbose = 0; + verboseModeOffToolStripMenuItem.Checked = true; + verboseModeLowToolStripMenuItem.Checked = false; + verboseModeFullToolStripMenuItem.Checked = false; + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + + noRaceGroupBox.Visible = false; + raceGroupBox.Visible = false; + } + + #region Misc + private void rpmTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._rpm_Redline_Ratio = NormalizeValue(this.rpmTrackBar.Value); + rpmValueNumericUpDown.Value = rpmTrackBar.Value; + } + + private void rpmValueNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._rpm_Redline_Ratio = NormalizeValue((float)this.rpmValueNumericUpDown.Value); + rpmTrackBar.Value = (int)Math.Floor(rpmValueNumericUpDown.Value); + } + + private void appCheckBox_CheckedChanged(object sender, EventArgs e) + { + currentSettings._disable_App_Check = this.appCheckBox.Checked; + } + + private void dsxNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._dsx_PORT = (int)Math.Floor(this.dsxNumericUpDown.Value); + } + + private void forzaPortNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._forza_PORT = (int)Math.Floor(this.forzaPortNumericUpDown.Value); + } + #endregion + + #region Brake + private void brakeEffectIntensityTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._left_Trigger_Effect_Intensity = NormalizeValue(brakeEffectIntensityTrackBar.Value); + this.brakeEffectNumericUpDown.Value = brakeEffectIntensityTrackBar.Value; + } + + private void brakeEffectNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._left_Trigger_Effect_Intensity = NormalizeValue((float)brakeEffectNumericUpDown.Value); + brakeEffectIntensityTrackBar.Value = (int)Math.Floor(brakeEffectNumericUpDown.Value); + } + + private void gripLossTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._grip_Loss_Val = NormalizeValue(this.gripLossTrackBar.Value); + gripLossNumericUpDown.Value = gripLossTrackBar.Value; + } + + private void gripLossNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._grip_Loss_Val = NormalizeValue((float)gripLossNumericUpDown.Value); + gripLossTrackBar.Value = (int)Math.Floor(gripLossNumericUpDown.Value); + } + + private void brakeVibrationStartTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._brake_Vibration_Start = this.brakeVibrationStartTrackBar.Value; + brakeVibrationStartNumericUpDown.Value = brakeVibrationStartTrackBar.Value; + } + + private void brakeVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._brake_Vibration_Start = (int)Math.Floor(brakeVibrationStartNumericUpDown.Value); + brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; + } + + private void brakeVibrationModeTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._brake_Vibration_Mode_Start = this.brakeVibrationModeTrackBar.Value; + brakeVibrationModeNumericUpDown.Value = brakeVibrationModeTrackBar.Value; + } + + private void brakeVibrationModeNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._brake_Vibration_Mode_Start = (int)Math.Floor(brakeVibrationModeNumericUpDown.Value); + brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; + } + + private void minBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._min_Brake_Vibration = minBrakeVibrationTrackBar.Value; + minBrakeVibrationNumericUpDown.Value = minBrakeVibrationTrackBar.Value; + } + + private void minBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._min_Brake_Vibration = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); + minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; + } + + private void maxBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._max_Brake_Vibration = maxBrakeVibrationTrackBar.Value; + maxBrakeVibrationNumericUpDown.Value = maxBrakeVibrationTrackBar.Value; + } + + private void maxBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._max_Brake_Vibration = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); + maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; + } + + private void vibrationSmoothingTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue(vibrationSmoothingTrackBar.Value, 500); + brakeVibrationSmoothNumericUpDown.Value = vibrationSmoothingTrackBar.Value; + } + + private void brakeVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue((float)brakeVibrationSmoothNumericUpDown.Value, 500); + vibrationSmoothingTrackBar.Value = (int)Math.Floor(brakeVibrationSmoothNumericUpDown.Value); + } + + private void minBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._min_Brake_Stiffness = minBrakeStiffnessTrackBar.Value; + minBrakeStifnessNumericUpDown.Value = minBrakeStiffnessTrackBar.Value; + } + + private void minBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._min_Brake_Stiffness = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); + minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Stiffness; + } + + private void maxBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._max_Brake_Stiffness = maxBrakeStiffnessTrackBar.Value; + maxBrakeStifnessNumericUpDown.Value = maxBrakeStiffnessTrackBar.Value; + } + + private void maxBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._max_Brake_Stiffness = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); + maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Stiffness; + } + + private void minBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) + { + int value = minBrakeResistanceTrackBar.Value; + if (value > currentSettings._max_Brake_Resistance) + value = currentSettings._max_Brake_Resistance; + + currentSettings._min_Brake_Resistance = value; + + minBrakeResistanceTrackBar.Value = value; + minBrakeResistanceNumericUpDown.Value = value; + } + + private void minBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(minBrakeResistanceNumericUpDown.Value); + if (value > currentSettings._max_Brake_Resistance) + value = currentSettings._max_Brake_Resistance; + + currentSettings._min_Brake_Resistance = value; + + minBrakeResistanceTrackBar.Value = value; + minBrakeResistanceNumericUpDown.Value = value; + } + + private void maxBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) + { + int value = maxBrakeResistanceTrackBar.Value; + if (value < currentSettings._min_Brake_Resistance) + value = currentSettings._min_Brake_Resistance; + + currentSettings._max_Brake_Resistance = value; + + maxBrakeResistanceTrackBar.Value = value; + maxBrakeResistanceNumericUpDown.Value = value; + } + + private void maxBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(maxBrakeResistanceNumericUpDown.Value); + if (value < currentSettings._min_Brake_Resistance) + value = currentSettings._min_Brake_Resistance; + + currentSettings._max_Brake_Resistance = value; + + maxBrakeResistanceTrackBar.Value = value; + maxBrakeResistanceNumericUpDown.Value = value; + } + + private void brakeResistanceSmoothingTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._ewma_Alpha_Brake = NormalizeValue(brakeResistanceSmoothingTrackBar.Value, 500); + brakeResistanceSmoothNumericUpDown.Value = brakeResistanceSmoothingTrackBar.Value; + } + + private void brakeResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._ewma_Alpha_Brake = NormalizeValue((float)brakeResistanceSmoothNumericUpDown.Value, 500); + brakeResistanceSmoothingTrackBar.Value = (int)Math.Floor(brakeResistanceSmoothNumericUpDown.Value); + } + #endregion + + #region Throttle + private void throttleIntensityTrackBar_Scroll(object sender, EventArgs e) + { + currentSettings._right_Trigger_Effect_Intensity = NormalizeValue(throttleIntensityTrackBar.Value); + throttleIntensityNumericUpDown.Value = throttleIntensityTrackBar.Value; + } + + private void throttleIntensityNumericUpDown_ValueChanged(object sender, EventArgs e) + { + currentSettings._right_Trigger_Effect_Intensity = NormalizeValue((float)throttleIntensityNumericUpDown.Value); + throttleIntensityTrackBar.Value = (int)Math.Floor(throttleIntensityNumericUpDown.Value); + } + + private void throttleGripLossTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleGripLossTrackBar.Value; + currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); + throttleGripLossNumericUpDown.Value = value; + } + + private void throttleGripLossNumericUpDown_ValueChanged(object sender, EventArgs e) + { + float value = (float)throttleGripLossNumericUpDown.Value; + currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); + throttleGripLossTrackBar.Value = (int)Math.Floor(value); + } + + private void throttleTurnAccelScaleTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleTurnAccelScaleTrackBar.Value; + currentSettings._turn_Accel_Mod = NormalizeValue(value); + throttleTurnAccelScaleNumericUpDown.Value = value; + } + + private void throttleTurnAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) + { + float value = (float)throttleTurnAccelScaleNumericUpDown.Value; + currentSettings._turn_Accel_Mod = NormalizeValue(value); + throttleTurnAccelScaleTrackBar.Value = (int)Math.Floor(value); + } + + private void throttleForwardAccelScaleTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleForwardAccelScaleTrackBar.Value; + currentSettings._forward_Accel_Mod = NormalizeValue(value); + throttleForwardAccelScaleNumericUpDown.Value = value; + } + + private void throttleForwardAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) + { + float value = (float)throttleForwardAccelScaleNumericUpDown.Value; + currentSettings._forward_Accel_Mod = NormalizeValue(value); + throttleForwardAccelScaleTrackBar.Value = (int)Math.Floor(value); + } + + private void throttleAccelLimitTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleAccelLimitTrackBar.Value; + currentSettings._acceleration_Limit = value; + throttleAccelLimitNumericUpDown.Value = value; + } + + private void throttleAccelLimitNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleAccelLimitNumericUpDown.Value); + currentSettings._acceleration_Limit = value; + throttleAccelLimitTrackBar.Value = value; + } + + private void throttleVibrationModeStartTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleVibrationModeStartTrackBar.Value; + currentSettings._throttle_Vibration_Mode_Start = value; + throttleVibrationStartNumericUpDown.Value = value; + } + + private void throttleVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleVibrationStartNumericUpDown.Value); + currentSettings._throttle_Vibration_Mode_Start = value; + throttleVibrationModeStartTrackBar.Value = value; + } + + private void throttleMinVibrationTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMinVibrationTrackBar.Value; + currentSettings._min_Accel_Griploss_Vibration = value; + throttleMinVibrationNumericUpDown.Value = value; + } + + private void throttleMinVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMinVibrationNumericUpDown.Value); + currentSettings._min_Accel_Griploss_Vibration = value; + throttleMinVibrationTrackBar.Value = value; + } + + private void throttleMaxVibrationTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMaxVibrationTrackBar.Value; + currentSettings._max_Accel_Griploss_Vibration = value; + throttleMaxVibrationNumericUpDown.Value = value; + } + + private void throttleMaxVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMaxVibrationNumericUpDown.Value); + currentSettings._max_Accel_Griploss_Vibration = value; + throttleMaxVibrationTrackBar.Value = value; + } + + private void throttleVibrationSmoothTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleVibrationSmoothTrackBar.Value; + currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); + throttleVibrationSmoothNumericUpDown.Value = value; + } + + private void throttleVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) + { + float value = (float)throttleVibrationSmoothNumericUpDown.Value; + currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); + throttleVibrationSmoothTrackBar.Value = (int)Math.Floor(value); + } + + private void throttleMinStiffnessTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMinStiffnessTrackBar.Value; + currentSettings._min_Accel_Griploss_Stiffness = value; + throttleMinStiffnessNumericUpDown.Value = value; + } + + private void throttleMinStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMinStiffnessNumericUpDown.Value); + currentSettings._min_Accel_Griploss_Stiffness = value; + throttleMinStiffnessTrackBar.Value = value; + } + + private void throttleMaxStiffnessTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMaxStiffnessTrackBar.Value; + currentSettings._max_Accel_Griploss_Stiffness = value; + throttleMaxStiffnessNumericUpDown.Value = value; + } + + private void throttleMaxStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMaxStiffnessNumericUpDown.Value); + currentSettings._max_Accel_Griploss_Stiffness = value; + throttleMaxStiffnessTrackBar.Value = value; + } + + private void throttleMinResistanceTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMinResistanceTrackBar.Value; + currentSettings._min_Throttle_Resistance = value; + throttleMinResistanceNumericUpDown.Value = value; + } + + private void throttleMinResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMinResistanceNumericUpDown.Value); + currentSettings._min_Throttle_Resistance = value; + throttleMinResistanceTrackBar.Value = value; + } + + private void throttleMaxResistanceTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleMaxResistanceTrackBar.Value; + currentSettings._max_Throttle_Resistance = value; + throttleMaxResistanceNumericUpDown.Value = value; + } + + private void throttleMaxResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) + { + int value = (int)Math.Floor(throttleMaxResistanceNumericUpDown.Value); + currentSettings._max_Throttle_Resistance = value; + throttleMaxResistanceTrackBar.Value = value; + } + + private void throttleResistanceSmoothTrackBar_Scroll(object sender, EventArgs e) + { + int value = throttleResistanceSmoothTrackBar.Value; + currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); + throttleResistanceSmoothNumericUpDown.Value = value; + } + + private void throttleResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) + { + float value = (float)throttleResistanceSmoothNumericUpDown.Value; + currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); + throttleResistanceSmoothTrackBar.Value = (int)Math.Floor(value); + } + #endregion + + #endregion + + private void buttonApplyMisc_Click(object sender, EventArgs e) + { + if (forzaDSXWorker != null) + { + CurrentSettings.Save(); + + forzaDSXWorker.SetSettings(CurrentSettings); + } + } + + private void buttonApply_Brake_Click(object sender, EventArgs e) + { + if (forzaDSXWorker != null) + { + CurrentSettings.Save(); + + forzaDSXWorker.SetSettings(CurrentSettings); + } + } + + private void buttonApply_Throttle_Click(object sender, EventArgs e) + { + if (forzaDSXWorker != null) + { + CurrentSettings.Save(); + + forzaDSXWorker.SetSettings(CurrentSettings); + } + } + + private void miscDefaultsButton_Click(object sender, EventArgs e) + { + FullResetValues(); + } + + private void brakeDefaultsButton_Click(object sender, EventArgs e) + { + FullResetValues(); + } + + private void throttleDefaultsButton_Click(object sender, EventArgs e) + { + FullResetValues(); + } + + protected void FullResetValues() + { + CurrentSettings.Reset(); + + SetupUI(); + + if (forzaDSXWorker != null) + { + CurrentSettings.Save(); + + forzaDSXWorker.SetSettings(CurrentSettings); + + StartForzaDSXThread(); + } + } + + private void brakeTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + CurrentSettings.BrakeTriggerMode = (sbyte)brakeTriggerModeComboBox.SelectedIndex; + } + + private void throttleTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + CurrentSettings.ThrottleTriggerMode = (sbyte)throttleTriggerModeComboBox.SelectedIndex; + } + + + + private void toolStripAppCheckOnItem_Click(object sender, EventArgs e) + { + currentSettings._disable_App_Check = false; + toolStripAppCheckOnItem.Checked = true; + toolStripAppCheckOffItem.Checked = false; + toolStripAppCheckButton.Text = "App Check Enabled"; + + } + + + + + + private void toolStripAppCheckOffItem_Click(object sender, EventArgs e) + { + currentSettings._disable_App_Check = true; + toolStripAppCheckOnItem.Checked = false; + toolStripAppCheckOffItem.Checked = true; + toolStripAppCheckButton.Text = "App Check Disabled"; + } + + private void toolStripDSXPortButton_Click(object sender, EventArgs e) + { + try + { + currentSettings._dsx_PORT = Int32.Parse(toolStripDSXPortTextBox.Text); + } + catch (Exception) + { + toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); + } + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + } + + private void toolStripDSXPortTextBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyValue == (char)Keys.Enter) + { + try + { + currentSettings._dsx_PORT = Int32.Parse(toolStripDSXPortTextBox.Text); + } + catch (Exception) + { + toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); + } + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + } + } + } +} \ No newline at end of file diff --git a/UI.resx b/UI.resx index a18f5e1..19b95f9 100644 --- a/UI.resx +++ b/UI.resx @@ -123,4 +123,27 @@ 258, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAEKSURBVEhL3ZG9DsFQHMXvczDZvIOtXsHObuhqkViI3Quw + 6CYmNoMYJJ0NBiFFIoIytOuf0+TeXP3yde+iyS+3OcP53Z4y3/dJJ4HAsiwyTVMp6BQCBIZhKAWdEcHV + vSlBmeB82NFy1KLluEWOPRC5MoHdMWhazwi4RJlALgf4EuT6BI+5kCsTrGddUY658E+QvyXYHq9UnRyC + U87f4aUApcXhnrI9Jzg/laQKFntXlHM+lSQK5psL5fvbp/JvJLGCQqmSWM5JkiCT84igXGtSrruKLQ0T + luAdmZxHBG37FFuWBC/j5XKOmX8WAH7rcI6ZMffPgjQwN2bXJgDo/COBTpjneQ2dML0PY3cISreGe8HM + qgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAEKSURBVEhL3ZG9DsFQHMXvczDZvIOtXsHObuhqkViI3Quw + 6CYmNoMYJJ0NBiFFIoIytOuf0+TeXP3yde+iyS+3OcP53Z4y3/dJJ4HAsiwyTVMp6BQCBIZhKAWdEcHV + vSlBmeB82NFy1KLluEWOPRC5MoHdMWhazwi4RJlALgf4EuT6BI+5kCsTrGddUY658E+QvyXYHq9UnRyC + U87f4aUApcXhnrI9Jzg/laQKFntXlHM+lSQK5psL5fvbp/JvJLGCQqmSWM5JkiCT84igXGtSrruKLQ0T + luAdmZxHBG37FFuWBC/j5XKOmX8WAH7rcI6ZMffPgjQwN2bXJgDo/COBTpjneQ2dML0PY3cISreGe8HM + qgAAAABJRU5ErkJggg== + + \ No newline at end of file From 941ac2f545fe1ba491a389c91890c1f2a1eba8eb Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Mon, 25 Dec 2023 16:40:11 -0500 Subject: [PATCH 3/8] Add new Config Classes. Need to integrate into UI and App --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.futdcache.v2 | Bin 594 -> 594 bytes .vs/ForzaDSX/v17/.suo | Bin 55296 -> 52736 bytes Config/BrakeSettings.cs | 27 ++++++ Config/Config.cs | 16 ++++ Config/ConfigHandler.cs | 96 ++++++++++++++++++++++ Config/Profile.cs | 20 +++++ Config/ThrottleSettings.cs | 28 +++++++ Config/TriggerMode.cs | 15 ++++ Config/VerboseLevel.cs | 15 ++++ GameParsers/GameTypes.cs | 15 ++++ GameParsers/Parser.cs | 12 +++ Settings.cs | 28 +++++++ 13 files changed, 272 insertions(+) create mode 100644 Config/BrakeSettings.cs create mode 100644 Config/Config.cs create mode 100644 Config/ConfigHandler.cs create mode 100644 Config/Profile.cs create mode 100644 Config/ThrottleSettings.cs create mode 100644 Config/TriggerMode.cs create mode 100644 Config/VerboseLevel.cs create mode 100644 GameParsers/GameTypes.cs create mode 100644 GameParsers/Parser.cs create mode 100644 Settings.cs diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index cfa41523d01dec275255334f5f9b11f25e6bd2c2..6e2588c004638b82f36811bf8ad1a345b1c90779 100644 GIT binary patch delta 92 zcmV~$yA^;S3;@6f98v%P delta 92 zcmeC&%+tA1Ze7jTx|(V0YUXjOl5AX2!hAc|VGL@!Zq zG_9}L9%>t_M)_)MY_y=(nkK%I3aw2WqfHt$ZPcO>(t4da?$fi?#>W29B|m0&cD~u& z-_Fk5>Z2~Jce`xKepnJG|)Ir=mnf&C{aeNZY9z6f_j2qFM65Ky%4 zhfG76ju_?`k48BLk%<_K$U=-m(Ami^H6!+;5wo0hHXDS9o_>iARjJdIKU`IgffjKH zkHwyG>+BI0q1LnWe&Mwy2mhS|{D=Pw{-M{+mlN;WR^rMP*CWnV2scCwg0@PWha;Rh z_rNi6PV>Y$N#dO3%Q&aICC(ENPMp&>bvELhxR*Ik!9HLMo zO7o!1Yz@aCLf8Wkr7yzIF%CdE#L*8zsde;+q6~5LpB$U~Hn*tr6%?uRlaNg63w+}1 zy4K+mVb7LX_M&CX+%oquZ->6QMM|Qw#Az2`sy4&wkSLx4VL~8uMx=F zCixs-DlDP>La#%bitJ<8U^LPypg+10&Ix*v_}L>h#T0TlJ2=txFb)-5>espo9hpWh z@-Xu0xD_ysHCsF)Au@L_8AEUGWfk*41A5T%!XmwXU#TzPGFMQ7koE4A)NBZBlI^Q5 z&No6=mJftj<1Bf(FS&;zl|4cH(?v{chv4!LMIMBHpKi3b{IZH?poUVnyn{hhBL<3x z^kn3Cu40r^U7Re`4{@*#L5(gq>1l9LZl$Z2ovFMqggQ~dAZ%m+Xp+>DF6jo3iDwI0 zBU{4iSX$Tg?vr;nWz65B>D|1&AZE?Xi*v3-Y%89nt-0`^>PbCx8GK!8SS74UD~9r~ zy8`Yes4 z$+^cN-lzp_)*x7$6AiodUhq?QL?A^16?!WA6$SBCjcQ(MuUs&*X}HvxW#HCg!IIWf zUOCCVd|%5K$1Eovul)YVgAC98Vi*%sA8u2f-8}fch416{_MoIq-olEr48v;P1WbWg zs@!U@_+VwCIp+rVGyK4i-f1b$RZ=#MMaT!2OvRXRyK_ABD_it&`j)&owT;y^FsVBh zR%~#G8Cj8_$x(PDC8wpzvomqFLYXS1voSk< zOKaY6dB@NDHPc4izrX0j!`2d78fGW!c$@R`!L@7-I;mq-xOf>ZV!}WBnQ(DSTePly zy3wtFrbo}MUyptQ{acov+Esce_Q!(T>!cN%_BY=fMsByxR>B(vUXrQJ%sb+Zum094 z59i_SIKOq#{??_wYBxnTaf?3;%h*&TA{&oekH7e;oZf0r7p$MQ^U;yvQ?H+S)H$|k zukW44Ufa&YH`Of*CY=A>Y(I2GMy%#<&vEOhc{$FXt^SLxK8`G0P;`O(K hq&p}5MXOn3wF=e-h4rA&u}^T7gbOw<@k6$-KLOi#v6BD* delta 2038 zcmchXT})h65Xbi%_HK9SLP7R}ElZ(WzM*uXb+s(uB1=nwvTI9~ww3|~tri*+SJMw{ zn?6(|#Lzn?z7V6g_QhyY_r7X^X-x>RLVT(5sj1NzYacY2lp4YREcXI6X^byD$?wjY zIdeYloSAcBGVQ{(w26A*`@CVB%#4568M+$!LDX8%qI5={5gX`F8MCKBR{-_(H*$$B^qGD?kmff~?1zaEtw1X!B`-UK&0#AdTpbiv*de8tG z!80HNn!vN58AO2>@ES&=0wtq(yJ0)JW~^&XpMCSFNvWg}C0CrlxxFF|J$$)0SCvDV z@h>m-bL4kpPAc+kc3zSLW5)bHu7c**x!@wKd7INQD;t<6+>CxP$N()MfQ<{9{OECz z*~;2@WPb)W#`gB_q8>;gQeh<`_vF8_r6Jl~%gUeOmSXCK~w{p$V}eW`iRzYnaH zNVO~{4f&w6)E6V^ywHAi#|_w^%k<19+z`!u8n zPC$7U%O6PB6G&C|;YPn#yD4&DO05piov}@N|}HC`+R zDAs+*$9cdvm`eS@zJcMv>fr%asOODReJUOi{J`irk$VV5%%!_Je-moOb^c45ub6cR zt|(6Wl~CkBanV9vyB+6Cy+G!WI)GI0ccd=NzBS3_~l%&Cbq!Jh0mpITAf_;ZhlnIw0%;|$fB&q?bKYl zSD$EnP5htREk$~m0j)JcQaj7%RCog?EtJnZ#z56vA%CFsF@@>j|Fxz5*P=fNcM5(K zDA6#ky=zO>qv8!U`JS*+?6_agAG*0Q`zUgFxs^@5gTA8wbx9H0c$PLMwUbtDQYJr^ zHeG6qLi;qJO-b#Bq@TZOq=~O0`nj2lX*4xsgHo3n48AoItO}0o>Kl4}@Gx?^l78y0 b5JAe1AERqA#j!F-O_N@_*_BSAgERjCL6%v> diff --git a/Config/BrakeSettings.cs b/Config/BrakeSettings.cs new file mode 100644 index 0000000..f312a23 --- /dev/null +++ b/Config/BrakeSettings.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal class BrakeSettings + { + internal TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; + + internal float EffectIntensity { get; set; } = 0.7f; + + internal float GripLossValue { get; set; } = 0.5f; + internal int VibrationStart { get; set; } = 20; + internal int VibrationModeStart { get; set; } = 10; + internal int MinVibration { get; set; } = 3; + internal int MaxVibration { get; set; } = 35; + internal float VibrationSmoothing { get; set; } = 1f; + internal int MinStiffness { get; set; } = 200; + internal int MaxStiffness { get; set; } = 1; + internal int MinResistance { get; set; } = 1; + internal int MaxResistance { get; set; } = 6; + internal float ResistanceSmoothing { get; set; } = 1f; + } +} diff --git a/Config/Config.cs b/Config/Config.cs new file mode 100644 index 0000000..9ca9a8c --- /dev/null +++ b/Config/Config.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal class Config + { + internal bool DisableAppCheck { get; set; } + internal VerboseLevel VerboseLevel { get; set; } = VerboseLevel.Off; + internal Dictionary Profiles { get; set; } = new Dictionary(); + + } +} diff --git a/Config/ConfigHandler.cs b/Config/ConfigHandler.cs new file mode 100644 index 0000000..12fac94 --- /dev/null +++ b/Config/ConfigHandler.cs @@ -0,0 +1,96 @@ +using ForzaDSX.GameParsers; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ForzaDSX.Config +{ + internal class ConfigHandler + { + //Methods to read config file + //Method to initialize config file (Using default values), need to account for the different default profiles + //Method to write config file + //Singleton access to config data + private static readonly String configFilePath = "RacingDSX.json"; + private static Config configData; + + private static void InitializeConfig() + { + configData ??= ReadConfigFromDisk(); + configData ??= new Config(); + configData = AddDefaultProfiles(configData); + } + + + + + private static Config AddDefaultProfiles(Config config) + { + config.Profiles ??= new Dictionary(); + if (!config.Profiles.ContainsKey("Forza")) + { + Profile profile = new Profile + { + Name = "Forza", + gameUDPPort = 5300, + GameType = GameTypes.Forza, + }; + profile.executableNames.AddRange(new string[] { "ForzaHorizon5", "ForzaHorizon4", "ForzaMotorsport7", "forza_gaming.desktop.x64_release_final", "forza_steamworks_release_final" }); + config.Profiles.Add("Forza", profile); + } + + return config; + } + + private static Config ReadConfigFromDisk() + { + + try + { + if (!File.Exists(configFilePath)) { + return null; + } + string jsonString = File.ReadAllText(configFilePath); + + Config config = JsonSerializer.Deserialize(jsonString); + return config; + } + catch (Exception) + { + return null; + } + + } + private static void WriteConfigToDisk() + { + try + { + string jsonString = JsonSerializer.Serialize(configData); + File.WriteAllText(configFilePath, jsonString); + } catch (Exception) + { + + } + } + + public static void SaveConfig() + { + WriteConfigToDisk(); + + } + + public static Config GetConfig() + { + if (configData == null) + { + InitializeConfig(); + } + return configData; + } + } +} diff --git a/Config/Profile.cs b/Config/Profile.cs new file mode 100644 index 0000000..e59e3d8 --- /dev/null +++ b/Config/Profile.cs @@ -0,0 +1,20 @@ +using ForzaDSX.GameParsers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal class Profile + { + internal GameTypes GameType { get; set; } = GameTypes.None; + internal bool IsEnabled { get; set; } = true; + internal string Name { get; set; } + internal uint gameUDPPort { get; set; } + internal List executableNames { get; set; } = new List(); + internal ThrottleSettings throttleSettings { get; set; } = new ThrottleSettings(); + internal BrakeSettings brakeSettings { get; set; } = new BrakeSettings(); + } +} diff --git a/Config/ThrottleSettings.cs b/Config/ThrottleSettings.cs new file mode 100644 index 0000000..5540776 --- /dev/null +++ b/Config/ThrottleSettings.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal class ThrottleSettings + { + internal TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; + internal float GripLossValue { get; set; } = 0.2f; + internal float EffectIntensity { get; set; } = 0.9f; + internal float TurnAccelerationScale { get; set; } = 0.5f; + internal float ForwardAccelerationScale { get; set; } = 1.0f; + internal int AccelerationLimit { get; set; } = 10; + internal int VibrationModeStart { get; set; } = 5; + internal int MinVibration { get; set; } = 3; + internal int MaxVibration { get; set; } = 35; + internal float VibrationSmoothing { get; set; } = 0.5f; + internal int MinStiffness { get; set; } = 200; + internal int MaxStiffness { get; set; } = 75; + internal int MinResistance { get; set; } = 1; + internal int MaxResistance { get; set; } = 6; + internal float ResistanceSmoothing { get; set; } = 0.01f; + + } +} diff --git a/Config/TriggerMode.cs b/Config/TriggerMode.cs new file mode 100644 index 0000000..5751abe --- /dev/null +++ b/Config/TriggerMode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal enum TriggerMode + { + Off, + Resistance, + Vibration + } +} diff --git a/Config/VerboseLevel.cs b/Config/VerboseLevel.cs new file mode 100644 index 0000000..986bfd8 --- /dev/null +++ b/Config/VerboseLevel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.Config +{ + internal enum VerboseLevel + { + Off, + Limited, + Full + } +} diff --git a/GameParsers/GameTypes.cs b/GameParsers/GameTypes.cs new file mode 100644 index 0000000..164864a --- /dev/null +++ b/GameParsers/GameTypes.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.GameParsers +{ + internal enum GameTypes + { + None = 0, + Forza, + Dirt + } +} diff --git a/GameParsers/Parser.cs b/GameParsers/Parser.cs new file mode 100644 index 0000000..0974101 --- /dev/null +++ b/GameParsers/Parser.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.GameParsers +{ + internal interface Parser + { + } +} diff --git a/Settings.cs b/Settings.cs new file mode 100644 index 0000000..c5c38b4 --- /dev/null +++ b/Settings.cs @@ -0,0 +1,28 @@ +namespace ForzaDSX.Properties { + + + // This class allows you to handle specific events on the settings class: + // The SettingChanging event is raised before a setting's value is changed. + // The PropertyChanged event is raised after a setting's value is changed. + // The SettingsLoaded event is raised after the setting values are loaded. + // The SettingsSaving event is raised before the setting values are saved. + public sealed partial class Settings { + + public Settings() { + // // To add event handlers for saving and changing settings, uncomment the lines below: + // + // this.SettingChanging += this.SettingChangingEventHandler; + // + // this.SettingsSaving += this.SettingsSavingEventHandler; + // + } + + private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { + // Add code to handle the SettingChangingEvent event here. + } + + private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { + // Add code to handle the SettingsSaving event here. + } + } +} From 1c33b921de9967d812b4cf771c5682cb8120536e Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Mon, 25 Dec 2023 23:09:07 -0500 Subject: [PATCH 4/8] Switched UI and Worker to new Config structure. UI supports profiles correctly. Need to Migrate Workers to use Parser Interfaces. Need to work on setting active profile --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.suo | Bin 52736 -> 108544 bytes AppCheckThread.cs | 4 +- Config/BrakeSettings.cs | 28 +- Config/Config.cs | 11 +- Config/ConfigHandler.cs | 3 +- Config/Profile.cs | 18 +- Config/ThrottleSettings.cs | 32 +- Config/TriggerMode.cs | 2 +- Config/VerboseLevel.cs | 4 +- ForzaDSX.csproj.user | 3 + ForzaDSXWorker.cs | 126 ++--- GameParsers/GameTypes.cs | 2 +- GameParsers/Parser.cs | 2 +- NameForm.Designer.cs | 130 +++++ NameForm.cs | 35 ++ NameForm.resx | 120 +++++ Program.cs | 2 +- UI.Designer.cs | 151 +++--- UI.cs | 593 ++++++++++++++++------ UI.resx | 3 + 21 files changed, 931 insertions(+), 338 deletions(-) create mode 100644 NameForm.Designer.cs create mode 100644 NameForm.cs create mode 100644 NameForm.resx diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index 6e2588c004638b82f36811bf8ad1a345b1c90779..519134673eede1cea9eceed154ae9c9f2773731f 100644 GIT binary patch delta 9818 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 UkJ&tQiTVW#w%>6uw7>2D0Oki^asU7T delta 9612 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 cQ9!ZyE_*D@oRxM>l%@6 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 delta 5437 zcmeI03viUx7018(?QXIOo0r)3Er6&b{Y8zkBXI=Pt@XkkYN|m`&~VVdh9lnkGq-4h)Zsj6g`b-lcm)XR}_FD@8hO zpK1x4vo~Wy{u?5jYZsA6_Q)xMK9#GC=rLk|Qma=*G#yQf2}(ifgpNGA@({tbvjc0} z`cZn@gg;1$;5;`OOFVrzbmQf;vAiBKH9((^JhzR8Gy*f20+K--umN5ZzD$Y$p@7?8 zAxUjg6bkX66wCoJfG6Z-PX$+kt3V-00@DH4FM-Si37}+5w;0kgmUoQFJji@7W2}5N z4W9&C8F zM-~XQ2X|t7uwBOOVMm_r!DnjR9=u4lM=tnA?Xjg$2uYHG4(Nda1c6{+1iX|`$SJ@C z!az6}rowQS81Aj#EL77XJs;bND@1P7ay{?C1-Ewa`~%{tN4KZ>kQF%Ar~ms1AAxr7nriC6v>CImeKK4}X{rCuPA=B+`MT zd5{)A*|L7JvKpF5i4Bq2?HH#6{22TM@UC`3s^F*KA@DF@{WeHi6u;f;)RsWH|-QyZu?L}0N#8cI!|NUMGVi#0KcPa$&!+K=bQWgMMPjiY9( zK7L$dK`Y*0jsVjEwOiv&d*ZoahPODN3C|fKNCOwcc%5w-T^iM zIy&9bx5g(duXoM+&`^G`DEZ#3YrntD)8C59OBb^<6QfEbwtVNvfw~J7>^`TVvF%W>S7WJNkKf^h9Cf1G}pk zE^=8Mv>{_apNW0}>z;+{%+Z!3=Y-nuCzSN?#ucdJ(8so&sHMqWvgs)_>H?g47RhRC zss9aEiDE$CSX@eTj(0HDB-EXX`pl=HH%o4*347isk+MsnU+gld-;MB^t3J}H&85aN zbZ0wH4B>S*w+r%JU25brf03UsY0&HfoV?0PMf5bwTJ21csCCQ`X z@4?LOr*EwL4)VRPZad!4-EZUk!O#;?NuTvMRUnTp5;^ZT&*qMqGmotgg7VNqrE%8)$e>y4kdeT2&CV5*rIUiU~M~Y^XRZhf% zMNrL_IIfQ!T^Tey71HP>qo`e(x>`w(Cug*FNEH@17&Dsi+uAJ1S+s&)eIP@vRU$9F zp46F@>3ud+#tB&F+@Wlhd)COL?7UALp(%SjUZMGfSV6^)R?-JMLn*!Y+UV8h=Z2q4 zuH3n;VYilis<2WT*h@<93X1K^=<8DiDP79v4x(4tlT3O4Nie^^CB_*tXXaCu`zkYY4w{zjcAB(1fFSFT`ZPvs#&;6>~Y%F8@mM*Ik4my1LO6~M= zVVpWPNW^&ESUI3c++~_*x8WU@?I_qd{&g25M;4CHeCOB;1Z1@wiGS*gZ$0Lhc#nMRG2vAIcRc2k@R$bSz0c7E80lB9~rik)sT6Tvp Vdaap{_)j*~?z`K2_lx)F{tFzdh>ZXM diff --git a/AppCheckThread.cs b/AppCheckThread.cs index ad2b910..0b96b1a 100644 --- a/AppCheckThread.cs +++ b/AppCheckThread.cs @@ -40,12 +40,12 @@ public AppCheckReportStruct(AppType type) internal class AppCheckThread { - readonly ForzaDSX.Properties.Settings settings; + readonly ForzaDSX.Config.Config settings; readonly IProgress progressReporter; protected bool bRunning = false; - public AppCheckThread(ref ForzaDSX.Properties.Settings currentSettings, IProgress progressReporter) + public AppCheckThread(ref ForzaDSX.Config.Config currentSettings, IProgress progressReporter) { settings = currentSettings; this.progressReporter = progressReporter; diff --git a/Config/BrakeSettings.cs b/Config/BrakeSettings.cs index f312a23..4cff567 100644 --- a/Config/BrakeSettings.cs +++ b/Config/BrakeSettings.cs @@ -6,22 +6,22 @@ namespace ForzaDSX.Config { - internal class BrakeSettings + public class BrakeSettings { - internal TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; + public TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; - internal float EffectIntensity { get; set; } = 0.7f; + public float EffectIntensity { get; set; } = 0.7f; - internal float GripLossValue { get; set; } = 0.5f; - internal int VibrationStart { get; set; } = 20; - internal int VibrationModeStart { get; set; } = 10; - internal int MinVibration { get; set; } = 3; - internal int MaxVibration { get; set; } = 35; - internal float VibrationSmoothing { get; set; } = 1f; - internal int MinStiffness { get; set; } = 200; - internal int MaxStiffness { get; set; } = 1; - internal int MinResistance { get; set; } = 1; - internal int MaxResistance { get; set; } = 6; - internal float ResistanceSmoothing { get; set; } = 1f; + public float GripLossValue { get; set; } = 0.5f; + public int VibrationStart { get; set; } = 20; + public int VibrationModeStart { get; set; } = 10; + public int MinVibration { get; set; } = 3; + public int MaxVibration { get; set; } = 35; + public float VibrationSmoothing { get; set; } = 1f; + public int MinStiffness { get; set; } = 200; + public int MaxStiffness { get; set; } = 1; + public int MinResistance { get; set; } = 1; + public int MaxResistance { get; set; } = 6; + public float ResistanceSmoothing { get; set; } = 1f; } } diff --git a/Config/Config.cs b/Config/Config.cs index 9ca9a8c..7bc8c54 100644 --- a/Config/Config.cs +++ b/Config/Config.cs @@ -6,11 +6,14 @@ namespace ForzaDSX.Config { - internal class Config + public class Config { - internal bool DisableAppCheck { get; set; } - internal VerboseLevel VerboseLevel { get; set; } = VerboseLevel.Off; - internal Dictionary Profiles { get; set; } = new Dictionary(); + public bool DisableAppCheck { get; set; } + public VerboseLevel VerboseLevel { get; set; } = VerboseLevel.Off; + public Dictionary Profiles { get; set; } = new Dictionary(); + public Profile ActiveProfile { get; set; } = null; + + public int DSXPort { get; set; } = 6900; } } diff --git a/Config/ConfigHandler.cs b/Config/ConfigHandler.cs index 12fac94..8f8c29c 100644 --- a/Config/ConfigHandler.cs +++ b/Config/ConfigHandler.cs @@ -10,7 +10,7 @@ namespace ForzaDSX.Config { - internal class ConfigHandler + public class ConfigHandler { //Methods to read config file //Method to initialize config file (Using default values), need to account for the different default profiles @@ -24,6 +24,7 @@ private static void InitializeConfig() configData ??= ReadConfigFromDisk(); configData ??= new Config(); configData = AddDefaultProfiles(configData); + SaveConfig(); } diff --git a/Config/Profile.cs b/Config/Profile.cs index e59e3d8..c8df9eb 100644 --- a/Config/Profile.cs +++ b/Config/Profile.cs @@ -7,14 +7,16 @@ namespace ForzaDSX.Config { - internal class Profile + public class Profile { - internal GameTypes GameType { get; set; } = GameTypes.None; - internal bool IsEnabled { get; set; } = true; - internal string Name { get; set; } - internal uint gameUDPPort { get; set; } - internal List executableNames { get; set; } = new List(); - internal ThrottleSettings throttleSettings { get; set; } = new ThrottleSettings(); - internal BrakeSettings brakeSettings { get; set; } = new BrakeSettings(); + public GameTypes GameType { get; set; } = GameTypes.None; + public bool IsEnabled { get; set; } = true; + public string Name { get; set; } + public int gameUDPPort { get; set; } + public List executableNames { get; set; } = new List(); + public ThrottleSettings throttleSettings { get; set; } = new ThrottleSettings(); + public BrakeSettings brakeSettings { get; set; } = new BrakeSettings(); + + public float RPMRedlineRatio { get; set; } = 0.9f; } } diff --git a/Config/ThrottleSettings.cs b/Config/ThrottleSettings.cs index 5540776..02aece4 100644 --- a/Config/ThrottleSettings.cs +++ b/Config/ThrottleSettings.cs @@ -6,23 +6,23 @@ namespace ForzaDSX.Config { - internal class ThrottleSettings + public class ThrottleSettings { - internal TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; - internal float GripLossValue { get; set; } = 0.2f; - internal float EffectIntensity { get; set; } = 0.9f; - internal float TurnAccelerationScale { get; set; } = 0.5f; - internal float ForwardAccelerationScale { get; set; } = 1.0f; - internal int AccelerationLimit { get; set; } = 10; - internal int VibrationModeStart { get; set; } = 5; - internal int MinVibration { get; set; } = 3; - internal int MaxVibration { get; set; } = 35; - internal float VibrationSmoothing { get; set; } = 0.5f; - internal int MinStiffness { get; set; } = 200; - internal int MaxStiffness { get; set; } = 75; - internal int MinResistance { get; set; } = 1; - internal int MaxResistance { get; set; } = 6; - internal float ResistanceSmoothing { get; set; } = 0.01f; + public TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; + public float GripLossValue { get; set; } = 0.2f; + public float EffectIntensity { get; set; } = 0.9f; + public float TurnAccelerationScale { get; set; } = 0.5f; + public float ForwardAccelerationScale { get; set; } = 1.0f; + public int AccelerationLimit { get; set; } = 10; + public int VibrationModeStart { get; set; } = 5; + public int MinVibration { get; set; } = 3; + public int MaxVibration { get; set; } = 35; + public float VibrationSmoothing { get; set; } = 0.5f; + public int MinStiffness { get; set; } = 200; + public int MaxStiffness { get; set; } = 75; + public int MinResistance { get; set; } = 1; + public int MaxResistance { get; set; } = 6; + public float ResistanceSmoothing { get; set; } = 0.01f; } } diff --git a/Config/TriggerMode.cs b/Config/TriggerMode.cs index 5751abe..16ee8b3 100644 --- a/Config/TriggerMode.cs +++ b/Config/TriggerMode.cs @@ -6,7 +6,7 @@ namespace ForzaDSX.Config { - internal enum TriggerMode + public enum TriggerMode : sbyte { Off, Resistance, diff --git a/Config/VerboseLevel.cs b/Config/VerboseLevel.cs index 986bfd8..c5363c8 100644 --- a/Config/VerboseLevel.cs +++ b/Config/VerboseLevel.cs @@ -6,9 +6,9 @@ namespace ForzaDSX.Config { - internal enum VerboseLevel + public enum VerboseLevel { - Off, + Off = 0, Limited, Full } diff --git a/ForzaDSX.csproj.user b/ForzaDSX.csproj.user index cf6e5c3..c302bd1 100644 --- a/ForzaDSX.csproj.user +++ b/ForzaDSX.csproj.user @@ -8,6 +8,9 @@ <_LastSelectedProfileId>E:\Development\Projects\ForzaDSX\Properties\PublishProfiles\FolderProfile.pubxml + + Form + Form diff --git a/ForzaDSXWorker.cs b/ForzaDSXWorker.cs index b630a60..c56e1f4 100644 --- a/ForzaDSXWorker.cs +++ b/ForzaDSXWorker.cs @@ -1,4 +1,5 @@ -using System; +using ForzaDSX.Config; +using System; using System.IO; using System.Net; using System.Net.Sockets; @@ -61,7 +62,7 @@ public ForzaDSXReportStruct(string msg) public string message = string.Empty; } - ForzaDSX.Properties.Settings settings; + ForzaDSX.Config.Config settings; IProgress progressReporter; int lastThrottleResistance = 1; @@ -94,13 +95,13 @@ public ForzaDSXReportStruct(string msg) public static readonly int[] ColorClassX = { 105, 182, 72 }; - public ForzaDSXWorker(ForzaDSX.Properties.Settings currentSettings, IProgress progressReporter) + public ForzaDSXWorker(ForzaDSX.Config.Config currentSettings, IProgress progressReporter) { settings = currentSettings; this.progressReporter = progressReporter; } - public void SetSettings(ForzaDSX.Properties.Settings currentSettings) + public void SetSettings(ForzaDSX.Config.Config currentSettings) { lock(this) { @@ -116,6 +117,7 @@ void SendData(DataPacket data) { Packet p = new Packet(); CsvData csvRecord = new CsvData(); + Profile activeProfile = settings.ActiveProfile; //Set the controller to do this for int controllerIndex = 0; @@ -244,7 +246,7 @@ void SendData(DataPacket data) LightBar.parameters = new object[] { controllerIndex, CPIcolorR, CPIcolorG, CPIcolorB }; #endregion - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.NORACE, $"No race going on. Normal Triggers. Car's Class = {currentClass}; CPI = {currentCPI}; CPI Ratio = {cpiRatio}; Color [{CPIcolorR}, {CPIcolorG}, {CPIcolorB}]" )); @@ -259,43 +261,45 @@ void SendData(DataPacket data) { #region Right Trigger //Set the updates for the right Trigger(Throttle) - - avgAccel = (float)Math.Sqrt((settings._turn_Accel_Mod * (data.AccelerationX * data.AccelerationX)) + (settings._forward_Accel_Mod * (data.AccelerationZ * data.AccelerationZ))); + ThrottleSettings throttleSettings = activeProfile.throttleSettings; + avgAccel = (float)Math.Sqrt((throttleSettings.TurnAccelerationScale * (data.AccelerationX * data.AccelerationX)) + (throttleSettings.ForwardAccelerationScale * (data.AccelerationZ * data.AccelerationZ))); // Define losing grip as front tires slipping or rear tires slipping while accelerating a fair ammount bool bLosingAccelGrip = - combinedFrontTireSlip > settings._throttle_Grip_Loss_Val - || (combinedRearTireSlip > settings._throttle_Grip_Loss_Val && data.Accelerator > 200); + combinedFrontTireSlip > throttleSettings.GripLossValue + || (combinedRearTireSlip > throttleSettings.GripLossValue && data.Accelerator > 200); - if (settings.ThrottleTriggerMode == (sbyte)InstructionTriggerMode.NONE) + if (throttleSettings.TriggerMode == Config.TriggerMode.Off) { RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; } // If losing grip, start to "vibrate" - else if (bLosingAccelGrip && settings.ThrottleTriggerMode == (sbyte)InstructionTriggerMode.VIBRATION) + else if (bLosingAccelGrip && throttleSettings.TriggerMode == Config.TriggerMode.Vibration) { - freq = (int)Math.Floor(Map(combinedTireSlip, settings._throttle_Grip_Loss_Val, 5, 0, settings._max_Accel_Griploss_Vibration)); - resistance = (int)Math.Floor(Map(avgAccel, 0, settings._acceleration_Limit, settings._min_Accel_Griploss_Stiffness, settings._max_Accel_Griploss_Stiffness)); - filteredResistance = (int)EWMA(resistance, lastThrottleResistance, settings._ewma_Alpha_Throttle); - filteredFreq = (int)EWMA(freq, lastThrottleFreq, settings._ewma_Alpha_Throttle_Freq); + freq = (int)Math.Floor(Map(combinedTireSlip, throttleSettings.GripLossValue, 5, 0, throttleSettings.MaxVibration)); + resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinStiffness, throttleSettings.MaxStiffness)); + filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); + filteredFreq = (int)EWMA(freq, lastThrottleFreq, throttleSettings.VibrationSmoothing); lastThrottleResistance = filteredResistance; lastThrottleFreq = filteredFreq; - if (filteredFreq <= settings._min_Accel_Griploss_Vibration - || data.Accelerator <= settings._throttle_Vibration_Mode_Start) + if (filteredFreq <= throttleSettings.MinVibration + || data.Accelerator <= throttleSettings.VibrationModeStart) { - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * settings._right_Trigger_Effect_Intensity }; + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; filteredFreq = 0; filteredResistance = 0; } else { - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, filteredFreq * settings._right_Trigger_Effect_Intensity, filteredResistance * settings._right_Trigger_Effect_Intensity, settings._throttle_Vibration_Mode_Start, 0, 0, 0, 0 }; + RightTrigger.parameters = new object[] { + controllerIndex, Trigger.Right, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, + filteredFreq * throttleSettings.EffectIntensity, filteredResistance * throttleSettings.EffectIntensity,throttleSettings.VibrationModeStart, 0, 0, 0, 0 }; } - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); @@ -304,20 +308,20 @@ void SendData(DataPacket data) else { //It should probably always be uniformly stiff - resistance = (int)Math.Floor(Map(avgAccel, 0, settings._acceleration_Limit, settings._min_Throttle_Resistance, settings._max_Throttle_Resistance)); - filteredResistance = (int)EWMA(resistance, lastThrottleResistance, settings._ewma_Alpha_Throttle); + resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinResistance, throttleSettings.MaxResistance)); + filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); lastThrottleResistance = filteredResistance; - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * settings._right_Trigger_Effect_Intensity }; + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, String.Empty)); } } - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}\r\n Throttle Resistance: {filteredResistance}\r\n Accelerator: {data.Accelerator}" )); @@ -330,35 +334,36 @@ void SendData(DataPacket data) #endregion #region Left Trigger //Update the left(Brake) trigger - + BrakeSettings brakeSettings = activeProfile.brakeSettings; // Define losing grip as tires slipping while braking a fair ammount - bool bLosingBrakeGrip = combinedTireSlip > settings._grip_Loss_Val && data.Brake > 100; + bool bLosingBrakeGrip = combinedTireSlip > brakeSettings.GripLossValue && data.Brake > 100; - if (settings.BrakeTriggerMode == (sbyte)InstructionTriggerMode.NONE) + if (brakeSettings.TriggerMode == Config.TriggerMode.Off) { LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; } // If losing grip, start to "vibrate" - else if (bLosingBrakeGrip && settings.BrakeTriggerMode == (sbyte)InstructionTriggerMode.VIBRATION) + else if (bLosingBrakeGrip && brakeSettings.TriggerMode == Config.TriggerMode.Vibration) { - freq = (int)Math.Floor(Map(combinedTireSlip, settings._grip_Loss_Val, 5, 0, settings._max_Brake_Vibration)); - resistance = (int)Math.Floor(Map(data.Brake, 0, 255, settings._max_Brake_Stiffness, settings._min_Brake_Stiffness)); - filteredResistance = (int)EWMA(resistance, lastBrakeResistance, settings._ewma_Alpha_Brake); - filteredFreq = (int)EWMA(freq, lastBrakeFreq, settings._ewma_Alpha_Brake_Freq); + freq = (int)Math.Floor(Map(combinedTireSlip, brakeSettings.GripLossValue, 5, 0, brakeSettings.MaxVibration)); + resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MaxStiffness , brakeSettings.MinStiffness)); + filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); + filteredFreq = (int)EWMA(freq, lastBrakeFreq, brakeSettings.VibrationSmoothing); lastBrakeResistance = filteredResistance; lastBrakeFreq = filteredFreq; - if (filteredFreq <= settings._min_Brake_Vibration) + if (filteredFreq <= brakeSettings.MinVibration) { LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, 0 }; } else { - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, filteredFreq * settings._left_Trigger_Effect_Intensity, filteredResistance * settings._left_Trigger_Effect_Intensity, settings._brake_Vibration_Start, 0, 0, 0, 0 }; + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, + filteredFreq *brakeSettings.EffectIntensity, filteredResistance * brakeSettings.EffectIntensity, brakeSettings.VibrationStart, 0, 0, 0, 0 }; } //Set left trigger to the custom mode VibrateResitance with values of Frequency = freq, Stiffness = 104, startPostion = 76. - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); @@ -367,20 +372,20 @@ void SendData(DataPacket data) else { //By default, Increasingly resistant to force - resistance = (int)Math.Floor(Map(data.Brake, 0, 255, settings._min_Brake_Resistance, settings._max_Brake_Resistance)); - filteredResistance = (int)EWMA(resistance, lastBrakeResistance, settings._ewma_Alpha_Brake); + resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MinResistance, brakeSettings.MaxResistance)); + filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); lastBrakeResistance = filteredResistance; - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, filteredResistance * settings._left_Trigger_Effect_Intensity }; + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, filteredResistance * brakeSettings.EffectIntensity }; - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, String.Empty )); } } - if (settings._verbose > 0 + if (settings.VerboseLevel > 0 && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}\r\n Brake Resistance: {filteredResistance}\r\n Tire Slip: {combinedTireSlip} \r\n FLCPS: {data.frontLeftContactPatchV} \r\n speed: {data.Speed}" )); @@ -399,7 +404,7 @@ void SendData(DataPacket data) float CurrentRPMRatio = (currentRPM - data.EngineIdleRpm) / engineRange; int GreenChannel = Math.Max((int)Math.Floor(CurrentRPMRatio * 255), 50); int RedChannel = (int)Math.Floor(CurrentRPMRatio * 255); - if (CurrentRPMRatio >= settings._rpm_Redline_Ratio) + if (CurrentRPMRatio >= activeProfile.RPMRedlineRatio) { // Remove Green GreenChannel = 255 - GreenChannel; @@ -407,7 +412,7 @@ void SendData(DataPacket data) LightBar.parameters = new object[] { controllerIndex, RedChannel, GreenChannel, 0 }; - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"Engine RPM: {data.CurrentEngineRpm}; Engine Max RPM: {data.EngineMaxRpm}; Engine Idle RPM: {data.EngineIdleRpm}")); @@ -443,7 +448,7 @@ public float Map(float x, float in_min, float in_max, float out_min, float out_m void Connect() { senderClient = new UdpClient(); - var portNumber = settings._dsx_PORT; + var portNumber = settings.DSXPort; if (progressReporter != null) { @@ -459,9 +464,9 @@ void Connect() { if (progressReporter != null) { - progressReporter.Report(new ForzaDSXReportStruct($"DSX provided a non-numerical port! Using configured default ({settings._dsx_PORT}).")); + progressReporter.Report(new ForzaDSXReportStruct($"DSX provided a non-numerical port! Using configured default ({settings.DSXPort}).")); } - portNum = settings._dsx_PORT; + portNum = settings.DSXPort; } endPoint = new IPEndPoint(Triggers.localhost, portNum); @@ -496,20 +501,20 @@ void Connect() //Send Data to DSX void Send(Packet data) { - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"Converting Message to JSON" )); } byte[] RequestData = Encoding.ASCII.GetBytes(Triggers.PacketToJson(data)); - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"{Encoding.ASCII.GetString(RequestData)}" )); } try { - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"Sending Message to DSX..." )); @@ -517,7 +522,7 @@ void Send(Packet data) senderClient.Send(RequestData, RequestData.Length); - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"Message sent to DSX" )); @@ -572,10 +577,17 @@ public void Run() try { Connect(); - + if (settings.ActiveProfile == null) + { + if (progressReporter != null) + { + progressReporter.Report(new ForzaDSXReportStruct("No active profile selected. Exiting...")); + } + return; + } //Connect to Forza - ipEndPoint = new IPEndPoint(IPAddress.Loopback, settings._forza_PORT); - client = new UdpClient(settings._forza_PORT); + ipEndPoint = new IPEndPoint(IPAddress.Loopback, settings.ActiveProfile.gameUDPPort); + client = new UdpClient(settings.ActiveProfile.gameUDPPort); DataPacket data; byte[] resultBuffer; @@ -589,7 +601,7 @@ public void Run() if (resultBuffer == null) continue; //receive = await client.ReceiveAsync(); - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct("recieved Message from Forza!")); @@ -602,7 +614,7 @@ public void Run() } data = parseDirtData(resultBuffer); - if (settings._verbose > 1 + if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct("Data Parsed")); @@ -629,7 +641,7 @@ public void Stop() { bRunning = false; - if (settings._verbose > 0 + if (settings.VerboseLevel > VerboseLevel.Off && progressReporter != null) { progressReporter.Report(new ForzaDSXReportStruct($"Cleaning Up")); @@ -646,7 +658,7 @@ public void Stop() senderClient.Dispose(); } - if (settings._verbose > 0) + if (settings.VerboseLevel > VerboseLevel.Off) { progressReporter.Report(new ForzaDSXReportStruct($"Cleanup Finished. Exiting...")); } diff --git a/GameParsers/GameTypes.cs b/GameParsers/GameTypes.cs index 164864a..5e499d0 100644 --- a/GameParsers/GameTypes.cs +++ b/GameParsers/GameTypes.cs @@ -6,7 +6,7 @@ namespace ForzaDSX.GameParsers { - internal enum GameTypes + public enum GameTypes { None = 0, Forza, diff --git a/GameParsers/Parser.cs b/GameParsers/Parser.cs index 0974101..b7cb0f4 100644 --- a/GameParsers/Parser.cs +++ b/GameParsers/Parser.cs @@ -6,7 +6,7 @@ namespace ForzaDSX.GameParsers { - internal interface Parser + public interface Parser { } } diff --git a/NameForm.Designer.cs b/NameForm.Designer.cs new file mode 100644 index 0000000..733061d --- /dev/null +++ b/NameForm.Designer.cs @@ -0,0 +1,130 @@ +namespace ForzaDSX +{ + partial class NameForm + { + ///

+ /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + OkButton = new System.Windows.Forms.Button(); + CancelButton = new System.Windows.Forms.Button(); + flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); + label1 = new System.Windows.Forms.Label(); + NameTextBox = new System.Windows.Forms.TextBox(); + flowLayoutPanel1.SuspendLayout(); + flowLayoutPanel2.SuspendLayout(); + SuspendLayout(); + // + // flowLayoutPanel1 + // + flowLayoutPanel1.Controls.Add(OkButton); + flowLayoutPanel1.Controls.Add(CancelButton); + flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; + flowLayoutPanel1.Location = new System.Drawing.Point(0, 52); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + flowLayoutPanel1.Size = new System.Drawing.Size(800, 50); + flowLayoutPanel1.TabIndex = 0; + // + // OkButton + // + OkButton.DialogResult = System.Windows.Forms.DialogResult.OK; + OkButton.Location = new System.Drawing.Point(685, 3); + OkButton.Name = "OkButton"; + OkButton.Size = new System.Drawing.Size(112, 34); + OkButton.TabIndex = 0; + OkButton.Text = "OK"; + OkButton.UseVisualStyleBackColor = true; + OkButton.Click += OkButton_Click; + // + // CancelButton + // + CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + CancelButton.Location = new System.Drawing.Point(567, 3); + CancelButton.Name = "CancelButton"; + CancelButton.Size = new System.Drawing.Size(112, 34); + CancelButton.TabIndex = 1; + CancelButton.Text = "Cancel"; + CancelButton.UseVisualStyleBackColor = true; + // + // flowLayoutPanel2 + // + flowLayoutPanel2.Controls.Add(label1); + flowLayoutPanel2.Controls.Add(NameTextBox); + flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + flowLayoutPanel2.Location = new System.Drawing.Point(0, 0); + flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(20); + flowLayoutPanel2.Name = "flowLayoutPanel2"; + flowLayoutPanel2.Padding = new System.Windows.Forms.Padding(5); + flowLayoutPanel2.Size = new System.Drawing.Size(800, 52); + flowLayoutPanel2.TabIndex = 1; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(8, 5); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(68, 25); + label1.TabIndex = 0; + label1.Text = "Name: "; + // + // NameTextBox + // + NameTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + NameTextBox.Location = new System.Drawing.Point(82, 8); + NameTextBox.Name = "NameTextBox"; + NameTextBox.Size = new System.Drawing.Size(684, 31); + NameTextBox.TabIndex = 1; + // + // NameForm + // + AcceptButton = OkButton; + AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(800, 102); + Controls.Add(flowLayoutPanel2); + Controls.Add(flowLayoutPanel1); + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + Name = "NameForm"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + Text = "Please Enter the Profile Name:"; + TopMost = true; + flowLayoutPanel1.ResumeLayout(false); + flowLayoutPanel2.ResumeLayout(false); + flowLayoutPanel2.PerformLayout(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Button OkButton; + private System.Windows.Forms.Button CancelButton; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox NameTextBox; + } +} \ No newline at end of file diff --git a/NameForm.cs b/NameForm.cs new file mode 100644 index 0000000..44bc84e --- /dev/null +++ b/NameForm.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ForzaDSX +{ + public partial class NameForm : Form + { + + public static string ShowDialog(string name) + { + NameForm form = new NameForm(name); + return form.ShowDialog() == DialogResult.OK ? form.NameTextBox.Text : name; + } + + public NameForm(String name) + { + InitializeComponent(); + NameTextBox.Text = name; + NameTextBox.Focus(); + + } + + private void OkButton_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/NameForm.resx b/NameForm.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/NameForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Program.cs b/Program.cs index b197a06..cdc0cba 100644 --- a/Program.cs +++ b/Program.cs @@ -7,7 +7,7 @@ namespace ForzaDSX { public class Program { - public const String VERSION = "0.5.8"; + public const String VERSION = "0.6.0"; [STAThread] static void Main(string[] args) diff --git a/UI.Designer.cs b/UI.Designer.cs index 7543f03..587d4b6 100644 --- a/UI.Designer.cs +++ b/UI.Designer.cs @@ -44,12 +44,8 @@ private void InitializeComponent() miscTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); forzaPortNumericUpDown = new System.Windows.Forms.NumericUpDown(); forzaPortLabel = new System.Windows.Forms.Label(); - dsxPortLabel = new System.Windows.Forms.Label(); - appCheckLabel = new System.Windows.Forms.Label(); rpmLabel = new System.Windows.Forms.Label(); rpmTrackBar = new System.Windows.Forms.TrackBar(); - appCheckBox = new System.Windows.Forms.CheckBox(); - dsxNumericUpDown = new System.Windows.Forms.NumericUpDown(); rpmValueNumericUpDown = new System.Windows.Forms.NumericUpDown(); buttonApplyMisc = new System.Windows.Forms.Button(); miscDefaultsButton = new System.Windows.Forms.Button(); @@ -166,6 +162,12 @@ private void InitializeComponent() toolStripAppCheckOffItem = new System.Windows.Forms.ToolStripMenuItem(); toolStripAppCheckOnItem = new System.Windows.Forms.ToolStripMenuItem(); toolTip = new System.Windows.Forms.ToolTip(components); + ProfilesContextMenu = new System.Windows.Forms.ContextMenuStrip(components); + newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + disableToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); mainPanel.SuspendLayout(); ((ISupportInitialize)mainSplitContainer).BeginInit(); mainSplitContainer.Panel1.SuspendLayout(); @@ -177,7 +179,6 @@ private void InitializeComponent() miscTableLayoutPanel.SuspendLayout(); ((ISupportInitialize)forzaPortNumericUpDown).BeginInit(); ((ISupportInitialize)rpmTrackBar).BeginInit(); - ((ISupportInitialize)dsxNumericUpDown).BeginInit(); ((ISupportInitialize)rpmValueNumericUpDown).BeginInit(); brakeConfigTabPage.SuspendLayout(); brakeTableLayoutPanel.SuspendLayout(); @@ -240,6 +241,7 @@ private void InitializeComponent() tableLayoutPanel1.SuspendLayout(); noRaceGroupBox.SuspendLayout(); statusStrip1.SuspendLayout(); + ProfilesContextMenu.SuspendLayout(); SuspendLayout(); // // mainPanel @@ -283,13 +285,16 @@ private void InitializeComponent() // profilesListView // profilesListView.Dock = System.Windows.Forms.DockStyle.Fill; + profilesListView.FullRowSelect = true; profilesListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] { listViewItem1, listViewItem2 }); profilesListView.Location = new System.Drawing.Point(3, 27); + profilesListView.MultiSelect = false; profilesListView.Name = "profilesListView"; profilesListView.Size = new System.Drawing.Size(230, 1198); profilesListView.TabIndex = 0; profilesListView.UseCompatibleStateImageBehavior = false; profilesListView.View = System.Windows.Forms.View.List; + profilesListView.MouseDown += profilesListView_MouseDown; // // mainTabControl // @@ -327,12 +332,8 @@ private void InitializeComponent() miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); miscTableLayoutPanel.Controls.Add(forzaPortNumericUpDown, 1, 3); miscTableLayoutPanel.Controls.Add(forzaPortLabel, 0, 3); - miscTableLayoutPanel.Controls.Add(dsxPortLabel, 0, 2); - miscTableLayoutPanel.Controls.Add(appCheckLabel, 0, 1); miscTableLayoutPanel.Controls.Add(rpmLabel, 0, 0); miscTableLayoutPanel.Controls.Add(rpmTrackBar, 1, 0); - miscTableLayoutPanel.Controls.Add(appCheckBox, 1, 1); - miscTableLayoutPanel.Controls.Add(dsxNumericUpDown, 1, 2); miscTableLayoutPanel.Controls.Add(rpmValueNumericUpDown, 2, 0); miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 4); miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 4); @@ -351,13 +352,13 @@ private void InitializeComponent() // // forzaPortNumericUpDown // - forzaPortNumericUpDown.AutoSize = true; forzaPortNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; forzaPortNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - forzaPortNumericUpDown.Location = new System.Drawing.Point(181, 156); + forzaPortNumericUpDown.Location = new System.Drawing.Point(169, 84); forzaPortNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); forzaPortNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); forzaPortNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); + forzaPortNumericUpDown.MinimumSize = new System.Drawing.Size(140, 0); forzaPortNumericUpDown.Name = "forzaPortNumericUpDown"; forzaPortNumericUpDown.Size = new System.Drawing.Size(143, 31); forzaPortNumericUpDown.TabIndex = 7; @@ -368,40 +369,14 @@ private void InitializeComponent() // forzaPortLabel.AutoSize = true; forzaPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; - forzaPortLabel.Location = new System.Drawing.Point(4, 151); + forzaPortLabel.Location = new System.Drawing.Point(4, 79); forzaPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); forzaPortLabel.Name = "forzaPortLabel"; - forzaPortLabel.Size = new System.Drawing.Size(169, 41); + forzaPortLabel.Size = new System.Drawing.Size(157, 41); forzaPortLabel.TabIndex = 6; - forzaPortLabel.Text = "Forza Port"; + forzaPortLabel.Text = "Game Port"; forzaPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(forzaPortLabel, "Port for Forza UDP server"); - // - // dsxPortLabel - // - dsxPortLabel.AutoSize = true; - dsxPortLabel.Dock = System.Windows.Forms.DockStyle.Fill; - dsxPortLabel.Location = new System.Drawing.Point(4, 110); - dsxPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - dsxPortLabel.Name = "dsxPortLabel"; - dsxPortLabel.Size = new System.Drawing.Size(169, 41); - dsxPortLabel.TabIndex = 4; - dsxPortLabel.Text = "DSX Port"; - dsxPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(dsxPortLabel, "Port for DSX Port Listener"); - // - // appCheckLabel - // - appCheckLabel.AutoSize = true; - appCheckLabel.Dock = System.Windows.Forms.DockStyle.Fill; - appCheckLabel.Location = new System.Drawing.Point(4, 79); - appCheckLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - appCheckLabel.Name = "appCheckLabel"; - appCheckLabel.Size = new System.Drawing.Size(169, 31); - appCheckLabel.TabIndex = 2; - appCheckLabel.Text = "Disable App Check?"; - appCheckLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - toolTip.SetToolTip(appCheckLabel, "Should we disable the check for running applications?"); + toolTip.SetToolTip(forzaPortLabel, "Port for Game's UDP Server"); // // rpmLabel // @@ -411,7 +386,7 @@ private void InitializeComponent() rpmLabel.Location = new System.Drawing.Point(4, 0); rpmLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); rpmLabel.Name = "rpmLabel"; - rpmLabel.Size = new System.Drawing.Size(169, 79); + rpmLabel.Size = new System.Drawing.Size(157, 79); rpmLabel.TabIndex = 0; rpmLabel.Text = "RPM Redline Ratio"; rpmLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -423,7 +398,7 @@ private void InitializeComponent() rpmTrackBar.Cursor = System.Windows.Forms.Cursors.NoMoveHoriz; rpmTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; rpmTrackBar.LargeChange = 50; - rpmTrackBar.Location = new System.Drawing.Point(181, 5); + rpmTrackBar.Location = new System.Drawing.Point(169, 5); rpmTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); rpmTrackBar.Maximum = 100; rpmTrackBar.Name = "rpmTrackBar"; @@ -434,43 +409,15 @@ private void InitializeComponent() toolTip.SetToolTip(rpmTrackBar, "The percentage of the current RPM when we are in the \"redline\" of the engine"); rpmTrackBar.Scroll += rpmTrackBar_Scroll; // - // appCheckBox - // - appCheckBox.AutoSize = true; - appCheckBox.Dock = System.Windows.Forms.DockStyle.Fill; - appCheckBox.Location = new System.Drawing.Point(181, 84); - appCheckBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - appCheckBox.Name = "appCheckBox"; - appCheckBox.Size = new System.Drawing.Size(593, 21); - appCheckBox.TabIndex = 3; - toolTip.SetToolTip(appCheckBox, "Should we disable the check for running applications?"); - appCheckBox.UseVisualStyleBackColor = true; - appCheckBox.CheckedChanged += appCheckBox_CheckedChanged; - // - // dsxNumericUpDown - // - dsxNumericUpDown.AutoSize = true; - dsxNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; - dsxNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - dsxNumericUpDown.Location = new System.Drawing.Point(181, 115); - dsxNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - dsxNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); - dsxNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); - dsxNumericUpDown.Name = "dsxNumericUpDown"; - dsxNumericUpDown.Size = new System.Drawing.Size(143, 31); - dsxNumericUpDown.TabIndex = 5; - toolTip.SetToolTip(dsxNumericUpDown, "Port for DSX Port Listener"); - dsxNumericUpDown.ValueChanged += dsxNumericUpDown_ValueChanged; - // // rpmValueNumericUpDown // rpmValueNumericUpDown.AutoSize = true; rpmValueNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; rpmValueNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - rpmValueNumericUpDown.Location = new System.Drawing.Point(782, 5); + rpmValueNumericUpDown.Location = new System.Drawing.Point(770, 5); rpmValueNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); rpmValueNumericUpDown.Name = "rpmValueNumericUpDown"; - rpmValueNumericUpDown.Size = new System.Drawing.Size(806, 31); + rpmValueNumericUpDown.Size = new System.Drawing.Size(818, 31); rpmValueNumericUpDown.TabIndex = 8; toolTip.SetToolTip(rpmValueNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); rpmValueNumericUpDown.ValueChanged += rpmValueNumericUpDown_ValueChanged; @@ -478,7 +425,7 @@ private void InitializeComponent() // buttonApplyMisc // buttonApplyMisc.Dock = System.Windows.Forms.DockStyle.Top; - buttonApplyMisc.Location = new System.Drawing.Point(181, 197); + buttonApplyMisc.Location = new System.Drawing.Point(169, 125); buttonApplyMisc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); buttonApplyMisc.MaximumSize = new System.Drawing.Size(429, 50); buttonApplyMisc.MinimumSize = new System.Drawing.Size(286, 42); @@ -491,7 +438,7 @@ private void InitializeComponent() // // miscDefaultsButton // - miscDefaultsButton.Location = new System.Drawing.Point(782, 197); + miscDefaultsButton.Location = new System.Drawing.Point(770, 125); miscDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscDefaultsButton.Name = "miscDefaultsButton"; miscDefaultsButton.Size = new System.Drawing.Size(107, 38); @@ -2130,6 +2077,48 @@ private void InitializeComponent() toolStripAppCheckOnItem.Text = "On"; toolStripAppCheckOnItem.Click += toolStripAppCheckOnItem_Click; // + // ProfilesContextMenu + // + ProfilesContextMenu.ImageScalingSize = new System.Drawing.Size(24, 24); + ProfilesContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, renameToolStripMenuItem, disableToolStripMenuItem, deleteToolStripMenuItem, copyToolStripMenuItem }); + ProfilesContextMenu.Name = "ProfilesContextMenu"; + ProfilesContextMenu.Size = new System.Drawing.Size(148, 164); + // + // newToolStripMenuItem + // + newToolStripMenuItem.Name = "newToolStripMenuItem"; + newToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + newToolStripMenuItem.Text = "New"; + newToolStripMenuItem.Click += newToolStripMenuItem_Click; + // + // renameToolStripMenuItem + // + renameToolStripMenuItem.Name = "renameToolStripMenuItem"; + renameToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + renameToolStripMenuItem.Text = "Rename"; + renameToolStripMenuItem.Click += renameToolStripMenuItem_Click; + // + // disableToolStripMenuItem + // + disableToolStripMenuItem.Name = "disableToolStripMenuItem"; + disableToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + disableToolStripMenuItem.Text = "Disable"; + disableToolStripMenuItem.Click += disableToolStripMenuItem_Click; + // + // deleteToolStripMenuItem + // + deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + deleteToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + deleteToolStripMenuItem.Text = "Delete"; + deleteToolStripMenuItem.Click += deleteToolStripMenuItem_Click; + // + // copyToolStripMenuItem + // + copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + copyToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + copyToolStripMenuItem.Text = "Copy"; + copyToolStripMenuItem.Click += copyToolStripMenuItem_Click; + // // UI // AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); @@ -2156,7 +2145,6 @@ private void InitializeComponent() miscTableLayoutPanel.PerformLayout(); ((ISupportInitialize)forzaPortNumericUpDown).EndInit(); ((ISupportInitialize)rpmTrackBar).EndInit(); - ((ISupportInitialize)dsxNumericUpDown).EndInit(); ((ISupportInitialize)rpmValueNumericUpDown).EndInit(); brakeConfigTabPage.ResumeLayout(false); brakeConfigTabPage.PerformLayout(); @@ -2225,6 +2213,7 @@ private void InitializeComponent() noRaceGroupBox.PerformLayout(); statusStrip1.ResumeLayout(false); statusStrip1.PerformLayout(); + ProfilesContextMenu.ResumeLayout(false); ResumeLayout(false); PerformLayout(); } @@ -2252,12 +2241,8 @@ private void InitializeComponent() private System.Windows.Forms.TableLayoutPanel miscTableLayoutPanel; private System.Windows.Forms.NumericUpDown forzaPortNumericUpDown; private System.Windows.Forms.Label forzaPortLabel; - private System.Windows.Forms.Label dsxPortLabel; - private System.Windows.Forms.Label appCheckLabel; private System.Windows.Forms.Label rpmLabel; private System.Windows.Forms.TrackBar rpmTrackBar; - private System.Windows.Forms.CheckBox appCheckBox; - private System.Windows.Forms.NumericUpDown dsxNumericUpDown; private System.Windows.Forms.Label gripLossLabel; private System.Windows.Forms.ToolTip toolTip; private System.Windows.Forms.TrackBar gripLossTrackBar; @@ -2363,5 +2348,11 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripDropDownButton toolStripAppCheckButton; private System.Windows.Forms.ToolStripMenuItem toolStripAppCheckOffItem; private System.Windows.Forms.ToolStripMenuItem toolStripAppCheckOnItem; + private System.Windows.Forms.ContextMenuStrip ProfilesContextMenu; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem disableToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; } } \ No newline at end of file diff --git a/UI.cs b/UI.cs index 8978fef..740c86d 100644 --- a/UI.cs +++ b/UI.cs @@ -1,18 +1,24 @@ -using ForzaDSX.Properties; +using ForzaDSX.Config; +using ForzaDSX.Properties; using System; +using System.Linq; + //using System.Configuration; using System.Threading; using System.Windows.Forms; using static ForzaDSX.ForzaDSXWorker; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace ForzaDSX { public partial class UI : Form { protected ForzaDSXWorker forzaDSXWorker; - protected ForzaDSX.Properties.Settings currentSettings; + protected ForzaDSX.Config.Config currentSettings; + protected ForzaDSX.Config.Profile selectedProfile; + int selectedIndex = 0; //protected Configuration config; - public ForzaDSX.Properties.Settings CurrentSettings { get => currentSettings; set => currentSettings = value; } + public ForzaDSX.Config.Config CurrentSettings { get => currentSettings; set => currentSettings = value; } bool bForzaConnected = false; bool bDsxConnected = false; @@ -72,8 +78,8 @@ private void UI_Load(object sender, EventArgs e) brakeVibrationMsg.Text = String.Empty; brakeMsg.Text = String.Empty; - noRaceGroupBox.Visible = currentSettings._verbose > 0; - raceGroupBox.Visible = currentSettings._verbose > 0; + noRaceGroupBox.Visible = currentSettings.VerboseLevel > Config.VerboseLevel.Off; + raceGroupBox.Visible = currentSettings.VerboseLevel > Config.VerboseLevel.Off; // Starts the background Worker //this.connectionWorker.RunWorkerAsync(); @@ -171,7 +177,7 @@ protected void WorkerThreadReporter(ForzaDSXReportStruct value) Output(value.message); break; case ForzaDSXReportStruct.ReportType.NORACE: - if (currentSettings._verbose > 0) + if (currentSettings.VerboseLevel > Config.VerboseLevel.Off) { noRaceGroupBox.Visible = true; raceGroupBox.Visible = false; @@ -180,7 +186,7 @@ protected void WorkerThreadReporter(ForzaDSXReportStruct value) noRaceText.Text = value.message; break; case ForzaDSXReportStruct.ReportType.RACING: - if (currentSettings._verbose > 0) + if (currentSettings.VerboseLevel > Config.VerboseLevel.Off) { noRaceGroupBox.Visible = false; raceGroupBox.Visible = true; @@ -225,16 +231,15 @@ public void LoadSettings() { // Get values from the config given their key and their target type. - currentSettings = Properties.Settings.Default; + currentSettings = ConfigHandler.GetConfig(); + selectedProfile = currentSettings.Profiles.Values.First(); - currentSettings._left_Trigger_Effect_Intensity = Math.Clamp(currentSettings._left_Trigger_Effect_Intensity, 0.0f, 1.0f); - currentSettings._right_Trigger_Effect_Intensity = Math.Clamp(currentSettings._right_Trigger_Effect_Intensity, 0.0f, 1.0f); - verboseModeOffToolStripMenuItem.Checked = currentSettings._verbose == 0; - verboseModeLowToolStripMenuItem.Checked = currentSettings._verbose == 1; - verboseModeFullToolStripMenuItem.Checked = currentSettings._verbose == 2; - toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); - toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + verboseModeOffToolStripMenuItem.Checked = currentSettings.VerboseLevel == VerboseLevel.Off; + verboseModeLowToolStripMenuItem.Checked = currentSettings.VerboseLevel == VerboseLevel.Limited; + verboseModeFullToolStripMenuItem.Checked = currentSettings.VerboseLevel == VerboseLevel.Full; + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings.DSXPort.ToString(); + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings.VerboseLevel.ToString(); } catch (Exception e) { @@ -248,11 +253,9 @@ public void LoadSettings() void SetupUI() { // Misc panel - this.rpmTrackBar.Value = DenormalizeValue(currentSettings._rpm_Redline_Ratio); - rpmValueNumericUpDown.Value = rpmTrackBar.Value; - this.appCheckBox.Checked = currentSettings._disable_App_Check; - if (currentSettings._disable_App_Check) + + if (currentSettings.DisableAppCheck) { toolStripAppCheckOnItem.Checked = false; toolStripAppCheckOffItem.Checked = true; @@ -265,25 +268,71 @@ void SetupUI() toolStripAppCheckButton.Text = "App Check Enabled"; } - toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); - toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); - this.dsxNumericUpDown.Value = currentSettings._dsx_PORT; - this.forzaPortNumericUpDown.Value = currentSettings._forza_PORT; + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings.DSXPort.ToString(); + toolStripDSXPortTextBox.Text = currentSettings.DSXPort.ToString(); + + + + loadProfilesIntoList(); + SwitchDisplayedProfile(); + + } + + void loadProfilesIntoList() + { + profilesListView.Items.Clear(); + //Load Profiles into list + foreach (Profile profile in currentSettings.Profiles.Values) + { + String name = profile.Name; + if (!profile.IsEnabled) + { + name += " (Disabled)"; + } + if (profile == currentSettings.ActiveProfile) + { + name += " (Active)"; + } + ListViewItem item = new ListViewItem(name); + item.Name = profile.Name; + profilesListView.Items.Add(item); + } + } + + void SwitchDisplayedProfile(String profileName = "") + { + if (profileName == "") + { + profileName = selectedProfile.Name; + } + if (currentSettings.Profiles.ContainsKey(profileName)) + { + selectedProfile = currentSettings.Profiles[profileName]; + } + + BrakeSettings brakeSettings = selectedProfile.brakeSettings; + ThrottleSettings throttleSettings = selectedProfile.throttleSettings; + + brakeSettings.EffectIntensity = Math.Clamp(brakeSettings.EffectIntensity, 0.0f, 1.0f); + throttleSettings.EffectIntensity = Math.Clamp(throttleSettings.EffectIntensity, 0.0f, 1.0f); + this.rpmTrackBar.Value = DenormalizeValue(selectedProfile.RPMRedlineRatio); + rpmValueNumericUpDown.Value = rpmTrackBar.Value; + this.forzaPortNumericUpDown.Value = selectedProfile.gameUDPPort; // Brake Panel - this.brakeTriggerModeComboBox.SelectedIndex = currentSettings.BrakeTriggerMode; - this.brakeEffectIntensityTrackBar.Value = DenormalizeValue(currentSettings._left_Trigger_Effect_Intensity); - this.gripLossTrackBar.Value = DenormalizeValue(currentSettings._grip_Loss_Val); - this.brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; - this.brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; - this.minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; - this.maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; - this.vibrationSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake_Freq, 500.0f); - this.minBrakeStiffnessTrackBar.Value = currentSettings._min_Brake_Stiffness; - this.maxBrakeStiffnessTrackBar.Value = currentSettings._max_Brake_Stiffness; - this.minBrakeResistanceTrackBar.Value = currentSettings._min_Brake_Resistance; - this.maxBrakeResistanceTrackBar.Value = currentSettings._max_Brake_Resistance; - this.brakeResistanceSmoothingTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Brake, 500.0f); + this.brakeTriggerModeComboBox.SelectedIndex = (int)brakeSettings.TriggerMode; + this.brakeEffectIntensityTrackBar.Value = DenormalizeValue(brakeSettings.EffectIntensity); + this.gripLossTrackBar.Value = DenormalizeValue(brakeSettings.GripLossValue); + this.brakeVibrationStartTrackBar.Value = brakeSettings.VibrationStart; + this.brakeVibrationModeTrackBar.Value = brakeSettings.VibrationModeStart; + this.minBrakeVibrationTrackBar.Value = brakeSettings.MinVibration; + this.maxBrakeVibrationTrackBar.Value = brakeSettings.MaxVibration; + this.vibrationSmoothingTrackBar.Value = DenormalizeValue(brakeSettings.VibrationSmoothing, 500.0f); + this.minBrakeStiffnessTrackBar.Value = brakeSettings.MinStiffness; + this.maxBrakeStiffnessTrackBar.Value = brakeSettings.MaxStiffness; + this.minBrakeResistanceTrackBar.Value = brakeSettings.MinResistance; + this.maxBrakeResistanceTrackBar.Value = brakeSettings.MaxResistance; + this.brakeResistanceSmoothingTrackBar.Value = DenormalizeValue(brakeSettings.ResistanceSmoothing, 500.0f); this.brakeEffectNumericUpDown.Value = this.brakeEffectIntensityTrackBar.Value; this.gripLossNumericUpDown.Value = this.gripLossTrackBar.Value; @@ -299,21 +348,21 @@ void SetupUI() this.brakeResistanceSmoothNumericUpDown.Value = this.brakeResistanceSmoothingTrackBar.Value; // Throttle Panel - this.throttleTriggerModeComboBox.SelectedIndex = currentSettings.ThrottleTriggerMode; - this.throttleIntensityTrackBar.Value = DenormalizeValue(currentSettings._right_Trigger_Effect_Intensity); - this.throttleGripLossTrackBar.Value = DenormalizeValue(currentSettings._throttle_Grip_Loss_Val); - this.throttleTurnAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._turn_Accel_Mod); - this.throttleForwardAccelScaleTrackBar.Value = DenormalizeValue(currentSettings._forward_Accel_Mod); - this.throttleAccelLimitTrackBar.Value = currentSettings._acceleration_Limit; - this.throttleVibrationModeStartTrackBar.Value = currentSettings._throttle_Vibration_Mode_Start; - this.throttleMinVibrationTrackBar.Value = currentSettings._min_Accel_Griploss_Vibration; - this.throttleMaxVibrationTrackBar.Value = currentSettings._max_Accel_Griploss_Vibration; - this.throttleVibrationSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle_Freq); - this.throttleMinStiffnessTrackBar.Value = currentSettings._min_Accel_Griploss_Stiffness; - this.throttleMaxStiffnessTrackBar.Value = currentSettings._max_Accel_Griploss_Stiffness; - this.throttleMinResistanceTrackBar.Value = currentSettings._min_Throttle_Resistance; - this.throttleMaxResistanceTrackBar.Value = currentSettings._max_Throttle_Resistance; - this.throttleResistanceSmoothTrackBar.Value = DenormalizeValue(currentSettings._ewma_Alpha_Throttle); + this.throttleTriggerModeComboBox.SelectedIndex = (int)throttleSettings.TriggerMode; + this.throttleIntensityTrackBar.Value = DenormalizeValue(throttleSettings.EffectIntensity); + this.throttleGripLossTrackBar.Value = DenormalizeValue(throttleSettings.GripLossValue); + this.throttleTurnAccelScaleTrackBar.Value = DenormalizeValue(throttleSettings.TurnAccelerationScale); + this.throttleForwardAccelScaleTrackBar.Value = DenormalizeValue(throttleSettings.ForwardAccelerationScale); + this.throttleAccelLimitTrackBar.Value = throttleSettings.AccelerationLimit; + this.throttleVibrationModeStartTrackBar.Value = throttleSettings.VibrationModeStart; + this.throttleMinVibrationTrackBar.Value = throttleSettings.MinVibration; + this.throttleMaxVibrationTrackBar.Value = throttleSettings.MaxVibration; + this.throttleVibrationSmoothTrackBar.Value = DenormalizeValue(throttleSettings.VibrationSmoothing); + this.throttleMinStiffnessTrackBar.Value = throttleSettings.MinStiffness; + this.throttleMaxStiffnessTrackBar.Value = throttleSettings.MaxStiffness; + this.throttleMinResistanceTrackBar.Value = throttleSettings.MinResistance; + this.throttleMaxResistanceTrackBar.Value = throttleSettings.MaxResistance; + this.throttleResistanceSmoothTrackBar.Value = DenormalizeValue(throttleSettings.ResistanceSmoothing); this.throttleIntensityNumericUpDown.Value = this.throttleIntensityTrackBar.Value; this.throttleGripLossNumericUpDown.Value = this.throttleGripLossTrackBar.Value; @@ -346,428 +395,540 @@ static float NormalizeValue(float value, float scale = 100.0f) private void verboseModeFullToolStripMenuItem_Click(object sender, EventArgs e) { - currentSettings._verbose = 2; + currentSettings.VerboseLevel = VerboseLevel.Full; verboseModeOffToolStripMenuItem.Checked = false; verboseModeLowToolStripMenuItem.Checked = false; verboseModeFullToolStripMenuItem.Checked = true; - toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings.VerboseLevel.ToString(); + ConfigHandler.SaveConfig(); } private void verboseModeLowToolStripMenuItem_Click(object sender, EventArgs e) { - currentSettings._verbose = 1; + currentSettings.VerboseLevel = VerboseLevel.Limited; verboseModeOffToolStripMenuItem.Checked = false; verboseModeLowToolStripMenuItem.Checked = true; verboseModeFullToolStripMenuItem.Checked = false; - toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings.VerboseLevel.ToString(); + ConfigHandler.SaveConfig(); + } private void verboseModeOffToolStripMenuItem_Click(object sender, EventArgs e) { - currentSettings._verbose = 0; + currentSettings.VerboseLevel = VerboseLevel.Off; verboseModeOffToolStripMenuItem.Checked = true; verboseModeLowToolStripMenuItem.Checked = false; verboseModeFullToolStripMenuItem.Checked = false; - toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings._verbose.ToString(); + toolStripVerboseMode.Text = "Verbose Mode: " + currentSettings.VerboseLevel.ToString(); noRaceGroupBox.Visible = false; raceGroupBox.Visible = false; + ConfigHandler.SaveConfig(); + } #region Misc + + + + + private void rpmTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._rpm_Redline_Ratio = NormalizeValue(this.rpmTrackBar.Value); + selectedProfile.RPMRedlineRatio = NormalizeValue(this.rpmTrackBar.Value); rpmValueNumericUpDown.Value = rpmTrackBar.Value; + + } private void rpmValueNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._rpm_Redline_Ratio = NormalizeValue((float)this.rpmValueNumericUpDown.Value); + selectedProfile.RPMRedlineRatio = NormalizeValue((float)this.rpmValueNumericUpDown.Value); rpmTrackBar.Value = (int)Math.Floor(rpmValueNumericUpDown.Value); - } - private void appCheckBox_CheckedChanged(object sender, EventArgs e) - { - currentSettings._disable_App_Check = this.appCheckBox.Checked; - } - private void dsxNumericUpDown_ValueChanged(object sender, EventArgs e) - { - currentSettings._dsx_PORT = (int)Math.Floor(this.dsxNumericUpDown.Value); } private void forzaPortNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._forza_PORT = (int)Math.Floor(this.forzaPortNumericUpDown.Value); + selectedProfile.gameUDPPort = (int)Math.Floor(this.forzaPortNumericUpDown.Value); + + } #endregion #region Brake private void brakeEffectIntensityTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._left_Trigger_Effect_Intensity = NormalizeValue(brakeEffectIntensityTrackBar.Value); + selectedProfile.brakeSettings.EffectIntensity = NormalizeValue(brakeEffectIntensityTrackBar.Value); this.brakeEffectNumericUpDown.Value = brakeEffectIntensityTrackBar.Value; + + } private void brakeEffectNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._left_Trigger_Effect_Intensity = NormalizeValue((float)brakeEffectNumericUpDown.Value); + selectedProfile.brakeSettings.EffectIntensity = NormalizeValue((float)brakeEffectNumericUpDown.Value); brakeEffectIntensityTrackBar.Value = (int)Math.Floor(brakeEffectNumericUpDown.Value); + + } private void gripLossTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._grip_Loss_Val = NormalizeValue(this.gripLossTrackBar.Value); + selectedProfile.brakeSettings.GripLossValue = NormalizeValue(gripLossTrackBar.Value); gripLossNumericUpDown.Value = gripLossTrackBar.Value; + + } private void gripLossNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._grip_Loss_Val = NormalizeValue((float)gripLossNumericUpDown.Value); + selectedProfile.brakeSettings.GripLossValue = NormalizeValue((float)gripLossNumericUpDown.Value); gripLossTrackBar.Value = (int)Math.Floor(gripLossNumericUpDown.Value); + + } private void brakeVibrationStartTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._brake_Vibration_Start = this.brakeVibrationStartTrackBar.Value; + selectedProfile.brakeSettings.VibrationStart = brakeVibrationStartTrackBar.Value; brakeVibrationStartNumericUpDown.Value = brakeVibrationStartTrackBar.Value; + + } private void brakeVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._brake_Vibration_Start = (int)Math.Floor(brakeVibrationStartNumericUpDown.Value); - brakeVibrationStartTrackBar.Value = currentSettings._brake_Vibration_Start; + selectedProfile.brakeSettings.VibrationStart = (int)Math.Floor(brakeVibrationStartNumericUpDown.Value); + brakeVibrationStartTrackBar.Value = selectedProfile.brakeSettings.VibrationStart; + + } private void brakeVibrationModeTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._brake_Vibration_Mode_Start = this.brakeVibrationModeTrackBar.Value; + selectedProfile.brakeSettings.VibrationModeStart = brakeVibrationModeTrackBar.Value; brakeVibrationModeNumericUpDown.Value = brakeVibrationModeTrackBar.Value; + + } private void brakeVibrationModeNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._brake_Vibration_Mode_Start = (int)Math.Floor(brakeVibrationModeNumericUpDown.Value); - brakeVibrationModeTrackBar.Value = currentSettings._brake_Vibration_Mode_Start; + selectedProfile.brakeSettings.VibrationModeStart = (int)Math.Floor(brakeVibrationModeNumericUpDown.Value); + brakeVibrationModeTrackBar.Value = selectedProfile.brakeSettings.VibrationModeStart; + + } private void minBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._min_Brake_Vibration = minBrakeVibrationTrackBar.Value; + selectedProfile.brakeSettings.MinVibration = minBrakeVibrationTrackBar.Value; minBrakeVibrationNumericUpDown.Value = minBrakeVibrationTrackBar.Value; + + } private void minBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._min_Brake_Vibration = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); - minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Vibration; + selectedProfile.brakeSettings.MinVibration = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); + minBrakeVibrationTrackBar.Value = selectedProfile.brakeSettings.MinVibration; + + } private void maxBrakeVibrationTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._max_Brake_Vibration = maxBrakeVibrationTrackBar.Value; + selectedProfile.brakeSettings.MaxVibration = maxBrakeVibrationTrackBar.Value; maxBrakeVibrationNumericUpDown.Value = maxBrakeVibrationTrackBar.Value; + + } private void maxBrakeVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._max_Brake_Vibration = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); - maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Vibration; + selectedProfile.brakeSettings.MaxVibration = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); + maxBrakeVibrationTrackBar.Value = selectedProfile.brakeSettings.MaxVibration; + + } private void vibrationSmoothingTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue(vibrationSmoothingTrackBar.Value, 500); + selectedProfile.brakeSettings.VibrationSmoothing = NormalizeValue(vibrationSmoothingTrackBar.Value, 500); brakeVibrationSmoothNumericUpDown.Value = vibrationSmoothingTrackBar.Value; + + } private void brakeVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._ewma_Alpha_Brake_Freq = NormalizeValue((float)brakeVibrationSmoothNumericUpDown.Value, 500); + selectedProfile.brakeSettings.VibrationSmoothing = NormalizeValue((float)brakeVibrationSmoothNumericUpDown.Value, 500); vibrationSmoothingTrackBar.Value = (int)Math.Floor(brakeVibrationSmoothNumericUpDown.Value); + + } private void minBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._min_Brake_Stiffness = minBrakeStiffnessTrackBar.Value; + selectedProfile.brakeSettings.MinStiffness = minBrakeStiffnessTrackBar.Value; minBrakeStifnessNumericUpDown.Value = minBrakeStiffnessTrackBar.Value; + + } private void minBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._min_Brake_Stiffness = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); - minBrakeVibrationTrackBar.Value = currentSettings._min_Brake_Stiffness; + selectedProfile.brakeSettings.MinStiffness = (int)Math.Floor(minBrakeVibrationNumericUpDown.Value); + minBrakeVibrationTrackBar.Value = selectedProfile.brakeSettings.MinStiffness; + + } private void maxBrakeStiffnessTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._max_Brake_Stiffness = maxBrakeStiffnessTrackBar.Value; + selectedProfile.brakeSettings.MaxStiffness = maxBrakeStiffnessTrackBar.Value; maxBrakeStifnessNumericUpDown.Value = maxBrakeStiffnessTrackBar.Value; + + } private void maxBrakeStifnessNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._max_Brake_Stiffness = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); - maxBrakeVibrationTrackBar.Value = currentSettings._max_Brake_Stiffness; + selectedProfile.brakeSettings.MaxStiffness = (int)Math.Floor(maxBrakeVibrationNumericUpDown.Value); + maxBrakeVibrationTrackBar.Value = selectedProfile.brakeSettings.MaxStiffness; + + } private void minBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) { + int value = minBrakeResistanceTrackBar.Value; - if (value > currentSettings._max_Brake_Resistance) - value = currentSettings._max_Brake_Resistance; + if (value > selectedProfile.brakeSettings.MaxResistance) + value = selectedProfile.brakeSettings.MaxResistance; - currentSettings._min_Brake_Resistance = value; + selectedProfile.brakeSettings.MinResistance = value; minBrakeResistanceTrackBar.Value = value; minBrakeResistanceNumericUpDown.Value = value; + + } private void minBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(minBrakeResistanceNumericUpDown.Value); - if (value > currentSettings._max_Brake_Resistance) - value = currentSettings._max_Brake_Resistance; + if (value > selectedProfile.brakeSettings.MaxResistance) + value = selectedProfile.brakeSettings.MaxResistance; - currentSettings._min_Brake_Resistance = value; + selectedProfile.brakeSettings.MinResistance = value; minBrakeResistanceTrackBar.Value = value; minBrakeResistanceNumericUpDown.Value = value; + + } private void maxBrakeResistanceTrackBar_Scroll(object sender, EventArgs e) { int value = maxBrakeResistanceTrackBar.Value; - if (value < currentSettings._min_Brake_Resistance) - value = currentSettings._min_Brake_Resistance; - currentSettings._max_Brake_Resistance = value; + if (value > selectedProfile.brakeSettings.MinResistance) + value = selectedProfile.brakeSettings.MinResistance; + selectedProfile.brakeSettings.MaxResistance = value; maxBrakeResistanceTrackBar.Value = value; maxBrakeResistanceNumericUpDown.Value = value; + + } private void maxBrakeResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(maxBrakeResistanceNumericUpDown.Value); - if (value < currentSettings._min_Brake_Resistance) - value = currentSettings._min_Brake_Resistance; + if (value > selectedProfile.brakeSettings.MinResistance) + value = selectedProfile.brakeSettings.MinResistance; - currentSettings._max_Brake_Resistance = value; + selectedProfile.brakeSettings.MaxResistance = value; maxBrakeResistanceTrackBar.Value = value; maxBrakeResistanceNumericUpDown.Value = value; + + } private void brakeResistanceSmoothingTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._ewma_Alpha_Brake = NormalizeValue(brakeResistanceSmoothingTrackBar.Value, 500); + selectedProfile.brakeSettings.ResistanceSmoothing = NormalizeValue(brakeResistanceSmoothingTrackBar.Value, 500); brakeResistanceSmoothNumericUpDown.Value = brakeResistanceSmoothingTrackBar.Value; + + } private void brakeResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._ewma_Alpha_Brake = NormalizeValue((float)brakeResistanceSmoothNumericUpDown.Value, 500); + selectedProfile.brakeSettings.ResistanceSmoothing = NormalizeValue((float)brakeResistanceSmoothNumericUpDown.Value, 500); brakeResistanceSmoothingTrackBar.Value = (int)Math.Floor(brakeResistanceSmoothNumericUpDown.Value); + + } #endregion #region Throttle private void throttleIntensityTrackBar_Scroll(object sender, EventArgs e) { - currentSettings._right_Trigger_Effect_Intensity = NormalizeValue(throttleIntensityTrackBar.Value); + selectedProfile.throttleSettings.EffectIntensity = NormalizeValue(throttleIntensityTrackBar.Value); throttleIntensityNumericUpDown.Value = throttleIntensityTrackBar.Value; + + } private void throttleIntensityNumericUpDown_ValueChanged(object sender, EventArgs e) { - currentSettings._right_Trigger_Effect_Intensity = NormalizeValue((float)throttleIntensityNumericUpDown.Value); + selectedProfile.throttleSettings.EffectIntensity = NormalizeValue((float)throttleIntensityNumericUpDown.Value); throttleIntensityTrackBar.Value = (int)Math.Floor(throttleIntensityNumericUpDown.Value); + + } private void throttleGripLossTrackBar_Scroll(object sender, EventArgs e) { + int value = throttleGripLossTrackBar.Value; - currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); + selectedProfile.throttleSettings.GripLossValue = NormalizeValue(value); throttleGripLossNumericUpDown.Value = value; + + } private void throttleGripLossNumericUpDown_ValueChanged(object sender, EventArgs e) { float value = (float)throttleGripLossNumericUpDown.Value; - currentSettings._throttle_Grip_Loss_Val = NormalizeValue(value); + selectedProfile.throttleSettings.GripLossValue = NormalizeValue(value); throttleGripLossTrackBar.Value = (int)Math.Floor(value); + + } private void throttleTurnAccelScaleTrackBar_Scroll(object sender, EventArgs e) { int value = throttleTurnAccelScaleTrackBar.Value; - currentSettings._turn_Accel_Mod = NormalizeValue(value); + selectedProfile.throttleSettings.TurnAccelerationScale = NormalizeValue(value); throttleTurnAccelScaleNumericUpDown.Value = value; + + } private void throttleTurnAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) { float value = (float)throttleTurnAccelScaleNumericUpDown.Value; - currentSettings._turn_Accel_Mod = NormalizeValue(value); + selectedProfile.throttleSettings.TurnAccelerationScale = NormalizeValue(value); throttleTurnAccelScaleTrackBar.Value = (int)Math.Floor(value); + + } private void throttleForwardAccelScaleTrackBar_Scroll(object sender, EventArgs e) { int value = throttleForwardAccelScaleTrackBar.Value; - currentSettings._forward_Accel_Mod = NormalizeValue(value); + selectedProfile.throttleSettings.ForwardAccelerationScale = NormalizeValue(value); throttleForwardAccelScaleNumericUpDown.Value = value; + + } private void throttleForwardAccelScaleNumericUpDown_ValueChanged(object sender, EventArgs e) { float value = (float)throttleForwardAccelScaleNumericUpDown.Value; - currentSettings._forward_Accel_Mod = NormalizeValue(value); + selectedProfile.throttleSettings.ForwardAccelerationScale = NormalizeValue(value); throttleForwardAccelScaleTrackBar.Value = (int)Math.Floor(value); + + } private void throttleAccelLimitTrackBar_Scroll(object sender, EventArgs e) { int value = throttleAccelLimitTrackBar.Value; - currentSettings._acceleration_Limit = value; + selectedProfile.throttleSettings.AccelerationLimit = value; throttleAccelLimitNumericUpDown.Value = value; + + } private void throttleAccelLimitNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleAccelLimitNumericUpDown.Value); - currentSettings._acceleration_Limit = value; + selectedProfile.throttleSettings.AccelerationLimit = value; throttleAccelLimitTrackBar.Value = value; + + } private void throttleVibrationModeStartTrackBar_Scroll(object sender, EventArgs e) { int value = throttleVibrationModeStartTrackBar.Value; - currentSettings._throttle_Vibration_Mode_Start = value; + selectedProfile.throttleSettings.VibrationModeStart = value; throttleVibrationStartNumericUpDown.Value = value; + + } private void throttleVibrationStartNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleVibrationStartNumericUpDown.Value); - currentSettings._throttle_Vibration_Mode_Start = value; + selectedProfile.throttleSettings.VibrationModeStart = value; throttleVibrationModeStartTrackBar.Value = value; + + } private void throttleMinVibrationTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMinVibrationTrackBar.Value; - currentSettings._min_Accel_Griploss_Vibration = value; + selectedProfile.throttleSettings.MinVibration = value; throttleMinVibrationNumericUpDown.Value = value; + + } private void throttleMinVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMinVibrationNumericUpDown.Value); - currentSettings._min_Accel_Griploss_Vibration = value; + selectedProfile.throttleSettings.MinVibration = value; throttleMinVibrationTrackBar.Value = value; + + } private void throttleMaxVibrationTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMaxVibrationTrackBar.Value; - currentSettings._max_Accel_Griploss_Vibration = value; + selectedProfile.throttleSettings.MaxVibration = value; throttleMaxVibrationNumericUpDown.Value = value; + + } private void throttleMaxVibrationNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMaxVibrationNumericUpDown.Value); - currentSettings._max_Accel_Griploss_Vibration = value; + selectedProfile.throttleSettings.MaxVibration = value; throttleMaxVibrationTrackBar.Value = value; + + } private void throttleVibrationSmoothTrackBar_Scroll(object sender, EventArgs e) { int value = throttleVibrationSmoothTrackBar.Value; - currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); + selectedProfile.throttleSettings.VibrationSmoothing = NormalizeValue(value); throttleVibrationSmoothNumericUpDown.Value = value; + + } private void throttleVibrationSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) { float value = (float)throttleVibrationSmoothNumericUpDown.Value; - currentSettings._ewma_Alpha_Throttle_Freq = NormalizeValue(value); + selectedProfile.throttleSettings.VibrationSmoothing = NormalizeValue(value); throttleVibrationSmoothTrackBar.Value = (int)Math.Floor(value); + + } private void throttleMinStiffnessTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMinStiffnessTrackBar.Value; - currentSettings._min_Accel_Griploss_Stiffness = value; + selectedProfile.throttleSettings.MinStiffness = value; throttleMinStiffnessNumericUpDown.Value = value; + + } private void throttleMinStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMinStiffnessNumericUpDown.Value); - currentSettings._min_Accel_Griploss_Stiffness = value; + selectedProfile.throttleSettings.MinStiffness = value; throttleMinStiffnessTrackBar.Value = value; + + } private void throttleMaxStiffnessTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMaxStiffnessTrackBar.Value; - currentSettings._max_Accel_Griploss_Stiffness = value; + selectedProfile.throttleSettings.MaxStiffness = value; throttleMaxStiffnessNumericUpDown.Value = value; + + } private void throttleMaxStiffnessNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMaxStiffnessNumericUpDown.Value); - currentSettings._max_Accel_Griploss_Stiffness = value; + selectedProfile.throttleSettings.MaxStiffness = value; throttleMaxStiffnessTrackBar.Value = value; + + } private void throttleMinResistanceTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMinResistanceTrackBar.Value; - currentSettings._min_Throttle_Resistance = value; + selectedProfile.throttleSettings.MinResistance = value; throttleMinResistanceNumericUpDown.Value = value; + + } private void throttleMinResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMinResistanceNumericUpDown.Value); - currentSettings._min_Throttle_Resistance = value; + selectedProfile.throttleSettings.MinResistance = value; throttleMinResistanceTrackBar.Value = value; + + } private void throttleMaxResistanceTrackBar_Scroll(object sender, EventArgs e) { int value = throttleMaxResistanceTrackBar.Value; - currentSettings._max_Throttle_Resistance = value; + selectedProfile.throttleSettings.MaxResistance = value; throttleMaxResistanceNumericUpDown.Value = value; + + } private void throttleMaxResistanceNumericUpDown_ValueChanged(object sender, EventArgs e) { int value = (int)Math.Floor(throttleMaxResistanceNumericUpDown.Value); - currentSettings._max_Throttle_Resistance = value; + selectedProfile.throttleSettings.MaxResistance = value; throttleMaxResistanceTrackBar.Value = value; + + } private void throttleResistanceSmoothTrackBar_Scroll(object sender, EventArgs e) { int value = throttleResistanceSmoothTrackBar.Value; - currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); + selectedProfile.throttleSettings.ResistanceSmoothing = NormalizeValue(value); throttleResistanceSmoothNumericUpDown.Value = value; + + } private void throttleResistanceSmoothNumericUpDown_ValueChanged(object sender, EventArgs e) { float value = (float)throttleResistanceSmoothNumericUpDown.Value; - currentSettings._ewma_Alpha_Throttle = NormalizeValue(value); + selectedProfile.throttleSettings.ResistanceSmoothing = NormalizeValue(value); throttleResistanceSmoothTrackBar.Value = (int)Math.Floor(value); + + } #endregion @@ -777,9 +938,10 @@ private void buttonApplyMisc_Click(object sender, EventArgs e) { if (forzaDSXWorker != null) { - CurrentSettings.Save(); forzaDSXWorker.SetSettings(CurrentSettings); + ConfigHandler.SaveConfig(); + } } @@ -787,9 +949,10 @@ private void buttonApply_Brake_Click(object sender, EventArgs e) { if (forzaDSXWorker != null) { - CurrentSettings.Save(); forzaDSXWorker.SetSettings(CurrentSettings); + ConfigHandler.SaveConfig(); + } } @@ -797,37 +960,43 @@ private void buttonApply_Throttle_Click(object sender, EventArgs e) { if (forzaDSXWorker != null) { - CurrentSettings.Save(); forzaDSXWorker.SetSettings(CurrentSettings); + ConfigHandler.SaveConfig(); + } } private void miscDefaultsButton_Click(object sender, EventArgs e) { + + selectedProfile.RPMRedlineRatio = 0.9f; + selectedProfile.gameUDPPort = 9999; FullResetValues(); } private void brakeDefaultsButton_Click(object sender, EventArgs e) { + selectedProfile.brakeSettings = new BrakeSettings(); FullResetValues(); } private void throttleDefaultsButton_Click(object sender, EventArgs e) { + selectedProfile.throttleSettings = new ThrottleSettings(); FullResetValues(); } protected void FullResetValues() { - CurrentSettings.Reset(); + // CurrentSettings.Reset(); SetupUI(); if (forzaDSXWorker != null) { - CurrentSettings.Save(); - + // CurrentSettings.Save(); + ConfigHandler.SaveConfig(); forzaDSXWorker.SetSettings(CurrentSettings); StartForzaDSXThread(); @@ -836,22 +1005,23 @@ protected void FullResetValues() private void brakeTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) { - CurrentSettings.BrakeTriggerMode = (sbyte)brakeTriggerModeComboBox.SelectedIndex; + selectedProfile.brakeSettings.TriggerMode = (Config.TriggerMode)(sbyte)brakeTriggerModeComboBox.SelectedIndex; } private void throttleTriggerModeComboBox_SelectedIndexChanged(object sender, EventArgs e) { - CurrentSettings.ThrottleTriggerMode = (sbyte)throttleTriggerModeComboBox.SelectedIndex; + selectedProfile.throttleSettings.TriggerMode = (Config.TriggerMode)(sbyte)throttleTriggerModeComboBox.SelectedIndex; } private void toolStripAppCheckOnItem_Click(object sender, EventArgs e) { - currentSettings._disable_App_Check = false; + currentSettings.DisableAppCheck = false; toolStripAppCheckOnItem.Checked = true; toolStripAppCheckOffItem.Checked = false; toolStripAppCheckButton.Text = "App Check Enabled"; + ConfigHandler.SaveConfig(); } @@ -861,23 +1031,27 @@ private void toolStripAppCheckOnItem_Click(object sender, EventArgs e) private void toolStripAppCheckOffItem_Click(object sender, EventArgs e) { - currentSettings._disable_App_Check = true; + currentSettings.DisableAppCheck = true; toolStripAppCheckOnItem.Checked = false; toolStripAppCheckOffItem.Checked = true; toolStripAppCheckButton.Text = "App Check Disabled"; + ConfigHandler.SaveConfig(); + } private void toolStripDSXPortButton_Click(object sender, EventArgs e) { try { - currentSettings._dsx_PORT = Int32.Parse(toolStripDSXPortTextBox.Text); + currentSettings.DSXPort = Int32.Parse(toolStripDSXPortTextBox.Text); + ConfigHandler.SaveConfig(); + } catch (Exception) { - toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); + toolStripDSXPortTextBox.Text = currentSettings.DSXPort.ToString(); } - toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings.DSXPort.ToString(); } private void toolStripDSXPortTextBox_KeyDown(object sender, KeyEventArgs e) @@ -886,14 +1060,133 @@ private void toolStripDSXPortTextBox_KeyDown(object sender, KeyEventArgs e) { try { - currentSettings._dsx_PORT = Int32.Parse(toolStripDSXPortTextBox.Text); + currentSettings.DSXPort = Int32.Parse(toolStripDSXPortTextBox.Text); + ConfigHandler.SaveConfig(); } catch (Exception) { - toolStripDSXPortTextBox.Text = currentSettings._dsx_PORT.ToString(); + toolStripDSXPortTextBox.Text = currentSettings.DSXPort.ToString(); + } + toolStripDSXPortButton.Text = "DSX Port: " + currentSettings.DSXPort.ToString(); + } + } + + private void profilesListView_SelectedIndexChanged(object sender, EventArgs e) + { + if (profilesListView.SelectedItems.Count == 0) + { + profilesListView.Items[selectedIndex].Selected = true; + return; + + } + + } + + + + private void profilesListView_MouseDown(object sender, MouseEventArgs e) + { + ListViewHitTestInfo HI = profilesListView.HitTest(e.Location); + + + if (e.Button == MouseButtons.Right) + { +if (HI.Item != null) { + profilesListView.FocusedItem = HI.Item; + + ProfilesContextMenu.Items[1].Enabled = true; + ProfilesContextMenu.Items[2].Enabled = true; + ProfilesContextMenu.Items[3].Enabled = true; + ProfilesContextMenu.Items[4].Enabled = false; + if (currentSettings.Profiles[HI.Item.Name].IsEnabled) + { + ProfilesContextMenu.Items[2].Text = "Disable"; + } else + { + ProfilesContextMenu.Items[2].Text = "Enable"; + } + ProfilesContextMenu.Show(Cursor.Position); + } else + { + ProfilesContextMenu.Items[1].Enabled = false; + ProfilesContextMenu.Items[2].Enabled = false; + ProfilesContextMenu.Items[3].Enabled = false; + ProfilesContextMenu.Items[4].Enabled = false; + ProfilesContextMenu.Show(Cursor.Position); + + } + } else if (e.Button == MouseButtons.Left) + { + if (HI.Item == null) + { + return; } - toolStripDSXPortButton.Text = "DSX Port: " + currentSettings._dsx_PORT.ToString(); + selectedIndex = HI.Item.Index; + String profileName = HI.Item.Name; + // HI.Item.Selected = true; + SwitchDisplayedProfile(profileName); + } + } + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + String newProfileName = NameForm.ShowDialog(""); + if (newProfileName != "") + { + Profile newProfile = new Profile(); + newProfile.Name = newProfileName; + currentSettings.Profiles.Add(newProfileName, newProfile); + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); + } + + } + + private void renameToolStripMenuItem_Click(object sender, EventArgs e) + { + String oldProfileName = profilesListView.FocusedItem.Name; + String newProfileName = NameForm.ShowDialog(oldProfileName); + if (newProfileName != "" && oldProfileName != newProfileName) + { + Profile newProfile = currentSettings.Profiles[oldProfileName]; + currentSettings.Profiles.Remove(oldProfileName); + newProfile.Name = newProfileName; + currentSettings.Profiles.Add(newProfileName, newProfile); + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); + } + + } + + private void disableToolStripMenuItem_Click(object sender, EventArgs e) + { + String profileName = profilesListView.FocusedItem.Name; + if (currentSettings.Profiles.ContainsKey(profileName)) + { + Profile profile = currentSettings.Profiles[profileName]; + profile.IsEnabled = !profile.IsEnabled; + //profile.IsEnabled = false; + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); } + + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + String profileName = profilesListView.FocusedItem.Name; + if (currentSettings.Profiles.ContainsKey(profileName)) + { + currentSettings.Profiles.Remove(profileName); + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); + } + + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + } } } \ No newline at end of file diff --git a/UI.resx b/UI.resx index 19b95f9..a88e6e7 100644 --- a/UI.resx +++ b/UI.resx @@ -146,4 +146,7 @@ qgAAAABJRU5ErkJggg== + + 427, 28 +
\ No newline at end of file From 7540a21c6435b93ce0e6197a43d4e05fa6b66098 Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Tue, 26 Dec 2023 13:04:10 -0500 Subject: [PATCH 5/8] Executables are configurable and allow for the profile to be automatically or manually selected. --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.futdcache.v2 | Bin 594 -> 594 bytes .vs/ForzaDSX/v17/.suo | Bin 108544 -> 89088 bytes AppCheckThread.cs | 98 ++++++-- Config/Config.cs | 5 +- NameForm.Designer.cs | 1 + NameForm.cs | 12 +- UI.Designer.cs | 146 +++++++++-- UI.cs | 285 +++++++++++++++++++--- 9 files changed, 462 insertions(+), 85 deletions(-) diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index 519134673eede1cea9eceed154ae9c9f2773731f..7a7869098e53ee035aff157a36f14b386af6c5fe 100644 GIT binary patch delta 15834 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 delta 16680 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 q>56dCqMTn~y7X^kIb) diff --git a/.vs/ForzaDSX/v17/.futdcache.v2 b/.vs/ForzaDSX/v17/.futdcache.v2 index edc031065ff5648079fa42754c3420c5705c7356..fb40ef3842313124afcdae10b11a2a6a85f9f216 100644 GIT binary patch delta 28 jcmcb_a*1Vw9g~RK&5D0d=ggKm#CnHg_w$6`$AL5ey(JB_ delta 20 ccmcb_a*1Vw9n<79j659eJJKWeu-xGQ08)Mjvj6}9 diff --git a/.vs/ForzaDSX/v17/.suo b/.vs/ForzaDSX/v17/.suo index f0de9d4bd0ab8840fe0712a1eef1cf6ad5d6b178..8a51c683508adca6602031aa771579030456de90 100644 GIT binary patch delta 10173 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 I3u_bp6Of!7WdHyG literal 108544 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 diff --git a/AppCheckThread.cs b/AppCheckThread.cs index 0b96b1a..fb00822 100644 --- a/AppCheckThread.cs +++ b/AppCheckThread.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; namespace ForzaDSX { @@ -9,7 +11,7 @@ public enum AppType : ushort { NONE = 0, DSX = 1, - FORZA = 2 + GAME = 2 } public AppCheckReportStruct(AppType type, string msg, bool val = false) @@ -41,21 +43,51 @@ public AppCheckReportStruct(AppType type) internal class AppCheckThread { readonly ForzaDSX.Config.Config settings; - readonly IProgress progressReporter; + private Dictionary processProfilePairs = new Dictionary(); + + readonly IProgress progressReporter; protected bool bRunning = false; public AppCheckThread(ref ForzaDSX.Config.Config currentSettings, IProgress progressReporter) { + settings = currentSettings; - this.progressReporter = progressReporter; + + this.progressReporter = progressReporter; bRunning = false; } + public void updateExecutables() + { + lock (this) + { + foreach (var profile in settings.Profiles) + { + if (!profile.Value.IsEnabled) { continue; } + processProfilePairs.Clear(); + profile.Value.executableNames.ForEach((name) => + { + processProfilePairs.Add(name, profile.Key); + }); + } + // settings = currentSettings; + } + } + public void Run() { - bRunning = true; + foreach (var profile in settings.Profiles) + { + if (!profile.Value.IsEnabled) { continue; } + processProfilePairs.Clear(); + profile.Value.executableNames.ForEach((name) => + { + processProfilePairs.Add(name, profile.Key); + }); + } + bRunning = true; try { if (progressReporter != null) @@ -63,34 +95,50 @@ public void Run() progressReporter.Report(new AppCheckReportStruct(0, "Connecting to Forza and DSX")); } - int forzaProcesses = 0; + //int forzaProcesses = 0; Process[] DSX, DSX_2; AppCheckReportStruct dsxReport = new AppCheckReportStruct(AppCheckReportStruct.AppType.DSX); - AppCheckReportStruct forzaReport = new AppCheckReportStruct(AppCheckReportStruct.AppType.FORZA); + AppCheckReportStruct forzaReport = new AppCheckReportStruct(AppCheckReportStruct.AppType.GAME); while (bRunning/*forzaProcesses == 0 || DSX.Length + DSX_2.Length == 0*/) { System.Threading.Thread.Sleep(1000); - - forzaProcesses = Process.GetProcessesByName("ForzaHorizon5").Length; - forzaProcesses += Process.GetProcessesByName("ForzaHorizon4").Length; //Guess at name - forzaProcesses += Process.GetProcessesByName("ForzaMotorsport7").Length; //Guess at name - forzaProcesses += Process.GetProcessesByName("forza_gaming.desktop.x64_release_final").Length; //Guess at name - forzaProcesses += Process.GetProcessesByName("forza_steamworks_release_final").Length; //Guess at name - - // DSX = "DSX" or "DualSenseX" - DSX = Process.GetProcessesByName("DSX"); - DSX_2 = Process.GetProcessesByName("DualsenseX"); - - dsxReport.value = (DSX.Length + DSX_2.Length) > 0; - forzaReport.value = forzaProcesses > 0; - forzaReport.value = true; - //TODO: CHANGE - if (progressReporter != null) - { - progressReporter.Report(dsxReport); - progressReporter.Report(forzaReport); + lock (this) { + if (!bRunning) { break; } + forzaReport.value = false; + forzaReport.message = ""; + foreach (var processName in processProfilePairs.Keys.AsEnumerable()) + { + + if (Process.GetProcessesByName(processName).Length > 0) + { + forzaReport.value = true; + forzaReport.message = processProfilePairs[processName]; + break; + } + } + /* forzaProcesses = Process.GetProcessesByName("ForzaHorizon5").Length; + forzaProcesses += Process.GetProcessesByName("ForzaHorizon4").Length; //Guess at name + forzaProcesses += Process.GetProcessesByName("ForzaMotorsport7").Length; //Guess at name + forzaProcesses += Process.GetProcessesByName("forza_gaming.desktop.x64_release_final").Length; //Guess at name + forzaProcesses += Process.GetProcessesByName("forza_steamworks_release_final").Length; //Guess at name*/ + + // DSX = "DSX" or "DualSenseX" + DSX = Process.GetProcessesByName("DSX"); + DSX_2 = Process.GetProcessesByName("DualsenseX"); + + dsxReport.value = (DSX.Length + DSX_2.Length) > 0; + //forzaReport.value = forzaProcesses > 0; + + //forzaReport.value = true; + //TODO: CHANGE + if (!bRunning) { break; } + if (progressReporter != null) + { + progressReporter.Report(dsxReport); + progressReporter.Report(forzaReport); + } } } } diff --git a/Config/Config.cs b/Config/Config.cs index 7bc8c54..6298293 100644 --- a/Config/Config.cs +++ b/Config/Config.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace ForzaDSX.Config @@ -11,9 +12,11 @@ public class Config public bool DisableAppCheck { get; set; } public VerboseLevel VerboseLevel { get; set; } = VerboseLevel.Off; public Dictionary Profiles { get; set; } = new Dictionary(); - + [JsonIgnore] public Profile ActiveProfile { get; set; } = null; public int DSXPort { get; set; } = 6900; + + public String DefaultProfile { get; set; } = "Forza"; } } diff --git a/NameForm.Designer.cs b/NameForm.Designer.cs index 733061d..d0fe5af 100644 --- a/NameForm.Designer.cs +++ b/NameForm.Designer.cs @@ -112,6 +112,7 @@ private void InitializeComponent() StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; Text = "Please Enter the Profile Name:"; TopMost = true; + Load += NameForm_Load; flowLayoutPanel1.ResumeLayout(false); flowLayoutPanel2.ResumeLayout(false); flowLayoutPanel2.PerformLayout(); diff --git a/NameForm.cs b/NameForm.cs index 44bc84e..f32f5e5 100644 --- a/NameForm.cs +++ b/NameForm.cs @@ -13,15 +13,16 @@ namespace ForzaDSX public partial class NameForm : Form { - public static string ShowDialog(string name) + public static string ShowDialog(string name, String title = "Please enter the Name") { - NameForm form = new NameForm(name); + NameForm form = new NameForm(name, title); return form.ShowDialog() == DialogResult.OK ? form.NameTextBox.Text : name; } - public NameForm(String name) + public NameForm(String name, String title) { InitializeComponent(); + this.Text = title; NameTextBox.Text = name; NameTextBox.Focus(); @@ -31,5 +32,10 @@ private void OkButton_Click(object sender, EventArgs e) { } + + private void NameForm_Load(object sender, EventArgs e) + { + + } } } diff --git a/UI.Designer.cs b/UI.Designer.cs index 587d4b6..8915353 100644 --- a/UI.Designer.cs +++ b/UI.Designer.cs @@ -49,6 +49,12 @@ private void InitializeComponent() rpmValueNumericUpDown = new System.Windows.Forms.NumericUpDown(); buttonApplyMisc = new System.Windows.Forms.Button(); miscDefaultsButton = new System.Windows.Forms.Button(); + ExecutableListLabel = new System.Windows.Forms.Label(); + ExecutableListBox = new System.Windows.Forms.ListBox(); + flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + AddExecutableButton = new System.Windows.Forms.Button(); + EditExecutableButton = new System.Windows.Forms.Button(); + RemoveExecutableButton = new System.Windows.Forms.Button(); brakeConfigTabPage = new System.Windows.Forms.TabPage(); brakeTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); brakeResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); @@ -168,6 +174,8 @@ private void InitializeComponent() disableToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + defaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + setActiveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); mainPanel.SuspendLayout(); ((ISupportInitialize)mainSplitContainer).BeginInit(); mainSplitContainer.Panel1.SuspendLayout(); @@ -180,6 +188,7 @@ private void InitializeComponent() ((ISupportInitialize)forzaPortNumericUpDown).BeginInit(); ((ISupportInitialize)rpmTrackBar).BeginInit(); ((ISupportInitialize)rpmValueNumericUpDown).BeginInit(); + flowLayoutPanel1.SuspendLayout(); brakeConfigTabPage.SuspendLayout(); brakeTableLayoutPanel.SuspendLayout(); ((ISupportInitialize)brakeResistanceSmoothNumericUpDown).BeginInit(); @@ -330,18 +339,23 @@ private void InitializeComponent() miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); miscTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - miscTableLayoutPanel.Controls.Add(forzaPortNumericUpDown, 1, 3); - miscTableLayoutPanel.Controls.Add(forzaPortLabel, 0, 3); + miscTableLayoutPanel.Controls.Add(forzaPortNumericUpDown, 1, 4); + miscTableLayoutPanel.Controls.Add(forzaPortLabel, 0, 4); miscTableLayoutPanel.Controls.Add(rpmLabel, 0, 0); miscTableLayoutPanel.Controls.Add(rpmTrackBar, 1, 0); miscTableLayoutPanel.Controls.Add(rpmValueNumericUpDown, 2, 0); - miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 4); - miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 4); + miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 6); + miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 6); + miscTableLayoutPanel.Controls.Add(ExecutableListLabel, 0, 5); + miscTableLayoutPanel.Controls.Add(ExecutableListBox, 1, 5); + miscTableLayoutPanel.Controls.Add(flowLayoutPanel1, 2, 5); miscTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; miscTableLayoutPanel.Location = new System.Drawing.Point(4, 5); miscTableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscTableLayoutPanel.Name = "miscTableLayoutPanel"; - miscTableLayoutPanel.RowCount = 5; + miscTableLayoutPanel.RowCount = 7; + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -354,7 +368,7 @@ private void InitializeComponent() // forzaPortNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; forzaPortNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - forzaPortNumericUpDown.Location = new System.Drawing.Point(169, 84); + forzaPortNumericUpDown.Location = new System.Drawing.Point(190, 84); forzaPortNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); forzaPortNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); forzaPortNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); @@ -372,7 +386,7 @@ private void InitializeComponent() forzaPortLabel.Location = new System.Drawing.Point(4, 79); forzaPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); forzaPortLabel.Name = "forzaPortLabel"; - forzaPortLabel.Size = new System.Drawing.Size(157, 41); + forzaPortLabel.Size = new System.Drawing.Size(178, 41); forzaPortLabel.TabIndex = 6; forzaPortLabel.Text = "Game Port"; forzaPortLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -386,7 +400,7 @@ private void InitializeComponent() rpmLabel.Location = new System.Drawing.Point(4, 0); rpmLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); rpmLabel.Name = "rpmLabel"; - rpmLabel.Size = new System.Drawing.Size(157, 79); + rpmLabel.Size = new System.Drawing.Size(178, 79); rpmLabel.TabIndex = 0; rpmLabel.Text = "RPM Redline Ratio"; rpmLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -398,7 +412,7 @@ private void InitializeComponent() rpmTrackBar.Cursor = System.Windows.Forms.Cursors.NoMoveHoriz; rpmTrackBar.Dock = System.Windows.Forms.DockStyle.Fill; rpmTrackBar.LargeChange = 50; - rpmTrackBar.Location = new System.Drawing.Point(169, 5); + rpmTrackBar.Location = new System.Drawing.Point(190, 5); rpmTrackBar.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); rpmTrackBar.Maximum = 100; rpmTrackBar.Name = "rpmTrackBar"; @@ -414,10 +428,10 @@ private void InitializeComponent() rpmValueNumericUpDown.AutoSize = true; rpmValueNumericUpDown.Cursor = System.Windows.Forms.Cursors.IBeam; rpmValueNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill; - rpmValueNumericUpDown.Location = new System.Drawing.Point(770, 5); + rpmValueNumericUpDown.Location = new System.Drawing.Point(791, 5); rpmValueNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); rpmValueNumericUpDown.Name = "rpmValueNumericUpDown"; - rpmValueNumericUpDown.Size = new System.Drawing.Size(818, 31); + rpmValueNumericUpDown.Size = new System.Drawing.Size(797, 31); rpmValueNumericUpDown.TabIndex = 8; toolTip.SetToolTip(rpmValueNumericUpDown, "The percentage of the current RPM when we are in the \"redline\" of the engine"); rpmValueNumericUpDown.ValueChanged += rpmValueNumericUpDown_ValueChanged; @@ -425,7 +439,7 @@ private void InitializeComponent() // buttonApplyMisc // buttonApplyMisc.Dock = System.Windows.Forms.DockStyle.Top; - buttonApplyMisc.Location = new System.Drawing.Point(169, 125); + buttonApplyMisc.Location = new System.Drawing.Point(190, 281); buttonApplyMisc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); buttonApplyMisc.MaximumSize = new System.Drawing.Size(429, 50); buttonApplyMisc.MinimumSize = new System.Drawing.Size(286, 42); @@ -438,7 +452,7 @@ private void InitializeComponent() // // miscDefaultsButton // - miscDefaultsButton.Location = new System.Drawing.Point(770, 125); + miscDefaultsButton.Location = new System.Drawing.Point(791, 281); miscDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscDefaultsButton.Name = "miscDefaultsButton"; miscDefaultsButton.Size = new System.Drawing.Size(107, 38); @@ -447,6 +461,71 @@ private void InitializeComponent() miscDefaultsButton.UseVisualStyleBackColor = true; miscDefaultsButton.Click += miscDefaultsButton_Click; // + // ExecutableListLabel + // + ExecutableListLabel.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ExecutableListLabel.AutoSize = true; + ExecutableListLabel.Location = new System.Drawing.Point(3, 185); + ExecutableListLabel.Name = "ExecutableListLabel"; + ExecutableListLabel.Size = new System.Drawing.Size(180, 25); + ExecutableListLabel.TabIndex = 40; + ExecutableListLabel.Text = "Executables To Match"; + ExecutableListLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(ExecutableListLabel, "This is the list of executable names that will be used to activate this profile"); + // + // ExecutableListBox + // + ExecutableListBox.Dock = System.Windows.Forms.DockStyle.Fill; + ExecutableListBox.FormattingEnabled = true; + ExecutableListBox.ItemHeight = 25; + ExecutableListBox.Location = new System.Drawing.Point(189, 123); + ExecutableListBox.Name = "ExecutableListBox"; + ExecutableListBox.Size = new System.Drawing.Size(595, 150); + ExecutableListBox.TabIndex = 41; + ExecutableListBox.SelectedIndexChanged += ExecutableListBox_SelectedIndexChanged; + // + // flowLayoutPanel1 + // + flowLayoutPanel1.Controls.Add(AddExecutableButton); + flowLayoutPanel1.Controls.Add(EditExecutableButton); + flowLayoutPanel1.Controls.Add(RemoveExecutableButton); + flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + flowLayoutPanel1.Location = new System.Drawing.Point(790, 123); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + flowLayoutPanel1.Size = new System.Drawing.Size(799, 150); + flowLayoutPanel1.TabIndex = 42; + // + // AddExecutableButton + // + AddExecutableButton.Location = new System.Drawing.Point(3, 3); + AddExecutableButton.Name = "AddExecutableButton"; + AddExecutableButton.Size = new System.Drawing.Size(112, 34); + AddExecutableButton.TabIndex = 0; + AddExecutableButton.Text = "Add"; + AddExecutableButton.UseVisualStyleBackColor = true; + AddExecutableButton.Click += AddExecutableButton_Click; + // + // EditExecutableButton + // + EditExecutableButton.Location = new System.Drawing.Point(3, 43); + EditExecutableButton.Name = "EditExecutableButton"; + EditExecutableButton.Size = new System.Drawing.Size(112, 34); + EditExecutableButton.TabIndex = 1; + EditExecutableButton.Text = "Edit"; + EditExecutableButton.UseVisualStyleBackColor = true; + EditExecutableButton.Click += EditExecutableButton_Click; + // + // RemoveExecutableButton + // + RemoveExecutableButton.Location = new System.Drawing.Point(3, 83); + RemoveExecutableButton.Name = "RemoveExecutableButton"; + RemoveExecutableButton.Size = new System.Drawing.Size(112, 34); + RemoveExecutableButton.TabIndex = 2; + RemoveExecutableButton.Text = "Remove"; + RemoveExecutableButton.UseVisualStyleBackColor = true; + RemoveExecutableButton.Click += RemoveExecutableButton_Click; + // // brakeConfigTabPage // brakeConfigTabPage.Controls.Add(brakeTableLayoutPanel); @@ -2080,45 +2159,59 @@ private void InitializeComponent() // ProfilesContextMenu // ProfilesContextMenu.ImageScalingSize = new System.Drawing.Size(24, 24); - ProfilesContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, renameToolStripMenuItem, disableToolStripMenuItem, deleteToolStripMenuItem, copyToolStripMenuItem }); + ProfilesContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { newToolStripMenuItem, renameToolStripMenuItem, disableToolStripMenuItem, deleteToolStripMenuItem, copyToolStripMenuItem, defaultToolStripMenuItem, setActiveToolStripMenuItem }); ProfilesContextMenu.Name = "ProfilesContextMenu"; - ProfilesContextMenu.Size = new System.Drawing.Size(148, 164); + ProfilesContextMenu.Size = new System.Drawing.Size(163, 228); // // newToolStripMenuItem // newToolStripMenuItem.Name = "newToolStripMenuItem"; - newToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + newToolStripMenuItem.Size = new System.Drawing.Size(162, 32); newToolStripMenuItem.Text = "New"; newToolStripMenuItem.Click += newToolStripMenuItem_Click; // // renameToolStripMenuItem // renameToolStripMenuItem.Name = "renameToolStripMenuItem"; - renameToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + renameToolStripMenuItem.Size = new System.Drawing.Size(162, 32); renameToolStripMenuItem.Text = "Rename"; renameToolStripMenuItem.Click += renameToolStripMenuItem_Click; // // disableToolStripMenuItem // disableToolStripMenuItem.Name = "disableToolStripMenuItem"; - disableToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + disableToolStripMenuItem.Size = new System.Drawing.Size(162, 32); disableToolStripMenuItem.Text = "Disable"; disableToolStripMenuItem.Click += disableToolStripMenuItem_Click; // // deleteToolStripMenuItem // deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - deleteToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + deleteToolStripMenuItem.Size = new System.Drawing.Size(162, 32); deleteToolStripMenuItem.Text = "Delete"; deleteToolStripMenuItem.Click += deleteToolStripMenuItem_Click; // // copyToolStripMenuItem // copyToolStripMenuItem.Name = "copyToolStripMenuItem"; - copyToolStripMenuItem.Size = new System.Drawing.Size(147, 32); + copyToolStripMenuItem.Size = new System.Drawing.Size(162, 32); copyToolStripMenuItem.Text = "Copy"; copyToolStripMenuItem.Click += copyToolStripMenuItem_Click; // + // defaultToolStripMenuItem + // + defaultToolStripMenuItem.Name = "defaultToolStripMenuItem"; + defaultToolStripMenuItem.Size = new System.Drawing.Size(162, 32); + defaultToolStripMenuItem.Text = "Default"; + defaultToolStripMenuItem.Click += defaultToolStripMenuItem_Click; + // + // setActiveToolStripMenuItem + // + setActiveToolStripMenuItem.Name = "setActiveToolStripMenuItem"; + setActiveToolStripMenuItem.Size = new System.Drawing.Size(162, 32); + setActiveToolStripMenuItem.Text = "Set Active"; + setActiveToolStripMenuItem.Click += setActiveToolStripMenuItem_Click; + // // UI // AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); @@ -2146,6 +2239,7 @@ private void InitializeComponent() ((ISupportInitialize)forzaPortNumericUpDown).EndInit(); ((ISupportInitialize)rpmTrackBar).EndInit(); ((ISupportInitialize)rpmValueNumericUpDown).EndInit(); + flowLayoutPanel1.ResumeLayout(false); brakeConfigTabPage.ResumeLayout(false); brakeConfigTabPage.PerformLayout(); brakeTableLayoutPanel.ResumeLayout(false); @@ -2330,10 +2424,8 @@ private void InitializeComponent() private System.Windows.Forms.Label brakeVibrationMsg; private System.Windows.Forms.Label throttleMsg; private System.Windows.Forms.Label throttleVibrationMsg; - private System.Windows.Forms.Button buttonApplyMisc; private System.Windows.Forms.Button buttonApply_Brake; private System.Windows.Forms.Button buttonApply_Throttle; - private System.Windows.Forms.Button miscDefaultsButton; private System.Windows.Forms.Button brakeDefaultsButton; private System.Windows.Forms.Button throttleDefaultsButton; private System.Windows.Forms.Label brakeTriggerMode; @@ -2354,5 +2446,15 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem disableToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem defaultToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setActiveToolStripMenuItem; + private System.Windows.Forms.Button buttonApplyMisc; + private System.Windows.Forms.Button miscDefaultsButton; + private System.Windows.Forms.Label ExecutableListLabel; + private System.Windows.Forms.ListBox ExecutableListBox; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Button AddExecutableButton; + private System.Windows.Forms.Button EditExecutableButton; + private System.Windows.Forms.Button RemoveExecutableButton; } } \ No newline at end of file diff --git a/UI.cs b/UI.cs index 740c86d..4f39bf2 100644 --- a/UI.cs +++ b/UI.cs @@ -1,6 +1,7 @@ using ForzaDSX.Config; using ForzaDSX.Properties; using System; +using System.ComponentModel; using System.Linq; //using System.Configuration; @@ -14,8 +15,10 @@ namespace ForzaDSX public partial class UI : Form { protected ForzaDSXWorker forzaDSXWorker; + AppCheckThread appCheckWorker; protected ForzaDSX.Config.Config currentSettings; protected ForzaDSX.Config.Profile selectedProfile; + BindingList executables = new BindingList(); int selectedIndex = 0; //protected Configuration config; public ForzaDSX.Config.Config CurrentSettings { get => currentSettings; set => currentSettings = value; } @@ -84,18 +87,9 @@ private void UI_Load(object sender, EventArgs e) // Starts the background Worker //this.connectionWorker.RunWorkerAsync(); - var progressHandler = new Progress(AppCheckReporter); - AppCheckThread act = new AppCheckThread(ref currentSettings, progressHandler); - appCheckThreadCancellationToken = new CancellationTokenSource(); - appCheckThreadToken = appCheckThreadCancellationToken.Token; - appCheckThreadToken.Register(() => act.Stop()); - - appCheckThread = new Thread(new ThreadStart(act.Run)); - appCheckThread.IsBackground = true; - appCheckThread.Start(); var forzaProgressHandler = new Progress(WorkerThreadReporter); @@ -105,6 +99,33 @@ private void UI_Load(object sender, EventArgs e) forzaThreadToken = forzaThreadCancellationToken.Token; forzaThreadToken.Register(() => forzaDSXWorker.Stop()); + var progressHandler = new Progress(AppCheckReporter); + appCheckWorker = new AppCheckThread(ref currentSettings, progressHandler); + appCheckThreadCancellationToken = new CancellationTokenSource(); + appCheckThreadToken = appCheckThreadCancellationToken.Token; + + appCheckThreadToken.Register(() => appCheckWorker.Stop()); + if (!currentSettings.DisableAppCheck) + { + startAppCheckThread(); + + } + else + { + UpdateDSXConnectionStatus(true); + UpdateForzaConnectionStatus(true); + StartForzaDSXThread(); + } + } + + protected void startAppCheckThread() + { + + + appCheckThread = new Thread(new ThreadStart(appCheckWorker.Run)); + appCheckThread.IsBackground = true; + + appCheckThread.Start(); } protected void AppCheckReporter(AppCheckReportStruct value) @@ -120,6 +141,13 @@ protected void AppCheckReporter(AppCheckReportStruct value) else { UpdateForzaConnectionStatus(value.value); + if (value.value) + { + SwitchActiveProfile(value.message); + } else + { + SwitchActiveProfile(null); + } } if (forzaDsxThread == null) @@ -138,12 +166,45 @@ protected void AppCheckReporter(AppCheckReportStruct value) } } + protected void SwitchActiveProfile(String profileName) + { + Profile profile = null; + + if (profileName == "") + { + // profileName = selectedProfile.Name; + return; + } + if (currentSettings.ActiveProfile != null && currentSettings.ActiveProfile.Name == profileName) + return; + + if (profileName != null && currentSettings.Profiles.ContainsKey(profileName)) + { + profile = currentSettings.Profiles[profileName]; + + } + currentSettings.ActiveProfile = profile; + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); + SwitchDisplayedProfile(profileName); + StopForzaDSXThread(); + StartForzaDSXThread(); + + } + + protected void RestartAppCheckThread() + { + StopAppCheckThread(); + startAppCheckThread(); + } + protected void StartForzaDSXThread() { if (forzaDsxThread != null || forzaDSXWorker == null) return; - + if (currentSettings.ActiveProfile == null) + return; forzaDsxThread = new Thread(new ThreadStart(forzaDSXWorker.Run)); forzaDsxThread.IsBackground = true; @@ -168,6 +229,37 @@ protected void StopForzaDSXThread() forzaDsxThread = null; } + private void disableAppCheck() + { + currentSettings.DisableAppCheck = true; + toolStripAppCheckOnItem.Checked = false; + toolStripAppCheckOffItem.Checked = true; + toolStripAppCheckButton.Text = "App Check Disabled"; + StopAppCheckThread(); + SwitchActiveProfile(currentSettings.DefaultProfile); + UpdateDSXConnectionStatus(true); + UpdateForzaConnectionStatus(true); + StartForzaDSXThread(); + ConfigHandler.SaveConfig(); + } + protected void StopAppCheckThread() + { + try + { + if (appCheckThread != null + && appCheckThreadCancellationToken != null) + { + appCheckThreadCancellationToken.Cancel(); + } + } + catch (Exception) + { + + throw; + } + + appCheckThread = null; + } protected void WorkerThreadReporter(ForzaDSXReportStruct value) { @@ -220,6 +312,8 @@ private void UI_FormClosing(object sender, System.Windows.Forms.FormClosingEvent forzaThreadCancellationToken.Dispose(); } + + public void LoadSettings() { //// Build a config object, using env vars and JSON providers. @@ -234,6 +328,13 @@ public void LoadSettings() currentSettings = ConfigHandler.GetConfig(); selectedProfile = currentSettings.Profiles.Values.First(); + if (currentSettings.DisableAppCheck && currentSettings.DefaultProfile != null) + { + if (currentSettings.Profiles.ContainsKey(currentSettings.DefaultProfile)) + { + currentSettings.ActiveProfile = currentSettings.Profiles[currentSettings.DefaultProfile]; + } + } verboseModeOffToolStripMenuItem.Checked = currentSettings.VerboseLevel == VerboseLevel.Off; verboseModeLowToolStripMenuItem.Checked = currentSettings.VerboseLevel == VerboseLevel.Limited; @@ -272,7 +373,6 @@ void SetupUI() toolStripDSXPortTextBox.Text = currentSettings.DSXPort.ToString(); - loadProfilesIntoList(); SwitchDisplayedProfile(); @@ -285,6 +385,8 @@ void loadProfilesIntoList() foreach (Profile profile in currentSettings.Profiles.Values) { String name = profile.Name; + ListViewItem item = new ListViewItem(name); + if (!profile.IsEnabled) { name += " (Disabled)"; @@ -292,8 +394,13 @@ void loadProfilesIntoList() if (profile == currentSettings.ActiveProfile) { name += " (Active)"; + item.Selected = true; } - ListViewItem item = new ListViewItem(name); + if (profile.Name == currentSettings.DefaultProfile) + { + name += " (Default)"; + } + item.Text = name; item.Name = profile.Name; profilesListView.Items.Add(item); } @@ -301,14 +408,22 @@ void loadProfilesIntoList() void SwitchDisplayedProfile(String profileName = "") { - if (profileName == "") + + if (profileName == null || profileName == "" ) { + if (selectedProfile == null) + { + selectedProfile = currentSettings.Profiles.Values.First(); + } profileName = selectedProfile.Name; } if (currentSettings.Profiles.ContainsKey(profileName)) { selectedProfile = currentSettings.Profiles[profileName]; } + executables = new BindingList(selectedProfile.executableNames); + ExecutableListBox.DataSource = executables; + BrakeSettings brakeSettings = selectedProfile.brakeSettings; ThrottleSettings throttleSettings = selectedProfile.throttleSettings; @@ -938,9 +1053,11 @@ private void buttonApplyMisc_Click(object sender, EventArgs e) { if (forzaDSXWorker != null) { - + selectedProfile.executableNames = executables.ToList(); forzaDSXWorker.SetSettings(CurrentSettings); ConfigHandler.SaveConfig(); + appCheckWorker.updateExecutables(); + //RestartAppCheckThread(); } } @@ -1022,20 +1139,17 @@ private void toolStripAppCheckOnItem_Click(object sender, EventArgs e) toolStripAppCheckOffItem.Checked = false; toolStripAppCheckButton.Text = "App Check Enabled"; ConfigHandler.SaveConfig(); - + RestartAppCheckThread(); } + private void toolStripAppCheckOffItem_Click(object sender, EventArgs e) { - currentSettings.DisableAppCheck = true; - toolStripAppCheckOnItem.Checked = false; - toolStripAppCheckOffItem.Checked = true; - toolStripAppCheckButton.Text = "App Check Disabled"; - ConfigHandler.SaveConfig(); + disableAppCheck(); } @@ -1091,31 +1205,57 @@ private void profilesListView_MouseDown(object sender, MouseEventArgs e) if (e.Button == MouseButtons.Right) { -if (HI.Item != null) { + if (HI.Item != null) + { profilesListView.FocusedItem = HI.Item; - - ProfilesContextMenu.Items[1].Enabled = true; - ProfilesContextMenu.Items[2].Enabled = true; - ProfilesContextMenu.Items[3].Enabled = true; - ProfilesContextMenu.Items[4].Enabled = false; + newToolStripMenuItem.Enabled = true; + renameToolStripMenuItem.Enabled = true; + disableToolStripMenuItem.Enabled = true; + deleteToolStripMenuItem.Enabled = true; + copyToolStripMenuItem.Enabled = false; + defaultToolStripMenuItem.Enabled = true; + setActiveToolStripMenuItem.Enabled = true; + + if (currentSettings.Profiles[HI.Item.Name].IsEnabled) { - ProfilesContextMenu.Items[2].Text = "Disable"; - } else + disableToolStripMenuItem.Text = "Disable"; + } + else + { + disableToolStripMenuItem.Text = "Enable"; + } + if (currentSettings.Profiles[HI.Item.Name] == currentSettings.ActiveProfile) + { + setActiveToolStripMenuItem.CheckState = CheckState.Checked; + } + else + { + setActiveToolStripMenuItem.CheckState = CheckState.Unchecked; + } + if (HI.Item.Name == currentSettings.DefaultProfile) + { + defaultToolStripMenuItem.CheckState = CheckState.Checked; + } + else { - ProfilesContextMenu.Items[2].Text = "Enable"; + defaultToolStripMenuItem.CheckState = CheckState.Unchecked; } ProfilesContextMenu.Show(Cursor.Position); - } else + } + else { ProfilesContextMenu.Items[1].Enabled = false; ProfilesContextMenu.Items[2].Enabled = false; ProfilesContextMenu.Items[3].Enabled = false; ProfilesContextMenu.Items[4].Enabled = false; + ProfilesContextMenu.Items[5].Enabled = false; + ProfilesContextMenu.Items[6].Enabled = false; ProfilesContextMenu.Show(Cursor.Position); } - } else if (e.Button == MouseButtons.Left) + } + else if (e.Button == MouseButtons.Left) { if (HI.Item == null) { @@ -1123,14 +1263,14 @@ private void profilesListView_MouseDown(object sender, MouseEventArgs e) } selectedIndex = HI.Item.Index; String profileName = HI.Item.Name; - // HI.Item.Selected = true; + // HI.Item.Selected = true; SwitchDisplayedProfile(profileName); } } private void newToolStripMenuItem_Click(object sender, EventArgs e) { - String newProfileName = NameForm.ShowDialog(""); + String newProfileName = NameForm.ShowDialog("", "Please enter the Profile Name"); if (newProfileName != "") { Profile newProfile = new Profile(); @@ -1145,7 +1285,7 @@ private void newToolStripMenuItem_Click(object sender, EventArgs e) private void renameToolStripMenuItem_Click(object sender, EventArgs e) { String oldProfileName = profilesListView.FocusedItem.Name; - String newProfileName = NameForm.ShowDialog(oldProfileName); + String newProfileName = NameForm.ShowDialog(oldProfileName, "Please enter the Profile Name"); if (newProfileName != "" && oldProfileName != newProfileName) { Profile newProfile = currentSettings.Profiles[oldProfileName]; @@ -1168,6 +1308,7 @@ private void disableToolStripMenuItem_Click(object sender, EventArgs e) //profile.IsEnabled = false; ConfigHandler.SaveConfig(); loadProfilesIntoList(); + appCheckWorker.updateExecutables(); } } @@ -1188,5 +1329,81 @@ private void copyToolStripMenuItem_Click(object sender, EventArgs e) { } + + private void defaultToolStripMenuItem_Click(object sender, EventArgs e) + { + String profileName = profilesListView.FocusedItem.Name; + if (currentSettings.Profiles.ContainsKey(profileName)) + { + currentSettings.DefaultProfile = profileName; + ConfigHandler.SaveConfig(); + loadProfilesIntoList(); + } + } + + private void setActiveToolStripMenuItem_Click(object sender, EventArgs e) + { + String profileName = profilesListView.FocusedItem.Name; + if (currentSettings.Profiles.ContainsKey(profileName)) + { + //currentSettings.ActiveProfile = currentSettings.Profiles[profileName]; + disableAppCheck(); + SwitchActiveProfile(profileName); + + } + } + + private void AddExecutableButton_Click(object sender, EventArgs e) + { + String newExecutableName = NameForm.ShowDialog("", "Please enter the Executable Name"); ; + if (newExecutableName != "") + { + executables.Add(newExecutableName); + // ExecutableListBox.Items.Add(newExecutableName); + + } + } + + private void EditExecutableButton_Click(object sender, EventArgs e) + { + String oldExecutableName = ExecutableListBox.SelectedItems[0].ToString(); + String newExecutableName = NameForm.ShowDialog(oldExecutableName, "Please enter the Executable Name"); ; + if (newExecutableName != "") + { + int index = selectedProfile.executableNames.IndexOf(oldExecutableName); + executables[index] = newExecutableName; + // ExecutableListBox.SelectedIndex = -1; + // ExecutableListBox.Items.Add(newExecutableName); + + } + } + + private void RemoveExecutableButton_Click(object sender, EventArgs e) + { + String oldExecutableName = ExecutableListBox.SelectedItems[0].ToString(); + + executables.Remove(oldExecutableName); + + } + + private void ExecutableListBox_SelectedIndexChanged(object sender, EventArgs e) + { + + if (ExecutableListBox.SelectedItems.Count > 1) + { + EditExecutableButton.Enabled = false; + RemoveExecutableButton.Enabled = true; + return; + + } else if (ExecutableListBox.SelectedItems.Count == 0) + { + EditExecutableButton.Enabled = false; + RemoveExecutableButton.Enabled = false; + } else if (ExecutableListBox.SelectedItems.Count == 1) + { + EditExecutableButton.Enabled = true; + RemoveExecutableButton.Enabled = true; + } + } } } \ No newline at end of file From b9ffe2f8deff0b80da5f0677e3b6717d1ab67d12 Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Tue, 26 Dec 2023 19:42:53 -0500 Subject: [PATCH 6/8] Refactored Main Trigger control and UDP Parsing to new classes --- .vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 | Bin 203145 -> 203145 bytes .vs/ForzaDSX/v17/.suo | Bin 89088 -> 87040 bytes DataPacket.cs | 159 ++++---- ForzaDSXWorker.cs | 422 ++++------------------ GameParsers/ForzaParser.cs | 247 +++++++++++++ GameParsers/Parser.cs | 235 +++++++++++- GameParsers/ReportableInstruction.cs | 14 + Program.cs | 4 + UI.cs | 14 +- 9 files changed, 666 insertions(+), 429 deletions(-) create mode 100644 GameParsers/ForzaParser.cs create mode 100644 GameParsers/ReportableInstruction.cs diff --git a/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 b/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 index 7a7869098e53ee035aff157a36f14b386af6c5fe..085c246b6f017330b5ab88d9eb0dd506c580748b 100644 GIT binary patch delta 16057 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 Xm}b9QFGP%N6k6Csrvr`5ht2s delta 15181 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 delta 8066 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 jQt-dQG3YgQ+ 1.0 means loss of grip. - public float TireSlipRatioFrontRight { get; set; } - public float TireSlipRatioRearLeft { get; set; } - public float TireSlipRatioRearRight { get; set; } - public float WheelRotationSpeedFrontLeft { get; set; } // Wheel rotation speed radians/sec. - public float WheelRotationSpeedFrontRight { get; set; } - public float WheelRotationSpeedRearLeft { get; set; } - public float WheelRotationSpeedRearRight { get; set; } - public float WheelOnRumbleStripFrontLeft { get; set; } // = 1 when wheel is on rumble strip, = 0 when off. - public float WheelOnRumbleStripFrontRight { get; set; } - public float WheelOnRumbleStripRearLeft { get; set; } - public float WheelOnRumbleStripRearRight { get; set; } - public float WheelInPuddleDepthFrontLeft { get; set; } // = from 0 to 1, where 1 is the deepest puddle - public float WheelInPuddleDepthFrontRight { get; set; } - public float WheelInPuddleDepthRearLeft { get; set; } - public float WheelInPuddleDepthRearRight { get; set; } - public float SurfaceRumbleFrontLeft { get; set; } // Non-dimensional surface rumble values passed to controller force feedback - public float SurfaceRumbleFrontRight { get; set; } - public float SurfaceRumbleRearLeft { get; set; } - public float SurfaceRumbleRearRight { get; set; } - public float TireSlipAngleFrontLeft { get; set; } // Tire normalized slip angle, = 0 means 100% grip and |angle| > 1.0 means loss of grip. - public float TireSlipAngleFrontRight { get; set; } - public float TireSlipAngleRearLeft { get; set; } - public float TireSlipAngleRearRight { get; set; } + public float TireCombinedSlipFrontLeft { get; set; } // Tire normalized combined slip, = 0 means 100% grip and |slip| > 1.0 means loss of grip. public float TireCombinedSlipFrontRight { get; set; } public float TireCombinedSlipRearLeft { get; set; } public float TireCombinedSlipRearRight { get; set; } - public float SuspensionTravelMetersFrontLeft { get; set; } // Actual suspension travel in meters - public float SuspensionTravelMetersFrontRight { get; set; } - public float SuspensionTravelMetersRearLeft { get; set; } - public float SuspensionTravelMetersRearRight { get; set; } - public uint CarOrdinal { get; set; } // Unique ID of the car make/model + public uint CarClass { get; set; } // Between 0 (D -- worst cars) and 7 (X class -- best cars) inclusive public uint CarPerformanceIndex { get; set; } // Between 100 (slowest car) and 999 (fastest car) inclusive - public uint DrivetrainType { get; set; } // Corresponds to EDrivetrainType; 0 = FWD, 1 = RWD, 2 = AWD - public uint NumCylinders { get; set; } // Number of cylinders in the engine - // Dash - public float PositionX { get; set; } - public float PositionY { get; set; } - public float PositionZ { get; set; } public float Speed { get; set; } public float Power { get; set; } - public float Torque { get; set; } - public float TireTempFl { get; set; } - public float TireTempFr { get; set; } - public float TireTempRl { get; set; } - public float TireTempRr { get; set; } - public float Boost { get; set; } - public float Fuel { get; set; } - public float Distance { get; set; } - public float BestLapTime { get; set; } - public float LastLapTime { get; set; } - public float CurrentLapTime { get; set; } - public float CurrentRaceTime { get; set; } - public uint Lap { get; set; } - public uint RacePosition { get; set; } - public uint Accelerator { get; set; } - public uint Brake { get; set; } - public uint Clutch { get; set; } - public uint Handbrake { get; set; } - public uint Gear { get; set; } - public int Steer { get; set; } - public uint NormalDrivingLine { get; set; } - public uint NormalAiBrakeDifference { get; set; } + + public float FourWheelCombinedTireSlip { get; set; } // Combined slip for all wheels where 0 means 100% grip and |slip| > 1.0 means loss of grip. + public float FrontWheelsCombinedTireSlip { get; set; } + public float RearWheelsCombinedTireSlip { get; set; } + + + // public uint TimestampMS { get; set; } // Can overflow to 0 eventually + + // public float VelocityX { get; set; } // In the car's local space; X = right, Y = up, Z = forward + // public float VelocityY { get; set; } + // public float VelocityZ { get; set; } + // public float AngularVelocityX { get; set; } // In the car's local space; X = pitch, Y = yaw, Z = roll + // public float AngularVelocityY { get; set; } + // public float AngularVelocityZ { get; set; } + // public float Yaw { get; set; } + // public float Pitch { get; set; } + // public float Roll { get; set; } + // public float NormalizedSuspensionTravelFrontLeft { get; set; } // Suspension travel normalized: 0.0f = max stretch; 1.0 = max compression + /* public float NormalizedSuspensionTravelFrontRight { get; set; } + public float NormalizedSuspensionTravelRearLeft { get; set; } + public float NormalizedSuspensionTravelRearRight { get; set; } + public float TireSlipRatioFrontLeft { get; set; } // Tire normalized slip ratio, = 0 means 100% grip and |ratio| > 1.0 means loss of grip. + public float TireSlipRatioFrontRight { get; set; } + public float TireSlipRatioRearLeft { get; set; } + public float TireSlipRatioRearRight { get; set; } + public float WheelRotationSpeedFrontLeft { get; set; } // Wheel rotation speed radians/sec. + public float WheelRotationSpeedFrontRight { get; set; } + public float WheelRotationSpeedRearLeft { get; set; } + public float WheelRotationSpeedRearRight { get; set; } + public float WheelOnRumbleStripFrontLeft { get; set; } // = 1 when wheel is on rumble strip, = 0 when off. + public float WheelOnRumbleStripFrontRight { get; set; } + public float WheelOnRumbleStripRearLeft { get; set; } + public float WheelOnRumbleStripRearRight { get; set; } + public float WheelInPuddleDepthFrontLeft { get; set; } // = from 0 to 1, where 1 is the deepest puddle + public float WheelInPuddleDepthFrontRight { get; set; } + public float WheelInPuddleDepthRearLeft { get; set; } + public float WheelInPuddleDepthRearRight { get; set; } + public float SurfaceRumbleFrontLeft { get; set; } // Non-dimensional surface rumble values passed to controller force feedback + public float SurfaceRumbleFrontRight { get; set; } + public float SurfaceRumbleRearLeft { get; set; } + public float SurfaceRumbleRearRight { get; set; } + public float TireSlipAngleFrontLeft { get; set; } // Tire normalized slip angle, = 0 means 100% grip and |angle| > 1.0 means loss of grip. + public float TireSlipAngleFrontRight { get; set; } + public float TireSlipAngleRearLeft { get; set; } + public float TireSlipAngleRearRight { get; set; }*/ + + /* public float SuspensionTravelMetersFrontLeft { get; set; } // Actual suspension travel in meters + public float SuspensionTravelMetersFrontRight { get; set; } + public float SuspensionTravelMetersRearLeft { get; set; } + public float SuspensionTravelMetersRearRight { get; set; } + public uint CarOrdinal { get; set; } // Unique ID of the car make/model*/ + + /* public uint DrivetrainType { get; set; } // Corresponds to EDrivetrainType; 0 = FWD, 1 = RWD, 2 = AWD + public uint NumCylinders { get; set; } // Number of cylinders in the engine + + // Dash + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; }*/ + + /* public float Torque { get; set; } + public float TireTempFl { get; set; } + public float TireTempFr { get; set; } + public float TireTempRl { get; set; } + public float TireTempRr { get; set; } + public float Boost { get; set; } + public float Fuel { get; set; } + public float Distance { get; set; } + public float BestLapTime { get; set; } + public float LastLapTime { get; set; } + public float CurrentLapTime { get; set; } + public float CurrentRaceTime { get; set; } + public uint Lap { get; set; } + public uint RacePosition { get; set; }*/ + + /* public uint Clutch { get; set; } + public uint Handbrake { get; set; } + public uint Gear { get; set; } + public int Steer { get; set; } + public uint NormalDrivingLine { get; set; } + public uint NormalAiBrakeDifference { get; set; }*/ } } diff --git a/ForzaDSXWorker.cs b/ForzaDSXWorker.cs index c56e1f4..8a70ee2 100644 --- a/ForzaDSXWorker.cs +++ b/ForzaDSXWorker.cs @@ -1,4 +1,5 @@ using ForzaDSX.Config; +using ForzaDSX.GameParsers; using System; using System.IO; using System.Net; @@ -37,21 +38,40 @@ public enum RacingReportType : ushort // 3 = Brake message BRAKE } - - public ForzaDSXReportStruct(ReportType type, RacingReportType racingType, string msg) + public ForzaDSXReportStruct(VerboseLevel level, ReportType type, RacingReportType racingType, string msg) + { + this.verboseLevel = level; + this.type = type; + this.racingType = racingType; + this.message = msg; + } + public ForzaDSXReportStruct(ReportType type, RacingReportType racingType, string msg) { this.type = type; this.racingType = racingType; this.message = msg; } - public ForzaDSXReportStruct(ReportType type, string msg) + public ForzaDSXReportStruct(VerboseLevel level, ReportType type, string msg) + { + this.verboseLevel = level; + this.type = type; + this.message = msg; + } + + public ForzaDSXReportStruct(ReportType type, string msg) { this.type = type; this.message = msg; } + public ForzaDSXReportStruct(VerboseLevel level, string msg) + { + this.verboseLevel = level; + this.type = ReportType.VERBOSEMESSAGE; + this.message = String.Empty; + } - public ForzaDSXReportStruct(string msg) + public ForzaDSXReportStruct(string msg) { this.type = ReportType.VERBOSEMESSAGE; this.message = String.Empty; @@ -60,39 +80,15 @@ public ForzaDSXReportStruct(string msg) public ReportType type = 0; public RacingReportType racingType = 0; public string message = string.Empty; + public VerboseLevel verboseLevel = VerboseLevel.Limited; } ForzaDSX.Config.Config settings; IProgress progressReporter; + Parser parser; + + - int lastThrottleResistance = 1; - int lastThrottleFreq = 0; - int lastBrakeResistance = 200; - int lastBrakeFreq = 0; - - uint LastValidCarClass = 0; - int LastValidCarCPI = 0; - float MaxCPI = 255; - - float LastEngineRPM = 0; - // FH does not always correctly set IsRaceOn, so we must also check if the RPM info is the same for a certain ammount of time - uint LastRPMAccumulator = 0; - uint RPMAccumulatorTriggerRaceOff = 200; - - // Colors for Light Bar while in menus -> using car's PI colors from Forza - public static readonly uint CarClassD = 0; - public static readonly int[] ColorClassD = { 107, 185, 236 }; - public static readonly uint CarClassC = 1; - public static readonly int[] ColorClassC = { 234, 202, 49 }; - public static readonly uint CarClassB = 2; - public static readonly int[] ColorClassB = { 211, 90, 37 }; - public static readonly uint CarClassA = 3; - public static readonly int[] ColorClassA = { 187, 59, 34 }; - public static readonly uint CarClassS1 = 4; - public static readonly int[] ColorClassS1 = { 128, 54, 243 }; - public static readonly uint CarClassS2 = 5; - public static readonly int[] ColorClassS2 = { 75, 88, 229 }; - public static readonly int[] ColorClassX = { 105, 182, 72 }; public ForzaDSXWorker(ForzaDSX.Config.Config currentSettings, IProgress progressReporter) @@ -113,332 +109,66 @@ public void SetSettings(ForzaDSX.Config.Config currentSettings) //See DataPacket.cs for more details about what forza parameters can be accessed. //See the Enums at the bottom of this file for details about commands that can be sent to DualSenseX //Also see the Test Function below to see examples about those commands - void SendData(DataPacket data) + void SendData() { Packet p = new Packet(); + // Parser parser = new ForzaParser(settings); CsvData csvRecord = new CsvData(); Profile activeProfile = settings.ActiveProfile; - //Set the controller to do this for - int controllerIndex = 0; - - ////Initialize our array of instructions - //p.instructions = new Instruction[3]; - - /* Combined variables */ - int resistance = 0; - int filteredResistance = 0; - float avgAccel = 0; - int freq = 0; - int filteredFreq = 0; - - bool bInRace = data.IsRaceOn; - - float currentRPM = data.CurrentEngineRpm; - // FH does not always correctly set IsRaceOn, so we must also check if the RPM info is the same for a certain ammount of time - // Also check if Power <= 0 (car is really stopped) - if (currentRPM == LastEngineRPM - && data.Power <= 0) - { - LastRPMAccumulator++; - if (LastRPMAccumulator > RPMAccumulatorTriggerRaceOff) - { - bInRace = false; - } - } - else - { - LastRPMAccumulator = 0; - } - - LastEngineRPM = currentRPM; - - //Get average tire slippage. This value runs from 0.0 upwards with a value of 1.0 or greater meaning total loss of grip. - float combinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight) + Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 4; - float combinedFrontTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight)) / 2; - float combinedRearTireSlip = (Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 2; - - uint currentClass = LastValidCarClass; - if (data.CarClass > 0) - { - LastValidCarClass = currentClass = data.CarClass; - } - - int currentCPI = LastValidCarCPI; - if (data.CarPerformanceIndex > 0) - { - LastValidCarCPI = currentCPI = Math.Min((int)data.CarPerformanceIndex, 255); - } - - // Right Trigger (index 2) - //int RightTrigger = 2; - Instruction RightTrigger = new Instruction(); - RightTrigger.type = InstructionType.TriggerUpdate; - //p.instructions[RightTrigger].type = InstructionType.TriggerUpdate; - - // Left Trigger - //int LeftTrigger = 1; - //p.instructions[LeftTrigger].type = InstructionType.TriggerUpdate; - Instruction LeftTrigger = new Instruction(); - LeftTrigger.type = InstructionType.TriggerUpdate; - - // Light Bar - //int LightBar = 0; - //p.instructions[LightBar].type = InstructionType.RGBUpdate; - Instruction LightBar = new Instruction(); - LightBar.type = InstructionType.RGBUpdate; + ReportableInstruction reportableInstruction = new ReportableInstruction(); + // No race = normal triggers - if (!bInRace) + if (!parser.IsRaceOn()) { - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; - - #region Light Bar color - int CPIcolorR = 255; - int CPIcolorG = 255; - int CPIcolorB = 255; - - float cpiRatio = currentCPI / MaxCPI; - - if (currentClass <= CarClassD) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassD[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassD[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassD[2]); - } - else if (currentClass <= CarClassC) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassC[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassC[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassC[2]); - } - else if (currentClass <= CarClassB) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassB[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassB[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassB[2]); - } - else if (currentClass <= CarClassA) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassA[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassA[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassA[2]); - } - else if (currentClass <= CarClassS1) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS1[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS1[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS1[2]); - } - else if (currentClass <= CarClassS2) - { - CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS2[0]); - CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS2[1]); - CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS2[2]); - } - else - { - CPIcolorR = ColorClassX[0]; - CPIcolorG = ColorClassX[1]; - CPIcolorB = ColorClassX[2]; - } + - LightBar.parameters = new object[] { controllerIndex, CPIcolorR, CPIcolorG, CPIcolorB }; - #endregion - - if (settings.VerboseLevel > 0 - && progressReporter != null) + reportableInstruction = parser.GetPreRaceInstructions(); + p.instructions = reportableInstruction.Instructions; + reportableInstruction.ForzaDSXReportStructs.ForEach(x => { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.NORACE, $"No race going on. Normal Triggers. Car's Class = {currentClass}; CPI = {currentCPI}; CPI Ratio = {cpiRatio}; Color [{CPIcolorR}, {CPIcolorG}, {CPIcolorB}]" )); - } - p.instructions = new Instruction[] { LightBar, LeftTrigger, RightTrigger }; + if (x.verboseLevel <= settings.VerboseLevel + && progressReporter != null) + { + progressReporter.Report(x); + } + }); //Send the commands to DSX Send(p); } else { - #region Right Trigger - //Set the updates for the right Trigger(Throttle) - ThrottleSettings throttleSettings = activeProfile.throttleSettings; - avgAccel = (float)Math.Sqrt((throttleSettings.TurnAccelerationScale * (data.AccelerationX * data.AccelerationX)) + (throttleSettings.ForwardAccelerationScale * (data.AccelerationZ * data.AccelerationZ))); - - // Define losing grip as front tires slipping or rear tires slipping while accelerating a fair ammount - bool bLosingAccelGrip = - combinedFrontTireSlip > throttleSettings.GripLossValue - || (combinedRearTireSlip > throttleSettings.GripLossValue && data.Accelerator > 200); - - if (throttleSettings.TriggerMode == Config.TriggerMode.Off) - { - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; - } - // If losing grip, start to "vibrate" - else if (bLosingAccelGrip && throttleSettings.TriggerMode == Config.TriggerMode.Vibration) - { - freq = (int)Math.Floor(Map(combinedTireSlip, throttleSettings.GripLossValue, 5, 0, throttleSettings.MaxVibration)); - resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinStiffness, throttleSettings.MaxStiffness)); - filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); - filteredFreq = (int)EWMA(freq, lastThrottleFreq, throttleSettings.VibrationSmoothing); - - lastThrottleResistance = filteredResistance; - lastThrottleFreq = filteredFreq; - - if (filteredFreq <= throttleSettings.MinVibration - || data.Accelerator <= throttleSettings.VibrationModeStart) - { - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; - - filteredFreq = 0; - filteredResistance = 0; - } - else - { - RightTrigger.parameters = new object[] { - controllerIndex, Trigger.Right, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, - filteredFreq * throttleSettings.EffectIntensity, filteredResistance * throttleSettings.EffectIntensity,throttleSettings.VibrationModeStart, 0, 0, 0, 0 }; - } - - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); - } - } - else - { - //It should probably always be uniformly stiff - resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinResistance, throttleSettings.MaxResistance)); - filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); - - lastThrottleResistance = filteredResistance; - RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; - - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, String.Empty)); - } - } - - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}\r\n Throttle Resistance: {filteredResistance}\r\n Accelerator: {data.Accelerator}" )); - } - - p.instructions = new Instruction[] { RightTrigger }; - - //Send the commands to DSX - Send(p); - #endregion - #region Left Trigger - //Update the left(Brake) trigger - BrakeSettings brakeSettings = activeProfile.brakeSettings; - // Define losing grip as tires slipping while braking a fair ammount - bool bLosingBrakeGrip = combinedTireSlip > brakeSettings.GripLossValue && data.Brake > 100; - - if (brakeSettings.TriggerMode == Config.TriggerMode.Off) - { - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; - } - // If losing grip, start to "vibrate" - else if (bLosingBrakeGrip && brakeSettings.TriggerMode == Config.TriggerMode.Vibration) - { - freq = (int)Math.Floor(Map(combinedTireSlip, brakeSettings.GripLossValue, 5, 0, brakeSettings.MaxVibration)); - resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MaxStiffness , brakeSettings.MinStiffness)); - filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); - filteredFreq = (int)EWMA(freq, lastBrakeFreq, brakeSettings.VibrationSmoothing); - - lastBrakeResistance = filteredResistance; - lastBrakeFreq = filteredFreq; - - if (filteredFreq <= brakeSettings.MinVibration) - { - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, 0 }; - } - else - { - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, - filteredFreq *brakeSettings.EffectIntensity, filteredResistance * brakeSettings.EffectIntensity, brakeSettings.VibrationStart, 0, 0, 0, 0 }; - } - //Set left trigger to the custom mode VibrateResitance with values of Frequency = freq, Stiffness = 104, startPostion = 76. - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}" )); - } - } - else - { - //By default, Increasingly resistant to force - resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MinResistance, brakeSettings.MaxResistance)); - filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); - lastBrakeResistance = filteredResistance; - - LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, filteredResistance * brakeSettings.EffectIntensity }; - - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, String.Empty )); - } - } - - if (settings.VerboseLevel > 0 - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct(ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}\r\n Brake Resistance: {filteredResistance}\r\n Tire Slip: {combinedTireSlip} \r\n FLCPS: {data.frontLeftContactPatchV} \r\n speed: {data.Speed}" )); - } - - p.instructions = new Instruction[] { LeftTrigger}; - - //Send the commands to DSX - Send(p); - #endregion - - #region Light Bar - //Update the light bar - //Currently registers intensity on the green channel based on engine RPM as a percantage of the maxium. Changes to red if RPM ratio > 80% (usually red line) - float engineRange = data.EngineMaxRpm - data.EngineIdleRpm; - float CurrentRPMRatio = (currentRPM - data.EngineIdleRpm) / engineRange; - int GreenChannel = Math.Max((int)Math.Floor(CurrentRPMRatio * 255), 50); - int RedChannel = (int)Math.Floor(CurrentRPMRatio * 255); - if (CurrentRPMRatio >= activeProfile.RPMRedlineRatio) - { - // Remove Green - GreenChannel = 255 - GreenChannel; - } - - LightBar.parameters = new object[] { controllerIndex, RedChannel, GreenChannel, 0 }; + reportableInstruction = parser.GetInRaceRightTriggerInstruction(); + sendReportableInstruction(reportableInstruction); + reportableInstruction = parser.GetInRaceLeftTriggerInstruction(); + sendReportableInstruction(reportableInstruction); + reportableInstruction = parser.GetInRaceLightbarInstruction(); + sendReportableInstruction(reportableInstruction); - if (settings.VerboseLevel > VerboseLevel.Limited - && progressReporter != null) - { - progressReporter.Report(new ForzaDSXReportStruct($"Engine RPM: {data.CurrentEngineRpm}; Engine Max RPM: {data.EngineMaxRpm}; Engine Idle RPM: {data.EngineIdleRpm}")); - } - - p.instructions = new Instruction[] { LightBar }; - - //Send the commands to DSX - Send(p); - #endregion } } - //Maps floats from one range to another. - public float Map(float x, float in_min, float in_max, float out_min, float out_max) + private void sendReportableInstruction(ReportableInstruction reportableInstruction) { - if (x > in_max) + reportableInstruction.ForzaDSXReportStructs.ForEach(x => { - x = in_max; - } - else if (x < in_min) - { - x = in_min; - } - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; - } + + if (x.verboseLevel <= settings.VerboseLevel + && progressReporter != null) + { + progressReporter.Report(x); + } + }); + Packet p = new Packet(); + p.instructions = reportableInstruction.Instructions; + //Send the commands to DSX + Send(p); + } + + //Maps floats from one range to another. + //private DataPacket data; static UdpClient senderClient; @@ -585,6 +315,7 @@ public void Run() } return; } + parser = new ForzaParser(settings); //Connect to Forza ipEndPoint = new IPEndPoint(IPAddress.Loopback, settings.ActiveProfile.gameUDPPort); client = new UdpClient(settings.ActiveProfile.gameUDPPort); @@ -612,8 +343,8 @@ public void Run() { // return; } - data = parseDirtData(resultBuffer); - + //data = parseDirtData(resultBuffer); + parser.ParsePacket(resultBuffer); if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) { @@ -621,7 +352,7 @@ public void Run() } //Process and send data to DSX - SendData(data); + SendData(); } } catch (Exception e) @@ -664,14 +395,7 @@ public void Stop() } } - static float EWMA(float input, float last, float alpha) - { - return (alpha * input) + (1 - alpha) * last; - } - static int EWMA(int input, int last, float alpha) - { - return (int)Math.Floor(EWMA((float)input, (float)last, alpha)); - } + DataPacket parseDirtData(byte[] packet) { @@ -714,7 +438,7 @@ static float calcTireSlip(float contactPatchSpeed, float vehicleSpeed) return 3.0f * (Math.Abs(Math.Abs(contactPatchSpeed) - vehicleSpeed) / vehicleSpeed); } //Parses data from Forza into a DataPacket - DataPacket ParseData(byte[] packet) + /* DataPacket ParseData(byte[] packet) { DataPacket data = new DataPacket(); @@ -808,7 +532,7 @@ DataPacket ParseData(byte[] packet) data.NormalAiBrakeDifference = packet.NormalAiBrakeDifference(); return data; - } + }*/ //Support different standards static bool AdjustToBufferType(int bufferLength) diff --git a/GameParsers/ForzaParser.cs b/GameParsers/ForzaParser.cs new file mode 100644 index 0000000..a34993f --- /dev/null +++ b/GameParsers/ForzaParser.cs @@ -0,0 +1,247 @@ +using ForzaDSX.Config; +using ForzaDSX.Properties; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ForzaDSX.ForzaDSXWorker; + +namespace ForzaDSX.GameParsers +{ + internal class ForzaParser : Parser + { + // Colors for Light Bar while in menus -> using car's PI colors from Forza + public static readonly uint CarClassD = 0; + public static readonly int[] ColorClassD = { 107, 185, 236 }; + public static readonly uint CarClassC = 1; + public static readonly int[] ColorClassC = { 234, 202, 49 }; + public static readonly uint CarClassB = 2; + public static readonly int[] ColorClassB = { 211, 90, 37 }; + public static readonly uint CarClassA = 3; + public static readonly int[] ColorClassA = { 187, 59, 34 }; + public static readonly uint CarClassS1 = 4; + public static readonly int[] ColorClassS1 = { 128, 54, 243 }; + public static readonly uint CarClassS2 = 5; + public static readonly int[] ColorClassS2 = { 75, 88, 229 }; + public static readonly int[] ColorClassX = { 105, 182, 72 }; + public ForzaParser(Config.Config settings) : base(settings) + { + } + + public override bool IsRaceOn() + { + bool bInRace = data.IsRaceOn; + float currentRPM = data.CurrentEngineRpm; + + if (currentRPM == LastEngineRPM + && data.Power <= 0) + { + LastRPMAccumulator++; + if (LastRPMAccumulator > RPMAccumulatorTriggerRaceOff) + { + bInRace = false; + } + } + else + { + LastRPMAccumulator = 0; + } + + LastEngineRPM = currentRPM; + return bInRace; + } + + public override ReportableInstruction GetPreRaceInstructions() + { + ReportableInstruction reportableInstruction = new ReportableInstruction(); + + uint currentClass = LastValidCarClass; + if (data.CarClass > 0) + { + LastValidCarClass = currentClass = data.CarClass; + } + + int currentCPI = LastValidCarCPI; + if (data.CarPerformanceIndex > 0) + { + LastValidCarCPI = currentCPI = Math.Min((int)data.CarPerformanceIndex, 255); + } + + + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; + + #region Light Bar color + int CPIcolorR = 255; + int CPIcolorG = 255; + int CPIcolorB = 255; + + float cpiRatio = currentCPI / MaxCPI; + + if (currentClass <= CarClassD) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassD[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassD[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassD[2]); + } + else if (currentClass <= CarClassC) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassC[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassC[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassC[2]); + } + else if (currentClass <= CarClassB) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassB[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassB[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassB[2]); + } + else if (currentClass <= CarClassA) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassA[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassA[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassA[2]); + } + else if (currentClass <= CarClassS1) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS1[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS1[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS1[2]); + } + else if (currentClass <= CarClassS2) + { + CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS2[0]); + CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS2[1]); + CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS2[2]); + } + else + { + CPIcolorR = ColorClassX[0]; + CPIcolorG = ColorClassX[1]; + CPIcolorB = ColorClassX[2]; + } + + LightBar.parameters = new object[] { controllerIndex, CPIcolorR, CPIcolorG, CPIcolorB }; + #endregion + + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.NORACE, $"No race going on. Normal Triggers. Car's Class = {currentClass}; CPI = {currentCPI}; CPI Ratio = {cpiRatio}; Color [{CPIcolorR}, {CPIcolorG}, {CPIcolorB}]")); + + + reportableInstruction.Instructions = new Instruction[] { LightBar, LeftTrigger, RightTrigger }; + return reportableInstruction; + } + + + public override void ParsePacket(byte[] packet) + { + data = new DataPacket(); + + + + // sled + data.IsRaceOn = packet.IsRaceOn(); + data.EngineMaxRpm = packet.EngineMaxRpm(); + data.EngineIdleRpm = packet.EngineIdleRpm(); + data.CurrentEngineRpm = packet.CurrentEngineRpm(); + data.AccelerationX = packet.AccelerationX(); + data.AccelerationZ = packet.AccelerationZ(); + + data.TireCombinedSlipFrontLeft = packet.TireCombinedSlipFl(); + data.TireCombinedSlipFrontRight = packet.TireCombinedSlipFr(); + data.TireCombinedSlipRearLeft = packet.TireCombinedSlipRl(); + data.TireCombinedSlipRearRight = packet.TireCombinedSlipRr(); + + data.CarClass = packet.CarClass(); + data.CarPerformanceIndex = packet.CarPerformanceIndex(); + + data.Speed = packet.Speed(); + data.Power = packet.Power(); + + data.Accelerator = packet.Accelerator(); + data.Brake = packet.Brake(); + + + data.FourWheelCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight) + Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 4; + data.FrontWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight)) / 2; + data.RearWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 2; + + + /* data.TimestampMS = packet.TimestampMs(); + data.AccelerationY = packet.AccelerationY(); + + data.SuspensionTravelMetersFrontLeft = packet.SuspensionTravelMetersFl(); + data.SuspensionTravelMetersFrontRight = packet.SuspensionTravelMetersFr(); + data.SuspensionTravelMetersRearLeft = packet.SuspensionTravelMetersRl(); + data.SuspensionTravelMetersRearRight = packet.SuspensionTravelMetersRr(); + data.CarOrdinal = packet.CarOrdinal(); + data.DrivetrainType = packet.DriveTrain(); + data.NumCylinders = packet.NumCylinders(); + + // dash + data.PositionX = packet.PositionX(); + data.PositionY = packet.PositionY(); + data.PositionZ = packet.PositionZ(); + data.Torque = packet.Torque(); + data.TireTempFl = packet.TireTempFl(); + data.TireTempFr = packet.TireTempFr(); + data.TireTempRl = packet.TireTempRl(); + data.TireTempRr = packet.TireTempRr(); + data.Boost = packet.Boost(); + data.Fuel = packet.Fuel(); + data.Distance = packet.Distance(); + data.BestLapTime = packet.BestLapTime(); + data.LastLapTime = packet.LastLapTime(); + data.CurrentLapTime = packet.CurrentLapTime(); + data.CurrentRaceTime = packet.CurrentRaceTime(); + data.Lap = packet.Lap(); + data.RacePosition = packet.RacePosition(); + data.Clutch = packet.Clutch(); + data.Handbrake = packet.Handbrake(); + data.Gear = packet.Gear(); + data.Steer = packet.Steer(); + data.NormalDrivingLine = packet.NormalDrivingLine(); + data.NormalAiBrakeDifference = packet.NormalAiBrakeDifference(); + data.VelocityX = packet.VelocityX(); + data.VelocityY = packet.VelocityY(); + data.VelocityZ = packet.VelocityZ(); + data.AngularVelocityX = packet.AngularVelocityX(); + data.AngularVelocityY = packet.AngularVelocityY(); + data.AngularVelocityZ = packet.AngularVelocityZ(); + data.Yaw = packet.Yaw(); + data.Pitch = packet.Pitch(); + data.Roll = packet.Roll(); + data.NormalizedSuspensionTravelFrontLeft = packet.NormSuspensionTravelFl(); + data.NormalizedSuspensionTravelFrontRight = packet.NormSuspensionTravelFr(); + data.NormalizedSuspensionTravelRearLeft = packet.NormSuspensionTravelRl(); + data.NormalizedSuspensionTravelRearRight = packet.NormSuspensionTravelRr(); + data.TireSlipRatioFrontLeft = packet.TireSlipRatioFl(); + data.TireSlipRatioFrontRight = packet.TireSlipRatioFr(); + data.TireSlipRatioRearLeft = packet.TireSlipRatioRl(); + data.TireSlipRatioRearRight = packet.TireSlipRatioRr(); + data.WheelRotationSpeedFrontLeft = packet.WheelRotationSpeedFl(); + data.WheelRotationSpeedFrontRight = packet.WheelRotationSpeedFr(); + data.WheelRotationSpeedRearLeft = packet.WheelRotationSpeedRl(); + data.WheelRotationSpeedRearRight = packet.WheelRotationSpeedRr(); + data.WheelOnRumbleStripFrontLeft = packet.WheelOnRumbleStripFl(); + data.WheelOnRumbleStripFrontRight = packet.WheelOnRumbleStripFr(); + data.WheelOnRumbleStripRearLeft = packet.WheelOnRumbleStripRl(); + data.WheelOnRumbleStripRearRight = packet.WheelOnRumbleStripRr(); + data.WheelInPuddleDepthFrontLeft = packet.WheelInPuddleFl(); + data.WheelInPuddleDepthFrontRight = packet.WheelInPuddleFr(); + data.WheelInPuddleDepthRearLeft = packet.WheelInPuddleRl(); + data.WheelInPuddleDepthRearRight = packet.WheelInPuddleRr(); + data.SurfaceRumbleFrontLeft = packet.SurfaceRumbleFl(); + data.SurfaceRumbleFrontRight = packet.SurfaceRumbleFr(); + data.SurfaceRumbleRearLeft = packet.SurfaceRumbleRl(); + data.SurfaceRumbleRearRight = packet.SurfaceRumbleRr(); + data.TireSlipAngleFrontLeft = packet.TireSlipAngleFl(); + data.TireSlipAngleFrontRight = packet.TireSlipAngleFr(); + data.TireSlipAngleRearLeft = packet.TireSlipAngleRl(); + data.TireSlipAngleRearRight = packet.TireSlipAngleRr(); + return data; + throw new NotImplementedException();*/ + } + } +} diff --git a/GameParsers/Parser.cs b/GameParsers/Parser.cs index b7cb0f4..8ccffb1 100644 --- a/GameParsers/Parser.cs +++ b/GameParsers/Parser.cs @@ -1,12 +1,243 @@ -using System; +using ForzaDSX.Config; +using ForzaDSX.Properties; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static ForzaDSX.ForzaDSXWorker; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ForzaDSX.GameParsers { - public interface Parser + public abstract class Parser { + // Packet p = new Packet(); + protected Instruction RightTrigger = new Instruction(InstructionType.TriggerUpdate); + protected Instruction LeftTrigger = new Instruction(InstructionType.TriggerUpdate); + protected Instruction LightBar = new Instruction(InstructionType.RGBUpdate); + protected int controllerIndex = 0; + protected DataPacket data; + protected ForzaDSX.Config.Config settings; + protected ForzaDSX.Config.Profile activeProfile; + + + protected int lastThrottleResistance = 1; + protected int lastThrottleFreq = 0; + protected int lastBrakeResistance = 200; + protected int lastBrakeFreq = 0; + + protected uint LastValidCarClass = 0; + protected int LastValidCarCPI = 0; + protected float MaxCPI = 255; + + protected float LastEngineRPM = 0; + // FH does not always correctly set IsRaceOn, so we must also check if the RPM info is the same for a certain ammount of time + protected uint LastRPMAccumulator = 0; + protected uint RPMAccumulatorTriggerRaceOff = 200; + + + protected Parser(ForzaDSX.Config.Config settings) { + this.settings = settings; + activeProfile = settings.ActiveProfile; + } + public virtual bool IsRaceOn() + { + return true; + } + + public virtual ReportableInstruction GetPreRaceInstructions() + { + ReportableInstruction p = new ReportableInstruction(); + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; + LightBar.parameters = new object[] { controllerIndex, 220, 120, 220}; + p.Instructions = new Instruction[] { LightBar, LeftTrigger, RightTrigger }; + + return p; + } + + public virtual ReportableInstruction GetInRaceLightbarInstruction() + { + ReportableInstruction reportableInstruction = new ReportableInstruction(); + //Update the light bar + //Currently registers intensity on the green channel based on engine RPM as a percantage of the maxium. Changes to red if RPM ratio > 80% (usually red line) + float engineRange = data.EngineMaxRpm - data.EngineIdleRpm; + float CurrentRPMRatio = (data.CurrentEngineRpm - data.EngineIdleRpm) / engineRange; + int GreenChannel = Math.Max((int)Math.Floor(CurrentRPMRatio * 255), 50); + int RedChannel = (int)Math.Floor(CurrentRPMRatio * 255); + if (CurrentRPMRatio >= activeProfile.RPMRedlineRatio) + { + // Remove Green + GreenChannel = 255 - GreenChannel; + } + + LightBar.parameters = new object[] { controllerIndex, RedChannel, GreenChannel, 0 }; + + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Full, $"Engine RPM: {data.CurrentEngineRpm}; Engine Max RPM: {data.EngineMaxRpm}; Engine Idle RPM: {data.EngineIdleRpm}")); + reportableInstruction.Instructions = new Instruction[] {LeftTrigger}; + + return reportableInstruction; + + } + public virtual ReportableInstruction GetInRaceLeftTriggerInstruction() + { + ReportableInstruction reportableInstruction = new ReportableInstruction(); + + int resistance = 0; + int filteredResistance = 0; + float avgAccel = 0; + int freq = 0; + int filteredFreq = 0; + //Update the left(Brake) trigger + BrakeSettings brakeSettings = activeProfile.brakeSettings; + // Define losing grip as tires slipping while braking a fair ammount + bool bLosingBrakeGrip = data.FourWheelCombinedTireSlip > brakeSettings.GripLossValue && data.Brake > 100; + + if (brakeSettings.TriggerMode == Config.TriggerMode.Off) + { + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; + } + // If losing grip, start to "vibrate" + else if (bLosingBrakeGrip && brakeSettings.TriggerMode == Config.TriggerMode.Vibration) + { + freq = (int)Math.Floor(Map(data.FourWheelCombinedTireSlip, brakeSettings.GripLossValue, 5, 0, brakeSettings.MaxVibration)); + resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MaxStiffness, brakeSettings.MinStiffness)); + filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); + filteredFreq = (int)EWMA(freq, lastBrakeFreq, brakeSettings.VibrationSmoothing); + + lastBrakeResistance = filteredResistance; + lastBrakeFreq = filteredFreq; + + if (filteredFreq <= brakeSettings.MinVibration) + { + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, 0 }; + } + else + { + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, + filteredFreq *brakeSettings.EffectIntensity, filteredResistance * brakeSettings.EffectIntensity, brakeSettings.VibrationStart, 0, 0, 0, 0 }; + } + //Set left trigger to the custom mode VibrateResitance with values of Frequency = freq, Stiffness = 104, startPostion = 76. + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}")); + + } + else + { + //By default, Increasingly resistant to force + resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MinResistance, brakeSettings.MaxResistance)); + filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); + lastBrakeResistance = filteredResistance; + + LeftTrigger.parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, filteredResistance * brakeSettings.EffectIntensity }; + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE_VIBRATION, "")); + + } + + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}\r\n Brake Resistance: {filteredResistance}\r\n Tire Slip: {data.FourWheelCombinedTireSlip} \r\n FLCPS: {data.frontLeftContactPatchV} \r\n speed: {data.Speed}")); + + reportableInstruction.Instructions = new Instruction[] { LeftTrigger }; + return reportableInstruction; + + } + public virtual ReportableInstruction GetInRaceRightTriggerInstruction() + { + + ReportableInstruction reportableInstruction = new ReportableInstruction(); + int resistance = 0; + int filteredResistance = 0; + float avgAccel = 0; + int freq = 0; + int filteredFreq = 0; + + //Set the updates for the right Trigger(Throttle) + ThrottleSettings throttleSettings = activeProfile.throttleSettings; + avgAccel = (float)Math.Sqrt((throttleSettings.TurnAccelerationScale * (data.AccelerationX * data.AccelerationX)) + (throttleSettings.ForwardAccelerationScale * (data.AccelerationZ * data.AccelerationZ))); + + // Define losing grip as front tires slipping or rear tires slipping while accelerating a fair ammount + bool bLosingAccelGrip = + data.FrontWheelsCombinedTireSlip > throttleSettings.GripLossValue + || (data.RearWheelsCombinedTireSlip > throttleSettings.GripLossValue && data.Accelerator > 200); + + if (throttleSettings.TriggerMode == Config.TriggerMode.Off) + { + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; + } + // If losing grip, start to "vibrate" + else if (bLosingAccelGrip && throttleSettings.TriggerMode == Config.TriggerMode.Vibration) + { + freq = (int)Math.Floor(Map(data.FourWheelCombinedTireSlip, throttleSettings.GripLossValue, 5, 0, throttleSettings.MaxVibration)); + resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinStiffness, throttleSettings.MaxStiffness)); + filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); + filteredFreq = (int)EWMA(freq, lastThrottleFreq, throttleSettings.VibrationSmoothing); + + lastThrottleResistance = filteredResistance; + lastThrottleFreq = filteredFreq; + + if (filteredFreq <= throttleSettings.MinVibration + || data.Accelerator <= throttleSettings.VibrationModeStart) + { + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; + + filteredFreq = 0; + filteredResistance = 0; + } + else + { + RightTrigger.parameters = new object[] { + controllerIndex, Trigger.Right, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, + filteredFreq * throttleSettings.EffectIntensity, filteredResistance * throttleSettings.EffectIntensity,throttleSettings.VibrationModeStart, 0, 0, 0, 0 }; + } + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}")); + + } + else + { + //It should probably always be uniformly stiff + resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinResistance, throttleSettings.MaxResistance)); + filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); + + lastThrottleResistance = filteredResistance; + RightTrigger.parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; + + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, "")); + + } + reportableInstruction.ForzaDSXReportStructs.Add(new ForzaDSXReportStruct(VerboseLevel.Limited, ForzaDSXReportStruct.ReportType.RACING, ForzaDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}\r\n Throttle Resistance: {filteredResistance}\r\n Accelerator: {data.Accelerator}")); + + + reportableInstruction.Instructions = new Instruction[] { RightTrigger }; + + return reportableInstruction; + } + + public float Map(float x, float in_min, float in_max, float out_min, float out_max) + { + if (x > in_max) + { + x = in_max; + } + else if (x < in_min) + { + x = in_min; + } + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + + static float EWMA(float input, float last, float alpha) + { + return (alpha * input) + (1 - alpha) * last; + } + static int EWMA(int input, int last, float alpha) + { + return (int)Math.Floor(EWMA((float)input, (float)last, alpha)); + } + + public abstract void ParsePacket(byte[] packet); + } } diff --git a/GameParsers/ReportableInstruction.cs b/GameParsers/ReportableInstruction.cs new file mode 100644 index 0000000..3efe2b8 --- /dev/null +++ b/GameParsers/ReportableInstruction.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.GameParsers +{ + public class ReportableInstruction + { + public Instruction[] Instructions { get; set; } + public List ForzaDSXReportStructs { get; set; } = new List(); + } +} diff --git a/Program.cs b/Program.cs index cdc0cba..5cd0d7d 100644 --- a/Program.cs +++ b/Program.cs @@ -136,6 +136,10 @@ public enum InstructionType public struct Instruction { + public Instruction(InstructionType type) + { + this.type = type; + } public InstructionType type; public object[] parameters; } diff --git a/UI.cs b/UI.cs index 4f39bf2..c35d777 100644 --- a/UI.cs +++ b/UI.cs @@ -35,6 +35,8 @@ public partial class UI : Form CancellationTokenSource forzaThreadCancellationToken; CancellationToken forzaThreadToken; + String clickedProfileName = null; + public UI() { InitializeComponent(); @@ -1207,7 +1209,7 @@ private void profilesListView_MouseDown(object sender, MouseEventArgs e) { if (HI.Item != null) { - profilesListView.FocusedItem = HI.Item; + clickedProfileName = HI.Item.Name; newToolStripMenuItem.Enabled = true; renameToolStripMenuItem.Enabled = true; disableToolStripMenuItem.Enabled = true; @@ -1284,7 +1286,7 @@ private void newToolStripMenuItem_Click(object sender, EventArgs e) private void renameToolStripMenuItem_Click(object sender, EventArgs e) { - String oldProfileName = profilesListView.FocusedItem.Name; + String oldProfileName = clickedProfileName; String newProfileName = NameForm.ShowDialog(oldProfileName, "Please enter the Profile Name"); if (newProfileName != "" && oldProfileName != newProfileName) { @@ -1300,7 +1302,7 @@ private void renameToolStripMenuItem_Click(object sender, EventArgs e) private void disableToolStripMenuItem_Click(object sender, EventArgs e) { - String profileName = profilesListView.FocusedItem.Name; + String profileName = clickedProfileName; if (currentSettings.Profiles.ContainsKey(profileName)) { Profile profile = currentSettings.Profiles[profileName]; @@ -1315,7 +1317,7 @@ private void disableToolStripMenuItem_Click(object sender, EventArgs e) private void deleteToolStripMenuItem_Click(object sender, EventArgs e) { - String profileName = profilesListView.FocusedItem.Name; + String profileName = clickedProfileName; if (currentSettings.Profiles.ContainsKey(profileName)) { currentSettings.Profiles.Remove(profileName); @@ -1332,7 +1334,7 @@ private void copyToolStripMenuItem_Click(object sender, EventArgs e) private void defaultToolStripMenuItem_Click(object sender, EventArgs e) { - String profileName = profilesListView.FocusedItem.Name; + String profileName = clickedProfileName; if (currentSettings.Profiles.ContainsKey(profileName)) { currentSettings.DefaultProfile = profileName; @@ -1343,7 +1345,7 @@ private void defaultToolStripMenuItem_Click(object sender, EventArgs e) private void setActiveToolStripMenuItem_Click(object sender, EventArgs e) { - String profileName = profilesListView.FocusedItem.Name; + String profileName = clickedProfileName; if (currentSettings.Profiles.ContainsKey(profileName)) { //currentSettings.ActiveProfile = currentSettings.Profiles[profileName]; From 0e8a8038ee37d192d25bd7a63813c9c3eb2ec685 Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Tue, 26 Dec 2023 20:19:11 -0500 Subject: [PATCH 7/8] Support for multiple Game Types. Support for DiRT 1/2. --- .vs/ForzaDSX/v17/.suo | Bin 87040 -> 85504 bytes AppCheckThread.cs | 20 +++++++--- Config/ConfigHandler.cs | 12 ++++++ ForzaDSXWorker.cs | 53 +++++++-------------------- GameParsers/DirtParser.cs | 59 ++++++++++++++++++++++++++++++ GameParsers/NullParser.cs | 30 +++++++++++++++ UI.Designer.cs | 56 +++++++++++++++++++++------- UI.cs | 75 ++++++++++++++++++++++++++++++++------ 8 files changed, 234 insertions(+), 71 deletions(-) create mode 100644 GameParsers/DirtParser.cs create mode 100644 GameParsers/NullParser.cs diff --git a/.vs/ForzaDSX/v17/.suo b/.vs/ForzaDSX/v17/.suo index 9b8d6f757c59d36353a2f6e6a5a43cd15cd20fd4..39f7cabc37963a3f10318ac3826b912e91e28e86 100644 GIT binary patch delta 7999 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 diff --git a/AppCheckThread.cs b/AppCheckThread.cs index fb00822..0d968c1 100644 --- a/AppCheckThread.cs +++ b/AppCheckThread.cs @@ -63,14 +63,18 @@ public void updateExecutables() { lock (this) { - foreach (var profile in settings.Profiles) + processProfilePairs.Clear(); + + foreach (var profile in settings.Profiles) { if (!profile.Value.IsEnabled) { continue; } - processProfilePairs.Clear(); profile.Value.executableNames.ForEach((name) => { - processProfilePairs.Add(name, profile.Key); - }); + if (!processProfilePairs.ContainsKey(name)) + { + processProfilePairs.Add(name, profile.Key); + } + }); } // settings = currentSettings; } @@ -78,13 +82,17 @@ public void updateExecutables() public void Run() { + processProfilePairs.Clear(); + foreach (var profile in settings.Profiles) { if (!profile.Value.IsEnabled) { continue; } - processProfilePairs.Clear(); profile.Value.executableNames.ForEach((name) => { - processProfilePairs.Add(name, profile.Key); + if (!processProfilePairs.ContainsKey(name)) + { + processProfilePairs.Add(name, profile.Key); + } }); } bRunning = true; diff --git a/Config/ConfigHandler.cs b/Config/ConfigHandler.cs index 8f8c29c..12eb83a 100644 --- a/Config/ConfigHandler.cs +++ b/Config/ConfigHandler.cs @@ -44,6 +44,18 @@ private static Config AddDefaultProfiles(Config config) profile.executableNames.AddRange(new string[] { "ForzaHorizon5", "ForzaHorizon4", "ForzaMotorsport7", "forza_gaming.desktop.x64_release_final", "forza_steamworks_release_final" }); config.Profiles.Add("Forza", profile); } + if (!config.Profiles.ContainsKey("Dirt")) + { + Profile profile = new Profile + { + Name = "Dirt", + gameUDPPort = 5300, + GameType = GameTypes.Dirt + }; + profile.throttleSettings.GripLossValue = 0.4f; + profile.executableNames.AddRange(new string[] { "drt"}); + config.Profiles.Add("Dirt", profile); + } return config; } diff --git a/ForzaDSXWorker.cs b/ForzaDSXWorker.cs index 8a70ee2..ca12355 100644 --- a/ForzaDSXWorker.cs +++ b/ForzaDSXWorker.cs @@ -315,7 +315,19 @@ public void Run() } return; } - parser = new ForzaParser(settings); + switch (settings.ActiveProfile.GameType) + { + case GameTypes.Forza: + parser = new ForzaParser(settings); + break; + case GameTypes.Dirt: + parser = new DirtParser(settings); + break; + default: + parser = new NullParser(settings); + break; + } + //parser = new ForzaParser(settings); //Connect to Forza ipEndPoint = new IPEndPoint(IPAddress.Loopback, settings.ActiveProfile.gameUDPPort); client = new UdpClient(settings.ActiveProfile.gameUDPPort); @@ -397,46 +409,7 @@ public void Stop() - DataPacket parseDirtData(byte[] packet) - { - DataPacket data = new DataPacket(); - //data.AccelerationX - - data.IsRaceOn = true; - data.Power = 1; - data.CurrentEngineRpm = PacketParse.GetSingle(packet, 148) * 10.0f; - data.Speed = PacketParse.GetSingle(packet, 28); - data.frontLeftContactPatchV = PacketParse.GetSingle(packet, 108); - data.TireCombinedSlipFrontLeft = calcTireSlip(PacketParse.GetSingle(packet, 108), data.Speed); - data.TireCombinedSlipFrontRight = calcTireSlip(PacketParse.GetSingle(packet, 112), data.Speed); - data.TireCombinedSlipRearLeft = calcTireSlip(PacketParse.GetSingle(packet, 100), data.Speed); - data.TireCombinedSlipRearRight = calcTireSlip(PacketParse.GetSingle(packet, 104), data.Speed); - - - data.CarClass = 0; - - data.CarPerformanceIndex = 0; - - data.AccelerationX = PacketParse.GetSingle(packet, 136); - data.AccelerationZ = PacketParse.GetSingle(packet, 140); - - data.Accelerator = (uint)(PacketParse.GetSingle(packet, 116)* 255.0f); - - data.Brake = (uint)(PacketParse.GetSingle(packet, 120) * 255.0f); - - data.EngineMaxRpm = PacketParse.GetSingle(packet, 252) * 10.0f; - data.EngineIdleRpm = 0; - return data; - } - static float calcTireSlip(float contactPatchSpeed, float vehicleSpeed) - { - if (Math.Abs(vehicleSpeed) < 0.1f) - { - return 0; - } - return 3.0f * (Math.Abs(Math.Abs(contactPatchSpeed) - vehicleSpeed) / vehicleSpeed); - } //Parses data from Forza into a DataPacket /* DataPacket ParseData(byte[] packet) { diff --git a/GameParsers/DirtParser.cs b/GameParsers/DirtParser.cs new file mode 100644 index 0000000..07e5892 --- /dev/null +++ b/GameParsers/DirtParser.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.GameParsers +{ + internal class DirtParser : Parser + { + public DirtParser(Config.Config settings) : base(settings) + { + } + + public override void ParsePacket(byte[] packet) + { + data = new DataPacket(); + //data.AccelerationX + + data.IsRaceOn = true; + data.Power = 1; + data.CurrentEngineRpm = PacketParse.GetSingle(packet, 148) * 10.0f; + data.Speed = PacketParse.GetSingle(packet, 28); + data.frontLeftContactPatchV = PacketParse.GetSingle(packet, 108); + data.TireCombinedSlipFrontLeft = calcTireSlip(PacketParse.GetSingle(packet, 108), data.Speed); + data.TireCombinedSlipFrontRight = calcTireSlip(PacketParse.GetSingle(packet, 112), data.Speed); + data.TireCombinedSlipRearLeft = calcTireSlip(PacketParse.GetSingle(packet, 100), data.Speed); + data.TireCombinedSlipRearRight = calcTireSlip(PacketParse.GetSingle(packet, 104), data.Speed); + + + data.CarClass = 0; + + data.CarPerformanceIndex = 0; + + data.AccelerationX = PacketParse.GetSingle(packet, 136); + + data.AccelerationZ = PacketParse.GetSingle(packet, 140); + + data.Accelerator = (uint)(PacketParse.GetSingle(packet, 116) * 255.0f); + + data.Brake = (uint)(PacketParse.GetSingle(packet, 120) * 255.0f); + + data.EngineMaxRpm = PacketParse.GetSingle(packet, 252) * 10.0f; + data.EngineIdleRpm = 0; + data.FourWheelCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight) + Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 4; + data.FrontWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight)) / 2; + data.RearWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 2; + } + static float calcTireSlip(float contactPatchSpeed, float vehicleSpeed) + { + if (Math.Abs(vehicleSpeed) < 0.1f) + { + return 0; + } + return 3.0f * (Math.Abs(Math.Abs(contactPatchSpeed) - vehicleSpeed) / vehicleSpeed); + } + + } +} diff --git a/GameParsers/NullParser.cs b/GameParsers/NullParser.cs new file mode 100644 index 0000000..b78c346 --- /dev/null +++ b/GameParsers/NullParser.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ForzaDSX.GameParsers +{ + internal class NullParser : Parser + { + public NullParser(Config.Config settings) : base(settings) + { + } + + public override void ParsePacket(byte[] packet) + { + data = new DataPacket(); + //data.AccelerationX + + data.IsRaceOn = true; + data.Power = 1; + data.CurrentEngineRpm = 0; + data.Speed = 0; + data.TireCombinedSlipFrontLeft = 0; + data.TireCombinedSlipFrontRight = 0; + data.TireCombinedSlipRearLeft = 0; + data.TireCombinedSlipRearRight = 0; + } + } +} diff --git a/UI.Designer.cs b/UI.Designer.cs index 8915353..742b6d6 100644 --- a/UI.Designer.cs +++ b/UI.Designer.cs @@ -55,6 +55,8 @@ private void InitializeComponent() AddExecutableButton = new System.Windows.Forms.Button(); EditExecutableButton = new System.Windows.Forms.Button(); RemoveExecutableButton = new System.Windows.Forms.Button(); + GameModeLabel = new System.Windows.Forms.Label(); + GameModeComboBox = new System.Windows.Forms.ComboBox(); brakeConfigTabPage = new System.Windows.Forms.TabPage(); brakeTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); brakeResistanceSmoothNumericUpDown = new System.Windows.Forms.NumericUpDown(); @@ -344,16 +346,19 @@ private void InitializeComponent() miscTableLayoutPanel.Controls.Add(rpmLabel, 0, 0); miscTableLayoutPanel.Controls.Add(rpmTrackBar, 1, 0); miscTableLayoutPanel.Controls.Add(rpmValueNumericUpDown, 2, 0); - miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 6); - miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 6); - miscTableLayoutPanel.Controls.Add(ExecutableListLabel, 0, 5); - miscTableLayoutPanel.Controls.Add(ExecutableListBox, 1, 5); - miscTableLayoutPanel.Controls.Add(flowLayoutPanel1, 2, 5); + miscTableLayoutPanel.Controls.Add(buttonApplyMisc, 1, 7); + miscTableLayoutPanel.Controls.Add(miscDefaultsButton, 2, 7); + miscTableLayoutPanel.Controls.Add(ExecutableListLabel, 0, 6); + miscTableLayoutPanel.Controls.Add(ExecutableListBox, 1, 6); + miscTableLayoutPanel.Controls.Add(flowLayoutPanel1, 2, 6); + miscTableLayoutPanel.Controls.Add(GameModeLabel, 0, 5); + miscTableLayoutPanel.Controls.Add(GameModeComboBox, 1, 5); miscTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; miscTableLayoutPanel.Location = new System.Drawing.Point(4, 5); miscTableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscTableLayoutPanel.Name = "miscTableLayoutPanel"; - miscTableLayoutPanel.RowCount = 7; + miscTableLayoutPanel.RowCount = 8; + miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); miscTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -371,10 +376,8 @@ private void InitializeComponent() forzaPortNumericUpDown.Location = new System.Drawing.Point(190, 84); forzaPortNumericUpDown.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); forzaPortNumericUpDown.Maximum = new decimal(new int[] { 65353, 0, 0, 0 }); - forzaPortNumericUpDown.MaximumSize = new System.Drawing.Size(143, 0); - forzaPortNumericUpDown.MinimumSize = new System.Drawing.Size(140, 0); forzaPortNumericUpDown.Name = "forzaPortNumericUpDown"; - forzaPortNumericUpDown.Size = new System.Drawing.Size(143, 31); + forzaPortNumericUpDown.Size = new System.Drawing.Size(593, 31); forzaPortNumericUpDown.TabIndex = 7; toolTip.SetToolTip(forzaPortNumericUpDown, "Port for Forza UDP server"); forzaPortNumericUpDown.ValueChanged += forzaPortNumericUpDown_ValueChanged; @@ -439,7 +442,7 @@ private void InitializeComponent() // buttonApplyMisc // buttonApplyMisc.Dock = System.Windows.Forms.DockStyle.Top; - buttonApplyMisc.Location = new System.Drawing.Point(190, 281); + buttonApplyMisc.Location = new System.Drawing.Point(190, 320); buttonApplyMisc.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); buttonApplyMisc.MaximumSize = new System.Drawing.Size(429, 50); buttonApplyMisc.MinimumSize = new System.Drawing.Size(286, 42); @@ -452,7 +455,7 @@ private void InitializeComponent() // // miscDefaultsButton // - miscDefaultsButton.Location = new System.Drawing.Point(791, 281); + miscDefaultsButton.Location = new System.Drawing.Point(791, 320); miscDefaultsButton.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); miscDefaultsButton.Name = "miscDefaultsButton"; miscDefaultsButton.Size = new System.Drawing.Size(107, 38); @@ -465,7 +468,7 @@ private void InitializeComponent() // ExecutableListLabel.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; ExecutableListLabel.AutoSize = true; - ExecutableListLabel.Location = new System.Drawing.Point(3, 185); + ExecutableListLabel.Location = new System.Drawing.Point(3, 224); ExecutableListLabel.Name = "ExecutableListLabel"; ExecutableListLabel.Size = new System.Drawing.Size(180, 25); ExecutableListLabel.TabIndex = 40; @@ -478,7 +481,7 @@ private void InitializeComponent() ExecutableListBox.Dock = System.Windows.Forms.DockStyle.Fill; ExecutableListBox.FormattingEnabled = true; ExecutableListBox.ItemHeight = 25; - ExecutableListBox.Location = new System.Drawing.Point(189, 123); + ExecutableListBox.Location = new System.Drawing.Point(189, 162); ExecutableListBox.Name = "ExecutableListBox"; ExecutableListBox.Size = new System.Drawing.Size(595, 150); ExecutableListBox.TabIndex = 41; @@ -491,7 +494,7 @@ private void InitializeComponent() flowLayoutPanel1.Controls.Add(RemoveExecutableButton); flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - flowLayoutPanel1.Location = new System.Drawing.Point(790, 123); + flowLayoutPanel1.Location = new System.Drawing.Point(790, 162); flowLayoutPanel1.Name = "flowLayoutPanel1"; flowLayoutPanel1.Size = new System.Drawing.Size(799, 150); flowLayoutPanel1.TabIndex = 42; @@ -526,6 +529,29 @@ private void InitializeComponent() RemoveExecutableButton.UseVisualStyleBackColor = true; RemoveExecutableButton.Click += RemoveExecutableButton_Click; // + // GameModeLabel + // + GameModeLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; + GameModeLabel.AutoSize = true; + GameModeLabel.Location = new System.Drawing.Point(84, 127); + GameModeLabel.Name = "GameModeLabel"; + GameModeLabel.Size = new System.Drawing.Size(99, 25); + GameModeLabel.TabIndex = 43; + GameModeLabel.Text = "UDP Mode"; + GameModeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + toolTip.SetToolTip(GameModeLabel, "The Parser and backend to use to conver the game UDP to the DSX Commands"); + // + // GameModeComboBox + // + GameModeComboBox.Anchor = System.Windows.Forms.AnchorStyles.Left; + GameModeComboBox.FormattingEnabled = true; + GameModeComboBox.Items.AddRange(new object[] { "(None)", "Forza", "Dirt" }); + GameModeComboBox.Location = new System.Drawing.Point(189, 123); + GameModeComboBox.Name = "GameModeComboBox"; + GameModeComboBox.Size = new System.Drawing.Size(182, 33); + GameModeComboBox.TabIndex = 44; + GameModeComboBox.SelectedIndexChanged += GameModeComboBox_SelectedIndexChanged; + // // brakeConfigTabPage // brakeConfigTabPage.Controls.Add(brakeTableLayoutPanel); @@ -2456,5 +2482,7 @@ private void InitializeComponent() private System.Windows.Forms.Button AddExecutableButton; private System.Windows.Forms.Button EditExecutableButton; private System.Windows.Forms.Button RemoveExecutableButton; + private System.Windows.Forms.Label GameModeLabel; + private System.Windows.Forms.ComboBox GameModeComboBox; } } \ No newline at end of file diff --git a/UI.cs b/UI.cs index c35d777..6ddfb8f 100644 --- a/UI.cs +++ b/UI.cs @@ -1,4 +1,5 @@ using ForzaDSX.Config; +using ForzaDSX.GameParsers; using ForzaDSX.Properties; using System; using System.ComponentModel; @@ -146,7 +147,8 @@ protected void AppCheckReporter(AppCheckReportStruct value) if (value.value) { SwitchActiveProfile(value.message); - } else + } + else { SwitchActiveProfile(null); } @@ -171,7 +173,7 @@ protected void AppCheckReporter(AppCheckReportStruct value) protected void SwitchActiveProfile(String profileName) { Profile profile = null; - + if (profileName == "") { // profileName = selectedProfile.Name; @@ -183,7 +185,7 @@ protected void SwitchActiveProfile(String profileName) if (profileName != null && currentSettings.Profiles.ContainsKey(profileName)) { profile = currentSettings.Profiles[profileName]; - + } currentSettings.ActiveProfile = profile; ConfigHandler.SaveConfig(); @@ -197,6 +199,7 @@ protected void SwitchActiveProfile(String profileName) protected void RestartAppCheckThread() { StopAppCheckThread(); + System.Threading.Thread.Sleep(1100); startAppCheckThread(); } @@ -410,8 +413,8 @@ void loadProfilesIntoList() void SwitchDisplayedProfile(String profileName = "") { - - if (profileName == null || profileName == "" ) + + if (profileName == null || profileName == "") { if (selectedProfile == null) { @@ -435,6 +438,7 @@ void SwitchDisplayedProfile(String profileName = "") this.rpmTrackBar.Value = DenormalizeValue(selectedProfile.RPMRedlineRatio); rpmValueNumericUpDown.Value = rpmTrackBar.Value; this.forzaPortNumericUpDown.Value = selectedProfile.gameUDPPort; + this.GameModeComboBox.SelectedIndex = (int)selectedProfile.GameType; // Brake Panel this.brakeTriggerModeComboBox.SelectedIndex = (int)brakeSettings.TriggerMode; @@ -1056,6 +1060,7 @@ private void buttonApplyMisc_Click(object sender, EventArgs e) if (forzaDSXWorker != null) { selectedProfile.executableNames = executables.ToList(); + forzaDSXWorker.SetSettings(CurrentSettings); ConfigHandler.SaveConfig(); appCheckWorker.updateExecutables(); @@ -1151,7 +1156,7 @@ private void toolStripAppCheckOnItem_Click(object sender, EventArgs e) private void toolStripAppCheckOffItem_Click(object sender, EventArgs e) { - disableAppCheck(); + disableAppCheck(); } @@ -1275,6 +1280,13 @@ private void newToolStripMenuItem_Click(object sender, EventArgs e) String newProfileName = NameForm.ShowDialog("", "Please enter the Profile Name"); if (newProfileName != "") { + if (currentSettings.Profiles.ContainsKey(newProfileName)) + { + string message = "You cannot have a duplicate Profile Name!"; + MessageBox.Show(message); + return; + + } Profile newProfile = new Profile(); newProfile.Name = newProfileName; currentSettings.Profiles.Add(newProfileName, newProfile); @@ -1290,6 +1302,13 @@ private void renameToolStripMenuItem_Click(object sender, EventArgs e) String newProfileName = NameForm.ShowDialog(oldProfileName, "Please enter the Profile Name"); if (newProfileName != "" && oldProfileName != newProfileName) { + if (currentSettings.Profiles.ContainsKey(newProfileName)) + { + string message = "You cannot have a duplicate Profile Name!"; + MessageBox.Show(message); + return; + + } Profile newProfile = currentSettings.Profiles[oldProfileName]; currentSettings.Profiles.Remove(oldProfileName); newProfile.Name = newProfileName; @@ -1360,6 +1379,14 @@ private void AddExecutableButton_Click(object sender, EventArgs e) String newExecutableName = NameForm.ShowDialog("", "Please enter the Executable Name"); ; if (newExecutableName != "") { + var prof = currentSettings.Profiles.Values.Where(x => x.executableNames.Contains(newExecutableName)); + if (prof.Count() > 0) + { + string message = "You cannot have a duplicate Executable Name! Executable already part of Profile " + prof.First().Name; + MessageBox.Show(message); + return; + + } executables.Add(newExecutableName); // ExecutableListBox.Items.Add(newExecutableName); @@ -1372,9 +1399,16 @@ private void EditExecutableButton_Click(object sender, EventArgs e) String newExecutableName = NameForm.ShowDialog(oldExecutableName, "Please enter the Executable Name"); ; if (newExecutableName != "") { + var prof = currentSettings.Profiles.Values.Where(x => x.executableNames.Contains(newExecutableName)); + if (prof.Count() > 0) + { + string message = "You cannot have a duplicate Executable Name! Executable already part of Profile " + prof.First().Name; + MessageBox.Show(message); + return; + } int index = selectedProfile.executableNames.IndexOf(oldExecutableName); executables[index] = newExecutableName; - // ExecutableListBox.SelectedIndex = -1; + // ExecutableListBox.SelectedIndex = -1; // ExecutableListBox.Items.Add(newExecutableName); } @@ -1383,8 +1417,8 @@ private void EditExecutableButton_Click(object sender, EventArgs e) private void RemoveExecutableButton_Click(object sender, EventArgs e) { String oldExecutableName = ExecutableListBox.SelectedItems[0].ToString(); - - executables.Remove(oldExecutableName); + + executables.Remove(oldExecutableName); } @@ -1397,15 +1431,34 @@ private void ExecutableListBox_SelectedIndexChanged(object sender, EventArgs e) RemoveExecutableButton.Enabled = true; return; - } else if (ExecutableListBox.SelectedItems.Count == 0) + } + else if (ExecutableListBox.SelectedItems.Count == 0) { EditExecutableButton.Enabled = false; RemoveExecutableButton.Enabled = false; - } else if (ExecutableListBox.SelectedItems.Count == 1) + } + else if (ExecutableListBox.SelectedItems.Count == 1) { EditExecutableButton.Enabled = true; RemoveExecutableButton.Enabled = true; } } + + private void GameModeComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + switch (GameModeComboBox.SelectedItem) + { + case "Forza": + selectedProfile.GameType = GameTypes.Forza; + break; + case "Dirt": + selectedProfile.GameType = GameTypes.Dirt; + break; + case "(None)": + selectedProfile.GameType = GameTypes.None; + break; + } + + } } } \ No newline at end of file From 6d776b2c2130b35cc27b5feeac2ce26df73ba628 Mon Sep 17 00:00:00 2001 From: Patrick Magauran <10986886+patmagauran@users.noreply.github.com> Date: Tue, 26 Dec 2023 20:38:04 -0500 Subject: [PATCH 8/8] Update Readme.md --- Readme.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Readme.md b/Readme.md index 002fcf7..94e0dff 100644 --- a/Readme.md +++ b/Readme.md @@ -1,15 +1,23 @@ 💛Thank you for using ForzaDSX💛 💛Currently there are no plans to make it compatible with upcoming mod support on dsx v3, unless someone makes a PR for it💛 -## Notes for allowing multiple different games beyond forza to work: -- Create multiple config files for each game type -- Detect running game and set that profile to active -- allow user to manually set active profile -- Display list of profiles, allow editing and copying of profiles -- Each profile has an associated expected packet format -- Each profile has associated executable name to look for to auto set active -- General app config that Maintains app wide settings(DSX IP/POrt, Whether to auto do app checks, etc) + +# Setting up DiRT Rally 1 / 2 for UDP Connection: +1. Go to `C:\Users\\Documents\My Games\DiRT Rally X.0\hardwaresettings`; +2. Open `hardware_settings_config` file with your favorite text editor; +3. Find for **udp** tag and configure as shown below: + ```xml + + ... + + ... + + ``` + - **enabled = true** + - **extradata = 3** + - **port = 5300** + 🔺🔺 Note for Forza 4 (THIS IS REQUIRED FOR IT TO WORK) 🔺🔺 1. Install [Window 8 AppContainer Loopback Utility](https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/enableloopbackutility.exe) 2. Start the utility (if it shows a message about orphan sid, you can safely ignore it)