From e08148fdcfd6c0eea1446261f0284abdf0ef2589 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 22 Jan 2021 00:44:16 +0100 Subject: [PATCH 001/124] PROG pages fix layouts to manual - PROG APPROACH/DONE pages added --- Models/Instruments/MCDU/MCDU.nas | 99 ++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 25 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 4601d4cd..b982ad04 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3576,7 +3576,8 @@ var canvas_MCDU_base = { me["Simple_L6"].setFontSize(small); } - } else if (page == "PROGPREF" or page == "PROGTO" or page == "PROGCLB" or page == "PROGCRZ" or page == "PROGDES") { + } else if (page == "PROGPREF" or page == "PROGTO" or page == "PROGCLB" or page == "PROGCRZ" or page == "PROGDES" or page == "PROGAPPR" or page == "PROGDONE") { + if (fmgc.FMGCInternal.phase == 0) { setprop("/MCDU[" ~ i ~ "]/page", "PROGPREF"); page = "PROGPREF"; @@ -3589,10 +3590,16 @@ var canvas_MCDU_base = { } else if (fmgc.FMGCInternal.phase == 3) { setprop("/MCDU[" ~ i ~ "]/page", "PROGCRZ"); page = "PROGCRZ"; - } else if (fmgc.FMGCInternal.phase == 4 or fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + } else if (fmgc.FMGCInternal.phase == 4) { setprop("/MCDU[" ~ i ~ "]/page", "PROGDES"); page = "PROGDES"; - } + } else if (fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + setprop("/MCDU[" ~ i ~ "]/page", "PROGAPPR"); + page = "PROGAPPR"; + } else if (fmgc.FMGCInternal.phase == 7) { + setprop("/MCDU[" ~ i ~ "]/page", "PROGDONE"); + page = "PROGDONE"; + } if (!pageSwitch[i].getBoolValue()) { me["Simple"].show(); @@ -3622,18 +3629,22 @@ var canvas_MCDU_base = { colortext[0] = "CRUISE"; } else if (page == "PROGDES") { colortext[0] = "DESCENT"; + } else if (page == "PROGAPPR") { + colortext[0] = "APPROACH"; + } else if (page == "PROGDONE") { + colortext[0] = "DONE"; } - colortext[1] = (fmgc.FMGCInternal.flightNumSet) ? fmgc.FMGCInternal.flightNum ~ " " : ""; # push title a little left + colortext[1] = (fmgc.FMGCInternal.flightNumSet and page != "PROGDONE") ? fmgc.FMGCInternal.flightNum : ""; - me["Simple_Title"].setText(colortext[0] ~ sprintf("%" ~ (size(colortext[1])+1) ~ "s"," ")); - me["Simple_Title2"].setText(sprintf("%" ~ (size(colortext[0])+1) ~ "s"," ") ~ colortext[1]); + me["Simple_Title"].setText(sprintf(" %-21s",colortext[0])); + me["Simple_Title2"].setText(sprintf("%12s %-11s","",colortext[1])); me["Simple_Title"].show(); - me["Simple_Title"].setColor(GREEN); + me["Simple_Title"].setColor((page != "PROGDONE") ? GREEN : WHITE); me["Simple_Title2"].show(); me["Simple_Title2"].setColor(WHITE); - me["Simple_PageNum"].setText("X/X"); + #me["Simple_PageNum"].setText("X/X"); me["Simple_PageNum"].hide(); me["ArrowLeft"].hide(); me["ArrowRight"].hide(); @@ -3652,35 +3663,50 @@ var canvas_MCDU_base = { me.fontLeft(default, default, symbol, default, default, default); me.fontLeftS(default, default, default, default, default, default); - me.fontRight(default, symbol, symbol, symbol, default, default); + me.fontRight(default, default, symbol, symbol, default, default); me.fontRightS(default, default, default, default, default, default); - - if (page == "PROGCRZ") { - me.showLeftS(0, 0, -1, 0, 0, 0); - me.showCenterS(0, 0, 1, 0, 0, 0); - #me.showRight(0, 0, 1, 0, 0, 0); #Add when implement cruise phase - me.fontLeft(0, 0, default, 0, 0, 0); - } else if (page == "PROGDES") { - me.showRight(0, 1, 0, 0, 0, 0); - } - + me.fontSizeLeft(normal, normal, small, small, normal, small); me.fontSizeLeftS(small, small, small, small, small, small); me.fontSizeRight(normal, small, small, small, normal, small); me.fontSizeRightS(small, small, small, small, small, small); me.fontSizeCenter(small, small, small, small, small, normal); - me.fontSizeCenterS(normal, small, small, small, small, small); + me.fontSizeCenterS(normal, small, small, small, small, small); me["Simple_C1S"].setFontSize(small); me.colorLeft("blu", "wht", "blu", "wht", "wht", "blu"); me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorLeftArrow("wht", "wht", "wht", "wht", "wht", "wht"); - me.colorRight("mag", "blu", "blu", "blu", "grn", "grn"); + me.colorRight("mag", "grn", "blu", "blu", "grn", "grn"); me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); me.colorCenter("grn", "wht", "wht", "wht", "wht", "grn"); me.colorCenterS("wht", "wht", "wht", "wht", "wht", "wht"); + + if (page == "PROGCRZ") { + me.showLeftS(0, 0, -1, 0, 0, 0); + me.showCenterS(0, 0, 1, 0, 0, 0); + #me.showRight(0, 0, 1, 0, 0, 0); #Add when implement cruise phase + me.fontLeft(0, 0, default, 0, 0, 0); + } else if (page == "PROGDES" or page == "PROGAPPR") { + me.showCenter(0, 1, 0, 0, 0, 0); + me.showRight(0, 1, 0, 0, 0, 0); + #me["Simple_C2"].setFontSize(normal); + me["Simple_R2"].setFontSize(normal); + } + #else if (page == "PROGAPPR") { # A/C without GPS + # me["Simple_L5S"].setFontSize(small); + # me["Simple_L5S"].setColor(GREEN); + # me["Simple_L5"].setFontSize(small); + # me["Simple_L5"].setColor(GREEN); + # me["Simple_R5S"].setFontSize(small); + # me["Simple_R5S"].setColor(WHITE); + # me["Simple_R5S"].show(); + # me["Simple_R5"].setFontSize(small); + # me["Simple_R5"].setColor(WHITE); + # me.showLeftArrow(-1, 1, -1, -1, -1, -1); + #} pageSwitch[i].setBoolValue(1); } @@ -3692,7 +3718,7 @@ var canvas_MCDU_base = { me["Simple_L1"].setText(sprintf("%s", "FL" ~ fmgc.FMGCInternal.crzProg)); } } else { - me["Simple_L1"].setText("----"); + me["Simple_L1"].setText("-----"); } me["Simple_L2"].setText(" REPORT"); if (page == "PROGCRZ") { @@ -3711,19 +3737,42 @@ var canvas_MCDU_base = { me["Simple_L4S"].setText(" BRG /DIST"); me["Simple_L5S"].setText(" PREDICTIVE"); me["Simple_L6S"].setText("REQUIRED"); - me["Simple_R1"].setText("FL398"); - me["Simple_R2"].setText("VDEV = + 750 FT"); + + if (page != "PROGDONE") { + me["Simple_R1"].setText("FL398 "); + } else { + me["Simple_R1"].setText("----- "); + me["Simple_L1"].setColor(AMBER); + me["Simple_C1"].setColor(WHITE); + me["Simple_R1"].setColor(WHITE); + me["Simple_R5"].hide(); + } + + if (page == "PROGDES" or page == "PROGAPPR") { + var vdev = 750; #CHECKME i dunno the meaning, but I found this value in the source + var vdev_sign = (vdev>=0) ? "+" : "-"; + me["Simple_R2"].setText(sprintf("%s%04d ",vdev_sign,abs(vdev))); + me["Simple_C2"].setText(sprintf("%30s","VDEV= FT ")); + } + me["Simple_R4"].setText("[ ]"); me["Simple_R5"].setText("GPS PRIMARY"); me["Simple_R6"].setText("----"); me["Simple_R1S"].setText("REC MAX "); me["Simple_R6S"].setText("ESTIMATED"); - me["Simple_C1"].setText("----"); + me["Simple_C1"].setText("-----"); me["Simple_C1S"].setText("OPT"); me["Simple_C3S"].setText("CONFIRM UPDATE AT"); me["Simple_C4"].setText(" TO"); me["Simple_C6S"].setText("ACCUR"); me["Simple_C6"].setText("HIGH"); + + #if (page == "PROGAPPR") { # A/C without GPS + # me["Simple_L5"].setText(sprintf(" DIR DIST TO DEST=%6d",0)); + # me["Simple_L5S"].setText(sprintf("REQD DIST TO LAND=%6d",0)); + # me["Simple_R5"].setText("MN"); + # me["Simple_R5S"].setText("MN"); + #} } else if (page == "PERFTO") { if (!pageSwitch[i].getBoolValue()) { From d39f6c89bd81bf72dc25f59a04fc55a305e27e03 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 22 Jan 2021 22:14:22 +0100 Subject: [PATCH 002/124] little fixes on PROG and PERF pages --- Models/Instruments/MCDU/MCDU.nas | 14 +++++++++----- Nasal/MCDU/MCDU.nas | 6 +++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index b982ad04..9e62f9a5 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3635,7 +3635,7 @@ var canvas_MCDU_base = { colortext[0] = "DONE"; } - colortext[1] = (fmgc.FMGCInternal.flightNumSet and page != "PROGDONE") ? fmgc.FMGCInternal.flightNum : ""; + colortext[1] = (fmgc.FMGCInternal.flightNumSet and page != "PROGDONE") ? fmgc.FMGCInternal.flightNum : ""; #CHECKME - codition useful? me["Simple_Title"].setText(sprintf(" %-21s",colortext[0])); me["Simple_Title2"].setText(sprintf("%12s %-11s","",colortext[1])); @@ -3751,7 +3751,7 @@ var canvas_MCDU_base = { if (page == "PROGDES" or page == "PROGAPPR") { var vdev = 750; #CHECKME i dunno the meaning, but I found this value in the source var vdev_sign = (vdev>=0) ? "+" : "-"; - me["Simple_R2"].setText(sprintf("%s%04d ",vdev_sign,abs(vdev))); + me["Simple_R2"].setText(sprintf("%s%4d ",vdev_sign,abs(vdev))); me["Simple_C2"].setText(sprintf("%30s","VDEV= FT ")); } @@ -3866,12 +3866,12 @@ var canvas_MCDU_base = { me["Simple_L6"].hide(); me["Simple_L6S"].hide(); } - - if (fmgc.FMGCInternal.phase > 0) { # not modifiable from TO phase + + if (fmgc.FMGCInternal.phase > 0) { # GREEN title and not modifiable on TO phase me["Simple_Title"].setColor(GREEN); me.colorLeft("grn", "grn", "grn", "blu", "grn", "wht"); me.colorRight("grn", "blu", "grn", "grn", "grn", "wht"); - } else { + } else { me["Simple_Title"].setColor(WHITE); me.colorLeft("blu", "blu", "blu", "blu", "blu", "wht"); me.colorRight("grn", "blu", "blu", "blu", "blu", "wht"); @@ -3960,6 +3960,7 @@ var canvas_MCDU_base = { me["Simple_C1S"].setText("FLP RETR"); me["Simple_C2S"].setText("SLT RETR"); me["Simple_C3S"].setText("CLEAN "); + } else if (page == "PERFCLB") { if (!pageSwitch[i].getBoolValue()) { me.defaultHideWithCenter(); @@ -4114,6 +4115,7 @@ var canvas_MCDU_base = { me["Simple_R6S"].setText("NEXT "); me["Simple_R6"].setText("PHASE "); + } else if (page == "PERFCRZ") { if (!pageSwitch[i].getBoolValue()) { me.defaultHideWithCenter(); @@ -4409,6 +4411,7 @@ var canvas_MCDU_base = { me["Simple_R6S"].setText("NEXT "); me["Simple_R6"].setText("PHASE "); + } else if (page == "PERFAPPR") { if (!pageSwitch[i].getBoolValue()) { me.defaultHideWithCenter(); @@ -4592,6 +4595,7 @@ var canvas_MCDU_base = { me["Simple_C2S"].setText("SLT RETR"); me["Simple_C3S"].setText("CLEAN "); me["Simple_C5S"].setText("VLS "); + } else if (page == "PERFGA") { if (!pageSwitch[i].getBoolValue()) { me.defaultHideWithCenter(); diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index d1fd839d..e70914e7 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -1430,8 +1430,12 @@ var pagebutton = func(btn, i) { pageNode[i].setValue("PROGCLB"); } else if (fmgc.FMGCInternal.phase == 3) { pageNode[i].setValue("PROGCRZ"); - } else if (fmgc.FMGCInternal.phase == 4 or fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + } else if (fmgc.FMGCInternal.phase == 4) { pageNode[i].setValue("PROGDES"); + } else if (fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + pageNode[i].setValue("PROGAPPR"); + } else if (fmgc.FMGCInternal.phase == 7) { + pageNode[i].setValue("PROGDONE"); } } else if (btn == "perf") { if (fmgc.FMGCInternal.phase == 0 or fmgc.FMGCInternal.phase == 1) { From 303605669661e2b8bd297a66b07c37d37ec687fa Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 22 Jan 2021 23:36:43 +0100 Subject: [PATCH 003/124] PERFTO params not modifiable after prefligh --- Models/Instruments/MCDU/MCDU.nas | 3 +- Nasal/MCDU/PERFTO.nas | 136 +++++++++++++++---------------- 2 files changed, 66 insertions(+), 73 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 9e62f9a5..7f2854c6 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3741,7 +3741,8 @@ var canvas_MCDU_base = { if (page != "PROGDONE") { me["Simple_R1"].setText("FL398 "); } else { - me["Simple_R1"].setText("----- "); + me["Simple_L1"].setText("-----"); + me["Simple_R1"].setText("----- "); me["Simple_L1"].setColor(AMBER); me["Simple_C1"].setColor(WHITE); me["Simple_R1"].setColor(WHITE); diff --git a/Nasal/MCDU/PERFTO.nas b/Nasal/MCDU/PERFTO.nas index d4cdcd29..0b65335c 100644 --- a/Nasal/MCDU/PERFTO.nas +++ b/Nasal/MCDU/PERFTO.nas @@ -19,91 +19,81 @@ var perfTOCheckVSpeeds = func(i) { } } -var perfTOInput = func(key, i) { +var perfTOInput = func(key, i) { + var modifiable = (fmgc.FMGCInternal.phase == 0) ? true : false; var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; - if (key == "L1") { - if (fmgc.FMGCInternal.phase != 1) { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.v1 = 0; - fmgc.FMGCInternal.v1set = 0; - fmgc.FMGCNodes.v1.setValue(0); - fmgc.FMGCNodes.v1set.setValue(0); - mcdu_scratchpad.scratchpads[i].empty(); - } else { - var tfs = size(scratchpad); - if (tfs == 3) { - if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { - fmgc.FMGCInternal.v1 = scratchpad; - fmgc.FMGCInternal.v1set = 1; - - # for sounds: - fmgc.FMGCNodes.v1.setValue(scratchpad); - fmgc.FMGCNodes.v1set.setValue(1); - mcdu_scratchpad.scratchpads[i].empty(); - perfTOCheckVSpeeds(i); # do V-speeds validation - } else { - mcdu_message(i, "NOT ALLOWED"); - } + if (key == "L1" and modifiable) { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.v1 = 0; + fmgc.FMGCInternal.v1set = 0; + fmgc.FMGCNodes.v1.setValue(0); + fmgc.FMGCNodes.v1set.setValue(0); + mcdu_scratchpad.scratchpads[i].empty(); + } else { + var tfs = size(scratchpad); + if (tfs == 3) { + if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { + fmgc.FMGCInternal.v1 = scratchpad; + fmgc.FMGCInternal.v1set = 1; + + # for sounds: + fmgc.FMGCNodes.v1.setValue(scratchpad); + fmgc.FMGCNodes.v1set.setValue(1); + mcdu_scratchpad.scratchpads[i].empty(); + + perfTOCheckVSpeeds(i); # do V-speeds validation } else { mcdu_message(i, "NOT ALLOWED"); } + } else { + mcdu_message(i, "NOT ALLOWED"); } - } else { - mcdu_message(i, "NOT ALLOWED"); } - } else if (key == "L2") { - if (fmgc.FMGCInternal.phase != 1) { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.vr = 0; - fmgc.FMGCInternal.vrset = 0; - mcdu_scratchpad.scratchpads[i].empty(); - } else { - var tfs = size(scratchpad); - if (tfs == 3) { - if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { - fmgc.FMGCInternal.vr = scratchpad; - fmgc.FMGCInternal.vrset = 1; - mcdu_scratchpad.scratchpads[i].empty(); + } else if (key == "L2" and modifiable) { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.vr = 0; + fmgc.FMGCInternal.vrset = 0; + mcdu_scratchpad.scratchpads[i].empty(); + } else { + var tfs = size(scratchpad); + if (tfs == 3) { + if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { + fmgc.FMGCInternal.vr = scratchpad; + fmgc.FMGCInternal.vrset = 1; + mcdu_scratchpad.scratchpads[i].empty(); - perfTOCheckVSpeeds(i); # do V-speeds validation - } else { - mcdu_message(i, "NOT ALLOWED"); - } + perfTOCheckVSpeeds(i); # do V-speeds validation } else { mcdu_message(i, "NOT ALLOWED"); } + } else { + mcdu_message(i, "NOT ALLOWED"); } - } else { - mcdu_message(i, "NOT ALLOWED"); } - } else if (key == "L3") { - if (fmgc.FMGCInternal.phase != 1) { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.v2 = 0; - fmgc.FMGCInternal.v2set = 0; - setprop("/it-autoflight/settings/togaspd", 157); - mcdu_scratchpad.scratchpads[i].empty(); - } else { - var tfs = size(scratchpad); - if (tfs == 3) { - if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { - fmgc.FMGCInternal.v2 = scratchpad; - fmgc.FMGCInternal.v2set = 1; - fmgc.updatePitchArm2(); - setprop("/it-autoflight/settings/togaspd", scratchpad); - mcdu_scratchpad.scratchpads[i].empty(); + } else if (key == "L3" and modifiable) { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.v2 = 0; + fmgc.FMGCInternal.v2set = 0; + setprop("/it-autoflight/settings/togaspd", 157); + mcdu_scratchpad.scratchpads[i].empty(); + } else { + var tfs = size(scratchpad); + if (tfs == 3) { + if (int(scratchpad) != nil and scratchpad >= 100 and scratchpad <= 350) { + fmgc.FMGCInternal.v2 = scratchpad; + fmgc.FMGCInternal.v2set = 1; + fmgc.updatePitchArm2(); + setprop("/it-autoflight/settings/togaspd", scratchpad); + mcdu_scratchpad.scratchpads[i].empty(); - perfTOCheckVSpeeds(i); # do V-speeds validation - } else { - mcdu_message(i, "NOT ALLOWED"); - } + perfTOCheckVSpeeds(i); # do V-speeds validation } else { mcdu_message(i, "NOT ALLOWED"); } + } else { + mcdu_message(i, "NOT ALLOWED"); } - } else { - mcdu_message(i, "NOT ALLOWED"); } } else if (key == "L4") { if (scratchpad == "CLR") { @@ -120,7 +110,7 @@ var perfTOInput = func(key, i) { mcdu_message(i, "NOT ALLOWED"); } } - } else if (key == "L5") { + } else if (key == "L5" and modifiable) { if (scratchpad == "CLR") { setprop("/systems/thrust/clbreduc-ft", 1500); setprop("/FMGC/internal/accel-agl-ft", 1500); @@ -160,7 +150,7 @@ var perfTOInput = func(key, i) { mcdu_message(i, "NOT ALLOWED"); } } - } else if (key == "R3") { + } else if (key == "R3" and modifiable) { if (scratchpad == "CLR") { setprop("/FMGC/internal/to-flap", 0); setprop("/FMGC/internal/to-ths", "0.0"); @@ -230,7 +220,7 @@ var perfTOInput = func(key, i) { mcdu_message(i, "NOT ALLOWED"); } } - } else if (key == "R4") { + } else if (key == "R4" and modifiable) { if (scratchpad == "CLR") { setprop("/FMGC/internal/flex", 0); setprop("/FMGC/internal/flex-set", 0); @@ -251,7 +241,7 @@ var perfTOInput = func(key, i) { mcdu_message(i, "NOT ALLOWED"); } } - } else if (key == "R5") { + } else if (key == "R5" and modifiable) { if (scratchpad == "CLR") { setprop("/FMGC/internal/eng-out-reduc", "1500"); setprop("MCDUC/reducacc-set", 0); @@ -268,5 +258,7 @@ var perfTOInput = func(key, i) { } } else if (key == "R6") { setprop("MCDU[" ~ i ~ "]/page", "PERFCLB"); - } + } else { + mcdu_message(i, "NOT ALLOWED"); + } } From 7d010f7bf5f0a5b9c9daee7b8c1860bf7b11d010 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 23 Jan 2021 00:19:21 +0100 Subject: [PATCH 004/124] VDEV symbol fixed --- Models/Instruments/MCDU/MCDU.nas | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 7f2854c6..e6dc2cc1 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3663,14 +3663,14 @@ var canvas_MCDU_base = { me.fontLeft(default, default, symbol, default, default, default); me.fontLeftS(default, default, default, default, default, default); - me.fontRight(default, default, symbol, symbol, default, default); + me.fontRight(default, small, symbol, symbol, default, default); me.fontRightS(default, default, default, default, default, default); me.fontSizeLeft(normal, normal, small, small, normal, small); me.fontSizeLeftS(small, small, small, small, small, small); me.fontSizeRight(normal, small, small, small, normal, small); me.fontSizeRightS(small, small, small, small, small, small); - me.fontSizeCenter(small, small, small, small, small, normal); + me.fontSizeCenter(small, normal, small, small, small, normal); me.fontSizeCenterS(normal, small, small, small, small, small); me["Simple_C1S"].setFontSize(small); @@ -3678,10 +3678,10 @@ var canvas_MCDU_base = { me.colorLeft("blu", "wht", "blu", "wht", "wht", "blu"); me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorLeftArrow("wht", "wht", "wht", "wht", "wht", "wht"); - me.colorRight("mag", "grn", "blu", "blu", "grn", "grn"); + me.colorRight("mag", "wht", "blu", "blu", "grn", "grn"); me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); - me.colorCenter("grn", "wht", "wht", "wht", "wht", "grn"); + me.colorCenter("grn", "grn", "wht", "wht", "wht", "grn"); me.colorCenterS("wht", "wht", "wht", "wht", "wht", "wht"); if (page == "PROGCRZ") { @@ -3693,7 +3693,7 @@ var canvas_MCDU_base = { me.showCenter(0, 1, 0, 0, 0, 0); me.showRight(0, 1, 0, 0, 0, 0); #me["Simple_C2"].setFontSize(normal); - me["Simple_R2"].setFontSize(normal); + #me["Simple_R2"].setFontSize(normal); } #else if (page == "PROGAPPR") { # A/C without GPS # me["Simple_L5S"].setFontSize(small); @@ -3752,8 +3752,8 @@ var canvas_MCDU_base = { if (page == "PROGDES" or page == "PROGAPPR") { var vdev = 750; #CHECKME i dunno the meaning, but I found this value in the source var vdev_sign = (vdev>=0) ? "+" : "-"; - me["Simple_R2"].setText(sprintf("%s%4d ",vdev_sign,abs(vdev))); - me["Simple_C2"].setText(sprintf("%30s","VDEV= FT ")); + me["Simple_C2"].setText(sprintf("%17s%4d ",vdev_sign,abs(vdev))); + me["Simple_R2"].setText(sprintf("%30s","VDEV= FT ")); } me["Simple_R4"].setText("[ ]"); From 54f6de1f19dab0ca4c90594025bf11fa129ee7be Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 23 Jan 2021 20:37:04 +0100 Subject: [PATCH 005/124] added POSMON page --- Models/Instruments/MCDU/MCDU.nas | 104 +++++++++++++++++++++++++------ Nasal/MCDU/MCDU.nas | 2 + 2 files changed, 87 insertions(+), 19 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index e6dc2cc1..86a9d6d9 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -165,6 +165,7 @@ var activeAtsu = [props.globals.getNode("/MCDU[0]/atsu-active", 1), props.global props.globals.initNode("/MCDU[0]/active-system", "", "STRING"); props.globals.initNode("/MCDU[1]/active-system", "", "STRING"); + # Conversion factor pounds to kilogram var LBS2KGS = 0.4535924; @@ -172,6 +173,17 @@ var LBS2KGS = 0.4535924; # Create Nodes: var pageSwitch = [props.globals.initNode("/MCDU[0]/internal/switch", 0, "BOOL"), props.globals.initNode("/MCDU[1]/internal/switch", 0, "BOOL")]; +# Page freeze on POSMON +var pageFreezed = [nil,nil]; +var togglePageFreeze = func(i) { + if (pageFreezed[i] == nil) { + pageFreezed[i] = sprintf("%02d%02d", getprop("/sim/time/utc/hour"), getprop("/sim/time/utc/minute")); + } else { + pageFreezed[i] = nil; + } +} + + var canvas_MCDU_base = { init: func(canvas_group, file) { var font_mapper = func(family, weight) { @@ -357,6 +369,17 @@ var canvas_MCDU_base = { me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); }, + getLatLogFormatted: func(rootpropname) { + var dms = getprop(rootpropname ~ "latitude-deg"); + var degrees = int(dms); + var minutes = sprintf("%.1f",abs((dms - degrees) * 60)); + var sign = degrees >= 0 ? "N" : "S"; + var dms2 = getprop(rootpropname ~ "longitude-deg"); + var degrees2 = int(dms2); + var minutes2 = sprintf("%.1f",abs((dms2 - degrees2) * 60)); + var sign2 = degrees2 >= 0 ? "E" : "W"; + return sprintf("%d%.1f%s/%07s%s",abs(degrees),minutes,sign,abs(degrees2) ~ minutes2,sign2); + }, updateCommon: func(i) { page = pageProp[i].getValue(); if (page != "NOTIFICATION") { @@ -2253,12 +2276,12 @@ var canvas_MCDU_base = { me["PERFAPPR"].hide(); me["PERFGA"].hide(); me["Simple_Title"].show(); - me["Simple_Title"].setText("POSITION MONITOR"); + me["Simple_Title2"].setColor(GREEN); me.defaultPageNumbers(); me.showLeft(1, 1, 1, 1, 1, 1); me["Simple_L0S"].hide(); - me.showLeftS(-1, -1, -1, -1, 1, -1); + me.showLeftS(-1, 1, 1, -1, 1, -1); me.showLeftArrow(-1, -1, -1, -1, -1, 1); me.showCenter(-1, -1, -1, -1, 1, -1); me["Simple_C3B"].hide(); @@ -2276,26 +2299,69 @@ var canvas_MCDU_base = { me.colorRight("grn", "grn", "grn", "grn", "grn", "wht"); me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); + me["Simple_C5"].setColor(GREEN); + me["Simple_L5"].setFontSize(small); + me["Simple_R5"].setFontSize(small); + + pageFreezed[i] = nil; pageSwitch[i].setBoolValue(1); } + + if (pageFreezed[i] == nil) { + + me["Simple_Title"].setText("POSITION MONITOR"); + me["Simple_Title2"].hide(); + me["Simple_L6"].setText(" FREEZE"); - me["Simple_L1"].setText("FMGC1"); - me["Simple_L2"].setText("FMGC2"); - me["Simple_L3"].setText("GPIRS"); - me["Simple_L4"].setText("MIX IRS"); - me["Simple_L5"].setText("NAV -.-"); - me["Simple_L6"].setText(" FREEZE"); - me["Simple_L5S"].setText(" IRS1"); - me["Simple_R1"].setText("----.-X/-----.-X"); - me["Simple_R2"].setText("----.-X/-----.-X"); - me["Simple_R3"].setText("----.-X/-----.-X"); - me["Simple_R4"].setText("----.-X/-----.-X"); - me["Simple_R5"].setText("NAV -.-"); - me["Simple_R5S"].setText("IRS3 "); - me["Simple_R6S"].setText("SEL "); - me["Simple_C5"].setText("NAV -.-"); - me["Simple_C5S"].setText("IRS2"); + me["Simple_L1"].setText("FMGC1"); + me["Simple_L2"].setText("FMGC2"); + me["Simple_L3"].setText("GPIRS"); + me["Simple_L4"].setText("MIX IRS"); + me["Simple_L5S"].setText(" IRS1"); + + if (systems.ADIRS.Operating.aligned[0].getValue()) { # TODO real FMGC1 GPS data + me["Simple_R1"].setText(me.getLatLogFormatted("/position/")); + me["Simple_L2S"].setText(sprintf("%16s","3IRS/GPS")); + me["Simple_L5"].setText("NAV 0.0"); + } else { + me["Simple_R1"].setText("----.-X/-----.-X"); + me["Simple_L2S"].setText(""); + me["Simple_L5"].setText("NAV -.-"); + } + + if (systems.ADIRS.Operating.aligned[1].getValue()) { # TODO real FMGC2 GPS data + me["Simple_R2"].setText(me.getLatLogFormatted("/position/")); + me["Simple_L3S"].setText(sprintf("%16s","3IRS/GPS")); + me["Simple_C5"].setText("NAV 0.0"); + } else { + me["Simple_R2"].setText("----.-X/-----.-X"); + me["Simple_L3S"].setText(""); + me["Simple_C5"].setText("NAV -.-"); + } + + me["Simple_R3"].setText("----.-X/-----.-X"); # GPIRS not available + me["Simple_R5"].setText("NAV -.- "); + + if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) { + me["Simple_R4"].setText(me.getLatLogFormatted("/position/")); + } else { + me["Simple_R4"].setText("----.-X/-----.-X"); + } + + me["Simple_R5S"].setText("IRS3 "); + me["Simple_R6S"].setText("SEL "); + me["Simple_C5S"].setText("IRS2"); + + } else { + + me["Simple_Title"].setText("POSITION FROZEN AT "); + me["Simple_Title2"].setText(sprintf("%23s ",pageFreezed[i])); + me["Simple_Title2"].show(); + me["Simple_L6"].setText(" UNFREEZE"); + + } + } else if (page == "RADNAV") { if (!pageSwitch[i].getBoolValue()) { me.defaultHide(); @@ -3663,7 +3729,7 @@ var canvas_MCDU_base = { me.fontLeft(default, default, symbol, default, default, default); me.fontLeftS(default, default, default, default, default, default); - me.fontRight(default, small, symbol, symbol, default, default); + me.fontRight(default, symbol, symbol, symbol, default, default); me.fontRightS(default, default, default, default, default, default); me.fontSizeLeft(normal, normal, small, small, normal, small); diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index e70914e7..7c36da39 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -887,6 +887,8 @@ var lskbutton = func(btn, i) { pageNode[i].setValue("ATIS"); } else if (page == "AOCCONFIG") { pageNode[i].setValue("AOCMENU"); + } else if (page == "POSMON") { + canvas_mcdu.togglePageFreeze(i); } else { mcdu_message(i, "NOT ALLOWED"); } From 3fa0313582bb747896d62b80af99a3223326d6ce Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 23 Jan 2021 21:56:37 +0100 Subject: [PATCH 006/124] IRSMON page and (very) basic IRS status display --- Models/Instruments/MCDU/MCDU.nas | 79 ++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 86a9d6d9..1986a174 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -380,6 +380,17 @@ var canvas_MCDU_base = { var sign2 = degrees2 >= 0 ? "E" : "W"; return sprintf("%d%.1f%s/%07s%s",abs(degrees),minutes,sign,abs(degrees2) ~ minutes2,sign2); }, + getIRSStatus: func(a) { + var irsstatus = "INVAL"; + if (systems.ADIRS.ADIRunits[a].operative) { + if (systems.ADIRS.Operating.aligned[a].getValue()) { + irsstatus = (systems.ADIRS.ADIRunits[a].mode == 2) ? "ATT" : "NAV"; + } else { + irsstatus = "ALIGN"; + } + } + return irsstatus; + }, updateCommon: func(i) { page = pageProp[i].getValue(); if (page != "NOTIFICATION") { @@ -2323,25 +2334,25 @@ var canvas_MCDU_base = { if (systems.ADIRS.Operating.aligned[0].getValue()) { # TODO real FMGC1 GPS data me["Simple_R1"].setText(me.getLatLogFormatted("/position/")); me["Simple_L2S"].setText(sprintf("%16s","3IRS/GPS")); - me["Simple_L5"].setText("NAV 0.0"); + me["Simple_L5"].setText(sprintf("%s 0.0",me.getIRSStatus(0))); } else { me["Simple_R1"].setText("----.-X/-----.-X"); me["Simple_L2S"].setText(""); - me["Simple_L5"].setText("NAV -.-"); + me["Simple_L5"].setText(sprintf("%s -.-",me.getIRSStatus(0))); } if (systems.ADIRS.Operating.aligned[1].getValue()) { # TODO real FMGC2 GPS data me["Simple_R2"].setText(me.getLatLogFormatted("/position/")); me["Simple_L3S"].setText(sprintf("%16s","3IRS/GPS")); - me["Simple_C5"].setText("NAV 0.0"); + me["Simple_C5"].setText(sprintf("%s 0.0",me.getIRSStatus(1))); } else { me["Simple_R2"].setText("----.-X/-----.-X"); me["Simple_L3S"].setText(""); - me["Simple_C5"].setText("NAV -.-"); + me["Simple_C5"].setText(sprintf("%s -.-",me.getIRSStatus(1))); } me["Simple_R3"].setText("----.-X/-----.-X"); # GPIRS not available - me["Simple_R5"].setText("NAV -.- "); + me["Simple_R5"].setText(sprintf("%s -.-",me.getIRSStatus(2))); if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) { me["Simple_R4"].setText(me.getLatLogFormatted("/position/")); @@ -2362,6 +2373,64 @@ var canvas_MCDU_base = { } + } else if (page == "IRSMON") { + if (!pageSwitch[i].getBoolValue()) { + + me.defaultHide(); + me.standardFontSize(); + + me.defaultPageNumbers(); + + me.showLeft(1, 1, 1, -1, -1, -1); + me.showLeftS(-1, 1, 1, 1, -1, -1); + me.showLeftArrow(1, 1, 1, -1, -1, -1); + me.showRight(-1, -1, -1, -1, -1, -1); + me.showRightS(1, 1, 1, 1, -1, -1); + me.showRightArrow(-1, -1, -1, -1, -1, -1); + + me["arrowsDepArr"].hide(); + me["PERFAPPR"].hide(); + me["PERFGA"].hide(); + me["Simple_L0S"].hide(); + me["Simple_Title"].show(); + + me.colorLeft("wht", "wht", "wht", "ack", "ack", "ack"); + me.colorLeftS("ack", "grn", "grn", "grn", "ack", "ack"); + me.colorRightS("amb", "grn", "grn", "grn", "ack", "ack"); + me.colorLeftArrow("wht", "wht", "wht", "ack", "ack", "ack"); + + me["Simple_Title"].setText("IRS MONITOR"); + + me["Simple_L1"].setText(" IRS1"); + me["Simple_L2"].setText(" IRS2"); + me["Simple_L3"].setText(" IRS3"); + me["Simple_R1S"].setText(""); + + #TODO - Missing SET HDG on degraded operations + + pageSwitch[i].setBoolValue(1); + } + + var rows = ["Simple_L2S","Simple_L3S","Simple_L4S"] + for (var a = 0; a<3; a+=1) { + me[rows[a]].setText(" " ~ me.getIRSStatus(a)); + } + + if (fmgc.FMGCInternal.phase == 7) { # DONE phase + if (fmgc.FMGCInternal.arrApt != nil and fmgc.flightPlanController.flightplans[2].departure_runway != nil) { + me["Simple_R1S"].setText(sprintf("DRIFT AT %7s ",fmgc.FMGCInternal.arrApt ~ fmgc.flightPlanController.flightplans[2].departure_runway.id)); + } + me["Simple_R2S"].setText(sprintf("DRIFT %2.1fNM/H ",0)); + me["Simple_R3S"].setText(sprintf("DRIFT %2.1fNM/H ",0)); + me["Simple_R4S"].setText(sprintf("DRIFT %2.1fNM/H ",0)); + } else { + me["Simple_R1S"].setText(""); + me["Simple_R2S"].setText(""); + me["Simple_R3S"].setText(""); + me["Simple_R4S"].setText(""); + } + + } else if (page == "RADNAV") { if (!pageSwitch[i].getBoolValue()) { me.defaultHide(); From de1c6d7df489d495210cca749ea9f28c5b728f58 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 23 Jan 2021 21:59:34 +0100 Subject: [PATCH 007/124] little typo :/ --- Models/Instruments/MCDU/MCDU.nas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 1986a174..b1101c6a 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -2411,7 +2411,7 @@ var canvas_MCDU_base = { pageSwitch[i].setBoolValue(1); } - var rows = ["Simple_L2S","Simple_L3S","Simple_L4S"] + var rows = ["Simple_L2S","Simple_L3S","Simple_L4S"]; for (var a = 0; a<3; a+=1) { me[rows[a]].setText(" " ~ me.getIRSStatus(a)); } From d52b946b2b7a6a276351f24e9ef0779dc972efa5 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 23 Jan 2021 23:30:45 +0100 Subject: [PATCH 008/124] Some POSMON layout fix --- Models/Instruments/MCDU/MCDU.nas | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index b1101c6a..640f3b6e 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -2312,6 +2312,7 @@ var canvas_MCDU_base = { me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); me["Simple_C5"].setColor(GREEN); me["Simple_L5"].setFontSize(small); + me["Simple_C5"].setFontSize(small); me["Simple_R5"].setFontSize(small); pageFreezed[i] = nil; @@ -2336,9 +2337,10 @@ var canvas_MCDU_base = { me["Simple_L2S"].setText(sprintf("%16s","3IRS/GPS")); me["Simple_L5"].setText(sprintf("%s 0.0",me.getIRSStatus(0))); } else { - me["Simple_R1"].setText("----.-X/-----.-X"); + me["Simple_R1"].setText("----.--/-----.--"); + me["Simple_R1"].setColor(WHITE); me["Simple_L2S"].setText(""); - me["Simple_L5"].setText(sprintf("%s -.-",me.getIRSStatus(0))); + me["Simple_L5"].setText(sprintf("%-8s",me.getIRSStatus(0))); } if (systems.ADIRS.Operating.aligned[1].getValue()) { # TODO real FMGC2 GPS data @@ -2346,22 +2348,31 @@ var canvas_MCDU_base = { me["Simple_L3S"].setText(sprintf("%16s","3IRS/GPS")); me["Simple_C5"].setText(sprintf("%s 0.0",me.getIRSStatus(1))); } else { - me["Simple_R2"].setText("----.-X/-----.-X"); + me["Simple_R2"].setText("----.--/-----.--"); + me["Simple_R2"].setColor(WHITE); me["Simple_L3S"].setText(""); - me["Simple_C5"].setText(sprintf("%s -.-",me.getIRSStatus(1))); + me["Simple_C5"].setText(sprintf("%-8s",me.getIRSStatus(1))); } - me["Simple_R3"].setText("----.-X/-----.-X"); # GPIRS not available - me["Simple_R5"].setText(sprintf("%s -.-",me.getIRSStatus(2))); + me["Simple_R3"].setText("----.--/-----.--"); # GPIRS not available + me["Simple_R3"].setColor(WHITE); + + if (systems.ADIRS.Operating.aligned[2].getValue()) { + me["Simple_R5"].setText(sprintf("%s 0.0",me.getIRSStatus(2))); + } else { + me["Simple_R5"].setText(sprintf("%-8s",me.getIRSStatus(2))); + } if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) { me["Simple_R4"].setText(me.getLatLogFormatted("/position/")); + me["Simple_R4"].setColor(GREEN); } else { - me["Simple_R4"].setText("----.-X/-----.-X"); + me["Simple_R4"].setText("----.--/-----.--"); + me["Simple_R4"].setColor(WHITE); } - me["Simple_R5S"].setText("IRS3 "); - me["Simple_R6S"].setText("SEL "); + me["Simple_R5S"].setText("IRS3 "); + me["Simple_R6S"].setText("SEL "); me["Simple_C5S"].setText("IRS2"); } else { From 85b1763a92d417f2af28676078d137be6e13723c Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 24 Jan 2021 21:03:52 +0100 Subject: [PATCH 009/124] bool error + PROGAPPR -fix bool on perfTOInput - back to CLB from PROGAPPR --- Models/Instruments/MCDU/MCDU.nas | 2 +- Nasal/MCDU/MCDU.nas | 2 +- Nasal/MCDU/PERFTO.nas | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 640f3b6e..b0160e1a 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3781,7 +3781,7 @@ var canvas_MCDU_base = { colortext[0] = "DONE"; } - colortext[1] = (fmgc.FMGCInternal.flightNumSet and page != "PROGDONE") ? fmgc.FMGCInternal.flightNum : ""; #CHECKME - codition useful? + colortext[1] = (fmgc.FMGCInternal.flightNumSet and page != "PROGDONE") ? fmgc.FMGCInternal.flightNum : ""; #CHECKME - condition useful? me["Simple_Title"].setText(sprintf(" %-21s",colortext[0])); me["Simple_Title2"].setText(sprintf("%12s %-11s","",colortext[1])); diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index 7c36da39..57c31b95 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -241,7 +241,7 @@ var lskbutton = func(btn, i) { progTOInput("L1",i); # same fn as TO } else if (page == "PROGTO") { progTOInput("L1",i); - } else if (page == "PROGCLB") { + } else if (page == "PROGCLB" or page == "PROGAPPR") { # APPR restore to CLB progCLBInput("L1",i); } else if (page == "PROGCRZ") { progCRZInput("L1",i); diff --git a/Nasal/MCDU/PERFTO.nas b/Nasal/MCDU/PERFTO.nas index 0b65335c..a0f9bd1b 100644 --- a/Nasal/MCDU/PERFTO.nas +++ b/Nasal/MCDU/PERFTO.nas @@ -20,7 +20,7 @@ var perfTOCheckVSpeeds = func(i) { } var perfTOInput = func(key, i) { - var modifiable = (fmgc.FMGCInternal.phase == 0) ? true : false; + var modifiable = (fmgc.FMGCInternal.phase == 0) ? 1 : 0; var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; if (key == "L1" and modifiable) { From 255e0725ab82f45697c202dee141b9292dfbb39b Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 25 Jan 2021 22:34:44 +0100 Subject: [PATCH 010/124] POSMON few fixes --- Models/Instruments/MCDU/MCDU.nas | 131 +++++++++++++++++-------------- 1 file changed, 73 insertions(+), 58 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index b0160e1a..0a749485 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -239,6 +239,8 @@ var canvas_MCDU_base = { me["PERFGA_OE"].setColor(BLUE); me.page = canvas_group; + + me.updateretard = 0; # skip a few page update to save CPU return me; }, @@ -2316,74 +2318,87 @@ var canvas_MCDU_base = { me["Simple_R5"].setFontSize(small); pageFreezed[i] = nil; + + me.updateretard = 0; pageSwitch[i].setBoolValue(1); } - if (pageFreezed[i] == nil) { + if (me.updateretard <= 0) { + if (pageFreezed[i] == nil) { - me["Simple_Title"].setText("POSITION MONITOR"); - me["Simple_Title2"].hide(); - me["Simple_L6"].setText(" FREEZE"); - - me["Simple_L1"].setText("FMGC1"); - me["Simple_L2"].setText("FMGC2"); - me["Simple_L3"].setText("GPIRS"); - me["Simple_L4"].setText("MIX IRS"); - me["Simple_L5S"].setText(" IRS1"); - - if (systems.ADIRS.Operating.aligned[0].getValue()) { # TODO real FMGC1 GPS data - me["Simple_R1"].setText(me.getLatLogFormatted("/position/")); - me["Simple_L2S"].setText(sprintf("%16s","3IRS/GPS")); - me["Simple_L5"].setText(sprintf("%s 0.0",me.getIRSStatus(0))); - } else { - me["Simple_R1"].setText("----.--/-----.--"); - me["Simple_R1"].setColor(WHITE); - me["Simple_L2S"].setText(""); - me["Simple_L5"].setText(sprintf("%-8s",me.getIRSStatus(0))); - } - - if (systems.ADIRS.Operating.aligned[1].getValue()) { # TODO real FMGC2 GPS data - me["Simple_R2"].setText(me.getLatLogFormatted("/position/")); - me["Simple_L3S"].setText(sprintf("%16s","3IRS/GPS")); - me["Simple_C5"].setText(sprintf("%s 0.0",me.getIRSStatus(1))); - } else { - me["Simple_R2"].setText("----.--/-----.--"); - me["Simple_R2"].setColor(WHITE); - me["Simple_L3S"].setText(""); - me["Simple_C5"].setText(sprintf("%-8s",me.getIRSStatus(1))); - } - - me["Simple_R3"].setText("----.--/-----.--"); # GPIRS not available - me["Simple_R3"].setColor(WHITE); - - if (systems.ADIRS.Operating.aligned[2].getValue()) { - me["Simple_R5"].setText(sprintf("%s 0.0",me.getIRSStatus(2))); - } else { - me["Simple_R5"].setText(sprintf("%-8s",me.getIRSStatus(2))); - } - - if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) { - me["Simple_R4"].setText(me.getLatLogFormatted("/position/")); - me["Simple_R4"].setColor(GREEN); - } else { - me["Simple_R4"].setText("----.--/-----.--"); - me["Simple_R4"].setColor(WHITE); - } + me["Simple_Title"].setText("POSITION MONITOR"); + me["Simple_Title2"].hide(); + me["Simple_L6"].setText(" FREEZE"); - me["Simple_R5S"].setText("IRS3 "); - me["Simple_R6S"].setText("SEL "); - me["Simple_C5S"].setText("IRS2"); + me["Simple_L1"].setText("FMGC1"); + me["Simple_L2"].setText("FMGC2"); + me["Simple_L3"].setText("GPIRS"); + me["Simple_L4"].setText("MIX IRS"); + me["Simple_L5S"].setText(" IRS1"); + me["Simple_R5S"].setText("IRS3 "); + me["Simple_R6S"].setText("SEL "); + me["Simple_C5S"].setText("IRS2"); - } else { + var latlog = me.getLatLogFormatted("/position/"); # current sim lat/log (formatted) cached for fast excecution + #TODO - IRS emulation - me["Simple_Title"].setText("POSITION FROZEN AT "); - me["Simple_Title2"].setText(sprintf("%23s ",pageFreezed[i])); - me["Simple_Title2"].show(); - me["Simple_L6"].setText(" UNFREEZE"); + if (systems.ADIRS.Operating.aligned[0].getValue()) { # TODO real FMGC1 GPS data + me["Simple_R1"].setText(latlog); + me["Simple_R1"].setColor(GREEN); + me["Simple_L2S"].setText(sprintf("%16s","3IRS/GPS")); + } else { + me["Simple_R1"].setText("----.--/-----.--"); + me["Simple_R1"].setColor(WHITE); + me["Simple_L2S"].setText(""); + } + + if (systems.ADIRS.Operating.aligned[1].getValue()) { # TODO real FMGC2 GPS data + me["Simple_R2"].setText(latlog); + me["Simple_R2"].setColor(GREEN); + me["Simple_L3S"].setText(sprintf("%16s","3IRS/GPS")); + } else { + me["Simple_R2"].setText("----.--/-----.--"); + me["Simple_R2"].setColor(WHITE); + me["Simple_L3S"].setText(""); + } + + if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue() or systems.ADIRS.Operating.aligned[2].getValue()) { + me["Simple_R3"].setText(latlog); # GPIRS + me["Simple_R3"].setColor(GREEN); + me["Simple_R4"].setText(latlog); # MIXIRS + me["Simple_R4"].setColor(GREEN); + } else { + me["Simple_R3"].setText("----.--/-----.--"); # GPIRS not available + me["Simple_R3"].setColor(WHITE); + me["Simple_R4"].setText("----.--/-----.--"); # MIXIRS not available + me["Simple_R4"].setColor(WHITE); + } + + var Simple_row5 = ["Simple_L5","Simple_C5","Simple_R5"]; + + for ( var a=0; a<3; a+=1 ) { + if (systems.ADIRS.Operating.aligned[a].getValue()) { + me[Simple_row5[a]].setText(sprintf("%-8s",(systems.ADIRS.ADIRunits[a].mode == 2) ? "ATT" : "NAV 0.0")); + } else { + me[Simple_row5[a]].setText(sprintf("%-8s",me.getIRSStatus(a))); + } + } + + } else { + + me["Simple_Title"].setText("POSITION FROZEN AT "); + me["Simple_Title2"].setText(sprintf("%23s ",pageFreezed[i])); + me["Simple_Title2"].show(); + me["Simple_L6"].setText(" UNFREEZE"); + + } } + if (me.updateretard < 0) me.updateretard = 2; + else me.updateretard -= 1; + } else if (page == "IRSMON") { if (!pageSwitch[i].getBoolValue()) { @@ -3887,7 +3902,7 @@ var canvas_MCDU_base = { if (page != "PROGDONE") { me["Simple_R1"].setText("FL398 "); } else { - me["Simple_L1"].setText("-----"); + me["Simple_L1"].setText("_____"); me["Simple_R1"].setText("----- "); me["Simple_L1"].setColor(AMBER); me["Simple_C1"].setColor(WHITE); From 1376f31c5fe651c252b35906c39c40d63f5af11d Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 26 Jan 2021 23:32:13 +0100 Subject: [PATCH 011/124] dynamic ACCUR on PROG pages --- Models/Instruments/MCDU/MCDU.nas | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 0a749485..c2ffe5b2 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -3927,7 +3927,8 @@ var canvas_MCDU_base = { me["Simple_C3S"].setText("CONFIRM UPDATE AT"); me["Simple_C4"].setText(" TO"); me["Simple_C6S"].setText("ACCUR"); - me["Simple_C6"].setText("HIGH"); + if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) me["Simple_C6"].setText("HIGH"); + else me["Simple_C6"].setText("LOW"); #if (page == "PROGAPPR") { # A/C without GPS # me["Simple_L5"].setText(sprintf(" DIR DIST TO DEST=%6d",0)); From 39045f9b69f442af2619d3f2fdbcd0239d0a4368 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Thu, 28 Jan 2021 11:14:03 +0000 Subject: [PATCH 012/124] Fixes for MCDU; add EXCESS MOTION --- Models/Instruments/MCDU/MCDU.nas | 22 +++++++++++++++++++--- Nasal/MCDU/FLIGHTLOG.nas | 1 + Nasal/MCDU/PERFTO.nas | 2 +- Nasal/Systems/ADIRS/ADR.nas | 6 ++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index c2ffe5b2..ae3eef7a 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -388,7 +388,7 @@ var canvas_MCDU_base = { if (systems.ADIRS.Operating.aligned[a].getValue()) { irsstatus = (systems.ADIRS.ADIRunits[a].mode == 2) ? "ATT" : "NAV"; } else { - irsstatus = "ALIGN"; + irsstatus = "ALIGN TTN" ~ sprintf("% 2.0d",math.round(systems.ADIRS.ADIRunits[a]._alignTime) / 60); } } return irsstatus; @@ -2338,6 +2338,7 @@ var canvas_MCDU_base = { me["Simple_L5S"].setText(" IRS1"); me["Simple_R5S"].setText("IRS3 "); me["Simple_R6S"].setText("SEL "); + me["Simple_R6"].setText("NAVAIDS "); me["Simple_C5S"].setText("IRS2"); var latlog = me.getLatLogFormatted("/position/"); # current sim lat/log (formatted) cached for fast excecution @@ -2402,7 +2403,7 @@ var canvas_MCDU_base = { } else if (page == "IRSMON") { if (!pageSwitch[i].getBoolValue()) { - me.defaultHide(); + me.defaultHideWithCenter(); me.standardFontSize(); me.defaultPageNumbers(); @@ -2410,6 +2411,8 @@ var canvas_MCDU_base = { me.showLeft(1, 1, 1, -1, -1, -1); me.showLeftS(-1, 1, 1, 1, -1, -1); me.showLeftArrow(1, 1, 1, -1, -1, -1); + me.showCenter(-1, -1, -1, -1, -1, -1); + me.showCenterS(-1, -1, -1, -1, -1, -1); me.showRight(-1, -1, -1, -1, -1, -1); me.showRightS(1, 1, 1, 1, -1, -1); me.showRightArrow(-1, -1, -1, -1, -1, -1); @@ -2422,6 +2425,7 @@ var canvas_MCDU_base = { me.colorLeft("wht", "wht", "wht", "ack", "ack", "ack"); me.colorLeftS("ack", "grn", "grn", "grn", "ack", "ack"); + me.colorCenter("wht", "grn", "grn", "grn", "ack", "ack"); me.colorRightS("amb", "grn", "grn", "grn", "ack", "ack"); me.colorLeftArrow("wht", "wht", "wht", "ack", "ack", "ack"); @@ -2430,6 +2434,12 @@ var canvas_MCDU_base = { me["Simple_L1"].setText(" IRS1"); me["Simple_L2"].setText(" IRS2"); me["Simple_L3"].setText(" IRS3"); + me["Simple_C1"].setText("EXCESS MOTION"); + me["Simple_C2"].setText("EXCESS MOTION"); + me["Simple_C3"].setText("EXCESS MOTION"); + me["Simple_C1"].setFontSize(small); + me["Simple_C2"].setFontSize(small); + me["Simple_C3"].setFontSize(small); me["Simple_R1S"].setText(""); #TODO - Missing SET HDG on degraded operations @@ -2438,8 +2448,14 @@ var canvas_MCDU_base = { } var rows = ["Simple_L2S","Simple_L3S","Simple_L4S"]; + var center = ["Simple_C1","Simple_C2","Simple_C3"]; for (var a = 0; a<3; a+=1) { me[rows[a]].setText(" " ~ me.getIRSStatus(a)); + if (systems.ADIRS.ADIRunits[a]._excessMotion) { + me[center[a]].show(); + } else { + me[center[a]].hide(); + } } if (fmgc.FMGCInternal.phase == 7) { # DONE phase @@ -4030,7 +4046,7 @@ var canvas_MCDU_base = { me["Simple_L6S"].hide(); } - if (fmgc.FMGCInternal.phase > 0) { # GREEN title and not modifiable on TO phase + if (fmgc.FMGCInternal.phase == 1) { # GREEN title and not modifiable on TO phase me["Simple_Title"].setColor(GREEN); me.colorLeft("grn", "grn", "grn", "blu", "grn", "wht"); me.colorRight("grn", "blu", "grn", "grn", "grn", "wht"); diff --git a/Nasal/MCDU/FLIGHTLOG.nas b/Nasal/MCDU/FLIGHTLOG.nas index c8550c1f..77952d9b 100644 --- a/Nasal/MCDU/FLIGHTLOG.nas +++ b/Nasal/MCDU/FLIGHTLOG.nas @@ -128,6 +128,7 @@ var doorR4_pos = props.globals.getNode("/sim/model/door-positions/doorr4/positio # Detect OFF without IN var lastgs0 = 0; +var lastgear0 = 0; var lastgsrestart = 0; # Check for A/C state change - advice me for a better method, please :/ diff --git a/Nasal/MCDU/PERFTO.nas b/Nasal/MCDU/PERFTO.nas index a0f9bd1b..7571aa52 100644 --- a/Nasal/MCDU/PERFTO.nas +++ b/Nasal/MCDU/PERFTO.nas @@ -20,7 +20,7 @@ var perfTOCheckVSpeeds = func(i) { } var perfTOInput = func(key, i) { - var modifiable = (fmgc.FMGCInternal.phase == 0) ? 1 : 0; + var modifiable = (fmgc.FMGCInternal.phase == 1) ? 0 : 1; var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; if (key == "L1" and modifiable) { diff --git a/Nasal/Systems/ADIRS/ADR.nas b/Nasal/Systems/ADIRS/ADR.nas index 59cf9668..ad82e383 100644 --- a/Nasal/Systems/ADIRS/ADR.nas +++ b/Nasal/Systems/ADIRS/ADR.nas @@ -144,6 +144,7 @@ var ADIRU = { call(canvas_nd.ND_2.NDFo.predicates[predicate]); } }, + _excessMotion: 0, alignLoop: func() { me._roll = pts.Orientation.roll.getValue(); me._pitch = pts.Orientation.pitch.getValue(); @@ -152,13 +153,18 @@ var ADIRU = { # todo use IR values if (me._gs > 5 or abs(me._pitch) > 5 or abs(me._roll) > 10) { me.stopAlignNoAlign(); + me._excessMotion = 1; print("Excessive motion, restarting"); me.update(); # update operative me.align(calcAlignTime(pts.Position.latitude.getValue())); } elsif (me.operative == 0) { me.stopAlignNoAlign(); + me._excessMotion = 0; } elsif (pts.Sim.Time.elapsedSec.getValue() >= me._alignTime) { me.stopAlignAligned(); + me._excessMotion = 0; + } else { + me._excessMotion = 0; } if (!me.operating and pts.Sim.Time.elapsedSec.getValue() >= me._pfdTime) { From a32e79b7dc3b32bdb3d8fc5c49790870b1f7d1b5 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Thu, 28 Jan 2021 12:36:10 +0000 Subject: [PATCH 013/124] Half rate of FWC calculations --- Systems/a320-fwc.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index c56a936b..fc49af06 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -4,7 +4,7 @@ - + Timer for the ECAM system @@ -364,7 +364,7 @@ - + @@ -1485,7 +1485,7 @@ - + @@ -1659,7 +1659,7 @@ - + @@ -1759,7 +1759,7 @@ - + @@ -2004,7 +2004,7 @@ - + @@ -2024,7 +2024,7 @@ - + @@ -2277,7 +2277,7 @@ - + @@ -2482,7 +2482,7 @@ - + From c18c35abc5f49c75ed34261dc86d3315ad537e6a Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Thu, 28 Jan 2021 13:59:08 +0000 Subject: [PATCH 014/124] GPS MONITOR --- Models/Instruments/MCDU/MCDU.nas | 71 +++++++++++++++++++++++++ Nasal/Libraries/property-tree-setup.nas | 8 +++ Nasal/MCDU/DATA.nas | 53 +++++++----------- Nasal/MCDU/MCDU.nas | 2 + 4 files changed, 100 insertions(+), 34 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index ae3eef7a..e37d5937 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -382,6 +382,17 @@ var canvas_MCDU_base = { var sign2 = degrees2 >= 0 ? "E" : "W"; return sprintf("%d%.1f%s/%07s%s",abs(degrees),minutes,sign,abs(degrees2) ~ minutes2,sign2); }, + getLatLogFormatted2: func(rootpropname) { + var dms = getprop(rootpropname ~ "latitude-deg"); + var degrees = int(dms); + var minutes = sprintf("%.1f",abs((dms - degrees) * 60)); + var sign = degrees >= 0 ? "N" : "S"; + var dms2 = getprop(rootpropname ~ "longitude-deg"); + var degrees2 = int(dms2); + var minutes2 = sprintf("%.1f",abs((dms2 - degrees2) * 60)); + var sign2 = degrees2 >= 0 ? "E" : "W"; + return sprintf("%d %.1f%s/%03s %.1f%s",abs(degrees),minutes,sign,abs(degrees2),minutes2,sign2); + }, getIRSStatus: func(a) { var irsstatus = "INVAL"; if (systems.ADIRS.ADIRunits[a].operative) { @@ -2471,8 +2482,68 @@ var canvas_MCDU_base = { me["Simple_R3S"].setText(""); me["Simple_R4S"].setText(""); } + } else if (page == "GPSMON") { + if (!pageSwitch[i].getBoolValue()) { + + me.defaultHideWithCenter(); + me.standardFontSize(); + me.defaultPageNumbers(); + me.showLeft(1, 1, 1, 1, 1, 1); + me.showLeftS(1, 1, 1, 1, 1, 1); + me.showLeftArrow(-1, -1, -1, -1, -1, -1); + me.showCenter(-1, 1, 1, -1, 1, 1); + me.showCenterS(-1, 1, 1, -1, 1, 1); + me.showRight(-1, 1, 1, -1, 1, 1); + me.showRightS(-1, 1, 1, -1, 1, 1); + me.showRightArrow(-1, -1, -1, -1, -1, -1); + + me["arrowsDepArr"].hide(); + me["PERFAPPR"].hide(); + me["PERFGA"].hide(); + me["Simple_L0S"].hide(); + me["Simple_Title"].show(); + + me.colorLeft("grn", "grn", "grn", "grn", "grn", "grn"); + me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht"); + me.colorCenter("grn", "grn", "grn", "grn", "grn", "grn"); + me.colorCenterS("wht", "wht", "wht", "wht", "wht", "wht"); + me.colorRight("grn", "grn", "grn", "grn", "grn", "grn"); + me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); + + me["Simple_Title"].setText("GPS MONITOR"); + + me["Simple_L1S"].setText("GPS1 POSITION"); + me["Simple_L2S"].setText("TTRK"); + me["Simple_L3S"].setText("MERIT"); + me["Simple_L3"].setText(sprintf("%3.0d",((rand() * 50) - 25) + 50) ~ "M"); + me["Simple_L4S"].setText("GPS2 POSITION"); + me["Simple_L5S"].setText("TTRK"); + me["Simple_L6S"].setText("MERIT"); + me["Simple_L6"].setText(sprintf("%3.0d",((rand() * 50) - 25) + 50) ~ "M"); + me["Simple_C2S"].setText("UTC"); + me["Simple_C3S"].setText("GPS ALT"); + me["Simple_C5S"].setText("UTC"); + me["Simple_C6S"].setText("GPS ALT"); + me["Simple_R2S"].setText("GS"); + me["Simple_R3S"].setText("MODE/SAT"); + me["Simple_R3"].setText("NAV/" ~ sprintf("%s",int((rand() * 2) - 1) + 6) ~ " "); + me["Simple_R5S"].setText("GS"); + me["Simple_R6S"].setText("MODE/SAT"); + me["Simple_R6"].setText("NAV/" ~ sprintf("%s",int((rand() * 2) - 1) + 6) ~ " "); + pageSwitch[i].setBoolValue(1); + } + me["Simple_L1"].setText(me.getLatLogFormatted2("/position/")); + me["Simple_L2"].setText(sprintf("%-5.1f",pts.Instrumentation.GPS.trackMag.getValue() + magvar())); + me["Simple_L4"].setText(me.getLatLogFormatted2("/position/")); + me["Simple_L5"].setText(sprintf("%-5.1f",pts.Instrumentation.GPS.trackMag.getValue() + magvar())); + me["Simple_C2"].setText(pts.Sim.Time.gmtString.getValue()); + me["Simple_C5"].setText(pts.Sim.Time.gmtString.getValue()); + me["Simple_C3"].setText(sprintf("%5.0f",pts.Instrumentation.GPS.altitude.getValue())); + me["Simple_C6"].setText(sprintf("%5.0f",pts.Instrumentation.GPS.altitude.getValue())); + me["Simple_R2"].setText(sprintf("%3.0f",pts.Instrumentation.GPS.gs.getValue())); + me["Simple_R5"].setText(sprintf("%3.0f",pts.Instrumentation.GPS.gs.getValue())); } else if (page == "RADNAV") { if (!pageSwitch[i].getBoolValue()) { me.defaultHide(); diff --git a/Nasal/Libraries/property-tree-setup.nas b/Nasal/Libraries/property-tree-setup.nas index deba6c97..ed512e14 100644 --- a/Nasal/Libraries/property-tree-setup.nas +++ b/Nasal/Libraries/property-tree-setup.nas @@ -173,6 +173,13 @@ var Instrumentation = { pnlModeNum: [props.globals.initNode("/instrumentation/efis[0]/mfd/pnl_mode-num", 2, "INT"), props.globals.initNode("/instrumentation/efis[1]/mfd/pnl_mode-num", 2, "INT")], }, }, + GPS: { + altitude: props.globals.getNode("/instrumentation/gps/indicated-altitude-ft"), + latitude: props.globals.getNode("/instrumentation/gps/indicated-latitude-deg"), + longitude: props.globals.getNode("/instrumentation/gps/indicated-longitude-deg"), + trackMag: props.globals.getNode("/instrumentation/gps/indicated-track-magnetic-deg"), + gs: props.globals.getNode("/instrumentation/gps/indicated-ground-speed-kt"), + }, MKVII: { Inputs: { Discretes: { @@ -245,6 +252,7 @@ var Sim = { Time: { deltaRealtimeSec: props.globals.getNode("/sim/time/delta-realtime-sec"), elapsedSec: props.globals.getNode("/sim/time/elapsed-sec"), + gmtString: props.globals.getNode("/sim/time/gmt-string"), UTC: { day: props.globals.getNode("/sim/time/utc/day"), month: props.globals.getNode("/sim/time/utc/month"), diff --git a/Nasal/MCDU/DATA.nas b/Nasal/MCDU/DATA.nas index 92de6155..8093bcc3 100644 --- a/Nasal/MCDU/DATA.nas +++ b/Nasal/MCDU/DATA.nas @@ -5,19 +5,18 @@ var dataInput = func(key, i) { if (key == "L1") { setprop("MCDU[" ~ i ~ "]/page", "POSMON"); - } - if (key == "L2") { + } elsif (key == "L2") { setprop("MCDU[" ~ i ~ "]/page", "IRSMON"); - } - if (key == "L5") { + } elsif (key == "L3") { + setprop("MCDU[" ~ i ~ "]/page", "GPSMON"); + } elsif (key == "L5") { if (canvas_mcdu.myClosestAirport[i] != nil) { canvas_mcdu.myClosestAirport[i].del(); } canvas_mcdu.myClosestAirport[i] = nil; canvas_mcdu.myClosestAirport[i] = closestAirportPage.new(i); setprop("MCDU[" ~ i ~ "]/page", "CLOSESTAIRPORT"); - } - if (key == "R5") { + } elsif (key == "R5") { setprop("MCDU[" ~ i ~ "]/page", "PRINTFUNC"); } } @@ -25,23 +24,17 @@ var dataInput = func(key, i) { var printInput = func(key, i) { if (key == "L1") { setprop("FMGC/print/mcdu/page1/L1auto", 1); - } - if (key == "L2") { + } elsif (key == "L2") { setprop("FMGC/print/mcdu/page1/L2auto", 1); - } - if (key == "L3") { + } elsif (key == "L3") { setprop("FMGC/print/mcdu/page1/L3auto", 1); - } - if (key == "L5") { + } elsif (key == "L5") { setprop("MCDU[" ~ i ~ "]/page", "DATA"); - } - if (key == "R1") { + } elsif (key == "R1") { setprop("FMGC/print/mcdu/page1/R1req", 1); - } - if (key == "R2") { + } elsif (key == "R2") { setprop("FMGC/print/mcdu/page1/R2req", 1); - } - if (key == "R3") { + } elsif (key == "R3") { setprop("FMGC/print/mcdu/page1/R3req", 1); } } @@ -49,29 +42,21 @@ var printInput = func(key, i) { var printInput2 = func(key, i) { if (key == "L1") { setprop("FMGC/print/mcdu/page2/L1auto", 1); - } - if (key == "L2") { + } elsif (key == "L2") { setprop("FMGC/print/mcdu/page2/L2auto", 1); - } - if (key == "L3") { + } elsif (key == "L3") { setprop("FMGC/print/mcdu/page2/L3auto", 1); - } - if (key == "L4") { + } elsif (key == "L4") { setprop("FMGC/print/mcdu/page2/L4auto", 1); - } - if (key == "L6") { + } elsif (key == "L6") { setprop("MCDU[" ~ i ~ "]/page", "DATA"); - } - if (key == "R1") { + } elsif (key == "R1") { setprop("FMGC/print/mcdu/page2/R1req", 1); - } - if (key == "R2") { + } elsif (key == "R2") { setprop("FMGC/print/mcdu/page2/R2req", 1); - } - if (key == "R3") { + } elsif (key == "R3") { setprop("FMGC/print/mcdu/page2/R3req", 1); - } - if (key == "R4") { + } elsif (key == "R4") { setprop("FMGC/print/mcdu/page2/R4req", 1); } } diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index 57c31b95..be06d774 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -534,6 +534,8 @@ var lskbutton = func(btn, i) { statusInput("L3",i); } else if (page == "RADNAV") { radnavInput("L3",i); + } else if (page == "DATA") { + dataInput("L3",i); } else if (page == "PRINTFUNC") { printInput("L3",i); } else if (page == "PRINTFUNC2") { From f10da37feda4606276bf0b4758d2e23dafd905aa Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Thu, 28 Jan 2021 18:57:20 +0000 Subject: [PATCH 015/124] Improve PROG (add the BRG / DIST) --- A320-main.xml | 5 +- Models/Instruments/MCDU/MCDU.nas | 68 +++++++- Nasal/FMGC/flightplan.nas | 9 +- Nasal/MCDU/CLOSESTAIRPORT.nas | 49 ++++-- Nasal/MCDU/DUPLICATE.nas | 14 +- Nasal/MCDU/MCDU.nas | 10 +- Nasal/MCDU/PROG.nas | 284 +++++++++++++++++++++++++++++++ Nasal/MCDU/PROGCLB.nas | 33 ---- Nasal/MCDU/PROGCRZ.nas | 33 ---- Nasal/MCDU/PROGDES.nas | 33 ---- Nasal/MCDU/PROGTO.nas | 23 --- 11 files changed, 406 insertions(+), 155 deletions(-) create mode 100644 Nasal/MCDU/PROG.nas delete mode 100644 Nasal/MCDU/PROGCLB.nas delete mode 100644 Nasal/MCDU/PROGCRZ.nas delete mode 100644 Nasal/MCDU/PROGDES.nas delete mode 100644 Nasal/MCDU/PROGTO.nas diff --git a/A320-main.xml b/A320-main.xml index 370ad3db..cb066eb1 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -4676,10 +4676,7 @@ Aircraft/A320-family/Nasal/MCDU/ROUTESELECTION.nas Aircraft/A320-family/Nasal/MCDU/INITB.nas Aircraft/A320-family/Nasal/MCDU/FUELPRED.nas - Aircraft/A320-family/Nasal/MCDU/PROGTO.nas - Aircraft/A320-family/Nasal/MCDU/PROGCLB.nas - Aircraft/A320-family/Nasal/MCDU/PROGCRZ.nas - Aircraft/A320-family/Nasal/MCDU/PROGDES.nas + Aircraft/A320-family/Nasal/MCDU/PROG.nas Aircraft/A320-family/Nasal/MCDU/PERFAPPR.nas Aircraft/A320-family/Nasal/MCDU/PERFCLB.nas Aircraft/A320-family/Nasal/MCDU/PERFCRZ.nas diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index e37d5937..1b084027 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -362,6 +362,10 @@ var canvas_MCDU_base = { me.fontSizeLeftS(small, small, small, small, small, small); me.fontSizeRight(normal, normal, normal, normal, normal, normal); me.fontSizeRightS(small, small, small, small, small, small); + me.fontCenter(default, default, default, default, default, default); + me.fontCenterS(default, default, default, default, default, default); + me.fontSizeCenter(normal, normal, normal, normal, normal, normal); + me.fontSizeCenterS(small, small, small, small, small, small); }, standardFontColour: func() { me.colorLeft("wht", "wht", "wht", "wht", "wht", "wht"); @@ -3977,7 +3981,6 @@ var canvas_MCDU_base = { me["PROG_UPDATE"].show(); me["Simple_L3"].setText(" [ ]"); } - me["Simple_L4"].setText(" ---g /----.-"); me["Simple_L5"].setText(" GPS"); me["Simple_L6"].setText("----"); me["Simple_L1S"].setText(" CRZ"); @@ -4003,8 +4006,25 @@ var canvas_MCDU_base = { me["Simple_C2"].setText(sprintf("%17s%4d ",vdev_sign,abs(vdev))); me["Simple_R2"].setText(sprintf("%30s","VDEV= FT ")); } - - me["Simple_R4"].setText("[ ]"); + + if (mcdu.bearingDistances[i].displayID != nil) { + me["Simple_R4"].setFont(default); + me["Simple_R4"].setFontSize(normal); + me["Simple_R4"].setText(mcdu.bearingDistances[i].displayID); + } else { + me["Simple_R4"].setFont(symbol); + me["Simple_R4"].setFontSize(small); + me["Simple_R4"].setText("[ ]"); + } + + if (mcdu.bearingDistances[i].selectedPoint != nil) { + me["Simple_L4"].setColor(GREEN); + me["Simple_L4"].setText(sprintf("%3.0fg /%4.1f",mcdu.bearingDistances[i].bearing,mcdu.bearingDistances[i].distance)); + } else { + me["Simple_L4"].setColor(WHITE); + me["Simple_L4"].setText(" ---g /----.-"); + } + me["Simple_R5"].setText("GPS PRIMARY"); me["Simple_R6"].setText("----"); me["Simple_R1S"].setText("REC MAX "); @@ -4012,7 +4032,7 @@ var canvas_MCDU_base = { me["Simple_C1"].setText("-----"); me["Simple_C1S"].setText("OPT"); me["Simple_C3S"].setText("CONFIRM UPDATE AT"); - me["Simple_C4"].setText(" TO"); + me["Simple_C4"].setText(" TO"); me["Simple_C6S"].setText("ACCUR"); if (systems.ADIRS.Operating.aligned[0].getValue() or systems.ADIRS.Operating.aligned[1].getValue()) me["Simple_C6"].setText("HIGH"); else me["Simple_C6"].setText("LOW"); @@ -6224,6 +6244,46 @@ var canvas_MCDU_base = { me["Simple_L6S"].setFont(f); } }, + fontCenter: func (a, b, c, d, e, f) { + if (a != 0) { + me["Simple_C1"].setFont(a); + } + if (b != 0) { + me["Simple_C2"].setFont(b); + } + if (c != 0) { + me["Simple_C3"].setFont(c); + } + if (d != 0) { + me["Simple_C4"].setFont(d); + } + if (e != 0) { + me["Simple_C5"].setFont(e); + } + if (f != 0) { + me["Simple_C6"].setFont(f); + } + }, + fontCenterS: func (a, b, c, d, e, f) { + if (a != 0) { + me["Simple_C1S"].setFont(a); + } + if (b != 0) { + me["Simple_C2S"].setFont(b); + } + if (c != 0) { + me["Simple_C3S"].setFont(c); + } + if (d != 0) { + me["Simple_C4S"].setFont(d); + } + if (e != 0) { + me["Simple_C5S"].setFont(e); + } + if (f != 0) { + me["Simple_C6S"].setFont(f); + } + }, fontRight: func (a, b, c, d, e, f) { if (a != 0) { me["Simple_R1"].setFont(a); diff --git a/Nasal/FMGC/flightplan.nas b/Nasal/FMGC/flightplan.nas index b98e0dbb..cb71f578 100644 --- a/Nasal/FMGC/flightplan.nas +++ b/Nasal/FMGC/flightplan.nas @@ -428,13 +428,14 @@ var flightPlanController = { # flag: is it a navaids DUPLICATENAMES page or not? # plan: plan # flagPBD: do we return back to PBD handler or to default waypoint handler? + # flagPROG: do we return back to PROG handler or to default waypoint handler (only if flagPBD false) - createDuplicateNames: func(ghostContainer, index, flag, plan, flagPBD = 0, bearing = -999, distance = -99) { + createDuplicateNames: func(ghostContainer, index, flag, plan, flagPBD = 0, bearing = -999, distance = -99, flagPROG = 0) { if (canvas_mcdu.myDuplicate[plan] != nil) { canvas_mcdu.myDuplicate[plan].del(); } canvas_mcdu.myDuplicate[plan] = nil; - canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(ghostContainer, index, flag, plan, flagPBD, bearing, distance); + canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(ghostContainer, index, flag, plan, flagPBD, bearing, distance, flagPROG); setprop("MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES"); }, @@ -639,9 +640,9 @@ var flightPlanController = { } } else { if (type == "navaid") { - me.createDuplicateNames(wpGhostContainer, index, 1, plan, 1, num(textSplit[1]), num(textSplit[2])); + me.createDuplicateNames(wpGhostContainer, index, 1, plan, 1, num(textSplit[1]), num(textSplit[2]), 0); } else { - me.createDuplicateNames(wpGhostContainer, index, 0, plan, 1, num(textSplit[1]), num(textSplit[2])); + me.createDuplicateNames(wpGhostContainer, index, 0, plan, 1, num(textSplit[1]), num(textSplit[2]), 0); } return 2; } diff --git a/Nasal/MCDU/CLOSESTAIRPORT.nas b/Nasal/MCDU/CLOSESTAIRPORT.nas index fa72faba..033ae1e6 100644 --- a/Nasal/MCDU/CLOSESTAIRPORT.nas +++ b/Nasal/MCDU/CLOSESTAIRPORT.nas @@ -74,29 +74,44 @@ var closestAirportPage = { me._range += 250; } } - - me.L1 = [me.airports[0].id, nil, "grn"]; - me.R1 = ["----", "UTC ", "grn"]; - me.L2 = [me.airports[1].id, nil, "grn"]; - me.R2 = ["----", nil, "grn"]; - me.L3 = [me.airports[2].id, nil, "grn"]; - me.R3 = ["----", nil, "grn"]; - me.L4 = [me.airports[3].id, nil, "grn"]; - me.R4 = ["----", nil, "grn"]; + if (size(me.airports) >= 1) { + me.L1 = [me.airports[0].id, nil, "grn"]; + me.R1 = ["----", "UTC ", "grn"]; + } + if (size(me.airports) >= 2) { + me.L2 = [me.airports[1].id, nil, "grn"]; + me.R2 = ["----", nil, "grn"]; + } + if (size(me.airports) >= 3) { + me.L3 = [me.airports[2].id, nil, "grn"]; + me.R3 = ["----", nil, "grn"]; + } + if (size(me.airports) >= 4) { + me.L4 = [me.airports[3].id, nil, "grn"]; + me.R4 = ["----", nil, "grn"]; + } me.listPopulated = 1; canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); }, updateBrgDist: func() { if (!me.listPopulated) { return; } - me.cdVector[0] = courseAndDistance(me.airports[0]); - me.cdVector[1] = courseAndDistance(me.airports[1]); - me.cdVector[2] = courseAndDistance(me.airports[2]); - me.cdVector[3] = courseAndDistance(me.airports[3]); var magvarLocal = magvar(); - me.C1 = [math.round(me.cdVector[0][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[0][1]), " BRG DIST", "grn"]; - me.C2 = [math.round(me.cdVector[1][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[1][1]) , nil, "grn"]; - me.C3 = [math.round(me.cdVector[2][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[2][1]), nil, "grn"]; - me.C4 = [math.round(me.cdVector[3][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[3][1]), nil, "grn"]; + if (size(me.airports) >= 1) { + me.cdVector[0] = courseAndDistance(me.airports[0]); + me.C1 = [math.round(me.cdVector[0][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[0][1]), " BRG DIST", "grn"]; + } + if (size(me.airports) >= 2) { + me.cdVector[1] = courseAndDistance(me.airports[1]); + me.C2 = [math.round(me.cdVector[1][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[1][1]) , nil, "grn"]; + } + if (size(me.airports) >= 3) { + me.cdVector[2] = courseAndDistance(me.airports[2]); + me.C3 = [math.round(me.cdVector[2][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[2][1]), nil, "grn"]; + } + if (size(me.airports) >= 4) { + me.cdVector[3] = courseAndDistance(me.airports[3]); + me.C4 = [math.round(me.cdVector[3][0] - magvarLocal) ~ " " ~ math.round(me.cdVector[3][1]), nil, "grn"]; + } if (me.manAirport != nil) { me.C5 = [math.round(courseAndDistance(me.manAirport)[0] - magvarLocal) ~ " " ~ math.round(courseAndDistance(me.manAirport)[1]), nil, "grn"]; } diff --git a/Nasal/MCDU/DUPLICATE.nas b/Nasal/MCDU/DUPLICATE.nas index ace8d133..9e6c58ee 100644 --- a/Nasal/MCDU/DUPLICATE.nas +++ b/Nasal/MCDU/DUPLICATE.nas @@ -28,7 +28,7 @@ var duplicateNamesPage = { enableScroll: 0, scroll: 0, distances: nil, - new: func(vector, index, type, computer, flagPBD = 0, pbdBrg = -999, pbdDist = -99) { + new: func(vector, index, type, computer, flagPBD = 0, pbdBrg = -999, pbdDist = -99, flagProg = 0) { var dn = {parents:[duplicateNamesPage]}; dn.vector = vector; dn.index = index; @@ -37,6 +37,7 @@ var duplicateNamesPage = { dn.bearing = pbdBrg; dn.distance = pbdDist; dn.computer = computer; + dn.flagPROG = flagProg; dn._setupPageWithData(); dn.distances = []; return dn; @@ -134,7 +135,7 @@ var duplicateNamesPage = { }, pushButtonLeft: func(indexSelect) { if (!dirToFlag) { - if (!me.flagPBD) { + if (!me.flagPBD and !me.flagPROG) { if (size(me.vector[0].id) == 5) { fmgc.flightPlanController.insertFix(me.vector[0].id, me.index, me.computer, 1, indexSelect - 1); setprop("MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); @@ -145,9 +146,16 @@ var duplicateNamesPage = { fmgc.flightPlanController.insertNavaid(me.vector[0].id, me.index, me.computer, 1, indexSelect - 1); setprop("MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); } - } else { + } elsif (me.flagPBD) { fmgc.flightPlanController.getWPforPBD(me.vector[0].id ~ "/" ~ me.bearing ~ "/" ~ me.distance, me.index, me.computer, 1, indexSelect - 1); setprop("MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); + } else { + if (me.type == 0) { + mcdu.bearingDistances[me.computer].newPointResult(me.vector, 1, indexSelect - 1); + } else { + mcdu.bearingDistances[me.computer].newPointNavaid(me.vector, 1, indexSelect - 1); + } + pagebutton("prog",me.computer); } } else { canvas_mcdu.myDirTo[me.computer].fieldL1(me.vector[0].id, 1, indexSelect - 1); diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index be06d774..975237a3 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -855,7 +855,13 @@ var lskbutton = func(btn, i) { } else if (page == "F-PLNA" or page == "F-PLNB") { canvas_mcdu.myFpln[i].pushButtonLeft(6); } else if (page == "LATREV" or page == "VERTREV" or page == "DUPLICATENAMES") { - pageNode[i].setValue("F-PLNA"); + if (page != "DUPLICATENAMES") { + pageNode[i].setValue("F-PLNA"); + } else { + if (canvas_mcdu.myDuplicate[i] != nil and canvas_mcdu.myDuplicate[i].flagPROG) { + pagebutton("prog",i); + } + } } else if (page == "ARRIVAL") { canvas_mcdu.myArrival[i].arrPushbuttonLeft(6); } else if (page == "DEPARTURE" or page == "HOLD" or page == "AIRWAYS") { @@ -1125,6 +1131,8 @@ var rskbutton = func(btn, i) { } } pageNode[i].setValue("WINDCRZ"); + } else if (find("PROG",page) != -1) { + progGENInput("R4",i); } else if (page == "PERFTO") { perfTOInput("R4",i); } else if (page == "PERFAPPR") { diff --git a/Nasal/MCDU/PROG.nas b/Nasal/MCDU/PROG.nas new file mode 100644 index 00000000..116c5c44 --- /dev/null +++ b/Nasal/MCDU/PROG.nas @@ -0,0 +1,284 @@ +# Copyright (c) 2020 Matthew Maring (mattmaring) + +var altSet = props.globals.getNode("it-autoflight/input/alt", 1); +var brgDistResult = nil; + +var progGENInput = func(key, i) { + var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; + if (key == "R4") { + if (scratchpad == "CLR") { + bearingDistances[i].selectedPoint = nil; + bearingDistances[i].displayID = nil; + mcdu_scratchpad.scratchpads[i].empty(); + } else { + brgDistResult = bearingDistances[i].newPoint(mcdu_scratchpad.scratchpads[i].scratchpad); + if (brgDistResult != 1) { + mcdu_message(i, "NOT IN DATA BASE"); + } else { + mcdu_scratchpad.scratchpads[i].empty(); + } + } + } +} + +var progTOInput = func(key, i) { + var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; + if (key == "L1") { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; + mcdu_scratchpad.scratchpads[i].empty(); + } else if (int(scratchpad) != nil) { + var crzs = size(scratchpad); + if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100 and fmgc.FMGCInternal.crzSet) { + fmgc.FMGCInternal.crzProg = scratchpad; + mcdu_scratchpad.scratchpads[i].empty(); + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } +} + +var progCLBInput = func(key, i) { + var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; + if (key == "L1") { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; + if (fmgc.FMGCInternal.phase == 5) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + mcdu_scratchpad.scratchpads[i].empty(); + } else if (int(scratchpad) != nil) { + var crzs = size(scratchpad); + if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { + fmgc.FMGCInternal.crzProg = scratchpad; + mcdu_scratchpad.scratchpads[i].empty(); + if (fmgc.FMGCInternal.phase == 5) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } +} + +var progCRZInput = func(key, i) { + var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; + if (key == "L1") { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; + if (fmgc.FMGCInternal.phase == 5) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + mcdu_scratchpad.scratchpads[i].empty(); + } else if (int(scratchpad) != nil) { + var crzs = size(scratchpad); + if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { + fmgc.FMGCInternal.crzProg = scratchpad; + mcdu_scratchpad.scratchpads[i].empty(); + if (fmgc.FMGCInternal.phase == 5) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } +} + +var progDESInput = func(key, i) { + var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; + if (key == "L1") { + if (scratchpad == "CLR") { + fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; + if (fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + mcdu_scratchpad.scratchpads[i].empty(); + } else if (int(scratchpad) != nil) { + var crzs = size(scratchpad); + if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { + fmgc.FMGCInternal.crzProg = scratchpad; + mcdu_scratchpad.scratchpads[i].empty(); + if (fmgc.FMGCInternal.phase == 4 or fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { + fmgc.FMGCInternal.phase = 3; + setprop("/FMGC/internal/activate-once", 0); + setprop("/FMGC/internal/activate-twice", 0); + setprop("/FMGC/internal/decel", 0); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } else { + mcdu_message(i, "NOT ALLOWED"); + } + } +} + +var _result = [nil, nil]; +var _courseAndDistance = [nil, nil]; +var bearingDistanceInstance = { + new: func(id) { + var bd = {parents: [bearingDistanceInstance]}; + bd.id = id; + bd.bearing = 360; + bd.distance = 0; + bd.selectedPoint = nil; + bd.displayID = nil; + return bd; + }, + newPointResult: func(result, duplicateNames = 0, duplicateNamesIndex = nil) { + if (duplicateNames != 0) { + me.selectedPoint = result[duplicateNamesIndex]; + me.displayID = result[duplicateNamesIndex].id; + } elsif (size(result) > 1) { + if (canvas_mcdu.myDuplicate[me.id] != nil) { + canvas_mcdu.myDuplicate[me.id].del(); + } + canvas_mcdu.myDuplicate[me.id] = nil; + canvas_mcdu.myDuplicate[me.id] = mcdu.duplicateNamesPage.new(result, 0, 0, me.id, 0, -999, -999, 1); + setprop("MCDU[" ~ me.id ~ "]/page", "DUPLICATENAMES"); + } else { + me.selectedPoint = result[0]; + me.displayID = result[0].id; + } + return 1; + }, + newPointNavaid: func(result, duplicateNames = 0, duplicateNamesIndex = nil) { + if (duplicateNames != 0) { + me.selectedPoint = result[duplicateNamesIndex]; + me.displayID = result[duplicateNamesIndex].id; + } elsif (size(result) > 1) { + if (canvas_mcdu.myDuplicate[me.id] != nil) { + canvas_mcdu.myDuplicate[me.id].del(); + } + canvas_mcdu.myDuplicate[me.id] = nil; + canvas_mcdu.myDuplicate[me.id] = mcdu.duplicateNamesPage.new(result, 0, 1, me.id, 0, -999, -999, 1); + setprop("MCDU[" ~ me.id ~ "]/page", "DUPLICATENAMES"); + } else { + me.selectedPoint = result[0]; + me.displayID = result[0].id; + print("YES"); + } + return 1; + }, + newPointRWY: func(result,ID) { + if (size(result) > 1) { + #spawnPAGE + } else { + var string = split(left(ID,4),ID)[1]; + if (find("C",string) != -1 or find("L",string) != -1 or find("R",string) != -1) { + if (size(string) == 2) { + string = "0" ~ string; + } + } else { + if (size(string) == 1) { + string = "0" ~ string; + } + } + + if (contains(result[0].runways,string)) { + me.selectedPoint = {lat: result[0].runways[string].lat, lon: result[0].runways[string].lon}; + me.displayID = left(ID,4) ~ string; + return 1; + } else { + return 0; + } + } + return 1; + }, + newPointLatLon: func(result) { + return 0; + }, + newPoint: func(id) { + _result[me.id] = fmgc.WaypointDatabase.getWP(id); + if (_result[me.id] != nil) { + me.selectedPoint = _result[me.id]; + me.displayID = _result[me.id].id; + return 1; + } + + if (size(id) >= 2 and size(id) <= 3) { + _result[me.id] = findNavaidsByID(id); + if (size(_result[me.id]) != 0) { + return me.newPointNavaid(_result[me.id]); + } else { + _result[me.id] = findAirportsByICAO(id); # consider 3 letter ICAOs + if (size(_result[me.id]) != 0) { + return me.newPointResult(_result[me.id]); + } + } + return 0; + } elsif (size(id) == 4) { + _result[me.id] = findAirportsByICAO(id); + if (size(_result[me.id]) != 0) { + return me.newPointResult(_result[me.id]); + } else { + _result[me.id] = findFixesByID(id); + if (size(_result[me.id]) != 0) { + return me.newPointResult(_result[me.id]); + } + } + return 0; + } elsif (size(id) >= 5 and size(id) <= 7) { + _result[me.id] = findFixesByID(id); + if (size(_result[me.id]) != 0) { + return me.newPointResult(_result[me.id]); + } else { + _result[me.id] = findAirportsByICAO(left(id,4)); + if (size(_result[me.id]) != 0) { + return me.newPointRWY(_result[me.id],id); + } + } + return 0; + } elsif (size(id) >= 12) { + _result[me.id] = fetchLatLon(id); + if (size(_result[me.id]) != 0) { + return me.newPointLatLon(_result[me.id]); + } + return 0; + } + return 0; + }, + update: func() { + if (me.selectedPoint == nil) { + return; + } + if (find("PROG",canvas_mcdu.pageProp[me.id].getValue()) == -1) { + return; + } + _courseAndDistance[me.id] = courseAndDistance(me.selectedPoint); + me.bearing = _courseAndDistance[me.id][0]; + me.distance = _courseAndDistance[me.id][1]; + }, +}; + +var bearingDistances = [bearingDistanceInstance.new(0),bearingDistanceInstance.new(1)]; + +var BDTimer = maketimer(2, func(){ + bearingDistances[0].update(); + bearingDistances[1].update(); +}); +BDTimer.start(); \ No newline at end of file diff --git a/Nasal/MCDU/PROGCLB.nas b/Nasal/MCDU/PROGCLB.nas deleted file mode 100644 index 66770ddd..00000000 --- a/Nasal/MCDU/PROGCLB.nas +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2020 Matthew Maring (mattmaring) - -var progCLBInput = func(key, i) { - var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; - if (key == "L1") { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; - if (fmgc.FMGCInternal.phase == 5) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - mcdu_scratchpad.scratchpads[i].empty(); - } else if (int(scratchpad) != nil) { - var crzs = size(scratchpad); - if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { - fmgc.FMGCInternal.crzProg = scratchpad; - mcdu_scratchpad.scratchpads[i].empty(); - if (fmgc.FMGCInternal.phase == 5) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } -} diff --git a/Nasal/MCDU/PROGCRZ.nas b/Nasal/MCDU/PROGCRZ.nas deleted file mode 100644 index 7d188609..00000000 --- a/Nasal/MCDU/PROGCRZ.nas +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2020 Matthew Maring (mattmaring) - -var progCRZInput = func(key, i) { - var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; - if (key == "L1") { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; - if (fmgc.FMGCInternal.phase == 5) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - mcdu_scratchpad.scratchpads[i].empty(); - } else if (int(scratchpad) != nil) { - var crzs = size(scratchpad); - if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { - fmgc.FMGCInternal.crzProg = scratchpad; - mcdu_scratchpad.scratchpads[i].empty(); - if (fmgc.FMGCInternal.phase == 5) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } -} diff --git a/Nasal/MCDU/PROGDES.nas b/Nasal/MCDU/PROGDES.nas deleted file mode 100644 index c915f35f..00000000 --- a/Nasal/MCDU/PROGDES.nas +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2020 Matthew Maring (mattmaring) - -var progDESInput = func(key, i) { - var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; - if (key == "L1") { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; - if (fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - mcdu_scratchpad.scratchpads[i].empty(); - } else if (int(scratchpad) != nil) { - var crzs = size(scratchpad); - if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100) { - fmgc.FMGCInternal.crzProg = scratchpad; - mcdu_scratchpad.scratchpads[i].empty(); - if (fmgc.FMGCInternal.phase == 4 or fmgc.FMGCInternal.phase == 5 or fmgc.FMGCInternal.phase == 6) { - fmgc.FMGCInternal.phase = 3; - setprop("/FMGC/internal/activate-once", 0); - setprop("/FMGC/internal/activate-twice", 0); - setprop("/FMGC/internal/decel", 0); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } -} diff --git a/Nasal/MCDU/PROGTO.nas b/Nasal/MCDU/PROGTO.nas deleted file mode 100644 index 5e0f96d4..00000000 --- a/Nasal/MCDU/PROGTO.nas +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2020 Matthew Maring (mattmaring) - -var altSet = props.globals.getNode("it-autoflight/input/alt", 1); - -var progTOInput = func(key, i) { - var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad; - if (key == "L1") { - if (scratchpad == "CLR") { - fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFl; - mcdu_scratchpad.scratchpads[i].empty(); - } else if (int(scratchpad) != nil) { - var crzs = size(scratchpad); - if (crzs >= 1 and crzs <= 3 and scratchpad > 0 and scratchpad <= 430 and fmgc.FMGCInternal.crzSet <= scratchpad * 100 and fmgc.FMGCInternal.crzSet) { - fmgc.FMGCInternal.crzProg = scratchpad; - mcdu_scratchpad.scratchpads[i].empty(); - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } else { - mcdu_message(i, "NOT ALLOWED"); - } - } -} From 59b6196e4c29cb2f166714ed38603b2cca6658d0 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Fri, 29 Jan 2021 21:09:21 +0000 Subject: [PATCH 016/124] XBLEED FAULT fixes so they don't come on with engine fire --- Nasal/ECAM/ECAM-logic.nas | 31 ++++++++++++++----------------- Nasal/ECAM/ECAM-messages.nas | 4 ++-- Systems/a320-fwc.xml | 31 +++++++++++++++++++++++++++++-- Systems/a320-pneumatic.xml | 29 ++++++++++++++++++++++++----- Systems/ecam-proprules.xml | 24 ------------------------ 5 files changed, 69 insertions(+), 50 deletions(-) diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 5a3ce8d8..2d116e40 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -1657,32 +1657,29 @@ var messages_priority_2 = func { # Crossbleed if (xBleedFault.clearFlag == 0 and (phaseVar2 <= 2 or phaseVar2 >= 9 or phaseVar2 == 6) and warningNodes.Logic.crossbleedFault.getValue()) { xBleedFault.active = 1; - } else { - ECAM_controller.warningReset(xBleedFault); - } - - if (xBleedFault.active) { - if (systems.PNEU.Switch.xbleed.getValue() == 1) { + + if (xBleedFaultMan.clearFlag == 0 and systems.PNEU.Switch.xbleed.getValue() == 1) { xBleedFaultMan.active = 1; } else { ECAM_controller.warningReset(xBleedFaultMan); } - if (warningNodes.Logic.crossbleedWai.getValue()) { - if (getprop("/controls/ice-protection/wing")) { - xBleedOff.active = 1; - } else { - ECAM_controller.warningReset(xBleedOff); - } - xBleedIcing.active = 1; + if (xBleedFaultWAI.clearFlag == 0 and wing_pb.getValue() and warningNodes.Logic.crossbleedWai.getValue()) { + xBleedFaultWAI.active = 1; } else { - ECAM_controller.warningReset(xBleedOff); - ECAM_controller.warningReset(xBleedIcing); + ECAM_controller.warningReset(xBleedFaultWAI); + } + + if (xBleedFaultICE.clearFlag == 0 and warningNodes.Logic.crossbleedWai.getValue()) { + xBleedFaultICE.active = 1; + } else { + ECAM_controller.warningReset(xBleedFaultICE); } } else { + ECAM_controller.warningReset(xBleedFault); ECAM_controller.warningReset(xBleedFaultMan); - ECAM_controller.warningReset(xBleedOff); - ECAM_controller.warningReset(xBleedIcing); + ECAM_controller.warningReset(xBleedFaultWAI); + ECAM_controller.warningReset(xBleedFaultICE); } if (bleed1Off.clearFlag == 0 and (warningNodes.Timers.bleed1Off60Output.getValue() == 1 or warningNodes.Timers.bleed1Off5Output.getValue() == 1) and FWC.Timer.eng1idleOutput.getBoolValue() and (phaseVar2 == 2 or phaseVar2 == 6)) { diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 5354529c..836d5848 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -362,8 +362,8 @@ var warnings = std.Vector.new([ var hpValve2Fault = warning.new(msg: "AIR ENG 2 HP VALVE FAULT", colour: "a"), var xBleedFault = warning.new(msg: "AIR X BLEED FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), var xBleedFaultMan = warning.new(msg: " -X BLEED........MAN CTL", colour: "c"), - var xBleedOff = warning.new(msg: " -WING ANTI ICE......OFF", colour: "c"), - var xBleedIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), + var xBleedFaultWAI = warning.new(msg: " -WING ANTI ICE......OFF", colour: "c"), + var xBleedFaultICE = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), var bleed1Off = warning.new(msg: "AIR BLEED 1 OFF", colour: "a", aural: 1, light: 1, isMainMsg: 1), var bleed2Off = warning.new(msg: "AIR BLEED 2 OFF", colour: "a", aural: 1, light: 1, isMainMsg: 1), var engBleedLowTemp = warning.new(msg: "AIR ENG 1+2 BLEED LO TEMP", colour: "a", aural: 1, light: 1, isMainMsg: 1), diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index fc49af06..a2d77e7d 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -62,6 +62,19 @@ 0.1 + + Timer for the ECAM system + /ECAM/warnings/logic/crossbleed-fault-timer-was-one + 0.1 + 120 + + + + Timer for the ECAM system + /controls/engines/engine[0]/fire-btn + 0.06666666666 + + Timer for the ECAM system /ECAM/warnings/logic/prv-1-not-shut-apu @@ -474,13 +487,27 @@ + + + + /ECAM/warnings/timer/xbleed-fault-output eq 1 + + + + /ECAM/warnings/timer/xbleed-fault-output eq 1 - /ECAM/warnings/timer/xbleed-fault-output-10 eq 1 - /ECAM/warnings/timer/xbleed-fault-output-15 eq 0 + + /ECAM/warnings/timer/xbleed-fault-output eq 0 + /ECAM/warnings/timer/xbleed-fault-output-10 ne 0 + + + /ECAM/warnings/timer/xbleed-fault-eng-fire eq 0 + /ECAM/warnings/timer/xbleed-fault-eng-fire eq 1 + diff --git a/Systems/a320-pneumatic.xml b/Systems/a320-pneumatic.xml index bfe656d7..1ada48d2 100644 --- a/Systems/a320-pneumatic.xml +++ b/Systems/a320-pneumatic.xml @@ -1183,28 +1183,47 @@ 120 - + /systems/pneumatics/valves/crossbleed-valve-cmd eq 1 /systems/pneumatics/valves/crossbleed-valve ne 1 /controls/pneumatics/switches/x-bleed eq 2 + + + + /systems/pneumatics/valves/crossbleed-valve-cmd eq 1 /systems/pneumatics/valves/crossbleed-valve ne 1 /controls/pneumatics/switches/x-bleed eq 1 - /systems/electrical/bus/dc-2 ge 25 - - + + + + + /systems/pneumatics/warnings/crossbleed-disag-open-man eq 1 + + /systems/pneumatics/warnings/crossbleed-disag-open-auto eq 1 + /systems/electrical/bus/dc-2 ge 25 + + + + + /systems/pneumatics/valves/crossbleed-valve-cmd eq 0 /systems/pneumatics/valves/crossbleed-valve ne 0 - + + + + + + /systems/pneumatics/warnings/crossbleed-disag-closed eq 1 /systems/pneumatics/warnings/crossbleed-disag-open eq 1 diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml index e89c7dfc..b818f2c9 100644 --- a/Systems/ecam-proprules.xml +++ b/Systems/ecam-proprules.xml @@ -412,30 +412,6 @@ - - monostable - true - - - /ECAM/warnings/timer/xbleed-fault-output - - /ECAM/warnings/timer/xbleed-fault-output-10 - - - - monostable - true - - - /controls/engines/engine[0]/fire-btn - - /ECAM/warnings/timer/xbleed-fault-output-15 - - SR From e51dab2e3bc960c2e146ed927f27a5f2c14b57d4 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 30 Jan 2021 16:12:34 +0000 Subject: [PATCH 017/124] ECAM: many fixes to THR LVR ABV IDLE, STALL, and fixes when there was an electrical failure --- Nasal/ECAM/ECAM-controller.nas | 5 +- Nasal/ECAM/ECAM-logic.nas | 18 +++--- Nasal/Systems/electrical.nas | 1 + Systems/a320-fwc-phases.xml | 8 +++ Systems/a320-fwc.xml | 115 +++++++++++++++++++++------------ Systems/ecam-proprules.xml | 8 +-- 6 files changed, 100 insertions(+), 55 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index 6461b5e7..faab2f1c 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -12,7 +12,6 @@ var leftOverflow = props.globals.initNode("/ECAM/warnings/overflow-left", 0, "B var rightOverflow = props.globals.initNode("/ECAM/warnings/overflow-right", 0, "BOOL"); var overflow = props.globals.initNode("/ECAM/warnings/overflow", 0, "BOOL"); -var dc_ess = props.globals.getNode("/systems/electrical/bus/dc-ess", 1); var lights = [props.globals.initNode("/ECAM/warnings/master-warning-light", 0, "BOOL"), props.globals.initNode("/ECAM/warnings/master-caution-light", 0, "BOOL")]; var aural = [props.globals.initNode("/sim/sound/warnings/crc", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/chime", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/cricket", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/retard", 0, "BOOL"), props.globals.initNode("/sim/sound/warnings/cchord", 0, "BOOL")]; @@ -76,6 +75,7 @@ var warningNodes = { greenYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-fuel-consumpt"), leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"), rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"), + flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"), }, Timers: { apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"), @@ -389,6 +389,7 @@ var ECAM_controller = { m.active = 0; } } + me._ready = 1; }, clear: func() { hasCleared = 0; @@ -479,7 +480,7 @@ var ECAM_controller = { }; setlistener("/systems/electrical/bus/dc-ess", func { - if (dc_ess.getValue() < 25) { + if (systems.ELEC.Bus.dcEss.getValue() < 25) { ECAM_controller.reset(); } }, 0, 0); diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 2d116e40..70296da3 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -55,7 +55,7 @@ var messages_priority_3 = func { } # FCTL FLAPS NOT ZERO - if (flap_not_zero.clearFlag == 0 and phaseVar3 == 6 and pts.Controls.Flight.flapsInput.getValue() != 0 and pts.Instrumentation.Altimeter.indicatedFt.getValue() > 22000) { + if (flap_not_zero.clearFlag == 0 and warningNodes.Logic.flapNotZero.getBoolValue()) { flap_not_zero.active = 1; } else { ECAM_controller.warningReset(flap_not_zero); @@ -95,7 +95,7 @@ var messages_priority_3 = func { if (allEngFail.clearFlag == 0 and dualFailNode.getBoolValue()) { allEngFail.active = 1; - if (allEngFailElec.clearFlag == 0 and getprop("/systems/electrical/relay/emer-glc/contact-pos") == 0) { + if (allEngFailElec.clearFlag == 0 and systems.ELEC.Source.EmerGen.relayPos.getValue() == 0) { allEngFailElec.active = 1; } else { ECAM_controller.warningReset(allEngFailElec); @@ -136,7 +136,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(allEngFailAPU); } - if (allEngFailLevers.clearFlag == 0 and (pts.Controls.Engines.Engine.throttleLever[0].getValue() > 0.01 or pts.Controls.Engines.Engine.throttleLever[0].getValue() > 0.01)) { + if (allEngFailLevers.clearFlag == 0 and (pts.Controls.Engines.Engine.throttleLever[0].getValue() > 0.01 or pts.Controls.Engines.Engine.throttleLever[1].getValue() > 0.01)) { allEngFailLevers.active = 1; } else { ECAM_controller.warningReset(allEngFailLevers); @@ -181,7 +181,7 @@ var messages_priority_3 = func { } # ENG ABV IDLE - if (eng1ThrLvrAbvIdle.clearFlag == 0 and ((phaseVar3 >= 1 and phaseVar3 <= 4) or (phaseVar3 >= 6 and phaseVar3 <= 9)) and warningNodes.Flipflops.eng1ThrLvrAbvIdle.getValue()) { # AND NOT RUNWAY TOO SHORT + if (eng1ThrLvrAbvIdle.clearFlag == 0 and ((phaseVar3 >= 2 and phaseVar3 <= 4) or (phaseVar3 >= 6 and phaseVar3 <= 9)) and warningNodes.Flipflops.eng1ThrLvrAbvIdle.getValue()) { # AND NOT RUNWAY TOO SHORT eng1ThrLvrAbvIdle.active = 1; if (eng1ThrLvrAbvIdle2.clearFlag == 0) { eng1ThrLvrAbvIdle2.active = 1; @@ -193,7 +193,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng1ThrLvrAbvIdle2); } - if (eng2ThrLvrAbvIdle.clearFlag == 0 and ((phaseVar3 >= 1 and phaseVar3 <= 4) or (phaseVar3 >= 6 and phaseVar3 <= 9)) and warningNodes.Flipflops.eng2ThrLvrAbvIdle.getValue()) { # AND NOT RUNWAY TOO SHORT + if (eng2ThrLvrAbvIdle.clearFlag == 0 and ((phaseVar3 >= 2 and phaseVar3 <= 4) or (phaseVar3 >= 6 and phaseVar3 <= 9)) and warningNodes.Flipflops.eng2ThrLvrAbvIdle.getValue()) { # AND NOT RUNWAY TOO SHORT eng2ThrLvrAbvIdle.active = 1; if (eng2ThrLvrAbvIdle2.clearFlag == 0) { eng2ThrLvrAbvIdle2.active = 1; @@ -815,7 +815,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(emerconfigGen3); } - if (getprop("/systems/electrical/relay/emer-glc/contact-pos") == 0 and emerconfigManOn.clearFlag == 0) { + if (systems.ELEC.Source.EmerGen.relayPos.getValue() == 0 and emerconfigManOn.clearFlag == 0) { emerconfigManOn.active = 1; } else { ECAM_controller.warningReset(emerconfigManOn); @@ -1182,7 +1182,7 @@ var messages_priority_2 = func { ECAM_controller.warningReset(dcBusBatFault); } - if (!(systems.ELEC.EmerElec.getValue() and !getprop("/systems/electrical/relay/emer-glc/contact-pos")) and systems.ELEC.Bus.dcEssShed.getValue() < 25 and systems.ELEC.Bus.dcEss.getValue() >= 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBusEssShed.clearFlag == 0) { + if (!(systems.ELEC.EmerElec.getValue() and !systems.ELEC.Source.EmerGen.relayPos.getValue()) and systems.ELEC.Bus.dcEssShed.getValue() < 25 and systems.ELEC.Bus.dcEss.getValue() >= 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBusEssShed.clearFlag == 0) { dcBusEssShed.active = 1; dcBusEssShedExtract.active = 1; dcBusEssShedIcing.active = 1; @@ -1192,7 +1192,7 @@ var messages_priority_2 = func { ECAM_controller.warningReset(dcBusEssShedIcing); } - if (!(systems.ELEC.EmerElec.getValue() and !getprop("/systems/electrical/relay/emer-glc/contact-pos")) and systems.ELEC.Bus.acEssShed.getValue() < 110 and systems.ELEC.Bus.acEss.getValue() >= 110 and phaseVar2 != 4 and phaseVar2 != 8 and acBusEssShed.clearFlag == 0) { + if (!(systems.ELEC.EmerElec.getValue() and !systems.ELEC.Source.EmerGen.relayPos.getValue()) and systems.ELEC.Bus.acEssShed.getValue() < 110 and systems.ELEC.Bus.acEss.getValue() >= 110 and phaseVar2 != 4 and phaseVar2 != 8 and acBusEssShed.clearFlag == 0) { acBusEssShed.active = 1; if (!systems.ELEC.EmerElec.getValue()) { acBusEssShedAtc.active = 1; @@ -2614,7 +2614,7 @@ var messages_right_memo = func { rat.colour = "g"; } - if (getprop("/systems/electrical/relay/emer-glc/contact-pos") == 1 and getprop("/systems/hydraulic/sources/rat/position") != 0 and !pts.Gear.wow[1].getValue()) { + if (systems.ELEC.Source.EmerGen.relayPos.getValue() == 1 and getprop("/systems/hydraulic/sources/rat/position") != 0 and !pts.Gear.wow[1].getValue()) { emer_gen.active = 1; } else { emer_gen.active = 0; diff --git a/Nasal/Systems/electrical.nas b/Nasal/Systems/electrical.nas index 1ff311e2..6ccf5253 100644 --- a/Nasal/Systems/electrical.nas +++ b/Nasal/Systems/electrical.nas @@ -121,6 +121,7 @@ var ELEC = { volts: props.globals.getNode("/systems/electrical/sources/emer-gen/output-volt"), hertz: props.globals.getNode("/systems/electrical/sources/emer-gen/output-hertz"), voltsRelay: props.globals.getNode("/systems/electrical/relay/emer-glc/output"), + relayPos: props.globals.getNode("/systems/electrical/relay/emer-glc/contact-pos"), }, Ext: { volts: props.globals.getNode("/systems/electrical/sources/ext/output-volt"), diff --git a/Systems/a320-fwc-phases.xml b/Systems/a320-fwc-phases.xml index 23412c65..0426d80a 100644 --- a/Systems/a320-fwc-phases.xml +++ b/Systems/a320-fwc-phases.xml @@ -229,6 +229,14 @@ + + + + + /ECAM/warning-phase eq 8 + + + diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index a2d77e7d..a9be041d 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -1692,11 +1692,17 @@ - /ECAM/warnings/logic/stall/phase-8-output eq 0 + + /ECAM/warnings/logic/stall/phase-8-output eq 0 + /ECAM/phases/monostable/phase-8 eq 0 + /ECAM/warning-phase eq 7 - /ECAM/warnings/logic/stall/phase-4-output eq 0 + + /ECAM/warnings/logic/stall/phase-4-output eq 0 + /ECAM/warnings/logic/stall/phase-4 eq 0 + /ECAM/warning-phase eq 5 @@ -1715,18 +1721,14 @@ /ECAM/warning-phase eq 5 - - - - - /ECAM/warning-phase eq 8 - - - /ECAM/warnings/logic/stall/phase-5-output eq 0 + + /ECAM/warnings/logic/stall/phase-5-output eq 0 + /ECAM/warnings/logic/stall/phase-5 eq 0 + /ECAM/warning-phase eq 6 @@ -1805,11 +1807,18 @@ - /ECAM/timer/ground-calc eq 0 - /ECAM/warning-phase eq 6 - /ECAM/warning-phase eq 7 + /ECAM/timer/ground-calc eq 1 /ECAM/warnings/logic/eng/ground-spoilers-output eq 1 - /ECAM/phases/monostable/phase-8-output eq 1 + + + /ECAM/warning-phase eq 6 + /ECAM/warning-phase eq 7 + + + /ECAM/phases/monostable/phase-8 eq 0 + /ECAM/phases/monostable/phase-8-output eq 0 + + @@ -1924,12 +1933,15 @@ /ECAM/warnings/logic/eng/eng-1-tla-abv-6-output eq 1 /engines/engine[0]/state eq 3 - /engines/engine[1]/state eq 3 - - /ECAM/warnings/logic/eng/eng-2-reverse-output eq 1 - - /ECAM/warnings/logic/eng/eng-2-reverse eq 1 - /ECAM/warnings/logic/eng/eng-1-retard-case-2-fall-output eq 0 + + /engines/engine[1]/state eq 3 + + + /ECAM/warnings/logic/eng/eng-2-reverse eq 1 + /ECAM/warnings/logic/eng/eng-1-retard-case-2 eq 0 + /ECAM/warnings/logic/eng/eng-1-retard-case-2-fall-output eq 0 + + /ECAM/warnings/logic/eng/eng-2-reverse-output eq 1 @@ -1940,12 +1952,15 @@ /ECAM/warnings/logic/eng/eng-1-tla-abv-6-2-output eq 1 /engines/engine[0]/state eq 3 - /engines/engine[1]/state eq 3 - - /ECAM/warnings/logic/eng/eng-2-tla-idle-output eq 1 - - /ECAM/warnings/logic/eng/eng-2-reverse-fall eq 0 - /ECAM/warnings/logic/eng/eng-2-tla-idle eq 1 + + /engines/engine[1]/state eq 3 + + /ECAM/warnings/logic/eng/eng-2-tla-idle-output eq 1 + + /ECAM/warnings/logic/eng/eng-2-reverse-fall eq 0 + /ECAM/warnings/logic/eng/eng-2-reverse eq 0 + /ECAM/warnings/logic/eng/eng-2-tla-idle eq 1 + @@ -1954,14 +1969,17 @@ - /ECAM/warnings/logic/eng/eng-2-tla-abv-6-2-output eq 1 - /engines/engine[0]/state eq 3 + /ECAM/warnings/logic/eng/eng-2-tla-abv-6-output eq 1 /engines/engine[1]/state eq 3 - - /ECAM/warnings/logic/eng/eng-1-reverse-output eq 1 - - /ECAM/warnings/logic/eng/eng-1-reverse eq 1 - /ECAM/warnings/logic/eng/eng-2-retard-case-2-fall-output eq 0 + + /engines/engine[0]/state eq 3 + + + /ECAM/warnings/logic/eng/eng-1-reverse eq 1 + /ECAM/warnings/logic/eng/eng-2-retard-case-2 eq 0 + /ECAM/warnings/logic/eng/eng-2-retard-case-2-fall-output eq 0 + + /ECAM/warnings/logic/eng/eng-1-reverse-output eq 1 @@ -1970,14 +1988,17 @@ - /ECAM/warnings/logic/eng/eng-2-tla-abv-6-output eq 1 - /engines/engine[0]/state eq 3 + /ECAM/warnings/logic/eng/eng-2-tla-abv-6-2-output eq 1 /engines/engine[1]/state eq 3 - - /ECAM/warnings/logic/eng/eng-1-tla-idle-output eq 1 - - /ECAM/warnings/logic/eng/eng-1-reverse-fall eq 0 - /ECAM/warnings/logic/eng/eng-1-tla-idle eq 1 + + /engines/engine[0]/state eq 3 + + /ECAM/warnings/logic/eng/eng-1-tla-idle-output eq 1 + + /ECAM/warnings/logic/eng/eng-1-reverse-fall eq 0 + /ECAM/warnings/logic/eng/eng-1-reverse eq 0 + /ECAM/warnings/logic/eng/eng-1-tla-idle eq 1 + @@ -2302,6 +2323,20 @@ /gear/gear[2]/position-norm eq 1 + + + + + /ECAM/warning-phase eq 6 + /controls/flight/flaps-input ne 0 + + /systems/navigation/adr/computation/baro-alt-corrected-1-capt ge 22000 + /systems/navigation/adr/computation/baro-alt-corrected-2-capt ge 22000 + /systems/navigation/adr/computation/baro-alt-corrected-3-capt ge 22000 + + + + diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml index b818f2c9..db8cdd3f 100644 --- a/Systems/ecam-proprules.xml +++ b/Systems/ecam-proprules.xml @@ -303,7 +303,7 @@ ECAM/warnings/altitude-alert/gear-downlocked-output - + monostable true @@ -311,9 +311,9 @@ 4.5 - ECAM/phases/monostable/phase-8 + /ECAM/phases/monostable/phase-8 - ECAM/phases/monostable/phase-8-output + /ECAM/phases/monostable/phase-8-output @@ -902,7 +902,7 @@ 1.0 - /ECAM/warnings/logic/stall/phase-8 + /ECAM/phases/monostable/phase-8 /ECAM/warnings/logic/stall/phase-8-output From 7d5db5ad01911864aba91b306ae5b66e61f788f5 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 30 Jan 2021 17:18:11 +0000 Subject: [PATCH 018/124] Fixes for ENG FIRE warn --- Nasal/ECAM/ECAM-logic.nas | 70 ++++++++++++++++++++------------------- Nasal/Systems/fire.nas | 6 ++-- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 70296da3..230d353f 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -41,6 +41,8 @@ var bigThree = nil; var altAlertSteady = 0; var altAlertFlash = 0; +var ecamConfigTest = props.globals.initNode("/ECAM/to-config-test", 0, "BOOL"); + var messages_priority_3 = func { phaseVar3 = phaseNode.getValue(); @@ -206,19 +208,19 @@ var messages_priority_3 = func { } # ENG FIRE - if ((eng1FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine1/warning-active") == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng1FireGnEvac.clearFlag == 0 and getprop("/systems/fire/engine1/warning-active") == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) { + if ((eng1FireFlAgent2.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng1FireGnEvac.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) { eng1Fire.active = 1; } else { ECAM_controller.warningReset(eng1Fire); } - if ((eng2FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine2/warning-active") == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng2FireGnEvac.clearFlag == 0 and getprop("/systems/fire/engine2/warning-active") == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) { + if ((eng2FireFlAgent2.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng2FireGnEvac.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) { eng2Fire.active = 1; } else { ECAM_controller.warningReset(eng2Fire); } - if (apuFireMaster.clearFlag == 0 and getprop("/systems/fire/apu/warning-active")) { + if (apuFireMaster.clearFlag == 0 and systems.apuFireWarn.getValue() == 1) { apuFire.active = 1; } else { ECAM_controller.warningReset(apuFire); @@ -238,23 +240,23 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng1FireFlmaster); } - if (eng1FireFlPB.clearFlag == 0 and getprop("/controls/engines/engine[0]/fire-btn") == 0) { + if (eng1FireFlPB.clearFlag == 0 and systems.fireButtons[0].getValue() == 0) { eng1FireFlPB.active = 1; } else { ECAM_controller.warningReset(eng1FireFlPB); } - if (getprop("/systems/fire/engine1/agent1-timer") != 0 and getprop("/systems/fire/engine1/agent1-timer") != 99) { - eng1FireFlAgent1Timer.msg = " -AGENT AFT " ~ getprop("/systems/fire/engine1/agent1-timer") ~ " S...DISCH"; + if (systems.eng1AgentTimer.getValue() != 0 and systems.eng1AgentTimer.getValue() != 99) { + eng1FireFlAgent1Timer.msg = " -AGENT AFT " ~ systems.eng1AgentTimer.getValue() ~ " S...DISCH"; } - if (eng1FireFlAgent1.clearFlag == 0 and getprop("/controls/engines/engine[0]/fire-btn") == 1 and !getprop("/systems/fire/engine1/disch1") and getprop("/systems/fire/engine1/agent1-timer") != 0 and getprop("/systems/fire/engine1/agent1-timer") != 99) { + if (eng1FireFlAgent1.clearFlag == 0 and systems.fireButtons[0].getValue() == 1 and !systems.extinguisherBottles.vector[0].lightProp.getValue() and systems.eng1AgentTimer.getValue() != 0 and systems.eng1AgentTimer.getValue() != 99) { eng1FireFlAgent1Timer.active = 1; } else { ECAM_controller.warningReset(eng1FireFlAgent1Timer); } - if (eng1FireFlAgent1.clearFlag == 0 and !getprop("/systems/fire/engine1/disch1") and (getprop("/systems/fire/engine1/agent1-timer") == 0 or getprop("/systems/fire/engine1/agent1-timer") == 99)) { + if (eng1FireFlAgent1.clearFlag == 0 and !systems.extinguisherBottles.vector[0].lightProp.getValue() and (systems.eng1AgentTimer.getValue() == 0 or systems.eng1AgentTimer.getValue() == 99)) { eng1FireFlAgent1.active = 1; } else { ECAM_controller.warningReset(eng1FireFlAgent1); @@ -266,17 +268,17 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng1FireFlATC); } - if (getprop("/systems/fire/engine1/agent2-timer") != 0 and getprop("/systems/fire/engine1/agent2-timer") != 99) { - eng1FireFl30Sec.msg = "•IF FIRE AFTER " ~ getprop("/systems/fire/engine1/agent2-timer") ~ " S:"; + if (systems.eng1Agent2Timer.getValue() != 0 and systems.eng1Agent2Timer.getValue() != 99) { + eng1FireFl30Sec.msg = "•IF FIRE AFTER " ~ systems.eng1Agent2Timer.getValue() ~ " S:"; } - if (eng1FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine1/disch1") and !getprop("/systems/fire/engine1/disch2") and getprop("/systems/fire/engine1/agent2-timer") > 0) { + if (eng1FireFlAgent2.clearFlag == 0 and systems.extinguisherBottles.vector[0].lightProp.getValue() and !systems.extinguisherBottles.vector[1].lightProp.getValue() and systems.eng1Agent2Timer.getValue() > 0) { eng1FireFl30Sec.active = 1; } else { ECAM_controller.warningReset(eng1FireFl30Sec); } - if (eng1FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine1/disch1") and !getprop("/systems/fire/engine1/disch2")) { + if (eng1FireFlAgent2.clearFlag == 0 and systems.extinguisherBottles.vector[0].lightProp.getValue() and !systems.extinguisherBottles.vector[1].lightProp.getValue()) { eng1FireFlAgent2.active = 1; } else { ECAM_controller.warningReset(eng1FireFlAgent2); @@ -324,19 +326,19 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng1FireGnmaster); } - if (eng1FireGnPB.clearFlag == 0 and getprop("/controls/engines/engine[0]/fire-btn") == 0) { + if (eng1FireGnPB.clearFlag == 0 and systems.fireButtons[0].getValue() == 0) { eng1FireGnPB.active = 1; } else { ECAM_controller.warningReset(eng1FireGnPB); } - if (eng1FireGnAgent1.clearFlag == 0 and !getprop("/systems/fire/engine1/disch1")) { + if (eng1FireGnAgent1.clearFlag == 0 and !systems.extinguisherBottles.vector[0].lightProp.getValue()) { eng1FireGnAgent1.active = 1; } else { ECAM_controller.warningReset(eng1FireGnAgent1); } - if (eng1FireGnAgent2.clearFlag == 0 and !getprop("/systems/fire/engine1/disch2")) { + if (eng1FireGnAgent2.clearFlag == 0 and !systems.extinguisherBottles.vector[1].lightProp.getValue()) { eng1FireGnAgent2.active = 1; } else { ECAM_controller.warningReset(eng1FireGnAgent2); @@ -393,23 +395,23 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng2FireFlmaster); } - if (eng2FireFlPB.clearFlag == 0 and getprop("/controls/engines/engine[1]/fire-btn") == 0) { + if (eng2FireFlPB.clearFlag == 0 and systems.fireButtons[1].getValue() == 0) { eng2FireFlPB.active = 1; } else { ECAM_controller.warningReset(eng2FireFlPB); } - if (getprop("/systems/fire/engine2/agent1-timer") != 0 and getprop("/systems/fire/engine2/agent1-timer") != 99) { - eng2FireFlAgent1Timer.msg = " -AGENT AFT " ~ getprop("/systems/fire/engine2/agent1-timer") ~ " S...DISCH"; + if (systems.eng2AgentTimer.getValue() != 0 and systems.eng2AgentTimer.getValue() != 99) { + eng2FireFlAgent1Timer.msg = " -AGENT AFT " ~ systems.eng2AgentTimer.getValue() ~ " S...DISCH"; } - if (eng2FireFlAgent1.clearFlag == 0 and getprop("/controls/engines/engine[1]/fire-btn") == 1 and !getprop("/systems/fire/engine2/disch1") and getprop("/systems/fire/engine2agent1-timer") != 0 and getprop("/systems/fire/engine2/agent1-timer") != 99) { + if (eng2FireFlAgent1.clearFlag == 0 and systems.fireButtons[1].getValue() == 1 and !systems.extinguisherBottles.vector[2].lightProp.getValue() and getprop("/systems/fire/engine2agent1-timer") != 0 and systems.eng2AgentTimer.getValue() != 99) { eng2FireFlAgent1Timer.active = 1; } else { ECAM_controller.warningReset(eng2FireFlAgent1Timer); } - if (eng2FireFlAgent1.clearFlag == 0 and !getprop("/systems/fire/engine2/disch1") and (getprop("/systems/fire/engine2/agent1-timer") == 0 or getprop("/systems/fire/engine2/agent1-timer") == 99)) { + if (eng2FireFlAgent1.clearFlag == 0 and !systems.extinguisherBottles.vector[2].lightProp.getValue() and (systems.eng2AgentTimer.getValue() == 0 or systems.eng2AgentTimer.getValue() == 99)) { eng2FireFlAgent1.active = 1; } else { ECAM_controller.warningReset(eng2FireFlAgent1); @@ -421,17 +423,17 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng2FireFlATC); } - if (getprop("/systems/fire/engine2/agent2-timer") != 0 and getprop("/systems/fire/engine2/agent2-timer") != 99) { - eng2FireFl30Sec.msg = "•IF FIRE AFTER " ~ getprop("/systems/fire/engine2/agent2-timer") ~ " S:"; + if (systems.eng2Agent2Timer.getValue() != 0 and systems.eng2Agent2Timer.getValue() != 99) { + eng2FireFl30Sec.msg = "•IF FIRE AFTER " ~ systems.eng2Agent2Timer.getValue() ~ " S:"; } - if (eng2FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine2/disch1") and !getprop("/systems/fire/engine2/disch2") and getprop("/systems/fire/engine2/agent2-timer") > 0) { + if (eng2FireFlAgent2.clearFlag == 0 and systems.extinguisherBottles.vector[2].lightProp.getValue() and !systems.extinguisherBottles.vector[4].lightProp.getValue() and systems.eng2Agent2Timer.getValue() > 0) { eng2FireFl30Sec.active = 1; } else { ECAM_controller.warningReset(eng2FireFl30Sec); } - if (eng2FireFlAgent2.clearFlag == 0 and getprop("/systems/fire/engine2/disch1") and !getprop("/systems/fire/engine2/disch2")) { + if (eng2FireFlAgent2.clearFlag == 0 and systems.extinguisherBottles.vector[2].lightProp.getValue() and !systems.extinguisherBottles.vector[4].lightProp.getValue()) { eng2FireFlAgent2.active = 1; } else { ECAM_controller.warningReset(eng2FireFlAgent2); @@ -479,19 +481,19 @@ var messages_priority_3 = func { ECAM_controller.warningReset(eng2FireGnmaster); } - if (eng2FireGnPB.clearFlag == 0 and getprop("/controls/engines/engine[1]/fire-btn") == 0) { + if (eng2FireGnPB.clearFlag == 0 and systems.fireButtons[1].getValue() == 0) { eng2FireGnPB.active = 1; } else { ECAM_controller.warningReset(eng2FireGnPB); } - if (eng2FireGnAgent1.clearFlag == 0 and !getprop("/systems/fire/engine2/disch1")) { + if (eng2FireGnAgent1.clearFlag == 0 and !systems.extinguisherBottles.vector[2].lightProp.getValue()) { eng2FireGnAgent1.active = 1; } else { ECAM_controller.warningReset(eng2FireGnAgent1); } - if (eng2FireGnAgent2.clearFlag == 0 and !getprop("/systems/fire/engine2/disch2")) { + if (eng2FireGnAgent2.clearFlag == 0 and !systems.extinguisherBottles.vector[4].lightProp.getValue()) { eng2FireGnAgent2.active = 1; } else { ECAM_controller.warningReset(eng2FireGnAgent2); @@ -542,17 +544,17 @@ var messages_priority_3 = func { ECAM_controller.warningReset(apuFirePB); } - if (getprop("/systems/fire/apu/agent-timer") != 0 and getprop("/systems/fire/apu/agent-timer") != 99) { - apuFireAgentTimer.msg = " -AGENT AFT " ~ getprop("/systems/fire/apu/agent-timer") ~ " S...DISCH"; + if (systems.apuAgentTimer.getValue() != 0 and systems.apuAgentTimer.getValue() != 99) { + apuFireAgentTimer.msg = " -AGENT AFT " ~ systems.apuAgentTimer.getValue() ~ " S...DISCH"; } - if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !getprop("/systems/fire/apu/disch") and getprop("/systems/fire/apu/agent-timer") != 0) { + if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[5].lightProp.getValue() and systems.apuAgentTimer.getValue() != 0) { apuFireAgentTimer.active = 1; } else { ECAM_controller.warningReset(apuFireAgentTimer); } - if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !getprop("/systems/fire/apu/disch") and getprop("/systems/fire/apu/agent-timer") == 0) { + if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[5].lightProp.getValue() and systems.apuAgentTimer.getValue() == 0) { apuFireAgent.active = 1; } else { ECAM_controller.warningReset(apuFireAgent); @@ -570,7 +572,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(apuFireMaster); } - if ((getprop("/ECAM/to-config-test") and (phaseVar3 == 1 or phaseVar3 == 2 or phaseVar3 == 9)) or phaseVar3 == 3 or phaseVar3 == 4) { + if ((ecamConfigTest.getValue() and (phaseVar3 == 1 or phaseVar3 == 2 or phaseVar3 == 9)) or phaseVar3 == 3 or phaseVar3 == 4) { takeoffConfig = 1; } else { takeoffConfig = 0; @@ -2273,7 +2275,7 @@ var messages_config_memo = func { setprop("/ECAM/to-config-normal", 1); } - if (getprop("/ECAM/to-config-test") and (phaseVarMemo == 1 or phaseVarMemo == 2 or phaseVarMemo == 9)) { + if (ecamConfigTest.getValue() and (phaseVarMemo == 1 or phaseVarMemo == 2 or phaseVarMemo == 9)) { setprop("/ECAM/to-config-set", 1); } else { setprop("/ECAM/to-config-set", 0); @@ -2325,7 +2327,7 @@ var messages_config_memo = func { toMemoLine5.colour = "c"; } - if (getprop("/ECAM/to-config-test") and (phaseVarMemo == 2 or phaseVarMemo == 9)) { + if (ecamConfigTest.getValue() and (phaseVarMemo == 2 or phaseVarMemo == 9)) { setprop("/ECAM/to-memo-set", 1); } else { setprop("/ECAM/to-memo-set", 0); diff --git a/Nasal/Systems/fire.nas b/Nasal/Systems/fire.nas index 433e6335..1a8cbb26 100644 --- a/Nasal/Systems/fire.nas +++ b/Nasal/Systems/fire.nas @@ -33,6 +33,8 @@ var eng1Agent2TimerTime = props.globals.initNode("/systems/fire/engine1/agent2-t var eng2Agent2TimerTime = props.globals.initNode("/systems/fire/engine2/agent2-timer-time", 0, "INT"); var apuAgentTimerTime = props.globals.initNode("/systems/fire/apu/agent-timer-time", 0, "INT"); +var fireButtons = [props.globals.getNode("/controls/engines/engine[0]/fire-btn"),props.globals.getNode("/controls/engines/engine[1]/fire-btn"),props.globals.getNode("/controls/apu/fire-btn")]; + var fire_init = func { setprop("/controls/OH/protectors/fwddisch", 0); setprop("/controls/OH/protectors/aftdisch", 0); @@ -544,7 +546,7 @@ var createCargoFireBottleListener = func(prop, index) { # Listeners setlistener("/controls/engines/engine[0]/fire-btn", func() { - if (getprop("/controls/engines/engine[0]/fire-btn") == 1) { + if (systems.fireButtons[0].getValue() == 1) { ecam.shutUpYou(); eng1AgentTimerMakeTimer.stop(); eng1AgentTimer.setValue(10); @@ -587,7 +589,7 @@ eng1Agent2TimerMakeTimerFunc = func() { } setlistener("/controls/engines/engine[1]/fire-btn", func() { - if (getprop("/controls/engines/engine[1]/fire-btn") == 1) { + if (systems.fireButtons[1].getValue() == 1) { ecam.shutUpYou(); eng2AgentTimerMakeTimer.stop(); eng2AgentTimer.setValue(10); From 8857a2641c38e719d41d716a3ebdd5b178b3954e Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 30 Jan 2021 18:31:06 +0000 Subject: [PATCH 019/124] Rework all takeoff config warnings --- Nasal/ECAM/ECAM-controller.nas | 11 +++ Nasal/ECAM/ECAM-logic.nas | 32 +++---- Nasal/ECAM/ECAM-messages.nas | 14 +++ Systems/a320-fwc.xml | 167 +++++++++++++++++++++++++++++++++ Systems/ecam-proprules.xml | 66 +++++++++++++ 5 files changed, 271 insertions(+), 19 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index faab2f1c..01deb93f 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -76,6 +76,17 @@ var warningNodes = { leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"), rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"), flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"), + slatsConfig: props.globals.initNode("/ECAM/warnings/fctl/slats-config-output"), + flapsConfig: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-output"), + spdBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-output"), + pitchTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-output"), + rudTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-output"), + parkBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/park-brk-config-output"), + slatsConfig2: props.globals.initNode("/ECAM/warnings/fctl/slats-config-range"), + flapsConfig2: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-range"), + spdBrkConfig2: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-range"), + pitchTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-range"), + rudTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-range"), }, Timers: { apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"), diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 230d353f..0a8232cc 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -578,29 +578,23 @@ var messages_priority_3 = func { takeoffConfig = 0; } - if ((pts.Controls.Flight.flapsInput.getValue() == 0 or pts.Controls.Flight.flapsInput.getValue() == 4) and takeoffConfig) { - if (slats_config.clearFlag == 0) { - slats_config.active = 1; - slats_config_1.active = 1; - } else { - ECAM_controller.warningReset(slats_config); - ECAM_controller.warningReset(slats_config_1); - } - if (flaps_config.clearFlag == 0) { - flaps_config.active = 1; - flaps_config_1.active = 1; - } else { - ECAM_controller.warningReset(flaps_config); - ECAM_controller.warningReset(flaps_config_1); - } + if (slats_config.clearFlag == 0 and (warningNodes.Logic.slatsConfig.getBoolValue() or (takeoffConfig and warningNodes.Logic.slatsConfig2.getBoolValue()))) { + slats_config.active = 1; + slats_config_1.active = 1; } else { ECAM_controller.warningReset(slats_config); ECAM_controller.warningReset(slats_config_1); + } + + if (flaps_config.clearFlag == 0 and (warningNodes.Logic.flapsConfig.getBoolValue() or (takeoffConfig and warningNodes.Logic.flapsConfig2.getBoolValue()))) { + flaps_config.active = 1; + flaps_config_1.active = 1; + } else { ECAM_controller.warningReset(flaps_config); ECAM_controller.warningReset(flaps_config_1); } - if ((spd_brk_config.clearFlag == 0) and pts.Controls.Flight.speedbrake.getValue() != 0 and takeoffConfig) { + if (spd_brk_config.clearFlag == 0 and (warningNodes.Logic.spdBrkConfig.getBoolValue() or (takeoffConfig and warningNodes.Logic.spdBrkConfig2.getBoolValue()))) { spd_brk_config.active = 1; spd_brk_config_1.active = 1; } else { @@ -608,7 +602,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(spd_brk_config_1); } - if ((pitch_trim_config.clearFlag == 0) and (getprop("/fdm/jsbsim/hydraulics/elevator-trim/final-deg") > 2.6 or getprop("/fdm/jsbsim/hydraulics/elevator-trim/final-deg") < -2.6) and takeoffConfig) { + if (pitch_trim_config.clearFlag == 0 and (warningNodes.Logic.pitchTrimConfig.getBoolValue() or (takeoffConfig and warningNodes.Logic.pitchTrimConfig2.getBoolValue()))) { pitch_trim_config.active = 1; pitch_trim_config_1.active = 1; } else { @@ -616,7 +610,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(pitch_trim_config_1); } - if ((rud_trim_config.clearFlag == 0) and (getprop("/fdm/jsbsim/hydraulics/rudder/trim-cmd-deg") < -3.6 or getprop("/fdm/jsbsim/hydraulics/rudder/trim-cmd-deg") > 3.6) and takeoffConfig) { + if (rud_trim_config.clearFlag == 0 and (warningNodes.Logic.rudTrimConfig.getBoolValue() or (takeoffConfig and warningNodes.Logic.rudTrimConfig2.getBoolValue()))) { rud_trim_config.active = 1; rud_trim_config_1.active = 1; } else { @@ -624,7 +618,7 @@ var messages_priority_3 = func { ECAM_controller.warningReset(rud_trim_config_1); } - if ((park_brk_config.clearFlag == 0) and warningNodes.Flipflops.parkBrk.getValue() and phaseVar3 >= 2 and phaseVar3 <= 3) { + if (park_brk_config.clearFlag == 0 and warningNodes.Logic.parkBrkConfig.getValue() and phaseVar3 >= 2 and phaseVar3 <= 3) { park_brk_config.active = 1; } else { ECAM_controller.warningReset(park_brk_config); diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 836d5848..40c92c72 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -85,6 +85,20 @@ var warnings = std.Vector.new([ var eng2FireGnAgent2 = warning.new(msg: " -AGENT 2..........DISCH", colour: "c"), var eng2FireGnEvac = warning.new(msg: " -EMER EVAC PROC...APPLY", colour: "c"), + # ADR 1 + 2 + 3 FAULT + var ADR123Fault = warning.new(msg: "NAV ADR1+2+3 FAULT ", colour: "r", aural: 0, light: 0, isMainMsg: 1), + var ADR123FaultAP = warning.new(msg: " -AP+FD..............OFF", colour: "c"), + var ADR123FaultATHR = warning.new(msg: " -ATHR...............OFF", colour: "c"), + var ADR123FaultPRBW = warning.new(msg: " -PROBE/WINDOW HEAT...ON", colour: "c"), + var ADR123FaultBUSSC = warning.new(msg: " -CAPT BKUP SPD/ALT...ON", colour: "c"), + var ADR123FaultBUSSF = warning.new(msg: " -FO BKUP SPD/ALT.....ON", colour: "c"), + var ADR123FaultADRPB = warning.new(msg: " -ADR 1+2+3 P/B......OFF", colour: "c"), + var ADR123FaultSPD = warning.new(msg: " -SPD......FLY THE GREEN", colour: "c"), + var ADR123FaultAOADISAG = warning.new(msg: " •IF AOA DISAGREE: ", colour: "w", isMainMsg: 1), + var ADR123FaultBUSSINOP = warning.new(msg: " BKUP SPD/ALT.DO NOT USE", colour: "c"), + var ADR123FaultSTBY = warning.new(msg: " -STBY INST.MAY BE UNREL", colour: "c"), + var ADR123FaultPROC = warning.new(msg: " -ALL ADR OFF PROC.APPLY", colour: "c"), + # APU FIRE var apuFire = warning.new(msg: "APU FIRE ", colour: "r", aural: 0, light: 0, isMainMsg: 1, sdPage: "apu"), var apuFirePB = warning.new(msg: " -APU FIRE P/B......PUSH", colour: "c"), diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index a9be041d..98422d49 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -2337,6 +2337,156 @@ + + + + fcs/flap-pos-deg lt 2 + fcs/flap-pos-deg ge 24 + + + + + + + + /ECAM/warning-phase eq 3 + /ECAM/warning-phase eq 4 + + /ECAM/warnings/fctl/flaps-config-range eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /ECAM/warnings/fctl/flaps-config-range ne 1 + + + + + + + fcs/slat-pos-deg lt 17 + fcs/slat-pos-deg ge 25 + + + + + + + + /ECAM/warning-phase eq 3 + /ECAM/warning-phase eq 4 + + /ECAM/warnings/fctl/slats-config-range eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /ECAM/warnings/fctl/slats-config-range ne 1 + + + + + + + /controls/flight/speedbrake gt 0.0 + + + + + + + + /ECAM/warning-phase eq 3 + /ECAM/warning-phase eq 4 + + /ECAM/warnings/fctl/spd-brk-config-range eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /ECAM/warnings/fctl/spd-brk-config-range ne 1 + + + + + + + hydraulics/elevator-trim/final-deg gt 2.9 + hydraulics/elevator-trim/final-deg lt -2.9 + + + + + + + + /ECAM/warning-phase eq 3 + /ECAM/warning-phase eq 4 + + /ECAM/warnings/fctl/pitch-trim-config-range eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /ECAM/warnings/fctl/pitch-trim-config-range ne 1 + + + + + + + hydraulics/rudder/trim-deg gt 3.6 + hydraulics/rudder/trim-deg lt -3.6 + + + + + + + + /ECAM/warning-phase eq 3 + /ECAM/warning-phase eq 4 + + /ECAM/warnings/fctl/rudder-trim-config-range eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /ECAM/warnings/fctl/rudder-trim-config-range ne 1 + + + + + + + /ECAM/warning-phase eq 3 + /controls/gear/brake-parking eq 1 + + + + + + + /ECAM/warning-phase eq 5 + /controls/gear/brake-parking eq 0 + + + @@ -2728,4 +2878,21 @@ + + diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml index db8cdd3f..be08bc8a 100644 --- a/Systems/ecam-proprules.xml +++ b/Systems/ecam-proprules.xml @@ -1005,4 +1005,70 @@ /ECAM/phases/phase-calculation/altitude-ge-800 + + + SR + + /ECAM/warnings/fctl/flaps-config-set + + + /ECAM/warnings/fctl/flaps-config-reset + + /ECAM/warnings/fctl/flaps-config-output + + + + SR + + /ECAM/warnings/fctl/slats-config-set + + + /ECAM/warnings/fctl/slats-config-reset + + /ECAM/warnings/fctl/slats-config-output + + + + SR + + /ECAM/warnings/fctl/spd-brk-config-set + + + /ECAM/warnings/fctl/spd-brk-config-reset + + /ECAM/warnings/fctl/spd-brk-config-output + + + + SR + + /ECAM/warnings/fctl/pitch-trim-config-set + + + /ECAM/warnings/fctl/pitch-trim-config-reset + + /ECAM/warnings/fctl/pitch-trim-config-output + + + + SR + + /ECAM/warnings/fctl/rudder-trim-config-set + + + /ECAM/warnings/fctl/rudder-trim-config-reset + + /ECAM/warnings/fctl/rudder-trim-config-output + + + + SR + + /ECAM/warnings/fctl/park-brk-config-set + + + /ECAM/warnings/fctl/park-brk-config-reset + + /ECAM/warnings/fctl/park-brk-config-output + From c9869358107dbdd7392c74f763a19a346f467318 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 30 Jan 2021 20:22:09 +0000 Subject: [PATCH 020/124] Improve stall warning: found better documentation. It actually does operate in normal law -- just uses different angles to alternate or direct law. Inhibited under 1500 feet at takeoff --- Nasal/ECAM/ECAM-messages.nas | 31 ++++++++++++ Systems/a320-fwc.xml | 97 ++++++++++++++++++++++++++++-------- 2 files changed, 106 insertions(+), 22 deletions(-) diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 40c92c72..21e69225 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -119,6 +119,37 @@ var warnings = std.Vector.new([ var rud_trim_config_1 = warning.new(msg: " NOT IN T.O. RANGE", colour: "r", aural: 0, light: 0), var park_brk_config = warning.new(msg: "CONFIG PARK BRK ON", colour: "r", aural: 0, light: 0), + # EXCESS CAB ALT + var excessCabAlt = warning.new(msg: "CAB PR EXCESS CAB ALT", colour: "r", aural: 0, light: 0, isMainMsg: 1), + var excessCabAltMask = warning.new(msg: " -CREW OXY MASKS.....USE", colour: "c"), + var excessCabAltSigns = warning.new(msg: " -SIGNS...............ON", colour: "c"), + var excessCabAltEmerD = warning.new(msg: " •EMER DESCENT:", colour: "w", isMainMsg: 1), + var excessCabAltDES = warning.new(msg: " -DESCENT.......INITIATE", colour: "c"), + var excessCabAltTHRLVR = warning.new(msg: " -THR LEVERS........IDLE", colour: "c"), + var excessCabAltSPDBRK = warning.new(msg: " -SPD BRK...........FULL", colour: "c"), + var excessCabAltSPD = warning.new(msg: " SPD.....MAX/APPROPRIATE", colour: "c"), + var excessCabAltENG = warning.new(msg: " -ENG MODE...........IGN", colour: "c"), + var excessCabAltCAB = warning.new(msg: " -CABIN CREW......ADVISE", colour: "c"), + var excessCabAltPA = warning.new(msg: " -EMER DES (PA).ANNOUNCE", colour: "c"), + var excessCabAltXPDR = warning.new(msg: " -XPDR 7700.....CONSIDER", colour: "c"), + var excessCabAltMEA = warning.new(msg: " MAX FL.....100/MEA-MORA", colour: "c"), + var excessCabAltCabAlt = warning.new(msg: " •IF CAB ALT>14000 FT:", colour: "w", isMainMsg: 1), + var excessCabAltMasks = warning.new(msg: " -PAX OXY MASKS...MAN ON", colour: "c"), + + # ENG 1 OIL LO PR + var eng1OilLoPr = warning.new(msg: "ENG 1 OIL LO PR ", colour: "r", aural: 0, light: 0, isMainMsg: 1), + var eng1OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w", isMainMsg: 1), + var eng1OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w", isMainMsg: 1), + var eng1OilLoPrThrot = warning.new(msg: " -THR LEVER 1.......IDLE", colour: "c"), + var eng1OilLoPrMaster = warning.new(msg: " -ENG MASTER 1.......OFF", colour: "c"), + + # ENG 2 OIL LO PR + var eng2OilLoPr = warning.new(msg: "ENG 2 OIL LO PR ", colour: "r", aural: 0, light: 0, isMainMsg: 1), + var eng2OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w", isMainMsg: 1), + var eng2OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w", isMainMsg: 1), + var eng2OilLoPrThrot = warning.new(msg: " -THR LEVER 2.......IDLE", colour: "c"), + var eng2OilLoPrMaster = warning.new(msg: " -ENG MASTER 2.......OFF", colour: "c"), + # FCTL L+R ELEV FAULT var lrElevFault = warning.new(msg: "F/CTL L+R ELEV FAULT", colour: "r", aural: 0, light: 0, isMainMsg: 1), var lrElevFaultSpeed = warning.new(msg: " MAX SPEED.......320/.77", colour: "c"), diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index 98422d49..7642360b 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -1687,6 +1687,13 @@ + + + + + /ECAM/warning-phase eq 4 + + @@ -1707,13 +1714,6 @@ - - - - - /ECAM/warning-phase eq 4 - - @@ -1738,37 +1738,90 @@ /instrumentation/radar-altimeter[0]/radar-altitude-ft lt 1500 /instrumentation/radar-altimeter[1]/radar-altitude-ft lt 1500 - /it-fbw/law ne 0 + /it-fbw/law eq 0 /ECAM/warnings/logic/stall/phase-flipflop eq 1 + + Timer for the ECAM system + /ECAM/phases/timer/eng1idle + 120 + 0.033 + + + /it-fbw/law eq 0 /fdm/jsbsim/fcs/slat-pos-deg lt 15 - /systems/navigation/adr/output/aoa-1 ge 15 - /systems/navigation/adr/output/aoa-2 ge 15 - /systems/navigation/adr/output/aoa-3 ge 15 + + /systems/navigation/adr/output/aoa-1 ge 13.5 + /systems/navigation/adr/operating-1 eq 1 + + + /systems/navigation/adr/output/aoa-2 ge 13.5 + /systems/navigation/adr/operating-2 eq 1 + + + /systems/navigation/adr/output/aoa-3 ge 13.5 + /systems/navigation/adr/operating-3 eq 1 + + /it-fbw/law eq 0 /fdm/jsbsim/fcs/slat-pos-deg ge 15 - - /systems/navigation/adr/output/aoa-1 ge 23 - /systems/navigation/adr/output/aoa-2 ge 23 - /systems/navigation/adr/output/aoa-3 ge 23 + + /systems/navigation/adr/output/aoa-1 ge 22 + /systems/navigation/adr/operating-1 eq 1 + + + /systems/navigation/adr/output/aoa-2 ge 22 + /systems/navigation/adr/operating-2 eq 1 + + + /systems/navigation/adr/output/aoa-3 ge 22 + /systems/navigation/adr/operating-3 eq 1 + + + + /it-fbw/law ne 0 + /fdm/jsbsim/fcs/slat-pos-deg lt 15 + + + /systems/navigation/adr/output/aoa-1 ge 8 + /systems/navigation/adr/operating-1 eq 1 + + + /systems/navigation/adr/output/aoa-2 ge 8 + /systems/navigation/adr/operating-2 eq 1 + + + /systems/navigation/adr/output/aoa-3 ge 8 + /systems/navigation/adr/operating-3 eq 1 + + + + + /it-fbw/law ne 0 + /fdm/jsbsim/fcs/slat-pos-deg ge 15 + + /systems/navigation/adr/output/aoa-1 ge 14 + /systems/navigation/adr/operating-1 eq 1 + + + /systems/navigation/adr/output/aoa-2 ge 14 + /systems/navigation/adr/operating-2 eq 1 + + + /systems/navigation/adr/output/aoa-3 ge 14 + /systems/navigation/adr/operating-3 eq 1 - - /it-fbw/law ne 0 - - /systems/navigation/adr/operating-1 eq 1 - /systems/navigation/adr/operating-2 eq 1 - /systems/navigation/adr/operating-3 eq 1 @@ -2878,7 +2931,7 @@ - + + /ECAM/warning-phase le 2 + /ECAM/warning-phase ge 9 + + /engines/engine[0]/state eq 3 + + + /ECAM/warning-phase gt 2 + /ECAM/warning-phase lt 9 + /ECAM/warning-phase ne 4 + /ECAM/warning-phase ne 5 + + /ECAM/warnings/hyd/blue-abnorm-lo-pr eq 1 /ECAM/warnings/hyd/green-abnorm-lo-pr eq 1 @@ -2767,6 +2782,21 @@ + + + + /ECAM/warning-phase le 2 + /ECAM/warning-phase ge 9 + + /engines/engine[1]/state eq 3 + + + /ECAM/warning-phase gt 2 + /ECAM/warning-phase lt 9 + /ECAM/warning-phase ne 4 + /ECAM/warning-phase ne 5 + + /ECAM/warnings/hyd/blue-abnorm-lo-pr eq 1 /ECAM/warnings/hyd/yellow-abnorm-lo-pr eq 1 @@ -2798,16 +2828,21 @@ /engines/engine[0]/state eq 3 /engines/engine[1]/state eq 3 - fcs/flap-pos-deg ne 0 - hydraulics/spoiler-l1/final-deg gt 0 - hydraulics/spoiler-r1/final-deg gt 0 - hydraulics/spoiler-l2/final-deg gt 0 - hydraulics/spoiler-r2/final-deg gt 0 - hydraulics/spoiler-l4/final-deg gt 0 - hydraulics/spoiler-r4/final-deg gt 0 - hydraulics/spoiler-l5/final-deg gt 0 - hydraulics/spoiler-r5/final-deg gt 0 - + + /ECAM/warnings/logic/SFLAPEXT eq 1 + /systems/electrical/bus/dc-ess lt 25 + + hydraulics/spoiler-l2/final-deg gt 0.01 + hydraulics/spoiler-r2/final-deg gt 0.01 + hydraulics/spoiler-l3/final-deg gt 0.01 + hydraulics/spoiler-r3/final-deg gt 0.01 + hydraulics/spoiler-l4/final-deg gt 0.01 + hydraulics/spoiler-r4/final-deg gt 0.01 + + /systems/fctl/elac1 eq 0 + /systems/fctl/elac2 eq 0 + /systems/hydraulic/green-psi lt 1500 + @@ -2818,6 +2853,28 @@ /ECAM/timer/ground-calc eq 0 /engines/engine[0]/state eq 3 /engines/engine[1]/state eq 3 + + + /ECAM/warnings/logic/SFLAPEXT eq 1 + /systems/electrical/bus/dc-ess lt 25 + + hydraulics/spoiler-l1/final-deg gt 0.01 + hydraulics/spoiler-r1/final-deg gt 0.01 + hydraulics/spoiler-l2/final-deg gt 0.01 + hydraulics/spoiler-r2/final-deg gt 0.01 + hydraulics/spoiler-l4/final-deg gt 0.01 + hydraulics/spoiler-r4/final-deg gt 0.01 + hydraulics/spoiler-l5/final-deg gt 0.01 + hydraulics/spoiler-r5/final-deg gt 0.01 + + + /systems/fctl/elac1 eq 0 + /systems/fctl/elac2 eq 0 + /systems/hydraulic/blue-psi lt 1500 + + /ECAM/warnings/logic/BLUE-EMER-ELEC ne 1 + + From 7c75030bd328a7ed1c2173f3682dcedc0f853fa2 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 31 Jan 2021 23:05:03 +0100 Subject: [PATCH 032/124] litlle optiomizations --- Models/Instruments/MCDU/MCDU.nas | 6 +++--- .../ND/canvas/framework/navdisplay.nas | 16 ++++++++-------- Nasal/MCDU/FLIGHTLOG.nas | 9 ++++----- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 377d39a1..796aeb5b 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -404,7 +404,7 @@ var canvas_MCDU_base = { irsstatus = (systems.ADIRS.ADIRunits[a].mode == 2) ? "ATT" : "NAV"; } else { if (b) { - irsstatus = "ALIGN TTN" ~ sprintf("% 2.0d",math.round(systems.ADIRS.ADIRunits[a]._alignTime) / 60); + irsstatus = "ALIGN TTN" ~ sprintf("%2d",math.round(systems.ADIRS.ADIRunits[a]._alignTime) / 60); } else { irsstatus = "ALIGN"; } @@ -2525,11 +2525,11 @@ var canvas_MCDU_base = { me["Simple_L1S"].setText("GPS1 POSITION"); me["Simple_L2S"].setText("TTRK"); me["Simple_L3S"].setText("MERIT"); - me["Simple_L3"].setText(sprintf("%3.0d",((rand() * 50) - 25) + 50) ~ "M"); + me["Simple_L3"].setText(sprintf("%3d",((rand() * 50) - 25) + 50) ~ "M"); me["Simple_L4S"].setText("GPS2 POSITION"); me["Simple_L5S"].setText("TTRK"); me["Simple_L6S"].setText("MERIT"); - me["Simple_L6"].setText(sprintf("%3.0d",((rand() * 50) - 25) + 50) ~ "M"); + me["Simple_L6"].setText(sprintf("%3d",((rand() * 50) - 25) + 50) ~ "M"); me["Simple_C2S"].setText("UTC"); me["Simple_C3S"].setText("GPS ALT"); me["Simple_C5S"].setText("UTC"); diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 961e239b..534f4e5a 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -86,7 +86,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update .set("screen-range", 700) .set("z-index",-1); - me.lastCompassRot = 0; # last compass rotation deg + me.compassHdgTrk = 0; # last compass rotation deg me.update_sub(); # init some map properties based on switches @@ -284,27 +284,27 @@ canvas.NavDisplay.update_sub = func(){ or (me.get_switch("toggle_track_heading") and me.get_switch("toggle_display_type") == "LCD")) { userHdgTrk = userTrk; me.userHdgTrk = userTrk; - me.lastCompassRot = userTrk; + me.compassHdgTrk = userTrk; userHdgTrkTru = userTrkTru; me.symbols.hdgTrk.setText("TRK"); } else { - var dist = userHdg - me.lastCompassRot; - if (dist != 0) { + if (userHdg != me.compassHdgTrk) { + var dist = userHdg - me.compassHdgTrk; if (dist>180) dist = dist - 360; elsif (dist<-180) dist = 360 + dist; if (dist>0) { dist = dist * 0.3; if (dist>10) dist = 10; - me.lastCompassRot = (dist<0.1) ? userHdg : math.mod(me.lastCompassRot+dist,360); + me.compassHdgTrk = (dist<0.1) ? userHdg : math.mod(me.compassHdgTrk+dist,360); } elsif (dist<0) { dist = dist * 0.3; if (dist<-10) dist = -10; - me.lastCompassRot = (dist>-0.1) ? userHdg : math.mod(me.lastCompassRot+dist,360); + me.compassHdgTrk = (dist>-0.1) ? userHdg : math.mod(me.compassHdgTrk+dist,360); } } - userHdgTrk = me.lastCompassRot; - me.userHdgTrk = me.lastCompassRot; + userHdgTrk = me.compassHdgTrk; + me.userHdgTrk = me.compassHdgTrk; userHdgTrkTru = userHdgTru; me.symbols.hdgTrk.setText("HDG"); } diff --git a/Nasal/MCDU/FLIGHTLOG.nas b/Nasal/MCDU/FLIGHTLOG.nas index 77952d9b..cffe7bd4 100644 --- a/Nasal/MCDU/FLIGHTLOG.nas +++ b/Nasal/MCDU/FLIGHTLOG.nas @@ -128,7 +128,7 @@ var doorR4_pos = props.globals.getNode("/sim/model/door-positions/doorr4/positio # Detect OFF without IN var lastgs0 = 0; -var lastgear0 = 0; +#var lastgear0 = 0; var lastgsrestart = 0; # Check for A/C state change - advice me for a better method, please :/ @@ -145,7 +145,6 @@ var waitingOOOIChange = maketimer(1, func(){ # 1sec precision if (gs > 9) { # imho - it's useful few speed tollerance, 10kts min speed on taxiways - CHECKME - better with pushback detection? FlightLogDatabase.addReport(OOOIReport.new(expectedOOOIState)); expectedOOOIState = 1; - lastgear0 = 0; } } } else if (expectedOOOIState == 1) { # OFF @@ -163,7 +162,7 @@ var waitingOOOIChange = maketimer(1, func(){ # 1sec precision if (gear0 and (phase == 7 or phase == 0)) { #done or preflight FlightLogDatabase.addReport(OOOIReport.new(expectedOOOIState)); expectedOOOIState = 3; - lastgear0 = 0; + lastgs0 = 0; lastgsrestart = 0; } } else if (expectedOOOIState == 3) { # IN @@ -178,9 +177,9 @@ var waitingOOOIChange = maketimer(1, func(){ # 1sec precision } } else if (!gear0) { # OFF without IN -> TO without stop and opening doors - if (lastgear0) FlightLogDatabase.addReport(OOOIReport.new(expectedOOOIState,lastgear0)); # IN (estimated) + if (lastgs0>0) FlightLogDatabase.addReport(OOOIReport.new(expectedOOOIState,lastgs0)); # IN (estimated) FlightLogDatabase.addPage(); - if (lastgsrestart) FlightLogDatabase.addReport(OOOIReport.new(0,lastgsrestart)); # OUT (estimated) + if (lastgsrestart>0) FlightLogDatabase.addReport(OOOIReport.new(0,lastgsrestart)); # OUT (estimated) expectedOOOIState = 1; # go on to OFF state } else if (gs > 9 and lastgsrestart == 0) { # try to detect OFF without IN From 146f14bde5b624cde0ebc0f7e443c6db49a6f863 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 1 Feb 2021 18:39:25 +0000 Subject: [PATCH 033/124] add ENG1/2 FAIL warnings, THR LVR NOT SET message --- Nasal/ECAM/ECAM-controller.nas | 5 + Nasal/ECAM/ECAM-logic.nas | 234 ++++++++++++++++++++++++++++++++ Nasal/ECAM/ECAM-messages.nas | 77 ++++++++--- Systems/a320-fwc.xml | 239 +++++++++++++++++++++++++++++++++ Systems/ecam-proprules.xml | 69 ++++++++++ 5 files changed, 606 insertions(+), 18 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index 22dadf2e..9375bb14 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -89,6 +89,11 @@ var warningNodes = { rudTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-range"), dc2FuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-2-fuel-consumption-increased"), dc2FMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-2-fms-predictions-unreliable"), + thrLeversNotSet: props.globals.initNode("/ECAM/warnings/logic/eng/thr-lever-not-set"), + revSet: props.globals.initNode("/ECAM/warnings/logic/eng/reverse-set"), + eng1Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-fail"), + eng2Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-fail"), + phase5Trans: props.globals.initNode("/ECAM/warnings/logic/eng/phase-5-output"), }, Timers: { apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"), diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 32185ee9..ebba38ce 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -1160,6 +1160,240 @@ var messages_priority_3 = func { var messages_priority_2 = func { phaseVar2 = phaseNode.getValue(); + + if ((phaseVar2 == 2 or phaseVar2 == 3 or phaseVar2 == 9) and warningNodes.Logic.thrLeversNotSet.getValue() and engThrustLvrNotSet.clearFlag == 0) { + engThrustLvrNotSet.active = 1; + + if (fadec.Thrust.limFlex.getValue()) { + engThrustLvrNotSetMCT.active = 1; + ECAM_controller.warningReset(engThrustLvrNotSetMCT); + } else { + engThrustLvrNotSetTO.active = 1; + ECAM_controller.warningReset(engThrustLvrNotSetTO); + } + } else { + ECAM_controller.warningReset(engThrustLvrNotSet); + ECAM_controller.warningReset(engThrustLvrNotSetMCT); + ECAM_controller.warningReset(engThrustLvrNotSetTO); + } + + if ((phaseVar2 >= 5 and phaseVar2 <= 7) and warningNodes.Logic.revSet.getValue() and engRevSet.clearFlag == 0) { + engRevSet.active = 1; + + if (engRevSetLevers.clearFlag == 0) { + engRevSetLevers.active = 1; + } else { + ECAM_controller.warningReset(engRevSetLevers); + } + } else { + ECAM_controller.warningReset(engRevSet); + ECAM_controller.warningReset(engRevSetLevers); + } + + if (warningNodes.Logic.eng1Fail.getValue() and eng1Fail.clearFlag == 0) { + eng1Fail.active = 1; + + if (0 == 1 and thrustMalfunction1.clearFlag == 0) { # OVER THR PROTECT + thrustMalfunction1.active = 1; + } else { + ECAM_controller.warningReset(thrustMalfunction1); + } + + if (0 == 1 and shaftFailure1.clearFlag == 0) { # PW ONLY + shaftFailure1.active = 1; + } else { + ECAM_controller.warningReset(shaftFailure1); + } + + if (phaseVar2 != 2 and phaseVar2 != 9 and pts.Controls.Engines.startSw.getValue() != 2 and eng1FailModeSel.clearFlag == 0) { # and not stall and not EGT protect + eng1FailModeSel.active = 1; + } else { + ECAM_controller.warningReset(eng1FailModeSel); + } + + if (phaseVar2 != 4 and warningNodes.Logic.phase5Trans.getValue() == 1) { + if (eng1FailThrLvrIdle.clearFlag == 0 and pts.Controls.Engines.Engine.throttleLever[0].getValue() > 0.01) { + eng1FailThrLvrIdle.active = 1; + } else { + ECAM_controller.warningReset(eng1FailThrLvrIdle); + } + + if (eng1FailNoRelight.clearFlag == 0 and phaseVar2 != 2 and phaseVar2 != 9 and pts.Controls.Engines.Engine.cutoffSw[0].getValue() == 0) { + eng1FailNoRelight.active = 1; + } else { + ECAM_controller.warningReset(eng1FailNoRelight); + } + + if (eng1FailMasterOff.clearFlag == 0 and pts.Controls.Engines.Engine.cutoffSw[0].getValue() == 0) { + eng1FailMasterOff.active = 1; + } else { + ECAM_controller.warningReset(eng1FailMasterOff); + } + + if (eng1FailDamage.clearFlag == 0 and systems.fireButtons[0].getValue() == 0) { + eng1FailDamage.active = 1; + } else { + ECAM_controller.warningReset(eng1FailDamage); + } + + if (eng1FailFirePB.clearFlag == 0 and systems.fireButtons[0].getValue() == 0) { + eng1FailFirePB.active = 1; + } else { + ECAM_controller.warningReset(eng1FailFirePB); + } + + if (eng1FailAgent1DischT.clearFlag == 0 and !systems.extinguisherBottles.vector[0].lightProp.getValue()) { + eng1FailAgent1DischT.active = 1; + } else { + ECAM_controller.warningReset(eng1FailAgent1DischT); + } + + if (eng1FailAgent1Disch.clearFlag == 0 and !systems.extinguisherBottles.vector[0].lightProp.getValue()) { + eng1FailAgent1Disch.active = 1; + } else { + ECAM_controller.warningReset(eng1FailAgent1Disch); + } + + if (eng1FailNoDamage.clearFlag == 0) { + eng1FailNoDamage.active = 1; + } else { + ECAM_controller.warningReset(eng1FailNoDamage); + } + + if (eng1FailRelight.clearFlag == 0) { + eng1FailRelight.active = 1; + } else { + ECAM_controller.warningReset(eng1FailRelight); + } + } else { + ECAM_controller.warningReset(eng1FailThrLvrIdle); + ECAM_controller.warningReset(eng1FailNoRelight); + ECAM_controller.warningReset(eng1FailMasterOff); + ECAM_controller.warningReset(eng1FailDamage); + ECAM_controller.warningReset(eng1FailFirePB); + ECAM_controller.warningReset(eng1FailAgent1DischT); + ECAM_controller.warningReset(eng1FailAgent1Disch); + ECAM_controller.warningReset(eng1FailNoDamage); + ECAM_controller.warningReset(eng1FailRelight); + } + } else { + ECAM_controller.warningReset(eng1Fail); + ECAM_controller.warningReset(thrustMalfunction1); + ECAM_controller.warningReset(shaftFailure1); + ECAM_controller.warningReset(eng1FailModeSel); + ECAM_controller.warningReset(eng1FailThrLvrIdle); + ECAM_controller.warningReset(eng1FailNoRelight); + ECAM_controller.warningReset(eng1FailMasterOff); + ECAM_controller.warningReset(eng1FailDamage); + ECAM_controller.warningReset(eng1FailFirePB); + ECAM_controller.warningReset(eng1FailAgent1DischT); + ECAM_controller.warningReset(eng1FailAgent1Disch); + ECAM_controller.warningReset(eng1FailNoDamage); + ECAM_controller.warningReset(eng1FailRelight); + } + + if (warningNodes.Logic.eng2Fail.getValue() and eng2Fail.clearFlag == 0) { + eng2Fail.active = 1; + + if (0 == 1 and thrustMalfunction2.clearFlag == 0) { # OVER THR PROTECT + thrustMalfunction2.active = 1; + } else { + ECAM_controller.warningReset(thrustMalfunction2); + } + + if (0 == 1 and shaftFailure2.clearFlag == 0) { # PW ONLY + shaftFailure2.active = 1; + } else { + ECAM_controller.warningReset(shaftFailure2); + } + + if (phaseVar2 != 2 and phaseVar2 != 9 and pts.Controls.Engines.startSw.getValue() != 2 and eng2FailModeSel.clearFlag == 0) { # and not stall and not EGT protect + eng2FailModeSel.active = 1; + } else { + ECAM_controller.warningReset(eng2FailModeSel); + } + + if (phaseVar2 != 4 and warningNodes.Logic.phase5Trans.getValue() == 1) { + if (eng2FailThrLvrIdle.clearFlag == 0 and pts.Controls.Engines.Engine.throttleLever[1].getValue() > 0.01) { + eng2FailThrLvrIdle.active = 1; + } else { + ECAM_controller.warningReset(eng2FailThrLvrIdle); + } + + if (eng2FailNoRelight.clearFlag == 0 and phaseVar2 != 2 and phaseVar2 != 9 and pts.Controls.Engines.Engine.cutoffSw[1].getValue() == 0) { + eng2FailNoRelight.active = 1; + } else { + ECAM_controller.warningReset(eng2FailNoRelight); + } + + if (eng2FailMasterOff.clearFlag == 0 and pts.Controls.Engines.Engine.cutoffSw[1].getValue() == 0) { + eng2FailMasterOff.active = 1; + } else { + ECAM_controller.warningReset(eng2FailMasterOff); + } + + if (eng2FailDamage.clearFlag == 0 and systems.fireButtons[1].getValue() == 0) { + eng2FailDamage.active = 1; + } else { + ECAM_controller.warningReset(eng2FailDamage); + } + + if (eng2FailFirePB.clearFlag == 0 and systems.fireButtons[1].getValue() == 0) { + eng2FailFirePB.active = 1; + } else { + ECAM_controller.warningReset(eng2FailFirePB); + } + + if (eng2FailAgent1DischT.clearFlag == 0 and !systems.extinguisherBottles.vector[2].lightProp.getValue()) { + eng2FailAgent1DischT.active = 1; + } else { + ECAM_controller.warningReset(eng2FailAgent1DischT); + } + + if (eng2FailAgent1Disch.clearFlag == 0 and !systems.extinguisherBottles.vector[2].lightProp.getValue()) { + eng2FailAgent1Disch.active = 1; + } else { + ECAM_controller.warningReset(eng2FailAgent1Disch); + } + + if (eng2FailNoDamage.clearFlag == 0) { + eng2FailNoDamage.active = 1; + } else { + ECAM_controller.warningReset(eng2FailNoDamage); + } + + if (eng2FailRelight.clearFlag == 0) { + eng2FailRelight.active = 1; + } else { + ECAM_controller.warningReset(eng2FailRelight); + } + } else { + ECAM_controller.warningReset(eng2FailThrLvrIdle); + ECAM_controller.warningReset(eng2FailNoRelight); + ECAM_controller.warningReset(eng2FailMasterOff); + ECAM_controller.warningReset(eng2FailDamage); + ECAM_controller.warningReset(eng2FailFirePB); + ECAM_controller.warningReset(eng2FailAgent1DischT); + ECAM_controller.warningReset(eng2FailAgent1Disch); + ECAM_controller.warningReset(eng2FailNoDamage); + ECAM_controller.warningReset(eng2FailRelight); + } + } else { + ECAM_controller.warningReset(eng2Fail); + ECAM_controller.warningReset(thrustMalfunction2); + ECAM_controller.warningReset(shaftFailure2); + ECAM_controller.warningReset(eng2FailModeSel); + ECAM_controller.warningReset(eng2FailThrLvrIdle); + ECAM_controller.warningReset(eng2FailNoRelight); + ECAM_controller.warningReset(eng2FailMasterOff); + ECAM_controller.warningReset(eng2FailDamage); + ECAM_controller.warningReset(eng2FailFirePB); + ECAM_controller.warningReset(eng2FailAgent1DischT); + ECAM_controller.warningReset(eng2FailAgent1Disch); + ECAM_controller.warningReset(eng2FailNoDamage); + ECAM_controller.warningReset(eng2FailRelight); + } + # DC EMER CONFIG if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dcEss.getValue() < 25 and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcEmerconfig.clearFlag == 0) { dcEmerconfig.active = 1; diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index f87ba9f4..41df8920 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -10,6 +10,7 @@ # Left E/WD var warnings = std.Vector.new([ + # LEVEL 3 WARN var stall = warning.new(msg: "", aural: 2), var flap_not_zero = warning.new(msg: "F/CTL FLAP LVR NOT ZERO", colour: "r", aural: 0, light: 0, isMainMsg: 1), @@ -47,12 +48,12 @@ var warnings = std.Vector.new([ var eng1FireFlAgent1Timer = warning.new(msg: " -AGENT 1 AFT 10 S.DISCH", colour: "w"), var eng1FireFlAgent1 = warning.new(msg: " -AGENT 1..........DISCH", colour: "c"), var eng1FireFlATC = warning.new(msg: " -ATC.............NOTIFY", colour: "c"), - var eng1FireFl30Sec = warning.new(msg: " •IF FIRE AFTER 30 S:", colour: "w", isMainMsg: 1), + var eng1FireFl30Sec = warning.new(msg: " •IF FIRE AFTER 30 S:", colour: "w"), var eng1FireFlAgent2 = warning.new(msg: " -AGENT 2..........DISCH", colour: "c"), # ENG 1 FIRE (ground) var eng1FireGnlever = warning.new(msg: " -THR LEVERS........IDLE", colour: "c"), - var eng1FireGnstopped = warning.new(msg: " •WHEN A/C IS STOPPED:", colour: "w", isMainMsg: 1), + var eng1FireGnstopped = warning.new(msg: " •WHEN A/C IS STOPPED:", colour: "w"), var eng1FireGnparkbrk = warning.new(msg: " -PARKING BRK.........ON", colour: "c"), var eng1FireGnATC = warning.new(msg: " -ATC.............NOTIFY", colour: "c"), var eng1FireGncrew = warning.new(msg: " -CABIN CREW.......ALERT", colour: "c"), @@ -70,12 +71,12 @@ var warnings = std.Vector.new([ var eng2FireFlAgent1Timer = warning.new(msg: " -AGENT 1 AFT 10 S.DISCH", colour: "w"), var eng2FireFlAgent1 = warning.new(msg: " -AGENT 1..........DISCH", colour: "c"), var eng2FireFlATC = warning.new(msg: " -ATC.............NOTIFY", colour: "c"), - var eng2FireFl30Sec = warning.new(msg: " •IF FIRE AFTER 30 S:", colour: "w", isMainMsg: 1), + var eng2FireFl30Sec = warning.new(msg: " •IF FIRE AFTER 30 S:", colour: "w"), var eng2FireFlAgent2 = warning.new(msg: " -AGENT 2..........DISCH", colour: "c"), # ENG 2 FIRE (ground) var eng2FireGnlever = warning.new(msg: " -THR LEVERS........IDLE", colour: "c"), - var eng2FireGnstopped = warning.new(msg: " •WHEN A/C IS STOPPED:", colour: "w", isMainMsg: 1), + var eng2FireGnstopped = warning.new(msg: " •WHEN A/C IS STOPPED:", colour: "w"), var eng2FireGnparkbrk = warning.new(msg: " -PARKING BRK.........ON", colour: "c"), var eng2FireGnATC = warning.new(msg: " -ATC.............NOTIFY", colour: "c"), var eng2FireGncrew = warning.new(msg: " -CABIN CREW.......ALERT", colour: "c"), @@ -94,7 +95,7 @@ var warnings = std.Vector.new([ var ADR123FaultBUSSF = warning.new(msg: " -FO BKUP SPD/ALT.....ON", colour: "c"), var ADR123FaultADRPB = warning.new(msg: " -ADR 1+2+3 P/B......OFF", colour: "c"), var ADR123FaultSPD = warning.new(msg: " -SPD......FLY THE GREEN", colour: "c"), - var ADR123FaultAOADISAG = warning.new(msg: " •IF AOA DISAGREE: ", colour: "w", isMainMsg: 1), + var ADR123FaultAOADISAG = warning.new(msg: " •IF AOA DISAGREE: ", colour: "w"), var ADR123FaultBUSSINOP = warning.new(msg: " BKUP SPD/ALT.DO NOT USE", colour: "c"), var ADR123FaultSTBY = warning.new(msg: " -STBY INST.MAY BE UNREL", colour: "c"), var ADR123FaultPROC = warning.new(msg: " -ALL ADR OFF PROC.APPLY", colour: "c"), @@ -123,7 +124,7 @@ var warnings = std.Vector.new([ var excessCabAlt = warning.new(msg: "CAB PR EXCESS CAB ALT", colour: "r", aural: 0, light: 0, isMainMsg: 1), var excessCabAltMask = warning.new(msg: " -CREW OXY MASKS.....USE", colour: "c"), var excessCabAltSigns = warning.new(msg: " -SIGNS...............ON", colour: "c"), - var excessCabAltEmerD = warning.new(msg: " •EMER DESCENT:", colour: "w", isMainMsg: 1), + var excessCabAltEmerD = warning.new(msg: " •EMER DESCENT:", colour: "w"), var excessCabAltDES = warning.new(msg: " -DESCENT.......INITIATE", colour: "c"), var excessCabAltTHRLVR = warning.new(msg: " -THR LEVERS........IDLE", colour: "c"), var excessCabAltSPDBRK = warning.new(msg: " -SPD BRK...........FULL", colour: "c"), @@ -133,20 +134,20 @@ var warnings = std.Vector.new([ var excessCabAltPA = warning.new(msg: " -EMER DES (PA).ANNOUNCE", colour: "c"), var excessCabAltXPDR = warning.new(msg: " -XPDR 7700.....CONSIDER", colour: "c"), var excessCabAltMEA = warning.new(msg: " MAX FL.....100/MEA-MORA", colour: "c"), - var excessCabAltCabAlt = warning.new(msg: " •IF CAB ALT>14000 FT:", colour: "w", isMainMsg: 1), + var excessCabAltCabAlt = warning.new(msg: " •IF CAB ALT>14000 FT:", colour: "w"), var excessCabAltMasks = warning.new(msg: " -PAX OXY MASKS...MAN ON", colour: "c"), # ENG 1 OIL LO PR var eng1OilLoPr = warning.new(msg: "ENG 1 OIL LO PR ", colour: "r", aural: 0, light: 0, isMainMsg: 1), - var eng1OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w", isMainMsg: 1), - var eng1OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w", isMainMsg: 1), + var eng1OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w"), + var eng1OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w"), var eng1OilLoPrThrot = warning.new(msg: " -THR LEVER 1.......IDLE", colour: "c"), var eng1OilLoPrMaster = warning.new(msg: " -ENG MASTER 1.......OFF", colour: "c"), # ENG 2 OIL LO PR var eng2OilLoPr = warning.new(msg: "ENG 2 OIL LO PR ", colour: "r", aural: 0, light: 0, isMainMsg: 1), - var eng2OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w", isMainMsg: 1), - var eng2OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w", isMainMsg: 1), + var eng2OilLoPrIf = warning.new(msg: " •IF OIL PR < 13 PSI :", colour: "w"), + var eng2OilLoPrIf2 = warning.new(msg: " •IF OIL PR < 60 PSI :", colour: "w"), var eng2OilLoPrThrot = warning.new(msg: " -THR LEVER 2.......IDLE", colour: "c"), var eng2OilLoPrMaster = warning.new(msg: " -ENG MASTER 2.......OFF", colour: "c"), @@ -161,7 +162,7 @@ var warnings = std.Vector.new([ var gearNotDownLocked = warning.new(msg: "L/G GEAR NOT DOWNLOCKED", colour: "r", aural: 0, light: 0, isMainMsg: 1), var gearNotDownLockedRec = warning.new(msg: " -L/G LEVER......RECYCLE", colour: "c"), - var gearNotDownLockedWork = warning.new(msg: " •IF UNSUCCESSFUL:", colour: "w", isMainMsg: 1), + var gearNotDownLockedWork = warning.new(msg: " •IF UNSUCCESSFUL:", colour: "w"), var gearNotDownLocked120 = warning.new(msg: " AFTER 120S:", colour: "w"), var gearNotDownLockedGrav = warning.new(msg: " -L/G.........GRVTY EXTN", colour: "c"), @@ -171,17 +172,17 @@ var warnings = std.Vector.new([ # Cargo smoke var cargoSmokeFwd = warning.new(msg: "SMOKE FWD CARGO SMOKE", colour: "r", aural: 0, light: 0, isMainMsg: 1), var cargoSmokeFwdFans = warning.new(msg: " -CAB FANS...........OFF", colour: "c"), - var cargoSmokeFwdGrdClsd = warning.new(msg: " •IF FWD CRG CLSD:", colour: "w", isMainMsg: 1), + var cargoSmokeFwdGrdClsd = warning.new(msg: " •IF FWD CRG CLSD:", colour: "w"), var cargoSmokeFwdAgent = warning.new(msg: " -AGENT............DISCH", colour: "c"), - var cargoSmokeFwdGrd = warning.new(msg: " •WHEN ON GROUND", colour: "w", isMainMsg: 1), - var cargoSmokeFwdDoors = warning.new(msg: " BEFORE OPEN CRG DOORS:", colour: "w", isMainMsg: 1), + var cargoSmokeFwdGrd = warning.new(msg: " •WHEN ON GROUND", colour: "w"), + var cargoSmokeFwdDoors = warning.new(msg: " BEFORE OPEN CRG DOORS:", colour: "w"), var cargoSmokeFwdDisemb = warning.new(msg: "-PAX..........DISEMBARK", colour: "c"), var cargoSmokeAft = warning.new(msg: "SMOKE AFT CARGO SMOKE", colour: "r", aural: 0, light: 0, isMainMsg: 1), var cargoSmokeAftFans = warning.new(msg: " -CAB FANS...........OFF", colour: "c"), - var cargoSmokeAftGrdClsd = warning.new(msg: " •IF AFT CRG CLSD:", colour: "w", isMainMsg: 1), + var cargoSmokeAftGrdClsd = warning.new(msg: " •IF AFT CRG CLSD:", colour: "w"), var cargoSmokeAftAgent = warning.new(msg: " -AGENT............DISCH", colour: "c"), - var cargoSmokeAftGrd = warning.new(msg: " •WHEN ON GROUND", colour: "w", isMainMsg: 1), - var cargoSmokeAftDoors = warning.new(msg: " BEFORE OPEN CRG DOORS:", colour: "w", isMainMsg: 1), + var cargoSmokeAftGrd = warning.new(msg: " •WHEN ON GROUND", colour: "w"), + var cargoSmokeAftDoors = warning.new(msg: " BEFORE OPEN CRG DOORS:", colour: "w"), var cargoSmokeAftDisemb = warning.new(msg: "-PAX..........DISEMBARK", colour: "c"), # Lavatory SMOKE @@ -256,6 +257,46 @@ var warnings = std.Vector.new([ var airBleedLeak = warning.new(msg: "AIR BLEED LEAK ", colour: "r", aural: 0, light: 0, isMainMsg: 1), var airBleedLeakShut = warning.new(msg: " -X BLEED..........SHUT", colour: "c"), + # LEVEL 2 WARN + # THR LEVERS NOT SET + var engThrustLvrNotSet = warning.new(msg: "ENG THR LEVERS NOT SET ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var engThrustLvrNotSetMCT = warning.new(msg: " -THR LEVERS ....MCT/FLX", colour: "c"), + var engThrustLvrNotSetTO = warning.new(msg: " -THR LEVERS.......TO/GA", colour: "c"), + + # REV SET + var engRevSet = warning.new(msg: "ENG REV SET ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var engRevSetLevers = warning.new(msg: " -THR LEVER......FWD THR", colour: "c"), + + # ENG 1 FAIL + var eng1Fail = warning.new(msg: "ENG 1 FAIL ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var thrustMalfunction1 = warning.new(msg: " THRUST MALFUNCTION ", colour: "a"), + var shaftFailure1 = warning.new(msg: " SHAFT FAILURE ", colour: "a"), + var eng1FailModeSel = warning.new(msg: " -ENG MODE SEL.......IGN", colour: "c"), + var eng1FailThrLvrIdle = warning.new(msg: " -THR LEVER 1.......IDLE", colour: "c"), + var eng1FailNoRelight = warning.new(msg: "•IF NO RELIGHT AFTER 30S", colour: "w"), + var eng1FailMasterOff = warning.new(msg: " -ENG MASTER 1.......OFF", colour: "c"), + var eng1FailDamage = warning.new(msg: " IF DAMAGE : ", colour: "w"), + var eng1FailFirePB = warning.new(msg: " -ENG 1 FIRE P/B....PUSH", colour: "c"), + var eng1FailAgent1DischT = warning.new(msg: " -AGENT1 AFTER 10S.DISCH", colour: "c"), + var eng1FailAgent1Disch = warning.new(msg: " -AGENT 1..........DISCH", colour: "c"), + var eng1FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), + var eng1FailRelight = warning.new(msg: " -ENG 1 RELIGHT.CONSIDER", colour: "c"), + + # ENG 2 FAIL + var eng2Fail = warning.new(msg: "ENG 2 FAIL ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var thrustMalfunction2 = warning.new(msg: " THRUST MALFUNCTION ", colour: "a"), + var shaftFailure2 = warning.new(msg: " SHAFT FAILURE ", colour: "a"), + var eng2FailModeSel = warning.new(msg: " -ENG MODE SEL.......IGN", colour: "c"), + var eng2FailThrLvrIdle = warning.new(msg: " -THR LEVER 2.......IDLE", colour: "c"), + var eng2FailNoRelight = warning.new(msg: "•IF NO RELIGHT AFTER 30S", colour: "w"), + var eng2FailMasterOff = warning.new(msg: " -ENG MASTER 2.......OFF", colour: "c"), + var eng2FailDamage = warning.new(msg: " IF DAMAGE : ", colour: "w"), + var eng2FailFirePB = warning.new(msg: " -ENG 2 FIRE P/B....PUSH", colour: "c"), + var eng2FailAgent1DischT = warning.new(msg: " -AGENT2 AFTER 10S.DISCH", colour: "c"), + var eng2FailAgent1Disch = warning.new(msg: " -AGENT 2..........DISCH", colour: "c"), + var eng2FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), + var eng2FailRelight = warning.new(msg: " -ENG 2 RELIGHT.CONSIDER", colour: "c"), + # DC EMER CONFIG var dcEmerconfig = warning.new(msg: "ELEC DC EMER CONFIG", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcEmerconfigManOn = warning.new(msg: " -EMER ELEC PWR...MAN ON", colour: "c"), diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index 655814bc..0f633b54 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -2183,6 +2183,245 @@ + + + + /ECAM/warnings/logic/eng/eng-1-thr-lvr-abv-idle eq 1 + /ECAM/warnings/logic/eng/eng-2-thr-lvr-abv-idle eq 1 + + + + + + + /engines/engine[0]/n2-actual ge 59.4 + /controls/engines/engine[0]/throttle-pos ge 0.60 + /controls/engines/engine[0]/throttle-pos lt 0.78 + + + + + /ECAM/warnings/logic/eng/thr-lever-1-mcl-mct + 120 + 0.25 + + + + + + /engines/engine[0]/n2-actual ge 59.4 + /controls/engines/engine[0]/throttle-pos ge 0.60 + /controls/engines/engine[0]/throttle-pos lt 0.83 + + + + + /ECAM/warnings/logic/eng/thr-lever-1-mct + 120 + 0.25 + + + + + + /engines/engine[1]/n2-actual ge 59.4 + /controls/engines/engine[1]/throttle-pos ge 0.60 + /controls/engines/engine[1]/throttle-pos lt 0.78 + + + + + /ECAM/warnings/logic/eng/thr-lever-2-mcl-mct + 120 + 0.25 + + + + + + /engines/engine[1]/n2-actual ge 59.4 + /controls/engines/engine[1]/throttle-pos ge 0.60 + /controls/engines/engine[1]/throttle-pos lt 0.83 + + + + + /ECAM/warnings/logic/eng/thr-lever-2-mct + 120 + 0.25 + + + + + + /ECAM/warnings/logic/eng/new-retard-logic ne 1 + + + /systems/thrust/lim-flex eq 0 + + /ECAM/warnings/logic/eng/thr-lever-2-mct-output eq 1 + /ECAM/warnings/logic/eng/thr-lever-2-mcl-mct-output eq 1 + + + + /systems/thrust/lim-flex eq 1 + /ECAM/warnings/logic/eng/thr-lever-2-mcl-mct-output eq 1 + + + /systems/thrust/lim-flex eq 0 + + /ECAM/warnings/logic/eng/thr-lever-1-mct-output eq 1 + /ECAM/warnings/logic/eng/thr-lever-1-mcl-mct-output eq 1 + + + + /systems/thrust/lim-flex eq 1 + /ECAM/warnings/logic/eng/thr-lever-1-mcl-mct-output eq 1 + + + + + + + + + /ECAM/timer/ground-calc eq 0 + + /gear/gear[1]/rollspeed-ms lt 36 + /ECAM/warning-phase ne 7 + + + /controls/engines/engine[0]/throttle-rev gt 0.0 + /controls/engines/engine[1]/throttle-rev gt 0.0 + + + + + + + + /engines/engine[0]/n2-actual ge 59.4 + + + + + /ECAM/warnings/logic/eng/eng-1-fail-cond-set-input + 120 + 0.3333 + + + + + + /controls/engines/engine[0]/cutoff-switch eq 1 + /controls/engines/engine[0]/fire-btn eq 1 + + + + + + + /engines/engine[1]/n2-actual ge 59.4 + + + + + /ECAM/warnings/logic/eng/eng-2-fail-cond-set-input + 120 + 0.3333 + + + + + + /controls/engines/engine[1]/cutoff-switch eq 1 + /controls/engines/engine[1]/fire-btn eq 1 + + + + + + + /controls/engines/engine[0]/cutoff-switch eq 0 + /controls/engines/engine[0]/fire-btn eq 0 + /engines/engine[0]/n2-actual lt 59.4 + /ECAM/warnings/logic/eng/eng-1-fail-cond eq 1 + + + + + + + /controls/engines/engine[1]/cutoff-switch eq 0 + /controls/engines/engine[1]/fire-btn eq 0 + /engines/engine[1]/n2-actual lt 59.4 + /ECAM/warnings/logic/eng/eng-2-fail-cond eq 1 + + + + + + + /engines/engine[0]/n2-actual ge 59.4 + /ECAM/dual-failure-enabled eq 1 + + + + + + + /engines/engine[1]/n2-actual ge 59.4 + /ECAM/dual-failure-enabled eq 1 + + + + + /controls/engines/engine[0]/cutoff-switch + 120 + 0.01666666666 + + + + /controls/engines/engine[1]/cutoff-switch + 120 + 0.01666666666 + + + + + + + /ECAM/warnings/logic/stall/phase-4-output eq 0 + /ECAM/warnings/logic/stall/phase-4 eq 0 + /ECAM/warning-phase eq 5 + + + + + + + + + /ECAM/warnings/logic/eng/phase-5-output eq 1 + /ECAM/warnings/logic/eng/phase-5-output-2 eq 1 + /ECAM/warnings/logic/eng/eng-1-master-60-sec eq 0 + + /ECAM/warnings/logic/eng/eng-1-fail-output eq 1 + + + + + + + + /ECAM/warnings/logic/eng/phase-5-output eq 1 + /ECAM/warnings/logic/eng/phase-5-output-2 eq 1 + /ECAM/warnings/logic/eng/eng-2-master-60-sec eq 0 + + /ECAM/warnings/logic/eng/eng-2-fail-output eq 1 + + + diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml index d5a55c1a..0cc0f736 100644 --- a/Systems/ecam-proprules.xml +++ b/Systems/ecam-proprules.xml @@ -1081,4 +1081,73 @@ /ECAM/warnings/fctl/park-brk-config-output + + + RS + + /ECAM/warnings/logic/eng/eng-1-fail-cond-set + + + /ECAM/warnings/logic/eng/eng-1-fail-cond-reset + + /ECAM/warnings/logic/eng/eng-1-fail-cond + + + + RS + + /ECAM/warnings/logic/eng/eng-2-fail-cond-set + + + /ECAM/warnings/logic/eng/eng-2-fail-cond-reset + + /ECAM/warnings/logic/eng/eng-2-fail-cond + + + + RS + + /ECAM/warnings/logic/eng/eng-1-fail-set + + + /ECAM/warnings/logic/eng/eng-1-fail-reset + + /ECAM/warnings/logic/eng/eng-1-fail-output + + + + RS + + /ECAM/warnings/logic/eng/eng-2-fail-set + + + /ECAM/warnings/logic/eng/eng-2-fail-reset + + /ECAM/warnings/logic/eng/eng-2-fail-output + + + + monostable + true + + + /ECAM/warnings/logic/eng/phase-5 + + /ECAM/warnings/logic/eng/phase-5-output + + + + + monostable + true + + + /ECAM/warnings/logic/eng/phase-5-output + + /ECAM/warnings/logic/eng/phase-5-output-2 + From b4a2a16656cc84cb80341a431b3b9651631723cb Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 2 Feb 2021 13:31:20 +0000 Subject: [PATCH 034/124] ENG 1(2) SHUTDOWN --- Nasal/ECAM/ECAM-controller.nas | 2 + Nasal/ECAM/ECAM-logic.nas | 226 ++++++++++++++++++++++++++++++++- Nasal/ECAM/ECAM-messages.nas | 29 +++++ Nasal/Panels/atc.nas | 12 +- Nasal/Systems/pneumatics.nas | 2 + Systems/a320-fwc.xml | 50 ++++++++ 6 files changed, 310 insertions(+), 11 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index 9375bb14..d5d82df3 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -94,6 +94,8 @@ var warningNodes = { eng1Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-fail"), eng2Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-fail"), phase5Trans: props.globals.initNode("/ECAM/warnings/logic/eng/phase-5-output"), + eng1Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-shutdown"), + eng2Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-shutdown"), }, Timers: { apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"), diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index ebba38ce..916d229d 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -1292,6 +1292,111 @@ var messages_priority_2 = func { ECAM_controller.warningReset(eng1FailRelight); } + if (warningNodes.Logic.eng1Shutdown.getValue() and eng1ShutDown.clearFlag == 0) { + eng1ShutDown.active = 1; + + if (phaseVar2 != 4 and phaseVar2 != 5 and systems.fireButtons[0].getValue() == 0 and (systems.PNEU.Valves.wingLeft.getValue() or systems.PNEU.Valves.wingRight.getValue())) { + if (eng1ShutDownPack.clearFlag == 0 and systems.PNEU.Switch.pack1.getValue() and systems.PNEU.Switch.pack2.getValue()) { + eng1ShutDownPack.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownPack); + } + + if (eng1ShutDownXBleed.clearFlag == 0 and systems.PNEU.Valves.crossbleed.getValue() == 0) { + eng1ShutDownXBleed.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownXBleed); + } + } else { + ECAM_controller.warningReset(eng1ShutDownPack); + ECAM_controller.warningReset(eng1ShutDownXBleed); + } + + if (FWC.Timer.gnd.getValue() == 0 or systems.fireButtons[0].getValue() == 0) { + if (eng1ShutDownModeSel.clearFlag == 0 and pts.Controls.Engines.startSw.getValue() != 2) { + eng1ShutDownModeSel.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownModeSel); + } + + if (systems.FUEL.Switches.crossfeed.getValue() == 0) { + if (eng1ShutDownFuelLeak.clearFlag == 0) { + eng1ShutDownFuelLeak.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownFuelLeak); + } + + if (eng1ShutDownImbalance.clearFlag == 0) { + eng1ShutDownImbalance.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownImbalance); + } + } else { + ECAM_controller.warningReset(eng1ShutDownFuelLeak); + ECAM_controller.warningReset(eng1ShutDownImbalance); + } + } else { + ECAM_controller.warningReset(eng1ShutDownModeSel); + ECAM_controller.warningReset(eng1ShutDownFuelLeak); + ECAM_controller.warningReset(eng1ShutDownImbalance); + } + + if (eng1ShutDownTCAS.clearFlag == 0 and pts.Instrumentation.TCAS.Inputs.mode.getValue() != 2) { + eng1ShutDownTCAS.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownTCAS); + } + + if (0 == 1 and eng1ShutDownBuffet.clearFlag == 0) { # reverser unlocked + eng1ShutDownBuffet.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownBuffet); + } + + if (0 == 1 and eng1ShutDownSpeed.clearFlag == 0) { + eng1ShutDownSpeed.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownSpeed); + } + + if (systems.fireButtons[0].getValue() == 1) { + if (eng1ShutDownXBleedS.clearFlag == 0 and systems.PNEU.Valves.crossbleed.getValue() != 0) { + eng1ShutDownXBleedS.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownXBleedS); + } + + if (eng1ShutDownWingAI.clearFlag == 0 and (systems.PNEU.Valves.wingLeft.getValue() or systems.PNEU.Valves.wingRight.getValue())) { + eng1ShutDownWingAI.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownWingAI); + } + + if (eng1ShutDownIcing.clearFlag == 0) { + eng1ShutDownIcing.active = 1; + } else { + ECAM_controller.warningReset(eng1ShutDownIcing); + } + } else { + ECAM_controller.warningReset(eng1ShutDownXBleedS); + ECAM_controller.warningReset(eng1ShutDownWingAI); + ECAM_controller.warningReset(eng1ShutDownIcing); + } + } else { + ECAM_controller.warningReset(eng1ShutDown); + ECAM_controller.warningReset(eng1ShutDownPack); + ECAM_controller.warningReset(eng1ShutDownXBleed); + ECAM_controller.warningReset(eng1ShutDownModeSel); + ECAM_controller.warningReset(eng1ShutDownImbalance); + ECAM_controller.warningReset(eng1ShutDownTCAS); + ECAM_controller.warningReset(eng1ShutDownFuelLeak); + ECAM_controller.warningReset(eng1ShutDownBuffet); + ECAM_controller.warningReset(eng1ShutDownSpeed); + ECAM_controller.warningReset(eng1ShutDownXBleedS); + ECAM_controller.warningReset(eng1ShutDownWingAI); + ECAM_controller.warningReset(eng1ShutDownIcing); + } + if (warningNodes.Logic.eng2Fail.getValue() and eng2Fail.clearFlag == 0) { eng2Fail.active = 1; @@ -1394,6 +1499,117 @@ var messages_priority_2 = func { ECAM_controller.warningReset(eng2FailRelight); } + if (warningNodes.Logic.eng2Shutdown.getValue() and eng2ShutDown.clearFlag == 0) { + eng2ShutDown.active = 1; + + if (phaseVar2 != 4 and phaseVar2 != 5 and systems.fireButtons[1].getValue() == 0 and (systems.PNEU.Valves.wingLeft.getValue() or systems.PNEU.Valves.wingRight.getValue())) { + if (eng2ShutDownPack1.clearFlag == 0 and systems.ELEC.EmerElec.getValue() and systems.PNEU.Switch.pack1.getValue() and systems.PNEU.Switch.pack2.getValue()) { + eng2ShutDownPack1.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownPack1); + } + + if (eng2ShutDownPack.clearFlag == 0 and !systems.ELEC.EmerElec.getValue() and systems.PNEU.Switch.pack1.getValue() and systems.PNEU.Switch.pack2.getValue()) { + eng2ShutDownPack.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownPack); + } + + if (eng2ShutDownXBleed.clearFlag == 0 and systems.PNEU.Valves.crossbleed.getValue() == 0) { + eng2ShutDownXBleed.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownXBleed); + } + } else { + ECAM_controller.warningReset(eng2ShutDownPack); + ECAM_controller.warningReset(eng2ShutDownXBleed); + } + + if (FWC.Timer.gnd.getValue() == 0 or systems.fireButtons[1].getValue() == 0) { + if (eng2ShutDownModeSel.clearFlag == 0 and pts.Controls.Engines.startSw.getValue() != 2) { + eng2ShutDownModeSel.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownModeSel); + } + + if (systems.FUEL.Switches.crossfeed.getValue() == 0) { + if (eng2ShutDownFuelLeak.clearFlag == 0) { + eng2ShutDownFuelLeak.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownFuelLeak); + } + + if (eng2ShutDownImbalance.clearFlag == 0) { + eng2ShutDownImbalance.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownImbalance); + } + } else { + ECAM_controller.warningReset(eng2ShutDownFuelLeak); + ECAM_controller.warningReset(eng2ShutDownImbalance); + } + } else { + ECAM_controller.warningReset(eng2ShutDownModeSel); + ECAM_controller.warningReset(eng2ShutDownFuelLeak); + ECAM_controller.warningReset(eng2ShutDownImbalance); + } + + if (eng2ShutDownTCAS.clearFlag == 0 and pts.Instrumentation.TCAS.Inputs.mode.getValue() != 2) { + eng2ShutDownTCAS.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownTCAS); + } + + if (0 == 1 and eng2ShutDownBuffet.clearFlag == 0) { # reverser unlocked + eng2ShutDownBuffet.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownBuffet); + } + + if (0 == 1 and eng2ShutDownSpeed.clearFlag == 0) { + eng2ShutDownSpeed.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownSpeed); + } + + if (systems.fireButtons[1].getValue() == 1) { + if (eng2ShutDownXBleedS.clearFlag == 0 and systems.PNEU.Valves.crossbleed.getValue() != 0) { + eng2ShutDownXBleedS.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownXBleedS); + } + + if (eng2ShutDownWingAI.clearFlag == 0 and (systems.PNEU.Valves.wingLeft.getValue() or systems.PNEU.Valves.wingRight.getValue())) { + eng2ShutDownWingAI.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownWingAI); + } + + if (eng2ShutDownIcing.clearFlag == 0) { + eng2ShutDownIcing.active = 1; + } else { + ECAM_controller.warningReset(eng2ShutDownIcing); + } + } else { + ECAM_controller.warningReset(eng2ShutDownXBleedS); + ECAM_controller.warningReset(eng2ShutDownWingAI); + ECAM_controller.warningReset(eng2ShutDownIcing); + } + } else { + ECAM_controller.warningReset(eng2ShutDown); + ECAM_controller.warningReset(eng2ShutDownPack); + ECAM_controller.warningReset(eng2ShutDownXBleed); + ECAM_controller.warningReset(eng2ShutDownModeSel); + ECAM_controller.warningReset(eng2ShutDownImbalance); + ECAM_controller.warningReset(eng2ShutDownTCAS); + ECAM_controller.warningReset(eng2ShutDownFuelLeak); + ECAM_controller.warningReset(eng2ShutDownBuffet); + ECAM_controller.warningReset(eng2ShutDownSpeed); + ECAM_controller.warningReset(eng2ShutDownXBleedS); + ECAM_controller.warningReset(eng2ShutDownWingAI); + ECAM_controller.warningReset(eng2ShutDownIcing); + } + # DC EMER CONFIG if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dcEss.getValue() < 25 and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcEmerconfig.clearFlag == 0) { dcEmerconfig.active = 1; @@ -1875,7 +2091,7 @@ var messages_priority_2 = func { warningNodes.Timers.bleed1Fault.setValue(0); } - if (bleed1Fault.clearFlag == 0 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 9) and warningNodes.Timers.bleed1FaultOutput.getValue() == 1 and (!systems.PNEU.Switch.pack1.getBoolValue() or !systems.PNEU.Switch.pack2.getBoolValue() or !(getprop("/ECAM/phases/wing-anti-ice-pulse") and getprop("/controls/ice-protection/wing")))) { # inverse pulse + if (bleed1Fault.clearFlag == 0 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 9) and warningNodes.Timers.bleed1FaultOutput.getValue() == 1 and (!systems.PNEU.Switch.pack1.getBoolValue() or !systems.PNEU.Switch.pack2.getBoolValue() or !(getprop("/ECAM/phases/wing-anti-ice-pulse") and wing_pb.getValue()))) { # inverse pulse bleed1Fault.active = 1; } else { ECAM_controller.warningReset(bleed1Fault); @@ -1912,7 +2128,7 @@ var messages_priority_2 = func { warningNodes.Timers.bleed2Fault.setValue(0); } - if (bleed2Fault.clearFlag == 0 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 9) and warningNodes.Timers.bleed2FaultOutput.getValue() == 1 and (!systems.PNEU.Switch.pack1.getBoolValue() or !systems.PNEU.Switch.pack2.getBoolValue() or !(getprop("/ECAM/phases/wing-anti-ice-pulse") and getprop("/controls/ice-protection/wing")))) { # inverse pulse + if (bleed2Fault.clearFlag == 0 and (phaseVar2 == 2 or phaseVar2 == 6 or phaseVar2 == 9) and warningNodes.Timers.bleed2FaultOutput.getValue() == 1 and (!systems.PNEU.Switch.pack1.getBoolValue() or !systems.PNEU.Switch.pack2.getBoolValue() or !(getprop("/ECAM/phases/wing-anti-ice-pulse") and wing_pb.getValue()))) { # inverse pulse bleed2Fault.active = 1; } else { ECAM_controller.warningReset(bleed2Fault); @@ -2430,7 +2646,7 @@ var messages_priority_2 = func { } else { ECAM_controller.warningReset(wingIceSysFaultXbld); } - if ((warningNodes.Logic.waiLclosed.getValue() or warningNodes.Logic.waiRclosed.getValue()) and getprop("/controls/ice-protection/wing")) { + if ((warningNodes.Logic.waiLclosed.getValue() or warningNodes.Logic.waiRclosed.getValue()) and wing_pb.getValue()) { wingIceSysFaultOff.active = 1; } else { ECAM_controller.warningReset(wingIceSysFaultOff); @@ -2451,7 +2667,7 @@ var messages_priority_2 = func { if (wingIceOpenGnd.clearFlag == 0 and warningNodes.Logic.waiGndFlight.getValue() and (phaseVar2 <= 2 or phaseVar2 >= 9)) { wingIceOpenGnd.active = 1; - if (pts.Gear.wow[1].getValue() and getprop("/controls/ice-protection/wing")) { + if (pts.Gear.wow[1].getValue() and wing_pb.getValue()) { wingIceOpenGndShut.active = 1; } else { ECAM_controller.warningReset(wingIceOpenGndShut); @@ -2998,7 +3214,7 @@ var messages_right_memo = func { eng_aice.active = 0; } - if (getprop("/controls/ice-protection/wing") == 1) { + if (wing_pb.getValue() == 1) { wing_aice.active = 1; } else { wing_aice.active = 0; diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 41df8920..8f89e2cb 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -282,6 +282,20 @@ var warnings = std.Vector.new([ var eng1FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), var eng1FailRelight = warning.new(msg: " -ENG 1 RELIGHT.CONSIDER", colour: "c"), + # ENG 1 SHUT DOWN + var eng1ShutDown = warning.new(msg: "ENG 1 SHUT DOWN ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var eng1ShutDownPack = warning.new(msg: " -PACK 1.............OFF", colour: "c"), + var eng1ShutDownXBleed = warning.new(msg: " -X BLEED...........OPEN", colour: "c"), + var eng1ShutDownModeSel = warning.new(msg: " -ENG MODE SEL.......IGN", colour: "c"), + var eng1ShutDownFuelLeak = warning.new(msg: " •IF NO FUEL LEAK :", colour: "w"), + var eng1ShutDownImbalance = warning.new(msg: " -IMBALANCE......MONITOR", colour: "c"), + var eng1ShutDownTCAS = warning.new(msg: " -TCAS MODE SEL.......TA", colour: "c"), + var eng1ShutDownBuffet = warning.new(msg: " •IF BUFFET : ", colour: "w"), + var eng1ShutDownSpeed = warning.new(msg: " MAX SPEED...........240", colour: "c"), + var eng1ShutDownXBleedS = warning.new(msg: " -X BLEED...........SHUT", colour: "c"), + var eng1ShutDownWingAI = warning.new(msg: " -WING ANTI ICE......OFF", colour: "c"), + var eng1ShutDownIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), + # ENG 2 FAIL var eng2Fail = warning.new(msg: "ENG 2 FAIL ", colour: "a", aural: 1, light: 1, isMainMsg: 1), var thrustMalfunction2 = warning.new(msg: " THRUST MALFUNCTION ", colour: "a"), @@ -297,6 +311,21 @@ var warnings = std.Vector.new([ var eng2FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), var eng2FailRelight = warning.new(msg: " -ENG 2 RELIGHT.CONSIDER", colour: "c"), + # ENG 2 SHUT DOWN + var eng2ShutDown = warning.new(msg: "ENG 2 SHUT DOWN ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var eng2ShutDownPack1 = warning.new(msg: " -PACK 1.............OFF", colour: "c"), + var eng2ShutDownPack = warning.new(msg: " -PACK 2.............OFF", colour: "c"), + var eng2ShutDownXBleed = warning.new(msg: " -X BLEED...........OPEN", colour: "c"), + var eng2ShutDownModeSel = warning.new(msg: " -ENG MODE SEL.......IGN", colour: "c"), + var eng2ShutDownFuelLeak = warning.new(msg: " •IF NO FUEL LEAK :", colour: "w"), + var eng2ShutDownImbalance = warning.new(msg: " -IMBALANCE......MONITOR", colour: "c"), + var eng2ShutDownTCAS = warning.new(msg: " -TCAS MODE SEL.......TA", colour: "c"), + var eng2ShutDownBuffet = warning.new(msg: " •IF BUFFET : ", colour: "w"), + var eng2ShutDownSpeed = warning.new(msg: " MAX SPEED...........240", colour: "c"), + var eng2ShutDownXBleedS = warning.new(msg: " -X BLEED...........SHUT", colour: "c"), + var eng2ShutDownWingAI = warning.new(msg: " -WING ANTI ICE......OFF", colour: "c"), + var eng2ShutDownIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), + # DC EMER CONFIG var dcEmerconfig = warning.new(msg: "ELEC DC EMER CONFIG", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcEmerconfigManOn = warning.new(msg: " -EMER ELEC PWR...MAN ON", colour: "c"), diff --git a/Nasal/Panels/atc.nas b/Nasal/Panels/atc.nas index 5cf13a00..e6b192dc 100644 --- a/Nasal/Panels/atc.nas +++ b/Nasal/Panels/atc.nas @@ -20,13 +20,13 @@ var Transponder = { activeADIRS: 1, condition: 0, failed: 0, - codeDigitsNodes: [props.globals.getNode("instrumentation/transponder/inputs/digit[0]", 1), props.globals.getNode("instrumentation/transponder/inputs/digit[1]", 1), props.globals.getNode("instrumentation/transponder/inputs/digit[2]", 1), props.globals.getNode("instrumentation/transponder/inputs/digit[3]", 1)], - serviceableNode: props.globals.getNode("instrumentation/transponder/serviceable", 1), - knobNode: props.globals.getNode("instrumentation/transponder/inputs/knob-mode", 1), - identNode: props.globals.getNode("instrumentation/transponder/inputs/ident-btn", 1), + codeDigitsNodes: [props.globals.getNode("/instrumentation/transponder/inputs/digit[0]", 1), props.globals.getNode("/instrumentation/transponder/inputs/digit[1]", 1), props.globals.getNode("/instrumentation/transponder/inputs/digit[2]", 1), props.globals.getNode("instrumentation/transponder/inputs/digit[3]", 1)], + serviceableNode: props.globals.getNode("/instrumentation/transponder/serviceable", 1), + knobNode: props.globals.getNode("/instrumentation/transponder/inputs/knob-mode", 1), + identNode: props.globals.getNode("/instrumentation/transponder/inputs/ident-btn", 1), ac1Node: props.globals.getNode("/systems/electrical/bus/ac-1", 1), - tcasNode: props.globals.getNode("instrumentation/tcas/inputs/mode"), - aglNode: props.globals.getNode("position/gear-agl-ft", 1), + tcasNode: props.globals.getNode("/instrumentation/tcas/inputs/mode"), + aglNode: props.globals.getNode("/position/gear-agl-ft", 1), electricNode: props.globals.getNode("/systems/electrical/outputs/transponder", 1), # communicate to generic systems new: func(elecSrc, ADIRS) { var t = {parents:[Transponder]}; diff --git a/Nasal/Systems/pneumatics.nas b/Nasal/Systems/pneumatics.nas index d52864d0..eeb18b2e 100644 --- a/Nasal/Systems/pneumatics.nas +++ b/Nasal/Systems/pneumatics.nas @@ -99,6 +99,8 @@ var PNEU = { hotAir: props.globals.getNode("/systems/air-conditioning/valves/hot-air"), starter1: props.globals.getNode("/systems/pneumatics/valves/starter-valve-1"), starter2: props.globals.getNode("/systems/pneumatics/valves/starter-valve-2"), + wingLeft: props.globals.getNode("/systems/pneumatics/valves/wing-ice-1"), + wingRight: props.globals.getNode("/systems/pneumatics/valves/wing-ice-2"), }, pressMode: props.globals.getNode("/systems/pressurization/mode", 1), init: func() { diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index 0f633b54..c905cded 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -2422,6 +2422,56 @@ + + + + /ECAM/warning-phase eq 1 + /ECAM/warning-phase eq 2 + /ECAM/warning-phase eq 9 + /ECAM/warning-phase eq 10 + + + + + + + /ECAM/dual-failure-enabled eq 0 + + + + /ECAM/warnings/logic/eng/eng-shutdown-phase eq 1 + /ECAM/timer/ground-calc eq 0 + + /controls/engines/engine[0]/fire-btn eq 1 + + + /ECAM/warnings/logic/eng/eng-shutdown-phase eq 0 + /controls/engines/engine[0]/cutoff-switch eq 1 + + + + + + + + + /ECAM/dual-failure-enabled eq 0 + + + + /ECAM/warnings/logic/eng/eng-shutdown-phase eq 1 + /ECAM/timer/ground-calc eq 0 + + /controls/engines/engine[1]/fire-btn eq 1 + + + /ECAM/warnings/logic/eng/eng-shutdown-phase eq 0 + /controls/engines/engine[1]/cutoff-switch eq 1 + + + + + From d73eecc4f3ed48b9015919ebf090d9e7d8ee6476 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 2 Feb 2021 13:53:20 +0000 Subject: [PATCH 035/124] warning when FLX < outside temp --- Nasal/ECAM/ECAM-logic.nas | 17 +++++++++++++++++ Nasal/ECAM/ECAM-messages.nas | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 916d229d..8d09bb15 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -40,6 +40,8 @@ var bigThree = nil; var altAlertSteady = 0; var altAlertFlash = 0; +var _SATval = nil; + var ecamConfigTest = props.globals.initNode("/ECAM/to-config-test", 0, "BOOL"); @@ -1610,6 +1612,21 @@ var messages_priority_2 = func { ECAM_controller.warningReset(eng2ShutDownIcing); } + # SAT ABOVE FLEX TEMP + _SATval = dmc.DMController.DMCs[1].outputs[4].getValue(); + if (satAbvFlexTemp.clearFlag == 0 and phaseVar2 == 2 and fadec.Thrust.limFlex.getValue() and _SATval != nil and _SATval > fmgc.FMGCNodes.flexTemp.getValue() and !warningNodes.Logic.thrLeversNotSet.getValue()) { + satAbvFlexTemp.active = 1; + + if (satAbvFlexTempCheck.clearFlag == 0) { + satAbvFlexTempCheck.active = 1; + } else { + ECAM_controller.warningReset(satAbvFlexTempCheck); + } + } else { + ECAM_controller.warningReset(satAbvFlexTemp); + ECAM_controller.warningReset(satAbvFlexTempCheck); + } + # DC EMER CONFIG if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dcEss.getValue() < 25 and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcEmerconfig.clearFlag == 0) { dcEmerconfig.active = 1; diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 8f89e2cb..d788112d 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -282,8 +282,14 @@ var warnings = std.Vector.new([ var eng1FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), var eng1FailRelight = warning.new(msg: " -ENG 1 RELIGHT.CONSIDER", colour: "c"), + # ENG 1 OIL HI TEMP + var eng1OilHiTemp = warning.new(msg: "ENG 1 OIL HI TEMP ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var eng1OilHiTempIdle = warning.new(msg: " -THR LEVER 1.......IDLE", colour: "c"), + var eng1OilHiTempSuccess = warning.new(msg: " •IF UNSUCCESSFUL: ", colour: "w"), + var eng1OilHiTempMaster = warning.new(msg: " -ENG MASTER 1.......OFF", colour: "c"), + # ENG 1 SHUT DOWN - var eng1ShutDown = warning.new(msg: "ENG 1 SHUT DOWN ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var eng1ShutDown = warning.new(msg: "ENG 1 SHUT DOWN ", colour: "a", aural: 1, light: 1, isMainMsg: 1), var eng1ShutDownPack = warning.new(msg: " -PACK 1.............OFF", colour: "c"), var eng1ShutDownXBleed = warning.new(msg: " -X BLEED...........OPEN", colour: "c"), var eng1ShutDownModeSel = warning.new(msg: " -ENG MODE SEL.......IGN", colour: "c"), @@ -311,6 +317,12 @@ var warnings = std.Vector.new([ var eng2FailNoDamage = warning.new(msg: " IF NO DAMAGE : ", colour: "w"), var eng2FailRelight = warning.new(msg: " -ENG 2 RELIGHT.CONSIDER", colour: "c"), + # ENG 2 OIL HI TEMP + var eng2OilHiTemp = warning.new(msg: "ENG 2 OIL HI TEMP ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var eng2OilHiTempIdle = warning.new(msg: " -THR LEVER 2.......IDLE", colour: "c"), + var eng2OilHiTempSuccess = warning.new(msg: " •IF UNSUCCESSFUL: ", colour: "w"), + var eng2OilHiTempMaster = warning.new(msg: " -ENG MASTER 2.......OFF", colour: "c"), + # ENG 2 SHUT DOWN var eng2ShutDown = warning.new(msg: "ENG 2 SHUT DOWN ", colour: "a", aural: 1, light: 1, isMainMsg: 1), var eng2ShutDownPack1 = warning.new(msg: " -PACK 1.............OFF", colour: "c"), @@ -326,6 +338,10 @@ var warnings = std.Vector.new([ var eng2ShutDownWingAI = warning.new(msg: " -WING ANTI ICE......OFF", colour: "c"), var eng2ShutDownIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), + # SAT ABOVE FLEX TEMP + var satAbvFlexTemp = warning.new(msg: "ENG SAT ABOVE FLEX TEMP", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var satAbvFlexTempCheck = warning.new(msg: " -T.O DATA.........CHECK", colour: "c"), + # DC EMER CONFIG var dcEmerconfig = warning.new(msg: "ELEC DC EMER CONFIG", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcEmerconfigManOn = warning.new(msg: " -EMER ELEC PWR...MAN ON", colour: "c"), From 16aba3cbfb5f98be8c2943b9963f7b1100b638c8 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 2 Feb 2021 15:57:48 +0000 Subject: [PATCH 036/124] Big revision of the electrical warnings --- Nasal/ECAM/ECAM-controller.nas | 13 ++ Nasal/ECAM/ECAM-logic.nas | 235 +++++++++++++++++++++++++---- Nasal/ECAM/ECAM-messages.nas | 14 +- Systems/a320-fwc.xml | 261 +++++++++++++++++++++++++++++++++ Systems/ecam-proprules.xml | 11 ++ 5 files changed, 501 insertions(+), 33 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index d5d82df3..aedf2937 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -87,6 +87,8 @@ var warningNodes = { spdBrkConfig2: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-range"), pitchTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-range"), rudTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-range"), + dcEssFuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fuel-consumption-increased"), + dcEssFMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fms-predictions-unreliable"), dc2FuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-2-fuel-consumption-increased"), dc2FMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-2-fms-predictions-unreliable"), thrLeversNotSet: props.globals.initNode("/ECAM/warnings/logic/eng/thr-lever-not-set"), @@ -131,6 +133,17 @@ var warningNodes = { leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault-output"), rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault-output"), staticInverter: props.globals.initNode("/systems/electrical/some-electric-thingie/static-inverter-timer"), + dcEmerConfig: props.globals.initNode("/ECAM/warnings/logic/dc-emer-config-output"), + dc12Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-2-output"), + dcEssFault: props.globals.initNode("/ECAM/warnings/logic/dc-ess-output"), + dc1Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-output"), + dc2Fault: props.globals.initNode("/ECAM/warnings/logic/dc-2-output"), + dcBatFault: props.globals.initNode("/ECAM/warnings/logic/dc-bat-output"), + ac1Fault: props.globals.initNode("/ECAM/warnings/logic/ac-1-output"), + ac2Fault: props.globals.initNode("/ECAM/warnings/logic/ac-2-output"), + acEssFault: props.globals.initNode("/ECAM/warnings/logic/ac-ess-output"), + dcEssShed: props.globals.initNode("/ECAM/warnings/logic/dc-ess-shed-output"), + acEssShed: props.globals.initNode("/ECAM/warnings/logic/ac-ess-shed-output"), }, Flipflops: { apuGenFault: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault"), diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 8d09bb15..066a7c91 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -1628,113 +1628,284 @@ var messages_priority_2 = func { } # DC EMER CONFIG - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dcEss.getValue() < 25 and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcEmerconfig.clearFlag == 0) { + if (warningNodes.Timers.dcEmerConfig.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and dcEmerconfig.clearFlag == 0) { dcEmerconfig.active = 1; - dcEmerconfigManOn.active = 1; + if (systems.ELEC.Source.EmerGen.relayPos.getValue() == 0 and dcEmerconfigManOn.clearFlag == 0) { + dcEmerconfigManOn.active = 1; + } else { + ECAM_controller.warningReset(dcEmerconfigManOn); + } + + if ((warningNodes.Logic.dcEssFuelConsumptionIncreased.getValue() or warningNodes.Logic.dc2FuelConsumptionIncreased.getValue()) and dcEmerconfigFuel.clearFlag == 0) { + dcEmerconfigFuel.active = 1; + } else { + ECAM_controller.warningReset(dcEmerconfigFuel); + } } else { ECAM_controller.warningReset(dcEmerconfig); ECAM_controller.warningReset(dcEmerconfigManOn); + ECAM_controller.warningReset(dcEmerconfigFuel); } - if (!systems.ELEC.EmerElec.getValue() and !dcEmerconfig.active and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus12Fault.clearFlag == 0) { + if (warningNodes.Timers.dc12Fault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus12Fault.clearFlag == 0) { dcBus12Fault.active = 1; - dcBus12FaultBlower.active = 1; - dcBus12FaultExtract.active = 1; - dcBus12FaultBaroRef.active = 1; - dcBus12FaultIcing.active = 1; - dcBus12FaultBrking.active = 1; + + if (dcBus12FaultBlower.clearFlag == 0) { + dcBus12FaultBlower.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultBlower); + } + + if (dcBus12FaultExtract.clearFlag == 0) { + dcBus12FaultExtract.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultExtract); + } + + if (dcBus12FaultBaroRef.clearFlag == 0) { + dcBus12FaultBaroRef.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultBaroRef); + } + + if (dcBus12FaultFuel.clearFlag == 0 and warningNodes.Logic.dc2FuelConsumptionIncreased.getValue()) { + dcBus12FaultFuel.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultFuel); + } + + if (dcBus12FaultPredict.clearFlag == 0 and warningNodes.Logic.dc2FMSPredictions.getValue()) { + dcBus12FaultPredict.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultPredict); + } + + if (dcBus12FaultIcing.clearFlag == 0) { + dcBus12FaultIcing.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultIcing); + } + + if (dcBus12FaultBrking.clearFlag == 0) { + dcBus12FaultBrking.active = 1; + } else { + ECAM_controller.warningReset(dcBus12FaultBrking); + } } else { ECAM_controller.warningReset(dcBus12Fault); ECAM_controller.warningReset(dcBus12FaultBlower); ECAM_controller.warningReset(dcBus12FaultExtract); ECAM_controller.warningReset(dcBus12FaultBaroRef); + ECAM_controller.warningReset(dcBus12FaultFuel); + ECAM_controller.warningReset(dcBus12FaultPredict); ECAM_controller.warningReset(dcBus12FaultIcing); ECAM_controller.warningReset(dcBus12FaultBrking); } - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.acEss.getValue() < 110 and phaseVar2 != 4 and phaseVar2 != 8 and AcBusEssFault.clearFlag == 0) { + if (warningNodes.Timers.acEssFault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and AcBusEssFault.clearFlag == 0) { AcBusEssFault.active = 1; - if (!systems.ELEC.Switch.acEssFeed.getBoolValue()) { + if (!systems.ELEC.Switch.acEssFeed.getBoolValue() and AcBusEssFaultFeed.clearFlag == 0) { AcBusEssFaultFeed.active = 1; } else { ECAM_controller.warningReset(AcBusEssFaultFeed); } - AcBusEssFaultAtc.active = 1; + + if (atc.transponderPanel.atcSel != 2 and AcBusEssFaultAtc.clearFlag == 0) { + AcBusEssFaultAtc.active = 1; + } else { + ECAM_controller.warningReset(AcBusEssFaultAtc); + } } else { ECAM_controller.warningReset(AcBusEssFault); ECAM_controller.warningReset(AcBusEssFaultFeed); ECAM_controller.warningReset(AcBusEssFaultAtc); } - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.ac1.getValue() < 110 and phaseVar2 != 4 and phaseVar2 != 8 and AcBus1Fault.clearFlag == 0) { + if (warningNodes.Timers.ac1Fault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and AcBus1Fault.clearFlag == 0) { AcBus1Fault.active = 1; - AcBus1FaultBlower.active = 1; + + if (AcBus1FaultBlower.clearFlag == 0) { + AcBus1FaultBlower.active = 1; + } else { + ECAM_controller.warningReset(AcBus1FaultBlower); + } } else { ECAM_controller.warningReset(AcBus1Fault); ECAM_controller.warningReset(AcBus1FaultBlower); } - if (!dcEmerconfig.active and systems.ELEC.Bus.dcEss.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 8 and DcEssBusFault.clearFlag == 0) { + if (warningNodes.Timers.dcEssFault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and DcEssBusFault.clearFlag == 0) { DcEssBusFault.active = 1; - DcEssBusFaultRadio.active = 1; - DcEssBusFaultRadio2.active = 1; - DcEssBusFaultBaro.active = 1; - DcEssBusFaultGPWS.active = 1; + if (DcEssBusFaultRadio.clearFlag == 0) { + DcEssBusFaultRadio.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultRadio); + } + if (DcEssBusFaultRadio2.clearFlag == 0) { + DcEssBusFaultRadio2.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultRadio2); + } + + if (DcEssBusFaultBaro.clearFlag == 0) { + DcEssBusFaultBaro.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultBaro); + } + + if (0 == 1 and systems.ELEC.Bus.dc2.getValue() < 25 and systems.ELEC.Bus.dcEss.getValue() < 25 and DcEssBusFaultGear.clearFlag == 0) { # LGCIU12 FAULT + DcEssBusFaultGear.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultGear); + } + + if (DcEssBusFaultGPWS.clearFlag == 0) { + DcEssBusFaultGPWS.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultGPWS); + } + + if (DcEssBusFaultFuel.clearFlag == 0 and warningNodes.Logic.dcEssFuelConsumptionIncreased.getValue()) { + DcEssBusFaultFuel.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultFuel); + } + + if (DcEssBusFaultPredict.clearFlag == 0 and warningNodes.Logic.dcEssFMSPredictions.getValue()) { + DcEssBusFaultPredict.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultPredict); + } + + if (DcEssBusFaultIcing.clearFlag == 0) { + DcEssBusFaultIcing.active = 1; + } else { + ECAM_controller.warningReset(DcEssBusFaultIcing); + } } else { ECAM_controller.warningReset(DcEssBusFault); ECAM_controller.warningReset(DcEssBusFaultRadio); ECAM_controller.warningReset(DcEssBusFaultRadio2); ECAM_controller.warningReset(DcEssBusFaultBaro); + ECAM_controller.warningReset(DcEssBusFaultGear); ECAM_controller.warningReset(DcEssBusFaultGPWS); + ECAM_controller.warningReset(DcEssBusFaultFuel); + ECAM_controller.warningReset(DcEssBusFaultPredict); + ECAM_controller.warningReset(DcEssBusFaultIcing); } - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.ac2.getValue() < 110 and phaseVar2 != 4 and phaseVar2 != 8 and AcBus2Fault.clearFlag == 0) { + if (warningNodes.Timers.ac2Fault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and AcBus2Fault.clearFlag == 0) { AcBus2Fault.active = 1; - AcBus2FaultExtract.active = 1; + if (AcBus2FaultExtract.clearFlag == 0) { + AcBus2FaultExtract.active = 1; + } else { + ECAM_controller.warningReset(AcBus2FaultExtract); + } + + if (atc.transponderPanel.atcSel != 1 and AcBus2FaultAtc.clearFlag == 0) { + AcBus2FaultAtc.active = 1; + } else { + ECAM_controller.warningReset(AcBus2FaultAtc); + } } else { ECAM_controller.warningReset(AcBus2Fault); ECAM_controller.warningReset(AcBus2FaultExtract); + ECAM_controller.warningReset(AcBus2FaultAtc); } - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dc1.getValue() < 25 and systems.ELEC.Bus.dc2.getValue() >= 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus1Fault.clearFlag == 0) { + if (warningNodes.Timers.dc1Fault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus1Fault.clearFlag == 0) { dcBus1Fault.active = 1; - dcBus1FaultBlower.active = 1; - dcBus1FaultExtract.active = 1; + + if (dcBus1FaultBlower.clearFlag == 0) { + dcBus1FaultBlower.active = 1; + } else { + ECAM_controller.warningReset(dcBus1FaultBlower); + } + if (dcBus1FaultExtract.clearFlag == 0) { + dcBus1FaultExtract.active = 1; + } else { + ECAM_controller.warningReset(dcBus1FaultExtract); + } + if (dcBus1FaultIcing.clearFlag == 0) { + dcBus1FaultIcing.active = 1; + } else { + ECAM_controller.warningReset(dcBus1FaultIcing); + } } else { ECAM_controller.warningReset(dcBus1Fault); ECAM_controller.warningReset(dcBus1FaultBlower); ECAM_controller.warningReset(dcBus1FaultExtract); + ECAM_controller.warningReset(dcBus1FaultIcing); } - if (!systems.ELEC.EmerElec.getValue() and systems.ELEC.Bus.dc1.getValue() >= 25 and systems.ELEC.Bus.dc2.getValue() <= 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus2Fault.clearFlag == 0) { + if (warningNodes.Timers.dc2Fault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and dcBus2Fault.clearFlag == 0) { dcBus2Fault.active = 1; - dcBus2FaultAirData.active = 1; - dcBus2FaultBaro.active = 1; + + if (dcBus2FaultAirData.clearFlag == 0 and systems.SwitchingPanel.Switches.airData.getValue() != 1) { + dcBus2FaultAirData.active = 1; + } else { + ECAM_controller.warningReset(dcBus2FaultAirData); + } + + if (dcBus2FaultBaro.clearFlag == 0) { + dcBus2FaultBaro.active = 1; + } else { + ECAM_controller.warningReset(dcBus2FaultBaro); + } + + if (0 == 1 and systems.ELEC.Bus.dc2.getValue() < 25 and systems.ELEC.Bus.dcEss.getValue() < 25 and dcBus2FaultGear.clearFlag == 0) { # LGCIU12 FAULT + dcBus2FaultGear.active = 1; + } else { + ECAM_controller.warningReset(dcBus2FaultGear); + } + + if (dcBus2FaultFuel.clearFlag == 0 and warningNodes.Logic.dc2FuelConsumptionIncreased.getValue()) { + dcBus2FaultFuel.active = 1; + } else { + ECAM_controller.warningReset(dcBus2FaultFuel); + } + + if (dcBus2FaultPredict.clearFlag == 0 and warningNodes.Logic.dc2FMSPredictions.getValue()) { + dcBus2FaultPredict.active = 1; + } else { + ECAM_controller.warningReset(dcBus2FaultPredict); + } } else { ECAM_controller.warningReset(dcBus2Fault); ECAM_controller.warningReset(dcBus2FaultAirData); ECAM_controller.warningReset(dcBus2FaultBaro); + ECAM_controller.warningReset(dcBus2FaultGear); + ECAM_controller.warningReset(dcBus2FaultFuel); + ECAM_controller.warningReset(dcBus2FaultPredict); } - if (!systems.ELEC.EmerElec.getValue() and !dcEmerconfig.active and systems.ELEC.Bus.dcBat.getValue() < 25 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and dcBusBatFault.clearFlag == 0) { + if (warningNodes.Timers.dcBatFault.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and dcBusBatFault.clearFlag == 0) { dcBusBatFault.active = 1; } else { ECAM_controller.warningReset(dcBusBatFault); } - if (!(systems.ELEC.EmerElec.getValue() and !systems.ELEC.Source.EmerGen.relayPos.getValue()) and systems.ELEC.Bus.dcEssShed.getValue() < 25 and systems.ELEC.Bus.dcEss.getValue() >= 25 and phaseVar2 != 4 and phaseVar2 != 8 and dcBusEssShed.clearFlag == 0) { + if (warningNodes.Timers.dcEssShed.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and dcBusEssShed.clearFlag == 0) { dcBusEssShed.active = 1; - dcBusEssShedExtract.active = 1; - dcBusEssShedIcing.active = 1; + if (dcBusEssShedExtract.clearFlag == 0) { + dcBusEssShedExtract.active = 1; + } else { + ECAM_controller.warningReset(dcBusEssShedExtract); + } + if (dcBusEssShedIcing.clearFlag == 0) { + dcBusEssShedIcing.active = 1; + } else { + ECAM_controller.warningReset(dcBusEssShedIcing); + } } else { ECAM_controller.warningReset(dcBusEssShed); ECAM_controller.warningReset(dcBusEssShedExtract); ECAM_controller.warningReset(dcBusEssShedIcing); } - if (!(systems.ELEC.EmerElec.getValue() and !systems.ELEC.Source.EmerGen.relayPos.getValue()) and systems.ELEC.Bus.acEssShed.getValue() < 110 and systems.ELEC.Bus.acEss.getValue() >= 110 and phaseVar2 != 4 and phaseVar2 != 8 and acBusEssShed.clearFlag == 0) { + if (warningNodes.Timers.acEssShed.getValue() == 1 and phaseVar2 != 4 and phaseVar2 != 8 and acBusEssShed.clearFlag == 0) { acBusEssShed.active = 1; - if (!systems.ELEC.EmerElec.getValue()) { + if (!systems.ELEC.EmerElec.getValue() and atc.transponderPanel.atcSel != 2 and acBusEssShedAtc.clearFlag == 0) { acBusEssShedAtc.active = 1; } else { ECAM_controller.warningReset(acBusEssShed); diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index d788112d..247f78a9 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -345,12 +345,15 @@ var warnings = std.Vector.new([ # DC EMER CONFIG var dcEmerconfig = warning.new(msg: "ELEC DC EMER CONFIG", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcEmerconfigManOn = warning.new(msg: " -EMER ELEC PWR...MAN ON", colour: "c"), + var dcEmerconfigFuel = warning.new(msg: " FUEL CONSUMPT INCRSD", colour: "c"), # DC BUS 1 OR 2 FAULT var dcBus12Fault = warning.new(msg: "ELEC DC BUS 1+2 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcBus12FaultBlower = warning.new(msg: " -BLOWER............OVRD", colour: "c"), var dcBus12FaultExtract = warning.new(msg: " -EXTRACT...........OVRD", colour: "c"), var dcBus12FaultBaroRef = warning.new(msg: " -BARO REF.........CHECK", colour: "c"), + var dcBus12FaultFuel = warning.new(msg: " FUEL CONSUMPT INCRSD", colour: "c"), + var dcBus12FaultPredict = warning.new(msg: " FMS PRED UNRELIABLE", colour: "c"), var dcBus12FaultIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), var dcBus12FaultBrking = warning.new(msg: " MAX BRK........1000 PSI", colour: "c"), @@ -368,21 +371,30 @@ var warnings = std.Vector.new([ var DcEssBusFaultRadio = warning.new(msg: " -VHF 2 OR 3.........USE", colour: "c"), var DcEssBusFaultRadio2 = warning.new(msg: " -AUDIO SWTG......SELECT", colour: "c"), var DcEssBusFaultBaro = warning.new(msg: " -BARO REF.........CHECK", colour: "c"), - var DcEssBusFaultGPWS = warning.new(msg: " -GPWS...............OFF", colour: "c"), + var DcEssBusFaultGear = warning.new(msg: " -L/G.........GRVTY EXTN", colour: "c"), + var DcEssBusFaultGPWS = warning.new(msg: " -GPWS SYS...........OFF", colour: "c"), + var DcEssBusFaultFuel = warning.new(msg: " FUEL CONSUMPT INCRSD", colour: "c"), + var DcEssBusFaultPredict = warning.new(msg: " FMS PRED UNRELIABLE", colour: "c"), + var DcEssBusFaultIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), # AC BUS 2 FAULT var AcBus2Fault = warning.new(msg: "ELEC AC BUS 2 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), var AcBus2FaultExtract = warning.new(msg: " -EXTRACT...........OVRD", colour: "c"), + var AcBus2FaultAtc = warning.new(msg: " -ATC..............SYS 1", colour: "c"), # DC BUS 1 FAULT var dcBus1Fault = warning.new(msg: "ELEC DC BUS 1 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcBus1FaultBlower = warning.new(msg: " -BLOWER............OVRD", colour: "c"), var dcBus1FaultExtract = warning.new(msg: " -EXTRACT...........OVRD", colour: "c"), + var dcBus1FaultIcing = warning.new(msg: " AVOID ICING CONDITIONS", colour: "c"), # DC BUS 2 FAULT var dcBus2Fault = warning.new(msg: "ELEC DC BUS 2 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), var dcBus2FaultAirData = warning.new(msg: " -AIR DATA SWTG......F/O", colour: "c"), var dcBus2FaultBaro = warning.new(msg: " -BARO REF.........CHECK", colour: "c"), + var dcBus2FaultGear = warning.new(msg: " -L/G.........GRVTY EXTN", colour: "c"), + var dcBus2FaultFuel = warning.new(msg: " FUEL CONSUMPT INCRSD", colour: "c"), + var dcBus2FaultPredict = warning.new(msg: " FMS PRED UNRELIABLE", colour: "c"), # DC BAT BUS FAULT var dcBusBatFault = warning.new(msg: "ELEC DC BAT BUS FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index c905cded..6e43357b 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -1757,6 +1757,90 @@ + + + + /ECAM/timer/ground-calc eq 0 + /ECAM/dual-failure-enabled eq 0 + + + + /ECAM/warnings/hyd/yellow-abnorm-lo-pr eq 1 + /systems/electrical/bus/dc-2 lt 25 + + /ECAM/warnings/logic/SFLAPEXT eq 1 + + + + + /ECAM/warnings/hyd/blue-abnorm-lo-pr ne 1 + /ECAM/warnings/hyd/green-abnorm-lo-pr eq 1 + + /systems/electrical/bus/dc-2 lt 25 + + /ECAM/warnings/logic/SSLATEXT eq 1 + + /ECAM/warnings/hyd/blue-abnorm-lo-pr eq 0 + /systems/electrical/bus/ac-1 ge 110 + + + + + + hydraulics/aileron-l/pressure-switch-or eq 1 + + /systems/fctl/elac2 eq 0 + /systems/hydraulic/green-psi lt 1500 + + /ECAM/warnings/logic/BLUE-EMER-ELEC ne 1 + + + hydraulics/aileron-r/pressure-switch-or eq 1 + + /systems/fctl/elac2 eq 0 + /systems/hydraulic/blue-psi lt 1500 + + + + + + /systems/electrical/bus/ac-1 ge 110 + /ECAM/warnings/hyd/green-abnorm-lo-pr eq 0 + + + /ECAM/warnings/hyd/blue-abnorm-lo-pr eq 1 + + hydraulics/spoiler-l3/final-deg gt 0.01 + hydraulics/spoiler-r3/final-deg gt 0.01 + + + + /ECAM/warnings/hyd/blue-abnorm-lo-pr eq 1 + + + hydraulics/aileron-l/pressure-switch-or eq 1 + + /systems/fctl/elac2 eq 0 + /systems/hydraulic/green-psi lt 1500 + + /ECAM/warnings/logic/BLUE-EMER-ELEC ne 1 + + + hydraulics/aileron-r/pressure-switch-or eq 1 + + /systems/fctl/elac1 eq 0 + /systems/hydraulic/green-psi lt 1500 + + + + + + + + + + + @@ -1764,6 +1848,183 @@ /systems/electrical/relay/dc-ess-shed-switch/contact-pos eq 0 + + + + + /ECAM/warnings/logic/dc-ess-fuel-consumption-increased eq 1 + /systems/electrical/bus/dc-2 ge 25 + + + + + + + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + /systems/electrical/bus/dc-1 lt 25 + /systems/electrical/bus/dc-2 lt 25 + /systems/electrical/bus/dc-ess lt 25 + + + + + /ECAM/warnings/logic/dc-emer-config + 120 + 5 + + + + + + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + /systems/electrical/bus/dc-1 lt 25 + /systems/electrical/bus/dc-2 lt 25 + /ECAM/warnings/logic/dc-emer-config ne 1 + + + + + /ECAM/warnings/logic/dc-1-2 + 120 + 0.5 + + + + + + /systems/electrical/bus/dc-ess lt 25 + /ECAM/warnings/logic/dc-emer-config ne 1 + + + + + /ECAM/warnings/logic/dc-ess-fault + 120 + 0.5 + + + + + + /systems/electrical/bus/dc-bat lt 25 + /ECAM/warnings/logic/dc-emer-config ne 1 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/dc-bat-fault + 120 + 5 + + + + + + /systems/electrical/bus/dc-1 lt 25 + /systems/electrical/bus/dc-2 ge 25 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/dc-1-fault + 120 + 0.5 + + + + + + /systems/electrical/bus/dc-2 lt 25 + /systems/electrical/bus/dc-1 ge 25 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/dc-2-fault + 120 + 0.5 + + + + + + /systems/electrical/bus/ac-1 lt 110 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/ac-1-fault + 120 + 5 + + + + + + /systems/electrical/bus/ac-2 lt 110 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/ac-2-fault + 120 + 5 + + + + + + /systems/electrical/bus/ac-ess lt 110 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + /ECAM/warnings/logic/ac-ess-fault + 120 + 5 + + + + + + /systems/electrical/bus/dc-ess-shed lt 25 + /systems/electrical/bus/dc-ess ge 25 + + /systems/electrical/some-electric-thingie/emer-elec-config-10-sec ne 1 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + + /ECAM/warnings/logic/dc-ess-shed-fault + 120 + 0.5 + + + + + + /systems/electrical/bus/ac-ess-shed lt 110 + /systems/electrical/bus/ac-ess ge 110 + + /systems/electrical/some-electric-thingie/emer-elec-config-10-sec ne 1 + /systems/electrical/some-electric-thingie/emer-elec-config ne 1 + + + + + + /ECAM/warnings/logic/ac-ess-shed-fault + 120 + 0.5 + diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml index 0cc0f736..9aca49cd 100644 --- a/Systems/ecam-proprules.xml +++ b/Systems/ecam-proprules.xml @@ -78,6 +78,17 @@ /systems/electrical/some-electric-thingie/generator-2-reset + + monostable + + + /systems/electrical/some-electric-thingie/emer-elec-config + + /systems/electrical/some-electric-thingie/emer-elec-config-10-sec + + monostable @@ -3166,6 +3191,84 @@ + + + + /controls/flight/speedbrake gt 0.0 + + + + + /ECAM/warnings/fctl/spd-brk-still-out-50-seconds-input + 120 + 0.02 + + + + + + /ECAM/warnings/fctl/spd-brk-still-out-50-seconds eq 1 + /engines/both-at-idle eq 1 + + + + + /ECAM/warnings/fctl/spd-brk-still-out-10-seconds-input + 120 + 0.1 + + + + + + /ECAM/warning-phase eq 6 + /ECAM/warnings/fctl/spd-brk-still-out-50-seconds eq 1 + /ECAM/warnings/fctl/spd-brk-still-out-10-seconds eq 0 + + + + + /ECAM/warnings/fctl/spd-brk-still-out-1-input + 120 + 0.03333333333 + + + + + + /ECAM/warning-phase eq 7 + /controls/flight/speedbrake gt 0.0 + + + + + /ECAM/warnings/fctl/spd-brk-still-out-2-input + 120 + 0.2 + + + + + + + + + + + /ECAM/warnings/fctl/spd-brk-still-out-1 eq 1 + /ECAM/warnings/fctl/spd-brk-still-out-2 eq 1 + + + + From 34f949f937b85792f6345970e6b9a8aca654c460 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 2 Feb 2021 19:46:20 +0000 Subject: [PATCH 040/124] Add GEN 1 / 2 OFF warnings, WING TK LO LVL warnings, and fix warning for lbs / kgs, add CTR TK OFF warning --- Nasal/ECAM/ECAM-controller.nas | 4 + Nasal/ECAM/ECAM-logic.nas | 146 ++++++++++++++++++++++++- Nasal/ECAM/ECAM-messages.nas | 39 +++++-- Systems/a320-fwc.xml | 188 ++++++++++++++++++++++++++++----- 4 files changed, 341 insertions(+), 36 deletions(-) diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index d43f5947..aedd52cf 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -99,6 +99,8 @@ var warningNodes = { eng1Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-shutdown"), eng2Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-shutdown"), acEssBusAltn: props.globals.initNode("/ECAM/warnings/logic/ac-ess-bus-altn-feed"), + gen1Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-1-off"), + gen2Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-2-off"), spdBrkOut: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-still-out"), }, Timers: { @@ -146,6 +148,8 @@ var warningNodes = { acEssFault: props.globals.initNode("/ECAM/warnings/logic/ac-ess-output"), dcEssShed: props.globals.initNode("/ECAM/warnings/logic/dc-ess-shed-output"), acEssShed: props.globals.initNode("/ECAM/warnings/logic/ac-ess-shed-output"), + centerPumpsOff: props.globals.initNode("/ECAM/warnings/fuel/center-pumps-off-output"), + lowLevelBoth: props.globals.initNode("/ECAM/warnings/fuel/lo-level-l-r-output"), }, Flipflops: { apuGenFault: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault"), diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 99c3478c..15c6177e 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -10,6 +10,7 @@ var apWarn = props.globals.getNode("/it-autoflight/output/ap-warning", 1); var athrWarn = props.globals.getNode("/it-autoflight/output/athr-warning", 1); var emerGen = props.globals.getNode("/controls/electrical/switches/emer-gen", 1); +var acconfig_weight_kgs = props.globals.getNode("/systems/acconfig/options/weight-kgs", 1); var state1Node = props.globals.getNode("/engines/engine[0]/state", 1); var state2Node = props.globals.getNode("/engines/engine[1]/state", 1); var wing_pb = props.globals.getNode("/controls/ice-protection/wing", 1); @@ -1938,6 +1939,14 @@ var messages_priority_2 = func { ECAM_controller.warningReset(gen1faultGen3); } + # ESS TR FAULT + if (essTRFault.clearFlag == 0 and systems.ELEC.Fail.essTrFault.getValue() and (phaseVar2 == 6 or phaseVar2 >= 9 or phaseVar2 <= 2)) { + essTRFault.active = 1; + } else { + ECAM_controller.warningReset(essTRFault); + } + + # GEN 2 FAULT if (gen2fault.clearFlag == 0 and warningNodes.Flipflops.gen2Fault.getValue() and (phaseVar2 == 2 or phaseVar2 == 3 or phaseVar2 == 6 or phaseVar2 == 9)) { gen2fault.active = 1; if (!warningNodes.Flipflops.gen2FaultOnOff.getValue()) { @@ -1982,6 +1991,19 @@ var messages_priority_2 = func { ECAM_controller.warningReset(apuGenfaultGen3); } + # GEN OFF + if (gen1Off.clearFlag == 0 and warningNodes.Logic.gen1Off.getValue() and (phaseVar2 == 2 or phaseVar2 == 3 or phaseVar2 == 6 or phaseVar2 == 9)) { + gen1Off.active = 1; + } else { + ECAM_controller.warningReset(gen1Off); + } + + if (gen2Off.clearFlag == 0 and warningNodes.Logic.gen2Off.getValue() and (phaseVar2 == 2 or phaseVar2 == 3 or phaseVar2 == 6 or phaseVar2 == 9)) { + gen2Off.active = 1; + } else { + ECAM_controller.warningReset(gen2Off); + } + # ELEC AC ESS BUS ALTN if (acEssBusAltn.clearFlag == 0 and warningNodes.Logic.acEssBusAltn.getValue() and (phaseVar2 >= 9 or phaseVar2 <= 2)) { acEssBusAltn.active = 1; @@ -2260,6 +2282,119 @@ var messages_priority_2 = func { ECAM_controller.warningReset(fcuFault2Baro); } + # FUEL + if (wingLoLvl.clearFlag == 0 and warningNodes.Timers.lowLevelBoth.getValue() == 1 and (phaseVar2 <= 2 or phaseVar2 == 6 or phaseVar2 >= 9)) { + wingLoLvl.active = 1; + + if (wingLoLvlManMode.clearFlag == 0 and systems.FUEL.Switches.centerTkMode.getValue() == 0 and systems.FUEL.Quantity.center.getValue() >= 550) { + wingLoLvlManMode.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlManMode); + } + + if (wingLoLvlPumpL1.clearFlag == 0 and !systems.FUEL.Switches.pumpLeft1.getValue()) { + wingLoLvlPumpL1.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpL1); + } + + if (wingLoLvlPumpL2.clearFlag == 0 and !systems.FUEL.Switches.pumpLeft2.getValue()) { + wingLoLvlPumpL2.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpL2); + } + + if (wingLoLvlPumpC1.clearFlag == 0 and !systems.FUEL.Switches.pumpCenter1.getValue()) { + wingLoLvlPumpC1.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpC1); + } + + if (wingLoLvlPumpR1.clearFlag == 0 and !systems.FUEL.Switches.pumpRight1.getValue()) { + wingLoLvlPumpR1.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpR1); + } + + if (wingLoLvlPumpR2.clearFlag == 0 and !systems.FUEL.Switches.pumpRight2.getValue()) { + wingLoLvlPumpR2.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpR2); + } + + if (wingLoLvlPumpC2.clearFlag == 0 and !systems.FUEL.Switches.pumpCenter2.getValue()) { + wingLoLvlPumpC2.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlPumpC2); + } + + if (systems.FUEL.Switches.crossfeed.getValue() == 0) { + if (wingLoLvlLeak.clearFlag == 0) { + wingLoLvlLeak.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlLeak); + } + + if (wingLoLvlXFeed.clearFlag == 0) { + wingLoLvlXFeed.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlXFeed); + } + } else { + ECAM_controller.warningReset(wingLoLvlLeak); + ECAM_controller.warningReset(wingLoLvlXFeed); + } + + if (systems.FUEL.Switches.crossfeed.getValue() == 1) { + if (wingLoLvlGrav.clearFlag == 0) { + wingLoLvlGrav.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlGrav); + } + + if (wingLoLvlXFeedOff.clearFlag == 0) { + wingLoLvlXFeedOff.active = 1; + } else { + ECAM_controller.warningReset(wingLoLvlXFeedOff); + } + } else { + ECAM_controller.warningReset(wingLoLvlGrav); + ECAM_controller.warningReset(wingLoLvlXFeedOff); + } + } else { + ECAM_controller.warningReset(wingLoLvl); + ECAM_controller.warningReset(wingLoLvlManMode); + ECAM_controller.warningReset(wingLoLvlPumpL1); + ECAM_controller.warningReset(wingLoLvlPumpL2); + ECAM_controller.warningReset(wingLoLvlPumpC1); + ECAM_controller.warningReset(wingLoLvlPumpR1); + ECAM_controller.warningReset(wingLoLvlPumpR2); + ECAM_controller.warningReset(wingLoLvlPumpC2); + ECAM_controller.warningReset(wingLoLvlLeak); + ECAM_controller.warningReset(wingLoLvlXFeed); + ECAM_controller.warningReset(wingLoLvlGrav); + ECAM_controller.warningReset(wingLoLvlXFeedOff); + } + + if (ctrPumpsOff.clearFlag == 0 and warningNodes.Timers.centerPumpsOff.getValue() == 1 and (phaseVar2 == 2 or phaseVar2 == 6)) { + ctrPumpsOff.active = 1; + + if (ctrPumpsOffPump1.clearFlag == 0 and !systems.FUEL.Switches.pumpCenter1.getValue()) { + ctrPumpsOffPump1.active = 1; + } else { + ECAM_controller.warningReset(ctrPumpsOffPump1); + } + if (ctrPumpsOffPump2.clearFlag == 0 and !systems.FUEL.Switches.pumpCenter2.getValue()) { + ctrPumpsOffPump2.active = 1; + } else { + ECAM_controller.warningReset(ctrPumpsOffPump2); + } + } else { + ECAM_controller.warningReset(ctrPumpsOff); + ECAM_controller.warningReset(ctrPumpsOffPump1); + ECAM_controller.warningReset(ctrPumpsOffPump2); + } + # APU EMER SHUT DOWN if (apuEmerShutdown.clearFlag == 0 and systems.APUController.APU.signals.autoshutdown and systems.APUController.APU.signals.emer and !getprop("/systems/fire/apu/warning-active") and (phaseVar2 == 6 or phaseVar2 >= 9 or phaseVar2 <= 2)) { apuEmerShutdown.active = 1; @@ -3234,10 +3369,17 @@ var messages_memo = func { outr_tk_fuel_xfrd.active = 0; } - if (pts.Consumables.Fuel.totalFuelLbs.getValue() < 6000 and toMemoLine1.active != 1 and ldgMemoLine1.active != 1) { # assuming US short ton 2000lb - fob_3T.active = 1; + if (pts.Consumables.Fuel.totalFuelLbs.getValue() < 6613 and toMemoLine1.active != 1 and ldgMemoLine1.active != 1) { # assuming US short ton 2000lb + if (acconfig_weight_kgs.getValue()) { + fob_3T.active = 1; + fob_66L.active = 0; + } else { + fob_3T.active = 0; + fob_66L.active = 1; + } } else { fob_3T.active = 0; + fob_66L.active = 0; } if (getprop("instrumentation/mk-viii/inputs/discretes/momentary-flap-all-override") == 1 and toMemoLine1.active != 1 and ldgMemoLine1.active != 1) { diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index f0fc3232..a0d2c854 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -449,21 +449,28 @@ var warnings = std.Vector.new([ # GEN 1 FAULT var gen1fault = warning.new(msg: "ELEC GEN 1 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), - var gen1faultGen = warning.new(msg: "-GEN 1......OFF THEN ON", colour: "c"), + var gen1faultGen = warning.new(msg: " -GEN 1......OFF THEN ON", colour: "c"), var gen1faultGen2 = warning.new(msg: " •IF UNSUCCESSFUL :", colour: "w"), - var gen1faultGen3 = warning.new(msg: "-GEN 1..............OFF", colour: "c"), + var gen1faultGen3 = warning.new(msg: " -GEN 1..............OFF", colour: "c"), + + # ESS TR FAULT + var essTRFault = warning.new(msg: "ELEC ESS TR FAULT ", colour: "a", aural: 1, light: 1, isMainMsg: 1), # GEN 2 FAULT var gen2fault = warning.new(msg: "ELEC GEN 2 FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), - var gen2faultGen = warning.new(msg: "-GEN 2......OFF THEN ON", colour: "c"), + var gen2faultGen = warning.new(msg: " -GEN 2......OFF THEN ON", colour: "c"), var gen2faultGen2 = warning.new(msg: " •IF UNSUCCESSFUL :", colour: "w"), - var gen2faultGen3 = warning.new(msg: "-GEN 2..............OFF", colour: "c"), + var gen2faultGen3 = warning.new(msg: " -GEN 2..............OFF", colour: "c"), # APU GEN FAULT var apuGenfault = warning.new(msg: "ELEC APU GEN FAULT", colour: "a", aural: 1, light: 1, isMainMsg: 1), - var apuGenfaultGen = warning.new(msg: "-APU GEN....OFF THEN ON", colour: "c"), + var apuGenfaultGen = warning.new(msg: " -APU GEN....OFF THEN ON", colour: "c"), var apuGenfaultGen2 = warning.new(msg: " •IF UNSUCCESSFUL :", colour: "w"), - var apuGenfaultGen3 = warning.new(msg: "-APU GEN............OFF", colour: "c"), + var apuGenfaultGen3 = warning.new(msg: " -APU GEN............OFF", colour: "c"), + + # GEN OFF + var gen1Off = warning.new(msg: "ELEC GEN 1 OFF ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var gen2Off = warning.new(msg: "ELEC GEN 2 OFF ", colour: "a", aural: 1, light: 1, isMainMsg: 1), # APU GEN FAULT var acEssBusAltn = warning.new(msg: "ELEC AC ESS BUS ALTN", colour: "a", aural: 1, light: 1, isMainMsg: 1), @@ -551,6 +558,24 @@ var warnings = std.Vector.new([ var fcuFault2 = warning.new(msg: "AUTO FLT FCU 2 FAULT", colour: "a", isMainMsg: 1), var fcuFault2Baro = warning.new(msg: " -BARO REF.......X CHECK", colour: "c"), + # FUEL + var wingLoLvl = warning.new(msg: "FUEL L+R WING TK LO LVL", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var wingLoLvlManMode = warning.new(msg: " -FUEL MODE SEL......MAN", colour: "c"), + var wingLoLvlPumpL1 = warning.new(msg: " -L TK PUMP 1.........ON", colour: "c"), + var wingLoLvlPumpL2 = warning.new(msg: " -L TK PUMP 2.........ON", colour: "c"), + var wingLoLvlPumpC1 = warning.new(msg: " -CTR TK PUMP 1.......ON", colour: "c"), + var wingLoLvlPumpR1 = warning.new(msg: " -R TK PUMP 1.........ON", colour: "c"), + var wingLoLvlPumpR2 = warning.new(msg: " -R TK PUMP 2.........ON", colour: "c"), + var wingLoLvlPumpC2 = warning.new(msg: " -CTR TK PUMP 2.......ON", colour: "c"), + var wingLoLvlLeak = warning.new(msg: " •IF NO FUEL LEAK: ", colour: "w"), + var wingLoLvlXFeed = warning.new(msg: " -FUEL X FEED.........ON", colour: "c"), + var wingLoLvlGrav = warning.new(msg: " •IF GRVTY FEED: ", colour: "w"), + var wingLoLvlXFeedOff = warning.new(msg: " -FUEL X FEED........OFF", colour: "c"), + + var ctrPumpsOff = warning.new(msg: "FUEL CTR TK PUMPS OFF ", colour: "a", aural: 1, light: 1, isMainMsg: 1), + var ctrPumpsOffPump1 = warning.new(msg: " -CTR TK PUMP 1.......ON", colour: "c"), + var ctrPumpsOffPump2 = warning.new(msg: " -CTR TK PUMP 2.......ON", colour: "c"), + # APU shutdown var apuEmerShutdown = warning.new(msg: "APU EMER SHUT DOWN", colour: "a", aural: 1, light: 1, isMainMsg: 1), var apuEmerShutdownMast = warning.new(msg: " -MASTER SW..........OFF", colour: "c"), @@ -734,9 +759,11 @@ var leftmemos = std.Vector.new([ var strobe_lt_off = warning.new(msg: "STROBE LT OFF" ), var outr_tk_fuel_xfrd = warning.new(msg: "OUTR TK FUEL XFRD" ), var fob_3T = warning.new(msg: "FOB BELOW 3T" ), + var fob_66L = warning.new(msg: "FOB BELOW 6600LBS" ), var gpws_flap_mode_off = warning.new(msg: "GPWS FLAP MODE OFF" ), var atc_datalink_stby = warning.new(msg: "ATC DATALINK STBY" ), # Not yet implemented var company_datalink_stby = warning.new(msg: "COMPANY DATALINK STBY"), # Not yet implemented + var acars_stby = warning.new(msg: "ACARS STBY" ), # Not yet implemented ]); # Right E/WD diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index f2fb337f..c683e0e0 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -348,27 +348,6 @@ 1.0 - - Timer for the ECAM system - /ECAM/warnings/logic/gen-1-fault-set - 120 - 0.1818 - - - - Timer for the ECAM system - /ECAM/warnings/logic/gen-2-fault-set - 120 - 0.1818 - - - - Timer for the ECAM system - /ECAM/warnings/logic/apu-gen-fault-set - 120 - 0.2 - - Timer for the ECAM system /ECAM/warnings/logic/apu-gen-fault-reset @@ -1531,6 +1510,13 @@ + + Timer for the ECAM system + /ECAM/warnings/logic/gen-1-fault-set + 120 + 0.1818 + + @@ -1592,6 +1578,13 @@ + + Timer for the ECAM system + /ECAM/warnings/logic/gen-2-fault-set + 120 + 0.1818 + + @@ -1652,6 +1645,13 @@ + + Timer for the ECAM system + /ECAM/warnings/logic/apu-gen-fault-set + 120 + 0.2 + + @@ -1693,6 +1693,93 @@ + + /controls/electrical/switches/gen-1 + 0.2 + 120 + + + + /controls/electrical/switches/gen-2 + 0.2 + 120 + + + + + + /ECAM/warning-phase eq 6 + + + + + /ECAM/warnings/logic/elec/gen-off-60-sec + 0.01666666666 + 120 + + + + + + /ECAM/warning-phase ne 6 + /engines/engine[0]/state eq 3 + + + + + /ECAM/warnings/logic/elec/gen-1-off-60-sec-2 + 0.01666666666 + 120 + + + + + + /ECAM/warning-phase ne 6 + /engines/engine[1]/state eq 3 + + + + + /ECAM/warnings/logic/elec/gen-2-off-60-sec-2 + 0.01666666666 + 120 + + + + + + /ECAM/warnings/logic/elec/gen-1-pb eq 0 + /ECAM/warnings/flipflop/gen-1-fault eq 0 + /controls/electrical/switches/idg-1-disc eq 1 + + /ECAM/warnings/logic/elec/gen-off-60-sec-output eq 1 + /ECAM/warnings/logic/elec/gen-1-off-60-sec-2-output eq 1 + + /ECAM/warning-phase eq 6 + /ECAM/warnings/logic/gen-1-2-no-oper eq 1 + + + + + + + + + /ECAM/warnings/logic/elec/gen-2-pb eq 0 + /ECAM/warnings/flipflop/gen-2-fault eq 0 + /controls/electrical/switches/idg-2-disc eq 1 + + /ECAM/warnings/logic/elec/gen-off-60-sec-output eq 1 + /ECAM/warnings/logic/elec/gen-2-off-60-sec-2-output eq 1 + + /ECAM/warning-phase eq 6 + /ECAM/warnings/logic/gen-1-2-no-oper eq 1 + + + + + @@ -1710,6 +1797,22 @@ + + + + + /ECAM/warnings/flipflop/gen-1-fault eq 1 + /controls/electrical/switches/idg-1-disc eq 0 + /ECAM/warnings/logic/elec/gen-1-off eq 1 + + + /ECAM/warnings/flipflop/gen-2-fault eq 1 + /controls/electrical/switches/idg-2-disc eq 0 + /ECAM/warnings/logic/elec/gen-2-off eq 1 + + + + @@ -2109,13 +2212,6 @@ - - Timer for the ECAM system - /ECAM/phases/timer/eng1idle - 120 - 0.033 - - @@ -3717,6 +3813,42 @@ + + + + + + /controls/fuel/switches/pump-center-1 eq 0 + /controls/fuel/switches/pump-center-2 eq 0 + /controls/fuel/switches/center-mode eq 1 + /systems/fuel/quantity/center-low eq 0 + /ECAM/warning-phase eq 6 + + + + + + /ECAM/warnings/fuel/center-pumps-off + 120 + 0.1 + + + + + + /systems/fuel/quantity/left-wing-inner-low eq 1 + /systems/fuel/quantity/right-wing-inner-low eq 1 + + + + + /ECAM/warnings/fuel/lo-level-l-r + 120 + 0.03333333333 + + + + + + Aircraft/A320-family/Nasal/Displays/projection.nas + Aircraft/A320-family/Nasal/Displays/traffic.nas + Aircraft/A320-family/Models/Instruments/PFD/PFD.nas diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 809943de..d1e73e51 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -338,6 +338,41 @@ setlistener("sim/signals/fdm-initialized", func { ND_2 = canvas_ND_2.new(group_nd2); ND_2_test = canvas_ND_2_test.new(group_nd2_test, "Aircraft/A320-family/Models/Instruments/Common/res/du-test.svg"); + setlistener("/instrumentation/efis[0]/inputs/range-nm", func() { + canvas_nd.ND_1.NDCpt.trafficLayer.camera.range = getprop("/instrumentation/efis[0]/inputs/range-nm"); + }, 1, 0); + + setlistener("/instrumentation/efis[1]/inputs/range-nm", func() { + canvas_nd.ND_2.NDFo.trafficLayer.camera.range = getprop("/instrumentation/efis[1]/inputs/range-nm"); + }, 1, 0); + + setlistener("/instrumentation/efis[0]/inputs/nd-centered", func() { + canvas_nd.ND_1.NDCpt.trafficLayer.camera.screenRange = getprop("/instrumentation/efis[0]/inputs/nd-centered") ? 436.8545 : 710; + canvas_nd.ND_1.NDCpt.trafficLayer.camera.screenCY = getprop("/instrumentation/efis[0]/inputs/nd-centered") ? 512 : 850; + }, 1, 0); + + setlistener("/instrumentation/efis[1]/inputs/nd-centered", func() { + canvas_nd.ND_2.NDFo.trafficLayer.camera.screenRange = getprop("/instrumentation/efis[1]/inputs/nd-centered") ? 436.8545 : 710; + canvas_nd.ND_2.NDFo.trafficLayer.camera.screenCY = getprop("/instrumentation/efis[1]/inputs/nd-centered") ? 512 : 850; + }, 1, 0); + + setlistener("/instrumentation/tcas/inputs/mode", func() { + if (getprop("/instrumentation/efis[1]/nd/canvas-display-mode") != "PLAN") { + canvas_nd.ND_1.NDCpt.trafficGroup.setVisible(pts.Instrumentation.TCAS.Inputs.mode.getValue() >= 2 ? 1 : 0); + } + if (getprop("/instrumentation/efis[1]/nd/canvas-display-mode") != "PLAN") { + canvas_nd.ND_2.NDFo.trafficGroup.setVisible(pts.Instrumentation.TCAS.Inputs.mode.getValue() >= 2 ? 1 : 0); + } + }, 1, 0); + + setlistener("/instrumentation/efis[0]/nd/canvas-display-mode", func() { + canvas_nd.ND_1.NDCpt.trafficGroup.setVisible(getprop("/instrumentation/efis[0]/nd/canvas-display-mode") == "PLAN" ? 0 : 1); + }, 1, 0); + + setlistener("/instrumentation/efis[1]/nd/canvas-display-mode", func() { + canvas_nd.ND_2.NDFo.trafficGroup.setVisible(getprop("/instrumentation/efis[1]/nd/canvas-display-mode") == "PLAN" ? 0 : 1); + }, 1, 0); + nd_update.start(); if (getprop("systems/acconfig/options/nd-rate") > 1) { rateApply(); diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 534f4e5a..7778f57c 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -234,6 +234,17 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update event_handler(); } # foreach layer + me.mapCamera = traffic.Camera.new({ + range: 20, + screenRange: 436.8545, + screenCX: 512, + screenCY: 512, + }); + me.trafficGroup = me.nd.createChild("group"); + me.trafficLayer = traffic.TrafficLayer.new(me.mapCamera, me.trafficGroup); + me.trafficLayer.start(); + me.trafficGroup.set("z-index", -1); + #print("navdisplay.mfd:ND layer setup completed"); # TODO: move this to RTE.lcontroller ? @@ -391,6 +402,13 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec else me.map.setTranslation(512,824); } + me.mapCamera.repositon(geo.aircraft_position(), me.aircraft_source.get_hdg_tru()); + me.pos = props.globals.getNode("position"); + me.trafficLayer.setRefAlt(me.pos.getValue("altitude-ft")); + if (me.trafficGroup.getVisible()) { + me.trafficLayer.update(); + me.trafficLayer.redraw(); + } var vor1_path = "/instrumentation/nav[2]"; var vor2_path = "/instrumentation/nav[3]"; var dme1_path = "/instrumentation/dme[2]"; diff --git a/Nasal/Displays/projection.nas b/Nasal/Displays/projection.nas new file mode 100644 index 00000000..722e2771 --- /dev/null +++ b/Nasal/Displays/projection.nas @@ -0,0 +1,41 @@ +# Projection-related helper functions for the MFD maps + +var Camera = { + new: func(options) { + var m = { + parents: [Camera], + + camGeo: options['camGeo'] or geo.aircraft_position(), + camHdg: options['camHdg'] or 0, + range: options['range'] or 10.0, + screenRange: options['screenRange'] or 256.0, + screenCX: options['screenCX'] or options['screenRange'] or 256.0, + screenCY: options['screenCY'] or options['screenRange'] or 256.0, + }; + return m; + }, + + setRange: func(range) { + me.range = range; + }, + + repositon: func(geo, hdg) { + me.camGeo = geo; + me.camHdg = hdg; + }, + + project: func(targetGeo) { + var dist = me.camGeo.distance_to(targetGeo) * M2NM; + var bearing = me.camGeo.course_to(targetGeo) - me.camHdg; + return me.projectDistBearing(dist, bearing); + }, + + projectDistBearing: func(dist, bearing) { + var bearingRad = bearing * D2R; + var tx = math.sin(bearingRad) * dist; + var ty = -math.cos(bearingRad) * dist; + var x = tx * me.screenRange / me.range + me.screenCX; + var y = ty * me.screenRange / me.range + me.screenCY; + return [x, y]; + }, +}; diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas new file mode 100644 index 00000000..da3df091 --- /dev/null +++ b/Nasal/Displays/traffic.nas @@ -0,0 +1,279 @@ +# Traffic layer +# + +var colorByLevel = { + # 0: other + 0: [0.8,0.8,0.8], + # 1: proximity + 1: [0.8,0.8,0.8], + # 2: traffic advisory (TA) + 2: [1,0.75,0], + # 3: resolution advisory (RA) + 3: [1,0,0], +}; + +var doFill = { + 0: 0, + 1: 1, + 2: 1, + 3: 1, +}; + +var colorDefault = [0.8,0.8,0.8]; + +var drawBlip = func(elem, threatLvl) { + if (threatLvl == 3) { + # resolution advisory + elem.reset() + .moveTo(-17,-17) + .horiz(34) + .vert(34) + .horiz(-34) + .close(); + } + elsif (threatLvl == 2) { + # traffic advisory + elem.reset() + .moveTo(-17,0) + .arcSmallCW(17,17,0,34,0) + .arcSmallCW(17,17,0,-34,0); + } + elsif (threatLvl == 1) { + # proximate traffic + elem.reset() + .moveTo(-14,0) + .lineTo(0,-17) + .lineTo(14,0) + .lineTo(0,17) + .close(); + } + else { + # other traffic + elem.reset() + .moveTo(-14,0) + .lineTo(0,-17) + .lineTo(14,0) + .lineTo(0,17) + .close(); + } +}; + + +var TrafficLayer = { + new: func(camera, group) { + var m = { + parents: [TrafficLayer], + camera: camera, + refAlt: 0, + group: group, + items: {}, + updateKeys: [], + addListener: nil, + delListener: nil, + }; + return m; + }, + + makeElems: func () { + if (me.group == nil) return nil; + var elems = {}; + elems['master'] = me.group.createChild('group'); + elems['blip'] = elems.master.createChild('path') + .setStrokeLineWidth(0); + elems['text'] = elems.master.createChild('text') + .setDrawMode(canvas.Text.TEXT) + .setText(sprintf("0")) + .setFont("LiberationFonts/LiberationSans-Regular.ttf") + .setColor(1,1,1) + .setFontSize(20) + .setAlignment("center-center"); + elems['master'].hide(); + elems['arrowUp'] = elems.master.createChild("text") + .setDrawMode(canvas.Text.TEXT) + .setText(sprintf("↑")) + .setFont("LiberationFonts/LiberationSans-Regular.ttf") + .setColor(1,1,1) + .setFontSize(40) + .setTranslation(16, 0) + .setAlignment("left-center"); + elems['arrowDown'] = elems.master.createChild("text") + .setDrawMode(canvas.Text.TEXT) + .setText(sprintf("↓")) + .setFont("LiberationFonts/LiberationSans-Regular.ttf") + .setColor(1,1,1) + .setFontSize(40) + .setTranslation(16, 0) + .setAlignment("left-center"); + return elems; + }, + + start: func() { + me.stop(); + var self = me; + me.addListener = setlistener('/ai/models/model-added', func(changed, listen, mode, is_child) { + var path = changed.getValue(); + if (path == nil) return; + #printf("ADD: %s", path); + var masterProp = props.globals.getNode(path); + var prop = { + 'master': masterProp, + }; + if (me.items[path] == nil) { + me.items[path] = { + prop: prop, + elems: me.makeElems(), + data: {'threatLevel': -2}, + }; + } + else { + me.items[path].prop = prop; + me.items[path].data = {'threatLevel': -2}; + } + }, 1, 1); + me.delListener = setlistener('/ai/models/model-removed', func(changed, listen, mode, is_child) { + var path = changed.getValue(); + if (path == nil) return; + #printf("DEL: %s", path); + if (me.items[path] == nil) return; + if (me.items[path] != nil) { + me.items[path].prop = nil; + me.items[path].elems.master.hide(); + me.items[path].data = {}; + } + }, 1, 1); + }, + + stop: func() { + if (me.addListener != nil) { + removelistener(me.addListener); + me.addListener = nil; + } + if (me.delListener != nil) { + removelistener(me.delListener); + me.delListener = nil; + } + me.items = {}; + if (me.group != nil) { + me.group.removeAllChildren(); + } + }, + + update: func() { + if (size(me.updateKeys) == 0) { + me.updateKeys = keys(me.items); + } + var path = pop(me.updateKeys); + foreach (var path; keys(me.items)) { + me.updateItem(path); + } + }, + + redraw: func() { + foreach (var path; keys(me.items)) { + me.redrawItem(me.items[path]); + } + }, + + setRefAlt: func(alt) { + me.refAlt = alt; + }, + + updateItem: func(path) { + var item = me.items[path]; + if (item == nil) return; + if (item.prop == nil) { + if (item.elems != nil) { + item.elems.master.hide(); + } + return; + } + + if (item.prop['lat'] == nil) { + item.prop['lat'] = item.prop.master.getNode('position/latitude-deg'); + } + if (item.prop['lon'] == nil) { + item.prop['lon'] = item.prop.master.getNode('position/longitude-deg'); + } + if (item.prop['alt'] == nil) { + item.prop['alt'] = item.prop.master.getNode('position/altitude-ft'); + } + if (item.prop['threatLevel'] == nil) { + item.prop['threatLevel'] = item.prop.master.getNode('tcas/threat-level'); + } + if (item.prop['callsign'] == nil) { + item.prop['callsign'] = item.prop.master.getNode('callsign'); + } + if (item.prop['vspeed'] == nil) { + item.prop['vspeed'] = item.prop.master.getNode('velocities/vertical-speed-fps'); + } + + # this item has a prop associated with it + if (item.elems == nil) { + item.elems = me.makeElems(); + } + var oldThreatLevel = item.data['threatLevel']; + foreach (var k; ['lat', 'lon', 'alt', 'threatLevel', 'callsign', 'vspeed']) { + if (item.prop[k] != nil) { + item.data[k] = item.prop[k].getValue(); + } + } + if (oldThreatLevel != item.data['threatLevel']) { + item.data['threatLevelDirty'] = 1; + } + }, + + redrawItem: func (item) { + #debug.dump("REDRAW ", item.data); + var lat = item.data['lat']; + var lon = item.data['lon']; + var alt = item.data['alt']; + var vspeed = item.data['vspeed']; + var threatLevelDirty = item.data['threatLevelDirty']; + if (lat != nil and lon != nil and vspeed != nil) { + var coords = geo.Coord.new(); + coords.set_latlon(lat, lon); + var (x, y) = me.camera.project(coords); + item.elems.master.setTranslation(x, y); + #printf("%f %f", x, y); + if (threatLevelDirty) { + #printf('%s THREAT LVL: %i', item.data['callsign'] or '???', item.data['threatLevel']); + var threatLevel = item.data['threatLevel']; + #debug.dump(item.data, threatLevel); + drawBlip(item.elems.blip, threatLevel); + var rgb = colorByLevel[threatLevel]; + if (rgb == nil) rgb = colorDefault; + var color = canvas._getColor(rgb); + var (r, g, b) = rgb; + item.elems.blip.setColorFill(r, g, b); + item.elems.text.setColor(r, g, b); + item.elems.arrowUp.setColor(r, g, b); + item.elems.arrowDown.setColor(r, g, b); + item.elems.master.set('z-index', threatLevel + 2); + item.data['threatLevelDirty'] = 0; + } + + item.elems.arrowUp.setVisible(vspeed * 60 > 500); + item.elems.arrowDown.setVisible(vspeed * 60 < -500); + + var altDiff100 = ((item.data['alt'] or me.refAlt) - me.refAlt) / 100; + item.elems.text.setVisible(math.abs(altDiff100) > 0.5); + item.elems.text.setText(sprintf("%+02.0f", altDiff100)); + if (altDiff100 < 0) { + item.elems.text.setTranslation(0, 30); + item.elems.arrowUp.setTranslation(16, 30); + item.elems.arrowDown.setTranslation(16, 30); + } + else { + item.elems.text.setTranslation(0, -30); + item.elems.arrowUp.setTranslation(16, -30); + item.elems.arrowDown.setTranslation(16, -30); + } + + item.elems.master.show(); + } + else { + item.elems.master.hide(); + } + }, + +}; From 622e1ac4aee93aadbd0ee88cff87bbe521d37f1f Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Fri, 5 Feb 2021 11:17:35 +0000 Subject: [PATCH 042/124] Bugfix startup from cold and dark --- Nasal/ECAM/ECAM-logic.nas | 6 +++++- revision.txt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 15c6177e..2a534c32 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -1614,7 +1614,11 @@ var messages_priority_2 = func { } # SAT ABOVE FLEX TEMP - _SATval = dmc.DMController.DMCs[1].outputs[4].getValue(); + if (dmc.DMController.DMCs[1] != nil and dmc.DMController.DMCs[1].outputs[4] != nil) { + _SATval = dmc.DMController.DMCs[1].outputs[4].getValue() or nil; + } else { + _SATval = nil; + } if (satAbvFlexTemp.clearFlag == 0 and phaseVar2 == 2 and fadec.Thrust.limFlex.getValue() and _SATval != nil and _SATval > fmgc.FMGCNodes.flexTemp.getValue() and !warningNodes.Logic.thrLeversNotSet.getValue()) { satAbvFlexTemp.active = 1; diff --git a/revision.txt b/revision.txt index abc4eff6..801f1801 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -46 \ No newline at end of file +47 \ No newline at end of file From c9c9d9365230493cecf7558e4e99432ea5b9679e Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 6 Feb 2021 01:02:15 +0100 Subject: [PATCH 043/124] A few optimizations and more close to airbus tcas --- Nasal/Displays/traffic.nas | 53 ++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index da3df091..04fa4970 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -85,7 +85,7 @@ var TrafficLayer = { .setText(sprintf("0")) .setFont("LiberationFonts/LiberationSans-Regular.ttf") .setColor(1,1,1) - .setFontSize(20) + .setFontSize(32) .setAlignment("center-center"); elems['master'].hide(); elems['arrowUp'] = elems.master.createChild("text") @@ -93,16 +93,16 @@ var TrafficLayer = { .setText(sprintf("↑")) .setFont("LiberationFonts/LiberationSans-Regular.ttf") .setColor(1,1,1) - .setFontSize(40) - .setTranslation(16, 0) + .setFontSize(50) + .setTranslation(16, 2) .setAlignment("left-center"); elems['arrowDown'] = elems.master.createChild("text") .setDrawMode(canvas.Text.TEXT) .setText(sprintf("↓")) .setFont("LiberationFonts/LiberationSans-Regular.ttf") .setColor(1,1,1) - .setFontSize(40) - .setTranslation(16, 0) + .setFontSize(50) + .setTranslation(16, 2) .setAlignment("left-center"); return elems; }, @@ -205,6 +205,7 @@ var TrafficLayer = { } if (item.prop['vspeed'] == nil) { item.prop['vspeed'] = item.prop.master.getNode('velocities/vertical-speed-fps'); + item.prop['tas'] = item.prop.master.getNode('velocities/true-airspeed-kt'); } # this item has a prop associated with it @@ -212,7 +213,7 @@ var TrafficLayer = { item.elems = me.makeElems(); } var oldThreatLevel = item.data['threatLevel']; - foreach (var k; ['lat', 'lon', 'alt', 'threatLevel', 'callsign', 'vspeed']) { + foreach (var k; ['lat', 'lon', 'alt', 'threatLevel', 'callsign', 'vspeed', 'tas']) { if (item.prop[k] != nil) { item.data[k] = item.prop[k].getValue(); } @@ -228,8 +229,23 @@ var TrafficLayer = { var lon = item.data['lon']; var alt = item.data['alt']; var vspeed = item.data['vspeed']; + var tas = item.data['tas']; var threatLevelDirty = item.data['threatLevelDirty']; + if (lat != nil and lon != nil and vspeed != nil) { + + if (tas<80) { # flying airplane only + item.elems.master.hide(); + return; + } + + var altDiff100 = ((item.data['alt'] or me.refAlt) - me.refAlt) / 100; + + if (altDiff100 > 99 or altDiff100 < -99) { # check TCAS vertical range + item.elems.master.hide(); + return; + } + var coords = geo.Coord.new(); coords.set_latlon(lat, lon); var (x, y) = me.camera.project(coords); @@ -252,26 +268,25 @@ var TrafficLayer = { item.data['threatLevelDirty'] = 0; } - item.elems.arrowUp.setVisible(vspeed * 60 > 500); - item.elems.arrowDown.setVisible(vspeed * 60 < -500); + var spd = vspeed * 60; + item.elems.arrowUp.setVisible(spd > 500); + item.elems.arrowDown.setVisible(spd < -500); - var altDiff100 = ((item.data['alt'] or me.refAlt) - me.refAlt) / 100; item.elems.text.setVisible(math.abs(altDiff100) > 0.5); - item.elems.text.setText(sprintf("%+02.0f", altDiff100)); - if (altDiff100 < 0) { - item.elems.text.setTranslation(0, 30); - item.elems.arrowUp.setTranslation(16, 30); - item.elems.arrowDown.setTranslation(16, 30); + item.elems.text.setText(sprintf("%+02.0f ", altDiff100)); + if (altDiff100 <= 0) { + item.elems.text.setTranslation(0, 40); + #item.elems.arrowUp.setTranslation(16, 30); + #item.elems.arrowDown.setTranslation(16, 30); } else { item.elems.text.setTranslation(0, -30); - item.elems.arrowUp.setTranslation(16, -30); - item.elems.arrowDown.setTranslation(16, -30); + #item.elems.arrowUp.setTranslation(16, -30); + #item.elems.arrowDown.setTranslation(16, -30); } - item.elems.master.show(); - } - else { + + } else { item.elems.master.hide(); } }, From 730345c732b6feab868c4a60e1d71ea95aca6c2b Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 6 Feb 2021 11:29:21 +0100 Subject: [PATCH 044/124] first step for code optimization --- Nasal/Displays/traffic.nas | 103 +++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 32 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 04fa4970..3012fcf8 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -67,6 +67,8 @@ var TrafficLayer = { refAlt: 0, group: group, items: {}, + sorted: {}, + values: {}, updateKeys: [], addListener: nil, delListener: nil, @@ -114,6 +116,7 @@ var TrafficLayer = { var path = changed.getValue(); if (path == nil) return; #printf("ADD: %s", path); + me.values[path] = nil; var masterProp = props.globals.getNode(path); var prop = { 'master': masterProp, @@ -128,12 +131,13 @@ var TrafficLayer = { else { me.items[path].prop = prop; me.items[path].data = {'threatLevel': -2}; - } + } }, 1, 1); me.delListener = setlistener('/ai/models/model-removed', func(changed, listen, mode, is_child) { var path = changed.getValue(); if (path == nil) return; #printf("DEL: %s", path); + me.values[path] = nil; if (me.items[path] == nil) return; if (me.items[path] != nil) { me.items[path].prop = nil; @@ -158,7 +162,17 @@ var TrafficLayer = { } }, + + nxtupdatetime: 0, + update: func() { + + #var _tm = systime(); + #if (me.lastupdatetime != 0) { + # if (_tm 99 or altDiff100 < -99) { # check TCAS vertical range - item.elems.master.hide(); + me.values[path] = {visible: 0}; return; } + var _val = {visible:1, lat:_lat, lon:_lon}; + + var spd = vspeed * 60; + _val.arrowup = (spd > 500); + _val.arrowdown = (spd < -500); + + if (math.abs(altDiff100) > 0.5) { + _val.text = sprintf("%+03d ", altDiff100); + } else { + _val.text = ""; + } + + _val.textpy = (altDiff100 <= 0) ? 40 : -30; + + me.values[path] = _val; + + } + + }, + + redrawItem: func (item,val) { + #debug.dump("REDRAW ", item.data); + + #var lat = item.data['lat']; + #var lon = item.data['lon']; + #var alt = item.data['alt']; + #var vspeed = item.data['vspeed']; + #var tas = item.data['tas']; + #var threatLevelDirty = item.data['threatLevelDirty']; + + if (val != nil and val.visible == 1) { + + var lat = val.lat; + var lon = val.lon; + var coords = geo.Coord.new(); coords.set_latlon(lat, lon); var (x, y) = me.camera.project(coords); item.elems.master.setTranslation(x, y); #printf("%f %f", x, y); - if (threatLevelDirty) { + if (item.data['threatLevelDirty']) { #printf('%s THREAT LVL: %i', item.data['callsign'] or '???', item.data['threatLevel']); var threatLevel = item.data['threatLevel']; #debug.dump(item.data, threatLevel); @@ -268,26 +315,18 @@ var TrafficLayer = { item.data['threatLevelDirty'] = 0; } - var spd = vspeed * 60; - item.elems.arrowUp.setVisible(spd > 500); - item.elems.arrowDown.setVisible(spd < -500); + item.elems.arrowUp.setVisible(val.arrowup); + item.elems.arrowDown.setVisible(val.arrowdown); - item.elems.text.setVisible(math.abs(altDiff100) > 0.5); - item.elems.text.setText(sprintf("%+02.0f ", altDiff100)); - if (altDiff100 <= 0) { - item.elems.text.setTranslation(0, 40); - #item.elems.arrowUp.setTranslation(16, 30); - #item.elems.arrowDown.setTranslation(16, 30); - } - else { - item.elems.text.setTranslation(0, -30); - #item.elems.arrowUp.setTranslation(16, -30); - #item.elems.arrowDown.setTranslation(16, -30); - } + #item.elems.text.setVisible(math.abs(altDiff100) > 0.5); + item.elems.text.setText(val.text); + item.elems.text.setTranslation(0, val.textpy); item.elems.master.show(); } else { + item.elems.master.hide(); + } }, From 9355d38c46415492a45646b0e1e047ed3c6fc6e6 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 6 Feb 2021 11:02:54 +0000 Subject: [PATCH 045/124] TCAS --> ABV / BLW work --- A320-main.xml | 2 + Models/FlightDeck/a320.flightdeck.xml | 74 +++++++++++++++++++++++++++ Nasal/Displays/traffic.nas | 24 +++++++-- 3 files changed, 96 insertions(+), 4 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index 97c14b71..618b15d7 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -776,6 +776,8 @@ 0 0 + 0 + 0 0 diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index df18e859..cbdbc318 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -892,7 +892,81 @@ + + + rotate + atc_abv + 35 + 0 + + atc_abv.axis + + controls/atc/abv-blw + + + pick + atc_abv + + + + + property-cycle + controls/atc/abv-blw + -1 + 0 + 1 + + + + + + + property-cycle + controls/atc/abv-blw + 1 + 0 + -1 + + + + + + rotate + atc_thrt + -30 + 0 + + atc_thrt.axis + + controls/atc/thrt-all + + + + pick + atc_thrt + + + + + property-cycle + controls/atc/thrt-all + 0 + 1 + + + + + + + property-cycle + controls/atc/thrt-all + 0 + 1 + + + + PFD1 diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 04fa4970..3426d96a 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -1,5 +1,7 @@ # Traffic layer -# + +var ATCSwitchAbvBlw = props.globals.getNode("/controls/atc/abv-blw"); +var ATCSwitchThrtAll = props.globals.getNode("/controls/atc/thrt-all"); var colorByLevel = { # 0: other @@ -218,13 +220,20 @@ var TrafficLayer = { item.data[k] = item.prop[k].getValue(); } } - if (oldThreatLevel != item.data['threatLevel']) { + var newThrtAll = ATCSwitchThrtAll.getValue(); + if (oldThreatLevel != item.data['threatLevel'] or newThrtAll != item.data['thrtAllStore']) { item.data['threatLevelDirty'] = 1; + item.data['thrtAllStore'] = newThrtAll; } }, redrawItem: func (item) { #debug.dump("REDRAW ", item.data); + if (item.data['thrtAllStore'] == 1) { + item.elems.master.hide(); + return; + } + var lat = item.data['lat']; var lon = item.data['lon']; var alt = item.data['alt']; @@ -240,8 +249,15 @@ var TrafficLayer = { } var altDiff100 = ((item.data['alt'] or me.refAlt) - me.refAlt) / 100; - - if (altDiff100 > 99 or altDiff100 < -99) { # check TCAS vertical range + var top = 27; + var bottom = -27; + if (ATCSwitchAbvBlw.getValue() == -1) { + top = 99; + } + if (ATCSwitchAbvBlw.getValue() == 1) { + bottom = -99; + } + if (altDiff100 > top or altDiff100 < bottom) { # check TCAS vertical range item.elems.master.hide(); return; } From 2dc0c73c85d024970bfd1abced0da0736f69455c Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 6 Feb 2021 11:41:10 +0000 Subject: [PATCH 046/124] Initialize property --- A320-main.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/A320-main.xml b/A320-main.xml index 618b15d7..8a3f3360 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -652,6 +652,14 @@ 0 + + + 0 + 0 + 0 + 0 + + From 2cfd79582b530fdc38c942a6107a232344ff6303 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 6 Feb 2021 16:53:22 +0100 Subject: [PATCH 047/124] optimized tcas - refresh timed at 500ms --- Nasal/Displays/traffic.nas | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 3012fcf8..ec815755 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -167,11 +167,11 @@ var TrafficLayer = { update: func() { - #var _tm = systime(); - #if (me.lastupdatetime != 0) { - # if (_tm 500); _val.arrowdown = (spd < -500); if (math.abs(altDiff100) > 0.5) { - _val.text = sprintf("%+03d ", altDiff100); + _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 } else { _val.text = ""; } - _val.textpy = (altDiff100 <= 0) ? 40 : -30; + _val.textpy = (altDiff100 < 0) ? 34 : -30; me.values[path] = _val; @@ -281,13 +280,6 @@ var TrafficLayer = { redrawItem: func (item,val) { #debug.dump("REDRAW ", item.data); - #var lat = item.data['lat']; - #var lon = item.data['lon']; - #var alt = item.data['alt']; - #var vspeed = item.data['vspeed']; - #var tas = item.data['tas']; - #var threatLevelDirty = item.data['threatLevelDirty']; - if (val != nil and val.visible == 1) { var lat = val.lat; @@ -298,7 +290,7 @@ var TrafficLayer = { var (x, y) = me.camera.project(coords); item.elems.master.setTranslation(x, y); #printf("%f %f", x, y); - if (item.data['threatLevelDirty']) { + if (val.dirty) { #printf('%s THREAT LVL: %i', item.data['callsign'] or '???', item.data['threatLevel']); var threatLevel = item.data['threatLevel']; #debug.dump(item.data, threatLevel); @@ -313,12 +305,12 @@ var TrafficLayer = { item.elems.arrowDown.setColor(r, g, b); item.elems.master.set('z-index', threatLevel + 2); item.data['threatLevelDirty'] = 0; + val.dirty = 0; } item.elems.arrowUp.setVisible(val.arrowup); item.elems.arrowDown.setVisible(val.arrowdown); - - #item.elems.text.setVisible(math.abs(altDiff100) > 0.5); + item.elems.text.setText(val.text); item.elems.text.setTranslation(0, val.textpy); item.elems.master.show(); From 87f26de0ff9a4c0fb6bddf1f38294c0811fc519d Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 7 Feb 2021 11:48:32 +0100 Subject: [PATCH 048/124] Manual merge from legoboy code --- Nasal/Displays/traffic.nas | 127 ++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 71 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index ec815755..3426d96a 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -1,5 +1,7 @@ # Traffic layer -# + +var ATCSwitchAbvBlw = props.globals.getNode("/controls/atc/abv-blw"); +var ATCSwitchThrtAll = props.globals.getNode("/controls/atc/thrt-all"); var colorByLevel = { # 0: other @@ -67,8 +69,6 @@ var TrafficLayer = { refAlt: 0, group: group, items: {}, - sorted: {}, - values: {}, updateKeys: [], addListener: nil, delListener: nil, @@ -116,7 +116,6 @@ var TrafficLayer = { var path = changed.getValue(); if (path == nil) return; #printf("ADD: %s", path); - me.values[path] = nil; var masterProp = props.globals.getNode(path); var prop = { 'master': masterProp, @@ -131,13 +130,12 @@ var TrafficLayer = { else { me.items[path].prop = prop; me.items[path].data = {'threatLevel': -2}; - } + } }, 1, 1); me.delListener = setlistener('/ai/models/model-removed', func(changed, listen, mode, is_child) { var path = changed.getValue(); if (path == nil) return; #printf("DEL: %s", path); - me.values[path] = nil; if (me.items[path] == nil) return; if (me.items[path] != nil) { me.items[path].prop = nil; @@ -162,17 +160,7 @@ var TrafficLayer = { } }, - - nxtupdatetime: 0, - update: func() { - - var _tm = systime(); - if (me.nxtupdatetime != 0) { - if (_tm 99 or altDiff100 < -99) { # check TCAS vertical range - me.values[path] = {visible: 0}; + var altDiff100 = ((item.data['alt'] or me.refAlt) - me.refAlt) / 100; + var top = 27; + var bottom = -27; + if (ATCSwitchAbvBlw.getValue() == -1) { + top = 99; + } + if (ATCSwitchAbvBlw.getValue() == 1) { + bottom = -99; + } + if (altDiff100 > top or altDiff100 < bottom) { # check TCAS vertical range + item.elems.master.hide(); return; } - var _val = {visible:1, lat:_lat, lon:_lon, dirty:item.data['threatLevelDirty']}; - - var spd = vspeed * 60; - _val.arrowup = (spd > 500); - _val.arrowdown = (spd < -500); - - if (math.abs(altDiff100) > 0.5) { - _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 - } else { - _val.text = ""; - } - - _val.textpy = (altDiff100 < 0) ? 34 : -30; - - me.values[path] = _val; - - } - - }, - - redrawItem: func (item,val) { - #debug.dump("REDRAW ", item.data); - - if (val != nil and val.visible == 1) { - - var lat = val.lat; - var lon = val.lon; - var coords = geo.Coord.new(); coords.set_latlon(lat, lon); var (x, y) = me.camera.project(coords); item.elems.master.setTranslation(x, y); #printf("%f %f", x, y); - if (val.dirty) { + if (threatLevelDirty) { #printf('%s THREAT LVL: %i', item.data['callsign'] or '???', item.data['threatLevel']); var threatLevel = item.data['threatLevel']; #debug.dump(item.data, threatLevel); @@ -305,20 +282,28 @@ var TrafficLayer = { item.elems.arrowDown.setColor(r, g, b); item.elems.master.set('z-index', threatLevel + 2); item.data['threatLevelDirty'] = 0; - val.dirty = 0; } - item.elems.arrowUp.setVisible(val.arrowup); - item.elems.arrowDown.setVisible(val.arrowdown); - - item.elems.text.setText(val.text); - item.elems.text.setTranslation(0, val.textpy); + var spd = vspeed * 60; + item.elems.arrowUp.setVisible(spd > 500); + item.elems.arrowDown.setVisible(spd < -500); + + item.elems.text.setVisible(math.abs(altDiff100) > 0.5); + item.elems.text.setText(sprintf("%+02.0f ", altDiff100)); + if (altDiff100 <= 0) { + item.elems.text.setTranslation(0, 40); + #item.elems.arrowUp.setTranslation(16, 30); + #item.elems.arrowDown.setTranslation(16, 30); + } + else { + item.elems.text.setTranslation(0, -30); + #item.elems.arrowUp.setTranslation(16, -30); + #item.elems.arrowDown.setTranslation(16, -30); + } item.elems.master.show(); } else { - item.elems.master.hide(); - } }, From ef53e7ffb23025d75318836c7ef8794149cadebc Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 7 Feb 2021 13:04:05 +0100 Subject: [PATCH 049/124] tcas merge with legoboy --- Nasal/Displays/traffic.nas | 119 +++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 43 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 3426d96a..d0e657a9 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -69,6 +69,8 @@ var TrafficLayer = { refAlt: 0, group: group, items: {}, + sorted: {}, # TODO - only the most 8 relevant advisories + values: {}, updateKeys: [], addListener: nil, delListener: nil, @@ -116,6 +118,7 @@ var TrafficLayer = { var path = changed.getValue(); if (path == nil) return; #printf("ADD: %s", path); + me.values[path] = nil; var masterProp = props.globals.getNode(path); var prop = { 'master': masterProp, @@ -136,6 +139,7 @@ var TrafficLayer = { var path = changed.getValue(); if (path == nil) return; #printf("DEL: %s", path); + me.values[path] = nil; if (me.items[path] == nil) return; if (me.items[path] != nil) { me.items[path].prop = nil; @@ -160,7 +164,15 @@ var TrafficLayer = { } }, + nxtupdatetime: 0, + update: func() { + var _tm = systime(); + if (me.nxtupdatetime != 0) { + if (_tm top or altDiff100 < bottom) { # check TCAS vertical range - item.elems.master.hide(); + me.values[path] = {visible: 0}; return; } + var _val = {visible:1, lat:_lat, lon:_lon, dirty:item.data['threatLevelDirty']}; + + var spd = vspeed * 60; + _val.arrowup = (spd > 500); + _val.arrowdown = (spd < -500); + + if (math.abs(altDiff100) > 0.5) { + _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 + } else { + _val.text = ""; + } + + _val.textpy = (altDiff100 < 0) ? 34 : -30; + + me.values[path] = _val; + + } + + }, + + redrawItem: func (item,val) { + #debug.dump("REDRAW ", item.data); + + if (val != nil and val.visible == 1) { + + var lat = val.lat; + var lon = val.lon; + var coords = geo.Coord.new(); coords.set_latlon(lat, lon); var (x, y) = me.camera.project(coords); item.elems.master.setTranslation(x, y); #printf("%f %f", x, y); - if (threatLevelDirty) { + if (val.dirty) { #printf('%s THREAT LVL: %i', item.data['callsign'] or '???', item.data['threatLevel']); var threatLevel = item.data['threatLevel']; #debug.dump(item.data, threatLevel); @@ -276,34 +317,26 @@ var TrafficLayer = { if (rgb == nil) rgb = colorDefault; var color = canvas._getColor(rgb); var (r, g, b) = rgb; - item.elems.blip.setColorFill(r, g, b); - item.elems.text.setColor(r, g, b); + item.elems.blip.setColorFill(r, g, b); + item.elems.text.setColor(r, g, b); item.elems.arrowUp.setColor(r, g, b); item.elems.arrowDown.setColor(r, g, b); item.elems.master.set('z-index', threatLevel + 2); item.data['threatLevelDirty'] = 0; + val.dirty = 0; } - var spd = vspeed * 60; - item.elems.arrowUp.setVisible(spd > 500); - item.elems.arrowDown.setVisible(spd < -500); - - item.elems.text.setVisible(math.abs(altDiff100) > 0.5); - item.elems.text.setText(sprintf("%+02.0f ", altDiff100)); - if (altDiff100 <= 0) { - item.elems.text.setTranslation(0, 40); - #item.elems.arrowUp.setTranslation(16, 30); - #item.elems.arrowDown.setTranslation(16, 30); - } - else { - item.elems.text.setTranslation(0, -30); - #item.elems.arrowUp.setTranslation(16, -30); - #item.elems.arrowDown.setTranslation(16, -30); - } + item.elems.arrowUp.setVisible(val.arrowup); + item.elems.arrowDown.setVisible(val.arrowdown); + + item.elems.text.setText(val.text); + item.elems.text.setTranslation(0, val.textpy); item.elems.master.show(); } else { + item.elems.master.hide(); + } }, From 53d6193daee4339fdbae96248580875d7d92d35a Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 7 Feb 2021 15:25:14 +0100 Subject: [PATCH 050/124] TCAS fix THRALL button and AbvBlw altitudes --- Nasal/Displays/traffic.nas | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index d0e657a9..8a13e442 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -205,12 +205,6 @@ var TrafficLayer = { return; } - var newThrtAll = ATCSwitchThrtAll.getValue(); - if (newThrtAll == 1) { # TCAS advisory inhibits - me.values[path] = {visible: 0}; - return; - } - if (item.prop['lat'] == nil) { item.prop['lat'] = item.prop.master.getNode('position/latitude-deg'); item.prop['lon'] = item.prop.master.getNode('position/longitude-deg'); @@ -239,9 +233,17 @@ var TrafficLayer = { item.data[k] = item.prop[k].getValue(); } } - if (oldThreatLevel != item.data['threatLevel'] or newThrtAll != item.data['thrtAllStore']) { + if (oldThreatLevel != item.data['threatLevel']) { # or newThrtAll != item.data['thrtAllStore'] item.data['threatLevelDirty'] = 1; - item.data['thrtAllStore'] = newThrtAll; + #item.data['thrtAllStore'] = newThrtAll; + } + + var newThrtAll = ATCSwitchThrtAll.getValue(); + if (newThrtAll != 1) { # AUTO - display only proximate and higher advisories + if (item.data['threatLevel']==0) { + me.values[path] = {visible: 0}; + return; + } } var _lat = item.data['lat']; @@ -262,10 +264,10 @@ var TrafficLayer = { var top = 27; var bottom = -27; if (ATCSwitchAbvBlw.getValue() == -1) { - top = 99; + top = 70; } if (ATCSwitchAbvBlw.getValue() == 1) { - bottom = -99; + bottom = -70; } var altDiff100 = ((alt or me.refAlt) - me.refAlt) / 100; @@ -282,7 +284,7 @@ var TrafficLayer = { _val.arrowdown = (spd < -500); if (math.abs(altDiff100) > 0.5) { - _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 + _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 - CHECKME it's seems not work to diplay +00 / -00 - not a big deal } else { _val.text = ""; } From 6a0e839c494d35e9b1c269f20aa8d1556cda60c7 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 7 Feb 2021 16:42:10 +0100 Subject: [PATCH 051/124] Inverted meaning of TCAS THRTALL button --- Nasal/Displays/traffic.nas | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 8a13e442..ff36709d 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -205,6 +205,14 @@ var TrafficLayer = { return; } + var newThrtAll = ATCSwitchThrtAll.getValue(); + if (newThrtAll == 1) { # AUTO - display only proximate and higher advisories + if (item.data['threatLevel']==0) { + me.values[path] = {visible: 0}; + return; + } + } + if (item.prop['lat'] == nil) { item.prop['lat'] = item.prop.master.getNode('position/latitude-deg'); item.prop['lon'] = item.prop.master.getNode('position/longitude-deg'); @@ -238,14 +246,6 @@ var TrafficLayer = { #item.data['thrtAllStore'] = newThrtAll; } - var newThrtAll = ATCSwitchThrtAll.getValue(); - if (newThrtAll != 1) { # AUTO - display only proximate and higher advisories - if (item.data['threatLevel']==0) { - me.values[path] = {visible: 0}; - return; - } - } - var _lat = item.data['lat']; var _lon = item.data['lon']; var alt = item.data['alt']; From 09051ee137086de5282ebbb2b584c31576af040b Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 7 Feb 2021 17:07:08 +0100 Subject: [PATCH 052/124] manage TCAS threatlevel == -1 --- Nasal/Displays/traffic.nas | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index ff36709d..be0f3a5c 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -205,14 +205,6 @@ var TrafficLayer = { return; } - var newThrtAll = ATCSwitchThrtAll.getValue(); - if (newThrtAll == 1) { # AUTO - display only proximate and higher advisories - if (item.data['threatLevel']==0) { - me.values[path] = {visible: 0}; - return; - } - } - if (item.prop['lat'] == nil) { item.prop['lat'] = item.prop.master.getNode('position/latitude-deg'); item.prop['lon'] = item.prop.master.getNode('position/longitude-deg'); @@ -241,11 +233,25 @@ var TrafficLayer = { item.data[k] = item.prop[k].getValue(); } } + + if (item.data['threatLevel'] == -1) { # airplane with TCAS not enabled or supported + me.values[path] = {visible: 0}; + return; + } + if (oldThreatLevel != item.data['threatLevel']) { # or newThrtAll != item.data['thrtAllStore'] item.data['threatLevelDirty'] = 1; #item.data['thrtAllStore'] = newThrtAll; } + var newThrtAll = ATCSwitchThrtAll.getValue(); + if (newThrtAll == 1) { # AUTO - display only proximate and higher advisories + if (item.data['threatLevel']==0) { + me.values[path] = {visible: 0}; + return; + } + } + var _lat = item.data['lat']; var _lon = item.data['lon']; var alt = item.data['alt']; From 2b6749da76d57f9303612714316e0454ddfd7d34 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 8 Feb 2021 11:52:13 +0000 Subject: [PATCH 053/124] Remove excess comments --- Nasal/Displays/traffic.nas | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index be0f3a5c..ac9979fc 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -239,9 +239,8 @@ var TrafficLayer = { return; } - if (oldThreatLevel != item.data['threatLevel']) { # or newThrtAll != item.data['thrtAllStore'] + if (oldThreatLevel != item.data['threatLevel']) { item.data['threatLevelDirty'] = 1; - #item.data['thrtAllStore'] = newThrtAll; } var newThrtAll = ATCSwitchThrtAll.getValue(); @@ -290,7 +289,7 @@ var TrafficLayer = { _val.arrowdown = (spd < -500); if (math.abs(altDiff100) > 0.5) { - _val.text = sprintf("%+03.0f ", altDiff100); # float to display -00 - CHECKME it's seems not work to diplay +00 / -00 - not a big deal + _val.text = sprintf("%+03.0f ", altDiff100); } else { _val.text = ""; } From 49559e5a681fb42da6f68de7aba51b33ff32ab17 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 8 Feb 2021 15:45:57 +0000 Subject: [PATCH 054/124] Emesary system update framework: this works towards reducing property IO by only ever caling a property once. --- Models/Instruments/IESI/IESI.nas | 2 - Models/Instruments/Lower-ECAM/Lower-ECAM.nas | 2 +- Nasal/FMGC/FCU.nas | 6 +- Nasal/Libraries/libraries.nas | 13 ++- Nasal/Panels/atc.nas | 9 +- Nasal/Systems/ADIRS/ADR.nas | 3 +- Nasal/Systems/FADEC/fadec-common.nas | 2 +- Nasal/Systems/brakesystem.nas | 24 ++--- Nasal/Systems/electrical.nas | 73 ++++++++++----- Nasal/Systems/hydraulics.nas | 94 ++++++++++++-------- Nasal/Systems/pneumatics.nas | 6 +- Nasal/emesary/M_frame_notification.nas | 26 +++++- Nasal/emesary/exec.nas | 11 +-- Systems/a320-hydraulic.xml | 4 +- 14 files changed, 167 insertions(+), 108 deletions(-) diff --git a/Models/Instruments/IESI/IESI.nas b/Models/Instruments/IESI/IESI.nas index 4ad0a965..63415808 100644 --- a/Models/Instruments/IESI/IESI.nas +++ b/Models/Instruments/IESI/IESI.nas @@ -261,8 +261,6 @@ var input = { "altitude_ind": "/instrumentation/altimeter/indicated-altitude-ft-pfd", "altimeter_mode": "/instrumentation/altimeter[0]/std", "attReset": "/instrumentation/iesi/att-reset", - "dcEss": "/systems/electrical/bus/dc-ess", - "dcHot1": "/systems/electrical/bus/dc-hot-1", "iesiBrt": "/controls/lighting/DU/iesi", "iesiInit": "/instrumentation/iesi/iesi-init", "mach": "/instrumentation/airspeed-indicator/indicated-mach", diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas index cbfddbc6..feaae20f 100644 --- a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas +++ b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas @@ -3010,7 +3010,7 @@ var canvas_lowerECAM_wheel = { rightdoor = gear_door_R.getValue(); nosedoor = gear_door_N.getValue(); gearlvr = gear_down.getValue(); - askidsw = systems.HYD.Brakes.askidSw.getBoolValue(); + askidsw = systems.HYD.Switch.nwsSwitch.getBoolValue(); brakemode = systems.HYD.Brakes.mode.getBoolValue(); accum = systems.HYD.Brakes.accumPressPsi.getBoolValue(); diff --git a/Nasal/FMGC/FCU.nas b/Nasal/FMGC/FCU.nas index 8a2a6a78..2ca20a91 100644 --- a/Nasal/FMGC/FCU.nas +++ b/Nasal/FMGC/FCU.nas @@ -66,7 +66,7 @@ var FCUController = { me.FCU2 = FCU.new(systems.ELEC.Bus.dc2); me._init = 1; }, - loop: func() { + loop: func(notification) { if (me._init == 0) { return; } # Update FCU Power @@ -82,11 +82,11 @@ var FCUController = { } foreach (var update_item; me.update_items) { - update_item.update(nil); + update_item.update(notification); } }, update_items: [ - props.UpdateManager.FromPropertyHashList(["/it-autoflight/output/fd1","/it-autoflight/output/fd2", "/it-autoflight/output/ap1", "/it-autoflight/output/ap2"], 1, func(notification) + props.UpdateManager.FromPropertyHashList(["/it-autoflight/output/fd1","/it-autoflight/output/fd2", "/it-autoflight/output/ap1", "/it-autoflight/output/ap2"], nil, func(notification) { updateActiveFMGC(); } diff --git a/Nasal/Libraries/libraries.nas b/Nasal/Libraries/libraries.nas index c5b05971..f632f7d0 100644 --- a/Nasal/Libraries/libraries.nas +++ b/Nasal/Libraries/libraries.nas @@ -174,19 +174,18 @@ var update_items = [ var systemsLoop = func(notification) { if (!systemsInitialized) { return; } - systems.ELEC.loop(); - systems.PNEU.loop(); - systems.HYD.loop(); - systems.ADIRS.loop(); + systems.PNEU.loop(notification); + systems.ADIRS.loop(notification); + systems.BrakeSys.update(notification); + systems.HFLoop(notification); systems.APUController.loop(); - systems.BrakeSys.update(); fadec.FADEC.loop(); rmp.rmpUpdate(); - fcu.FCUController.loop(); + fcu.FCUController.loop(notification); + atc.Transponders.vector[atc.transponderPanel.atcSel - 1].update(notification); dmc.DMController.loop(); atsu.ATSU.loop(); libraries.BUTTONS.update(); - systems.HFLoop(notification); if ((notification.engine1State == 2 or notification.engine1State == 3) and collectorTankL.getValue() < 1) { systems.cutoff_one(); diff --git a/Nasal/Panels/atc.nas b/Nasal/Panels/atc.nas index e6b192dc..d5abadfb 100644 --- a/Nasal/Panels/atc.nas +++ b/Nasal/Panels/atc.nas @@ -24,7 +24,6 @@ var Transponder = { serviceableNode: props.globals.getNode("/instrumentation/transponder/serviceable", 1), knobNode: props.globals.getNode("/instrumentation/transponder/inputs/knob-mode", 1), identNode: props.globals.getNode("/instrumentation/transponder/inputs/ident-btn", 1), - ac1Node: props.globals.getNode("/systems/electrical/bus/ac-1", 1), tcasNode: props.globals.getNode("/instrumentation/tcas/inputs/mode"), aglNode: props.globals.getNode("/position/gear-agl-ft", 1), electricNode: props.globals.getNode("/systems/electrical/outputs/transponder", 1), # communicate to generic systems @@ -40,9 +39,9 @@ var Transponder = { return t; }, - update: func() { + update: func(notification) { # TCAS - on seperate electrical source, so has to be before transponder electrical checking - if (me.ac1Node.getValue() < 110) { + if (notification.elecAC1 < 110) { me.tcasNode.setValue(0); # off } else { if (me.mode >= 1 and me.mode <= 3) { @@ -285,7 +284,6 @@ var transponderPanel = { var init = func() { transponderPanel.atcSwitch(1); transponderPanel.updateAirData(); - transponderTimer.start(); } # Handler for code change from generic dialog @@ -297,9 +295,6 @@ setlistener("/instrumentation/transponder/id-code", func { var Transponders = std.Vector.new([Transponder.new("/systems/electrical/bus/ac-ess-shed", 1), Transponder.new("/systems/electrical/bus/ac-2", 2)]); -var transponderTimer = maketimer(0.1, func() { - Transponders.vector[transponderPanel.atcSel - 1].update(); -}); setlistener("/systems/navigation/adr/operating-1", func() { transponderPanel.updateADR1(systems.ADIRS.Operating.adr[0].getValue()); diff --git a/Nasal/Systems/ADIRS/ADR.nas b/Nasal/Systems/ADIRS/ADR.nas index ad82e383..08d6d57d 100644 --- a/Nasal/Systems/ADIRS/ADR.nas +++ b/Nasal/Systems/ADIRS/ADR.nas @@ -324,7 +324,7 @@ var ADIRS = { } ), ], - loop: func() { + loop: func(notification) { if (me._init) { for (i = 0; i < _NUMADIRU; i = i + 1) { # update ADR units power @@ -348,7 +348,6 @@ var ADIRS = { } # Update VFE - notification = nil; foreach (var update_item; me.update_items) { update_item.update(notification); } diff --git a/Nasal/Systems/FADEC/fadec-common.nas b/Nasal/Systems/FADEC/fadec-common.nas index 60a49de4..64d7bf0b 100644 --- a/Nasal/Systems/FADEC/fadec-common.nas +++ b/Nasal/Systems/FADEC/fadec-common.nas @@ -448,4 +448,4 @@ setlistener("/systems/thrust/thr-locked", func { }, 0, 0); var lockTimer = maketimer(0.1, checkLockThr); -var lockTimer2 = maketimer(0.1, checkLockThr2); +var lockTimer2 = maketimer(0.1, checkLockThr2); \ No newline at end of file diff --git a/Nasal/Systems/brakesystem.nas b/Nasal/Systems/brakesystem.nas index ca021df9..b460b2cc 100755 --- a/Nasal/Systems/brakesystem.nas +++ b/Nasal/Systems/brakesystem.nas @@ -111,7 +111,7 @@ var BrakeSystem = }, # update brake energy - update : func() + update : func(notification) { if (me.counter == 0) { me.counter = 1; @@ -122,10 +122,10 @@ var BrakeSystem = LThermalEnergy = me.thermalEnergy[0]; RThermalEnergy = me.thermalEnergy[1]; - me.CurrentTime = pts.Sim.Time.elapsedSec.getValue(); + me.CurrentTime = notification.elapsedTime; dt = me.CurrentTime - me.LastSimTime; - LBrakeLevel = pts.Fdm.JSBsim.Fcs.brake[0].getValue(); - RBrakeLevel = pts.Fdm.JSBsim.Fcs.brake[1].getValue(); + LBrakeLevel = notification.leftBrakeFCS; + RBrakeLevel = notification.rightBrakeFCS; tatdegc = pts.Fdm.JSBsim.Propulsion.tatC.getValue() or 0; if (pts.Sim.replayState.getValue() == 0 and dt < 1.0) { @@ -137,7 +137,7 @@ var BrakeSystem = LCoolingRatio = LCoolingRatio * 3; RCoolingRatio = RCoolingRatio * 3; }; - airspeed = pts.Velocities.airspeed.getValue(); + airspeed = notification.airspeedV; if (pts.Gear.position[1].getValue()) { #increase CoolingRatio if gear down according to airspeed LCoolingRatio = LCoolingRatio * airspeed; @@ -168,7 +168,7 @@ var BrakeSystem = L_Thrust = 0; R_Thrust = 0; - if (pts.Gear.wow[1].getValue()) { + if (notification.gear1Wow) { var V1 = pts.Velocities.groundspeed.getValue(); var Mass = pts.Fdm.JSBsim.Inertia.weightLbs.getValue() * me.ScalingDivisor; @@ -179,7 +179,7 @@ var BrakeSystem = LThermalEnergy += (Mass * pts.Gear.compression[1].getValue() * (math.pow(V1, 2) - math.pow(V2_L, 2)) / 2); if (pts.Controls.Gear.chocks.getValue()) { - if (!pts.Controls.Gear.parkingBrake.getValue()) { + if (!notification.parkingBrake) { # cooling effect: reduce thermal energy by (LnCoolFactor) * dt LThermalEnergy = LThermalEnergy * math.exp(LnCoolFactor * dt); } else { @@ -188,7 +188,7 @@ var BrakeSystem = LThermalEnergy = (LThermalEnergy * math.exp(LnCoolFactor * dt)) + (L_Thrust * dt); }; } else { - if (!pts.Controls.Gear.parkingBrake.getValue()) { + if (!notification.parkingBrake) { if (LBrakeLevel>0) { if (V2_L>0) { #LThermalEnergy += (Mass * (math.pow(V1, 2) - math.pow(V2_L, 2)) / 2) + L_thrust; @@ -212,7 +212,7 @@ var BrakeSystem = RThermalEnergy += (Mass * pts.Gear.compression[2].getValue() * (math.pow(V1, 2) - math.pow(V2_R, 2)) / 2); if (pts.Controls.Gear.chocks.getValue()) { - if (!pts.Controls.Gear.parkingBrake.getValue()) { + if (!notification.parkingBrake) { # cooling effect: reduce thermal energy by (RnCoolFactor) * dt RThermalEnergy = RThermalEnergy * math.exp(RnCoolFactor * dt); } else { @@ -221,7 +221,7 @@ var BrakeSystem = RThermalEnergy = (RThermalEnergy * math.exp(RnCoolFactor * dt)) + (R_Thrust * dt); }; } else { - if (!pts.Controls.Gear.parkingBrake.getValue()) { + if (!notification.parkingBrake) { if (RBrakeLevel>0) { if (V2_R>0) { #RThermalEnergy += (Mass * (math.pow(V1, 2) - math.pow(V2_R, 2)) / 2) + R_thrust; @@ -271,7 +271,7 @@ var BrakeSystem = if (LThermalEnergy>1 and !me.LSmokeActive) { # start smoke processing me.LSmokeActive = 1; - settimer(func { BrakeSys.Lsmoke(); },0); + settimer(func { BrakeSys.Lsmoke(); },0); # is settimer needed? }; if (RThermalEnergy>1 and !me.RSmokeActive) { # start smoke processing @@ -406,7 +406,7 @@ var Autobrake = { me._mode = me.mode.getValue(); me._active = me.active.getBoolValue(); if (me._gnd_speed > 72) { - if (me._mode != 0 and pts.Controls.Engines.Engine.throttle[0].getValue() < 0.15 and pts.Controls.Engines.Engine.throttle[1].getValue() < 0.15 and me._wow0 and systems.HYD.Brakes.askidSw.getValue() and systems.HYD.Psi.green.getValue() >= 2500 ) { + if (me._mode != 0 and pts.Controls.Engines.Engine.throttle[0].getValue() < 0.15 and pts.Controls.Engines.Engine.throttle[1].getValue() < 0.15 and me._wow0 and systems.HYD.Switch.nwsSwitch.getBoolValue() and systems.HYD.Psi.green.getValue() >= 2500 ) { me.active.setBoolValue(1); } elsif (me._active) { me.active.setBoolValue(0); diff --git a/Nasal/Systems/electrical.nas b/Nasal/Systems/electrical.nas index 6ccf5253..6fc42666 100644 --- a/Nasal/Systems/electrical.nas +++ b/Nasal/Systems/electrical.nas @@ -13,8 +13,6 @@ var dc2 = 0; # Main class var ELEC = { - _timer1On: 0, - _timer2On: 0, EmerElec: props.globals.getNode("/systems/electrical/some-electric-thingie/emer-elec-config"), Bus: { acEss: props.globals.getNode("/systems/electrical/bus/ac-ess"), @@ -207,36 +205,65 @@ var ELEC = { me.Fail.tr1Fault.setBoolValue(0); me.Fail.tr2Fault.setBoolValue(0); }, - loop: func() { + _FMGC1: 0, + _FMGC2: 0, + _activeFMGC: nil, + _timer1On: 0, + _timer2On: 0, + loop: func(notification) { # Autopilot Disconnection routines - if (me.Bus.dcEssShed.getValue() < 25) { - if (fmgc.Output.ap1.getValue() and !me._timer1On) { + me._activeFMGC = fcu.FCUController.activeFMGC.getValue(); + me._FMGC1 = fmgc.Output.ap1.getValue(); + me._FMGC2 = fmgc.Output.ap2.getValue(); + + if (notification.dcEssShed < 25) { + if (me._FMGC1 and !me._timer1On) { # delay 1 cycle to avoid spurious me._timer1On = 1; - settimer(func() { - if (me.Bus.dcEssShed.getValue() < 25) { - fcu.apOff("hard", 1); - if (fcu.FCUController.activeFMGC.getValue() == 1) { - fcu.athrOff("hard"); - } + } elsif (me._FMGC1) { + if (notification.dcEssShed < 25) { + fcu.apOff("hard", 1); + if (me._activeFMGC == 1) { + fcu.athrOff("hard"); } - me._timer1On = 0; - }, 0.1); + } + me._timer1On = 0; } } - if (me.Bus.dc2.getValue() < 25) { - if (fmgc.Output.ap2.getValue() and !me._timer2On) { + if (notification.dc2 < 25) { + if (me._FMGC2 and !me._timer2On) { # delay 1 cycle to avoid spurious me._timer2On = 1; - settimer(func() { - if (me.Bus.dc2.getValue() < 25) { - fcu.apOff("hard", 2); - if (fcu.FCUController.activeFMGC.getValue() == 2) { - fcu.athrOff("hard"); - } + } elsif (me._FMGC2) { + if (notification.dc2 < 25) { + fcu.apOff("hard", 2); + if (me._activeFMGC == 2) { + fcu.athrOff("hard"); } - me._timer2On = 0; - }, 0.1); + } + me._timer2On = 0; } } }, +}; + +# Emesary +var A320Electrical = notifications.SystemRecipient.new("A320 Electrical",ELEC.loop,ELEC); +emesary.GlobalTransmitter.Register(A320Electrical); + +var input = { + "elecAC1": "/systems/electrical/bus/ac-1", + "elecAC2": "/systems/electrical/bus/ac-2", + "elecACEss": "/systems/electrical/bus/ac-ess", + "elecACEssShed": "/systems/electrical/bus/ac-ess-shed", + "dc1": "/systems/electrical/bus/dc-1", + "dc2": "/systems/electrical/bus/dc-2", + "dcBat": "/systems/electrical/bus/dc-bat", + "dcEss": "/systems/electrical/bus/dc-ess", + "dcEssShed": "/systems/electrical/bus/dc-ess-shed", + "dcHot1": "/systems/electrical/bus/dc-hot-1", + "dcHot2": "/systems/electrical/bus/dc-hot-2", +}; + +foreach (var name; keys(input)) { + emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 Electrical", name, input[name])); } \ No newline at end of file diff --git a/Nasal/Systems/hydraulics.nas b/Nasal/Systems/hydraulics.nas index c3cb02c2..204c40b5 100644 --- a/Nasal/Systems/hydraulics.nas +++ b/Nasal/Systems/hydraulics.nas @@ -10,7 +10,6 @@ var HYD = { accumPressPsi: props.globals.initNode("/systems/hydraulic/yellow-accumulator-psi-cmd", 0, "INT"), leftPressPsi: props.globals.initNode("/systems/hydraulic/brakes/pressure-left-psi", 0, "INT"), rightPressPsi: props.globals.initNode("/systems/hydraulic/brakes/pressure-right-psi", 0, "INT"), - askidSw: props.globals.initNode("/systems/hydraulic/brakes/askidnwssw", 1, "BOOL"), mode: props.globals.initNode("/systems/hydraulic/brakes/mode", 0, "INT"), leftbrake: props.globals.getNode("/controls/gear/brake-left"), rightbrake: props.globals.getNode("/controls/gear/brake-right"), @@ -57,6 +56,7 @@ var HYD = { rat: props.globals.getNode("/controls/hydraulic/switches/rat-man"), yellowEDP: props.globals.getNode("/controls/hydraulic/switches/yellow-edp"), yellowElec: props.globals.getNode("/controls/hydraulic/switches/yellow-elec"), + nwsSwitch: props.globals.getNode("/controls/gear/nws-switch"), }, Valve: { yellowFire: props.globals.getNode("/systems/hydraulic/sources/yellow-edp/fire-valve"), @@ -85,97 +85,91 @@ var HYD = { me.Fail.yellowElec.setBoolValue(0); me.Fail.yellowLeak.setBoolValue(0); }, - loop: func() { - if (props.globals.getValue("/controls/gear/nws-switch") == 1) { - me.Brakes.askidSw.setBoolValue(1); #true - } else { - me.Brakes.askidSw.setBoolValue(0); #false - } - + loop: func(notification) { # Decrease accumPressPsi when green and yellow hydraulic's aren't pressurized - if (me.Brakes.leftbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { + if (me.Brakes.leftbrake.getValue() > 0 or notification.brakesMode == 0) { lcont = lcont + 1; } else { lcont = 0; } - if (me.Brakes.rightbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { + if (me.Brakes.rightbrake.getValue() > 0 or notification.brakesMode == 0) { rcont = rcont + 1; } else { rcont = 0; } - if (me.Psi.yellow.getValue() < me.Brakes.accumPressPsi.getValue() and me.Brakes.accumPressPsi.getValue() > 0) { + if (notification.yellow < notification.accumPressPsi and notification.accumPressPsi > 0) { if (lcont == 1) { - me.Brakes.accumPressPsi.setValue(me.Brakes.accumPressPsi.getValue() - 200); + me.Brakes.accumPressPsi.setValue(notification.accumPressPsi - 200); } if (rcont == 1) { - me.Brakes.accumPressPsi.setValue(me.Brakes.accumPressPsi.getValue() - 200); + me.Brakes.accumPressPsi.setValue(notification.accumPressPsi - 200); } - if (me.Brakes.accumPressPsi.getValue() < 0) { + if (notification.accumPressPsi < 0) { me.Brakes.accumPressPsi.setValue(0); } } # Braking Pressure - if (me.Brakes.mode.getValue() == 1 or (me.Brakes.mode.getValue() == 2 and me.Psi.green.getValue() >= 2500)) { + if (notification.brakesMode == 1 or (notification.brakesMode == 2 and notification.green >= 2500)) { # Normal braking - Green OK - if (me.Brakes.leftbrake.getValue() > 0) { - me.Brakes.leftPressPsi.setValue(me.Psi.green.getValue() * pts.Fdm.JSBsim.Fcs.brake[0].getValue()); + if (notification.leftBrake > 0) { + me.Brakes.leftPressPsi.setValue(notification.green * notification.leftBrakeFCS); } else { me.Brakes.leftPressPsi.setValue(0); } - if (me.Brakes.rightbrake.getValue() > 0) { - me.Brakes.rightPressPsi.setValue(me.Psi.green.getValue() * pts.Fdm.JSBsim.Fcs.brake[1].getValue()); + if (notification.rightBrake > 0) { + me.Brakes.rightPressPsi.setValue(notification.green * notification.rightBrakeFCS); } else { me.Brakes.rightPressPsi.setValue(0); } } else { - if ((me.Brakes.mode.getValue() == 2 and me.Psi.green.getValue() < 2500) or me.Brakes.mode.getValue() == 0) { + if ((notification.brakesMode == 2 and notification.green < 2500) or notification.brakesMode == 0) { # Alternate Braking (Yellow OK + Antiskid ON + electric OK) - missing condition: BSCU OK-KO - if (me.Psi.yellow.getValue() >= 2500 and me.Brakes.askidSw.getValue() and (systems.ELEC.Bus.dc1.getValue() >= 24 or systems.ELEC.Bus.dc2.getValue() >= 24 or systems.ELEC.Bus.dcEss.getValue() >= 24)) { - if (me.Brakes.leftbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.leftPressPsi.setValue(me.Psi.yellow.getValue() * pts.Fdm.JSBsim.Fcs.brake[0].getValue()); + if (notification.yellow >= 2500 and notification.NWSSwitch and (notification.dc1 >= 24 or notification.dc2 >= 24 or notification.dcEss >= 24)) { + if (notification.leftBrake > 0 or notification.brakesMode == 0) { + me.Brakes.leftPressPsi.setValue(notification.yellow * notification.leftBrakeFCS); } else { me.Brakes.leftPressPsi.setValue(0); } - if (me.Brakes.rightbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.rightPressPsi.setValue(me.Psi.yellow.getValue() * pts.Fdm.JSBsim.Fcs.brake[1].getValue()); + if (notification.rightBrake > 0 or notification.brakesMode == 0) { + me.Brakes.rightPressPsi.setValue(notification.yellow * notification.rightBrakeFCS); } else { me.Brakes.rightPressPsi.setValue(0); } } else { # Alternate Braking (Yellow OK + Antiskid OFF + electric OK) - missing condition: BSCU OK-KO - if (me.Psi.yellow.getValue() >= 2500 and !me.Brakes.askidSw.getValue() and (systems.ELEC.Bus.dc1.getValue() >= 24 or systems.ELEC.Bus.dc2.getValue() >= 24 or systems.ELEC.Bus.dcEss.getValue() >= 24)) { - if (me.Brakes.leftbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.leftPressPsi.setValue(1000 * pts.Fdm.JSBsim.Fcs.brake[0].getValue()); + if (notification.yellow >= 2500 and !notification.NWSSwitch and (notification.dc1 >= 24 or notification.dc2 >= 24 or notification.dcEss >= 24)) { + if (notification.leftBrake > 0 or notification.brakesMode == 0) { + me.Brakes.leftPressPsi.setValue(1000 * notification.leftBrakeFCS); } else { me.Brakes.leftPressPsi.setValue(0); } - if (me.Brakes.rightbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.rightPressPsi.setValue(1000 * pts.Fdm.JSBsim.Fcs.brake[1].getValue()); + if (notification.rightBrake > 0 or notification.brakesMode == 0) { + me.Brakes.rightPressPsi.setValue(1000 * notification.rightBrakeFCS); } else { me.Brakes.rightPressPsi.setValue(0); } } else { # Alternate Braking (Yellow KO or Antiskid KO or electric KO) - missing condition: BSCU OK-KO - if (me.Brakes.accumPressPsi.getValue() < 1000 and (me.Psi.yellow.getValue() < 2500 or !me.Brakes.askidSw.getValue() or (systems.ELEC.Bus.dc1.getValue() < 24 and systems.ELEC.Bus.dc2.getValue() < 24 and systems.ELEC.Bus.dcEss.getValue() < 24))) { - if (me.Brakes.leftbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.leftPressPsi.setValue(me.Brakes.accumPressPsi.getValue() * pts.Fdm.JSBsim.Fcs.brake[0].getValue()); + if (notification.accumPressPsi < 1000 and (notification.yellow < 2500 or !notification.NWSSwitch or (notification.dc1 < 24 and notification.dc2 < 24 and notification.dcEss < 24))) { + if (notification.leftBrake > 0 or notification.brakesMode == 0) { + me.Brakes.leftPressPsi.setValue(notification.accumPressPsi * notification.leftBrakeFCS); } else { me.Brakes.leftPressPsi.setValue(0); } - if (me.Brakes.rightbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.rightPressPsi.setValue(me.Brakes.accumPressPsi.getValue() * pts.Fdm.JSBsim.Fcs.brake[1].getValue()); + if (notification.rightBrake > 0 or notification.brakesMode == 0) { + me.Brakes.rightPressPsi.setValue(notification.accumPressPsi * notification.rightBrakeFCS); } else { me.Brakes.rightPressPsi.setValue(0); } } else { - if (me.Brakes.leftbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.leftPressPsi.setValue(1000 * pts.Fdm.JSBsim.Fcs.brake[0].getValue()); + if (notification.leftBrake > 0 or notification.brakesMode == 0) { + me.Brakes.leftPressPsi.setValue(1000 * notification.leftBrakeFCS); } else { me.Brakes.leftPressPsi.setValue(0); } - if (me.Brakes.rightbrake.getValue() > 0 or me.Brakes.mode.getValue() == 0) { - me.Brakes.rightPressPsi.setValue(1000 * pts.Fdm.JSBsim.Fcs.brake[1].getValue()); + if (notification.rightBrake > 0 or notification.brakesMode == 0) { + me.Brakes.rightPressPsi.setValue(1000 * notification.rightBrakeFCS); } else { me.Brakes.rightPressPsi.setValue(0); } @@ -192,3 +186,25 @@ setlistener("/controls/gear/gear-down", func { pts.Controls.Gear.gearDown.setValue(1); } }); + +# Emesary +var A320Hydraulic = notifications.SystemRecipient.new("A320 Hydraulic",HYD.loop,HYD); +emesary.GlobalTransmitter.Register(A320Hydraulic); + +var input = { + "blue": "/systems/hydraulic/blue-psi", + "green": "/systems/hydraulic/green-psi", + "yellow": "/systems/hydraulic/yellow-psi", + + "brakesMode": "/systems/hydraulic/brakes/mode", + "accumPressPsi": "/systems/hydraulic/yellow-accumulator-psi-cmd", + "leftBrake": "/controls/gear/brake-left", + "rightBrake": "/controls/gear/brake-right", + "leftBrakeFCS": "/fdm/jsbsim/fcs/left-brake-cmd-norm", + "rightBrakeFCS": "/fdm/jsbsim/fcs/right-brake-cmd-norm", + "NWSSwitch": "/controls/gear/nws-switch", +}; + +foreach (var name; keys(input)) { + emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 Hydraulic", name, input[name])); +} \ No newline at end of file diff --git a/Nasal/Systems/pneumatics.nas b/Nasal/Systems/pneumatics.nas index eeb18b2e..97425c63 100644 --- a/Nasal/Systems/pneumatics.nas +++ b/Nasal/Systems/pneumatics.nas @@ -161,9 +161,9 @@ var PNEU = { me.Fail.trimValveFwd.setBoolValue(0); me.Fail.xbleed.setBoolValue(0); }, - loop: func() { - wowl = getprop("gear/gear[1]/wow"); - wowr = getprop("gear/gear[2]/wow"); + loop: func(notification) { + wowl = notification.gear1Wow; + wowr = notification.gear2Wow; # Legacy pressurization cabinalt = getprop("/systems/pressurization/cabinalt"); diff --git a/Nasal/emesary/M_frame_notification.nas b/Nasal/emesary/M_frame_notification.nas index 228b79c1..cb44c3e3 100644 --- a/Nasal/emesary/M_frame_notification.nas +++ b/Nasal/emesary/M_frame_notification.nas @@ -100,4 +100,28 @@ var frameNotification = FrameNotification.new(1); # Frame count # 5 = ECAM # 7 = FWC phases -# 10 = ECAM messages \ No newline at end of file +# 10 = ECAM messages + + +var SystemRecipient = +{ + new: func(_ident,loopFunc, instance) + { + var NewSystemRecipient = emesary.Recipient.new(_ident); + NewSystemRecipient.Receive = func(notification) + { + if (notification.NotificationType == "FrameNotification") + { + if (math.mod(notifications.frameNotification.FrameCount,5) == 0) { + call(loopFunc,[notification],instance, nil, var errors = []); + if (size(errors) > 0) { + debug.printerror(errors); + } + } + return emesary.Transmitter.ReceiptStatus_OK; + } + return emesary.Transmitter.ReceiptStatus_NotProcessed; + }; + return NewSystemRecipient; + }, +}; \ No newline at end of file diff --git a/Nasal/emesary/exec.nas b/Nasal/emesary/exec.nas index af3ad265..eda3c5e9 100644 --- a/Nasal/emesary/exec.nas +++ b/Nasal/emesary/exec.nas @@ -42,13 +42,14 @@ input = { frame_rate: "/sim/frame-rate", elapsedTime: "/sim/time/elapsed-sec", FWCPhase: "/ECAM/warning-phase", - gear0Wow: "/gear/gear[0]/wow", # Just about everything uses these properties at some stage, lets add them here! - elecAC1: "/systems/electrical/bus/ac-1", - elecAC2: "/systems/electrical/bus/ac-2", - elecACEss: "/systems/electrical/bus/ac-ess", - elecACEssShed: "/systems/electrical/bus/ac-ess-shed", + gear0Wow: "/gear/gear[0]/wow", + gear1Wow: "/gear/gear[1]/wow", + gear2Wow: "/gear/gear[2]/wow", + parkingBrake: "/controls/gear/brake-parking", + airspeedV: "/velocities/airspeed-kt", + groundspeed: "/velocities/groundspeed-kt", engine1State: "/engines/engine[0]/state", engine2State: "/engines/engine[1]/state", }; diff --git a/Systems/a320-hydraulic.xml b/Systems/a320-hydraulic.xml index 67e33fbb..30264be1 100644 --- a/Systems/a320-hydraulic.xml +++ b/Systems/a320-hydraulic.xml @@ -528,12 +528,12 @@ /controls/gear/brake-parking ne 1 - /systems/hydraulic/brakes/askidnwssw eq 1 + /controls/gear/nws-switch eq 1 /systems/hydraulic/green-psi ge 2500 /controls/gear/brake-parking ne 1 - /systems/hydraulic/brakes/askidnwssw eq 1 + /controls/gear/nws-switch eq 1 /systems/hydraulic/yellow-psi ge 2500 From cfc771e86d28a0254eaad8c9b4b09d55750a9310 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 8 Feb 2021 16:10:36 +0000 Subject: [PATCH 055/124] Help out CPU bound systems by reducing XML load and running ECAM at framerate rather than fdmrate --- A320-main.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index 97c14b71..7bbbf383 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -237,12 +237,12 @@ Aircraft/A320-family/Systems/sound-common.xml - + Aircraft/A320-family/Systems/a320-lights-proprules.xml - - + + Aircraft/A320-family/Systems/ecam-proprules.xml - + Aircraft/A320-family/Systems/pitot-static.xml From d290701784c72bb89ae2e146f060359c97138fec Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 8 Feb 2021 16:14:41 +0000 Subject: [PATCH 056/124] Sound should also run at framerate as well --- A320-100-CFM-set.xml | 4 ++-- A320-200-CFM-set.xml | 6 +++--- A320-200-IAE-set.xml | 4 ++-- A320-main.xml | 4 ++-- A320neo-CFM-set.xml | 4 ++-- A320neo-PW-set.xml | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/A320-100-CFM-set.xml b/A320-100-CFM-set.xml index 3ab703be..c1c7fe31 100644 --- a/A320-100-CFM-set.xml +++ b/A320-100-CFM-set.xml @@ -206,9 +206,9 @@ Aircraft/A320-family/Systems/fadec-cfm.xml - + Aircraft/A320-family/Systems/cfm56-sound.xml - + diff --git a/A320-200-CFM-set.xml b/A320-200-CFM-set.xml index 3c94e222..d604b43b 100644 --- a/A320-200-CFM-set.xml +++ b/A320-200-CFM-set.xml @@ -206,9 +206,9 @@ Aircraft/A320-family/Systems/fadec-cfm.xml - - Aircraft/A320-family/Systems/cfm56-sound.xml - + + Aircraft/A320-family/Systems/cfm56-sound.xml + diff --git a/A320-200-IAE-set.xml b/A320-200-IAE-set.xml index 98fa97d7..7a0f577b 100644 --- a/A320-200-IAE-set.xml +++ b/A320-200-IAE-set.xml @@ -206,9 +206,9 @@ Aircraft/A320-family/Systems/fadec-iae.xml - + Aircraft/A320-family/Systems/v2500-sound.xml - + diff --git a/A320-main.xml b/A320-main.xml index 7bbbf383..6bf2f2aa 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -234,9 +234,9 @@ Aircraft/A320-family/Systems/pfd.xml - + Aircraft/A320-family/Systems/sound-common.xml - + Aircraft/A320-family/Systems/a320-lights-proprules.xml diff --git a/A320neo-CFM-set.xml b/A320neo-CFM-set.xml index 68a08ae9..a099581a 100644 --- a/A320neo-CFM-set.xml +++ b/A320neo-CFM-set.xml @@ -206,9 +206,9 @@ Aircraft/A320-family/Systems/fadec-cfm.xml - + Aircraft/A320-family/Systems/leapx-sound.xml - + diff --git a/A320neo-PW-set.xml b/A320neo-PW-set.xml index bd628100..323d8e85 100644 --- a/A320neo-PW-set.xml +++ b/A320neo-PW-set.xml @@ -206,9 +206,9 @@ Aircraft/A320-family/Systems/fadec-cfm.xml - + Aircraft/A320-family/Systems/leapx-sound.xml - + From b2f9d975340ba312ff1394461371151c97031ed9 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 8 Feb 2021 22:41:37 +0100 Subject: [PATCH 057/124] TCAS - empty diamond for threat level zero --- Nasal/Displays/traffic.nas | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index be0f3a5c..c81fc555 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -27,6 +27,7 @@ var drawBlip = func(elem, threatLvl) { if (threatLvl == 3) { # resolution advisory elem.reset() + .setStrokeLineWidth(0) .moveTo(-17,-17) .horiz(34) .vert(34) @@ -37,12 +38,14 @@ var drawBlip = func(elem, threatLvl) { # traffic advisory elem.reset() .moveTo(-17,0) + .setStrokeLineWidth(0) .arcSmallCW(17,17,0,34,0) .arcSmallCW(17,17,0,-34,0); } elsif (threatLvl == 1) { # proximate traffic elem.reset() + .setStrokeLineWidth(0) .moveTo(-14,0) .lineTo(0,-17) .lineTo(14,0) @@ -52,10 +55,11 @@ var drawBlip = func(elem, threatLvl) { else { # other traffic elem.reset() - .moveTo(-14,0) - .lineTo(0,-17) - .lineTo(14,0) - .lineTo(0,17) + .setStrokeLineWidth(4) + .moveTo(-10,0) + .lineTo(0,-14) + .lineTo(10,0) + .lineTo(0,14) .close(); } }; @@ -325,7 +329,12 @@ var TrafficLayer = { if (rgb == nil) rgb = colorDefault; var color = canvas._getColor(rgb); var (r, g, b) = rgb; - item.elems.blip.setColorFill(r, g, b); + if (threatLevel > 0) { + item.elems.blip.setColorFill(r, g, b); + } else { + item.elems.blip.setColorFill(0,0,0); + item.elems.blip.setColor(r, g, b); + } item.elems.text.setColor(r, g, b); item.elems.arrowUp.setColor(r, g, b); item.elems.arrowDown.setColor(r, g, b); From 573dbac463d490c337aaff6ccd68cba9aa200bb4 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 9 Feb 2021 13:26:28 +0000 Subject: [PATCH 058/124] 9900 feet --- Nasal/Displays/traffic.nas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index 00806390..ae1bdeba 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -273,10 +273,10 @@ var TrafficLayer = { var top = 27; var bottom = -27; if (ATCSwitchAbvBlw.getValue() == -1) { - top = 70; + top = 99; } if (ATCSwitchAbvBlw.getValue() == 1) { - bottom = -70; + bottom = -99; } var altDiff100 = ((alt or me.refAlt) - me.refAlt) / 100; From 27b9f47373c5eeafd100e5cea5dd438a37f8c3c3 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 11 Feb 2021 23:46:04 +0100 Subject: [PATCH 059/124] prototype for terrain on ND --- Models/Instruments/ND/canvas/ND.nas | 1 + .../ND/canvas/map/TERRAIN.lcontroller | 57 +++ .../Instruments/ND/canvas/map/TERRAIN.symbol | 106 +++++ .../Instruments/ND/canvas/res/terrainND.svg | 439 ++++++++++++++++++ Models/Instruments/ND/canvas/res/tile_00.png | Bin 0 -> 149 bytes Models/Instruments/ND/canvas/res/tile_04.png | Bin 0 -> 1011 bytes Models/Instruments/ND/canvas/res/tile_06.png | Bin 0 -> 1017 bytes Models/Instruments/ND/canvas/style.nas | 18 + 8 files changed, 621 insertions(+) create mode 100644 Models/Instruments/ND/canvas/map/TERRAIN.lcontroller create mode 100644 Models/Instruments/ND/canvas/map/TERRAIN.symbol create mode 100644 Models/Instruments/ND/canvas/res/terrainND.svg create mode 100644 Models/Instruments/ND/canvas/res/tile_00.png create mode 100644 Models/Instruments/ND/canvas/res/tile_04.png create mode 100644 Models/Instruments/ND/canvas/res/tile_06.png diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index d1e73e51..0abf953c 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -64,6 +64,7 @@ var myCockpit_switches = { "toggle_xtrk_error": {path: "/nd/xtrk-error", value: 0, type: "BOOL"}, "toggle_trk_line": {path: "/nd/trk-line", value: 0, type: "BOOL"}, "ADIRS3": {path: "/nd/ir-3", value: 0, type: "BOOL"}, + "toggle_terrain": {path: "/controls/switches/terr_on_nd_l", value: 0, type: "BOOL"}, }; var canvas_nd_base = { diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller new file mode 100644 index 00000000..6d062b85 --- /dev/null +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -0,0 +1,57 @@ +# See: http://wiki.flightgear.org/MapStructure +# Class things: +var name = 'TERRAIN'; +var parents = [canvas.SymbolLayer.Controller]; +var __self__ = caller(0)[0]; + +canvas.SymbolLayer.Controller.add(name, __self__); +canvas.SymbolLayer.add(name, { + parents: [MultiSymbolLayer], + type: name, # Symbol type + df_controller: __self__, # controller to use by default -- this one + df_options: { # default configuration options + viewport_radius: 670 + } +}); + +var terrain_tree = "/instrumentation/efis[0]/nd/terrain-on-nd"; + +var new = func(layer) { + var m = { + parents: [__self__], + layer: layer, + map: layer.map, + listeners: [], + }; + layer.searcher._equals = func(l,r) l.equals(r); + m.addVisibilityListener(); + return m; +}; + +var del = func() { + #print(name~".lcontroller.del()"); + foreach (var l; me.listeners) + removelistener(l); +}; + +var searchCmd = func { + if(me.map.getRange() == nil) return []; + #var lat = getprop(terrain_tree~"/center/latitude-deg"); + #var lon = getprop(terrain_tree~"/center/longitude-deg"); + + #if(lat == nil or lon == nil) { + var pos = geo.aircraft_position(); + lat = pos.lat(); + lon = pos.lon(); + #} + + var result = geo.Coord.new(); + result.set_latlon(lat, lon); + result.rangeNm = me.map.getRange(); + result.fetchRad = 184; # is this number accurate? + result.equals = func(r){ + me.fetchRad == r.fetchRad and me.lat == r.lat and me.lon == r.lon + }; + + return [result]; +}; diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol new file mode 100644 index 00000000..6c2a2b2f --- /dev/null +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -0,0 +1,106 @@ +# See: http://wiki.flightgear.org/MapStructure +# Class things: +var name = 'TERRAIN'; +var parents = [DotSym]; +var __self__ = caller(0)[0]; +DotSym.makeinstance( name, __self__ ); + +var element_type = "group"; + +var tile_list = ["tile_00.png","tile_04.png","tile_06.png"]; + +var updateTerrain = func(size){ + if(me.fetching) return; + var pos = geo.aircraft_position(); + var lat = pos.lat(); + var lon = pos.lon(); + me.fetching = 1; + + for (var a=0; a < me.tileradius; a+=1) { + + var len = size(me.terrlayer["L" ~ a]); + + for (var r=0; r < len; r+=1) { + + var imgx = math.mod(r*a,3); + + me.terrlayer["L" ~ a].setFile(me.imgpath ~ me.tile_list[imgx]).show(); + me.terrlayer["R" ~ a].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); + + } + + } + + me.last_request = getprop("sim/time/elapsed-sec"); + me.fetching = 0; +}; + +var init = func { + print('TERRAIN init'); + me.tile = 20; + me.fetching = 0; + me.timeStamp = nil; + me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch + me.range = me.model.rangeNm; # Range of Navigation Display + me.viewport_radius = me.getOption('viewport_radius', 670); + me.imgpath = get_local_path('res/'); + + var tile = me.tile; + + var gx = int(me.viewport_radius / tile); + + me.tileradius = gx; + + me.terrlayer = {}; #me.element.createChild("image").set("z-index", -100).hide(); + + var centx = me.viewport_radius; + + for (var c=0; c me.update_interval) { + me.updateTerrain(r_scaled); + } +}; + diff --git a/Models/Instruments/ND/canvas/res/terrainND.svg b/Models/Instruments/ND/canvas/res/terrainND.svg new file mode 100644 index 00000000..65bc1e02 --- /dev/null +++ b/Models/Instruments/ND/canvas/res/terrainND.svg @@ -0,0 +1,439 @@ + +image/svg+xmlGijs de Rooy▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ diff --git a/Models/Instruments/ND/canvas/res/tile_00.png b/Models/Instruments/ND/canvas/res/tile_00.png new file mode 100644 index 0000000000000000000000000000000000000000..f99f027a59825a9146482881aab818a787f0712b GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjymUKs7M+SzC{oH>NS%G}c0*}aI z1_r)EAj~ML;ne^XlqhkHC<)F_D=AMbN@XZW%*-p%%S$a$FwryAGfi=i0GTZ8>Eak- m;h!wQx;R0kr%91pLV|(i2m|BUpE9q3(hQ!ielF{r5}E)Ba3dxF literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/tile_04.png b/Models/Instruments/ND/canvas/res/tile_04.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd0732c538138393bc45729b348500f09675a4a GIT binary patch literal 1011 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;VFFSW*B017t}=K~y+TO_Yl-)nORNACBX2&T%ddM@Egg zjBaGiP}xz5u$ZAp7b&BQl9Y9CrHfRgNj0ssR=Sv3S!-;e%Uo8CR-3KArO!jPw%_mF z`+J|~`&_=?=lw}kcbdeQ{7x_F{Wa;j62JG;`SP(w$+CJMUnH?6Nj9$;EDmm6RyKOb zeQh~DY5kiEMyfe6G=~b`UIy9y@eHo)t3RHVa;I3mrOCbX!-=G)IRrXBeMbuI65_LM zyh#%Mi{I~)Bf(M?s9-Tl;N>`iZ69wY(6Q;R=)37up-#zW96Eo#^$e9^(pcd}9PZ7H zN~&4fz7I%+lOo%Hys=-5(O5-x@*7Wt#r3R}!@=jjJ-#ygf`ko|?Xo{e@@?eU_2FdW z)GgUM)*yafbRwBnkoV`tny0(T!+zs%<<;3&;<0L!EVc4bIVJFD8d+`8@&dF;N)Wq& zo?B*~Q6A>n&n=bX$5?F_qBCEYNRmJ8h||E~Ja~;oS#5OF51bQ=)9c>{S=DS3$qtY$ z4&Ac}@qu;}iGPqO2ZQFbyM2gFw$zse5@(VyBN)zWK3yO~WLGM*^GQzD1tHaklprO+ zpHpPSHS|V;>~Zm_T!b4T3`TUtHPE0!QfZV)d-PbvaxN0grI|he@OfaOHD`FcejPuC5}#y?Qbqn^yHq+692ndXn|0CkmEj#p3dpmq=v}wr zU4`z8?5qe3;Uc9Dswy3=mk3|j#=wK2exi*HU;?R-xwf$ORR~EG4N>jVw$&Wz%TABN zjiqR#)m!Aq(wHk+Nz!wOGdm4$>`j!5E;KR#oBvrcQ-g zDlF(B3-S^hfQHMrVLJQuk(j-Ri#OI~4?S8)rWL$!<8;I~ z2IPtZI2645c2Tk&G{k8vnkJJ@8rHsNJT9SAVkn4%~Pb# zc7*TIsZN}^VUVXHGsp@K@zJ%?NmtOLfYlbgNkps*!bA&PL#6gVAr+!;fPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;VFFSW*B018PY`K~y+TO_YgCR8bVh-@g(FiAseTEoz`d zScJ4$L<>oqv{;%g7PeSeX8T5^R+^TIXsEeV4z`IXmaXD~QHnV_&f?7IIF6ovXRHV= zm;3HH-&wxz+-G#}Y?MyV*y$geW`tP|f4jRNtuP`>>YbD4eo2Q%THLQ!ln$nRDT=&e zKKL1*#+6SiqO!U1W%L_-Px&Ng;VE1>XD>V{g;sG+N~Zb2qO+~*YY22MbeELdWnkh_ zc&2<9EnR$5E)GiWu!6-a!$;Z)mKUBup!1;#T|3@Ug*vskao96+sVSxilg8@x;;=m+ zQkvXGa!{-kSSd0waGCvBr^YI?liz!`uRZ>iTpmoDwefK98WLU#OOzW!Qt2Sa{Y7W8 z=I%8fM_iJzDLRn`C&+C95gDO7$-}ueI{#4cDls`VO1)ZHR89#j&W5~kX?Y{sBqfO5 zN6)Dt>nIQN?fI$s;pf>M$GaMqmq_axD2F(VgmseJUiCc6+o(lhbgW=mB#yBn|+4UZ0mz6P+j3 zj_T-#5KEEVPYc<+wu-YfyXDi^zQC9d8|nB7`RmG84<@-2nV_;#pIxm?6U;?R-)sDWz_XtT84Uui3Z9~mH zHd zU^wB58!YH00cf~N2d0y=H;a3UxOijzvc;r@G&sQ< zyf{W&YDX%gav)H_FGi+W(dqvyB&8yXX1-@Z6okASw% Date: Fri, 12 Feb 2021 00:23:26 +0100 Subject: [PATCH 060/124] enable print for debuging --- Models/Instruments/ND/canvas/loaders.nas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/loaders.nas b/Models/Instruments/ND/canvas/loaders.nas index e8cb8782..d0345237 100644 --- a/Models/Instruments/ND/canvas/loaders.nas +++ b/Models/Instruments/ND/canvas/loaders.nas @@ -16,7 +16,7 @@ setlistener("/nasal/canvas/loaded", func() { var aircraft_root = getprop("/sim/aircraft-dir"); var load = func(file, name) { - #print("Loading ..." ~ file); + print("Loading ..." ~ file); if (name == nil) var name = split("/", file)[-1]; if (substr(name, size(name)-4) == ".draw") @@ -28,7 +28,7 @@ setlistener("/nasal/canvas/loaded", func() { #var code = call(compile, [code], var err=[]); var code = call(func compile(code, file), [code], var err=[]); if (size(err)) { - #print("handling error"); + print("handling error"); if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature var e = split(" at line ", err[0]); if (size(e) == 2) From f2034e048240d71b32392e01b63421f6187f90e4 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 13 Feb 2021 00:38:43 +0100 Subject: [PATCH 061/124] Tech version of terrain radar works (at most) --- Models/Instruments/ND/canvas/ND.nas | 2 +- .../ND/canvas/framework/navdisplay.nas | 5 + Models/Instruments/ND/canvas/loaders.nas | 2 +- .../ND/canvas/map/TERRAIN.lcontroller | 4 +- .../Instruments/ND/canvas/map/TERRAIN.symbol | 135 ++++++++++++++---- .../ND/canvas/res/terrain/tile_01.png | Bin 0 -> 3197 bytes .../ND/canvas/res/terrain/tile_02.png | Bin 0 -> 175 bytes .../ND/canvas/res/terrain/tile_03.png | Bin 0 -> 3321 bytes .../ND/canvas/res/terrain/tile_04.png | Bin 0 -> 175 bytes .../ND/canvas/res/terrain/tile_05.png | Bin 0 -> 3183 bytes .../ND/canvas/res/terrain/tile_06.png | Bin 0 -> 175 bytes Models/Instruments/ND/canvas/res/tile_00.png | Bin 149 -> 0 bytes Models/Instruments/ND/canvas/res/tile_04.png | Bin 1011 -> 0 bytes Models/Instruments/ND/canvas/res/tile_06.png | Bin 1017 -> 0 bytes Models/Instruments/ND/canvas/style.nas | 28 +++- 15 files changed, 135 insertions(+), 41 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_01.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_02.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_03.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_04.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_05.png create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_06.png delete mode 100644 Models/Instruments/ND/canvas/res/tile_00.png delete mode 100644 Models/Instruments/ND/canvas/res/tile_04.png delete mode 100644 Models/Instruments/ND/canvas/res/tile_06.png diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 0abf953c..41088b16 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -48,7 +48,7 @@ var myCockpit_switches = { "toggle_waypoints": {path: "/inputs/wpt", value:0, type:"BOOL"}, "toggle_position": {path: "/inputs/pos", value:0, type:"BOOL"}, "toggle_data": {path: "/inputs/data",value:0, type:"BOOL"}, - "toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, + #"toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, "toggle_traffic": {path: "/inputs/tfc",value:0, type:"BOOL"}, "toggle_centered": {path: "/inputs/nd-centered",value:0, type:"BOOL"}, "toggle_lh_vor_adf": {path: "/input/lh-vor-adf",value:0, type:"INT"}, diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 7778f57c..c9eab922 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -374,6 +374,11 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if(wxr_live_enabled == nil or wxr_live_enabled == '') wxr_live_enabled = 0; me.set_switch('toggle_weather_live', wxr_live_enabled); + + var terr_enabled = getprop("/controls/switches/terr_on_nd_l"); + if (terr_enabled == nil) terr_enabled = 0; + if (me.get_switch('toggle_terrain') != terr_enabled) me.set_switch('toggle_terrain', terr_enabled); + call(me.update_sub, nil, nil, caller(0)[0]); # call this in the same namespace to "steal" its variables # MapStructure update! diff --git a/Models/Instruments/ND/canvas/loaders.nas b/Models/Instruments/ND/canvas/loaders.nas index d0345237..ed72a08d 100644 --- a/Models/Instruments/ND/canvas/loaders.nas +++ b/Models/Instruments/ND/canvas/loaders.nas @@ -16,7 +16,7 @@ setlistener("/nasal/canvas/loaded", func() { var aircraft_root = getprop("/sim/aircraft-dir"); var load = func(file, name) { - print("Loading ..." ~ file); + #print("Loading ..." ~ file); if (name == nil) var name = split("/", file)[-1]; if (substr(name, size(name)-4) == ".draw") diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller index 6d062b85..9528ee29 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -41,8 +41,8 @@ var searchCmd = func { #if(lat == nil or lon == nil) { var pos = geo.aircraft_position(); - lat = pos.lat(); - lon = pos.lon(); + var lat = pos.lat(); + var lon = pos.lon(); #} var result = geo.Coord.new(); diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 6c2a2b2f..98cfa985 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,43 +7,110 @@ DotSym.makeinstance( name, __self__ ); var element_type = "group"; -var tile_list = ["tile_00.png","tile_04.png","tile_06.png"]; +var tile_list = ["tile_01.png","tile_01.png","tile_02.png","tile_03.png","tile_03.png","tile_03.png","tile_04.png","tile_04.png","tile_06.png","tile_09.png",]; + +var radar_beacon = 0; +var radar_cycle = 0; + +var get_elevation = func (lat, lon) { + + var info = geodinfo(lat, lon); + var elevation = 0; + if (info != nil) { elevation = int(info[0] * 3.2808399); } + else { elevation = nil; } + return elevation; + +} + + +var updateTerrain = func(r_scaled){ -var updateTerrain = func(size){ if(me.fetching) return; - var pos = geo.aircraft_position(); - var lat = pos.lat(); - var lon = pos.lon(); + me.fetching = 1; - for (var a=0; a < me.tileradius; a+=1) { + var RAD2DEG = 57.2957795; + var DEG2RAD = 0.016774532925; - var len = size(me.terrlayer["L" ~ a]); + var pos = geo.aircraft_position(); + var pos_lat = pos.lat(); + var pos_lon = pos.lon(); + + var heading = getprop("orientation/heading-magnetic-deg"); + var altitudeagl = getprop("/position/altitude-agl-ft"); + + var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; + var a = int(me.radar_beacon/2); + var col = a; + + if (side == "L") { + col = -1 + (-1 * a); + } + + var col = me.radar_beacon - me.tileradius; + + #for (var a=0; a < me.tileradius; a+=1) { + + #var trnL = me.terrlayer["L" ~ a]; + #var trnR = me.terrlayer["R" ~ a]; + var trn = me.terrlayer[side ~ a]; + + var len = size(trn); + var range = me.range; + + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 60); + var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 60); + + var elevft = []; + + for (var row = 0; row <= len; row += 1) { + + var point_lon = proj_lon + ((row * (range/30) / 60) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/30) / 60) * math.cos(DEG2RAD * heading)); + + var elev = me.get_elevation(point_lat, point_lon); + if (elev != nil) { + var grad = int((elev - altitudeagl + 500)/500); + if (grad>6) grad = 6; + else if (grad<-3) grad = -3; + + append(elevft,grad+2); # (-1)-8 + } else { + append(elevft,8); # magenta + } + + } for (var r=0; r < len; r+=1) { - var imgx = math.mod(r*a,3); - - me.terrlayer["L" ~ a].setFile(me.imgpath ~ me.tile_list[imgx]).show(); - me.terrlayer["R" ~ a].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); + var imgx = elevft[r]; + if (imgx < 0) trn[r].hide(); + else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); + #trnR[r].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); } + #} + + me.radar_beacon += 1; + if (me.radar_beacon >= (me.tileradius*2)) { + me.radar_beacon = 0; + me.radar_cycle += 1; } - me.last_request = getprop("sim/time/elapsed-sec"); + #me.last_request = getprop("sim/time/elapsed-sec"); me.fetching = 0; }; var init = func { - print('TERRAIN init'); - me.tile = 20; + #print('TERRAIN init'); + me.tile = 33; # better 34 me.fetching = 0; me.timeStamp = nil; me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); - me.imgpath = get_local_path('res/'); + me.imgpath = get_local_path('res/terrain/'); var tile = me.tile; @@ -53,27 +120,28 @@ var init = func { me.terrlayer = {}; #me.element.createChild("image").set("z-index", -100).hide(); - var centx = me.viewport_radius; + var centx = 0; #me.viewport_radius * -0.5; + var centy = -me.viewport_radius; for (var c=0; c me.update_interval) { + var rot = getprop("orientation/heading-deg"); + rot -= me.layer.map.getHdg(); + me.element.setRotation(rot*D2R); + + + #if(getprop("sim/time/elapsed-sec") - me.last_request >= me.update_interval) { me.updateTerrain(r_scaled); - } + #} }; diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_01.png b/Models/Instruments/ND/canvas/res/terrain/tile_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b7d71182caa397e60922a332e4ddbe114ff9f9 GIT binary patch literal 3197 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 literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_02.png b/Models/Instruments/ND/canvas/res/terrain/tile_02.png new file mode 100644 index 0000000000000000000000000000000000000000..c20336c8202d6e16345304da8bc77548e12be82f GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?xt?MK!z{fPyZbE{-7)?r+a2GByN=95}%4De#5gopIm6 z4NMB}&b-<7+3MZT#=kG0_e_~+6y$cwLsC;YbqO-(Np2eBLMNumNjKtG0nKCZboFyt I=akR{06VreHvj+t literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_03.png b/Models/Instruments/ND/canvas/res/terrain/tile_03.png new file mode 100644 index 0000000000000000000000000000000000000000..ca873469f2f54a55d2e33c11e941f049e6826a0e GIT binary patch literal 3321 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D430@eK~z{rEtpwv z9NB%vPc2fZZb&N=^cX2fRdr5U znwQR;DXCP=Yc!0tvo+GjR-)qrOG!VL6(@3i*5)KjQp{tq$8eG=;fI3nsa)f;9LX;y zic;R0NZn(eL+P|9r8etbM^2}mTVp+&xC(jE^=!>_9L=9i^kB812Va!6dZ(=AMOP(1 z)xk-s<5OueisTSMaf&GNY{*B#rWU`8Lb4(wzYwdl80+@+ydK`k>E4Z;KE2sgnM6-c zLv=?aPX-0AAiGqF)NCi3osZS#neN0Y)kCeE_4Ucwx~3Yoin&0pHBjD*6h>nzm&oH_ zuNbP-oTzg))`hE%&R_A=nzvM`JMw&o>PS9`b>^zNd|_IbR%)7`chv6qR7t87%-<#3 z8p^q|sGDdd%a`+P5-FwJ=N2j|m#dl#Qtj;}+J2Sj*~>^fZylW+2J)%G@`7~# zbLmH`p6>pzs;k!;lqOLSr|NeJdXgwl!1YQ|wVIz*{j~3BXJ?|P>m!Xvp1gcQ@D%Wu zYt8iRazS%*6?uh{zJ2;$kG^}YFeGE}V)|;nw*u+adwP2y1w*M-lJ4B9>gQiJb?pZ= z*~LiDUYzQ;zd6)jz8PwJlb9k$CE7F96qTTZMQH#=j={(){+>jh8dIrmU9ZdfkAJ(I zcIGIhN8e6jJ$ihk$N#&pJ+P35wh}T72_lUw9ryX&*Z@+Rp=FmY7Ig3PyjCt0<#-91 z2KvumAL!*4hk>JnKpaq;qx^Z=;E>n|Ttp-`;;9nY(wwcI|71bdzx;DPZA@7LxEhXQ zJ$V)C@I)GOc$ou711drVx;&md{EH9ZzW-XlqYeUzd7E1kQ#@ z94qgB1f*FvVb7sq3aFkqiDoJ`ElYF>Xju1e0}1+_<8g?vIb-kvW-itgjzev44fXv? zY4Zgek)>&s+1TL(pDaBe_K-2>X+*UKeKM`&p=+wp3HV;B0n7k8^P_fN^In&qsc_6@ zIRj|g>@-V-wQe_6uWQLssuqFV|KXBud|J@T`J##d#fl=@mZ(Q%Or=6}X9z_jbY#Ne z0Z&B94VFx`${b#AM!I^TpwDks^yAfzt}T}|GgAWSLk)O81kg#GW4%l8oV_&XuGv|N z7QKX)MBgY5b*7W>8LQbWfuEv|15fWyBK7;Wg3wWp(&njRrEIB4CH*Q7;#K0)0B~u+ z)%|;mx^^X}r86#VpUGES$gu~SnC@DutRTy0xCN}H7%70;Odo6bo=&_TJ=5^@O5s= zHlTvO%lDyXrfqbfqzCt;D;M)BR(-ue0KfUp(trK;Yn`AOhO!B&KL%r=84r9$W(v@% zLNx~@sD9B;(1E&cT(4-Dzur$2YKLu&>^AMeAu}Ve^>&SQk@aFTD`n=yYqKFt8MULsIh0xeM2|wp@q~a14 zDFq`Ny&}oGH{8^tM`dU`VdDw2fa+&o_Wz5V&&dfWANIrS9h(Os%`&x2Fey5aPgSlK zRBia`4SJcTq{zE%r>G~QMxZfKo8Tv`>mhswE8*A#!yYSVP-l}-!A2YSB_}y%uupKY1{% zaw*pC;Y8nmKhW3TNJq3jjy(;*o71Y=YdIDhIEFZ*F{9h1{0kVN&u&z8f3>Q+w;MWt zz6=e~^2ArSn*dsmF`m$_7_5N)l1<;)m;lgRT9kw0soKn=Tc0&_c{$Yib9p=uqk{@; zy%_5V@EX9>sG{xUP)K}YJ|AIr*pzk{rCeI{koltSUiWnSs*7LAX>q|rAxo;%c)=Ml z)>GEf7AHkhj2K30F{kFym2zzYGw2^6Pf^f-Z!LKWdTG{rgDZ>~EluQCVB%-Dv}TM+ z8;{zc9e_Kl$P`nti483KfQrrb_C}QSP>;Vo)$Z;%^CS@!v_WBG8f&@4Y`N&@vzran zwW_0|ff5r3pbk-D-_K!|Y`uLQYyBw-yAv_(34}tlW&!iR{xYB5#F#W{C2cWjfB(mx z*0%?maDEHR*J5r|3T`%8x8DVNy$dCoo_$zhn3J#NG`AS(;X_>7ohIdP>Dl+k`uAV$ z>*KanKwtei(6i?-Wgl%J5QBaPI_5Cc#j=xO#LK1H|L}q8ePAvPH32_{q(%W9!?dBR zKI@ZF0mI~T3!pui?Q(Hi&clZ@Yf0>DYkQRW(w#Snw%!eCk>NiwX!L>wJt{DPa!KlD z{N2LOu zn%GD~KK6h(8P*yA`06EFE6Y{2I(59Nt>6CYtsbvW6d-o4Tg1c0XxBu}R7q>6(C83d zV8p0MAFp9(e(?`;x_{Tx%}ZP>=5gTY#b}s7-AE(sp7En8EUPOfBX3r0bat`m(Gqe^%As+@M9MY`@3NZr@d}R{*GatgSKG#w0Ogj93NC7jROl z*=n?Nsx%n)X#n+kz}}GT4cpAMQRZ>4ZHTk3sGj;Pe>vZ@H}> z;N%Nfg0@;*IggK199kq^1KoTM0u(i5QbJ*dq)k>sD7d#f(#B>_&tFdT{CNx|rPmmu zeJVK^8GC6wKu#_e`x%c1%$p#z11VRF=YnSY_T2C}@F5=vQTP;_|`+aR}r+S6G%WirB;zlW1r;yuT z!2zK;iwpHAGr@+g=CWPjcjD@5yzK=0XAD&gMY6jNm#6~E%>P4-+!(PlgV2E27-(yG z7F&Zf7s$rkPr;LFh?OzRCS!A1!VP9-mvdEsa`}7>FFVnPgMMa;i4qZ`*USbV;6+wQ z-#Ha)VeY<#JSKY~)--d);LZ%Y_mJU`ik;B9D6sT@ONQqk{&h!!00000NkvXXu0mjf D`rTts literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_04.png b/Models/Instruments/ND/canvas/res/terrain/tile_04.png new file mode 100644 index 0000000000000000000000000000000000000000..aa0778293a5c8f12f23b023e556ab9c2e0840e66 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?xt?MK!z{fPyZbE{-7)?r+a2GByN=95}%4`68azopIm6 z4NMB}&b-<7+UDKQ#=kG0_e_~+6y$cwLsC;YbqO-(Np2eBF(YP&2b%)Tf#xxIy85}S Ib4q9e07nKj_5c6? literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_05.png b/Models/Instruments/ND/canvas/res/terrain/tile_05.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4a16163093f884042b29f03aaf9d8d251e53ef GIT binary patch literal 3183 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 V;k(cstFiz9002ovPDHLkV1jwN7-9eb literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_06.png b/Models/Instruments/ND/canvas/res/terrain/tile_06.png new file mode 100644 index 0000000000000000000000000000000000000000..151be7c439d2ae33340dcbbecb1485cee2b5a8df GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=Digg?xt?MK!z{fPyZbE{-7)?r+a2GByN=95}%4S@31O8{@u% z8<-T{oq4nEwZ;3NjelQ0@0l{uD9G)Uhoq)*>JntmliW1M8#9?|uEcJT1e(X->FVdQ I&MBb@0E8hoMF0Q* literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/tile_00.png b/Models/Instruments/ND/canvas/res/tile_00.png deleted file mode 100644 index f99f027a59825a9146482881aab818a787f0712b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjymUKs7M+SzC{oH>NS%G}c0*}aI z1_r)EAj~ML;ne^XlqhkHC<)F_D=AMbN@XZW%*-p%%S$a$FwryAGfi=i0GTZ8>Eak- m;h!wQx;R0kr%91pLV|(i2m|BUpE9q3(hQ!ielF{r5}E)Ba3dxF diff --git a/Models/Instruments/ND/canvas/res/tile_04.png b/Models/Instruments/ND/canvas/res/tile_04.png deleted file mode 100644 index 5cd0732c538138393bc45729b348500f09675a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;VFFSW*B017t}=K~y+TO_Yl-)nORNACBX2&T%ddM@Egg zjBaGiP}xz5u$ZAp7b&BQl9Y9CrHfRgNj0ssR=Sv3S!-;e%Uo8CR-3KArO!jPw%_mF z`+J|~`&_=?=lw}kcbdeQ{7x_F{Wa;j62JG;`SP(w$+CJMUnH?6Nj9$;EDmm6RyKOb zeQh~DY5kiEMyfe6G=~b`UIy9y@eHo)t3RHVa;I3mrOCbX!-=G)IRrXBeMbuI65_LM zyh#%Mi{I~)Bf(M?s9-Tl;N>`iZ69wY(6Q;R=)37up-#zW96Eo#^$e9^(pcd}9PZ7H zN~&4fz7I%+lOo%Hys=-5(O5-x@*7Wt#r3R}!@=jjJ-#ygf`ko|?Xo{e@@?eU_2FdW z)GgUM)*yafbRwBnkoV`tny0(T!+zs%<<;3&;<0L!EVc4bIVJFD8d+`8@&dF;N)Wq& zo?B*~Q6A>n&n=bX$5?F_qBCEYNRmJ8h||E~Ja~;oS#5OF51bQ=)9c>{S=DS3$qtY$ z4&Ac}@qu;}iGPqO2ZQFbyM2gFw$zse5@(VyBN)zWK3yO~WLGM*^GQzD1tHaklprO+ zpHpPSHS|V;>~Zm_T!b4T3`TUtHPE0!QfZV)d-PbvaxN0grI|he@OfaOHD`FcejPuC5}#y?Qbqn^yHq+692ndXn|0CkmEj#p3dpmq=v}wr zU4`z8?5qe3;Uc9Dswy3=mk3|j#=wK2exi*HU;?R-xwf$ORR~EG4N>jVw$&Wz%TABN zjiqR#)m!Aq(wHk+Nz!wOGdm4$>`j!5E;KR#oBvrcQ-g zDlF(B3-S^hfQHMrVLJQuk(j-Ri#OI~4?S8)rWL$!<8;I~ z2IPtZI2645c2Tk&G{k8vnkJJ@8rHsNJT9SAVkn4%~Pb# zc7*TIsZN}^VUVXHGsp@K@zJ%?NmtOLfYlbgNkps*!bA&PL#6gVAr+!;fPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;VFFSW*B018PY`K~y+TO_YgCR8bVh-@g(FiAseTEoz`d zScJ4$L<>oqv{;%g7PeSeX8T5^R+^TIXsEeV4z`IXmaXD~QHnV_&f?7IIF6ovXRHV= zm;3HH-&wxz+-G#}Y?MyV*y$geW`tP|f4jRNtuP`>>YbD4eo2Q%THLQ!ln$nRDT=&e zKKL1*#+6SiqO!U1W%L_-Px&Ng;VE1>XD>V{g;sG+N~Zb2qO+~*YY22MbeELdWnkh_ zc&2<9EnR$5E)GiWu!6-a!$;Z)mKUBup!1;#T|3@Ug*vskao96+sVSxilg8@x;;=m+ zQkvXGa!{-kSSd0waGCvBr^YI?liz!`uRZ>iTpmoDwefK98WLU#OOzW!Qt2Sa{Y7W8 z=I%8fM_iJzDLRn`C&+C95gDO7$-}ueI{#4cDls`VO1)ZHR89#j&W5~kX?Y{sBqfO5 zN6)Dt>nIQN?fI$s;pf>M$GaMqmq_axD2F(VgmseJUiCc6+o(lhbgW=mB#yBn|+4UZ0mz6P+j3 zj_T-#5KEEVPYc<+wu-YfyXDi^zQC9d8|nB7`RmG84<@-2nV_;#pIxm?6U;?R-)sDWz_XtT84Uui3Z9~mH zHd zU^wB58!YH00cf~N2d0y=H;a3UxOijzvc;r@G&sQ< zyf{W&YDX%gav)H_FGi+W(dqvyB&8yXX1-@Z6okASw% Date: Sat, 13 Feb 2021 00:39:38 +0100 Subject: [PATCH 062/124] reverse beacon radar side --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 98cfa985..cf565c8f 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -43,7 +43,7 @@ var updateTerrain = func(r_scaled){ var a = int(me.radar_beacon/2); var col = a; - if (side == "L") { + if (side == "R") { col = -1 + (-1 * a); } From 0026a6e3a331b660773798c110f9c4dd7ebd3827 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 13 Feb 2021 11:21:29 +0100 Subject: [PATCH 063/124] code update - radar clean func --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 53 ++++++++++++++---- .../ND/canvas/res/terrain/tile_09.png | Bin 0 -> 3173 bytes Models/Instruments/ND/canvas/style.nas | 22 ++------ 3 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_09.png diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index cf565c8f..377b4112 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,10 +7,11 @@ DotSym.makeinstance( name, __self__ ); var element_type = "group"; -var tile_list = ["tile_01.png","tile_01.png","tile_02.png","tile_03.png","tile_03.png","tile_03.png","tile_04.png","tile_04.png","tile_06.png","tile_09.png",]; +var tile_list = ["*black*","tile_01.png","tile_02.png","tile_03.png","tile_04.png","tile_06.png","tile_09.png"]; var radar_beacon = 0; var radar_cycle = 0; +var rader_cleared = 0; var get_elevation = func (lat, lon) { @@ -28,6 +29,7 @@ var updateTerrain = func(r_scaled){ if(me.fetching) return; me.fetching = 1; + me.rader_cleared = 0; var RAD2DEG = 57.2957795; var DEG2RAD = 0.016774532925; @@ -47,7 +49,7 @@ var updateTerrain = func(r_scaled){ col = -1 + (-1 * a); } - var col = me.radar_beacon - me.tileradius; + #var col = me.radar_beacon - me.tileradius; #for (var a=0; a < me.tileradius; a+=1) { @@ -58,6 +60,8 @@ var updateTerrain = func(r_scaled){ var len = size(trn); var range = me.range; + var tiles = me.tile_list; + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 60); var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 60); @@ -69,14 +73,22 @@ var updateTerrain = func(r_scaled){ var point_lat = proj_lat + ((row * (range/30) / 60) * math.cos(DEG2RAD * heading)); var elev = me.get_elevation(point_lat, point_lon); + var grad = 0; #black if (elev != nil) { - var grad = int((elev - altitudeagl + 500)/500); - if (grad>6) grad = 6; - else if (grad<-3) grad = -3; - - append(elevft,grad+2); # (-1)-8 + var diff = elev - altitudeagl; + if (diff>=0) { + grad = int(diff/1000) + 3; + if (grad>5) grad = 5; + } else { + if (diff<500) grad = 3; # lite yellowe + else { + grad = 2 + int(diff/1000); + if (grad<0) grad = 0; + } + } + append(elevft,grad); # 0-5 } else { - append(elevft,8); # magenta + append(elevft,6); # magenta } } @@ -84,7 +96,7 @@ var updateTerrain = func(r_scaled){ for (var r=0; r < len; r+=1) { var imgx = elevft[r]; - if (imgx < 0) trn[r].hide(); + if (imgx < 1) trn[r].hide(); else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); #trnR[r].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); @@ -111,6 +123,7 @@ var init = func { me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); me.imgpath = get_local_path('res/terrain/'); + me.rader_cleared = 1; var tile = me.tile; @@ -150,6 +163,23 @@ var init = func { #http.load("https://api.rainviewer.com/public/maps.json").done(func(r) me.timeStamp = processRequest(r)); }; +var clear = func { + + if (me.rader_cleared == 0) { + for (var c=0; cN2bZe?^J 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 Date: Sat, 13 Feb 2021 17:06:04 +0100 Subject: [PATCH 064/124] fix above colors --- Models/Instruments/ND/canvas/framework/navdisplay.nas | 2 +- Models/Instruments/ND/canvas/map/TERRAIN.lcontroller | 1 + Models/Instruments/ND/canvas/map/TERRAIN.symbol | 2 +- Models/Instruments/ND/canvas/style.nas | 4 +--- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index c9eab922..04a59949 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -627,7 +627,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec # conditional stuff if(!contains(feature.impl, "predicate")) continue; # no conditional stuff if ( var result=feature.impl.predicate(me) ) - feature.impl.is_true(me, result); # pass the result to the predicate + feature.impl.is_true(me, result); # pass the result to the predicate else feature.impl.is_false( me, result ); # pass the result to the predicate } diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller index 9528ee29..6a1a5a89 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -21,6 +21,7 @@ var new = func(layer) { parents: [__self__], layer: layer, map: layer.map, + startpos: layer.map.getPosCoord(), listeners: [], }; layer.searcher._equals = func(l,r) l.equals(r); diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 377b4112..18f86a2c 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -80,7 +80,7 @@ var updateTerrain = func(r_scaled){ grad = int(diff/1000) + 3; if (grad>5) grad = 5; } else { - if (diff<500) grad = 3; # lite yellowe + if (diff>-500) grad = 3; # lite yellow else { grad = 2 + int(diff/1000); if (grad<0) grad = 0; diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 1422426b..f34b7054 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -101,9 +101,7 @@ canvas.NDStyles["Airbus"] = { options: { viewport_radius: 670, #512, #706, position_callback: func(nd, pos){ - var curr= geo.aircraft_position(); - pos.lat = curr.lat(); - pos.lon = curr.lon(); + pos = me.startpos; } }, "z-index": -100, From 767d98f42cabe7ab0b1caf6c818c1990881b0723 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 13 Feb 2021 23:00:50 +0100 Subject: [PATCH 065/124] radar position fixed and range shorted --- .../ND/canvas/map/TERRAIN.lcontroller | 7 +- .../Instruments/ND/canvas/map/TERRAIN.symbol | 73 ++++++++++--------- Models/Instruments/ND/canvas/style.nas | 6 +- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller index 6a1a5a89..dfe9f333 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -14,14 +14,13 @@ canvas.SymbolLayer.add(name, { } }); -var terrain_tree = "/instrumentation/efis[0]/nd/terrain-on-nd"; +var terrain_tree = "/instrumentation/terrain"; var new = func(layer) { var m = { parents: [__self__], layer: layer, map: layer.map, - startpos: layer.map.getPosCoord(), listeners: [], }; layer.searcher._equals = func(l,r) l.equals(r); @@ -42,8 +41,8 @@ var searchCmd = func { #if(lat == nil or lon == nil) { var pos = geo.aircraft_position(); - var lat = pos.lat(); - var lon = pos.lon(); + lat = pos.lat(); + lon = pos.lon(); #} var result = geo.Coord.new(); diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 18f86a2c..0b4098a8 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -23,7 +23,6 @@ var get_elevation = func (lat, lon) { } - var updateTerrain = func(r_scaled){ if(me.fetching) return; @@ -39,7 +38,13 @@ var updateTerrain = func(r_scaled){ var pos_lon = pos.lon(); var heading = getprop("orientation/heading-magnetic-deg"); - var altitudeagl = getprop("/position/altitude-agl-ft"); + var altitudeft = pos.alt() * 3.2808399; + + if (me.basealtitudeft == nil) { + var basealtft = me.get_elevation(pos_lat,pos_lon); + if (basealtft == nil) basealtft = 0; + me.basealtitudeft = basealtft + 400; + } var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; var a = int(me.radar_beacon/2); @@ -62,28 +67,31 @@ var updateTerrain = func(r_scaled){ var tiles = me.tile_list; - var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 60); - var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 60); + var proj_lon = pos_lon + ((col * (range/15) * math.sin(DEG2RAD * (heading - 90))) / 30); + var proj_lat = pos_lat + ((col * (range/15) * math.cos(DEG2RAD * (heading - 90))) / 30); var elevft = []; for (var row = 0; row <= len; row += 1) { - var point_lon = proj_lon + ((row * (range/30) / 60) * math.sin(DEG2RAD * heading)); - var point_lat = proj_lat + ((row * (range/30) / 60) * math.cos(DEG2RAD * heading)); + var point_lon = proj_lon + ((row * (range/15) / 30) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/15) / 30) * math.cos(DEG2RAD * heading)); var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black if (elev != nil) { - var diff = elev - altitudeagl; - 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 (elev < me.basealtitudeft) grad = 0; # < 400 (at airport) use blank - trivial + 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; + } } } append(elevft,grad); # 0-5 @@ -116,7 +124,7 @@ var updateTerrain = func(r_scaled){ var init = func { #print('TERRAIN init'); - me.tile = 33; # better 34 + me.tile = 33; # preferred 34 me.fetching = 0; me.timeStamp = nil; me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch @@ -124,6 +132,8 @@ var init = func { me.viewport_radius = me.getOption('viewport_radius', 670); me.imgpath = get_local_path('res/terrain/'); me.rader_cleared = 1; + me.basealtitudeft = nil; + me.visible = 0; var tile = me.tile; @@ -136,6 +146,8 @@ var init = func { var centx = 0; #me.viewport_radius * -0.5; var centy = -me.viewport_radius; + var group = me.group.createChild("group").set("z-index", -100); #me.element + for (var c=0; c= me.update_interval) { - me.updateTerrain(r_scaled); - #} }; diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index f34b7054..f3174d52 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -100,9 +100,9 @@ canvas.NDStyles["Airbus"] = { }, # end of layer update predicate options: { viewport_radius: 670, #512, #706, - position_callback: func(nd, pos){ - pos = me.startpos; - } + #position_callback: func(nd, pos){ + # pos = me.startpos; + #} }, "z-index": -100, }, From 5bd45e0709b6434b5f465a94e744a19038641d43 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 13 Feb 2021 23:21:56 +0100 Subject: [PATCH 066/124] range changed --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 0b4098a8..01668c33 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -67,15 +67,15 @@ var updateTerrain = func(r_scaled){ var tiles = me.tile_list; - var proj_lon = pos_lon + ((col * (range/15) * math.sin(DEG2RAD * (heading - 90))) / 30); - var proj_lat = pos_lat + ((col * (range/15) * math.cos(DEG2RAD * (heading - 90))) / 30); + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 30); + var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 30); var elevft = []; for (var row = 0; row <= len; row += 1) { - var point_lon = proj_lon + ((row * (range/15) / 30) * math.sin(DEG2RAD * heading)); - var point_lat = proj_lat + ((row * (range/15) / 30) * math.cos(DEG2RAD * heading)); + var point_lon = proj_lon + ((row * (range/30) / 30) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/30) / 30) * math.cos(DEG2RAD * heading)); var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black From 112eff446280adbe9eaeec66c08296fad713e452 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sat, 13 Feb 2021 23:57:09 +0100 Subject: [PATCH 067/124] skip not visible ft tiles and minor range zoom out --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 01668c33..48c384d9 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -67,15 +67,20 @@ var updateTerrain = func(r_scaled){ var tiles = me.tile_list; - var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 30); - var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 30); + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 40); + var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 40); var elevft = []; - for (var row = 0; row <= len; row += 1) { + for (var row = 0; row < len; row += 1) { - var point_lon = proj_lon + ((row * (range/30) / 30) * math.sin(DEG2RAD * heading)); - var point_lat = proj_lat + ((row * (range/30) / 30) * math.cos(DEG2RAD * heading)); + if (trn[row] == nil) { + append(elevft,-1); + continue; + } + + var point_lon = proj_lon + ((row * (range/30) / 40) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/30) / 40) * math.cos(DEG2RAD * heading)); var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black @@ -104,6 +109,7 @@ var updateTerrain = func(r_scaled){ for (var r=0; r < len; r+=1) { var imgx = elevft[r]; + if (imgx == -1) continue; if (imgx < 1) trn[r].hide(); else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); #trnR[r].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); @@ -151,14 +157,20 @@ var init = func { for (var c=0; c Date: Sun, 14 Feb 2021 16:50:50 +0000 Subject: [PATCH 068/124] Simbrief parser: handle no alternate --- Nasal/FMGC/SimbriefParser.nas | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Nasal/FMGC/SimbriefParser.nas b/Nasal/FMGC/SimbriefParser.nas index 087c1f44..9c4b7d21 100644 --- a/Nasal/FMGC/SimbriefParser.nas +++ b/Nasal/FMGC/SimbriefParser.nas @@ -134,12 +134,14 @@ var SimbriefParser = { fmgc.flightPlanController.flightplans[3].destination_runway = runwayStore; } - var alternateID = me.OFP.getNode("alternate/icao_code").getValue(); - var alternates = findAirportsByICAO(alternateID); - if (alternates != nil and size(alternates) != 0) { - fmgc.FMGCInternal.altAirport = alternateID; - atsu.ATISInstances[2].newStation(alternateID); - fmgc.FMGCInternal.altAirportSet = 1; + var alternateID = me.OFP.getNode("alternate/icao_code") == nil ? nil : me.OFP.getNode("alternate/icao_code").getValue(); + if (alternateID != nil) { + var alternates = findAirportsByICAO(alternateID); + if (size(alternates) != 0) { + fmgc.FMGCInternal.altAirport = alternateID; + atsu.ATISInstances[2].newStation(alternateID); + fmgc.FMGCInternal.altAirportSet = 1; + } } var wps = []; From d08be1e6133de8a297b0a81926ec917da66d20ef Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 14 Feb 2021 21:00:19 +0100 Subject: [PATCH 069/124] real "empty" diamond --- Nasal/Displays/traffic.nas | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Nasal/Displays/traffic.nas b/Nasal/Displays/traffic.nas index ae1bdeba..92009a4a 100644 --- a/Nasal/Displays/traffic.nas +++ b/Nasal/Displays/traffic.nas @@ -60,7 +60,7 @@ var drawBlip = func(elem, threatLvl) { .lineTo(0,-14) .lineTo(10,0) .lineTo(0,14) - .close(); + .lineTo(-10,0); } }; @@ -329,9 +329,8 @@ var TrafficLayer = { var color = canvas._getColor(rgb); var (r, g, b) = rgb; if (threatLevel > 0) { - item.elems.blip.setColorFill(r, g, b); - } else { - item.elems.blip.setColorFill(0,0,0); + item.elems.blip.setColorFill(r, g, b); + } else { item.elems.blip.setColor(r, g, b); } item.elems.text.setColor(r, g, b); From 8ba026397863570c2cc8c62532edc1ed09cad499 Mon Sep 17 00:00:00 2001 From: vezza Date: Sun, 14 Feb 2021 00:29:20 +0100 Subject: [PATCH 070/124] Chrono on ND (both sides) --- Models/FlightDeck/a320.flightdeck.xml | 34 +++++++++++ Models/Instruments/ND/canvas/style.nas | 2 +- Nasal/Panels/clock.nas | 83 +++++++++++++++++++++++++- 3 files changed, 116 insertions(+), 3 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index cbdbc318..ecd70ab5 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -8742,6 +8742,40 @@ + + + pick + chrono_cpt + + + false + + property-cycle + /instrumentation/efis/inputs/CHRONO + 0 + 1 + 2 + + + + + + + pick + chrono_fo + + + false + + property-cycle + /instrumentation/efis[1]/inputs/CHRONO + 0 + 1 + 2 + + + + diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 30c89234..3e6147f2 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -72,7 +72,7 @@ canvas.NDStyles["Airbus"] = { level_off_alt: "/autopilot/route-manager/vnav/level-off-alt", athr: "/it-autoflight/output/athr", app_mode: "/instrumentation/nd/app-mode", - chrono_node: "/instrumentation/chrono", + chrono_node: "/instrumentation/ndchrono", fpln_offset: "/autopilot/route-manager/offset", active_route_color: [0.0509,0.7529,0.2941], inactive_route_color: [0.95,0.95,0.21] diff --git a/Nasal/Panels/clock.nas b/Nasal/Panels/clock.nas index 558cac2c..30985b60 100644 --- a/Nasal/Panels/clock.nas +++ b/Nasal/Panels/clock.nas @@ -1,8 +1,10 @@ # -# Chrono - Clock - ET +# Chrono - Clock - ET # var chr = aircraft.timer.new("instrumentation/chrono[0]/elapsetime-sec",1); var clk = aircraft.timer.new("instrumentation/clock/elapsetime-sec",1); +var chrono_cpt = aircraft.timer.new("instrumentation/ndchrono[0]/elapsetime-sec",1); +var chrono_fo = aircraft.timer.new("instrumentation/ndchrono[1]/elapsetime-sec",1); var chr_min = nil; var chr_sec = nil; @@ -49,6 +51,22 @@ var chrono = { started: props.globals.getNode("/instrumentation/chrono[0]/started"), }; +#Cpt chrono +var cpt_chrono = { + etHh_cpt: props.globals.initNode("/instrumentation/ndchrono[0]/etHh_cpt", 0, "INT"), + etMin_cpt: props.globals.initNode("/instrumentation/ndchrono[0]/etMin_cpt", 0, "INT"), + etSec_cpt: props.globals.initNode("/instrumentation/ndchrono[0]/etSec_cpt", 0, "INT"), + text: props.globals.initNode("/instrumentation/ndchrono[0]/text", "0' 00''", "STRING"), +}; + +#Fo chrono +var fo_chrono = { + etHh_fo: props.globals.initNode("/instrumentation/ndchrono[1]/etHh_fo", 0, "INT"), + etMin_fo: props.globals.initNode("/instrumentation/ndchrono[1]/etMin_fo", 0, "INT"), + etSec_fo: props.globals.initNode("/instrumentation/ndchrono[1]/etSec_fo", 0, "INT"), + text: props.globals.initNode("/instrumentation/ndchrono[1]/text", "0' 00''", "STRING"), +}; + var rudderTrim = { rudderTrimDisplay: props.globals.initNode("/controls/flight/rudder-trim-display", 0, "STRING"), rudderTrimDisplayLetter: props.globals.initNode("/controls/flight/rudder-trim-letter-display", "", "STRING"), @@ -59,6 +77,8 @@ setlistener("sim/signals/fdm-initialized", func { chr.reset(); clk.stop(); clk.reset(); + chrono_cpt.reset(); + chrono_fo.reset(); rudderTrim.rudderTrimDisplay.setValue(sprintf("%2.1f", pts.Fdm.JSBsim.Hydraulics.Rudder.trimDeg.getValue())); start_loop.start(); }); @@ -120,6 +140,31 @@ setlistener("/instrumentation/chrono[0]/chrono-reset", func(et){ }; }, 0, 0); +#Chrono +setlistener("instrumentation/efis[0]/inputs/CHRONO", func(et){ + chrono0 = et.getValue(); + if (chrono0 == 1){ + chrono_cpt.start(); + } elsif (chrono0 == 2) { + chrono_cpt.stop(); + } elsif (chrono0 == 0) { + chrono_cpt.reset(); + setprop("instrumentation/ndchrono[0]/elapsetime-sec", 0); + } +}, 0, 0); + +setlistener("instrumentation/efis[1]/inputs/CHRONO", func(et){ + chrono1 = et.getValue(); + if (chrono1 == 1){ + chrono_fo.start(); + } elsif (chrono1 == 2) { + chrono_fo.stop(); + } elsif (chrono1 == 0) { + chrono_fo.reset(); + setprop("instrumentation/ndchrono[1]/elapsetime-sec", 0); + } +}, 0, 0); + setlistener("instrumentation/clock/et-selector", func(et){ tmp1 = et.getValue(); if (tmp1 == 2){ @@ -225,6 +270,40 @@ var start_loop = maketimer(0.1, func { item.update(nil); } } + + #Cpt Chrono + chr0_tmp = getprop("instrumentation/ndchrono[0]/elapsetime-sec"); + if (chr0_tmp >= 360000) { + setprop("instrumentation/ndchrono[0]/elapsetime-sec", getprop("instrumentation/ndchrono[0]/elapsetime-sec") - 360000); + }; + chr0_hh = int(chr0_tmp * 0.000277777777778); + chr0_min = int((chr0_tmp * 0.0166666666667) - (chr0_hh * 60)); + chr0_sec = int(chr0_tmp - (chr0_min * 60) - (chr0_hh * 3600)); + setprop("instrumentation/ndchrono[0]/etHh_cpt", chr0_hh); + setprop("instrumentation/ndchrono[0]/etMin_cpt", chr0_min); + setprop("instrumentation/ndchrono[0]/etSec_cpt", chr0_sec); + if (chr0_tmp >= 3600) { + setprop("instrumentation/ndchrono[0]/text", sprintf("%02d H %02d'", chr0_hh, chr0_min)); + } else { + setprop("instrumentation/ndchrono[0]/text", sprintf("%02d' %02d''", chr0_min, chr0_sec)); + } + + #Fo Chrono + chr1_tmp = getprop("instrumentation/ndchrono[1]/elapsetime-sec"); + if (chr1_tmp >= 360000) { + setprop("instrumentation/ndchrono[1]/elapsetime-sec", getprop("instrumentation/ndchrono[1]/elapsetime-sec") - 360000); + }; + chr1_hh = int(chr1_tmp * 0.000277777777778); + chr1_min = int(chr1_tmp * 0.0166666666667); + chr1_sec = int(chr1_tmp - (chr1_min * 60) - (chr1_hh * 3600)); + setprop("instrumentation/ndchrono[1]/etHh_fo", chr1_hh); + setprop("instrumentation/ndchrono[1]/etMin_fo", chr1_min); + setprop("instrumentation/ndchrono[1]/etSec_fo", chr1_sec); + if (chr1_tmp >= 3600) { + setprop("instrumentation/ndchrono[1]/text", sprintf("%02d H %02d'", chr1_hh, chr1_min)); + } else { + setprop("instrumentation/ndchrono[1]/text", sprintf("%02d' %02d''", chr1_min, chr1_sec)); + } }); var updateRudderTrim = func() { @@ -255,4 +334,4 @@ var update_items = [ ), ]; -setlistener("/controls/switches/annun-test", updateRudderTrim, 0, 0); \ No newline at end of file +setlistener("/controls/switches/annun-test", updateRudderTrim, 0, 0); From 3f16a74537e05741ae523974c4c129a328b67987 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 14 Feb 2021 21:02:32 +0100 Subject: [PATCH 071/124] fix update hz - display HI/LO on ND --- .../ND/canvas/framework/navdisplay.nas | 2 +- .../ND/canvas/map/TERRAIN.lcontroller | 12 +- .../Instruments/ND/canvas/map/TERRAIN.symbol | 174 +++---- Models/Instruments/ND/canvas/res/airbusND.svg | 73 ++- .../ND/canvas/res/terrain/tile_01.png | Bin 3197 -> 1716 bytes .../ND/canvas/res/terrain/tile_02.png | Bin 175 -> 182 bytes .../ND/canvas/res/terrain/tile_03.png | Bin 3321 -> 2097 bytes .../ND/canvas/res/terrain/tile_04.png | Bin 175 -> 181 bytes .../ND/canvas/res/terrain/tile_06.png | Bin 175 -> 182 bytes .../Instruments/ND/canvas/res/terrainND.svg | 439 ------------------ Models/Instruments/ND/canvas/style.nas | 38 +- 11 files changed, 187 insertions(+), 551 deletions(-) delete mode 100644 Models/Instruments/ND/canvas/res/terrainND.svg diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 04a59949..0f5e116c 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -69,7 +69,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update # because things are much better configurable that way # now look up all required SVG elements and initialize member fields using the same name to have a convenient handle foreach(var element; ["dmeLDist","dmeRDist","dmeL","dmeR","vorL","vorR","vorLId","vorRId", - "status.wxr","status.wpt","status.sta","status.arpt"]) + "status.wxr","status.wpt","status.sta","status.arpt","terrHI","terrLO"]) me.symbols[element] = me.nd.getElementById(element); # load elements from vector image, and create instance variables using identical names, and call updateCenter() on each diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller index dfe9f333..4fba3af4 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller +++ b/Models/Instruments/ND/canvas/map/TERRAIN.lcontroller @@ -14,8 +14,6 @@ canvas.SymbolLayer.add(name, { } }); -var terrain_tree = "/instrumentation/terrain"; - var new = func(layer) { var m = { parents: [__self__], @@ -36,14 +34,10 @@ var del = func() { var searchCmd = func { if(me.map.getRange() == nil) return []; - #var lat = getprop(terrain_tree~"/center/latitude-deg"); - #var lon = getprop(terrain_tree~"/center/longitude-deg"); - #if(lat == nil or lon == nil) { - var pos = geo.aircraft_position(); - lat = pos.lat(); - lon = pos.lon(); - #} + var pos = geo.aircraft_position(); + lat = pos.lat(); + lon = pos.lon(); var result = geo.Coord.new(); result.set_latlon(lat, lon); diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 48c384d9..65467122 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,20 +7,19 @@ DotSym.makeinstance( name, __self__ ); var element_type = "group"; +var terrain_visible = props.globals.initNode("/custom/terrain/visible", 0,"INT"); +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"]; -var radar_beacon = 0; -var radar_cycle = 0; -var rader_cleared = 0; var get_elevation = func (lat, lon) { - var info = geodinfo(lat, lon); var elevation = 0; if (info != nil) { elevation = int(info[0] * 3.2808399); } else { elevation = nil; } return elevation; - } var updateTerrain = func(r_scaled){ @@ -28,7 +27,11 @@ var updateTerrain = func(r_scaled){ if(me.fetching) return; me.fetching = 1; - me.rader_cleared = 0; + + if (me.request_clear == 1) { + me.request_clear = 0; + me.clear(); + } var RAD2DEG = 57.2957795; var DEG2RAD = 0.016774532925; @@ -54,80 +57,85 @@ var updateTerrain = func(r_scaled){ col = -1 + (-1 * a); } - #var col = me.radar_beacon - me.tileradius; + var trn = me.terrlayer[side ~ a]; - #for (var a=0; a < me.tileradius; a+=1) { + var len = size(trn); + var range = me.range; - #var trnL = me.terrlayer["L" ~ a]; - #var trnR = me.terrlayer["R" ~ a]; - var trn = me.terrlayer[side ~ a]; + var tiles = me.tile_list; - var len = size(trn); - var range = me.range; + var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 40); + var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 40); - var tiles = me.tile_list; + var elevft = []; - var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 40); - var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 40); + for (var row = 0; row < len; row += 1) { - var elevft = []; + if (trn[row] == nil) { + append(elevft,-1); + continue; + } - for (var row = 0; row < len; row += 1) { + var point_lon = proj_lon + ((row * (range/30) / 40) * math.sin(DEG2RAD * heading)); + var point_lat = proj_lat + ((row * (range/30) / 40) * math.cos(DEG2RAD * heading)); - if (trn[row] == nil) { - append(elevft,-1); - continue; - } - - var point_lon = proj_lon + ((row * (range/30) / 40) * math.sin(DEG2RAD * heading)); - var point_lat = proj_lat + ((row * (range/30) / 40) * math.cos(DEG2RAD * heading)); - - var elev = me.get_elevation(point_lat, point_lon); - var grad = 0; #black - if (elev != nil) { - if (elev < me.basealtitudeft) grad = 0; # < 400 (at airport) use blank - trivial - 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; - } + var elev = me.get_elevation(point_lat, point_lon); + var grad = 0; #black + if (elev != nil) { + if (elevme.max_altitude) me.max_altitude = elev; + if (elev < me.basealtitudeft) grad = 0; # < 400 (at airport) use blank - trivial + 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; } } - append(elevft,grad); # 0-5 - } else { - append(elevft,6); # magenta } - + append(elevft,grad); # 0-5 + } else { + append(elevft,6); # magenta } + + } - for (var r=0; r < len; r+=1) { + me.radar_cleared = 0; - var imgx = elevft[r]; - if (imgx == -1) continue; - if (imgx < 1) trn[r].hide(); - else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); - #trnR[r].setFile(me.imgpath ~ me.tile_list[2-imgx]).show(); - - } - - #} + for (var r=0; r < len; r+=1) { + var imgx = elevft[r]; + if (imgx == -1) continue; + if (imgx < 1) trn[r].hide(); + else trn[r].setFile(me.imgpath ~ me.tile_list[imgx]).show(); + } me.radar_beacon += 1; - if (me.radar_beacon >= (me.tileradius*2)) { - me.radar_beacon = 0; - me.radar_cycle += 1; + if (me.radar_beacon >= (me.tileradiusw*2)) { + 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); +} + +var restart_beacon = func { + me.radar_beacon = 0; + me.radar_cycle += 1; + me.min_altitude = 9999; + me.max_altitude = -9999; +}; + var init = func { #print('TERRAIN init'); me.tile = 33; # preferred 34 @@ -137,24 +145,31 @@ var init = func { me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); me.imgpath = get_local_path('res/terrain/'); - me.rader_cleared = 1; + me.radar_beacon = 0; + me.radar_cycle = 0; + me.radar_cleared = 1; + me.request_clear = 0; me.basealtitudeft = nil; me.visible = 0; + me.min_altitude = 9999; + me.max_altitude = -9999; var tile = me.tile; var gx = int(me.viewport_radius / tile); - me.tileradius = gx; - me.terrlayer = {}; #me.element.createChild("image").set("z-index", -100).hide(); + var limx = int((512/tile)+0.5); # horiz space is smaller + me.tileradiusw = limx; - var centx = 0; #me.viewport_radius * -0.5; + me.terrlayer = {}; + + var centx = 0; var centy = -me.viewport_radius; var group = me.group.createChild("group").set("z-index", -100); #me.element - for (var c=0; cTERR000000v`WF)9%}T_kVY- z^*rlYYwhoEwt9c{o?6c{W}RJqUiG!r4^}@_{c!b-bK=#R)n|>t!RkY^IcFUA&E`n; z1=SbNI)D4s*8JPGYuDCtj_Ka&)5jFXi`Cy(|5N>E^{MI`b|MOWc=qrB=P>7&4Kv2? zSHD~RK=siA;2+DaZEBotJaJ+Dd4Kia1M_?JJJnat+vIw5BBFBD7&}K4-Zj;)4lRz~ zR6jp&@s@zJ`jYXvtNKLs%|raz>QBe?tLpcvAFIB6=wrk3(dyT$KdSzC2w?yl196_L z{<`|d>d&elAJQ0DN5BaBLG{noe^tLxecOQDGD}sUUbv&urQ`h5WNG~{m49=HvRLO1 z5?>LnuRb;|997{282bD%nR1gU3vn&tsJumbfh>oTrar!w8ZZ`pWLXB{($I;GKXsOk zbWed%E6F}n{Ydq7!|tMyH8AXiIIa4?h=%VSV^2xMbr-%wlT8X73@!&&{nsIK$I}Ao zMN1j)tA2BesZ>{tj}Y9bZ-1Xy;I*uX4sFo#q!M?1arL}{Eg_EF4}w7lQ_DNqs8f23 zm`{u|JH5Vl*hwpp$O*(31~&IrzdZFoz41_>Ziw<(3w6$MKS5)Xfb|!R27%~E7O7a zy)dn${qQCaT7$uHYgJy3YObNBEDtIh8s}=x)XK&ar(6@FM86NkwNf1|Xs&tPPCktbsAx>h|jt z|HBz$v6zBMXb$$$cc@gV=yqUs({!*C0A4YUi>mlj>XtwEfzikEy?ww;D7p0LCVkaY zd=e+8q=j$5Pz;8{0BjZ;C!Ukm%#Daq)}Bw6!(0Tw62((O8GjuMKQJL4tr)u|EJW!c zNW2!z?%~Tc^aEfZ4D+4Sa`Z`^W=Jy!+qygC0x|$D_oajNi;l`XcAH=7lZ&g` z&E&1U(s~lvg+>F?=_WlA(T;&J{O$?(CeHP&dVEqCV@P73PS(=hv=C;Z(36*-@SLOt zuv8=ff{+I@`v<|$Cs(phGI0#KoV?@7&Hn#ou!rY{b$=n{d+hokgIv90uSiNuOkf~6 zGCm3BwP7R`8`-efEOt05Sh@p}4PdIeRb7DY&~%4GGN@lZ?Ls@T)W$jt27R}r0%F0` zpSh<=!7XxOnkEEe;f}0gNIH45q_FOiqQV$<(fMK^p}k=I5m-;o5|W$?(cR;VaL*jh zXJd&Ln16^4Rl1nDl4-bUWtA30G%{pVRttbh+wsZm3r3G|&}Qy-#Y89Ll1}5yOA^TD zvqnG#=B4}HypoeKo3J?q#%@}BrSCPL{0!664~>$C)~u|_chgvgh70vIq4x1(QLkD` z3xGQ@^#XEQ6!mG&xn_`351%I1e(h1#)$4?{h<~^%j3nl=S#IooJ$?40k}tGc(l#@n z;-_(>g4TlJLtNtc3h?o5mWN9|;}Vr3R8oN?b!;}p@LAJ)=qrOYq1R=B(C#Vfg7HF{ z+pfEtw`IbkMUPjyO!C0f+r=E#y+{KZuRf3j9Tt>u|;>^Cm5#1|OuLQ7Ha iC>5?+H`U!!{{qkL>j3iN8ZH0;002ovP6b4+LSTXx7f??C delta 3180 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 delta 134 zcmdnSxSnx>q$nE$1A~=2_aPv~SRCZ;#IWw1%*%<2(rG{uzC(hbxbNTwCWUur-fa79_3mfm-`njxgN@xNA(3~*j diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_03.png b/Models/Instruments/ND/canvas/res/terrain/tile_03.png index ca873469f2f54a55d2e33c11e941f049e6826a0e..ff188f9ffcd3443652cd879f26542676e9f8badd 100644 GIT binary patch delta 2072 zcmV+z2|xQZXNXn%S8 zJKpFaJ$>GDp8LM8`?|+-OnUb0`OW96d-v|vg9i_uG->?o*(F=Hl<(SA`NIztt*s>! zCgcwqG^kgvUOjsB=-02GbzC<0>C?w^>#<|UmXwUIuAWd?Sy)z9FnaW8uR3+=)VXtK z&XfNA`}5wdTeq%VyY}wgd*Z}=et!=iu6gmIIhSkw=bx67C#OOkHEI-hef#$P_VYDz zUv)S(0gME8VlF>gLV*`}Z5}-kkws`}T^d zQ;Rr42njNtIaBM^ty}fmww3cfV#EmU2*ty-YjqDEG~T#T|I<$ug@yST2%4CQ-(rOS z@@32M<2B2dXBIEcEL)ZVxqo0m>D;-c<>iG!v6~q-0CKsxx!n9$uUgn*=@l4ZWwQnL zFI}3MH?MTsw3L}wvcM|2dbRHP^E6WQfBUVH8j~ldIV>$5FY^Tj`Gg|Zz<~q70H*%m ze>XjQ)_mc@w3e1hC*J~?`P$5 zbEHx7VUt2jMQ_m|`hSKO7ZQTTh9n0MR^Pr|fBkx$W>AFM$OfCErV~GyLDmf_m3q-J zkkk@;DZwKzFAo@M0^))c0LZJ-R$8ynz5RWpK(B+H84Qu=m2e%y5D&J64I>r*flMGVa7FDtC* z9P=p=I}BSxtG91kz$kpragSLd8h7#{SXNfBZe3Oze*Bn@3EjiCsi{~NDM?|x5sGxW z%ZL;vDDU1qMStJ0(RTvZJ=#8Y2aG#LM3X|%Xx_7DYqhhPw0CbREc$$TYn%PC8HTlo zkP<1OwM>XZK$=b`f9*=UT~U|9XCt=)(x)p|X0?tuYz{&yO1ne^;XR7YIzdFEYC6fM zhQ^M-rGaS7rO$Lsnnky5ncW`I88?h(xKwzqbbv9V1$jRt?`n7BVCdoK5X=N>Qt?qBhE$~?c2BS(xnU6 zXc65a!hh0pUk*d1)C$S?;mw6*qPhY2ftQ6ySFFftpbsC6oOx`VA8G_PzY-INu5F2T3ZC zv}V6!MpgQa%DH*h?pDI(K0$}SBQ(6LElU`Rk1?cN1FX~uzGP6TzM3aKCW+wT9_7}&w zKdIfiH9Zg2%atp2W~&y2A#}``CsrQ0(1hWD@lo;a-Asa*kK#jCH0|28i*^ZuWWg5+ zZw)82*{4&KvbiN0)U%V?T1Bi0G{2cei+`Etk|bN7KFvl=A#o%QFs>LpVnU9jUg=_A zffDSC4mowThq%C116b2OVdd-@wF4H%XOghEN0E}LNp)u7049^{!RC1tc z7iX1k@%D@M3JiOi%E8`gE;q%bza-p#TU%E_=W*k$<^Q zbK^B}uwx^KJ|}%wI;8oEc5(3zBYzypT8{2GV>!B-3CjEzp?$tC3 zMkdW7lSU|D1nZJUG@~G41X38I7*!kI1;H;vmpr-K;8j`zVHU5IAOQEMSIsO?HG{h~ z%NT1sn$rv=j0;GC$B=qLG<@}VSy=%;O!D&b{s(3skd|@$|H=RW002ovP6b4+LSTZI CzuzqY delta 3305 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 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_04.png b/Models/Instruments/ND/canvas/res/terrain/tile_04.png index aa0778293a5c8f12f23b023e556ab9c2e0840e66..f1604ba30d8379eb31888742e00ba0948861a65e 100644 GIT binary patch delta 140 zcmZ3_xRr5&BnJ}%1H)F;Ia4Rr#ti(`m~_uI3Ef(!~g42C{e_b=CSV751Ss#ksPUCjbc plSZ`*EVCShGnjlqoM$)BvGU!m%yIpF(*vlT!PC{xWt~$(697}&F9!es delta 134 zcmdnWxSnx>q$nE$1A~=2_aPv~SRCZ;#IWw1%*%<2(rG{uzC(^B6o`{an^LB{Ts5+h#DL diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_06.png b/Models/Instruments/ND/canvas/res/terrain/tile_06.png index 151be7c439d2ae33340dcbbecb1485cee2b5a8df..1c97e713981806f741680e42daa500fd978f41fd 100644 GIT binary patch delta 141 zcmZ3_xQ%gwBnJ}%1H)F;Ia4RqSFi(`m~_uI3EybKBg42E<5^we8-I5L|Xn7+JMnpVGn q)1*=D0?RB1;S45U5a-#=H{6`7)b6ZrWoQKIXYh3Ob6Mw<&;$T^s4k@d delta 134 zcmdnSxSnx>q$nE$1A~=2_aPv~SRCZ;#IWw1%*%<2(rG{uzC(__E%Oao@oWObYMLyxI2J;{DIYzb~KnOqpmDbP0l+XkK85S|} diff --git a/Models/Instruments/ND/canvas/res/terrainND.svg b/Models/Instruments/ND/canvas/res/terrainND.svg deleted file mode 100644 index 65bc1e02..00000000 --- a/Models/Instruments/ND/canvas/res/terrainND.svg +++ /dev/null @@ -1,439 +0,0 @@ - -image/svg+xmlGijs de Rooy▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index f3174d52..4b51decc 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -12,6 +12,9 @@ var adirs_3 = props.globals.getNode("/instrumentation/efis[0]/nd/ir-3", 1); var vhdg_bug = props.globals.getNode("/it-autoflight/input/hdg",0); # ND compass position deg +var terrain_visible = props.globals.getNode("/custom/terrain/visible", 0); +var terrain_minalt = props.globals.getNode("/custom/terrain/min-altitude", 0); +var terrain_maxalt = props.globals.getNode("/custom/terrain/max-altitude", -9999); canvas.NDStyles["Airbus"] = { font_mapper: func(family, weight) { @@ -86,23 +89,22 @@ canvas.NDStyles["Airbus"] = { layers: [ { name:"TERRAIN", - isMapStructure:1, - always_update: 1, - update_on:[ {rate_hz: 0.4}, "toggle_range","toggle_display_mode","toggle_terrain"], + isMapStructure: 1, + update_on:[ {rate_hz: 18}, "toggle_range","toggle_display_mode","toggle_terrain"], predicate: func(nd, layer) { #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); var visible = nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); - layer.group.setVisible(visible); + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and + (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); + layer.group.setVisible(visible); if (visible) { layer.update(); + } else { + #terrain_visible.setValue(0); } }, # end of layer update predicate options: { viewport_radius: 670, #512, #706, - #position_callback: func(nd, pos){ - # pos = me.startpos; - #} }, "z-index": -100, }, @@ -1980,6 +1982,26 @@ canvas.NDStyles["Airbus"] = { nd.symbols.offsetLbl.hide(); } } + }, + { + id: "terrGroup", + impl: { + init: func(nd,symbol), + predicate: func(nd) ( nd.get_switch("toggle_terrain") and + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and + (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)) ), + is_true: func(nd){ + if (terrain_maxalt.getValue() != -9999) { + nd.symbols.terrLO.setText(sprintf("%03d",int(terrain_minalt.getValue()/100))); + nd.symbols.terrHI.setText(sprintf("%03d",int(terrain_maxalt.getValue()/100))); + nd.symbols.terrGroup.show(); + terrain_maxalt.setValue(-9999); #update visual once at radar cycle + } + }, + is_false: func(nd){ + nd.symbols.terrGroup.hide(); + } + } } ], # end of vector with features From 384c629db069565f145305bbb3a5869db7b4e0c8 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 14 Feb 2021 23:11:52 +0100 Subject: [PATCH 072/124] optimization on speed --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 5 ++++- Models/Instruments/ND/canvas/style.nas | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 65467122..eafbf4a1 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -222,6 +222,8 @@ var clear = func { } var draw = func { + + if(me.fetching) return; var range = me.layer.map.getRange(); # Range of Navigation Display var update_size = (range != me.range); @@ -238,6 +240,7 @@ var draw = func { me.terrain_visible.setValue(1); } - me.updateTerrain(r_scaled); + me.updateTerrain(r_scaled); # left + if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(r_scaled); # right }; diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 4b51decc..8e5e1924 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -90,7 +90,7 @@ canvas.NDStyles["Airbus"] = { { name:"TERRAIN", isMapStructure: 1, - update_on:[ {rate_hz: 18}, "toggle_range","toggle_display_mode","toggle_terrain"], + update_on:[ {rate_hz: 10}, "toggle_range","toggle_display_mode","toggle_terrain"], predicate: func(nd, layer) { #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); var visible = nd.get_switch("toggle_terrain") and From 91fb47704ec0ad2eee7cac0022526fee0ed63d0a Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 14 Feb 2021 23:50:34 +0100 Subject: [PATCH 073/124] ND separation left/right --- Models/FlightDeck/a320.flightdeck.xml | 20 ++++++++++++++++++++ Models/Instruments/ND/canvas/ND.nas | 20 ++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index cbdbc318..53e2b24b 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -1449,6 +1449,16 @@ property-toggle controls/switches/terr_on_nd_l + + + + systems/electrical/bus/dc-ess + 25 + + + property-toggle + instrumentation/efis[0]/inputs/terr + @@ -1490,6 +1500,16 @@ property-toggle controls/switches/terr_on_nd_r + + + + systems/electrical/bus/dc-ess + 25 + + + property-toggle + instrumentation/efis[1]/inputs/terr + diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 41088b16..90d5321c 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -48,7 +48,7 @@ var myCockpit_switches = { "toggle_waypoints": {path: "/inputs/wpt", value:0, type:"BOOL"}, "toggle_position": {path: "/inputs/pos", value:0, type:"BOOL"}, "toggle_data": {path: "/inputs/data",value:0, type:"BOOL"}, - #"toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, + "toggle_terrain": {path: "/inputs/terr",value:0, type:"BOOL"}, "toggle_traffic": {path: "/inputs/tfc",value:0, type:"BOOL"}, "toggle_centered": {path: "/inputs/nd-centered",value:0, type:"BOOL"}, "toggle_lh_vor_adf": {path: "/input/lh-vor-adf",value:0, type:"INT"}, @@ -64,7 +64,7 @@ var myCockpit_switches = { "toggle_xtrk_error": {path: "/nd/xtrk-error", value: 0, type: "BOOL"}, "toggle_trk_line": {path: "/nd/trk-line", value: 0, type: "BOOL"}, "ADIRS3": {path: "/nd/ir-3", value: 0, type: "BOOL"}, - "toggle_terrain": {path: "/controls/switches/terr_on_nd_l", value: 0, type: "BOOL"}, + #"toggle_terrain": {path: "/nd/terrain-on-nd", value: 0, type: "BOOL"}, }; var canvas_nd_base = { @@ -418,14 +418,14 @@ for (i = 0; i < 2; i = i + 1 ) { }); } -setlistener("/instrumentation/efis[0]/nd/terrain-on-nd", func{ - var terr_on_hd = getprop("instrumentation/efis[0]/nd/terrain-on-nd"); - var alpha = 1; - if (terr_on_hd) { - alpha = 0.5; - } - nd_display.main.setColorBackground(0,0,0,alpha); -}); +#setlistener("/instrumentation/efis[0]/nd/terrain-on-nd", func{ +# var terr_on_hd = getprop("instrumentation/efis[0]/nd/terrain-on-nd"); +# var alpha = 1; +# if (terr_on_hd) { +# alpha = 0.5; +# } +# nd_display.main.setColorBackground(0,0,0,alpha); +#}); setlistener("/flight-management/control/capture-leg", func(n) { var capture_leg = n.getValue(); From 341e8558ab94939f49f976325b66964240bcbd2d Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Mon, 15 Feb 2021 17:45:54 +0000 Subject: [PATCH 074/124] VERT REV: add ability to change altitude constraints and speed constraints on the page --- Models/Instruments/MCDU/MCDU.nas | 2 + Nasal/MCDU/F-PLN.nas | 6 +-- Nasal/MCDU/MCDU.nas | 4 ++ Nasal/MCDU/VERTREV.nas | 80 ++++++++++++++++++++++++++++++-- 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 796aeb5b..39e237e3 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -5188,6 +5188,8 @@ var canvas_MCDU_base = { me.dynamicPageArrowFunc(myVertRev[i]); me.colorLeftArrow(myVertRev[i].arrowsColour[0][0],myVertRev[i].arrowsColour[0][1],myVertRev[i].arrowsColour[0][2],myVertRev[i].arrowsColour[0][3],myVertRev[i].arrowsColour[0][4],myVertRev[i].arrowsColour[0][5]); + me.colorRightArrow(myVertRev[i].arrowsColour[1][0],myVertRev[i].arrowsColour[1][1],myVertRev[i].arrowsColour[1][2],myVertRev[i].arrowsColour[1][3],myVertRev[i].arrowsColour[1][4],myVertRev[i].arrowsColour[1][5]); + me.dynamicPageFontFunc(myVertRev[i]); diff --git a/Nasal/MCDU/F-PLN.nas b/Nasal/MCDU/F-PLN.nas index f3cab9a5..65c2348c 100644 --- a/Nasal/MCDU/F-PLN.nas +++ b/Nasal/MCDU/F-PLN.nas @@ -117,15 +117,15 @@ var fplnItem = { }, getAlt: func() { if (me.index == 0 and left(me.wp.wp_name, 4) == fmgc.FMGCInternal.depApt and fmgc.flightPlanController.flightplans[me.plan].departure != nil) { - return [" " ~ sprintf("%5.0f", math.round(fmgc.flightPlanController.flightplans[me.plan].departure.elevation * M2FT)), "grn"]; #fixed - aligned to right + return [" " ~ sprintf("%5.0f", math.round(fmgc.flightPlanController.flightplans[me.plan].departure.elevation * M2FT)), "grn"]; } elsif (me.index == (fmgc.flightPlanController.currentToWptIndex.getValue() - 1) and fmgc.flightPlanController.fromWptAlt != nil) { return [" " ~ fmgc.flightPlanController.fromWptAlt, "mag"]; } elsif (me.wp.alt_cstr != nil and me.wp.alt_cstr > 0) { var tcol = (me.wp.alt_cstr_type == "computed" or me.wp.alt_cstr_type == "computed_mach") ? "grn" : "mag"; # TODO - check if only computed if (me.wp.alt_cstr > fmgc.FMGCInternal.transAlt) { - return [" " ~ sprintf("%5s", "FL" ~ math.round(num(me.wp.alt_cstr) / 100)), tcol]; #fixed - aligned to right + return [" " ~ sprintf("%5s", "FL" ~ math.round(num(me.wp.alt_cstr) / 100)), tcol]; } else { - return [" " ~ sprintf("%5.0f", me.wp.alt_cstr), tcol]; #fixed - aligned to right + return [" " ~ sprintf("%5.0f", me.wp.alt_cstr), tcol]; } } else { return ["------", "wht"]; diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index 975237a3..592f6f26 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -636,6 +636,8 @@ var lskbutton = func(btn, i) { mcdu_scratchpad.scratchpads[i].empty(); } } + } else if (page == "VERTREV") { + canvas_mcdu.myVertRev[i].pushButtonLeft(3); } else if (page == "MCDUTEXT") { atsu.freeTexts[i].selection = 2; atsu.freeTexts[i].changed = 1; @@ -1085,6 +1087,8 @@ var rskbutton = func(btn, i) { atsu.freeTexts[i].changed = 1; } else if (page == "ATCMENU") { pageNode[i].setValue("MCDUTEXT"); + } else if (page == "VERTREV") { + canvas_mcdu.myVertRev[i].pushButtonRight(3); } else { mcdu_message(i, "NOT ALLOWED"); } diff --git a/Nasal/MCDU/VERTREV.nas b/Nasal/MCDU/VERTREV.nas index 05513585..e3ced48d 100644 --- a/Nasal/MCDU/VERTREV.nas +++ b/Nasal/MCDU/VERTREV.nas @@ -1,3 +1,5 @@ +var scratchpadStore = nil; + var vertRev = { title: [nil, nil, nil], subtitle: [nil, nil], @@ -42,6 +44,28 @@ var vertRev = { canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); } }, + getSpd: func() { + if (me.wp.speed_cstr != nil and me.wp.speed_cstr > 0) { + var tcol = (me.wp.speed_cstr_type == "computed" or me.wp.speed_cstr_type == "computed_mach") ? "grn" : "mag"; # TODO - check if only computed + return [" " ~ sprintf("%3.0f", me.wp.speed_cstr), tcol]; + } else { + return [nil,nil]; + } + }, + getAlt: func() { + if (me.wp.alt_cstr != nil and me.wp.alt_cstr > 0) { + var tcol = (me.wp.alt_cstr_type == "computed" or me.wp.alt_cstr_type == "computed_mach") ? "grn" : "mag"; # TODO - check if only computed + if (me.wp.alt_cstr > fmgc.FMGCInternal.transAlt) { + return [sprintf("%5s", "FL" ~ math.round(num(me.wp.alt_cstr) / 100)) ~ " ", tcol]; + } else { + return [sprintf("%5.0f", me.wp.alt_cstr) ~ " ", tcol]; + } + } else { + return [nil,nil]; + } + }, + alt: nil, + speed: nil, _setupPageWithData: func() { if (me.type == 3) { me.title = ["VERT REV", " AT ", "PPOS"]; @@ -57,15 +81,30 @@ var vertRev = { me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; } elsif (me.type == 2) { me.title = ["VERT REV", " AT ", me.id]; + me.fontMatrix = [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]]; me.L1 = ["", " EFOB ---.-", "wht"]; me.R1 = ["", "EXTRA ---.- ", "wht"]; me.L2 = ["250/10000", " CLB SPD LIM", "mag"]; - me.L3 = [" [ ]", " SPD CSTR", "blu"]; + me.speed = me.getSpd(); + if (me.speed[0] == nil) { + me.L3 = [" [ ]", " SPD CSTR", "blu"]; + me.fontMatrix[0][2] = 1; + } else { + me.L3 = [me.speed[0], " SPD CSTR", me.speed[1]]; + me.fontMatrix[0][2] = 0; + } me.L4 = [" CONSTANT MACH", nil, "wht"]; me.L5 = [" WIND DATA", nil, "wht"]; me.L6 = [" CLB", nil, "amb"]; me.R2 = ["RTA ", nil, "wht"]; - me.R3 = ["[ ] ", "ALT CSTR ", "blu"]; + me.alt = me.getAlt(); + if (me.alt[0] == nil) { + me.R3 = ["[ ] ", "ALT CSTR ", "blu"]; + me.fontMatrix[1][2] = 1; + } else { + me.R3 = [me.alt[0], "ALT CSTR ", me.alt[1]]; + me.fontMatrix[1][2] = 0; + } me.R6 = ["DES ", nil, "amb"]; # When the system does vertical planning, L6 should be RETURN and R6 not used if the MCDU knows the waypoint is during climb or descent. # The CLB or DES prompts should only be shown for a vertical revision in the cruise phase. @@ -74,7 +113,6 @@ var vertRev = { # The 'arrows' for CLB/DES should actually be asterisks. me.arrowsMatrix = [[0, 0, 0, 1, 1, 1], [0, 1, 0, 0, 0, 1]]; me.arrowsColour = [["ack", "ack", "ack", "wht", "wht", "amb"], ["ack", "wht", "ack", "ack", "wht", "amb"]]; - me.fontMatrix = [[0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0]]; } else { me.title = ["VERT REV", " AT ", me.id]; @@ -135,8 +173,22 @@ var vertRev = { } }, pushButtonLeft: func(index) { - if (index == 5) { - #print("role: ", me.wp.wp_role, ", type: ", me.wp.wp_type); + scratchpadStore = mcdu_scratchpad.scratchpads[me.computer].scratchpad; + if (index == 3 and me.type == 2) { + if (scratchpadStore == "CLR") { + me.wp.setSpeed("delete"); + mcdu_scratchpad.scratchpads[me.computer].empty(); + me._setupPageWithData(); + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } elsif (num(scratchpadStore) != nil and size(scratchpadStore) == 3 and scratchpadStore >= 100 and scratchpadStore <= 350) { + me.wp.setSpeed(scratchpadStore, "at"); + mcdu_scratchpad.scratchpads[me.computer].empty(); + me._setupPageWithData(); + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } else { + mcdu_message(me.computer, "FORMAT ERROR"); + } + } elsif (index == 5) { if (me.wp.wp_role == "sid") { if (canvas_mcdu.myCLBWIND[me.computer] == nil) { canvas_mcdu.myCLBWIND[me.computer] = windCLBPage.new(me.computer); @@ -182,6 +234,24 @@ var vertRev = { mcdu_message(me.computer, "NOT ALLOWED"); } }, + pushButtonRight: func(index) { + scratchpadStore = mcdu_scratchpad.scratchpads[me.computer].scratchpad; + if (index == 3 and me.type == 2) { + if (scratchpadStore == "CLR") { + me.wp.setAltitude("delete"); + mcdu_scratchpad.scratchpads[me.computer].empty(); + me._setupPageWithData(); + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } elsif (num(scratchpadStore) != nil and (size(scratchpadStore) == 4 or size(scratchpadStore) == 5) and scratchpadStore >= 0 and scratchpadStore <= 39000) { + me.wp.setAltitude(math.round(scratchpadStore, 10), "at"); + mcdu_scratchpad.scratchpads[me.computer].empty(); + me._setupPageWithData(); + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } else { + mcdu_message(me.computer, "FORMAT ERROR"); + } + } + }, }; var updateCrzLvlCallback = func () { From 77aa7b242934b6875113a8e40f4406153e7a664f Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 15 Feb 2021 23:12:07 +0100 Subject: [PATCH 075/124] display water and some optimization on reference calculations --- Models/FlightDeck/a320.flightdeck.xml | 2 +- Models/Instruments/ND/canvas/ND.nas | 1 - .../ND/canvas/framework/navdisplay.nas | 6 +- Models/Instruments/ND/canvas/loaders.nas | 2 +- .../Instruments/ND/canvas/map/TERRAIN.symbol | 111 ++++++++++-------- .../ND/canvas/res/terrain/tile_s1.png | Bin 0 -> 1851 bytes Models/Instruments/ND/canvas/style.nas | 7 +- 7 files changed, 72 insertions(+), 57 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_s1.png diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index 53e2b24b..d0e52b2a 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -1457,7 +1457,7 @@ property-toggle - instrumentation/efis[0]/inputs/terr + instrumentation/efis/inputs/terr diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 90d5321c..543b0722 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -64,7 +64,6 @@ var myCockpit_switches = { "toggle_xtrk_error": {path: "/nd/xtrk-error", value: 0, type: "BOOL"}, "toggle_trk_line": {path: "/nd/trk-line", value: 0, type: "BOOL"}, "ADIRS3": {path: "/nd/ir-3", value: 0, type: "BOOL"}, - #"toggle_terrain": {path: "/nd/terrain-on-nd", value: 0, type: "BOOL"}, }; var canvas_nd_base = { diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 0f5e116c..594b5fd0 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -375,9 +375,9 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec wxr_live_enabled = 0; me.set_switch('toggle_weather_live', wxr_live_enabled); - var terr_enabled = getprop("/controls/switches/terr_on_nd_l"); - if (terr_enabled == nil) terr_enabled = 0; - if (me.get_switch('toggle_terrain') != terr_enabled) me.set_switch('toggle_terrain', terr_enabled); + #var terr_enabled = getprop("/controls/switches/terr_on_nd_l"); + #if (terr_enabled == nil) terr_enabled = 0; + #if (me.get_switch('toggle_terrain') != terr_enabled) me.set_switch('toggle_terrain', terr_enabled); call(me.update_sub, nil, nil, caller(0)[0]); # call this in the same namespace to "steal" its variables diff --git a/Models/Instruments/ND/canvas/loaders.nas b/Models/Instruments/ND/canvas/loaders.nas index ed72a08d..e8cb8782 100644 --- a/Models/Instruments/ND/canvas/loaders.nas +++ b/Models/Instruments/ND/canvas/loaders.nas @@ -28,7 +28,7 @@ setlistener("/nasal/canvas/loaded", func() { #var code = call(compile, [code], var err=[]); var code = call(func compile(code, file), [code], var err=[]); if (size(err)) { - print("handling error"); + #print("handling error"); if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature var e = split(" at line ", err[0]); if (size(e) == 2) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index eafbf4a1..2e8e963d 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,22 +7,27 @@ DotSym.makeinstance( name, __self__ ); var element_type = "group"; -var terrain_visible = props.globals.initNode("/custom/terrain/visible", 0,"INT"); 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"]; +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 is_terrain = 0; var get_elevation = func (lat, lon) { var info = geodinfo(lat, lon); var elevation = 0; - if (info != nil) { elevation = int(info[0] * 3.2808399); } + if (info != nil) { + elevation = int(info[0] * 3.2808399); + me.is_terrain = (info[1] == nil) ? 1 : info[1].solid; + } else { elevation = nil; } return elevation; } -var updateTerrain = func(r_scaled){ +var updateTerrain = func { + + if (me.reference == nil) return; if(me.fetching) return; @@ -36,18 +41,11 @@ var updateTerrain = func(r_scaled){ var RAD2DEG = 57.2957795; var DEG2RAD = 0.016774532925; - var pos = geo.aircraft_position(); - var pos_lat = pos.lat(); - var pos_lon = pos.lon(); + var pos_lat = me.reference.lat(); + var pos_lon = me.reference.lon(); - var heading = getprop("orientation/heading-magnetic-deg"); - var altitudeft = pos.alt() * 3.2808399; - - if (me.basealtitudeft == nil) { - var basealtft = me.get_elevation(pos_lat,pos_lon); - if (basealtft == nil) basealtft = 0; - me.basealtitudeft = basealtft + 400; - } + var heading = me.reference.heading; + var altitudeft = me.reference.altitudeft; var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; var a = int(me.radar_beacon/2); @@ -82,21 +80,26 @@ var updateTerrain = func(r_scaled){ var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black if (elev != nil) { - if (elevme.max_altitude) me.max_altitude = elev; - if (elev < me.basealtitudeft) grad = 0; # < 400 (at airport) use blank - trivial - 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.is_terrain) { + if (elevme.max_altitude) me.max_altitude = elev; + if (elev < me.basealtitudeft) 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; + } } } + } else { + var diff = elev - altitudeft; + if (diff>=-2000) grad = 7; #sea } append(elevft,grad); # 0-5 } else { @@ -149,10 +152,11 @@ var init = func { me.radar_cycle = 0; me.radar_cleared = 1; me.request_clear = 0; - me.basealtitudeft = nil; me.visible = 0; me.min_altitude = 9999; me.max_altitude = -9999; + me.basealtitudeft = nil; + me.reference = nil; var tile = me.tile; @@ -192,14 +196,10 @@ var init = func { me.terrlayer["R" ~ c] = grprx; } - #me.update_interval = 300; - #me.last_request = 0; + setlistener("/controls/switches/terr_on_nd_l", func{ + me.request_clear = 1; + }); - #var r_scaled = (me.fetchRad*me.viewport_radius)/me.range; - #me.fetchWXRMap(r_scaled); - - #me.timeStamp = nil; - #http.load("https://api.rainviewer.com/public/maps.json").done(func(r) me.timeStamp = processRequest(r)); }; var clear = func { @@ -224,23 +224,42 @@ var clear = func { var draw = func { if(me.fetching) return; - + + if (me.radar_beacon == 0) { # 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; + + if (me.basealtitudeft == nil) { + var basealtft = me.get_elevation(ref.lat,ref.lon); + if (basealtft == nil) basealtft = 0; + me.basealtitudeft = basealtft + 400; + } + + if ((fmgc.FMGCInternal.phase <= 1 or fmgc.FMGCInternal.phase >= 5) and (me.basealtitudeft == 0)) { + var basealtft = me.get_elevation(ref.lat,ref.lon); + if (basealtft == nil) basealtft = 0; + me.basealtitudeft = basealtft + 400; + # me.reference.basealtitudeft = ft + 400 # <- TODO get departure/arrival runway altitude + } + else if ((fmgc.FMGCInternal.phase > 1 and fmgc.FMGCInternal.phase < 5) and (me.basealtitudeft != 0)) { + me.basealtitudeft = 0; + } + } + } + var range = me.layer.map.getRange(); # Range of Navigation Display var update_size = (range != me.range); me.range = range; - me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch - var r_scaled = (me.fetchRad*me.viewport_radius)/me.range; if(update_size){ me.request_clear = 1; } - if(me.terrain_visible.getValue() == 0){ - me.request_clear = 1; - me.terrain_visible.setValue(1); - } - - me.updateTerrain(r_scaled); # left - if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(r_scaled); # right + me.updateTerrain(); # left + if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(); # right }; diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_s1.png b/Models/Instruments/ND/canvas/res/terrain/tile_s1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae16caf3a07fdf0a4a69bf65c3b9195d26c0aad4 GIT binary patch literal 1851 zcmV-B2gLY^P)N2bZe?^J zG%hhNHDpIvQUCx3xk*GpR7gur*ZZsAa~uco&whLVu%&I;+;(QiX2#fzv5oJ}9A}%e z`&rVGMA8yTBq9+}vPMK`gocn?SR%RSPVSe##^d>UefQF*YkCGe@@qq z9dF0X%k#LEStqV-Cr`DN*R}Nr+u-T8{*kuorkr?n{Hk`sng}e~(8dPYoOFH^=Z|Hx zWJ^0`XIpk@*7){%)%Cwwvu1TsF44IQ+rkwQ}wk&o=dTJL|@wMWz=| zX3rnTby(-8T@hr2x4z%Dyw}z})W)Yd@FUp`p;5N+goX6B&)eR=<7UtAZS%YB^sDo> zVjZ83MNm$^Cc@4EZ&*hD6TX&b&V8md^Cm(z_wY#Jm&Rf@L8M-Zghd9+QBpE_jiaX!-<~ z4=M|mCHW2m?(V(>suojY``dXBw5d0fOsQINRdkr3hJE|8#l4bc(V-1ko>-!;F3z|% zulN=aMe2(-bb$kDz)mC@d8!&i=7mp2nVedmyD;d4RW5;Jh%O({oOge_=;h>J@}X2I z&=l1@8D0J+P194QYROTO72Ej_MgYrxo<&^+R59_f_TE(Hp5KmYecjH!ZRm!N*3zP3 zj3#tQgo0g_s$JBcCUwG`{vs*WA_(x8h8eZ^aH1b!+WBn?ebeEvBDKZSoZ0Yo(R8GC zRW|AAPuk#6lo4Ishp1uRxNqE>A@VX85~dQpTc-KJ{EL%@MtTH=83s8*K>o_Mb9{$;4P^SeZiad9A* zv>+@SIyOi?_wGyw?QHG|MP(D_fJH%ABR8J?>fPvVdE4`Al7GpEX=ApCa#N-$*bCpG zRLP?0Ky1~`sbD7@ctyBWWW}FCxBNMOtVcg-DfrbE%CMn~bxp5&vrVydv z4~OMow8%K|?8EB&hQ(smo=z=?H3&E>E1m+X*0JE@rhpe$gpCOcP<${_T5&UHcJLA{ z_(KQV)6D1Gm6F3x<*9Gd>VqNg4ykZi4&+QhZ~r1AT$MwKG&n+<0LfL1tWehZCe74a zZTpu)9s1DGDGvRJaX^$=Qt`^qD{jW8dp8wC;c_}GBxAc*$kcf%I!wOoKz5=D7_ENInrsFaV2MHH;izXGL z+GO(9UTQs&Y@p!)b*f2?6lu#Z@2@p;f`1)nJj))PN{lu{v8$7`a7QHs87ugt#VCJH zssx}+3G9v$^gw36{$Lk=Y9zaok)z4QQzro&yEd@YDFnqEsZBu0xIj1pGW!IKTgST$7*Kr^(eBgkfwzq;C)c4EnmwRo}% zd{a^ap&*(+`#FsYYDE{MRfOEcQ-6(0hM+5Mk{DK9LX;TI&N^KP1T=SHKcUO5CuIQ% z&OkJK+z4y$%b|e$kXCMrbY6uEnURdcQ7OwbBdpP?R!IqPQ)Ne|rY|>YjDj*V+a(j6 zYL}`s%CrOlY+Y*zlwew_-{cjXh{+V1u|bzzU)l-ZYdZBArl!|F945yGdL?d58cWkq z!G3PDBl%cVtCrMqKpmNC0XQWJdS9IVm;p*YTur2X?P1pFbwZj&*d;~~o>d6s-JY)f zV#y6Hm$<#%eFC_f#bL--yA(@BRE5Hm(4iS6!?mXNz?TNAH=SVt z5P842Ns9JG%}rCE4f@Wd(0^!?`HwL= Date: Mon, 15 Feb 2021 23:59:00 +0100 Subject: [PATCH 076/124] fix on altitude reference and first ECAM bind (not working) --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 2e8e963d..b1934b8e 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -157,6 +157,7 @@ var init = func { me.max_altitude = -9999; me.basealtitudeft = nil; me.reference = nil; + me.onfailure = 0; var tile = me.tile; @@ -200,6 +201,10 @@ var init = func { me.request_clear = 1; }); + setlistener("/ECAM/warnings/timer/nav-gpws-terr-fault", func{ + me.onfailure = getprop("/ECAM/warnings/timer/nav-gpws-terr-fault"); + }); + }; var clear = func { @@ -225,6 +230,12 @@ var draw = func { if(me.fetching) return; + if (me.onfailure == 1) { + me.clear(); + me.restart_beacon(); + return; + } + if (me.radar_beacon == 0) { # update aircraft reference var ref = geo.aircraft_position(); @@ -234,20 +245,22 @@ var draw = func { me.reference.altitudeft = ref.alt() * 3.2808399; if (me.basealtitudeft == nil) { - var basealtft = me.get_elevation(ref.lat,ref.lon); + #var basealtft = me.get_elevation(ref.lat,ref.lon); + var basealtft = ref.alt() * 3.2808399; if (basealtft == nil) basealtft = 0; me.basealtitudeft = basealtft + 400; } - if ((fmgc.FMGCInternal.phase <= 1 or fmgc.FMGCInternal.phase >= 5) and (me.basealtitudeft == 0)) { - var basealtft = me.get_elevation(ref.lat,ref.lon); - if (basealtft == nil) basealtft = 0; - me.basealtitudeft = basealtft + 400; - # me.reference.basealtitudeft = ft + 400 # <- TODO get departure/arrival runway altitude - } - else if ((fmgc.FMGCInternal.phase > 1 and fmgc.FMGCInternal.phase < 5) and (me.basealtitudeft != 0)) { - me.basealtitudeft = 0; - } + #if (fmgc.FMGCInternal.phase >= 5 and me.basealtitudeft == 0) { + # var basealtft = me.get_elevation(ref.lat,ref.lon); + # if (basealtft == nil) basealtft = 0; + # me.basealtitudeft = basealtft + 400; + # # me.reference.basealtitudeft = ft + 400 # <- TODO get departure/arrival runway altitude + #} + #else if ((fmgc.FMGCInternal.phase > 1 and fmgc.FMGCInternal.phase < 5) and (me.basealtitudeft != 0)) { + # me.basealtitudeft = 0; + #} + } } From b601fd7c2cecc9936c24e34b99e88e353838c98d Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Wed, 17 Feb 2021 00:30:26 +0100 Subject: [PATCH 077/124] 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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 Date: Thu, 18 Feb 2021 00:01:23 +0100 Subject: [PATCH 078/124] GPWS inhibit switch off terrain on ND --- Models/FlightDeck/a320.flightdeck.xml | 56 +++++++++++++++------ Models/Instruments/OHpanel/OHpanel.xml | 68 ++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 16 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index 188eb01f..271f98ea 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -1441,20 +1441,32 @@ - - systems/electrical/bus/dc-ess - 25 - + + + systems/electrical/bus/dc-ess + 25 + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 0 + + property-toggle controls/switches/terr_on_nd_l - - systems/electrical/bus/dc-ess - 25 - + + + systems/electrical/bus/dc-ess + 25 + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 0 + + property-toggle instrumentation/efis/inputs/terr @@ -1492,20 +1504,32 @@ - - systems/electrical/bus/dc-ess - 25 - + + + systems/electrical/bus/dc-ess + 25 + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 0 + + property-toggle controls/switches/terr_on_nd_r - - systems/electrical/bus/dc-ess - 25 - + + + systems/electrical/bus/dc-ess + 25 + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 0 + + property-toggle instrumentation/efis[1]/inputs/terr diff --git a/Models/Instruments/OHpanel/OHpanel.xml b/Models/Instruments/OHpanel/OHpanel.xml index 1bea790e..054a93e5 100644 --- a/Models/Instruments/OHpanel/OHpanel.xml +++ b/Models/Instruments/OHpanel/OHpanel.xml @@ -1698,6 +1698,74 @@ property-toggle instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + + + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + + + controls/switches/terr_on_nd_l + 1 + + + + property-assign + controls/switches/terr_on_nd_l + 0 + + + + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + + + controls/switches/terr_on_nd_r + 1 + + + + property-assign + controls/switches/terr_on_nd_r + 0 + + + + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + + + instrumentation/efis/inputs/terr + 1 + + + + property-assign + instrumentation/efis/inputs/terr + 0 + + + + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + + + instrumentation/efis[1]/inputs/terr + 1 + + + + property-assign + instrumentation/efis[1]/inputs/terr + 0 + nasal From 5c7b92769249975fd91dc8e0271672936a249d36 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 18 Feb 2021 00:01:53 +0100 Subject: [PATCH 079/124] enabled MAP mode --- Models/Instruments/ND/canvas/style.nas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 805010a1..2d9b36ed 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -93,7 +93,7 @@ canvas.NDStyles["Airbus"] = { predicate: func(nd, layer) { #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); var visible = nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); if (visible) { layer.update(); From d1433bfde7f9840c4127d2ae20cf952b9587bd5c Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 18 Feb 2021 00:02:18 +0100 Subject: [PATCH 080/124] New set of tiles --- .../ND/canvas/res/terrainv2/tile_ah.png | Bin 0 -> 6214 bytes .../ND/canvas/res/terrainv2/tile_al.png | Bin 0 -> 5905 bytes .../ND/canvas/res/terrainv2/tile_ch.png | Bin 0 -> 6247 bytes .../ND/canvas/res/terrainv2/tile_cl.png | Bin 0 -> 1786 bytes .../ND/canvas/res/terrainv2/tile_gh.png | Bin 0 -> 6261 bytes .../ND/canvas/res/terrainv2/tile_gl.png | Bin 0 -> 1770 bytes .../ND/canvas/res/terrainv2/tile_gs.png | Bin 0 -> 182 bytes .../ND/canvas/res/terrainv2/tile_mh.png | Bin 0 -> 6293 bytes .../ND/canvas/res/terrainv2/tile_ml.png | Bin 0 -> 1563 bytes .../ND/canvas/res/terrainv2/tile_rh.png | Bin 0 -> 6061 bytes .../ND/canvas/res/terrainv2/tile_rl.png | Bin 0 -> 1732 bytes .../ND/canvas/res/terrainv2/tile_rs.png | Bin 0 -> 182 bytes .../ND/canvas/res/terrainv2/tile_yh.png | Bin 0 -> 6275 bytes .../ND/canvas/res/terrainv2/tile_yl.png | Bin 0 -> 1473 bytes .../ND/canvas/res/terrainv2/tile_ys.png | Bin 0 -> 181 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_al.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_ch.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_cl.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_gh.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_gl.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_gs.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_mh.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_ml.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_rh.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_rl.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_rs.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_yh.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_ys.png diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png new file mode 100644 index 0000000000000000000000000000000000000000..dacbc9c99df4040ff9d5c3e1ccfae425c904ea1d GIT binary patch literal 6214 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 literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png new file mode 100644 index 0000000000000000000000000000000000000000..a73451d38769f0327bc91ae852bcf92ee09b438d GIT binary patch literal 5905 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 literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_gh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_gh.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef59738767a434b57478770e00c5ed098b84a13 GIT binary patch literal 6261 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 M07*qoM6N<$f-A0D8UO$Q literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_gs.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_gs.png new file mode 100644 index 0000000000000000000000000000000000000000..3456dfec333312081b5579658b6b66b150cdda45 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1SGer&Y23NSkfJR9T^xl_H+M9WCij$3p^r= z85sBuf-vKbiP>*~f)XXJ5hcO-X(i=}MX3x0iJ5sNdU>fO3MP7ndZsDv5g?OIJY5_^ zJiOnYHRNSb5MVG|V(=jTjgTe~DWM4f$%!&8 literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_mh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_mh.png new file mode 100644 index 0000000000000000000000000000000000000000..d06517213054d7936729d4520db669e461da85c5 GIT binary patch literal 6293 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 TeJevFP(OpGtDnm{r-UW|@!m7! literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_yh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_yh.png new file mode 100644 index 0000000000000000000000000000000000000000..dc54323337d72f8496d1b87273da29873bed29fc GIT binary patch literal 6275 zcmV-}7<}i6P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000UZ zX+uL$Nkc;*P;zf(X>4Tx07%ERR%cXG*&03f-t+8ste9upRUftwK1^*jzTwV?bUCtZjD-+SpQQm`cdSXPl7s_t~K%j6lxLg2; z5>(%s{4Iu*B8^G@Atqg%!AJE1sh+`O=b*d{<$8%}St695lIp_w+{@qi54j>92VIZ! z5Y;KUVjj8|N!ph!c_L{pS$cjtCrc>hg(!F6q_EK#ayQD&=Ij3ktsH3s1AM&ftsL#` znbu4zMq)aflg7y5u+ych{=Xr;t9hn(5CB=Uw)Ptwu`qXD!$>DAAOTrG2P!}l=mI0a z1lGU-I0JX!0|G$^hybx*IpBa4kO71s4-|k6pa_(JGO!y|gIdr48bJ#<0Xjf8I1es? zYv3lh14e)ZjDzQ38oUFu5Cq{NDnx@+AT3BAGKH)m7UT-~K#QPoC>Bb9k|6;kh6oh+prh0cd+BwcQ_nQ31^6N!1?21ajCe~xb3+8xK>;bZV)$yo5ADp zDtJ@83qAzT#*6Sp_`UdJ_;dIn{5bvtflSaMSQC5+aRdQjBcYPeL^w+rB1{lwiE>1J zq7yNM$R(~MmJ%C?UBny2apEjVo@7XJAw`fk$ot7Jxn~|r< zTgivWXUK1tZ<45uhqj587KuPr7M*xolv@~^l5>{0*?i}1=|+1EErnw zURh1qU74p`tlX-6NBNTqL&ZlWO=YJ_hsq;WjH-!hm};Kt0o9ADFVyI2&T1UBVzm=$ z57c3G6ZLTQ)#``TudB~!XlnRrWNGZxxS;VuQ%TcZGgY%f^Q`8S7EQ}li?3Cobx!LU zLy_UZNM}?r`WVyN>e~L=V(mKZ0qt2GL!C&SjXJG5k90}8EZrpC3f*4aX+15yV7&sp zX1xdcM17WiivAw`e*O0bh6d3FTMRl3CJmJh0}NLgHXA-Pq8hmwWgFES-8RM z_Z#0dflcg8QcP-0ZkWQR_NIK({icIvSTjd6fmyxTFq6XcVCFKLnWN@P=8McXns=DL zw9vDNv)F0TZ}HXA&NAJy!E(e(!79*dqg9vHYikp0j&+UoZ5yhMugyA}PMcS@rnWrW z1Ge|A%*cU_zS`t(p^kk9ABH^O0U^qB1cvtYl#rlf{i#tL< zNI=N0kVm10q1mCoh2g?N!)n5whFgUfg!eC@Em^UoY00|?&xq29kw~LRab$0lY*c(y zW7PX-@96SqNsL9znwV>`sm1crLth-b9j1QhCy3 zvP<%=;k(>8%-rjD(ES0tG>upf6K1Ge2`M z%QUMfOOoxBy*qna7$iKL1LZ8s=@ik?2j;riNW57*n(LZdllvhrD(_^ze7+$6`bv|P z+g47j@?G`wYRqcR>fQqFf(-?uYdqG}t%cSmuI*i?yRLBE_mi*q;2?pqvgi( zjc+$aZ|W-4C|qASw%KoUbCFDuuxNOT^OoAJn63P+1KVu2?cMgZm|J|c#ImHaWFj1Euz*2g-0|g0j0i-F6-=moHycKDH}(S9=AcqPXJi?iIVQRN7Y7 z?jh|F?~zn3s_NXUx3_HX=jxQ|J2jp)t^3sXZQJ*LKX?Do0rvwfwHmc0wVw|158kWu zt81?}sINSPJCu9qX+u;)|Ie(S8xN}Jt z#&!;#4m{o4<=oZwoB3}?y0yD&&M2NKJxe-Ucy{jGs&g|vSv@b#C!ZhdUC}#oA?CvE zzOcT5i$NDJU-G?lq2Htb++~-`-B+BhoW9Ds+HuYPTKjdo>utZ={oXcUKhS=|;YR08 z$D3V)3kS~*xecAa<$deY?SR|Y?kv7DcsKIyz2W#_$vy79$@}T|Up>fuFgvpTA@*VM zBe_SFkJTU7|6%+`tHfS%X4HH1`jaJ3M#eZ}&;QK%^YeJ&Q|i;o39X67N$bh(Dc`A^ z&z3$Lf1dSx_C?XZ*nw{WIiqQ0`W8$GY1nTe6(@ z4__iM>t*L=HQTqWnmA3(@WM_b4Rxz{^W9;7wJ%6CYeRY6JBHbA;_)YTQ|y5!9(MA2*A8BJVLO@l zAY(%}Sy@}mW4ktTTVpMHQz@7F;MOe|yfH&CFo_~Pfn0-%3NRV-lvd4(d4so`FRc;58)3&!K6fa?m~=z`nPUAJv+{tw)M2Px0BDun4h^$ z!%}$sem%GRc^3RiM#h!AzyA!qJqxI`kWMQJCX8g%78EKei#V+-p{Aw?oia#WjRTb; zLnf8RXs}^0my;-z6HK~gOa@d26>gh!qO`H93yp?EGK1A(r^r>x)ch>j*bMh=UQ1g; zEyiqwm;S}e+xrH&dMzXeNCkONXbWhy32K&=<8&G+sLh1acBXwxpps`~rice#}yc$&^H4YqAy;1s#e^2r_AOW-vP8^*v^`Y-l5y)N%G= zj3=M}jEq8w)t0Be(Lrl{Im$wU3;n}vXkW_KJDa3S2kG&`l;EY#WnyANIvUZElXF#z zSWQW@KIP*E!K53 zGcuCn$f*Ig-o1*)cQnyh>O*BMqsv{a=iz(H*wkTTbUwtlcCX^m?e$Fg{QUH-OMG&8 zfrwg#Uaw+pt5txgMwbn6`qTwJ`aFeC0ESM0>nY;yP1W*yv0TE&d^jYGGxC)UH9WO@ zC7U{HDJYEe4-BDJMksX_@E8&(%?_dEgJrz%jTP+Nq~`IhaA&&~k4?e&%~6JLO6#OD zqtT4OfbO1Y#%By<)fF_a-AZ$FE5#KhLftHn>{!mO_^Chq{(qL7M3 z(5p?%_zHAi2-9hNZ7tOp9d3@Cyui=i8RZv0?4Zf5U|~Vct8esk=v0Vo zQcXdIoslXEL203U>Wjc2Z<7_ODz*IeQ}?iTS%$fpEKlt{LEpIaE?uCi)J3Hl90;J8yVg<|_Fm&yUy6^eK#>uC_?PXpl`BZ3G`#WN1n(S}Ad!&s z1bk|PkyyTf!K&gbYgTZ_8Z9g9?ELBI84~d*o7c9m|G;IsFH6f4D$F`N(P$WTUbI3e zsWnM=q=1yj{vwo&dJn3XzGLfhI?K2`qUYnIK?2fx-^>)vwRZAaBSUiqbh;FKpK4;m z>JpLcTjWz&9Bv&?e652=w^=DMN4YvU!3Q5^`1phm|D2joTtQaGp%(h*3Tdn!6UFuv z58YG5D=*&9y3Ol2cj*cuPpJO()s0;vw-WsFxBY@ZczSyY-~0L|CMPG@`&K`v&d;%9 zTMKus@vyYA7^|aty>7iPzqf$ zswDSqY3JE*wo+AIU{u89Y|ogm$c$<_8SQ%gf38aP(7r;=wpIsK#VSgdRG`W%(0en< z?W^mlcB!$L4NL};d~(7|UMf%s`tRuQu%ygPCL4pS54E&>?=#!EZ+k5^yNZ)%h6NTn zsW^elqNA=VD+EZ1*Vv^~aW0>qL3!ZNEnyoZS?KR^2UMFx5Vgh~&( zA}ju=PjW?4##bZ^n#1AJu=~DcsP_GOYu8_W;~v&`R`c)ge$M{GeZ2YGD@=H^WW^Zs z8YKp!hRO=jkk&f<3sG{h3_*EFMh^VJ)4Q-(-Te8ZKHfPzOJ|*ynyPZjJT4h$oO72$ z1f$}lSvAp6j$F$2$=NX8~PC_*xJLv%pWmEI;AAav45 zLaOlO*z;&L4{cvY{YnQ;mxUX{v%>MX9H`*^-=AmS`=b(I1eA6)OPAQN%iN8U6|RYU zPK>5WNgJ~{y|6`%QKP4@s1?M>re;yCX`AbE7v-fIJ?)a5_8%R?QtIMwo_Ua$p1GH% zT1il26FjidPQwZ}wY5(A`Y&*GG$mApv2h=B^NBC>MP5d?kjhc%QA*1dV#;CMODZuI zm(V*niPhi{Ma`3!+p5%gwE8Tb5-loAMXGCkvj>;Ef`RJ`d~{-piqdlKUTdUrX^QgV zB#F?dM7Q+-|oa=PckQ}_{26dFTc10g<8pbk|X?qSrN0Pv`Od6 z9R?16;$_+&kuK-SB8n@yQ-VOC^>}WCgpnnB*)c>JN_j`NPQ*SdFI%Clp^s{#-IG93SSy*b009VWq`O)Cx6A zigorL)JF!^Y5`yZ;DvD8IOn2qv3$jvKFhr%$>pM^X1y4V^o;A(o_(M_V0zq6N z+nwzmR#xT+MIxN&iF4+BNIIp!q_@Zjs^w4zqXCI>hA`{vs|fgG^iAcs*b^p^F_4Jm zQR!2dC0M)cHr{^kIQxD#h$^WlbR{La=UFtF7{^IHVc64|ALN=2H&qTJ_o#AAMz*$fhd^9)T-(=(hUQ_xGODU-28 zxh4j9=!-?aA{PD;a^xp9E`0iF--6K25 zN;lKUtEq8NoXZWn-(_(VmZkV@|g-3FbS4cFEvo&TFTY24F7v@h&yBteQak3 z%d2bYIon56m!qS(mfagQD62hjQO7Mj{6L+cyFkttW~_gL&o0bKZb-_KW5MIBVR1K^ zo$)bzt&fve=CCj3N^#RvGJ!^A6?%KbXY`UITrM-$Dzx0Th zRW%LE^`aHRBw^H`oRv&WquRAC+hx>csjROfo{+F2Yg=cd2$aOPKrBlzlBM^H5k{tG zC~}%z8|AK!8eaW&0~>CWJQ+=}=VzbF#lhip(q3;6 z`YOqZha|sOstU3GZ)G5 zhl4&zUzdo5{1}vB^eP`a?pcN=E1P#=2Av`#nIVALs75UbIFWZD!b?`t_9c1Xp`%{L zd@3&Y%`$LplDJ-hL1UKDj-dMI*V?=Enl#7#+{{ZkW58LxR09gP4002ovPDHLkV1g$SB{cv5 literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png new file mode 100644 index 0000000000000000000000000000000000000000..b22f7d0fe0c9ecff80d1e6808d99b943e01196c3 GIT binary patch literal 1473 zcmV;y1wQ(TP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE200009 za7bBm000ia000ia0czHX2><{97<5HgbW?9;ba!ELWdLwtX>N2bZe?^JG%hhNHDpIv zQUCx26G=otR7gu*mQ85ZM-YcMQ4?b@epN*yREeNgTWu|c6k2I(sF)VSC6!8;r`)rVcpa7j=(-|q{7BC{T zhys@I*sIDH~J=C2@!aqTbkn*YIdK^94 z1iJWz6(r)8q7ad#U7TtL`;QhdP(bWBw=l*-r%ruPs1b?i5drDctg>9%Ld3g>w9kcI zVS4G(XB4=5_xo+zl1E+u819B#oH-sFM`W~^Q$kEr4J>PbV2*d)x^Un?u8p(!wawH< z3#n66=tFisxoKs1v3%O1%@Z-XTd5J`M=t#$A5oR$~ z;#{>~JSd`5!LYl1`@)MC{m-BOv};$cVP}jSfcuP1(-h7KiL8$Y(aGEAqv=!%#>tZt z*sV};GMb1I^>fzOH+or#;ib6jPBrGwPjm`XluTfDDpJE5`2a@GTqj26MdZarKBJj* zplxzt6k`^;dUfdPO0U_OGauf&*Uc6QW<;w@=#Cs2&*x4G`$Fr-h^|@{9zN`O_N;Hs zn(RTzU9ceVJ;+_SapP3N06M<%;Cl7y7oHRF2q}B_ zhHKZp+_*6zNwffCqGHt~^!8T!L%>YzGSx=yfZH-WoKnWXL?RkC7ueR3kw$jR0-_oD zNOpAO9|jUBbt0!oX_+iWrVwIyU$QVS>f5CaBKPut3@WK(5kvJY!N>ug8pH(l;r8wC zo;>O0k!Px(Z#`>cyImYiiQ;EJxVv~%k@SbAKR(GMSb+SKC);8i=4*OFhH&`=7Y96k$WxiDI_>^MqoF7fv5p{FO=#Sfw2Jcoka1b5;@E3wit zg2CsAX9|q@_)*(JA)@@2E!FF3Rx#2^c6WOQTkqWITD&+V%f*jOGNE3&G%Q<|63np! z#5Un#ee{8iaytMZc94+#^t*ojs~AUk9wahGKIQqLCkrEm3n_|Va~Q=#6a|KpHPLPg bHH7~FJRtxQ0;RWa00000NkvXXu0mjfjQ6Eb literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ys.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ys.png new file mode 100644 index 0000000000000000000000000000000000000000..f1604ba30d8379eb31888742e00ba0948861a65e GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1SGer&Y23NSkfJR9T^xl_H+M9WCij$3p^r= z85sBuf-vKbiP>*~f)XXJ5hcO-X(i=}MX3x0iJ5sNdU>fO3MP7ndZsDv5g?O|JzX3_ zJiOnYH56n};9)TIxw?P3mIJfB!Bf5JbMI;vaGEr#U0|8zAe_PE3*tPxd5)FuZe@<^ S@0%V#?F^o-elF{r5}E+V)-*@} literal 0 HcmV?d00001 From a3d1bb8b50844f2fe726c015d47de572cae910b6 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 18 Feb 2021 00:03:33 +0100 Subject: [PATCH 081/124] Manage fly phases for hi/lo aircraft reference --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 81 ++++++++++++------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 554e9800..e728749c 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -12,7 +12,7 @@ var terrain_maxalt = props.globals.initNode("/custom/terrain/max-altitude", -999 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_gl.png","tile_gh.png","tile_gs.png",nil, # 6-8 hi alt "tile_ml.png","tile_cl.png" # 10 magenta - 11 cyan (water) ]; @@ -102,15 +102,14 @@ var updateTerrain = func { if (me.hialtmode == 0) { if (diff>=lowaltft) grad = 3; # lite yellow else { - grad = 2 + int(diff/1000); + grad = int(diff/1000) + 2; 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; + grad = int((elev-me.bands_minalt) / me.bands_range) + 6; if (grad>8) grad = 8; # solid green } } @@ -147,8 +146,11 @@ 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; + if (me.onground == 0 and (me.max_altitude + 1000) < me.refaltitudeft) { # 1000 ft tollerance + me.hialtmode = 1; + me.bands_range = (me.max_altitude - me.min_altitude) / 4; + me.bands_minalt = int(me.min_altitude + me.bands_range); + me.bands_maxalt = me.max_altitude; } else { me.hialtmode = 0; } @@ -158,9 +160,6 @@ var update_altitudes = func { var restart_beacon = func { me.radar_beacon = 0; me.radar_cycle += 1; - 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; @@ -174,7 +173,7 @@ var init = func { me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); - me.imgpath = get_local_path('res/terrain/'); + me.imgpath = get_local_path('res/terrainv2/'); me.radar_beacon = 0; me.radar_cycle = 0; me.radar_cleared = 1; @@ -189,6 +188,8 @@ var init = func { me.reference = nil; me.onfailure = 0; me.hialtmode = 0; # high aircraft relative altitude mode + me.checkarrival = 0; + me.onground = 1; var tile = me.tile; @@ -228,9 +229,9 @@ var init = func { me.terrlayer["R" ~ c] = grprx; } - #setlistener("/ECAM/warnings/timer/nav-gpws-terr-fault", func{ # TODO need further investigations - # me.onfailure = getprop("/ECAM/warnings/timer/nav-gpws-terr-fault"); - #}); + setlistener("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit", func{ # detect GPWS switch status + me.onfailure = getprop("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit"); + },0,0); }; @@ -271,42 +272,60 @@ var draw = func { me.refheading = getprop("orientation/heading-magnetic-deg"); var refalt = ref.alt() * 3.2808399; - me.refaltitudeft = refalt; + me.refaltitudeft = refalt; me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; + me.onground = getprop("/gear/gear[0]/wow"); - if (fmgc.FMGCInternal.phase<2) { + if (me.basealtitudeft == nil and fmgc.FMGCInternal.phase<2) { #var basealtft = me.get_elevation(ref.lat,ref.lon); me.basealtitudeft = refalt + 400; + me.checkarrival = 1; + } + + if (fmgc.FMGCInternal.phase == 2 and me.basealtitudeft > 0 and refalt > me.basealtitudeft) { + me.basealtitudeft = 0; + } + + if (fmgc.FMGCInternal.phase == 5 and me.checkarrival == 1) { + me.checkarrival = 0; + me.basealtitudeft = nil; + if (fmgc.FMGCInternal.arrApt != nil) { + var airport = airportinfo(fmgc.FMGCInternal.arrApt); + if (airport != nil) me.basealtitudeft = 400 + (airport.elevation * M2FT); + } + if (me.basealtft == nil) { + var elev = get_elevation(ref.lat,ref.lon); + if (elev != nil) me.basealtitudeft = 400 + elev; + else me.basealtitudeft = 400; # no hope + } + } + + if (fmgc.FMGCInternal.phase == 6 and me.checkarrival == 0) { + me.checkarrival == 1; + me.basealtft = 0; + } + + if (fmgc.FMGCInternal.phase == 7 and me.basealtft == 0) { + me.checkarrival == 1; + me.basealtitudeft = refalt + 400; } - #if (fmgc.FMGCInternal.phase >= 5 and me.basealtitudeft == 0) { - # var basealtft = me.get_elevation(ref.lat,ref.lon); - # if (basealtft == nil) basealtft = 0; - # me.basealtitudeft = basealtft + 400; - # # me.reference.basealtitudeft = ft + 400 # <- TODO get departure/arrival runway altitude - #} - #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){ + if (me.layer.display_changed == 1 or update_size) { + me.layer.display_changed = 0; me.request_clear = 1; } me.updateTerrain(); # left - if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(); # right + #if (math.mod(me.radar_beacon,2)==1) + me.updateTerrain(); # right } From 2864667ef8211732f481e819e2dca10d7ff3f719 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 19 Feb 2021 00:17:21 +0100 Subject: [PATCH 082/124] better hi/lo ref transition, props changed --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 56 ++++++++++++------- Models/Instruments/ND/canvas/style.nas | 4 +- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index e728749c..e6628cfc 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -7,13 +7,16 @@ DotSym.makeinstance( name, __self__ ); 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 terrain_minalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/min-altitude", 0,"INT"); +var terrain_maxalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-altitude", -9999,"INT"); + +var terrain_alert = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/alert", 0,"INT"); 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-8 hi alt - "tile_ml.png","tile_cl.png" # 10 magenta - 11 cyan (water) + "tile_ml.png","tile_cl.png", # 10 magenta - 11 cyan (water) + "tile_ys.png","tile_rs.png" # 12-13 alert ]; var is_terrain = 0; @@ -53,6 +56,7 @@ var updateTerrain = func { var altitudeft = me.refaltitudeft; var lowaltft = me.reflowaltft; var basealtft = me.basealtitudeft; + var alert_level = me.terrain_alert.getValue(); var side = (math.mod(me.radar_beacon,2)==0) ? "L" : "R"; var a = int(me.radar_beacon/2); @@ -98,6 +102,10 @@ var updateTerrain = func { if (diff>=0) { grad = int(diff/1000) + 3; if (grad>5) grad = 5; + if (alert_level > 0 and a < 6 and grad > 3) { + if (alert_level == 1 and (grad == 3 or grad == 4)) grad = 12; # solid yellow + else if (alert_level == 2 and grad == 5) grad = 13; # solid red + } } else { if (me.hialtmode == 0) { if (diff>=lowaltft) grad = 3; # lite yellow @@ -135,7 +143,6 @@ var updateTerrain = func { me.radar_beacon += 1; if (me.radar_beacon >= (me.tileradiusw*2)) { - me.update_altitudes(); me.restart_beacon(); } @@ -143,25 +150,28 @@ var updateTerrain = func { }; var update_altitudes = func { + me.terrain_minalt.setValue(me.min_altitude); me.terrain_maxalt.setValue(me.max_altitude); - if (me.onground == 0 and (me.max_altitude + 1000) < me.refaltitudeft) { # 1000 ft tollerance + if (me.onground == 0 and (me.max_altitude + 250) < me.refaltitudeft) { # 250 ft tollerance me.hialtmode = 1; - me.bands_range = (me.max_altitude - me.min_altitude) / 4; - me.bands_minalt = int(me.min_altitude + me.bands_range); + me.bands_range = math.min(2000,(me.max_altitude - math.max(me.min_altitude,me.basealtitudeft))) / 5; + var maxrange = math.min(2000,me.max_altitude - (me.bands_range * 3)); + me.bands_minalt = int(me.max_altitude - maxrange); me.bands_maxalt = me.max_altitude; } else { me.hialtmode = 0; } + + me.min_altitude = 9999; + me.max_altitude = -9999; } var restart_beacon = func { me.radar_beacon = 0; me.radar_cycle += 1; - me.min_altitude = 9999; - me.max_altitude = -9999; me.reference = nil; }; @@ -275,15 +285,16 @@ var draw = func { me.refaltitudeft = refalt; me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; me.onground = getprop("/gear/gear[0]/wow"); + + if (me.min_altitude != 9999) me.update_altitudes(); if (me.basealtitudeft == nil and fmgc.FMGCInternal.phase<2) { - #var basealtft = me.get_elevation(ref.lat,ref.lon); me.basealtitudeft = refalt + 400; me.checkarrival = 1; } - if (fmgc.FMGCInternal.phase == 2 and me.basealtitudeft > 0 and refalt > me.basealtitudeft) { - me.basealtitudeft = 0; + if (fmgc.FMGCInternal.phase == 2) { + me.basealtitudeft = math.min(me.basealtitudeft,400+me.terrain_minalt.getValue()); } if (fmgc.FMGCInternal.phase == 5 and me.checkarrival == 1) { @@ -293,20 +304,18 @@ var draw = func { var airport = airportinfo(fmgc.FMGCInternal.arrApt); if (airport != nil) me.basealtitudeft = 400 + (airport.elevation * M2FT); } - if (me.basealtft == nil) { - var elev = get_elevation(ref.lat,ref.lon); - if (elev != nil) me.basealtitudeft = 400 + elev; - else me.basealtitudeft = 400; # no hope + if (me.basealtitudeft == nil) { + me.basealtitudeft = 400 + me.terrain_minalt.getValue(); # that's fun } } if (fmgc.FMGCInternal.phase == 6 and me.checkarrival == 0) { me.checkarrival == 1; - me.basealtft = 0; + #me.basealtitudeft = 0; } - if (fmgc.FMGCInternal.phase == 7 and me.basealtft == 0) { - me.checkarrival == 1; + if (fmgc.FMGCInternal.phase == 7 and me.checkarrival == 0) { + me.checkarrival == 1; me.basealtitudeft = refalt + 400; } @@ -324,9 +333,16 @@ var draw = func { } me.updateTerrain(); # left - #if (math.mod(me.radar_beacon,2)==1) me.updateTerrain(); # right } }; + +setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red + me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); +}); + +setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow + me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); +}); \ No newline at end of file diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 2d9b36ed..616456eb 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -12,8 +12,8 @@ var adirs_3 = props.globals.getNode("/instrumentation/efis[0]/nd/ir-3", 1); var vhdg_bug = props.globals.getNode("/it-autoflight/input/hdg",0); # ND compass position deg -var terrain_minalt = props.globals.getNode("/custom/terrain/min-altitude", 0); -var terrain_maxalt = props.globals.getNode("/custom/terrain/max-altitude", -9999); +var terrain_minalt = props.globals.getNode("/instrumentation/efis[0]/nd/terrain-on-nd/min-altitude", 0); +var terrain_maxalt = props.globals.getNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-altitude", -9999); canvas.NDStyles["Airbus"] = { font_mapper: func(family, weight) { From 82521c8e7674aee22612fa4cc822db4683595d4e Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Fri, 19 Feb 2021 19:27:27 +0000 Subject: [PATCH 083/124] Aircraft Config: call resetVarious(). SOP: seatbelts and crew oxy to off --- AircraftConfig/acconfig.nas | 3 +++ Nasal/Libraries/buttons.nas | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AircraftConfig/acconfig.nas b/AircraftConfig/acconfig.nas index 68204794..8c5b4a51 100644 --- a/AircraftConfig/acconfig.nas +++ b/AircraftConfig/acconfig.nas @@ -298,6 +298,7 @@ var colddark = func { setprop("/controls/lighting/overhead-panel-knb", 0); atc.transponderPanel.modeSwitch(1); libraries.systemsInit(); + libraries.variousReset(); failResetOld(); if (getprop("/engines/engine[1]/n2-actual") < 2) { colddark_b(); @@ -343,6 +344,7 @@ var beforestart = func { setprop("/controls/gear/gear-down", 1); setprop("/controls/flight/elevator-trim", 0); libraries.systemsInit(); + libraries.variousReset(); failResetOld(); # Now the Startup! @@ -434,6 +436,7 @@ var taxi = func { setprop("/controls/gear/gear-down", 1); setprop("/controls/flight/elevator-trim", 0); libraries.systemsInit(); + libraries.variousReset(); failResetOld(); # Now the Startup! diff --git a/Nasal/Libraries/buttons.nas b/Nasal/Libraries/buttons.nas index 289abfb2..a6e10250 100644 --- a/Nasal/Libraries/buttons.nas +++ b/Nasal/Libraries/buttons.nas @@ -32,7 +32,7 @@ var variousReset = func() { setprop("/controls/CVR/gndctl", 0); setprop("/controls/CVR/erase", 0); setprop("/controls/switches/pneumatics/cabin-fans", 1); - setprop("/controls/oxygen/crewOxyPB", 1); # 0 = OFF 1 = AUTO + setprop("/controls/oxygen/crewOxyPB", 0); # 0 = OFF 1 = AUTO setprop("/controls/switches/emerCallLtO", 0); # ON light, flashes white for 10s setprop("/controls/switches/emerCallLtC", 0); # CALL light, flashes amber for 10s setprop("/controls/switches/emerCall", 0); @@ -63,7 +63,7 @@ var variousReset = func() { setprop("/controls/navigation/switching/att-hdg", 0); setprop("/controls/navigation/switching/air-data", 0); setprop("/controls/switches/no-smoking-sign", 0.5); - setprop("/controls/switches/seatbelt-sign", 1); + setprop("/controls/switches/seatbelt-sign", 0); } var BUTTONS = { From 06e81b20300e5da3d5a93cc4c0de83ccaac1b9f9 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Fri, 19 Feb 2021 19:42:56 +0000 Subject: [PATCH 084/124] SOP: seatbelt, smoking, emer lts to off --- A320-main.xml | 2 +- AircraftConfig/acconfig.nas | 6 ++++++ Models/Instruments/MCDU/MCDU.nas | 5 ++--- Nasal/Libraries/buttons.nas | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index cdd1862b..b39ecc9d 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -930,7 +930,7 @@ 0 - 0 + 1 0 0 1 diff --git a/AircraftConfig/acconfig.nas b/AircraftConfig/acconfig.nas index 8c5b4a51..e963ddc1 100644 --- a/AircraftConfig/acconfig.nas +++ b/AircraftConfig/acconfig.nas @@ -402,6 +402,9 @@ var beforestart_b = func { setprop("/controls/adirs/mcducbtn", 1); setprop("/controls/switches/beacon", 1); setprop("/controls/lighting/nav-lights-switch", 1); + setprop("/controls/switches/no-smoking-sign", 0.5); + setprop("/controls/switches/seatbelt-sign", 1); + setprop("/controls/switches/emer-lights", 0.5); setprop("/controls/radio/rmp[0]/on", 1); setprop("/controls/radio/rmp[1]/on", 1); setprop("/controls/radio/rmp[2]/on", 1); @@ -495,6 +498,9 @@ var taxi_b = func { setprop("/controls/switches/beacon", 1); setprop("/controls/switches/wing-lights", 1); setprop("/controls/lighting/nav-lights-switch", 1); + setprop("/controls/switches/no-smoking-sign", 0.5); + setprop("/controls/switches/seatbelt-sign", 1); + setprop("/controls/switches/emer-lights", 0.5); setprop("/controls/radio/rmp[0]/on", 1); setprop("/controls/radio/rmp[1]/on", 1); setprop("/controls/radio/rmp[2]/on", 1); diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index 39e237e3..1142c943 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -151,7 +151,6 @@ var baro = props.globals.getNode("/FMGC/internal/baro", 1); # GA PERF # AOC - SENSORS -var parking_brake = props.globals.getNode("/controls/gear/brake-parking", 1); var gear0_wow = props.globals.getNode("/gear/gear[0]/wow", 1); var doorL1_pos = props.globals.getNode("/sim/model/door-positions/doorl1/position-norm", 1); #FWD door var doorR1_pos = props.globals.getNode("/sim/model/door-positions/doorr1/position-norm", 1); #FWD door @@ -844,8 +843,8 @@ var canvas_MCDU_base = { pageSwitch[i].setBoolValue(1); } - me["Simple_R1S"].setText(sprintf("%-10s",(parking_brake.getValue() == 1) ? "SET" : "RELEASED")); - me["Simple_R1"].setText(sprintf("%-10s",(gear0_wow.getValue() == 1) ? "GROUND" : "FLIGHT")); + me["Simple_R1S"].setText(sprintf("%-10s",(pts.Controls.Gear.parkingBrake.getValue() == 1) ? "SET" : "RELEASED")); + me["Simple_R1"].setText(sprintf("%-10s",(pts.Gear.wow[0].getValue() == 1) ? "GROUND" : "FLIGHT")); me["Simple_R2S"].setText(sprintf("%-10s",(doorL1_pos.getValue() > 0.1) ? "OPEN" : "CLOSED")); me["Simple_R2"].setText(sprintf("%-10s",(doorR1_pos.getValue() > 0.1) ? "OPEN" : "CLOSED")); me["Simple_R3S"].setText(sprintf("%-10s",(doorL4_pos.getValue() > 0.1) ? "OPEN" : "CLOSED")); diff --git a/Nasal/Libraries/buttons.nas b/Nasal/Libraries/buttons.nas index a6e10250..24dbb3a6 100644 --- a/Nasal/Libraries/buttons.nas +++ b/Nasal/Libraries/buttons.nas @@ -62,8 +62,9 @@ var variousReset = func() { setprop("/modes/fcu/hdg-time", -45); setprop("/controls/navigation/switching/att-hdg", 0); setprop("/controls/navigation/switching/air-data", 0); - setprop("/controls/switches/no-smoking-sign", 0.5); + setprop("/controls/switches/no-smoking-sign", 0.0); setprop("/controls/switches/seatbelt-sign", 0); + setprop("/controls/switches/emer-lights", 0); } var BUTTONS = { From 05f5774fd2f747f74fc2501058da600a8c036cf3 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Fri, 19 Feb 2021 20:17:38 +0000 Subject: [PATCH 085/124] Fix that some code was not called with FROM / TO --- Nasal/MCDU/INITA.nas | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Nasal/MCDU/INITA.nas b/Nasal/MCDU/INITA.nas index e96f0df2..9d048ea0 100644 --- a/Nasal/MCDU/INITA.nas +++ b/Nasal/MCDU/INITA.nas @@ -238,6 +238,7 @@ var initInputA = func(key, i) { fmgc.flightPlanController.reset(2); fmgc.flightPlanController.init(); Simbrief.SimbriefParser.inhibit = 0; + fmgc.updateARPT(); mcdu_scratchpad.scratchpads[i].empty(); #} else if (scratchpad == "") { #fmgc.FMGCInternal.altSelected = 0; @@ -264,6 +265,7 @@ var initInputA = func(key, i) { mcdu_scratchpad.scratchpads[i].empty(); fmgc.flightPlanController.updateAirports(fromto[0], fromto[1], 2); fmgc.FMGCInternal.altSelected = 0; + fmgc.updateARPT(); fmgc.updateArptLatLon(); #setprop("MCDU[" ~ i ~ "]/page", "ROUTESELECTION"); } else { From 2a46f55c0f9d3ccd9855e771dccbdf089879e132 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 19 Feb 2021 23:40:22 +0100 Subject: [PATCH 086/124] better cyan/sea tile --- .../ND/canvas/res/terrainv2/tile_cl.png | Bin 1786 -> 1786 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_cl.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_cl.png index d6e55619dffad0ff10fd435543253860b5920cc4..bcbd0067156bfd296e1f063f516b7589594f1593 100644 GIT binary patch delta 1657 zcmV-<28Q|i4f+j`XbQam01mwYNBfYik#aD9U2LCa83yoYYrD^OTbFgL?K-#aqjr_z z+Gb^I(v68s)W9@26G#|_nIX&}Y(pXrm?K6}mP|!KM_^11<3kcWfJpGb6BCKXBV0l- zl5heN0tX&INFILg|04ek?}NAZbKlo>-5>AMw=HYdthwn2|G437oj&x>l`B_vbac#r znKNg>f(6~(-Sg(n<1AaYY~jL%d=XA(XXo6xb9;JvJQG>8Xwm$ZNd>li`Eo>lA_amj z0;A6F>goyy8Z-_Vxg|@M$fhJ8n8Ap|XLO{Lfsx`AZHiLy44ItzOfZfzahM4lVfy>~ zJ!fWSR;^mqvHHl+ZU61Q@!zHYKy;{oGYaYz9IYWsWCNlMLNM(EKyz4vbS)W%KQ%RV z-CgIudahpcWL=V+GX&~93*Usaio)Dr8Jw2Zbsq5Sjb4rRMO3sEn6<#cF*NU zUqAdp9iIG2R+6^jl$rgn_l!M+zhcD-68O|3tp-qPFdT%XOP9)uLn^=r(_h+u7x4m6 zj0j*c1DF1;?0l@wK3W~%5W-Ivo{?_9z@ed``QLhb+v&RZsk(06I;pX-u~5(zLt!F{ z;r8|Qbzk*HDPMmRLFIHI4eiJ{YHKG`b105ISU>wv{pNFZa&pq1;UT2}f+526#9zF4 zahdvavC~YazIo+HOEa9@2#%(Iq=;_2`Q_aYynorPf9vh-ZOP8vym|A**S=EL{>+rX z)UdRrydxd+6=Vlx2yq4m2G-90VdIXc)4syNfwAbeN5m=<=PtRw+1|xBzLULyiL*Ej zlZxUBFiT(hpQujSu2fpwUX%QH5L?IPcfDk$OMq>QT)UWHVGj;2KiRwnk=7pz* zy%i%nXDDgR{=Kic>7TmggEIPy)SwH^X@6Jrv}x0(XmzeXvEdu94u1Q+GWj56dgbUT zZ>y-2D5kSwt4Hqq^p4Y6l%w9$KE*hg9AHmEd4IY|uT0R}mL;y6LfsF)9M0Nw#6jTT zWFf5GAZ8p|Sz7#d0hH{2BfD*OC7KDeDdC6%l$}5@DM8r`s@{dGYrnJ6(NSM+5nwEM z0I4Fxc&71d<@H2VgW{MmLaBkTyZ>8VFoT1G_Mr(dDUqf?ta)!OrVwjtwzPnfiVStsjCgoLE+mzfF&ma z>7#k_*vW%mJJ{UaHird)%#=xCj#T{N;bD%kM0CSYL=-SIfQYObBE-R(Z#$6s5OR?d zVf;9lo`iCda)ny@&E;mZv$NzboSTzlBily1(WeeRer(TuT42(2)kA>E>cC3J9XoIS zaLawQY`D`=c?Rr%dEwlov)*P7dtABmu>%jhW6`aqn^zsnLf`~39Th9Rr>2kA$%pHr zegAWdf^YFYF*gIo6)d~Y)+>Kozw<)fwePP~AaEk>sMFM77UDJfBJJ4!pP5JM<&RdE zRloU-YtK!ZPejxFW>=T|s`-0RhEJp{la>fN!Q7=p%6AJ$Kr>6r0-(;Y_|Zbi8`6iiP(+#nL2!`cJ6*l`E-iY-}GjXX@zAr$zK(;lKd=W)45RB{`KCa3B!J73 zpN<``NB&d~-TS5^liKt7yY+!WRMTp3a%@)AxBBSFp67q~mwNZfzpJFUcT3tovWNHH zguiuU>(=S%=|;VEdEDvVue{cC_4#~jDQeLbu#!ftug@AtGbxcGwCnowcfC}<`(pK< zYgDpv_s3tYbi_nrnNLKGbVDl?;8b#t{F5iu)z$S8QF0zJ>|Amk00000NkvXXu0mjf D=o({6 delta 1657 zcmV-<28Q|i4f+j`XbQdn01mzZ>O!%=k#aD9TZ~ra6$aqVVK~je0GT1oAS6J7&P+-= z!vH~)ny8U9B^t57AUaq(6(lH(fmlGa7}5q3Je6wejYf@HJftC>lAo;;Z^!Wln){MfN$r%s*fnaGqWQzkY{DzKR|XCm?wsUYYg zFzWo4mX>g!LF0gtn>KBlY)bNh8H`ALMn_5+7%5JrO;IYIA(K;|3C2+-4l{uxOjlQz z=gO5UXV0G9dG*MZC(kT>?>vd{P|LSeSM*zD~7^E6vOT8 z?Cd{wvg&#L?{}4=a=MU)c4Qp2wUeni6gPfThD-TPDNB|tv1fQlDS%*zFg@{GTU+P; z`l-rJGoAY8l_M?9aB?F!nvx=ay7t-Ex4i$!(6g`2m@%UvJGQsCcl8r*Pu+Z%DS@eB zX-j!WI_9g89h4!&>F(}czW>n`dmc&q3I_+qqT3u1t9$Q5LubFWy*01Am%V|Bvp6-A zisA||OCNaRtzUds?k#2Meb0~+b(n7tEYFbL>MCU{WG=ftWGF6k>JFh89rP7#k@?!&|DZ>jHYlf!~QX3C^6M=Jh;1q(RF644Dq5mCU<03xz#h!6*>zwJQkL&!x= zgz@8GdJ@V-$`xwp*O!~ETD6MY`Ezq}tYw>MH+uK&M{intrxutrUG)%PvO2Jd7vFT_ zTW5zp{CDg6E%mW~VZff}&rLe(t>>`EAM8D{|HQv6y3us~s$*FQoFJy7VjXMuTz~qD zpZU`Kq#bpd8q7kxMqi|%=T42BE89LT zE~|d?7uTGdG@pp3`Sq?geO_+-wzO{Ck+Mu$BIpEjml835w`be%uD*RoAr)|>?wPqc z%|+RH9q;v>a1nZ6kulb)zc|;WPo~>h6O;KVezAdk~gFeZJ~(NHQ=%nP;wju zmE@x6E~G#<;28r*L!MX>;j01P+@5PzC!qa7rZ1fKO}kdV`TjL$zPk9)H)R=`|1RB5 zeNoBkL^3^pRxSF|k%57M%mj70kEx||Itkwl~_|G5S z_feT~!@Yi{I5H!)-*&KV)9vb^P{;)Ty;l&bAunFM`0CB0yZ1h%Q@uC1^{)9Oe5TYO z0X%KZuIv6;eyj0U&NwouAFmtL2MSS5tHH^!UeWy3BR@LwvJr6VR1%X}hgq#IhH0H>0B Date: Fri, 19 Feb 2021 23:40:43 +0100 Subject: [PATCH 087/124] test on GPWS alert --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 8 ++++++-- Models/Instruments/ND/canvas/style.nas | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index e6628cfc..81cc6a54 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -340,9 +340,13 @@ var draw = func { }; setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red - me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); + me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning") == 1 ) ? 2 : 0 ); + print("Terrain alert:" ~ getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning")); + print(me.terrain_alert.getValue()); }); setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow - me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); + me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-alert") == 1 ) ? 1 : 0 ); + print("Terrain alert:" ~ getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning")); + print(me.terrain_alert.getValue()); }); \ No newline at end of file diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 616456eb..92bc94f2 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -15,6 +15,7 @@ var vhdg_bug = props.globals.getNode("/it-autoflight/input/hdg",0); # ND compass var terrain_minalt = props.globals.getNode("/instrumentation/efis[0]/nd/terrain-on-nd/min-altitude", 0); var terrain_maxalt = props.globals.getNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-altitude", -9999); + canvas.NDStyles["Airbus"] = { font_mapper: func(family, weight) { if( family == "Liberation Sans" and weight == "normal" ) From cbb633264dc28d54f47d31b6279625be0de215e1 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 19 Feb 2021 23:40:58 +0100 Subject: [PATCH 088/124] ease for VOR arrows --- .../ND/canvas/framework/navdisplay.nas | 74 ++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 594b5fd0..7165ed0d 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -75,12 +75,82 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update # load elements from vector image, and create instance variables using identical names, and call updateCenter() on each # anything that needs updatecenter called, should be added to the vector here # - foreach(var element; ["staArrowL2","staArrowR2","staFromL2","staToL2","staFromR2","staToR2", + foreach(var element; ["staFromL2","staToL2","staFromR2","staToR2", "hdgTrk","trkInd","hdgBug","HdgBugCRT","TrkBugLCD","HdgBugLCD","curHdgPtr", "HdgBugCRT2","TrkBugLCD2","HdgBugLCD2","hdgBug2","selHdgLine","selHdgLine2","curHdgPtr2", - "staArrowL","staArrowR","staToL","staFromL","staToR","staFromR"] ) + "staToL","staFromL","staToR","staFromR"] ) me.symbols[element] = me.nd.getElementById(element).updateCenter(); + var easeArrow = { + new: func(elem) { + var m = {parents: [easeArrow]}; + m.req_rot_rad = 0; + m.req_rot_deg = 0; + m.last_rot_deg = 0; + m.element = elem; + #m.timer = maketimer(0.1,m,easeArrow.update); + m.time = 999; + m.duration = 0; + m.startval = 0; + m.diffval = 0; + return m; + }, + setVisible: func(v) { + #if (v == 0) me.timer.stop(); + me.element.setVisible(v); + }, + hide: func { + #me.timer.stop(); + me.element.hide(); + me.req_rot_rad = 0; + me.last_rot_deg = 0; + }, + setRotation: func(rad) { + #me.timer.stop(); + var deg = 0; + var gap = math.abs(rad - me.req_rot_rad); + if (gap>0.001) { + me.req_rot_rad = rad; + deg = math.round(rad * 57.29578 * 100)/100; + me.req_rot_deg = deg; + me.startval = me.last_rot_deg; + #if (deg < me.last_rot_deg) deg += 360; + me.diffval = deg - me.last_rot_deg; + me.time = 0; + me.duration = math.round(gap * 36 / 3); + if (me.duration < 2) { + me.element.setRotation(deg * D2R); + me.duration = 0; + } + } + + if (me.duration > 0) { + var tx = me.time / me.duration; + #thanks to https://easings.net/#easeOutCubic + deg = (1 - math.pow(1 - tx, 3)) * me.diffval + me.startval; + deg = math.mod(deg,360); + me.time += 1; + #print("DEG: " ~ deg); + me.last_rot_deg = deg; + me.element.setRotation(deg * D2R); + if (tx>=1) me.duration = 0; + } + + }, + update: func() { + var deg = me.last_rot_deg; + if (me.last_rot_deg > deg) deg += 360; + deg = math.mod( math.round( ((me.last_rot_deg*100) + ( deg - me.last_rot_deg )) ) / 100 , 360 ); + print("update:" ~ deg); + me.last_rot_deg = deg; + me.element.setRotation(deg * D2R); + if (deg == me.req_rot_deg) me.timer.stop(); + } + }; + + foreach(var element; ["staArrowL2","staArrowR2","staArrowL","staArrowR"] ) + me.symbols[element] = easeArrow.new( me.nd.getElementById(element).updateCenter() ); + me.map = me.nd.createChild("map","map") .set("clip", "rect(124, 1024, 1024, 0)") .set("screen-range", 700) From b2eeb04ada0886291e5895ac0b870deeeaa78f59 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Fri, 19 Feb 2021 23:47:54 +0100 Subject: [PATCH 089/124] better yellow lite --- .../ND/canvas/res/terrainv2/tile_yl.png | Bin 1473 -> 1291 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png index b22f7d0fe0c9ecff80d1e6808d99b943e01196c3..b42fbe9207038b996407da4f567fe709ae966052 100644 GIT binary patch delta 1168 zcmV;B1aJGn3yTVnXbQgo01m$aI0aKAk#Z(~1YJo)K~zXfjh4G>Raq3qx7~2_e!om6 zCgd>@0y9AqbE6X_%!M@5&YvJSO2i-*BBB;HHX>pvb|Q)hR(2K^c7lQ;f`WpISg4hP zYkuc^+m(HHu3^67u=d*P@vXJ?+2@4b-rl!we>Gcp@}#+|tE-Zrxw*Nmtt~Dpm6n!& zmMHy@*#)T{G&MD4nvktG0}|uoEb& z8#VjOtakf$a2uXN$Yvm-1_zWqT0m?6Uq7e58Efugfy_tvcty1Tp6>M|&Qw*$+^ zkDES!p5d96E89Ie2t|<+Eq)B>4Do;^fJgBkKkNv6wkRS`AN6#*!_TMUJ#O)@YZPm#ib>sYyJhKDC z!^4D&ixPNZwz*dMdRC{4kbehJ;V%mS1Ia06klKLx`T2!~1#Ykh55lKUztN(&QKD|< zH*N&IcWF)880Y5ZzJC4PY|rB2qBH>Ck&zL;gPesoZ??NHLh*jE%>cPg8BSW0%jrDG zee4+1u5$0beA(xG3H0=TX`9*KW(RyLz&;LZ)5`>t8t40E#5AWaaFx$<4B_CDgR6V!ag{Iso zfS!JEcH{a-W$**V?+^`f2mJ5eWk`qlOz~SLCBTeRW(fF4W6sLA+X{nq+?ZXEW zjpHnTelqbS^u)x(@$jiU%%I{hs=(1J*0u~$CDquxGsr%P)9mp ib^&H6sVN?_O65Ov5NDdUW%Q5$0000Vcpa7j=(-|q{7BC{Thys@I*sIDH~J=C2@!aqTbkn*YIdK^941iJWz6(r)8q7ad#U7TtL`;QhdP(bWB zw=l*-r%ruPs1b?i5drDctg>8x+Cs#;h_ugzU156Z(q|O7d-wZo+mc6K02uCuT%0)` z8%Jccm{USbQw=O@fMAYy-MVn#K(39m__fW{MhmG^Q|Lo>KDlXSc(Hui>T3dFf*!f_ z6h;mGNF6{K*dSrd-lC!rr%;dC4HVD*{o&=ypHH7|7q5TLoD9b4a&xYKVU(qCkBy~3 zEmVjogYYiI_*aboJb3Wq!i9N>M0w~)$7T^`F;?PSwO>3aqEo@JyM6n@ix>URpZ~OL zSFT}aj2wXbj7`%N&IpODj|b7o+vlU{R0_t)lM~pjP;oMvh!XX4*4H|f z=Fd-b3R9F!V0J1}!y5U207lPTCr0K)_N$0upsa~$X&Q`<7@jS3nP6# z2y=kErW}sEmc-WJ`wqd6Pu1p|@{;e_g*m7nUS#_2_rx z-!c9R$l_&BVHE8mmM>3N06M<%;Cl7y7oHRF2q}B_hHKZp+_*6zNwffCqGHt~^!8T! zL%>YzGSx=yfZH-WoKnWXL?RkC7ueR3kw$jR0-_oDNOpAO9|jUBbt0!oX_+iWrVwIy zU$QVS>f5CaBKPute+(+AV-Z93Ey2hEo*Kji_Tl#J@18vA<&kHqpKm>DW4m1(Oo`%W zKe)SiRFU+DrawN(Bv^p_lPB9^9Oi3^pJjyw7`MnwoQ~x@`ulmo4#jwo+Yi#Hik&T? z%ux~^Ki)(RPaZ4+$h3U`R4PR5JNC|<)S#_lej(@w!-z0{%@Z3`usP~Id&1CA3ZWc6 z3uU=5TD9yrN^LIj_U)mkC)vdhq2N4+g53mn;zTR4(lUa<=ZI$tjQRLc+d?6t{FW`% z>uFXo(n)rAdj?zY-051pI3>%)k4!S5Ub-|aTb2^cu>-_5;bMLCfsJxI03dddko@$! ze*LQ$M|d7HBr--m<@uo}3nPUKDT-io7{x;r1%{I~(QXPgg#Q3MApjBrrMGVY0000< KMNUMnLSTYUH;mW- From 94f95045d73739effc88c720437f7212c265b58e Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 21 Feb 2021 16:57:25 +0100 Subject: [PATCH 090/124] Some fixes for VOR arrows easing --- .../ND/canvas/framework/navdisplay.nas | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 7165ed0d..4213948b 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -86,65 +86,72 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update var m = {parents: [easeArrow]}; m.req_rot_rad = 0; m.req_rot_deg = 0; - m.last_rot_deg = 0; + m.last_rot_deg = nil; + m.last_rot_rad = 0; m.element = elem; - #m.timer = maketimer(0.1,m,easeArrow.update); - m.time = 999; + m.time = 0; m.duration = 0; m.startval = 0; m.diffval = 0; return m; }, setVisible: func(v) { - #if (v == 0) me.timer.stop(); + if (v == 1 and me.last_rot_deg == nil) me.reset(); me.element.setVisible(v); }, hide: func { - #me.timer.stop(); me.element.hide(); - me.req_rot_rad = 0; - me.last_rot_deg = 0; + }, + reset: func { + me.last_rot_deg = 360 - getprop("orientation/heading-deg"); + me.last_rot_rad = me.last_rot_deg * D2R; + me.duration = 0; + print("VOR reset"); }, setRotation: func(rad) { - #me.timer.stop(); var deg = 0; - var gap = math.abs(rad - me.req_rot_rad); + var gap = 0; + #if (me.last_rot_deg == nil) { + # me.reset(); + # gap = 0.3; + #} else { + gap = math.abs(rad - me.req_rot_rad); + #} if (gap>0.001) { + #else if (gap>0.1 and me.duration == 0) me.reset(); # detect VOR freq changed + if (me.duration>0) gap = math.abs(rad - me.last_rot_rad); + if (gap>=180*D2R) gap = 360*D2R - gap; + deg = rad * 57.29578; me.req_rot_rad = rad; - deg = math.round(rad * 57.29578 * 100)/100; - me.req_rot_deg = deg; - me.startval = me.last_rot_deg; - #if (deg < me.last_rot_deg) deg += 360; - me.diffval = deg - me.last_rot_deg; - me.time = 0; - me.duration = math.round(gap * 36 / 3); + me.req_rot_deg = deg; + me.duration = 0; + if (gap>0.2) { + me.startval = me.last_rot_deg; + me.diffval = deg - me.last_rot_deg; + if (me.diffval<0) me.diffval += 360; + me.time = 0; + me.duration = math.round(me.diffval * 0.21); # rad 36/3 + } if (me.duration < 2) { - me.element.setRotation(deg * D2R); + me.last_rot_rad = rad; + me.last_rot_deg = deg; + me.element.setRotation(rad); me.duration = 0; } } - if (me.duration > 0) { var tx = me.time / me.duration; #thanks to https://easings.net/#easeOutCubic deg = (1 - math.pow(1 - tx, 3)) * me.diffval + me.startval; - deg = math.mod(deg,360); - me.time += 1; + deg = math.mod(deg,360); #print("DEG: " ~ deg); me.last_rot_deg = deg; - me.element.setRotation(deg * D2R); + me.last_rot_rad = deg * D2R; + me.element.setRotation(me.last_rot_rad); + me.time += 1; if (tx>=1) me.duration = 0; } - }, - update: func() { - var deg = me.last_rot_deg; - if (me.last_rot_deg > deg) deg += 360; - deg = math.mod( math.round( ((me.last_rot_deg*100) + ( deg - me.last_rot_deg )) ) / 100 , 360 ); - print("update:" ~ deg); - me.last_rot_deg = deg; - me.element.setRotation(deg * D2R); - if (deg == me.req_rot_deg) me.timer.stop(); } }; From d389fa82a1fa999037964eb04687332b73778214 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 21 Feb 2021 16:59:17 +0100 Subject: [PATCH 091/124] Better climb and hi ref altitude green levels computation --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 146 ++++++++++++------ Models/Instruments/ND/canvas/style.nas | 10 +- 2 files changed, 100 insertions(+), 56 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 81cc6a54..bc500d2e 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -13,10 +13,10 @@ var terrain_maxalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain var terrain_alert = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/alert", 0,"INT"); 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-8 hi alt + nil,"tile_gl.png","tile_gh.png","tile_al.png","tile_ah.png","tile_rh.png", # 0-5 low alt - imho real ND displas likely amber than yellow + "tile_gl.png","tile_gh.png","tile_gh.png","tile_gs.png", # 6-9 hi alt "tile_ml.png","tile_cl.png", # 10 magenta - 11 cyan (water) - "tile_ys.png","tile_rs.png" # 12-13 alert + "tile_as.png","tile_rs.png" # 12-13 alert ]; var is_terrain = 0; @@ -92,10 +92,10 @@ var updateTerrain = func { var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black - if (elev != nil) { - if (elevme.max_altitude) me.max_altitude = elev; - if (me.is_terrain) { + if (elev != nil) { + if (elev>me.max_altitude) me.max_altitude = elev; + if (me.is_terrain) { + if (elev=lowaltft) grad = 3; # lite yellow else { if (me.bands_range > 0 and elev > me.bands_minalt) { - grad = int((elev-me.bands_minalt) / me.bands_range) + 6; - if (grad>8) grad = 8; # solid green + grad = 9 - int((me.bands_maxalt - elev) / me.bands_range); + if (grad>9) grad = 9; # solid green + else if (grad<6) grad = 6; #light green } } } } } } else { - grad = 11; #water + grad = 11; #water/cyan } append(elevft,grad); # 0-5 } else { @@ -134,6 +135,8 @@ var updateTerrain = func { } + if (me.min_altitude > me.max_altitude) me.min_altitude = me.max_altitude; # occurs on sea areas + for (var r=0; r < len; r+=1) { var imgx = elevft[r]; if (imgx == -1) continue; @@ -154,14 +157,29 @@ var update_altitudes = func { me.terrain_minalt.setValue(me.min_altitude); me.terrain_maxalt.setValue(me.max_altitude); + if (me.avg_minalt == 9999) { + me.avg_minalt = me.min_altitude; + me.avg_maxalt = me.max_altitude; + } else { + #if (me.min_altitude < me.avg_minalt) me.avg_minalt = me.min_altitude;else + me.avg_minalt = math.round((me.avg_minalt * 2 + me.min_altitude) / 3); + #if (me.max_altitude > me.avg_maxalt) me.avg_maxalt = me.max_altitude;else + me.avg_maxalt = math.round((me.avg_maxalt * 2 + me.max_altitude) / 3); + } + if (me.onground == 0 and (me.max_altitude + 250) < me.refaltitudeft) { # 250 ft tollerance me.hialtmode = 1; - me.bands_range = math.min(2000,(me.max_altitude - math.max(me.min_altitude,me.basealtitudeft))) / 5; - var maxrange = math.min(2000,me.max_altitude - (me.bands_range * 3)); - me.bands_minalt = int(me.max_altitude - maxrange); - me.bands_maxalt = me.max_altitude; + var range = math.min(2000,(me.avg_maxalt - me.avg_minalt)); + if (range < 400) { + me.bands_range = 0; + } else { + me.bands_range = 500; + me.bands_maxalt = me.avg_maxalt; + me.bands_minalt = math.max( me.avg_maxalt - range , me.avg_minalt + 400 ); + } } else { me.hialtmode = 0; + #me.avg_minalt = 9999; } me.min_altitude = 9999; @@ -191,6 +209,8 @@ var init = func { me.visible = 0; me.min_altitude = 9999; me.max_altitude = -9999; + me.avg_minalt = 9999; + me.avg_maxalt = -9999; me.bands_minalt = 0; me.bands_maxalt = 0; me.bands_range = 0; @@ -268,55 +288,80 @@ var draw = func { if(me.fetching) return; + if (pts.Sim.pause.getBoolValue()) return; + if (me.onfailure == 1) { me.clear(); me.restart_beacon(); return; } + if (me.layer.display_changed == 1) { + me.layer.display_changed = 0; + me.clear(); + me.reference = nil; + } + if (me.reference == nil) { # update aircraft reference var ref = geo.aircraft_position(); me.reference = ref; if (ref != nil) { + me.refheading = getprop("orientation/heading-magnetic-deg"); - var refalt = ref.alt() * 3.2808399; + var refalt = int(ref.alt() * 3.2808399); me.refaltitudeft = refalt; me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; me.onground = getprop("/gear/gear[0]/wow"); if (me.min_altitude != 9999) me.update_altitudes(); - if (me.basealtitudeft == nil and fmgc.FMGCInternal.phase<2) { - me.basealtitudeft = refalt + 400; - me.checkarrival = 1; - } - - if (fmgc.FMGCInternal.phase == 2) { - me.basealtitudeft = math.min(me.basealtitudeft,400+me.terrain_minalt.getValue()); - } - - if (fmgc.FMGCInternal.phase == 5 and me.checkarrival == 1) { - me.checkarrival = 0; - me.basealtitudeft = nil; - if (fmgc.FMGCInternal.arrApt != nil) { - var airport = airportinfo(fmgc.FMGCInternal.arrApt); - if (airport != nil) me.basealtitudeft = 400 + (airport.elevation * M2FT); + if (fmgc.FMGCInternal.phase < 2) { + if (me.basealtitudeft == nil) { # starting at phase < 2 + me.basealtitudeft = refalt + 400; + me.checkarrival = 1; + print("set REFALT [pref]: "~me.basealtitudeft); } - if (me.basealtitudeft == nil) { - me.basealtitudeft = 400 + me.terrain_minalt.getValue(); # that's fun + } else if (fmgc.FMGCInternal.phase == 5) { + if (me.checkarrival == 1) { + me.checkarrival = 0; + me.basealtitudeft = nil; + if (fmgc.FMGCInternal.arrApt != nil) { + var airport = airportinfo(fmgc.FMGCInternal.arrApt); + if (airport != nil) me.basealtitudeft = 400 + int(airport.elevation * M2FT); + print("set REFALT [arrApt]: "~me.basealtitudeft); + } + if (me.basealtitudeft == nil) { + me.basealtitudeft = 400 + me.avg_minalt; # that's fun + } + } + } else if (fmgc.FMGCInternal.phase == 6) { + if (me.checkarrival == 0) { + me.checkarrival == 1; + #me.basealtitudeft = 0; + } + } else if (fmgc.FMGCInternal.phase == 7) { + if (me.checkarrival == 0) { + me.checkarrival == 1; + me.basealtitudeft = refalt + 400; + print("set REFALT [done]: "~me.basealtitudeft); + } + } else { + #if (fmgc.FMGCInternal.phase != 2 or refalt > me.basealtitudeft) { + # me.basealtitudeft = math.avg(me.basealtitudeft,me.basealtitudeft,400 + me.terrain_minalt.getValue()); + #} + + if (me.basealtitudeft > me.avg_maxalt) { + if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number + else me.basealtitudeft = int(400 + me.avg_minalt); + print("set REFALT [blwmin]: "~me.basealtitudeft); + } + else if (me.basealtitudeft == 0 and me.avg_maxalt >= 1000) { # 1000ft min elev number + me.basealtitudeft = int(400 + me.avg_minalt); + print("set REFALT [abvmin]: "~me.basealtitudeft); } - } - if (fmgc.FMGCInternal.phase == 6 and me.checkarrival == 0) { - me.checkarrival == 1; - #me.basealtitudeft = 0; - } - - if (fmgc.FMGCInternal.phase == 7 and me.checkarrival == 0) { - me.checkarrival == 1; - me.basealtitudeft = refalt + 400; } } @@ -327,8 +372,7 @@ var draw = func { var update_size = (range != me.range); me.range = range; - if (me.layer.display_changed == 1 or update_size) { - me.layer.display_changed = 0; + if (update_size) { me.request_clear = 1; } @@ -339,14 +383,14 @@ var draw = func { }; -setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red - me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning") == 1 ) ? 2 : 0 ); - print("Terrain alert:" ~ getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning")); - print(me.terrain_alert.getValue()); +setlistener("instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red + me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); + print("Terrain warning:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning")); + print( me.terrain_alert.getValue() ); }); -setlistener("/instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow - me.terrain_alert.setValue( (getprop("/instrumentation/mk-viii/outputs/discretes/gpws-alert") == 1 ) ? 1 : 0 ); - print("Terrain alert:" ~ getprop("/instrumentation/mk-viii/outputs/discretes/gpws-warning")); - print(me.terrain_alert.getValue()); +setlistener("instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow + me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); + print("Terrain alert:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert")); + print( me.terrain_alert.getValue() ); }); \ No newline at end of file diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 92bc94f2..b48e0f68 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -94,7 +94,7 @@ canvas.NDStyles["Airbus"] = { predicate: func(nd, layer) { #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); var visible = nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and + nd.get_switch("toggle_display_mode") == "MAP" and (nd.rangeNm() <= 40) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); if (visible) { layer.update(); @@ -1988,14 +1988,14 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) ( nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and !nd.get_switch("toggle_centered") and + nd.get_switch("toggle_display_mode") == "MAP" and (nd.rangeNm() <= 40) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)) ), is_true: func(nd){ if (terrain_maxalt.getValue() != -9999) { - nd.symbols.terrLO.setText(sprintf("%03d",int(terrain_minalt.getValue()/100))); - nd.symbols.terrHI.setText(sprintf("%03d",int(terrain_maxalt.getValue()/100))); + nd.symbols.terrLO.setText(sprintf("%03d",math.round(terrain_minalt.getValue()/100))); + nd.symbols.terrHI.setText(sprintf("%03d",math.round(terrain_maxalt.getValue()/100))); nd.symbols.terrGroup.show(); - terrain_maxalt.setValue(-9999); #update visual once at radar cycle + terrain_maxalt.setValue(-9999); #update visual at radar cycle } }, is_false: func(nd){ From 86bac0ab798633443602bc4a8ccebbea09380f72 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 21 Feb 2021 17:00:14 +0100 Subject: [PATCH 092/124] Optimize encoding for tiles and fix some greenish colors --- .../ND/canvas/res/terrainv2/tile_ah.png | Bin 6214 -> 3268 bytes .../ND/canvas/res/terrainv2/tile_al.png | Bin 5905 -> 2863 bytes .../ND/canvas/res/terrainv2/tile_as.png | Bin 0 -> 226 bytes .../ND/canvas/res/terrainv2/tile_ch.png | Bin 6247 -> 3184 bytes .../ND/canvas/res/terrainv2/tile_gh.png | Bin 6261 -> 3243 bytes .../ND/canvas/res/terrainv2/tile_gs.png | Bin 182 -> 182 bytes .../ND/canvas/res/terrainv2/tile_mh.png | Bin 6293 -> 3291 bytes .../ND/canvas/res/terrainv2/tile_rh.png | Bin 6061 -> 2870 bytes .../ND/canvas/res/terrainv2/tile_rs.png | Bin 182 -> 182 bytes .../ND/canvas/res/terrainv2/tile_yh.png | Bin 6275 -> 3293 bytes .../ND/canvas/res/terrainv2/tile_ys.png | Bin 181 -> 181 bytes 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Models/Instruments/ND/canvas/res/terrainv2/tile_as.png diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png index dacbc9c99df4040ff9d5c3e1ccfae425c904ea1d..21b7f1da360a6cd689aed1f121929c32aa33c4a6 100644 GIT binary patch delta 3216 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 IM6N<$f~d4Hy8r+H diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png index a73451d38769f0327bc91ae852bcf92ee09b438d..4d2f16d40defe46840d521d9b16e2f7534880c64 100644 GIT binary patch delta 2808 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 KMNUMnLSTabh(}TY delta 5874 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 IM6N<$f?^qeM*si- diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_as.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_as.png new file mode 100644 index 0000000000000000000000000000000000000000..ccfa1f20659cca47282ff283c2ef25281448e061 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^iXhCv1SD^?g<1e9mUKs7M+SzCeKo%WCjRH(Sd=XwvvJ2Wj6zZ%~J*j$uq?^t>r+qoCO|{#S9F5`$3q|f;CtL zC@4|l8c`CQpH@sB%CuM1??9WLF$cl{xd^ZW6QV#aTec!XBxTr30XXYh3O Kb6Mw<&;$SyQ9=j+ literal 0 HcmV?d00001 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ch.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ch.png index bfea80c72e3067db164ee006dd8ced2dce392067..99d6bc279509491d3f4c4c8652c04cb5fbd0b4d4 100644 GIT binary patch delta 3132 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 W?7?^We3-@n00004Tx07%ERR%cXG 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 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_mh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_mh.png index d06517213054d7936729d4520db669e461da85c5..0e35106619e0d5c500c215fb7b2fdd4f5dff41db 100644 GIT binary patch delta 3240 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 RaSi|g002ovPDHLkV1m37S@Hk? delta 6031 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 diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_yh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_yh.png index dc54323337d72f8496d1b87273da29873bed29fc..bb536295b0df569dff744b3fad1004deb8e22cb5 100644 GIT binary patch delta 3242 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 R09gP4002ovPDHLkV1gGpE#m+H diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ys.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ys.png index f1604ba30d8379eb31888742e00ba0948861a65e..544c985d479b3532aa238ee24a352b2982d3f9cb 100644 GIT binary patch delta 20 ccmdnWxRr5&4c7q%2EGG~S=Tx_C%WYW07jz*>Hq)$ delta 20 ccmdnWxRr5&4c9>i2EK!gJ0@noo#>Vi07^Fpy8r+H From fd76d82714af5b69d0dee6795b94c63b98e9a329 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 21 Feb 2021 23:01:20 +0100 Subject: [PATCH 093/124] display range fix --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index bc500d2e..ec076f96 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -1,5 +1,8 @@ # See: http://wiki.flightgear.org/MapStructure # Class things: + +## inspired from work on 787-family - thanks a lots + var name = 'TERRAIN'; var parents = [DotSym]; var __self__ = caller(0)[0]; @@ -13,7 +16,7 @@ var terrain_maxalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain var terrain_alert = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/alert", 0,"INT"); var tile_list = [ - nil,"tile_gl.png","tile_gh.png","tile_al.png","tile_ah.png","tile_rh.png", # 0-5 low alt - imho real ND displas likely amber than yellow + nil,"tile_gl.png","tile_gh.png","tile_al.png","tile_ah.png","tile_rh.png", # 0-5 low alt - imho real ND displays likely in amber color than yellow one "tile_gl.png","tile_gh.png","tile_gh.png","tile_gs.png", # 6-9 hi alt "tile_ml.png","tile_cl.png", # 10 magenta - 11 cyan (water) "tile_as.png","tile_rs.png" # 12-13 alert @@ -73,8 +76,16 @@ var updateTerrain = func { var tiles = me.tile_list; - var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 40); - var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 40); + #var proj_lon = pos_lon + ((col * (range/30) * math.sin(DEG2RAD * (heading - 90))) / 40); + #var proj_lat = pos_lat + ((col * (range/30) * math.cos(DEG2RAD * (heading - 90))) / 40); + + # if me.tileradiusw == 20 + var range_20f = range / 18.75; + var heading_sin = math.sin(DEG2RAD * heading); + var heading_cos = math.cos(DEG2RAD * heading); + + var proj_lon = pos_lon + ((col * range_20f * math.sin(DEG2RAD * (heading - 90))) / 60); + var proj_lat = pos_lat + ((col * range_20f * math.cos(DEG2RAD * (heading - 90))) / 60); var elevft = []; @@ -87,8 +98,8 @@ var updateTerrain = func { continue; } - var point_lon = proj_lon + ((row * (range/30) / 40) * math.sin(DEG2RAD * heading)); - var point_lat = proj_lat + ((row * (range/30) / 40) * math.cos(DEG2RAD * heading)); + var point_lon = proj_lon + ((row * range_20f / 60) * heading_sin); + var point_lat = proj_lat + ((row * range_20f / 60) * heading_cos); var elev = me.get_elevation(point_lat, point_lon); var grad = 0; #black @@ -195,9 +206,8 @@ var restart_beacon = func { var init = func { #print('TERRAIN init'); - me.tile = 33; # preferred 34 + me.tile = 33; me.fetching = 0; - me.timeStamp = nil; me.fetchRad = me.model.fetchRad; # Radius of radar layer to fetch me.range = me.model.rangeNm; # Range of Navigation Display me.viewport_radius = me.getOption('viewport_radius', 670); @@ -205,8 +215,7 @@ var init = func { me.radar_beacon = 0; me.radar_cycle = 0; me.radar_cleared = 1; - me.request_clear = 0; - me.visible = 0; + me.request_clear = 0; me.min_altitude = 9999; me.max_altitude = -9999; me.avg_minalt = 9999; @@ -226,7 +235,7 @@ var init = func { var gx = int(me.viewport_radius / tile); me.tileradius = gx; - var limx = int((512/tile)+0.5); # horiz space is smaller + var limx = int((512/tile)+0.5); # display width is smaller than height me.tileradiusw = limx; me.terrlayer = {}; @@ -338,20 +347,16 @@ var draw = func { } } else if (fmgc.FMGCInternal.phase == 6) { if (me.checkarrival == 0) { - me.checkarrival == 1; + me.checkarrival = 1; #me.basealtitudeft = 0; } } else if (fmgc.FMGCInternal.phase == 7) { if (me.checkarrival == 0) { - me.checkarrival == 1; + me.checkarrival = 1; me.basealtitudeft = refalt + 400; print("set REFALT [done]: "~me.basealtitudeft); } - } else { - #if (fmgc.FMGCInternal.phase != 2 or refalt > me.basealtitudeft) { - # me.basealtitudeft = math.avg(me.basealtitudeft,me.basealtitudeft,400 + me.terrain_minalt.getValue()); - #} - + } else { if (me.basealtitudeft > me.avg_maxalt) { if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number else me.basealtitudeft = int(400 + me.avg_minalt); @@ -361,7 +366,6 @@ var draw = func { me.basealtitudeft = int(400 + me.avg_minalt); print("set REFALT [abvmin]: "~me.basealtitudeft); } - } } @@ -383,14 +387,15 @@ var draw = func { }; -setlistener("instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red - me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); - print("Terrain warning:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning")); - print( me.terrain_alert.getValue() ); -}); +## TODO - it doesnt work. listeners seem not to have trigged +#setlistener("instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red +# me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); +# print("Terrain warning:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning")); +# print( me.terrain_alert.getValue() ); +#}); -setlistener("instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow - me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); - print("Terrain alert:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert")); - print( me.terrain_alert.getValue() ); -}); \ No newline at end of file +#setlistener("instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow +# me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); +# print("Terrain alert:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert")); +# print( me.terrain_alert.getValue() ); +#}); \ No newline at end of file From 50efa9560fa01e8d341a845ee2cb75624e1113f4 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 22 Feb 2021 21:18:22 +0100 Subject: [PATCH 094/124] update on green bands calc, altitude expeted at 30s on negative vertical speed --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index ec076f96..601e692c 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -183,8 +183,8 @@ var update_altitudes = func { var range = math.min(2000,(me.avg_maxalt - me.avg_minalt)); if (range < 400) { me.bands_range = 0; - } else { - me.bands_range = 500; + } else { + me.bands_range = math.max(200,math.round(range / 4)); me.bands_maxalt = me.avg_maxalt; me.bands_minalt = math.max( me.avg_maxalt - range , me.avg_minalt + 400 ); } @@ -323,6 +323,8 @@ var draw = func { me.refaltitudeft = refalt; me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; me.onground = getprop("/gear/gear[0]/wow"); + var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); + if (vspeed30s<-500) me.refaltitudeft += vspeed30s; if (me.min_altitude != 9999) me.update_altitudes(); From 7774678ac0d7769b9b91849a9c6ab0f9d673e632 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 22 Feb 2021 21:18:35 +0100 Subject: [PATCH 095/124] color tiles update --- .../ND/canvas/res/terrainv2/tile_ah.png | Bin 3268 -> 2272 bytes .../ND/canvas/res/terrainv2/tile_al.png | Bin 2863 -> 1686 bytes .../ND/canvas/res/terrainv2/tile_ch.png | Bin 3184 -> 2730 bytes .../ND/canvas/res/terrainv2/tile_cl.png | Bin 1786 -> 1479 bytes .../ND/canvas/res/terrainv2/tile_gh.png | Bin 3243 -> 2869 bytes .../ND/canvas/res/terrainv2/tile_gl.png | Bin 1770 -> 1590 bytes .../ND/canvas/res/terrainv2/tile_ml.png | Bin 1563 -> 1355 bytes .../ND/canvas/res/terrainv2/tile_rl.png | Bin 1732 -> 1479 bytes .../ND/canvas/res/terrainv2/tile_yl.png | Bin 1291 -> 1296 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ah.png index 21b7f1da360a6cd689aed1f121929c32aa33c4a6..5151f582ba5250338f9576f65432b00289f0b0d6 100644 GIT binary patch delta 2157 zcmV-z2$J{28Q>9+XbQgo01m$aI0aKAk#Z(~2r@}TK~zXfO_pg>Th|%Kk2`gO!I*t9 z2E-0Fi`mSM5JEx{Vi5==kl4f~RzYeAco4>}?O?Z1h)GOs$4e6%$2K##vE$%6)3ljs z;(mj^>Wj{FrXQof%ejW!IdkXS^X&iUf6lq$KZ{w6#fF%al$4~Tq@0|bkDUdZiw>iI z(Rk*}nG4#ZNUzq4;X2V?D{hXSk@}3%($ciFw6L(SkdTm5r%uJk$7f|_<>uxNn#EgN zAPSewq4;E7jq$JT$)cj73+71X|J(K7aOWi^CUzMjq;%bJ^6dWOYmWHGV2WHEH;C-) z?EL)v>gsAHv9Ynd2Q6WH3x!gltgI}5Jw2T;qO!8`58jHArbJh%*y~P`;)x1@tfHdg zuM;_P#nTi{vggj7+cF-LD?g4UwKs@Yn~lu>G*(nlP(ZNz{i#y=om-QarzA>o;^h8A zz_qaoDgL=XX{}PsRR$Cn7w-(^vEuL4pbCdfMEh+j3=BM$l$1PwnJki@ zPsdA8&dA8127x1RPfkwucIJQonfuN8qBm{fQtzfd2EPdj3A}-xH*k&C9{PQJA@}iB z9h2p@Y^g?*mIm?{`-;1pQZq9%K@Y?Pp;A**K?Wt}EbX)$mo8p-E2E;KqNAe;;B1Jv z)StK9nO;>@wc=7B{kTT7*9oG3l0GRC06gTI2NO!C$18>p6s!)!6hv8zdNtF9_H<&9 z%TjNqTw&nx^y$-J8yOji6hnAVT7l90@jN&mL*a)a&)Y;&3K!E-AQwF<$<@1?jLM zU}y3yp8`JI=uDHcRh?SFmi7p~UV4z=4atYO3^Kuk;wO(Ln^PFF8GGT34;m^Usi+ry-? zzayP&h_U7?lPmYq?M<*TYG!#zW4GRE2;^TwEOXOv1y%L7#j9 z8eR-FeQ=C~Mx7z{d{j?KiWq3-jaEFWI45uGM6U^zd-`vVWslaM zcs^2myYnpeSc31)%?>HO(HIC~nBa~orE5G=C8vwu5`xZ~uLfZgrK=u6oCf^P6vh0l zBi>~ctlXO`mD10BdWyh!$(8V~FHtVKs{~vpu&=)yl!!qv2PJ=6LF2 z%XAn2daqFd67c+ zKjj$RW-)G$6qpTE9(8HON^6W1aD0*!-6koylj$2!7#taY^V4NZMm6^vMzQsN?y45( z&^97rOBi@XPEh<)Z|72ALIOaqB}|OfsHMD`E@oT0x-#S^W1~*o zZ%~*n#}&Q!v?X#{_bU*%Qm>rBM|@`d!Ok~wqT$2Fj#xN@ad0iw*|jyRxkPUzFOHfw^Q9} zU;0gd%4vgNum(Hg11NB_aaiZgwov{PEJ4!X+ok|dvl`>yU6Gy!@%$t8BHDJIf+;A| zXDIvG)q1(U;7AjWnlP{fL5=|;kvnkXnvM~J`R+xd)Mm6ch!&Ih+NW-@7hS>rHZ|lY ztr6%`0St!L&+oY8`h}4afq)8N0=!1Hz0rezU~k3Nvwy}o^v7N=*GTOzJQ~4(J3VW6SV{&NVePyQ}Te=2~wipy70)UiETo zwjAOCMY}C|t55y!dg=<0ldYBjup(oSM+aLbTCLV(GAZ{tuuvdnTHE4wKX*%;C8q{| zo9R07WHg!2b=z@}#28Id!xyN!TE%?pAq9NaAl5liYHMp@3KNUPa(mOQXk69@LqY7J zuicRVVt9wwo4$er`-PS$aDbQWYj!EUYYn9N0EH!gkjfoES=09DM?*@L49cQ(Ip5oGA_W)<;#2(7 zttwq=3GCE~Dcy1EkijT!zBN`#$)No$6A5b{UsO^U)#Ejge&W zH;Z!jJ?jdZvL7PLZvdc^HIW9);^$s9(zWhX)~Q3mpYR;H z)Is%qW}*7MXA?6WhcO_S>=40P>%^Kt6%A>Ru!yC@5XfKsob~wjMdLSj$00P#gbwH< jNi&Xd@G^HmdO00000NkvXXu0mjf@#Z$1 delta 3161 zcmV-f45sto5yTmgXbQjp01m(bYSxJfk#Z(~3>Ha5K~zXfEmnC@)K|7XG<4J5(6m6a zC^Wq<^uF)=&fd^XH_##?pa=*UMNruh(EtLX;u6Id6(@;RW+s`8nd~uRjF~t(lVoDt zMaBh0eUs$n{qgF(+cU4~)~#RtZk>D2`Of!!_rjxn{vW#SJBu=Mxxi(ES%leEDWC3t z33&@xYH`eV2lnGv#Jk+k;Dn$Z_BRW@>oYG5yRP&*inYKMV6a($&4d*kVlp>@BO|I6 zQ0IdWLd1n0^+4eYv}X#32%ojfAC4FPFxO(&!uA5nM|;a2pYPtgM#5%7r7QKDA;;28 z=|t5^oeI!sElvGXBl90^yz8yJCKsrGWT4c>yY1<6DL$PB0%d$%Ve*A;#V`9Df7>c4 z(E>*VnIaMdbqV{L4C_mBsGYW*qn9B}Gl zX7ULSJ7vqebf34qd`esZaNZwKR(qayUSLQxbue z4LR8$=EHc4Vd-EHEq}S5K5l~!E8eAnbB&U3CQ7>_G^yxcNNQro%Tn(So1gD7e%_eg z9fa@Sj4T`tUL5pTWZ=*f&bBKbOqb421>R`YSXBhJB-ZRq0-2G zcPihnNO?YNn;-P;_hj(cz@$ficNg-bvsML-cKBjI|8&aroMXw$G<3`^trE zIwZY`z_1!x{4%rpzX z8?wCD$Ou`Y@nl*IUq%{#spnrEb<7Vtrkx2|3DCHJXsS0+HkJ$57xN07T%iyj3Nxnr zZPzA!OJ{4|87(Q$K!Xc^u3h?IvjmJ9*c)Nr9d!Stfi>oauXo6wjaX-#F-jRA`ex)N zaAl-&ANdbs1$U3Gxwxmap<1qXq^XU#u~+o>_7%N2R`dHqjYtQ7W_`>|hw|1=)%_mT zpAT1+=%LJjeY4lQcz89`o8ZF6+~~m$@jO5?`>CiS8z}^CIfDKv+nP^@}3^7Jh8(j7JyC+^(D-) z8X0_0LtP%W{5o5I{$3Nkst~UBY5u!c`>4~n-bCgxfkus^F$vjRLOLaiKFU|81Vokk zBHX1TMNg)E-wwOHs@R;|m~0l9Oc{-SQH5=#FF(tam#s3b6e^RcOn}8LvP&iLdt6ZA zg>_!|Y=`Pam-^9mLvJxv#s|b*L<%OCn9jy?6p0&Z6|Zf7(On$R>#HDj6vmu;MZQJ{ zDCG=xY_>2tg@(m9e6cc01|Z{_^Ex!N;SHz5b{*p%6Jgj?Rgt&|)*#>80w6{l#ZocY2xY?l) zgI)tY)zr%kIWGs*f7xY;m_Q>2uQ{W2o!(}otYYC;@)DSGYnfcbGT$Qjv=YWZ+c6>59~a9{J;8-Fp%8>wes`6XiEX zO|>q6P%DT@%((Piyi6W9u|e`+uHpJ@#cCfkg(zUu!8#+h$^s+h8FvpxewbccZo(t} zFnB_T*fF;I=WH`GvsWvQ;$r5sCkWGhT zKjq5ong?gs%{Ge*?Ql3BH^0~ZpNIXkRXGYaWHIAYa>9 zF3<9~_lG`JBtPm`XrRi>y68uq7G~G;zaB3>v%}i8R)lz*D}a`DvVb!c(M%?S4txB6 z z$WM+|{BySS;%3&62c`m)HXFukgQ5JyD+fa3o5TSx3>Cn9xAfP2jw`)3l@JJ2h^Jx` zbFevrc$5c11XfH&vr9bbIe6pS!c4sEDfRc+>+cKML#7Fw`cDE>@ z-I@BEPW$DP8!FvoMlSHAxRx@`<>Q-AdQvF z;;39;@j$=_r6~GeA&OCGhf zqbY^hJafYNLHEOc?b1%kr4CVPK9qRjH?K$*8W=B|>2I$gb%)?i3u}3ob$59xk~CFH zBJ=S&U&>oYs~)`;T0UL3y-@>dA%?9=PiByb85oBnb8fQw`%}#qM*P*jY;@&?9EA6V ztj~vaceZk0YoH+$v)f{Sy4SKF4mtmK-1W&8>RdVex?T35RWweW%AWT+2foMVmI~!@{KH#Yz96PQ6MF zTvcq)&zPwbeLdp3II4Z42LG&?^JF7;CWuF>Vk%aot5!19iA)iHNF-qMB>VhXAY?~j z$z)+@lK6tMRp$>z7RIaR_k??@Xvpf@yl}RK@!2-sL@*JVIY)(0=3}yQV^ktQrdd@A zo#k+2ZPsGD3zNymN#wD}DC-K~v&!_ve#gf{ zt~>`c8{t@+e!9OzEQBmX$gS#&lSQyNk^l4Ivi%LY=#hZ#97HN)g2*bYdeYfFfv1N< zcYC$R{6wD}^itr6i3to$JU5;sCJ8hNZK3qjjf`6Z_N(207M}@F>Gx+skB?Pdm<%IR zU`W7Ofd6B!3cjjkJn2^7I~nQ^5G!o3$(a~55fGbs0*paL=nQ6luv7WhPT~Bkwy&rB z78Ou)i8wYPO@eQ%lU^Syd@)t8Wx8GNXdLD zG>3C;PWgYDt-7{9;4y$wjWrt*#?UeQgLD1PaA6ul8e?>=sPO?j+h+NBi|lwgv{%CY zKGotL`?q6OzZ2A2yigu}R+l9rOMlj*HRr;xMN300000NkvXXu0mjfFk&2S diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_al.png index 4d2f16d40defe46840d521d9b16e2f7534880c64..595d7d875c4cce7e60123451a365079d4bf5623e 100644 GIT binary patch delta 1567 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 Hu0mjfzCSq| diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_ch.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_ch.png index 99d6bc279509491d3f4c4c8652c04cb5fbd0b4d4..204cdc8ff3989514094cca94221788be33c29d46 100644 GIT binary patch delta 2619 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 delta 3076 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 Qc>n+a07*qoM6N<$g6Z;@DgXcg delta 1667 zcmV-}27LL)3;GR^XbQam01mwYNBfYik#Z(~224prK~zXfUDjP}pJf>a@Mmkg&vsjv zb*$|=x9+2MmEziFWoy!niA>bMG&mDT7>1c4%pq(;A`X}%Mp2ebML|bkObz2h5J=QVAxmTfq6|VX?E^q_ zSb}sd8HPVKHFe!x=f8TcUh`yKd-ZcVNYmP7@XZ_~Y>9EClVhbcn~ZKo;lo(SNXt~x z&6X`&F5Py|QRU)mS(0#J+yU@-%i{;uqNtj<1K9pDhcPZyq%Zoj~xp`rQTdVAaHy7#HNZrwVm zv9YmG&=o^rB8uVm_4RdM^+qXQe-lCFbRiAx$T(_iCsT7Mjy+gE`%wMnb9HiZ(w^ZV zr2v81BRgj(Y0Un;ues@;y5)m1`is<{3(aYNSM;=L)23*3u0OHi8?O$2 z`@J&xAY^*w=qYcjsFNtBvtp}9?)>zQ(^-_G-qSwCIG7w@PeOTrx=F80(A$y&TU{`NgM;>=2{0*Z1%b?zNnwsu{NdqYjlVc;>M!V6c4nBTt&wW~8(sb2B zfXV8>O2-{LZ~kz9%YC(MxYJR22JCs^+@!PKW)6E?x%06D54>a1t)`n-9m_)C1Th^I zE4`!N-CbBls+@jfv(1I86ByU*4ue_OxvLfy6RuT&s#BJHTt)L<6kHToj$ z*#DoIN9yH|R+m-3`HgGOO`1vdr*c?q%4zvmIyk*+@(a!?O8VdX!-VY zkP0|bZ-TA4IqgN+c@tkabo;~=zjxL$XbLbh`s(SFIx;{rOUnYF&an8=LdhG_hqh2e zni_D~2`D)Zf=Y5xbQe+}8}N()q#;kNi15{bZ*R{vYZB0YA=4L5S^MJ+``;b;ULCsf zU$P9%pG&uYQ(siFI+09|#VH$(OiWBFMc4y>)rq>E5rr)^qjwd}}Fc(G{?gMy;>U8b~uKks`F~ z`tx_aRKNRT^`C20vT^svU#)b+L}HmwM2&PqD-_^Va*zCzC)L%}^$}5W9x?1(avcBw N002ovPDHLkV1iO@W={YB diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_gh.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_gh.png index c6062deb51b85488a4d35cd5d3f446ffbeaf8894..9d8c864f9894a9071e5281c825188da1fe6810fa 100644 GIT binary patch delta 2759 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 N002ovPDHLkV1lIUKezw@ delta 3136 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 Y0kKub>62oJ9smFU07*qoM6N<$f&+BG{{R30 delta 1651 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 delta 1443 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 LNkvXXu0mjfYl|c% diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_yl.png index b42fbe9207038b996407da4f567fe709ae966052..54edd9e57e899aea92dae93d15ee9fb2c1cd60b3 100644 GIT binary patch delta 1172 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 h0cI$vDIT** Date: Mon, 22 Feb 2021 22:33:47 +0100 Subject: [PATCH 096/124] TERR GPWS button switch terr-on-nd off updating only not buttons state --- Models/FlightDeck/a320.flightdeck.xml | 10 +--- Models/Instruments/OHpanel/OHpanel.xml | 75 ++++++++------------------ 2 files changed, 22 insertions(+), 63 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index 271f98ea..09bc8b6f 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -1446,10 +1446,6 @@ systems/electrical/bus/dc-ess 25 - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 0 - property-toggle @@ -1462,7 +1458,7 @@ systems/electrical/bus/dc-ess 25 - + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit 0 @@ -1509,10 +1505,6 @@ systems/electrical/bus/dc-ess 25 - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 0 - property-toggle diff --git a/Models/Instruments/OHpanel/OHpanel.xml b/Models/Instruments/OHpanel/OHpanel.xml index 054a93e5..7150ef0e 100644 --- a/Models/Instruments/OHpanel/OHpanel.xml +++ b/Models/Instruments/OHpanel/OHpanel.xml @@ -1700,50 +1700,10 @@ - - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 1 - - - controls/switches/terr_on_nd_l - 1 - - - - property-assign - controls/switches/terr_on_nd_l - 0 - - - - - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 1 - - - controls/switches/terr_on_nd_r - 1 - - - - property-assign - controls/switches/terr_on_nd_r - 0 - - - - - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 1 - - - instrumentation/efis/inputs/terr - 1 - - + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + property-assign instrumentation/efis/inputs/terr @@ -1751,21 +1711,28 @@ - - - instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit - 1 - - - instrumentation/efis[1]/inputs/terr - 1 - - + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 1 + property-assign instrumentation/efis[1]/inputs/terr 0 + + + + instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit + 0 + + + nasal + + nasal From a456722d60506e95d878519f688da75433fe05bd Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 22 Feb 2021 22:34:08 +0100 Subject: [PATCH 097/124] remove old color tiles --- .../ND/canvas/res/terrain/tile_cl.png | Bin 1843 -> 0 bytes .../ND/canvas/res/terrain/tile_gh.png | Bin 2069 -> 0 bytes .../ND/canvas/res/terrain/tile_gs.png | Bin 182 -> 0 bytes .../ND/canvas/res/terrain/tile_lg.png | Bin 1716 -> 0 bytes .../ND/canvas/res/terrain/tile_lm.png | Bin 3173 -> 0 bytes .../ND/canvas/res/terrain/tile_rh.png | Bin 2135 -> 0 bytes .../ND/canvas/res/terrain/tile_rl.png | Bin 3183 -> 0 bytes .../ND/canvas/res/terrain/tile_rs.png | Bin 182 -> 0 bytes .../ND/canvas/res/terrain/tile_yh.png | Bin 2190 -> 0 bytes .../ND/canvas/res/terrain/tile_yl.png | Bin 2097 -> 0 bytes .../ND/canvas/res/terrain/tile_ys.png | Bin 181 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_cl.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_gh.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_gs.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_lg.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_lm.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_rh.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_rl.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_rs.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_yh.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_yl.png delete mode 100644 Models/Instruments/ND/canvas/res/terrain/tile_ys.png diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_cl.png b/Models/Instruments/ND/canvas/res/terrain/tile_cl.png deleted file mode 100644 index 1a3a3b66ebdcdefe67defe5a74394779eca4f733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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-& diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_gh.png b/Models/Instruments/ND/canvas/res/terrain/tile_gh.png deleted file mode 100644 index ef5f7fa1b571cb0eef533fc4d1d2f6d522550df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2069 zcmV+w2N2bZe?^J zG%hhNHDpIvQUCx4lSxEDR7gub*IDeORS^a7e(X-Vlats#*q{G9t+8&ZZ8CsNjw=5L6kNnM@Q_Qh)BqPApKJNk&@Gaio3 z>hQ(-W2w7SkM!z?Q$OsSK9YJv>UF*BwOPMD<#R&nkgWDtjKF86Zb?0n`giK7)IU?d zPJKT0%0a;F8LphND{D*7Pu-BZD|K(`f&Tx;9qj(p_fuaIePx(kyq(;a$Ht zt0NbKgFkne|D^twx+nF;jPNH2bA8s|?i?S@>bk|C8%22Y`DFZcWb?b!Z&SZ|X4&}2 z6^JWRC#UufT1KL~QeW%e|B!kt^fptI>$6LklUh}|zd7}R)QwFMC6Oy} z8Zft|)TX%;x3|BK$$CqcFPe|9AUhh9f9Wmw6jI=0+kp&uoG|AMgAY@_qLC8d>C}H) zM!^6i6&%~Ldj4X_VDW+NpRHNHv^{-kqY=Xv9)piZ-qistbL>`O)D1%e>nxVLGxe{I z#4w;ClT_QYK79Cic>0uvNeP816-FWkLz4ZkslPw#W9V_PGwV~cJZwIzGctJN6UTkH zN&98{5_K%=7YALE<(2cH7MOJMArD2VC6!BhPmH6m7F zFf4zg9lOb&``o7}DNXbyMCX3=2R_G<4f0#-F;0 z(OIb;k>!SYy`W3o&MjH*ndRpBKuRa@<>8}8Py(_~w4$5)W4#`sR5l7@T3|+PDk$WV zkp^tdOJo4T>I3?J4n8}}tLAGR!7{G3=G_fZQ$W5vaKp-QtEb~enC0^Z%9(%TNm#%7 zn-$hsZI7Ll)S58ncWP;9_>?Phe8nM@5I_TysPI7v1jKMdFNcGK+1PmrWA&7*tmTdY zJWM@`+D;*cjyW|=3kaYoK#A2OnqfRcfOE{_-!h59cZM*VS|wUhOeCA-0W3YKI{61n z%EF{kBC7J8owsQ#OYYzid-(-2xr#B3HJ;)u{<=^YiSr!iQI!jQHUaXGJh#>~X3?A3#+;62uWRkd6!j0#Xej!;dM5X?4JhFle=?$o*NE9A6h zB2a+;*Q|J|SS@q8x>nt4TnrGwwf+WSZhf{TP(p{$Cv*!vgCvL&3{fIEPAcfuX@ueC z`?>=`37MWmQ5$tBy=t27x)-=W+$@a2rI;PzTo{SwLHok8Zb&4ZQGe7WslrQB>jd+b z?x+5W@JUWd=(!V7e$k7O2>}b}(t7nsLf>X()xaeBxvow_pfK(rvZ)&e!H-#BBDmim z%I}VooT*`Um>`-0TXTfTV!oI%+hnt~Cl9Oej9CPxxx^}Flu2b?N#(?zU{+dYrZME+ zJ>|?QXPJA5VlZ3GLy>5PK*uT-i_Z~8RSIC5f;o+JI)Nqz-=cS96LvfOFH=#~64`FI*@!cY=LXO7Fio4EV_ZSn1 zV2(hMmhn)(rAQ9>c%zU%>8+Zw?drxmjyE0eJHz1q<_(CuybXCL@~m=A6ou&u?|I*T zheCkBj!-xJEs~sQu8A*~f)XXJ5hcO-X(i=}MX3x0iJ5sNdU>fO3MP7ndZsDv5g?OIJY5_^ zJiOnYHRNSb5MVG|V(=jTjgTe~DWM4f$%!&8 diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_lg.png b/Models/Instruments/ND/canvas/res/terrain/tile_lg.png deleted file mode 100644 index 5820d7d8c296193c7d7e1b25656caf71af6cec13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmV;l221&gP)N2bZe?^J zG%hhNHDpIvQUCx3GD$>1R7gur*W1hIQxpd9ckb53nwzt!RkY^IcFUA&E`n;1=SbNI)D4s*8JPG zYuDCtj_Ka&)5jFXi`Cy(|5N>E^{MI`b|MOWc=qrB=P>7&4Kv2?SHD~RK=siA;2+Da zZEBotJaJ+DdG+4|^LzC>)mP5jqH@(3J4Y1WHPx>UEsoz*KR<8rmVmVSlJU8# z`b723L;Tt5PsjAD>i4Q2tG;~bW5e>%>es73s{VKgVE`Kgah|OHy86fJ&#E6E(im7r zzzF(5_0QFRRliYv+ko9NOI4s=xTDggvE#j!WMS6iOhmxi~zLpv=7JXz{2IA7tiH$#XmW^~zfl({TK2!Zj^>xGU zqLDQ)?1VV2`oM^W?;T@LNyK#*zC@Ev3LFeB2Uh*pA#%sl0_jCd8SkrpbBd`{SB#Gk z+^BD#Sm3p+hz@Pg@}v@XeR1`?f-NDA+z*052UE*C*{D-`jF?Z1GdsP$ci2fQkjM$d z7X~)>R=+&;S9~mW3O12?#MoMYv*zikQ;p=N$eQi`aoAJ-Ev+M65=u@m?w-#4ZO04P ztvfLLm*X1Ir5I1_h=_%_I@P%7Jwxh5IP=9)sbzrpOEY~cWWjJ^9&!418vW#`qO{Rz z_u{v;JRRv>oz41_>Ziw<(3w6$MKS5)Xfb|!R27%~E7O7ay)dn${qQCaT7$uHYgJy3 zYObNBEDtIh8s}=x)XK&ar(6@FMub; zm$f7;8$LEfK0ddDadz)XMQ1YxAfhC!4UFfkfic_a_Ujb?!x>|-n1V@Y4))S_s8p)x zc3^hXbg&ZuUNMe~s`yjtmOuA_(Z}+=eZWj8x%B8JebrNZ5+|pmg>S%642Hu1Y!(|Q zo|D$hjfhd!o==v;Tm--p#Zy8V9Sc7&As($5yCy6|=^;qG7R>J9%QW-@U?2?hozrsk zNu6d$GY8wcJLCc~0BWY8znCjrmt#pZJeFt@WS1NT;%xHWG;dXZx#PnhJ3gb~8dYWh z_`<_XL=&b()2^0|*M44sIU1NG5nfKyNUrTTm=9yfN9cVsKuSenDZ-Yw>}3N+*O{bv zxyb3kW*debiFL3=ZvGmSgWl7!+)Nw?v80Q;#gmJx+Rfyxz0!IT*@Z>}(&;8W648!< zG5qcc_$JQvta^M>7-L9cpH9}&-Lw#9qR^9%a zGGtU%3xG-6@yYEAMvrmOX6|;yL?`2tPUFl=63FJWMnDDTrTg8yl9Mr;usHx8w4xGRh#=CWCC?0r3b_M?(7v|7?OGoRw8aioIQg5g74;`j>i@okoeOFrWg zl_FG9fh2WoHpTE+(|hPEgEgVoWr5J{De8jpLYmxsY4Wqd-1#WX4{b*ODF!2WYANFk zyv0{h#lb)Z{klj2 z1O+ny%SH6ule5|Ry`t3gRU4ukBc2Y2*II1E1w3Dk1r{#`l7JeOAURN2bZe?^J zG%hhNHDpIvQUCx8<4Ht8R7gu5R%dinXL^2anJOeyMw&izr?)%3X=XGUwNXQ|Gy+K& z3t=JAOc4kSm}06aMr&-Ey%fX7UQCmLh&2$eL727HSyQ~hiFdv0lbm?7@t$nrO>$0t z=bb%ge%&+Qz2Eyj6?*v8a8$#iW<(w1cOsEROFu?8l;{&dpmkN(bI^IFfs!CDwt|u)NvMAB|!u0)k>Ud z&Titxl%#bCqem3yKdO21E8&lK^}jhf_j12{BqU85;WJ4>Az3EOrGiY-hnOfySl|~p zpO;Ctp?{5h&tb)tV~Xih>Z{|*T`9DhVAsPYD1GoV=`gZkwmyhVf@x?+VT=5=E86>? zY5wJj?k{)Ce}BB>Mgc<+K5aqRg+w#j`!KkWU(zpKl$Uk|xwKmv_A#~H?Be}3XQqtL zZfSmZT{nBE@>C0YoCpi>(OBq2-}6|y3|rUB_KslP7?$s^IR2jPXO|5Rf2w_Oyz;{d z<)IGwd=Uu|nI;TPVDh;1>eZ@`uNXhtJa>1md@#Tzorq+a=hjy5KV$j3OTsUIBHZ3m zd9W5ubOSFF%c2#VswPhvrlvfzw_}gqG@f6D4P#g{hVkWCw-l?M$BH&|MUe3z9>KgN zWxLyC)jK+|2B4Fc00YN8X0c66cr#sn;>vDUL$g%y~O{cL^_Ucyo(e3i%n6*yBYK9hakKR3M!YeMwQ1x%sHLU(5D%a(h#bvCuQo!| zvp&M#!={pGFJL{PlZm1^jrJDITZk9OvHQf_%ah9Y*J6J+o~OZ$2+=Vkf_6UQ=hHDX z(3B~(MNscTG%9PXmv-dQ-i!W0j4Z@(4~FB&xsk9lA>yGG5fNz!ija}>nOTvB9l+RW z^VEIeo6pRDc(?N2ddXxC1qY&fxHNF;U=`rCB0zvUQA;oKA(i1e=r%7YUO8BC_I>Lo z=L~laYcF)OOQKB9gNRk)*Gt`6-U+8XN#b%yf+1vjF}PiFY`XlbU#R}`q3Qec`kB>L zThfx8z&q6vK?kP|L0Vn3I8aMH@=fS`4vUuaThH01@0g$cz5U-mw|sZi{9s73CXPlw zqJ)`>70MYS{L(C)j3Jvx_b^7bW8Ve-(_59ly{dh@S8;Zb8>y4#JY~LW)?jA6B*O)k zu}#6(MoYF$l)k=s&g44m*ofVv$0_aX&8jahm)@ULzFXj4Oz=&9K56IuHLSIYvm%64 zGuoD5)gIZ~KUPe?Uv~d6&TPVtMHtDWmp*TYXyRO2SnaGo#Ah>T9>mJml~?~pI{RVC z(~G4uZRSo;|v^c4?0c@S_oA%|%4LTG$P6*@ysSL@%&w-%$MYXR0s1F#PGR z=IaB>^9!+tp8MFi1;kXJLmsklUXLu|XOlU;Yt`JHXXbu9aj$XXi_oN0If?{}B}sGJ#Ho2@NgWW{JqkcNgChIhY}@O67Mip zt;EC#Ru_u&ZL%P0LRbTjjuEx+5T|Th*dd8}6cM}JvlZQsoScgu!Vjc4SVlD*DOz}=Oh(%LiL>Etf z8u9TFn^e^EE_nGw5OpNa1R6s~lZNRRL~RziCayIjX$&IiN7zjwK#(|H16MWUHo)gm zB-0i7AYbd{qi!bRMJ$Qt4)k@SuMN-Dqcw^YO+nk%aW3fKFv03zBW_93!h{`&#Zlje zj$sUsGcS*`+lR3ti%bCII&KZ;ARVY+G;(g6M6^r&PDRkciwQX$DJ)~QoUgupsq*35 zC0E9=s}b!K9JD|^;{lO@V$H$_1o|voZiGAd`5Vf2p02rg(=c;GKXan$y=4_^33*zy zhPPEhTfrg#Y=q@TV#5%nrl8?(%{U5u$Z9BWM^q2`G*FCbYJo zBZXWYS_&9BP<8ft+2be1A7;$ozEOT@9u|{flSu2hJTho&EiQCX8wTTOAnq^bR!>&F zJEi*kp5|K;_5tqn0G6bSZWtj?BRnaaJF#Gl+xTkbk9MdhDRQ#tpqC7>6F(~b;DY-8 zDb4h1`D;0J1(Bkx>cRkCm7Thzp1p1T`W?+jqa|Bf(bI}~ecbR;cGFAJJ)_dC^RO_E zj2m%cDp8iYMcvD>JW8-1~fKHI-1cz<`@MTZPIuSGt?ce^Or6wPjVEr~BD>D_2Lg4d0wf8w}v+BE%|=FBqH zL^JX&OmhoE?%SH7SVOc}Xm}Ext5}qnP_3+Pk!s0)Uf94MI97i3n(*M9^~M6(OCi)zr8Wa%lTdLD&Uifxxn_kM2p$B#5$om1TzQ*6%g^Gpy+VXok92Bq7p^oL|&l2HI* zs$ChTa}ieTmY=w(diu!tACHCaZjUI%^)U9%VOx*}88>P`iE}38&JJ7pc zw(kSg!%u3yeW3f-E4tZj+M~oGGdyK5lrpAjsZEf%+!E2x)YhVv)>Xiw_1N)F*^N7f zZ|iq~hiwoZF4l+se;usC;u&x|xoA}!>jpM4wRnUi8nW3Vic?UFhWctM$+9~61PoObQ(g4;(#j3 z3gwP-+PgE_fBw??=ZjVM$FZ*!g)mZ4)KRB!B26ttOZ|rTYFL|18bDH!>yZ!dEIoDI z@aS{xA3rYp?VGqvCf~;O`}nv;;S}cBol=ig;#0HsYR0PL9Vx!$4ByC>=&-c#S7C_9*B zTPT=y3X@iD)Wc$giw{^{Uxx+E2HY9;9C9;Ubjf6j9Xu^$J%7 zYo;TV2o6cWO-;bZgmTE!?LKtP{@nOA)yX58ivzN?RPO}VW8wq@XH|3b4T=DV8dg1P zC;lYSKyJSP%L~lXzsf71XPmTEYJqCls$nt7d`^zMHELu6cEn(3#R$?Qnstg-_m-Ym z$LuTM#T1&zj;LjeY}mt6?)oh9m{Sp>)X>1JgT0twOpI_P{ZbH^IeKoTcy%J`FV@ct zWmuq?UNQY&t0Yv6T?>Z?ff$krBvWit0I47nX*4yUod!*#F2Og}SG5P{WDG<(S{-Yv zf>p&j1!=&-c)f~%uO#4>hy7fd1U`t-#aJ_dr45)zqSV2yV(kA9C<{97<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%hhNHDpIvQUCx4)k#D_R7gub*9Wg8#T5nM{t3J9&3iB%tEziuL6$8UkO2{d5E+(W zSc|wOFNh2R1lSl%5+a$T1$oI?u!xKZB4>m#NhI-K_Mm&F-Ch4&9Nvnv57Y2wn*FyM zHcVFkvb3^q8H(epV2i)k!Qi+$96njSzU^L#!v|?F`~5V$5XYRZY5Ozkcv2lr+gOE7 zb-Sq!C)VN6vitMWiooYK@#)Zi)z5$E=RXeXzU${7CkxYtY9ye@T-oJ@Hl5qFmo@2u zFuWXx*V62bG#mfNF_`3@jl+Xs*b;`v!-(3~8{2r?0`E@K`mZb7;NZ(en4kLj*Zus} zINRLy!b4NsABLwwlq2k0rX{*jgg2jCyX05deAdrCO|y^EEKl>1D-i$b(y4XaYucej zqJTaU#^;~+^Z)hpchgMZo4N#9A*SyV#3{{L0Lv7TrOfW>hL_^-Ng6*UNaA_yFH%I& zg-s+FdG;;46RL1UldfNYv&vRiHp!E#n)FN@3W!K2?2~a2`SND80QKy$HS}0Aeku&c zcXoD(aNO37dtKDTeU>J>EU(g)yYB6J+X4M_98B|M{bUtfA6XWsEX0@lS#`XsO%I2W zB1$4x;@~s4sraS29sgDZ{${g%%I1%2C%%GgYfKWx5_}3N3`23CnHyXO)=ilB{1Jkvo97&WZ9YZh^oU65VoV4|1b(;zGCv^_HL|e7R7;m1Ot~- zAYKY|6WGnt)If4c(TB@kN?xVsuujM^<5nwUa+=+bDG_HI?0`^`1);Na+N= zJbd&BND=DcpVa#)TX=wPAD{_3r zA(Rk61CyxmK?wxJa6>N#a|#*BOBl0rva*&t2Jn!36t(R_3>`B!O%n*9DL{!;++rBd z5a1m1_%}_W@BvZKhf1`fm`E1O16X=eHTy^3R2KTV5>b_xG)dl0TUl}kk66nukjYhy ze5~;lXYm(q3W@XF!g-?$edS2Lw7VFJNf|oj92UH5%+1->rg1s18)GK3Dtq;yDtM1I zU{x*1FI0dEvW04*gkYAbGUTc_lhnEHD`cLN2^8S>niWqKt7R@%*Q#5Mivc3I=G&*x z335xIgbtxk=oWegNf0F%qC~QtRM4%{2*b^Kj}8PSWO@=sE!3s-s(iZZUf=>@Q0Qxl zdE6onFpdS}BCv3jZb&4ZQGe7WslrRSb%H6Re(G0*XE`OI=Vqcj(TkA@!Ds0DwJXB23NmI_}v!4@;eGi|i~v~$W?Z!hN_qQJ7mc_(b>lt&;XKz1HGmCbZQXG3xdusF!FTLPb8s6!e_)TX@Qz*|8KQ++f< zVVKX>d5)-*(WEjE- z?7r&O>h9_W%Lpth2_AtAOTH>5O-zamnQKMAP>eEjPX^T4%5t(S^h*B8KF-IQFqA}* z@b2Jl;_l=5p5}(m$5fRlPus;UUN(ZkE?0%@rtiMbP^Qt9p$!VO!0QcxdU7;7Ut&pz zWe#LY^6)g983^p%!wEz%TcAkGP|My@B!>gMQOHkvtEO!ESU28ryyPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D3ToSMzSq)3wvMQgBSCAQ%Ku&)dwuaRdk_yE4nMcyJnE)oHWVZeqg zAaP*Hq$ruD*fc3Mo84VqUE`Vk?Gl@(tIj$9u=m<)uf6|vchqTe)e02Jcb**ITTP*! z=Gx=w721r&biJ!?RYIDXDWc zzLZx^XY#p1O&HbiKJb0Hdtt9B*rep9u4^T%biq~Ht>^m3sHc0~p3b#9Ix8CeX*Sh= zW)nTCE6s9GVc1gY;RYMo+^UhhFw(N9Rr{Vgb)(A|bvNngwri=ywyR#CKTjw6aIw-; zoMx+48jQN_Fu(@(rU#i5KWXudmyiJG#~1&_x{HNkWXO)CJ2#p1cKXzN7NN zMG&|JZnxuDUA&7EJZbgS>GhQH`~YvC5t7e%x6dZ0dBp-w-{AN6nn2$RV!hi-b$4T^ z26S^anU=KxMll-=K(wDEssd@k{QWG`r^}^Qgf0TzZ549A9_=+(TanIpyNc38pS*gh zkH6gKmE>1i$JM^qtn$)_AC=EW0h3d`)7#KbM}6Jxvt2pUXOpo$I6l$;;o&n3X#7Yi z@!9~Hi>wi2;GA%b`Tm?W>L}5$sdaxalK(GPu07aox7C6h(=6BiY^LY)TrY|3u@~wH zuUNg;mV=0Rh^XFNmk0vv{;QgFYrRS+&?wtE0?hiomZ*bxW zBW4ga!OQpmQG7ND`5B;8!v0isfIhL%bd-o zB0Rn>;aQWH`hwAqc{gQ5<3m`&6!YF^4V#y7Ex2poT~^Pu<+atvxm#+>y|1LPc!vz- zH7}(rb)eh*p$dZh445DC{OS5_0c#GD>-7d0U>Yl@aKD1^esZs2G-A~OZ{MZU zpQA5Rurx%hv>0_P58cnasJX%IcM-EYX-DUimQEP_hqDQKFxL|nJ;s0~p|G?K5vJS_ z3<8Bk0l9tMPkZ`4%Y8F$tDOXT0UH17GX3|XpX@trQcbw*b44(%JbIvE@=t`|Tcc&j(_gxz`3_S4{Up`~5{hlwCrtk} zIcCv<3JIC;z5=DMt4E>0i?l+TTad6DJ9U>U?LqVwgv>BxitN8&oe3eZSu5KVPE}+| zJF?1M%0uiJhBGA@i(x?8^ziv6oZklGjCA^vIn+TG1SUO{{ zd1M`i{WDFCF(ifuCe;hVk(1`G2^s0HV{cOESlmazI;~heD(jRoZ}rIvpobHEzV}&` zK>}E<;K~%EEyxA+$U^UKD8}BL3}|5~ibs0+=zviw4J&P7(+(C#h0_twA0Zyg6<$Nm zibV>ZRUnm;O#wRLK*Y23gwPv=bVS>5(}nus<~9mj>#J<4hx55U!j%(tsgQ^Tr1!VI z_Jfdt1Z};j#hwJ!rNGy{PEYS~z117)dZ(iS;#6^+RrF$L#0rgA0dWMpEswC^WmQDR z^Cnt{-gpJ3G+DWl)l~ks9U5za)hvT=rL`v12W^`@v;6iKG9dJ z6$_(`rrKoAkTkqluJlc^={{Z9)$ULyz;B&!g=0lV$!Dz@$i1Y}J)X@`*aejsL9@ol z$o#Lg0dEdAG)%ktVzJO~rzgnyF+FUf5jJnr8Fd3>oduueGx`au6A2voI&)%pbRHvq zM6BN(ZR+~=jy@Yt_3y7==~Mcf6H{SlC2>k64%QA>TX6~p>68H=)I05-ybJ9_Tjch6 zbfgQ^L%KCMhfvWFVa&s3so&*eeMtTI3}cq$*Bq8x>RP1@nUliOHa%(tLaz^B>)`NE z$BU^ls;zbQqz?ZHM3CY@OLc1?pSom;AHlf}M0WqSd$qYtmtACq4v6WeHdO2HJ>UQDG2qSar ze{tj$&$%V*OlRqT(Jc21R@|VdQ3Exj8_#S6sE?=v=LlCeUFeYHe`;tz+?A<|ks8DT zxa4u1=+aM&AS~iZGi95go@_8=%{%bo23`F2prbLF`N7L0eM}1Hge0K7m{avLnrZi4 z03~^tY?biqM)!6r)lasz&<`5C(&+^V{Lg%%hX~p}@K`GtSka?p2nm)^(g%r(5OjgQ zgEPCR>$hl%-tP=`iPph7v?qk|KTeMH5rQ{n&k7?&c5c!QdWDxL^J5f_!iE?%c-cZ9 zLKaTQxgK!$AmVulT|-LRne|lwX8}@naw` zzq~%si{)f}tcb`Wyjgc=XJnDPj~cW=BQ-(72#e{iOY}y6Q^TaKqqCV_(n@}uo#_>X zJTL=LQNOVxrpn@kuyyTDvr;|jx*4h zkW3jHB5Lk!LNhe$iQhRU7>osd>hpF%?8u%fq>>h>Al+F=A7LqF!6 z8L^;#Wosr`TOcx~CWXlu94N_94`mH%%HMWXK4?=LF3@F~YI_z~d?Q~&zq(_A1 zOR^+4G>B(Snp;R}Qqeb0xI)6!hs3EJ5m3t4p!+e#*xau$)I#HM$WbKgIAk3Vg3J-3 zz2*uXntRi^W((+kly2w;7k4#8UF}a0kLlt+9FO(?*^Cn(sY@s3vAG?eQDkNqY3VTt zmGvPbYE}<4&T&d2(Ks@!=Fa%VXVTi>2 zKIdf4IUEld#vG2A_D361o!%Lw7YY&v1D9W6Ao{b#nP}6D<+5V;iqB)NQzNkR^><1% V;k(cstFiz9002ovPDHLkV1jwN7-9eb diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_rs.png b/Models/Instruments/ND/canvas/res/terrain/tile_rs.png deleted file mode 100644 index 1c97e713981806f741680e42daa500fd978f41fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1SGer&Y23NSkfJR9T^xl_H+M9WCij$3p^r= z85sBuf-vKbiP>*~f)XXJ5hcO-X(i=}MX3x0iJ5sNdU>fO3MP7ndZsDv5g?OIJY5_^ zJiOnYHRNSb5MVHz^QWiYy2Fv#+`#nZz0$P$1)L_0Y8O~$IS6Mk`GPplZoc8>T%~qr TeJevFP(OpGtDnm{r-UW|@!m7! diff --git a/Models/Instruments/ND/canvas/res/terrain/tile_yh.png b/Models/Instruments/ND/canvas/res/terrain/tile_yh.png deleted file mode 100644 index ef1d807392c304d5a880fad0ed3372d002a23471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2190 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 S@0%V#?F^o-elF{r5}E+V)-*@} From 4db7d57ffa518cbe2059c4f84514b9003a7cfada Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 22 Feb 2021 22:34:20 +0100 Subject: [PATCH 098/124] update cyan tile --- .../ND/canvas/res/terrainv2/tile_cl.png | Bin 1479 -> 1562 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Models/Instruments/ND/canvas/res/terrainv2/tile_cl.png b/Models/Instruments/ND/canvas/res/terrainv2/tile_cl.png index ad1f52a7247c9a04a94af25502f96bf294d2eda0..91e1e0ff90d62219db2bd089b681d2df98c0fac9 100644 GIT binary patch delta 1441 zcmV;S1z!5c3z`g&XbQUk01mqW$N1DXk#Z-0Y)M2xR7gvGmrqPwRTRb_^O#{6U1>PbU|WbnyT^7!nC+>VH0Ixp;8yv8V#vU ztc@lvOw`bgao3nw7>40byY_ePhqqH|{1%t0R0qLd1s_TBs&%#T_`(}i!{EaIs#() zSx*^Q)d>b@Oje{c)}DZ?Um_9#NTpJLPrgy;pI+Yi)k^ZIt1_ZT01(?g?1zH_<$z*s zf2=vU_`2a<3b-o8geLqp~iC~i)>UWwa18S?RU_FX0c~-Jn8Y_g|O=)3{u^H z0>pA6<9=%ECE4RuFI+1dSqS@QP(lI(05PyFyW$4<>smkBJaAF-a>=BB8lS8Ws6tAs zyg-+LnpWB|R-Yei5DIY3r8fX(Q9xFKFG{SyLjvX?W|e>nHmNRv(-?>;s)>N=vZ|B( ztU5ZSynp~`yLhc75x|2&&^e-G6{D`G#REt#fj>G(R&R8w+d*17#qx^;;sK=!kNlT4(noCYaw z^FOa^^oY5%0gFHiS;dA|>i7PB?5CTAdPZdc zel*m?WFfUWxs@v(%L4|BT%4Fuw<2w&`OC_~xy12&{E0b{@-UP?3h_Q58@7)1^z`Tw zUJcL#8XHBZmlU`G4mpOp#Ny5 z?jA9gxEG{}!c}R`v%C1$csHot>s!L!3-Us&$<_}-Fx$Z?q8%nT> v0od4wXVCa3O<4kf0PwF2e{NZ)AovH%B<2@gRQ$~h00000NkvXXu0mjfR&c^u delta 1357 zcmV-T1+w~@495$QXbQXl01mtXmArCEk#Z-08A(JzR7gv0mrZEgRTRZ_bg`ZBGa#mjl;p8N6Mf4*X^R_pi^e;hpH)AxI|S{)b|Ftee5 zp`k*dFgQ2}DVNKva1@9PaMpZ2kHVVEKuEUX;bEmn37^sgsmf7N5tSJLc70BW_`p+|iAtas0Od3i^FiTE)9%yEwRlR-o=Ag)6|R9YUgs1iBZQT8vs zym-uyz31)DMd|nxvArB{_&YKym5NHBk_OKzWTp&?rXyYl*@)_aCv$oHCu?u{_?D}u zVoK0q)si*Jm@$W~dHn_Np7lnfA+aBr0V7hKtnlCBX8R(60FKln5%o?z+U>S~o%H;s z-@EPIZdcE*ADSId5FUn6x6#p2E>}HJ69Ev76WN(qDwSpr|1*EW7dQUa3lfZh+Zgtn zX0u5;cSRP%(LkNT6!kK|QS0@3?WUcv=_@)!x_v@G9H@O9xBg4(3h&ARbQ zw?l3t-=bjE^M_zoCN`d@dRys}(p_%rZtbseq5up4Gl(OrI#7Q5hPNl@!i~a~*)=}V zM5satD4ng=Bu42>2?KvPAQE6Nx59u~M2Lz|A{i197hw)Kt3)cqq}qUg%oBi9R1*Q! zWmPBTv+C*;N(KnfamkIAFhC9tLHCG{Rf@XemJSfvf^>C=tSM0nwr~qbQpIIbb$GHS zA_JJ7{32D9o(>1lIZ8ZpGEo^y0l=04(GfAI1e_zLHgJ^alieFoC@E|U`9ibOh}W(L z>2D(+CRT0Lj}^bfc$j^EP=i#VztlCK?LgN5MY;iyQbbq_?%D4*p7wY+eNY<`uItybOPwQL+H_lW z-s&;VRRiU;RbvPW&(&tn_@2|g@vg6|#;22zW&v0eQQE>i-g?P@r?=uOL{WtxJR}I? zvvO&@5r>|O?*l7-s=5j%Hw3-^@#2Xw%b!{MN|37!034_4s+wN3$Zzgl_)$|U7L~F$ zDj)JnV4L*+0)uL46bQNc#?>1@wjT6?Qvyh%;fCwgqBXPko>tl>ppc?0ZY-o-mT}8{ zUO3=`5Btyz-);eaVtIF@#clK^YK+UH~m8jVeTCorc7NF7_`mFb)PxywZqW^sFt`q{UE(I^3|Ph z`0cOx#Lbr_G7tqxj9doi50YX+bS?gBr7w54*@MxQHmeJN``16N+Qq4A=2cCU4v$B?8xie4Vv!ujC%`2jBOjM}Aj`t6rJ8FYY5I@UOfHst1l>$iP97(~GUTKO#00zLnGW^_%PG Date: Mon, 22 Feb 2021 22:34:57 +0100 Subject: [PATCH 099/124] terr-on-nd onyl id not plan --- Models/Instruments/ND/canvas/style.nas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index b48e0f68..fffe293d 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -94,7 +94,7 @@ canvas.NDStyles["Airbus"] = { predicate: func(nd, layer) { #print("TERRAIN TOGGLE: " ~ nd.get_switch("toggle_terrain")); var visible = nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") == "MAP" and (nd.rangeNm() <= 40) and + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)); if (visible) { layer.update(); @@ -1988,7 +1988,7 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) ( nd.get_switch("toggle_terrain") and - nd.get_switch("toggle_display_mode") == "MAP" and (nd.rangeNm() <= 40) and + nd.get_switch("toggle_display_mode") != "PLAN" and (nd.rangeNm() <= 40) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)) ), is_true: func(nd){ if (terrain_maxalt.getValue() != -9999) { From e2c5d2ac225adee3fc7432705efef4b9abc89cf1 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 22 Feb 2021 23:58:45 +0100 Subject: [PATCH 100/124] fix for vor if not set (rotation before setvisible) --- Models/Instruments/ND/canvas/framework/navdisplay.nas | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 4213948b..f8c72c65 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -111,14 +111,8 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update setRotation: func(rad) { var deg = 0; var gap = 0; - #if (me.last_rot_deg == nil) { - # me.reset(); - # gap = 0.3; - #} else { - gap = math.abs(rad - me.req_rot_rad); - #} - if (gap>0.001) { - #else if (gap>0.1 and me.duration == 0) me.reset(); # detect VOR freq changed + gap = math.abs(rad - me.req_rot_rad); + if (gap>0.001) { if (me.duration>0) gap = math.abs(rad - me.last_rot_rad); if (gap>=180*D2R) gap = 360*D2R - gap; deg = rad * 57.29578; @@ -126,6 +120,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update me.req_rot_deg = deg; me.duration = 0; if (gap>0.2) { + if (me.last_rot_deg == nil) me.reset(); me.startval = me.last_rot_deg; me.diffval = deg - me.last_rot_deg; if (me.diffval<0) me.diffval += 360; From 8adc2f38689319cd1bd0034e67c32b96c08aeecc Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 23 Feb 2021 20:50:37 +0100 Subject: [PATCH 101/124] fix for trafficGroup on efis 0 missing --- Models/Instruments/ND/canvas/ND.nas | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 543b0722..e09a1fb0 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -190,6 +190,7 @@ var canvas_ND_1 = { me.NDCpt.attitude_heading_setting = -1; me.NDCpt.adirs_property = props.globals.getNode("/instrumentation/efis[0]/nd/ir-1",1); me.NDCpt.newMFD(canvas_group); + me.NDCpt.change_phase = 0; me.NDCpt.update(); return m; @@ -213,6 +214,7 @@ var canvas_ND_2 = { me.NDFo.attitude_heading_setting = 1; me.NDFo.adirs_property = props.globals.getNode("/instrumentation/efis[1]/nd/ir-2",1); me.NDFo.newMFD(canvas_group); + me.NDCpt.change_phase = 0; me.NDFo.update(); return m; @@ -357,7 +359,7 @@ setlistener("sim/signals/fdm-initialized", func { }, 1, 0); setlistener("/instrumentation/tcas/inputs/mode", func() { - if (getprop("/instrumentation/efis[1]/nd/canvas-display-mode") != "PLAN") { + if (getprop("/instrumentation/efis[0]/nd/canvas-display-mode") != "PLAN") { canvas_nd.ND_1.NDCpt.trafficGroup.setVisible(pts.Instrumentation.TCAS.Inputs.mode.getValue() >= 2 ? 1 : 0); } if (getprop("/instrumentation/efis[1]/nd/canvas-display-mode") != "PLAN") { From f74281235c420d1095cef8308dbd66d368ab0aad Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 23 Feb 2021 23:17:20 +0100 Subject: [PATCH 102/124] out from func --- .../ND/canvas/framework/navdisplay.nas | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index f8c72c65..15b74107 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -13,6 +13,75 @@ var assert_m = canvas.assert_m; var wxr_live_tree = "/instrumentation/wxr"; var adirs_3 = props.globals.getNode("/instrumentation/efis[0]/nd/ir-3", 1); +var easeArrow = { + new: func(elem) { + var m = {parents: [easeArrow]}; + m.req_rot_rad = 0; + m.req_rot_deg = 0; + m.last_rot_deg = nil; + m.last_rot_rad = 0; + m.element = elem; + m.time = 0; + m.duration = 0; + m.startval = 0; + m.diffval = 0; + return m; + }, + setVisible: func(v) { + if (v == 1 and me.last_rot_deg == nil) me.reset(); + me.element.setVisible(v); + }, + hide: func { + me.element.hide(); + }, + reset: func { + me.last_rot_deg = 360 - getprop("orientation/heading-deg"); + me.last_rot_rad = me.last_rot_deg * D2R; + me.duration = 0; + print("VOR reset"); + }, + setRotation: func(rad) { + var deg = 0; + var gap = 0; + gap = math.abs(rad - me.req_rot_rad); + if (gap>0.001) { + if (me.duration>0) gap = math.abs(rad - me.last_rot_rad); + if (gap>=180*D2R) gap = 360*D2R - gap; + deg = rad * 57.29578; + me.req_rot_rad = rad; + me.req_rot_deg = deg; + me.duration = 0; + if (gap>0.2) { + if (me.last_rot_deg == nil) me.reset(); + me.startval = me.last_rot_deg; + me.diffval = deg - me.last_rot_deg; + if (me.diffval<0) me.diffval += 360; + me.time = 0; + me.duration = math.round(me.diffval * 0.21); # rad 36/3 + } + if (me.duration < 2) { + me.last_rot_rad = rad; + me.last_rot_deg = deg; + me.element.setRotation(rad); + me.duration = 0; + } + } + if (me.duration > 0) { + var tx = me.time / me.duration; + #thanks to https://easings.net/#easeOutCubic + deg = (1 - math.pow(1 - tx, 3)) * me.diffval + me.startval; + deg = math.mod(deg,360); + #print("DEG: " ~ deg); + me.last_rot_deg = deg; + me.last_rot_rad = deg * D2R; + me.element.setRotation(me.last_rot_rad); + me.time += 1; + if (tx>=1) me.duration = 0; + } + + } +}; + canvas.NavDisplay.set_switch = func(s, v) { var switch = me.efis_switches[s]; if(switch == nil) return nil; @@ -81,75 +150,6 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update "staToL","staFromL","staToR","staFromR"] ) me.symbols[element] = me.nd.getElementById(element).updateCenter(); - var easeArrow = { - new: func(elem) { - var m = {parents: [easeArrow]}; - m.req_rot_rad = 0; - m.req_rot_deg = 0; - m.last_rot_deg = nil; - m.last_rot_rad = 0; - m.element = elem; - m.time = 0; - m.duration = 0; - m.startval = 0; - m.diffval = 0; - return m; - }, - setVisible: func(v) { - if (v == 1 and me.last_rot_deg == nil) me.reset(); - me.element.setVisible(v); - }, - hide: func { - me.element.hide(); - }, - reset: func { - me.last_rot_deg = 360 - getprop("orientation/heading-deg"); - me.last_rot_rad = me.last_rot_deg * D2R; - me.duration = 0; - print("VOR reset"); - }, - setRotation: func(rad) { - var deg = 0; - var gap = 0; - gap = math.abs(rad - me.req_rot_rad); - if (gap>0.001) { - if (me.duration>0) gap = math.abs(rad - me.last_rot_rad); - if (gap>=180*D2R) gap = 360*D2R - gap; - deg = rad * 57.29578; - me.req_rot_rad = rad; - me.req_rot_deg = deg; - me.duration = 0; - if (gap>0.2) { - if (me.last_rot_deg == nil) me.reset(); - me.startval = me.last_rot_deg; - me.diffval = deg - me.last_rot_deg; - if (me.diffval<0) me.diffval += 360; - me.time = 0; - me.duration = math.round(me.diffval * 0.21); # rad 36/3 - } - if (me.duration < 2) { - me.last_rot_rad = rad; - me.last_rot_deg = deg; - me.element.setRotation(rad); - me.duration = 0; - } - } - if (me.duration > 0) { - var tx = me.time / me.duration; - #thanks to https://easings.net/#easeOutCubic - deg = (1 - math.pow(1 - tx, 3)) * me.diffval + me.startval; - deg = math.mod(deg,360); - #print("DEG: " ~ deg); - me.last_rot_deg = deg; - me.last_rot_rad = deg * D2R; - me.element.setRotation(me.last_rot_rad); - me.time += 1; - if (tx>=1) me.duration = 0; - } - - } - }; - foreach(var element; ["staArrowL2","staArrowR2","staArrowL","staArrowR"] ) me.symbols[element] = easeArrow.new( me.nd.getElementById(element).updateCenter() ); @@ -698,7 +698,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if (contains(feature.impl, "common")) feature.impl.common(me); # conditional stuff if(!contains(feature.impl, "predicate")) continue; # no conditional stuff - if ( var result=feature.impl.predicate(me) ) + if ( var result = feature.impl.predicate(me) ) feature.impl.is_true(me, result); # pass the result to the predicate else feature.impl.is_false( me, result ); # pass the result to the predicate From 42adeb85ed9da18e2f850b475900969394c4fa1b Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 23 Feb 2021 23:18:21 +0100 Subject: [PATCH 103/124] Display range/mode change msg on ND --- Models/Instruments/ND/canvas/ND.nas | 37 ++++++++++++++++++- Models/Instruments/ND/canvas/res/airbusND.svg | 24 +++++++++--- Models/Instruments/ND/canvas/style.nas | 13 ++++++- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index e09a1fb0..5a224a62 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -180,6 +180,16 @@ var canvas_nd_base = { }, }; +var ND_change_timer_fn = func { + me.change_phase += 1; + if (me.change_phase>2) { # phase 3 + me.change_timer.stop(); + me.change_phase = 0; + } else { + me.map.setVisible(1); # phase 2 + } +}; + var canvas_ND_1 = { new: func(canvas_group) { var m = {parents: [canvas_ND_1, canvas_nd_base]}; @@ -191,6 +201,7 @@ var canvas_ND_1 = { me.NDCpt.adirs_property = props.globals.getNode("/instrumentation/efis[0]/nd/ir-1",1); me.NDCpt.newMFD(canvas_group); me.NDCpt.change_phase = 0; + me.NDCpt.change_timer = maketimer(0.4,me.NDCpt,ND_change_timer_fn); me.NDCpt.update(); return m; @@ -214,7 +225,8 @@ var canvas_ND_2 = { me.NDFo.attitude_heading_setting = 1; me.NDFo.adirs_property = props.globals.getNode("/instrumentation/efis[1]/nd/ir-2",1); me.NDFo.newMFD(canvas_group); - me.NDCpt.change_phase = 0; + me.NDFo.change_phase = 0; + me.NDFo.change_timer = maketimer(0.4,me.NDFo,ND_change_timer_fn); me.NDFo.update(); return m; @@ -419,6 +431,29 @@ for (i = 0; i < 2; i = i + 1 ) { }); } +var startChangePhase = func(nd,txt) { + nd.change_timer.stop(); + nd.map.setVisible(0); + nd.symbols.nd_msg_change.setText(txt); + nd.change_phase = 1; + nd.change_timer.start(); +} + +setlistener("/instrumentation/efis[0]/nd/display-mode", func { + startChangePhase(canvas_nd.ND_1.NDCpt,"MODE CHANGE"); +},0,0); + +setlistener("/instrumentation/efis[0]/inputs/range-nm", func { + startChangePhase(canvas_nd.ND_1.NDCpt,"RANGE CHANGE"); +},0,0); +setlistener("/instrumentation/efis[1]/nd/display-mode", func { + startChangePhase(canvas_nd.ND_2.NDFo,"MODE CHANGE"); +},0,0); + +setlistener("/instrumentation/efis[1]/inputs/range-nm", func { + startChangePhase(canvas_nd.ND_2.NDFo,"RANGE CHANGE"); +},0,0); + #setlistener("/instrumentation/efis[0]/nd/terrain-on-nd", func{ # var terr_on_hd = getprop("instrumentation/efis[0]/nd/terrain-on-nd"); # var alpha = 1; diff --git a/Models/Instruments/ND/canvas/res/airbusND.svg b/Models/Instruments/ND/canvas/res/airbusND.svg index 415914ef..da220fa1 100644 --- a/Models/Instruments/ND/canvas/res/airbusND.svg +++ b/Models/Instruments/ND/canvas/res/airbusND.svg @@ -27,12 +27,12 @@ id="namedview102" showgrid="false" inkscape:zoom="0.77702762" - inkscape:cx="373.9808" - inkscape:cy="476.40075" + inkscape:cx="212.87887" + inkscape:cy="628.74339" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="layer3" + inkscape:current-layer="svg5180" inkscape:object-nodes="true" inkscape:snap-smooth-nodes="true" inkscape:snap-object-midpoints="true" @@ -77,7 +77,10 @@ id="guide3115" />image/svg+xmlGijs de RooyMAP NOT AVAIL + style="font-size:53.3333px;line-height:1.25;fill:#ff0000">MAP NOT AVAILRANGE CHANGE diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index fffe293d..71aa55fd 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -2002,7 +2002,18 @@ canvas.NDStyles["Airbus"] = { nd.symbols.terrGroup.hide(); } } - } + }, + { + id: "nd_msg_change", + impl: { + init: func(nd, symbol), + common: func(nd) { + var chk = (nd.change_phase != 0); + if (chk) nd.symbols.nd_msg_change.show(); + else nd.symbols.nd_msg_change.hide(); + } + } + } ], # end of vector with features }; From ec429b8c8383d97fc56ec7a50008ca7467940ccb Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Wed, 24 Feb 2021 23:00:46 +0100 Subject: [PATCH 104/124] detection for GPWS alert modes --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 31 +++++++------------ Nasal/Libraries/libraries.nas | 16 ++++++++++ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 601e692c..af32eaaf 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -1,7 +1,13 @@ # See: http://wiki.flightgear.org/MapStructure # Class things: +## Airbus Terrain on ND by InuYaksa*2021 +## EGPWS device - Applicable to: MSN 0112 +## Ident.: DSC-31-45-00009586.0012001 / 22 MAY 12 +## Ident.: DSC-31-45-00009586.0009001 / 08 AUG 13 + ## inspired from work on 787-family - thanks a lots +## and a great help from legoboyvdlp var name = 'TERRAIN'; var parents = [DotSym]; @@ -13,13 +19,13 @@ var element_type = "group"; var terrain_minalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/min-altitude", 0,"INT"); var terrain_maxalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-altitude", -9999,"INT"); -var terrain_alert = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/alert", 0,"INT"); +var terrain_alert = props.globals.getNode("/instrumentation/mk-viii/outputs/alert-mode"); var tile_list = [ - nil,"tile_gl.png","tile_gh.png","tile_al.png","tile_ah.png","tile_rh.png", # 0-5 low alt - imho real ND displays likely in amber color than yellow one + nil,"tile_gl.png","tile_gh.png","tile_al.png","tile_ah.png","tile_rh.png", # 0-5 low alt - imho real ND displays as amber-ish color than yellow one "tile_gl.png","tile_gh.png","tile_gh.png","tile_gs.png", # 6-9 hi alt - "tile_ml.png","tile_cl.png", # 10 magenta - 11 cyan (water) - "tile_as.png","tile_rs.png" # 12-13 alert + "tile_ml.png","tile_cl.png", # 10 magenta - 11 cyan-ish/blue (water) + "tile_as.png","tile_rs.png" # 12-13 alert - solid colors ]; var is_terrain = 0; @@ -270,7 +276,7 @@ var init = func { setlistener("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit", func{ # detect GPWS switch status me.onfailure = getprop("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit"); - },0,0); + },1,0); }; @@ -387,17 +393,4 @@ var draw = func { } -}; - -## TODO - it doesnt work. listeners seem not to have trigged -#setlistener("instrumentation/mk-viii/outputs/discretes/gpws-warning", func { #warning - TERRAIN red - solid red -# me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning") ) ? 2 : 0 ); -# print("Terrain warning:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning")); -# print( me.terrain_alert.getValue() ); -#}); - -#setlistener("instrumentation/mk-viii/outputs/discretes/gpws-alert", func { #caution - TERRAIN amber - solid yellow -# me.terrain_alert.setValue( (getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert") ) ? 1 : 0 ); -# print("Terrain alert:" ~ getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert")); -# print( me.terrain_alert.getValue() ); -#}); \ No newline at end of file +}; \ No newline at end of file diff --git a/Nasal/Libraries/libraries.nas b/Nasal/Libraries/libraries.nas index f632f7d0..0e15b916 100644 --- a/Nasal/Libraries/libraries.nas +++ b/Nasal/Libraries/libraries.nas @@ -202,10 +202,12 @@ var systemsLoop = func(notification) { # GPWS var GPWS = { inhibitNode: props.globals.getNode("/instrumentation/mk-viii/inputs/discretes/gpws-inhibit"), + tatcfInhibit: props.globals.getNode("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit"), volume: props.globals.getNode("/instrumentation/mk-viii/speaker/volume"), flapAllOverride: props.globals.getNode("/instrumentation/mk-viii/inputs/discretes/momentary-flap-all-override"), flap3Override: props.globals.getNode("/instrumentation/mk-viii/inputs/discretes/momentary-flap-3-override"), flapOverride: props.globals.getNode("/instrumentation/mk-viii/inputs/discretes/momentary-flap-override"), + alertMode: props.globals.initNode("/instrumentation/mk-viii/outputs/alert-mode",0,"INT"), }; setlistener("/instrumentation/mk-viii/inputs/discretes/gpws-inhibit", func() { @@ -232,6 +234,20 @@ setlistener("/instrumentation/mk-viii/inputs/discretes/momentary-flap-3-override updateGPWSFlap(); }, 0, 0); +# GPWS alert pooling for get mode change - a little esoteric way but it works +var gpws_alert_watch = maketimer(0.8,func { + var alert = 0; + if (getprop("instrumentation/mk-viii/outputs/discretes/gpws-warning")) alert = 2; # MODE2 - warning - RED + else if (getprop("instrumentation/mk-viii/outputs/discretes/gpws-alert")) alert = 1; # MODE1 - caution - YELLOW + if (GPWS.alertMode.getValue()!=alert) GPWS.alertMode.setValue(alert); +}); + +setlistener("/instrumentation/mk-viii/inputs/discretes/ta-tcf-inhibit", func{ # detect GPWS switch status + var failure = GPWS.tatcfInhibit.getBoolValue(); + if (!failure) gpws_alert_watch.start(); + else gpws_alert_watch.stop(); +},1,0); + # Replay var replayState = props.globals.getNode("/sim/replay/replay-state"); setlistener("/sim/replay/replay-state", func() { From 7bc27a893ec7a983cf8a277ad73fe366488f9d63 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 25 Feb 2021 00:12:04 +0100 Subject: [PATCH 105/124] added TERR AHEAD with color --- .../ND/canvas/framework/navdisplay.nas | 2 +- Models/Instruments/ND/canvas/res/airbusND.svg | 28 +++++++++++++++---- Models/Instruments/ND/canvas/style.nas | 13 +++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 15b74107..0940b157 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -138,7 +138,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update # because things are much better configurable that way # now look up all required SVG elements and initialize member fields using the same name to have a convenient handle foreach(var element; ["dmeLDist","dmeRDist","dmeL","dmeR","vorL","vorR","vorLId","vorRId", - "status.wxr","status.wpt","status.sta","status.arpt","terrHI","terrLO"]) + "status.wxr","status.wpt","status.sta","status.arpt","terrHI","terrLO","TerrLabel","terrAhead"]) me.symbols[element] = me.nd.getElementById(element); # load elements from vector image, and create instance variables using identical names, and call updateCenter() on each diff --git a/Models/Instruments/ND/canvas/res/airbusND.svg b/Models/Instruments/ND/canvas/res/airbusND.svg index da220fa1..6770ea1f 100644 --- a/Models/Instruments/ND/canvas/res/airbusND.svg +++ b/Models/Instruments/ND/canvas/res/airbusND.svg @@ -26,13 +26,13 @@ inkscape:window-height="1017" id="namedview102" showgrid="false" - inkscape:zoom="0.77702762" - inkscape:cx="212.87887" - inkscape:cy="628.74339" + inkscape:zoom="2.197766" + inkscape:cx="933.14634" + inkscape:cy="816.83256" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="svg5180" + inkscape:current-layer="terrGroup" inkscape:object-nodes="true" inkscape:snap-smooth-nodes="true" inkscape:snap-object-midpoints="true" @@ -252,7 +252,7 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#179ab7;fill-opacity:1;stroke:none" x="954.74292" y="828.34009" - id="text1996" + id="TerrLabel" inkscape:label="#text7243">TERRAHEAD Date: Thu, 25 Feb 2021 19:06:38 +0100 Subject: [PATCH 106/124] ND range/mode change modifications, transition hides all route/vor elements --- Models/Instruments/ND/canvas/ND.nas | 30 +++++++++++++------------- Models/Instruments/ND/canvas/style.nas | 24 ++++++++++----------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 5a224a62..1c37c010 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -387,6 +387,21 @@ setlistener("sim/signals/fdm-initialized", func { canvas_nd.ND_2.NDFo.trafficGroup.setVisible(getprop("/instrumentation/efis[1]/nd/canvas-display-mode") == "PLAN" ? 0 : 1); }, 1, 0); + setlistener("/instrumentation/efis[0]/nd/display-mode", func { + startChangePhase(canvas_nd.ND_1.NDCpt,"MODE CHANGE"); + },0,0); + + setlistener("/instrumentation/efis[0]/inputs/range-nm", func { + startChangePhase(canvas_nd.ND_1.NDCpt,"RANGE CHANGE"); + },0,0); + setlistener("/instrumentation/efis[1]/nd/display-mode", func { + startChangePhase(canvas_nd.ND_2.NDFo,"MODE CHANGE"); + },0,0); + + setlistener("/instrumentation/efis[1]/inputs/range-nm", func { + startChangePhase(canvas_nd.ND_2.NDFo,"RANGE CHANGE"); + },0,0); + nd_update.start(); if (getprop("systems/acconfig/options/nd-rate") > 1) { rateApply(); @@ -439,21 +454,6 @@ var startChangePhase = func(nd,txt) { nd.change_timer.start(); } -setlistener("/instrumentation/efis[0]/nd/display-mode", func { - startChangePhase(canvas_nd.ND_1.NDCpt,"MODE CHANGE"); -},0,0); - -setlistener("/instrumentation/efis[0]/inputs/range-nm", func { - startChangePhase(canvas_nd.ND_1.NDCpt,"RANGE CHANGE"); -},0,0); -setlistener("/instrumentation/efis[1]/nd/display-mode", func { - startChangePhase(canvas_nd.ND_2.NDFo,"MODE CHANGE"); -},0,0); - -setlistener("/instrumentation/efis[1]/inputs/range-nm", func { - startChangePhase(canvas_nd.ND_2.NDFo,"RANGE CHANGE"); -},0,0); - #setlistener("/instrumentation/efis[0]/nd/terrain-on-nd", func{ # var terr_on_hd = getprop("instrumentation/efis[0]/nd/terrain-on-nd"); # var alpha = 1; diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 99f28fb7..421c5e7a 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -791,7 +791,6 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and - getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { nd.symbols.wpActiveId.setText(getprop("/FMGC/flightplan[2]/current-leg")); @@ -805,7 +804,6 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and - getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { #var cur_wp = getprop("/autopilot/route-manager/current-wp"); @@ -830,7 +828,6 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and - getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))), is_true: func(nd) { @@ -859,7 +856,7 @@ canvas.NDStyles["Airbus"] = { id: "eta", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/autopilot/route-manager/wp/eta") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) + predicate: func(nd) getprop("/autopilot/route-manager/wp/eta") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { var etaSec = getprop("/sim/time/utc/day-seconds")+ @@ -1293,9 +1290,9 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd){ - nd.get_switch("toggle_display_mode") == "MAP" and - !nd.get_switch("toggle_centered") and - ( + nd.get_switch("toggle_display_mode") == "MAP" and !nd.get_switch("toggle_centered") + and (nd.change_phase != 1) + and ( getprop(nd.options.defaults.lat_ctrl) != nd.options.defaults.managed_val or nd.get_switch("toggle_trk_line") ) @@ -1311,6 +1308,7 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.in_mode("toggle_display_mode", ["APP","VOR","MAP"]) and nd.get_switch("toggle_centered") + and (nd.change_phase != 1) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))), is_true: func(nd) { nd.symbols.trkInd2.show(); @@ -1324,7 +1322,7 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.get_switch("toggle_display_mode") == "MAP" and - nd.get_switch("toggle_centered") and + nd.get_switch("toggle_centered") and (nd.change_phase != 1) and getprop(nd.options.defaults.lat_ctrl) != nd.options.defaults.managed_val and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))), is_true: func(nd) { @@ -1337,7 +1335,7 @@ canvas.NDStyles["Airbus"] = { id:"vorCrsPtr", impl: { init: func(nd,symbol), - predicate: func(nd) (nd.in_mode("toggle_display_mode", ["APP","VOR"]) and !nd.get_switch("toggle_centered")), + predicate: func(nd) (nd.in_mode("toggle_display_mode", ["APP","VOR"]) and !nd.get_switch("toggle_centered")) and (nd.change_phase != 1), is_true: func(nd) { nd.symbols.vorCrsPtr.show(); if (is_ils) { @@ -1354,7 +1352,7 @@ canvas.NDStyles["Airbus"] = { id:"vorCrsPtr2", impl: { init: func(nd,symbol), - predicate: func(nd) (nd.in_mode("toggle_display_mode", ["APP","VOR"]) and nd.get_switch("toggle_centered")), + predicate: func(nd) (nd.in_mode("toggle_display_mode", ["APP","VOR"]) and nd.get_switch("toggle_centered")) and (nd.change_phase != 1), is_true: func(nd) { nd.symbols.vorCrsPtr2.show(); var is_ils = (nd.get_switch("toggle_display_mode") == "APP"); @@ -1381,7 +1379,7 @@ canvas.NDStyles["Airbus"] = { id: "gsDiamond", impl: { init: func(nd,symbol), - predicate: func(nd) nd.in_mode("toggle_display_mode", ["APP"]), + predicate: func(nd) nd.in_mode("toggle_display_mode", ["APP"]) and (nd.change_phase != 1), is_true: func(nd) { if(getprop("/instrumentation/nav/gs-needle-deflection-norm") != nil) nd.symbols.gsDiamond.setTranslation(getprop("/instrumentation/nav[0]/gs-needle-deflection-norm")*150,0); @@ -1449,7 +1447,7 @@ canvas.NDStyles["Airbus"] = { var ils_mode = getprop("/Flight-management/freq/ils-mode"); var has_ils = (nav_id != nil and nav_id != ""); (nd.get_switch("toggle_display_mode") == "MAP" and - !nd.get_switch("toggle_centered") and has_ils and ils_mode); + !nd.get_switch("toggle_centered") and has_ils and ils_mode and (nd.change_phase != 1)); }, is_true: func(nd) { nd.symbols.locTrkPointer.show(); @@ -1469,7 +1467,7 @@ canvas.NDStyles["Airbus"] = { var ils_mode = getprop("/Flight-management/freq/ils-mode"); var has_ils = (nav_id != nil and nav_id != ""); (nd.get_switch("toggle_display_mode") == "MAP" and - nd.get_switch("toggle_centered") and has_ils and ils_mode); + nd.get_switch("toggle_centered") and has_ils and ils_mode and (nd.change_phase != 1)); }, is_true: func(nd) { nd.symbols.locTrkPointer2.show(); From 1167faa6a8229ffe91b463477449d1c802504b12 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Thu, 25 Feb 2021 20:29:12 +0000 Subject: [PATCH 107/124] Fuel system: fix crossfeed with pumps on --- Systems/a320-fuel.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Systems/a320-fuel.xml b/Systems/a320-fuel.xml index 76648294..9267dd76 100644 --- a/Systems/a320-fuel.xml +++ b/Systems/a320-fuel.xml @@ -632,9 +632,9 @@ /systems/fuel/quantity/center-low eq 1 /systems/fuel/feed-center-2 eq 0 - /systems/fuel/feed-left-inner eq 0 /systems/fuel/feed-right-inner eq 1 /systems/fuel/valves/crossfeed-valve eq 1 + /consumables/fuel/tank[1]/level-gal_us le /consumables/fuel/tank[3]/unusable-gal_us /consumables/fuel/tank[3]/level-gal_us gt /consumables/fuel/tank[3]/unusable-gal_us propulsion/tank[5]/contents-lbs lt 9 @@ -648,9 +648,9 @@ /systems/fuel/feed-center-1 eq 0 /systems/fuel/feed-left-inner eq 1 - /systems/fuel/feed-right-inner eq 0 /systems/fuel/valves/crossfeed-valve eq 1 /consumables/fuel/tank[1]/level-gal_us gt /consumables/fuel/tank[1]/unusable-gal_us + /consumables/fuel/tank[3]/level-gal_us le /consumables/fuel/tank[3]/unusable-gal_us propulsion/tank[6]/contents-lbs lt 9 From e84d54ff90211f49b23ad9ee88fe2b025f7548c6 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Thu, 25 Feb 2021 21:50:06 +0100 Subject: [PATCH 108/124] Mode/range change - hide trkInd on transition --- Models/Instruments/ND/canvas/framework/navdisplay.nas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 0940b157..e0cf4b6d 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -576,7 +576,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec var adf1hdg = getprop("/instrumentation/adf[1]/indicated-bearing-deg"); if(!me.get_switch("toggle_centered")) { - if(me.in_mode("toggle_display_mode", ["PLAN"]) or (me.adirs_property.getValue() != 1 and (adirs_3.getValue() != 1 or att_switch.getValue() != me.attitude_heading_setting))) + if(me.in_mode("toggle_display_mode", ["PLAN"]) or (me.adirs_property.getValue() != 1 and (me.change_phase != 1) and (adirs_3.getValue() != 1 or att_switch.getValue() != me.attitude_heading_setting))) me.symbols.trkInd.hide(); else me.symbols.trkInd.show(); From e9b0938fd37f226ea3f7e963ac2d827dbaea7d44 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 27 Feb 2021 12:32:55 +0000 Subject: [PATCH 109/124] Radar altimeter: bugfix. Should use -corrected for all. --- A320-main.xml | 6 ++++-- Systems/a320-adr.xml | 2 +- Systems/a320-fwc.xml | 12 ++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index b39ecc9d..4b9cb26b 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1841,8 +1841,9 @@ 30 10 30 - 1219 + 1525 true + 0 @@ -1855,8 +1856,9 @@ 30 10 30 - 1219 + 1525 true + 0 diff --git a/Systems/a320-adr.xml b/Systems/a320-adr.xml index 8e6ce63f..2a125dcf 100644 --- a/Systems/a320-adr.xml +++ b/Systems/a320-adr.xml @@ -914,7 +914,7 @@ - + /instrumentation/radar-altimeter[1]/radar-altitude-ft 1 diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml index c683e0e0..1c08f6c3 100644 --- a/Systems/a320-fwc.xml +++ b/Systems/a320-fwc.xml @@ -2205,8 +2205,8 @@ - /instrumentation/radar-altimeter[0]/radar-altitude-ft lt 1500 - /instrumentation/radar-altimeter[1]/radar-altitude-ft lt 1500 + /instrumentation/radar-altimeter[0]/radar-altitude-ft-corrected lt 1500 + /instrumentation/radar-altimeter[1]/radar-altitude-ft-corrected lt 1500 /it-fbw/law eq 0 /ECAM/warnings/logic/stall/phase-flipflop eq 1 @@ -3015,8 +3015,8 @@ - /instrumentation/radar-altimeter[0]/radar-altitude-ft lt 750 - /instrumentation/radar-altimeter[1]/radar-altitude-ft lt 750 + /instrumentation/radar-altimeter[0]/radar-altitude-ft-corrected lt 750 + /instrumentation/radar-altimeter[1]/radar-altitude-ft-corrected lt 750 /ECAM/phases/phase-calculation/takeoff-power eq 0 @@ -3051,8 +3051,8 @@ - /instrumentation/radar-altimeter[0]/radar-altitude-ft lt 750 - /instrumentation/radar-altimeter[1]/radar-altitude-ft lt 750 + /instrumentation/radar-altimeter[0]/radar-altitude-ft-corrected lt 750 + /instrumentation/radar-altimeter[1]/radar-altitude-ft-corrected lt 750 /ECAM/phases/phase-calculation/takeoff-power eq 0 From 69969312520625e025ce1f2f5a160cd01922d85a Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Sun, 28 Feb 2021 22:22:07 +0100 Subject: [PATCH 110/124] VOR/ADF arrow and distance update --- .../ND/canvas/framework/navdisplay.nas | 42 ++++- Models/Instruments/ND/canvas/res/airbusND.svg | 172 +++++++++++------- Models/Instruments/ND/canvas/style.nas | 42 +++-- 3 files changed, 173 insertions(+), 83 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index e0cf4b6d..5ce94b90 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -82,6 +82,41 @@ var easeArrow = { } }; +var symbolFloat = { + new: func(name, nd) { + var m = {parents: [symbolFloat] }; + m.group = nd.getElementById(name); + m.expn = nd.getElementById(name ~ "1"); + m.mant = nd.getElementById(name ~ "2"); + return m; + }, + hide: func { + me.group.hide(); + }, + show: func { + me.group.show(); + }, + setText: func(txt) { + var parts = ( txt != "" ) ? split( "." , txt ) : nil; + if ( parts != nil and size(parts) == 2 ) { + me.expn.setText(parts[0]); + me.mant.setText("." ~ parts[1]); + } else { + me.expn.setText(txt); + me.mant.setText(""); + } + }, + setColor: func(r,g,b) { + me.expn.setColor(r,g,b); + me.mant.setColor(r,g,b); + }, + setFloat: func(val) { + var parts = split( "." , sprintf("%03.1f",val) ); + me.expn.setText(parts[0]); + me.mant.setText("." ~ parts[1]); + } +}; + canvas.NavDisplay.set_switch = func(s, v) { var switch = me.efis_switches[s]; if(switch == nil) return nil; @@ -137,10 +172,13 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update ### this is the "old" method that"s less flexible, we want to use the style hash instead (see above) # because things are much better configurable that way # now look up all required SVG elements and initialize member fields using the same name to have a convenient handle - foreach(var element; ["dmeLDist","dmeRDist","dmeL","dmeR","vorL","vorR","vorLId","vorRId", + foreach(var element; ["dmeL","dmeR","vorL","vorR","vorLId","vorRId", "status.wxr","status.wpt","status.sta","status.arpt","terrHI","terrLO","TerrLabel","terrAhead"]) me.symbols[element] = me.nd.getElementById(element); + foreach(var element; ["dmeLDist","dmeRDist"]) + me.symbols[element] = symbolFloat.new( element, me.nd ); + # load elements from vector image, and create instance variables using identical names, and call updateCenter() on each # anything that needs updatecenter called, should be added to the vector here # @@ -576,7 +614,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec var adf1hdg = getprop("/instrumentation/adf[1]/indicated-bearing-deg"); if(!me.get_switch("toggle_centered")) { - if(me.in_mode("toggle_display_mode", ["PLAN"]) or (me.adirs_property.getValue() != 1 and (me.change_phase != 1) and (adirs_3.getValue() != 1 or att_switch.getValue() != me.attitude_heading_setting))) + if(me.in_mode("toggle_display_mode", ["PLAN"]) or (me.adirs_property.getValue() != 1 or (me.change_phase == 1) and (adirs_3.getValue() != 1 or att_switch.getValue() != me.attitude_heading_setting))) me.symbols.trkInd.hide(); else me.symbols.trkInd.show(); diff --git a/Models/Instruments/ND/canvas/res/airbusND.svg b/Models/Instruments/ND/canvas/res/airbusND.svg index 6770ea1f..e6d4f380 100644 --- a/Models/Instruments/ND/canvas/res/airbusND.svg +++ b/Models/Instruments/ND/canvas/res/airbusND.svg @@ -26,13 +26,13 @@ inkscape:window-height="1017" id="namedview102" showgrid="false" - inkscape:zoom="2.197766" - inkscape:cx="933.14634" - inkscape:cy="816.83256" + inkscape:zoom="3.1081105" + inkscape:cx="163.03816" + inkscape:cy="979.87161" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="terrGroup" + inkscape:current-layer="layer3" inkscape:object-nodes="true" inkscape:snap-smooth-nodes="true" inkscape:snap-object-midpoints="true" @@ -80,7 +80,28 @@ id="guide3498" />image/svg+xmlGijs de RooyABCD + style="font-size:36px;line-height:1.25;text-align:end;text-anchor:end">XXXX99X VOR 1 + x="39.859375" + y="919.5495">VOR 1 NM + 99.9 -ABC + x="39.9375" + y="956.56171">ABC VOR 2 NM -99.9 + ABC @@ -1300,16 +1299,8 @@ sodipodi:role="line" style="font-size:32px;line-height:125%;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#af0063;fill-opacity:1">999.99 999999999.9999.9 Date: Sun, 28 Feb 2021 22:22:36 +0100 Subject: [PATCH 111/124] Peak level terrain update --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 70 ++++++++++++------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index af32eaaf..858d96fe 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -18,6 +18,7 @@ var element_type = "group"; var terrain_minalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/min-altitude", 0,"INT"); var terrain_maxalt = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-altitude", -9999,"INT"); +var terrain_maxcol = props.globals.initNode("/instrumentation/efis[0]/nd/terrain-on-nd/max-color", 0,"INT"); # 0= grn, 1= yel, 2= red var terrain_alert = props.globals.getNode("/instrumentation/mk-viii/outputs/alert-mode"); @@ -174,6 +175,15 @@ var update_altitudes = func { me.terrain_minalt.setValue(me.min_altitude); me.terrain_maxalt.setValue(me.max_altitude); + var altdif = me.max_altitude - me.refaltitudeft; + if (altdif <= 0) { + if (altdif >= me.reflowaltft) me.terrain_maxcol.setValue(1); + else me.terrain_maxcol.setValue(0); + } else { + if (altdif>2000) me.terrain_maxcol.setValue(2); + else me.terrain_maxcol.setValue(1); + } + if (me.avg_minalt == 9999) { me.avg_minalt = me.min_altitude; me.avg_maxalt = me.max_altitude; @@ -186,13 +196,13 @@ var update_altitudes = func { if (me.onground == 0 and (me.max_altitude + 250) < me.refaltitudeft) { # 250 ft tollerance me.hialtmode = 1; - var range = math.min(2000,(me.avg_maxalt - me.avg_minalt)); - if (range < 400) { + var range = math.min(2400,(me.avg_maxalt - me.avg_minalt)) - 400; + if (range < 1900) { # min elev number me.bands_range = 0; } else { - me.bands_range = math.max(200,math.round(range / 4)); + me.bands_range = int(range / 4); me.bands_maxalt = me.avg_maxalt; - me.bands_minalt = math.max( me.avg_maxalt - range , me.avg_minalt + 400 ); + me.bands_minalt = math.max( me.avg_maxalt - range, me.avg_minalt + 400 ); } } else { me.hialtmode = 0; @@ -226,6 +236,7 @@ var init = func { me.max_altitude = -9999; me.avg_minalt = 9999; me.avg_maxalt = -9999; + me.maxalt_col = 0; # 0 = grn, 1 = yel, 2 = red me.bands_minalt = 0; me.bands_maxalt = 0; me.bands_range = 0; @@ -314,6 +325,9 @@ var draw = func { if (me.layer.display_changed == 1) { me.layer.display_changed = 0; me.clear(); + me.min_altitude = 9999; + me.max_altitude = -9999; + terrain_maxalt.setValue(-9999); me.reference = nil; } @@ -325,21 +339,22 @@ var draw = func { me.refheading = getprop("orientation/heading-magnetic-deg"); - var refalt = int(ref.alt() * 3.2808399); + var refalt = int(getprop("/position/altitude-ft")); #int(ref.alt() * 3.2808399); me.refaltitudeft = refalt; + me.groundaltft = int(getprop("/position/ground-elev-ft")); me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; - me.onground = getprop("/gear/gear[0]/wow"); + me.onground = pts.Gear.wow[0].getValue(); var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); if (vspeed30s<-500) me.refaltitudeft += vspeed30s; if (me.min_altitude != 9999) me.update_altitudes(); - - if (fmgc.FMGCInternal.phase < 2) { - if (me.basealtitudeft == nil) { # starting at phase < 2 - me.basealtitudeft = refalt + 400; - me.checkarrival = 1; - print("set REFALT [pref]: "~me.basealtitudeft); - } + + if (me.basealtitudeft == nil) { # first basealt set + me.basealtitudeft = me.groundaltft + 400; + me.checkarrival = 1; + print("set REFALT [init]: "~me.basealtitudeft); + #} else if (fmgc.FMGCInternal.phase < 2) { # starting at phase < 2 + # nothing to do } else if (fmgc.FMGCInternal.phase == 5) { if (me.checkarrival == 1) { me.checkarrival = 0; @@ -361,19 +376,26 @@ var draw = func { } else if (fmgc.FMGCInternal.phase == 7) { if (me.checkarrival == 0) { me.checkarrival = 1; - me.basealtitudeft = refalt + 400; + me.basealtitudeft = me.groundaltft + 400; print("set REFALT [done]: "~me.basealtitudeft); } - } else { - if (me.basealtitudeft > me.avg_maxalt) { - if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number - else me.basealtitudeft = int(400 + me.avg_minalt); - print("set REFALT [blwmin]: "~me.basealtitudeft); - } - else if (me.basealtitudeft == 0 and me.avg_maxalt >= 1000) { # 1000ft min elev number - me.basealtitudeft = int(400 + me.avg_minalt); - print("set REFALT [abvmin]: "~me.basealtitudeft); - } + } else if (fmgc.FMGCInternal.phase == 2) { + var expdaltft = me.groundaltft + 400; + if (me.basealtitudeft > expdaltft) { + me.basealtitudeft = expdaltft; + print("set REFALT [blwbase]: "~me.basealtitudeft); + } + } else if (fmgc.FMGCInternal.phase >= 2) { + me.basealtitudeft = math.avg(me.basealtitudeft,400 + me.groundaltft,int(400 + me.avg_minalt)); + #if (me.basealtitudeft > me.avg_maxalt) { + # if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number + # else me.basealtitudeft = int(400 + me.avg_minalt); + # print("set REFALT [blwmin]: "~me.basealtitudeft); + #} + #else if (me.basealtitudeft == 0 and me.avg_maxalt >= 1000) { # 1000ft min elev number + # me.basealtitudeft = int(400 + me.avg_minalt); + # print("set REFALT [abvmin]: "~me.basealtitudeft); + #} } } From d53003e43d2511ba2b91af1d5044d02effa34463 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 1 Mar 2021 21:41:29 +0100 Subject: [PATCH 112/124] green arrows for ADF on ND --- .../ND/canvas/framework/navdisplay.nas | 12 +++++-- Models/Instruments/ND/canvas/res/airbusND.svg | 34 +++++++++++-------- Models/Instruments/ND/canvas/style.nas | 26 ++++++++------ 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 5ce94b90..f42d5eda 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -167,6 +167,9 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update foreach(var feature; me.nd_style.features ) { me.symbols[feature.id] = me.nd.getElementById(feature.id).updateCenter(); if(contains(feature.impl,"init")) feature.impl.init(me.nd, feature); # call The element"s init code (i.e. updateCenter) + if(contains(feature.impl,"changed_only")) { + if (feature.impl.changed_only == 1) feature.last_predicate = nil; + } } ### this is the "old" method that"s less flexible, we want to use the style hash instead (see above) @@ -190,7 +193,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update foreach(var element; ["staArrowL2","staArrowR2","staArrowL","staArrowR"] ) me.symbols[element] = easeArrow.new( me.nd.getElementById(element).updateCenter() ); - + me.map = me.nd.createChild("map","map") .set("clip", "rect(124, 1024, 1024, 0)") .set("screen-range", 700) @@ -736,7 +739,12 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if (contains(feature.impl, "common")) feature.impl.common(me); # conditional stuff if(!contains(feature.impl, "predicate")) continue; # no conditional stuff - if ( var result = feature.impl.predicate(me) ) + var result = feature.impl.predicate(me); + if (contains(feature, "last_predicate")) { + if (feature.last_predicate != nil and feature.last_predicate == result) continue; + feature.last_predicate = result; + } + if ( result ) feature.impl.is_true(me, result); # pass the result to the predicate else feature.impl.is_false( me, result ); # pass the result to the predicate diff --git a/Models/Instruments/ND/canvas/res/airbusND.svg b/Models/Instruments/ND/canvas/res/airbusND.svg index e6d4f380..4483d085 100644 --- a/Models/Instruments/ND/canvas/res/airbusND.svg +++ b/Models/Instruments/ND/canvas/res/airbusND.svg @@ -27,12 +27,12 @@ id="namedview102" showgrid="false" inkscape:zoom="3.1081105" - inkscape:cx="163.03816" - inkscape:cy="979.87161" + inkscape:cx="454.60496" + inkscape:cy="542.30673" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="layer3" + inkscape:current-layer="unavailARC" inkscape:object-nodes="true" inkscape:snap-smooth-nodes="true" inkscape:snap-object-midpoints="true" @@ -101,7 +101,10 @@ id="guide1327" />image/svg+xmlGijs de Rooy000NM @@ -1039,36 +1042,36 @@ inkscape:label="#text7243" id="vorR" y="919.5495" - x="884.85938" + x="883.85938" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#0dc04b;fill-opacity:1;stroke:none" xml:space="preserve">VOR 2 NM ABC @@ -1415,7 +1418,8 @@ style="display:inline;fill:none;stroke:#cecdce;stroke-width:3.28819;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 23.634,896.5254 v 7.83228 m 1.26e-4,24.4977 v 24.41763 M 23.634,903.63377 8.682512,928.85538 H 23.634 l 14.467869,0.21255 z" sodipodi:nodetypes="ccccccccc" />.9 Date: Mon, 1 Mar 2021 21:42:28 +0100 Subject: [PATCH 113/124] show terrr for almost flat peak areas --- Models/Instruments/ND/canvas/map/TERRAIN.symbol | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 858d96fe..820b7c5f 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -194,6 +194,8 @@ var update_altitudes = func { me.avg_maxalt = math.round((me.avg_maxalt * 2 + me.max_altitude) / 3); } + me.avg_peakalt = me.avg_maxalt - me.avg_minalt; + if (me.onground == 0 and (me.max_altitude + 250) < me.refaltitudeft) { # 250 ft tollerance me.hialtmode = 1; var range = math.min(2400,(me.avg_maxalt - me.avg_minalt)) - 400; @@ -236,6 +238,7 @@ var init = func { me.max_altitude = -9999; me.avg_minalt = 9999; me.avg_maxalt = -9999; + me.avg_peakalt = 0; me.maxalt_col = 0; # 0 = grn, 1 = yel, 2 = red me.bands_minalt = 0; me.bands_maxalt = 0; @@ -344,11 +347,12 @@ var draw = func { me.groundaltft = int(getprop("/position/ground-elev-ft")); me.reflowaltft = (pts.Gear.position[1].getValue()) ? -250 : -500; me.onground = pts.Gear.wow[0].getValue(); - var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); - if (vspeed30s<-500) me.refaltitudeft += vspeed30s; if (me.min_altitude != 9999) me.update_altitudes(); + var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); + if (vspeed30s<-500) me.refaltitudeft = math.max(me.avg_minalt , me.refaltitudeft + vspeed30s); + if (me.basealtitudeft == nil) { # first basealt set me.basealtitudeft = me.groundaltft + 400; me.checkarrival = 1; @@ -380,13 +384,15 @@ var draw = func { print("set REFALT [done]: "~me.basealtitudeft); } } else if (fmgc.FMGCInternal.phase == 2) { - var expdaltft = me.groundaltft + 400; + var expdaltft = me.groundaltft; + expdaltft += (me.avg_peakalt>400) ? 400 : 160; if (me.basealtitudeft > expdaltft) { me.basealtitudeft = expdaltft; print("set REFALT [blwbase]: "~me.basealtitudeft); } - } else if (fmgc.FMGCInternal.phase >= 2) { - me.basealtitudeft = math.avg(me.basealtitudeft,400 + me.groundaltft,int(400 + me.avg_minalt)); + } else if (fmgc.FMGCInternal.phase >= 2) { + var flatalt = (me.avg_peakalt>400) ? 400 : 160; + me.basealtitudeft = math.avg(me.basealtitudeft,flatalt + me.groundaltft,int(flatalt + me.avg_minalt)); #if (me.basealtitudeft > me.avg_maxalt) { # if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number # else me.basealtitudeft = int(400 + me.avg_minalt); From 24c90ebe935c9bb5be56e96e3daed1619c659097 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 1 Mar 2021 23:56:26 +0100 Subject: [PATCH 114/124] fix for VOR/ADF --- Models/Instruments/ND/canvas/framework/navdisplay.nas | 2 +- Models/Instruments/ND/canvas/style.nas | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index f42d5eda..6206df3a 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -550,7 +550,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec me.symbols.vorR.setText("ADF R"); me.symbols.vorR.setColor(0,0.6,0.85); me.symbols.dmeR.setText(""); - me.symbols.dmeR.setColor(0,0.6,0.85); + #me.symbols.dmeR.setColor(0,0.6,0.85); if((var navident=getprop("/instrumentation/adf[1]/ident")) != "") me.symbols.vorRId.setText(navident); else me.symbols.vorRId.setText(sprintf("%3d",getprop("/instrumentation/adf[1]/frequencies/selected-khz"))); diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index c4af0a96..2417a044 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -1623,7 +1623,7 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.get_switch("toggle_lh_vor_adf") != 0), - changed_only: 1, + #changed_only: 1, is_true: func(nd) { nd.symbols.dmeL.show(); if(nd.get_switch("toggle_lh_vor_adf") < 0){ @@ -1639,7 +1639,7 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorLId.setColor(1,1,1); #nd.symbols.dmeLDist.setColor(1,1,1); nd.symbols.dmeL.setText("NM"); - #nd.symbols.dmeL.setColor(0,0.59,0.8); + nd.symbols.dmeL.setColor(0,0.59,0.8); } }, is_false: func(nd){ @@ -1652,7 +1652,7 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.get_switch("toggle_rh_vor_adf") != 0), - changed_only: 1, + #changed_only: 1, is_true: func(nd) { if(nd.get_switch("toggle_rh_vor_adf") < 0){ nd.symbols.vorR.setText("ADF 2"); @@ -1666,7 +1666,7 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorRId.setColor(1,1,1); #nd.symbols.dmeRDist.setColor(1,1,1); nd.symbols.dmeR.setText("NM"); - #nd.symbols.dmeR.setColor(0,0.59,0.8); + nd.symbols.dmeR.setColor(0,0.59,0.8); } }, is_false: func(nd){ From 4937aa8b69c216b7e8e036765b25aad0a6fec376 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Mon, 1 Mar 2021 23:57:03 +0100 Subject: [PATCH 115/124] better flats detection --- .../Instruments/ND/canvas/map/TERRAIN.symbol | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 820b7c5f..5cba9888 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -238,7 +238,7 @@ var init = func { me.max_altitude = -9999; me.avg_minalt = 9999; me.avg_maxalt = -9999; - me.avg_peakalt = 0; + me.avg_peakalt = nil; me.maxalt_col = 0; # 0 = grn, 1 = yel, 2 = red me.bands_minalt = 0; me.bands_maxalt = 0; @@ -350,26 +350,33 @@ var draw = func { if (me.min_altitude != 9999) me.update_altitudes(); + var flatalt = (me.avg_peakalt != nil and me.avg_peakalt<500) ? 140 : 400; + var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); if (vspeed30s<-500) me.refaltitudeft = math.max(me.avg_minalt , me.refaltitudeft + vspeed30s); if (me.basealtitudeft == nil) { # first basealt set - me.basealtitudeft = me.groundaltft + 400; + me.basealtitudeft = me.groundaltft + flatalt; + me.flatalt = flatalt; me.checkarrival = 1; print("set REFALT [init]: "~me.basealtitudeft); - #} else if (fmgc.FMGCInternal.phase < 2) { # starting at phase < 2 - # nothing to do + } else if (fmgc.FMGCInternal.phase < 2) { # starting at phase < 2 + if (me.flatalt != flatalt) { + me.basealtitudeft = me.groundaltft + flatalt; + me.flatalt = flatalt; + print("set REFALT [flat]: "~me.basealtitudeft); + } } else if (fmgc.FMGCInternal.phase == 5) { if (me.checkarrival == 1) { me.checkarrival = 0; me.basealtitudeft = nil; if (fmgc.FMGCInternal.arrApt != nil) { var airport = airportinfo(fmgc.FMGCInternal.arrApt); - if (airport != nil) me.basealtitudeft = 400 + int(airport.elevation * M2FT); + if (airport != nil) me.basealtitudeft = flatalt + int(airport.elevation * M2FT); print("set REFALT [arrApt]: "~me.basealtitudeft); } if (me.basealtitudeft == nil) { - me.basealtitudeft = 400 + me.avg_minalt; # that's fun + me.basealtitudeft = flatalt + me.avg_minalt; # that's fun } } } else if (fmgc.FMGCInternal.phase == 6) { @@ -380,18 +387,16 @@ var draw = func { } else if (fmgc.FMGCInternal.phase == 7) { if (me.checkarrival == 0) { me.checkarrival = 1; - me.basealtitudeft = me.groundaltft + 400; + me.basealtitudeft = me.groundaltft + flatalt; print("set REFALT [done]: "~me.basealtitudeft); } } else if (fmgc.FMGCInternal.phase == 2) { - var expdaltft = me.groundaltft; - expdaltft += (me.avg_peakalt>400) ? 400 : 160; + var expdaltft = me.groundaltft + flatalt; if (me.basealtitudeft > expdaltft) { me.basealtitudeft = expdaltft; print("set REFALT [blwbase]: "~me.basealtitudeft); } } else if (fmgc.FMGCInternal.phase >= 2) { - var flatalt = (me.avg_peakalt>400) ? 400 : 160; me.basealtitudeft = math.avg(me.basealtitudeft,flatalt + me.groundaltft,int(flatalt + me.avg_minalt)); #if (me.basealtitudeft > me.avg_maxalt) { # if (me.avg_maxalt < 1000) me.basealtitudeft = 0; # 1000ft min elev number From 23b36c9cac9a6aff65f0f723f05f5b4a55be39b3 Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 2 Mar 2021 19:03:48 +0100 Subject: [PATCH 116/124] TERR reposition --- Models/Instruments/ND/canvas/res/airbusND.svg | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Models/Instruments/ND/canvas/res/airbusND.svg b/Models/Instruments/ND/canvas/res/airbusND.svg index 4483d085..8197f17a 100644 --- a/Models/Instruments/ND/canvas/res/airbusND.svg +++ b/Models/Instruments/ND/canvas/res/airbusND.svg @@ -27,12 +27,12 @@ id="namedview102" showgrid="false" inkscape:zoom="3.1081105" - inkscape:cx="454.60496" - inkscape:cy="542.30673" + inkscape:cx="904.96427" + inkscape:cy="819.41055" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:current-layer="unavailARC" + inkscape:current-layer="terrGroup" inkscape:object-nodes="true" inkscape:snap-smooth-nodes="true" inkscape:snap-object-midpoints="true" @@ -273,65 +273,65 @@ id="terrGroup" transform="translate(-9.356522,-6.2275037)">TERRAHEADTERRTERR000000TERRAHEAD Date: Tue, 2 Mar 2021 19:04:53 +0100 Subject: [PATCH 117/124] mode/range change show/hide phases make a little short --- Models/Instruments/ND/canvas/ND.nas | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Models/Instruments/ND/canvas/ND.nas b/Models/Instruments/ND/canvas/ND.nas index 1c37c010..5fe845d3 100644 --- a/Models/Instruments/ND/canvas/ND.nas +++ b/Models/Instruments/ND/canvas/ND.nas @@ -181,13 +181,14 @@ var canvas_nd_base = { }; var ND_change_timer_fn = func { - me.change_phase += 1; - if (me.change_phase>2) { # phase 3 + #me.change_phase += 1; + #if (me.change_phase>2) { # phase 3 - only for older ND? + #if (me.change_phase>1) { # phase 2 hide me.change_timer.stop(); me.change_phase = 0; - } else { + #} else { me.map.setVisible(1); # phase 2 - } + #} }; var canvas_ND_1 = { @@ -201,7 +202,7 @@ var canvas_ND_1 = { me.NDCpt.adirs_property = props.globals.getNode("/instrumentation/efis[0]/nd/ir-1",1); me.NDCpt.newMFD(canvas_group); me.NDCpt.change_phase = 0; - me.NDCpt.change_timer = maketimer(0.4,me.NDCpt,ND_change_timer_fn); + me.NDCpt.change_timer = maketimer(0.6,me.NDCpt,ND_change_timer_fn); me.NDCpt.update(); return m; From f3195ab41fa8608fd23946342302f3ac3bdbbbee Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Tue, 2 Mar 2021 22:18:57 +0100 Subject: [PATCH 118/124] fix for empty current leg (not nil) --- Models/Instruments/ND/canvas/style.nas | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 2417a044..4d9a8b6c 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -792,7 +792,7 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveId", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { nd.symbols.wpActiveId.setText(getprop("/FMGC/flightplan[2]/current-leg")); @@ -805,7 +805,7 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveCrs", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { #var cur_wp = getprop("/autopilot/route-manager/current-wp"); @@ -829,7 +829,7 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveDist", impl: { init: func(nd,symbol), - predicate: func(nd) (getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and + predicate: func(nd) (getprop("/FMGC/flightplan[2]/current-leg") != "" and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))), is_true: func(nd) { @@ -844,7 +844,7 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveDistLbl", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { nd.symbols.wpActiveDistLbl.show(); @@ -917,7 +917,8 @@ canvas.NDStyles["Airbus"] = { id:"hdgBug2ValR", #"hdgBug2ValL"", impl: { init: func(nd,symbol), - predicate: func(nd) nd.in_mode("toggle_display_mode", ["MAP"]) and !nd.get_switch("toggle_centered"), + predicate: func(nd) nd.in_mode("toggle_display_mode", ["MAP"]) and !nd.get_switch("toggle_centered") and + (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { var bugRot = vhdg_bug.getValue(); var diffRot = (bugRot>=nd.userHdgTrk) ? (bugRot-nd.userHdgTrk) : (360+bugRot-nd.userHdgTrk); @@ -935,7 +936,8 @@ canvas.NDStyles["Airbus"] = { id:"hdgBug2ValL", impl: { init: func(nd,symbol), - predicate: func(nd) nd.in_mode("toggle_display_mode", ["MAP"]) and !nd.get_switch("toggle_centered"), + predicate: func(nd) nd.in_mode("toggle_display_mode", ["MAP"]) and !nd.get_switch("toggle_centered") and + (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { var bugRot = vhdg_bug.getValue(); var diffRot = (bugRot>nd.userHdgTrk) ? (360+nd.userHdgTrk-bugRot) : (nd.userHdgTrk-bugRot); @@ -2034,10 +2036,13 @@ canvas.NDStyles["Airbus"] = { id: "nd_msg_change", impl: { init: func(nd, symbol), - common: func(nd) { - var chk = (nd.change_phase != 0); - if (chk) nd.symbols.nd_msg_change.show(); - else nd.symbols.nd_msg_change.hide(); + predicate: func(nd) ( (nd.change_phase != 0) and + (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)) ), + is_true: func(nd) { + nd.symbols.nd_msg_change.show(); + }, + is_false: func(nd) { + nd.symbols.nd_msg_change.hide(); } } } From 164726c3717abe854e3385f14c49497af2febe8c Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Wed, 3 Mar 2021 22:34:38 +0100 Subject: [PATCH 119/124] Update on terrain (low peak) and fix on VOR/ADF NM --- .../ND/canvas/framework/navdisplay.nas | 28 ++++++------------- .../Instruments/ND/canvas/map/TERRAIN.symbol | 6 ++-- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas index 6206df3a..01569ad3 100644 --- a/Models/Instruments/ND/canvas/framework/navdisplay.nas +++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas @@ -82,9 +82,9 @@ var easeArrow = { } }; -var symbolFloat = { +var symbolDistNM = { new: func(name, nd) { - var m = {parents: [symbolFloat] }; + var m = {parents: [symbolDistNM] }; m.group = nd.getElementById(name); m.expn = nd.getElementById(name ~ "1"); m.mant = nd.getElementById(name ~ "2"); @@ -167,9 +167,6 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update foreach(var feature; me.nd_style.features ) { me.symbols[feature.id] = me.nd.getElementById(feature.id).updateCenter(); if(contains(feature.impl,"init")) feature.impl.init(me.nd, feature); # call The element"s init code (i.e. updateCenter) - if(contains(feature.impl,"changed_only")) { - if (feature.impl.changed_only == 1) feature.last_predicate = nil; - } } ### this is the "old" method that"s less flexible, we want to use the style hash instead (see above) @@ -180,7 +177,10 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update me.symbols[element] = me.nd.getElementById(element); foreach(var element; ["dmeLDist","dmeRDist"]) - me.symbols[element] = symbolFloat.new( element, me.nd ); + me.symbols[element] = symbolDistNM.new( element, me.nd ); + + me.symbols.dmeLDist.setColor(0.195,0.96,0.097); + me.symbols.dmeRDist.setColor(0.195,0.96,0.097); # load elements from vector image, and create instance variables using identical names, and call updateCenter() on each # anything that needs updatecenter called, should be added to the vector here @@ -487,11 +487,6 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if(wxr_live_enabled == nil or wxr_live_enabled == '') wxr_live_enabled = 0; me.set_switch('toggle_weather_live', wxr_live_enabled); - - #var terr_enabled = getprop("/controls/switches/terr_on_nd_l"); - #if (terr_enabled == nil) terr_enabled = 0; - #if (me.get_switch('toggle_terrain') != terr_enabled) me.set_switch('toggle_terrain', terr_enabled); - call(me.update_sub, nil, nil, caller(0)[0]); # call this in the same namespace to "steal" its variables # MapStructure update! @@ -550,7 +545,7 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec me.symbols.vorR.setText("ADF R"); me.symbols.vorR.setColor(0,0.6,0.85); me.symbols.dmeR.setText(""); - #me.symbols.dmeR.setColor(0,0.6,0.85); + me.symbols.dmeR.setColor(0,0.6,0.85); if((var navident=getprop("/instrumentation/adf[1]/ident")) != "") me.symbols.vorRId.setText(navident); else me.symbols.vorRId.setText(sprintf("%3d",getprop("/instrumentation/adf[1]/frequencies/selected-khz"))); @@ -739,13 +734,8 @@ canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft spec if (contains(feature.impl, "common")) feature.impl.common(me); # conditional stuff if(!contains(feature.impl, "predicate")) continue; # no conditional stuff - var result = feature.impl.predicate(me); - if (contains(feature, "last_predicate")) { - if (feature.last_predicate != nil and feature.last_predicate == result) continue; - feature.last_predicate = result; - } - if ( result ) - feature.impl.is_true(me, result); # pass the result to the predicate + if ( var result=feature.impl.predicate(me) ) + feature.impl.is_true(me, result); # pass the result to the predicate else feature.impl.is_false( me, result ); # pass the result to the predicate } diff --git a/Models/Instruments/ND/canvas/map/TERRAIN.symbol b/Models/Instruments/ND/canvas/map/TERRAIN.symbol index 5cba9888..6d226040 100644 --- a/Models/Instruments/ND/canvas/map/TERRAIN.symbol +++ b/Models/Instruments/ND/canvas/map/TERRAIN.symbol @@ -184,7 +184,7 @@ var update_altitudes = func { else me.terrain_maxcol.setValue(1); } - if (me.avg_minalt == 9999) { + if (me.min_altitude == 9999) { me.avg_minalt = me.min_altitude; me.avg_maxalt = me.max_altitude; } else { @@ -199,7 +199,7 @@ var update_altitudes = func { if (me.onground == 0 and (me.max_altitude + 250) < me.refaltitudeft) { # 250 ft tollerance me.hialtmode = 1; var range = math.min(2400,(me.avg_maxalt - me.avg_minalt)) - 400; - if (range < 1900) { # min elev number + if (range < 400) { # min elev number me.bands_range = 0; } else { me.bands_range = int(range / 4); @@ -350,7 +350,7 @@ var draw = func { if (me.min_altitude != 9999) me.update_altitudes(); - var flatalt = (me.avg_peakalt != nil and me.avg_peakalt<500) ? 140 : 400; + var flatalt = (me.avg_peakalt != nil and me.avg_peakalt>499) ? 400 : 140; var vspeed30s = int(getprop("velocities/vertical-speed-fps") * 30); if (vspeed30s<-500) me.refaltitudeft = math.max(me.avg_minalt , me.refaltitudeft + vspeed30s); From 430746b590cc400a8fb818c6846949ac2019144c Mon Sep 17 00:00:00 2001 From: Inuyaksa Date: Wed, 3 Mar 2021 22:54:43 +0100 Subject: [PATCH 120/124] vor/adf fix and 000 at ND fresh start --- Models/Instruments/ND/canvas/style.nas | 54 ++++++++++++-------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/Models/Instruments/ND/canvas/style.nas b/Models/Instruments/ND/canvas/style.nas index 4d9a8b6c..037ebaf4 100644 --- a/Models/Instruments/ND/canvas/style.nas +++ b/Models/Instruments/ND/canvas/style.nas @@ -792,7 +792,8 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveId", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and + getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { nd.symbols.wpActiveId.setText(getprop("/FMGC/flightplan[2]/current-leg")); @@ -805,7 +806,8 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveCrs", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and + getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { #var cur_wp = getprop("/autopilot/route-manager/current-wp"); @@ -829,7 +831,8 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveDist", impl: { init: func(nd,symbol), - predicate: func(nd) (getprop("/FMGC/flightplan[2]/current-leg") != "" and + predicate: func(nd) (getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and + getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))), is_true: func(nd) { @@ -844,7 +847,7 @@ canvas.NDStyles["Airbus"] = { id: "wpActiveDistLbl", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != "" and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) + predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { nd.symbols.wpActiveDistLbl.show(); @@ -858,7 +861,7 @@ canvas.NDStyles["Airbus"] = { id: "eta", impl: { init: func(nd,symbol), - predicate: func(nd) getprop("/autopilot/route-manager/wp/eta") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) + predicate: func(nd) getprop("/autopilot/route-manager/wp/eta") != nil and getprop("/FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting)), is_true: func(nd) { var etaSec = getprop("/sim/time/utc/day-seconds")+ @@ -1625,7 +1628,6 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.get_switch("toggle_lh_vor_adf") != 0), - #changed_only: 1, is_true: func(nd) { nd.symbols.dmeL.show(); if(nd.get_switch("toggle_lh_vor_adf") < 0){ @@ -1634,15 +1636,14 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorLId.setColor(0.195,0.96,0.097); #nd.symbols.dmeLDist.setColor(0.195,0.96,0.097); nd.symbols.dmeL.setText(""); - } - else{ + } else { nd.symbols.vorL.setText("VOR 1"); nd.symbols.vorL.setColor(1,1,1); nd.symbols.vorLId.setColor(1,1,1); #nd.symbols.dmeLDist.setColor(1,1,1); nd.symbols.dmeL.setText("NM"); - nd.symbols.dmeL.setColor(0,0.59,0.8); } + nd.symbols.dmeL.setColor(0,0.59,0.8); }, is_false: func(nd){ nd.symbols.dmeL.hide(); @@ -1654,13 +1655,12 @@ canvas.NDStyles["Airbus"] = { impl: { init: func(nd,symbol), predicate: func(nd) (nd.get_switch("toggle_rh_vor_adf") != 0), - #changed_only: 1, - is_true: func(nd) { + is_true: func(nd) { + nd.symbols.dmeR.show(); if(nd.get_switch("toggle_rh_vor_adf") < 0){ nd.symbols.vorR.setText("ADF 2"); nd.symbols.vorR.setColor(0.195,0.96,0.097); nd.symbols.vorRId.setColor(0.195,0.96,0.097); - #nd.symbols.dmeRDist.setColor(0.195,0.96,0.097); nd.symbols.dmeR.setText(""); } else { nd.symbols.vorR.setText("VOR 2"); @@ -1668,8 +1668,8 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorRId.setColor(1,1,1); #nd.symbols.dmeRDist.setColor(1,1,1); nd.symbols.dmeR.setText("NM"); - nd.symbols.dmeR.setColor(0,0.59,0.8); } + nd.symbols.dmeR.setColor(0,0.59,0.8); }, is_false: func(nd){ nd.symbols.dmeR.hide(); @@ -1705,12 +1705,10 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorLId.setText(navID); else nd.symbols.vorLId.setText(frq); - if(getprop(dme~ "in-range")){ - nd.symbols.dmeLDist.setText(sprintf("%3.1f",dst)); - } - else { - nd.symbols.dmeLDist.setText(" ---"); - } + if(getprop(dme~ "in-range")) + nd.symbols.dmeLDist.setText(sprintf("%3.1f", + dst)); + else nd.symbols.dmeLDist.setText(" ---"); } }, is_false: func(nd){ @@ -1724,11 +1722,11 @@ canvas.NDStyles["Airbus"] = { id:"vorLSym", impl: { init: func(nd,symbol), - predicate: func(nd) (nd.get_switch("toggle_lh_vor_adf") != 0), + predicate: func(nd) (nd.get_switch("toggle_lh_vor_adf") != 0), is_true: func(nd) { if (nd.get_switch("toggle_lh_vor_adf") < 0) nd.symbols.vorLSym.setColor(0.195,0.96,0.097); else nd.symbols.vorLSym.setColor(1,1,1); - nd.symbols.vorLSym.show(); + nd.symbols.vorLSym.show(); }, is_false: func(nd){ nd.symbols.vorLSym.hide(); @@ -1764,12 +1762,10 @@ canvas.NDStyles["Airbus"] = { nd.symbols.vorRId.setText(navID); else nd.symbols.vorRId.setText(frq); - if(getprop(dme~ "in-range")){ - nd.symbols.dmeRDist.setText(sprintf("%3.1f",dst)); - } - else { - nd.symbols.dmeRDist.setText(" ---"); - } + if(getprop(dme~ "in-range")) + nd.symbols.dmeRDist.setText(sprintf("%3.1f", + dst)); + else nd.symbols.dmeRDist.setText(" ---"); } }, is_false: func(nd){ @@ -1783,7 +1779,7 @@ canvas.NDStyles["Airbus"] = { id:"vorRSym", impl: { init: func(nd,symbol), - predicate: func(nd) (nd.get_switch("toggle_rh_vor_adf") != 0), + predicate: func(nd) (nd.get_switch("toggle_rh_vor_adf") != 0), is_true: func(nd) { if (nd.get_switch("toggle_rh_vor_adf") < 0) nd.symbols.vorRSym.setColor(0.195,0.96,0.097); else nd.symbols.vorRSym.setColor(1,1,1); @@ -2045,7 +2041,7 @@ canvas.NDStyles["Airbus"] = { nd.symbols.nd_msg_change.hide(); } } - } + } ], # end of vector with features }; From e1c538299ef92b354ad587021e76ddbbcfc0992d Mon Sep 17 00:00:00 2001 From: fly Date: Sat, 6 Mar 2021 07:30:29 +1100 Subject: [PATCH 121/124] Fixed broken VHF data mode Signed-off-by: fly --- A320-main.xml | 2 +- Nasal/Panels/rmp.nas | 101 ++++++++++++++++++++++++------------------- 2 files changed, 57 insertions(+), 46 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index 4b9cb26b..ba739759 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1653,7 +1653,7 @@ - 0 + 121.5 123.2 true diff --git a/Nasal/Panels/rmp.nas b/Nasal/Panels/rmp.nas index 06b77d17..2f661011 100644 --- a/Nasal/Panels/rmp.nas +++ b/Nasal/Panels/rmp.nas @@ -96,6 +96,9 @@ var am_mode_rmp3 = props.globals.initNode("/systems/radio/rmp[2]/am-active", 0, var sel_crs_rmp1 = props.globals.initNode("/systems/radio/rmp[0]/select-crs", 1, "BOOL"); var sel_crs_rmp2 = props.globals.initNode("/systems/radio/rmp[1]/select-crs", 1, "BOOL"); +var vhf3_data_mode = props.globals.initNode("/systems/radio/vhf3-data-mode", 1, "BOOL"); +var data_mode_stby_rmp = props.globals.initNode("/systems/radio/data-mode-stby-rmp", 0, "INT"); + var init = func() { chan_rmp1.setValue("vhf1"); chan_rmp2.setValue("vhf2"); @@ -153,57 +156,52 @@ var update_active_vhf = func(vhf) { var sel3 = chan_rmp3.getValue(); if (vhf == 1) { - if (sel1 == "vhf1" or sel2 == "vhf1") { - var act = sprintf("%3.3f", act_vhf1.getValue()); + var act = sprintf("%3.3f", act_vhf1.getValue()); - if (sel1 == "vhf1") { - act_display_rmp1.setValue(act); - } - if (sel2 == "vhf1") { - act_display_rmp2.setValue(act); - } - if (sel3 == "vhf1") { - act_display_rmp3.setValue(act); - } + if (sel1 == "vhf1") { + act_display_rmp1.setValue(act); + } + if (sel2 == "vhf1") { + act_display_rmp2.setValue(act); + } + if (sel3 == "vhf1") { + act_display_rmp3.setValue(act); } } else if (vhf == 2) { - if (sel1 == "vhf2" or sel2 == "vhf2") { - var act = sprintf("%3.3f", act_vhf2.getValue()); + var act = sprintf("%3.3f", act_vhf2.getValue()); - if (sel1 == "vhf2") { - act_display_rmp1.setValue(act); - } - if (sel2 == "vhf2") { - act_display_rmp2.setValue(act); - } - if (sel3 == "vhf2") { - act_display_rmp3.setValue(act); - } + if (sel1 == "vhf2") { + act_display_rmp1.setValue(act); + } + if (sel2 == "vhf2") { + act_display_rmp2.setValue(act); + } + if (sel3 == "vhf2") { + act_display_rmp3.setValue(act); } } else if (vhf == 3) { - if (sel1 == "vhf3" or sel2 == "vhf3") { - var act = sprintf("%3.3f", act_vhf3.getValue()); + var act = sprintf("%3.3f", act_vhf3.getValue()); + var data_mode = vhf3_data_mode.getValue(); - if (sel1 == "vhf3") { - if (act == 0) { - act_display_rmp1.setValue("data"); - } else { - act_display_rmp1.setValue(act); - } + if (sel1 == "vhf3") { + if (data_mode == 1) { + act_display_rmp1.setValue("data"); + } else { + act_display_rmp1.setValue(act); } - if (sel2 == "vhf3") { - if (act == 0) { - act_display_rmp2.setValue("data"); - } else { - act_display_rmp2.setValue(act); - } + } + if (sel2 == "vhf3") { + if (data_mode == 1) { + act_display_rmp2.setValue("data"); + } else { + act_display_rmp2.setValue(act); } - if (sel3 == "vhf3") { - if (act == 0) { - act_display_rmp3.setValue("data"); - } else { - act_display_rmp3.setValue(act); - } + } + if (sel3 == "vhf3") { + if (data_mode == 1) { + act_display_rmp3.setValue("data"); + } else { + act_display_rmp3.setValue(act); } } } else if (vhf == 4) { @@ -283,6 +281,7 @@ var update_displays_nav = func(nav) { } var update_stby_freq = func(rmp_no, freq) { + var data_mode = vhf3_data_mode.getValue(); if (rmp_no == 0) { if (freq == 1) { var stby = sprintf("%3.3f", stby_rmp1_vhf1.getValue()); @@ -296,7 +295,7 @@ var update_stby_freq = func(rmp_no, freq) { var stby = sprintf("%5.0f", stby_rmp1_hf2.getValue()); } - if (stby == 0) { + if (data_mode == 0 and data_mode_stby_rmp.getValue() == 0) { stby_display_rmp1.setValue("data"); } else { stby_display_rmp1.setValue(stby); @@ -314,7 +313,7 @@ var update_stby_freq = func(rmp_no, freq) { var stby = sprintf("%5.0f", stby_rmp2_hf2.getValue()); } - if (stby == 0) { + if (data_mode == 0 and data_mode_stby_rmp.getValue() == 1) { stby_display_rmp2.setValue("data"); } else { stby_display_rmp2.setValue(stby); @@ -332,7 +331,7 @@ var update_stby_freq = func(rmp_no, freq) { var stby = sprintf("%5.0f", stby_rmp3_hf2.getValue()); } - if (stby == 0) { + if (data_mode == 0 and data_mode_stby_rmp.getValue() == 2) { stby_display_rmp3.setValue("data"); } else { stby_display_rmp3.setValue(stby); @@ -399,6 +398,18 @@ var transfer = func(rmp_no) { var sel_crs = getprop("/systems/radio/rmp[" ~ rmp_no ~ "]/select-crs"); if (string.match(sel_chan, "vhf[1-3]")) { + var data_mode = vhf3_data_mode.getValue(); + if (string.match(sel_chan, "vhf3") and ((data_mode_stby_rmp.getValue() == rmp_no and data_mode == 0) or data_mode == 1)) { + if (data_mode == 0) + { + vhf3_data_mode.setValue(1); + } + else + { + vhf3_data_mode.setValue(0); + data_mode_stby_rmp.setValue(rmp_no); + } + } var mod1 = int(string.replace(sel_chan, "vhf", "")); var mod = mod1 - 1; From 9252af7f805ea5b1ec46aca7e0a3efe10fd1fa8a Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Sat, 6 Mar 2021 19:54:29 +0000 Subject: [PATCH 122/124] Fix VHF3 --- Nasal/ECAM/ECAM-logic.nas | 2 +- revision.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas index 2a534c32..7dc62249 100644 --- a/Nasal/ECAM/ECAM-logic.nas +++ b/Nasal/ECAM/ECAM-logic.nas @@ -3569,7 +3569,7 @@ var messages_right_memo = func { wing_aice.active = 0; } - if (getprop("instrumentation/comm[2]/frequencies/selected-mhz") != 0 and (phaseVarMemo3 == 1 or phaseVarMemo3 == 2 or phaseVarMemo3 == 6 or phaseVarMemo3 == 9 or phaseVarMemo3 == 10)) { + if (!getprop("/systems/radio/vhf3-data-mode") and (phaseVarMemo3 == 1 or phaseVarMemo3 == 2 or phaseVarMemo3 == 6 or phaseVarMemo3 == 9 or phaseVarMemo3 == 10)) { vhf3_voice.active = 1; } else { vhf3_voice.active = 0; diff --git a/revision.txt b/revision.txt index 801f1801..31ff414b 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -47 \ No newline at end of file +48 \ No newline at end of file From b33dd172d7e3e8a13199b253c5a032ce96c3c2e6 Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Mon, 8 Mar 2021 16:30:00 +0100 Subject: [PATCH 123/124] First stab at a remote MCDU via HTTP --- README.md | 3 + mcdu.html | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 mcdu.html diff --git a/README.md b/README.md index 53eeea83..5710623f 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ It is highly reccomended to purchase a NAVIGRAPH subscription and download their To install navdata, create a folder FMSDATA, and add it to your additional scenery folders, at the top of the list. Inside that folder, place all the XXXX.procedures.xml files, in the format FMSDATA/X/X/X/XXXX.procedures.xml. For instance, FMSDATA/Airports/E/G/K/EGKK.procedures.xml. +## Remote MCDU +If you want to run the MCDU on a phone or tablet for better realism and easier input, put mcdu.html into the FGDATA/Phi folder, run FlightGear with enabled HTTP server (i.e. command line --httpd=8080) and open http://your-flightgear-computer:8080/mcdu.html in the browser on your phone or tablet. + ## Installation If you have issues installing, please check INSTALL.MD! Specifically, make sure you remove -dev from the folder name! diff --git a/mcdu.html b/mcdu.html new file mode 100644 index 00000000..f9d93c08 --- /dev/null +++ b/mcdu.html @@ -0,0 +1,196 @@ + + + + MCDU + + + + + + + + + + + + + + + + + + +
  
11
22
33
44
55
66
  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z/SPOVFYCLR
+ + + + + + + + + + + + + +
AIR
PORT
+ + + + + + + + + + + + + + + + + + + + + +
123
456
789
.0-
+ + From 9f1bab9bb63a3270b4af256ea8930676bea856ce Mon Sep 17 00:00:00 2001 From: Stefan Seifert Date: Wed, 10 Mar 2021 18:42:32 +0100 Subject: [PATCH 124/124] Fix CanvasImage: task running, pausing for 15 seconds by remote MCDU The Canvas screenshot code doesn't like multiple concurrent screenshot requests, so schedule the next load for after a currently running one is done. --- mcdu.html | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mcdu.html b/mcdu.html index f9d93c08..28e57ea7 100644 --- a/mcdu.html +++ b/mcdu.html @@ -6,8 +6,16 @@