Add Place / Bearing / Distance - uses magnetic heading for now
This commit is contained in:
parent
f414119f18
commit
85a34eeb54
3 changed files with 137 additions and 41 deletions
|
@ -125,6 +125,8 @@ var flightPlanController = {
|
|||
|
||||
me.addDiscontinuity(1, plan);
|
||||
# reset mcdu if it exists
|
||||
if (canvas_mcdu.myFpln[0] != nil) { canvas_mcdu.myFpln[0].scroll = 0; }
|
||||
if (canvas_mcdu.myFpln[1] != nil) { canvas_mcdu.myFpln[1].scroll = 0; }
|
||||
if (canvas_mcdu.myArrival[0] != nil) { canvas_mcdu.myArrival[0].reset(); }
|
||||
if (canvas_mcdu.myArrival[1] != nil) { canvas_mcdu.myArrival[1].reset(); }
|
||||
if (canvas_mcdu.myDeparture[0] != nil) { canvas_mcdu.myDeparture[0].reset(); }
|
||||
|
@ -227,11 +229,11 @@ var flightPlanController = {
|
|||
# typeStr: optional argument to be passed to createWP, must be one of "sid", "star" "approach" "missed" or "pseudo"
|
||||
|
||||
childWPBearingDistance: func(wpt, bearing, dist, name, typeStr = "") {
|
||||
var coordinates = greatCircleMove(wpt.lat, wpt.lon, bearing, dist);
|
||||
var coordinates = greatCircleMove(wpt.lat, wpt.lon, num(bearing), num(dist));
|
||||
if (typeStr != "") {
|
||||
return createWP(coordinates, name);
|
||||
} else {
|
||||
return createWP(coordinates, name, typeStr);
|
||||
} else {
|
||||
return createWP(coordinates, name);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -330,6 +332,23 @@ var flightPlanController = {
|
|||
}
|
||||
},
|
||||
|
||||
# createDuplicateNames - helper to spawn DUPLICATENAMES page
|
||||
# args: ghostContainer, index, flag, plan
|
||||
# ghostContainer: vector of fgPositioned ghosts
|
||||
# index: index
|
||||
# flag: is it a navaids DUPLICATENAMES page or not?
|
||||
# plan: plan
|
||||
# flagPBD: do we return back to PBD handler or to default waypoint handler?
|
||||
|
||||
createDuplicateNames: func(ghostContainer, index, flag, plan, flagPBD = 0, bearing = -999, distance = -99) {
|
||||
if (canvas_mcdu.myDuplicate[plan] != nil) {
|
||||
canvas_mcdu.myDuplicate[plan].del();
|
||||
}
|
||||
canvas_mcdu.myDuplicate[plan] = nil;
|
||||
canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(ghostContainer, index, flag, plan, flagPBD, bearing, distance);
|
||||
setprop("MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES");
|
||||
},
|
||||
|
||||
insertAirport: func(text, index, plan, override = 0, overrideIndex = -1) {
|
||||
if (index == 0) {
|
||||
return 1;
|
||||
|
@ -371,12 +390,7 @@ var flightPlanController = {
|
|||
}
|
||||
}
|
||||
} elsif (size(airport) >= 1) {
|
||||
if (canvas_mcdu.myDuplicate[plan] != nil) {
|
||||
canvas_mcdu.myDuplicate[plan].del();
|
||||
}
|
||||
canvas_mcdu.myDuplicate[plan] = nil;
|
||||
canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(airport, index, 0, plan);
|
||||
setprop("MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES");
|
||||
me.createDuplicateNames(airport, index, 0, plan);
|
||||
return 2;
|
||||
}
|
||||
},
|
||||
|
@ -422,12 +436,7 @@ var flightPlanController = {
|
|||
}
|
||||
}
|
||||
} elsif (size(fix) >= 1) {
|
||||
if (canvas_mcdu.myDuplicate[plan] != nil) {
|
||||
canvas_mcdu.myDuplicate[plan].del();
|
||||
}
|
||||
canvas_mcdu.myDuplicate[plan] = nil;
|
||||
canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(fix, index, 0, plan);
|
||||
setprop("MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES");
|
||||
me.createDuplicateNames(fix, index, 0, plan);
|
||||
return 2;
|
||||
}
|
||||
},
|
||||
|
@ -503,16 +512,92 @@ var flightPlanController = {
|
|||
}
|
||||
}
|
||||
} elsif (size(navaid) >= 1) {
|
||||
if (canvas_mcdu.myDuplicate[plan] != nil) {
|
||||
canvas_mcdu.myDuplicate[plan].del();
|
||||
}
|
||||
canvas_mcdu.myDuplicate[plan] = nil;
|
||||
canvas_mcdu.myDuplicate[plan] = mcdu.duplicateNamesPage.new(navaid, index, 1, plan);
|
||||
setprop("MCDU[" ~ plan ~ "]/page", "DUPLICATENAMES");
|
||||
me.createDuplicateNames(navaid, index, 1, plan);
|
||||
return 2;
|
||||
}
|
||||
},
|
||||
|
||||
# getWPforPBD - parse scratchpad text to find waypoint ghost for PBD
|
||||
# args: text, index, plan
|
||||
# text: scratchpad text
|
||||
# index: index at which waypoint will be inserted
|
||||
# plan: plan to which waypoint will be inserted
|
||||
# return:
|
||||
# 0: not in database
|
||||
# 1: notAllowed
|
||||
# 2: o.k.
|
||||
|
||||
getWPforPBD: func(text, index, plan, override = 0, overrideIndex = -1) {
|
||||
if (index == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
var textSplit = split("/", text);
|
||||
|
||||
if (size(split(".", textSplit[2])) != 1 or size(textSplit[1]) < 2 or size(textSplit[1]) > 3) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
var wpGhost = nil;
|
||||
var wpGhostContainer = nil;
|
||||
var type = nil;
|
||||
|
||||
if (size(textSplit[0]) == 5) {
|
||||
wpGhostContainer = findFixesByID(textSplit[0]);
|
||||
if (size(wpGhostContainer) == 0) {
|
||||
return 0;
|
||||
}
|
||||
type = "fix";
|
||||
} elsif (size(textSplit[0]) == 4) {
|
||||
wpGhostContainer = findAirportsByICAO(textSplit[0]);
|
||||
if (size(wpGhostContainer) == 0) {
|
||||
return 0;
|
||||
}
|
||||
type = "airport";
|
||||
} elsif (size(textSplit[0]) == 3 or size(textSplit[0]) == 2) {
|
||||
wpGhostContainer = findNavaidsByID(textSplit[0]);
|
||||
if (size(wpGhostContainer) == 0) {
|
||||
return 0;
|
||||
}
|
||||
type = "navaid";
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (size(wpGhostContainer) == 0 or override) {
|
||||
if (!override) {
|
||||
wpGhost = wpGhostContainer[0];
|
||||
} else {
|
||||
wpGhost = wpGhostContainer[overrideIndex];
|
||||
}
|
||||
} else {
|
||||
if (type == "navaid") {
|
||||
me.createDuplicateNames(wpGhostContainer, index, 1, plan, 1, num(textSplit[1]), num(textSplit[2]));
|
||||
} else {
|
||||
me.createDuplicateNames(wpGhostContainer, index, 0, plan, 1, num(textSplit[1]), num(textSplit[2]));
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
var localMagvar = magvar(wpGhost.lat, wpGhost.lon);
|
||||
me.insertPlaceBearingDistance(wpGhost, textSplit[1] + localMagvar, textSplit[2], index, plan);
|
||||
return 2;
|
||||
},
|
||||
|
||||
|
||||
# insertPlaceBearingDistance - insert PBD waypoint at specified index,
|
||||
# at some specified bearing, distance from a specified location
|
||||
# args: wp, index, plan
|
||||
# wpt: waypoint ghost
|
||||
# index: index to insert at in plan
|
||||
# plan: plan to insert to
|
||||
|
||||
insertPlaceBearingDistance: func(wp, bearing, distance, index, plan) {
|
||||
me.flightplans[plan].insertWP(me.childWPBearingDistance(wp, bearing, distance, "PBD" ~ index), index);
|
||||
me.addDiscontinuity(index + 1, plan);
|
||||
me.flightPlanChanged(plan);
|
||||
},
|
||||
|
||||
scratchpad: func(text, index, plan) { # return 0 not in database, 1 not allowed, 2 success, 3 = not allowed due to dir to
|
||||
if (mcdu.dirToFlag) {
|
||||
return 3;
|
||||
|
@ -529,7 +614,9 @@ var flightPlanController = {
|
|||
var thePlan = plan;
|
||||
}
|
||||
|
||||
if (text == "CLR") {
|
||||
if (size(split("/", text)) == 3) {
|
||||
return me.getWPforPBD(text, index, thePlan);
|
||||
} elsif (text == "CLR") {
|
||||
return me.deleteWP(index, thePlan, 0);
|
||||
} elsif (size(text) > 12) {
|
||||
return me.insertLatLonFix(text, index, thePlan);
|
||||
|
|
|
@ -28,15 +28,18 @@ var duplicateNamesPage = {
|
|||
enableScroll: 0,
|
||||
scroll: 0,
|
||||
distances: nil,
|
||||
new: func(vector, index, type, computer) {
|
||||
var fp = {parents:[duplicateNamesPage]};
|
||||
fp.vector = vector;
|
||||
fp.index = index;
|
||||
fp.type = type; # 0 = other, 1 = navaid
|
||||
fp.computer = computer;
|
||||
fp._setupPageWithData();
|
||||
fp.distances = [];
|
||||
return fp;
|
||||
new: func(vector, index, type, computer, flagPBD = 0, pbdBrg = -999, pbdDist = -99) {
|
||||
var dn = {parents:[duplicateNamesPage]};
|
||||
dn.vector = vector;
|
||||
dn.index = index;
|
||||
dn.type = type; # 0 = other, 1 = navaid
|
||||
dn.flagPBD = flagPBD;
|
||||
dn.bearing = pbdBrg;
|
||||
dn.distance = pbdDist;
|
||||
dn.computer = computer;
|
||||
dn._setupPageWithData();
|
||||
dn.distances = [];
|
||||
return dn;
|
||||
},
|
||||
del: func() {
|
||||
return nil;
|
||||
|
@ -131,14 +134,19 @@ var duplicateNamesPage = {
|
|||
},
|
||||
pushButtonLeft: func(indexSelect) {
|
||||
if (!dirToFlag) {
|
||||
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);
|
||||
if (!me.flagPBD) {
|
||||
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");
|
||||
}
|
||||
} else {
|
||||
fmgc.flightPlanController.getWPforPBD(me.vector[0].id ~ "/" ~ me.bearing ~ "/" ~ me.distance, me.index, me.computer, 1, indexSelect - 1);
|
||||
setprop("MCDU[" ~ me.computer ~ "]/page", "F-PLNA");
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -71,13 +71,14 @@ var fplnItem = {
|
|||
}
|
||||
},
|
||||
getBrg: func() {
|
||||
me.brg = fmgc.wpCourse[me.plan][me.index].getValue() - pts.Environment.magVar.getValue();
|
||||
me.brg = fmgc.wpCourse[me.plan][me.index].getValue() - magvar();
|
||||
if (me.brg < 0) { me.brg += 360; }
|
||||
if (me.brg > 360) { me.brg -= 360; }
|
||||
return sprintf("%03.0f", math.round(me.brg));
|
||||
},
|
||||
getTrack: func() {
|
||||
me.trk = fmgc.wpCoursePrev[me.plan][me.index].getValue() - pts.Environment.magVar.getValue();
|
||||
var wp = fmgc.flightPlanController.flightplans[me.plan].getWP(me.index);
|
||||
me.trk = fmgc.wpCoursePrev[me.plan][me.index].getValue() - magvar(wp.lat, wp.lon);
|
||||
if (me.trk < 0) { me.trk += 360; }
|
||||
if (me.trk > 360) { me.trk -= 360; }
|
||||
return sprintf("%03.0f", math.round(me.trk));
|
||||
|
|
Loading…
Reference in a new issue