# Becker Transponder BXP6401 by Benedikt Wolf (D-ECHO) based on # A3XX Lower ECAM Canvas # Joshua Davidson (it0uchpods) # Reference: http://www.becker-avionics.com/wp-content/uploads/2018/06/BXP6401_IO_issue05.pdf ## REQUIRES: ## * transponder module enabled from ## * power supply from systems/electrical/outputs/transponder (default) ##################### ## Version 05/2020 ## ##################### ## Features of this version: ## * use maketimer, only update visible pages ## * use props.nas, store in local variables where sensible ## * store instrument directory in variable ## * use of arrays where sensible ## * clarity through indentation ## * use functions for common functionality ## * clean up listeners ## * self-sufficient: does not need properties to be set-up via -set/-main/-base file (exceptions: "REQUIRES"-section) var BXP6401_start = nil; var BXP6401_ai = nil; var BXP6401_alt = nil; var BXP6401_display = nil; var page = "start"; var transponder = props.globals.getNode("/instrumentation/transponder[0]"); var inputs = transponder.getNode("inputs"); var mode_prop = inputs.initNode("knob-mode", 0, "INT"); var start_prop = transponder.initNode("start", 0.0, "DOUBLE"); var volt_prop = props.globals.initNode("/systems/electrical/outputs/transponder", 15.0, "DOUBLE"); var active_prop = inputs.initNode("current-change", 0, "INT"); var ident_prop = inputs.initNode("ident-btn", 0, "BOOL"); var idcode_prop = transponder.initNode("id-code", 7000, "INT"); var alt = transponder.getNode("altitude"); var alt_val = transponder.getNode("altitude-valid"); var brightness = transponder.initNode("brightness", 0.5, "DOUBLE"); var ident_arr = [0, 0, 0, 0]; var ident_prop_arr = [ inputs.initNode("digit[0]", 7, "INT"), inputs.initNode("digit[1]", 0, "INT"), inputs.initNode("digit[2]", 0, "INT"), inputs.initNode("digit[3]", 0, "INT"), ]; var instrument_dir = "Aircraft/Instruments-3d/bxp6401/"; var canvas_BXP6401_base = { init: func(canvas_group, file) { var font_mapper = func(family, weight) { return "LiberationFonts/LiberationSans-Bold.ttf"; }; canvas.parsesvg(canvas_group, file, {'font-mapper': font_mapper}); var svg_keys = me.getKeys(); foreach(var key; svg_keys) { me[key] = canvas_group.getElementById(key); } me.page = canvas_group; return me; }, getKeys: func() { return []; }, update: func() { var mode = mode_prop.getIntValue(); var start = start_prop.getDoubleValue(); if ( start == 1.0 and volt_prop.getDoubleValue() > 10 and mode != 0 ) { BXP6401_start.page.hide(); if(mode==1 or mode==4){ BXP6401_ai.page.show(); BXP6401_ai.update(); BXP6401_alt.page.hide(); }else if(mode==5){ BXP6401_alt.page.show(); BXP6401_alt.update(); BXP6401_ai.page.hide(); }else{ mode_prop.setIntValue(1); #GND and TEST not available for this transponder, so we reset to STBY } } else if ( start > 0.0 and start < 1.0 and volt_prop.getDoubleValue() > 10 and mode_prop.getIntValue() != 0){ BXP6401_ai.page.hide(); BXP6401_alt.page.hide(); BXP6401_start.page.show(); } else { BXP6401_ai.page.hide(); BXP6401_alt.page.hide(); BXP6401_start.page.hide(); } }, update_common: func() { #IDENT (ID) FLAG if( ident_prop.getBoolValue() == 1 ){ me["ident.flag"].show(); }else{ me["ident.flag"].hide(); } #ID CODE var cc = active_prop.getIntValue(); forindex(var i; ident_arr){ ident_arr[i] = ident_prop_arr[i].getIntValue(); } if( cc == 0 ){ me["id1.change"].hide(); me["id2.change"].hide(); me["id3.change"].hide(); me["id4.change"].hide(); me["id1.digit"].show(); me["id2.digit"].show(); me["id3.digit"].show(); me["id4.digit"].show(); me["id1.digit"].setText(sprintf("%1d", ident_arr[3])); me["id2.digit"].setText(sprintf("%1d", ident_arr[2])); me["id3.digit"].setText(sprintf("%1d", ident_arr[1])); me["id4.digit"].setText(sprintf("%1d", ident_arr[0])); }else if ( cc == 1 ){ me["id1.change"].show(); me["id1.change.digit"].setText(sprintf("%1d", ident_arr[3])); me["id2.change"].hide(); me["id3.change"].hide(); me["id4.change"].hide(); me["id1.digit"].hide(); me["id2.digit"].show(); me["id3.digit"].show(); me["id4.digit"].show(); me["id2.digit"].setText(sprintf("%1d", ident_arr[2])); me["id3.digit"].setText(sprintf("%1d", ident_arr[1])); me["id4.digit"].setText(sprintf("%1d", ident_arr[0])); }else if ( cc == 2 ){ me["id2.change"].show(); me["id2.change.digit"].setText(sprintf("%1d", ident_arr[2])); me["id1.change"].hide(); me["id3.change"].hide(); me["id4.change"].hide(); me["id1.digit"].show(); me["id2.digit"].hide(); me["id3.digit"].show(); me["id4.digit"].show(); me["id1.digit"].setText(sprintf("%1d", ident_arr[3])); me["id3.digit"].setText(sprintf("%1d", ident_arr[1])); me["id4.digit"].setText(sprintf("%1d", ident_arr[0])); }else if ( cc == 3 ){ me["id3.change"].show(); me["id3.change.digit"].setText(sprintf("%1d", ident_arr[1])); me["id1.change"].hide(); me["id2.change"].hide(); me["id4.change"].hide(); me["id1.digit"].show(); me["id2.digit"].show(); me["id3.digit"].hide(); me["id4.digit"].show(); me["id1.digit"].setText(sprintf("%1d", ident_arr[3])); me["id2.digit"].setText(sprintf("%1d", ident_arr[2])); me["id4.digit"].setText(sprintf("%1d", ident_arr[0])); }else if ( cc == 4 ){ me["id4.change"].show(); me["id4.change.digit"].setText(sprintf("%1d", ident_arr[0])); me["id1.change"].hide(); me["id2.change"].hide(); me["id3.change"].hide(); me["id1.digit"].show(); me["id2.digit"].show(); me["id3.digit"].show(); me["id4.digit"].hide(); me["id1.digit"].setText(sprintf("%1d", ident_arr[3])); me["id2.digit"].setText(sprintf("%1d", ident_arr[2])); me["id3.digit"].setText(sprintf("%1d", ident_arr[1])); } }, }; var canvas_BXP6401_ai = { new: func(canvas_group, file) { var m = { parents: [canvas_BXP6401_ai , canvas_BXP6401_base] }; m.init(canvas_group, file); return m; }, getKeys: func() { return ["ident.flag","r.flag","id1.digit","id2.digit","id3.digit","id4.digit","id1.change","id1.change.digit","id2.change","id2.change.digit","id3.change","id3.change.digit","id4.change","id4.change.digit","status"]; }, update: func() { #Status (STBY/ON) var stat = mode_prop.getIntValue(); if( stat == 1 ){ me["status"].setText("SBY"); }else if( stat == 4 ) { me["status"].setText("ON"); }else{ me["status"].setText("FAIL"); } me.update_common(); } }; var canvas_BXP6401_alt = { new: func(canvas_group, file) { var m = { parents: [canvas_BXP6401_alt , canvas_BXP6401_base] }; m.init(canvas_group, file); return m; }, getKeys: func() { return ["ident.flag","r.flag","id1.digit","id2.digit","id3.digit","id4.digit","id1.change","id1.change.digit","id2.change","id2.change.digit","id3.change","id3.change.digit","id4.change","id4.change.digit","altitude"]; }, update: func() { #Altitude (FL) if( alt_val.getBoolValue() ){ me["altitude"].setText(sprintf("%03d", math.round( alt.getDoubleValue() /100))); }else{ me["altitude"].setText("---"); } me.update_common(); } }; var canvas_BXP6401_start = { new: func(canvas_group, file) { var m = { parents: [canvas_BXP6401_start , canvas_BXP6401_base] }; m.init(canvas_group, file); return m; }, getKeys: func() { return []; }, update: func() { } }; var update_bxp6401 = maketimer( 0.2, func () { canvas_BXP6401_base.update() } ); var ls = setlistener("sim/signals/fdm-initialized", func { BXP6401_display = canvas.new({ "name": "BXP6401", "size": [1024, 512], "view": [1024, 512], "mipmapping": 1 }); BXP6401_display.addPlacement({"node": "BXP6401.display"}); var groupAi = BXP6401_display.createGroup(); var groupAlt = BXP6401_display.createGroup(); var groupStart = BXP6401_display.createGroup(); BXP6401_ai = canvas_BXP6401_ai.new(groupAi, instrument_dir~"bxp6401-ai.svg"); BXP6401_alt = canvas_BXP6401_alt.new(groupAlt, instrument_dir~"bxp6401-alt.svg"); BXP6401_start = canvas_BXP6401_start.new(groupStart, instrument_dir~"bxp6401-start.svg"); update_bxp6401.start(); removelistener(ls); }); var identoff = func { ident_prop.setIntValue(0); } var ident_btn = func() { ident_prop.setIntValue(1); settimer(identoff, 18); } var check_state = func() { if( mode_prop.getIntValue() != 0 and volt_prop.getDoubleValue() > 10 and start_prop.getDoubleValue() == 0){ interpolate(start_prop, 1, 1 ); }else if( ( mode_prop.getIntValue() == 0 or volt_prop.getDoubleValue() <= 10 ) and start_prop.getDoubleValue() != 0){ start_prop.setDoubleValue(0.0); } } setlistener(mode_prop, func{ check_state(); }); setlistener(volt_prop, func{ check_state(); });