diff --git a/A320-main.xml b/A320-main.xml
index 8bad283f..6559fa2f 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -1116,6 +1116,10 @@
2000
0
+
+ faa
+ faa
+
5.4
@@ -1760,6 +1764,10 @@
1219
true
+
+
+ false
+
@@ -4353,21 +4361,22 @@
Aircraft/A320-family/Nasal/MCDU/DUPLICATE.nas
- Aircraft/A320-family/Nasal/MCDU/DIRTO.nas
- Aircraft/A320-family/Nasal/MCDU/LATREV.nas
- Aircraft/A320-family/Nasal/MCDU/VERTREV.nas
- Aircraft/A320-family/Nasal/MCDU/DEPARTURE.nas
- Aircraft/A320-family/Nasal/MCDU/ARRIVAL.nas
- Aircraft/A320-family/Nasal/MCDU/AIRWAYS.nas
- Aircraft/A320-family/Nasal/MCDU/CLOSESTAIRPORT.nas
- Aircraft/A320-family/Nasal/MCDU/RECEIVEDMESSAGES.nas
- Aircraft/A320-family/Nasal/MCDU/PILOTWAYPOINT.nas
- Aircraft/A320-family/Nasal/MCDU/HOLD.nas
- Aircraft/A320-family/Nasal/MCDU/F-PLN.nas
- Aircraft/A320-family/Nasal/MCDU/WINDCLB.nas
- Aircraft/A320-family/Nasal/MCDU/WINDCRZ.nas
- Aircraft/A320-family/Nasal/MCDU/WINDDES.nas
- Aircraft/A320-family/Nasal/MCDU/WINDHIST.nas
+ Aircraft/A320-family/Nasal/MCDU/DIRTO.nas
+ Aircraft/A320-family/Nasal/MCDU/LATREV.nas
+ Aircraft/A320-family/Nasal/MCDU/VERTREV.nas
+ Aircraft/A320-family/Nasal/MCDU/DEPARTURE.nas
+ Aircraft/A320-family/Nasal/MCDU/ARRIVAL.nas
+ Aircraft/A320-family/Nasal/MCDU/AIRWAYS.nas
+ Aircraft/A320-family/Nasal/MCDU/CLOSESTAIRPORT.nas
+ Aircraft/A320-family/Nasal/MCDU/RECEIVEDMESSAGES.nas
+ Aircraft/A320-family/Nasal/MCDU/PILOTWAYPOINT.nas
+ Aircraft/A320-family/Nasal/MCDU/HOLD.nas
+ Aircraft/A320-family/Nasal/MCDU/F-PLN.nas
+ Aircraft/A320-family/Nasal/MCDU/WINDCLB.nas
+ Aircraft/A320-family/Nasal/MCDU/WINDCRZ.nas
+ Aircraft/A320-family/Nasal/MCDU/WINDDES.nas
+ Aircraft/A320-family/Nasal/MCDU/WINDHIST.nas
+ Aircraft/A320-family/Nasal/MCDU/ATIS.nas
Aircraft/A320-family/Nasal/MCDU/MCDU.nas
Aircraft/A320-family/Nasal/MCDU/INITA.nas
Aircraft/A320-family/Nasal/MCDU/IRSINIT.nas
@@ -4442,6 +4451,7 @@
Aircraft/A320-family/Nasal/Panels/atc.nas
+ Aircraft/A320-family/Nasal/Systems/Comm/Dictionary.nas
Aircraft/A320-family/Nasal/Systems/Comm/Notification.nas
diff --git a/AircraftConfig/acconfig.nas b/AircraftConfig/acconfig.nas
index 136aff22..69c02fea 100644
--- a/AircraftConfig/acconfig.nas
+++ b/AircraftConfig/acconfig.nas
@@ -76,6 +76,8 @@ setprop("/systems/acconfig/options/keyboard-mode", 0);
setprop("/systems/acconfig/options/weight-kgs", 0);
setprop("/systems/acconfig/options/adirs-skip", 0);
setprop("/systems/acconfig/options/allow-oil-consumption", 0);
+setprop("/systems/acconfig/options/atis-server", "faa");
+setprop("/systems/acconfig/options/wxr-server", "noaa");
setprop("/systems/acconfig/options/welcome-skip", 0);
setprop("/systems/acconfig/options/no-rendering-warn", 0);
setprop("/systems/acconfig/options/save-state", 0);
@@ -232,6 +234,8 @@ var readSettings = func {
setprop("/sim/model/autopush/route/show-wingtip", getprop("/systems/acconfig/options/autopush/show-wingtip"));
setprop("/options/system/fo-view", getprop("/systems/acconfig/options/fo-view"));
setprop("/FMGC/simbrief-username", getprop("/systems/acconfig/options/simbrief-username"));
+ setprop("/systems/atsu/atis-server", getprop("/systems/acconfig/options/atis-server"));
+ setprop("/systems/atsu/wxr-server", getprop("/systems/acconfig/options/wxr-server"));
}
var writeSettings = func {
@@ -244,6 +248,8 @@ var writeSettings = func {
setprop("/systems/acconfig/options/autopush/show-wingtip", getprop("/sim/model/autopush/route/show-wingtip"));
setprop("/systems/acconfig/options/fo-view", getprop("/options/system/fo-view"));
setprop("/systems/acconfig/options/simbrief-username", getprop("/FMGC/simbrief-username"));
+ setprop("/systems/acconfig/options/atis-server", getprop("/systems/atsu/atis-server"));
+ setprop("/systems/acconfig/options/wxr-server", getprop("/systems/atsu/wxr-server"));
io.write_properties(getprop("/sim/fg-home") ~ "/Export/A320-family-config.xml", "/systems/acconfig/options");
}
diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml
index 4f6e3a60..d96f964e 100644
--- a/Models/FlightDeck/a320.flightdeck.xml
+++ b/Models/FlightDeck/a320.flightdeck.xml
@@ -8810,5 +8810,49 @@
+
+
+
+
+ pick
+ radar_sys
+
+
+ true
+
+ property-toggle
+ /instrumentation/efis[0]/inputs/wxr
+
+
+ property-toggle
+ /instrumentation/efis[1]/inputs/wxr
+
+
+ property-toggle
+ /instrumentation/wxr/enabled
+
+
+ nasal
+
+
+
+
+
+
+ rotate
+ radar_sys
+ -20
+ /instrumentation/wxr/enabled
+
+ 0.020282
+ -0.210647
+ -0.140496
+
+
+ 1
+ 0
+ 0
+
+
diff --git a/Models/FlightDeck/res/Engine.png b/Models/FlightDeck/res/Engine.png
index 04a73794..08c49d48 100644
Binary files a/Models/FlightDeck/res/Engine.png and b/Models/FlightDeck/res/Engine.png differ
diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas
index 18f4f89b..ad659a33 100644
--- a/Models/Instruments/MCDU/MCDU.nas
+++ b/Models/Instruments/MCDU/MCDU.nas
@@ -25,6 +25,7 @@ var myCLBWIND = [nil, nil];
var myCRZWIND = [nil, nil];
var myDESWIND = [nil, nil];
var myHISTWIND = [nil, nil];
+var myAtis = [nil, nil];
var default = "BoeingCDU-Large.ttf";
#var symbol = "helvetica_medium.txf";
var symbol = "LiberationMonoCustom.ttf";
@@ -233,7 +234,8 @@ var canvas_MCDU_base = {
"PERFAPPR_FE","PERFAPPR_SE","PERFAPPR_OE","PERFAPPR_LDG_3","PERFAPPR_LDG_F","PERFGA","PERFGA_FE","PERFGA_SE","PERFGA_OE","FPLN","FPLN_From",
"FPLN_TMPY_group","FPLN_FROM","FPLN_Callsign","departureTMPY", "arrowsDepArr","arrow1L","arrow2L","arrow3L","arrow4L","arrow5L","arrow1R","arrow2R",
"arrow3R","arrow4R","arrow5R","DIRTO_TMPY_group","IRSINIT","IRSINIT_1","IRSINIT_2","IRSINIT_star","NOTIFY","NOTIFY_FLTNBR","NOTIFY_AIRPORT","WEATHERREQSEND",
- "WIND","WIND_CANCEL","WIND_INSERT_star","WIND_UPDOWN","MODEVHF3","PRINTPAGE","COMM-ADS","COCALL","COCALLTUNE"];
+ "WIND","WIND_CANCEL","WIND_INSERT_star","WIND_UPDOWN","MODEVHF3","PRINTPAGE","COMM-ADS","COCALL","COCALLTUNE","ATISSend1","ATISSend2","ATISSend3","ATISSend4",
+ "ATISArrows"];
},
update: func() {
if (systems.ELEC.Bus.ac1.getValue() >= 110 and mcdu1_lgt.getValue() > 0.01) {
@@ -364,6 +366,15 @@ var canvas_MCDU_base = {
me["PRINTPAGE"].setColor(WHITE);
}
}
+ if (page != "ATIS") {
+ me["ATISSend1"].hide();
+ me["ATISSend2"].hide();
+ me["ATISSend3"].hide();
+ me["ATISSend4"].hide();
+ }
+ if (page != "ATISDETAIL") {
+ me["ATISArrows"].hide();
+ }
if (page == "F-PLNA" or page == "F-PLNB") {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
@@ -547,12 +558,14 @@ var canvas_MCDU_base = {
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.showRightArrow(1, 1, 1, 1, 1, 1);
me["Simple_C3B"].hide();
me["Simple_C4B"].hide();
me.standardFontSize();
me.standardFontColour();
+ me["Simple_R6"].setColor(BLUE);
+ me["Simple_R6_Arrow"].setColor(BLUE);
me["Simple_L1"].setText(" PREFLIGHT");
me["Simple_L2"].setText(" ENROUTE");
@@ -566,8 +579,72 @@ var canvas_MCDU_base = {
me["Simple_R3"].setText("RCVD MSGS ");
me["Simple_R4"].setText("REPORTS ");
me["Simple_R5"].setText("CONFIG ");
+ me["Simple_R6"].setText("MESSAGE ");
pageSwitch[i].setBoolValue(1);
}
+
+ if (mcdu.ReceivedMessagesDatabase.firstUnviewed() != -99) {
+ me["Simple_R6"].show();
+ me["Simple_R6_Arrow"].show();
+ } else {
+ me["Simple_R6"].hide();
+ me["Simple_R6_Arrow"].hide();
+ }
+ } else if (page == "AOCCONFIG") {
+ if (!pageSwitch[i].getBoolValue()) {
+ me.defaultHideWithCenter();
+ me["Simple_Title"].setText("AOC CONFIGURATION");
+ me.defaultPageNumbers();
+
+ me.showLeft(1, -1, -1, -1, -1, 1);
+ me["Simple_L0S"].hide();
+ 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["Simple_C3B"].hide();
+ me["Simple_C4B"].hide();
+
+ me.standardFontSize();
+ me.standardFontColour();
+
+ me["Simple_L1S"].setText("A/C REG");
+ me["Simple_L1"].setFontSize(small);
+ me["Simple_L1"].setColor(GREEN);
+ me["Simple_C1S"].setColor(GREEN);
+ me["Simple_R1"].setFontSize(small);
+ me["Simple_R1"].setColor(GREEN);
+ me["Simple_R1S"].setText("TYPE");
+ me["Simple_L6S"].setText(" RETURN TO");
+ me["Simple_L6"].setText(" AOC MENU");
+ me["Simple_C2"].setText("ATSU SW AND DB PN");
+ me["Simple_C3S"].setText("998.2459.501");
+ me["Simple_C3S"].setFontSize(small);
+ me["Simple_C3S"].setColor(GREEN);
+ me["Simple_C3"].setText("998.2460.501");
+ me["Simple_C3"].setFontSize(small);
+ me["Simple_C3"].setColor(GREEN);
+ me["Simple_C4"].setText("ATSU AOC ID");
+ me["Simple_C5S"].setText("AS2TOC1015010F1");
+ me["Simple_C5S"].setFontSize(small);
+ me["Simple_C5S"].setColor(GREEN);
+ me["Simple_C5"].setText("AS2TOC1012001F2");
+ me["Simple_C5"].setFontSize(small);
+ me["Simple_C5"].setColor(GREEN);
+ me["Simple_R6"].setText("PRINT ");
+ me["Simple_R6"].setColor(BLUE);
+ me["Simple_C1"].setFontSize(small);
+ me["Simple_C1"].setColor(GREEN);
+ pageSwitch[i].setBoolValue(1);
+ }
+ me["Simple_L1"].setText(getprop("/options/model-options/registration"));
+ me["Simple_C1S"].setText(sprintf("%02.0f", getprop("/sim/time/utc/hour")) ~ sprintf("%02.0f", getprop("/sim/time/utc/minute")));
+ me["Simple_C1"].setText(sprintf("%02.0f", getprop("/sim/time/utc/day")) ~ "/" ~ sprintf("%02.0f", getprop("/sim/time/utc/month")) ~ "/" ~ right(sprintf(getprop("/sim/time/utc/year")), 2));
+ me["Simple_R1S"].setText("TYPE");
+ me["Simple_R1"].setText(getprop("/MCDUC/type"));
} else if (page == "WEATHERREQ") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHide();
@@ -915,6 +992,217 @@ var canvas_MCDU_base = {
me["Simple_R1"].setText("ATIS ");
pageSwitch[i].setBoolValue(1);
}
+ } else if (page == "ATISDETAIL") {
+ if (!pageSwitch[i].getBoolValue()) {
+ me.defaultHide();
+ me["Simple_PageNum"].hide();
+ me["ArrowLeft"].hide();
+ me["ArrowRight"].hide();
+
+ me["Simple_L0S"].hide();
+ me["Simple_C3B"].hide();
+ me["Simple_C4B"].hide();
+
+ me.fontLeft(default, default, default, default, default, default);
+ me.fontLeftS(default, default, default, default, default, default);
+ me.fontRight(default, default, default, default, default, default);
+ me.fontRightS(default, default, default, default, default, default);
+
+ me.fontSizeLeft(small, small, small, small, normal, normal);
+ me.fontSizeCenter(normal, normal, normal, normal, normal, normal);
+ me.fontSizeRight(normal, normal, normal, normal, normal, normal);
+
+ me.colorLeftS("grn", "wht", "wht", "wht", "wht", "wht");
+ me.colorRightS("grn", "wht", "wht", "wht", "wht", "wht");
+
+
+ if (myAtis[i] != nil) {
+ me["Simple_Title"].setText(sprintf("%s", myAtis[i].title));
+
+ me.dynamicPageArrowFunc(myAtis[i]);
+ me.colorLeftArrow(myAtis[i].arrowsColour[0][0],myAtis[i].arrowsColour[0][1],myAtis[i].arrowsColour[0][2],myAtis[i].arrowsColour[0][3],myAtis[i].arrowsColour[0][4],myAtis[i].arrowsColour[0][5]);
+ me.colorRightArrow(myAtis[i].arrowsColour[1][0],myAtis[i].arrowsColour[1][1],myAtis[i].arrowsColour[1][2],myAtis[i].arrowsColour[1][3],myAtis[i].arrowsColour[1][4],myAtis[i].arrowsColour[1][5]);
+
+ me.dynamicPageFunc(myAtis[i].L1, "Simple_L1");
+ me.dynamicPageFunc(myAtis[i].L2, "Simple_L2");
+ me.dynamicPageFunc(myAtis[i].L3, "Simple_L3");
+ me.dynamicPageFunc(myAtis[i].L4, "Simple_L4");
+ me.dynamicPageFunc(myAtis[i].L5, "Simple_L5");
+ me.dynamicPageFunc(myAtis[i].L6, "Simple_L6");
+
+ me.colorLeft(myAtis[i].L1[2],myAtis[i].L2[2],myAtis[i].L3[2],myAtis[i].L4[2],myAtis[i].L5[2],myAtis[i].L6[2]);
+
+ me.dynamicPageFunc(myAtis[i].R1, "Simple_R1");
+ me.dynamicPageFunc(myAtis[i].R2, "Simple_R2");
+ me.dynamicPageFunc(myAtis[i].R3, "Simple_R3");
+ me.dynamicPageFunc(myAtis[i].R4, "Simple_R4");
+ me.dynamicPageFunc(myAtis[i].R5, "Simple_R5");
+ me.dynamicPageFunc(myAtis[i].R6, "Simple_R6");
+
+ me.colorRight(myAtis[i].R1[2],myAtis[i].R2[2],myAtis[i].R3[2],myAtis[i].R4[2],myAtis[i].R5[2],myAtis[i].R6[2]);
+ }
+
+ if (myAtis[i].getNumPages() > 1) {
+ me["Simple_PageNum"].show();
+ me["ATISArrows"].show();
+ me["Simple_PageNum"].setText(myAtis[i].page ~ "/" ~ myAtis[i].getNumPages());
+ } else {
+ me["Simple_PageNum"].hide();
+ me["ATISArrows"].hide();
+ }
+
+ pageSwitch[i].setBoolValue(1);
+ }
+ } else if (page == "ATIS") {
+ if (!pageSwitch[i].getBoolValue()) {
+ me.defaultHideWithCenter();
+ me["Simple_Title"].setText("ATS623 ATIS MENU");
+ me["Simple_Title"].setColor(1, 1, 1);
+ me["Simple_PageNum"].hide();
+ me["ArrowLeft"].hide();
+ me["ArrowRight"].hide();
+
+ me.showLeft(1, 1, 1, 1, -1, 1);
+ me["Simple_L0S"].hide();
+ 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["Simple_C3B"].hide();
+ me["Simple_C4B"].hide();
+
+ me.standardFontSize();
+
+ me.colorLeft("blu", "blu", "blu", "blu", "wht", "wht");
+ me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht");
+ me.colorLeftArrow("wht", "wht", "wht", "wht", "wht", "wht");
+ me.colorCenter("grn", "grn", "grn", "grn", "wht", "wht");
+ me.colorCenterS("wht", "wht", "wht", "wht", "wht", "wht");
+ me.colorRight("wht", "wht", "wht", "wht", "wht", "wht");
+ me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht");
+ me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht");
+
+
+ me["Simple_L1S"].setText(" ARPT/TYPE");
+ me["Simple_L6S"].setText(" ATC MENU");
+ me["Simple_L4"].setText(" [ ]/[ ]");
+ me["Simple_L4"].setFont(symbol);
+ me["Simple_L6"].setText(" RETURN");
+
+ me["Simple_C1"].setFontSize(small);
+ me["Simple_C2"].setFontSize(small);
+ me["Simple_C3"].setFontSize(small);
+ me["Simple_C4"].setFontSize(small);
+
+ me["Simple_R1S"].setText("REQ ");
+ me["Simple_R1"].setText("SEND ");
+ me["Simple_R2S"].setText("REQ ");
+ me["Simple_R2"].setText("SEND ");
+ me["Simple_R3S"].setText("REQ ");
+ me["Simple_R3"].setText("SEND ");
+ me["Simple_R4S"].setText("REQ ");
+ me["Simple_R4"].setText("SEND ");
+ me["Simple_R5S"].setText("AUTO ");
+ me["Simple_R5"].setText("UPDATE ");
+ me["Simple_R6S"].setText("PRINT MANUAL ");
+ me["Simple_R6"].setText("SET AUTO ");
+ pageSwitch[i].setBoolValue(1);
+ }
+
+ if (atsu.ATISInstances[0].station != nil) {
+ me["Simple_L1"].setText(" " ~ atsu.ATISInstances[0].station ~ "/" ~ (atsu.ATISInstances[0].type == 0 ? "ARR" : "DEP"));
+ me["Simple_L1"].setFont(default);
+ me["Simple_L1_Arrow"].show();
+ } else {
+ me["Simple_L1"].setText(" [ ]/[ ]");
+ me["Simple_L1"].setFont(symbol);
+ me["Simple_L1_Arrow"].hide();
+ }
+
+ if (atsu.ATISInstances[0].received) {
+ me["Simple_C1"].setText(" " ~ atsu.ATISInstances[0].receivedCode ~ " " ~ atsu.ATISInstances[0].receivedTime);
+ me["Simple_C1"].show();
+ } else {
+ me["Simple_C1"].hide();
+ }
+
+ if (atsu.ATISInstances[1].station != nil) {
+ me["Simple_L2"].setText(" " ~ atsu.ATISInstances[1].station ~ "/" ~ (atsu.ATISInstances[1].type == 0 ? "ARR" : "DEP"));
+ me["Simple_L2"].setFont(default);
+ me["Simple_L2_Arrow"].show();
+ } else {
+ me["Simple_L2"].setText(" [ ]/[ ]");
+ me["Simple_L2"].setFont(symbol);
+ me["Simple_L2_Arrow"].hide();
+ }
+
+ if (atsu.ATISInstances[1].received) {
+ me["Simple_C2"].setText(" " ~ atsu.ATISInstances[1].receivedCode ~ " " ~ atsu.ATISInstances[1].receivedTime);
+ me["Simple_C2"].show();
+ } else {
+ me["Simple_C2"].hide();
+ }
+
+ if (atsu.ATISInstances[2].station != nil) {
+ me["Simple_L3"].setText(" " ~ atsu.ATISInstances[2].station ~ "/" ~ (atsu.ATISInstances[2].type == 0 ? "ARR" : "DEP"));
+ me["Simple_L3"].setFont(default);
+ me["Simple_L3_Arrow"].show();
+ } else {
+ me["Simple_L3"].setText(" [ ]/[ ]");
+ me["Simple_L3"].setFont(symbol);
+ me["Simple_L3_Arrow"].hide();
+ }
+
+ if (atsu.ATISInstances[2].received) {
+ me["Simple_C3"].setText(" " ~ atsu.ATISInstances[2].receivedCode ~ " " ~ atsu.ATISInstances[2].receivedTime);
+ me["Simple_C3"].show();
+ } else {
+ me["Simple_C3"].hide();
+ }
+
+ if (atsu.ATISInstances[3].station != nil) {
+ me["Simple_L4"].setText(" " ~ atsu.ATISInstances[3].station ~ "/" ~ (atsu.ATISInstances[3].type == 0 ? "ARR" : "DEP"));
+ me["Simple_L4"].setFont(default);
+ me["Simple_L4_Arrow"].show();
+ } else {
+ me["Simple_L4"].setText(" [ ]/[ ]");
+ me["Simple_L4"].setFont(symbol);
+ me["Simple_L4_Arrow"].hide();
+ }
+
+ if (atsu.ATISInstances[3].received) {
+ me["Simple_C4"].setText(" " ~ atsu.ATISInstances[3].receivedCode ~ " " ~ atsu.ATISInstances[3].receivedTime);
+ me["Simple_C4"].show();
+ } else {
+ me["Simple_C4"].hide();
+ }
+
+ if (atsu.ATISInstances[0].sent) {
+ me["ATISSend1"].hide();
+ } else {
+ me["ATISSend1"].show();
+ }
+
+ if (atsu.ATISInstances[1].sent) {
+ me["ATISSend2"].hide();
+ } else {
+ me["ATISSend2"].show();
+ }
+
+ if (atsu.ATISInstances[2].sent) {
+ me["ATISSend3"].hide();
+ } else {
+ me["ATISSend3"].show();
+ }
+
+ if (atsu.ATISInstances[3].sent) {
+ me["ATISSend4"].hide();
+ } else {
+ me["ATISSend4"].show();
+ }
} else if (page == "NOTIFICATION") {
if (!pageSwitch[i].getBoolValue()) {
me.defaultHideWithCenter();
@@ -1227,21 +1515,21 @@ var canvas_MCDU_base = {
pageSwitch[i].setBoolValue(1);
}
- if (atsu.AOC.server == 1) {
+ if (atsu.AOC.server.getValue() == "vatsim") {
me["Simple_R1"].setText("VATSIM ");
me["Simple_R2_Arrow"].show();
me["Simple_R3_Arrow"].hide();
- } elsif (atsu.AOC.server == 0) {
+ } elsif (atsu.AOC.server.getValue() == "noaa") {
me["Simple_R1"].setText("NOAA ");
me["Simple_R2_Arrow"].hide();
me["Simple_R3_Arrow"].show();
}
- if (atsu.ATIS.server == 1) {
+ if (atsu.ATIS.serverSel.getValue() == "vatsim") {
me["Simple_L1"].setText(" VATSIM");
me["Simple_L2_Arrow"].show();
me["Simple_L3_Arrow"].hide();
- } elsif (atsu.ATIS.server == 0) {
+ } elsif (atsu.ATIS.serverSel.getValue() == "faa") {
me["Simple_L1"].setText(" FAA");
me["Simple_L2_Arrow"].hide();
me["Simple_L3_Arrow"].show();
diff --git a/Models/Instruments/MCDU/res/mcdu.svg b/Models/Instruments/MCDU/res/mcdu.svg
index 365d0760..9eb38288 100644
--- a/Models/Instruments/MCDU/res/mcdu.svg
+++ b/Models/Instruments/MCDU/res/mcdu.svg
@@ -12,7 +12,7 @@
viewBox="0 0 1024 864"
version="1.1"
id="svg2"
- inkscape:version="1.0beta2 (2b71d25, 2019-12-03)"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="mcdu.svg">
@@ -37,17 +37,17 @@
guidetolerance="20"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:window-width="1440"
- inkscape:window-height="819"
+ inkscape:window-width="1366"
+ inkscape:window-height="705"
id="namedview371"
showgrid="true"
- inkscape:zoom="0.78947164"
- inkscape:cx="929.63178"
- inkscape:cy="751.57487"
- inkscape:window-x="481"
- inkscape:window-y="23"
- inkscape:window-maximized="0"
- inkscape:current-layer="WIND"
+ inkscape:zoom="3.1578866"
+ inkscape:cx="1122.1906"
+ inkscape:cy="986.92422"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2"
showguides="false"
inkscape:snap-global="false"
units="px"
@@ -1016,7 +1016,7 @@
inkscape:label="#g4241"
id="g4241">
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
@@ -1103,7 +1103,7 @@
x="177.72771"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve">
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
@@ -1235,7 +1235,7 @@
inkscape:label="arrow5L"
id="arrow5L">
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#bb6100;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
@@ -2617,7 +2617,7 @@
id="tspan1088"
x="478.87796"
y="171.04486"
- style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.9924px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.99240112px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=
=
+ style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:63.99240112px;line-height:1.25;font-family:'Helvetica Medium';-inkscape-font-specification:'Helvetica Medium, Medium';text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1">=
+ style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
=
@@ -2833,7 +2833,7 @@
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path1243"
- d="m 998.71909,284.70793 -28.52965,0"
+ d="M 998.71909,284.70793 H 970.18944"
style="fill:none;stroke:#179ab7;stroke-width:4.07999992;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Models/Instruments/ND/canvas/framework/navdisplay.nas b/Models/Instruments/ND/canvas/framework/navdisplay.nas
index 3f90cf80..783a8e84 100644
--- a/Models/Instruments/ND/canvas/framework/navdisplay.nas
+++ b/Models/Instruments/ND/canvas/framework/navdisplay.nas
@@ -335,12 +335,12 @@ canvas.NavDisplay.update_sub = func(){
canvas.NavDisplay.update = func() # FIXME: This stuff is still too aircraft specific, cannot easily be reused by other aircraft
{
var _time = systime();
- # Disables WXR Live if it"s not enabled. The toggle_weather_live should be common to all
+ # Disables WXR Live if it's not enabled. The toggle_weather_live should be common to all
# ND instances.
- var wxr_live_enabled = getprop(wxr_live_tree~"/enabled");
- if(wxr_live_enabled == nil or wxr_live_enabled == "")
+ var wxr_live_enabled = getprop(wxr_live_tree~'/enabled');
+ if(wxr_live_enabled == nil or wxr_live_enabled == '')
wxr_live_enabled = 0;
- me.set_switch("toggle_weather_live", wxr_live_enabled);
+ me.set_switch('toggle_weather_live', wxr_live_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/map/WXR_live.lcontroller b/Models/Instruments/ND/canvas/map/WXR_live.lcontroller
index c4ed451e..1589232b 100644
--- a/Models/Instruments/ND/canvas/map/WXR_live.lcontroller
+++ b/Models/Instruments/ND/canvas/map/WXR_live.lcontroller
@@ -25,16 +25,9 @@ var new = func(layer) {
};
layer.searcher._equals = func(l,r) l.equals(r);
m.addVisibilityListener();
- var aircraft_dir = split('/', getprop("sim/aircraft-dir"))[-1];
- var saved_conf = getprop("sim/fg-home") ~ "/Export/wxr_api.xml";
- var df_conf = getprop("sim/fg-root") ~ "/Aircraft/" ~ aircraft_dir ~
- "/Models/Instruments/ND/canvas/wxr_api.xml";
- if(io.stat(saved_conf) != nil)
- io.read_properties(saved_conf, wxr_tree);
- else
- io.read_properties(df_conf, wxr_tree);
return m;
};
+
var del = func() {
#print(name~".lcontroller.del()");
foreach (var l; me.listeners)
@@ -43,9 +36,6 @@ var del = func() {
var searchCmd = func {
if(me.map.getRange() == nil) return [];
- var api_key = getprop(wxr_tree~"/api-key");
- if(!api_key or api_key == '' or api_key == 'YOUR API KEY')
- return [];
var lat = getprop(wxr_tree~"/center/latitude-deg");
var lon = getprop(wxr_tree~"/center/longitude-deg");
@@ -58,14 +48,9 @@ var searchCmd = func {
var result = geo.Coord.new();
result.set_latlon(lat, lon);
result.rangeNm = me.map.getRange();
- result.key = api_key;
- result.res = getprop(wxr_tree~"/resolution");
- result.ltype = getprop(wxr_tree~"/layer-type");
- result.smooth = getprop(wxr_tree~"/smooth");
- result.fetchRad = getprop(wxr_tree~"/fetch-radius");
+ result.fetchRad = 184; # is this number accurate?
result.equals = func(r){
- me.ltype == r.ltype and me.fetchRad == r.fetchRad and
- me.lat == r.lat and me.lon == r.lon
+ me.fetchRad == r.fetchRad and me.lat == r.lat and me.lon == r.lon
};
return [result];
diff --git a/Models/Instruments/ND/canvas/map/WXR_live.symbol b/Models/Instruments/ND/canvas/map/WXR_live.symbol
index 53971407..b1557884 100644
--- a/Models/Instruments/ND/canvas/map/WXR_live.symbol
+++ b/Models/Instruments/ND/canvas/map/WXR_live.symbol
@@ -11,19 +11,18 @@ var getWXRImageFilePath = func(){
var home = getprop('sim/fg-home');
var aircraft = getprop('sim/aircraft');
var idx = me.layer.getCanvas()._node.getIndex();
- return home ~ '/Export/' ~ aircraft ~ '-wxr-'~me.ltype~'-'~idx~'.png';
+ return home ~ '/Export/' ~ aircraft ~ '-wxr-'~idx~'.png';
+};
+
+var processRequest = func(r) {
+ var splitVector = split(",", r.response);
+ var timeStamp = split("]",splitVector[size(splitVector) - 1]);
+ return timeStamp[0];
};
var getWXRAPIUrl = func(lat, lon){
- var res = me.res;
- if(me.ltype == "radar"){
- return "http://api.wunderground.com/api/"~me.key~
- "/radar/image.png?centerlat="~lat~"¢erlon="~lon~
- "&radius="~me.fetchRad~"&width="~res~"&height="~res~
- "&smooth="~me.smooth;
- } else {
- return nil;
- }
+ if (me.timeStamp == nil) { return nil; }
+ return "https://tilecache.rainviewer.com/v2/radar/" ~ sprintf("%s",me.timeStamp) ~ "/512/5/" ~ lat ~ "/" ~ lon ~ "/7/0_0.png";
};
var fetchWXRMap = func(size){
@@ -34,15 +33,14 @@ var fetchWXRMap = func(size){
var url = me.getWXRAPIUrl(lat, lon);
var filePath = me.getWXRImageFilePath();
if(url == nil) {
- print(me.name~': No URL!');
+ logprint(3,me.name,": No URL!");
return;
}
me.fetching = 1;
http.save(url, filePath)
.fail(func(){
- print(me.name~': Download failed!');
- me.wxlayer.hide();
- })
+ logprint(3,me.name,":Download failed!");}
+ )
.done(func(){
var sz = size * 2;
var transl = -size;
@@ -57,28 +55,28 @@ var fetchWXRMap = func(size){
setprop("instrumentation/wxr/center/latitude-deg", lat);
setprop("instrumentation/wxr/center/longitude-deg", lon);
me.fetching = 0;
- print("[WXR] Live Layer Request: "~url); # Debugging
+ logprint(4,me.name,": Layer Request: ",url);
});
};
var init = func {
#print('WXR init');
me.fetching = 0;
- me.key = me.model.key; # API Key from Wunderground API Subscription
- me.res = me.model.res; # Resolution of image to fetch (default 2048)
- me.ltype = me.model.ltype; # Layer Type - radar, satellite
- me.smooth = me.model.smooth; # If we should fetch a smoothened image or the original
+ 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.wxlayer = me.element.createChild("image").set("z-index", -100).hide();
- me.last_request = -210;
- me.update_interval = 240;
+ me.last_request = -600;
+ me.update_interval = 600;
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 draw = func {
@@ -86,15 +84,12 @@ var draw = func {
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*670)/me.range;
var r_scaled = (me.fetchRad*me.viewport_radius)/me.range;
var hdg = me.layer.map.getHdg();
var rot = 0 - hdg;
- if(rot < 0) rot = 360 + rot;
+ if(rot < 0) rot = 360 + rot + -getprop("/environment/magnetic-variation-deg");
me.element.setRotation(rot*D2R);
if(update_size){
- print('WXR draw range:'~ me.range);
- print('Update size: '~r_scaled~'x2 = '~(r_scaled*2));
me.wxlayer.hide();
me.wxlayer.setSize(2*r_scaled, 2*r_scaled)
.setTranslation(-r_scaled, -r_scaled);
@@ -102,12 +97,6 @@ var draw = func {
}
if(getprop("sim/time/elapsed-sec") - me.last_request > me.update_interval) {
- #print('Fetching WXR map...');
- me.key = me.model.key; # API Key from Wunderground API Subscription
- me.res = me.model.res; # Resolution of image to fetch (default 2048)
- me.ltype = me.model.ltype; # Layer Type - radar, satellite
- me.smooth = me.model.smooth; # If we should fetch a smoothened image or the original
-
me.fetchWXRMap(r_scaled);
}
};
diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas
index 2aa703d6..37041611 100644
--- a/Nasal/ECAM/ECAM-logic.nas
+++ b/Nasal/ECAM/ECAM-logic.nas
@@ -1403,10 +1403,12 @@ var messages_priority_2 = func {
if (yawDamperSysFault.clearFlag == 0 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and phaseVar2 != 10 and warningNodes.Logic.yawDamper12Fault.getBoolValue()) {
yawDamperSysFault.active = 1;
- yawDamperSysFaultFac.active = 1;
+ yawDamperSysFaultFac1.active = 1;
+ yawDamperSysFaultFac2.active = 1;
} else {
ECAM_controller.warningReset(yawDamperSysFault);
- ECAM_controller.warningReset(yawDamperSysFaultFac);
+ ECAM_controller.warningReset(yawDamperSysFaultFac1);
+ ECAM_controller.warningReset(yawDamperSysFaultFac2);
}
if (rudTravLimSysFault.clearFlag == 0 and phaseVar2 != 4 and phaseVar2 != 5 and phaseVar2 != 7 and phaseVar2 != 8 and warningNodes.Logic.rtlu12Fault.getBoolValue()) {
@@ -2480,6 +2482,11 @@ var messages_memo = func {
gpws_flap_mode_off.active = 0;
}
+ if (!fmgc.FMGCInternal.flightNumSet and toMemoLine1.active != 1 and ldgMemoLine1.active != 1 and (phaseVarMemo2 <= 2 or phaseVarMemo2 == 6 or phaseVarMemo2 >= 9)) {
+ company_datalink_stby.active = 1;
+ } else {
+ company_datalink_stby.active = 0;
+ }
}
var messages_right_memo = func {
@@ -2622,7 +2629,13 @@ var messages_right_memo = func {
} else {
ldg_lt.active = 0;
}
-
+
+ if (mcdu.ReceivedMessagesDatabase.firstUnviewed() != -99 and (phaseVarMemo2 <= 2 or phaseVarMemo2 == 6 or phaseVarMemo2 >= 9)) {
+ company_msg.active = 1;
+ } else {
+ company_msg.active = 0;
+ }
+
if (getprop("/controls/ice-protection/leng") == 1 or getprop("/controls/ice-protection/reng") == 1 or getprop("/systems/electrical/bus/dc-1") == 0 or getprop("/systems/electrical/bus/dc-2") == 0) {
eng_aice.active = 1;
} else {
diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas
index a62d76a9..5df843e6 100644
--- a/Nasal/ECAM/ECAM-messages.nas
+++ b/Nasal/ECAM/ECAM-messages.nas
@@ -287,7 +287,8 @@ var warnings = std.Vector.new([
var fac12FaultSuccess = warning.new(msg: " •IF UNSUCCESSFUL :", colour: "w"),
var fac12FaultFacOff = warning.new(msg: " -FAC 1+2............OFF", colour: "c"),
var yawDamperSysFault = warning.new(msg: "AUTO FLT YAW DAMPER SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1),
- var yawDamperSysFaultFac = warning.new(msg: " -FAC 1+2....OFF THEN ON", colour: "c"),
+ var yawDamperSysFaultFac1 = warning.new(msg: " -FAC 1......OFF THEN ON", colour: "c"),
+ var yawDamperSysFaultFac2 = warning.new(msg: " -FAC 2......OFF THEN ON", colour: "c"),
# var rudderTrimSysFault = warning.new(msg: "AUTO FLT RUD TRIM SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1), not implemented
# var rudderTrimSysFaultFac = warning.new(msg: " -FAC 1+2....OFF THEN ON", colour: "c"),
var rudTravLimSysFault = warning.new(msg: "AUTO FLT RUD TRV LIM SYS", colour: "a", aural: 1, light: 1, isMainMsg: 1),
@@ -542,11 +543,9 @@ var memos = std.Vector.new([
var pred_ws_off = memo.new(msg: "PRED W/S OFF"), # Not yet implemented
var terr_stby = memo.new(msg: "TERR STBY" ), # Not yet implemented
var tcas_stby = memo.new(msg: "TCAS STBY" ), # Not yet implemented
- var acars_call = memo.new(msg: "ACARS CALL" ), # Not yet implemented
var company_call = memo.new(msg: "COMPANY CALL"),
var satcom_alert = memo.new(msg: "SATCOM ALERT"), # Not yet implemented
- var acars_msg = memo.new(msg: "ACARS MSG" ), # Not yet implemented
- var company_msg = memo.new(msg: "COMPANY MSG" ), # Not yet implemented
+ var company_msg = memo.new(msg: "COMPANY MSG" ),
var eng_aice = memo.new(msg: "ENG A.ICE" ),
var wing_aice = memo.new(msg: "WING A.ICE" ),
var ice_not_det = memo.new(msg: "ICE NOT DET" ), # Not yet implemented
@@ -560,7 +559,6 @@ var memos = std.Vector.new([
var gpws_flap3 = memo.new(msg: "GPWS FLAP 3" ),
var hf_data_ovrd = memo.new(msg: "HF DATA OVRD"), # Not yet implemented
var hf_voice = memo.new(msg: "HF VOICE" ), # Not yet implemented
- var acars_stby = memo.new(msg: "ACARS STBY" ), # Not yet implemented
var vhf3_voice = memo.new(msg: "VHF3 VOICE" ),
var auto_brk_lo = memo.new(msg: "AUTO BRK LO" ),
var auto_brk_med = memo.new(msg: "AUTO BRK MED"),
diff --git a/Nasal/ECAM/ECAM-phases.nas b/Nasal/ECAM/ECAM-phases.nas
index a0188197..81a670ce 100644
--- a/Nasal/ECAM/ECAM-phases.nas
+++ b/Nasal/ECAM/ECAM-phases.nas
@@ -29,7 +29,7 @@ var FWC = {
phase5: props.globals.initNode("/ECAM/phases/monostable/phase-5", 0, "BOOL"),
phase7: props.globals.initNode("/ECAM/phases/monostable/phase-7", 0, "BOOL"),
phase9: props.globals.initNode("/ECAM/phases/monostable/phase-9", 0, "BOOL"),
- phase1Output: props.globals.initNode("/ECAM/phases/monostable/phase-1-output"),
+ phase1Output: props.globals.initNode("/ECAM/phases/monostable/phase-1-300-output"),
phase5Output: props.globals.initNode("/ECAM/phases/monostable/phase-5-output"),
phase7Output: props.globals.initNode("/ECAM/phases/monostable/phase-7-output"),
phase9Output: props.globals.initNode("/ECAM/phases/monostable/phase-9-output"),
@@ -150,7 +150,7 @@ var phaseLoop = func() {
}
if ((FWC.Logic.gnd.getBoolValue() and twoEngOff and myPhase == 9) and FWC.Flipflop.phase10Output.getBoolValue()) {
- FWC.Monostable.phase1.setBoolValue(1);
+ FWC.Monostable.phase1.setBoolValue(1); # true for 300 sec then false
} else {
FWC.Monostable.phase1.setBoolValue(0);
}
diff --git a/Nasal/FMGC/mcdu-messages.nas b/Nasal/FMGC/mcdu-messages.nas
index f7aa6575..8ac87b43 100644
--- a/Nasal/FMGC/mcdu-messages.nas
+++ b/Nasal/FMGC/mcdu-messages.nas
@@ -173,6 +173,7 @@ var MessageController = {
TypeIMessage.new("USING COST INDEX N", 1),TypeIMessage.new("WAIT FOR SYSTEM RESPONSE"),TypeIMessage.new("RWY/LS MISMATCH"),
TypeIMessage.new("VHF3 VOICE MSG NOT GEN"),TypeIMessage.new("NO COMM MSG NOT GEN"),TypeIMessage.new("WX UPLINK"),
TypeIMessage.new("SIMBRIEF DOWNLOAD FAILED"),TypeIMessage.new("MISSING USERNAME"),TypeIMessage.new("AOC ACT F-PLN UPLINK"),
+ TypeIMessage.new("NO ANSWER TO REQUEST"),TypeIMessage.new("NO D-ATIS AVAILABLE"),TypeIMessage.new("BAD SERVER RESPONSE")
]),
typeIIMessages: std.Vector.new([
TypeIIMessage.new("LAT DISCONT AHEAD", "amb", 0),TypeIIMessage.new("MORE DRAG"),TypeIIMessage.new("RWY/LS MISMATCH", "amb", 0),TypeIIMessage.new("STEP DELETED"),
diff --git a/Nasal/Libraries/libraries.nas b/Nasal/Libraries/libraries.nas
index 8cf22fe4..9a3a727f 100644
--- a/Nasal/Libraries/libraries.nas
+++ b/Nasal/Libraries/libraries.nas
@@ -383,7 +383,7 @@ controls.stepSpoilers = func(step) {
}
var deploySpeedbrake = func {
- if (pts.Gear.Wow[1].getBoolValue() or pts.Gear.Wow[2].getBoolValue()) {
+ if (pts.Gear.wow[1].getBoolValue() or pts.Gear.wow[2].getBoolValue()) {
if (pts.Controls.Flight.speedbrake.getValue() < 1.0) {
pts.Controls.Flight.speedbrake.setValue(1.0);
}
@@ -397,7 +397,7 @@ var deploySpeedbrake = func {
}
var retractSpeedbrake = func {
- if (pts.Gear.Wow[1].getBoolValue() or pts.Gear.Wow[2].getBoolValue()) {
+ if (pts.Gear.wow[1].getBoolValue() or pts.Gear.wow[2].getBoolValue()) {
if (pts.Controls.Flight.speedbrake.getValue() > 0.0) {
pts.Controls.Flight.speedbrake.setValue(0.0);
}
diff --git a/Nasal/MCDU/ATIS.nas b/Nasal/MCDU/ATIS.nas
new file mode 100644
index 00000000..520796cf
--- /dev/null
+++ b/Nasal/MCDU/ATIS.nas
@@ -0,0 +1,111 @@
+var atisPage = {
+ title: nil,
+ fontMatrix: [[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]],
+ arrowsMatrix: [[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]],
+ arrowsColour: [["ack", "ack", "ack", "ack", "ack", "ack"],["ack", "ack", "ack", "ack", "ack", "ack"]],
+ L1: [nil, nil, "ack"], # content, title, colour
+ L2: [nil, nil, "ack"],
+ L3: [nil, nil, "ack"],
+ L4: [nil, nil, "ack"],
+ L5: [nil, nil, "ack"],
+ L6: [nil, nil, "ack"],
+ C1: [nil, nil, "ack"],
+ C2: [nil, nil, "ack"],
+ C3: [nil, nil, "ack"],
+ C4: [nil, nil, "ack"],
+ C5: [nil, nil, "ack"],
+ C6: [nil, nil, "ack"],
+ R1: [nil, nil, "ack"],
+ R2: [nil, nil, "ack"],
+ R3: [nil, nil, "ack"],
+ R4: [nil, nil, "ack"],
+ R5: [nil, nil, "ack"],
+ R6: [nil, nil, "ack"],
+ computer: nil,
+ size: 0,
+ new: func(computer, index) {
+ var ap = {parents:[atisPage]};
+ ap.computer = computer;
+ ap.page = 1;
+ ap.index = index;
+ ap.message = atsu.ATISInstances[index].lastATIS;
+ ap._setupPageWithData();
+ ap._numPages = 1;
+ ap.update();
+ return ap;
+ },
+ del: func() {
+ return nil;
+ },
+ getNumPages: func() {
+ me._numPages = math.ceil(size(me.message) / 210);
+ return me._numPages;
+ },
+ scrollUp: func() {
+ me.page -= 1;
+ if (me.page < 1) {
+ me.page = me.getNumPages();
+ }
+ me.update();
+ },
+ scrollDown: func() {
+ me.page += 1;
+ if (me.page > me.getNumPages()) {
+ me.page = 1;
+ }
+ me.update();
+ },
+ _clearPage: func() {
+ me.L2 = [nil, nil, "wht"];
+ me.L3 = [nil, nil, "wht"];
+ me.L4 = [nil, nil, "wht"];
+ me.C1 = [nil, nil, "ack"];
+ me.C2 = [nil, nil, "ack"];
+ me.C3 = [nil, nil, "ack"];
+ me.C4 = [nil, nil, "ack"];
+ me.C5 = [nil, nil, "ack"];
+ me.R2 = [nil, nil, "ack"];
+ me.R3 = [nil, nil, "ack"];
+ me.R4 = [nil, nil, "ack"];
+ me.R5 = [nil, nil, "ack"];
+ me.arrowsMatrix = [[0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0]];
+ },
+ _setupPageWithData: func() {
+ me.title = atsu.ATISInstances[me.index].station ~ "/" ~ (atsu.ATISInstances[me.index].type == 0 ? "ARR" : "DEP") ~ " ATIS ";
+ me.L5 = [" PREV ATIS", nil, "wht"];
+ me.L6 = [" RETURN", " ATIS MENU", "wht"];
+ me.R6 = ["PRINT ", nil, "blu"];
+ me.arrowsMatrix = [[0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1]];
+ me.arrowsColour = [["ack", "ack", "ack", "ack", "wht", "wht"], ["ack", "ack", "ack", "ack", "ack", "blu"]];
+ me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]];
+ canvas_mcdu.pageSwitch[me.computer].setBoolValue(0);
+ },
+ update: func() {
+ me._clearPage();
+ var message = atsu.ATISInstances[me.index].lastATIS;
+ var pageMinusOne = (me.page - 1);
+ var numberExtraChar = pageMinusOne * 210;
+ me.L1 = [substr(message, numberExtraChar, 30), atsu.ATISInstances[me.index].station ~ "/" ~ (atsu.ATISInstances[me.index].type == 0 ? "ARR" : "DEP"), "wht"];
+ me.R1 = [" ",atsu.DictionaryString.fetchString1(atsu.ATISInstances[me.index].receivedCode).string2 ~ " " ~ atsu.ATISInstances[me.index].receivedTime ~ "Z", "wht"];
+ if (size(message) > 30) {
+ me.L2[1] = substr(message, numberExtraChar + 30, 30);
+ }
+ if (size(message) > 60) {
+ me.L2[0] = substr(message, numberExtraChar + 60, 30);
+ }
+ if (size(message) > 90) {
+ me.L3[1] = substr(message, numberExtraChar + 90, 30);
+ }
+ if (size(message) > 120) {
+ me.L3[0] = substr(message, numberExtraChar + 120, 30);
+ }
+ if (size(message) > 150) {
+ me.L4[1] = substr(message, numberExtraChar + 150, 30);
+ }
+ if (size(message) > 180) {
+ me.L4[0] = substr(message, numberExtraChar + 180, 30);
+ }
+
+ canvas_mcdu.pageSwitch[me.computer].setBoolValue(0);
+ },
+};
\ No newline at end of file
diff --git a/Nasal/MCDU/INITA.nas b/Nasal/MCDU/INITA.nas
index e5cb5104..e734af23 100644
--- a/Nasal/MCDU/INITA.nas
+++ b/Nasal/MCDU/INITA.nas
@@ -27,6 +27,7 @@ var initInputA = func(key, i) {
if (tfs == 4) {
fmgc.FMGCInternal.altAirport = scratchpad;
fmgc.FMGCInternal.altAirportSet = 1;
+ atsu.ATISInstances[2].newStation(scratchpad);
fmgc.windController.updatePlans();
if (fmgc.FMGCInternal.blockConfirmed) {
fmgc.FMGCInternal.fuelCalculating = 0;
@@ -219,6 +220,8 @@ var initInputA = func(key, i) {
}
fmgc.FMGCInternal.depApt = fromto[0];
fmgc.FMGCInternal.arrApt = fromto[1];
+ atsu.ATISInstances[0].newStation(fromto[0]);
+ atsu.ATISInstances[1].newStation(fromto[1]);
fmgc.FMGCInternal.toFromSet = 1;
fmgc.FMGCNodes.toFromSet.setValue(1);
#scratchpad
diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas
index 97754a25..05d5d240 100644
--- a/Nasal/MCDU/MCDU.nas
+++ b/Nasal/MCDU/MCDU.nas
@@ -5,6 +5,7 @@
var pageNode = [props.globals.getNode("/MCDU[0]/page"), props.globals.getNode("/MCDU[1]/page")];
var page = nil;
+var msg = nil;
var scratchpadNode = [nil, nil];
var MCDU_init = func(i) {
@@ -285,6 +286,74 @@ var lskbutton = func(btn, i) {
pageNode[i].setValue("WEATHERREQ");
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(1);
+ } else if (page == "ATIS") {
+ var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
+ if (scratchpad == "CLR") {
+ if (atsu.ATISInstances[0].sent != 1) {
+ if (fmgc.FMGCInternal.depApt != "") {
+ atsu.ATISInstances[0].newStation(fmgc.FMGCInternal.depApt);
+ } else {
+ atsu.ATISInstances[0].station = nil;
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (size(scratchpad) == 0) {
+ if (atsu.ATISInstances[0].received) {
+ canvas_mcdu.myAtis[i] = atisPage.new(i, 0);
+ pageNode[i].setValue("ATISDETAIL");
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (find("/", scratchpad) != -1) {
+ var str = split("/", scratchpad);
+ if (size(str[0]) > 0 and size(str[1]) == 0) {
+ var result = atsu.ATISInstances[0].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ } elsif (size(str[0]) == 0 and size(str[1]) > 0) {
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[0].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[0].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } elsif (size(str[0]) > 0 and size(str[1]) > 0) {
+ var result = atsu.ATISInstances[0].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[0].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[0].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } else {
+ var result = atsu.ATISInstances[0].newStation(scratchpad);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -356,7 +425,76 @@ var lskbutton = func(btn, i) {
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(2);
} else if (page == "DATAMODE") {
- atsu.ATIS.server = 0;
+ atsu.ATIS.serverSel.setValue("faa");
+ acconfig.writeSettings();
+ } else if (page == "ATIS") {
+ var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
+ if (scratchpad == "CLR") {
+ if (atsu.ATISInstances[1].sent != 1) {
+ if (fmgc.FMGCInternal.arrApt != "") {
+ atsu.ATISInstances[1].newStation(fmgc.FMGCInternal.arrApt);
+ } else {
+ atsu.ATISInstances[1].station = nil;
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (size(scratchpad) == 0) {
+ if (atsu.ATISInstances[1].received) {
+ canvas_mcdu.myAtis[i] = atisPage.new(i, 1);
+ pageNode[i].setValue("ATISDETAIL");
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (find("/", scratchpad) != -1) {
+ var str = split("/", scratchpad);
+ if (size(str[0]) > 0 and size(str[1]) == 0) {
+ var result = atsu.ATISInstances[1].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ } elsif (size(str[0]) == 0 and size(str[1]) > 0) {
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[1].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[1].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } elsif (size(str[0]) > 0 and size(str[1]) > 0) {
+ var result = atsu.ATISInstances[1].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[1].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[1].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } else {
+ var result = atsu.ATISInstances[1].newStation(scratchpad);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -411,7 +549,76 @@ var lskbutton = func(btn, i) {
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(3);
} else if (page == "DATAMODE") {
- atsu.ATIS.server = 1;
+ atsu.ATIS.serverSel.setValue("vatsim");
+ acconfig.writeSettings();
+ } else if (page == "ATIS") {
+ var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
+ if (scratchpad == "CLR") {
+ if (atsu.ATISInstances[2].sent != 1) {
+ if (fmgc.FMGCInternal.altAirportSet) {
+ atsu.ATISInstances[2].newStation(fmgc.FMGCInternal.altAirport);
+ } else {
+ atsu.ATISInstances[2].station = nil;
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (size(scratchpad) == 0) {
+ if (atsu.ATISInstances[2].received) {
+ canvas_mcdu.myAtis[i] = atisPage.new(i, 2);
+ pageNode[i].setValue("ATISDETAIL");
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (find("/", scratchpad) != -1) {
+ var str = split("/", scratchpad);
+ if (size(str[0]) > 0 and size(str[1]) == 0) {
+ var result = atsu.ATISInstances[2].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ } elsif (size(str[0]) == 0 and size(str[1]) > 0) {
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[2].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[2].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } elsif (size(str[0]) > 0 and size(str[1]) > 0) {
+ var result = atsu.ATISInstances[2].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[2].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[2].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } else {
+ var result = atsu.ATISInstances[2].newStation(scratchpad);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -460,6 +667,70 @@ var lskbutton = func(btn, i) {
}
} else if (page == "RECEIVEDMSGS") {
canvas_mcdu.myReceivedMessages[i].leftKey(4);
+ } else if (page == "ATIS") {
+ var scratchpad = mcdu_scratchpad.scratchpads[i].scratchpad;
+ if (scratchpad == "CLR") {
+ if (atsu.ATISInstances[3].sent != 1) {
+ atsu.ATISInstances[3].station = nil;
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (size(scratchpad) == 0) {
+ if (atsu.ATISInstances[3].received) {
+ canvas_mcdu.myAtis[i] = atisPage.new(i, 3);
+ pageNode[i].setValue("ATISDETAIL");
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } elsif (find("/", scratchpad) != -1) {
+ var str = split("/", scratchpad);
+ if (size(str[0]) > 0 and size(str[1]) == 0) {
+ var result = atsu.ATISInstances[3].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ } elsif (size(str[0]) == 0 and size(str[1]) > 0) {
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[3].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[3].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } elsif (size(str[0]) > 0 and size(str[1]) > 0) {
+ var result = atsu.ATISInstances[3].newStation(str[0]);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ if (str[1] == "DEP") {
+ atsu.ATISInstances[3].type = 1;
+ } elsif (str[1] == "ARR") {
+ atsu.ATISInstances[3].type = 0;
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ mcdu_scratchpad.scratchpads[i].empty();
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
+ } else {
+ var result = atsu.ATISInstances[3].newStation(scratchpad);
+ if (result == 2) {
+ mcdu_message(i, "NOT IN DATA BASE");
+ } elsif (result == 1) {
+ mcdu_message(i, "NOT ALLOWED");
+ } elsif (result == 0) {
+ mcdu_scratchpad.scratchpads[i].empty();
+ }
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -585,6 +856,12 @@ var lskbutton = func(btn, i) {
pageNode[i].setValue("ATSUDLINK");
} else if (page == "COMMINIT" or page == "VOICEDIRECTORY" or page == "DATAMODE" or page == "COMMSTATUS" or page == "COMPANYCALL") {
pageNode[i].setValue("COMMMENU");
+ } else if (page == "ATIS") {
+ pageNode[i].setValue("ATCMENU2");
+ } else if (page == "ATISDETAIL") {
+ pageNode[i].setValue("ATIS");
+ } else if (page == "AOCCONFIG") {
+ pageNode[i].setValue("AOCMENU");
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -666,6 +943,14 @@ var rskbutton = func(btn, i) {
} else if (page == "WEATHERTYPE") {
atsu.AOC.selectedType = "TERM FCST";
pageNode[i].setValue("WEATHERREQ");
+ } else if (page == "ATCMENU2") {
+ pageNode[i].setValue("ATIS");
+ } else if (page == "ATIS") {
+ if (atsu.ATISInstances[0].station != nil and atsu.ATISInstances[0].sent != 1) {
+ atsu.ATISInstances[0].sendReq(i);
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -698,7 +983,14 @@ var rskbutton = func(btn, i) {
} else if (page == "AOCMENU") {
pageNode[i].setValue("WEATHERREQ");
} else if (page == "DATAMODE") {
- atsu.AOC.server = 0;
+ atsu.AOC.server.setValue("noaa");
+ acconfig.writeSettings();
+ } else if (page == "ATIS") {
+ if (atsu.ATISInstances[1].station != nil and atsu.ATISInstances[1].sent != 1) {
+ atsu.ATISInstances[1].sendReq(i);
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -737,7 +1029,14 @@ var rskbutton = func(btn, i) {
canvas_mcdu.myReceivedMessages[i] = receivedMessagesPage.new(i);
pageNode[i].setValue("RECEIVEDMSGS");
} else if (page == "DATAMODE") {
- atsu.AOC.server = 1;
+ atsu.AOC.server.setValue("vatsim");
+ acconfig.writeSettings();
+ } else if (page == "ATIS") {
+ if (atsu.ATISInstances[2].station != nil and atsu.ATISInstances[2].sent != 1) {
+ atsu.ATISInstances[2].sendReq(i);
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -798,6 +1097,12 @@ var rskbutton = func(btn, i) {
canvas_mcdu.myArrival[i].arrPushbuttonRight(4);
} else if (page == "F-PLNA" or page == "F-PLNB") {
canvas_mcdu.myFpln[i].pushButtonRight(4);
+ } else if (page == "ATIS") {
+ if (atsu.ATISInstances[3].station != nil and atsu.ATISInstances[3].sent != 1) {
+ atsu.ATISInstances[3].sendReq(i);
+ } else {
+ mcdu_message(i, "NOT ALLOWED");
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -884,7 +1189,7 @@ var rskbutton = func(btn, i) {
} elsif (result == 4) {
mcdu.mcdu_message(i, "NO COMM MSG NOT GEN");
} else {
- mcdu_scratchpad.scratchpads[i].empty();
+ pageNode[i].setValue("AOCMENU");
}
} else if (page == "VOICEDIRECTORY") {
for (var i = 0; i < 3; i = i + 1) {
@@ -892,6 +1197,8 @@ var rskbutton = func(btn, i) {
rmp.transfer(i + 1);
}
}
+ } else if (page == "AOCMENU") {
+ pageNode[i].setValue("AOCCONFIG");
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -944,6 +1251,13 @@ var rskbutton = func(btn, i) {
pageNode[i].setValue("COMMMENU");
} else if (page == "CONNECTSTATUS") {
pageNode[i].setValue("NOTIFICATION");
+ } else if (page == "AOCMENU") {
+ msg = mcdu.ReceivedMessagesDatabase.firstUnviewed();
+ if (msg != -99) {
+ canvas_mcdu.myReceivedMessages[i] = receivedMessagesPage.new(i);
+ canvas_mcdu.myReceivedMessage[i] = receivedMessagePage.new(i, msg);
+ pageNode[i].setValue("RECEIVEDMSG");
+ }
} else {
mcdu_message(i, "NOT ALLOWED");
}
@@ -1029,6 +1343,8 @@ var arrowbutton = func(btn, i) {
initInputIRS("up",i);
} else if (page == "WINDCRZ") {
canvas_mcdu.myCRZWIND[i].pushButtonUp();
+ } else if (page == "ATISDETAIL") {
+ canvas_mcdu.myAtis[i].scrollUp();
}
} else if (btn == "down") {
if (page == "F-PLNA" or page == "F-PLNB") {
@@ -1043,6 +1359,8 @@ var arrowbutton = func(btn, i) {
initInputIRS("down",i);
} else if (page == "WINDCRZ") {
canvas_mcdu.myCRZWIND[i].pushButtonDown();
+ } else if (page == "ATISDETAIL") {
+ canvas_mcdu.myAtis[i].scrollDown();
}
}
}
@@ -1088,7 +1406,7 @@ var pagebutton = func(btn, i) {
pageNode[i].setValue("DATA");
} else if (btn == "mcdu") {
var page = page;
- if (page != "ATSUDLINK" and page != "AOCMENU" and page != "WEATHERREQ" and page != "WEATHERTYPE" and page != "RECEIVEDMSGS" and page != "RECEIVEDMSG" and page != "ATCMENU" and page != "ATCMENU2" and page != "NOTIFICATION" and page != "CONNECTSTATUS" and page != "COMPANYCALL" and page != "VOICEDIRECTORY" and page != "DATAMODE" and page != "COMMMENU" and page != "COMMSTATUS" and page != "COMMINIT") {
+ if (page != "ATSUDLINK" and page != "AOCMENU" and page != "AOCCONFIG" and page != "WEATHERREQ" and page != "WEATHERTYPE" and page != "RECEIVEDMSGS" and page != "RECEIVEDMSG" and page != "ATCMENU" and page != "ATCMENU2" and page != "NOTIFICATION" and page != "CONNECTSTATUS" and page != "COMPANYCALL" and page != "VOICEDIRECTORY" and page != "DATAMODE" and page != "COMMMENU" and page != "COMMSTATUS" and page != "COMMINIT" and page != "ATIS" and page != "ATISDETAIL") {
setprop("/MCDU[" ~ i ~ "]/last-fmgc-page", page);
} else {
setprop("/MCDU[" ~ i ~ "]/last-atsu-page", page);
diff --git a/Nasal/MCDU/RECEIVEDMESSAGES.nas b/Nasal/MCDU/RECEIVEDMESSAGES.nas
index 1430ca53..13018346 100644
--- a/Nasal/MCDU/RECEIVEDMESSAGES.nas
+++ b/Nasal/MCDU/RECEIVEDMESSAGES.nas
@@ -73,7 +73,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -4) {
message = ReceivedMessagesDatabase.database.vector[-5 + (me.curPage * 5)];
- me.L1[0] = " " ~ left(message.body, 23);
+ me.L1[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L1[2] = "blu";
if (!message.viewed) {
me.L1[1] = " " ~ message.time ~ " NEW";
@@ -85,7 +85,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -3) {
message = ReceivedMessagesDatabase.database.vector[-4 + (me.curPage * 5)];
- me.L2[0] = " " ~ left(message.body, 23);
+ me.L2[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L2[2] = "blu";
if (!message.viewed) {
me.L2[1] = " " ~ message.time ~ " NEW";
@@ -97,7 +97,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -2) {
message = ReceivedMessagesDatabase.database.vector[-3 + (me.curPage * 5)];
- me.L3[0] = " " ~ left(message.body, 23);
+ me.L3[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L3[2] = "blu";
if (!message.viewed) {
me.L3[1] = " " ~ message.time ~ " NEW";
@@ -109,7 +109,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + -1) {
message = ReceivedMessagesDatabase.database.vector[-2 + (me.curPage * 5)];
- me.L4[0] = " " ~ left(message.body, 23);
+ me.L4[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L4[2] = "blu";
if (!message.viewed) {
me.L4[1] = " " ~ message.time ~ " NEW";
@@ -121,7 +121,7 @@ var receivedMessagesPage = {
if (me.size >= (me.curPage * 5) + 0) {
message = ReceivedMessagesDatabase.database.vector[-1 + (me.curPage * 5)];
- me.L5[0] = " " ~ left(message.body, 23);
+ me.L5[0] = " " ~ left(message.body, size(message.body) > 23 ? 23 : size(message.body));
me.L5[2] = "blu";
if (!message.viewed) {
me.L5[1] = " " ~ message.time ~ " NEW";
@@ -134,8 +134,19 @@ var receivedMessagesPage = {
},
leftKey: func(index) {
if (ReceivedMessagesDatabase.getSize() >= (-5 + index + (me.curPage * 5))) {
- canvas_mcdu.myReceivedMessage[me.computer] = receivedMessagePage.new(me.computer, (-6 + index + (me.curPage * 5)));
- setprop("MCDU[" ~ me.computer ~ "]/page", "RECEIVEDMSG");
+ if (mcdu_scratchpad.scratchpads[me.computer].scratchpad == "CLR") {
+ ReceivedMessagesDatabase.removeAtIndex(-6 + index + (me.curPage * 5));
+ me.update();
+ if (ReceivedMessagesDatabase.getSize() < (me.curPage * 5) and ReceivedMessagesDatabase.getSize() >= 5) {
+ me.scrollLeft();
+ }
+ mcdu_scratchpad.scratchpads[me.computer].empty();
+ } elsif (size(mcdu_scratchpad.scratchpads[me.computer].scratchpad) == 0) {
+ canvas_mcdu.myReceivedMessage[me.computer] = receivedMessagePage.new(me.computer, (-6 + index + (me.curPage * 5)));
+ setprop("MCDU[" ~ me.computer ~ "]/page", "RECEIVEDMSG");
+ } else {
+ mcdu_message(me.computer, "NOT ALLOWED");
+ }
} else {
mcdu_message(me.computer, "NOT ALLOWED");
}
@@ -288,12 +299,23 @@ var ReceivedMessagesDatabase = {
canvas_mcdu.myReceivedMessages[1].update();
}
},
+ firstUnviewed: func() {
+ for (var i = 0; i < me.getSize(); i = i + 1) {
+ if (!me.database.vector[i].viewed) {
+ return i;
+ }
+ }
+ return -99;
+ },
getCountPages: func() {
- return math.ceil(me.database.size() / 5);
+ return math.ceil(me.getSize() / 5);
},
getSize: func() {
return me.database.size();
},
+ removeAtIndex: func(index) {
+ return me.database.pop(index);
+ },
clearDatabase: func() {
me.database.clear();
},
diff --git a/Nasal/Systems/Comm/CPDLC.nas b/Nasal/Systems/Comm/CPDLC.nas
index ca01dc3c..fb680947 100644
--- a/Nasal/Systems/Comm/CPDLC.nas
+++ b/Nasal/Systems/Comm/CPDLC.nas
@@ -2,41 +2,6 @@
# Jonathan Redpath
# Copyright (c) 2020 Josh Davidson (Octal450)
-var DictionaryItem = {
- new: func(item, string) {
- var DI = {parents: [DictionaryItem]};
- DI.item = item;
- DI.string = string;
- return DI;
- },
-};
-
-var Dictionary = {
- database: std.Vector.new(),
- addToDatabase: func(dictItem) {
- me.database.append(dictItem);
- },
- fetchString: func(string) {
- foreach (var item; me.database.vector) {
- if (me.item.string == string) {
- return item;
- }
- }
- },
- fetchItem: func(itemObj) {
- foreach (var item; me.database.vector) {
- if (item.item == itemObj) {
- return item;
- }
- }
- },
-};
-
-makeNewDictionaryItem = func(item, string) {
- var dictItem = DictionaryItem.new(item, string);
- Dictionary.addToDatabase(dictItem);
-};
-
var CPDLCmessage = {
new: func(text) {
var cpdlcMessage = {parents: [CPDLCmessage] };
diff --git a/Nasal/Systems/Comm/Dictionary.nas b/Nasal/Systems/Comm/Dictionary.nas
new file mode 100644
index 00000000..8d9e2655
--- /dev/null
+++ b/Nasal/Systems/Comm/Dictionary.nas
@@ -0,0 +1,75 @@
+# A3XX Dictionary
+# Jonathan Redpath
+
+# Copyright (c) 2020 Josh Davidson (Octal450)
+var DictionaryItemObj = {
+ new: func(item, string) {
+ var DI = {parents: [DictionaryItemObj]};
+ DI.item = item;
+ DI.string = string;
+ return DI;
+ },
+};
+
+var DictionaryObj = {
+ database: std.Vector.new(),
+ addToDatabase: func(dictItem) {
+ me.database.append(dictItem);
+ },
+ fetchString: func(string) {
+ foreach (var item; me.database.vector) {
+ if (me.item.string == string) {
+ return item;
+ }
+ }
+ },
+ fetchItem: func(itemObj) {
+ foreach (var item; me.database.vector) {
+ if (item.item == itemObj) {
+ return item;
+ }
+ }
+ },
+};
+
+var makeNewDictionaryItem = func(item, string) {
+ var dictItem = DictionaryItemObj.new(item, string);
+ DictionaryObj.addToDatabase(dictItem);
+};
+
+var DictionaryItemString = {
+ new: func(string1, string2) {
+ var DI = {parents: [DictionaryItemString]};
+ DI.string1 = string1;
+ DI.string2 = string2;
+ return DI;
+ },
+};
+
+var DictionaryString = {
+ database: std.Vector.new(),
+ addToDatabase: func(dictItem) {
+ me.database.append(dictItem);
+ },
+ fetchString1: func(stringSearch) {
+ foreach (var item; me.database.vector) {
+ if (string.uc(item.string1) == string.uc(stringSearch)) {
+ return item;
+ }
+ }
+ return "";
+ },
+ fetchString2: func(stringSearch) {
+ foreach (var item; me.database.vector) {
+ if (string.uc(item.string2) == string.uc(stringSearch)) {
+ return item;
+ }
+ }
+ return "";
+ },
+};
+
+var makeNewDictionaryString = func(string1, string2) {
+ var dictItem = DictionaryItemString.new(string1, string2);
+ DictionaryString.addToDatabase(dictItem);
+};
\ No newline at end of file
diff --git a/Nasal/Systems/Comm/Notification.nas b/Nasal/Systems/Comm/Notification.nas
index 642a5386..339c6d74 100644
--- a/Nasal/Systems/Comm/Notification.nas
+++ b/Nasal/Systems/Comm/Notification.nas
@@ -3,7 +3,6 @@
# Copyright (c) 2020 Josh Davidson (Octal450)
var defaultServer = "https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&mostRecent=true&hoursBeforeNow=12&stationString=";
-var serverString = "";
var result = nil;
var ATSU = {
@@ -104,15 +103,10 @@ var AOC = {
sentTime: nil,
received: 0,
receivedTime: nil,
- server: 0, # 0 = noaa, 1 = vatsim
+ server: props.globals.getNode("/systems/atsu/wxr-server"),
newStation: func(airport) {
if (size(airport) == 3 or size(airport) == 4) {
- if (size(findAirportsByICAO(airport)) == 0) {
- return 2;
- } else {
- me.station = airport;
- return 0;
- }
+ me.station = airport;
} else {
return 1;
}
@@ -123,9 +117,18 @@ var AOC = {
}
me.sent = 1;
me.received = 0;
+
var sentTime = left(getprop("/sim/time/gmt-string"), 5);
me.sentTime = split(":", sentTime)[0] ~ "." ~ split(":", sentTime)[1] ~ "Z";
+ if (size(findAirportsByICAO(me.station)) == 0) {
+ me.received = 1;
+ me.receivedTime = me.sentTime;
+ var message = mcdu.ACARSMessage.new(me.receivedTime, "INVALID STATION " ~ me.station);
+ mcdu.ReceivedMessagesDatabase.addMessage(message);
+ return 0;
+ }
+
if (me.selectedType == "HOURLY WX") {
var result = me.fetchMETAR(atsu.AOC.station, i);
if (result == 0) {
@@ -148,8 +151,13 @@ var AOC = {
}
}
},
+ downloadFail: func(i, r = nil) {
+ mcdu.mcdu_message(i,"NO ANSWER TO REQUEST");
+ debug.dump("HTTP failure " ~ r.status);
+ me.sent = 0;
+ },
fetchMETAR: func(airport, i) {
- if (!ATSU.working) {
+ if (!ATSU.working or !fmgc.FMGCInternal.flightNumSet) {
me.sent = 0;
return 2;
}
@@ -158,23 +166,29 @@ var AOC = {
return 1;
}
- serverString = "";
-
- if (me.server == 0) {
- serverString = defaultServer;
- } elsif (me.server == 1) {
+ var serverString = "";
+ if (me.server.getValue() == "vatsim") {
serverString = "https://api.flybywiresim.com/metar?source=vatsim&icao=";
- } else { # fall back to NOAA silently
+ } else {
serverString = defaultServer;
}
http.load(serverString ~ airport)
- .fail(func(r) print("Download failed; try changing your server to NOAA"))
- .done(func(r) me.processMETAR(r, i));
+ .fail(func(r) me.downloadFail(i, r))
+ .done(func(r) {
+ var errs = [];
+ call(me.processMETAR, [r, i], me, {}, errs);
+ if (size(errs) > 0) {
+ print("Failed to parse METAR for " ~ airport);
+ debug.dump(r.response);
+ debug.printerror(errs);
+ mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
+ }
+ });
return 0;
},
fetchTAF: func(airport, i) {
- if (!ATSU.working) {
+ if (!ATSU.working or !fmgc.FMGCInternal.flightNumSet) {
me.sent = 0;
return 2;
}
@@ -183,15 +197,33 @@ var AOC = {
return 1;
}
http.load("https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=tafs&requestType=retrieve&format=xml&timeType=issue&mostRecent=true&hoursBeforeNow=12&stationString=" ~ airport)
- .fail(func print("Download failed!"))
- .done(func(r) me.processTAF(r, i));
+ .fail(func(r) me.downloadFail(i))
+ .done(func(r) {
+ var errs = [];
+ call(me.processTAF, [r, i], me, {}, errs);
+ if (size(errs) > 0) {
+ print("Failed to parse TAF for " ~ airport);
+ debug.dump(r.response);
+ debug.printerror(errs);
+ mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
+ }
+ });
return 0;
},
processMETAR: func(r, i) {
var raw = r.response;
- raw = split("", raw)[1];
- raw = split("", raw)[0];
- me.lastMETAR = raw;
+ if (me.server.getValue() == "vatsim") {
+ me.lastMETAR = raw;
+ } else if (find("", raw) != -1) {
+ raw = split("", raw)[1];
+ raw = split("", raw)[0];
+ me.lastMETAR = raw;
+ } else {
+ me.received = 0;
+ me.sent = 0;
+ mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
+ return;
+ }
settimer(func() {
me.received = 1;
mcdu.mcdu_message(i, "WX UPLINK");
@@ -204,8 +236,16 @@ var AOC = {
},
processTAF: func(r, i) {
var raw = r.response;
- raw = split("", raw)[1];
- raw = split("", raw)[0];
+ if (find("", raw) != -1) {
+ raw = split("", raw)[1];
+ raw = split("", raw)[0];
+ me.lastTAF = raw;
+ } else {
+ me.received = 0;
+ me.sent = 0;
+ mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
+ return;
+ }
me.lastTAF = raw;
settimer(func() {
me.received = 1;
@@ -220,14 +260,21 @@ var AOC = {
};
var ATIS = {
- station: nil,
- lastATIS: nil,
- sent: 0,
- sentTime: nil,
- received: 0,
- receivedTime: nil,
- server: 0,
+ serverSel: props.globals.getNode("/systems/atsu/atis-server"),
+ new: func() {
+ var ATIS = { parents: [ATIS] };
+ ATIS.station = nil;
+ ATIS.lastATIS = nil;
+ ATIS.sent = 0;
+ ATIS.received = 0;
+ ATIS.receivedTime = nil;
+ ATIS.receivedCode = nil;
+ ATIS.type = 0; # 0 = arr, 1 = dep
+ return ATIS;
+ },
newStation: func(airport) {
+ me.sent = 0;
+ me.received = 0;
if (size(airport) == 3 or size(airport) == 4) {
if (size(findAirportsByICAO(airport)) == 0) {
return 2;
@@ -245,10 +292,8 @@ var ATIS = {
}
me.sent = 1;
me.received = 0;
- var sentTime = left(getprop("/sim/time/gmt-string"), 5);
- me.sentTime = split(":", sentTime)[0] ~ "." ~ split(":", sentTime)[1] ~ "Z";
- result = me.fetchATIS(atsu.ATIS.station, i);
+ result = me.fetchATIS(me.station, i);
if (result == 0) {
return 0;
} elsif (result == 1) {
@@ -267,39 +312,139 @@ var ATIS = {
return 1;
}
- serverString = "";
-
- if (me.server == 0) {
- serverString = "https://api.flybywiresim.com/atis?source=faa&icao=";
- } elsif (me.server == 1) {
- serverString = "https://api.flybywiresim.com/atis?source=vatsim&icao=";
- } else { # fall back to FAA silently
- serverString = "https://api.flybywiresim.com/atis?source=faa&icao=";
- }
+ var serverString = "https://api.flybywiresim.com/atis?source=" ~ me.serverSel.getValue() ~ "&icao=";
http.load(serverString ~ airport)
.fail(func(r) return 3)
- .done(func(r) me.processATIS(r, i));
+ .done(func(r) {
+ var errs = [];
+ call(me.processATIS, [r, i], me, {}, errs);
+ if (size(errs) > 0) {
+ print("Failed to parse ATIS for " ~ airport);
+ debug.dump(r.response);
+ debug.printerror(errs);
+ mcdu.mcdu_message(i, "BAD SERVER RESPONSE");
+ }
+ });
return 0;
},
processATIS: func(r, i) {
var raw = r.response;
- if (find("combined", raw)) {
+ if (r.response == "FBW_ERROR: D-ATIS not available at this airport") {
+ me.received = 0;
+ me.sent = 0;
+ mcdu.mcdu_message(i,"NO D-ATIS AVAILABLE");
+ return;
+ }
+ if (find("combined", raw) != -1) {
raw = split('{"combined":"', raw)[1];
raw = split('"}', raw)[0];
} else {
- raw = split('{"arr":"', raw)[1];
- raw = split('","dep":', raw)[0];
+ if (me.type == 0) {
+ raw = split('{"arr":"', raw)[1];
+ raw = split('","dep":', raw)[0];
+ } else {
+ raw = split('","dep":"', raw)[1];
+ raw = split('"}', raw)[0];
+ }
}
- me.lastATIS = raw;
+
+ var code = "";
+ if (find("INFO ", raw) != -1) {
+ code = split("INFO ", raw)[1];
+ code = split(" ", code)[0];
+ } else if (find("information ", raw) != -1) {
+ code = split("information ", raw)[1];
+ code = split(" ", code)[0];
+ } else if (find("INFORMATION ", raw) != -1) {
+ code = split("INFORMATION ", raw)[1];
+ code = split(" ", code)[0];
+ } else if (find("ATIS ", raw) != -1) {
+ code = split("ATIS ", raw)[1];
+ code = split(" ", code)[0];
+ } else if (find("info ", raw) != -1) {
+ code = split("info ", raw)[1];
+ code = split(" ", code)[0];
+ } else {
+ print("Failed to find a valid ATIS code for " ~ me.station);
+ debug.dump(raw);
+ }
+
+ if (find(".", code) != -1) {
+ code = split(".", code)[0];
+ }
+
+ me.receivedCode = code;
+
+ var time = "";
+ if (find("Time ", raw) != -1) {
+ time = split("Time ", raw)[1];
+ time = split(" ", time)[0];
+ } else if (find("time ", raw) != -1) {
+ time = split("time ", raw)[1];
+ time = split(" ", time)[0];
+ } else if (find("TIME ", raw) != -1) {
+ time = split("TIME ", raw)[1];
+ time = split(" ", time)[0];
+ } else if (find("Z.", raw) != -1) {
+ time = split("Z.", raw)[0];
+ time = right(time, 4);
+ } else if (find("Z SPECIAL", raw) != -1) {
+ time = split("Z SPECIAL", raw)[0];
+ time = right(time, 4);
+ } else if (find("metreport", raw) != -1) {
+ time = split("metreport", raw)[0];
+ time = right(time, 4);
+ } else if (find((code ~ " "), raw) != -1) {
+ if (size(split(" ",split(code ~ " ", raw)[1])[0]) == 4) {
+ time = split(" ",split(code ~ " ", raw)[1])[0];
+ }
+ } else {
+ print("Failed to find a valid ATIS time for " ~ me.station);
+ debug.dump(raw);
+ }
+
+ if (size(time) == 3) {
+ time ~= " ";
+ }
+
+ raw = string.uc(raw);
+ raw = string.replace(raw, ",", "");
+
settimer(func() {
+ me.sent = 0;
me.received = 1;
- mcdu.mcdu_message(i, "WX UPLINK");
-
- var receivedTime = left(getprop("/sim/time/gmt-string"), 5);
- me.receivedTime = split(":", receivedTime)[0] ~ "." ~ split(":", receivedTime)[1] ~ "Z";
- var message = mcdu.ACARSMessage.new(me.receivedTime, me.lastATIS);
- mcdu.ReceivedMessagesDatabase.addMessage(message);
- }, math.max(rand()*10, 2.25));
+ me.receivedTime = time;
+ me.lastATIS = raw;
+ }, math.max(rand()*10, 4.5));
},
-};
\ No newline at end of file
+};
+
+makeNewDictionaryString("A", "ALPHA");
+makeNewDictionaryString("B", "BRAVO");
+makeNewDictionaryString("C", "CHARLIE");
+makeNewDictionaryString("D", "DELTA");
+makeNewDictionaryString("E", "ECHO");
+makeNewDictionaryString("F", "FOXTROT");
+makeNewDictionaryString("G", "GOLF");
+makeNewDictionaryString("H", "HOTEL");
+makeNewDictionaryString("I", "INDIA");
+makeNewDictionaryString("J", "JULIET");
+makeNewDictionaryString("K", "KILO");
+makeNewDictionaryString("L", "LIMA");
+makeNewDictionaryString("M", "MIKE");
+makeNewDictionaryString("N", "NOVEMBER");
+makeNewDictionaryString("O", "OSCAR");
+makeNewDictionaryString("P", "PAPA");
+makeNewDictionaryString("Q", "QUEBEC");
+makeNewDictionaryString("R", "ROMEO");
+makeNewDictionaryString("S", "SIERRA");
+makeNewDictionaryString("T", "TANGO");
+makeNewDictionaryString("U", "UNIFORM");
+makeNewDictionaryString("V", "VICTOR");
+makeNewDictionaryString("W", "WHISKEY");
+makeNewDictionaryString("X", "XRAY");
+makeNewDictionaryString("Y", "YANKEE");
+makeNewDictionaryString("Z", "ZULU");
+
+var ATISInstances = [ATIS.new(), ATIS.new(), ATIS.new(), ATIS.new()];
\ No newline at end of file
diff --git a/Systems/a320-electrical.xml b/Systems/a320-electrical.xml
index 8fb63914..ff21dced 100644
--- a/Systems/a320-electrical.xml
+++ b/Systems/a320-electrical.xml
@@ -772,6 +772,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-1/gcu-1-voltage-trip eq 1
/controls/electrical/switches/gen-1 eq 1
@@ -787,6 +788,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-1/gcu-1-frequency-trip eq 1
/controls/electrical/switches/gen-1 eq 1
@@ -845,6 +847,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-2/gcu-2-voltage-trip eq 1
/controls/electrical/switches/gen-2 eq 1
@@ -860,6 +863,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/idg-2/gcu-2-frequency-trip eq 1
/controls/electrical/switches/gen-2 eq 1
@@ -934,6 +938,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/apu/gcu-voltage-trip eq 1
/controls/electrical/switches/apu eq 1
@@ -949,6 +954,7 @@
+ /systems/acconfig/autoconfig-running ne 1
/systems/electrical/sources/apu/gcu-frequency-trip eq 1
/controls/electrical/switches/apu eq 1
@@ -1079,7 +1085,7 @@
/systems/electrical/relay/ac-ess-feed-1/auto-switch
- 100
+ 120
0.33333333333
@@ -1873,7 +1879,7 @@
/systems/electrical/relay/ac-ess-feed-inverter/contact-pos
- 100
+ 120
0.1
diff --git a/Systems/a320-fuel.xml b/Systems/a320-fuel.xml
index fa17b802..1954fc56 100644
--- a/Systems/a320-fuel.xml
+++ b/Systems/a320-fuel.xml
@@ -189,7 +189,7 @@
Timer for the Fuel Center pumps
/systems/fuel/quantity/center-low
- 100
+ 120
0.00333
diff --git a/Systems/a320-fwc-phases.xml b/Systems/a320-fwc-phases.xml
index 33d5a6b1..dceae541 100644
--- a/Systems/a320-fwc-phases.xml
+++ b/Systems/a320-fwc-phases.xml
@@ -9,7 +9,7 @@
Timer for the ECAM phase system
/ECAM/ground-calc-immediate
- 100
+ 120
1
@@ -80,6 +80,19 @@
+
+ /ECAM/phases/monostable/phase-1-300
+ 0.00333333333
+ 120
+
+
+
+
+
+ /ECAM/phases/monostable/phase-1-300-output ne 1
+ /ECAM/phases/monostable/phase-1-300 eq 1
+
+
diff --git a/Systems/a320-fwc.xml b/Systems/a320-fwc.xml
index b2f6b8dd..6ceceb62 100644
--- a/Systems/a320-fwc.xml
+++ b/Systems/a320-fwc.xml
@@ -10,259 +10,259 @@
Timer for the ECAM system
/ECAM/phases/timer/eng1idle
- 100
+ 120
0.033
Timer for the ECAM system
/ECAM/phases/timer/eng2idle
- 100
+ 120
0.033
Timer for the ECAM system
/ECAM/phases/timer/eng1or2
- 100
+ 120
0.033
Timer for the ECAM system
/ECAM/phases/timer/to-inhibit
- 100
+ 120
0.33
Timer for the ECAM system
/ECAM/phases/timer/ldg-inhibit
- 100
+ 120
0.33
Timer for the ECAM system
/ECAM/warnings/timer/bleed-1-fault
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/timer/bleed-2-fault
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/apu-bleed-fault
- 100
+ 120
0.1
Timer for the ECAM system
/systems/pneumatics/warnings/crossbleed-disag
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/prv-1-not-shut-apu
- 100
+ 120
1
Timer for the ECAM system
/ECAM/warnings/logic/prv-2-not-shut-apu
- 100
+ 120
1
Timer for the ECAM system
/ECAM/warnings/logic/prv-1-not-shut
- 100
+ 120
1
Timer for the ECAM system
/ECAM/warnings/logic/prv-2-not-shut
- 100
+ 120
1
Timer for the ECAM system
/ECAM/warnings/timer/bleed-1-and-2-low-temp
- 100
+ 120
0.00185185
Timer for the ECAM system
/systems/pneumatics/warnings/lowtemp-1-mem
- 100
+ 120
0.016666
Timer for the ECAM system
/systems/pneumatics/warnings/lowtemp-2-mem
- 100
+ 120
0.016666
Timer for the ECAM system
/ECAM/warnings/logic/bleed-1-off-60
- 100
+ 120
0.016666
Timer for the ECAM system
/ECAM/warnings/logic/bleed-2-off-60
- 100
+ 120
0.016666
Timer for the ECAM system
/ECAM/warnings/logic/bleed-1-off-5
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/bleed-2-off-5
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/eng-aice-1-open
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/eng-aice-2-open
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/eng-aice-1-closed
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/eng-aice-2-closed
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/wing-anti-ice-flipflop-set-input
- 100
+ 120
0.0285714
Timer for the ECAM system
/ECAM/warnings/timer/phase-1-input
- 100
+ 120
0.5
Timer for the ECAM system
/controls/ice-protection/wing
- 100
+ 120
0.04
Timer for the ECAM system
/ECAM/warnings/logic/wing-anti-ice-left-closed-set-input
- 100
+ 120
0.066666
Timer for the ECAM system
/ECAM/warnings/logic/wing-anti-ice-right-closed-set-input
- 100
+ 120
0.066666
Timer for the ECAM system
/ECAM/warnings/logic/proc-wai-shutdown-flipflop
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/wing-hi-pr-left-input
- 100
+ 120
0.025
Timer for the ECAM system
/ECAM/warnings/logic/wing-hi-pr-right-input
- 100
+ 120
0.025
Timer for the ECAM system
/ECAM/warnings/logic/cranking-35-sec-input
- 100
+ 120
0.028571
Timer for the ECAM system
/ECAM/warnings/logic/pack-1-fault-closed-input
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/pack-2-fault-closed-input
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/pack-1-disagree-input
- 100
+ 120
0.1
Timer for the ECAM system
/ECAM/warnings/logic/pack-2-disagree-input
- 100
+ 120
0.1
@@ -276,98 +276,98 @@
Timer for the ECAM system
/ECAM/warnings/logic/pack-1-fault-input
- 100
+ 120
0.20
Timer for the ECAM system
/ECAM/warnings/logic/pack-2-fault-input
- 100
+ 120
0.20
Timer for the ECAM system
/ECAM/warnings/logic/pack-1-fault-warning-input
- 100
+ 120
0.50
Timer for the ECAM system
/ECAM/warnings/logic/pack-2-fault-warning-input
- 100
+ 120
0.50
Timer for the ECAM system
/ECAM/warnings/logic/pack-1-off-input
- 100
+ 120
0.0166666
Timer for the ECAM system
/ECAM/warnings/logic/pack-2-off-input
- 100
+ 120
0.0166666
Timer for the ECAM system
/ECAM/warnings/logic/trim-air-fault-input
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/yaw-damper-1-fault
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/yaw-damper-2-fault
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/nav-gpws-terr-fault
- 100
+ 120
1.0
Timer for the ECAM system
/ECAM/warnings/logic/gen-1-fault-set
- 100
+ 120
0.1818
Timer for the ECAM system
/ECAM/warnings/logic/gen-2-fault-set
- 100
+ 120
0.1818
Timer for the ECAM system
/ECAM/warnings/logic/apu-gen-fault-set
- 100
+ 120
0.2
Timer for the ECAM system
/ECAM/warnings/logic/apu-gen-fault-reset
- 100
+ 120
0.5
@@ -1344,7 +1344,8 @@
/systems/navigation/adr/operating-1 eq 1
/systems/navigation/adr/operating-3 eq 1
/systems/electrical/bus/dc-ess-shed ge 25
- /systems/electrical/bus/ac-1 ge 110
+ /systems/electrical/bus/dc-ess ge 25
+ /systems/electrical/bus/ac-ess ge 110
/systems/fctl/fac1-healthy-signal eq 0
/systems/fctl/fac2-healthy-signal eq 1
@@ -1371,14 +1372,6 @@
-
-
-
- /systems/hydraulic/green-psi lt 1500
- /ECAM/warning-phase ne 1
-
-
-
@@ -1399,7 +1392,7 @@
/systems/electrical/bus/dc-ess-shed ge 25
/systems/electrical/bus/ac-1 ge 110
/ECAM/warnings/logic/yaw-damper-1-fault-eng-start eq 0
- /ECAM/warnings/logic/yaw-damper-1-fault-green eq 0
+ /systems/hydraulic/green-psi ge 1500
/ECAM/warnings/logic/yaw-damper-1-fault-adr eq 0
/ECAM/irs-in-align eq 0
/systems/fctl/yawdamper-1-active eq 0
@@ -1416,14 +1409,6 @@
-
-
-
- /systems/hydraulic/yellow-psi lt 1500
- /ECAM/warning-phase ne 1
-
-
-
@@ -1444,7 +1429,7 @@
/systems/electrical/bus/dc-2 ge 25
/systems/electrical/bus/ac-2 ge 110
/ECAM/warnings/logic/yaw-damper-2-fault-eng-start eq 0
- /ECAM/warnings/logic/yaw-damper-2-fault-yellow eq 0
+ /systems/hydraulic/yellow-psi ge 1500
/ECAM/warnings/logic/yaw-damper-2-fault-adr eq 0
/ECAM/irs-in-align eq 0
/systems/fctl/yawdamper-2-active eq 0
@@ -1452,23 +1437,43 @@
+
+
+
+ /systems/navigation/adr/operating-1 eq 1
+ /systems/navigation/adr/operating-2 eq 1
+ /systems/navigation/adr/operating-3 eq 1
+
+
+
+
+ /ECAM/warnings/logic/adr-off-input
+ 120
+ 0.5
+
+
+
+
+
+ /systems/hydraulics/warnings/green-lo-pr eq 0
+ /systems/hydraulics/warnings/yellow-lo-pr eq 0
+
+
+
/ECAM/irs-in-align eq 0
-
- /systems/navigation/adr/operating-1 eq 1
- /systems/navigation/adr/operating-2 eq 1
- /systems/navigation/adr/operating-3 eq 1
-
+ /ECAM/warnings/logic/adr-off ne 1
/systems/electrical/bus/dc-ess-shed ge 25
/systems/electrical/bus/ac-1 ge 110
/systems/electrical/bus/dc-2 ge 25
/systems/electrical/bus/ac-2 ge 110
- /ECAM/warnings/logic/yaw-damper-1-fault-green eq 0
- /ECAM/warnings/logic/yaw-damper-2-fault-yellow eq 0
+ /ECAM/warnings/logic/green-yellow-press-on-monostable eq 0
+ /systems/hydraulic/green-psi ge 1500
+ /systems/hydraulic/yellow-psi ge 1500
/ECAM/warnings/logic/yaw-damper-1-fault eq 1
/ECAM/warnings/logic/yaw-damper-2-fault eq 1
@@ -1516,7 +1521,7 @@
/systems/electrical/relay/gen-1-glc/contact-pos
- 100
+ 120
0.5
@@ -1577,7 +1582,7 @@
/systems/electrical/relay/gen-2-glc/contact-pos
- 100
+ 120
0.5
@@ -1774,7 +1779,7 @@
/ECAM/warnings/logic/eng/ground-spoilers
- 100
+ 120
2
@@ -1806,13 +1811,13 @@
/ECAM/warnings/logic/eng/eng-1-tla-abv-6
- 100
+ 120
1
/ECAM/warnings/logic/eng/eng-1-tla-abv-6-2
- 100
+ 120
1
@@ -1825,7 +1830,7 @@
/ECAM/warnings/logic/eng/eng-1-tla-idle
- 100
+ 120
1
@@ -1838,7 +1843,7 @@
/ECAM/warnings/logic/eng/eng-1-reverse
- 100
+ 120
1
@@ -1859,13 +1864,13 @@
/ECAM/warnings/logic/eng/eng-2-tla-abv-6
- 100
+ 120
1
/ECAM/warnings/logic/eng/eng-2-tla-abv-6-2
- 100
+ 120
1
@@ -1878,7 +1883,7 @@
/ECAM/warnings/logic/eng/eng-2-tla-idle
- 100
+ 120
1
@@ -1891,7 +1896,7 @@
/ECAM/warnings/logic/eng/eng-2-reverse
- 100
+ 120
1
@@ -2047,7 +2052,7 @@
/ECAM/warnings/fctl/lrElevFault
- 100
+ 120
3.33333333333
@@ -2148,7 +2153,7 @@
/ECAM/warnings/fctl/gear-not-down-locked-set-input
- 100
+ 120
0.03333333333
@@ -2181,7 +2186,7 @@
/ECAM/warnings/hyd/engines-2-online
- 100
+ 120
1
@@ -2196,7 +2201,7 @@
/ECAM/warnings/hyd/engines-2-off-in-air
- 100
+ 120
0.2
@@ -2215,7 +2220,7 @@
/ECAM/warnings/hyd/engine-1-start
- 100
+ 120
1
@@ -2234,7 +2239,7 @@
/ECAM/warnings/hyd/engine-2-start
- 100
+ 120
1
diff --git a/Systems/a320-hydraulic.xml b/Systems/a320-hydraulic.xml
index 3ed0871f..977c8d1c 100644
--- a/Systems/a320-hydraulic.xml
+++ b/Systems/a320-hydraulic.xml
@@ -538,7 +538,7 @@
/systems/hydraulic/sources/ptu/ptu-loop-sound-cmd
1
- 100
+ 120
diff --git a/Systems/a320-pneumatic.xml b/Systems/a320-pneumatic.xml
index 345575d0..bfe656d7 100644
--- a/Systems/a320-pneumatic.xml
+++ b/Systems/a320-pneumatic.xml
@@ -214,7 +214,7 @@
/systems/pneumatics/valves/engine-1-prv-valve-autoclose-psi-cmd
- 100
+ 120
0.0666
@@ -294,7 +294,7 @@
/systems/pneumatics/valves/engine-2-prv-valve-autoclose-psi-cmd
- 100
+ 120
0.0666
@@ -438,7 +438,7 @@
/systems/pneumatics/valves/wing-ice-gnd-cmd
0.033333
- 100
+ 120
@@ -981,19 +981,19 @@
/systems/pneumatics/precooler/calc/ovht-5-true
0.2
- 100
+ 120
/systems/pneumatics/precooler/calc/ovht-15-true
0.06666
- 100
+ 120
/systems/pneumatics/precooler/calc/ovht-55-true
0.018182
- 100
+ 120
@@ -1094,19 +1094,19 @@
/systems/pneumatics/precooler/calc/ovht-5-true-2
0.2
- 100
+ 120
/systems/pneumatics/precooler/calc/ovht-15-true-2
0.06666
- 100
+ 120
/systems/pneumatics/precooler/calc/ovht-55-true-2
0.018182
- 100
+ 120
@@ -1180,7 +1180,7 @@
/systems/pneumatics/warnings/apu-bleed-not-on-cmd
0.1
- 100
+ 120
diff --git a/Systems/ecam-proprules.xml b/Systems/ecam-proprules.xml
index 1e1bd8c9..167de57c 100644
--- a/Systems/ecam-proprules.xml
+++ b/Systems/ecam-proprules.xml
@@ -203,18 +203,6 @@
-
-
- monostable
-
-
- ECAM/phases/monostable/phase-1-300
-
-
-
-
monostable
+
+ monostable
+
+
+ /ECAM/warnings/logic/green-yellow-press-on-monostable-input
+
+
+
+