From b601fd7c2cecc9936c24e34b99e88e353838c98d Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Wed, 17 Feb 2021 00:30:26 +0100 Subject: [PATCH] high/low aircraft relative altitude modes --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 131 +++++++++++------- .../ND/canvas/res/terrain/tile_cl.png | Bin 0 -> 1843 bytes .../ND/canvas/res/terrain/tile_gh.png | Bin 0 -> 2069 bytes .../res/terrain/{tile_02.png => tile_gs.png} | Bin .../res/terrain/{tile_01.png => tile_lg.png} | Bin .../res/terrain/{tile_09.png => tile_lm.png} | Bin .../ND/canvas/res/terrain/tile_rh.png | Bin 0 -> 2135 bytes .../res/terrain/{tile_05.png => tile_rl.png} | Bin .../res/terrain/{tile_06.png => tile_rs.png} | Bin .../ND/canvas/res/terrain/tile_s1.png | Bin 1851 -> 0 bytes .../ND/canvas/res/terrain/tile_yh.png | Bin 0 -> 2190 bytes .../res/terrain/{tile_03.png => tile_yl.png} | Bin .../res/terrain/{tile_04.png => tile_ys.png} | Bin Models/Instruments/ND/canvas/style.nas | 2 + 14 files changed, 85 insertions(+), 48 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_cl.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_gh.png rename Models/Instruments/ND/canvas/res/terrain/{tile_02.png => tile_gs.png} (100%) rename Models/Instruments/ND/canvas/res/terrain/{tile_01.png => tile_lg.png} (100%) rename Models/Instruments/ND/canvas/res/terrain/{tile_09.png => tile_lm.png} (100%) create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_rh.png rename Models/Instruments/ND/canvas/res/terrain/{tile_05.png => tile_rl.png} (100%) rename Models/Instruments/ND/canvas/res/terrain/{tile_06.png => tile_rs.png} (100%) delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_s1.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_yh.png rename Models/Instruments/ND/canvas/res/terrain/{tile_03.png => tile_yl.png} (100%) rename Models/Instruments/ND/canvas/res/terrain/{tile_04.png => tile_ys.png} (100%) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index b1934b8e..554e9800 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -10,7 +10,11 @@ var element_type = "group"; var terrain_minalt = props.globals.initNode("/custom/terrain/min-altitude", 0,"INT"); var terrain_maxalt = props.globals.initNode("/custom/terrain/max-altitude", -9999,"INT"); -var tile_list = ["*black*","tile_01.png","tile_02.png","tile_03.png","tile_04.png","tile_06.png","tile_09.png","tile_s1.png"]; +var tile_list = [ + nil,"tile_gl.png","tile_gh.png","tile_yl.png","tile_yh.png","tile_rh.png", # 0-5 low alt + "tile_gl.png","tile_gh.png","tile_gs.png",nil, # 6-9 hi alt + "tile_ml.png","tile_cl.png" # 10 magenta - 11 cyan (water) + ]; var is_terrain = 0; @@ -36,6 +40,7 @@ var updateTerrain = func { if (me.request_clear == 1) { me.request_clear = 0; me.clear(); + me.group.setVisible(1); } var RAD2DEG = 57.2957795; @@ -44,15 +49,17 @@ var updateTerrain = func { var pos_lat = me.reference.lat(); var pos_lon = me.reference.lon(); - var heading = me.reference.heading; - var altitudeft = me.reference.altitudeft; + var heading = me.refheading; + var altitudeft = me.refaltitudeft; + var lowaltft = me.reflowaltft; + var basealtft = me.basealtitudeft; var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; var a = int(me.radar_beacon/2); - var col = a; + var col = a + 0.5; if (side == "R") { - col = -1 + (-1 * a); + col = -col; } var trn = me.terrlayer[side ~ a]; @@ -67,6 +74,8 @@ var updateTerrain = func { var elevft = []; + me.radar_cleared = 0; + for (var row = 0; row < len; row += 1) { if (trn[row] == nil) { @@ -80,36 +89,44 @@ var updateTerrain = func { var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black if (elev != nil) { - if (me.is_terrain) { - if (elevme.max_altitude) me.max_altitude = elev; - if (elev < me.basealtitudeft) grad = 0; # < 400 near runway use blank + if (elevme.max_altitude) me.max_altitude = elev; + if (me.is_terrain) { + if (elev < basealtft) grad = 0; # < 400 near runway use blank else { var diff = elev - altitudeft; if (diff>=0) { grad = int(diff/1000) + 3; if (grad>5) grad = 5; } else { - if (diff>-500) grad = 3; # lite yellow - else { - grad = 2 + int(diff/1000); - if (grad<0) grad = 0; - } + if (me.hialtmode == 0) { + if (diff>=lowaltft) grad = 3; # lite yellow + else { + grad = 2 + int(diff/1000); + if (grad<0) grad = 0; + } + } else { + if (diff>=lowaltft) grad = 3; # lite yellow + else { + if (me.bands_range > 0 and elev > me.bands_minalt) { + elev -= me.bands_minalt; + grad = int(elev / (me.bands_range / 3)) + 6; + if (grad>8) grad = 8; # solid green + } + } + } } } } else { - var diff = elev - altitudeft; - if (diff>=-2000) grad = 7; #sea + grad = 11; #water } append(elevft,grad); # 0-5 } else { - append(elevft,6); # magenta + append(elevft,0); # no data - black (magenta) } } - me.radar_cleared = 0; - for (var r=0; r < len; r+=1) { var imgx = elevft[r]; if (imgx == -1) continue; @@ -122,21 +139,31 @@ var updateTerrain = func { me.update_altitudes(); me.restart_beacon(); } - - #me.last_request = getprop("sim/time/elapsed-sec"); + me.fetching = 0; }; var update_altitudes = func { me.terrain_minalt.setValue(me.min_altitude); me.terrain_maxalt.setValue(me.max_altitude); + + if (me.max_altitude < me.refaltitudeft) { + me.hialtmode = 1; + } else { + me.hialtmode = 0; + } + } var restart_beacon = func { me.radar_beacon = 0; me.radar_cycle += 1; - me.min_altitude = 9999; + me.bands_minalt = me.min_altitude; + me.bands_maxalt = math.max(1000,me.max_altitude); # band min limit to 1000 ft - trivial + me.bands_range = me.bands_maxalt - me.bands_minalt; + me.min_altitude = 9999; me.max_altitude = -9999; + me.reference = nil; }; var init = func { @@ -155,9 +182,13 @@ var init = func { me.visible = 0; me.min_altitude = 9999; me.max_altitude = -9999; + me.bands_minalt = 0; + me.bands_maxalt = 0; + me.bands_range = 0; me.basealtitudeft = nil; me.reference = nil; me.onfailure = 0; + me.hialtmode = 0; # high aircraft relative altitude mode var tile = me.tile; @@ -196,14 +227,10 @@ var init = func { me.terrlayer["L" ~ c] = grplx; me.terrlayer["R" ~ c] = grprx; } - - setlistener("/controls/switches/terr_on_nd_l", func{ - me.request_clear = 1; - }); - setlistener("/ECAM/warnings/timer/nav-gpws-terr-fault", func{ - me.onfailure = getprop("/ECAM/warnings/timer/nav-gpws-terr-fault"); - }); + #setlistener("/ECAM/warnings/timer/nav-gpws-terr-fault", func{ # TODO need further investigations + # me.onfailure = getprop("/ECAM/warnings/timer/nav-gpws-terr-fault"); + #}); }; @@ -236,19 +263,20 @@ var draw = func { return; } - if (me.radar_beacon == 0) { # update aircraft reference + if (me.reference == nil) { # update aircraft reference var ref = geo.aircraft_position(); me.reference = ref; if (ref != nil) { - me.reference.heading = getprop("orientation/heading-magnetic-deg"); - me.reference.altitudeft = ref.alt() * 3.2808399; + me.refheading = getprop("orientation/heading-magnetic-deg"); - if (me.basealtitudeft == nil) { + var refalt = ref.alt() * 3.2808399; + me.refaltitudeft = refalt; + me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; + + if (fmgc.FMGCInternal.phase<2) { #var basealtft = me.get_elevation(ref.lat,ref.lon); - var basealtft = ref.alt() * 3.2808399; - if (basealtft == nil) basealtft = 0; - me.basealtitudeft = basealtft + 400; + me.basealtitudeft = refalt + 400; } #if (fmgc.FMGCInternal.phase >= 5 and me.basealtitudeft == 0) { @@ -260,19 +288,26 @@ var draw = func { #else if ((fmgc.FMGCInternal.phase > 1 and fmgc.FMGCInternal.phase < 5) and (me.basealtitudeft != 0)) { # me.basealtitudeft = 0; #} - } + + } else { + + if (me.layer.display_changed == 1) { + me.layer.display_changed = 0; + me.request_clear = 1; + } + + var range = me.layer.map.getRange(); # Range of Navigation Display + var update_size = (range != me.range); + me.range = range; + + if(update_size){ + me.request_clear = 1; + } + + me.updateTerrain(); # left + if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(); # right + } - var range = me.layer.map.getRange(); # Range of Navigation Display - var update_size = (range != me.range); - me.range = range; - - if(update_size){ - me.request_clear = 1; - } - - me.updateTerrain(); # left - if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(); # right - }; diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_cl.png b/Models/Instruments/ND/canvas/res/terrain/tile_cl.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3a3b66ebdcdefe67defe5a74394779eca4f733 GIT binary patch literal 1843 zcmV-32h8}1P)<{97<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%hhNHDpIvQUCx3u}MThR7gur*XfH_WfTYS>$`*C3w<+CGJ#|u6=Igf;9yyqlVz)w zW@2S#s7-09m|KdeX(nztndUMX6)n<26wyv*8|}+q)92jt^H-OL%QMeC%lCZG^8BWW z3&zEm(fPjUl3bTw5m#LocRUhF}Nq@K9(mwO_&%LUzP%s`eJf_ZYExtier0o z(>Eig-5l56nX7+ReQMfg#E211Dwk+aPh2=5MfuqHN*w+^PW=E^`m@$7ps`~Lh| zu}&RGi=fPYFom51%HQn|$ClR<7R8}&W8Lxm3bz1+71!UDI*T^N@?CN7$^^dlXzc$y zMGt)wyFQ4O2V&NOgbxkL75ifAo3ZDU*!yV$f`D%b*jY6cLuca1kFo!Yc;aA!hQR8Z z(WKGcAH~Z*$M9dV^{rU2CY{ZHGMB9Idi5Zezt~!*;%@>rZ4UDL=T;16J#UVw0H{qns;fA&Udc zn#Q@D6SZpN4O5K?){7!s={8kM9s&;J(h>)J=d_xv;C091*e@Nm!{24p7#9a}NejZV zp<{#OMH_QEXlHXzC@PyU2P_K0>bmi6SL;S^%iHl^Gx>Wy&NgO?C^u!Ag1zt^N|h{{ z4#eiJ$O?ACflq`>MOOSNbjzP(dz-9d@h)7O&U7fc)Mz(+*^_(}S4_KB+S94!um%BVWyM=S)jAe@+!XNQim)+Z0g4YsN-N!r8ku;B7W{Ic zAvE&?>$BwWQ+aBewECdKyF)5mmIFCc&e4PngGdFjI2=B`6kV_cjASw zJ392Cqf;Duh;cxdKgd|rVM?^h)l%`w&nIrC4zzA6h{ENx3Mt2StB_M?D0P?~+nWs} zRTvf`-{Ka%Xt+^zI;pe_a(s~KxFLsP6>OoKz5=D7_OfKpX2(%rOSrIGG^rTXCX=uB zQtORm0}ThLQ%!25NSisYz1GYL{&k%3EPHe+G1?Htu1?az?UoQ^tl*Otqx?Ck5`a>Y zIA8=lkl7FJZjzrG$*yGNXmT<6Mw6QT|I=X4p9yOq)qQMyph2uYk(VT?MJ8ulQY5@# zxQQ)qBqE{Mh=xRWk%LjfsycYG;TWr?ssU(*R&_W;gZ$Oi&a@LtZmcQOn}lylN+1+O z{aJGw71W9@NUI3Bv0w*QG6Y?5lf>0Jrpk^^OiJ4OtqKLKbVCQZ$f=(I?q+cq^3^WIQV~_5@Fa9-y2)^@sXg$e!D>zCumFg>C*AlU zOloeL`q`lGTng(U@a8PCktQ zIW)lAe;ZPo18N@5sGvoS8Qy+fR04eErge}itk;}uH|Kt@NHu=t2I<;}ro+NzkztqP zx-~qdML-a|7E3%iAtqdJc`6G@TCqXRktMRyXIBpVNm~AtmUo#W-&GMMyqv+#v=G&f hRKcorE4yPx{|kcP_(ea1YZ?Fm002ovPDHLkV1n(Lb|C-& literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_gh.png b/Models/Instruments/ND/canvas/res/terrain/tile_gh.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5f7fa1b571cb0eef533fc4d1d2f6d522550df3 GIT binary patch literal 2069 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