diff --git a/Nasal/FMGC/flightplan.nas b/Nasal/FMGC/flightplan.nas index 19d9a7a8..58b4a8a4 100644 --- a/Nasal/FMGC/flightplan.nas +++ b/Nasal/FMGC/flightplan.nas @@ -129,6 +129,9 @@ var flightplan = { } currentWP[2] = 0; + + # Create discontinuity + fmgc.fp[2].insertWP(createDiscontinuity(), 1); } me.checkWPOutputs(n); diff --git a/Nasal/MCDU/ARRIVAL.nas b/Nasal/MCDU/ARRIVAL.nas new file mode 100644 index 00000000..ba578c47 --- /dev/null +++ b/Nasal/MCDU/ARRIVAL.nas @@ -0,0 +1,163 @@ +var arrivalPage = { + title: [nil, nil, nil], + subtitle: [nil, 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"], + arrAirport: nil, + runways: nil, + selectedRunway: nil, + sids: nil, + computer: nil, + enableScroll: 0, + scroll: 0, + _runways: nil, + _sids: nil, + new: func(icao, computer) { + var lr = {parents:[arrivalPage]}; + lr.id = icao; + lr.computer = computer; + lr._setupPageWithData(); + lr.updateRunways(); + if (fmgc.fp[2].destination_runway != nil) { + lr.selectedRunway = fmgc.fp[2].destination_runway; + } + lr.updateActiveRunway(); + return lr; + }, + del: func() { + return nil; + }, + _setupPageWithData: func() { + me.title = ["ARRIVAL", " TO ", left(me.id, 4)]; + if (!TMPYActive[me.computer].getBoolValue()) { + me.L6 = [" RETURN END", nil, "wht"]; + } else { + me.L6 = [" F-PLN", " TMPY", "yel"]; + me.arrowsColour[0][5] = "yel"; + } + + me.C1 = ["------- ", "VIA", "wht"]; + me.R1 = ["-------", "STAR ", "wht"]; + me.R1 = ["-------", "TRANS ", "wht"]; + me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; + me.arrowsMatrix = [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0]]; + me.arrowsColour = [["ack", "ack", "ack", "ack", "ack", "wht"], ["ack", "ack", "ack", "ack", "ack", "ack"]]; + }, + updateActiveRunway: func() { + if (me.selectedRunway != nil) { + if (fmgc.fp[2].destination_runway != nil) { + if (fmgc.fp[2].destination_runway.id == me.selectedRunway.id) { + me.L1 = [fmgc.fp[2].destination_runway.id, " RWY", "grn"]; + } elsif (fmgc.fp[me.computer].destination_runway != nil) { + me.L1 = [fmgc.fp[me.computer].destination_runway.id, " RWY", "yel"]; + } else { + me.L1 = ["---", " RWY", "wht"]; + } + } elsif (fmgc.fp[me.computer].destination_runway != nil) { + me.L1 = [fmgc.fp[me.computer].destination_runway.id, " RWY", "yel"]; + } else { + me.L1 = ["---", " RWY", "wht"]; + } + } else { + me.L1 = ["---", " RWY", "wht"]; + } + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + }, + updateRunways: func() { + me.arrAirport = findAirportsByICAO(left(me.id, 4)); + me._runways = keys(me.arrAirport[0].runways); + me.runways = sort(me._runways,func(a,b) cmp(a,b)); + + me.fourRunways = [nil, nil, nil, nil]; + + if (size(me.runways) >= 1) { + me.L2 = [" " ~ me.runways[0 + me.scroll], nil, "blu"]; + me.C2 = [math.round(me.arrAirport[0].runways[me.runways[0 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R2 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.runways[0 + me.scroll]].heading), nil, "blu"]; + me.arrowsMatrix[0][1] = 1; + me.arrowsColour[0][1] = "blu"; + } + if (size(me.runways) >= 2) { + me.L3 = [" " ~ me.runways[1 + me.scroll], nil, "blu"]; + me.C3 = [math.round(me.arrAirport[0].runways[me.runways[1 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R3 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.runways[1 + me.scroll]].heading), nil, "blu"]; + me.arrowsMatrix[0][2] = 1; + me.arrowsColour[0][2] = "blu"; + } + if (size(me.runways) >= 3) { + me.L4 = [" " ~ me.runways[2 + me.scroll], nil, "blu"]; + me.C4 = [math.round(me.arrAirport[0].runways[me.runways[2 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R4 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.runways[2 + me.scroll]].heading), nil, "blu"]; + me.arrowsMatrix[0][3] = 1; + me.arrowsColour[0][3] = "blu"; + } + if (size(me.runways) >= 4) { + me.L5 = [" " ~ me.runways[3 + me.scroll], nil, "blu"]; + me.C5 = [math.round(me.arrAirport[0].runways[me.runways[3 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R5 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.runways[3 + me.scroll]].heading), nil, "blu"]; + me.arrowsMatrix[0][4] = 1; + me.arrowsColour[0][4] = "blu"; + } + + if (size(me.runways) > 4) { + me.enableScroll = 1; + } + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + }, + makeTmpy: func() { + if (!TMPYActive[me.computer].getBoolValue()) { + fmgc.flightplan.initTempFP(me.computer, 2); + me.L6 = [" F-PLN", " TMPY", "yel"]; + me.arrowsColour[0][5] = "yel"; + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } + }, + scrollUp: func() { + if (me.enableScroll) { + me.scroll += 1; + if (me.scroll > size(me.runways) - 4) { + me.scroll = 0; + } + me.updateRunways(); + } + }, + scrollDn: func() { + if (me.enableScroll) { + me.scroll -= 1; + if (me.scroll < 0) { + me.scroll = size(me.runways) - 4; + } + me.updateRunways(); + } + }, + depPushbuttonLeft: func(index) { + if (size(me.runways) >= (index - 1)) { + me.selectedRunway = me.arrAirport[0].runway(me.runways[index - 2 + me.scroll]); + me.makeTmpy(); + fmgc.fp[me.computer].destination_runway = me.selectedRunway; + me.updateActiveRunway(); + fmgc.flightplan.checkWPOutputs(me.computer); + } else { + notAllowed(me.computer); + } + }, +}; \ No newline at end of file diff --git a/Nasal/MCDU/DEPARTURE.nas b/Nasal/MCDU/DEPARTURE.nas index be7f321c..c23cb86b 100644 --- a/Nasal/MCDU/DEPARTURE.nas +++ b/Nasal/MCDU/DEPARTURE.nas @@ -28,6 +28,7 @@ var departurePage = { sids: nil, computer: nil, enableScroll: 0, + scroll: 0, _runways: nil, _sids: nil, new: func(icao, computer) { @@ -36,6 +37,9 @@ var departurePage = { lr.computer = computer; lr._setupPageWithData(); lr.updateRunways(); + if (fmgc.fp[2].departure_runway != nil) { + lr.selectedRunway = fmgc.fp[2].departure_runway; + } lr.updateActiveRunway(); return lr; }, @@ -61,7 +65,7 @@ var departurePage = { if (me.selectedRunway != nil) { if (fmgc.fp[2].departure_runway != nil) { if (fmgc.fp[2].departure_runway.id == me.selectedRunway.id) { - me.L1 = [fmgc.fp[me.computer].departure_runway.id, " RWY", "grn"]; + me.L1 = [fmgc.fp[2].departure_runway.id, " RWY", "grn"]; } elsif (fmgc.fp[me.computer].departure_runway != nil) { me.L1 = [fmgc.fp[me.computer].departure_runway.id, " RWY", "yel"]; } else { @@ -85,30 +89,30 @@ var departurePage = { me.fourRunways = [nil, nil, nil, nil]; if (size(me.runways) >= 1) { - me.L2 = [" " ~ me.runways[0], nil, "blu"]; - me.C2 = [math.round(me.depAirport[0].runways[me.runways[0]].length) ~ "M", nil, "blu"]; - me.R2 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[0]].heading), nil, "blu"]; + me.L2 = [" " ~ me.runways[0 + me.scroll], nil, "blu"]; + me.C2 = [math.round(me.depAirport[0].runways[me.runways[0 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R2 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[0 + me.scroll]].heading), nil, "blu"]; me.arrowsMatrix[0][1] = 1; me.arrowsColour[0][1] = "blu"; } if (size(me.runways) >= 2) { - me.L3 = [" " ~ me.runways[1], nil, "blu"]; - me.C3 = [math.round(me.depAirport[0].runways[me.runways[1]].length) ~ "M", nil, "blu"]; - me.R3 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[1]].heading), nil, "blu"]; + me.L3 = [" " ~ me.runways[1 + me.scroll], nil, "blu"]; + me.C3 = [math.round(me.depAirport[0].runways[me.runways[1 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R3 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[1 + me.scroll]].heading), nil, "blu"]; me.arrowsMatrix[0][2] = 1; me.arrowsColour[0][2] = "blu"; } if (size(me.runways) >= 3) { - me.L4 = [" " ~ me.runways[2], nil, "blu"]; - me.C4 = [math.round(me.depAirport[0].runways[me.runways[2]].length) ~ "M", nil, "blu"]; - me.R4 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[2]].heading), nil, "blu"]; + me.L4 = [" " ~ me.runways[2 + me.scroll], nil, "blu"]; + me.C4 = [math.round(me.depAirport[0].runways[me.runways[2 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R4 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[2 + me.scroll]].heading), nil, "blu"]; me.arrowsMatrix[0][3] = 1; me.arrowsColour[0][3] = "blu"; } if (size(me.runways) >= 4) { - me.L5 = [" " ~ me.runways[3], nil, "blu"]; - me.C5 = [math.round(me.depAirport[0].runways[me.runways[3]].length) ~ "M", nil, "blu"]; - me.R5 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[3]].heading), nil, "blu"]; + me.L5 = [" " ~ me.runways[3 + me.scroll], nil, "blu"]; + me.C5 = [math.round(me.depAirport[0].runways[me.runways[3 + me.scroll]].length) ~ "M", nil, "blu"]; + me.R5 = ["CRS" ~ math.round(me.depAirport[0].runways[me.runways[3 + me.scroll]].heading), nil, "blu"]; me.arrowsMatrix[0][4] = 1; me.arrowsColour[0][4] = "blu"; } @@ -126,9 +130,27 @@ var departurePage = { canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); } }, + scrollUp: func() { + if (me.enableScroll) { + me.scroll += 1; + if (me.scroll > size(me.runways) - 4) { + me.scroll = 0; + } + me.updateRunways(); + } + }, + scrollDn: func() { + if (me.enableScroll) { + me.scroll -= 1; + if (me.scroll < 0) { + me.scroll = size(me.runways) - 4; + } + me.updateRunways(); + } + }, depPushbuttonLeft: func(index) { if (size(me.runways) >= (index - 1)) { - me.selectedRunway = me.depAirport[0].runway(me.runways[index - 2]); + me.selectedRunway = me.depAirport[0].runway(me.runways[index - 2 + me.scroll]); me.makeTmpy(); fmgc.fp[me.computer].departure_runway = me.selectedRunway; me.updateActiveRunway(); diff --git a/Nasal/MCDU/F-PLN.nas b/Nasal/MCDU/F-PLN.nas index 7c4617df..7e813a0f 100644 --- a/Nasal/MCDU/F-PLN.nas +++ b/Nasal/MCDU/F-PLN.nas @@ -18,10 +18,11 @@ var clearFPLNComputer = func { } var StaticText = { - new: func(computer, type) { + new: func(computer, type, index = nil) { var in = {parents:[StaticText]}; in.type = type; in.computer = computer; + in.index = index; return in; }, getText: func() { @@ -45,7 +46,48 @@ var StaticText = { }, type: nil, pushButtonLeft: func() { - notAllowed(me.computer.mcdu); + if (me.type != "discontinuity") { + notAllowed(me.computer.mcdu); + } else { + var scratchpad = getprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad"); + if (TMPYActive[me.computer.mcdu].getBoolValue()) { + if (scratchpad == "CLR") { + if (fmgc.flightplan.deleteWP(me.index, me.computer.mcdu, 0) != 0) { + notAllowed(me.computer.mcdu); + } else { + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad-msg", 0); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", ""); + } + } elsif (scratchpad == "") { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(4, "DISCON", me.index, me.computer.mcdu); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/page", "LATREV"); + } else { + notAllowed(me.computer.mcdu); + } + } else { + if (scratchpad == "CLR") { + if (fmgc.flightplan.deleteWP(me.index, 2, 0) != 0) { + notAllowed(me.computer.mcdu); + } else { + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad-msg", 0); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", ""); + } + } elsif (scratchpad == "") { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(4, "DISCON", me.index, me.computer.mcdu); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/page", "LATREV"); + } else { + notAllowed(me.computer.mcdu); + } + } + } }, pushButtonRight: func() { notAllowed(me.computer.mcdu); @@ -53,6 +95,7 @@ var StaticText = { }; var FPLNText = { + _text: nil, new: func(computer, wp, dest, fp, wpIndex) { var in = {parents:[FPLNText]}; in.wp = wp; @@ -63,7 +106,12 @@ var FPLNText = { return in; }, getText: func() { - return me.wp.wp_name; + me._text = split("-",me.wp.wp_name); + if (size(me._text) == 2) { + return me._text[0] ~ me._text[1]; + } else { + return me._text[0]; + } }, getColor: func(i) { if (TMPYActive[i].getBoolValue()) { @@ -112,7 +160,16 @@ var FPLNText = { } } else { if (size(scratchpad) == 5) { - var insertReturn = fmgc.flightplan.insertFix(scratchpad, me.index, me.computer.mcdu); + var indexWp = fmgc.fp[me.computer.mcdu].indexOfWP(findFixesByID(scratchpad)); + if (indexWp == -1) { + var insertReturn = fmgc.flightplan.insertFix(scratchpad, me.index, me.computer.mcdu); + fmgc.fp[me.computer.mcdu].insertWP(createDiscontinuity(), me.index + 1); + fmgc.flightplan.checkWPOutputs(me.computer.mcdu); + } else { + for (var i = me.index; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer.mcdu, 0); + } + } if (insertReturn == 2) { notAllowed(me.computer.mcdu); } else if (insertReturn == 1) { @@ -121,7 +178,16 @@ var FPLNText = { setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", ""); } } else if (size(scratchpad) == 4) { - var insertReturn = fmgc.flightplan.insertArpt(scratchpad, me.index, me.computer.mcdu); + var indexWp = fmgc.fp[me.computer.mcdu].indexOfWP(findAirportsByICAO(scratchpad)); + if (indexWp == -1) { + var insertReturn = fmgc.flightplan.insertArpt(scratchpad, me.index, me.computer.mcdu); + fmgc.fp[me.computer.mcdu].insertWP(createDiscontinuity(), me.index + 1); + fmgc.flightplan.checkWPOutputs(me.computer.mcdu); + } else { + for (var i = me.index; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer.mcdu, 0); + } + } if (insertReturn == 2) { notAllowed(me.computer.mcdu); } else if (insertReturn == 1) { @@ -130,7 +196,16 @@ var FPLNText = { setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", ""); } } else if (size(scratchpad) == 3 or size(scratchpad) == 2) { - var insertReturn = fmgc.flightplan.insertNavaid(scratchpad, me.index, me.computer.mcdu); + var indexWp = fmgc.fp[me.computer.mcdu].indexOfWP(findNavaidsByID(scratchpad)); + if (indexWp == -1) { + var insertReturn = fmgc.flightplan.insertNavaid(scratchpad, me.index, me.computer.mcdu); + fmgc.fp[me.computer.mcdu].insertWP(createDiscontinuity(), me.index + 1); + fmgc.flightplan.checkWPOutputs(me.computer.mcdu); + } else { + for (var i = me.index; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer.mcdu, 0); + } + } if (insertReturn == 2) { notAllowed(me.computer.mcdu); } else if (insertReturn == 1) { @@ -141,32 +216,61 @@ var FPLNText = { } else if (size(scratchpad) == 1) { formatError(me.computer.mcdu); } else if (scratchpad == "") { - if (me.getText() == fmgc.fp[2].departure.id or left(me.getText(), 4) == fmgc.fp[2].departure.id) { - if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { - canvas_mcdu.myLatRev[me.computer.mcdu].del(); + if (!TMPYActive[me.computer.mcdu].getBoolValue()) { + if (me.getText() == fmgc.fp[2].departure.id or left(me.getText(), 4) == fmgc.fp[2].departure.id) { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(0, me.getText(), me.index, me.computer.mcdu); + } elsif (me.index == fmgc.arrivalAirportI[2]) { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(1, me.getText(), me.index, me.computer.mcdu); + } elsif (me.index == (fmgc.currentWP[2] - 1)) { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(2, me.getText(), me.index, me.computer.mcdu); + } else { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(3, me.getText(), me.index, me.computer.mcdu); # todo must not be available from lat lon / place - brg - dist / abeam etc } - canvas_mcdu.myLatRev[me.computer.mcdu] = nil; - canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(0, me.getText()); - } elsif (me.index == fmgc.arrivalAirportI[2]) { - if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { - canvas_mcdu.myLatRev[me.computer.mcdu].del(); - } - canvas_mcdu.myLatRev[me.computer.mcdu] = nil; - canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(1, me.getText()); - } elsif (me.index == (fmgc.currentWP[2] - 1)) { - if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { - canvas_mcdu.myLatRev[me.computer.mcdu].del(); - } - canvas_mcdu.myLatRev[me.computer.mcdu] = nil; - canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(2, me.getText()); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/page", "LATREV"); } else { - if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { - canvas_mcdu.myLatRev[me.computer.mcdu].del(); + if (me.getText() == fmgc.fp[me.computer.mcdu].departure.id or left(me.getText(), 4) == fmgc.fp[me.computer.mcdu].departure.id) { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(0, me.getText(), me.index, me.computer.mcdu); + } elsif (me.index == fmgc.arrivalAirportI[me.computer.mcdu]) { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(1, me.getText(), me.index, me.computer.mcdu); + } elsif (me.index == (fmgc.currentWP[2] - 1)) { # not a bug for PPOS + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(2, me.getText(), me.index, me.computer.mcdu); + } else { + if (canvas_mcdu.myLatRev[me.computer.mcdu] != nil) { + canvas_mcdu.myLatRev[me.computer.mcdu].del(); + } + canvas_mcdu.myLatRev[me.computer.mcdu] = nil; + canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(3, me.getText(), me.index, me.computer.mcdu); # todo must not be available from lat lon / place - brg - dist / abeam etc } - canvas_mcdu.myLatRev[me.computer.mcdu] = nil; - canvas_mcdu.myLatRev[me.computer.mcdu] = latRev.new(3, me.getText()); + setprop("/MCDU[" ~ me.computer.mcdu ~ "]/page", "LATREV"); } - setprop("/MCDU[" ~ me.computer.mcdu ~ "]/page", "LATREV"); } else { notAllowed(me.computer.mcdu); } @@ -228,7 +332,12 @@ var FPLNLineComputer = { if (j == me.destIndex) { me.dest = 1; } - append(me.planList, FPLNText.new(me, fpln.getWP(j), me.dest, fplnID, j)); + var wpt = fpln.getWP(j); + if (wpt.wp_name == "DISCONTINUITY") { + append(me.planList, StaticText.new(me, "discontinuity", j)); + } else { + append(me.planList, FPLNText.new(me, fpln.getWP(j), me.dest, fplnID, j)); + } } if (debug == 1) printf("%d: dest is: %s", me.mcdu, fpln.getWP(me.destIndex).wp_name); } diff --git a/Nasal/MCDU/LATREV.nas b/Nasal/MCDU/LATREV.nas index cb241159..c82cf8ac 100644 --- a/Nasal/MCDU/LATREV.nas +++ b/Nasal/MCDU/LATREV.nas @@ -18,16 +18,31 @@ var latRev = { R6: [nil, nil, "ack"], depAirport: nil, arrAirport: nil, - new: func(type, id) { + index: nil, + computer: nil, + new: func(type, id, index, computer) { var lr = {parents:[latRev]}; - lr.type = type; # 0 = origin 1 = destination 2 = ppos (from waypoint) 3 = generic wpt + lr.type = type; # 0 = origin 1 = destination 2 = ppos (from waypoint) 3 = generic wpt, 4 = discon lr.id = id; + lr.index = index; + lr.computer = computer; lr._setupPageWithData(); + lr._checkTmpy(); return lr; }, del: func() { return nil; }, + _checkTmpy: func() { + if (TMPYActive[me.computer].getBoolValue()) { + me.L6 = [" F-PLN", " TMPY", "yel"]; + me.arrowsColour[0][5] = "yel"; + me.R2[2] = "yel"; + me.R3[2] = "yel"; + me.R4[2] = "yel"; + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + } + }, _setupPageWithData: func() { if (me.type == 2) { me.title = ["LAT REV", " FROM ", "PPOS"]; @@ -39,6 +54,14 @@ var latRev = { me.arrowsMatrix = [[0, 1, 1, 0, 0, 1], [1, 0, 0, 0, 0, 0]]; me.arrowsColour = [["ack", "wht", "wht", "ack", "ack", "wht"], ["wht", "ack", "ack", "ack", "ack", "ack"]]; me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]]; + } elsif (me.type == 4) { + me.title = ["LAT REV", " FROM ", "DISCON"]; + me.R3 = ["[ ]", "NEXT WPT ", "blu"]; + me.R4 = ["[ ]", "NEW DEST", "blu"]; + me.L6 = [" RETURN", nil, "wht"]; + me.arrowsMatrix = [[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0]]; + me.arrowsColour = [["ack", "ack", "ack", "ack", "ack", "wht"], ["ack", "ack", "ack", "ack", "ack", "ack"]]; + me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0]]; } else { me.title = ["LAT REV", " FROM ", me.id]; @@ -54,7 +77,7 @@ var latRev = { me.L6 = [" RETURN", nil, "wht"]; me.R1 = ["FIX INFO ", nil, "wht"]; me.R2 = ["[ ]°/[ ]°/[ ]", "LL XING/INCR/NO", "blu"]; - me.R3 = ["[ ]", "NEXT WPT ", "blu"]; + me.R3 = ["[ ]", "NEXT WPT ", "blu"]; me.R4 = ["[ ]", "NEW DEST", "blu"]; me.arrowsMatrix = [[1, 1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0]]; me.arrowsColour = [["wht", "wht", "ack", "ack", "ack", "wht"], ["wht", "ack", "ack", "ack", "ack", "ack"]]; @@ -70,7 +93,7 @@ var latRev = { me.L4 = [" ALTN", " ENABLE", "blu"]; me.L6 = [" RETURN", nil, "wht"]; me.R1 = ["ARRIVAL ", nil, "wht"]; - me.R3 = ["[ ]", "NEXT WPT ", "blu"]; + me.R3 = ["[ ]", "NEXT WPT ", "blu"]; me.arrowsMatrix = [[0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0]]; me.arrowsColour = [["ack", "ack", "wht", "blu", "ack", "wht"], ["wht", "ack", "ack", "ack", "ack", "ack"]]; me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0]]; @@ -87,7 +110,7 @@ var latRev = { me.L4 = [" ALTN", " ENABLE", "blu"]; me.L6 = [" RETURN", nil, "wht"]; me.R1 = ["FIX INFO ", nil, "wht"]; - me.R3 = ["[ ]", "NEXT WPT ", "blu"]; + me.R3 = ["[ ]", "NEXT WPT ", "blu"]; me.R4 = ["[ ]", "NEW DEST", "blu"]; me.R5 = ["AIRWAYS ", nil, "wht"]; me.arrowsMatrix = [[0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 1, 0]]; @@ -96,6 +119,83 @@ var latRev = { } } }, + makeTmpy: func() { + if (!TMPYActive[me.computer].getBoolValue()) { + fmgc.flightplan.initTempFP(me.computer, 2); + me._checkTmpy(); + } + }, + nextWpt: func() { + me.makeTmpy(); + me.R3 = [getprop("/MCDU[" ~ me.computer ~ "]/scratchpad"), "NEXT WPT ", "yel"]; + me.fontMatrix[1][2] = 0; + + # check if it is part of the active f-pln, if so delete intermediate wpts, if not create discontinuiity after it with original wpts + if (size(me.R3[0]) == 5) { + var fix = findFixesByID(me.R3[0]); + if (fix != nil) { + var indexWp = fmgc.fp[me.computer].indexOfWP(fix[0]); + if (indexWp == -1) { + var _insert = fmgc.flightplan.insertFix(me.R3[0], me.index + 1, me.computer); + fmgc.fp[me.computer].insertWP(createDiscontinuity(), me.index + 2); + fmgc.flightplan.checkWPOutputs(me.computer); + } else { + for (var i = me.index + 1; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer, 0); + } + var _insert = fmgc.flightplan.insertFix(me.R3[0], me.index + 1, me.computer); + } + } else { + var _insert = 1; + } + } elsif (size(me.R3[0]) == 4) { + var airport = findAirportsByICAO(me.R3[0]); + if (airport != nil) { + var indexWp = fmgc.fp[me.computer].indexOfWP(fix[0]); + if (indexWp == -1) { + var _insert = fmgc.flightplan.insertArpt(me.R3[0], me.index + 1, me.computer); + fmgc.fp[me.computer].insertWP(createDiscontinuity(), me.index + 2); + fmgc.flightplan.checkWPOutputs(me.computer); + } else { + for (var i = me.index + 1; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer, 0); + } + var _insert = fmgc.flightplan.insertArpt(me.R3[0], me.index + 1, me.computer); + } + } else { + var _insert = 1; + } + } elsif (size(me.R3[0]) == 3 or size(me.R3[0]) == 2) { + var navaid = findNavaidsByID(me.R3[0]); + if (navaid != nil) { + var indexWp = fmgc.fp[me.computer].indexOfWP(navaid[0]); + if (indexWp == -1) { + var _insert = fmgc.flightplan.insertNavaid(me.R3[0], me.index + 1, me.computer); + fmgc.fp[me.computer].insertWP(createDiscontinuity(), me.index + 2); + fmgc.flightplan.checkWPOutputs(me.computer); + } else { + for (var i = me.index + 1; i == indexWp; i = i + 1) { + fmgc.flightplan.deleteWP(i, me.computer, 0); + } + var _insert = fmgc.flightplan.insertNavaid(me.R3[0], me.index + 1, me.computer); + } + } else { + var _insert = 1; + } + } else { + formatError(me.computer); + } + + if (_insert == 1) { + notInDataBase(me.computer); + } elsif (_insert == 2) { + notAllowed(me.computer); + } else { + setprop("/MCDU[" ~ me.computer ~ "]/scratchpad", ""); + fmgc.flightplan.checkWPOutputs(me.computer); + setprop("/MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); + } + }, }; var dmsToString = func(dms, type) { diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index 7d0520a2..de7af3a2 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -270,6 +270,12 @@ var rskbutton = func(btn, i) { printInput("R3", i); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") { printInput2("R3", i); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "LATREV") { + if (canvas_mcdu.myLatRev[i].type != 2) { + canvas_mcdu.myLatRev[i].nextWpt(); + } else { + notAllowed(i); + } } else { notAllowed(i); } @@ -372,10 +378,14 @@ var arrowbutton = func(btn, i) { } else if (btn == "up") { if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") { slewFPLN(1, i); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { + canvas_mcdu.myDeparture[i].scrollUp(); } } else if (btn == "down") { if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") { slewFPLN(-1, i); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { + canvas_mcdu.myDeparture[i].scrollDn(); } } } diff --git a/Nasal/Sim/libraries.nas b/Nasal/Sim/libraries.nas index 26b21ac2..858c391b 100644 --- a/Nasal/Sim/libraries.nas +++ b/Nasal/Sim/libraries.nas @@ -227,6 +227,7 @@ var systemsInit = func { setlistener("/sim/signals/fdm-initialized", func { systemsInit(); + fmgc.outputPropsTimer.start(); }); var systemsLoop = maketimer(0.1, func {