Compare commits

...
This repository has been archived on 2021-09-26. You can view files and clone it, but cannot push or open issues or pull requests.

72 commits
master ... FMGC

Author SHA1 Message Date
Josh Davidson
f22fa4040e Merge branch 'master' into FMGC 2019-05-08 19:33:56 -04:00
Josh Davidson
71794299cf Merge branch 'master' into FMGC 2019-03-24 00:06:41 -04:00
Josh Davidson
733a6bd7d0 Merge branch 'master' into FMGC 2019-03-21 16:09:31 -04:00
Josh Davidson
82201c11d0 Sim: Fix commit badness 2019-03-20 00:20:19 -04:00
Joshua Davidson
7d1faf70a0 GIT: Merge master 2019-03-16 22:47:05 -04:00
Joshua Davidson
0aa13c1339 Merge branch 'master' into FMGC 2019-03-16 19:49:25 -04:00
Joshua Davidson
358c69296e Merge branch 'master' into FMGC 2019-03-15 23:23:39 -04:00
Joshua Davidson
2e226d0667 GIT: Merge master 2019-03-14 17:54:51 -04:00
Joshua Davidson
6b90acae4d Merge branch 'master' into FMGC 2019-03-07 23:07:47 -05:00
Joshua Davidson
f1072feaac Merge branch 'master' into FMGC 2019-03-07 21:24:53 -05:00
Joshua Davidson
03424de38f Merge branch 'master' into FMGC 2019-03-07 21:09:34 -05:00
Joshua Davidson
5be5321638 Merge branch 'master' into FMGC 2019-03-07 20:44:42 -05:00
Joshua Davidson
bbb7555e94 Merge branch 'master' into FMGC 2019-03-07 20:32:03 -05:00
Joshua Davidson
ae0a8c2aeb Merge branch 'master' into FMGC 2019-03-05 12:59:05 -05:00
Joshua Davidson
d3cc249c3c Merge branch 'master' into FMGC 2019-03-04 16:39:39 -05:00
Joshua Davidson
37d070c185 Merge branch 'master' into FMGC 2019-03-04 16:21:02 -05:00
Joshua Davidson
5dd23e0bf3 Merge branch 'master' into FMGC 2019-02-27 21:30:51 -05:00
Joshua Davidson
f9e4586f6d Merge branch 'master' into FMGC 2019-02-27 21:29:40 -05:00
Joshua Davidson
2a97e2a430 Merge branch 'master' into FMGC 2019-02-25 17:22:34 -05:00
Joshua Davidson
8cfb007e4a Merge branch 'master' into FMGC 2019-02-25 17:06:35 -05:00
Joshua Davidson
e60b2d1c5a Merge branch 'master' into FMGC 2019-02-25 16:48:51 -05:00
Joshua Davidson
6ab09e39f8 Merge branch 'master' into FMGC 2019-02-25 16:24:15 -05:00
Joshua Davidson
1b0b116127 Merge branch 'master' into FMGC 2019-02-24 17:36:04 -05:00
Joshua Davidson
f7c455edd4 Merge branch 'FMGC' of github.com:it0uchpods/IDG-A32X into FMGC 2019-02-24 17:07:47 -05:00
Joshua Davidson
2d3c6a97a9 Merge branch 'master' into FMGC 2019-02-24 17:07:10 -05:00
Joshua Davidson
cfff08578d FMGC: Fix waypoint advance logic and F-PLN bug 2019-02-21 12:13:46 -07:00
Joshua Davidson
ceb8a6fcdb FMGC: Fix bug in format error message 2019-02-20 18:52:23 -07:00
Joshua Davidson
9a92eaa0c5 FMGC: Fix TMPY ERASE functionality 2019-02-20 12:58:12 -07:00
Joshua Davidson
8522565057 FMGC: Fix F-PLN logic for LAT REV support, and fix CLR button logic 2019-02-20 12:43:03 -07:00
Joshua Davidson
af802e70c8 Merge branch 'master' into FMGC 2019-02-20 12:24:22 -07:00
Joshua Davidson
8303cc4f7a FMGC: Fix bug with LSK on static text items 2019-02-20 12:20:47 -07:00
Joshua Davidson
011b5fac96 FMGC: Add slightly buggy F-PLN Insert/Delete logic 2019-02-20 00:23:47 -07:00
Joshua Davidson
238663b9db FMGC: Many improvements and updates to F-PLN 2019-02-19 21:52:02 -07:00
Joshua Davidson
f84f9f3516 FMGC: Many improvements and updates to F-PLN 2019-02-19 19:48:29 -07:00
Joshua Davidson
f61b77c629 Merge branch 'master' into FMGC 2019-02-19 16:56:49 -07:00
Joshua Davidson
7cf037b698 Merge branch 'master' into FMGC 2019-02-19 16:55:57 -07:00
Joshua Davidson
c760a823b5 FMGC: make more F-PLN stuff work properly 2019-02-19 16:47:42 -07:00
Joshua Davidson
169a8c5e45 FMGC: Remove some print statement 2019-02-19 14:36:53 -07:00
Joshua Davidson
862ed64a28 FMGC: Move F-PLN Code changes to make it work better 2019-02-19 14:36:05 -07:00
Joshua Davidson
ea699ab0cd FMGC: More code improvements 2019-02-18 21:56:10 -07:00
Joshua Davidson
832b928ed2 FMGC: more F-PLN prep 2019-02-18 09:27:54 -07:00
Joshua Davidson
ef255e7bbe FMGC: Add support for independant temporary flightplans, and begin new F-PLN code 2019-02-17 20:31:05 -07:00
Joshua Davidson
b50fd37187 FMGC: Revert badness, it will be reimplemented properly shortly, and make FPLN not available until after INIT 2019-02-17 17:11:12 -07:00
Joshua Davidson
4cb7f07e85 Merge branch 'master' into FMGC 2019-02-17 16:13:43 -07:00
Joshua Davidson
730a3cc35e FMGC: Try to fix F-PLN bugs 2019-02-17 16:00:34 -07:00
Joshua Davidson
1742f5b0c6 FMGC: Ability to insert Waypoints into F-PLN, but it has 2 bugs that need fixing 2019-02-17 14:43:50 -07:00
Joshua Davidson
dbd72d9189 FMGC: Make F-PLN list scrollable 2019-02-17 11:25:44 -07:00
Joshua Davidson
ab7375a53a FMGC: READ ONLY MCDU F-PLN, supports TMPY F-PLN too 2019-02-17 09:29:14 -07:00
Joshua Davidson
4169b7261c Merge branch 'master' into FMGC 2019-02-16 13:53:27 -05:00
Joshua Davidson
4cd9d1e5eb Merge branch 'master' into FMGC 2019-02-10 22:08:48 -05:00
Joshua Davidson
76910c1762 Merge branch 'master' into FMGC 2019-02-10 21:31:01 -05:00
Joshua Davidson
c208121831 Merge branch 'master' into FMGC 2019-02-10 21:10:43 -05:00
Joshua Davidson
091bc5c422 Merge branch 'master' into FMGC 2019-02-10 21:01:20 -05:00
Joshua Davidson
e93de61a35 Merge branch 'master' into FMGC 2019-02-10 18:14:11 -05:00
Joshua Davidson
2e61924974 FMGC: Add/fix more TMPY logic, ready to connect 2019-02-07 00:23:13 -05:00
Joshua Davidson
8e581f0e3b FMGC: Add first bit of TMPY logic, and prepare outputs and output Loop 2019-02-06 20:29:21 -05:00
Joshua Davidson
d4648754bd FMGC: Refactor to prepare for TMPY logic 2019-02-06 17:57:37 -05:00
Joshua Davidson
939e6e1dce DU: sprintf fix in ND 2019-02-06 17:15:39 -05:00
Joshua Davidson
44a5bdc653 DU: Fix ND path drawing error for last WP, thanks to Necolatis for finding this! 2019-02-06 16:10:11 -05:00
Joshua Davidson
446f95a5a7 FMGC: remove fixme 2019-02-05 18:11:30 -05:00
Joshua Davidson
40f22803cb FMGC: Fix managed speed 2019-02-05 16:45:02 -05:00
Joshua Davidson
74cf916ed6 FMGC: LAT and LON out, ND: Fix a bug 2019-02-04 18:35:44 -05:00
Joshua Davidson
d15f45f753 GIT: Merge master, DU: MCDU F-PLN to props.nas 2019-02-03 16:03:31 -05:00
Joshua Davidson
1e1eb44911 DU: Many bugs in ND fixed 2019-02-03 13:53:47 -05:00
Joshua Davidson
e2b32df4fb FMGC: Move flightplan outputs to props.nas 2019-02-03 12:30:29 -05:00
Joshua Davidson
35522fba49 FMGC: Add more outputs from flightplan system 2019-02-03 11:43:53 -05:00
Joshua Davidson
e64707d760 GIT: Merge master 2019-02-02 20:49:53 -05:00
Joshua Davidson
581565f39e FMGC: Add F-PLN page to MCDU, front-end functional, back-end still not 2019-02-02 13:47:05 -05:00
Joshua Davidson
f0b479606d Merge branch 'master' into FMGC 2019-01-30 17:26:40 -05:00
Joshua Davidson
b6a525d970 GIT: Merge master 2019-01-29 19:30:29 -05:00
Joshua Davidson
d482262aee FMGC: FPLN initial file 2019-01-29 19:01:10 -05:00
Joshua Davidson
55e48862fe FMGC: Add initial custom flightplan system logic, and make various stuffs work with it 2019-01-28 21:29:20 -05:00
36 changed files with 3848 additions and 2442 deletions

View file

@ -214,13 +214,13 @@
<dialog-name>autopilot</dialog-name>
</binding>
</item>
<item>
<!--item>
<label>Route Manager</label>
<binding>
<command>dialog-show</command>
<dialog-name>route-manager</dialog-name>
</binding>
</item>
</item-->
</menu>
<menu n="103">
<label>DU</label>
@ -1505,12 +1505,14 @@
<file>Aircraft/IDG-A32X/Nasal/it-fbw.nas</file>
</fbw>
<fmgc>
<file>Aircraft/IDG-A32X/Nasal/flightplan.nas</file>
<file>Aircraft/IDG-A32X/Nasal/FMGC.nas</file>
<file>Aircraft/IDG-A32X/Nasal/FMGC-b.nas</file>
<file>Aircraft/IDG-A32X/Nasal/FMGC-c.nas</file>
</fmgc>
<mcdu>
<file>Aircraft/IDG-A32X/Nasal/MCDU/MCDU.nas</file>
<file>Aircraft/IDG-A32X/Nasal/MCDU/F-PLN.nas</file>
<file>Aircraft/IDG-A32X/Nasal/MCDU/INITA.nas</file>
<file>Aircraft/IDG-A32X/Nasal/MCDU/INITB.nas</file>
<file>Aircraft/IDG-A32X/Nasal/MCDU/PERFCLB.nas</file>

View file

@ -11,6 +11,19 @@ var symbol = "helvetica_medium.txf";
var normal = 70;
var small = 56;
var page = "";
var fplnLineSize = 0;
var fplnl1 = "";
var fplnl1s = "";
var fplnl2 = "";
var fplnl2s = "";
var fplnl3 = "";
var fplnl3s = "";
var fplnl4 = "";
var fplnl4s = "";
var fplnl5 = "";
var fplnl5s = "";
var fplnl6 = "";
var fplnl6s = "";
setprop("/MCDUC/colors/wht/r", 1);
setprop("/MCDUC/colors/wht/g", 1);
setprop("/MCDUC/colors/wht/b", 1);
@ -27,6 +40,12 @@ setprop("/MCDUC/colors/yel/r", 0.9333);
setprop("/MCDUC/colors/yel/g", 0.9333);
setprop("/MCDUC/colors/yel/b", 0.0000);
var WHITE = [1.0000,1.0000,1.0000];
var GREEN = [0.0509,0.7529,0.2941];
var BLUE = [0.0901,0.6039,0.7176];
var AMBER = [0.7333,0.3803,0.0000];
var YELLOW = [0.9333,0.9333,0.0000];
# Fetch nodes:
var ac1 = props.globals.getNode("/systems/electrical/bus/ac1", 1);
var ac2 = props.globals.getNode("/systems/electrical/bus/ac2", 1);
@ -92,6 +111,7 @@ var engOutAcc = props.globals.getNode("/FMGC/internal/eng-out-reduc", 1);
var engOutAccSet = props.globals.getNode("/MCDUC/reducacc-set", 1);
var transAlt = props.globals.getNode("/FMGC/internal/trans-alt", 1);
var managedSpeed = props.globals.getNode("/it-autoflight/input/spd-managed", 1);
var TMPYActive = [props.globals.getNode("/FMGC/internal/tmpy-active[0]"), props.globals.getNode("/FMGC/internal/tmpy-active[1]")];
# Fetch nodes into vectors
var pageProp = [props.globals.getNode("/MCDU[0]/page", 1), props.globals.getNode("/MCDU[1]/page", 1)];
@ -150,7 +170,7 @@ var canvas_MCDU_base = {
"Simple_L1_Arrow","Simple_L2_Arrow","Simple_L3_Arrow","Simple_L4_Arrow","Simple_L5_Arrow","Simple_L6_Arrow","Simple_R1","Simple_R2","Simple_R3","Simple_R4","Simple_R5","Simple_R6","Simple_R1S","Simple_R2S","Simple_R3S","Simple_R4S","Simple_R5S",
"Simple_R6S","Simple_R1_Arrow","Simple_R2_Arrow","Simple_R3_Arrow","Simple_R4_Arrow","Simple_R5_Arrow","Simple_R6_Arrow","Simple_C1","Simple_C2","Simple_C3","Simple_C4","Simple_C5","Simple_C6","Simple_C1S","Simple_C2S","Simple_C3S","Simple_C4S",
"Simple_C5S","Simple_C6S","INITA","INITA_CoRoute","INITA_FltNbr","INITA_CostIndex","INITA_CruiseFLTemp","INITA_FromTo","INITA_InitRequest","INITA_AlignIRS","INITB","INITB_ZFWCG","INITB_ZFW","INITB_ZFW_S","INITB_Block","PERFTO","PERFTO_V1","PERFTO_VR",
"PERFTO_V2","PERFTO_FE","PERFTO_SE","PERFTO_OE"];
"PERFTO_V2","PERFTO_FE","PERFTO_SE","PERFTO_OE","FPLN","FPLN_From","FPLN_TMPY_group","FPLN_Callsign","FPLN_L1","FPLN_L2","FPLN_L3","FPLN_L4","FPLN_L5","FPLN_L6","FPLN_L1S","FPLN_L2S","FPLN_L3S","FPLN_L4S","FPLN_L5S","FPLN_L6S","FPLN_6_group"];
},
update: func() {
if (ac1.getValue() >= 110 and mcdu1_lgt.getValue() > 0.01) {
@ -168,10 +188,174 @@ var canvas_MCDU_base = {
},
updateCommon: func(i) {
page = pageProp[i].getValue();
if (page == "MCDU") {
if (page == "F-PLNA" or page == "F-PLNB") {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].hide();
me["Simple_Center"].hide();
me["FPLN"].show();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
me["Simple_PageNum"].hide();
me["ArrowLeft"].show();
me["ArrowRight"].show();
pageSwitch[i].setBoolValue(1);
}
if (flightNumSet.getValue()) {
me["FPLN_Callsign"].setText(flightNum.getValue());
me["FPLN_Callsign"].show();
} else {
me["FPLN_Callsign"].hide();
}
fplnLineSize = size(mcdu.FPLNLines[i].output);
if (fplnLineSize >= 1) {
fplnl1 = mcdu.FPLNLines[i].output[0].getText();
if (fplnl1 != "") {
me["FPLN_L1"].setColor(mcdu.FPLNLines[i].output[0].getColor(i));
me["FPLN_L1"].setText(fplnl1);
me["FPLN_L1"].show();
} else {
me["FPLN_L1"].hide();
}
fplnl1s = mcdu.FPLNLines[i].output[0].getSubText(i);
if (fplnl1s != "") {
me["FPLN_L1S"].setText(fplnl1s);
me["FPLN_L1S"].show();
} else {
me["FPLN_L1S"].hide();
}
} else {
me["FPLN_L1"].hide();
me["FPLN_L1S"].hide();
}
if (fplnLineSize >= 2) {
fplnl2 = mcdu.FPLNLines[i].output[1].getText();
if (fplnl2 != "") {
me["FPLN_L2"].setColor(mcdu.FPLNLines[i].output[1].getColor(i));
me["FPLN_L2"].setText(fplnl2);
me["FPLN_L2"].show();
} else {
me["FPLN_L2"].hide();
}
fplnl2s = mcdu.FPLNLines[i].output[1].getSubText(i);
if (fplnl2s != "") {
me["FPLN_L2S"].setText(fplnl2s);
me["FPLN_L2S"].show();
} else {
me["FPLN_L2S"].hide();
}
} else {
me["FPLN_L2"].hide();
me["FPLN_L2S"].hide();
}
if (fplnLineSize >= 3) {
fplnl3 = mcdu.FPLNLines[i].output[2].getText();
if (fplnl3 != "") {
me["FPLN_L3"].setColor(mcdu.FPLNLines[i].output[2].getColor(i));
me["FPLN_L3"].setText(fplnl3);
me["FPLN_L3"].show();
} else {
me["FPLN_L3"].hide();
}
fplnl3s = mcdu.FPLNLines[i].output[2].getSubText(i);
if (fplnl3s != "") {
me["FPLN_L3S"].setText(fplnl3s);
me["FPLN_L3S"].show();
} else {
me["FPLN_L3S"].hide();
}
} else {
me["FPLN_L3"].hide();
me["FPLN_L3S"].hide();
}
if (fplnLineSize >= 4) {
fplnl4 = mcdu.FPLNLines[i].output[3].getText();
if (fplnl4 != "") {
me["FPLN_L4"].setColor(mcdu.FPLNLines[i].output[3].getColor(i));
me["FPLN_L4"].setText(fplnl4);
me["FPLN_L4"].show();
} else {
me["FPLN_L4"].hide();
}
fplnl4s = mcdu.FPLNLines[i].output[3].getSubText(i);
if (fplnl4s != "") {
me["FPLN_L4S"].setText(fplnl4s);
me["FPLN_L4S"].show();
} else {
me["FPLN_L4S"].hide();
}
} else {
me["FPLN_L4"].hide();
me["FPLN_L4S"].hide();
}
if (fplnLineSize >= 5) {
fplnl5 = mcdu.FPLNLines[i].output[4].getText();
if (fplnl5 != "") {
me["FPLN_L5"].setColor(mcdu.FPLNLines[i].output[4].getColor(i));
me["FPLN_L5"].setText(fplnl5);
me["FPLN_L5"].show();
} else {
me["FPLN_L5"].hide();
}
fplnl5s = mcdu.FPLNLines[i].output[4].getSubText(i);
if (fplnl5s != "") {
me["FPLN_L5S"].setText(fplnl5s);
me["FPLN_L5S"].show();
} else {
me["FPLN_L5S"].hide();
}
} else {
me["FPLN_L5"].hide();
me["FPLN_L5S"].hide();
}
if (fplnLineSize >= 6) {
fplnl6 = mcdu.FPLNLines[i].output[5].getText();
if (fplnl6 != "") {
me["FPLN_L6"].setColor(mcdu.FPLNLines[i].output[5].getColor(i));
me["FPLN_L6"].setText(fplnl6);
me["FPLN_L6"].show();
} else {
me["FPLN_L6"].hide();
}
fplnl6s = mcdu.FPLNLines[i].output[5].getSubText(i);
if (fplnl6s != "") {
me["FPLN_L6S"].setText(fplnl6s);
me["FPLN_L6S"].show();
} else {
me["FPLN_L6S"].hide();
}
} else {
me["FPLN_L6"].hide();
me["FPLN_L6S"].hide();
}
if (mcdu.FPLNLines[i].index == 0) {
me["FPLN_From"].show();
} else {
me["FPLN_From"].hide();
}
if (TMPYActive[i].getBoolValue()) {
me["FPLN_TMPY_group"].show();
me["FPLN_6_group"].hide();
} else {
me["FPLN_TMPY_group"].hide();
me["FPLN_6_group"].show();
}
} else if (page == "MCDU") {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -253,6 +437,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -334,6 +519,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -413,6 +599,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -497,6 +684,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].show();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -593,6 +781,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -731,6 +920,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].hide();
me["FPLN"].hide();
me["INITA"].show();
me["INITB"].hide();
me["PERFTO"].hide();
@ -885,6 +1075,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].show();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].show();
me["PERFTO"].hide();
@ -1014,6 +1205,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].show();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();
@ -1125,6 +1317,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].show();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].show();
@ -1282,6 +1475,7 @@ var canvas_MCDU_base = {
if (!pageSwitch[i].getBoolValue()) {
me["Simple"].show();
me["Simple_Center"].show();
me["FPLN"].hide();
me["INITA"].hide();
me["INITB"].hide();
me["PERFTO"].hide();

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View file

@ -5,8 +5,8 @@
# Copyright (c) 2019 Joshua Davidson (Octal450)
var get_local_path = func(file){
var aircraft_dir = split("/", getprop("/sim/aircraft-dir"))[-1];
return "Aircraft/" ~ aircraft_dir ~ "/Models/Instruments/ND/canvas/"~ file;
var aircraft_dir = split("/", getprop("/sim/aircraft-dir"))[-1];
return "Aircraft/" ~ aircraft_dir ~ "/Models/Instruments/ND/canvas/"~ file;
};
var version = getprop("sim/version/flightgear");

View file

@ -5,107 +5,118 @@
# Copyright (c) 2019 Joshua Davidson (Octal450)
var A3XXRouteDriver = {
new: func(){
var m = {
parents: [A3XXRouteDriver],
};
m.init();
return m;
},
init: func(){
me.update();
},
update: func(){
me.flightplan = flightplan();
},
getNumberOfFlightPlans: func(){1},
getFlightPlanType: func(fpNum){"current"},
getFlightPlan: func(fpNum){me.flightplan},
getPlanSize: func(fpNum){me.flightplan.getPlanSize()},
getWP: func(fpNum, idx){me.flightplan.getWP(idx)},
getPlanModeWP: func(plan_wp_idx){me.flightplan.getWP(plan_wp_idx)},
hasDiscontinuity: func(fpNum, wptID){0},
getListeners: func(){[]},
shouldUpdate: func 1
new: func(){
var m = {
parents: [A3XXRouteDriver],
};
m.init();
return m;
},
init: func(){
me.update();
},
update: func(){
me.flightplan = fmgc.fp[2];
},
getNumberOfFlightPlans: func(){1},
getFlightPlanType: func(fpNum){"current"},
getFlightPlan: func(fpNum){me.flightplan},
getPlanSize: func(fpNum){me.flightplan.getPlanSize()},
getWP: func(fpNum, idx){me.flightplan.getWP(idx)},
getPlanModeWP: func(plan_wp_idx){me.flightplan.getWP(plan_wp_idx)},
hasDiscontinuity: func(fpNum, wptID){0},
triggerSignal: func(signal){
setprop(me.signalPath(signal),1);
setprop(me.signalPath(signal),0);
},
signalPath: func(signal){
"autopilot/route-manager/signals/rd-"~ signal;
},
getListeners: func(){[
me.signalPath("fp-added"),
me.signalPath("fp-removed")
]},
shouldUpdate: func 1
};
var MultiA3XXRouteDriver = {
parents: [A3XXRouteDriver],
new: func(){
var m = {
parents: [MultiA3XXRouteDriver],
_flightplans: [],
currentFlightPlan: 0
};
m.init();
return m;
},
addFlightPlan: func(type, plan){
append(me._flightplans, {
type: type,
flightplan: plan
});
},
removeFlightPlanAtIndex: func(idx){
var sz = size(me._flightplans);
if(idx < sz){
if(sz == 1)
me._flightplans = [];
elsif(sz == 2 and idx == 0)
me._flightplans = [me._flightplans[1]];
elsif(sz == 2 and idx == 1)
pop(me._flightplans);
else {
var subv_l = subvec(me._flightplans, 0, idx);
var subv_r = subvec(me._flightplans, idx + 1);
me._flightplans = subv_l ~ subv_r;
}
}
me.triggerSignal("fp-added");
},
removeFlightPlanOfType: func(type){
var new_vec = [];
foreach(var fp; me._flightplans){
if(fp["type"] != type)
append(new_vec, fp);
}
me._flightplans = new_vec;
me.triggerSignal("fp-removed");
},
getNumberOfFlightPlans: func(){
size(me._flightplans);
},
getFlightPlanType: func(fpNum){
if(fpNum >= size(me._flightplans)) return nil;
var fp = me._flightplans[fpNum];
return fp.type;
},
getFlightPlan: func(fpNum){
if(fpNum >= size(me._flightplans)) return nil;
return me._flightplans[fpNum];
},
getPlanSize: func(fpNum){
if(fpNum >= size(me._flightplans)) return 0;
return me._flightplans[fpNum].getPlanSize();
},
getWP: func(fpNum, idx){
if(fpNum >= size(me._flightplans)) return nil;
var fp = me._flightplans[fpNum].getPlanSize();
return fp.getWP(idx);
},
getPlanModeWP: func(idx){
if(me.currentFlightPlan >= size(me._flightplans)) return nil;
var fp = me._flightplans[me.currentFlightPlan];
return fp.getWP(idx);
},
triggerSignal: func(signal){
setprop(me.signalPath(signal));
},
signalPath: func(signal){
"autopilot/route-manager/signals/rd-"~ signal;
},
getListeners: func(){[
me.getSignal("fp-added"),
me.getSignal("fp-removed")
]}
parents: [A3XXRouteDriver],
new: func(){
var m = {
parents: [MultiA3XXRouteDriver],
_flightplans: [],
currentFlightPlan: 0
};
m.init();
return m;
},
addFlightPlan: func(type, plan){
append(me._flightplans, {
type: type,
flightplan: plan
});
},
removeFlightPlanAtIndex: func(idx){
var sz = size(me._flightplans);
if(idx < sz){
if(sz == 1)
me._flightplans = [];
elsif(sz == 2 and idx == 0)
me._flightplans = [me._flightplans[1]];
elsif(sz == 2 and idx == 1)
pop(me._flightplans);
else {
var subv_l = subvec(me._flightplans, 0, idx);
var subv_r = subvec(me._flightplans, idx + 1);
me._flightplans = subv_l ~ subv_r;
}
}
me.triggerSignal("fp-added");
},
removeFlightPlanOfType: func(type){
var new_vec = [];
foreach(var fp; me._flightplans){
if(fp["type"] != type)
append(new_vec, fp);
}
me._flightplans = new_vec;
me.triggerSignal("fp-removed");
},
getNumberOfFlightPlans: func(){
size(me._flightplans);
},
getFlightPlanType: func(fpNum){
if(fpNum >= size(me._flightplans)) return nil;
var fp = me._flightplans[fpNum];
return fp.type;
},
getFlightPlan: func(fpNum){
if(fpNum >= size(me._flightplans)) return nil;
return me._flightplans[fpNum];
},
getPlanSize: func(fpNum){
if(fpNum >= size(me._flightplans)) return 0;
return me._flightplans[fpNum].getPlanSize();
},
getWP: func(fpNum, idx){
if(fpNum >= size(me._flightplans)) return nil;
var fp = me._flightplans[fpNum].getPlanSize();
return fp.getWP(idx);
},
getPlanModeWP: func(idx){
if(me.currentFlightPlan >= size(me._flightplans)) return nil;
var fp = me._flightplans[me.currentFlightPlan];
return fp.getWP(idx);
},
triggerSignal: func(signal){
setprop(me.signalPath(signal), 1);
setprop(me.signalPath(signal), 0);
},
signalPath: func(signal){
"autopilot/route-manager/signals/rd-"~ signal;
},
getListeners: func(){[
me.getSignal("fp-added"),
me.getSignal("fp-removed")
]}
};

View file

@ -5,23 +5,23 @@
# Copyright (c) 2019 Joshua Davidson (Octal450)
canvas.NDConfig = {
properties: {
des_apt: "/autopilot/route-manager/destination/airport",
dep_apt: "/autopilot/route-manager/departure/airport",
des_rwy: "/autopilot/route-manager/destination/runway",
dep_rwy: "/autopilot/route-manager/departure/runway",
fplan_active: "autopilot/route-manager/active",
athr: "/it-autoflight/output/athr",
cur_wp: "/autopilot/route-manager/current-wp",
vnav_node: "/autopilot/route-manager/vnav/",
spd_node: "/autopilot/route-manager/spd/",
holding: "/flight-management/hold",
holding_points: "/flight-management/hold/points",
adf1_frq: "instrumentation/adf[0]/frequencies/selected-khz",
adf2_frq: "instrumentation/adf[1]/frequencies/selected-khz",
nav1_frq: "instrumentation/nav[0]/frequencies/selected-mhz",
nav2_frq: "instrumentation/nav[1]/frequencies/selected-mhz",
lat_ctrl: "/it-autoflight/output/lat",
ver_ctrl: "/it-autoflight/output/vert",
}
properties: {
des_apt: "/autopilot/route-manager/destination/airport",
dep_apt: "/autopilot/route-manager/departure/airport",
des_rwy: "/autopilot/route-manager/destination/runway",
dep_rwy: "/autopilot/route-manager/departure/runway",
fplan_active: "autopilot/route-manager/active",
athr: "/it-autoflight/output/athr",
cur_wp: "/autopilot/route-manager/current-wp",
vnav_node: "/autopilot/route-manager/vnav/",
spd_node: "/autopilot/route-manager/spd/",
holding: "/flight-management/hold",
holding_points: "/flight-management/hold/points",
adf1_frq: "instrumentation/adf[0]/frequencies/selected-khz",
adf2_frq: "instrumentation/adf[1]/frequencies/selected-khz",
nav1_frq: "instrumentation/nav[0]/frequencies/selected-mhz",
nav2_frq: "instrumentation/nav[1]/frequencies/selected-mhz",
lat_ctrl: "/it-autoflight/output/lat",
ver_ctrl: "/it-autoflight/output/vert",
}
};

View file

@ -233,7 +233,7 @@ canvas.NavDisplay.newMFD = func(canvas_group, parent=nil, nd_options=nil, update
#print("navdisplay.mfd:ND layer setup completed");
# TODO: move this to RTE.lcontroller ?
me.listen("/autopilot/route-manager/current-wp", func(activeWp) {
me.listen("/FMGC/flightplan[2]/current-wp", func(activeWp) {
canvas.updatewp( activeWp.getValue() );
});
@ -304,12 +304,12 @@ canvas.NavDisplay.update_sub = func(){
pos.lat = wp.wp_lat;
pos.lon = wp.wp_lon;
} else {
pos.lat = getprop("/autopilot/route-manager/route/wp["~pln_wpt_idx~"]/latitude-deg");
pos.lon = getprop("/autopilot/route-manager/route/wp["~pln_wpt_idx~"]/longitude-deg");
pos.lat = getprop("/FMGC/flightplan[2]/wp[" ~ pln_wpt_idx ~ "]/lat");
pos.lon = getprop("/FMGC/flightplan[2]/wp[" ~ pln_wpt_idx ~ "]/lon");
}
} else {
pos.lat = getprop("/autopilot/route-manager/route/wp["~pln_wpt_idx~"]/latitude-deg");
pos.lon = getprop("/autopilot/route-manager/route/wp["~pln_wpt_idx~"]/longitude-deg");
pos.lat = getprop("/FMGC/flightplan[2]/wp[" ~ pln_wpt_idx ~ "]/lat");
pos.lon = getprop("/FMGC/flightplan[2]/wp[" ~ pln_wpt_idx ~ "]/lon");
}
} else {
pos.lat = userLat;

View file

@ -5,141 +5,141 @@
# Copyright (c) 2019 Joshua Davidson (Octal450)
var SymbolPainter = {
aircraft_dir: nil,
getOpts: func(opts){
if(opts == nil) opts = {};
var defOpts = {id:nil,color:nil,scale:1,create_group:0,update_center:0};
if(contains(opts, "id"))
defOpts.id = opts.id;
if(contains(opts, "color"))
defOpts.color = opts.color;
if(contains(opts, "scale"))
defOpts.scale = opts.scale;
if(contains(opts, "create_group"))
defOpts.create_group = opts.create_group;
if(contains(opts, "update_center"))
defOpts.update_center = opts.update_center;
return defOpts;
},
getAircraftDir: func(){
if(me.aircraft_dir == nil)
me.aircraft_dir = split("/", getprop("/sim/aircraft-dir"))[-1];
return me.aircraft_dir;
},
svgPath: func(file){
return "Aircraft/" ~ me.getAircraftDir() ~ "/Models/Instruments/ND/canvas/res/"~file;
},
drawFIX : func(grp, opts = nil){
var icon_fix = nil;
opts = me.getOpts(opts);
var sym_id = opts.id;
if(sym_id != nil)
icon_fix = grp.createChild("path", sym_id);
else
icon_fix = grp.createChild("path");
var color = opts.color;
if(color == nil){
color = {
r: 0.69,
g: 0,
b: 0.39
};
}
var scale = opts.scale;
if(scale == nil) scale = 0.8;
icon_fix.moveTo(-10,0)
.lineTo(0,-17)
.lineTo(10,0)
.lineTo(0,17)
.close()
.setStrokeLineWidth(3)
.setColor(color.r,color.g,color.b)
.setScale(scale,scale);
return icon_fix;
},
drawVOR: func(grp, opts = nil){
opts = me.getOpts(opts);
if(opts.create_group){
var sym_id = opts.id;
if(sym_id != nil)
grp = grp.createChild("group", sym_id);
else
grp = grp.createChild("group");
}
var svg_path = me.svgPath("airbus_vor.svg");
canvas.parsesvg(grp, svg_path);
var scale = opts.scale;
if(scale == nil) scale = 0.8;
grp.setScale(scale,scale);
if(opts.update_center)
grp.setTranslation(-24 * scale,-24 * scale);
if(!contains(grp, "setColor")){
grp.setColor = func {
var layer1 = grp.getElementById("layer1");
if(layer1 == nil) return;
var children = layer1.getChildren();
foreach(var c; children){
if(isa(c, canvas.Path))
c.setColor(arg);
}
};
}
return grp;
},
drawNDB: func(grp, opts = nil){
var icon_ndb = nil;
opts = me.getOpts(opts);
var sym_id = opts.id;
if(sym_id != nil)
icon_ndb = grp.createChild("path", sym_id);
else
icon_ndb = grp.createChild("path");
var color = opts.color;
var color = opts.color;
if(color == nil){
color = {
r: 0.69,
g: 0,
b: 0.39
};
}
var scale = opts.scale;
if(scale == nil) scale = 0.8;
icon_ndb.moveTo(-15,15)
.lineTo(0,-15)
.lineTo(15,15)
.close()
.setStrokeLineWidth(3)
.setColor(color.r,color.g,color.b)
.setScale(scale,scale);
return icon_ndb;
},
drawAirport: func(grp, opts = nil){
opts = me.getOpts(opts);
if(opts.create_group){
var sym_id = opts.id;
if(sym_id != nil)
grp = grp.createChild("group", sym_id);
else
grp = grp.createChild("group");
}
var svg_path = me.svgPath("airbus_airport.svg");
canvas.parsesvg(grp, svg_path);
var scale = opts.scale;
if(scale == nil) scale = 0.8;
grp.setScale(scale,scale);
if(opts.update_center)
grp.setTranslation(-24 * scale,-24 * scale);
return grp;
},
draw: func(type, grp, opts = nil){
if(type == "VOR" or type == "vor")
return me.drawVOR(grp, opts);
elsif(type == "NDB" or type == "ndb")
return me.drawNDB(grp, opts);
elsif(type == "ARPT" or type == "arpt")
return me.drawAirport(grp, opts);
else
return me.drawFIX(grp, opts);
}
aircraft_dir: nil,
getOpts: func(opts){
if(opts == nil) opts = {};
var defOpts = {id:nil,color:nil,scale:1,create_group:0,update_center:0};
if(contains(opts, "id"))
defOpts.id = opts.id;
if(contains(opts, "color"))
defOpts.color = opts.color;
if(contains(opts, "scale"))
defOpts.scale = opts.scale;
if(contains(opts, "create_group"))
defOpts.create_group = opts.create_group;
if(contains(opts, "update_center"))
defOpts.update_center = opts.update_center;
return defOpts;
},
getAircraftDir: func(){
if(me.aircraft_dir == nil)
me.aircraft_dir = split("/", getprop("/sim/aircraft-dir"))[-1];
return me.aircraft_dir;
},
svgPath: func(file){
return "Aircraft/" ~ me.getAircraftDir() ~ "/Models/Instruments/ND/canvas/res/"~file;
},
drawFIX : func(grp, opts = nil){
var icon_fix = nil;
opts = me.getOpts(opts);
var sym_id = opts.id;
if(sym_id != nil)
icon_fix = grp.createChild("path", sym_id);
else
icon_fix = grp.createChild("path");
var color = opts.color;
if(color == nil){
color = {
r: 0.69,
g: 0,
b: 0.39
};
}
var scale = opts.scale;
if(scale == nil) scale = 0.8;
icon_fix.moveTo(-10,0)
.lineTo(0,-17)
.lineTo(10,0)
.lineTo(0,17)
.close()
.setStrokeLineWidth(3)
.setColor(color.r,color.g,color.b)
.setScale(scale,scale);
return icon_fix;
},
drawVOR: func(grp, opts = nil){
opts = me.getOpts(opts);
if(opts.create_group){
var sym_id = opts.id;
if(sym_id != nil)
grp = grp.createChild("group", sym_id);
else
grp = grp.createChild("group");
}
var svg_path = me.svgPath("airbus_vor.svg");
canvas.parsesvg(grp, svg_path);
var scale = opts.scale;
if(scale == nil) scale = 0.8;
grp.setScale(scale,scale);
if(opts.update_center)
grp.setTranslation(-24 * scale,-24 * scale);
if(!contains(grp, "setColor")){
grp.setColor = func {
var layer1 = grp.getElementById("layer1");
if(layer1 == nil) return;
var children = layer1.getChildren();
foreach(var c; children){
if(isa(c, canvas.Path))
c.setColor(arg);
}
};
}
return grp;
},
drawNDB: func(grp, opts = nil){
var icon_ndb = nil;
opts = me.getOpts(opts);
var sym_id = opts.id;
if(sym_id != nil)
icon_ndb = grp.createChild("path", sym_id);
else
icon_ndb = grp.createChild("path");
var color = opts.color;
var color = opts.color;
if(color == nil){
color = {
r: 0.69,
g: 0,
b: 0.39
};
}
var scale = opts.scale;
if(scale == nil) scale = 0.8;
icon_ndb.moveTo(-15,15)
.lineTo(0,-15)
.lineTo(15,15)
.close()
.setStrokeLineWidth(3)
.setColor(color.r,color.g,color.b)
.setScale(scale,scale);
return icon_ndb;
},
drawAirport: func(grp, opts = nil){
opts = me.getOpts(opts);
if(opts.create_group){
var sym_id = opts.id;
if(sym_id != nil)
grp = grp.createChild("group", sym_id);
else
grp = grp.createChild("group");
}
var svg_path = me.svgPath("airbus_airport.svg");
canvas.parsesvg(grp, svg_path);
var scale = opts.scale;
if(scale == nil) scale = 0.8;
grp.setScale(scale,scale);
if(opts.update_center)
grp.setTranslation(-24 * scale,-24 * scale);
return grp;
},
draw: func(type, grp, opts = nil){
if(type == "VOR" or type == "vor")
return me.drawVOR(grp, opts);
elsif(type == "NDB" or type == "ndb")
return me.drawNDB(grp, opts);
elsif(type == "ARPT" or type == "arpt")
return me.drawAirport(grp, opts);
else
return me.drawFIX(grp, opts);
}
};

View file

@ -10,78 +10,78 @@ version = num(v[0]~"."~v[1]);
setlistener("/nasal/canvas/loaded", func() {
####### LOAD FILES #######
#print("loading files");
(func {
var aircraft_root = getprop("/sim/aircraft-dir");
####### LOAD FILES #######
#print("loading files");
(func {
var aircraft_root = getprop("/sim/aircraft-dir");
var load = func(file, name) {
#print("Loading ..." ~ file);
if (name == nil)
var name = split("/", file)[-1];
if (substr(name, size(name)-4) == ".draw")
name = substr(name, 0, size(name)-5);
#print("reading file");
var code = io.readfile(file);
#print("compiling file");
# This segfaults for some reason:
#var code = call(compile, [code], var err=[]);
var code = call(func compile(code, file), [code], var err=[]);
if (size(err)) {
#print("handling error");
if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature
var e = split(" at line ", err[0]);
if (size(e) == 2)
err[0] = string.join("", [e[0], "\n at ", file, ", line ", e[1], "\n "]);
}
for (var i = 1; (var c = caller(i)) != nil; i += 1)
err ~= subvec(c, 2, 2);
debug.printerror(err);
return;
}
#print("calling code");
call(code, nil, nil, var hash = {});
#debug.dump(keys(hash));
return hash;
};
var load = func(file, name) {
#print("Loading ..." ~ file);
if (name == nil)
var name = split("/", file)[-1];
if (substr(name, size(name)-4) == ".draw")
name = substr(name, 0, size(name)-5);
#print("reading file");
var code = io.readfile(file);
#print("compiling file");
# This segfaults for some reason:
#var code = call(compile, [code], var err=[]);
var code = call(func compile(code, file), [code], var err=[]);
if (size(err)) {
#print("handling error");
if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature
var e = split(" at line ", err[0]);
if (size(e) == 2)
err[0] = string.join("", [e[0], "\n at ", file, ", line ", e[1], "\n "]);
}
for (var i = 1; (var c = caller(i)) != nil; i += 1)
err ~= subvec(c, 2, 2);
debug.printerror(err);
return;
}
#print("calling code");
call(code, nil, nil, var hash = {});
#debug.dump(keys(hash));
return hash;
};
var load_deps = func(name) {
print("Loading MapStructure Layer: "~ name);
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".lcontroller", name);
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".symbol", name);
if(version < 3.2)
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".scontroller", name);
}
var load_deps = func(name) {
print("Loading MapStructure Layer: "~ name);
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".lcontroller", name);
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".symbol", name);
if(version < 3.2)
load(aircraft_root~"/Models/Instruments/ND/map/"~name~".scontroller", name);
}
#foreach( var name; ["APS","ALT-profile","SPD-profile","RTE","WPT","DECEL","NDB"] )
#load_deps( name );
var dep_names = [
# With these extensions, in this order:
"lcontroller",
"symbol",
"scontroller",
"controller",
];
var map_root = aircraft_root~"/Models/Instruments/ND/canvas/map/";
var files = directory(map_root);
var deps = {};
foreach (var d; dep_names) deps[d] = [];
foreach(var f; files){
var ext = size(var s=split(".", f)) > 1 ? s[-1] : nil;
foreach (var d; dep_names) {
if (ext == d) {
append(deps[d], f);
break
}
}
}
#foreach( var name; ["APS","ALT-profile","SPD-profile","RTE","WPT","DECEL","NDB"] )
#load_deps( name );
var dep_names = [
# With these extensions, in this order:
"lcontroller",
"symbol",
"scontroller",
"controller",
];
var map_root = aircraft_root~"/Models/Instruments/ND/canvas/map/";
var files = directory(map_root);
var deps = {};
foreach (var d; dep_names) deps[d] = [];
foreach(var f; files){
var ext = size(var s=split(".", f)) > 1 ? s[-1] : nil;
foreach (var d; dep_names) {
if (ext == d) {
append(deps[d], f);
break
}
}
}
foreach (var d; dep_names) {
foreach (var f; deps[d]) {
var name = split(".", f)[0];
load(map_root~f, name);
}
}
foreach (var d; dep_names) {
foreach (var f; deps[d]) {
var name = split(".", f)[0];
load(map_root~f, name);
}
}
})();

View file

@ -8,5 +8,5 @@ var new = func(model) ; # this controller doesn't need an instance
var LayerController = SymbolLayer.Controller.registry[name];
var isActive = func(model) {return 1};#LayerController.a_instance.isActive(model);
var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
die(name~".scontroller.query_range /MUST/ be provided by implementation");
#var model = props.globals.getNode('/position');

View file

@ -8,5 +8,5 @@ var new = func(model) ; # this controller doesn't need an instance
var LayerController = canvas.SymbolLayer.Controller.registry[name];
var isActive = func(model) {return 1};#LayerController.a_instance.isActive(model);
var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
die(name~".scontroller.query_range /MUST/ be provided by implementation");
#var model = props.globals.getNode('/position');

View file

@ -11,6 +11,6 @@ var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
var getpos = func(model){
[model.lat, model.lon];
[model.lat, model.lon];
}

View file

@ -6,66 +6,66 @@ var __self__ = caller(0)[0];
canvas.SymbolLayer.Controller.add(name, __self__);
canvas.SymbolLayer.add(name, {
parents: [canvas.MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: {
update_t : 'autopilot/route-manager/debug/update_t',
listen: ['update_t']
},
df_style: {
default_color: [1,0,0],
}
parents: [canvas.MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: {
update_t : 'autopilot/route-manager/debug/update_t',
listen: ['update_t']
},
df_style: {
default_color: [1,0,0],
}
});
var new = func(layer) {
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.equals(b);
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.equals(b);
return m;
return m;
};
var del = func() {
foreach (var l; me.listeners)
removelistener(l);
foreach (var l; me.listeners)
removelistener(l);
};
var searchCmd = func {
var result = [];
#return result;
var node = me['node'];
if (node == nil) {
node = props.globals.getNode('autopilot/route-manager/debug/', 1);
me.node = node;
}
var points = me.node.getNode('points', 1).getChildren();
#var count = getprop('autopilot/route-manager/debug/num') or 0;
var count = size(points);
#print('Map DEBUG: querying '~ count ~' results.');
for(var idx = 0; idx < count; idx += 1){
var point = points[idx];
#var id = getprop('autopilot/route-manager/debug/point['~idx~']/id');
#var lat = getprop('autopilot/route-manager/debug/point['~idx~']/lat');
#var lon = getprop('autopilot/route-manager/debug/point['~idx~']/lon');
var id = point.getValue('id');
var lat = point.getValue('lat');
var lon = point.getValue('lon');
if (id == nil or id == '') continue;
#print('Map DEBUG: found '~ id ~' debug point.');
var model = {
id: id,
lat: lat,
lon: lon,
equals: func(o){
me.id == o.id and me.lat == o.lat and me.lon == o.lon
}
};
append(result, model);
}
return result;
var result = [];
#return result;
var node = me['node'];
if (node == nil) {
node = props.globals.getNode('autopilot/route-manager/debug/', 1);
me.node = node;
}
var points = me.node.getNode('points', 1).getChildren();
#var count = getprop('autopilot/route-manager/debug/num') or 0;
var count = size(points);
#print('Map DEBUG: querying '~ count ~' results.');
for(var idx = 0; idx < count; idx += 1){
var point = points[idx];
#var id = getprop('autopilot/route-manager/debug/point['~idx~']/id');
#var lat = getprop('autopilot/route-manager/debug/point['~idx~']/lat');
#var lon = getprop('autopilot/route-manager/debug/point['~idx~']/lon');
var id = point.getValue('id');
var lat = point.getValue('lat');
var lon = point.getValue('lon');
if (id == nil or id == '') continue;
#print('Map DEBUG: found '~ id ~' debug point.');
var model = {
id: id,
lat: lat,
lon: lon,
equals: func(o){
me.id == o.id and me.lat == o.lat and me.lon == o.lon
}
};
append(result, model);
}
return result;
}

View file

@ -8,20 +8,20 @@ canvas.DotSym.makeinstance( name, __self__ );
var element_type = "group";
var init = func {
me.text_wps = me.element.createChild("text", "dbg-text-" ~ me.model.id)
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.id)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15)
.setColor(1,0,0);
me.text_alt = nil;
me.sym = me.element.createChild("path").
setStrokeLineWidth(4).
moveTo(-16,0).
arcSmallCW(16,16,0,32,0).
arcSmallCW(16,16,0,-32,0).
setColor(1,0,0);
me.text_wps = me.element.createChild("text", "dbg-text-" ~ me.model.id)
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.id)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15)
.setColor(1,0,0);
me.text_alt = nil;
me.sym = me.element.createChild("path").
setStrokeLineWidth(4).
moveTo(-16,0).
arcSmallCW(16,16,0,32,0).
arcSmallCW(16,16,0,-32,0).
setColor(1,0,0);
}
var draw = func{

View file

@ -6,32 +6,32 @@ var __self__ = caller(0)[0];
canvas.SymbolLayer.Controller.add(name, __self__);
canvas.SymbolLayer.add(name, {
parents: [MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options : { # default configuration options
decel_node: "/autopilot/route-manager/vnav/decel/"
}
parents: [MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options : { # default configuration options
decel_node: "/autopilot/route-manager/vnav/decel/"
}
});
var new = func(layer) {
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.getName() == b.getName();
return m;
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.getName() == b.getName();
return m;
};
var del = func() {
foreach (var l; me.listeners)
removelistener(l);
foreach (var l; me.listeners)
removelistener(l);
};
var searchCmd = func {
var results = [];
var symNode = props.globals.getNode(me.layer.options.decel_node);
if (symNode != nil and symNode.getValue('longitude-deg') != nil)
append(results, symNode);
return results;
var results = [];
var symNode = props.globals.getNode(me.layer.options.decel_node);
if (symNode != nil and symNode.getValue('longitude-deg') != nil)
append(results, symNode);
return results;
}

View file

@ -8,5 +8,5 @@ var new = func(model) ; # this controller doesn't need an instance
var LayerController = canvas.SymbolLayer.Controller.registry[name];
var isActive = func(model) {return 1};#LayerController.a_instance.isActive(model);
var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
die(name~".scontroller.query_range /MUST/ be provided by implementation");
#var model = props.globals.getNode('/position');

View file

@ -12,21 +12,21 @@ canvas.DotSym.makeinstance( name, __self__ );
var element_type = "group";
var init = func {
var svg_path = me.getStyle('svg_path');
if(svg_path == nil)
svg_path = get_local_path('res/airbus_decel.svg');
me.decel_grp = me.element.createChild("group","decel");
canvas.parsesvg(me.decel_grp, svg_path);
me.decel_grp.set('z-index', 5);
var svg_path = me.getStyle('svg_path');
if(svg_path == nil)
svg_path = get_local_path('res/airbus_decel.svg');
me.decel_grp = me.element.createChild("group","decel");
canvas.parsesvg(me.decel_grp, svg_path);
me.decel_grp.set('z-index', 5);
}
var draw = func{
if(me.decel_grp != nil){
var spd_ctrl = getprop(me.options.spd_ctrl);
var spd_managed = (spd_ctrl == me.options.managed_val);
if(spd_managed)
me.decel_grp.setColor(me.style.managed_color);
else
me.decel_grp.setColor(me.style.selected_color);
}
if(me.decel_grp != nil){
var spd_ctrl = getprop(me.options.spd_ctrl);
var spd_managed = (spd_ctrl == me.options.managed_val);
if(spd_managed)
me.decel_grp.setColor(me.style.managed_color);
else
me.decel_grp.setColor(me.style.selected_color);
}
}

View file

@ -12,9 +12,9 @@ SymbolLayer.add(name, {
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: { # default configuration options
active_node: "/autopilot/route-manager/active",
current_wp_node: "/autopilot/route-manager/current-wp",
wp_num: "/autopilot/route-manager/route/num",
active_node: "/FMGC/flightplan[2]/active",
current_wp_node: "/FMGC/flightplan[2]/current-wp",
wp_num: "/FMGC/flightplan[2]/num",
display_inactive_rte: 0
}
});
@ -74,12 +74,12 @@ var searchCmd = func {
path = [{},{lon:leg.wp_lon, lat:leg.wp_lat}];
else
path = leg.path();
if(i == (fpSize - 1) and !discontinuity){# WORKAROUND FOR FG BUG
var ltype = leg.wp_type;
var path_l = size(path);
if(ltype != 'runway' and path_l >= 2)
path = subvec(path, 0, 1) ~ subvec(path, path_l - 1, 1);
}
# if(i == (fpSize - 1) and !discontinuity){# WORKAROUND FOR FG BUG -- we don't need it anymore (I think)!
# var ltype = leg.wp_type;
# var path_l = size(path);
# if(ltype != 'runway' and path_l >= 2)
# path = subvec(path, 0, 1) ~ subvec(path, path_l - 1, 1);
# }
coords ~= path;
discontinuity = driver.hasDiscontinuity(idx, leg);
}

View file

@ -8,5 +8,5 @@ var new = func(model) ; # this controller doesn't need an instance
var LayerController = canvas.SymbolLayer.Controller.registry[name];
var isActive = func(model) {return 1};#LayerController.a_instance.isActive(model);
var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
die(name~".scontroller.query_range /MUST/ be provided by implementation");
#var model = props.globals.getNode('/position');

View file

@ -9,72 +9,72 @@ DotSym.makeinstance( name, __self__ );
var element_type = "group";
var style = { # style to use by default
zoom: 20,
color: [1,1,1],
center_line_len: 0.75,
line_width: 3
zoom: 20,
color: [1,1,1],
center_line_len: 0.75,
line_width: 3
};
SymbolLayer.get(name).df_style = style;
#var already_drawn = 0;
var init = func {
#if(me.already_drawn) return;
var lat = me.model.lat;
var lon = me.model.lon;
var rwyhdg = me.model.heading;
var width = me.model.width;
var length = me.model.length;
var group = me.element;
var ctr_len = length * me.getStyle('center_line_len', 0.75);
var crds = [];
var coord = geo.Coord.new();
width = width * me.getStyle('zoom', 20); # Else rwy is too thin to be visible
var line_w = me.getStyle('line_width', 3);
var color = me.getStyle('color', [1,1,1]);
coord.set_latlon(lat, lon);
coord.apply_course_distance(rwyhdg, -(ctr_len / 2));
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, (ctr_len));
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy-cl")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4],crds)
.setColor(color);
#.setStrokeDashArray([10, 20, 10, 20, 10]);
#icon_rwy.hide();
var crds = [];
coord.set_latlon(lat, lon);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg + 90, width/2);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, length);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4,4],crds)
.setColor(color);
var crds = [];
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg - 90, width);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, -length);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg + 90, width / 2);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4,4,4],crds)
.setColor(color);
#if(me.already_drawn) return;
var lat = me.model.lat;
var lon = me.model.lon;
var rwyhdg = me.model.heading;
var width = me.model.width;
var length = me.model.length;
var group = me.element;
var ctr_len = length * me.getStyle('center_line_len', 0.75);
var crds = [];
var coord = geo.Coord.new();
width = width * me.getStyle('zoom', 20); # Else rwy is too thin to be visible
var line_w = me.getStyle('line_width', 3);
var color = me.getStyle('color', [1,1,1]);
coord.set_latlon(lat, lon);
coord.apply_course_distance(rwyhdg, -(ctr_len / 2));
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, (ctr_len));
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy-cl")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4],crds)
.setColor(color);
#.setStrokeDashArray([10, 20, 10, 20, 10]);
#icon_rwy.hide();
var crds = [];
coord.set_latlon(lat, lon);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg + 90, width/2);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, length);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4,4],crds)
.setColor(color);
var crds = [];
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg - 90, width);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg, -length);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
coord.apply_course_distance(rwyhdg + 90, width / 2);
append(crds,"N"~coord.lat());
append(crds,"E"~coord.lon());
icon_rwy = group.createChild("path", "rwy")
.setStrokeLineWidth(line_w)
.setDataGeo([2,4,4,4],crds)
.setColor(color);
};
var draw = func{}

View file

@ -5,47 +5,47 @@ var parents = [canvas.SymbolLayer.Controller];
var __self__ = caller(0)[0];
var _options = { # default configuration options
alts: [100,140,250,260,'wp']
alts: [100,140,250,260,'wp']
};
canvas.SymbolLayer.Controller.add(name, __self__);
canvas.SymbolLayer.add(name, {
parents: [MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: _options
parents: [MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: _options
});
var new = func(layer) {
var m = {
parents: [__self__],
layer: layer,
#map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.getName() == b.getName();
#append(m.listeners, setlistener(layer.options.fplan_active, func m.layer.update() ));
#m.addVisibilityListener();
var m = {
parents: [__self__],
layer: layer,
#map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.getName() == b.getName();
#append(m.listeners, setlistener(layer.options.fplan_active, func m.layer.update() ));
#m.addVisibilityListener();
return m;
return m;
};
var del = func() {
foreach (var l; me.listeners)
removelistener(l);
foreach (var l; me.listeners)
removelistener(l);
};
var searchCmd = func {
var results = [];
var spdNode = props.globals.getNode(me.layer.options.spd_node);
if (spdNode != nil) {
var limits = spdNode.getChildren();
foreach (var limit; limits) {
#t = 'spd-change-point' ~ '-' ~ alt;
#print('SPD-Controller, search for '~t);
#var n = spdNode.getNode(t);
if (limit != nil and limit.getValue('longitude-deg') != nil){
#print('SPD-Controller -> Append');
append(results, limit);
}
}
}
return results;
var results = [];
var spdNode = props.globals.getNode(me.layer.options.spd_node);
if (spdNode != nil) {
var limits = spdNode.getChildren();
foreach (var limit; limits) {
#t = 'spd-change-point' ~ '-' ~ alt;
#print('SPD-Controller, search for '~t);
#var n = spdNode.getNode(t);
if (limit != nil and limit.getValue('longitude-deg') != nil){
#print('SPD-Controller -> Append');
append(results, limit);
}
}
}
return results;
}

View file

@ -8,5 +8,5 @@ var new = func(model) ; # this controller doesn't need an instance
var LayerController = canvas.SymbolLayer.Controller.registry[name];
var isActive = func(model) {return 1};#LayerController.a_instance.isActive(model);
var query_range = func()
die(name~".scontroller.query_range /MUST/ be provided by implementation");
die(name~".scontroller.query_range /MUST/ be provided by implementation");
#var model = props.globals.getNode('/position');

View file

@ -32,9 +32,9 @@ var draw = func{
# var name = me.model.getName();
# var sym_group = me.element.getElementById(name);
# sym_group.set('z-index', 5);
if(me.spd_sym == nil){
me.spd_sym = me.getElementById("airbus-spd-sym");
me.spd_sym.setTranslation(-24, -24).set('z-index', 5);
}
if(me.spd_sym == nil){
me.spd_sym = me.getElementById("airbus-spd-sym");
me.spd_sym.setTranslation(-24, -24).set('z-index', 5);
}
}

View file

@ -5,58 +5,58 @@ var parents = [SymbolLayer.Controller];
var __self__ = caller(0)[0];
SymbolLayer.Controller.add(name, __self__);
SymbolLayer.add(name, {
parents: [NavaidSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: {
vor1_frq: 'instrumentation/nav[2]/frequencies/selected-mhz',
vor2_frq: 'instrumentation/nav[3]/frequencies/selected-mhz'
},
df_style: {
scale: 1
}
parents: [NavaidSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: {
vor1_frq: 'instrumentation/nav[2]/frequencies/selected-mhz',
vor2_frq: 'instrumentation/nav[3]/frequencies/selected-mhz'
},
df_style: {
scale: 1
}
});
var new = func(layer) {
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
active_vors: [],
navNs: props.globals.getNode("instrumentation").getChildren("nav"),
listeners: [],
query_type:'vor',
};
setsize(m.active_vors, size(m.navNs));
foreach (var navN; m.navNs) {
append(m.listeners, setlistener(
navN.getNode("frequencies/selected-mhz"),
func m.changed_freq()
));
}
#call(debug.dump, keys(layer));
m.changed_freq(update:0);
m.addVisibilityListener();
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
active_vors: [],
navNs: props.globals.getNode("instrumentation").getChildren("nav"),
listeners: [],
query_type:'vor',
};
setsize(m.active_vors, size(m.navNs));
foreach (var navN; m.navNs) {
append(m.listeners, setlistener(
navN.getNode("frequencies/selected-mhz"),
func m.changed_freq()
));
}
#call(debug.dump, keys(layer));
m.changed_freq(update:0);
m.addVisibilityListener();
return m;
return m;
};
var del = func() {
printlog(_MP_dbg_lvl, name,".lcontroller.del()");
foreach (var l; me.listeners)
removelistener(l);
printlog(_MP_dbg_lvl, name,".lcontroller.del()");
foreach (var l; me.listeners)
removelistener(l);
};
# Controller methods
var isActive = func(model) {
var my_freq = model.frequency/100;
foreach (var freq; me.active_vors)
if (freq == my_freq) return 1;
return 0;
var my_freq = model.frequency/100;
foreach (var freq; me.active_vors)
if (freq == my_freq) return 1;
return 0;
};
var changed_freq = func(update=1) {
#debug.dump(me.active_vors);
foreach (var navN; me.navNs)
me.active_vors[ navN.getIndex() ] = navN.getValue("frequencies/selected-mhz");
if (update) me.layer.update();
#debug.dump(me.active_vors);
foreach (var navN; me.navNs)
me.active_vors[ navN.getIndex() ] = navN.getValue("frequencies/selected-mhz");
if (update) me.layer.update();
};
var searchCmd = NavaidSymbolLayer.make('vor');

View file

@ -11,33 +11,33 @@ var svg_path = get_local_path('res/airbus_vor.svg');
var vor_sym = nil;
var draw = func{
if(me.vor_sym == nil)
me.vor_sym = me.element.getElementById("airbus-vor-sym");
me.vor_sym.setTranslation(-24,-24);
if(me.text_vor == nil){
var transl = me.getStyle('translation', [25,10]);
var text_color = me.getStyle('text_color', [1,1,1]);
me.text_vor = me.element.createChild("text")
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.id)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setColor(text_color)
.setTranslation(transl);
}
var frq = me.model.frequency;
if(frq != nil){
var dfcolor = me.getStyle('color', [0.9,0,0.47]);
var tuned_color = me.getStyle('tuned_color', [0,0.62,0.84]);
frq = frq / 100;
var vor1_frq = getprop(me.options.vor1_frq);
var vor2_frq = getprop(me.options.vor2_frq);
if(vor1_frq == frq or vor2_frq == frq){
me.element.setColor(tuned_color);
} else {
me.element.setColor(dfcolor);
}
}
me.text_vor.setColor(me.getStyle('text_color', [1,1,1]));
if(me.vor_sym == nil)
me.vor_sym = me.element.getElementById("airbus-vor-sym");
me.vor_sym.setTranslation(-24,-24);
if(me.text_vor == nil){
var transl = me.getStyle('translation', [25,10]);
var text_color = me.getStyle('text_color', [1,1,1]);
me.text_vor = me.element.createChild("text")
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.id)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setColor(text_color)
.setTranslation(transl);
}
var frq = me.model.frequency;
if(frq != nil){
var dfcolor = me.getStyle('color', [0.9,0,0.47]);
var tuned_color = me.getStyle('tuned_color', [0,0.62,0.84]);
frq = frq / 100;
var vor1_frq = getprop(me.options.vor1_frq);
var vor2_frq = getprop(me.options.vor2_frq);
if(vor1_frq == frq or vor2_frq == frq){
me.element.setColor(tuned_color);
} else {
me.element.setColor(dfcolor);
}
}
me.text_vor.setColor(me.getStyle('text_color', [1,1,1]));
}

View file

@ -6,132 +6,132 @@ var __self__ = caller(0)[0];
canvas.SymbolLayer.Controller.add(name, __self__);
canvas.SymbolLayer.add(name, {
parents: [canvas.MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: { # default configuration options
fix_symbol: func(group){
group.createChild('path')
.moveTo(-10,0)
.lineTo(0,-17)
.lineTo(10,0)
.lineTo(0,17)
.close()
.setStrokeLineWidth(3)
.setColor(1,1,1)
.setScale(1);
},
vor_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_vor.svg',
airport_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_airport.svg',
ndb_symbol: func(group){
group.createChild('path')
.moveTo(-15,15)
.lineTo(0,-15)
.lineTo(15,15)
.close()
.setStrokeLineWidth(3)
#.setColor(0.69,0,0.39)
#.setTranslation(-24, -24),
.setScale(1,1);
}
},
df_style: {
active_wp_color: [0.4,0.7,0.4],
current_wp_color: [1,1,1],
translation: {
'airport': [-24,-24],
'vor': [-24,-24]
}
},
toggle_cstr: 0
parents: [canvas.MultiSymbolLayer],
type: name, # Symbol type
df_controller: __self__, # controller to use by default -- this one
df_options: { # default configuration options
fix_symbol: func(group){
group.createChild('path')
.moveTo(-10,0)
.lineTo(0,-17)
.lineTo(10,0)
.lineTo(0,17)
.close()
.setStrokeLineWidth(3)
.setColor(1,1,1)
.setScale(1);
},
vor_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_vor.svg',
airport_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_airport.svg',
ndb_symbol: func(group){
group.createChild('path')
.moveTo(-15,15)
.lineTo(0,-15)
.lineTo(15,15)
.close()
.setStrokeLineWidth(3)
#.setColor(0.69,0,0.39)
#.setTranslation(-24, -24),
.setScale(1,1);
}
},
df_style: {
active_wp_color: [0.4,0.7,0.4],
current_wp_color: [1,1,1],
translation: {
'airport': [-24,-24],
'vor': [-24,-24]
}
},
toggle_cstr: 0
});
var new = func(layer) {
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.equals(b);
var driver = opt_member(m.layer.options, 'route_driver');
if(driver == nil){
driver = RouteDriver.new();
}
var driver_listeners = driver.getListeners();
foreach(var listener; driver_listeners){
append(m.listeners, setlistener(listener, func m.layer.update()));
}
m.route_driver = driver;
return m;
var m = {
parents: [__self__],
layer: layer,
map: layer.map,
listeners: [],
};
layer.searcher._equals = func(a,b) a.equals(b);
var driver = opt_member(m.layer.options, 'route_driver');
if(driver == nil){
driver = RouteDriver.new();
}
var driver_listeners = driver.getListeners();
foreach(var listener; driver_listeners){
append(m.listeners, setlistener(listener, func m.layer.update()));
}
m.route_driver = driver;
return m;
};
var del = func() {
foreach (var l; me.listeners)
removelistener(l);
foreach (var l; me.listeners)
removelistener(l);
};
var WPTModel = {
new: func(fp, idx) {
var m = { parents:[WPTModel] };
var wp = fp.getWP(idx);
new: func(fp, idx) {
var m = { parents:[WPTModel] };
var wp = fp.getWP(idx);
m.id = wp.id;
m.name = wp.wp_name;
m.alt = wp.alt_cstr;
m.spd = wp.speed_cstr;
m.type = wp.wp_type;
m.id = wp.id;
m.name = wp.wp_name;
m.alt = wp.alt_cstr;
m.spd = wp.speed_cstr;
m.type = wp.wp_type;
(m.lat,m.lon) = (wp.wp_lat,wp.wp_lon);
var is_rwy = (m.type == 'runway');
var id_len = size(m.id);
if(!is_rwy and id_len < 5){
if(id_len == 4 and airportinfo(m.id) != nil)
m.navtype = 'airport';
else {
var navaid = nil;
foreach(var t; ['vor', 'ndb']){
navaid = navinfo(m.lat, m.lon, t, m.id);
if(navaid != nil and size(navaid)){
m.navtype = t;
break;
}
}
if(navaid == nil or !size(navaid)) m.navtype = 'fix';
}
} else {
m.navtype = (is_rwy ? 'rwy' : 'fix');
}
m.wp = wp;
idx = wp.index;
m.idx = idx;
m.is_departure = (idx == 0 and is_rwy);
m.is_destination = (idx > 0 and is_rwy);
return m;
},
equals: func(other) {
# this is set on symbol init, so use this for equality...
me.name == other.name and me.alt == other.alt and
me.type == other.type and me.idx == other.idx and
me.navtype == other.navtype
},
(m.lat,m.lon) = (wp.wp_lat,wp.wp_lon);
var is_rwy = (m.type == 'runway');
var id_len = size(m.id);
if(!is_rwy and id_len < 5){
if(id_len == 4 and airportinfo(m.id) != nil)
m.navtype = 'airport';
else {
var navaid = nil;
foreach(var t; ['vor', 'ndb']){
navaid = navinfo(m.lat, m.lon, t, m.id);
if(navaid != nil and size(navaid)){
m.navtype = t;
break;
}
}
if(navaid == nil or !size(navaid)) m.navtype = 'fix';
}
} else {
m.navtype = (is_rwy ? 'rwy' : 'fix');
}
m.wp = wp;
idx = wp.index;
m.idx = idx;
m.is_departure = (idx == 0 and is_rwy);
m.is_destination = (idx > 0 and is_rwy);
return m;
},
equals: func(other) {
# this is set on symbol init, so use this for equality...
me.name == other.name and me.alt == other.alt and
me.type == other.type and me.idx == other.idx and
me.navtype == other.navtype
},
};
var searchCmd = func {
var driver = me.route_driver;
if(!driver.shouldUpdate()) return [];
driver.update();
var result = [];
var planCount = driver.getNumberOfFlightPlans();
for(var idx = 0; idx < planCount; idx += 1){
var fp = driver.getFlightPlan(idx);
if(fp == nil) continue;
var fpSize = fp.getPlanSize(idx);
for (var i = 0; i < fpSize; i+=1){
if(!driver.shouldUpdate()) return[];
append(result, WPTModel.new(fp, i));
}
}
return result;
var driver = me.route_driver;
if(!driver.shouldUpdate()) return [];
driver.update();
var result = [];
var planCount = driver.getNumberOfFlightPlans();
for(var idx = 0; idx < planCount; idx += 1){
var fp = driver.getFlightPlan(idx);
if(fp == nil) continue;
var fpSize = fp.getPlanSize(idx);
for (var i = 0; i < fpSize; i+=1){
if(!driver.shouldUpdate()) return[];
append(result, WPTModel.new(fp, i));
}
}
return result;
}

View file

@ -8,130 +8,130 @@ canvas.DotSym.makeinstance( name, __self__ );
var element_type = "group";
var init = func {
var name = me.model.name;
var alt = me.model.alt;
var spd = me.model.spd;
var wp_group = me.element;
me.alt_path = nil;
var name = me.model.name;
var alt = me.model.alt;
var spd = me.model.spd;
var wp_group = me.element;
me.alt_path = nil;
var colors = [
'wp_color',
'current_wp_color',
'constraint_color',
'active_constraint_color',
'missed_constraint_color'
];
foreach(col; colors){
me[col] = me.getStyle(col, me.getOption(col));
}
var colors = [
'wp_color',
'current_wp_color',
'constraint_color',
'active_constraint_color',
'missed_constraint_color'
];
foreach(col; colors){
me[col] = me.getStyle(col, me.getOption(col));
}
var idLen = size(me.model.id);
var draw_sym = nil;
var navtype = me.model.navtype;
if (navtype == nil) navtype = 'fix';
if(navtype == 'airport')
draw_sym = me.options.airport_symbol;
elsif(navtype == 'vor')
draw_sym = me.options.vor_symbol;
elsif(navtype == 'ndb')
draw_sym = me.options.ndb_symbol;
else
draw_sym = me.options.fix_symbol;
me.wp_sym = me.element.createChild('group', 'wp-'~ me.model.idx);
if(typeof(draw_sym) == 'func')
draw_sym(me.wp_sym);
elsif(typeof(draw_sym) == 'scalar')
canvas.parsesvg(me.wp_sym, draw_sym);
var translation = me.getStyle('translation', {});
if(contains(translation, navtype)){
me.wp_sym.setTranslation(translation[navtype]);
}
me.text_wps = wp_group.createChild("text", "wp-text-" ~ me.model.idx)
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.name)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15)
.setColor(1,1,1);
me.text_alt = nil;
if(alt > 0 or spd > 0){
var cstr_txt = "\n";
if(alt > 0){
if(alt > 10000)
cstr_txt ~= sprintf('FL%3.0f', int(alt / 100));
else
cstr_txt ~= sprintf('%4.0f', int(alt));
}
if(spd > 0){
if(alt > 0) cstr_txt ~= "\n";
if(spd <= 1)
cstr_txt ~= sprintf('%1.2fM', spd);
else
cstr_txt ~= sprintf('%3.0fKT', int(spd));
}
me.text_alt = wp_group.createChild("text", "wp-alt-text-" ~ me.model.idx)
.setDrawMode( canvas.Text.TEXT )
.setText(cstr_txt)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15);
}
var idLen = size(me.model.id);
var draw_sym = nil;
var navtype = me.model.navtype;
if (navtype == nil) navtype = 'fix';
if(navtype == 'airport')
draw_sym = me.options.airport_symbol;
elsif(navtype == 'vor')
draw_sym = me.options.vor_symbol;
elsif(navtype == 'ndb')
draw_sym = me.options.ndb_symbol;
else
draw_sym = me.options.fix_symbol;
me.wp_sym = me.element.createChild('group', 'wp-'~ me.model.idx);
if(typeof(draw_sym) == 'func')
draw_sym(me.wp_sym);
elsif(typeof(draw_sym) == 'scalar')
canvas.parsesvg(me.wp_sym, draw_sym);
var translation = me.getStyle('translation', {});
if(contains(translation, navtype)){
me.wp_sym.setTranslation(translation[navtype]);
}
me.text_wps = wp_group.createChild("text", "wp-text-" ~ me.model.idx)
.setDrawMode( canvas.Text.TEXT )
.setText(me.model.name)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15)
.setColor(1,1,1);
me.text_alt = nil;
if(alt > 0 or spd > 0){
var cstr_txt = "\n";
if(alt > 0){
if(alt > 10000)
cstr_txt ~= sprintf('FL%3d', int(alt / 100));
else
cstr_txt ~= sprintf('%4d', int(alt));
}
if(spd > 0){
if(alt > 0) cstr_txt ~= "\n";
if(spd <= 1)
cstr_txt ~= sprintf('%4.2fM', spd);
else
cstr_txt ~= sprintf('%3dKT', int(spd));
}
me.text_alt = wp_group.createChild("text", "wp-alt-text-" ~ me.model.idx)
.setDrawMode( canvas.Text.TEXT )
.setText(cstr_txt)
.setFont("LiberationFonts/LiberationSans-Regular.ttf")
.setFontSize(28)
.setTranslation(25,15);
}
}
var draw = func{
var wp_group = me.element;
var alt = me.model.alt;
var i = me.model.idx;
var vnav_actv = getprop(me.options.ver_ctrl) == me.options.managed_val;
var curwp = getprop(me.options.current_wp);
if(alt > 0){
var wp_d = me.model.wp.distance_along_route;
var lvl_off_at = getprop(me.options.level_off_alt);
if(lvl_off_at == nil) lvl_off_at = 0;
if(me.alt_path == nil){
me.alt_path = wp_group.createChild("path").
setStrokeLineWidth(4).
moveTo(-22,0).
arcSmallCW(22,22,0,44,0).
arcSmallCW(22,22,0,-44,0);
}
if(vnav_actv){
if(lvl_off_at and (lvl_off_at - wp_d) > 0.5 and curwp == i)
me.alt_path.setColor(me.missed_constraint_color);
else
me.alt_path.setColor(me.active_constraint_color);
}
else
me.alt_path.setColor(me.constraint_color);
if(me.layer.toggle_cstr)
me.alt_path.show();
else
me.alt_path.hide();
} else {
if(me.alt_path != nil) me.alt_path.hide();
}
wp_group.set("z-index",4);
#var sym = me.element.getElementById('wp-' ~ me.model.idx);
if(alt > 0 and me.text_alt != nil){
if(vnav_actv)
me.text_alt.setColor(me.active_constraint_color);
else
me.text_alt.setColor(me.constraint_color);
}
if(i == curwp) {
me.wp_sym.setColor(me.current_wp_color);
me.text_wps.setColor(me.current_wp_color);
} else {
me.wp_sym.setColor(me.wp_color);
me.text_wps.setColor(me.wp_color);
}
if(me.model.is_departure or me.model.is_destination){
var prop = (me.model.is_departure ? 'departure' : 'destination');
var rwy = getprop("/autopilot/route-manager/"~prop~"/runway");
if(rwy != nil and size(rwy) > 0){
me.wp_sym.hide();
} else {
me.wp_sym.show();
}
}
var wp_group = me.element;
var alt = me.model.alt;
var i = me.model.idx;
var vnav_actv = getprop(me.options.ver_ctrl) == me.options.managed_val;
var curwp = getprop(me.options.current_wp);
if(alt > 0){
var wp_d = me.model.wp.distance_along_route;
var lvl_off_at = getprop(me.options.level_off_alt);
if(lvl_off_at == nil) lvl_off_at = 0;
if(me.alt_path == nil){
me.alt_path = wp_group.createChild("path").
setStrokeLineWidth(4).
moveTo(-22,0).
arcSmallCW(22,22,0,44,0).
arcSmallCW(22,22,0,-44,0);
}
if(vnav_actv){
if(lvl_off_at and (lvl_off_at - wp_d) > 0.5 and curwp == i)
me.alt_path.setColor(me.missed_constraint_color);
else
me.alt_path.setColor(me.active_constraint_color);
}
else
me.alt_path.setColor(me.constraint_color);
if(me.layer.toggle_cstr)
me.alt_path.show();
else
me.alt_path.hide();
} else {
if(me.alt_path != nil) me.alt_path.hide();
}
wp_group.set("z-index",4);
#var sym = me.element.getElementById('wp-' ~ me.model.idx);
if(alt > 0 and me.text_alt != nil){
if(vnav_actv)
me.text_alt.setColor(me.active_constraint_color);
else
me.text_alt.setColor(me.constraint_color);
}
if(i == curwp) {
me.wp_sym.setColor(me.current_wp_color);
me.text_wps.setColor(me.current_wp_color);
} else {
me.wp_sym.setColor(me.wp_color);
me.text_wps.setColor(me.wp_color);
}
if(me.model.is_departure or me.model.is_destination){
var prop = (me.model.is_departure ? 'departure' : 'destination');
var rwy = getprop("/autopilot/route-manager/"~prop~"/runway");
if(rwy != nil and size(rwy) > 0){
me.wp_sym.hide();
} else {
me.wp_sym.show();
}
}
}

View file

@ -46,12 +46,12 @@ canvas.NDStyles["Airbus"] = {
# that the lateral flight mode is managed.
# You can easily override these options before creating the ND, example:
# canvas.NDStyles["Airbus"].options.defaults.fplan_active = "my/autpilot/f-plan/active"
fplan_active: "autopilot/route-manager/active",
fplan_active: "/FMGC/flightplan[2]/active",
lat_ctrl: "/it-autoflight/output/lat",
managed_val: 1,
ver_ctrl: "/it-autoflight/output/vert",
spd_ctrl: "/flight-management/control/spd-ctrl",
current_wp: "/autopilot/route-manager/current-wp",
current_wp: "/FMGC/flightplan[2]/current-wp",
ap1: "/it-autoflight/output/ap1",
ap2: "/it-autoflight/output/ap2",
nav1_frq: "/instrumentation/nav[0]/frequencies/selected-mhz",
@ -740,11 +740,11 @@ canvas.NDStyles["Airbus"] = {
id: "wpActiveId",
impl: {
init: func(nd,symbol),
predicate: func(nd) getprop("/autopilot/route-manager/wp/id") != nil and
getprop("autopilot/route-manager/active") and
predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and
getprop("FMGC/flightplan[2]/active") and
nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
is_true: func(nd) {
nd.symbols.wpActiveId.setText(getprop("/autopilot/route-manager/wp/id"));
nd.symbols.wpActiveId.setText(getprop("/FMGC/flightplan[2]/current-leg"));
nd.symbols.wpActiveId.show();
},
is_false: func(nd) nd.symbols.wpActiveId.hide(),
@ -754,12 +754,16 @@ canvas.NDStyles["Airbus"] = {
id: "wpActiveCrs",
impl: {
init: func(nd,symbol),
predicate: func(nd) getprop("/autopilot/route-manager/wp/id") != nil and
getprop("autopilot/route-manager/active") and
predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg") != nil and
getprop("FMGC/flightplan[2]/active") and
nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
is_true: func(nd) {
#var cur_wp = getprop("autopilot/route-manager/current-wp");
var deg = int(getprop("/autopilot/route-manager/wp/bearing-deg"));
if (nd.get_switch("toggle_true_north")) {
var deg = math.round(getprop("/FMGC/flightplan[2]/current-leg-course"));
} else {
var deg = math.round(getprop("/FMGC/flightplan[2]/current-leg-course-mag"));
}
nd.symbols.wpActiveCrs.setText((deg or "")~"°");
nd.symbols.wpActiveCrs.show();
},
@ -770,11 +774,11 @@ canvas.NDStyles["Airbus"] = {
id: "wpActiveDist",
impl: {
init: func(nd,symbol),
predicate: func(nd) getprop("/autopilot/route-manager/wp/dist") != nil and
getprop("autopilot/route-manager/active") and
predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and
getprop("FMGC/flightplan[2]/active") and
nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
is_true: func(nd) {
var dst = getprop("/autopilot/route-manager/wp/dist");
var dst = getprop("/FMGC/flightplan[2]/current-leg-dist");
nd.symbols.wpActiveDist.setText(sprintf("%3.01f",dst));
nd.symbols.wpActiveDist.show();
},
@ -785,10 +789,10 @@ canvas.NDStyles["Airbus"] = {
id: "wpActiveDistLbl",
impl: {
init: func(nd,symbol),
predicate: func(nd) getprop("/autopilot/route-manager/wp/dist") != nil and getprop("autopilot/route-manager/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
predicate: func(nd) getprop("/FMGC/flightplan[2]/current-leg-dist") != nil and getprop("FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
is_true: func(nd) {
nd.symbols.wpActiveDistLbl.show();
if(getprop("/autopilot/route-manager/wp/dist") > 1000)
if(getprop("/FMGC/flightplan[2]/current-leg-dist") > 1000)
nd.symbols.wpActiveDistLbl.setText(" NM");
},
is_false: func(nd) nd.symbols.wpActiveDistLbl.hide(),
@ -798,7 +802,7 @@ canvas.NDStyles["Airbus"] = {
id: "eta",
impl: {
init: func(nd,symbol),
predicate: func(nd) getprop("autopilot/route-manager/wp/eta") != nil and getprop("autopilot/route-manager/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
predicate: func(nd) getprop("autopilot/route-manager/wp/eta") != nil and getprop("FMGC/flightplan[2]/active") and nd.in_mode("toggle_display_mode", ["MAP", "PLAN"]),
is_true: func(nd) {
var etaSec = getprop("/sim/time/utc/day-seconds")+
getprop("autopilot/route-manager/wp/eta-seconds");
@ -1679,7 +1683,7 @@ canvas.NDStyles["Airbus"] = {
init: func(nd,symbol),
predicate: func(nd) (nd.get_switch("toggle_display_mode") == "MAP" and !nd.get_switch("toggle_centered")),
is_true: func(nd){
var active = getprop("autopilot/route-manager/active");
var active = getprop("FMGC/flightplan[2]/active");
var lat_ctrl = getprop(nd.options.defaults.lat_ctrl);
var managed_v = nd.options.defaults.managed_val;
var is_managed = (lat_ctrl == managed_v);
@ -1708,7 +1712,7 @@ canvas.NDStyles["Airbus"] = {
init: func(nd,symbol),
predicate: func(nd) (nd.get_switch("toggle_display_mode") == "MAP" and !nd.get_switch("toggle_centered")),
is_true: func(nd){
var active = getprop("autopilot/route-manager/active");
var active = getprop("FMGC/flightplan[2]/active");
var lat_ctrl = getprop(nd.options.defaults.lat_ctrl);
var managed_v = nd.options.defaults.managed_val;
var is_managed = (lat_ctrl == managed_v);
@ -1737,7 +1741,7 @@ canvas.NDStyles["Airbus"] = {
init: func(nd,symbol),
predicate: func(nd) (nd.get_switch("toggle_display_mode") == "MAP" and nd.get_switch("toggle_centered")),
is_true: func(nd){
var active = getprop("autopilot/route-manager/active");
var active = getprop("FMGC/flightplan[2]/active");
var lat_ctrl = getprop(nd.options.defaults.lat_ctrl);
var managed_v = nd.options.defaults.managed_val;
var is_managed = (lat_ctrl == managed_v);
@ -1766,7 +1770,7 @@ canvas.NDStyles["Airbus"] = {
init: func(nd,symbol),
predicate: func(nd) (nd.get_switch("toggle_display_mode") == "MAP" and nd.get_switch("toggle_centered")),
is_true: func(nd){
var active = getprop("autopilot/route-manager/active");
var active = getprop("FMGC/flightplan[2]/active");
var lat_ctrl = getprop(nd.options.defaults.lat_ctrl);
var managed_v = nd.options.defaults.managed_val;
var is_managed = (lat_ctrl == managed_v);
@ -1795,7 +1799,7 @@ canvas.NDStyles["Airbus"] = {
init: func(nd,symbol),
predicate: func(nd) (nd.in_mode("toggle_display_mode", ["MAP", "PLAN"])),
is_true: func(nd){
var active = getprop("autopilot/route-manager/active");
var active = getprop("FMGC/flightplan[2]/active");
var lat_ctrl = getprop(nd.options.defaults.lat_ctrl);
var managed_v = nd.options.defaults.managed_val;
var is_managed = (lat_ctrl == managed_v);

View file

@ -48,10 +48,10 @@ var Radio = {
};
var FPLN = {
active: props.globals.getNode("/autopilot/route-manager/active", 1),
active: props.globals.getNode("/FMGC/flightplan[2]/active", 1),
activeTemp: 0,
currentCourse: 0,
currentWP: props.globals.getNode("/autopilot/route-manager/current-wp", 1),
currentWP: props.globals.getNode("/FMGC/flightplan[2]/current-wp", 1),
currentWPTemp: 0,
deltaAngle: 0,
deltaAngleRad: 0,
@ -59,12 +59,12 @@ var FPLN = {
maxBank: 0,
maxBankLimit: 0,
nextCourse: 0,
num: props.globals.getNode("/autopilot/route-manager/route/num", 1),
num: props.globals.getNode("/FMGC/flightplan[2]/num", 1),
numTemp: 0,
R: 0,
radius: 0,
turnDist: 0,
wp0Dist: props.globals.getNode("/autopilot/route-manager/wp/dist", 1),
wp0Dist: props.globals.getNode("/FMGC/flightplan[2]/current-leg-dist", 1),
wpFlyFrom: 0,
wpFlyTo: 0,
};
@ -405,12 +405,12 @@ var ITAF = {
if (FPLN.wpFlyFrom < 0) {
FPLN.wpFlyFrom = 0;
}
FPLN.currentCourse = getprop("/autopilot/route-manager/route/wp[" ~ FPLN.wpFlyFrom ~ "]/leg-bearing-true-deg"); # Best left at getprop
FPLN.currentCourse = getprop("/FMGC/flightplan[2]/wp[" ~ FPLN.wpFlyFrom ~ "]/course"); # Best left at getprop
FPLN.wpFlyTo = FPLN.currentWPTemp + 1;
if (FPLN.wpFlyTo < 0) {
FPLN.wpFlyTo = 0;
}
FPLN.nextCourse = getprop("/autopilot/route-manager/route/wp[" ~ FPLN.wpFlyTo ~ "]/leg-bearing-true-deg"); # Best left at getprop
FPLN.nextCourse = getprop("/FMGC/flightplan[2]/wp[" ~ FPLN.wpFlyTo ~ "]/course"); # Best left at getprop
FPLN.maxBankLimit = Internal.bankLimit.getValue();
FPLN.deltaAngle = math.abs(geo.normdeg180(FPLN.currentCourse - FPLN.nextCourse));
@ -432,7 +432,11 @@ var ITAF = {
Internal.lnavAdvanceNm.setValue(FPLN.turnDist);
if (FPLN.wp0Dist.getValue() <= FPLN.turnDist) {
FPLN.currentWP.setValue(FPLN.currentWPTemp + 1);
if (currentWP[2] < 1) {
currentWP[2] = 1;
} else if (num_out[2].getValue() > 2) { # The Airbus doesn't display anything past the previous waypoint after advancing
flightplan.advanceDelete(2);
}
}
}
}

View file

@ -148,24 +148,6 @@ var trimReset = func {
}
}
###############
# MCDU Inputs #
###############
var updateARPT = func {
dep = getprop("/FMGC/internal/dep-arpt");
arr = getprop("/FMGC/internal/arr-arpt");
setprop("/autopilot/route-manager/departure/airport", dep);
setprop("/autopilot/route-manager/destination/airport", arr);
if (getprop("/autopilot/route-manager/active") != 1) {
fgcommand("activate-flightplan", props.Node.new({"activate": 1}));
}
}
setlistener("/FMGC/internal/cruise-ft", func {
setprop("/autopilot/route-manager/cruise/altitude-ft", getprop("/FMGC/internal/cruise-ft"));
});
############################
# Flight Phase and Various #
############################
@ -248,7 +230,7 @@ var masterFMGC = maketimer(0.2, func {
setprop("/FMGC/status/phase", "5");
}
if (getprop("/autopilot/route-manager/route/num") > 0 and getprop("/autopilot/route-manager/active") == 1 and getprop("/autopilot/route-manager/distance-remaining-nm") <= 15) {
if (getprop("/FMGC/flightplan[2]/num") > 0 and getprop("/FMGC/flightplan[2]/active") == 1 and getprop("/FMGC/flightplan[2]/arrival-leg-dist") <= 15) {
setprop("/FMGC/internal/decel", 1);
} else if (getprop("/FMGC/internal/decel") == 1 and (phase == 0 or phase == 6)) {
setprop("/FMGC/internal/decel", 0);
@ -302,6 +284,7 @@ var reset_FMGC = func {
alt = getprop("/it-autoflight/input/alt");
ITAF.init();
FMGCinit();
flightplan.reset();
mcdu.MCDU_reset(0);
mcdu.MCDU_reset(1);
setprop("/it-autoflight/input/fd1", fd1);

514
Nasal/MCDU/F-PLN.nas Normal file
View file

@ -0,0 +1,514 @@
# Airbus A3XX FMGC MCDU Bridge
# Copyright (c) 2019 Joshua Davidson (it0uchpods) and Nikolai V. Chr. (Necolatis)
# Lowercase "g" is a degree symbol in the MCDU font.
var TMPY = 5;
var MAIN = 6;
var debug = 0; # Set to 1 to check inner functionality
var insertReturn = nil;
var active_out = [nil, nil, props.globals.getNode("/FMGC/flightplan[2]/active")];
var num_out = [props.globals.getNode("/FMGC/flightplan[0]/num"), props.globals.getNode("/FMGC/flightplan[1]/num"), props.globals.getNode("/FMGC/flightplan[2]/num")];
var TMPYActive = [props.globals.getNode("/FMGC/internal/tmpy-active[0]"), props.globals.getNode("/FMGC/internal/tmpy-active[1]")];
var clearFPLNComputer = func {
FPLNLines[0].clear();
FPLNLines[1].clear();
}
var StaticText = {
new: func(computer, type) {
var in = {parents:[StaticText]};
in.type = type;
in.computer = computer;
return in;
},
getText: func() {
if (me.type == "discontinuity") {
return "---F-PLN DISCONTINUITY--";
} else if (me.type == "fplnEnd") {
return "------END OF F-PLN------";
} else if (me.type == "altnFplnEnd") {
return "----END OF ALTN F-PLN---";
} else if (me.type == "noAltnFpln") {
return "------NO ALTN F-PLN-----";
} else if (me.type == "empty") {
return "";
}
},
getColor: func() {
return canvas_mcdu.WHITE;
},
getSubText: func() {
return "";
},
type: nil,
pushButtonLeft: func() {
notAllowed(me.computer.mcdu);
},
pushButtonRight: func() {
notAllowed(me.computer.mcdu);
},
};
var FPLNText = {
new: func(computer, wp, dest, fp, wpIndex) {
var in = {parents:[FPLNText]};
in.wp = wp;
in.dest = dest;
in.fp = fp;
in.index = wpIndex;
in.computer = computer;
return in;
},
getText: func() {
return me.wp.wp_name;
},
getColor: func(i) {
if (TMPYActive[i].getBoolValue()) {
if (me.dest) {
return canvas_mcdu.WHITE;
} else {
return canvas_mcdu.YELLOW;
}
} else {
if (me.dest) {
return canvas_mcdu.WHITE;
} else {
return canvas_mcdu.GREEN;
}
}
},
getSubText: func(i) {
if (me.index == 0) {
return "";
} else if (TMPYActive[i].getBoolValue()) {
if (fmgc.arrivalAirportI[i] == me.index) {
return "DEST";
} else {
return "C" ~ sprintf("%03d", fmgc.wpCoursePrev[me.fp][me.index].getValue()) ~ "g";
}
} else {
if (fmgc.arrivalAirportI[2] == me.index) {
return "DEST";
} else {
return "C" ~ sprintf("%03d", fmgc.wpCoursePrev[me.fp][me.index].getValue()) ~ "g";
}
}
},
wp: nil,
pushButtonLeft: func() {
if (me.computer.lines == MAIN) {
fmgc.flightplan.initTempFP(me.computer.mcdu, 2);
}
var scratchpad = getprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad");
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", "");
}
} else {
if (size(scratchpad) == 5) {
var insertReturn = fmgc.flightplan.insertFix(scratchpad, me.index, me.computer.mcdu);
if (insertReturn == 2) {
notAllowed(me.computer.mcdu);
} else if (insertReturn == 1) {
notInDataBase(me.computer.mcdu);
} else {
setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", "");
}
} else if (size(scratchpad) == 4) {
var insertReturn = fmgc.flightplan.insertArpt(scratchpad, me.index, me.computer.mcdu);
if (insertReturn == 2) {
notAllowed(me.computer.mcdu);
} else if (insertReturn == 1) {
notInDataBase(me.computer.mcdu);
} else {
setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", "");
}
} else if (size(scratchpad) == 3) {
var insertReturn = fmgc.flightplan.insertNavaid(scratchpad, me.index, me.computer.mcdu);
if (insertReturn == 2) {
notAllowed(me.computer.mcdu);
} else if (insertReturn == 1) {
notInDataBase(me.computer.mcdu);
} else {
setprop("/MCDU[" ~ me.computer.mcdu ~ "]/scratchpad", "");
}
} else {
formatError(me.computer.mcdu);
}
}
},
pushButtonRight: func() {
notAllowed(me.computer.mcdu);
},
};
var FPLNLineComputer = {
new: func(mcdu) {
var in = {parents:[FPLNLineComputer]};
in.mcdu = mcdu;
in.planEnd = StaticText.new(in, "fplnEnd");
in.planNoAlt = StaticText.new(in, "noAltnFpln");
if (debug == 1) printf("%d: Line computer created.", in.mcdu);
return in;
},
index: 0,
planList: [],
destination: nil,
destIndex: nil,
planEnd: nil,
planNoAlt: nil,
lines: nil,
output: [],
mcdu: nil,
fplnID: nil,
enableScroll: 0,
clear: func() {
me.planList = [];
me.destIndex = -1;
me.destination = nil;
me.index = 0;
me.output = [];
me.enableScroll = 0;
if (me.lines == nil) {
me.lines = MAIN;
}
me.updateScroll();
},
replacePlan: func(fplnID, lines, firstLineIndex) {
# Here you set another plan, do this when changing plan on display or when destination changes
if (debug == 1) printf("%d: replacePlan called for %d lines and firstLine %d", me.mcdu, lines, firstLineIndex);
var fpln = nil;
me.planList = [];
if (!fmgc.active_out[2].getBoolValue()) {
me.destIndex = -1;
me.destination = nil;
} else {
fpln = fmgc.fp[fplnID]; # Get the Nasal Flightplan
me.destIndex = fmgc.arrivalAirportI[fplnID];
me.destination = FPLNText.new(me, fpln.getWP(me.destIndex), 1, fplnID, me.destIndex);
for (var j = 0; j < fpln.getPlanSize(); j += 1) {
me.dest = 0;
if (j == me.destIndex) {
me.dest = 1;
}
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);
}
me.index = firstLineIndex;
me.lines = lines;
me.initScroll();
},
initScroll: func() {
me.maxItems = size(me.planList) + 2; # + 2 is for end of plan line and altn end of plan.
me.enableScroll = me.lines < me.maxItems;
me.checkIndex();
if (debug == 1) printf("%d: scroll is %d. Size of plan is %d", me.mcdu, me.enableScroll, size(me.planList));
me.updateScroll();
},
checkIndex: func() {
if (!me.enableScroll) {
me.index = 0;
if (debug == 1) printf("%d: index forced to 0",me.mcdu);
} elsif (me.index > size(me.planList) + 2 - me.lines) {
me.index = size(me.planList) + 2 - me.lines;
if (debug == 1) printf("%d: index forced to %d",me.mcdu,me.index);
}
},
scrollDown: func() { # Scroll Up in Thales Manual
if (debug == 1) printf("%d: scroll down", me.mcdu);
me.extra = 1;
if (!me.enableScroll) {
me.index = 0;
} else {
me.index += 1;
if (me.index > size(me.planList) + 2 - me.lines) {
me.index = 0;
}
}
me.updateScroll();
},
scrollUp: func() { # Scroll Down in Thales Manual
if (debug == 1) printf("%d: scroll up", me.mcdu);
me.extra = 1;
if (!me.enableScroll) {
me.index = 0;
} else {
me.index -= 1;
if (me.index < 0) {
me.index = size(me.planList) + 2 - me.lines;
}
}
me.updateScroll();
},
updateScroll: func() {
me.output = [];
if (me.index <= size(me.planList) + 1) {
var i = 0;
me.realIndex = me.index - 1;
if (debug == 1) printf("%d: updating display from index %d", me.mcdu, me.realIndex);
for (i = me.index; i < math.min(size(me.planList), me.index + 5); i += 1) {
append(me.output, me.planList[i]);
me.realIndex = i;
}
if (debug == 1) printf("%d: populated until wp index %d", me.mcdu,me.realIndex);
if (me.realIndex < me.destIndex and me.lines == MAIN) {
# Destination has not been shown yet, now its time (if we show 6 lines)
append(me.output, me.destination);
if (debug == 1) printf("%d: added dest at bottom for total of %d lines", me.mcdu, size(me.output));
return;
} else if (size(me.output) < me.lines) {
for (i = me.realIndex + 1; size(me.output) < me.lines and i < size(me.planList); i += 1) {
append(me.output, me.planList[i]);
me.realIndex = i;
}
if (debug == 1) printf("%d: populated after until wp index %d", me.mcdu,me.realIndex);
if (size(me.output) < me.lines) {
if (me.realIndex == size(me.planList)-1) {
# Show the end of plan
append(me.output, me.planEnd);
me.realIndex += 1;
if (debug == 1) printf("%d: added end, wp index=%d", me.mcdu, me.realIndex);
}
if (size(me.output) < me.lines and (me.realIndex == size(me.planList))) {
append(me.output, me.planNoAlt);
me.realIndex += 1;
if (debug == 1) printf("%d: added no-alt, wp index=%d", me.mcdu,me.realIndex);
if (me.enableScroll and size(me.output) < me.lines) {
# We start wrapping
for (var j = 0; size(me.output) < me.lines; j += 1) {
append(me.output, me.planList[j]);
}
}
}
}
}
}
while (size(me.output) < me.lines) {
append(me.output, StaticText.new(me, "empty"));
}
if (debug == 1) printf("%d: %d lines", me.mcdu, size(me.output));
},
};
var FPLNLines = [FPLNLineComputer.new(0), FPLNLineComputer.new(1)];
clearFPLNComputer(); # Just in case, we have it in the clear state.
var slewFPLN = func(d, i) { # Scrolling function. d is -1 or 1 for direction, and i is instance.
if (d == 1) {
FPLNLines[i].scrollDown(); # Scroll Up in Thales Manual
} else if (d == -1) {
FPLNLines[i].scrollUp(); # Scroll Down in Thales Manual
}
}
# Button and Inputs
var FPLNButton = func(s, key, i) {
var scratchpad = getprop("/MCDU[" ~ i ~ "]/scratchpad");
if (s == "L") {
if (key == 6 and TMPYActive[i].getBoolValue()) {
fmgc.flightplan.eraseTempFP(i, 2);
} else {
if (scratchpad != "") {
if (size(FPLNLines[i].output) >= key) {
FPLNLines[i].output[key - 1].pushButtonLeft();
}
} else {
notAllowed(i); # Remove when has functionality
# FIXME: Add LAT REV Logic
}
}
} else if (s == "R") {
if (key == 6 and TMPYActive[i].getBoolValue()) {
fmgc.flightplan.executeTempFP(i, 2);
} else {
# if (scratchpad != "") {
# if (size(FPLNLines[i].output) >= key) {
# FPLNLines[i].output[key - 1].pushButtonRight();
# }
# } else {
notAllowed(i); # Remove when has functionality
# FIXME: Add VERT REV Logic
# }
}
}
}
var notInDataBase = func(i) {
if (getprop("/MCDU[" ~ i ~ "]/scratchpad-msg") == 1) { # Messages clear after NOT IN DATABASE
setprop("/MCDU[" ~ i ~ "]/last-scratchpad", "NOT IN DATABASE");
} else {
setprop("/MCDU[" ~ i ~ "]/last-scratchpad", getprop("/MCDU[" ~ i ~ "]/scratchpad"));
}
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 1);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "NOT IN DATABASE");
}
# For testing purposes only -- do not touch!
var test = func {
var fp = createFlightplan(getprop("sim/aircraft-dir")~"/plan.gpx");
var desti = int(fp.getPlanSize()*0.5);
FPLNLines[0].replacePlan(fp,6,desti,0);
print("Display:");
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("down");FPLNLines[0].scrollDown();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
print("up");FPLNLines[0].scrollUp();
foreach(line;FPLNLines[0].output) {
printf("line: %s",line.getText());
}
}
#test();

View file

@ -70,10 +70,11 @@ var initInputA = func(key, i) {
}
} else if (key == "R1") {
if (scratchpad == "CLR") {
clearFPLNComputer();
setprop("/FMGC/internal/dep-arpt", "");
setprop("/FMGC/internal/arr-arpt", "");
setprop("/FMGC/internal/tofrom-set", 0);
fmgc.updateARPT();
fmgc.flightplan.reset();
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 0);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "");
} else {
@ -87,7 +88,7 @@ var initInputA = func(key, i) {
setprop("/FMGC/internal/arr-arpt", fromto[1]);
setprop("/FMGC/internal/tofrom-set", 1);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "");
fmgc.updateARPT();
fmgc.flightplan.updateARPT(fromto[0], fromto[1], 2);
} else {
notAllowed(i);
}
@ -116,4 +117,4 @@ var initInputA = func(key, i) {
}
}
}
}
}

View file

@ -96,53 +96,59 @@ var lskbutton = func(btn, i) {
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 0);
}
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("L1",i);
perfTOInput("L1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("L1",i);
radnavInput("L1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DATA") {
dataInput("L1",i);
dataInput("L1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("L1",i);
printInput("L1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L1",i);
printInput2("L1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 1, i);
} else {
notAllowed(i);
}
} else if (btn == "2") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
PerfInput("L2",i);
PerfInput("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("L2",i);
perfTOInput("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("L2",i);
radnavInput("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CLB") {
initInputA("L5",i); # Does the same thing as on the INIT page
initInputA("L5", i); # Does the same thing as on the INIT page
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CRZ") {
initInputA("L5",i);
initInputA("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DES") {
initInputA("L5",i);
initInputA("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DATA") {
dataInput("L2",i);
dataInput("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("L2",i);
printInput("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L2",i);
printInput2("L2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 2, i);
} else {
notAllowed(i);
}
} else if (btn == "3") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("L3",i);
initInputA("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("L3",i);
perfTOInput("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "STATUS") {
statusInput("L3",i);
statusInput("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("L3",i);
radnavInput("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("L3",i);
printInput("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L3",i);
printInput2("L3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 3, i);
} else {
notAllowed(i);
}
@ -150,45 +156,51 @@ var lskbutton = func(btn, i) {
if (getprop("/MCDU[" ~ i ~ "]/page") == "DATA") {
setprop("/MCDU[" ~ i ~ "]/page", "STATUS");
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("L4",i);
perfTOInput("L4", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("L4",i);
radnavInput("L4", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L4",i);
printInput2("L4", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 4, i);
} else {
notAllowed(i);
}
} else if (btn == "5") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("L5",i);
initInputA("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("L5",i);
perfTOInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CLB") {
perfCLBInput("L5",i);
perfCLBInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CRZ") {
perfCRZInput("L5",i);
perfCRZInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DES") {
perfDESInput("L5",i);
perfDESInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("L5",i);
radnavInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("L5",i);
printInput("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L5",i);
printInput2("L5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 5, i);
} else {
notAllowed(i);
}
} else if (btn == "6") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("L6",i);
initInputA("L6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CLB") {
perfCLBInput("L6",i);
perfCLBInput("L6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CRZ") {
perfCRZInput("L6",i);
perfCRZInput("L6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DES") {
perfDESInput("L6",i);
perfDESInput("L6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("L6",i);
printInput2("L6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("L", 6, i);
} else {
notAllowed(i);
}
@ -202,59 +214,59 @@ var lskbutton_b = func(btn, i) {
var rskbutton = func(btn, i) {
if (btn == "1") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("R1",i);
initInputA("R1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "INITB") {
initInputB("R1",i);
initInputB("R1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("R1",i);
radnavInput("R1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("R1",i);
printInput("R1", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("R1",i);
printInput2("R1", i);
} else {
notAllowed(i);
}
} else if (btn == "2") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITB") {
initInputB("R2",i);
initInputB("R2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("R2",i);
radnavInput("R2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("R2",i);
printInput("R2", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("R2",i);
printInput2("R2", i);
} else {
notAllowed(i);
}
} else if (btn == "3") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("R3",i);
initInputA("R3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("R3",i);
perfTOInput("R3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") {
printInput("R3",i);
printInput("R3", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("R3",i);
printInput2("R3", i);
} else {
notAllowed(i);
}
} else if (btn == "4") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("R4",i);
perfTOInput("R4", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("R4",i);
radnavInput("R4", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2") {
printInput2("R4",i);
printInput2("R4", i);
} else {
notAllowed(i);
}
} else if (btn == "5") {
if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("R5",i);
perfTOInput("R5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "RADNAV") {
radnavInput("R5",i);
radnavInput("R5", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "DATA") {
dataInput("R5",i);
dataInput("R5", i);
} else {
notAllowed(i);
}
@ -268,11 +280,11 @@ var rskbutton = func(btn, i) {
notAllowed(i);
}
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "TO") {
perfTOInput("R6",i);
perfTOInput("R6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CLB") {
perfCLBInput("R6",i);
perfCLBInput("R6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "CRZ") {
perfCRZInput("R6",i);
perfCRZInput("R6", i);
} else if ((getprop("/MCDU[" ~ i ~ "]/page") == "DATA") or (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC") or (getprop("/MCDU[" ~ i ~ "]/page") == "PRINTFUNC2")) {
if (getprop("/MCDU[" ~ i ~ "]/scratchpad") != "AOC DISABLED") {
if (getprop("/MCDU[" ~ i ~ "]/scratchpad-msg") == 1) {
@ -284,7 +296,9 @@ var rskbutton = func(btn, i) {
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 1);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "AOC DISABLED");
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "INITA") {
initInputA("R6",i);
initInputA("R6", i);
} else if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
FPLNButton("R", 6, i);
} else {
notAllowed(i);
}
@ -333,9 +347,13 @@ var arrowbutton = func(btn, i) {
setprop("/MCDU[" ~ i ~ "]/page", "PRINTFUNC");
}
} else if (btn == "up") {
# Nothing for now
if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
slewFPLN(1, i);
}
} else if (btn == "down") {
# Nothing for now
if (getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNA" or getprop("/MCDU[" ~ i ~ "]/page") == "F-PLNB") {
slewFPLN(-1, i);
}
}
}
@ -363,7 +381,12 @@ var pagebutton = func(btn, i) {
setprop("/MCDU[" ~ i ~ "]/scratchpad", "SELECT DESIRED SYSTEM");
setprop("/MCDU[" ~ i ~ "]/page", "MCDU");
} else if (btn == "f-pln") {
setprop("/MCDU[" ~ i ~ "]/page", "F-PLNA");
if (active_out[2].getBoolValue()) {
setprop("/MCDU[" ~ i ~ "]/page", "F-PLNA");
} else {
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 1);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "ERROR. INITIALIZE ROUTE"); # Should be ERROR:, but the : character doesn't show in our MCDU font right now...
}
} else if (btn == "fuel-pred") {
setprop("/MCDU[" ~ i ~ "]/page", "FUELPRED");
}
@ -534,6 +557,18 @@ var notAllowed = func(i) {
setprop("/MCDU[" ~ i ~ "]/scratchpad", "NOT ALLOWED");
}
var formatError = func(i) {
if (getprop("/MCDU[" ~ i ~ "]/scratchpad") != "FORMAT ERROR") {
if (getprop("/MCDU[" ~ i ~ "]/scratchpad-msg") == 1) {
setprop("/MCDU[" ~ i ~ "]/last-scratchpad", "");
} else {
setprop("/MCDU[" ~ i ~ "]/last-scratchpad", getprop("/MCDU[" ~ i ~ "]/scratchpad"));
}
}
setprop("/MCDU[" ~ i ~ "]/scratchpad-msg", 1);
setprop("/MCDU[" ~ i ~ "]/scratchpad", "FORMAT ERROR");
}
var screenFlash = func(time, i) {
var page = getprop("/MCDU[" ~ i ~ "]/page");
setprop("/MCDU[" ~ i ~ "]/page", "NONE");

316
Nasal/flightplan.nas Normal file
View file

@ -0,0 +1,316 @@
# A3XX FMGC Flightplan Driver
# Copyright (c) 2019 Joshua Davidson (it0uchpods)
# This thing replaces the Route Manager, it's far from finished though
print("System: You are using an experimental version of the IDG-A32X. Things may go TERRIBLY WRONG!");
print("System: FMGC Dev Version - Copyright (c) 2019 Joshua Davidson (it0uchpods)");
# 0 = TEMP FP Captain MCDU
# 1 = TEMP FP First Officer MCDU
# 2 = ACTIVE FP
var fp = [createFlightplan(), createFlightplan(), createFlightplan()];
var wpDep = nil;
var wpArr = nil;
var pos = nil;
var geoPos = nil;
var geoPosPrev = geo.Coord.new();
var currentLegCourseDist = nil;
var courseDistanceFrom = nil;
var courseDistanceFromPrev = nil;
var sizeWP = nil;
var magTrueError = 0;
var arrivalAirportI = [0, 0, 0];
# Vars for MultiFlightplan
var currentWP = [nil, nil, 0];
var currentLeg = [nil, nil, ""];
# Create/Fetch props.nas for MultiFlightplan
var altFeet = props.globals.getNode("/instrumentation/altimeter/indicated-altitude-ft", 1);
var active_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/active", 0, "BOOL")];
var currentWP_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/current-wp", 0, "INT")];
var currentLeg_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/current-leg", "", "STRING")];
var currentLegCourse_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/current-leg-course", 0, "DOUBLE")];
var currentLegDist_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/current-leg-dist", 0, "DOUBLE")];
var currentLegCourseMag_out = [nil, nil, props.globals.initNode("/FMGC/flightplan[2]/current-leg-course-mag", 0, "DOUBLE")];
var arrivalLegDist_out = [props.globals.initNode("/FMGC/flightplan[0]/arrival-leg-dist", 0, "DOUBLE"), props.globals.initNode("/FMGC/flightplan[1]/arrival-leg-dist", 0, "DOUBLE"), props.globals.initNode("/FMGC/flightplan[2]/arrival-leg-dist", 0, "DOUBLE")];
var num_out = [props.globals.initNode("/FMGC/flightplan[0]/num", 0, "INT"), props.globals.initNode("/FMGC/flightplan[1]/num", 0, "INT"), props.globals.initNode("/FMGC/flightplan[2]/num", 0, "INT")];
var toFromSet = props.globals.initNode("/FMGC/internal/tofrom-set", 0, "BOOL");
var magHDG = props.globals.getNode("/orientation/heading-magnetic-deg", 1);
var trueHDG = props.globals.getNode("/orientation/heading-deg", 1);
var FMGCdep = props.globals.getNode("/FMGC/internal/dep-arpt", 1);
var FMGCarr = props.globals.getNode("/FMGC/internal/arr-arpt", 1);
var TMPYActive = [props.globals.initNode("/FMGC/internal/tmpy-active[0]", 0, "BOOL"), props.globals.initNode("/FMGC/internal/tmpy-active[1]", 0, "BOOL")];
# Create props.nas for flightplan
# Vectors inside vectors, so we can use as many flightplans or waypoints as we want
var wpID = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/id", "", "STRING")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/id", "", "STRING")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/id", "", "STRING")]];
var wpLat = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/lat", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/lat", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/lat", 0, "DOUBLE")]];
var wpLon = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/lon", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/lon", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/lon", 0, "DOUBLE")]];
var wpCourse = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/course", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/course", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/course", 0, "DOUBLE")]];
var wpDistance = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/distance", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/distance", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/distance", 0, "DOUBLE")]];
var wpCoursePrev = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/course-from-prev", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/course-from-prev", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/course-from-prev", 0, "DOUBLE")]];
var wpDistancePrev = [[props.globals.initNode("/FMGC/flightplan[0]/wp[0]/distance-from-prev", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[1]/wp[0]/distance-from-prev", 0, "DOUBLE")], [props.globals.initNode("/FMGC/flightplan[2]/wp[0]/distance-from-prev", 0, "DOUBLE")]];
var flightplan = {
reset: func() {
TMPYActive[0].setBoolValue(0);
TMPYActive[1].setBoolValue(0);
me.reset0();
me.reset1();
me.reset2();
},
reset0: func() {
fp[0].cleanPlan();
fp[0].departure = nil;
fp[0].destination = nil;
},
reset1: func() {
fp[1].cleanPlan();
fp[1].departure = nil;
fp[1].destination = nil;
},
reset2: func() {
fp[2].cleanPlan();
fp[2].departure = nil;
fp[2].destination = nil;
currentWP[2] = 0;
currentLeg[2] = "";
},
initTempFP: func(f, n) { # f is temp, n is active
fp[f] = fp[n].clone();
TMPYActive[f].setBoolValue(1);
me.checkWPOutputs(f);
},
eraseTempFP: func(f, n) { # f is temp, n is active
TMPYActive[f].setBoolValue(0);
if (f == 0) {
me.reset0();
} else if (f == 1) {
me.reset1();
}
me.checkWPOutputs(n);
},
executeTempFP: func(f, n) { # f is temp, n is active
fp[n] = fp[f].clone();
TMPYActive[f].setBoolValue(0);
if (f == 0) {
me.reset0();
} else if (f == 1) {
me.reset1();
}
me.checkWPOutputs(n);
},
advanceDelete: func(n) {
if (num_out[n].getValue() > 2) {
if (TMPYActive[0].getBoolValue() and wpID[0][0] == wpID[n][0]) {
me.deleteWP(0, 0);
}
if (TMPYActive[1].getBoolValue() and wpID[1][0] == wpID[n][0]) {
me.deleteWP(0, 1);
}
me.deleteWP(0, n, 1);
}
},
updateARPT: func(dep, arr, n) {
if (n == 2) { # Which flightplan?
me.reset2();
# Set Departure ARPT
if (dep != nil) {
fp[2].departure = airportinfo(dep);
} else {
fp[2].departure = nil;
}
# Set Arrival ARPT
if (arr != nil) {
fp[2].destination = airportinfo(arr);
} else {
fp[2].destination = nil;
}
currentWP[2] = 0;
}
me.checkWPOutputs(n);
},
# return 1 will cause NOT IN DATABASE, return 2 will cause NOT ALLOWED
insertFix: func(wp, i, n) {
var pos = findFixesByID(wp);
if (i == 0) {
return 2;
} else if (pos != nil and size(pos) > 0) {
fp[n].insertWP(createWPFrom(pos[0]), i);
me.checkWPOutputs(n);
return 0;
} else {
return 1;
}
},
insertArpt: func(wp, i, n) {
var pos = findAirportsByICAO(wp);
if (i == 0) {
return 2;
} else if (pos != nil and size(pos) > 0) {
fp[n].insertWP(createWPFrom(pos[0]), i);
me.checkWPOutputs(n);
return 0;
} else {
return 1;
}
},
insertNavaid: func(nav, i, n) {
var pos = findNavaidsByID(nav);
if (i == 0) {
return 2;
} else if (pos != nil and size(pos) > 0) {
fp[n].insertWP(createWPFrom(pos[0]), i);
me.checkWPOutputs(n);
return 0;
} else {
return 1;
}
},
insertPPOS: func(n) {
fp[n].insertWP(createWP(geo.aircraft_position(), "PPOS"), 0);
me.checkWPOutputs(n);
},
insertTP: func(n) {
fp[n].insertWP(createWP(geo.aircraft_position(), "T/P"), 0);
me.checkWPOutputs(n);
},
deleteWP: func(i, n, t) {
var wp = wpID[n][i].getValue();
if (t == 1) {
fp[n].deleteWP(i);
me.outputProps(); # Make sure everything is updated before we update the MCDUs.
me.updateMCDUDriver(n);
canvas_nd.A3XXRouteDriver.triggerSignal("fp-removed");
return 0;
} else {
if (i == 0) {
return 2;
} else if (fp[n].getPlanSize() > 2 and wp != FMGCdep.getValue() and wp != FMGCarr.getValue() and wp != "T/P" and wp != "PPOS") {
fp[n].deleteWP(i);
me.outputProps(); # Make sure everything is updated before we update the MCDUs.
me.updateMCDUDriver(n);
canvas_nd.A3XXRouteDriver.triggerSignal("fp-removed");
return 0;
} else {
return 2;
}
}
},
checkWPOutputs: func(n) {
sizeWP = size(wpID[n]);
for (var counter = sizeWP; counter < fp[n].getPlanSize(); counter += 1) {
append(wpID[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/id", "", "STRING"));
append(wpLat[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/lat", 0, "DOUBLE"));
append(wpLon[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/lon", 0, "DOUBLE"));
append(wpCourse[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/course", 0, "DOUBLE"));
append(wpDistance[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/distance", 0, "DOUBLE"));
append(wpCoursePrev[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/course-from-prev", 0, "DOUBLE"));
append(wpDistancePrev[n], props.globals.initNode("/FMGC/flightplan[" ~ n ~ "]/wp[" ~ counter ~ "]/distance-from-prev", 0, "DOUBLE"));
}
me.outputProps(); # Make sure everything is updated before we update the MCDUs.
me.updateMCDUDriver(n);
canvas_nd.A3XXRouteDriver.triggerSignal("fp-added"); # Update the NDs
},
updateMCDUDriver: func(n) {
for (var i = 0; i < 2; i += 1) { # Update the 2 MCDUs
if (TMPYActive[i].getBoolValue()) {
mcdu.FPLNLines[i].replacePlan(i, mcdu.TMPY, mcdu.FPLNLines[i].index);
} else {
mcdu.FPLNLines[i].replacePlan(2, mcdu.MAIN, mcdu.FPLNLines[i].index);
}
}
},
outputProps: func() {
geoPos = geo.aircraft_position();
for (var n = 0; n < 3; n += 1) { # Note: Some things don't get done for TMPY (0) hence all the if (n > 1) {}
if (((n == 0 and TMPYActive[0].getBoolValue()) or (n == 1 and TMPYActive[1].getBoolValue()) or n > 1) and toFromSet.getBoolValue() and fp[n].departure != nil and fp[n].destination != nil) {
if (n > 1) {
if (currentWP[n] > fp[n].getPlanSize()) {
currentWP[n] = fp[n].getPlanSize();
}
if (active_out[n].getBoolValue() != 1) {
active_out[n].setBoolValue(1);
}
currentLeg[n] = fp[n].getWP(currentWP[n]).wp_name;
if (currentLeg_out[n].getValue() != currentLeg[n]) {
currentLeg_out[n].setValue(currentLeg[n]);
}
currentLegCourseDist = fp[n].getWP(currentWP[n]).courseAndDistanceFrom(geoPos);
currentLegCourse_out[n].setValue(currentLegCourseDist[0]);
currentLegDist_out[n].setValue(currentLegCourseDist[1]);
magTrueError = magHDG.getValue() - trueHDG.getValue();
currentLegCourseMag_out[n].setValue(currentLegCourseDist[0] + magTrueError); # Convert to Magnetic
}
if (num_out[n].getValue() != fp[n].getPlanSize()) {
num_out[n].setValue(fp[n].getPlanSize());
}
for (var i = 0; i < fp[n].getPlanSize(); i += 1) {
wpID[n][i].setValue(fp[n].getWP(i).wp_name);
wpLat[n][i].setValue(fp[n].getWP(i).wp_lat);
wpLon[n][i].setValue(fp[n].getWP(i).wp_lon);
courseDistanceFrom = fp[n].getWP(i).courseAndDistanceFrom(geoPos);
wpCourse[n][i].setValue(courseDistanceFrom[0]);
wpDistance[n][i].setValue(courseDistanceFrom[1]);
if (i > 0) { # Impossible to do from the first WP
geoPosPrev.set_latlon(fp[n].getWP(i - 1).lat, fp[n].getWP(i - 1).lon, altFeet.getValue() * 0.3048);
courseDistanceFromPrev = fp[n].getWP(i).courseAndDistanceFrom(geoPosPrev);
wpCoursePrev[n][i].setValue(courseDistanceFromPrev[0]);
wpDistancePrev[n][i].setValue(courseDistanceFromPrev[1]);
} else { # So if its the first WP, we just use current position instead
wpCoursePrev[n][i].setValue(courseDistanceFrom[0]);
wpDistancePrev[n][i].setValue(courseDistanceFrom[1]);
}
if (wpID[n][i].getValue() == FMGCarr.getValue()) {
arrivalAirportI[n] = i;
}
}
arrivalLegDist_out[n].setValue(wpDistance[n][arrivalAirportI[n]].getValue());
} else {
if (n > 1) {
if (active_out[n].getBoolValue() != 0) {
active_out[n].setBoolValue(0);
}
if (currentLeg_out[n].getValue() != "") {
currentLeg_out[n].setValue("");
}
}
if (num_out[n].getValue() != 0) {
num_out[n].setValue(0);
}
}
if (n > 1) {
if (currentWP[n] != nil) {
if (currentWP_out[n].getValue() != currentWP[n]) {
currentWP_out[n].setValue(currentWP[n]);
}
} else {
if (currentWP_out[n].getValue() != 0) {
currentWP_out[n].setValue(0);
}
}
}
}
},
};
var outputPropsTimer = maketimer(0.1, flightplan.outputProps);

View file

@ -192,6 +192,7 @@ var systemsInit = func {
systems.fire_init();
systems.autobrake_init();
fadec.FADEC.init();
fmgc.flightplan.reset();
fmgc.ITAF.init();
fmgc.FMGCinit();
mcdu.MCDU_init(0);
@ -209,6 +210,7 @@ var systemsInit = func {
setlistener("/sim/signals/fdm-initialized", func {
systemsInit();
fmgc.outputPropsTimer.start();
});
var systemsLoop = maketimer(0.1, func {

View file

@ -449,7 +449,7 @@
</condition>
<expression>
<sum>
<property>/autopilot/route-manager/wp[0]/true-bearing-deg</property>
<property>/FMGC/flightplan[2]/current-leg-course</property>
<product>
<property>/it-autoflight/internal/drift-angle-deg</property>
<value>-1.0</value>