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 @@ ECAM/phases/monostable/gnd-output - - - monostable - - - ECAM/phases/monostable/phase-1-300 - - ECAM/phases/monostable/phase-1-output - - monostable + + monostable + + + /ECAM/warnings/logic/green-yellow-press-on-monostable-input + + /ECAM/warnings/logic/green-yellow-press-on-monostable + +