1 contributor
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;
}
}
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;
}
var ap_annun = [
'LATMOD-Armed-text', 'LATMOD-Active-text',
'AP-Status-text', 'YD-Status-text',
'VERMOD-Active-text', 'VERMOD-Reference-text', 'VERMOD-Armed-text'
];
foreach (var elem; ap_annun) {
var color = (elem == 'LATMOD-Armed-text' or elem == 'VERMOD-Armed-text') ? 'white' : 'green';
flightdeck.PFD.display.screenElements[elem]
.setColor(flightdeck.PFD.display.colors[color])
.setVisible(0);
}
foreach (var ap; [ 'AP', 'YD' ])
flightdeck.PFD.display.screenElements[ap ~ '-Status-text']
.setText(ap);
ap_annun = nil;
ap_systems = nil;
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 or me._locked)
return;
var _system = me.systems[me.system];
var _side = _system[side];
_side[row]();
},
},
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 {
me.trimTarget = 0;
},
updateDisplay: func {
var se = flightdeck.PFD.display.screenElements;
se['AP-Status-text'].setVisible(stec55x.rollMode != -1 or stec55x.pitchMode != -1);
se['YD-Status-text'].setVisible(stec55x.yaw.getValue() != -1);
if (stec55x.rollMode != -1) {
se['LATMOD-Active-text'].setVisible(1).setText('ROL');
var armed = '';
foreach (var m; [ 'NAV', 'CNAV', 'REV', 'CREV' ])
if (stec55x[m]) armed = m;
if (stec55x.roll.getValue() == 4) armed = 'GPS';
if (stec55x.APR_annun.getValue()) armed = 'APR';
if (stec55x.HDG_annun.getValue()) armed = 'HDG';
se['LATMOD-Armed-text']
.setVisible(size(armed))
.setText(armed);
}
else {
se['LATMOD-Active-text'].setVisible(0);
se['LATMOD-Armed-text'].setVisible(0);
}
if (stec55x.pitchMode != 1) {
var armed = '';
var active = '';
var reference = '';
if (stec55x.ALT_annun.getBoolValue()) {
if (abs(data.alt - afcs.getValue('selected-alt-ft')) < 150) {
active = 'ALT';
reference = sprintf('%5d ft', afcs.getValue('selected-alt-ft'));
armed = 'ALTS'
}
else {
active = 'ALT';
reference = sprintf('%5d ft', math.round(data.alt, 10));
armed = 'ALT';
}
}
elsif (stec55x.VS_annun.getBoolValue()) {
active = 'VS';
reference = sprintf('%s%4d fpm',
utf8.chstr(stec55x.vs.getValue() > 0 ? 9650 : 9660),
math.abs(math.round(stec55x.vs.getValue(), 10)));
}
elsif (stec55x.GSArmed.getBoolValue()) {
armed = 'VPATH';
active = 'GS';
}
# TODO: ask Octal450 which prop or variable can be used here
# elsif (stec55x.???) {
# armed = 'PIT';
# active = 'ALT';
# reference = sprintf("%d°", autopilot.systems.STEC55X.trim);
# }
se['VERMOD-Active-text'].setVisible(size(active)).setText(active);
se['VERMOD-Armed-text'].setVisible(size(armed)).setText(armed);
se['VERMOD-Reference-text'].setVisible(size(reference)).setText(reference);
}
},
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)
if (autopilot.systems.STEC55X.trimTarget > -15)
autopilot.systems.STEC55X.trimTarget -= 1;
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)
if (autopilot.systems.STEC55X.trimTarget < 20)
autopilot.systems.STEC55X.trimTarget += 1;
fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: 1});
fgcommand('property-assign', {property: '/it-stec55x/input/man-trim', value: 0});
},
],
}
}
};