From 3881bdd38171eba62c26477a87e87422b73d791e Mon Sep 17 00:00:00 2001 From: sgilchrist123 Date: Wed, 16 Sep 2020 22:17:11 +1000 Subject: [PATCH] Change how position of FPV is calculated - copy from MD11 --- Models/Instruments/PFD/PFD.nas | 70 +++++++++++++++++------------- Models/Instruments/PFD/res/pfd.svg | 8 ++-- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/Models/Instruments/PFD/PFD.nas b/Models/Instruments/PFD/PFD.nas index 0bd31e42..ba7fa245 100644 --- a/Models/Instruments/PFD/PFD.nas +++ b/Models/Instruments/PFD/PFD.nas @@ -16,6 +16,7 @@ var elapsedtime = 0; var altTens = 0; var altPolarity = ""; var track_diff = 0; +var AICenter = nil; # FPV # Fetch nodes: var state1 = props.globals.getNode("/systems/thrust/state1", 1); @@ -137,7 +138,7 @@ var adr_1_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr var adr_2_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr-2-fault", 1); var adr_3_fault = props.globals.getNode("/controls/navigation/adirscp/lights/adr-3-fault", 1); var air_data_switch = props.globals.getNode("/controls/navigation/switching/air-data", 1); - +var alpha = props.globals.getNode("/fdm/jsbsim/aero/alpha-deg", 1); # TODO - Is this used anywhere? # Create Nodes: var alt_diff = props.globals.initNode("/instrumentation/pfd/alt-diff", 0.0, "DOUBLE"); @@ -149,9 +150,7 @@ var horizon_ground = props.globals.initNode("/instrumentation/pfd/horizon-ground var hdg_diff = props.globals.initNode("/instrumentation/pfd/hdg-diff", 0.0, "DOUBLE"); var hdg_scale = props.globals.initNode("/instrumentation/pfd/heading-scale", 0.0, "DOUBLE"); var track = props.globals.initNode("/instrumentation/pfd/track-deg", 0.0, "DOUBLE"); -# This always seems to return 0 if TRK FPA selected, which is incorrect. I don't know how/where this value is set. -# So I've commented it out and calculate it using the difference between magnetic track and heading. -#var track_diff = props.globals.initNode("/instrumentation/pfd/track-hdg-diff", 0.0, "DOUBLE"); +#var track_diff = props.globals.initNode("/instrumentation/pfd/track-hdg-diff", 0.0, "DOUBLE"); # returns incorrect value and can calculate on the fly var du1_test = props.globals.initNode("/instrumentation/du/du1-test", 0, "BOOL"); var du1_test_time = props.globals.initNode("/instrumentation/du/du1-test-time", 0.0, "DOUBLE"); var du1_offtime = props.globals.initNode("/instrumentation/du/du1-off-time", 0.0, "DOUBLE"); @@ -214,6 +213,9 @@ var canvas_PFD_base = { me.AI_horizon_hdg_trans = me["AI_heading"].createTransform(); me.AI_horizon_hdg_rot = me["AI_heading"].createTransform(); + me.AI_fpv_trans = me["FPV"].createTransform(); + me.AI_fpv_rot = me["FPV"].createTransform(); + me.page = canvas_group; return me; @@ -1026,8 +1028,7 @@ var canvas_PFD_base = { me["AI_heading"].update(); }, - # Dim the yellow outline of fixed aircraft symbol on PFDs - # eg when crew select TRK + # Dim the yellow outline of fixed aircraft symbol on PFDs (eg when crew select TRK) # 1 == dim # 0 == undim dimFixedAircraftOutline: func(dim_bool) { @@ -1059,23 +1060,6 @@ var canvas_PFD_base = { return nil; }, - # Returns Y (vertical) translation value for FPV - accounting for angle of roll - # (On the PFD the FPA is perpendicular to the artificial horizon, which is not always horizontal.) - getFPVYTranslation: func(track_x_translation, fpa_deg) { - - var FPV_Y_COEFFICIENT = 12.5; # query if it should be 12.5 or 11.825 - - var pitch_px = pitch.getValue() * FPV_Y_COEFFICIENT; - var roll_rad = roll.getValue() * D2R; - - var pitch_y_translation = math.tan(roll_rad) * (( pitch_px/math.sin(roll_rad)) + track_x_translation); - - var fpa_y_translation = (fpa_deg * FPV_Y_COEFFICIENT)/math.cos(roll_rad); - - return pitch_y_translation + ((-1) * fpa_y_translation); - - }, - # Convert difference between magnetic heading and track measured in degrees to pixel for display on PFDs # And set max and minimum values getTrackDiffPixels: func(track_diff_deg) { @@ -1154,6 +1138,7 @@ var canvas_PFD_1 = { # FPV # If TRK FPA selected on the FCU, display FPV on PFD1 + # Display FPV in red and freeze if FPA outside the range of -9.9 degrees or 9.9 degrees if (ap_trk_sw.getValue() == 0 ) { me["FPV"].hide(); me.dimFixedAircraftOutline(0); @@ -1163,15 +1148,26 @@ var canvas_PFD_1 = { me["FPV"].hide(); me.dimFixedAircraftOutline(0); } else { + var roll_deg = roll.getValue() or 0; + var alpha_deg = aoa; + var fpa_deg = pitch.getValue() - alpha_deg; + + AICenter = me["AI_center"].getCenter(); var track_x_translation = me.getTrackDiffPixels(track_diff); - var fpa_deg = pitch.getValue() - aoa; - if (fpa_deg > 9.9 or fpa_deg < -9.9) { - fpa_deg = math.clamp(fpa_deg, -9.9, 9.9); + + if (fpa_deg > 9.9) { + alpha_deg = alpha_deg + (fpa_deg - 9.9); + me["FPV"].setColor(1, 0, 0); + } else if (fpa_deg < -9.9) { + alpha_deg = alpha_deg + (fpa_deg + 9.9); me["FPV"].setColor(1, 0, 0); } else { me["FPV"].setColor(0.066666667, 0.752941176, 0.294117647); } - me["FPV"].setTranslation(track_x_translation, me.getFPVYTranslation(track_x_translation, fpa_deg)); + + me.AI_fpv_trans.setTranslation(track_x_translation, math.clamp(alpha_deg, -20, 20) * 12.5); + me.AI_fpv_rot.setRotation(-roll_deg * D2R, AICenter); + me["FPV"].setRotation(roll_deg * D2R); # It shouldn't be rotated, only the axis should be me["FPV"].show(); me.dimFixedAircraftOutline(1); } @@ -1918,6 +1914,7 @@ var canvas_PFD_2 = { # FPV # If TRK FPA selected on the FCU, display FPV on PFD2 + # Display FPV in red and freeze if FPA outside the range of -9.9 degrees or 9.9 degrees if (ap_trk_sw.getValue() == 0 ) { me["FPV"].hide(); me.dimFixedAircraftOutline(0); @@ -1927,15 +1924,26 @@ var canvas_PFD_2 = { me["FPV"].hide(); me.dimFixedAircraftOutline(0); } else { + var roll_deg = roll.getValue() or 0; + var alpha_deg = aoa; + var fpa_deg = pitch.getValue() - alpha_deg; + + AICenter = me["AI_center"].getCenter(); var track_x_translation = me.getTrackDiffPixels(track_diff); - var fpa_deg = pitch.getValue() - aoa; - if (fpa_deg > 9.9 or fpa_deg < -9.9) { - fpa_deg = math.clamp(fpa_deg, -9.9, 9.9); + + if (fpa_deg > 9.9) { + alpha_deg = alpha_deg + (fpa_deg - 9.9); + me["FPV"].setColor(1, 0, 0); + } else if (fpa_deg < -9.9) { + alpha_deg = alpha_deg + (fpa_deg + 9.9); me["FPV"].setColor(1, 0, 0); } else { me["FPV"].setColor(0.066666667, 0.752941176, 0.294117647); } - me["FPV"].setTranslation(track_x_translation, me.getFPVYTranslation(track_x_translation, fpa_deg)); + + me.AI_fpv_trans.setTranslation(track_x_translation, math.clamp(alpha_deg, -20, 20) * 12.5); + me.AI_fpv_rot.setRotation(-roll_deg * D2R, AICenter); + me["FPV"].setRotation(roll_deg * D2R); # It shouldn't be rotated, only the axis should be me["FPV"].show(); me.dimFixedAircraftOutline(1); } diff --git a/Models/Instruments/PFD/res/pfd.svg b/Models/Instruments/PFD/res/pfd.svg index 8e9dc0f0..99184f61 100644 --- a/Models/Instruments/PFD/res/pfd.svg +++ b/Models/Instruments/PFD/res/pfd.svg @@ -46,8 +46,8 @@ inkscape:zoom="6.0943624" showgrid="true" id="namedview371" - inkscape:window-height="835" - inkscape:window-width="1600" + inkscape:window-height="1015" + inkscape:window-width="1920" inkscape:pageshadow="2" inkscape:pageopacity="1" guidetolerance="10" @@ -6659,7 +6659,9 @@ y="74.429939" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35.9995px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke-width:0.657577">FLX + id="FPV" + style="stroke:#11c04b;stroke-opacity:1" + transform="translate(0.03412367,-0.04316723)">