diff --git a/A320-main.xml b/A320-main.xml index d230156e..845aaa4f 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1887,6 +1887,7 @@ <mcdu> <file>Aircraft/A320-family/Nasal/MCDU/LATREV.nas</file> <!-- dynamic page - init before MCDU --> <file>Aircraft/A320-family/Nasal/MCDU/DEPARTURE.nas</file> <!-- dynamic page - init before MCDU --> + <file>Aircraft/A320-family/Nasal/MCDU/ARRIVAL.nas</file> <!-- dynamic page - init before MCDU --> <file>Aircraft/A320-family/Nasal/MCDU/F-PLN-rework.nas</file> <!-- dynamic page - init before MCDU --> <file>Aircraft/A320-family/Nasal/MCDU/MCDU.nas</file> <file>Aircraft/A320-family/Nasal/MCDU/INITA.nas</file> diff --git a/Models/Instruments/MCDU/MCDU.nas b/Models/Instruments/MCDU/MCDU.nas index cc524757..ca5a832a 100644 --- a/Models/Instruments/MCDU/MCDU.nas +++ b/Models/Instruments/MCDU/MCDU.nas @@ -8,7 +8,9 @@ var MCDU1_display = nil; var MCDU2_display = nil; var myLatRev = [nil, nil]; var myDeparture = [nil, nil]; +var myArrival = [nil, nil]; var myFpln = [nil, nil]; +var myDuplicate = [nil, nil]; var default = "BoeingCDU-Large.ttf"; var symbol = "helvetica_medium.txf"; var normal = 70; @@ -230,7 +232,6 @@ var canvas_MCDU_base = { } if (myFpln[i] != nil) { - myFpln[i].update(); if (flightNumSet.getValue()) { me["FPLN_Callsign"].setText(flightNum.getValue()); @@ -2341,6 +2342,319 @@ var canvas_MCDU_base = { } pageSwitch[i].setBoolValue(1); } + } elsif (page == "DUPLICATENAMES") { + if (!pageSwitch[i].getBoolValue()) { + me["Simple"].show(); + me["Simple_Center"].show(); + me["FPLN"].hide(); + me["INITA"].hide(); + me["INITB"].hide(); + me["PERFTO"].hide(); + me["arrowsDepArr"].hide(); + me["Simple_PageNum"].setText("X/X"); + me["Simple_PageNum"].hide(); + me["Simple_Title"].show(); + me["ArrowLeft"].hide(); + me["ArrowRight"].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(normal, normal, normal, normal, normal, normal); + me.fontSizeRight(normal, normal, normal, normal, normal, normal); + + me.colorLeftS("wht", "wht", "wht", "wht", "wht", "wht"); + me.colorLeftArrow("wht", "wht", "wht", "wht", "wht", "wht"); + me.colorRightS("wht", "wht", "wht", "wht", "wht", "wht"); + me.colorRightArrow("wht", "wht", "wht", "wht", "wht", "wht"); + + + if (myDuplicate[i] != nil) { + me["Simple_Title"].setText(sprintf("%s", myDuplicate[i].title)); + + forindex (var matrixArrow; myDuplicate[i].arrowsMatrix) { + if (matrixArrow == 0) { + var sign = "L"; + } else { + var sign = "R"; + } + forindex (var item; myDuplicate[i].arrowsMatrix[matrixArrow]) { + if (myDuplicate[i].arrowsMatrix[matrixArrow][item] == 1) { + me["Simple_" ~ sign ~ (item + 1) ~ "_Arrow"].show(); + } else { + me["Simple_" ~ sign ~ (item + 1) ~ "_Arrow"].hide(); + } + } + } + me.colorLeftArrow(myDuplicate[i].arrowsColour[0][0],myDuplicate[i].arrowsColour[0][1],myDuplicate[i].arrowsColour[0][2],myDuplicate[i].arrowsColour[0][3],myDuplicate[i].arrowsColour[0][4],myDuplicate[i].arrowsColour[0][5]); + + + forindex (var matrixFont; myDuplicate[i].fontMatrix) { + if (matrixFont == 0) { + var sign = "L"; + } else { + var sign = "R"; + } + forindex (var item; myDuplicate[i].fontMatrix[matrixFont]) { + if (myDuplicate[i].fontMatrix[matrixFont][item] == 1) { + me["Simple_" ~ sign ~ (item + 1)].setFont(symbol); + me["Simple_" ~ sign ~ (item + 1)].setFontSize(small); + } else { + me["Simple_" ~ sign ~ (item + 1)].setFont(default); + me["Simple_" ~ sign ~ (item + 1)].setFontSize(normal); + } + } + } + + if (myDuplicate[i].L1[0] == nil) { + me["Simple_L1"].hide(); + me["Simple_L1S"].hide(); + } else { + me["Simple_L1"].show(); + me["Simple_L1"].setText(myDuplicate[i].L1[0]); + if (myDuplicate[i].L1[1] != nil) { + me["Simple_L1S"].show(); + me["Simple_L1S"].setText(myDuplicate[i].L1[1]); + } else { + me["Simple_L1S"].hide(); + } + } + + if (myDuplicate[i].L2[0] == nil) { + me["Simple_L2"].hide(); + me["Simple_L2S"].hide(); + } else { + me["Simple_L2"].show(); + me["Simple_L2"].setText(myDuplicate[i].L2[0]); + if (myDuplicate[i].L2[1] != nil) { + me["Simple_L2S"].show(); + me["Simple_L2S"].setText(myDuplicate[i].L2[1]); + } else { + me["Simple_L2S"].hide(); + } + } + + if (myDuplicate[i].L3[0] == nil) { + me["Simple_L3"].hide(); + me["Simple_L3S"].hide(); + } else { + me["Simple_L3"].show(); + me["Simple_L3"].setText(myDuplicate[i].L3[0]); + if (myDuplicate[i].L3[1] != nil) { + me["Simple_L3S"].show(); + me["Simple_L3S"].setText(myDuplicate[i].L3[1]); + } else { + me["Simple_L3S"].hide(); + } + } + + if (myDuplicate[i].L4[0] == nil) { + me["Simple_L4"].hide(); + me["Simple_L4S"].hide(); + } else { + me["Simple_L4"].show(); + me["Simple_L4"].setText(myDuplicate[i].L4[0]); + if (myDuplicate[i].L4[1] != nil) { + me["Simple_L4S"].show(); + me["Simple_L4S"].setText(myDuplicate[i].L4[1]); + } else { + me["Simple_L4S"].hide(); + } + } + + if (myDuplicate[i].L5[0] == nil) { + me["Simple_L5"].hide(); + me["Simple_L5S"].hide(); + } else { + me["Simple_L5"].show(); + me["Simple_L5"].setText(myDuplicate[i].L5[0]); + if (myDuplicate[i].L5[1] != nil) { + me["Simple_L5S"].show(); + me["Simple_L5S"].setText(myDuplicate[i].L5[1]); + } else { + me["Simple_L5S"].hide(); + } + } + + if (myDuplicate[i].L6[0] == nil) { + me["Simple_L6"].hide(); + me["Simple_L6S"].hide(); + } else { + me["Simple_L6"].show(); + me["Simple_L6"].setText(myDuplicate[i].L6[0]); + if (myDuplicate[i].L6[1] != nil) { + me["Simple_L6S"].show(); + me["Simple_L6S"].setText(myDuplicate[i].L6[1]); + } else { + me["Simple_L6S"].hide(); + } + } + me.colorLeft(myDuplicate[i].L1[2],myDuplicate[i].L2[2],myDuplicate[i].L3[2],myDuplicate[i].L4[2],myDuplicate[i].L5[2],myDuplicate[i].L6[2]); + + + if (myDuplicate[i].C1[0] == nil) { + me["Simple_C1"].hide(); + me["Simple_C1S"].hide(); + } else { + me["Simple_C1"].show(); + me["Simple_C1"].setText(myDuplicate[i].C1[0]); + if (myDuplicate[i].C1[1] != nil) { + me["Simple_C1S"].show(); + me["Simple_C1S"].setText(myDuplicate[i].C1[1]); + } else { + me["Simple_C1S"].hide(); + } + } + + if (myDuplicate[i].C2[0] == nil) { + me["Simple_C2"].hide(); + me["Simple_C2S"].hide(); + } else { + me["Simple_C2"].show(); + me["Simple_C2"].setText(myDuplicate[i].C2[0]); + if (myDuplicate[i].C2[1] != nil) { + me["Simple_C2S"].show(); + me["Simple_C2S"].setText(myDuplicate[i].C2[1]); + } else { + me["Simple_C2S"].hide(); + } + } + + if (myDuplicate[i].C3[0] == nil) { + me["Simple_C3"].hide(); + me["Simple_C3S"].hide(); + } else { + me["Simple_C3"].show(); + me["Simple_C3"].setText(myDuplicate[i].C3[0]); + if (myDuplicate[i].C3[1] != nil) { + me["Simple_C3S"].show(); + me["Simple_C3S"].setText(myDuplicate[i].C3[1]); + } else { + me["Simple_C3S"].hide(); + } + } + + if (myDuplicate[i].C4[0] == nil) { + me["Simple_C4"].hide(); + me["Simple_C4S"].hide(); + } else { + me["Simple_C4"].show(); + me["Simple_C4"].setText(myDuplicate[i].C4[0]); + if (myDuplicate[i].C4[1] != nil) { + me["Simple_C4S"].show(); + me["Simple_C4S"].setText(myDuplicate[i].C4[1]); + } else { + me["Simple_C4S"].hide(); + } + } + + if (myDuplicate[i].C5[0] == nil) { + me["Simple_C5"].hide(); + me["Simple_C5S"].hide(); + } else { + me["Simple_C5"].show(); + me["Simple_C5"].setText(myDuplicate[i].C5[0]); + if (myDuplicate[i].C5[1] != nil) { + me["Simple_C5S"].show(); + me["Simple_C5S"].setText(myDuplicate[i].C5[1]); + } else { + me["Simple_C5S"].hide(); + } + } + me.colorCenter(myDuplicate[i].C1[2],myDuplicate[i].C2[2],myDuplicate[i].C3[2],myDuplicate[i].C4[2],myDuplicate[i].C5[2],myDuplicate[i].C6[2]); + + me["Simple_C6"].hide(); + me["Simple_C6S"].hide(); + + if (myDuplicate[i].R1[0] == nil) { + me["Simple_R1"].hide(); + me["Simple_R1S"].hide(); + } else { + me["Simple_R1"].show(); + me["Simple_R1"].setText(myDuplicate[i].R1[0]); + if (myDuplicate[i].R1[1] != nil) { + me["Simple_R1S"].show(); + me["Simple_R1S"].setText(myDuplicate[i].R1[1]); + } else { + me["Simple_R1S"].hide(); + } + } + + if (myDuplicate[i].R2[0] == nil) { + me["Simple_R2"].hide(); + me["Simple_R2S"].hide(); + } else { + me["Simple_R2"].show(); + me["Simple_R2"].setText(myDuplicate[i].R2[0]); + if (myDuplicate[i].R2[1] != nil) { + me["Simple_R2S"].show(); + me["Simple_R2S"].setText(myDuplicate[i].R2[1]); + } else { + me["Simple_R2S"].hide(); + } + } + + if (myDuplicate[i].R3[0] == nil) { + me["Simple_R3"].hide(); + me["Simple_R3S"].hide(); + } else { + me["Simple_R3"].show(); + me["Simple_R3"].setText(myDuplicate[i].R3[0]); + if (myDuplicate[i].R3[1] != nil) { + me["Simple_R3S"].show(); + me["Simple_R3S"].setText(myDuplicate[i].R3[1]); + } else { + me["Simple_R3S"].hide(); + } + } + + if (myDuplicate[i].R4[0] == nil) { + me["Simple_R4"].hide(); + me["Simple_R4S"].hide(); + } else { + me["Simple_R4"].show(); + me["Simple_R4"].setText(myDuplicate[i].R4[0]); + if (myDuplicate[i].R4[1] != nil) { + me["Simple_R4S"].show(); + me["Simple_R4S"].setText(myDuplicate[i].R4[1]); + } else { + me["Simple_R4S"].hide(); + } + } + + if (myDuplicate[i].R5[0] == nil) { + me["Simple_R5"].hide(); + me["Simple_R5S"].hide(); + } else { + me["Simple_R5"].show(); + me["Simple_R5"].setText(myDuplicate[i].R5[0]); + if (myDuplicate[i].R5[1] != nil) { + me["Simple_R5S"].show(); + me["Simple_R5S"].setText(myDuplicate[i].R5[1]); + } else { + me["Simple_R5S"].hide(); + } + } + + if (myDuplicate[i].R6[0] == nil) { + me["Simple_R6"].hide(); + me["Simple_R6S"].hide(); + } else { + me["Simple_R6"].show(); + me["Simple_R6"].setText(myDuplicate[i].R6[0]); + if (myDuplicate[i].R6[1] != nil) { + me["Simple_R6S"].show(); + me["Simple_R6S"].setText(myDuplicate[i].R6[1]); + } else { + me["Simple_R6S"].hide(); + } + } + me.colorRight(myDuplicate[i].R1[2],myDuplicate[i].R2[2],myDuplicate[i].R3[2],myDuplicate[i].R4[2],myDuplicate[i].R5[2],myDuplicate[i].R6[2]); + } + pageSwitch[i].setBoolValue(1); + } } else { if (!pageSwitch[i].getBoolValue()) { me["Simple"].hide(); diff --git a/Nasal/FMGC/flightplan.nas b/Nasal/FMGC/flightplan.nas index 11d759ed..f9b466bd 100644 --- a/Nasal/FMGC/flightplan.nas +++ b/Nasal/FMGC/flightplan.nas @@ -117,10 +117,10 @@ var flightPlanController = { me.flightplans[n].insertWP(createWP(geo.aircraft_position(), "PPOS"), 0); }, - deleteWP: func(index, n) { + deleteWP: func(index, n, a = 0) { # a = 1, means adding a waypoint via deleting intermediate var wp = wpID[n][index].getValue(); if (wp != FMGCdep.getValue() and wp != FMGCarr.getValue() and me.flightplans[n].getPlanSize() > 2) { - if (me.flightplans[n].getWP(index).id != "DISCONTINUITY") { # if it is a discont, don't make a new one + if (me.flightplans[n].getWP(index).id != "DISCONTINUITY" and a == 0) { # if it is a discont, don't make a new one me.flightplans[n].deleteWP(index); if (me.flightplans[n].getWP(index).id != "DISCONTINUITY") { # else, if the next one isn't a discont, add one me.addDiscontinuity(index, n); @@ -128,7 +128,8 @@ var flightPlanController = { } else { me.flightplans[n].deleteWP(index); } - me.flightPlanChanged(n); + me.updatePlans(); + canvas_nd.A3XXRouteDriver.triggerSignal("fp-removed"); return 2; } else { return 1; @@ -154,7 +155,7 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(airport[0]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; @@ -167,18 +168,24 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(airport[overrideIndex]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; } } } elsif (size(airport) >= 1) { - # spawn DUPLICATE NAMES + if (canvas_mcdu.myDeparture[plan] != nil) { + canvas_mcdu.myDeparture[plan].del(); + } + canvas_mcdu.myDeparture[plan] = nil; + canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(airport, index, 0, plan); + setprop("/MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES"); + return 2; } }, - insertFix: func(text, index, plan, override = 0) { # override - means always choose [0] + insertFix: func(text, index, plan, override = 0, overrideIndex = -1) { # override - means always choose [0] if (index == 0) { return 1; } @@ -197,7 +204,7 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(fix[0]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; @@ -210,18 +217,53 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(fix[overrideIndex]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; } } } elsif (size(fix) >= 1) { - # spawn DUPLICATE NAMES + if (canvas_mcdu.myDeparture[plan] != nil) { + canvas_mcdu.myDeparture[plan].del(); + } + canvas_mcdu.myDeparture[plan] = nil; + canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(fix, index, 0, plan); + setprop("/MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES"); + return 2; } }, - insertNavaid: func(text, index, plan, override = 0) { + insertLatLonFix: func(text, index, plan) { + if (index == 0) { + return 1; + } + + var lat = split("/", text)[0]; + var lon = split("/", text)[1]; + var latDecimal = mcdu.stringToDegrees(lat, "lat"); + var lonDecimal = mcdu.stringToDegrees(lon, "lon"); + + if (latDecimal > 90 or latDecimal < -90 or lonDecimal > 180 or lonDecimal < -180) { + return 1; + } + + var myWpLatLon = createWP(latDecimal, lonDecimal, "LL" ~ index); + if (me.flightplans[plan].indexOfWP(myWpLatLon) == -1) { + me.flightplans[plan].insertWP(myWpLatLon, index); + me.flightPlanChanged(plan); + return 2; + } else { + var numToDel = me.flightplans[plan].indexOfWP(myWpLatLon) - index; + while (numToDel > 0) { + me.deleteWP(index + 1, plan, 1); + numToDel -= 1; + } + return 2; + } + }, + + insertNavaid: func(text, index, plan, override = 0, overrideIndex = -1) { if (index == 0) { return 1; } @@ -240,7 +282,7 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(navaid[0]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; @@ -253,14 +295,20 @@ var flightPlanController = { } else { var numToDel = me.flightplans[plan].indexOfWP(navaid[overrideIndex]) - index; while (numToDel > 0) { - me.deleteWP(index + 1, plan, 0); + me.deleteWP(index + 1, plan, 1); numToDel -= 1; } return 2; } } } elsif (size(navaid) >= 1) { - # spawn DUPLICATE NAMES + if (canvas_mcdu.myDeparture[plan] != nil) { + canvas_mcdu.myDeparture[plan].del(); + } + canvas_mcdu.myDeparture[plan] = nil; + canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(navaid, index, 1, plan); + setprop("/MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES"); + return 2; } }, @@ -277,7 +325,9 @@ var flightPlanController = { } if (text == "CLR") { - return me.deleteWP(index, thePlan); + return me.deleteWP(index, thePlan, 0); + } elsif (size(text) == 16) { + return me.insertLatLonFix(text, index, thePlan); } elsif (size(text) == 5) { return me.insertFix(text, index, thePlan); } elsif (size(text) == 4) { @@ -301,6 +351,7 @@ var flightPlanController = { append(wpDistancePrev[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/distance-from-prev", 0, "DOUBLE")); } me.updatePlans(); + canvas_nd.A3XXRouteDriver.triggerSignal("fp-added"); }, updatePlans: func() { @@ -355,7 +406,6 @@ var flightPlanController = { } me.arrivalDist = me._arrivalDist; me.updateMCDUDriver(n); - canvas_nd.A3XXRouteDriver.triggerSignal("fp-added"); }, updateCurrentWaypoint: func() { diff --git a/Nasal/MCDU/ARRIVAL.nas b/Nasal/MCDU/ARRIVAL.nas index 20633324..72557b61 100644 --- a/Nasal/MCDU/ARRIVAL.nas +++ b/Nasal/MCDU/ARRIVAL.nas @@ -25,22 +25,27 @@ var arrivalPage = { arrAirport: nil, runways: nil, selectedRunway: nil, - sids: nil, + selectedVIA: nil, + selectedSTAR: nil, + selectedTransition: nil, + stars: nil, + transitions: nil, + vias: nil, computer: nil, - enableScroll: 0, - scroll: 0, - _runways: nil, - _sids: nil, + enableScrollApproach: 0, + enableScrollStars: 0, + scrollApproach: 0, + scrollStars: 0, + activePage: 0, # runways, stars, trans + hasPressNoTrans: 0, # temporary + _approaches: nil, + _stars: nil, + _transitions: nil, new: func(icao, computer) { var lr = {parents:[arrivalPage]}; lr.id = icao; lr.computer = computer; lr._setupPageWithData(); - lr.updateRunways(); - if (fmgc.flightPlanController.flightplans[2].destination_runway != nil) { - lr.selectedRunway = fmgc.flightPlanController.flightplans[2].destination_runway; - } - lr.updateActiveRunway(); return lr; }, del: func() { @@ -48,6 +53,31 @@ var arrivalPage = { }, _setupPageWithData: func() { me.title = ["ARRIVAL", " TO ", left(me.id, 4)]; + + if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { + if (fmgc.flightPlanController.flightplans[2].destination_runway != nil) { + me.selectedRunway = fmgc.flightPlanController.flightplans[2].destination_runway; + } + if (fmgc.flightPlanController.flightplans[2].star != nil) { + me.selectedSTAR = fmgc.flightPlanController.flightplans[2].star; + } + } else { + if (fmgc.flightPlanController.flightplans[me.computer].destination_runway != nil) { + me.selectedRunway = fmgc.flightPlanController.flightplans[me.computer].destination_runway; + } elsif (fmgc.flightPlanController.flightplans[2].destination_runway != nil) { + me.selectedRunway = fmgc.flightPlanController.flightplans[2].destination_runway; + } + if (fmgc.flightPlanController.flightplans[me.computer].star != nil) { + me.selectedSTAR = fmgc.flightPlanController.flightplans[me.computer].star; + } elsif (fmgc.flightPlanController.flightplans[2].star != nil) { + me.selectedSTAR = fmgc.flightPlanController.flightplans[2].star; + } + } + + 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"]]; + if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { me.L6 = [" RETURN END", nil, "wht"]; } else { @@ -55,74 +85,273 @@ var arrivalPage = { me.arrowsColour[0][5] = "yel"; } - me.C1 = ["------- ", "VIA", "wht"]; - me.R1 = ["-------", "STAR ", "wht"]; - me.R1 = ["-------", "TRANS ", "wht"]; + if (me.activePage == 0) { + me.updateApproaches(); + } else { + me.updateSTARs(); + } + + me.updateActiveRunway(); + me.updateActiveSTARs(); + me.updateActiveTransitions(); + }, + _clearPage: func() { + me.L1 = [nil, nil, "ack"]; + me.L2 = [nil, nil, "ack"]; + me.L3 = [nil, nil, "ack"]; + me.L4 = [nil, nil, "ack"]; + me.L5 = [nil, nil, "ack"]; + me.L6 = [nil, nil, "ack"]; + 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.C6 = [nil, nil, "ack"]; + me.R1 = [nil, nil, "ack"]; + me.R2 = [nil, nil, "ack"]; + me.R3 = [nil, nil, "ack"]; + me.R4 = [nil, nil, "ack"]; + me.R5 = [nil, nil, "ack"]; + me.R6 = [nil, nil, "ack"]; 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"]]; + me.arrowsMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; + me.arrowsColour = [["ack", "ack", "ack", "ack", "ack", "ack"], ["ack", "ack", "ack", "ack", "ack", "ack"]]; + }, + updatePage: func() { + me._clearPage(); + me._setupPageWithData(); }, updateActiveRunway: func() { if (me.selectedRunway != nil) { if (fmgc.flightPlanController.flightplans[2].destination_runway != nil) { if (fmgc.flightPlanController.flightplans[2].destination_runway.id == me.selectedRunway.id) { - me.L1 = [fmgc.flightPlanController.flightplans[2].destination_runway.id, " RWY", "grn"]; + me.L1 = [fmgc.flightPlanController.flightplans[2].destination_runway.id, " APPR", "grn"]; } elsif (fmgc.flightPlanController.flightplans[me.computer].destination_runway != nil) { - me.L1 = [fmgc.flightPlanController.flightplans[me.computer].destination_runway.id, " RWY", "yel"]; + me.L1 = [fmgc.flightPlanController.flightplans[me.computer].destination_runway.id, " APPR", "yel"]; } else { - me.L1 = ["---", " RWY", "wht"]; + me.L1 = ["---", " APPR", "wht"]; } } elsif (fmgc.flightPlanController.flightplans[me.computer].destination_runway != nil) { - me.L1 = [fmgc.flightPlanController.flightplans[me.computer].destination_runway.id, " RWY", "yel"]; + me.L1 = [fmgc.flightPlanController.flightplans[me.computer].destination_runway.id, " APPR", "yel"]; } else { - me.L1 = ["---", " RWY", "wht"]; + me.L1 = ["---", " APPR", "wht"]; } } else { - me.L1 = ["---", " RWY", "wht"]; + me.L1 = ["---", " APPR", "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; + updateActiveSTARs: func() { + if (me.selectedSTAR != nil) { + if (fmgc.flightPlanController.flightplans[2].star != nil) { + if (fmgc.flightPlanController.flightplans[2].star == me.selectedSTAR) { + me.C1 = [fmgc.flightPlanController.flightplans[2].star.id, "SID", "grn"]; + } elsif (fmgc.flightPlanController.flightplans[me.computer].star != nil) { + me.C1 = [fmgc.flightPlanController.flightplans[me.computer].star.id, "SID", "yel"]; + } else { + me.C1 = ["------- ", "SID", "wht"]; + } + } elsif (fmgc.flightPlanController.flightplans[me.computer].star.id != nil) { + me.C1 = [fmgc.flightPlanController.flightplans[me.computer].star.id, "SID", "yel"]; + } else { + me.C1 = ["------- ", "SID", "wht"]; + } + } else { + me.C1 = ["------- ", "SID", "wht"]; } canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); }, + updateActiveTransitions: func() { + if (!me.hasPressNoTrans) { + if (me.selectedTransition != nil) { + if (fmgc.flightPlanController.flightplans[2].star_trans != nil) { + if (fmgc.flightPlanController.flightplans[2].star_trans == me.selectedTransition) { + me.R1 = [fmgc.flightPlanController.flightplans[2].star_trans.id, "TRANS", "grn"]; + } elsif (fmgc.flightPlanController.flightplans[me.computer].star_trans != nil) { + me.R1 = [fmgc.flightPlanController.flightplans[me.computer].star_trans.id, "TRANS", "yel"]; + } else { + me.R1 = ["-------", "TRANS ", "wht"]; + } + } elsif (fmgc.flightPlanController.flightplans[me.computer].star_trans != nil) { + me.C1 = [fmgc.flightPlanController.flightplans[me.computer].star_trans.id, "SID", "yel"]; + } else { + me.R1 = ["-------", "TRANS ", "wht"]; + } + } else { + me.R1 = ["-------", "TRANS ", "wht"]; + } + } else { + me.R1 = ["NONE", "TRANS ", "yel"]; + } + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + }, + updateApproaches: func() { + if (me.arrAirport == nil) { + me.arrAirport = findAirportsByICAO(left(me.id, 4)); + } + me._approaches = keys(me.arrAirport[0].getApproachList()); + me.approaches = sort(me._approaches,func(a,b) cmp(a,b)); + + if (size(me.approaches) >= 1) { + me.L3 = [" " ~ me.approaches[0 + me.scrollApproach], " APPR", "blu"]; + me.C3 = [math.round(me.arrAirport[0].runways[me.approaches[0 + me.scrollApproach]].runways[0].length) ~ "M", "AVAILABLE ", "blu"]; + me.R3 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.approaches[0 + me.scrollApproach]].runways[0].heading), nil, "blu"]; + if (me.approaches[0 + me.scrollApproach] != me.selectedRunway) { + me.arrowsMatrix[0][1] = 1; + me.arrowsColour[0][1] = "blu"; + } else { + me.arrowsMatrix[0][1] = 0; + me.arrowsColour[0][1] = "ack"; + } + } + if (size(me.approaches) >= 2) { + me.L4 = [" " ~ me.approaches[1 + me.scrollApproach], nil, "blu"]; + me.C4 = [math.round(me.arrAirport[0].runways[me.approaches[1 + me.scrollApproach]].runways[1].length) ~ "M", sprintf("%7.2f", me.arrAirport[0].runways[0 + me.scrollApproach].ils_frequency_mhz), "blu"]; + me.R4 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.approaches[1 + me.scrollApproach]].runways[1].heading), nil, "blu"]; + if (me.approaches[1 + me.scrollApproach] != me.selectedRunway) { + me.arrowsMatrix[0][2] = 1; + me.arrowsColour[0][2] = "blu"; + } else { + me.arrowsMatrix[0][2] = 0; + me.arrowsColour[0][2] = "ack"; + } + } + if (size(me.approaches) >= 3) { + me.L5 = [" " ~ me.approaches[2 + me.scrollApproach], nil, "blu"]; + me.C5 = [math.round(me.arrAirport[0].runways[me.approaches[2 + me.scrollApproach]].runways[2].length) ~ "M", sprintf("%7.2f", me.arrAirport[0].runways[1 + me.scrollApproach].ils_frequency_mhz), "blu"]; + me.R5 = ["CRS" ~ math.round(me.arrAirport[0].runways[me.approaches[2 + me.scrollApproach]].runways[2].heading), nil, "blu"]; + me.C6[1] = sprintf("%7.2f", me.arrAirport[0].runways[2 + me.scrollApproach].ils_frequency_mhz); + if (me.approaches[2 + me.scrollApproach] != me.selectedRunway) { + me.arrowsMatrix[0][2] = 1; + me.arrowsColour[0][2] = "blu"; + } else { + me.arrowsMatrix[0][2] = 0; + me.arrowsColour[0][2] = "ack"; + } + } + + if (size(me.approaches) > 3) { + me.enableScrollApproach = 1; + } + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + }, + updateSTARs: func() { + if (me.arrAirport == nil) { + me.arrAirport = findAirportsByICAO(left(me.id, 4)); + } + if (me.selectedRunway != nil) { + me._stars = me.arrAirport[0].stars(me.selectedRunway.id); + } else { + me._stars = me.arrAirport[0].stars(); + } + + me.stars = sort(me._stars,func(a,b) cmp(a,b)); + + if (size(me.stars) >= 1) { + me.L2 = [" " ~ me.stars[0 + me.scrollStars], "STARS", "blu"]; + if (me.stars[0 + me.scrollStars] != me.selectedSTAR) { + me.arrowsMatrix[0][1] = 1; + me.arrowsColour[0][1] = "blu"; + } else { + me.arrowsMatrix[0][1] = 0; + me.arrowsColour[0][1] = "ack"; + } + } + if (size(me.stars) >= 2) { + me.L3 = [" " ~ me.stars[1 + me.scrollStars], nil, "blu"]; + if (me.stars[1 + me.scrollStars] != me.selectedSTAR) { + me.arrowsMatrix[0][2] = 1; + me.arrowsColour[0][2] = "blu"; + } else { + me.arrowsMatrix[0][2] = 0; + me.arrowsColour[0][2] = "ack"; + } + } + if (size(me.stars) >= 3) { + me.L4 = [" " ~ me.stars[2 + me.scrollStars], nil, "blu"]; + if (me.stars[2 + me.scrollStars] != me.selectedSTAR) { + me.arrowsMatrix[0][3] = 1; + me.arrowsColour[0][3] = "blu"; + } else { + me.arrowsMatrix[0][3] = 0; + me.arrowsColour[0][3] = "ack"; + } + } + if (size(me.stars) >= 4) { + me.L5 = [" " ~ me.stars[3 + me.scrollStars], nil, "blu"]; + if (me.stars[3 + me.scrollStars] != me.selectedSTAR) { + me.arrowsMatrix[0][4] = 1; + me.arrowsColour[0][4] = "blu"; + } else { + me.arrowsMatrix[0][4] = 0; + me.arrowsColour[0][4] = "ack"; + } + } + + me.C2 = [nil, "AVAILABLE", "wht"]; + me.R2 = [nil, "TRANS ", "wht"]; + + if (size(me.stars) > 4) { + me.enableScrollStars = 1; + } + canvas_mcdu.pageSwitch[me.computer].setBoolValue(0); + }, + updateTransitions: func() { + if (me.arrAirport == nil) { + me.arrAirport = findAirportsByICAO(left(me.id, 4)); + } + + me._transitions = me.arrAirport[0].getStar(me.selectedSTAR).transitions; + me.transitions = sort(me._transitions,func(a,b) cmp(a,b)); + + if (size(me.transitions) == 0) { + me.R2 = ["NO TRANS ", "TRANS", "blu"]; + if (!me.hasPressNoTrans) { + me.arrowsMatrix[1][1] = 1; + me.arrowsColour[1][1] = "blu"; + } else { + me.arrowsMatrix[1][1] = 0; + me.arrowsColour[1][1] = "ack"; + } + } elsif (size(me.transitions) >= 1) { + me.R2 = [me.transitions[0] ~ " ", "TRANS", "blu"]; + if (me.transitions[0] != me.selectedTransition) { + me.arrowsMatrix[1][1] = 1; + me.arrowsColour[1][1] = "blu"; + } else { + me.arrowsMatrix[1][1] = 0; + me.arrowsColour[1][1] = "ack"; + } + } elsif (size(me.transitions) >= 2) { + me.R3 = [me.transitions[1] ~ " ", nil, "blu"]; + if (me.transitions[1] != me.selectedTransition) { + me.arrowsMatrix[1][2] = 1; + me.arrowsColour[1][2] = "blu"; + } else { + me.arrowsMatrix[1][2] = 0; + me.arrowsColour[1][2] = "ack"; + } + } elsif (size(me.transitions) >= 3) { + me.R4 = [me.transitions[2] ~ " ", nil, "blu"]; + if (me.transitions[2] != me.selectedTransition) { + me.arrowsMatrix[1][3] = 1; + me.arrowsColour[1][3] = "blu"; + } else { + me.arrowsMatrix[1][3] = 0; + me.arrowsColour[1][3] = "ack"; + } + } elsif (size(me.transitions) >= 4) { + me.R5 = [me.transitions[3] ~ " ", nil, "blu"]; + if (me.transitions[3] != me.selectedTransition) { + me.arrowsMatrix[1][4] = 1; + me.arrowsColour[1][4] = "blu"; + } else { + me.arrowsMatrix[1][4] = 0; + me.arrowsColour[1][4] = "ack"; + } + } + }, makeTmpy: func() { if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { fmgc.flightPlanController.createTemporaryFlightPlan(me.computer); @@ -132,30 +361,93 @@ var arrivalPage = { } }, scrollUp: func() { - if (me.enableScroll) { - me.scroll += 1; - if (me.scroll > size(me.runways) - 4) { - me.scroll = 0; + if (me.activePage == 0) { + if (me.enableScrollApproach) { + me.scrollApproach += 1; + if (me.scrollApproach > size(me.approaches) - 4) { + me.scrollApproach = 0; + } + me.updateApproaches(); + } + } else { + if (me.enableScrollStars) { + me.scrollStars += 1; + if (me.scrollStars > size(me.stars) - 4) { + me.scrollStars = 0; + } + me.updateSTARs(); } - me.updateRunways(); } }, scrollDn: func() { - if (me.enableScroll) { - me.scroll -= 1; - if (me.scroll < 0) { - me.scroll = size(me.runways) - 4; + if (me.activePage == 0) { + if (me.enableScrollApproach) { + me.scrollApproach -= 1; + if (me.scrollApproach < 0) { + me.scrollApproach = size(me.approaches) - 4; + } + me.updateApproaches(); + } + } else { + if (me.enableScrollStars) { + me.scrollStars -= 1; + if (me.scrollStars < 0) { + me.scrollStars = size(me.stars) - 4; + } + me.updateSTARs(); + me.hasPressNoTrans = 0; } - me.updateRunways(); } }, + scrollLeft: func() { + me.activePage = !me.activePage; + me.updatePage(); + }, + scrollRight: func() { + me.activePage = !me.activePage; + me.updatePage(); + }, depPushbuttonLeft: func(index) { - if (size(me.runways) >= (index - 1)) { - me.selectedRunway = me.arrAirport[0].runway(me.runways[index - 2 + me.scroll]); + if (me.activePage == 0) { + if (size(me.approaches) >= (index - 1)) { + me.selectedRunway = me.arrAirport[0].runway(me.approaches[index - 2 + me.scrollApproach]); + me.makeTmpy(); + fmgc.flightPlanController.flightplans[me.computer].destination_runway = me.selectedRunway; + me.updateActiveRunway(); + me.updateApproaches(); + fmgc.flightPlanController.flightPlanChanged(me.computer); + me.scrollRight(); + } else { + notAllowed(me.computer); + } + } else { + if (size(me.stars) >= (index - 1)) { + me.selectedSTAR = me.stars[index - 2 + me.scrollStars]; + me.makeTmpy(); + fmgc.flightPlanController.flightplans[me.computer].star = me.selectedSTAR; + me.updateActiveSTARs(); + me.updateSTARs(); + me.hasPressNoTrans = 0; + me.updateTransitions(); + me.updateActiveTransitions(); + fmgc.flightPlanController.flightPlanChanged(me.computer); + } else { + notAllowed(me.computer); + } + } + }, + depPushbuttonRight: func(index) { + if (index == 2 and size(me.transitions) == 0) { + me.hasPressNoTrans = 1; + me.updateActiveTransitions(); + me.updateTransitions(); + } elsif (size(me.transitions) >= (index - 1)) { + me.selectedTransition = me.transitions[index - 2]; me.makeTmpy(); - fmgc.flightPlanController.flightplans[me.computer].destination_runway = me.selectedRunway; - me.updateActiveRunway(); - fmgc.flightPlanController.checkWPOutputs(me.computer); + fmgc.flightPlanController.flightplans[me.computer].star_trans = me.selectedTransition; + me.updateActiveTransitions(); + me.updateTransitions(); + fmgc.flightPlanController.flightPlanChanged(me.computer); } else { notAllowed(me.computer); } diff --git a/Nasal/MCDU/DEPARTURE.nas b/Nasal/MCDU/DEPARTURE.nas index 71da8d93..de002fb2 100644 --- a/Nasal/MCDU/DEPARTURE.nas +++ b/Nasal/MCDU/DEPARTURE.nas @@ -51,12 +51,6 @@ var departurePage = { }, _setupPageWithData: func() { me.title = ["DEPARTURE", " FROM ", left(me.id, 4)]; - if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { - me.L6 = [" RETURN END", nil, "wht"]; - } else { - me.L6 = [" F-PLN", " TMPY", "yel"]; - me.arrowsColour[0][5] = "yel"; - } if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { if (fmgc.flightPlanController.flightplans[2].departure_runway != nil) { @@ -82,6 +76,13 @@ var departurePage = { 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"]]; + if (!fmgc.flightPlanController.temporaryFlag[me.computer]) { + me.L6 = [" RETURN END", nil, "wht"]; + } else { + me.L6 = [" F-PLN", " TMPY", "yel"]; + me.arrowsColour[0][5] = "yel"; + } + if (me.activePage == 0) { me.updateRunways(); } else { diff --git a/Nasal/MCDU/F-PLN-rework.nas b/Nasal/MCDU/F-PLN-rework.nas index 3e64ab34..5ac6dd20 100644 --- a/Nasal/MCDU/F-PLN-rework.nas +++ b/Nasal/MCDU/F-PLN-rework.nas @@ -12,10 +12,14 @@ var fplnItem = { if (me.wp != nil) { if (me.wp.wp_name != "DISCONTINUITY") { var wptName = split("-", me.wp.wp_name); - if (size(wptName) == 2) { - return[wptName[0] ~ wptName[1], nil, me.colour]; + if (wptName[0] == "VECTORS") { + return ["MANUAL", nil, me.colour]; } else { - return [me.wp.wp_name, nil, me.colour]; + if (size(wptName) == 2) { + return[wptName[0] ~ wptName[1], nil, me.colour]; + } else { + return [me.wp.wp_name, nil, me.colour]; + } } } else { return [nil, nil, "ack"]; @@ -210,7 +214,7 @@ var fplnPage = { # this one is only created once, and then updated - remember th } append(me.planList, staticText.new(me.computer, me.getText("fplnEnd"))); append(me.planList, staticText.new(me.computer, me.getText("noAltnFpln"))); - me.update(); + me.basePage(); }, basePage: func() { me.outputList = []; @@ -272,7 +276,7 @@ var fplnPage = { # this one is only created once, and then updated - remember th me.R6 = ["--.-", "EFOB", "wht"]; }, update: func() { - me.basePage(); + #me.basePage(); }, scrollUp: func() { if (size(me.planList) > 5) { @@ -378,13 +382,15 @@ var duplicateNamesPage = { computer: nil, enableScroll: 0, scroll: 0, - distances: [], - new: func(vector, type, computer) { + distances: nil, + new: func(vector, index, type, computer) { var fp = {parents:[duplicateNamesPage]}; - fp.id = vector; + fp.vector = vector; + fp.index = index; fp.type = type; # 0 = other, 1 = navaid fp.computer = computer; fp._setupPageWithData(); + fp.distances = []; return fp; }, del: func() { @@ -396,8 +402,9 @@ var duplicateNamesPage = { me.arrowsColour = [["ack", "ack", "ack", "ack", "ack", "wht"], ["ack", "ack", "ack", "ack", "ack", "ack"]]; me.fontMatrix = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - for (var i = 0; i <= size(me.vector); i += 1) { - append(distances, courseAndDistance(me.vector[i])); + me.distances = []; + for (var i = 0; i < size(me.vector); i += 1) { + append(me.distances, math.round(courseAndDistance(me.vector[i])[1])); } me.C1[1] = "LAT/LONG"; @@ -407,8 +414,10 @@ var duplicateNamesPage = { me.arrowsMatrix[0][0] = 1; me.arrowsColour[0][0] = "blu"; me.C1 = [" " ~ decimalToShortString(me.vector[0 + me.scroll].lat, "lat") ~ "/" ~ decimalToShortString(me.vector[0 + me.scroll].lon, "lon"), "LAT/LONG", "grn"]; - if (me.vector[0 + me.scroll].frequency != nil) { - me.R1 = [me.vector[0 + me.scroll].frequency, "FREQ", "grn"]; + if (me.type == 1) { + if (me.vector[0 + me.scroll].frequency != nil) { + me.R1 = [sprintf("%7.2f", me.vector[0 + me.scroll].frequency / 100), "FREQ", "grn"]; + } } } if (size(me.vector) >= 2) { @@ -416,8 +425,10 @@ var duplicateNamesPage = { me.arrowsMatrix[0][1] = 1; me.arrowsColour[0][1] = "blu"; me.C2 = [" " ~ decimalToShortString(me.vector[1 + me.scroll].lat, "lat") ~ "/" ~ decimalToShortString(me.vector[1 + me.scroll].lon, "lon"), "LAT/LONG", "grn"]; - if (me.vector[1 + me.scroll].frequency != nil) { - me.R2 = [me.vector[1 + me.scroll].frequency, nil, "grn"]; + if (me.type == 1) { + if (me.vector[1 + me.scroll].frequency != nil) { + me.R2 = [sprintf("%7.2f", me.vector[1 + me.scroll].frequency / 100), "FREQ", "grn"]; + } } } if (size(me.vector) >= 3) { @@ -425,8 +436,10 @@ var duplicateNamesPage = { me.arrowsMatrix[0][2] = 1; me.arrowsColour[0][2] = "blu"; me.C3 = [" " ~ decimalToShortString(me.vector[2 + me.scroll].lat, "lat") ~ "/" ~ decimalToShortString(me.vector[2 + me.scroll].lon, "lon"), "LAT/LONG", "grn"]; - if (me.vector[2 + me.scroll].frequency != nil) { - me.R3 = [me.vector[2 + me.scroll].frequency, nil, "grn"]; + if (me.type == 1) { + if (me.vector[2 + me.scroll].frequency != nil) { + me.R3 = [sprintf("%7.2f", me.vector[2 + me.scroll].frequency / 100), "FREQ", "grn"]; + } } } if (size(me.vector) >= 4) { @@ -434,8 +447,10 @@ var duplicateNamesPage = { me.arrowsMatrix[0][3] = 1; me.arrowsColour[0][3] = "blu"; me.C4 = [" " ~ decimalToShortString(me.vector[3 + me.scroll].lat, "lat") ~ "/" ~ decimalToShortString(me.vector[3 + me.scroll].lon, "lon"), "LAT/LONG", "grn"]; - if (me.vector[3 + me.scroll].frequency != nil) { - me.R4 = [me.vector[3 + me.scroll].frequency, nil, "grn"]; + if (me.type == 1) { + if (me.vector[3 + me.scroll].frequency != nil) { + me.R4 = [sprintf("%7.2f", me.vector[3 + me.scroll].frequency / 100), "FREQ", "grn"]; + } } } if (size(me.vector) >= 5) { @@ -443,8 +458,10 @@ var duplicateNamesPage = { me.arrowsMatrix[0][4] = 1; me.arrowsColour[0][4] = "blu"; me.C5 = [" " ~ decimalToShortString(me.vector[4 + me.scroll].lat, "lat") ~ "/" ~ decimalToShortString(me.vector[4 + me.scroll].lon, "lon"), "LAT/LONG", "grn"]; - if (me.vector[4 + me.scroll].frequency != nil) { - me.R5 = [me.vector[4 + me.scroll].frequency, nil, "grn"]; + if (me.type == 1) { + if (me.vector[4 + me.scroll].frequency != nil) { + me.R5 = [sprintf("%7.2f", me.vector[4 + me.scroll].frequency / 100), "FREQ", "grn"]; + } } } if (size(me.vector) > 5) { me.enableScroll = 1; } @@ -452,25 +469,37 @@ var duplicateNamesPage = { me.L6 = [" RETURN", nil, "wht"]; }, scrollUp: func() { - #if (me.enableScroll) { - # me.scroll += 1; - # if (me.scroll > size(me.vector) - 5) { - # me.scroll = 0; - # } - #} + if (me.enableScroll) { + me.scroll += 1; + if (me.scroll > size(me.vector) - 5) { + me.scroll = 0; + } + } }, scrollDn: func() { - #if (me.enableScroll) { - # me.scroll -= 1; - # if (me.scroll < 0) { - # me.scroll = size(me.vector) - 5; - # } - #} + if (me.enableScroll) { + me.scroll -= 1; + if (me.scroll < 0) { + me.scroll = size(me.vector) - 5; + } + } + }, + pushButtonLeft: func(indexSelect) { + if (size(me.vector[0].id) == 5) { + fmgc.flightPlanController.insertFix(me.vector[0].id, me.index, me.computer, 1, indexSelect - 1); + setprop("/MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); + } elsif (size(me.vector[0].id) == 4) { + fmgc.flightPlanController.insertAirport(me.vector[0].id, me.index, me.computer, 1, indexSelect - 1); + setprop("/MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); + } elsif (size(me.vector[0].id) == 3 or size(me.vector[0].id)== 2) { + fmgc.flightPlanController.insertNavaid(me.vector[0].id, me.index, me.computer, 1, indexSelect - 1); + setprop("/MCDU[" ~ me.computer ~ "]/page", "F-PLNA"); + } }, }; var decimalToShortString = func(dms, type) { - var degrees = split(".", dms)[0]; + var degrees = split(".", sprintf(dms))[0]; if (type == "lat") { var sign = degrees >= 0 ? "N" : "S"; } else { diff --git a/Nasal/MCDU/LATREV.nas b/Nasal/MCDU/LATREV.nas index 3d828ce4..168e446c 100644 --- a/Nasal/MCDU/LATREV.nas +++ b/Nasal/MCDU/LATREV.nas @@ -213,4 +213,32 @@ var dmsToString = func(dms, type) { var sign = degrees >= 0 ? "E" : "W"; } return abs(degrees) ~ "g" ~ minutes ~ " " ~ sign; +} + + +var stringToDegrees = func(string, type) { + if (type == "lat") { + var degrees = left(string, 2); + var minutesStr = right(string, 5); + } else { + var degrees = left(string, 3); + var minutesStr = right(string, 5); + } + + var minutes = left(minutesStr, 4); + var sign = right(minutesStr, 1); + var decimal = degrees + (minutes / 60); + if (type == "lat") { + if (sign == "N") { + return decimal; + } else { + return -decimal; + } + } else { + if (sign == "E") { + return decimal; + } else { + return -decimal; + } + } } \ No newline at end of file diff --git a/Nasal/MCDU/MCDU.nas b/Nasal/MCDU/MCDU.nas index ad76acc4..4d7ba91e 100644 --- a/Nasal/MCDU/MCDU.nas +++ b/Nasal/MCDU/MCDU.nas @@ -114,6 +114,8 @@ var lskbutton = func(btn, i) { setprop("/MCDU[" ~ i ~ "]/page", "DEPARTURE"); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") { canvas_mcdu.myFpln[i].pushButtonLeft(1); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { + canvas_mcdu.myDuplicate[i].pushButtonLeft(1); } else { notAllowed(i); } @@ -140,6 +142,8 @@ var lskbutton = func(btn, i) { canvas_mcdu.myFpln[i].pushButtonLeft(2); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { canvas_mcdu.myDeparture[i].depPushbuttonLeft(2); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { + canvas_mcdu.myDuplicate[i].pushButtonLeft(2); } else { notAllowed(i); } @@ -160,6 +164,8 @@ var lskbutton = func(btn, i) { canvas_mcdu.myFpln[i].pushButtonLeft(3); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { canvas_mcdu.myDeparture[i].depPushbuttonLeft(3); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { + canvas_mcdu.myDuplicate[i].pushButtonLeft(3); } else { notAllowed(i); } @@ -176,6 +182,8 @@ var lskbutton = func(btn, i) { canvas_mcdu.myFpln[i].pushButtonLeft(4); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { canvas_mcdu.myDeparture[i].depPushbuttonLeft(4); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { + canvas_mcdu.myDuplicate[i].pushButtonLeft(4); } else { notAllowed(i); } @@ -200,6 +208,8 @@ var lskbutton = func(btn, i) { canvas_mcdu.myFpln[i].pushButtonLeft(5); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { canvas_mcdu.myDeparture[i].depPushbuttonLeft(5); + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { + canvas_mcdu.myDuplicate[i].pushButtonLeft(5); } else { notAllowed(i); } @@ -216,7 +226,7 @@ var lskbutton = func(btn, i) { printInput2("L6", i); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") { canvas_mcdu.myFpln[i].pushButtonLeft(6); - } else if (getprop("/MCDU[" ~ i ~ "]/page") == "LATREV") { + } else if (getprop("/MCDU[" ~ i ~ "]/page") == "LATREV" or getprop("/MCDU[" ~ i ~ "]/page") == "DUPLICATENAMES") { setprop("/MCDU[" ~ i ~ "]/page", "F-PLNA"); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "DEPARTURE") { if (fmgc.flightPlanController.temporaryFlag[i]) { @@ -246,6 +256,12 @@ var rskbutton = func(btn, i) { printInput("R1", i); } else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") { printInput2("R1", i); + } else if (getprop("/MCDU[" ~ i ~ "/page") == "LATREV") { + if (canvas_mcdu.myArrival[i] != nil) { + canvas_mcdu.myArrival[i].del(); + } + canvas_mcdu.myArrival[i] = nil; + canvas_mcdu.myArrival[i] = arrivalPage.new(canvas_mcdu.myLatRev[i].title[2], i); } else { notAllowed(i); }