diff --git a/AircraftConfig/simbrief.xml b/AircraftConfig/simbrief.xml index bdb63a86..28fe1398 100644 --- a/AircraftConfig/simbrief.xml +++ b/AircraftConfig/simbrief.xml @@ -45,7 +45,11 @@ left - + + + + left + hbox diff --git a/Nasal/FMGC/FMGC.nas b/Nasal/FMGC/FMGC.nas index 29006c93..f313d4d4 100644 --- a/Nasal/FMGC/FMGC.nas +++ b/Nasal/FMGC/FMGC.nas @@ -224,6 +224,28 @@ var updateARPT = func { } } +var updateArptLatLon = func { + #ref lat + dms = getprop("/FMGC/flightplan[2]/wp[0]/lat"); + degrees = int(dms); + minutes = sprintf("%.1f",abs((dms - degrees) * 60)); + sign = degrees >= 0 ? "N" : "S"; + setprop("/FMGC/internal/align-ref-lat-degrees", degrees); + setprop("/FMGC/internal/align-ref-lat-minutes", minutes); + setprop("/FMGC/internal/align-ref-lat-sign", sign); + #ref long + dms = getprop("/FMGC/flightplan[2]/wp[0]/lon"); + degrees = int(dms); + minutes = sprintf("%.1f",abs((dms - degrees) * 60)); + sign = degrees >= 0 ? "E" : "W"; + setprop("/FMGC/internal/align-ref-long-degrees", degrees); + setprop("/FMGC/internal/align-ref-long-minutes", minutes); + setprop("/FMGC/internal/align-ref-long-sign", sign); + #ref edit + setprop("/FMGC/internal/align-ref-lat-edit", 0); + setprop("/FMGC/internal/align-ref-long-edit", 0); +} + updateRouteManagerAlt = func() { setprop("autopilot/route-manager/cruise/altitude-ft", FMGCInternal.crzFt); }; diff --git a/Nasal/FMGC/SimbriefParser.nas b/Nasal/FMGC/SimbriefParser.nas index abb80fef..731b03cf 100644 --- a/Nasal/FMGC/SimbriefParser.nas +++ b/Nasal/FMGC/SimbriefParser.nas @@ -3,13 +3,16 @@ var SimbriefParser = { node: nil, + OFP: nil, + store1: nil, + store2: nil, inhibit: 0, fetch: func(username, i) { me.inhibit = 1; var stamp = systime(); http.save("https://www.simbrief.com/api/xml.fetcher.php?username=" ~ username, getprop('/sim/fg-home') ~ "/Export/simbrief" ~ stamp ~ ".xml") .fail(func mcdu.mcdu_message(i, "SIMBRIEF FAILED")) - .done(func me.read(getprop('/sim/fg-home') ~ "/Export/simbrief" ~ stamp ~ ".xml"), 1); + .done(func me.read(getprop('/sim/fg-home') ~ "/Export/simbrief" ~ stamp ~ ".xml", i)); }, read: func(xml, i) { var data = io.readxml(xml); @@ -18,10 +21,65 @@ var SimbriefParser = { print("XML file " ~ xml ~ " not a valid Simbrief file"); } else { me.node = data; + me.parseOFP(); mcdu.mcdu_message(i, "AOC ACT F-PLN UPLINK"); } } else { print("Error reading " ~ xml); } }, + parseOFP: func() { + me.OFP = me.node.getChild("OFP"); + me.store1 = nil; + me.store2 = nil; + + me.store1 = me.OFP.getChild("general"); + me.store2 = me.OFP.getChild("alternate"); + fmgc.FMGCInternal.flightNum = me.store1.getChild("icao_airline").getValue() ~ me.store1.getChild("flight_number").getValue(); + fmgc.FMGCInternal.flightNumSet = 1; + fmgc.FMGCInternal.costIndex = me.store1.getChild("costindex").getValue(); + fmgc.FMGCInternal.costIndexSet = 1; + fmgc.FMGCNodes.costIndex.setValue(fmgc.FMGCInternal.costIndex); + fmgc.FMGCInternal.tropo = me.store1.getChild("avg_tropopause").getValue(); + fmgc.FMGCInternal.tropoSet = 1; + fmgc.FMGCInternal.crzFt = me.store1.getChild("initial_altitude").getValue(); + fmgc.FMGCInternal.crzFl = me.store1.getChild("initial_altitude").getValue() / 100; + fmgc.altvert(); + fmgc.FMGCInternal.crzSet = 1; + mcdu.updateCrzLvlCallback(); + fmgc.FMGCInternal.crzTemp = (((me.store1.getChild("initial_altitude").getValue() / 1000) * -2) + 15) + me.store1.getChild("avg_temp_dev").getValue(); + fmgc.FMGCInternal.crzTempSet = 1; + fmgc.FMGCInternal.crzProg = me.store1.getChild("initial_altitude").getValue() / 100; + + fmgc.FMGCInternal.altAirport = me.store2.getChild("icao_code").getValue(); + fmgc.FMGCInternal.altAirportSet = 1; + + # Flightplan stuff + fmgc.flightPlanController.flightplans[3] = createFlightplan(); + + # INITA + me.store1 = me.OFP.getChild("origin"); + me.store2 = me.OFP.getChild("destination"); + + fmgc.FMGCInternal.depApt = me.store1.getChild("icao_code").getValue(); + fmgc.FMGCInternal.arrApt = me.store2.getChild("icao_code").getValue(); + fmgc.FMGCInternal.toFromSet = 1; + fmgc.FMGCNodes.toFromSet.setValue(1); + fmgc.flightPlanController.flightplans[3].departure = airportinfo(fmgc.FMGCInternal.depApt); + fmgc.flightPlanController.flightplans[3].destination = airportinfo(fmgc.FMGCInternal.arrApt); + fmgc.FMGCInternal.altSelected = 0; + fmgc.updateArptLatLon(); + fmgc.updateARPT(); + + + fmgc.flightPlanController.destroyTemporaryFlightPlan(3, 1); + + fmgc.windController.updatePlans(); + fmgc.updateRouteManagerAlt(); + if (getprop("/FMGC/internal/block-confirmed")) { + setprop("/FMGC/internal/fuel-calculating", 0); + setprop("/FMGC/internal/fuel-calculating", 1); + } + + }, }; \ No newline at end of file diff --git a/Nasal/FMGC/flightplan.nas b/Nasal/FMGC/flightplan.nas index 1c1e2436..4915fff8 100644 --- a/Nasal/FMGC/flightplan.nas +++ b/Nasal/FMGC/flightplan.nas @@ -167,7 +167,6 @@ var flightPlanController = { me.currentToWptIndex.setValue(0); me.arrivalIndex = [0, 0, 0]; # reset arrival index calculations } - me.addDiscontinuity(1, plan); # reset mcdu if it exists if (canvas_mcdu.myFpln[0] != nil) { canvas_mcdu.myFpln[0].scroll = 0; } diff --git a/Nasal/MCDU/INITA.nas b/Nasal/MCDU/INITA.nas index 4dea8526..57be5da3 100644 --- a/Nasal/MCDU/INITA.nas +++ b/Nasal/MCDU/INITA.nas @@ -211,25 +211,7 @@ var initInputA = func(key, i) { mcdu_scratchpad.scratchpads[i].empty(); fmgc.flightPlanController.updateAirports(fromto[0], fromto[1], 2); fmgc.FMGCInternal.altSelected = 0; - #ref lat - dms = getprop("/FMGC/flightplan[2]/wp[0]/lat"); - degrees = int(dms); - minutes = sprintf("%.1f",abs((dms - degrees) * 60)); - sign = degrees >= 0 ? "N" : "S"; - setprop("/FMGC/internal/align-ref-lat-degrees", degrees); - setprop("/FMGC/internal/align-ref-lat-minutes", minutes); - setprop("/FMGC/internal/align-ref-lat-sign", sign); - #ref long - dms = getprop("/FMGC/flightplan[2]/wp[0]/lon"); - degrees = int(dms); - minutes = sprintf("%.1f",abs((dms - degrees) * 60)); - sign = degrees >= 0 ? "E" : "W"; - setprop("/FMGC/internal/align-ref-long-degrees", degrees); - setprop("/FMGC/internal/align-ref-long-minutes", minutes); - setprop("/FMGC/internal/align-ref-long-sign", sign); - #ref edit - setprop("/FMGC/internal/align-ref-lat-edit", 0); - setprop("/FMGC/internal/align-ref-long-edit", 0); + fmgc.updateArptLatLon(); #setprop("MCDU[" ~ i ~ "]/page", "ROUTESELECTION"); } else { mcdu_message(i, "NOT ALLOWED"); @@ -242,10 +224,16 @@ var initInputA = func(key, i) { } } } else if (key == "R2") { - if (getprop("/FMGC/simbrief-username") == "") { - mcdu.mcdu_message(i, "MISSING USERNAME") + if (getprop("engines/engine[0]/state") != 3 and getprop("engines/engine[1]/state") != 3) { + if (getprop("/FMGC/simbrief-username") == "") { + mcdu.mcdu_message(i, "MISSING USERNAME") + } elsif (!Simbrief.SimbriefParser.inhibit) { + Simbrief.SimbriefParser.fetch(getprop("/FMGC/simbrief-username"), i); + } else { + mcdu_message(i, "NOT ALLOWED"); + } } else { - Simbrief.SimbriefParser.fetch(getprop("/FMGC/simbrief-username"), i); + mcdu_message(i, "NOT ALLOWED"); } } else if (key == "R3") { setprop("MCDU[" ~ i ~ "]/page", "IRSINIT");