# # This Timer is for stop-watches # # ./time (double) elapsed time since last start or reset # # ./running (bool) true if timer is running, false if stopped # ./start-time (double) timestamp when the timer was last started or reset var elapsedTimeSecN = props.globals.getNode( "/sim/time/elapsed-sec" ); var timer = { new : func { var m = { parents: [timer] }; m.base = arg[0]; m.baseN = props.globals.getNode( m.base, 1 ); m.timeN = m.baseN.initNode( "time", 0.0 ); m.runningN = m.baseN.initNode( "running", 0, "BOOL" ); m.startTimeN = m.baseN.initNode( "start-time", -1.0 ); return m; }, getTime : func { return me.timeN.getDoubleValue(); }, start : func { me.runningN.setBoolValue( 1 ); }, stop : func { me.runningN.setBoolValue( 0 ); }, reset : func { me.startTimeN.setDoubleValue( elapsedTimeSecN.getValue() ); me.timeN.setDoubleValue( 0 ); }, restart : func { me.reset(); me.start(); }, # return integer coded time as hmmss computeBCDTime : func { var t = me.timeN.getValue(); var h = int(t / 3600); var t = t - (h*3600); var m = int(t / 60 ); var t = t - (m*60); var s = int(t); return h * 10000 + m * 100 + s; }, update : func { if( me.runningN.getValue() ) { me.timeN.setDoubleValue( elapsedTimeSecN.getValue() - me.startTimeN.getValue() ); } } }; #################################################################### # KR87 var kr87 = { new : func { var m = { parents: [kr87] }; m.base = arg[0]; m.baseN = props.globals.getNode( m.base, 1 ); m.flt = timer.new( m.base ~ "/flight-timer" ); m.flt.restart(); m.et = timer.new( m.base ~ "/enroute-timer" ); m.et.restart(); m.displayModeN = m.baseN.initNode( "display-mode", 0, "INT" ); m.rightDisplayN = m.baseN.getNode( "right-display", 1 ); m.standbyFrequencyN = m.baseN.getNode( "frequencies/standby-khz", 1 ); # will be set from audiopanel # m.baseN.getNode( "ident-audible" ).setBoolValue( 1 ); m.volumeNormN = m.baseN.initNode( "volume-norm", 0.0 ); m.power = 0; m.powerButtonN = m.baseN.initNode( "power-btn", 0, "BOOL" ); m.powerButtonN.setBoolValue( m.volumeNormN.getValue() != 0 ); m.setButtonN = m.baseN.initNode( "set-btn", 0, "BOOL" ); m.powerButtonN.setBoolValue( m.powerButtonN.getValue() ); m.adfButtonN = m.baseN.initNode( "adf-btn", 0, "BOOL" ); m.bfoButtonN = m.baseN.initNode( "bfo-btn", 0, "BOOL" ); m.modeN = m.baseN.getNode( "mode" ); setlistener( m.base ~ "/adf-btn", func { m.modeButtonListener() } ); setlistener( m.base ~ "/bfo-btn", func { m.modeButtonListener() } ); m.modeButtonListener(); return m; }, modeButtonListener : func { if( me.adfButtonN.getBoolValue() ) { if( me.bfoButtonN.getBoolValue() ) { me.modeN.setValue( "bfo" ); } else { me.modeN.setValue( "adf" ); } } else { me.modeN.setValue( "ant" ); } }, powerButtonListener : func(n) { if( n.getBoolValue() and !me.power ) { # power on, restart timer and start with FRQ display me.et.restart(); me.flt.restart(); me.displayModeN.setIntValue( 0 ); } me.power = me.powerButtonN.getValue(); }, update : func { me.flt.update(); me.et.update(); var m = me.displayModeN.getValue(); if( m == 0 ) { # FRQ me.rightDisplayN.setIntValue( me.standbyFrequencyN.getValue() ); } # the display works up to 99h, 59m, 59s and then # displays 00:00 again. Don't know if this is the like the true kr87 # handles this - never flewn that long... if( m == 1 ) { # FLT, show mm:ss up to 59:59, then hh:mm var t = me.flt.computeBCDTime(); if( t >= 10000 ) { t = t / 100; } me.rightDisplayN.setIntValue( t ); } if( m == 2 ) { # ET, show mm:ss up to 59:59, then hh:mm t = me.et.computeBCDTime(); if( t >= 10000 ) { t = t / 100; } me.rightDisplayN.setIntValue( t ); } if( me.setButtonN.getValue() ) { me.et.restart(); } if( me.powerButtonN.getBoolValue() and !me.power ) { # power on, restart timer and start with FRQ display me.et.restart(); me.flt.restart(); me.displayModeN.setIntValue( 0 ); } me.power = me.powerButtonN.getValue(); settimer( func { me.update() }, 0.1 ); } }; var kr87_0 = kr87.new( "/instrumentation/adf[0]" ).update(); #setlistener("/sim/signals/fdm-initialized", func { timer_update() } );