123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- # Garmin GTX-327 Transponder
- # Copyright (c) 2019 Joshua Davidson (Octal450)
- # Initialize variables
- var annuns = ["off", "stby", "off", "stby", "on", "alt"];
- var code = "7000";
- var mode = 1; # 0 = OFF, 1 = STANDBY, 4 = ON, 5 = ALTITUDE
- var modes = ["OFF", "STANDBY", "TEST", "GROUND", "ON", "ALTITUDE"];
- var powerUpTime = 0;
- var powerUpTestAnnun = 0;
- var identTime = 0;
- # Initialize all used property nodes
- var elapsedSec = props.globals.getNode("/sim/time/elapsed-sec");
- var powerSrc = props.globals.getNode("/systems/electrical/outputs/transponder", 1); # Transponder power source
- powerSrc.setDoubleValue(0.0);
- var serviceable = props.globals.initNode("/instrumentation/it-gtx327/serviceable", 1, "BOOL");
- var systemAlive = props.globals.initNode("/instrumentation/it-gtx327/internal/system-alive", 0, "BOOL");
- var systemAliveTemp = 0;
- var powerUpTest = props.globals.initNode("/instrumentation/it-gtx327/internal/powerup-test", -1, "INT"); # -1 = Powerup test not done, 0 = Powerup test complete, 1 = Powerup test in progress
- var powerUpTestTemp = 0;
- var idCode = props.globals.getNode("/instrumentation/transponder/id-code", 1);
- var modeKnob = props.globals.getNode("/instrumentation/transponder/inputs/knob-mode", 1);
- var identBtn = props.globals.getNode("/instrumentation/transponder/inputs/ident-btn", 1);
- var modeID = props.globals.getNode("/sim/gui/dialogs/radios/transponder-mode", 1);
- var displayMode = props.globals.initNode("/instrumentation/it-gtx327/internal/display-mode", "PA", "STRING");
- var displayOn = props.globals.initNode("/instrumentation/it-gtx327/internal/display-on", 0, "BOOL");
- var codeEntryActive = props.globals.initNode("/instrumentation/it-gtx327/internal/code-entry-active", 0, "BOOL");
- var Annun = {
- code: [nil, props.globals.initNode("/instrumentation/it-gtx327/annun/code-1", 7, "INT"), props.globals.initNode("/instrumentation/it-gtx327/annun/code-2", 0, "INT"), props.globals.initNode("/instrumentation/it-gtx327/annun/code-3", 0, "INT"), props.globals.initNode("/instrumentation/it-gtx327/annun/code-4", 0, "INT")],
- fail: props.globals.initNode("/instrumentation/it-gtx327/annun/fail", 0, "BOOL"),
- ident: props.globals.initNode("/instrumentation/it-gtx327/annun/ident", 0, "BOOL"),
- mode: props.globals.initNode("/instrumentation/it-gtx327/annun/mode", "off", "STRING"),
- r: props.globals.initNode("/instrumentation/it-gtx327/annun/reply", 0, "BOOL"),
- sel: props.globals.initNode("/instrumentation/it-gtx327/annun/sel", 0, "INT"),
- selTemp: 0,
- test: props.globals.initNode("/instrumentation/it-gtx327/annun/test", 0, "BOOL"),
- };
- setlistener("/sim/signals/fdm-initialized", func {
- system.init();
- });
- var system = {
- init: func() {
- mode = 1;
- codeEntryActive.setBoolValue(0);
- code = idCode.getValue(); # If a code was saved via aircraft-data or other means, import it
- me.updateCode();
- identBtn.setBoolValue(0);
- powerUpTest.setValue(-1);
- displayMode.setValue("PA");
- displayOn.setBoolValue(0);
- Annun.fail.setBoolValue(0);
- Annun.ident.setBoolValue(0);
- Annun.r.setBoolValue(0);
- Annun.sel.setValue(0);
- Annun.test.setBoolValue(0);
- me.setMode(mode);
- update.start();
- },
- loop: func() {
- if (powerSrc.getValue() >= 8) {
- systemAlive.setBoolValue(1);
- if (powerUpTest.getValue() == -1 and mode != 0) { # Begin power on test
- powerUpTest.setValue(1);
- powerUpTime = elapsedSec.getValue();
- } else if (powerUpTest.getValue() != -1 and mode == 0) {
- powerUpTest.setValue(-1);
- }
- } else {
- systemAlive.setBoolValue(0);
- if (powerUpTest.getValue() != -1) {
- powerUpTest.setValue(-1);
- }
- }
-
- systemAliveTemp = systemAlive.getBoolValue();
-
- if (systemAliveTemp != 0 and serviceable.getBoolValue()) {
- if (powerUpTest.getValue() >= 1 and powerUpTime + 3 < elapsedSec.getValue()) {
- powerUpTest.setValue(0);
- }
- } else if (systemAliveTemp != 0 and !serviceable.getBoolValue()) {
- if ((powerUpTest.getValue() == 0 or powerUpTest.getValue() == 1) and powerUpTime + 3 < elapsedSec.getValue()) {
- powerUpTest.setValue(2);
- }
- }
-
- powerUpTestTemp = powerUpTest.getValue();
-
- if (systemAliveTemp and powerUpTestTemp != -1) {
- displayOn.setBoolValue(1);
- } else {
- displayOn.setBoolValue(0);
- }
-
- # Annunciators
- if (powerUpTestTemp == 1 and systemAliveTemp) {
- Annun.test.setBoolValue(1);
- } else {
- Annun.test.setBoolValue(0);
- }
-
- if (powerUpTestTemp == 2 and systemAliveTemp) {
- Annun.fail.setBoolValue(1);
- } else {
- Annun.fail.setBoolValue(0);
- }
-
- if (powerUpTestTemp == 0 and systemAliveTemp) {
- Annun.mode.setValue(annuns[modeKnob.getValue()]);
- } else {
- Annun.mode.setValue("off");
- }
-
- if (identBtn.getBoolValue() and powerUpTestTemp == 0 and systemAliveTemp) {
- Annun.ident.setBoolValue(1);
- } else {
- Annun.ident.setBoolValue(0);
- }
-
- # Update transponder modes
- if (powerUpTestTemp == 0 and serviceable.getBoolValue()) {
- if (modeKnob.getValue() != mode) {
- me.setMode(mode);
- }
- } else {
- me.setMode(0);
- }
- },
- compileCode: func() {
- system.setCode(Annun.code[1].getValue() ~ Annun.code[2].getValue() ~ Annun.code[3].getValue() ~ Annun.code[4].getValue());
- },
- setCode: func(c) {
- me.endCodeEntry();
- code = c;
- idCode.setValue(c);
- me.updateCode();
- },
- updateCode: func() { # ~ "" exists to make sure it is a string
- Annun.code[1].setValue(substr(code ~ "", 0, 1));
- Annun.code[2].setValue(substr(code ~ "", 1, 1));
- Annun.code[3].setValue(substr(code ~ "", 2, 1));
- Annun.code[4].setValue(substr(code ~ "", 3, 1));
- },
- beginCodeEntry: func() {
- codeEntryActive.setBoolValue(1);
- Annun.sel.setValue(2)
- },
- endCodeEntry: func() {
- Annun.sel.setValue(0);
- codeEntryActive.setBoolValue(0);
- me.updateCode();
- },
- setMode: func(m) {
- modeKnob.setValue(m);
- modeID.setValue(modes[m]);
- },
- beginIdent: func(t) {
- identTime = t;
- identBtn.setBoolValue(1);
- identChk.start();
- },
- };
- var button = {
- OFF: func() {
- if (systemAlive.getBoolValue()) {
- mode = 0;
- }
- },
- STBY: func() {
- if (systemAlive.getBoolValue()) {
- mode = 1;
- }
- },
- ON: func() {
- if (systemAlive.getBoolValue()) {
- mode = 4;
- }
- },
- ALT: func() {
- if (systemAlive.getBoolValue()) {
- mode = 5;
- }
- },
- IDENT: func() {
- if (systemAlive.getBoolValue() and powerUpTest.getValue() == 0 and serviceable.getBoolValue()) {
- system.beginIdent(elapsedSec.getValue());
- }
- },
- VFR: func() {
- if (systemAlive.getBoolValue() and powerUpTest.getValue() == 0 and serviceable.getBoolValue()) {
- system.setCode(7000);
- }
- },
- CLR: func() {
- if (systemAlive.getBoolValue() and powerUpTest.getValue() == 0 and serviceable.getBoolValue()) {
- if (codeEntryActive.getBoolValue()) {
- Annun.selTemp = Annun.sel.getValue();
- if (Annun.selTemp > 1) {
- Annun.sel.setValue(Annun.selTemp - 1);
- Annun.code[Annun.selTemp - 1].setValue(-1);
- }
- } else {
- # TODO: If within 5sec of entry, return cursor to 4th line
- }
- }
- },
- CRSR: func() {
- if (systemAlive.getBoolValue() and powerUpTest.getValue() == 0 and serviceable.getBoolValue()) {
- system.endCodeEntry();
- }
- },
- Number: func(n) {
- if (systemAlive.getBoolValue() and powerUpTest.getValue() == 0 and serviceable.getBoolValue()) {
- if (n != 8 and n != 9) {
- if (codeEntryActive.getBoolValue()) {
- if (Annun.code[1].getValue() == -1) {
- Annun.code[1].setValue(n);
- Annun.sel.setValue(2);
- } else if (Annun.code[2].getValue() == -1) {
- Annun.code[2].setValue(n);
- Annun.sel.setValue(3);
- } else if (Annun.code[3].getValue() == -1) {
- Annun.code[3].setValue(n);
- Annun.sel.setValue(4);
- } else if (Annun.code[4].getValue() == -1) {
- Annun.code[4].setValue(n);
- system.compileCode();
- }
- } else {
- system.beginCodeEntry();
- Annun.code[1].setValue(n);
- Annun.code[2].setValue(-1);
- Annun.code[3].setValue(-1);
- Annun.code[4].setValue(-1);
- }
- }
- }
- },
- };
- var identChk = maketimer(0.5, func {
- if (identBtn.getBoolValue() and systemAlive.getBoolValue() and mode != 0) {
- if (identTime + 18 <= elapsedSec.getValue()) {
- identChk.stop();
- identBtn.setBoolValue(0);
- }
- } else {
- identChk.stop();
- identBtn.setBoolValue(0);
- }
- });
- # Handler for code change from generic dialog
- setlistener("/instrumentation/transponder/id-code", func {
- if (code != idCode.getValue()) {
- system.setCode(sprintf("%04d", idCode.getValue()));
- }
- }, 0, 0);
- var update = maketimer(0.1, system, system.loop);
|