1
0
Fork 0

GPWS: minor clean-up and performance update

This commit is contained in:
ThorstenB 2018-01-23 23:25:08 +01:00
parent cfbae6efb4
commit 37085f29ac
2 changed files with 63 additions and 64 deletions

View file

@ -356,7 +356,7 @@ MK_VIII::SystemHandler::update ()
///////////////////////////////////////////////////////////////////////////////
MK_VIII::ConfigurationModule::ConfigurationModule (MK_VIII *device)
: mk(device)
: state(STATE_OK), mk(device)
{
// arbitrary defaults
categories[CATEGORY_AIRCRAFT_MODE_TYPE_SELECT] = 0;
@ -603,8 +603,7 @@ MK_VIII::ConfigurationModule::read_altitude_callouts (int value)
mk->mode6_handler.conf.minimums_enabled = false;
mk->mode6_handler.conf.smart_500_enabled = false;
mk->mode6_handler.conf.above_field_voice = NULL;
for (i = 0; i < n_altitude_callouts; i++)
mk->mode6_handler.conf.altitude_callouts_enabled[i] = false;
mk->mode6_handler.conf.altitude_callouts_enabled = 0;
for (i = 0; i < n_elements(values); i++)
if (values[i].id == value)
@ -631,7 +630,7 @@ MK_VIII::ConfigurationModule::read_altitude_callouts (int value)
default:
for (unsigned k = 0; k < n_altitude_callouts; k++)
if (mk->mode6_handler.altitude_callout_definitions[k] == values[i].callouts[j])
mk->mode6_handler.conf.altitude_callouts_enabled[k] = true;
mk->mode6_handler.conf.altitude_callouts_enabled |= 1 << k;
break;
}
@ -887,18 +886,17 @@ const unsigned int MK_VIII::FaultHandler::fault_inops[] = {
bool
MK_VIII::FaultHandler::has_faults () const
{
for (int i = 0; i < N_FAULTS; i++)
if (faults[i])
return true;
return false;
return faults!=0;
}
bool
MK_VIII::FaultHandler::has_faults (unsigned int inop)
{
if (!faults)
return false;
for (int i = 0; i < N_FAULTS; i++)
if (faults[i] && test_bits(fault_inops[i], inop))
if ((faults & (1<<i)) && test_bits(fault_inops[i], inop))
return true;
return false;
@ -907,15 +905,15 @@ MK_VIII::FaultHandler::has_faults (unsigned int inop)
void
MK_VIII::FaultHandler::boot ()
{
memset(faults, 0, sizeof(faults));
faults = 0;
}
void
MK_VIII::FaultHandler::set_fault (Fault fault)
{
if (! faults[fault])
if (! (faults & (1<<fault)))
{
faults[fault] = true;
faults |= 1<<fault;
mk->self_test_handler.set_inop();
@ -935,14 +933,14 @@ MK_VIII::FaultHandler::set_fault (Fault fault)
void
MK_VIII::FaultHandler::unset_fault (Fault fault)
{
if (faults[fault])
{
faults[fault] = false;
if (faults & (1<<fault))
{
faults |= 1<<fault;
if (! has_faults(INOP_GPWS))
mk_doutput(gpws_inop) = false;
mk_doutput(gpws_inop) = false;
if (! has_faults(INOP_TAD))
mk_doutput(tad_inop) = false;
}
mk_doutput(tad_inop) = false;
}
}
///////////////////////////////////////////////////////////////////////////////
@ -996,7 +994,7 @@ MK_VIII::IOHandler::TerrainClearanceFilter::reset ()
}
MK_VIII::IOHandler::IOHandler (MK_VIII *device)
: mk(device), _lamp(LAMP_NONE)
: mk(device), _lamp(LAMP_NONE), last_landing_gear(false), last_real_flaps_down(false)
{
memset(&input_feeders, 0, sizeof(input_feeders));
memset(&inputs.discretes, 0, sizeof(inputs.discretes));
@ -1320,9 +1318,11 @@ MK_VIII::IOHandler::update_inputs ()
// 4. process input feeders requiring data computed above
if (mk_dinput_feed(decision_height))
{
mk_dinput(decision_height) = ! mk_data(radio_altitude).ncd
&& ! mk_data(decision_height).ncd
&& mk_data(radio_altitude).get() <= mk_data(decision_height).get();
}
}
void
@ -1352,8 +1352,8 @@ MK_VIII::IOHandler::handle_input_fault (bool test, FaultHandler::Fault fault)
{
if (test)
{
if (! mk->fault_handler.faults[fault])
mk->fault_handler.set_fault(fault);
if (! (mk->fault_handler.faults & (1<<fault)))
mk->fault_handler.set_fault(fault);
}
else
mk->fault_handler.unset_fault(fault);
@ -1367,7 +1367,7 @@ MK_VIII::IOHandler::handle_input_fault (bool test,
{
if (test)
{
if (! mk->fault_handler.faults[fault])
if (! (mk->fault_handler.faults & (1<<fault)))
{
if (timer->start_or_elapsed() >= max_duration)
mk->fault_handler.set_fault(fault);
@ -1688,13 +1688,13 @@ MK_VIII::IOHandler::update_egpwc_alert_discrete_3 ()
{
mk_aoutput(egpwc_alert_discrete_3) = 1 << 17 | 1 << 18;
if (mk->fault_handler.faults[FaultHandler::FAULT_MODES14_INPUTS_INVALID])
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODES14_INPUTS_INVALID))
mk_aoutput(egpwc_alert_discrete_3) |= 1 << 11;
if (mk->fault_handler.faults[FaultHandler::FAULT_MODE5_INPUTS_INVALID])
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODE5_INPUTS_INVALID))
mk_aoutput(egpwc_alert_discrete_3) |= 1 << 12;
if (mk->fault_handler.faults[FaultHandler::FAULT_MODE6_INPUTS_INVALID])
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODE6_INPUTS_INVALID))
mk_aoutput(egpwc_alert_discrete_3) |= 1 << 13;
if (mk->fault_handler.faults[FaultHandler::FAULT_BANK_ANGLE_INPUTS_INVALID])
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_BANK_ANGLE_INPUTS_INVALID))
mk_aoutput(egpwc_alert_discrete_3) |= 1 << 14;
if (mk_doutput(tad_inop))
mk_aoutput(egpwc_alert_discrete_3) |= 1 << 16;
@ -2063,7 +2063,7 @@ MK_VIII::IOHandler::present_status ()
};
for (size_t i = 0; i < n_elements(fault_names); i++)
if (mk->fault_handler.faults[i])
if (mk->fault_handler.faults & (1<<i))
present_status_subitem(fault_names[i]);
}
}
@ -2148,11 +2148,11 @@ MK_VIII::VoicePlayer::init ()
make_voice(&voices.too_low_terrain, "too-low-terrain");
for (unsigned i = 0; i < n_altitude_callouts; i++)
{
{
std::ostringstream name;
name << "altitude-" << MK_VIII::Mode6Handler::altitude_callout_definitions[i];
make_voice(&voices.altitude_callouts[i], name.str().c_str());
}
}
speaker.update_configuration();
}
@ -2270,7 +2270,7 @@ MK_VIII::SelfTestHandler::run ()
goto glideslope_end;
else
{
if (mk->fault_handler.faults[FaultHandler::FAULT_MODE5_INPUTS_INVALID])
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODE5_INPUTS_INVALID))
goto glideslope_inop;
}
}
@ -2286,8 +2286,8 @@ MK_VIII::SelfTestHandler::run ()
if (! was_here())
{
if (mk->fault_handler.faults[FaultHandler::FAULT_MODES14_INPUTS_INVALID])
goto gpws_inop;
if (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODES14_INPUTS_INVALID))
goto gpws_inop;
}
if (! was_here())
return discrete_on_off(&mk_doutput(gpws_warning), mk_voice(pull_up));
@ -2305,13 +2305,13 @@ MK_VIII::SelfTestHandler::run ()
if (! was_here())
{
if (mk->mode6_handler.conf.bank_angle_enabled
&& mk->fault_handler.faults[FaultHandler::FAULT_BANK_ANGLE_INPUTS_INVALID])
&& (mk->fault_handler.faults & (1<<FaultHandler::FAULT_BANK_ANGLE_INPUTS_INVALID)))
return play(mk_voice(bank_angle_inop));
}
if (! was_here())
{
if (mk->mode6_handler.altitude_callouts_enabled()
&& mk->fault_handler.faults[FaultHandler::FAULT_MODE6_INPUTS_INVALID])
&& (mk->fault_handler.faults & (1<<FaultHandler::FAULT_MODE6_INPUTS_INVALID)))
return play(mk_voice(callouts_inop));
}
if (! was_here())
@ -2367,15 +2367,16 @@ MK_VIII::SelfTestHandler::run ()
}
for (unsigned i = 0; i < n_altitude_callouts; i++)
if (! was_here_offset(i))
{
if (mk->mode6_handler.conf.altitude_callouts_enabled[i])
return play(mk_altitude_voice(i));
}
{
if (mk->mode6_handler.conf.altitude_callouts_enabled & (1<<i))
return play(mk_altitude_voice(i));
}
if (! was_here())
{
{
if (mk->mode6_handler.conf.smart_500_enabled)
return play(mk_altitude_voice(Mode6Handler::ALTITUDE_CALLOUT_500));
}
return play(mk_altitude_voice(Mode6Handler::ALTITUDE_CALLOUT_500));
}
goto callouts_end;
callouts_disabled:
if (! was_here())
@ -2638,7 +2639,7 @@ MK_VIII::AlertHandler::update ()
else if (select_voice_alerts(ALERT_MODE6_MINIMUMS))
{
if (! has_old_alerts(ALERT_MODE6_MINIMUMS))
mk->voice_player.play(mk_voice(minimums_minimums));
mk->voice_player.play(mk_voice(minimums_minimums));
}
else if (select_voice_alerts(ALERT_MODE4AB_TOO_LOW_TERRAIN | ALERT_MODE4C_TOO_LOW_TERRAIN))
{
@ -2871,12 +2872,12 @@ MK_VIII::StateHandler::post_reposition ()
if (ground && ! _ground)
leave_ground();
else if (! ground && _ground)
else if ((!ground) && _ground)
enter_ground();
if (takeoff && ! _takeoff)
if (takeoff && (!_takeoff))
leave_takeoff();
else if (! takeoff && _takeoff)
else if ((!takeoff) && _takeoff)
enter_takeoff();
}
@ -3950,11 +3951,7 @@ MK_VIII::Mode6Handler::altitude_callouts_enabled ()
if (conf.minimums_enabled || conf.smart_500_enabled || conf.above_field_voice)
return true;
for (unsigned i = 0; i < n_altitude_callouts; i++)
if (conf.altitude_callouts_enabled[i])
return true;
return false;
return (conf.altitude_callouts_enabled != 0);
}
void
@ -4004,7 +4001,7 @@ MK_VIII::Mode6Handler::update_altitude_callouts ()
&& ! mk->state_handler.ground // [1]
&& ! mk_data(radio_altitude).ncd)
for (unsigned i = 0; i < n_altitude_callouts && mk_data(radio_altitude).get() <= altitude_callout_definitions[i]; i++)
if ((conf.altitude_callouts_enabled[i]
if (((conf.altitude_callouts_enabled & (1<<i))
|| (altitude_callout_definitions[i] == 500
&& conf.smart_500_enabled))
&& ! altitude_callouts_issued[i]

View file

@ -121,7 +121,7 @@ class MK_VIII : public SGSubsystem
bool running;
inline Timer ()
: running(false) {}
: start_time(0.0), running(false) {}
inline void start () { running = true; start_time = globals->get_sim_time_sec(); }
inline void stop () { running = false; }
@ -183,7 +183,7 @@ class MK_VIII : public SGSubsystem
inline PropertiesHandler (MK_VIII *device)
: FGVoicePlayer::PropertiesHandler(), mk(device) {}
PropertiesHandler() : FGVoicePlayer::PropertiesHandler() {}
PropertiesHandler() : FGVoicePlayer::PropertiesHandler(), mk(NULL) {}
void init ();
};
@ -370,10 +370,10 @@ private:
N_FAULTS
} Fault;
bool faults[N_FAULTS];
unsigned int faults;
inline FaultHandler (MK_VIII *device)
: mk(device) {}
: mk(device), faults(0) {}
void boot ();
@ -921,7 +921,7 @@ private:
} conf;
inline Mode1Handler (MK_VIII *device)
: mk(device) {}
: mk(device), sink_rate_tti(0.0) {}
void update ();
};
@ -954,7 +954,7 @@ private:
public:
inline PassFilter (double _a0, double _a1, double _b1)
: a0(_a0), a1(_a1), b1(_b1) {}
: a0(_a0), a1(_a1), b1(_b1), last_input(0.0), last_output(0.0) {}
inline double filter (double input)
{
@ -1182,13 +1182,15 @@ private:
struct
{
bool minimums_enabled;
bool smart_500_enabled;
VoicePlayer::Voice *above_field_voice;
bool retard_enabled;
bool minimums_above_100_enabled;
bool minimums_enabled;
bool smart_500_enabled;
VoicePlayer::Voice *above_field_voice;
bool altitude_callouts_enabled[n_altitude_callouts];
bool bank_angle_enabled;
BankAnglePredicate is_bank_angle;
unsigned int altitude_callouts_enabled;
bool bank_angle_enabled;
BankAnglePredicate is_bank_angle;
} conf;
static const int altitude_callout_definitions[];