From 071296bf924ac8126daf16f4fd4c4be9ecbd7dd5 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Sun, 19 Feb 2023 16:07:24 +0100 Subject: [PATCH 01/20] feat(RA): RA model based on a probe mesh implementation --- .github/CHANGELOG.md | 1 + .../FlyByWire_A320_NEO/panel/panel.cfg | 1 + .../CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS | Bin 0 -> 43832 bytes ...CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS.json | 1 + .../CH_TARMAC_WORKER_STICK_COMP.PNG.DDS | Bin 0 -> 43832 bytes .../CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json | 1 + .../CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS | Bin 0 -> 43832 bytes .../CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json | 1 + .../CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS | Bin 0 -> 87536 bytes ...CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json | 1 + .../GroundVehicles/Probe/model/model.CFG | 2 + .../GroundVehicles/Probe/model/ralt_probe.bin | Bin 0 -> 7668 bytes .../Probe/model/ralt_probe.gltf | 681 ++++++++++++++++++ .../GroundVehicles/Probe/model/ralt_probe.xml | 38 + .../SimObjects/GroundVehicles/Probe/sim.cfg | 13 + .../Triangle/model/triangleWithoutIndices.bin | Bin 0 -> 36 bytes .../model/triangleWithoutIndices.gltf | 54 ++ .../GroundVehicles/Triangle/sim.cfg | 12 + fbw-a32nx/src/wasm/radalt_a320/CMakeLists.txt | 22 + fbw-a32nx/src/wasm/radalt_a320/build.sh | 63 ++ fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 58 ++ .../src/wasm/radalt_a320/src/radaltControl.h | 548 ++++++++++++++ .../src/wasm/radalt_a320/src/radaltGauge.cpp | 21 + .../src/wasm/radalt_a320/src/radaltGauge.h | 118 +++ igniter.config.mjs | 6 + package.json | 3 +- 26 files changed, 1644 insertions(+), 1 deletion(-) create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS.json create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.bin create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf create mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg create mode 100644 fbw-a32nx/src/wasm/radalt_a320/CMakeLists.txt create mode 100644 fbw-a32nx/src/wasm/radalt_a320/build.sh create mode 100644 fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h create mode 100644 fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h create mode 100644 fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp create mode 100644 fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index f0ef408a1f6..ce34455b135 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -41,6 +41,7 @@ 1. [EWD] Updated EWD to use MSFS Avionics framework - @Eearslya (Eearslya#7831) 1. [HYD] Realistic randomized yellow accumulator starting state - @Crocket63 (crocket) 1. [HYD] RAT code refactor to allow for hyd or elec rat design - @Crocket63 (crocket) +1. [RA] Realistic RA model based on a probe mesh implementation - @Taz5150 (TazX [Z+2]#0405) ## 0.9.0 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg index 12bc5f9006f..9a0852de626 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg @@ -133,6 +133,7 @@ background_color = 0,0,0 htmlgauge00 = WasmInstrument/WasmInstrument.html?wasm_module=systems.wasm&wasm_gauge=systems,0,0,1,1 htmlgauge01 = WasmInstrument/WasmInstrument.html?wasm_module=fbw.wasm&wasm_gauge=fbw,0,0,1,1 htmlgauge02 = WasmInstrument/WasmInstrument.html?wasm_module=fadec.wasm&wasm_gauge=FadecGauge,0,0,1,1 +htmlgauge03 = WasmInstrument/WasmInstrument.html?wasm_module=radalt.wasm&wasm_gauge=RadAlt,0,0,1,1 [VCockpit18] size_mm = 0,0 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS new file mode 100644 index 0000000000000000000000000000000000000000..1a465be65b2cc39d72c0943af7d977eee695e6ec GIT binary patch literal 43832 zcmd444_H*!wKqJXY4{WB`}Mot-sZbr6{YeggjesS788S#dauwwudn4emHN)n7TH+gb1!6pue2nxqtSp$==CcmhTLS@taa|l|yRfGSir` z!&S@?AIx7BR!;yw3gfZ4rd(tqjhTpN+(D8KsU{=p>%Qb zQpN`uMkn>tCr*k)(OvfaJKY?|1Mm5Xhh6r-@U6a3I^wIVYraV1oFB<1}W8x*ni$;W(j*(k@rvPef~~gZELru(mttp2sM^=Oj@j z7if^$>8+LM@X~1gxf0cVVrTDFP4VnK;Xkl;xp2}T+6!>vLt-y0ar{qYUhuj)>3~+Tru&JJ?5j7(HCeq^#UoRaGU)4R4R~0h3SBKlA~^H{uiHfJZn`tYQ4wEi(L}4;a7tfPXX} z@->kCv)%`~=(}tVzl-p9UaCHuhx!F2MI|(D3%|a|Jy;l<`-3-M8l&-UIP&d#i9c3; z?Q6fLa?kzx9Q4R|w(e&?{n@ts*xVmiObRs4NlTZcdVxpwYp;c={z?9waT>={ua8}z zc8>l1@17_6+`oVH5w&;j+(-pI*X`J`Ll4}FFt8OE=Req%ny8#S#eogbtLL=-o)qX0mBuqc{L$^H_!*7+kq7SuUIW=*`}MDb zgx9ghfBHC$+m7x3gN^s&!H`J#cKZ?&jZ12(%|>)d)7|YnRoB}2^WouV=zFI4K~)^6Mx)jcbqi{N z_#gs>FU$Kjfeth|2ZV)-wM3!KpvhP=8K0+%rUaHGOH)YeeVHT?#so?bxr^ zZA1BAwYO`ieoKA*E}q(3-8DoweeEBU+|-`YXgstnzkbE3zEj(&-l>LD8lskXUPJo6 z=e6uLG(YsDF6}1y{-lA2egZ$e^e5=AmKEPlIdXy8eSY=o0QL9WEB|Py0NrrvT!_*W zf7-A^zsb7J&QJV|#^uvbL&JoBu_#8Ed^@9f2L!hy=b8Y^7scYOz|-YVPOb-^a4O;W zGNNv7OLQKP_=5Nb`0Kzxgnv&)m@7v)g+k<(netX{nX0@@Jj*J}2xw z*nP0q$c{=gC&8YQ?LdhV&UYndHRnMuel=xrETwh3x16PR8aw?@(|6=_s)W4!^{KIZ zh3AhKF0A8v_KN@4@Uvx{H6nUn{YfFG;Q3EpZD92D@tbVAQB$~eVj_xIlTaUoZ0 z7k|+67}C7>1WWTsAFjZ2(R-ZLYeze*p7(e?wKK`e#d@4SVC{IE$fx?DDD95YUhnaL zVf6-IZHU%?3FSOa`Te)j_R!DXc({;@<;Cy!>_xet^OINW3tbA{{>iIvQTv`t#|MZ; z&|aY$-{FmZ&pkb@$ZzjX>}dh@_`Jt|$@)3?Dx>@-#~)|!|K#}LY*lSMpYqZ`Hm9sr zNO%Vzudo9GLV(F}SO}0@dpv1o%J(Uyd43VcailLE2W9+mNeGZ0;Nw&5`I-ffh z_Mtz_pDc&n$cZuG^|p!Zjrfb=Iys9<_`~3vjXO(&F9_!aT(OIAS0rSl(Y$r+`1CPK zKNE1d2><7Yg$T+0+S66FCk@N<=ggTCchX=oSR)Z%zrkoo=+rT)IOg3?>8a4<;0aK# zD0UMi{v+zcfBH}l<_1e=B7GA1dO;LNL7i?vI|dqrUS#!QmlN$4eZ8-Pp6uV-eF60Y zLwx+W#cXhPPXsSmUN=;6g8Mw4dsM-o^gd_k=J(LLN6MG_A*X$!*Gc`&bc!OitFYVn zanRo3k_geMfIrX=>WM@mMC%^5i}c-Hq7M}PhCMR-`zhb5i-`0cPLabrK4uj88fMpN z+?sHdA0)Yk{r-7rd7cQMBIyNJ^TOrx7{aAwc!^dPDwH&@ENEN9egPtYi2`T$(WPg;>$# z9J5TUi^JbIzOVXR)g>BN2gZZOucx!4lg2GHHSr!BZ!9nvmB$}+#6GW@Pl_+=v$U2e z6jpA;a=t35p)QN?LO-Yb3>Vj7fnM2XiOp9i;*&=#z*`eobHeggwnCA1;DW_y*q^cL z#q$;q*5D~c=Pjo|jg_O8xLk#TM|)I`=lU3pPd;I=QMupFdC6#St5v^2yC_#%bizXU zY24x?ukYk}Yvb#N(@58r_8X|3n7c+S-`UG2dGh-#7ttQILwqdpmCVmFA35;g4Lr|W zp0k|rk4#4*@^>!-Uaqz)Dw5~OS)GJ`z%6_p?zFDE-E;7PK>8y9{lVq~QFQkoja|J3 ze}q>@LQG`}Xj+ZZPwBITXFj~G+ye(${^jRXe$AR4)kJp>Yh=4HMCs0+4)DXkii%UG zPWBsOb0Pn8NFEinHB1gfG1SlGD96dR?t+^n?4`gzsX z6~FnLzxkUH)fS$)5W}Pqds*n#bJ?uYf49d0*%hUts>5JK%gL z{BO>mXX`h1wR?v9k1_nQ{@bv+cEWB?0baZ(QbV{2$_}rL@8?qJ=cvCW>6UWfcWQ5R z{u+Nu{;3sW)#GdX4F3ZCKX)$szNlXJLLj7c$VvKfuR~<~4?Q20#-~>#IbP-LS@m#} zKJ{BU-+GABXKS81OZ1X(X_4Z{yy`UmbUyH3_uEy;e#McuvWvD%q23!iW0uT`d#tH3 zmHa$ZKJqH?2VQ5-PM__w)IDdxAIUZOL4f}Xz@JF`w(!8hj(OF#6@T+j2mfAiWFi~O zq|!d%Px_0Vzu-Tx@Uf=Y+~dcO|8|7%XZ7#S|M{bha}=*$T-Ug-wR6O>VN-H)Mn)7* zX&!<6MDdsA8E44J(ri3T2D|7(IrNivicDT*+_e(^a)0`<9!v3FDRIhS{&+yo0 zN$vjmnXB$TizmCZZv^;W%ubAx@PDDB6Zq>_Jow;)e?MaXNnz>QhQ%jP|E?_mbf4uX zg^Io!%o7_nHD@Iz^jY|9Xory#hMyG9iJLp;1ls@Y^kuZSp>X-#%O(AP6Ye+jgE#0D z8U7KUB>&xHXJ9^q{6ukM>$!@lUI$BKVvpkb8QKEeIquS1$wNfSjbrS;L+m12NPso$2jQWRDEJQMUM$HhzK?I@p@){#K#OyuVYa zFgJ`?mhMe7@=4IQI}77^e#BDNWIDq0RL_U;RvejI-CQf>=caYx`B)XFNV1Mt9&T#1 zO66#rNqB#Qq{`T_GLaJ{9xoCc08KiGSV zewE8ZKXreZ_HNZjpYuNXz5j)j#?#?wl5mII-$na2+CXu1d}ZpE$9pU0bun=9EyA1A zxHrCzbt1n16Ztu#f2I9+v;A;Odo%OT?d{GR^`d?YyBJtvc^!J_1sBZ&n}-XAXW<#O z2X0+&$vECbrE)iozhp0Xy|-=ergF2M&*mq&U75~){$CNd7neU9)Qd@(w*)c?(|dK-3=iEMCMnYNbDm z`H|GhqFd^HX`H3~2SFSXqxIcVyTuD6`-3a`v303whv>|yGcP_U2CiOZxMgOFv<`CD z@*0+o;YC^}1QzoeS|5nKhpi7pGcQoSQ0sBCa$Q~0eA({w#U3;n)Xvr?XniRxcDmxQ zZc|QwSVeXv)n~Z#5eXL$=?mn0r1iKMeV?F+@1*v_BbOtreY;nxH=BRt{K=5?-0ldm zem>BS^{mlQ>KwmoYy^Wh-*@kOyqpNxE6te_;kH zY^nXEM^cVmP9;9l{=8V)R|*K#5?>X+^BvL~qOgkj35u0Zk^P{0`eKH(PptWjopF1< z(6ISJ2tLW|)=oIAs6N!chH%enUf^mm%`=^~pRIWb-_z-GrvJip!mxSs<^l;H-VxQ$ z40loEhE%on7OSh?tWCKQp@GjKmie1ZH?wA(5Ag$o9= zf!9U6#3$2}6BB*Z4^iTuPIQ3!6OVb6`a$*v`F{kr0Nf$}BIoG`j=V48qj3!*qaX9T zu7T&*V|*1+zu)MP=pIKp!_TqjKToxKT7a*rCo976R#nB(JfZ7cvx@kI;|eRu&tQ6z z(~{m$bK#~@oGalz=&`IzA zl=ZXUh;5*%d8ScAK|xUw;nmIS0!GVu!9@RL2#8|X1pnNS*5x93iA+shk#V~n z&B4S?IAFL#gnLG3ae&7CnxKUr4&!WJevIKA@g%UcBXbp#yP>Kp#D89_U+6ue=$uRC z+M#IKd!o4BH19~b&ejJrX=jMNNAv`5@DH=+yQx23zu+c4cdl)DD^ams!4uVVDPqX~ z#fd!6^g~dgSoZQfl6y9ue3w(CaqZ%LBAx%>MbSfgbtss|GdsU4{ZKN}8tu?IqFRyb zrt=^9SI(Geo+!}%`_sfHiAp8c3jBrM^hCnHw6dylJ>JKAnR0r~WWQ+}FKO=rtr2x$dae^hwok>m7Q9X6_@-B^l&=+|)E+={H2wTJhT+{rG)ICn=pH2z=*JJoag9Bkg07C-e;{(LdQ{EfmPM+WiT<5fY-59B8n zbI2d;QimBIOpVZb4)t%6Z}Q{%_P!(aV^W;y55wD;)5Q2?GP<6N_A3NOHp_?oN%cj? z{HF8tU2UB@*3a5n%nw-i^X-i40W_r*c7AfbZJEi#hdH7uy%TzSy(!+UfgH~>ab1c@ z!ku>#&g)IXs~0>(^6Sn@zH1(E6vMu{QRvyZaj7vRzc3p$^(6OgO?ydi6s9%y(t4m0 z@<{cX1Jzlhz}=NztEY0k&Y~LPBjpFGi%~ge`wD{a^v8tb=Bi6BhJQdS5?|#-^$*EE z;{!)K_NV)eY4+1y^(KokExirv!g^C%LS_o_aZu+5{^tzje`Ip!RIqumDspCu#tX-V zq;;`8{$5U*`AEz7(yEUnV`I07n!^dM)fwWCt3e74@i9KWAj;j zdZL2#POUYCy{9R7d4zDr@rqt~y?+Zuhe^(1?_gbp{d%6akK+6n7t-@|9z>xRnI7mY z=6S+tXreo(1$2#|+CFOCYWg@mC1yR+swZ`9z85uumY!#|xdmD$ZZF-;EdxF~a&p9E zq%(>rJ!%Yc>SDrGyUJNiI2J7B`F_0rk3-UV1FwK{1;9^$pGns5lzxxqd(?y9N!AMi z(kqJ=Epm>*-?VKsvzPecTzr#*%5e(c(3o-F!HsaNou_$G6zfPI59@|^GkN(Uyra)C zUo*LPh8$glTV_|}B;kHdCu+`t3fR|_+hfn;oUGirzE1?gU35zN+7XN}d_D5MlY{1E z6ZFC);}0(YCOjd=5?{*m0;rtN-UItW!d>EvoE)c<_BS4E|Cxv6-|5Kdp?+LG^X_G- zed#^mgPD4Af6F1~#lf`2^K9j&#e4vAHqYc%!B0o|Y90R_jJw#ao1k$HR)s{8i zN|LXkPQg$1+>lcF42}1AbY3px+-l;V!^yA%$v%UDcJn-r>6-bO13DkuX9yGrG}PY4 zE1ZkU(es{E38WJ@4SO>o0nd& zSPVQEfW~QeFr=gL5hJxR(s=sw|R+l{V2AmbokF5YtOF?RGLl|ROw5cU zdA0D?G@|)wyq@rXiqkT@Id{h!lDuk|zd-mL97!)golSi%&R7o;UqS4{Odo{Bi0q%B zd?BFpvgZdDxyjEI4yL5hyp-^Ab2jCNLSg%u@w@@YPuJdc@C}1f`P4AUe^qd26;WGT ztAp?imKsMWt#SLx7(d)J@5*vQ6!IU{x1Fbq2D>>0`ps;J^qSfHVx2z5_Jw&-T92BY66KxJJ_y|Z%-(Zr zLa`)&Y9YY(`<0@I^#Jez-w@7glO}nRvm(yL^fsOQV&{H%z2rA?Yj6$_{(&bRD`xma z<@0uOOwWfF+vhmUFIEOlB zJga?7NA2m<0e7xtjQr8fNe7LFn$5f3XY-+$2{|?y=Ef%}-msiB)QDma;UDyrG5bFf zlJ*A(uUl}0oXTmLG8`a}OrE?R#uvB2`Ida}O^EEms!E4H+KyxgFq|cQb1S~H`hjvZ z&(EJ9)fd>uru5#yb4(u`6Fn>~iZL;iFNz9g7Z7E7PvE2Jpn~*0t^1cj-}64sO4Mw3 z>4*k-9p>vXV@-qDP4W~T9=@Yqru`zdpw)a4j`DNjuV6PnN$t`(QaS&ND3!nN3v`x) z7Kb{r>d`-!qg_#t@8FarwPeSv)K7JgzR+SL;m6iobAJBm+$9H1hJt5?OX&M^R%af1 z9rjzO`~G(>7~U|rJi!vee`igNj^tVNMs8YH-5!tI;sgGeoqwk^!~G_Hx>LE?`4YeQ z*m@)6S)Rl2^J@ma_tZJZjrI^vF+KT7H{sYIUzZ&v`*`75n>gwWS4(`RdpV$6_=EbzMr1lAX z|FBY1Oyl?MF8)QLXD-uv4E8eQpUI8So5|?@%m>HtTq6z-&&K2bbei-GrWre}Pt%0QgrGobdEx9qMgtvv0M*4s`1F)BOcU`W)MG+nXj0 z_d-s;dF{bS)J(_Ffvt zzF>)H<(Zxj9-mp4|DVR6-UmC=N$Y!iyWRekgOF#Xj`_3ipSnCnd>rrWbeO^495*DM z$9M7FA}H2BlilJt_@W)_Xrfs5v;8}=_h{YEhn2NNlYCr|?0>f|5>IqtvoJyOHqz&C zksVOXZI<-FEc|EB_bd(m5otYl2R@MaL?iq0XY++>rXJc60xIV3ITX-f{oi8RGF98e z{0SN931o*xIIfu1Cy7s&`~%GgbLZGpd&%G6a;Cj*8igOYpx`{lM<3L<8P37T=t;vK zLt0W2>ud@>VEIIOoZp^jis`0vz|ikH zzMbs7h9t}{kn@@(zN;1ar~MpTr$6TSHnRuKeAn|-UI$a$__{SkPJ`KnG!L=SC zIEwKMVVz0!dV}(M&Bt(nod^5>%h?B?SMG)%f5v{8&0pQrPlsba)^Rw;Ww-154Zkof zj)`S<-1O8`^jxXbKd_^d_!P?+W|vN4o~N`O`P2^Vezsnr^>Fl@51Y?#$ZMFLV(%x>a{JkH@Ev=v zSK^xx{62ENRA2HRz^{A@U(q^~(^ zE98Fkdb58S@IS|g)pS4calKf>__LryDSr>iKc_x?S1Z}C9It4>xv(u;N($xgm#8yj z#(q#F7^!)K{JG4J^18vZOUd*C?7#%(7x3FLKVbiKsAht2h{+VgL@$qA4iLUmb|>Tv zczdR2{B|U#mbr5ijKIn1=Qt`ao}H?VzWXGr4nJiB&HFg6*gq>q_g93svcwZB z=^GuhSCW%ET*SW$g@=0+`#^?c8Ak974CZSp$qC%X@PivGQU^ZTB5>X*{za1ehA zH6H04m@hIVxA#Sq=2cEK+8I^yNsMxl#U#(1S_wbUsPTZHZ6*1Nzbo_Wv>wp?uvpgu z3Nuo=7sM&IP&pjO2$NrL5jLC&|5eQ#_5rbOsGPz%f_`IhjhlRd zP#M{S-Hm$;$<%-42V3YpxVFmm8y{wVU<>3YzzKfB=}OB^IE&(ZvL|uuy@ri*)IW#vu+NQ#Rf0P}>$H+! zFhYDFOh1?-mFva40zSEe-AMYL+HZ8yS1M@I324brs=UR8UgP{IdbkE!hLSIT_FWtFCLxZ6}R&kwfg< z2dCbAf!=dnBhJjzG9S=BK|rNt^M61m@xi4X0bv|`^VY*+GsPX?E_rs-esV^Zz!Am0 zht$@W2TVg+jk^VWzy%ilKl8u`?a7^3x6U(Fi;<&j9m9)B$tKAU{1x&8N2cNLF&S#k zZO}0sd?I%q{?l~3L+HnPz*t+${N)jTu7mvN-F!Uu^)R084cJ#R8LGu|SRa}US%<1s zge!)dlW_HM?7T(D$B{mEW`;PzBWB`|OL|X4D%UN7){^}#uOsC&{EOg=5Iu)}042X} z)4A@zo0M;>+kM`GerEQnE});Wi}m1-H_%Qy$`Q5WJB)^1kzwgQU6T@>?3O5d@2z~d zp77;8@b_cgCyHvez7Js^2sm+}Q(bia=Y)N!dDJ>!Dk<@2k~}URiEtK_@3D8aOY?w+ z?cZ=}VI$!?E^0q!@~3`b0qJ8k){CS+p5?e7-7;@zqvy#3hnRiOb-Y(i^$j%vH}R7$ zdXGfVh(ZhUHx*0!$o{sh4w_H4?0g!03fx`d7NY8~1N)RMrl&>E1nH?`t9$>c9O;^L zMNPfw&F9wk)hay42UhS&BA40GvVzC`#Cv*D@_D0+vme=z&nq~t=}6-yGw2aeN`LpI zeB8GYxHhEqNYC$x&E*vuE|KcRa9l#q_&R>E67`X0^-}VwoZMbw2cE}hrS~kRe5suL z{04n|rhXdgr@xVs%cr?G?{Uyr7x&ekyL0(kE&8>AmHR1f{??&f8zKf!fA7c5Za!Yk zZS47RDz9*Gf4;DElgR5`*>67E1oNlk-d>#h;1zuKn|pBnqgGM)rWt+%9{yj*5&Qr& z-!?d;`+W+9ANTymjAjMzsz?6Fq)J74eG2P{8T>H5Shs1ZKKHDe?c1LTyLE(LNTbma z|Ln_OZ1?_+9i5)~YRsYD%Z_3Lr zx~eN?XRk8LjPgM<5JF4ZGJl%Ued2;F%dha`}YaSqK zd8PXWdtqw+u}^9O-okD92|jf((YG)8aj$kDyRk8@aXfqLiYkRdfhZeGR@EvLbWivJ z==Xh3;+`z%dj|)y!M+SP?C-MucFadumjTyMJLUt>2hyD6Pj_TEnEzi03m@KvaTdZu zA*SyIU0BxN@_vwn8_({8i-L5YL?;{y(0t*_%IYY`JYJ;ovU3`99hb0w485+owwdtV z@vcEfe7DrB-bnhRK@Pj;{ax54@A!@x0j8{tMTx5&l0@Rj6ouk3V={7tyBl zxF*6i#+;r;c)We-{2PQ*cUKVirt|WPm4S+F`KkGZp9XOcJvLY8XhQkaeCOYOI8F7< z=jw33Jteo>XHTK@UOou^O3k01K60D~&OI5KtrWNBp$GrzZ~0Bz@|6MKX?mWMmUeVo zeqR0$H|^X){P2(FpIo8#C(ezYqjnw$2?vND?*G>Dza#$f`+E?_Bqg`=#TQpoznW}M zsO`x2p03zI_%BIVy7!iQQkeJel$P<6Dap46`?iE<8Lv+xd*EEPmd)=qVl|V)(arxqq%RUWxMI@Zo#F?vgmV#a zrh3&ub%^M&Ul$;IfYt*O65d$@@bh#e#=uWGZaRFi`bs}={?y*)BtE)BcPym)CD$TXuM++`ozg?&+qGiJ%QU|GY*$8UTo<+U z3N)_!>^>#Yiov&@#`xxo!B49R$KKz5tC#XG?N9R)-o5+p?!HPyT9@qwo1ccr9Vr+Q}n{Q^qwLh%Lib8~YU&M*Y;g!k-x8TZ+g z#!u)BsK~w({K?UEwCW(80})04lspemIbGC$rwePY5x+P)UudTFn$4ctNO~Fanoj4$ z6pNeMsJvJ$s)=$vqIBN?{6_UQ={WW5eh}`7i5b}M8!-Lwi6?{stmkq6zkueYCTHM! zGN@W}_9OBOHoKBr$M7Ee^-J;8UQOZV8sa;1uLk#oa2_ycO=j|*yp`8>6+m7GvNf2n zY22KF~x1sLsu#X|Y_$A+{Nr@^ata$dw+2%Zy_Jo1mHggJ`OppO;ZRL*M=Sov>X7T}Gdu^1H0MVxqqNZuZ<_9%A*c995%T+-FadXz#DW z%?XbTWbbcsx+uO6Z;q($1MNK~sww`1K3-(?2J40q7il27qHIT);_M{x5yU~ky}A(3 zQ@Vi{+bQjerjvM&lk&|;{GI&nxX+EaP)tq{A4I7Oklf~Az9bT+GWmQCeI+KPEcfQNP{Hy`MYd5?!y$>pY@% zYZ^N**sOLH)BHUDt}NF$a90M69kg!n_4pG>UPsExuup^eUd_Evd;q->kn9D$Wd`?X z`-EplRx>+)FjO?$Np{{|i?@f`nLQqY?fAObw1%Xmjd3(C|M~cDCpN;{Ri7(aA*MjI(TJ$1Q+ z@J-ZmoYarvfQ&!ocXaqUy7!!<*TbF|&)&1wi#P}4h^JAaAsmz2GF(LUgJoqKkdOJT zhvp4?T}legH!RnNu=jHmhP;5v@X`C;jdWjbwCH=D-_Xj_>9{kTtFNIZXJt?SPxgxhK%>#6w z5ciP_wycF5t<L3&uSPtBRQLye8%=+e;+rJ!gKhL4LE|oF_3$1_Ylqw{UXUZR zM?-PQ?tjPIlZUuO4I{gU2=9ni$f0y=LVPU4y>!dw3Y5b-tb@j-7!KHe%#*mTK+xrti7kIYitu{r&&Q5pmxX_l`GjSqpuz(#%_JY+OG_ z|C8Rma-|FLO732rV&$7?{M8zba05r^)!W$HRPJfDhT-lG^k@bv>X(S3kXUEsSBnT- zRd>_Z+)t`;c7`th3&?_qQnuvF_M?j|4mlzV4`glV3Ta*mKOjQVc6c_=;bq ziejL0_Ip#nSMakiyTTuK#u488{%}t`(UX-$urCeMhh|C&yB zNBcl7Kby*SAJ_7EHueOPSo8KS&C?GO@fCFK(Dd~g#IdtDRcBQhQvTr;)B@Oa7hxFx* z`Cli{xK2l09LX)V&mDxn{h?4d(KOy{m*Rjn=x5_0rw4&Q=i(OhTL)K)!t%Lg$G-n$ zPW(s-@XxP(#w8B&<16?YSWbm4D-^icGML|zUB`(U@6P%qF+=E|kzbvOb-Vc}ze$nc zQuQCzR~7Xs;?`NcxuSo#)SlatEe5n#<@eG2zkk&s9pRq4QO3P_jf8uxk=7kky*}q` z{N%JWFPm|{0`VLLt-$hc()SWR@YB+K9Ufx*q6Hl86VKA|kv(C6KZ4;+3C(JGI` z4{7{4@Bx$mnRrHj+BvYoT|AWa=uvNlusrT$nblj^x8;NL-mt$d@%pk9^TCQz zFzBEj@z0t$_+g*;p<-_4i)QORk93@=tbO81il@O9Nd1=LXSKnOVz}=$!q1VCYfOuQ zJqY_ip}6(l?(A_xTEaQH9}oQ5dcUMlNpchrf=r%t(KwJ0V+r5ev@?ST>WPRmGLw$l zd;g{Bzu-RlsC7KAwr?%wgOs#AOXoHbzG7ITCOV`OvA#mQ-z0rn6fYL9MCOMoOf)i% zUaT8|!vezn(DJzcbw+Rg?)L-X@pS{KiAfEM<#PYK^qxm3J{rfZJLWB1x^IfB-eMw>ofZ_WPfvR?e~`v)fE5# z?Ee1^xu4CqUzWf6t$8a)N=sRsDlwqDOt_bL>`tO?WrU}BTy(ja+~a(ShSKgKL3;zo zH&-+y#pc#o2lItRt1!QNHl6j6VT$HDkQ7L}R@DaR)4w7z@f=VADF$uFp>rnK6n8)Q^jynyBp zSFy5WJ@8OHZAxVGaX|AK9Bzvf<`-&L2v)OsCx8owazANZNcaC~zw)xm`YG9&L!pV) z{owH77p-1eml}I`>73ea>`nQ7{YSUu;<{)N;cwPAz>fl&WY!Y}J0y`kRbq@c5?>7I zF2~R~ZXYg^;>-JdPT1+WhgPjx-hb4-y7J7~tFcT!XytYNOnfWGH>&HMx5H7kGyW3F zGbJ$dvql3;Y~MdZ7aGkw|acg*2V-`8eHbrt#MGtctA1b52#m{5=TU z3%^~zQ9U$OO7chd|F`0~p9?cTP>Yf)AUgv7K*=7sfr~Qw-p}YC!k_N{5>)nb3q3dvzeXndNB-k8CH^7ePb?q44E`&(6rDLk_$n6rggen~c%By2!4ET@ z{hQ4$*as~uJo>a!^U?1=GJk$TG@=5;PuOE_~%?zZQiM%4L< ze&+r^E+7)$_=Q94JUH(EGdoq#DBH@B&xv=nZN>XVd(LwDE}Zumj`|%V(RGb{UiCA2 zXB7Tn$iEb?Rup+QzIUQdu}i|!uQ|OMI4^KDo2?1YHSOKok2w4*-hcnv`-FdGm2Nk+ z1N{uYGUELQ-a_0%_PY^M`?9|P{%FeATW|cHgp4oY3U|gOIejNe)Nc!Pps6B#Xc9#b(fn|MmtC6BoVew*9yFfN;p~mWcy#o z*3E%yS{hGxM{@EQ{JM1ipX6hhzQr~tW-hfWh|)P@EWgwxu@JT_D#&L5=ky4NO_3I12z7Xp%OMid=!#v`EU%h&j?H5$4 zC412w_^6ZkMO3;4!YL3gk=6^7Gx6=^eY;!b8vH@^w3-|1i&^-y^{D&6B@eY*Gc368 z**=inyl~;yVTU}Q``y9sdeNWh>1(^Fznh>RnLfhAM)y6q$q4R!l$!)S?)d|^f)A7* z$arkgkOZt0A-D9Bhb)`*p57D{aJ?XIul2_HwRcb0n_y37Ml6zhdNUv-!-39-B zztQJJToI%*3O2L(W5k7f{b*0S>JXFjxLrDS|LDa7(*6Gs4tlWnV?8C|BE@&9!o^dD z-^~4gotx|u-2cZt?^yH2(ez&8yN-@5!~sGa0Phse1&tYF;<~#izhLv`61hG3`)1Qo zYbyJ_0+JJjAS#HO-Jw_-H(uzjr8Hkm6ltAzg313QS~ZXKg68IC_;<`F_U_%|t*B3p zOkcf9&xoIv;T2JYc_Z=ZC}0 zzaGdDa6Sb0I4sh>F5Ukpd^WlR>|DU%!`SC1f8A`qK-6C(gr)VTeE)yTPU-&t%>9u& ztxMfE)_KWz-+}}F9>P1mSLG-B#s1pF_5t+sig~+^=BvzBmzM1l@o9I|`|@}99|iuU zm1Q(PA`aGKMs*xdG{|vDL@~YbslZhyh8h^ILmFWm>$?pbMoz*%SAp=YiG%v`)aj|< zzt0};JEf@|@>k#K`RC=sZO`VFeF3G5mBYE>!Cw!2!8uG`F@CiED~Ehwy)?nb;U+(yJT8RuY5u(~$zG@5b&~J@j~RDyS{LE2 z3$*_7PW9z>WXj|??0Q#De?Em@2{_99Li{1UPkEiup+&{C-y9Ai3aG8cwAbdkNc)Al z!XhO-&x1lC8W2@iSb4X`DbWDRqg}NxiScoYi1{!tAK@a_=H+k8)yK@8o0q>KSJ4oQ zb)ZD)oQ{U;@R2_)UNKQa@`vAtf}Y3k(sZ}C_gnS3iFdDBWr1J!>e(}ur}D7xUhG!R z#*gvMjriwxl<(Q~?v&00|7bs2Z6{oZp0N&_jf0yGeSOv4;K$rEXU<-u{f#7jik|xW zU9G_US!;A*CE5KdYm;NW$&B-JqOuOS2DE`DMg{GlMBSs&^ea(%EJ`1oXR9;9UU|9> za)GrdFV(7l;^Uu^bqd(Xu!90ccq?n($(SE(@ z!(e+|ofUBkIqvy7e8&gB6%qHR&S>S$=+8Wppb=PmLLl&PGV+u3{N{P4I-^37#ND7~ zq<5MIYhK>#LL%*oU7GrQfj#iuQOKccreX zjK)>H<1qpIIx7Yoixy!W_-m}cm(V^>SiCxQ3vST&si;@DvqzHG?!Qj&zdauPy(Ay) zGk#?yAImp*3%6ol$eCk4de8R6xVq8yL7t^08fR1f+V&SMgNEF|S$0oB7l@H7pJ9y56K8F4g zMSG$h^&SMJ{@=&iH5Z>@)2YCHw?+xSS!}L~>tORhN4n%c_q#J=h%a=5W@ZPd)kC|+*G;6B z!LBl6-8ET#}_ zU%SqD&kuz|-?|I_zx>j7&*FSo%Zh!2UYz?F$j)ioZzn!|b&3bSVE-z@+goAxg>*sK zx zrgMWWxc{%Sl3l7yZdQ_=hvS4#k^S%LxD-S8#VSjFq-;UGlIrbcOwXrzP!Hef3MJ9{ zl~0<4-4EK(4SxpCiM0>GFP5?zVFS110beoTh~EZ1z~Ov3Q76yi6erH_+*~OC&Pj-`Yx&0VMWU|k=wQ{UrE$wGyYG4A`uX2%jPB>pk#YR1DAtK7z%i@S z&!y(JW*h6`x4%=JyiUw{=drq@_ic|mS$Zbn$=1~AYhkQcu>PF-w09e*N*6ju_={l` z^wHg`Cp|p;e&wcMovN1X_MO2rtiQ3oAKJW;()gLhX7URrICY2<+G0xJ!yPpK;o&p# zx=gaq?_{U_7v$6X1A^vIJ^I?b&KNi8xn^>T=8vle_}{&uzIIcke7EyzRVaGvRFw z3IU>`(9=XTkgm7V^8~(1Md`{N_H#@w)k7-6mF%*6n$~~gogC~dTA$e7rPC*eV;|3c1n2At z??%6iBm6Vl{7ULyd+(=j=YiJrDH14OsT)!J_g85?E>2K)AnqH-DVjT$MJb!773vN; z&&PpcoycfE&EH6qy-4M6PrvB7T<ZS4y#g<+? z4=WVEr?g$6_&c0fa>XhXPxszqSHmE9{@?hj?Q8pLw&ibK!KcU75zZZmJ5CgK0OUR; zcO;@)MdRvB*FR3dVO(7yNjiBA;bsXDxAw`ru*o8p&~8|`}g;3|DaM4 zgEaQu{0nNS!gp@AhXNnP*Y}*!f3b58Om2?NYkUt}rT!MU71NQ5xqv7%dhhs+OMz z#98?>90onBh&duMp^&b>HWAL&fbG^ayyyP@^Zgr`nFxF zw=YW5?YTyUQVg7i9n{AK5Z?~x*EnBnxlLhw5n=xae!gwBI&kf(gtsUX{@BlNqjAjC zo6CsOy%rkhy4n%89teKx?N14R{7jAH-;w=$pl`0rTY1_{=UDiAGvRnL<6IA&=cqfn zO<$r&bK$&CHLm5@>%bq%h{9ZV?4Bo)4wfAotnYq0JSw7Ielw{O!_OvUnD)75Kk!c(3B_q{yr-k0ygxFNg(?)Abh?+#wI@d}jlJeI;`t@?zN_B{f6?#!%`@#aCRv+O8+oLQ&p$g4_4pL; zw)^aLMz>%5cd`#Py3V`HO=U)eq06wro^va!A7$$TRd`hb_(2SW-d$!h8{2~q^!lRj zdz{b3dk!tS#`FNM*va%AulQ$M(@XR_b^mPp=0T$6xF@JksJLVss1+An52mgNBQS7k z{^Pkx4I{yA`EmJ8NhI$#a98wg+(qLnta|&&DDK6~zE0vBXr9$0z69mt=PKE}fVhF8 ztoPr-`p{pjR+4`PKlH?Vv0oUk5ygA9m!~d+TzbpOQ?YQxJ)_p_vzMIWhWv?acc{HL z5AE&fbuMT4mJ~_nz?lD-&Li}@RXyUkEg8n_yKSp_6v*x~u z=ihYU9vRBVB3+O8i+AH3In}S-P5Jl*s}4-iplfk1^f2PH&ds3wbL>6zybkH*NT0!b zmm$3vcK%kp=bNZ^p8A7!Ub24WAie*a)(eJj;eD(>=Q!?Jy#MZIoHs?i+6roS)R2gJ z&w}=$-d5cIEC2&vuFV1#gYCBMB>!dgOBVoyzp ziQRwi!u@i@8L|0s&(vfv*QNKI$Nf^BI4RwKzc$R`CF5GO6z>3fjoohr9Ywu>(#PWH zbPCrG)BV?2MG}j%%_)mnoO0c;pk?=4Kj;2C-JeZQ@UplYo(VgPW9abuGASO97 zUpuS|_Oko$kPGVPP|YNNj^6Lqedb<0>t6_Q_izvYwd*z;)$?_G+6i~yEE4X3dxl=H zyotDJ-mc^$Ezj+EAgB8)^!r`P%>^V+o~jb2?_E8Y9wD4QD0T-(&drct!du3j=O;ac z3*Gal{Gp!C!$i*x?;5&+Kk9WI>tbmHf|2v7Txv#YBGH=Rnqi{*-`@8&y$7#>ANTIn z?Z4_`@7t@_r$^WGdb$1$`uTi7;~?_wERKK*ag_)!+=qLR#%nSXjdO&JO2#J+hlB3L zha%l~j9W>#Ey{7`5FVZQqx;CiHP6&Yap=2mkIPN`!|qKxors@eG7R$Vh-ZL!Y|cn8 z@ndUGYY+7oVLF_|ufCu8CK=yev|l8=BA$?k?rR^Lm_W1-cF$S9UoFLL1iy|U-;Q~i zzEk0YUH&C0{chWqEtTwds+<6naMu8L!X*rc3(*<(uen>;_ z)d+%J`pytrm-h6$A^lGKp3yd17Z;UmoZ5!*f|{O7lq=@g{v&=z7WWXwv){h-b`0Hb z5d^n_s8X#|P(740vhp1FZ&c2O@|1SF{S%bl{K4jUDjz5hz%Hlys$-Pj+|isy`5ecw zc0r|fl}hOG@$5hU`A6*icinZDnf8TUL%I@*Q?b`o%+9A5;l*s7i3=*U@AV(WYWG$= z=Q_NZ%U+JnFDNM3O!k$s_?S=@yLUFdvve%18Zb)vMnVS zpZ|UezE}T}QXPkOG;ZyTKBIP<R_$z#vsBpUnOga3l`V*SNvdCzmOe_T|5+b!+HMcYmIO$>>gNYA6~#YSoEO#26^KU)-c;X8%!M*@BSAsj5BeIgH!`$Wi}(n$C}+v#?-(0CYw zL+gK^vhwWNr{1UUc58MCGTu_!?WXU}$U4l{fs-FRr6j(X^zG>AH?&sFojYd^>6<2J z4)i19fe1Bcqk1aTXIa)1+Yq~@&+zbbpi52|F6>k+R{YHg!<#!5ir9BwH%wGu9a#Fh zVSs2+AKC+5&`0HB6?dI5JiZC(v;CH3)ruIL^_R-+Il;;;#_z?^?@feQ{A#@4NqV(i zjIj8t-e;tEU)Wxi&U4?!Z$tZdI7VAczrzOpFQD%#-Emp=U(DDsl>Y)Y5NJGhVF8?i zeQ}?7W$=XID^JeB4>M9fa)MI4>&uft-wDK36mxQNPT+Sc|Q7Q@84 z-%Nh@;tBlz-MjC;`yTx+9`am`<9vd44b!9u9f3EQ9m#Zu-~J}!GBH|Hf*}P$fz(GQu2TCeQY=w8p^_Z z6-d9e?$ZupU}bYW@-OUMyS6r#%H!)5BbJtmH=a$aL%mIN5Z@PkP?*w;1+>5Z4#tPmmame>Yc`e2U&B3loPQizu#nEXq$T;=mRe32)c8TNQO1AD9^yk! zZ)k%0jX0ewE)|B)NAaP(q2I#JK{%AF!#ZYn!R{d1?F%6ul+j>5?Yp1l;{XAT2l<&~ zO6}V1^t%)Iz3A>7C&jff*BWcd9uw>u7Pm~C@KStylitp`Ne+x@oQmf88U-(G1-=W^ zE*4LFc#XE4?%Q%gIE&)IsSC~)k)K4YKG#Rz8PJ6g_X+vjl}Fh3D&1K`x$$D@oG$kH zUq|~rPDgmJ>7+r4K%5kJ`+7IUQ8O7PMk2z^xY2izp3D*H_ms?r$!@RoyBgizdT<-WS5}r?dKs7$?QQF}J(m z?_Y0n3StADhcP?j7342YyeO)O|M$c#)ssGOmz_X-ic#ai!(sT3*PG7YTZecAm={VC zaPDEuI3S8T8pk023QzM#K!iUDF9>tir+Vf{mRNCt}9Vruk`zaV4oSeqVLSioX>ub z$XYiDJq*2v^F~a5VAs>W3C=m-{2%x~n8fba>NKT@zfx}66SG+QzTwCs(t`)o#V&cD zjOmSl@I*4cZ+)?AMsH9)j)Aaw6!ATIlApuH=kFr9Qu@zq9J9WTIE+O_v_7bD_FiK+ zh-VvS$ur_z((hM^PL_}U()aaZ{$k$?{$MmZZrJ|3B~5tC&na$Jk2{<}@7Zs+_MIet z;@cTth4_$<@J({+{KWSP-XCK8iyw56^cVfEInEiLm-HN+JCNm^zH5C43|cxbGwb{^ zj{5}4Nq)F+GwGL(unzG~=9$`_wI6;RE0ZD|Fr@GA=|S8!3*wCVJXO)}mwt~N_{sez z>WuzgCBAFsJ4ucQ!W#FiahrKQis!ig&f?rU96`i82JZLIpU=j-K_SHp=M{+ig!p;I zixCHQt4UM`W8TDfsj9_&#Me6awcYaf{-u=UXN@~KneP3&R2gepNFE%S$=@`Y4I4KW zZXtc7h^aGEe@_2uZ#?lcwyhteanXuFv-JHpey9BA@wj;$?vzjMW5-Yn$mVrrzZXvBRBY1{?0q$Ek9@VoZa|c3zH#dJUyM>a~Z$)&gKg%#i^w6Ap47G zH2#Ad-v_+JfZ(HkV_kNF(W>vNrSJP>JB<$)eir+|mmxu0+y*n+qzpu=Y6hf-%Hlgc(=Cz60l#+4rY6HIW>6JXIf(e%FY_ zSjXf0M@~xX_s}GZhbQ{>OYzu4!P+~F11p!Anc2Cwp95&RAg+Pg`9q(=D_a=IoQ1G|EuhZqnf<3{3l|KFpjgHrQOqASISBa;ZU~jvNPh^ z6h`cUJw0n3o^h-pj;`9^*m0?!Q4m9MwGh^^)x&XY#zKM!e28cT8Kn>^TC{Gf(@q+# z#;}4CVFas_27%<;-+f<#Ry(_A^Upo+eJ|hl?tS;&ci+AD-M9Q{lK040kWKhE|3eJ? zg}4WC~e<89Bysp7)(g5>)O_1$x{E(R;K+bREeby-{-$%*{R2sPJ(Dss%*aWAQM z2JXiO{c+pRIl{lJzO;t;HTG_Bgz&eQ`2#dw!QjYCd_3i$F>3G7Xk}_AM32GB3HgXb z)L}emJd=?JlISM2zc7*PB+i?ooWA);^ugZ~{OF1MZZm+lQ$L8fncm98AsOd@;5Tob z_c_J)c4(7$zD}g;1RwNP&J4&ii4Kbc&Lv^I75X_pQ~1Y>JiR@YBfC~3p18Mi!tD9* z9#h_zqSwg}zkGAP=M#IpEha|muKDPdEJ=!BYnm1U3T$Ch$zp=9gy7mHdM@Dk^Bk@Y zwF|dj9jea=)rZUPgzDEey}{pSY^q&G@2PK^K;@*7HoFz+?IZkc$cM&E0*!AJ(>n@xb;7le@&Zk4YeAlv%&cFU4Kn$g zg#NKudfxM36#0GB=~{=!KyVNnCTi!~auj)>kVi}`G*P>2ayRTEs&w@aU)W9Uek}*= zlqcvzhb*3honp4mfc@y97w1co^mzgN!qDTx<4EHN@#R?!ybR3zHqCqOMbAcpP;310 zcy0*%YCXk)I7QY;^LjV;uSeQir9I>K2h+I6Oqei*?%_#zzJ8*@UrsHpvs0v$20CvI z^PZ#2s7m#0`f4NXmo>!^ezK2fB#kJ+ZqYw@n&-9A#MQ!I**Dj2vAas~9N`Lu)b7;o z-2n+OPSeiwqDb|hb3eCWk1HQorb=%s+m8G=eRFGT)v&*)(k-8MaC@!W?Ww2zsoP}c z_EWn>JrKg5=eMeW94EP!5BW}fJ%))-`0l8tye80NPFG=F?6M_mTkDi{Ks_E$Itz3X zT{Ft5T~c**8_B`_=j(7jVwUY^^>HQi-u`+ezFDHY+DH4+U`}32{b_00*Ftc|JG*v} zU1|OLJL{=@rQk{d!4E!YKSA)#b#E3By$-bLMJoSsxEpbb@b4AqMK#JX&I6ndpQThc zQ@P;!U+%;E=4!QHAYT>iY97s})ZQ<7g9PQ|vKus?y@^au{I6T_2tS14fED@g39JTQ zF-&hF{QiLb9LbA+$tb)UqTl#A9ePiSPZWu6*`QyTzZ80D?33_4e~{>mc!>@{m{>>q zW!-YZ=Sln@j7&j4VHX_tqf)!|eF2>j_~=Cz(|go19p?M!nq%rH9MgclYC#&yQ6b?& zZvV?CJX4%XJcND3?W6fo9)BT^_#(%ZGBw;k!gG}JSUslCh4JV0ZciccMa%((UL+Tl z_DX!Z>_^->=z_d=%6lHs7wJ88e-ZHk*ucW)8!AADETThX9r94HC6@`mG9)x5*k9ig zAm~Bj;jo=)&9O}2>6q4w_|n;{t_3oV8K-+e03+JLUCAtaU=IfDsm)D4o#Zkj9yKel zDep5Q=unPx;klq&(9uxM<;rm5SNHl<|dP%gbTB9xsRM|1bEx z@x}0`E?v&;O6EY$0F685DdHpPoQ&EYd5n*<7I_e|)_pl9Q(Uc1)Qe%d{5jb98w*xV zvkX2-_g}vE3(gPaPCY@drv>XYO zsPpIZ^QI=x)~!7qmh_sgfBgpb)ECFFznQ}6Lw=|K-H#Z0-r9*clZ&&p6{Q~{Id`S9 zZam=ef}%6e!12|&`Ta|tE>D2y=E44-@Yjm|zaV;MGlOyt;}JfYwcq&cpRgY$yy1rD zax4~5jdN87u{14hr?tk{WhwHFC)i}JoXh*u^(@i@Q#&X4b|A$qfH*q<`9aO@E0&Q$5b z3LRgka-406G#_-^mTl-cYMF!i>*##fqLBkKpT8OKSB3F>9ERtC3U~%w?roho2du5R z_`tZbZ*I2hiihg24-ev8^iEq!Olpw$nfac1x(59b3pexi>CfhId1T&($Nh0ge4gTN zt|q>BdJ>b!9#GyeAM<6WZSL{kc9VY0JhF=H%m};kLjI-Wnnvg|h^LDZ;4efz(;R0V ztykOD-H?pA&~LD=Mb_14U0O9wi*+93IUYYbzCMQOK;v7kZ*GpPi=HQ6)t=A5`f+be zhFstPsS929Q zh`l&xvT~|N?!1(+jOlLpus&))kBHUBGE+_ZL@(mY(mlIzKgUVq^x>e);}3d1pEe@_ z@0%gIa_GIPxYGDTRR=4br#poBy0cb6{SxSlxF^*t@FU`TRL=t;BcTk$D*-YsBChZuTMccm(%1X z{q{KiPkP~2pVLX>e`HR(pP(-1s~l=?2q^KH1$U~QVLEX8LqjdML&e@3QTE^Ue%$v1 zyKDQXvcHBsj`r0KP4Yax|4!UGM*HseN8(p#|E(RW$Nt-fd!6CmKyd+Wk-ll!R+av`S+(Sg>v zs|nRQf&(4M(@pY7?~32~9{2Mtq5qp?!yTgU{A#CY#CMl`^taCtWWkS)5Wnh^q8(J$ z^?SMh-8mE|m7-iIA3>b7H?6S$hLnl2J~6tC-XjjGc)6n8JFMu#*l$4&h+h|iuXozI zyMJ@E>uq%$)Pb=n_#ckNndtum_aAKOv%>E-DL(!z{A6$+3xMeggx^>Yif$?OCAX~b zCkwICq=T~oE%v7lzOk4IakXc8y%2GR-cv;TkKW24@{#iI>%;~+H->z*GghBer7zJf zwRHVE?IZNVJKp1dzND(Xla14+CCAWs58wiE@~^)8qf79!)#Sc)=_L2JojEfEcq{*J z{`n_@-MV(=v4mrQZ>;?50SWbedGJTVPX|8)935Q#G1)@vK(jdX_aujZ%>J;E;07k{ z1AX>KfPa+r+3jC|^c=P(Ref2F4Onjo@CfVv45H0S3`1J^Cj)4pub&|d0uA77Z33X6SsWXV}~DO zNjC0N#r+3C*6!so%@4XF8(HI?t9}010jdTl#&02g!#&>%w z`!za#--oeZL@VUzKNQ>HAmG3b*|m?X9U4Cv*z?MY4OlYexmbKj*E*%Kqnj*0&w#S96RL z`}&=>o5r5vc=)lhkw}*0!H7MgnBE(_d-pqb`$z4K)K9p%`MvD1>cfg1Pmmm>KRMmb z{vG(fC~qhvJ4s2_8=vy^F()sF^QG%RGub5@s#Bs5fiHAlUA`M{gC7CEKHxFXKTtsT z!uaJp?$>j?)Ywk+m51*QEA~MLmp6AB9f+TU|8LXRd11RDeb4JNll%V;`1pSu=TkeG}p)H3r=un{K5^f-{`oJrEDP{2L0nJYr%3zgMQ&uzV@!2eZF| z_G1@re1m+?IOlocb@-dTX*j08!U(ybX?3~@3jO**k~fwkOiywqdbCg^xgoT=xSc4X zxRAG7eBC^m^nYebRT2F=pa6&U7vi^>eX@!AGwj=;k!b#FY22y`Gf%I&~ zHm{`p1@qmUPxGFM*&7LO=;7LMzo-m-+0Watz#Zj(`fQw2LR`cK=#7w5rt6hm^xg89 zX7z_SUx>K$us#%qU65cAkU!rzs9Ed{VB|U zeD|V%eE!pX_4yKx)Ax0{@PB=yBx-+=tMP z{GeTguTI~+22eym5b2Fr#!D1f9{1fcI3OJX8-V_=Gep!8WClUv5Q@q7LZ?#i(FxL` z!?SFRMaloz06mTgx=h$xZ+~#Ro#=3V(N^RsS5F`Anda!?@gcfmFXBeP58diLD$Rv^ zTm8IURZ`14kYiD}f8%Uzl{L;y`mNn60N#X!KNfHSl}(7ZsDs|*r{{pY{;YM8p0Q8t zH?75tnXC7z(oN8ti0(nz!ShnXA62MEc^7lJ2p$f23hDW#>)W;wJhiT-jpR%j@~%@{ z55|%6QHt}9kKTuPtqBMBCII68v=FQg!83^0VWxiMf514noyC!L>ctzp@F!M+{}7*L zv)+7nV)RtRC3WTfvQ|)aSmU<`8if*@^{E0q{Ei=6SM4qRySP~TzyH(?13_Gu<5c9o zxn-8E)4B-#q4f-W|1GUEQoZcpay~f3*OB@WyM_GrGhga{Uzs=NS8084`kFD1>{hVl z3X;43)m;R?FV+cp-~yE$j$|%}h1TF0*=fIysuYM0;sN(hx&KPFXgG4eW!1`}qN38W zb1w?GN4li!JnRx4v83!appX40;@P4Q_fGRsC$is?f8dT&|Lr82Ke)GsX-a%3(Y&%2fE*7pnc;5rY1VTovxvIR+#^~3Up29 za=z4?_S(;1+Y;vEzPDBBuV$=&?WwwIs~``7fBvJ2`gyZ<2ZuYWaGp!^f)I5uJ~MFl zUUwhe)bD70X>3gFA-T9G$-k|)a;;?r{K`|_TAPM`1T5QCSy&cW2K9r< z!a@!mg3S&2a|aZ z9C(3&ioijtMrtBZ?6k1Dkj=axn+ey@$U}@(*N_?0!pLcL z+e%e+*ZuaXE?I8dm@t{leXrNj`n1pg*?XVAeSYdQpZSV%8)NM3_lFrF7?;bzRdD&X@5s z9p+qspXqStFYvSAzYjkOSB;Lr4&c8FMMPw#$3zp@Ap*8HedH{eS5nytM4BC^;V|Mirw2rt^``U zQ*5wf!P1CZ=zCoe|D_<9UgLTQ^JGHqz|l{Z~pn@XCIP z#rAy?yH~E2xaM0oNSr=gijVv$z4`c)_e=V~B=U!QdwZM2?ys$sxMsZ{|4qu@788TN z9_*uVsgY&Ue_N10l^^a0g7~HUr|0wEE&T_7?U(=Yk=ptAI^x|AKA5&O9SRwF3+UUU>S9_P}Folwoi<;%d2j;y+LMa)0zTr0Qz@HtB&aIy*a2pP=1C?$&ma-^`%5k#Js66@N5#X?H3G`bciF7^%+^g+;_I7ed zI*Wi4Rn?0ZlRu?H^kr9k-~&V}AAf+-nb411cOB81pU${ueoCejy5n|ACmE`!tfX+^ z8b6&Smt8{XjMrU#!3Bg*-s`7hb(YdGIhALkXI!Q;fnrcP<5iV1o$+(dI=dS5aNT7W zQ#vTe1+rc`5+Yi&I#Dm}Db$Bsj&OuM=_y zJ$^?u;pXbvWhDRVdw%L{0N{`-SE@ZsFoJ>l})j>6=v3h*K$9#=3?pYip-)`1tr8cMOPG zKDubpqDmd|uB@&(n?n!IKI@W;bz2+0_=>BqM*hhQ&VT>Cz~OuEJwkF%9zk)5<{bJ1 z{*I6D+)3doe7PqpE32!Ct~vXxvk2dJ@x>QYI1D!=x8ws4+|pQ3JvW(teZ1ZuBaH{ z{#V+d2O>8;ac7ps}d3vdV;< zt830(qT77*Czo7Sr`dY)imN}aXyD5Q=RZj}{^E;AG=xtgnnb}(!ii6PYMj!Wc=q<& zD~PX)7F7_PtgfjE6P|U+WlIRJxZ<)p;PCn9e_Ww(_ul)YLhhZNrSybMFNyRh-M!B~ zdq;@mQA%$Z#gyruefGIBU8G0pLZ7a#^V9nXr8jZibuWH|(iNRYbV8^nr3dXC*Yqq; zqIl@nO{7QV)P~Qh@zcHd5}EGs1y>{8tms8^v=Hw{2p`hX{$p!2jO#qtSlif0{k+vR zH^=f??xr_y_%zA8x_aa=xkLUVMBnrG-@DTU{^mEcuM@uUcmHx!puf0R*K~&VKUiDH zQ~$532IMd7)>dEs7JkS#Yeyqdl;ig%|G|PP$AfTsfs*A%$l?t}S7AsN^1?Os_0mil6KxS?%E(diO1vl z{tIZC?rG9DvzE-q%Chy84``XLhWeDJE6aUQtkr6tq;h8DQUmhO#9|qeYh@MM3*@+c zZvO$67rE7|SHDi~X#SO?A0x}Ie4PB3U2;|p$^H79Zj$ZaeP;Uu0`mmrgQGn<+JC+< zy;Fhw8H@Cj{IA0g`DGz~PH0Ef_ulW9>kZNyO#AXb*Oz}*;~L2^Qy2(IobC&SG|;I{ zA;xA!)~Ki)1iz*|L)X}>nemdkW@fF-biB78^M`C}*J@K_dB!lXPC>j(38#B}+Ah&f z3B3}gjJi^IKmSC@JqT|bzWZ_7Pp>%d?w1$k^2g>%QGXj)s+g$ zKbA1Uetr5bA{>(5#{Ey(|#O*?m*z@0mvUZiv2jw`Dxgw3-BLsKXmrbRs(Xb%cR=`~++8Ko=bZ({vsS-s3czdfGm zTuJiWw!CqKlSv=0z4nG1DBQKrKYzClyyg1qzlC{3?!Z(& zkMTZdBa*A zEJ*&>Q)`NV%@4J=54vIuI_G@7dcCaE|TwgTbi3m?lf;CJ=nbYuuAgZoL5znx0)VF z5E8$D==T}T`y_H-{+I_d;vcPdvirANCSiLdJ@TIQ0P(k^BkL)hhp)o?*;Z_HFPx*E zBb614sNQ+cYtqr*uk6U^8uUNq6^?2M?~q;sQ&3PsV`$9az)ZEA+&AVnXeDICsH!JG401UlF2a&SHzDn<2WcS#rGr@OX(Ip z-#9U3c|7M z?s!pG&@V(R^!$+f%f|{a!bm!Qjp>S9b)R)e0Txhil5506y8*6LJ&$NLpOEf=F`^MH z%pq^ji(RN=-tT$S;~bVac6n{14)o5upX`fvq)XE+=!2?8x){p6E*ga%qJKW-+xb*= z-8bg>7u2sD5kC6c!-EQNLw=-&%k3A>*W+filC^4XYouv0(} zT2{2R&8Ls}UeV`&9E_!M%#`E;u}Qf>tWvIloKqy1pgaga3I(Egm>@{~kaAk!e_X$Y zr2kkc{XotT+X?!T3glY~2lJDkOh6nNAGCTAb+Djlon_o?LB%3{BjR&zq|%=cbhlg-lszk1njvaPZWdXU24Z9 z-&7Tce2w1i55X1gyZ(^_jfRRU4dMQD^pQtQ(4WVT zQV`IG{(jBnSyjz2Au*x}$NG)u<@?zz!+51K?nuOVLgCV3KU@RZE9{XfSQwD*-RRL2 zS9j1q2`bNrKm6z&2w7`=o;|C;C{epfUY2E|+ch^p#vpO`>D1i9y%!iEJ*KU^QS;NE?t4m5W! z{N&p<<-4NzXxK!&e1i1~=tV8k*9wZ;1yl;ct=<|%I(j&Q1xOF8=m(nRuFM3k?et81-Tg%E9xCi+}O8%?L@HHOP1M3*nuSU1I-82dL zfgj-!Rpsda^-v;hy1M(7wwAOGc?9h~JLiJC<^1(&lDlDSe~821bG)q*J+D|EUWb39 zwJRo=-rR;)!w$(kY=OQ9Ee9bGWP+4>vT{iqd@l zIC47)1*P`FJUdF*?@eMp2f8ne_5%#DX^D)*N~lu5zTGI=!H?;zu!L4|k(+@wtSjT)z;%R5gbA9CK+I zLFlRKAqGTr#?amw3nkHtooLF7ki3`GgfJfKjy31D5FbjJ2ciXv&(2xcKg)DJ z&fyNZbm)*%Rhq^LgftR^Cgi%~9>dXr?8zb7?zKMcEfadMVT<}z@}Exp>jCm#cWeHT z4*AET?T|CcdttxBTyAnrK{@aCHrEK`wYv?yq*L0Vj8&@KUrgjx zIlgArZP-Bm#)fs6m0+JyEl77G7V~kHA1LYZH1dTMVc%#B`SRJSWsgM6EY{o#Eiu4nC4YK$MlH;;MDS0NDlZB zKT}{Rp#ePZ&fI7(tplJZ2zT7wbXpIE5YKY{M?=3sSbu1>wEHj?hF*X+Rv#q&z&JDC zKaji8W3-ceno{1ICi3es1~LA?B^0VPA!pCdMs?t@bytMwl^fL8r2p${S~P^8%XGJM zV6m7cd&3Fy0FHE1P&D#CZ~5|+f_1?Pn)ibbM~=Y$9L%3UqraeW)VD)}E?}Zf;V{iV zKF<&Q1N7si=Hr#zm06x`ZXSXBt!(I?%}FuKX1k_u`VP^3p{gbhdh;bZ_M6%4MCO~5 z9QxAQx%!ZR9^kyiK#-n^^x^}9&3aas<V z?Z2FVr>B|A6m}Ky7wksK>A@7?GNsUy!BI*uUA;u?v)edzc9V! zo)^_1|2F(cuCPBJ=OghiSYLVG4EbaICD-%8{2S`wk$aKWR}|j!*W)P!ESCqhf1E?v zLh?P@Yos)X&DPI!uNRPi;&P)}bCg+UCb5kHi=!TT11mdq`Oq^IPmQc-3)0i59B6+! z$+0r65}KV+*}kEkCH)+GI|#2(e6_h+nZ^1jgZ3%ume#-@*o%eG|V0e8Kqve|Zwame5Pl`~{Q&MC*ck~u6_-(OTs$UmL7m<~PJ7~5b8$gQot zUFv5bU&#M>|3Z3Kk~=`k|7|QxgM7Kev$TIq`5FnbBk|c~SN_8mPVsy@!Wrc6^S_+0 zlU0p(118bUmYG% zAotFFEw?H-Kjlpw*k?IfPRksM3fG$LHZqSgSI@S)?jZrmsqL8_3*)(0IJQ5KFXbD^ zJ+KcY64SDuf_ZS7^4q+5Yb}HP=MLE!(-yNkb}T=S;uXin#x!WIs@l|loKg=U1(&5( zp&tjv(>{j0b&_WByhM#Parh^ih9E!7S+;poU%=mTB>r!e@i0pC=Q=6^V^ z0h-WLWBugrsS)Y#sd>rY&6^YR{dFKe@YgLAr_LzfAbfxn597|S1NwJGKmLp-@#dR> zy0iW94abPz6$4ua$Q|oTtXENU!C?oo?070w0K(osG^D`(W$!z5$U=KNuy0>cKh3s90?qGj1ZuBbfKUTzq78*Mhn{4Jbn?2Y*iG3i;W*0piqI%XRQ}tBuUK-bdG`^Gn zoDP8lJ(%qj@QKFXa^!HwwgLF6xZSB35bX*TE)N&bWmF^j@RAG!Z z-!`V>ghkJ>(W>qAmXRh4=a45O-F-UpW$mxp(2Lo$VH=jioyE1yX$E^`ep`|JXSYws zZ3cV&VEoNTIpzoPX)n&vu3KB%S~&KljrxhzI`ZGzRBxD$;;8Lb4@Y|!W)JG6Wv@vz zHE_%~ir#^ug7`Ro7iZ9;vHJQU;V>tGc{I{>GFW%RAM1JQ2TBNjf&87@Z@}O8iX3ty zyZd{O4}J5xI~3>v>(5}^0)`sWL3)%vl8+1M+2>&ga;#w^UU>ayJ%!GC*$S9Eo_AL=@? z52ctLtiH6tax^Eg?N!YL-Q9J>(!lTE8vV-z()mTdZZV7xiyE8rqz_>n4CRnpCS^=> z=+_dnQ_cr5E{#$CSXQK|{PyMjwuy8q^Xe)A{cUTBwlmacx#vykwlcda5|JRh}1vOQR6!2B*&wm&)*JR3* zifcNe%ThpLpVvk|W;$NuNR-N5p=r-5qz^^IKH{LTX!2g49jjq?wt~I;8h4RrNw0|$> znX>;Glj9BSw3t_Ngwrc3Q4TRXWb~r{;`WibefxD=m*W#q&RcZ!L&>qxq;3nFp#exl z$1f2MKBi(mhH*|0^Rxu^1AwYgKs$oH2Lk3mwP>V>R*Ra(!QUz)kML-B@x*-p`X8qc zmeUrCv@w(`6yKJja;@Jyh;bj~H^M6wxED9JpjM`HEIqOua=FdFuBC-ho)2C_&wakytT1O z+8+v7XAr&r^7ssu_ki0U66Bv=Uavc_1Fu*i=hK)qS>Q|7Nc!vhfbUqIO1;2xP|ow- zew*gWJbO3Jdt2yVjSS7hm@_&yHKhQrcu~+eYg^ba7w~Vl4{4+)nqpxcfc@5O;4{ff zi%)V#vsuW9DnyHR@Sod93sO#jeCF4gC=aBAed8ft52s;xAR6nFBwz9f!#`os%LAFa5&Ff!zsY3yjPtr6oqs=MuA&_2C4IE? zeyr~?&--S}B$aQ|-SMFyUn=+CmC8Ms(B=Fvz2!tZu(Sh$kB$TTjn7Z&Zv(!7@4g<; z{+I=SOxMuvbgaMXD;3DSX&UxNwEH?;7bfJm|LC!TK)cHzybihw`>Yz`^~_Lz3%!$a z=5`wXlplcP8RQor$yNFX>yMxxN+e+KLA)~g2k`=={vWB*c;?F=W?wp29{8UU1HQdm zBz_zHL*P654eYa>9FI}^G=2ZL?2i%dM;v;EZmD>3c;#KrCve`NweuGY?K(WP7wb^V zxvDUI1C?j!?!hZhmoDX-N>RT+cHq{10{y0@kv#|U%y$d6X_>2a=VLfC}zY6iB zh>uv_y-kSjz~dNKyF&iDIh0pbl6&W5UiPyK*5fjKNxrZb43*L`r2ODcdPa7nz$vKcG=@ZekenmVD*dEp4qQ>g5j|hYTfb`Idlo0*B z@2+a6<6Gd)!Ee^rxl+nqPmB<@WP1Av8yn*~$$1cZOMEV-3k&A+mUG$F+c91+H(5|O zQ272$l_?4bHNZOk-O4=($J`b7F=5g${9 zw44vJMT31LKE&5ORZjc_y*#*ik*haX2_s zO?<;J;b~btL+x7uZreIIEi#Z3ek8AyH>DCLi&Ig;qIZn?feeQEb%fJiY=e*9hWU64 z;s@azZ^J4-zMtNh=S>nl<{guWbknDbpTs&}#w$+Aa5#^gKPeo}eLZsj(xn>ueLa}x zmk@d{=lu+J0rF?qSPl5ZA(sdk5YQy&qDFQ>%Ly5C@U>uPiN`pw-q@Dr;JcW(yos=~ z0_$RgAU+*O<}%Z_D^JCHrQD0&;jbR|FAslennSJ+{e^*XM0e`8k2O+$U7{EHQM-cgwf%htp<#C%q;j;bo{lrpgS6L5xGq0*5&5s$;B7=I?q|Pv!?g@_B(AT5 z7T6pYCWWooI1WSiWV`j&i~9+S>zIOeg!_Q9Vy5XK`c1pf{rFZ+iMgVMph!=Y91M|@iih3CT|yuC1=EYdH9D^flPpNeP_JwM!9 zSsuho98ZtRe>GGes>!wu5u4cFFF`QK6Qfj{vH)nfvvdUW0!G#m&G?~rW& z+YCDAgMB?5m_AuP2={6da=|%Xbew@dNBjdtL)zmLZ^q$|d1Bmnm=N>o>w<8{k-1Nz z9Fz{kJ$>9ACBd(prf}&UJCL90ymH@?B?#rFT_F_6yKXq!PISlI;q!=AjWFt`NINjN zVlP@$CFT3%+&-)a#KenV{>oQ?$*Zrv;C#p{dG1+fy$|&8&gY+h9yp$zz2z42|M&&x zpHF!1S@OPja`*Euyg=a(-f+Y9(*J=69-#17Uvb41g!kNe=bhxg^V(~#C4BN;c`qFP zACUg%l0VYh{khLwOW~1?%;(7<9VApL&)KDLpYy|gWiQbmKmURY$p4)8$$R6;P0xRh z{Clcu=swK5mH(;vTh8xypmUgSoz@;`LQZPBxtj3s#A;IqzV_OiI$@-v=W^+f<8K`F zBl-M~1mt$>txlc;VU95rxRd}Q{Qj%aw3Kkj||@!>7y3-R8G_L_wFrTokMC!WKP@|FHb?<-&V z@|R^faPgngMKTvtKHvGyf^Z1G*UyLE37~wEci#ESUm~9IY5YL<;JR)l@LjflpT7Y= z-vj1oT^hvWkkjO3Y{mqt=`GEcE8N?SK4#%OXJ>rV_bgX)V@CgWRuJyU$bqm@Fx@pv zwi`-8abv}~j7ISyEjVA~my4r)<9cc*$GC2F9Y84E8GO^}RA+;h*}d9Lp-;}75a{o!G_lYbo{#Q#0te`gP+2eEy`_rKyYKR)D! zbg#eu^_}FtckjJV5?#9YpS<{e=bS_CFTC)=Zp0sc{q@(WeB%#1a6XkUdGW>P&^QDC z=XV49Zn$CfK_I>BPzC%q$)AH?=!a9pXTw;Fb(e*CR>kwgUo^{wcAp&C$x7jW8_0n{ zQq5Zj2T9)NY_n|(@;8i~I~e3W8Cn(N1%?rBwf4yyFC|=Af&dKx& zUe3gQ@|tSA^8-CtwP9qdK>n9DR#ys??^TP{X~6cit0xq=n@dUN^rmAad zE!;Ct8byQTpBRW=$_hO1O=m!}LS$}xoWfx@%@oLY#s1doknU^-`I?T%^$(4tbhtnN z{J?+)9E{)9r=frO*T$L(4dpxb%KkY8?lfMMBZvFar72Iiv=7kM`fmAyaM`4H<$8c1nBV?*1xt-Zv;xMv3W(S9v(FL1*GdIIOF z2YvVYDDWWCeb@aw!k@DI#21J&Q_imibPn4QHs~DLISI)=O$f1&-90xpmP$z){v2|D z74M!9)_ZD3cdQ(?$6GDPY1#7SD_KF$8DlAr0~41wHF9eInam97K?VnO6!Zff+_XrZ zU9DYn0_mp)2UEgjxuau4iVl4mY^Hlf!ks);bTr&kML7%&;pXN_<-&zMl;?DM06PHJ zzzy)D;@`}_<9tjc<{0jYgUX4kF-H7B#`%r|oKd;YW8^V*c z-~MwjpGmoseVyEW{oqnBO!V8^mV2HF`FDzp!3x4XqU((&?w7}rAmp5D+B)d)0?Uut zHuQnzy%_^{*{xh=I>D?K^YY!;09j7rbg`5Y& zSbuWoI}hFRPYmmg;fcB*YcBhhwfdKj^Mh>9H-3F|zX^H&{J|gX7q9X?e|f_#FY#U0 z_?mD1=D#Vs#Q1HuZQLlvm0_kCp0<}Kryaa+HD0ca3v(&|!NVI! zKei9~`Z4L@zAf}1RBxldq5dOu#(Ht^1LE@tGe8A=(=-$FXlm!hqJn$=&}()^MEH2z zK{^ccLBF2}^uoqLS`+?wu3`%-n7L!#fguy)K*CE5@w}N!r1LQas1zsjut?^#LtRpi zR4##dl#Y(~2kwc-2T9(rCpbC~&jor!Q#cLf?8H7Sl{?6H8XNdTCr`0%)i7RtaXF=r zcG}X)A$^knY58SBPjC+GJj+3NwK1f)nw_tr^(}Wk`P+Yakh{Y9#?$}(vv7CLzy8~Q zq&wzr(b^KxUbl8PJ~9>6UKSH?zIoG4`nd9poBNkz+B16c|NX*EKjqI^!@rsuyGz?+ z{WKQGI%kg2aCsnmw(~wBu-?2d1O%)V9BpH>b_rUE<&j+oO+9{MQ==A7{^8@sof3 zFAVbDc(f*DrL7;u>-%rh_lPeuy*p;Ur2l8Vh<4m3{0pJ&GO2F>8%a3V2c zzGVI9P$CxPd)QiZ^JxJ+>C#x0Abp6mn%V>(?jM3Z82v-Ip=mkvVQ*vQrWol#c-j5( zT+ylY0CGM_{zr}+nVaVu@fW|}H_egmHBq!bU|0Ix>luZwo{Y-&&TuhK1KoNGeNo_k zLb*?_=Lz-J;E!#7e_Uu4CUY=9tF640Il8^JUuQb7DjoA6f4e`lBVs}RJ@tAu;k`Um zFC1&9=seUXer4|7@Xctu{*pBs9xKMoop?vkI`V%0g7VaPP2sz&J=R(*hHn)Q>J|OT zmEFpE9@Y+JHi(rX)JWsfmqiHA6sY3!BJ}AEK3!XK-}egWZV?LgPRGn)778Z@2cZw$ zEL7PHJs56jH5tZ@;ig347>x_XJo*9j2eCq7g!G`Yx`EaaCyaBal0VF1`%dCtIY0lu zMx!6XahQ|Vh2{0vT+^PISiM?D`@b|ku!A|89o_+hJCL!45$0I7x3A~_Q5@4g?_iD1 z9rLBTxaidIo@~`%A)>!-?riJo@XVdsQ@YhLCteUwo!8hfVZF@PV?0px8}y3MV{L89 z-&&!rl~L6U@etl$DTt5=k-olb>=2>qL7dZBEkepCYirH@yu0u2+AVySGThdQ`7Qc` zcp`NT<|4*6qv*jmDOKTr6N z(i;-`xxvIAd>WMnCb=b*)_) z@shdIp0np5_fg$CG{>LQp1Qwz^WFL${mZ5};%aO3Di&{P(Y_`s+S;K{6=>%X+!y&> z4WSCY8rsDAK)0z7&Zhs z>?@4bA}`7^1C?RftL6G|D)tu%GcM!RLs}Uejodd0iI)+ zFVxHVBI=G&EnBjR-p?cR>)&uF8Q=`Bmy z3sz4^GlhtYs(!?W` z4SNOeD9OJX2Y6BLiK`yQ`mr=GR4@-#vD{#gKeoLX&*`(x_4W1T@|S$P>Sq~}_a$`y zAK~Qvf9S!Efq~a0|1p0lkB3p1#^I01_;gQdUQgh@Hi%*ErNOa>N zn%^y7R$FcDVYkqGD&iJa)rtqzc!d(`djK`Tkjbh^06^-I9U!XXD*Nr=|QU%0>4@A ze+;1h;5Y97Z<2D3C)y=V_x}-&?*CJ|kuCl@!00s&5WULt-aI*R7K;S6+H4=Ij5-y{%Z(>e0{Rg7?3>+yg!Oln9Mr!_C@l{@Jod*oXEg!)s}u1Ley% zH%dEFV^tyzecl^B_iVHW$epDkz*(mCbV&K(L4tC=mea)lDG%{V{HJ)h|35_74gM3~ zdoy+yp}hYO_YB$z1KrdA(8Hu3@!G`lAbx-{|5vb|bPBm5`l}r7n0LIxe1kzBu6vQv zH;Nsr6(9>&(!4L%jNh5$FJ${~z3vq4y<88*@wo{X?P|Q!vJR2m=EfUuoHJh*qXPqP zt`R*Vgi9vv0`j2o{tqU9tRFB8s8%0d^{-z(qQQ=E25 zetWQ-jVv5zuJQ)ieMnxF;ZO+te@oN)9732O$PNJ7C`!I&y64PU{+7|7JceHPt^WRg z$b%zXKjdyr*Yzh4kbBrLFq^xiniv|ZT9V9zZKGBe%_Fvmn--Ok_8^N(b;C{Lmp}eKM zA>~b|+fhkh6fa2ZFGj%i{fzY(>@EIAKMaP_Jp}zI#UuA{c+|6|`5Ol!N zOI$KEAN~Y)(lZJl!g-`pdM9Ar*yIT`?4;0|H?)b2r%x+yJoB@S>jQtvUo+-bGD;_$ zBD>}r%a`B3<;?O|%D-1o-tGf>VvgRmMSE(G#bVU{56yMmNbP^kG|rcGi*Q%_oG#_B zs%?Kz`Qt$ly^n_yBdL16$4r`-rc(JXz4X!sj05A1JLJ8RiDk7XjEDO%@4ZfWL)i~8 zsM;IWuZ*I%TzSLX&$NxIL_8d4z0UU^w2P}KoRLby-4Fjxs3g5JhGTE={m`e#JEc>X zoH}hfCd$=YjHZM5I%xa#*zxqL-@VK_9zyDAd*>R*jCm5gqy^;F=EoqfKrB~M1H#AatIIU+f{-+C# zBeMM$47pF-)Kp(j^FJJarv08>M_~66`<0iyn3{%E)17WaHTPRDC%lMi?KgMTVd2lx z%F8WyxJcQr>_I#a_%foae*k>P{P=!-H|(D%kGZ=C7uT&{p&lz+j+g5VWzSWqspy&I z4~Ywb{eby%qCtBv$8lY^1p5DpuJ&kDjEiI!9-0uazf@M&*7BFlYuo0ISYoXRMZ0h8 z`h&H9*o8(Ksw$P2_0QEd)xbWiBs;O7q4_`F4{4(EHjboe9XMVeuBs&YLSCG_Kka8KEHPnXcA>ym+cgzXW#!eNXT zK-{bIhz|7-jr>D6?@R79p7^*8?$0pAfE|G58KFfS_FkO#?Jw5{&9&^+^4&;gCBpX|HXw`u)%(*v3Q z)>`Zvgtm?t^p}Fg5 z9?-QhRutoWxa-g%9qaDlips^!d=Kw{8IF@(zqRdX1&s$dxBmN^56JZLwPH2df6g=b z%S!i_W}J_L9`erC6$1UzNMnPX_c!h+>>#-(8=4jedTlut)_;tl|9&W!J9>HS^ zE4gPP(tk-1ex~FeU+2d|`Hh6`i4~AdJ6ezM%sFcJ;AI@o1L%{g z7OH)@*Is44#JlO7t)TgbCazOZNANv3d-#wsnE z1M%y0?Y`W7B5ure%6eG#;eU55W$jv5IPCkN&y5i}O+4BGlbAw_RYo zRySlcLF+cm+e_<(72<=EzP`-;J{dk{gfOoNH&#}M&6mtCMN>^7^fSYY7;j~J%%AQ* z2Du~uL<0MLkbCV&Uat3TqoEr0$yT7f2lZmE9yhT-Q0~*djPH9E_(MAO6Pc>q2gJMB z=3{I<%sHxfh^?Uk7DO6768+kzB%wH{s+ZqI*;d~yP6CC|N-plFn*8%+l z0l(e>Cxj;Xiuu5?X9V`!(lePZl0#e3&gdA2ucZBMj0>!yG0pcVYuike^kwTyu~?TT ze#AdGG8or5^r3wpz8?nr0n~!Qju0AYtO@h)i$89+Ga+lY`K5w~^Cx?>>$l-KB8<<& z%xsNtwD*_uNFVe3=2R+F#13P5`N4;8V|mE+Z<}i)WTye* z+zAuk)+K7+X15Tne_N3l(Bj(``76TrHv-hYOW|REExGF@y4*eRFQtS0WIprpPNrpk zca_5H+|M87GS{Xmq&#zaxz z+|CY^o7#U3vsDxGgTM69uR$O3m=Y`7{Ng+4%jp&csi*BoM@Jl`XFag7J(eZ=?aeP^OkJ{|MP;U=ay_Jh8^XuTO`;9m^NXOrj(+<>?LqP{t0`oxS1*9Oa4CvfH>Uj~3S{|Le8ebeW&_s7dr*ltR?!lJm7{-5rd!pE<1+Jj;7^mUiJGf7@ zg0Yap-jT*ii}azj4d)r52ho@}26-hntheW=y{b{KNcOqNbfypUwc#mzsLLEzlCP_H zR}%8Yvu$DW&*SA}n$P8jAWx*T>dm_=332UyjM8sxyoT*&M`~c;{ZA<2ZaEmD)VO#Heocc3czku>VymN?# z`#Br@d_M3iN{8HQ2w5qA?R_$T(53v&k@?x?#ZlyMWzF~PLp;+q-$(UAJRAL>;rHtp z*L*t<#z$%InF{zre8Dx~gpc#%z&qK4pg)v8ayStW3ZI@(yEN2aOpFXBG^r1*2hxxq z`sWm#*BXy?+ea{7j7QP$lUz5f8Sfz)*Vm~(87~};`}TWpi0n>~cWMjrn~1h!J^-Ze zp#V=9-%nAV6UxW%E}atfzz<~>-=nS85Fhg`Phtk+$?^KoI}=6FK>033kPf+LeD@56 zCx5aplY0`lAe>Y3H^@J54-nyp0{^j6e1xKO%F|5-;Y$9poCxQ?=Ysq_$Ss??@WMwF z)US6aiE}z)wlDLx#~s~P``vysrd;}weW7;>T(E~feRwLNQJGtCJ z`F~fOXt$)i##0ITU4n`3mH57&4SNFK>j3Uuj}OODdoIxvgE;pL_lfo~8E*Ht%-!9=y3Grb;sc-l&p~N73qC_W4I8^4J zD$#gWTE-hI^AGY5Fi1DZH=yx=n;Lm&F^Z%;xEZ94~_KlzIv#|f$8;-Y|u0C6p=-$L!E7#NWi+>^i zS8iRkiep{;<3rmM9OEILQ>S*2h5DHi4-KJph-^O&S`*egshD&RHH@0@!7+pp4dh2 zV;u9s-b2OP6q*l|-Vu9p?(KH8&n);r?es(hA098fhI4~BFSIm`_oKA$_kQoJOEibS zRQI7j`XlbJ(ThIz6us*)(KGSae}!^Q?D@>DUBFkL_}SQnM1S;8{^*Z@dmsJnZ*L;{ z7k~Yk&k+6HH{N)I@T0glLhc{_Z+^Imn{U3E=~?KFr{ z+3)w>$)C+C*%ZEi0XfeiT(5$BMz&&siE;$-7gtw?Otfoe9w}1&t2f{MJmD8U_uLmq z|C8H)uu6g4(^!})6pnri>K|>{xbNM_zoGiv3XXQ5rs;ds+AIrIRTCfTG0(7U#m09A z&~I4Ts*oJlFpm50?f1^lBQhD{3qCuM@=?w!K+hl^x!Wa71y~A4@2@FY4GRKc^H~!c zoP^D3>|0WKRKZNN|46!dkod5+wY>%P%tew0-5<>5S&$k8_G}jBd8vD z_g9u1pOKVwN|sx`>qX~x{r&~v>&>Ggm58wcq3HQ(9K_VUY z@>{}8vk?CpT*zSs;eH?nej|LWWvx!}5N(blUPnF7ZD5^ka+CCW9I@y-_UNaF=sg|a zObIa`m-Lx1QwkSgvP3UTPe;1suPsPFMeDe|&_BH6Cvcvh>_5!aifWPS%Zvh@gK`+= zn;hpMliz#2Lji^s;rr33Pjepo3PASr60(LZI_@|3vI<71nM?W!CtCK}6uuoFc2Foh zejMo=4e4t%-0$uLP32G->n-6$B@EodW%Lp@t4*X4PXR`N8ou|A*=i8}EITP)C59Pg6zf2{W%Gpl5mqaPEqR(5){ zJ|m#N$$|KX73ee9FagQ(Yz+6rb;J)Xs#OWEYi%QaknM%S;ht?JrGxy?8vS|)h|;-U z27CqL_@hLvDGbE>qEFP(zNnO+tpB;#LPWSbbU*yyM+gJ|)1l>9)^#sZJmR~up#Q`< zOq%!1e^mL;tZKYGFU9dATev z^ytj>J6*j4chj+$j`vOiQ<~q&?^O`uISJC!>}Vn$ z*MZSQyqCGU{qx4!S_>!A`YmI~azrk_?eSiY_tUFt7H=gvx8Y(hll||~W<~bzT_$(% zJ%+&)?76zVV%orau9_W%91zY{r5uBD{;p^`@7LamKg{J&Po(Nv$`b4|%%|_Pw&I)( z%5(5wSDS|Vxy83-zdbfqbY!_|H&=2hA3jvBWBfLZgA*pg4`ScO#CoN8>?l&@&d)c~ zJM!G=Ub(Uz_04k8xw%D-sQqCXS(?@u4`UW5MH&){dGKCn;J=#Jv-Yqeh$2zQr0-pzq?WCuk$(3>#@ z^kQtdD2`&|90Tkadba4;x(@$~k~AL>co!S}6d|2oLcJ5ZUw?Y%NkKUu=%M!id#JzC ze@JmHrxF`0gk2YX1nJ^_0iDN1d7e1r&H;n=n00X91oh8;cu{4og8FKAO>}^^FMBy6 z=PPw~Ue!VOqx|Gf_udx9r}yG1U3`yP_A9Wz3=xg%`WeE@@mmo7H2uFt`@tWe^0KO{ z7w~~WA9R!W1@rWuo}NF<#cnsoJIg8LJ&b?oUn&+?$@DM`GPHkz{RRQK^cU@w8s00# z^J8hE^-cafW^@$$b(psuM2AM@#&BGcuaB@#NgDBdEYV|QK8<_9(jCvXrYSzmKDfW5 zXO|3}y;ujoRSgeo5P}0I*TZyjsG+Q9C{(I1s~}qYD--TGFRL%Q{p5JeHJPQ!`fBEV zq(^fHA{hTnr{4F7-Y@sy{gp(tL`rIuu$^-=Kb|3H(j;3#vNuyhh=VO)t?T zt+r7-d}bH(eL3$1KZ#~%liauV^lOB@KdFWunNEkMQ8~YFq9H&&6HmPHkAF@0)DM2} zAmPwI{v*BT1o}Zq|I`2RU%p86RUi7`2MK@q#V`8w2R|tN*W4`Wy^lTp^bcjc-~8sc zg#Y-)V~>^SZy~=QRiI-H>K!2DagzK{?x)M$O{ymzn6+Hpec_`6+mr&n<5~f}!!#?siH}?`wJeZX9-oN?cT{7ImSNZgYH)VRS{%}mj zAHQjhM*ar9I}0q6e|i1!ZiGSa&JyA~K@#H$s?SyD9c{NzkNSp&0i|H(F28*FQU&jq z(D(&(+wgsJ0Xso4L+?^>_n!xTT%{rY%GH^JemX{+qyD%C;|cVGkrq5aQC6OlX}K?v zQ4k*MON^t0pQzJq>m{7aMgOSnW}~?O4}P#jex1bB2=#jtEIhddxEJy~?R$`@z1z?& z+jmYsbZCysnL_yp$MBD&vA!fUur6fz;w#yK2^2wA{% zrE-^vd$t%p@E#D~-L*azQGR7T)%#Cxd)h8@JQizb$}a4qsd4OwW4}agXWDK)j^$k| z?Xww8%YTjZ$3vGdFC5Ru&kyAY^goBsUZa#s={~~gkmXQpW+7Y!);)x*)4zwl0s_)N zF9qtrUSm+wofxPU3Wp!@0sU~(@qC5k1CxAc*=M4@&6O$7r177zMqS!Vxn)l4JAaYz zqWlFm8oPDdGVB|F7^UboN0pG4JP_qQBD7@aR@E|iDE#II)!NNI%BoUnwnrcE=B!2N zCzDNs1=5T0P|fnDfDgyZf%hKpn=fZj-rqN({!L9y%NOJ;`Oi^*98+DvQ2(kF?ln6a zZg0h#xufsi-nOFM+OLmBqmy*M`9qpM*J^#u3VrIEEvgpcAu=?G@^jTVA4TVGv{5Bo z(^$YcQggtav!11W@;khI9`%0}$3Pcx^vgZzDC%v&F14s4s6Pk&@b}hqkUN~|K1`Wj zFrv+q-OIxTG}5oHN|F4RFaOh}r>Z~9%J?2g&<@aUHE!~QVrTcpmEHOty(io|euK8& z3JDlqS%nCZzMWL>Q}6-iXPnPP?$wRgh;eHa?;g=OFmdkU+D58B*1ZLe`V|XaA*c`4 zU)pWv>y7ejj4QYwMC*Tr__btta}fT_Xw7oQzDxDTGi+PR>reV$va1LE^IjaU?xgnH z)g6tRJK06Tg59WIgs=^F=6aX$fyH^axpolxBgXOk7xlXn4c9DP%3SuAW^&XE_e6R# zF^QNjF{1mNsHDTVk3w`E?y(Rq!Tl9N9Eg*M37Eu-Mt$s~dq?osGe9Qq(J-RJ@eK_3 zP>f_MU0#3E|ML1(dmD;`y|p>bo`27V2;2ScnyLj6bScuW7RXJK^402JJ=8bJPvp zE0kU0r<-ccP2!WWMp59nk;rrkZdC zbCvJny_Xj)oReg1(>m*E_82=fMdxrIg52r6?qgE^K0UR74&2L;;>DC_l*gbpIH!yB zU=J*%S71m-GiFHsyZm#wXn~C7AqQF)nkZKw{{Y8to6}7yceL#`8{=Bfb)TxbT#55g zB-Ua1=V;Y^)Gp8+9xdVjp!1P94||o^sV^FA3WrGUUtR%w1I|sTH*LNK`Rv7XkfA?Y z|03DN9@5tLV50=*g>IwurFNfw2hPRV{2{)cVZ(&OpLr3_#|FIDcB9S7_Ey7*(G)G@g^Kq(oMy2(JhOdXx`5HQRQh+wh^Wk7g55~QjLq~`Y zk!W#(@6ra$s+4E#)~}tK!^QnQ`kx*1`kA@Y`m+r)A!hEjzBN*z8_=6^m|3XamTUB-Vz@s)^vBu^DvQ{r;kwopn5aC#20nl%=aXnPtiS>Bp`|UPHaj4&%Vwt zG>+qrFc z_(A&McdI=&{rz%3z1KUGhOhQ=nsX@Jt9w_YkDHcrOiIvy z4WI5Ke&Yp`Vdq?i7YZ3Zm8E}WK0%_}-=4klsS7=N>)kJqV*K{g`BCwKMc~}W#7L&B=)_q{fm>wN8H4=H{Y)?AN}^yV&NIfd@PkF7hLMWw49(n1lcbc z-T_@YYtT2thNc4gWs3yLiz=(w*)rTs5kH41%KlX1vCC_6J8 z5|w`p{xC=nx>v$*mVU+lc7B-hBd(`RnAq}uO;6Spwcs6+3}rq__+h+bh{rEL(Ng}r zoS)yzA3x9E6+V=eXF#fVQG>nv_iszPX95|Qpu4hE8DSPQP+#KO(_dHKxk`o$eH?@b z=*W3=zAFfQtrdz-ego`}|Db(?a?uw(yE(0PbW$ng(JyKAD$r-j-~7{ZA*~kuV;Kmap>H7|Y^4o@s@3ebQ z?}3`47b5o@I8yXn^cs4G_xecB=f`@M_!B3%SBgDb%eW@YD{&mi_ zzbsw-R_dGGWAJ0m{a%@0i!10ITIP?B3zbvbI)<|kGQnIZ_j9mxT?0zBk89i~?dXpc*z@+${ZiPyE&FfM z6Lrmb{P9PEg!33PGn#ST5`Cg==rgCA)~a{d50*;*EhpU4xeF`MhuBtEkO#=;jU+)H zxE!9z_PN1B82+jspQ5^~<|G_$hi6dZ$U2MzQxd+D&L^V|eELhSK3H1*h3 zny}XyLnI6);V%Wgs|_FK+(4{e9_O4tqxiD-FG01Ba?V@A)jobI=%(qa>;8P0c`xH` zyyX3G7p^yT8_=z*fc8h-iYG&_m>xyfgVq^a*j!$?{z8w{^TV&Zv+2F zUh-qxU^=Z1!fsc$&gVP#UEx2qG3bg)!b8*>dJ}j%$OnG>V;rkk>f`l#WAt;hvvlOo zM)+{)_BEGwmrg7~uT_HD_jsBQex{%cU84e@@6-35_%0eAX5SAk%%^-B;$3;qkgu~W z_Gp#-jp~M!>ve{Q-5sHOh35dEpoMold4g z)~V>5RL5;6n{uDXZ+{OvyrLcT%eSY3ZS^f^?75L`DJ4DmTaSKA5~ZVe(l1L zj6*yzIX&-3!H-T`qfE;j^*9md$Kk>;2S>Avo9{OZmj3N{ulTfUi(3%b-}F|mQ&^*Y zeSU0W9q>m#t`v7v%4`{DsK|{L%AI;pgMa$GyL7Rq6Z0482ivlay7C7%?5ekUE_>E?ZT0M_ Nv#0c3eV5@<{{}fr{wV+e literal 0 HcmV?d00001 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json new file mode 100644 index 00000000000..ba19f8bc907 --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json @@ -0,0 +1 @@ +{"Version":2,"SourceFileDate":132009986360000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP","FL_BITMAP_NO_GAMMA_CORRECTION","FL_BITMAP_METAL_ROUGH_AO_DATA"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS new file mode 100644 index 0000000000000000000000000000000000000000..599d0fa9ebec441a2425b1d8d68b977c54b4458a GIT binary patch literal 43832 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 A;{X5v literal 0 HcmV?d00001 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json new file mode 100644 index 00000000000..dcb1fffc2cf --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json @@ -0,0 +1 @@ +{"Version":2,"SourceFileDate":132234909850000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS new file mode 100644 index 0000000000000000000000000000000000000000..dadc871b43828dd985f85ed84343d4e77ecc3388 GIT binary patch literal 87536 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 literal 0 HcmV?d00001 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json new file mode 100644 index 00000000000..905f0b4fa1d --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json @@ -0,0 +1 @@ +{"Version":2,"SourceFileDate":132009986270000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP","FL_BITMAP_TANGENT_DXT5N","FL_BITMAP_NO_GAMMA_CORRECTION"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG new file mode 100644 index 00000000000..b9dcaf85842 --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG @@ -0,0 +1,2 @@ +[models] +normal=ralt_probe.xml \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin new file mode 100644 index 0000000000000000000000000000000000000000..498df6466dd7b787c9346c923594370c684791bc GIT binary patch literal 7668 zcmeHLZE#f889pJwLO?;jLj)>;CEuIf%_h6K%VKPnuOdkZ2&pAZQqT^aQ7jNkiF?@{ z3AT>*hYmy0CNLpgq=*5E5^^ajRIJEMQL(gO`6w~afMtjboe^rE_nf@jo8?~n$DeZN znfG4q!*kyAp7)+T5B;)YzSv`jgPxl!3}crO5tYrl$JOp6h=98KWySUr=SMeJ1dK}J z)aoBj+L%LN&R_TE8N@N_GmWIS=151S0iDG;1m=9YKQBO>Bdaq5NfphJP-Pi(PC5z9 zd0}lhuS;Gl-E5fiaUbxKU1StK+9bC6Fw=fpPx_%-h)5)yBJ?$0p%IvK{NxHb zufMOH(k?_aQd=qX`=LQ#4$td0=2tD}RjvQ7P-q0^nCr7h=2NDJ3rpPu=J32OBQG5Z ziIlMZoJVK`=9t$jOdPD2;VE?!n6q?k*r57MX`pHrPlOHeI__R zz?zonQFp1Ez#P;^>ZtnYktpi(xl?Ea=Hxc4kiD@>pW+uH9BD><7P?B^1m>VVQb(;j zVni6Ff(2DVO_bJIjB!N&FkNL4%&`506ml@Hb(`Skc&oCM~eJ_hL| zO{bizBOT=-{i3hcL150ZVHc#1s!uo)MSYe-gTS19t1d{L0p;nk51UY*`OqLRhx1YE zPWi<2cZyq_1m>VVQs={+P3R5eQ_-QXFK%@Zn8Wpv>wZhE`?aDLCxJPA`iJ@u{j;N} z)j?oRX6l;26U)1%wx+I8eb^JzyGtA%0&}*Cbxz_8O=~lv{V`TgR9~VwJOt+aeoULx z2_+S(eXK|5_0S+NC#!cX15x%yPqqFZzr#ad4#s+&#u}T}ruLtnu)YrO3Cuyx262=Q zY6zVayeBXR`AAMMsQ~$4-#|XU@HspL<{%%*QFAAqm_7{e3C!s;_b=7le_rhH5SVj% zcDn!N>`(khMYGX32H$C0vwokp+ecu|&B;pw#5w;`ovd@HtwV1w+3h1R$LnvBoKx2_ z)IQ%P^a{KuFsHp|vE;P8SgXFBwvgWC-|ZtX2l=$qSjR=P`YzgP^(fvGn1g%_;#_^H zPW3!=Cg44RImkzH-s{Ow`zrD|;M?sZFbDZa&c+vORj*=RRd`QePM`W*LLZ_&ci}yO zIp+F&T(~hp^*Q4`oJnAgd8}OT#z+S^fAd~0ATYMJL$yq)j6FSfjOLyoO|y%swM;V z0hn`3JaCA3J8n;#CUe#W0^Sn%A_D$^b12U7;V%fi9Oz8z<@`^F|9x*9^?a*uTKeIj zH@4C^xT`~+*%EyUIQxmSEVeRma2|2)^eJx*&NYZ*EX+3gwKZA#lp}+41H^gz;p{-a ziY7~+^3wqgf%IqdgH^Ati}z2WPci5Gbv}i3TEEyA@3BOma`|SC%!hK`ZsSvi6z`Gw zyt%q2-iL`krRtf-rOua?S?c%8!l&@O=DfNt-m8f|#ay4S^C>j1ySMovVwp)bFWmMRV=#>czii=CUg$h4^XZ;37ky~$Q+7^2Cv}!3 zkCT09>7u<)shQYL^IG8U zG)P z`V`bh>YROY3)TzyR9O3z_`2Kq6m$RB_>}r>^?~a{x~9HyVy)^!3!n1nFQ0Z2=gg2j zwm#*ZM|VjbUviP!$1HrxQ@vvyKe1NzhJ{bTSg+GqpAFe#>r;@kK^&!n8d~@iD=j4`pn(Nr{sT-=0EevN&k^|w-}9S_KUcK|Ycb8@&|sBAq*ZN}u|4S^E@oee8USc`Q4hVpYRLpJL9( z&Zn5aK|7yf-p6cxip3svhfgtmr*=NYytml-6!Si2=TppkxSdZi|6bVn6muWi`INr> zW9?JSy=v!E%)M&oQ_N?r16|fW#e9zH9%JoO%x97VY1Tf)eBS83WbIS_^7J!-nt_9Y zMrecDS8aR>afZ%46hA{I`ji<U> z{lpyc5I}1@7pq$i%*D!904fd;l~~;hpb{%P4^VNisKV;b1FEpH^8poyiUnBR`M?6K W?8AVHBQP5E(zhM;ZAX2x9ra%sRm>Uy literal 0 HcmV?d00001 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf new file mode 100644 index 00000000000..120b01f673a --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf @@ -0,0 +1,681 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 87, + "min": [ + -0.027643540874123573, + 0.0004084900429006666, + -0.027597004547715187 + ], + "max": [ + 0.027643544599413872, + 0.3816501796245575, + 0.02759690396487713 + ], + "type": "VEC3", + "name": "x0_Stick_Left_vertices#0_POSITION" + }, + { + "bufferView": 0, + "byteOffset": 12, + "componentType": 5120, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Left_vertices#0_TANGENT" + }, + { + "bufferView": 0, + "byteOffset": 16, + "componentType": 5120, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Left_vertices#0_NORMAL" + }, + { + "bufferView": 0, + "byteOffset": 20, + "componentType": 5122, + "count": 87, + "type": "VEC2", + "name": "x0_Stick_Left_vertices#0_TEXCOORD_0" + }, + { + "bufferView": 0, + "byteOffset": 24, + "componentType": 5122, + "count": 87, + "type": "VEC2", + "name": "x0_Stick_Left_vertices#0_TEXCOORD_1" + }, + { + "bufferView": 0, + "byteOffset": 28, + "componentType": 5123, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Left_vertices#0_COLOR_0" + }, + { + "bufferView": 1, + "componentType": 5123, + "count": 294, + "type": "SCALAR", + "name": "x0_Stick_Left_indices#0" + }, + { + "bufferView": 0, + "byteOffset": 3132, + "componentType": 5126, + "count": 3, + "min": [ + -0.7500150203704834, + 0, + -0.7499643564224243 + ], + "max": [ + 0.7500150203704834, + 0, + 0.7499643564224243 + ], + "type": "VEC3", + "name": "Stick_HitBox_Left_vertices#0_POSITION" + }, + { + "bufferView": 0, + "byteOffset": 3144, + "componentType": 5120, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Left_vertices#0_TANGENT" + }, + { + "bufferView": 0, + "byteOffset": 3148, + "componentType": 5120, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Left_vertices#0_NORMAL" + }, + { + "bufferView": 0, + "byteOffset": 3152, + "componentType": 5122, + "count": 3, + "type": "VEC2", + "name": "Stick_HitBox_Left_vertices#0_TEXCOORD_0" + }, + { + "bufferView": 0, + "byteOffset": 3156, + "componentType": 5122, + "count": 3, + "type": "VEC2", + "name": "Stick_HitBox_Left_vertices#0_TEXCOORD_1" + }, + { + "bufferView": 0, + "byteOffset": 3160, + "componentType": 5123, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Left_vertices#0_COLOR_0" + }, + { + "bufferView": 1, + "byteOffset": 588, + "componentType": 5123, + "count": 3, + "type": "SCALAR", + "name": "Stick_HitBox_Left_indices#0" + }, + { + "bufferView": 0, + "byteOffset": 3240, + "componentType": 5126, + "count": 87, + "min": [ + -0.027377445250749588, + 0.0004078660858795047, + -0.027904797345399857 + ], + "max": [ + 0.027377448976039886, + 0.3810672461986542, + 0.027904696762561798 + ], + "type": "VEC3", + "name": "x0_Stick_Right_vertices#0_POSITION" + }, + { + "bufferView": 0, + "byteOffset": 3252, + "componentType": 5120, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Right_vertices#0_TANGENT" + }, + { + "bufferView": 0, + "byteOffset": 3256, + "componentType": 5120, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Right_vertices#0_NORMAL" + }, + { + "bufferView": 0, + "byteOffset": 3260, + "componentType": 5122, + "count": 87, + "type": "VEC2", + "name": "x0_Stick_Right_vertices#0_TEXCOORD_0" + }, + { + "bufferView": 0, + "byteOffset": 3264, + "componentType": 5122, + "count": 87, + "type": "VEC2", + "name": "x0_Stick_Right_vertices#0_TEXCOORD_1" + }, + { + "bufferView": 0, + "byteOffset": 3268, + "componentType": 5123, + "count": 87, + "type": "VEC4", + "name": "x0_Stick_Right_vertices#0_COLOR_0" + }, + { + "bufferView": 1, + "byteOffset": 594, + "componentType": 5123, + "count": 294, + "type": "SCALAR", + "name": "x0_Stick_Right_indices#0" + }, + { + "bufferView": 0, + "byteOffset": 6372, + "componentType": 5126, + "count": 3, + "min": [ + -0.742795467376709, + 0, + -0.7488188743591309 + ], + "max": [ + 0.742795467376709, + 0, + 0.7488188743591309 + ], + "type": "VEC3", + "name": "Stick_HitBox_Right_vertices#0_POSITION" + }, + { + "bufferView": 0, + "byteOffset": 6384, + "componentType": 5120, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Right_vertices#0_TANGENT" + }, + { + "bufferView": 0, + "byteOffset": 6388, + "componentType": 5120, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Right_vertices#0_NORMAL" + }, + { + "bufferView": 0, + "byteOffset": 6392, + "componentType": 5122, + "count": 3, + "type": "VEC2", + "name": "Stick_HitBox_Right_vertices#0_TEXCOORD_0" + }, + { + "bufferView": 0, + "byteOffset": 6396, + "componentType": 5122, + "count": 3, + "type": "VEC2", + "name": "Stick_HitBox_Right_vertices#0_TEXCOORD_1" + }, + { + "bufferView": 0, + "byteOffset": 6400, + "componentType": 5123, + "count": 3, + "type": "VEC4", + "name": "Stick_HitBox_Right_vertices#0_COLOR_0" + }, + { + "bufferView": 1, + "byteOffset": 1182, + "componentType": 5123, + "count": 3, + "type": "SCALAR", + "name": "Stick_HitBox_Right_indices#0" + } + ], + "asset": { + "generator": "babylon.js glTF exporter for 3dsmax 2022 v1.0.8174.31295", + "version": "2.0", + "extensions": { + "ASOBO_asset_optimized": { + "BoundingBoxMax": [ + 0.7500300407409668, + 0.38163238763809204, + 0.7499287724494934 + ], + "BoundingBoxMin": [ + -0.7500300407409668, + 0, + -0.7499287724494934 + ], + "MajorVersion": 4, + "MinorVersion": 4, + "UseCheckerboardMaterialForMissingTextures": true, + "UseOnlyFilenameForImageURI": true + }, + "ASOBO_normal_map_convention": { + "tangent_space_convention": "DirectX" + } + } + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 6480, + "byteStride": 36, + "target": 34962, + "name": "BufferViewVertexND" + }, + { + "buffer": 0, + "byteLength": 1188, + "byteOffset": 6480, + "target": 34963, + "name": "BufferViewIndex" + } + ], + "extensionsRequired": [ + "MSFT_texture_dds" + ], + "materials": [ + { + "name": "Stick_Pawap", + "normalTexture": { + "index": 2 + }, + "occlusionTexture": { + "index": 1 + }, + "emissiveTexture": { + "index": 3 + }, + "emissiveFactor": [ + 0.9843137860298157, + 0.9843137860298157, + 0.9843137860298157 + ], + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicRoughnessTexture": { + "index": 1 + } + } + }, + { + "name": "Material #1", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 1, + 1, + 1, + 0.7 + ] + }, + "extensions": { + "ASOBO_material_invisible": {} + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "COLOR_0": 5, + "NORMAL": 2, + "POSITION": 0, + "TANGENT": 1, + "TEXCOORD_0": 3, + "TEXCOORD_1": 4 + }, + "indices": 6, + "material": 0, + "mode": 4, + "extras": { + "ASOBO_primitive": { + "PrimitiveCount": 98, + "VertexType": "VTX", + "VertexVersion": 2 + } + } + } + ], + "name": "x0_Stick_Left" + }, + { + "primitives": [ + { + "attributes": { + "COLOR_0": 12, + "NORMAL": 9, + "POSITION": 7, + "TANGENT": 8, + "TEXCOORD_0": 10, + "TEXCOORD_1": 11 + }, + "indices": 13, + "material": 1, + "mode": 4, + "extras": { + "ASOBO_primitive": { + "PrimitiveCount": 1, + "VertexType": "VTX", + "VertexVersion": 2 + } + } + } + ], + "name": "Stick_HitBox_Left" + }, + { + "primitives": [ + { + "attributes": { + "COLOR_0": 19, + "NORMAL": 16, + "POSITION": 14, + "TANGENT": 15, + "TEXCOORD_0": 17, + "TEXCOORD_1": 18 + }, + "indices": 20, + "material": 0, + "mode": 4, + "extras": { + "ASOBO_primitive": { + "PrimitiveCount": 98, + "VertexType": "VTX", + "VertexVersion": 2 + } + } + } + ], + "name": "x0_Stick_Right" + }, + { + "primitives": [ + { + "attributes": { + "COLOR_0": 26, + "NORMAL": 23, + "POSITION": 21, + "TANGENT": 22, + "TEXCOORD_0": 24, + "TEXCOORD_1": 25 + }, + "indices": 27, + "material": 1, + "mode": 4, + "extras": { + "ASOBO_primitive": { + "PrimitiveCount": 1, + "VertexType": "VTX", + "VertexVersion": 2 + } + } + } + ], + "name": "Stick_HitBox_Right" + } + ], + "nodes": [ + { + "translation": [ + 1.1920929e-7, + 1.1920929e-7, + 2.98023224e-8 + ], + "rotation": [ + 7.450581e-9, + 0, + 0, + 1 + ], + "scale": [ + 0.999981165, + 1.00004876, + 0.999973834 + ], + "extensions": { + "ASOBO_unique_id": { + "id": "Stick_L_CTRL" + } + }, + "name": "Stick_L_CTRL", + "children": [ + 1, + 2 + ] + }, + { + "translation": [ + -1.19213823e-7, + -3.57612151e-7, + -3.725429e-8 + ], + "rotation": [ + -4.76837158e-7, + 3.16665023e-8, + 2.38418579e-7, + 1 + ], + "scale": [ + 1.00001788, + 0.999952, + 1.00002623 + ], + "mesh": 0, + "extensions": { + "ASOBO_unique_id": { + "id": "x0_Stick_Left" + } + }, + "name": "Stick_Left" + }, + { + "translation": [ + -1.19211535e-7, + 0.744731665, + -4.09013055e-8 + ], + "rotation": [ + 0.7071068, + 0, + 0, + 0.7071067 + ], + "scale": [ + 1.00001884, + 1.00002623, + 0.9999513 + ], + "mesh": 1, + "extensions": { + "ASOBO_unique_id": { + "id": "Stick_HitBox_Left" + } + }, + "name": "Stick_HitBox_Left" + }, + { + "translation": [ + 0.0000174045563, + -0.00005686283, + 0.0000028014183 + ], + "rotation": [ + 0, + 0.000008523464, + 0, + 1 + ], + "scale": [ + 1.00971627, + 1.00159431, + 0.988959551 + ], + "extensions": { + "ASOBO_unique_id": { + "id": "Stick_R_CTRL" + } + }, + "name": "Stick_R_CTRL", + "children": [ + 4, + 5 + ] + }, + { + "translation": [ + -0.0000172370255, + 0.0000565342743, + -0.0000028405268 + ], + "rotation": [ + -4.768392e-7, + -0.000008583068, + 2.38414486e-7, + 1 + ], + "scale": [ + 0.9903762, + 0.9984089, + 1.01116371 + ], + "mesh": 2, + "extensions": { + "ASOBO_unique_id": { + "id": "x0_Stick_Right" + } + }, + "name": "Stick_Right" + }, + { + "translation": [ + -0.0000172370255, + 0.7436392, + -0.00000283299255 + ], + "rotation": [ + 0.7071068, + -0.00000606914546, + 0.00000606914546, + 0.7071067 + ], + "scale": [ + 0.9903771, + 1.01116371, + 0.998408139 + ], + "mesh": 3, + "extensions": { + "ASOBO_unique_id": { + "id": "Stick_HitBox_Right" + } + }, + "name": "Stick_HitBox_Right" + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0, + 3 + ] + } + ], + "textures": [ + { + "extensions": { + "MSFT_texture_dds": { + "source": 0 + } + } + }, + { + "extensions": { + "MSFT_texture_dds": { + "source": 1 + } + } + }, + { + "extensions": { + "MSFT_texture_dds": { + "source": 2 + } + } + }, + { + "extensions": { + "MSFT_texture_dds": { + "source": 3 + } + } + } + ], + "extensionsUsed": [ + "ASOBO_normal_map_convention", + "ASOBO_unique_id", + "ASOBO_material_invisible", + "MSFT_texture_dds", + "ASOBO_asset_optimized" + ], + "buffers": [ + { + "byteLength": 7668, + "uri": "ralt_probe.bin" + } + ], + "images": [ + { + "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS", + "extras": "ASOBO_image_converted_meta" + }, + { + "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_COMP.PNG.DDS", + "extras": "ASOBO_image_converted_meta" + }, + { + "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS", + "extras": "ASOBO_image_converted_meta" + }, + { + "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS", + "extras": "ASOBO_image_converted_meta" + } + ] +} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml new file mode 100644 index 00000000000..b4d1b5cc918 --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + (E:TIME OF DAY, Enum) 1 != + + + + + + + + (E:TIME OF DAY, Enum) 1 != + + + + + + + + + + + diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg new file mode 100644 index 00000000000..92f4baa9817 --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg @@ -0,0 +1,13 @@ +[VERSION] +Major=1 +Minor=0 + + +[fltsim.0] +title=ralt_probe +model= +texture= + +[General] +category=GroundVehicle + diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.bin b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9f96d8665495c0f5b6ac9e627f202de360bd8d9 GIT binary patch literal 36 ScmZQzKn4x=$UFuH2p<3xiUEHB literal 0 HcmV?d00001 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf new file mode 100644 index 00000000000..4c2ba35daa3 --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf @@ -0,0 +1,54 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0 ] + } + ], + + "nodes" : [ + { + "mesh" : 0 + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 0 + } + } ] + } + ], + + "buffers" : [ + { + "uri" : "triangleWithoutIndices.bin", + "byteLength" : 36 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 36, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg new file mode 100644 index 00000000000..bd0afcaee0e --- /dev/null +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg @@ -0,0 +1,12 @@ +[VERSION] +Major=1 +Minor=0 + + +[fltsim.0] +title=triangleWithoutIndices +model= +texture= + +[General] +category=GroundVehicle \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/CMakeLists.txt b/fbw-a32nx/src/wasm/radalt_a320/CMakeLists.txt new file mode 100644 index 00000000000..683211cfa2e --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/CMakeLists.txt @@ -0,0 +1,22 @@ +# This CMakeLists.txt file is used only for syntax highlighting and navigating +# through the code in an IDE. It is not used for building the project. + +cmake_minimum_required(VERSION 3.19) +project(flybywire-a32nx-radalt) + +set(CMAKE_CXX_STANDARD 20) +set(MSFS_SDK "C:\\MSFS SDK") + +set(CMAKE_CXX_FLAGS "-c -g -DDEBUG -Wno-unused-command-line-argument -Wno-ignored-attributes -Wno-macro-redefined --sysroot \"${MSFS_SDK}/WASM/wasi-sysroot\" -target wasm32-unknown-wasi -flto -D_MSFS_WASM=1 -D__wasi__ -D_LIBCPP_HAS_NO_THREADS -D_WINDLL -D_MBCS -mthread-model single -fno-exceptions -fms-extensions") + +include_directories("${MSFS_SDK}/WASM/include") +include_directories("${MSFS_SDK}/WASM/wasi-sysroot/include") +include_directories("${MSFS_SDK}/SimConnect SDK/include") + +include_directories( + ./src +) + +add_executable(flybywire-a32nx-radalt + ./src/radaltGauge.cpp +) diff --git a/fbw-a32nx/src/wasm/radalt_a320/build.sh b/fbw-a32nx/src/wasm/radalt_a320/build.sh new file mode 100644 index 00000000000..686324f83d4 --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/build.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# get directory of this script relative to root +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +OUTPUT="${DIR}/../../../out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/radalt.wasm" + +if [ "$1" == "--debug" ]; then + CLANG_ARGS="-g" +else + WASMLD_ARGS="--strip-debug" +fi + +set -ex + +# create temporary folder for o files +mkdir -p "${DIR}/obj" +pushd "${DIR}/obj" + +# compile c++ code for the A32NX +clang++ \ + -c \ + ${CLANG_ARGS} \ + -std=c++20 \ + -Wno-unused-command-line-argument \ + -Wno-ignored-attributes \ + -Wno-macro-redefined \ + --sysroot "${MSFS_SDK}/WASM/wasi-sysroot" \ + -target wasm32-unknown-wasi \ + -flto \ + -D_MSFS_WASM=1 \ + -D__wasi__ \ + -D_LIBCPP_HAS_NO_THREADS \ + -D_WINDLL \ + -D_MBCS \ + -mthread-model single \ + -fno-exceptions \ + -fms-extensions \ + -fvisibility=hidden \ + -O3 \ + -I "${MSFS_SDK}/WASM/include" \ + -I "${MSFS_SDK}/SimConnect SDK/include" \ + "${DIR}/src/radaltGauge.cpp" + +# restore directory +popd + +wasm-ld \ + --no-entry \ + --allow-undefined \ + -L "${MSFS_SDK}/WASM/wasi-sysroot/lib/wasm32-wasi" \ + -lc "${MSFS_SDK}/WASM/wasi-sysroot/lib/wasm32-wasi/libclang_rt.builtins-wasm32.a" \ + --export __wasm_call_ctors \ + ${WASMLD_ARGS} \ + --export-dynamic \ + --export malloc \ + --export free \ + --export __wasm_call_ctors \ + --export-table \ + --gc-sections \ + -O3 --lto-O3 \ + -lc++ -lc++abi \ + ${DIR}/obj/*.o \ + -o $OUTPUT diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h new file mode 100644 index 00000000000..28c2a724054 --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -0,0 +1,58 @@ +#pragma once + +/// +/// A collection of SimVar unit enums. +/// +class Units { +public: + ENUM Percent = get_units_enum("Percent"); + ENUM Pounds = get_units_enum("Pounds"); + ENUM Psi = get_units_enum("Psi"); + ENUM Pph = get_units_enum("Pounds per hour"); + ENUM Gallons = get_units_enum("Gallons"); + ENUM Feet = get_units_enum("Feet"); + ENUM FootPounds = get_units_enum("Foot pounds"); + ENUM FeetMin = get_units_enum("Feet per minute"); + ENUM Number = get_units_enum("Number"); + ENUM Mach = get_units_enum("Mach"); + ENUM Millibars = get_units_enum("Millibars"); + ENUM SluggerSlugs = get_units_enum("Slug per cubic feet"); + ENUM Celsius = get_units_enum("Celsius"); + ENUM Bool = get_units_enum("Bool"); + ENUM Hours = get_units_enum("Hours"); + ENUM Seconds = get_units_enum("Seconds"); +}; + +/// +/// A collection of SimVars and LVars for the A32NX +/// +class SimVars { +public: + Units* m_Units; + + /// + /// Collection of LVars for the A32NX + /// + ID DevVar; + ID RadAlt; + + SimVars() { this->initializeVars(); } + + void initializeVars() { + DevVar = register_named_variable("A32NX_DEVELOPER_STATE"); + RadAlt = register_named_variable("A32NX_RADAR_ALTIMETER"); + + //this->setDeveloperState(0); + this->setRadAlt(99999); + + + m_Units = new Units(); + } + // Collection of LVar 'set' Functions + void setDeveloperState(FLOAT64 value) { set_named_variable_value(DevVar, value); } + void setRadAlt(FLOAT64 value) { set_named_variable_value(RadAlt, value); } + + // Collection of SimVar/LVar 'get' Functions + FLOAT64 getDeveloperState() { return get_named_variable_value(DevVar); } + FLOAT64 getRadAlt() { return get_named_variable_value(RadAlt); } +}; \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h new file mode 100644 index 00000000000..b5e2fd22889 --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -0,0 +1,548 @@ +#pragma once + +#include "SimVars.h" + +HANDLE hSimConnect; +SimVars* simVars; + +double devState = 0.0; +bool debug = true; +double radAlt = 0.0; +double beamMin = 0.0; +double beamActual = 0.0; +double plane_alt = 0.0; // Debug +double probe_alt = 0.0; // Debug +double plane_abv = 0.0; // Debug +int test_i = 0; // Debug +int interval = 1; // Debug + +int quit = 0; + +//********************************************************************************** +// Key COMMON variables and functions +// Set up flags so these operations only happen once +static bool radarActive = false; + +const double PHI_2D = 1.32471795724474602596; // 2D Gloden Ratio +const double ALPHA_0 = 1 / PHI_2D; +const double ALPHA_1 = 1 / pow(PHI_2D, 2); +const double EARTH_RAD = 20888156.17; // earth's radius in feet +const int MAX_AI = 100; +const double H_ANGLE = 40; // in degrees +const double V_ANGLE = 20; // in degrees +const double MAX_BEAM_D = 8192; // in feet + +// convert degrees to radians +inline double deg2rad(double deg) +{ + return deg * (M_PI / 180.0); +} + +// convert radians to degrees +inline double rad2deg(double rad) +{ + return rad * (180.0 / M_PI); +} + +// find Minimum of two values +bool findMin(double a, double b) +{ + if (a < b) + return false; + else + return true; +} + + +// END of COMMON +//******************************************************************************* + +struct userStruct +{ + double altitude; + double altAbvGnd; + double latitude; + double longitude; + double heading; + double bank; + double pitch; +}; + +struct probeStruct +{ + double altitude; + double altAbvGnd; + double latitude; + double longitude; + double pitch; + double heading; +}; + +struct probeInfo +{ + SIMCONNECT_OBJECT_ID id; + bool created; +}; + +static enum EVENT_ID { + EVENT_RADAR_ON, + EVENT_RADAR_OFF, + EVENT_FREEZE_LATLONG, + EVENT_FREEZE_ALTITUDE, + EVENT_FREEZE_ATTITUDE +}; + +static enum DATA_DEFINE_ID { + DEFINITION_USER_POS, + DEFINITION_PROBE_POS +}; + +static enum DATA_REQUEST_ID { + REQUEST_USER_DATA, + REQUEST_PROBE_CREATE = 0x00100000, + REQUEST_PROBE_REMOVE = 0x00200000, + REQUEST_PROBE_DATA = 0x00300000, + //REQUEST_PROBE_RELEASE = 0x00400000 +}; + +static enum GROUP_ID { + GROUP_ZX, +}; + +static enum INPUT_ID { + INPUT_ZX, +}; + +// create varS to hold user plane position +userStruct user_pos; +probeStruct probe_pos; +probeInfo probe_info[MAX_AI]; + +// Returns new lat/ long probe coordinates for each probe +// Beam distance coded as pitch +// TO BE CHECKED +probeStruct distance_and_bearing(userStruct p, int probe_i) { + double r1, r2, probe_x, probe_y, rbearing, rdistance; + double rlat1, rlon1, rlat2, rlon2, x_dist, y_dist; + double cAltAbvGnd = p.altAbvGnd; + double cAltitude = p.altAbvGnd; + double cBank = p.bank; + double cPitch = p.pitch; + + /* Setting constrains */ + if (cAltAbvGnd > MAX_BEAM_D) + cAltAbvGnd = MAX_BEAM_D; + if (cBank > 1.56) + cBank = 1.56; + if (cBank < -1.56) + cBank = -1.56; + if (cPitch > 1.56) + cPitch = 1.56; + if (cPitch < -1.56) + cPitch = -1.56; + + probeStruct r; + + x_dist = tan(H_ANGLE * M_PI / 180) * cAltAbvGnd; + y_dist = tan(V_ANGLE * M_PI / 180) * cAltAbvGnd; + + // Quasi-random R2 + probe_x = (0.5 + (ALPHA_0 * probe_i)); + probe_y = (0.5 + (ALPHA_1 * probe_i)); + + probe_x = 2 * x_dist * (probe_x - (int)probe_x - 0.5) + (tan(cBank) * cAltAbvGnd); + probe_y = 2 * y_dist * (probe_y - (int)probe_y - 0.5) - (tan(cPitch) * cAltAbvGnd); + + rbearing = atan(probe_x / probe_y); // 2D top-down bearing (degrees) + rdistance = sqrt(pow(probe_x, 2) + pow(probe_y, 2)); // 2D top-down distance (feet) + + if (probe_y < 0) { + rbearing = rbearing + M_PI; + } + else if (probe_x < 0 && probe_y > 0) { + rbearing = (2 * M_PI) + rbearing; + } + + // LAT/LON Translation + rlat1 = deg2rad(p.latitude); + rlon1 = deg2rad(p.longitude); + rbearing = p.heading + rbearing; + + // New Coordinates + rlat2 = asin((sin(rlat1) * cos(rdistance / EARTH_RAD)) + (cos(rlat1) * sin(rdistance / EARTH_RAD) * cos(rbearing))); + rlon2 = rlon1 + (atan2(sin(rbearing) * sin(rdistance / EARTH_RAD) * cos(rlat1), cos(rdistance / EARTH_RAD) - sin(rlat1) * sin(rlat2))); + + r.latitude = rad2deg(rlat2); + r.longitude = rad2deg(rlon2); + + r.pitch = rdistance / 100; // used to represent 2D beam distance from aircraft to probe + r.heading = rbearing; + + return r; +} + +// Creates initial probe mesh when RA is turned on. Called by REQUEST_USER_DATA +void create_probe_mesh(int probe_i) +{ + SIMCONNECT_DATA_INITPOSITION Init; + HRESULT hr; + + devState = simVars->getDeveloperState(); + + probeStruct r = distance_and_bearing(user_pos, probe_i); + + if (debug) std::cout << "RADALT: Creating Probe (" << probe_i << ") .." << std::endl; + + // Initialize probe + Init.Latitude = r.latitude; + Init.Longitude = r.longitude; + Init.Altitude = 0.0; + Init.Pitch = 0.0; + Init.Bank = 0.0; + Init.Heading = 0.0; + Init.OnGround = 1; + Init.Airspeed = 0; + + if (devState == 3.0) + hr = SimConnect_AICreateSimulatedObject(hSimConnect, "ralt_probe", Init, (UINT)REQUEST_PROBE_CREATE + probe_i); + else + hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", Init, (UINT)REQUEST_PROBE_CREATE + probe_i); +} + +// Removes the probe mesh when RA is turned off. Called by REQUEST_PROBE_DATA +void remove_probe_mesh(int probe_i) { + + HRESULT hr; + + if (probe_info[probe_i].created) { + + if (debug) std::cout << "RADALT: Removing Probe (" << probe_i << ").." << std::endl; + probe_info[probe_i].created = false; + + hr = SimConnect_AIRemoveObject(hSimConnect, probe_info[probe_i].id, (UINT)REQUEST_PROBE_REMOVE + probe_i); + hr = SimConnect_RequestDataOnSimObject(hSimConnect, + (UINT)REQUEST_PROBE_DATA + probe_i, + DEFINITION_PROBE_POS, + probe_info[probe_i].id, + SIMCONNECT_PERIOD_NEVER); + if (probe_i == MAX_AI - 1) { + hr = SimConnect_RequestDataOnSimObject(hSimConnect, + REQUEST_USER_DATA, + DEFINITION_USER_POS, + SIMCONNECT_OBJECT_ID_USER, + SIMCONNECT_PERIOD_NEVER); + } + } +} + +// Function called everytime the aircraft's RA is ready to emit. Called by EVENT_RADAR_ON +void get_startup_data() { + HRESULT hr; + + if (debug) std::cout << "Entering get_startup_data()... " << std::endl; + + hr = SimConnect_RequestDataOnSimObject(hSimConnect, + REQUEST_USER_DATA, + DEFINITION_USER_POS, + SIMCONNECT_OBJECT_ID_USER, + SIMCONNECT_PERIOD_SIM_FRAME, + 0, 0, interval, 0); //SIMCONNECT_DATA_REQUEST_FLAG_CHANGED + + for (int i = 0; i < MAX_AI; i++) { + if (!radarActive) { + create_probe_mesh(i); + } + } + + radarActive = true; + +} + +// Function called to stop RA emission. Called by EVENT_RADAR_OFF +void remove_probes() { + + for (int i = 0; i < MAX_AI; i++) { + remove_probe_mesh(i); + } + radarActive = false; +} + +// Calls freeze events on each probe. Called within REQUEST_PROBE_CREATE +void probe_init(int probe_i) +{ + HRESULT hr; + //hr = SimConnect_AIReleaseControl(hSimConnect, probe_info[probe_i].id, (UINT)REQUEST_PROBE_RELEASE+probe_i); + + //hr = SimConnect_TransmitClientEvent(hSimConnect, + // probe_info[probe_i].id, + // EVENT_FREEZE_ALTITUDE, + // 1, // set freeze value to 1 + // SIMCONNECT_GROUP_PRIORITY_HIGHEST, + // SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + hr = SimConnect_TransmitClientEvent(hSimConnect, + probe_info[probe_i].id, + EVENT_FREEZE_ATTITUDE, + 1, // set freeze value to 1 + SIMCONNECT_GROUP_PRIORITY_HIGHEST, + SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + hr = SimConnect_TransmitClientEvent(hSimConnect, + probe_info[probe_i].id, + EVENT_FREEZE_LATLONG, + 1, // set freeze value to 1 + SIMCONNECT_GROUP_PRIORITY_HIGHEST, + SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); +} + +// Sets request for probe position while probes are being created. Called within REQUEST_PROBE_CREATE +void get_updated_probe(int probe_i) { + HRESULT hr; + + hr = SimConnect_RequestDataOnSimObject(hSimConnect, + (UINT)REQUEST_PROBE_DATA + probe_i, + DEFINITION_PROBE_POS, + probe_info[probe_i].id, + SIMCONNECT_PERIOD_SIM_FRAME, + 0, 0, interval, 0); // SIMCONNECT_DATA_REQUEST_FLAG_CHANGED + +} + +// Sets new probe mesh position. Called by REQUEST_PROBE_DATA +void update_probe_mesh(int probe_i) { + HRESULT hr; + + probeStruct r = distance_and_bearing(user_pos, probe_i); + + probe_pos.latitude = r.latitude; + probe_pos.longitude = r.longitude; + //probe_pos.altAbvGnd = 0.0; + probe_pos.pitch = r.pitch; + probe_pos.heading = r.heading; + + hr = SimConnect_SetDataOnSimObject(hSimConnect, + DEFINITION_PROBE_POS, + probe_info[probe_i].id, + 0, + 0, + sizeof(probeStruct), + &probe_pos); +} + +void read_probe_data(int probe_i, probeStruct probe_pos) { + + if (probe_i == 0) { + beamMin = 99999; + radAlt = 99999; + } + + beamActual = sqrt(pow(probe_pos.pitch * 100, 2) + pow(user_pos.altitude - probe_pos.altitude, 2)); + + if (findMin(beamMin, beamActual)) { + radAlt = user_pos.altitude - probe_pos.altitude; + beamMin = sqrt(pow(probe_pos.pitch * 100, 2) + pow(radAlt, 2)); + plane_alt = user_pos.altitude; // Debug + probe_alt = probe_pos.altitude; // Debug + plane_abv = user_pos.altAbvGnd; // Debug + test_i = probe_i; // Debug + } + + if (probe_i == MAX_AI - 1) { + if (radAlt > MAX_BEAM_D || beamMin > MAX_BEAM_D) + radAlt = 99999; + + simVars->setRadAlt(radAlt); + + if (debug) std::cout << "RADALT: Probe (" << test_i << + ") Plane_Alt: " << plane_alt << + " Probe_Alt: " << probe_alt << + " Plane_AltAbv: " << plane_abv << + " beamMin: " << beamMin << + " RA: " << radAlt << std::endl; + } +} + +static const char* ExceptionName(SIMCONNECT_EXCEPTION exception) { + switch (exception) { + case SIMCONNECT_EXCEPTION_NONE: //0 + return "EXCEPTION_NONE (0)"; + case SIMCONNECT_EXCEPTION_ERROR: //1 + return "EXCEPTION_ERROR (1)"; + case SIMCONNECT_EXCEPTION_SIZE_MISMATCH: //2 + return "EXCEPTION_SIZE_MISMATCH (2)"; + case SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID: //3 + return "EXCEPTION_UNRECOGNIZED_ID (3)"; + case SIMCONNECT_EXCEPTION_UNOPENED: //4 + return "EXCEPTION_UNOPENED (4)"; + case SIMCONNECT_EXCEPTION_VERSION_MISMATCH: //5 + return "EXCEPTION_VERSION_MISMATCH (5)"; + case SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS: //6 + return "EXCEPTION_TOO_MANY_GROUPS (6)"; + case SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED://7 + return "EXCEPTION_NAME_UNRECOGNIZED (7)"; + case SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES: //8 + return "EXCEPTION_TOO_MANY_EVENT_NAMES (8)"; + case SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE: //9 + return "EXCEPTION_EVENT_ID_DUPLICATE (9)"; + case SIMCONNECT_EXCEPTION_TOO_MANY_MAPS: //10 + return "EXCEPTION_TOO_MANY_MAPS (10)"; + case SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS: //11 + return "EXCEPTION_TOO_MANY_OBJECTS (11)"; + case SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS: //12 + return "EXCEPTION_TOO_MANY_REQUESTS (12)"; + case SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT: //13 + return "EXCEPTION_WEATHER_INVALID_PORT (13)"; + case SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR: //14 + return "EXCEPTION_WEATHER_INVALID_METAR (14)"; + case SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION://15 + return "EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION (15)"; + case SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION: //16 + return "EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION (16)"; + case SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION: //17 + return "EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION (17)"; + case SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE: //18 + return "EXCEPTION_INVALID_DATA_TYPE (18)"; + case SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE: //19 + return "EXCEPTION_INVALID_DATA_SIZE (19)"; + case SIMCONNECT_EXCEPTION_DATA_ERROR: //20 + return "EXCEPTION_DATA_ERROR (20)"; + case SIMCONNECT_EXCEPTION_INVALID_ARRAY: //21 + return "EXCEPTION_INVALID_ARRAY (21)"; + case SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED: //22 + return "EXCEPTION_CREATE_OBJECT_FAILED (22)"; + case SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED: //23 + return "EXCEPTION_LOAD_FLIGHTPLAN_FAILED (23)"; + case SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE://24 + return "EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE (24)"; + case SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION: //25 + return "EXCEPTION_ILLEGAL_OPERATION (25)"; + case SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED: //26 + return "EXCEPTION_ALREADY_SUBSCRIBED (26)"; + case SIMCONNECT_EXCEPTION_INVALID_ENUM: //27 + return "EXCEPTION_INVALID_ENUM (27)"; + case SIMCONNECT_EXCEPTION_DEFINITION_ERROR: //28 + return "EXCEPTION_DEFINITION_ERROR (28)"; + case SIMCONNECT_EXCEPTION_DUPLICATE_ID: //29 + return "EXCEPTION_DUPLICATE_ID (29)"; + case SIMCONNECT_EXCEPTION_DATUM_ID: //30 + return "EXCEPTION_DATUM_ID (30)"; + case SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS: //31 + return "EXCEPTION_OUT_OF_BOUNDS (31)"; + case SIMCONNECT_EXCEPTION_ALREADY_CREATED: //32 + return "EXCEPTION_ALREADY_CREATED (32)"; + case SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE://33 + return "EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE (33)"; + case SIMCONNECT_EXCEPTION_OBJECT_CONTAINER: //34 + return "EXCEPTION_OBJECT_CONTAINER (34)"; + case SIMCONNECT_EXCEPTION_OBJECT_AI: //35 + return "EXCEPTION_OBJECT_AI (35)"; + case SIMCONNECT_EXCEPTION_OBJECT_ATC: //36 + return "EXCEPTION_OBJECT_ATC (36)"; + case SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE: //37 + return "EXCEPTION_OBJECT_SCHEDULE (37)"; + default: + return "UNKNOWN EXCEPTION"; + } +} +void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext) +{ + switch (pData->dwID) + { + case SIMCONNECT_RECV_ID_EVENT: + { + SIMCONNECT_RECV_EVENT* evt = (SIMCONNECT_RECV_EVENT*)pData; + + switch (evt->uEventID) + { + case EVENT_RADAR_ON: + if (!radarActive) + { + simVars = new SimVars(); + get_startup_data(); + } + break; + case EVENT_RADAR_OFF: + if (radarActive) + { + remove_probes(); + } + break; + default: + std::cout << "RADALT: Unknown event: " << evt->uEventID << std::endl; + break; + } + break; + } + case SIMCONNECT_RECV_ID_SIMOBJECT_DATA: + { + SIMCONNECT_RECV_SIMOBJECT_DATA* pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA*)pData; + + if (pObjData->dwRequestID >= (UINT)REQUEST_PROBE_DATA && + pObjData->dwRequestID < (UINT)REQUEST_PROBE_DATA + MAX_AI) { + + UINT probe_i = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_DATA; + + probeStruct* pS = (probeStruct*)&pObjData->dwData; + + probe_pos.altitude = pS->altitude; + probe_pos.altAbvGnd = pS->altAbvGnd; + probe_pos.latitude = pS->latitude; + probe_pos.longitude = pS->longitude; + probe_pos.pitch = pS->pitch; // ground distance + probe_pos.heading = pS->heading; // ground bearing + + update_probe_mesh(probe_i); + read_probe_data(probe_i, probe_pos); + + } + else if (pObjData->dwRequestID == (UINT)REQUEST_USER_DATA) { + userStruct* uS = (userStruct*)&pObjData->dwData; + + user_pos.altitude = uS->altitude; + user_pos.altAbvGnd = uS->altAbvGnd; + user_pos.latitude = uS->latitude; + user_pos.longitude = uS->longitude; + user_pos.heading = uS->heading; + user_pos.bank = uS->bank; + user_pos.pitch = uS->pitch; + + } + break; + } + case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID: + { + SIMCONNECT_RECV_ASSIGNED_OBJECT_ID* pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData; + + if (pObjData->dwRequestID >= (UINT)REQUEST_PROBE_CREATE && + pObjData->dwRequestID < (UINT)REQUEST_PROBE_CREATE + MAX_AI) { + + UINT probe_i = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_CREATE; + probe_info[probe_i].id = pObjData->dwObjectID; + probe_info[probe_i].created = true; + + probe_init(probe_i); + + if (debug) std::cout << "Created probe id = " << probe_info[probe_i].id << std::endl; + + get_updated_probe(probe_i); + } + else { + if (debug) std::cout << "Unknown creation %d" << pObjData->dwRequestID << std::endl; + } + break; + } + case SIMCONNECT_RECV_ID_QUIT: + { + quit = 1; + break; + } + case SIMCONNECT_RECV_ID_EXCEPTION: + { + SIMCONNECT_RECV_EXCEPTION* data = (SIMCONNECT_RECV_EXCEPTION*)(pData); + SIMCONNECT_EXCEPTION exception = (SIMCONNECT_EXCEPTION)(data->dwException); + std::cout << "Exception: " << ExceptionName(exception) << std::endl; + break; + } + default: + std::cout << "Received: " << pData->dwID << std::endl; + break; + } +} \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp new file mode 100644 index 00000000000..a8019256791 --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp @@ -0,0 +1,21 @@ +#include "radaltGauge.h" + +RadaltGauge RADALT_GAUGE; + +__attribute__((export_name("RadAlt_gauge_callback"))) extern "C" MSFS_CALLBACK bool RadAlt_gauge_callback(FsContext ctx, int service_id, void* pData) { + switch (service_id) { + case PANEL_SERVICE_PRE_INSTALL: { + return true; + } break; + case PANEL_SERVICE_POST_INSTALL: + return RADALT_GAUGE.initializeRA(); + break; + + case PANEL_SERVICE_PRE_KILL: + RADALT_GAUGE.killRA(); + return true; + break; + } + + return true; +} \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h new file mode 100644 index 00000000000..742e9e5d8e1 --- /dev/null +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h @@ -0,0 +1,118 @@ +#pragma once + +#ifndef __INTELLISENSE__ +#define MODULE_EXPORT __attribute__((visibility("default"))) +#define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod))) +#else +#define MODULE_EXPORT +#define MODULE_WASM_MODNAME(mod) +#define __attribute__(x) +#define __restrict__ +#endif + +#include +#include +#include +#include + +#include +#include + +#include "radaltControl.h" +#include "SimVars.h" + +class RadaltGauge { +private: + bool isConnected = false; + + /// + /// Initializes the connection to SimConnect + /// + /// True if successful, false otherwise. + bool initializeSimConnect() + { + std::cout << "RADALT: Connecting to SimConnect..." << std::endl; + if (SUCCEEDED(SimConnect_Open(&hSimConnect, "RadAlt", nullptr, 0, 0, 0))) + { + std::cout << "RADALT: SimConnect connected." << std::endl; + + // Defining User Airraft Position + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Altitude", "feet"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Alt Above Ground", "feet"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Latitude", "degrees"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Longitude", "degrees"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Heading Degrees True", "radians"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Bank Degrees", "radians"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_USER_POS, "Plane Pitch Degrees", "radians"); + + // Set up the probe data definition, but do not yet do anything with it + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Altitude", "feet"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Alt Above Ground", "feet"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Latitude", "degrees"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Longitude", "degrees"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Pitch Degrees", "degrees"); + SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Heading Degrees True", "radians"); + + // Create some private events + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_RADAR_ON); + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_RADAR_OFF); + + // Link the private events to keyboard keys, and ensure the input events are off + SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_ZX, "Z", EVENT_RADAR_ON); + SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_ZX, "C", EVENT_RADAR_OFF); + + SimConnect_SetInputGroupState(hSimConnect, INPUT_ZX, SIMCONNECT_STATE_OFF); + + // set the id for the freeze events so this client has full control of probe objects + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_LATLONG, "FREEZE_LATITUDE_LONGITUDE_SET"); + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ALTITUDE, "FREEZE_ALTITUDE_SET"); + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ATTITUDE, "FREEZE_ATTITUDE_SET"); + + // Sign up for notifications + SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_ZX, EVENT_RADAR_ON); + SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_ZX, EVENT_RADAR_OFF); + + SimConnect_SetInputGroupState(hSimConnect, INPUT_ZX, SIMCONNECT_STATE_ON); + + std::cout << "RADALT: SimConnect registrations complete." << std::endl; + + return true; + } + + std::cout << "RADALT: SimConnect failed." << std::endl; + + return false; + } + +public: + /// + /// Initializes the RADALT control + /// + /// True if successful, false otherwise. + bool initializeRA() { + if (!this->initializeSimConnect()) { + std::cout << "RADALT: Init SimConnect failed." << std::endl; + return false; + } + + isConnected = true; + SimConnect_CallDispatch(hSimConnect, RadaltDispatchProc, this); + + return true; + } + + /// + /// Kills the RADALT and unregisters all LVars + /// + /// True if successful, false otherwise. + bool killRA() { + std::cout << "RADALT: Disconnecting ..." << std::endl; + //EngineControlInstance.terminate(); + + isConnected = false; + unregister_all_named_vars(); + + std::cout << "RADALT: Disconnected." << std::endl; + return SUCCEEDED(SimConnect_Close(hSimConnect)); + } +}; \ No newline at end of file diff --git a/igniter.config.mjs b/igniter.config.mjs index 860d4b12cc4..306ecc0c4a1 100644 --- a/igniter.config.mjs +++ b/igniter.config.mjs @@ -84,6 +84,12 @@ export default new TaskOfTasks("all", [ "fbw-common/src/wasm/fbw_common", "fbw-common/src/wasm/fadec_common", "fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/fadec.wasm" + ]), + new ExecTask("systems-radalt", + "npm run build-a32nx:radalt", + [ + "fbw-a32nx/src/wasm/radalt_a320", + "fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/radalt.wasm" ]), new ExecTask("systems-fbw", "npm run build-a32nx:fbw", diff --git a/package.json b/package.json index 57f44a9efa3..20df88a9449 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "build-a32nx:systems": "cargo build -p a320_systems_wasm --target wasm32-wasi --release && wasm-opt -O1 -o /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/systems.wasm /external/target/wasm32-wasi/release/a320_systems_wasm.wasm", "build-a32nx:fadec": "cd fbw-a32nx/src/wasm/fadec_a320 && ./build.sh && wasm-opt -O1 -o /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/fadec.wasm /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/fadec.wasm", + "build-a32nx:radalt": "cd fbw-a32nx/src/wasm/radalt_a320 && ./build.sh && wasm-opt -O1 -o /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/radalt.wasm /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/radalt.wasm", "build-a32nx:fbw": "cd fbw-a32nx/src/wasm/fbw_a320 && ./build.sh && wasm-opt -O1 -o /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/fbw.wasm /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/fbw.wasm", "build-a32nx:flypad-backend": "cd fbw-a32nx/src/wasm/flypad-backend && ./build.sh && wasm-opt -O1 -o /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/flypad-backend.wasm /external/fbw-a32nx/out/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/flypad-backend.wasm", @@ -44,7 +45,7 @@ "prettier": "prettier --write **/*.json **/*.yml fbw-a32nx/src/systems/instruments/**/*.css", - "build-a32nx:all": "npm run build-a32nx:copy-base-files && npm run build-a32nx:efb-translation && npm run build-a32nx:model && npm run build-a32nx:behavior && npm run build-a32nx:atsu && npm run build-a32nx:failures && npm run build-a32nx:fmgc && npm run build-a32nx:sentry-client && npm run build-a32nx:simbridge-client && npm run build-a32nx:tcas && npm run build-a32nx:pfd && npm run build-a32nx:systems && npm run build-a32nx:fadec && npm run build-a32nx:fbw && npm run build-a32nx:flypad-backend && npm run build-a32nx:metadata && npm run build-a32nx:manifest", + "build-a32nx:all": "npm run build-a32nx:copy-base-files && npm run build-a32nx:efb-translation && npm run build-a32nx:model && npm run build-a32nx:behavior && npm run build-a32nx:atsu && npm run build-a32nx:failures && npm run build-a32nx:fmgc && npm run build-a32nx:sentry-client && npm run build-a32nx:simbridge-client && npm run build-a32nx:tcas && npm run build-a32nx:pfd && npm run build-a32nx:systems && npm run build-a32nx:fadec && npm run build-a32nx:radalt && npm run build-a32nx:fbw && npm run build-a32nx:flypad-backend && npm run build-a32nx:metadata && npm run build-a32nx:manifest", "====== A380 =================": "==========================================", From 123f408955b21afb0267db20b45dd812dc7fe544 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Sun, 19 Feb 2023 18:07:12 +0100 Subject: [PATCH 02/20] feat(RA): RA model based on a probe mesh implementation --- fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 2 +- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h index 28c2a724054..72114426902 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -40,7 +40,7 @@ class SimVars { void initializeVars() { DevVar = register_named_variable("A32NX_DEVELOPER_STATE"); - RadAlt = register_named_variable("A32NX_RADAR_ALTIMETER"); + RadAlt = register_named_variable("A32NX_RA_RAW"); //this->setDeveloperState(0); this->setRadAlt(99999); diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index b5e2fd22889..28a3572cf88 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -338,7 +338,7 @@ void read_probe_data(int probe_i, probeStruct probe_pos) { if (findMin(beamMin, beamActual)) { radAlt = user_pos.altitude - probe_pos.altitude; - beamMin = sqrt(pow(probe_pos.pitch * 100, 2) + pow(radAlt, 2)); + beamMin = beamActual; plane_alt = user_pos.altitude; // Debug probe_alt = probe_pos.altitude; // Debug plane_abv = user_pos.altAbvGnd; // Debug From ce4fb6d93d9cbcd92f6e8b01e0d287d04131b74c Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Mon, 20 Mar 2023 12:51:44 +0100 Subject: [PATCH 03/20] feat: baseline for RA calculation by signal SNR --- fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 6 +- .../src/wasm/radalt_a320/src/radaltControl.h | 373 +++++++++--------- 2 files changed, 193 insertions(+), 186 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h index 72114426902..33a9acf3f3e 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -43,16 +43,16 @@ class SimVars { RadAlt = register_named_variable("A32NX_RA_RAW"); //this->setDeveloperState(0); - this->setRadAlt(99999); + this->setRadarAltitude(99999); m_Units = new Units(); } // Collection of LVar 'set' Functions void setDeveloperState(FLOAT64 value) { set_named_variable_value(DevVar, value); } - void setRadAlt(FLOAT64 value) { set_named_variable_value(RadAlt, value); } + void setRadarAltitude(FLOAT64 value) { set_named_variable_value(RadAlt, value); } // Collection of SimVar/LVar 'get' Functions FLOAT64 getDeveloperState() { return get_named_variable_value(DevVar); } - FLOAT64 getRadAlt() { return get_named_variable_value(RadAlt); } + FLOAT64 getRadarAltitude() { return get_named_variable_value(RadAlt); } }; \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 28a3572cf88..36846343b8e 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -7,60 +7,70 @@ SimVars* simVars; double devState = 0.0; bool debug = true; -double radAlt = 0.0; -double beamMin = 0.0; +double radarAltitude = 0.0; +double snrMax = 0.0; double beamActual = 0.0; -double plane_alt = 0.0; // Debug -double probe_alt = 0.0; // Debug -double plane_abv = 0.0; // Debug -int test_i = 0; // Debug +double beamMin = 0.0; // Debug +double snrActual = 0.0; +double planeAltitude = 0.0; // Debug +double probeAltitude = 0.0; // Debug +double planeAboveGround = 0.0; // Debug +int testIndex = 0; // Debug int interval = 1; // Debug - int quit = 0; -//********************************************************************************** -// Key COMMON variables and functions -// Set up flags so these operations only happen once static bool radarActive = false; -const double PHI_2D = 1.32471795724474602596; // 2D Gloden Ratio -const double ALPHA_0 = 1 / PHI_2D; -const double ALPHA_1 = 1 / pow(PHI_2D, 2); -const double EARTH_RAD = 20888156.17; // earth's radius in feet -const int MAX_AI = 100; -const double H_ANGLE = 40; // in degrees -const double V_ANGLE = 20; // in degrees -const double MAX_BEAM_D = 8192; // in feet +constexpr int MAX_AI = 100; +constexpr double PI = 3.141592653589790; +constexpr double PI_FOURTH = 97.4090910340024; +constexpr double DEG_TO_RAD = PI / 180.0; +constexpr double RAD_TO_DEG = 180.0 / PI; +constexpr double PHI_2D = 1.32471795724474602596; // 2D golden ratio +constexpr double ALPHA_0 = 1 / PHI_2D; +constexpr double ALPHA_1 = ALPHA_0 * ALPHA_0; +constexpr double EARTH_RAD = 20888156.17; // earth's radius in feet +constexpr double LIGHT_SPEED = 299792458; // speed of light in m/s +constexpr double POWER_TX = 0.1; // peak transmit power in Watts (20 dBm) +constexpr double GAIN_ANTENNA = 10; // transmit/ receive antenna gain (unitless) +constexpr double WAVELENGTH_SQUARED = 4.8607635E-03; // wavelength in meters for a 4.3 GHz signal +constexpr double RCS = 16709011; // radar cross section in meter^2 for a 1 x 1 meter terrain sample +constexpr double NOISE_FLOOR = -140; // noise floor in dBm + +constexpr double MAX_ANGLE = 1.56; // around 90 degree limit +constexpr double H_ANGLE = 40; // in degrees +constexpr double V_ANGLE = 20; // in degrees +constexpr double MAX_BEAM_DISTANCE = 8192; // in feet + +constexpr double GAIN_FACTOR = 2.0 * POWER_TX * GAIN_ANTENNA * WAVELENGTH_SQUARED * RCS; +constexpr double PI_FACTOR = 4.0 * PI_FOURTH; +constexpr double K = GAIN_FACTOR / PI_FACTOR; + +const double TAN_H_ANGLE = tan(H_ANGLE * DEG_TO_RAD); +const double TAN_V_ANGLE = tan(V_ANGLE * DEG_TO_RAD); // convert degrees to radians inline double deg2rad(double deg) { - return deg * (M_PI / 180.0); + return deg * DEG_TO_RAD; } // convert radians to degrees inline double rad2deg(double rad) { - return rad * (180.0 / M_PI); + return rad * RAD_TO_DEG; } -// find Minimum of two values -bool findMin(double a, double b) +// finds maximum of two values +bool isNewSnrMax(double newSnr, double maxSnr) { - if (a < b) - return false; - else - return true; + return newSnr > maxSnr; } - -// END of COMMON -//******************************************************************************* - -struct userStruct +struct UserStruct { double altitude; - double altAbvGnd; + double altitudeAboveGround; double latitude; double longitude; double heading; @@ -68,17 +78,17 @@ struct userStruct double pitch; }; -struct probeStruct +struct ProbeStruct { double altitude; - double altAbvGnd; + double altitudeAboveGround; double latitude; double longitude; double pitch; double heading; }; -struct probeInfo +struct ProbeInfo { SIMCONNECT_OBJECT_ID id; bool created; @@ -114,118 +124,114 @@ static enum INPUT_ID { }; // create varS to hold user plane position -userStruct user_pos; -probeStruct probe_pos; -probeInfo probe_info[MAX_AI]; +UserStruct userPosition; +ProbeStruct probePosition; +ProbeInfo probeIndexnfo[MAX_AI]; + +double probeSNR(double beamActual) { + return 10 * std::log10(K / std::pow(beamActual, 4)); +} // Returns new lat/ long probe coordinates for each probe // Beam distance coded as pitch // TO BE CHECKED -probeStruct distance_and_bearing(userStruct p, int probe_i) { - double r1, r2, probe_x, probe_y, rbearing, rdistance; - double rlat1, rlon1, rlat2, rlon2, x_dist, y_dist; - double cAltAbvGnd = p.altAbvGnd; - double cAltitude = p.altAbvGnd; - double cBank = p.bank; - double cPitch = p.pitch; +ProbeStruct distanceAndBearing(UserStruct user, int probeIndex) { + double probeX, probeY, bearing, distance; + double lat1, lon1, lat2, lon2, xDist, yDist; + double altitudeAboveGround = user.altitudeAboveGround; + double bank = user.bank; + double pitch = user.pitch; /* Setting constrains */ - if (cAltAbvGnd > MAX_BEAM_D) - cAltAbvGnd = MAX_BEAM_D; - if (cBank > 1.56) - cBank = 1.56; - if (cBank < -1.56) - cBank = -1.56; - if (cPitch > 1.56) - cPitch = 1.56; - if (cPitch < -1.56) - cPitch = -1.56; - - probeStruct r; - - x_dist = tan(H_ANGLE * M_PI / 180) * cAltAbvGnd; - y_dist = tan(V_ANGLE * M_PI / 180) * cAltAbvGnd; + altitudeAboveGround = (altitudeAboveGround > MAX_BEAM_DISTANCE) ? MAX_BEAM_DISTANCE : altitudeAboveGround; + bank = (bank > MAX_ANGLE) ? MAX_ANGLE : ((bank < -MAX_ANGLE) ? -MAX_ANGLE : bank); + pitch = (pitch > MAX_ANGLE) ? MAX_ANGLE : ((pitch < -MAX_ANGLE) ? -MAX_ANGLE : pitch); + + ProbeStruct probe; + + xDist = TAN_H_ANGLE * altitudeAboveGround; + yDist = TAN_V_ANGLE * altitudeAboveGround; // Quasi-random R2 - probe_x = (0.5 + (ALPHA_0 * probe_i)); - probe_y = (0.5 + (ALPHA_1 * probe_i)); + probeX = (0.5 + (ALPHA_0 * probeIndex)); + probeY = (0.5 + (ALPHA_1 * probeIndex)); - probe_x = 2 * x_dist * (probe_x - (int)probe_x - 0.5) + (tan(cBank) * cAltAbvGnd); - probe_y = 2 * y_dist * (probe_y - (int)probe_y - 0.5) - (tan(cPitch) * cAltAbvGnd); + probeX = 2 * xDist * (probeX - (int)probeX - 0.5) + (tan(bank) * altitudeAboveGround); + probeY = 2 * yDist * (probeY - (int)probeY - 0.5) - (tan(pitch) * altitudeAboveGround); - rbearing = atan(probe_x / probe_y); // 2D top-down bearing (degrees) - rdistance = sqrt(pow(probe_x, 2) + pow(probe_y, 2)); // 2D top-down distance (feet) + bearing = atan(probeX / probeY); // 2D top-down bearing (degrees) + distance = sqrt(pow(probeX, 2) + pow(probeY, 2)); // 2D top-down distance (feet) - if (probe_y < 0) { - rbearing = rbearing + M_PI; + if (probeY < 0) { + bearing = bearing + PI; } - else if (probe_x < 0 && probe_y > 0) { - rbearing = (2 * M_PI) + rbearing; + else if (probeX < 0 && probeY > 0) { + bearing = (2 * PI) + bearing; } // LAT/LON Translation - rlat1 = deg2rad(p.latitude); - rlon1 = deg2rad(p.longitude); - rbearing = p.heading + rbearing; + lat1 = deg2rad(user.latitude); + lon1 = deg2rad(user.longitude); + bearing = user.heading + bearing; // New Coordinates - rlat2 = asin((sin(rlat1) * cos(rdistance / EARTH_RAD)) + (cos(rlat1) * sin(rdistance / EARTH_RAD) * cos(rbearing))); - rlon2 = rlon1 + (atan2(sin(rbearing) * sin(rdistance / EARTH_RAD) * cos(rlat1), cos(rdistance / EARTH_RAD) - sin(rlat1) * sin(rlat2))); + lat2 = asin((sin(lat1) * cos(distance / EARTH_RAD)) + (cos(lat1) * sin(distance / EARTH_RAD) * cos(bearing))); + lon2 = lon1 + (atan2(sin(bearing) * sin(distance / EARTH_RAD) * cos(lat1), cos(distance / EARTH_RAD) - sin(lat1) * sin(lat2))); - r.latitude = rad2deg(rlat2); - r.longitude = rad2deg(rlon2); + probe.latitude = rad2deg(lat2); + probe.longitude = rad2deg(lon2); - r.pitch = rdistance / 100; // used to represent 2D beam distance from aircraft to probe - r.heading = rbearing; + probe.pitch = distance / 100; // used to represent 2D beam distance from aircraft to probe + probe.heading = bearing; - return r; + return probe; } // Creates initial probe mesh when RA is turned on. Called by REQUEST_USER_DATA -void create_probe_mesh(int probe_i) +void createProbeMesh(int probeIndex) { - SIMCONNECT_DATA_INITPOSITION Init; + SIMCONNECT_DATA_INITPOSITION initPosition; HRESULT hr; devState = simVars->getDeveloperState(); - probeStruct r = distance_and_bearing(user_pos, probe_i); + ProbeStruct probeResult = distanceAndBearing(userPosition, probeIndex); - if (debug) std::cout << "RADALT: Creating Probe (" << probe_i << ") .." << std::endl; + if (debug) std::cout << "RADALT: Creating Probe (" << probeIndex << ") .." << std::endl; // Initialize probe - Init.Latitude = r.latitude; - Init.Longitude = r.longitude; - Init.Altitude = 0.0; - Init.Pitch = 0.0; - Init.Bank = 0.0; - Init.Heading = 0.0; - Init.OnGround = 1; - Init.Airspeed = 0; - - if (devState == 3.0) - hr = SimConnect_AICreateSimulatedObject(hSimConnect, "ralt_probe", Init, (UINT)REQUEST_PROBE_CREATE + probe_i); + initPosition.Latitude = probeResult.latitude; + initPosition.Longitude = probeResult.longitude; + initPosition.Altitude = 0.0; + initPosition.Pitch = 0.0; + initPosition.Bank = 0.0; + initPosition.Heading = 0.0; + initPosition.OnGround = 1; + initPosition.Airspeed = 0; + + if (devState == 3.0) + hr = SimConnect_AICreateSimulatedObject(hSimConnect, "ralt_probe", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); else - hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", Init, (UINT)REQUEST_PROBE_CREATE + probe_i); + hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); } // Removes the probe mesh when RA is turned off. Called by REQUEST_PROBE_DATA -void remove_probe_mesh(int probe_i) { +void removeProbeMesh(int probeIndex) { HRESULT hr; - if (probe_info[probe_i].created) { + if (probeIndexnfo[probeIndex].created) { - if (debug) std::cout << "RADALT: Removing Probe (" << probe_i << ").." << std::endl; - probe_info[probe_i].created = false; + if (debug) std::cout << "RADALT: Removing Probe (" << probeIndex << ").." << std::endl; + probeIndexnfo[probeIndex].created = false; - hr = SimConnect_AIRemoveObject(hSimConnect, probe_info[probe_i].id, (UINT)REQUEST_PROBE_REMOVE + probe_i); + hr = SimConnect_AIRemoveObject(hSimConnect, probeIndexnfo[probeIndex].id, (UINT)REQUEST_PROBE_REMOVE + probeIndex); hr = SimConnect_RequestDataOnSimObject(hSimConnect, - (UINT)REQUEST_PROBE_DATA + probe_i, + (UINT)REQUEST_PROBE_DATA + probeIndex, DEFINITION_PROBE_POS, - probe_info[probe_i].id, + probeIndexnfo[probeIndex].id, SIMCONNECT_PERIOD_NEVER); - if (probe_i == MAX_AI - 1) { + if (probeIndex == MAX_AI - 1) { hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_USER_DATA, DEFINITION_USER_POS, @@ -236,10 +242,10 @@ void remove_probe_mesh(int probe_i) { } // Function called everytime the aircraft's RA is ready to emit. Called by EVENT_RADAR_ON -void get_startup_data() { +void getStartupData() { HRESULT hr; - if (debug) std::cout << "Entering get_startup_data()... " << std::endl; + if (debug) std::cout << "Entering getStartupData()... " << std::endl; hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_USER_DATA, @@ -250,43 +256,42 @@ void get_startup_data() { for (int i = 0; i < MAX_AI; i++) { if (!radarActive) { - create_probe_mesh(i); + createProbeMesh(i); } } radarActive = true; - } // Function called to stop RA emission. Called by EVENT_RADAR_OFF -void remove_probes() { +void removeProbes() { for (int i = 0; i < MAX_AI; i++) { - remove_probe_mesh(i); + removeProbeMesh(i); } radarActive = false; } // Calls freeze events on each probe. Called within REQUEST_PROBE_CREATE -void probe_init(int probe_i) +void probeInit(int probeIndex) { HRESULT hr; - //hr = SimConnect_AIReleaseControl(hSimConnect, probe_info[probe_i].id, (UINT)REQUEST_PROBE_RELEASE+probe_i); + //hr = SimConnect_AIReleaseControl(hSimConnect, probeIndexnfo[probeIndex].id, (UINT)REQUEST_PROBE_RELEASE+probeIndex); //hr = SimConnect_TransmitClientEvent(hSimConnect, - // probe_info[probe_i].id, - // EVENT_FREEZE_ALTITUDE, - // 1, // set freeze value to 1 - // SIMCONNECT_GROUP_PRIORITY_HIGHEST, - // SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + // probeIndexnfo[probeIndex].id, + // EVENT_FREEZE_ALTITUDE, + // 1, // set freeze value to 1 + // SIMCONNECT_GROUP_PRIORITY_HIGHEST, + // SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); hr = SimConnect_TransmitClientEvent(hSimConnect, - probe_info[probe_i].id, + probeIndexnfo[probeIndex].id, EVENT_FREEZE_ATTITUDE, 1, // set freeze value to 1 SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); hr = SimConnect_TransmitClientEvent(hSimConnect, - probe_info[probe_i].id, + probeIndexnfo[probeIndex].id, EVENT_FREEZE_LATLONG, 1, // set freeze value to 1 SIMCONNECT_GROUP_PRIORITY_HIGHEST, @@ -294,69 +299,71 @@ void probe_init(int probe_i) } // Sets request for probe position while probes are being created. Called within REQUEST_PROBE_CREATE -void get_updated_probe(int probe_i) { +void getUpdatedProbe(int probeIndex) { HRESULT hr; hr = SimConnect_RequestDataOnSimObject(hSimConnect, - (UINT)REQUEST_PROBE_DATA + probe_i, + (UINT)REQUEST_PROBE_DATA + probeIndex, DEFINITION_PROBE_POS, - probe_info[probe_i].id, + probeIndexnfo[probeIndex].id, SIMCONNECT_PERIOD_SIM_FRAME, 0, 0, interval, 0); // SIMCONNECT_DATA_REQUEST_FLAG_CHANGED } // Sets new probe mesh position. Called by REQUEST_PROBE_DATA -void update_probe_mesh(int probe_i) { +void updateProbeMesh(int probeIndex) { HRESULT hr; - probeStruct r = distance_and_bearing(user_pos, probe_i); + ProbeStruct probe = distanceAndBearing(userPosition, probeIndex); - probe_pos.latitude = r.latitude; - probe_pos.longitude = r.longitude; - //probe_pos.altAbvGnd = 0.0; - probe_pos.pitch = r.pitch; - probe_pos.heading = r.heading; + probePosition.latitude = probe.latitude; + probePosition.longitude = probe.longitude; + probePosition.altitudeAboveGround = 0.0; + probePosition.pitch = probe.pitch; + probePosition.heading = probe.heading; hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_PROBE_POS, - probe_info[probe_i].id, + probeIndexnfo[probeIndex].id, 0, 0, - sizeof(probeStruct), - &probe_pos); + sizeof(ProbeStruct), + &probePosition); } -void read_probe_data(int probe_i, probeStruct probe_pos) { - - if (probe_i == 0) { - beamMin = 99999; - radAlt = 99999; +void readProbeData(int probeIndex, ProbeStruct probePosition) { + if (probeIndex == 0) { + snrMax = -99999; + radarAltitude = 99999; } - beamActual = sqrt(pow(probe_pos.pitch * 100, 2) + pow(user_pos.altitude - probe_pos.altitude, 2)); - - if (findMin(beamMin, beamActual)) { - radAlt = user_pos.altitude - probe_pos.altitude; - beamMin = beamActual; - plane_alt = user_pos.altitude; // Debug - probe_alt = probe_pos.altitude; // Debug - plane_abv = user_pos.altAbvGnd; // Debug - test_i = probe_i; // Debug + beamActual = sqrt(pow(probePosition.pitch * 100, 2) + pow(userPosition.altitude - probePosition.altitude, 2)); + snrActual = probeSNR(beamActual); + + if (isNewSnrMax(snrActual, snrMax)) { + radarAltitude = userPosition.altitude - probePosition.altitude; + snrMax = snrActual; + planeAltitude = userPosition.altitude; // Debug + probeAltitude = probePosition.altitude; // Debug + planeAboveGround = userPosition.altitudeAboveGround; // Debug + testIndex = probeIndex; // Debug } - if (probe_i == MAX_AI - 1) { - if (radAlt > MAX_BEAM_D || beamMin > MAX_BEAM_D) - radAlt = 99999; + if (probeIndex == MAX_AI - 1) { + if (radarAltitude > MAX_BEAM_DISTANCE || snrMax < NOISE_FLOOR) + radarAltitude = 99999; - simVars->setRadAlt(radAlt); + simVars->setRadarAltitude(radarAltitude); - if (debug) std::cout << "RADALT: Probe (" << test_i << - ") Plane_Alt: " << plane_alt << - " Probe_Alt: " << probe_alt << - " Plane_AltAbv: " << plane_abv << - " beamMin: " << beamMin << - " RA: " << radAlt << std::endl; + if (debug) { + std::cout << "RADALT: SNR Probe (" << testIndex << + ") Plane_Alt: " << planeAltitude << + " Probe_Alt: " << probeAltitude << + " Plane_AltAbv: " << planeAboveGround << + " SNR: " << snrMax << + " RA: " << radarAltitude << std::endl; + } } } @@ -443,7 +450,7 @@ static const char* ExceptionName(SIMCONNECT_EXCEPTION exception) { } } void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext) -{ +{ switch (pData->dwID) { case SIMCONNECT_RECV_ID_EVENT: @@ -456,13 +463,13 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo if (!radarActive) { simVars = new SimVars(); - get_startup_data(); + getStartupData(); } break; case EVENT_RADAR_OFF: if (radarActive) { - remove_probes(); + removeProbes(); } break; default: @@ -478,31 +485,31 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo if (pObjData->dwRequestID >= (UINT)REQUEST_PROBE_DATA && pObjData->dwRequestID < (UINT)REQUEST_PROBE_DATA + MAX_AI) { - UINT probe_i = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_DATA; + UINT probeIndex = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_DATA; - probeStruct* pS = (probeStruct*)&pObjData->dwData; + ProbeStruct* pS = (ProbeStruct*)&pObjData->dwData; - probe_pos.altitude = pS->altitude; - probe_pos.altAbvGnd = pS->altAbvGnd; - probe_pos.latitude = pS->latitude; - probe_pos.longitude = pS->longitude; - probe_pos.pitch = pS->pitch; // ground distance - probe_pos.heading = pS->heading; // ground bearing + probePosition.altitude = pS->altitude; + probePosition.altitudeAboveGround = pS->altitudeAboveGround; + probePosition.latitude = pS->latitude; + probePosition.longitude = pS->longitude; + probePosition.pitch = pS->pitch; // ground distance + probePosition.heading = pS->heading; // ground bearing - update_probe_mesh(probe_i); - read_probe_data(probe_i, probe_pos); + updateProbeMesh(probeIndex); + readProbeData(probeIndex, probePosition); } else if (pObjData->dwRequestID == (UINT)REQUEST_USER_DATA) { - userStruct* uS = (userStruct*)&pObjData->dwData; + UserStruct* uS = (UserStruct*)&pObjData->dwData; - user_pos.altitude = uS->altitude; - user_pos.altAbvGnd = uS->altAbvGnd; - user_pos.latitude = uS->latitude; - user_pos.longitude = uS->longitude; - user_pos.heading = uS->heading; - user_pos.bank = uS->bank; - user_pos.pitch = uS->pitch; + userPosition.altitude = uS->altitude; + userPosition.altitudeAboveGround = uS->altitudeAboveGround; + userPosition.latitude = uS->latitude; + userPosition.longitude = uS->longitude; + userPosition.heading = uS->heading; + userPosition.bank = uS->bank; + userPosition.pitch = uS->pitch; } break; @@ -514,15 +521,15 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo if (pObjData->dwRequestID >= (UINT)REQUEST_PROBE_CREATE && pObjData->dwRequestID < (UINT)REQUEST_PROBE_CREATE + MAX_AI) { - UINT probe_i = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_CREATE; - probe_info[probe_i].id = pObjData->dwObjectID; - probe_info[probe_i].created = true; + UINT probeIndex = (UINT)pObjData->dwRequestID - (UINT)REQUEST_PROBE_CREATE; + probeIndexnfo[probeIndex].id = pObjData->dwObjectID; + probeIndexnfo[probeIndex].created = true; - probe_init(probe_i); + probeInit(probeIndex); - if (debug) std::cout << "Created probe id = " << probe_info[probe_i].id << std::endl; + if (debug) std::cout << "Created probe id = " << probeIndexnfo[probeIndex].id << std::endl; - get_updated_probe(probe_i); + getUpdatedProbe(probeIndex); } else { if (debug) std::cout << "Unknown creation %d" << pObjData->dwRequestID << std::endl; From 9917c4f94d545b0cf15a429b86dbb83173e4bca6 Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Mon, 20 Mar 2023 14:13:52 +0100 Subject: [PATCH 04/20] fix: included noise floor to SNR --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 36846343b8e..580d1e1e045 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -129,7 +129,7 @@ ProbeStruct probePosition; ProbeInfo probeIndexnfo[MAX_AI]; double probeSNR(double beamActual) { - return 10 * std::log10(K / std::pow(beamActual, 4)); + return (10 * std::log10(K / std::pow(beamActual, 4))) - NOISE_FLOOR; } // Returns new lat/ long probe coordinates for each probe From a63cef2119689ec3691a8bb3e6735130e2b90cda Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 18 Apr 2023 17:48:55 +0200 Subject: [PATCH 05/20] Update CHANGELOG.md --- .github/CHANGELOG.md | 51 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 323ce6a187e..3704644ae02 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -7,27 +7,37 @@ ## 0.10.0 +1. [PFD] Corrected low VLS near max flight level - @lukecologne (luke) +1. [FMGC] Fix loading VHF navaids without region - @tracernz (Mike) +1. [EFB] Added pretty release name to flyPad about page - @frankkopp (Frank Kopp) 1. [ADIRU] Implemented wind speed computation from TAS/GS/HDG - @tracernz (Mike) 1. [FMGC] Show proper transition names and final approach slope from AAU1 - @tracernz (Mike) 1. [FMGC] Don't accept blank input or / for hold distance - @tracernz (Mike) 1. [HYD] Faster core hydraulics solver - @Crocket63 (crocket) 1. [ATSU] Fix LSK6L not returning to ATSU DATALINK page in ATC MENU - @BravoMike99 (Bruno_pt99#5802) +1. [MCDU] Fix flight plan page approach name formatting - @tracernz (Mike) +1. [ATSU] Added CPDLC addresses used on VATSIM in EPWW FIR - @laxentis +1. [ATSU] Update LPPC FANS B area with newly introduced codes - @pinatacolada 1. [HYD] Trimmable physical assemblies - @Crocket63 (crocket) 1. [HYD] Simulation of the rudder mechanical assembly and yaw dampers - @Crocket63 (crocket) 1. [HYD] Simple temperature simulation - @Crocket63 (crocket) 1. [FLIGHTMODEL] Reduced flap induced drag - @donstim (donbikes#4084) +1. [MODEL] Modified wheelchocks and safety cone behaviour based on beacon switch position - @frankkopp (Frank Kopp) +1. [SD] Port SD to full react-based instrument - @saschl (saschl#9432) +1. [MISC] Enable parking brake so aircraft does not move during pre-flight cinematic - @saschl (saschl#9432) 1. [EFB] Fix and improve pushback system and add API documentation - @frankkopp (Frank Kopp) 1. [RMP] RMPs navigation backup - Julian Sebline (Julian Sebline#8476 on Discord) 1. [SEC] Fix GND SPLR logic, add missing GND SPLR partial extension condition - @lukecologne (luke) 1. [FMGC] Improved importing flight plans from MSFS World Map - @frankkopp (Frank Kopp) -1. [EFB] Added boarding time indication to Payload page - @ChristianLutzCL (Christian Lutz) @frankkopp (Frank Kopp) 1. [EFB] Show correct runway numbers in landing calculator's runway widget when heading is between 0-5 degrees - @2hwk (2Cas#1022) 1. [EFB] Added boarding time indication to Payload page - @ChristianLutzCL (Christian Lutz) @frankkopp(Frank Kopp) 1. [ADIRU/ND/PFD] Initial support for polar navigation - @tracernz (Mike) 1. [FLIGHTMODEL] Update gear drag - @donstim (donbikes#4084) 1. [FLIGHTMODEL/EFB] Modified empty weight cg and loading station/fuel tank locations - @donstim (donbikes#4084) 1. [HYD] Fix gear sequence starting when failing prox sensor - @Crocket63 (crocket) -1. [MISC] Added aircraft version check and uer notification - @frankkopp (Frank Kopp) +1. [ATSU] Coupled the DATALINK STATUS page onto the atsu - @StenAfMARS (space_viking#0186) +1. [MISC] Added aircraft version check and user notification - @frankkopp (Frank Kopp) +1. [FMGC] Fix station declination using wrong leg - @tracernz (Mike) 1. [EFB] Added QuickControls to flyPad StatusBar - @Benjozork (Benjamin Dupont) @frankkopp (Frank Kopp) 1. [SOUND] Fix announcements playing twice and adding check for power to PA - @frankkopp (Frank Kopp) 1. [ENG] Adjust oil pressure table - @tracernz (Mike) @@ -36,14 +46,27 @@ 1. [ND] Fixed LOC deviation scaling - @tracernz (Mike) 1. [COND] Add mixer unit and recirculation fans to air conditioning system - @mjuhe (Miquel Juhe) 1. [COND] Add trim air valves to air conditioning system - @mjuhe (Miquel Juhe) +1. [EFB] Fix offscreen menu caused by OFP layouts - @MicahBCode (Mischa Binder) 1. [CLOCK] Ported Clock to MSFS Avionics Framework for better performance - @MicahBCode (Mischa Binder) 1. [FMGC] Constraints for waypoints behind the aircraft are no longer sent - @tracernz (Mike) +1. [AOC] Update unread message count when messages are deleted - @Eearslya (Eearslya#7831) 1. [EFB] GSX Integration - Lucky38i (Lucky38#3550) 1. [EWD] Updated EWD to use MSFS Avionics framework - @Eearslya (Eearslya#7831) 1. [HYD] Realistic randomized yellow accumulator starting state - @Crocket63 (crocket) +1. [EFB] Added ability to set custom Simbridge IP address - @Alepouna (Alepouna#9824) +1. [FUEL] Eliminate bug with inner tank zeroing when re/de-fueling - @Taz5150 (TazX [Z+2]#0405) +1. [HYD] Refactor THS to work with both mechanical and electrical control - @lukecologne (luke) +1. [MISC] Added workaround/fix for rendering issue with MSFS checklist - @Chryssie (Chryssie#1984) +1. [ELEC] Make the annunciator test function dependent on DC Bus 2 being powered - @Maximilian-Reuter (Chaoz#3065) 1. [HYD] RAT code refactor to allow for hyd or elec rat design - @Crocket63 (crocket) +1. [FWC] Add fuel low warnings - @Eearslya (Eearslya#7831) 1. [MCDU] Reset of flight plan and stored data on Database switch - @Maverickwoe (Garoomf#4683) +1. [MODEL] Fixed cargo door animations - @drunkpupper25 +1. [SYSTEM] Overrided Simvar Getter and Setter functions to reduce allocations and improve performance - @saschl (saschl#9432) +1. [PFD] Fix PFD altitude indications - @BlueberryKing (BlueberryKing) 1. [FLIGHTMODEL/FUEL] Increased rate of fuel transfer from outer to inner tanks - @donstim (donbikes#4084) +1. [FWC] Added takeoff surveillance 1 warnings and various other improvements - @tracernz (Mike) +1. [SYSTEM] Update Simbridge Client fetching and state checking - @Maximilian-Reuter (Chaoz#3065) 1. [MISC] Flight deck brightness and lighting is set automatically at spawn - @tracernz (Mike) 1. [FMGC] Send full approach name to EIS - @tracernz (Mike) 1. [FWC] Add FLAP LVR NOT ZERO warning above FL200 - @tracernz (Mike) @@ -53,15 +76,20 @@ 1. [SYSTEM] Introduce Typescript based systems in VCockpit17 - @svengcz (Sven) 1. [ATSU] ATSU as single instrument according to A20N architecture - @svengcz (Sven) 1. [DATALINK] Splitted up ATC/AOC/Router to single components @svengcz (Sven) +1. [ND] Fixed RNP <= 0.3 indications to appear more reliably and consistently - @tracernz (Mike) +1. [EFB] Mitigated issue with flypad fuel page for very long translation strings - @frankkopp (Frank Kopp) 1. [ISIS] Show baro correction during power-up sequence - @tracernz (Mike) 1. [FWC] Add GND SPLR NOT ARMED warning - @tracernz (Mike) 1. [FWC] Add SPD BRK STILL OUT warning - @tracernz (Mike) +1. [EGPWS] Introduce first system for EPGWS - @svengcz (Sven) 1. [PRESS] Merge pressurization and air conditioning system - @mjuhe (Miquel Juhe) +1. [MCDU] Fix negative EFOB on F-PLN page - @Revyn112 (Revyn112#1010) 1. [ADIRU] Add baro correction setting to ADIRS - @mjuhe (Miquel Juhe) 1. [FMGC] Fixed various bugs with thrust reduction and acceleration altitude - @tracernz (Mike) 1. [FMGC] Change PERF GO AROUND page layout to H3 - @tracernz (Mike) 1. [FMS] Fix display of lat/lon close to zero on DUPLICATE NAMES page - @tracernz (Mike) 1. [EWD] Fix placement of "5" and "10" scale on EWD N1 gauges - @flogross89 (Flo) +1. [DMC] Add DMC maintenance and engineering test modes (including DMC switching) - @flogross89 (Flo) 1. [MCDU] Fix negative EFOB on FLIGHT PLAN page - @Revyn112 (Revyn112#1010) 1. [MCDU] Fix EFOB and FUEL PRED get dashed out at TOD - @Revyn112 (Revyn112#1010) 1. [ELEC] A more accurate simulation of the transformer rectifiers - @Gurgel100 (Pascal) @@ -77,7 +105,26 @@ 1. [MCDU/ND] Implemented SPECIF VOR/D UNAVAIL message - @tracernz (Mike) 1. [MCDU] Implemented TUNE BBB FFF.FF, SPECIF NDB UNAVAIL messages - @tracernz (Mike) 1. [F/CTL] Add ELAC 2 Emergency Powersupply - @lukecologne (lukecologne#1156) +1. [FADEC] Automatic enginestarts use one igniter alternating and enabled use of FADEC GND PWR pushbuttons @Maximilian-Reuter (Maximilian Reuter) +1. [FWC] Target a modern FWC version - @beheh (Benedict Etzel) 1. [HYD] New aerodynamic model for RAT turbine / Added A320 RAT anti stall valve system - @Crocket63 (crocket) +1. [W/B] Phase 1 of refactoring payload (passenger and cargo) logic into rust systems - @2hwk (2Cas#1022) +1. [EFB] Allow payload page passenger seating to be manipulated via LocalVars - @2hwk (2Cas#1022) +1. [EFB] GW and GWCG display on payload page - @2hwk (2Cas#1022) +1. [FLIGHTMODEL/EFB] Updated CG for ELAC 103 - @donstim (donbikes#4084) +1. [FLIGHTMODEL/FUEL] Update of fuel system (center tank transfer and crossfeed) - @donstim (donbikes#4084), @tracernz (Mike), @Taz5150 (TazX [Z+2]#0405) +1. [MODEL] Fix mouse collision boxes for the fire guards on the overhead - @tracernz (Mike) +1. [FLIGHTMODEL/FUEL] Reinstate updated outer fuel tank position from updated CG for ELAC 103 - @donstim (donbikes#4084) +1. [MODEL] Change pitch trim scale to correct neo scale - @tracernz (Mike) +1. [MCDU] Fix no overfly shown on forced turn on F-PLN page, return to F-PLN page on TMPY insert - @tracernz (Mike) +1. [FMS] Handle approach transitions hidden inside other transition with Navigraph data - @tracernz (Mike) +1. [ND] Do not draw background when busses are not powered - @saschl (saschl#9432) +1. [MODEL] Working windshield wipers - @tracernz (Mike) +1. [LIGHTS] Redid all cockpit interior lighting and fixed exterior wing lights - @FinalLightNL (FinalLight#2113) +1. [BLEED] Add pressure sensors to bleed system - @BlueberryKing (BlueberryKing#6641) +1. [HYD] Adjusted low speed pumps efficiency / cargo doors refactor - @Crocket63 (crocket) +1. [ECAM/SD] Limit PRESS page gauges to correct range - @tracernz (Mike) +1. [FMGC/PFD] Implemented FMGC exposure of the Minimums to the PFD - @MikioDK (Yekouri#1836) 1. [RA] Realistic RA model based on a probe mesh implementation - @Taz5150 (TazX [Z+2]#0405) ## 0.9.0 From 019d96f4ac0e622f775aea672bd9a883a7f4a274 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:55:07 +0200 Subject: [PATCH 06/20] feat: new probe algorithm to improve performance --- .../src/wasm/radalt_a320/src/radaltControl.h | 174 ++++++++++-------- 1 file changed, 97 insertions(+), 77 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 580d1e1e045..1e162aa729e 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -5,47 +5,53 @@ HANDLE hSimConnect; SimVars* simVars; -double devState = 0.0; -bool debug = true; -double radarAltitude = 0.0; -double snrMax = 0.0; -double beamActual = 0.0; -double beamMin = 0.0; // Debug -double snrActual = 0.0; -double planeAltitude = 0.0; // Debug -double probeAltitude = 0.0; // Debug -double planeAboveGround = 0.0; // Debug -int testIndex = 0; // Debug -int interval = 1; // Debug -int quit = 0; - -static bool radarActive = false; - -constexpr int MAX_AI = 100; +// Debug +double devState = 0.0; +bool debug = true; +double planeAltitude = 0.0; +double probeAltitude = 0.0; +double planeAboveGround = 0.0; +int interval = 1; + +// Non-debug +int probeBest = 0; +int preSample = 1; +int quit = 0; +double radarAltitude = 0.0; +double snrMax = 0.0; +double beamActual = 0.0; +double snrActual = 0.0; + +// Static +static bool radarActive = false; + +// Constants +constexpr int MAX_AI = 15; +constexpr int PROBE_COLUMNS = 5; +constexpr int PROBE_ROWS = 3; +constexpr double X_MAX = 0.35; +constexpr double Y_MAX = 0.35; constexpr double PI = 3.141592653589790; constexpr double PI_FOURTH = 97.4090910340024; constexpr double DEG_TO_RAD = PI / 180.0; constexpr double RAD_TO_DEG = 180.0 / PI; -constexpr double PHI_2D = 1.32471795724474602596; // 2D golden ratio +constexpr double PHI_2D = 1.32471795724474602596; constexpr double ALPHA_0 = 1 / PHI_2D; constexpr double ALPHA_1 = ALPHA_0 * ALPHA_0; -constexpr double EARTH_RAD = 20888156.17; // earth's radius in feet -constexpr double LIGHT_SPEED = 299792458; // speed of light in m/s -constexpr double POWER_TX = 0.1; // peak transmit power in Watts (20 dBm) -constexpr double GAIN_ANTENNA = 10; // transmit/ receive antenna gain (unitless) -constexpr double WAVELENGTH_SQUARED = 4.8607635E-03; // wavelength in meters for a 4.3 GHz signal -constexpr double RCS = 16709011; // radar cross section in meter^2 for a 1 x 1 meter terrain sample -constexpr double NOISE_FLOOR = -140; // noise floor in dBm - -constexpr double MAX_ANGLE = 1.56; // around 90 degree limit -constexpr double H_ANGLE = 40; // in degrees -constexpr double V_ANGLE = 20; // in degrees -constexpr double MAX_BEAM_DISTANCE = 8192; // in feet - +constexpr double EARTH_RAD = 20888156.17; +constexpr double LIGHT_SPEED = 299792458; +constexpr double POWER_TX = 0.1; +constexpr double GAIN_ANTENNA = 10; +constexpr double WAVELENGTH_SQUARED = 4.8607635E-03; +constexpr double RCS = 16709011; +constexpr double NOISE_FLOOR = -140; +constexpr double MAX_ANGLE = 1.56; +constexpr double H_ANGLE = 40; +constexpr double V_ANGLE = 20; +constexpr double MAX_BEAM_DISTANCE = 8192; constexpr double GAIN_FACTOR = 2.0 * POWER_TX * GAIN_ANTENNA * WAVELENGTH_SQUARED * RCS; constexpr double PI_FACTOR = 4.0 * PI_FOURTH; constexpr double K = GAIN_FACTOR / PI_FACTOR; - const double TAN_H_ANGLE = tan(H_ANGLE * DEG_TO_RAD); const double TAN_V_ANGLE = tan(V_ANGLE * DEG_TO_RAD); @@ -129,54 +135,60 @@ ProbeStruct probePosition; ProbeInfo probeIndexnfo[MAX_AI]; double probeSNR(double beamActual) { - return (10 * std::log10(K / std::pow(beamActual, 4))) - NOISE_FLOOR; + return 10 * std::log10(K / std::pow(beamActual, 4)); } // Returns new lat/ long probe coordinates for each probe // Beam distance coded as pitch // TO BE CHECKED -ProbeStruct distanceAndBearing(UserStruct user, int probeIndex) { - double probeX, probeY, bearing, distance; - double lat1, lon1, lat2, lon2, xDist, yDist; +ProbeStruct distanceAndBearing(const UserStruct& user, int probeIndex, int preSample, int probeBest) { + ProbeStruct probe; + double altitudeAboveGround = user.altitudeAboveGround; double bank = user.bank; double pitch = user.pitch; + double probeX = 0; + double probeY = 0; /* Setting constrains */ altitudeAboveGround = (altitudeAboveGround > MAX_BEAM_DISTANCE) ? MAX_BEAM_DISTANCE : altitudeAboveGround; bank = (bank > MAX_ANGLE) ? MAX_ANGLE : ((bank < -MAX_ANGLE) ? -MAX_ANGLE : bank); pitch = (pitch > MAX_ANGLE) ? MAX_ANGLE : ((pitch < -MAX_ANGLE) ? -MAX_ANGLE : pitch); - ProbeStruct probe; - - xDist = TAN_H_ANGLE * altitudeAboveGround; - yDist = TAN_V_ANGLE * altitudeAboveGround; + double xDist = TAN_H_ANGLE * altitudeAboveGround; + double yDist = TAN_V_ANGLE * altitudeAboveGround; - // Quasi-random R2 - probeX = (0.5 + (ALPHA_0 * probeIndex)); - probeY = (0.5 + (ALPHA_1 * probeIndex)); + if (preSample == 1) { + probeX = -X_MAX + ((X_MAX * 2 / (PROBE_COLUMNS - 1)) * (probeIndex % PROBE_COLUMNS)); + probeY = -Y_MAX + ((Y_MAX * 2 / (PROBE_ROWS - 1)) * (probeIndex / PROBE_COLUMNS)); + } + else { + double dx = -X_MAX + ((X_MAX * 2 / (PROBE_COLUMNS - 1)) * (probeBest % PROBE_COLUMNS)); + double dy = -Y_MAX + ((Y_MAX * 2 / (PROBE_ROWS - 1)) * (probeBest / PROBE_COLUMNS)); - probeX = 2 * xDist * (probeX - (int)probeX - 0.5) + (tan(bank) * altitudeAboveGround); - probeY = 2 * yDist * (probeY - (int)probeY - 0.5) - (tan(pitch) * altitudeAboveGround); + probeX = -(X_MAX / 5) + (((X_MAX / 5) * 2 / (PROBE_COLUMNS - 1)) * (probeIndex % PROBE_COLUMNS)) + dx; + probeY = -(Y_MAX / 2) + (((Y_MAX / 2) * 2 / (PROBE_ROWS - 1)) * (probeIndex / PROBE_COLUMNS)) + dy; + } - bearing = atan(probeX / probeY); // 2D top-down bearing (degrees) - distance = sqrt(pow(probeX, 2) + pow(probeY, 2)); // 2D top-down distance (feet) + probeX = 2 * xDist * (probeX - (int)(probeX)) + (tan(bank) * altitudeAboveGround); + probeY = 2 * xDist * (probeY - (int)(probeY)) + (tan(pitch) * altitudeAboveGround); - if (probeY < 0) { - bearing = bearing + PI; - } - else if (probeX < 0 && probeY > 0) { - bearing = (2 * PI) + bearing; - } + double bearing = atan2(probeY, probeX); // 2D top-down bearing (degrees) + + //bearing += (probeY < 0) ? PI : ((probeX < 0 && probeY > 0) ? (2 * PI) : 0); + bearing += user.heading; - // LAT/LON Translation - lat1 = deg2rad(user.latitude); - lon1 = deg2rad(user.longitude); - bearing = user.heading + bearing; + double distance = sqrt(probeX * probeX + probeY * probeY); // 2D top-down distance (feet) - // New Coordinates - lat2 = asin((sin(lat1) * cos(distance / EARTH_RAD)) + (cos(lat1) * sin(distance / EARTH_RAD) * cos(bearing))); - lon2 = lon1 + (atan2(sin(bearing) * sin(distance / EARTH_RAD) * cos(lat1), cos(distance / EARTH_RAD) - sin(lat1) * sin(lat2))); + // Lat/Lon Translation variables + double sinLat1 = sin(deg2rad(user.latitude)); + double cosLat1 = cos(deg2rad(user.latitude)); + double sinDistanceRad = sin(distance / EARTH_RAD); + double cosDistanceRad = cos(distance / EARTH_RAD); + + // New Lat/Lon Coordinates + double lat2 = asin((sinLat1 * cosDistanceRad) + (cosLat1 * sinDistanceRad * cos(bearing))); + double lon2 = deg2rad(user.longitude) + (atan2(sin(bearing) * sinDistanceRad * cosLat1, cosDistanceRad - sinLat1 * sin(lat2))); probe.latitude = rad2deg(lat2); probe.longitude = rad2deg(lon2); @@ -195,7 +207,7 @@ void createProbeMesh(int probeIndex) devState = simVars->getDeveloperState(); - ProbeStruct probeResult = distanceAndBearing(userPosition, probeIndex); + ProbeStruct probeResult = distanceAndBearing(userPosition, probeIndex, preSample, probeBest); if (debug) std::cout << "RADALT: Creating Probe (" << probeIndex << ") .." << std::endl; @@ -312,10 +324,10 @@ void getUpdatedProbe(int probeIndex) { } // Sets new probe mesh position. Called by REQUEST_PROBE_DATA -void updateProbeMesh(int probeIndex) { +void updateProbeMesh(int probeIndex, int preSample, int probeBest) { HRESULT hr; - ProbeStruct probe = distanceAndBearing(userPosition, probeIndex); + ProbeStruct probe = distanceAndBearing(userPosition, probeIndex, preSample, probeBest); probePosition.latitude = probe.latitude; probePosition.longitude = probe.longitude; @@ -344,26 +356,16 @@ void readProbeData(int probeIndex, ProbeStruct probePosition) { if (isNewSnrMax(snrActual, snrMax)) { radarAltitude = userPosition.altitude - probePosition.altitude; snrMax = snrActual; + if (preSample == 1) + probeBest = probeIndex; planeAltitude = userPosition.altitude; // Debug probeAltitude = probePosition.altitude; // Debug planeAboveGround = userPosition.altitudeAboveGround; // Debug - testIndex = probeIndex; // Debug } if (probeIndex == MAX_AI - 1) { if (radarAltitude > MAX_BEAM_DISTANCE || snrMax < NOISE_FLOOR) radarAltitude = 99999; - - simVars->setRadarAltitude(radarAltitude); - - if (debug) { - std::cout << "RADALT: SNR Probe (" << testIndex << - ") Plane_Alt: " << planeAltitude << - " Probe_Alt: " << probeAltitude << - " Plane_AltAbv: " << planeAboveGround << - " SNR: " << snrMax << - " RA: " << radarAltitude << std::endl; - } } } @@ -496,9 +498,27 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo probePosition.pitch = pS->pitch; // ground distance probePosition.heading = pS->heading; // ground bearing - updateProbeMesh(probeIndex); + updateProbeMesh(probeIndex, preSample, probeBest); readProbeData(probeIndex, probePosition); + if (probeIndex == MAX_AI - 1) { + if (preSample == 0) { + simVars->setRadarAltitude(radarAltitude); + + if (debug) { + std::cout << "RADALT: SNR Probe (" << probeBest << + ") Plane_Alt: " << planeAltitude << + " Probe_Alt: " << probeAltitude << + " Plane_AltAbv: " << planeAboveGround << + " SNR: " << snrMax << + " RA: " << radarAltitude << std::endl; + } + + preSample = 1; + } else { + preSample = 0; + } + } } else if (pObjData->dwRequestID == (UINT)REQUEST_USER_DATA) { UserStruct* uS = (UserStruct*)&pObjData->dwData; @@ -552,4 +572,4 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo std::cout << "Received: " << pData->dwID << std::endl; break; } -} \ No newline at end of file +} From b2c67a347ed9edea0d0b543e5015c7465c3c38d1 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:47:49 +0200 Subject: [PATCH 07/20] feat: probes measured by received power --- .../src/wasm/radalt_a320/src/radaltControl.h | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 1e162aa729e..66c9414f325 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -18,9 +18,9 @@ int probeBest = 0; int preSample = 1; int quit = 0; double radarAltitude = 0.0; -double snrMax = 0.0; +double rxMax = 0.0; double beamActual = 0.0; -double snrActual = 0.0; +double rxActual = 0.0; // Static static bool radarActive = false; @@ -32,7 +32,7 @@ constexpr int PROBE_ROWS = 3; constexpr double X_MAX = 0.35; constexpr double Y_MAX = 0.35; constexpr double PI = 3.141592653589790; -constexpr double PI_FOURTH = 97.4090910340024; +constexpr double PI_THIRD = 31.00627668030; constexpr double DEG_TO_RAD = PI / 180.0; constexpr double RAD_TO_DEG = 180.0 / PI; constexpr double PHI_2D = 1.32471795724474602596; @@ -41,7 +41,7 @@ constexpr double ALPHA_1 = ALPHA_0 * ALPHA_0; constexpr double EARTH_RAD = 20888156.17; constexpr double LIGHT_SPEED = 299792458; constexpr double POWER_TX = 0.1; -constexpr double GAIN_ANTENNA = 10; +constexpr double GAIN_TX_RX = 100; constexpr double WAVELENGTH_SQUARED = 4.8607635E-03; constexpr double RCS = 16709011; constexpr double NOISE_FLOOR = -140; @@ -49,8 +49,8 @@ constexpr double MAX_ANGLE = 1.56; constexpr double H_ANGLE = 40; constexpr double V_ANGLE = 20; constexpr double MAX_BEAM_DISTANCE = 8192; -constexpr double GAIN_FACTOR = 2.0 * POWER_TX * GAIN_ANTENNA * WAVELENGTH_SQUARED * RCS; -constexpr double PI_FACTOR = 4.0 * PI_FOURTH; +constexpr double GAIN_FACTOR = POWER_TX * GAIN_TX_RX * WAVELENGTH_SQUARED; +constexpr double PI_FACTOR = 64.0 * PI_THIRD; constexpr double K = GAIN_FACTOR / PI_FACTOR; const double TAN_H_ANGLE = tan(H_ANGLE * DEG_TO_RAD); const double TAN_V_ANGLE = tan(V_ANGLE * DEG_TO_RAD); @@ -68,7 +68,7 @@ inline double rad2deg(double rad) } // finds maximum of two values -bool isNewSnrMax(double newSnr, double maxSnr) +bool isNewRxMax(double newSnr, double maxSnr) { return newSnr > maxSnr; } @@ -134,8 +134,12 @@ UserStruct userPosition; ProbeStruct probePosition; ProbeInfo probeIndexnfo[MAX_AI]; -double probeSNR(double beamActual) { - return 10 * std::log10(K / std::pow(beamActual, 4)); +double probeRX(double beamActual) { + double alpha = 0.01; + beamActual = beamActual / 3.28084; + double sigmaFactor = PI * TAN_H_ANGLE * TAN_V_ANGLE * ((0.0021529922 * beamActual) + 1.9649909) / beamActual; + double noiseFactor = std::exp(-2 * beamActual * alpha / 1000); + return 10 * std::log10(K * sigmaFactor * noiseFactor * 1000); } // Returns new lat/ long probe coordinates for each probe @@ -346,16 +350,16 @@ void updateProbeMesh(int probeIndex, int preSample, int probeBest) { void readProbeData(int probeIndex, ProbeStruct probePosition) { if (probeIndex == 0) { - snrMax = -99999; + rxMax = -140; radarAltitude = 99999; } beamActual = sqrt(pow(probePosition.pitch * 100, 2) + pow(userPosition.altitude - probePosition.altitude, 2)); - snrActual = probeSNR(beamActual); + rxActual = probeRX(beamActual); - if (isNewSnrMax(snrActual, snrMax)) { + if (isNewRxMax(rxActual, rxMax)) { radarAltitude = userPosition.altitude - probePosition.altitude; - snrMax = snrActual; + rxMax = rxActual; if (preSample == 1) probeBest = probeIndex; planeAltitude = userPosition.altitude; // Debug @@ -364,7 +368,7 @@ void readProbeData(int probeIndex, ProbeStruct probePosition) { } if (probeIndex == MAX_AI - 1) { - if (radarAltitude > MAX_BEAM_DISTANCE || snrMax < NOISE_FLOOR) + if (radarAltitude > MAX_BEAM_DISTANCE || rxMax < NOISE_FLOOR) radarAltitude = 99999; } } @@ -506,12 +510,13 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo simVars->setRadarAltitude(radarAltitude); if (debug) { - std::cout << "RADALT: SNR Probe (" << probeBest << + std::cout << "RADALT: Probe# (" << probeBest << ") Plane_Alt: " << planeAltitude << " Probe_Alt: " << probeAltitude << " Plane_AltAbv: " << planeAboveGround << - " SNR: " << snrMax << - " RA: " << radarAltitude << std::endl; + " Prx: " << rxMax << + " RA: " << radarAltitude << + " pct_diff: " << 100 * (planeAboveGround - radarAltitude) / planeAboveGround << std::endl; } preSample = 1; From 6f2921e76298cfc96cd72f9d35e98896dae40f0a Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Thu, 11 May 2023 17:25:42 +0200 Subject: [PATCH 08/20] refactor & feat: AC Bus power on --- fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 24 ++++++-- .../src/wasm/radalt_a320/src/radaltControl.h | 57 ++++++++++++++++--- .../src/wasm/radalt_a320/src/radaltGauge.h | 14 +++-- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h index 33a9acf3f3e..b3d8601b608 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -33,26 +33,40 @@ class SimVars { /// /// Collection of LVars for the A32NX /// + ENUM PlaneAltitudeAGL = get_aircraft_var_enum("PLANE ALT ABOVE GROUND"); + ID DevVar; - ID RadAlt; + ID RadAlt1; + ID RadAlt2; + ID AcBus1; + ID AcBus2; SimVars() { this->initializeVars(); } void initializeVars() { DevVar = register_named_variable("A32NX_DEVELOPER_STATE"); - RadAlt = register_named_variable("A32NX_RA_RAW"); + RadAlt1 = register_named_variable("A32NX_RA_1_RAW"); + RadAlt2 = register_named_variable("A32NX_RA_2_RAW"); + AcBus1 = register_named_variable("A32NX_ELEC_AC_1_BUS_IS_POWERED"); + AcBus2 = register_named_variable("A32NX_ELEC_AC_2_BUS_IS_POWERED"); //this->setDeveloperState(0); - this->setRadarAltitude(99999); + this->setRadioAltitude1(99999); + this->setRadioAltitude2(99999); m_Units = new Units(); } // Collection of LVar 'set' Functions void setDeveloperState(FLOAT64 value) { set_named_variable_value(DevVar, value); } - void setRadarAltitude(FLOAT64 value) { set_named_variable_value(RadAlt, value); } + void setRadioAltitude1(FLOAT64 value) { set_named_variable_value(RadAlt1, value); } + void setRadioAltitude2(FLOAT64 value) { set_named_variable_value(RadAlt2, value); } // Collection of SimVar/LVar 'get' Functions FLOAT64 getDeveloperState() { return get_named_variable_value(DevVar); } - FLOAT64 getRadarAltitude() { return get_named_variable_value(RadAlt); } + FLOAT64 getRadarAltitude1() { return get_named_variable_value(RadAlt1); } + FLOAT64 getRadarAltitude2() { return get_named_variable_value(RadAlt2); } + FLOAT64 getAcBusState1() { return get_named_variable_value(AcBus1); } + FLOAT64 getAcBusState2() { return get_named_variable_value(AcBus2); } + FLOAT64 getPlaneAltitudeAGL() { return aircraft_varget(PlaneAltitudeAGL, m_Units->Feet, 0); } }; \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 66c9414f325..02f99b82b33 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -7,7 +7,7 @@ SimVars* simVars; // Debug double devState = 0.0; -bool debug = true; +bool debug = false; double planeAltitude = 0.0; double probeAltitude = 0.0; double planeAboveGround = 0.0; @@ -17,7 +17,7 @@ int interval = 1; int probeBest = 0; int preSample = 1; int quit = 0; -double radarAltitude = 0.0; +double radioAltitude = 0.0; double rxMax = 0.0; double beamActual = 0.0; double rxActual = 0.0; @@ -101,6 +101,7 @@ struct ProbeInfo }; static enum EVENT_ID { + EVENT_4S_TIMER, EVENT_RADAR_ON, EVENT_RADAR_OFF, EVENT_FREEZE_LATLONG, @@ -209,6 +210,7 @@ void createProbeMesh(int probeIndex) SIMCONNECT_DATA_INITPOSITION initPosition; HRESULT hr; + srand(time(0)); devState = simVars->getDeveloperState(); ProbeStruct probeResult = distanceAndBearing(userPosition, probeIndex, preSample, probeBest); @@ -285,6 +287,8 @@ void removeProbes() { for (int i = 0; i < MAX_AI; i++) { removeProbeMesh(i); } + simVars->setRadioAltitude1(99999); + simVars->setRadioAltitude2(99999); radarActive = false; } @@ -351,14 +355,14 @@ void updateProbeMesh(int probeIndex, int preSample, int probeBest) { void readProbeData(int probeIndex, ProbeStruct probePosition) { if (probeIndex == 0) { rxMax = -140; - radarAltitude = 99999; + radioAltitude = 99999; } beamActual = sqrt(pow(probePosition.pitch * 100, 2) + pow(userPosition.altitude - probePosition.altitude, 2)); rxActual = probeRX(beamActual); if (isNewRxMax(rxActual, rxMax)) { - radarAltitude = userPosition.altitude - probePosition.altitude; + radioAltitude = userPosition.altitude - probePosition.altitude; rxMax = rxActual; if (preSample == 1) probeBest = probeIndex; @@ -368,8 +372,8 @@ void readProbeData(int probeIndex, ProbeStruct probePosition) { } if (probeIndex == MAX_AI - 1) { - if (radarAltitude > MAX_BEAM_DISTANCE || rxMax < NOISE_FLOOR) - radarAltitude = 99999; + if (radioAltitude > MAX_BEAM_DISTANCE || rxMax < NOISE_FLOOR) + radioAltitude = 99999; } } @@ -463,9 +467,30 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo { SIMCONNECT_RECV_EVENT* evt = (SIMCONNECT_RECV_EVENT*)pData; + switch (evt->uEventID) { + case EVENT_4S_TIMER: + if (devState == 0) { + double acBusState = simVars->getAcBusState1() + simVars->getAcBusState2(); + double altitudeAGL = simVars->getPlaneAltitudeAGL(); + + if (!radarActive && acBusState > 0 && altitudeAGL < MAX_BEAM_DISTANCE) + { + if (debug) std::cout << "RADALT: [EVENT_4S_TIMER] Probe START ..." << std::endl; + getStartupData(); + } + + if ((radarActive && acBusState < 1) || + (radarActive && acBusState > 0 && altitudeAGL > MAX_BEAM_DISTANCE)) + { + if (debug) std::cout << "RADALT: [EVENT_4S_TIMER] Probe STOP ..." << std::endl; + removeProbes(); + } + } + break; case EVENT_RADAR_ON: + if (debug) std::cout << "RADALT: [EVENT_RADAR_ON]" << std::endl; if (!radarActive) { simVars = new SimVars(); @@ -473,6 +498,7 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo } break; case EVENT_RADAR_OFF: + if (debug) std::cout << "RADALT: [EVENT_RADAR_OFF]" << std::endl; if (radarActive) { removeProbes(); @@ -507,7 +533,20 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo if (probeIndex == MAX_AI - 1) { if (preSample == 0) { - simVars->setRadarAltitude(radarAltitude); + if (radioAltitude <= 75) + radioAltitude = radioAltitude + (-15.0 + rand() % 31) / 10; + else if (radioAltitude > 75 && radioAltitude < 99999) + radioAltitude = radioAltitude * (1.0 + (-2.0 + rand() % 5) / 100); + + if (simVars->getAcBusState1() == 1) + simVars->setRadioAltitude1(radioAltitude); + else + simVars->setRadioAltitude1(99999); + + if (simVars->getAcBusState2() == 0 || radioAltitude == 99999) + simVars->setRadioAltitude2(99999); + else + simVars->setRadioAltitude2(radioAltitude * (99 + rand() % 2)/100); if (debug) { std::cout << "RADALT: Probe# (" << probeBest << @@ -515,8 +554,8 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo " Probe_Alt: " << probeAltitude << " Plane_AltAbv: " << planeAboveGround << " Prx: " << rxMax << - " RA: " << radarAltitude << - " pct_diff: " << 100 * (planeAboveGround - radarAltitude) / planeAboveGround << std::endl; + " RA1: " << radioAltitude << + " pct_diff: " << 100 * (planeAboveGround - radioAltitude) / planeAboveGround << std::endl; } preSample = 1; diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h index 742e9e5d8e1..30fbea64e20 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h @@ -52,6 +52,14 @@ class RadaltGauge { SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Longitude", "degrees"); SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Pitch Degrees", "degrees"); SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_PROBE_POS, "Plane Heading Degrees True", "radians"); + + // Subscribe to the repeating 4-second timer event + SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_4S_TIMER, "4sec"); + + // set the id for the freeze events so this client has full control of probe objects + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_LATLONG, "FREEZE_LATITUDE_LONGITUDE_SET"); + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ALTITUDE, "FREEZE_ALTITUDE_SET"); + SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ATTITUDE, "FREEZE_ATTITUDE_SET"); // Create some private events SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_RADAR_ON); @@ -63,11 +71,6 @@ class RadaltGauge { SimConnect_SetInputGroupState(hSimConnect, INPUT_ZX, SIMCONNECT_STATE_OFF); - // set the id for the freeze events so this client has full control of probe objects - SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_LATLONG, "FREEZE_LATITUDE_LONGITUDE_SET"); - SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ALTITUDE, "FREEZE_ALTITUDE_SET"); - SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_ATTITUDE, "FREEZE_ATTITUDE_SET"); - // Sign up for notifications SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_ZX, EVENT_RADAR_ON); SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_ZX, EVENT_RADAR_OFF); @@ -96,6 +99,7 @@ class RadaltGauge { } isConnected = true; + simVars = new SimVars(); SimConnect_CallDispatch(hSimConnect, RadaltDispatchProc, this); return true; From 98e254e7b2c5a34aed23c3778963d712582dba0c Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Fri, 12 May 2023 08:21:09 +0200 Subject: [PATCH 09/20] Update build.sh --- fbw-a32nx/src/wasm/radalt_a320/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/build.sh b/fbw-a32nx/src/wasm/radalt_a320/build.sh index 686324f83d4..a8e385b90ca 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/build.sh +++ b/fbw-a32nx/src/wasm/radalt_a320/build.sh @@ -41,7 +41,7 @@ clang++ \ -I "${MSFS_SDK}/SimConnect SDK/include" \ "${DIR}/src/radaltGauge.cpp" -# restore directory +# restore directory. popd wasm-ld \ From 759c047cd8755066a760a8e35e3a53cd4d8dd200 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Fri, 12 May 2023 09:07:39 +0200 Subject: [PATCH 10/20] Make build.sh executable --- fbw-a32nx/src/wasm/radalt_a320/build.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 fbw-a32nx/src/wasm/radalt_a320/build.sh diff --git a/fbw-a32nx/src/wasm/radalt_a320/build.sh b/fbw-a32nx/src/wasm/radalt_a320/build.sh old mode 100644 new mode 100755 From 8a4bb9ab1c14b434e5fdfa479fa57977b040f04e Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Thu, 18 May 2023 14:25:09 +0200 Subject: [PATCH 11/20] fix: TCAS probe detection fixed --- .../tcas/src/components/TcasComputer.ts | 104 ++++++++++-------- fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 4 + .../src/wasm/radalt_a320/src/radaltControl.h | 9 +- 3 files changed, 69 insertions(+), 48 deletions(-) diff --git a/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts b/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts index 2d7fc4af8fa..8570680bea4 100644 --- a/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts +++ b/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts @@ -389,60 +389,72 @@ export class TcasComputer implements TcasComponent { * @param _deltaTime Deltatime of this frame */ private fetchRawTraffic(_deltaTime): void { + // RA Probe Mesh - Read the uID for the first probe of the mesh, and sets the + // length of the mesh (15 if RA is on, 0 if RA is off). + // This is needed until Asobo fixes the isGround flag (among other things) + let probeId = SimVar.GetSimVarValue('L:A32NX_RA_PROBE_ZERO', 'number'); + let probeLen = 14; + if (probeId === 0) { + probeLen = 0 + } + Coherent.call('GET_AIR_TRAFFIC').then((obj: JS_NPCPlane[]) => { this.airTraffic.forEach((traffic) => { traffic.alive = false; }); obj.forEach((tf) => { - // Junk bad air traffic - if (!tf.lat && !tf.lon && !tf.alt && !tf.heading) { - if (this.debug) { - console.log('Removing bugged traffic'); - console.log('===================================='); - console.log(` id | ${tf.uId}`); - console.log(` alt | ${tf.alt * 3.281}`); - console.log(` bearing | ${MathUtils.computeGreatCircleHeading(this.ppos.lat, this.ppos.long, tf.lat, tf.lon)}`); - console.log(` hDist | ${MathUtils.computeGreatCircleDistance(this.ppos.lat, this.ppos.long, tf.lat, tf.lon)}`); - console.log(' ================================ '); + // Only non-probe traffic will be considered + if (tf.uId < probeId || tf.uId > probeId + probeLen) { + // Junk bad air traffic + if (!tf.lat && !tf.lon && !tf.alt && !tf.heading) { + if (this.debug) { + console.log('Removing bugged traffic'); + console.log('===================================='); + console.log(` id | ${tf.uId}`); + console.log(` alt | ${tf.alt * 3.281}`); + console.log(` bearing | ${MathUtils.computeGreatCircleHeading(this.ppos.lat, this.ppos.long, tf.lat, tf.lon)}`); + console.log(` hDist | ${MathUtils.computeGreatCircleDistance(this.ppos.lat, this.ppos.long, tf.lat, tf.lon)}`); + console.log(' ================================ '); + } + return; + } + let traffic: TcasTraffic | undefined = this.airTraffic.find((p) => p && p.ID === tf.uId.toFixed(0)); + if (!traffic) { + traffic = new TcasTraffic(tf, this.ppos, this.planeAlt); + this.airTraffic.push(traffic); } - return; - } - let traffic: TcasTraffic | undefined = this.airTraffic.find((p) => p && p.ID === tf.uId.toFixed(0)); - if (!traffic) { - traffic = new TcasTraffic(tf, this.ppos, this.planeAlt); - this.airTraffic.push(traffic); - } - traffic.alive = true; - traffic.seen = Math.min(traffic.seen + 1, 10); - const newAlt = tf.alt * 3.281; - traffic.vertSpeed = (newAlt - traffic.alt) / (_deltaTime / 1000) * 60; // feet per minute - traffic.groundSpeed = Math.abs(MathUtils.computeGreatCircleDistance(tf.lat, tf.lon, traffic.lat, traffic.lon) / (_deltaTime / 1000) * 3600); - const newSlantDist = MathUtils.computeDistance3D(traffic.lat, traffic.lon, traffic.alt, this.ppos.lat, this.ppos.long, this.pressureAlt); - const newClosureRate = (traffic.slantDistance - newSlantDist) / (_deltaTime / 1000) * 3600; // knots = nautical miles per hour - traffic.closureAccel = (newClosureRate - traffic.closureRate) / (_deltaTime / 1000); - traffic.closureRate = newClosureRate; - traffic.slantDistance = newSlantDist; - traffic.lat = tf.lat; - traffic.lon = tf.lon; - traffic.alt = tf.alt * 3.281; - traffic.heading = tf.heading; - traffic.relativeAlt = newAlt - this.planeAlt; - - let taTau = (traffic.slantDistance - TCAS.DMOD[this.sensitivity.getVar()][TaRaIndex.TA] ** 2 / traffic.slantDistance) / traffic.closureRate * 3600; - let raTau = (traffic.slantDistance - TCAS.DMOD[this.sensitivity.getVar()][TaRaIndex.RA] ** 2 / traffic.slantDistance) / traffic.closureRate * 3600; - let vTau = traffic.relativeAlt / (this.verticalSpeed - traffic.vertSpeed) * 60; - - if (raTau < 0) { - taTau = Infinity; - raTau = Infinity; - } - if (vTau < 0) { - vTau = Infinity; + traffic.alive = true; + traffic.seen = Math.min(traffic.seen + 1, 10); + const newAlt = tf.alt * 3.281; + traffic.vertSpeed = (newAlt - traffic.alt) / (_deltaTime / 1000) * 60; // feet per minute + traffic.groundSpeed = Math.abs(MathUtils.computeGreatCircleDistance(tf.lat, tf.lon, traffic.lat, traffic.lon) / (_deltaTime / 1000) * 3600); + const newSlantDist = MathUtils.computeDistance3D(traffic.lat, traffic.lon, traffic.alt, this.ppos.lat, this.ppos.long, this.pressureAlt); + const newClosureRate = (traffic.slantDistance - newSlantDist) / (_deltaTime / 1000) * 3600; // knots = nautical miles per hour + traffic.closureAccel = (newClosureRate - traffic.closureRate) / (_deltaTime / 1000); + traffic.closureRate = newClosureRate; + traffic.slantDistance = newSlantDist; + traffic.lat = tf.lat; + traffic.lon = tf.lon; + traffic.alt = tf.alt * 3.281; + traffic.heading = tf.heading; + traffic.relativeAlt = newAlt - this.planeAlt; + + let taTau = (traffic.slantDistance - TCAS.DMOD[this.sensitivity.getVar()][TaRaIndex.TA] ** 2 / traffic.slantDistance) / traffic.closureRate * 3600; + let raTau = (traffic.slantDistance - TCAS.DMOD[this.sensitivity.getVar()][TaRaIndex.RA] ** 2 / traffic.slantDistance) / traffic.closureRate * 3600; + let vTau = traffic.relativeAlt / (this.verticalSpeed - traffic.vertSpeed) * 60; + + if (raTau < 0) { + taTau = Infinity; + raTau = Infinity; + } + if (vTau < 0) { + vTau = Infinity; + } + traffic.taTau = taTau; + traffic.raTau = raTau; + traffic.vTau = vTau; } - traffic.taTau = taTau; - traffic.raTau = raTau; - traffic.vTau = vTau; }); if (this.airTraffic.length > TCAS.MEMORY_MAX) { diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h index b3d8601b608..f18cc26470c 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -36,6 +36,7 @@ class SimVars { ENUM PlaneAltitudeAGL = get_aircraft_var_enum("PLANE ALT ABOVE GROUND"); ID DevVar; + ID ProbeZero; ID RadAlt1; ID RadAlt2; ID AcBus1; @@ -45,6 +46,7 @@ class SimVars { void initializeVars() { DevVar = register_named_variable("A32NX_DEVELOPER_STATE"); + ProbeZero = register_named_variable("A32NX_RA_PROBE_ZERO"); RadAlt1 = register_named_variable("A32NX_RA_1_RAW"); RadAlt2 = register_named_variable("A32NX_RA_2_RAW"); AcBus1 = register_named_variable("A32NX_ELEC_AC_1_BUS_IS_POWERED"); @@ -53,11 +55,13 @@ class SimVars { //this->setDeveloperState(0); this->setRadioAltitude1(99999); this->setRadioAltitude2(99999); + this->setProbeZero(0); m_Units = new Units(); } // Collection of LVar 'set' Functions + void setProbeZero(FLOAT64 value) { set_named_variable_value(ProbeZero, value); } void setDeveloperState(FLOAT64 value) { set_named_variable_value(DevVar, value); } void setRadioAltitude1(FLOAT64 value) { set_named_variable_value(RadAlt1, value); } void setRadioAltitude2(FLOAT64 value) { set_named_variable_value(RadAlt2, value); } diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 02f99b82b33..6779da2b7e7 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -231,6 +231,7 @@ void createProbeMesh(int probeIndex) hr = SimConnect_AICreateSimulatedObject(hSimConnect, "ralt_probe", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); else hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); + } // Removes the probe mesh when RA is turned off. Called by REQUEST_PROBE_DATA @@ -277,7 +278,6 @@ void getStartupData() { createProbeMesh(i); } } - radarActive = true; } @@ -289,6 +289,8 @@ void removeProbes() { } simVars->setRadioAltitude1(99999); simVars->setRadioAltitude2(99999); + simVars->setProbeZero(0); + radarActive = false; } @@ -316,6 +318,9 @@ void probeInit(int probeIndex) 1, // set freeze value to 1 SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); + + if (probeIndex == 0) + simVars->setProbeZero(probeIndexnfo[0].id); } // Sets request for probe position while probes are being created. Called within REQUEST_PROBE_CREATE @@ -547,7 +552,7 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo simVars->setRadioAltitude2(99999); else simVars->setRadioAltitude2(radioAltitude * (99 + rand() % 2)/100); - + if (debug) { std::cout << "RADALT: Probe# (" << probeBest << ") Plane_Alt: " << planeAltitude << From b44ab3aa3605c6ca2f094a37eb51d4064c4867f9 Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Thu, 18 May 2023 14:36:50 +0200 Subject: [PATCH 12/20] Update TcasComputer.ts --- fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts b/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts index 8570680bea4..543deffea0f 100644 --- a/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts +++ b/fbw-a32nx/src/systems/tcas/src/components/TcasComputer.ts @@ -392,12 +392,11 @@ export class TcasComputer implements TcasComponent { // RA Probe Mesh - Read the uID for the first probe of the mesh, and sets the // length of the mesh (15 if RA is on, 0 if RA is off). // This is needed until Asobo fixes the isGround flag (among other things) - let probeId = SimVar.GetSimVarValue('L:A32NX_RA_PROBE_ZERO', 'number'); + const probeId = SimVar.GetSimVarValue('L:A32NX_RA_PROBE_ZERO', 'number'); let probeLen = 14; if (probeId === 0) { - probeLen = 0 + probeLen = 0; } - Coherent.call('GET_AIR_TRAFFIC').then((obj: JS_NPCPlane[]) => { this.airTraffic.forEach((traffic) => { traffic.alive = false; From b181f4d4bf0c786301615b579cf979a8ad31805a Mon Sep 17 00:00:00 2001 From: Taz5150 <70781153+Taz5150@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:41:58 +0200 Subject: [PATCH 13/20] fix: several documented fixes --- .../CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS | Bin 43832 -> 0 bytes ...CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS.json | 1 - .../CH_TARMAC_WORKER_STICK_COMP.PNG.DDS | Bin 43832 -> 0 bytes .../CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json | 1 - .../CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS | Bin 43832 -> 0 bytes .../CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json | 1 - .../CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS | Bin 87536 -> 0 bytes ...CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json | 1 - .../GroundVehicles/Probe/model/model.CFG | 2 - .../GroundVehicles/Probe/model/ralt_probe.bin | Bin 7668 -> 0 bytes .../Probe/model/ralt_probe.gltf | 681 ------------------ .../GroundVehicles/Probe/model/ralt_probe.xml | 38 - .../model/triangleWithoutIndices.bin | Bin .../model/triangleWithoutIndices.gltf | 0 .../SimObjects/GroundVehicles/Probe/sim.cfg | 5 +- .../GroundVehicles/Triangle/sim.cfg | 12 - fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h | 15 +- .../src/wasm/radalt_a320/src/radaltControl.h | 37 +- .../src/wasm/radalt_a320/src/radaltGauge.h | 1 + 19 files changed, 23 insertions(+), 772 deletions(-) delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS.json delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml rename fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/{Triangle => Probe}/model/triangleWithoutIndices.bin (100%) rename fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/{Triangle => Probe}/model/triangleWithoutIndices.gltf (100%) delete mode 100644 fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS deleted file mode 100644 index 1a465be65b2cc39d72c0943af7d977eee695e6ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43832 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 Nv#0c3eV5@<{{}fr{wV+e diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json deleted file mode 100644 index ba19f8bc907..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_COMP.PNG.DDS.json +++ /dev/null @@ -1 +0,0 @@ -{"Version":2,"SourceFileDate":132009986360000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP","FL_BITMAP_NO_GAMMA_CORRECTION","FL_BITMAP_METAL_ROUGH_AO_DATA"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS deleted file mode 100644 index 599d0fa9ebec441a2425b1d8d68b977c54b4458a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43832 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 A;{X5v diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json deleted file mode 100644 index dcb1fffc2cf..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS.json +++ /dev/null @@ -1 +0,0 @@ -{"Version":2,"SourceFileDate":132234909850000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS deleted file mode 100644 index dadc871b43828dd985f85ed84343d4e77ecc3388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87536 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 diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json deleted file mode 100644 index 905f0b4fa1d..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/TEXTURE/CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS.json +++ /dev/null @@ -1 +0,0 @@ -{"Version":2,"SourceFileDate":132009986270000000,"Flags":["FL_BITMAP_COMPRESSION","FL_BITMAP_MIPMAP","FL_BITMAP_TANGENT_DXT5N","FL_BITMAP_NO_GAMMA_CORRECTION"]} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG deleted file mode 100644 index b9dcaf85842..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/model.CFG +++ /dev/null @@ -1,2 +0,0 @@ -[models] -normal=ralt_probe.xml \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.bin deleted file mode 100644 index 498df6466dd7b787c9346c923594370c684791bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7668 zcmeHLZE#f889pJwLO?;jLj)>;CEuIf%_h6K%VKPnuOdkZ2&pAZQqT^aQ7jNkiF?@{ z3AT>*hYmy0CNLpgq=*5E5^^ajRIJEMQL(gO`6w~afMtjboe^rE_nf@jo8?~n$DeZN znfG4q!*kyAp7)+T5B;)YzSv`jgPxl!3}crO5tYrl$JOp6h=98KWySUr=SMeJ1dK}J z)aoBj+L%LN&R_TE8N@N_GmWIS=151S0iDG;1m=9YKQBO>Bdaq5NfphJP-Pi(PC5z9 zd0}lhuS;Gl-E5fiaUbxKU1StK+9bC6Fw=fpPx_%-h)5)yBJ?$0p%IvK{NxHb zufMOH(k?_aQd=qX`=LQ#4$td0=2tD}RjvQ7P-q0^nCr7h=2NDJ3rpPu=J32OBQG5Z ziIlMZoJVK`=9t$jOdPD2;VE?!n6q?k*r57MX`pHrPlOHeI__R zz?zonQFp1Ez#P;^>ZtnYktpi(xl?Ea=Hxc4kiD@>pW+uH9BD><7P?B^1m>VVQb(;j zVni6Ff(2DVO_bJIjB!N&FkNL4%&`506ml@Hb(`Skc&oCM~eJ_hL| zO{bizBOT=-{i3hcL150ZVHc#1s!uo)MSYe-gTS19t1d{L0p;nk51UY*`OqLRhx1YE zPWi<2cZyq_1m>VVQs={+P3R5eQ_-QXFK%@Zn8Wpv>wZhE`?aDLCxJPA`iJ@u{j;N} z)j?oRX6l;26U)1%wx+I8eb^JzyGtA%0&}*Cbxz_8O=~lv{V`TgR9~VwJOt+aeoULx z2_+S(eXK|5_0S+NC#!cX15x%yPqqFZzr#ad4#s+&#u}T}ruLtnu)YrO3Cuyx262=Q zY6zVayeBXR`AAMMsQ~$4-#|XU@HspL<{%%*QFAAqm_7{e3C!s;_b=7le_rhH5SVj% zcDn!N>`(khMYGX32H$C0vwokp+ecu|&B;pw#5w;`ovd@HtwV1w+3h1R$LnvBoKx2_ z)IQ%P^a{KuFsHp|vE;P8SgXFBwvgWC-|ZtX2l=$qSjR=P`YzgP^(fvGn1g%_;#_^H zPW3!=Cg44RImkzH-s{Ow`zrD|;M?sZFbDZa&c+vORj*=RRd`QePM`W*LLZ_&ci}yO zIp+F&T(~hp^*Q4`oJnAgd8}OT#z+S^fAd~0ATYMJL$yq)j6FSfjOLyoO|y%swM;V z0hn`3JaCA3J8n;#CUe#W0^Sn%A_D$^b12U7;V%fi9Oz8z<@`^F|9x*9^?a*uTKeIj zH@4C^xT`~+*%EyUIQxmSEVeRma2|2)^eJx*&NYZ*EX+3gwKZA#lp}+41H^gz;p{-a ziY7~+^3wqgf%IqdgH^Ati}z2WPci5Gbv}i3TEEyA@3BOma`|SC%!hK`ZsSvi6z`Gw zyt%q2-iL`krRtf-rOua?S?c%8!l&@O=DfNt-m8f|#ay4S^C>j1ySMovVwp)bFWmMRV=#>czii=CUg$h4^XZ;37ky~$Q+7^2Cv}!3 zkCT09>7u<)shQYL^IG8U zG)P z`V`bh>YROY3)TzyR9O3z_`2Kq6m$RB_>}r>^?~a{x~9HyVy)^!3!n1nFQ0Z2=gg2j zwm#*ZM|VjbUviP!$1HrxQ@vvyKe1NzhJ{bTSg+GqpAFe#>r;@kK^&!n8d~@iD=j4`pn(Nr{sT-=0EevN&k^|w-}9S_KUcK|Ycb8@&|sBAq*ZN}u|4S^E@oee8USc`Q4hVpYRLpJL9( z&Zn5aK|7yf-p6cxip3svhfgtmr*=NYytml-6!Si2=TppkxSdZi|6bVn6muWi`INr> zW9?JSy=v!E%)M&oQ_N?r16|fW#e9zH9%JoO%x97VY1Tf)eBS83WbIS_^7J!-nt_9Y zMrecDS8aR>afZ%46hA{I`ji<U> z{lpyc5I}1@7pq$i%*D!904fd;l~~;hpb{%P4^VNisKV;b1FEpH^8poyiUnBR`M?6K W?8AVHBQP5E(zhM;ZAX2x9ra%sRm>Uy diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf deleted file mode 100644 index 120b01f673a..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.gltf +++ /dev/null @@ -1,681 +0,0 @@ -{ - "accessors": [ - { - "bufferView": 0, - "componentType": 5126, - "count": 87, - "min": [ - -0.027643540874123573, - 0.0004084900429006666, - -0.027597004547715187 - ], - "max": [ - 0.027643544599413872, - 0.3816501796245575, - 0.02759690396487713 - ], - "type": "VEC3", - "name": "x0_Stick_Left_vertices#0_POSITION" - }, - { - "bufferView": 0, - "byteOffset": 12, - "componentType": 5120, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Left_vertices#0_TANGENT" - }, - { - "bufferView": 0, - "byteOffset": 16, - "componentType": 5120, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Left_vertices#0_NORMAL" - }, - { - "bufferView": 0, - "byteOffset": 20, - "componentType": 5122, - "count": 87, - "type": "VEC2", - "name": "x0_Stick_Left_vertices#0_TEXCOORD_0" - }, - { - "bufferView": 0, - "byteOffset": 24, - "componentType": 5122, - "count": 87, - "type": "VEC2", - "name": "x0_Stick_Left_vertices#0_TEXCOORD_1" - }, - { - "bufferView": 0, - "byteOffset": 28, - "componentType": 5123, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Left_vertices#0_COLOR_0" - }, - { - "bufferView": 1, - "componentType": 5123, - "count": 294, - "type": "SCALAR", - "name": "x0_Stick_Left_indices#0" - }, - { - "bufferView": 0, - "byteOffset": 3132, - "componentType": 5126, - "count": 3, - "min": [ - -0.7500150203704834, - 0, - -0.7499643564224243 - ], - "max": [ - 0.7500150203704834, - 0, - 0.7499643564224243 - ], - "type": "VEC3", - "name": "Stick_HitBox_Left_vertices#0_POSITION" - }, - { - "bufferView": 0, - "byteOffset": 3144, - "componentType": 5120, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Left_vertices#0_TANGENT" - }, - { - "bufferView": 0, - "byteOffset": 3148, - "componentType": 5120, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Left_vertices#0_NORMAL" - }, - { - "bufferView": 0, - "byteOffset": 3152, - "componentType": 5122, - "count": 3, - "type": "VEC2", - "name": "Stick_HitBox_Left_vertices#0_TEXCOORD_0" - }, - { - "bufferView": 0, - "byteOffset": 3156, - "componentType": 5122, - "count": 3, - "type": "VEC2", - "name": "Stick_HitBox_Left_vertices#0_TEXCOORD_1" - }, - { - "bufferView": 0, - "byteOffset": 3160, - "componentType": 5123, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Left_vertices#0_COLOR_0" - }, - { - "bufferView": 1, - "byteOffset": 588, - "componentType": 5123, - "count": 3, - "type": "SCALAR", - "name": "Stick_HitBox_Left_indices#0" - }, - { - "bufferView": 0, - "byteOffset": 3240, - "componentType": 5126, - "count": 87, - "min": [ - -0.027377445250749588, - 0.0004078660858795047, - -0.027904797345399857 - ], - "max": [ - 0.027377448976039886, - 0.3810672461986542, - 0.027904696762561798 - ], - "type": "VEC3", - "name": "x0_Stick_Right_vertices#0_POSITION" - }, - { - "bufferView": 0, - "byteOffset": 3252, - "componentType": 5120, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Right_vertices#0_TANGENT" - }, - { - "bufferView": 0, - "byteOffset": 3256, - "componentType": 5120, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Right_vertices#0_NORMAL" - }, - { - "bufferView": 0, - "byteOffset": 3260, - "componentType": 5122, - "count": 87, - "type": "VEC2", - "name": "x0_Stick_Right_vertices#0_TEXCOORD_0" - }, - { - "bufferView": 0, - "byteOffset": 3264, - "componentType": 5122, - "count": 87, - "type": "VEC2", - "name": "x0_Stick_Right_vertices#0_TEXCOORD_1" - }, - { - "bufferView": 0, - "byteOffset": 3268, - "componentType": 5123, - "count": 87, - "type": "VEC4", - "name": "x0_Stick_Right_vertices#0_COLOR_0" - }, - { - "bufferView": 1, - "byteOffset": 594, - "componentType": 5123, - "count": 294, - "type": "SCALAR", - "name": "x0_Stick_Right_indices#0" - }, - { - "bufferView": 0, - "byteOffset": 6372, - "componentType": 5126, - "count": 3, - "min": [ - -0.742795467376709, - 0, - -0.7488188743591309 - ], - "max": [ - 0.742795467376709, - 0, - 0.7488188743591309 - ], - "type": "VEC3", - "name": "Stick_HitBox_Right_vertices#0_POSITION" - }, - { - "bufferView": 0, - "byteOffset": 6384, - "componentType": 5120, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Right_vertices#0_TANGENT" - }, - { - "bufferView": 0, - "byteOffset": 6388, - "componentType": 5120, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Right_vertices#0_NORMAL" - }, - { - "bufferView": 0, - "byteOffset": 6392, - "componentType": 5122, - "count": 3, - "type": "VEC2", - "name": "Stick_HitBox_Right_vertices#0_TEXCOORD_0" - }, - { - "bufferView": 0, - "byteOffset": 6396, - "componentType": 5122, - "count": 3, - "type": "VEC2", - "name": "Stick_HitBox_Right_vertices#0_TEXCOORD_1" - }, - { - "bufferView": 0, - "byteOffset": 6400, - "componentType": 5123, - "count": 3, - "type": "VEC4", - "name": "Stick_HitBox_Right_vertices#0_COLOR_0" - }, - { - "bufferView": 1, - "byteOffset": 1182, - "componentType": 5123, - "count": 3, - "type": "SCALAR", - "name": "Stick_HitBox_Right_indices#0" - } - ], - "asset": { - "generator": "babylon.js glTF exporter for 3dsmax 2022 v1.0.8174.31295", - "version": "2.0", - "extensions": { - "ASOBO_asset_optimized": { - "BoundingBoxMax": [ - 0.7500300407409668, - 0.38163238763809204, - 0.7499287724494934 - ], - "BoundingBoxMin": [ - -0.7500300407409668, - 0, - -0.7499287724494934 - ], - "MajorVersion": 4, - "MinorVersion": 4, - "UseCheckerboardMaterialForMissingTextures": true, - "UseOnlyFilenameForImageURI": true - }, - "ASOBO_normal_map_convention": { - "tangent_space_convention": "DirectX" - } - } - }, - "bufferViews": [ - { - "buffer": 0, - "byteLength": 6480, - "byteStride": 36, - "target": 34962, - "name": "BufferViewVertexND" - }, - { - "buffer": 0, - "byteLength": 1188, - "byteOffset": 6480, - "target": 34963, - "name": "BufferViewIndex" - } - ], - "extensionsRequired": [ - "MSFT_texture_dds" - ], - "materials": [ - { - "name": "Stick_Pawap", - "normalTexture": { - "index": 2 - }, - "occlusionTexture": { - "index": 1 - }, - "emissiveTexture": { - "index": 3 - }, - "emissiveFactor": [ - 0.9843137860298157, - 0.9843137860298157, - 0.9843137860298157 - ], - "pbrMetallicRoughness": { - "baseColorTexture": { - "index": 0 - }, - "metallicRoughnessTexture": { - "index": 1 - } - } - }, - { - "name": "Material #1", - "pbrMetallicRoughness": { - "baseColorFactor": [ - 1, - 1, - 1, - 0.7 - ] - }, - "extensions": { - "ASOBO_material_invisible": {} - } - } - ], - "meshes": [ - { - "primitives": [ - { - "attributes": { - "COLOR_0": 5, - "NORMAL": 2, - "POSITION": 0, - "TANGENT": 1, - "TEXCOORD_0": 3, - "TEXCOORD_1": 4 - }, - "indices": 6, - "material": 0, - "mode": 4, - "extras": { - "ASOBO_primitive": { - "PrimitiveCount": 98, - "VertexType": "VTX", - "VertexVersion": 2 - } - } - } - ], - "name": "x0_Stick_Left" - }, - { - "primitives": [ - { - "attributes": { - "COLOR_0": 12, - "NORMAL": 9, - "POSITION": 7, - "TANGENT": 8, - "TEXCOORD_0": 10, - "TEXCOORD_1": 11 - }, - "indices": 13, - "material": 1, - "mode": 4, - "extras": { - "ASOBO_primitive": { - "PrimitiveCount": 1, - "VertexType": "VTX", - "VertexVersion": 2 - } - } - } - ], - "name": "Stick_HitBox_Left" - }, - { - "primitives": [ - { - "attributes": { - "COLOR_0": 19, - "NORMAL": 16, - "POSITION": 14, - "TANGENT": 15, - "TEXCOORD_0": 17, - "TEXCOORD_1": 18 - }, - "indices": 20, - "material": 0, - "mode": 4, - "extras": { - "ASOBO_primitive": { - "PrimitiveCount": 98, - "VertexType": "VTX", - "VertexVersion": 2 - } - } - } - ], - "name": "x0_Stick_Right" - }, - { - "primitives": [ - { - "attributes": { - "COLOR_0": 26, - "NORMAL": 23, - "POSITION": 21, - "TANGENT": 22, - "TEXCOORD_0": 24, - "TEXCOORD_1": 25 - }, - "indices": 27, - "material": 1, - "mode": 4, - "extras": { - "ASOBO_primitive": { - "PrimitiveCount": 1, - "VertexType": "VTX", - "VertexVersion": 2 - } - } - } - ], - "name": "Stick_HitBox_Right" - } - ], - "nodes": [ - { - "translation": [ - 1.1920929e-7, - 1.1920929e-7, - 2.98023224e-8 - ], - "rotation": [ - 7.450581e-9, - 0, - 0, - 1 - ], - "scale": [ - 0.999981165, - 1.00004876, - 0.999973834 - ], - "extensions": { - "ASOBO_unique_id": { - "id": "Stick_L_CTRL" - } - }, - "name": "Stick_L_CTRL", - "children": [ - 1, - 2 - ] - }, - { - "translation": [ - -1.19213823e-7, - -3.57612151e-7, - -3.725429e-8 - ], - "rotation": [ - -4.76837158e-7, - 3.16665023e-8, - 2.38418579e-7, - 1 - ], - "scale": [ - 1.00001788, - 0.999952, - 1.00002623 - ], - "mesh": 0, - "extensions": { - "ASOBO_unique_id": { - "id": "x0_Stick_Left" - } - }, - "name": "Stick_Left" - }, - { - "translation": [ - -1.19211535e-7, - 0.744731665, - -4.09013055e-8 - ], - "rotation": [ - 0.7071068, - 0, - 0, - 0.7071067 - ], - "scale": [ - 1.00001884, - 1.00002623, - 0.9999513 - ], - "mesh": 1, - "extensions": { - "ASOBO_unique_id": { - "id": "Stick_HitBox_Left" - } - }, - "name": "Stick_HitBox_Left" - }, - { - "translation": [ - 0.0000174045563, - -0.00005686283, - 0.0000028014183 - ], - "rotation": [ - 0, - 0.000008523464, - 0, - 1 - ], - "scale": [ - 1.00971627, - 1.00159431, - 0.988959551 - ], - "extensions": { - "ASOBO_unique_id": { - "id": "Stick_R_CTRL" - } - }, - "name": "Stick_R_CTRL", - "children": [ - 4, - 5 - ] - }, - { - "translation": [ - -0.0000172370255, - 0.0000565342743, - -0.0000028405268 - ], - "rotation": [ - -4.768392e-7, - -0.000008583068, - 2.38414486e-7, - 1 - ], - "scale": [ - 0.9903762, - 0.9984089, - 1.01116371 - ], - "mesh": 2, - "extensions": { - "ASOBO_unique_id": { - "id": "x0_Stick_Right" - } - }, - "name": "Stick_Right" - }, - { - "translation": [ - -0.0000172370255, - 0.7436392, - -0.00000283299255 - ], - "rotation": [ - 0.7071068, - -0.00000606914546, - 0.00000606914546, - 0.7071067 - ], - "scale": [ - 0.9903771, - 1.01116371, - 0.998408139 - ], - "mesh": 3, - "extensions": { - "ASOBO_unique_id": { - "id": "Stick_HitBox_Right" - } - }, - "name": "Stick_HitBox_Right" - } - ], - "scene": 0, - "scenes": [ - { - "nodes": [ - 0, - 3 - ] - } - ], - "textures": [ - { - "extensions": { - "MSFT_texture_dds": { - "source": 0 - } - } - }, - { - "extensions": { - "MSFT_texture_dds": { - "source": 1 - } - } - }, - { - "extensions": { - "MSFT_texture_dds": { - "source": 2 - } - } - }, - { - "extensions": { - "MSFT_texture_dds": { - "source": 3 - } - } - } - ], - "extensionsUsed": [ - "ASOBO_normal_map_convention", - "ASOBO_unique_id", - "ASOBO_material_invisible", - "MSFT_texture_dds", - "ASOBO_asset_optimized" - ], - "buffers": [ - { - "byteLength": 7668, - "uri": "ralt_probe.bin" - } - ], - "images": [ - { - "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_ALBEDO.PNG.DDS", - "extras": "ASOBO_image_converted_meta" - }, - { - "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_COMP.PNG.DDS", - "extras": "ASOBO_image_converted_meta" - }, - { - "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_NORMAL.PNG.DDS", - "extras": "ASOBO_image_converted_meta" - }, - { - "uri": "TEXTURE\\CH_TARMAC_WORKER_STICK_EMIS.PNG.DDS", - "extras": "ASOBO_image_converted_meta" - } - ] -} \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml deleted file mode 100644 index b4d1b5cc918..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/ralt_probe.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - (E:TIME OF DAY, Enum) 1 != - - - - - - - - (E:TIME OF DAY, Enum) 1 != - - - - - - - - - - - diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.bin b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/triangleWithoutIndices.bin similarity index 100% rename from fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.bin rename to fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/triangleWithoutIndices.bin diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/triangleWithoutIndices.gltf similarity index 100% rename from fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/model/triangleWithoutIndices.gltf rename to fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/model/triangleWithoutIndices.gltf diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg index 92f4baa9817..bd0afcaee0e 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Probe/sim.cfg @@ -4,10 +4,9 @@ Minor=0 [fltsim.0] -title=ralt_probe +title=triangleWithoutIndices model= texture= [General] -category=GroundVehicle - +category=GroundVehicle \ No newline at end of file diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg deleted file mode 100644 index bd0afcaee0e..00000000000 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/GroundVehicles/Triangle/sim.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[VERSION] -Major=1 -Minor=0 - - -[fltsim.0] -title=triangleWithoutIndices -model= -texture= - -[General] -category=GroundVehicle \ No newline at end of file diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h index f18cc26470c..9e38ffce197 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/SimVars.h @@ -37,8 +37,7 @@ class SimVars { ID DevVar; ID ProbeZero; - ID RadAlt1; - ID RadAlt2; + ID RadAlt; ID AcBus1; ID AcBus2; @@ -47,14 +46,12 @@ class SimVars { void initializeVars() { DevVar = register_named_variable("A32NX_DEVELOPER_STATE"); ProbeZero = register_named_variable("A32NX_RA_PROBE_ZERO"); - RadAlt1 = register_named_variable("A32NX_RA_1_RAW"); - RadAlt2 = register_named_variable("A32NX_RA_2_RAW"); + RadAlt = register_named_variable("A32NX_RA_RAW"); AcBus1 = register_named_variable("A32NX_ELEC_AC_1_BUS_IS_POWERED"); AcBus2 = register_named_variable("A32NX_ELEC_AC_2_BUS_IS_POWERED"); //this->setDeveloperState(0); - this->setRadioAltitude1(99999); - this->setRadioAltitude2(99999); + this->setRadioAltitude(99999); this->setProbeZero(0); @@ -63,13 +60,11 @@ class SimVars { // Collection of LVar 'set' Functions void setProbeZero(FLOAT64 value) { set_named_variable_value(ProbeZero, value); } void setDeveloperState(FLOAT64 value) { set_named_variable_value(DevVar, value); } - void setRadioAltitude1(FLOAT64 value) { set_named_variable_value(RadAlt1, value); } - void setRadioAltitude2(FLOAT64 value) { set_named_variable_value(RadAlt2, value); } + void setRadioAltitude(FLOAT64 value) { set_named_variable_value(RadAlt, value); } // Collection of SimVar/LVar 'get' Functions FLOAT64 getDeveloperState() { return get_named_variable_value(DevVar); } - FLOAT64 getRadarAltitude1() { return get_named_variable_value(RadAlt1); } - FLOAT64 getRadarAltitude2() { return get_named_variable_value(RadAlt2); } + FLOAT64 getRadarAltitude() { return get_named_variable_value(RadAlt); } FLOAT64 getAcBusState1() { return get_named_variable_value(AcBus1); } FLOAT64 getAcBusState2() { return get_named_variable_value(AcBus2); } FLOAT64 getPlaneAltitudeAGL() { return aircraft_varget(PlaneAltitudeAGL, m_Units->Feet, 0); } diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 6779da2b7e7..f71e8753604 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -24,6 +24,7 @@ double rxActual = 0.0; // Static static bool radarActive = false; +static bool simPaused = false; // Constants constexpr int MAX_AI = 15; @@ -102,6 +103,7 @@ struct ProbeInfo static enum EVENT_ID { EVENT_4S_TIMER, + EVENT_PAUSED, EVENT_RADAR_ON, EVENT_RADAR_OFF, EVENT_FREEZE_LATLONG, @@ -210,7 +212,6 @@ void createProbeMesh(int probeIndex) SIMCONNECT_DATA_INITPOSITION initPosition; HRESULT hr; - srand(time(0)); devState = simVars->getDeveloperState(); ProbeStruct probeResult = distanceAndBearing(userPosition, probeIndex, preSample, probeBest); @@ -227,10 +228,7 @@ void createProbeMesh(int probeIndex) initPosition.OnGround = 1; initPosition.Airspeed = 0; - if (devState == 3.0) - hr = SimConnect_AICreateSimulatedObject(hSimConnect, "ralt_probe", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); - else - hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); + hr = SimConnect_AICreateSimulatedObject(hSimConnect, "triangleWithoutIndices", initPosition, (UINT)REQUEST_PROBE_CREATE + probeIndex); } @@ -287,8 +285,7 @@ void removeProbes() { for (int i = 0; i < MAX_AI; i++) { removeProbeMesh(i); } - simVars->setRadioAltitude1(99999); - simVars->setRadioAltitude2(99999); + simVars->setRadioAltitude(99999); simVars->setProbeZero(0); radarActive = false; @@ -475,6 +472,10 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo switch (evt->uEventID) { + case EVENT_PAUSED: + simPaused = evt->dwData; + if (debug) std::cout << "RADALT: [EVENT_PAUSED] = " << simPaused << std::endl; + break; case EVENT_4S_TIMER: if (devState == 0) { double acBusState = simVars->getAcBusState1() + simVars->getAcBusState2(); @@ -533,25 +534,17 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo probePosition.pitch = pS->pitch; // ground distance probePosition.heading = pS->heading; // ground bearing - updateProbeMesh(probeIndex, preSample, probeBest); - readProbeData(probeIndex, probePosition); + if (simPaused == false) { + updateProbeMesh(probeIndex, preSample, probeBest); + readProbeData(probeIndex, probePosition); + } if (probeIndex == MAX_AI - 1) { if (preSample == 0) { - if (radioAltitude <= 75) - radioAltitude = radioAltitude + (-15.0 + rand() % 31) / 10; - else if (radioAltitude > 75 && radioAltitude < 99999) - radioAltitude = radioAltitude * (1.0 + (-2.0 + rand() % 5) / 100); - - if (simVars->getAcBusState1() == 1) - simVars->setRadioAltitude1(radioAltitude); - else - simVars->setRadioAltitude1(99999); - - if (simVars->getAcBusState2() == 0 || radioAltitude == 99999) - simVars->setRadioAltitude2(99999); + if (simVars->getAcBusState1() == 1 || simVars->getAcBusState2() == 1) + simVars->setRadioAltitude(radioAltitude); else - simVars->setRadioAltitude2(radioAltitude * (99 + rand() % 2)/100); + simVars->setRadioAltitude(99999); if (debug) { std::cout << "RADALT: Probe# (" << probeBest << diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h index 30fbea64e20..56ef3855425 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.h @@ -55,6 +55,7 @@ class RadaltGauge { // Subscribe to the repeating 4-second timer event SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_4S_TIMER, "4sec"); + SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_PAUSED, "Pause"); // set the id for the freeze events so this client has full control of probe objects SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_FREEZE_LATLONG, "FREEZE_LATITUDE_LONGITUDE_SET"); From 5f8240efd3011698295876e76abd6fc713ce10ed Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:51:27 +0200 Subject: [PATCH 14/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index f71e8753604..11fb375a6bf 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -207,8 +207,7 @@ ProbeStruct distanceAndBearing(const UserStruct& user, int probeIndex, int preSa } // Creates initial probe mesh when RA is turned on. Called by REQUEST_USER_DATA -void createProbeMesh(int probeIndex) -{ +void createProbeMesh(int probeIndex) { SIMCONNECT_DATA_INITPOSITION initPosition; HRESULT hr; From bb89a1f2c911c3ebb33565c2da7510c1cbdf71c4 Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:54:18 +0200 Subject: [PATCH 15/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 11fb375a6bf..125e0a1122a 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -233,7 +233,6 @@ void createProbeMesh(int probeIndex) { // Removes the probe mesh when RA is turned off. Called by REQUEST_PROBE_DATA void removeProbeMesh(int probeIndex) { - HRESULT hr; if (probeIndexnfo[probeIndex].created) { From f771496989b7ce57c975651c3b9455c7bbea8cc1 Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:55:48 +0200 Subject: [PATCH 16/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 125e0a1122a..50fbb57d8cb 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -459,8 +459,7 @@ static const char* ExceptionName(SIMCONNECT_EXCEPTION exception) { return "UNKNOWN EXCEPTION"; } } -void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext) -{ +void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext) { switch (pData->dwID) { case SIMCONNECT_RECV_ID_EVENT: From 2fb7485e2eaf0a4b7ad03babd5f2d085cc7c386f Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:56:34 +0200 Subject: [PATCH 17/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index 50fbb57d8cb..fabb101f685 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -182,7 +182,6 @@ ProbeStruct distanceAndBearing(const UserStruct& user, int probeIndex, int preSa double bearing = atan2(probeY, probeX); // 2D top-down bearing (degrees) - //bearing += (probeY < 0) ? PI : ((probeX < 0 && probeY > 0) ? (2 * PI) : 0); bearing += user.heading; double distance = sqrt(probeX * probeX + probeY * probeY); // 2D top-down distance (feet) From 2fabd178b531741096a3424ae0169980b402a12d Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:56:56 +0200 Subject: [PATCH 18/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp index a8019256791..0ce35f01478 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltGauge.cpp @@ -6,7 +6,8 @@ __attribute__((export_name("RadAlt_gauge_callback"))) extern "C" MSFS_CALLBACK b switch (service_id) { case PANEL_SERVICE_PRE_INSTALL: { return true; - } break; + } + break; case PANEL_SERVICE_POST_INSTALL: return RADALT_GAUGE.initializeRA(); break; From 2481d44167ca2f82796f589d26d254717c05a63c Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 15:57:54 +0200 Subject: [PATCH 19/20] Update fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h Co-authored-by: 2hwk <15316958+2hwk@users.noreply.github.com> --- fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index fabb101f685..af51624663b 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -292,14 +292,6 @@ void removeProbes() { void probeInit(int probeIndex) { HRESULT hr; - //hr = SimConnect_AIReleaseControl(hSimConnect, probeIndexnfo[probeIndex].id, (UINT)REQUEST_PROBE_RELEASE+probeIndex); - - //hr = SimConnect_TransmitClientEvent(hSimConnect, - // probeIndexnfo[probeIndex].id, - // EVENT_FREEZE_ALTITUDE, - // 1, // set freeze value to 1 - // SIMCONNECT_GROUP_PRIORITY_HIGHEST, - // SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); hr = SimConnect_TransmitClientEvent(hSimConnect, probeIndexnfo[probeIndex].id, EVENT_FREEZE_ATTITUDE, From f3180450b333faac42eb062530605b6baa90502c Mon Sep 17 00:00:00 2001 From: Taz5150 Date: Tue, 4 Jul 2023 22:27:57 +0200 Subject: [PATCH 20/20] update: suggestions from 2Hwk --- .../src/wasm/radalt_a320/src/radaltControl.h | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h index af51624663b..ae3e5746bff 100644 --- a/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h +++ b/fbw-a32nx/src/wasm/radalt_a320/src/radaltControl.h @@ -53,6 +53,7 @@ constexpr double MAX_BEAM_DISTANCE = 8192; constexpr double GAIN_FACTOR = POWER_TX * GAIN_TX_RX * WAVELENGTH_SQUARED; constexpr double PI_FACTOR = 64.0 * PI_THIRD; constexpr double K = GAIN_FACTOR / PI_FACTOR; +constexpr double FEET_TO_METER = 3.28084; const double TAN_H_ANGLE = tan(H_ANGLE * DEG_TO_RAD); const double TAN_V_ANGLE = tan(V_ANGLE * DEG_TO_RAD); @@ -139,7 +140,8 @@ ProbeInfo probeIndexnfo[MAX_AI]; double probeRX(double beamActual) { double alpha = 0.01; - beamActual = beamActual / 3.28084; + beamActual = beamActual / FEET_TO_METER; + // sigmaFactor: the function in parenthesis represents the linear relationship between air conductivity (S/m) and aircraft altitude double sigmaFactor = PI * TAN_H_ANGLE * TAN_V_ANGLE * ((0.0021529922 * beamActual) + 1.9649909) / beamActual; double noiseFactor = std::exp(-2 * beamActual * alpha / 1000); return 10 * std::log10(K * sigmaFactor * noiseFactor * 1000); @@ -289,8 +291,7 @@ void removeProbes() { } // Calls freeze events on each probe. Called within REQUEST_PROBE_CREATE -void probeInit(int probeIndex) -{ +void probeInit(int probeIndex) { HRESULT hr; hr = SimConnect_TransmitClientEvent(hSimConnect, probeIndexnfo[probeIndex].id, @@ -305,8 +306,9 @@ void probeInit(int probeIndex) SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); - if (probeIndex == 0) + if (probeIndex == 0) { simVars->setProbeZero(probeIndexnfo[0].id); + } } // Sets request for probe position while probes are being created. Called within REQUEST_PROBE_CREATE @@ -355,16 +357,18 @@ void readProbeData(int probeIndex, ProbeStruct probePosition) { if (isNewRxMax(rxActual, rxMax)) { radioAltitude = userPosition.altitude - probePosition.altitude; rxMax = rxActual; - if (preSample == 1) + if (preSample == 1) { probeBest = probeIndex; + } planeAltitude = userPosition.altitude; // Debug probeAltitude = probePosition.altitude; // Debug planeAboveGround = userPosition.altitudeAboveGround; // Debug } if (probeIndex == MAX_AI - 1) { - if (radioAltitude > MAX_BEAM_DISTANCE || rxMax < NOISE_FLOOR) + if (radioAltitude > MAX_BEAM_DISTANCE || rxMax < NOISE_FLOOR) { radioAltitude = 99999; + } } } @@ -469,15 +473,13 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo double acBusState = simVars->getAcBusState1() + simVars->getAcBusState2(); double altitudeAGL = simVars->getPlaneAltitudeAGL(); - if (!radarActive && acBusState > 0 && altitudeAGL < MAX_BEAM_DISTANCE) - { + if (!radarActive && acBusState > 0 && altitudeAGL < MAX_BEAM_DISTANCE) { if (debug) std::cout << "RADALT: [EVENT_4S_TIMER] Probe START ..." << std::endl; getStartupData(); } if ((radarActive && acBusState < 1) || - (radarActive && acBusState > 0 && altitudeAGL > MAX_BEAM_DISTANCE)) - { + (radarActive && acBusState > 0 && altitudeAGL > MAX_BEAM_DISTANCE)) { if (debug) std::cout << "RADALT: [EVENT_4S_TIMER] Probe STOP ..." << std::endl; removeProbes(); } @@ -485,16 +487,14 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo break; case EVENT_RADAR_ON: if (debug) std::cout << "RADALT: [EVENT_RADAR_ON]" << std::endl; - if (!radarActive) - { + if (!radarActive) { simVars = new SimVars(); getStartupData(); } break; case EVENT_RADAR_OFF: if (debug) std::cout << "RADALT: [EVENT_RADAR_OFF]" << std::endl; - if (radarActive) - { + if (radarActive) { removeProbes(); } break; @@ -529,10 +529,11 @@ void CALLBACK RadaltDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pCo if (probeIndex == MAX_AI - 1) { if (preSample == 0) { - if (simVars->getAcBusState1() == 1 || simVars->getAcBusState2() == 1) + if (simVars->getAcBusState1() == 1 || simVars->getAcBusState2() == 1) { simVars->setRadioAltitude(radioAltitude); - else + } else { simVars->setRadioAltitude(99999); + } if (debug) { std::cout << "RADALT: Probe# (" << probeBest <<