var APClass = { new : func { var m = { parents: [ APClass ] }; m.system = 'none'; var ap_systems = { # described AP systems to search, if it returns true system is set STEC55X: func contains(stec55x, 'ITAF'), }; foreach (var s; sort(keys(ap_systems), func(a,b) cmp(a,b))) { call(ap_systems[s], [], nil, nil, var errors = []); if (!size(errors)) { msg('found autopilot system: ' ~ s); m.system = s; break; } } ap_systems = nil; m.engaged = 0; if (! contains(data.timers, 'updateAP')) { data.timers.updateAP = maketimer(1, m, m.systems[m.system].updateDisplay); data.timers.updateAP.start(); } if (! contains(data.timers, 'AP_blinking')) { data.timers.AP_blinking = maketimer(0, m, m._blinking); data.timers.AP_blinking.singleShot = 1; } if (contains(m.systems[m.system], 'hook') and typeof(m.systems[m.system].hook) == 'func') m.systems[m.system].hook(); return m; }, softkey: func (side, row, a) { if (a == 0 or me._locked) return; var _system = me.systems[me.system]; var _side = _system[side]; _side[row](); }, _locked: 0, # no status modification while blinking, is it really useful ? _blinking: func { autopilot._locked += 1; var _display = flightdeck['PFD'].display; var i = math.mod(autopilot._locked, 2); var delays = [ 0.7, 0.3 ]; _display.screenElements['AP-text'].setVisible(i); if (autopilot._locked < 11) data.timers.AP_blinking.restart(delays[i]); else { autopilot._locked = 0; data.timers.AP_blinking.stop(); _display.screenElements['AP-text'] .setVisible(1) .setText(''); } }, systems : { # L: AP FD NAV ALT VS FLC # R: YD HDG APR VNV UP DN none: { updateDisplay: func, hook: func, L: [ func, func, func, func, func, func ], R: [ func, func, func, func, func, func ], }, STEC55X: { hook : func, updateDisplay: func { if (autopilot._locked) return; var ap_annun = ''; if (flightdeck['PFD'].display.screenElements['AP-text'].getText() != '' and stec55x.pitch.getValue() == -1 and stec55x.roll.getValue() == -1) { autopilot._blinking(); return; } elsif (stec55x.roll.getValue() != -1 or stec55x.pitch.getValue() != -1) ap_annun = 'AP'; foreach (var mode; ['HDG', 'NAV', 'APR']) if (stec55x[mode ~ '_annun'].getValue()) ap_annun ~= ' ' ~ mode; if (stec55x.ALT_annun.getValue()) ap_annun ~= sprintf('ALT %5d ft', math.round(me.data.alt), 10); # even if pressure is hold, we show alt in feet if (stec55x.VS_annun.getValue()) ap_annun ~= sprintf('VS %s %4d fpm', utf8.chstr(stec55x.vs.getValue() > 0 ? 9650 : 9660), math.abs(math.round(stec55x.vs.getValue(), 10))); }, L: [ func { var ap_master_sw = '/it-stec55x/input/ap-master-sw'; setprop(ap_master_sw, !getprop(ap_master_sw)); }, func { var apfd_master_sw = '/it-stec55x/input/apfd-master-sw'; setprop(apfd_master_sw, !getprop(apfd_master_sw)); }, func { call(stec55x.button.NAV, [], nil, stec55x); }, func { call(stec55x.button.ALT, [], nil, stec55x); }, func { call(stec55x.button.VS, [], nil, stec55x); }, func, ], R: [ func { var yaw_dumper_sw = '/it-stec55x/input/yaw-damper-sw'; setprop(yaw_dumper_sw, !getprop(yaw_dumper_sw)); }, func { call(stec55x.button.HDG, [], nil, stec55x); }, func { call(stec55x.button.APR, [], nil, stec55x); }, func, func { # UP (trim) fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: -1}); fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: 0}); }, func { # DN (trim) fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: 1}); fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: 0}); }, ], } } };