Skip to content

Commit

Permalink
fix(a32nx/fcu): implement ALT rounding improvements in simulink
Browse files Browse the repository at this point in the history
Co-authored-by: elliot747 <[email protected]>
  • Loading branch information
lukecologne and elliot747 committed Feb 2, 2025
1 parent ad92afc commit 206b11b
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 95 deletions.
45 changes: 12 additions & 33 deletions fbw-a32nx/src/wasm/fbw_a320/src/model/FcuComputer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ void FcuComputer::step()
base_fcu_efis_logic_outputs rtb_BusAssignment_b_logic_capt_efis;
base_fcu_efis_logic_outputs rtb_BusAssignment_b_logic_fo_efis;
fcu_outputs rtb_BusAssignment_m;
int32_T tmp;
int32_T y_tmp;
real32_T rtb_y;
real32_T rtb_y_f;
real32_T rtb_y_j3;
Expand Down Expand Up @@ -933,43 +933,22 @@ void FcuComputer::step()
FcuComputer_DWork.prevTrkFpaActive_m = FcuComputer_DWork.p_trk_fpa_active;
rtb_BusAssignment_m.logic.afs.hdg_trk_display_value = FcuComputer_DWork.pValue_b;
rtb_BusAssignment_m.logic.afs.hdg_trk_dashes = rtb_dashes_n;
y_tmp = FcuComputer_U.in.discrete_inputs.afs_inputs.alt_increment_1000 * 900;
if (!FcuComputer_DWork.pValue_not_empty_p) {
FcuComputer_DWork.pValue_h = rtb_BusAssignment_m.logic.afs.chosen_fmgc_data.alt_ft;
FcuComputer_DWork.pValue_h = std::round(rtb_BusAssignment_m.logic.afs.chosen_fmgc_data.alt_ft /
static_cast<real32_T>(y_tmp + 100)) * (static_cast<real32_T>(y_tmp) + 100.0F);
FcuComputer_DWork.pValue_not_empty_p = true;
}

if (FcuComputer_U.in.sim_input.alt != -1.0F) {
FcuComputer_DWork.pValue_h = FcuComputer_U.in.sim_input.alt;
}

if (FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns != FcuComputer_P.CompareToConstant_const) {
if (FcuComputer_U.in.discrete_inputs.afs_inputs.alt_increment_1000) {
// In the case altitude is still in 100s, ensure a turn doesn't count for more than 1000ft (e.g. 6300ft turn -1 should be 6000ft,
// not 5000ft)
real32_T orig_value = FcuComputer_DWork.pValue_h;
real32_T new_value = std::round((static_cast<real32_T>(FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns) * 1000.0F +
FcuComputer_DWork.pValue_h) /
1000.0F) *
1000.0F;

real32_T max_delta = std::abs(FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns * 1000.0F);
real32_T delta = std::abs(new_value - orig_value);
if (delta > max_delta) {
if (FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns > 0)
new_value -= 1000.0F;
else
new_value += 1000.0F;
}

FcuComputer_DWork.pValue_h = new_value;

} else {
FcuComputer_DWork.pValue_h =
std::round(
(static_cast<real32_T>(FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns) * 100.0F + FcuComputer_DWork.pValue_h) /
100.0F) *
100.0F;
}
if ((FcuComputer_U.in.sim_input.alt != -1.0F) || (FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns != 0))
{
FcuComputer_DWork.pValue_h = std::round(((static_cast<real32_T>(y_tmp + 100) / 2.0F + 1.0F) * static_cast<real32_T>
(FcuComputer_U.in.discrete_inputs.afs_inputs.alt_knob.turns) + FcuComputer_DWork.pValue_h) /
static_cast<real32_T>(y_tmp + 100)) * (static_cast<real32_T>(y_tmp) + 100.0F);
}

FcuComputer_DWork.pValue_h = std::fmax(std::fmin(FcuComputer_DWork.pValue_h, 49000.0F), 100.0F);
Expand Down Expand Up @@ -1058,12 +1037,12 @@ void FcuComputer::step()
FcuComputer_DWork.pValue = 500.0F;
} else {
if (rtb_y_f < 0.0F) {
tmp = -1;
y_tmp = -1;
} else {
tmp = (rtb_y_f > 0.0F);
y_tmp = (rtb_y_f > 0.0F);
}

FcuComputer_DWork.pValue = 1000.0F * static_cast<real32_T>(tmp);
FcuComputer_DWork.pValue = 1000.0F * static_cast<real32_T>(y_tmp);
}
}

Expand Down
124 changes: 62 additions & 62 deletions fbw-a32nx/src/wasm/fbw_a320/src/model/FcuComputer_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,68 @@ struct base_fcu_knob_inputs

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_efis_panel_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_efis_panel_inputs_

struct base_fcu_efis_panel_inputs
{
efis_range_selection efis_range;
efis_mode_selection efis_mode;
efis_navaid_selection efis_navaid_1;
efis_navaid_selection efis_navaid_2;
boolean_T baro_is_inhg;
base_fcu_knob_inputs baro_knob;
boolean_T fd_button_pushed;
boolean_T ls_button_pushed;
boolean_T cstr_button_pushed;
boolean_T wpt_button_pushed;
boolean_T vord_button_pushed;
boolean_T ndb_button_pushed;
boolean_T arpt_button_pushed;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_afs_panel_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_afs_panel_inputs_

struct base_fcu_afs_panel_inputs
{
boolean_T loc_button_pressed;
boolean_T exped_button_pressed;
boolean_T appr_button_pressed;
boolean_T spd_mach_button_pressed;
boolean_T trk_fpa_button_pressed;
boolean_T metric_alt_button_pressed;
base_fcu_knob_inputs spd_knob;
base_fcu_knob_inputs hdg_trk_knob;
base_fcu_knob_inputs alt_knob;
boolean_T alt_increment_1000;
base_fcu_knob_inputs vs_fpa_knob;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_discrete_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_discrete_inputs_

struct base_fcu_discrete_inputs
{
boolean_T ap_1_engaged;
boolean_T fd_1_engaged;
boolean_T athr_1_engaged;
boolean_T ap_2_engaged;
boolean_T fd_2_engaged;
boolean_T athr_2_engaged;
boolean_T lights_test;
boolean_T pin_prog_qfe_avail;
base_fcu_efis_panel_inputs capt_efis_inputs;
base_fcu_efis_panel_inputs fo_efis_inputs;
base_fcu_afs_panel_inputs afs_inputs;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_arinc_429_
#define DEFINED_TYPEDEF_FOR_base_arinc_429_

Expand Down Expand Up @@ -223,68 +285,6 @@ struct base_sim_data

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_efis_panel_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_efis_panel_inputs_

struct base_fcu_efis_panel_inputs
{
efis_range_selection efis_range;
efis_mode_selection efis_mode;
efis_navaid_selection efis_navaid_1;
efis_navaid_selection efis_navaid_2;
boolean_T baro_is_inhg;
base_fcu_knob_inputs baro_knob;
boolean_T fd_button_pushed;
boolean_T ls_button_pushed;
boolean_T cstr_button_pushed;
boolean_T wpt_button_pushed;
boolean_T vord_button_pushed;
boolean_T ndb_button_pushed;
boolean_T arpt_button_pushed;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_afs_panel_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_afs_panel_inputs_

struct base_fcu_afs_panel_inputs
{
boolean_T loc_button_pressed;
boolean_T exped_button_pressed;
boolean_T appr_button_pressed;
boolean_T spd_mach_button_pressed;
boolean_T trk_fpa_button_pressed;
boolean_T metric_alt_button_pressed;
base_fcu_knob_inputs spd_knob;
base_fcu_knob_inputs hdg_trk_knob;
base_fcu_knob_inputs alt_knob;
boolean_T alt_increment_1000;
base_fcu_knob_inputs vs_fpa_knob;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_discrete_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_discrete_inputs_

struct base_fcu_discrete_inputs
{
boolean_T ap_1_engaged;
boolean_T fd_1_engaged;
boolean_T athr_1_engaged;
boolean_T ap_2_engaged;
boolean_T fd_2_engaged;
boolean_T athr_2_engaged;
boolean_T lights_test;
boolean_T pin_prog_qfe_avail;
base_fcu_efis_panel_inputs capt_efis_inputs;
base_fcu_efis_panel_inputs fo_efis_inputs;
base_fcu_afs_panel_inputs afs_inputs;
};

#endif

#ifndef DEFINED_TYPEDEF_FOR_base_fcu_bus_inputs_
#define DEFINED_TYPEDEF_FOR_base_fcu_bus_inputs_

Expand Down

0 comments on commit 206b11b

Please sign in to comment.