Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use ifdefs to remove more code around RC option code #27777

Merged
merged 5 commits into from
Sep 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions ArduCopter/RC_Channel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,9 @@ void RC_Channel_Copter::init_aux_function(const AUX_FUNC ch_option, const AuxSwi
case AUX_FUNC::GUIDED:
case AUX_FUNC::LAND:
case AUX_FUNC::LOITER:
#if HAL_PARACHUTE_ENABLED
case AUX_FUNC::PARACHUTE_RELEASE:
#endif
case AUX_FUNC::POSHOLD:
case AUX_FUNC::RESETTOARMEDYAW:
case AUX_FUNC::RTL:
Expand All @@ -99,7 +101,9 @@ void RC_Channel_Copter::init_aux_function(const AUX_FUNC ch_option, const AuxSwi
case AUX_FUNC::USER_FUNC1:
case AUX_FUNC::USER_FUNC2:
case AUX_FUNC::USER_FUNC3:
#if AP_WINCH_ENABLED
case AUX_FUNC::WINCH_CONTROL:
#endif
case AUX_FUNC::ZIGZAG:
case AUX_FUNC::ZIGZAG_Auto:
case AUX_FUNC::ZIGZAG_SaveWP:
Expand All @@ -116,15 +120,21 @@ void RC_Channel_Copter::init_aux_function(const AUX_FUNC ch_option, const AuxSwi
case AUX_FUNC::ATTCON_FEEDFWD:
case AUX_FUNC::INVERTED:
case AUX_FUNC::MOTOR_INTERLOCK:
#if HAL_PARACHUTE_ENABLED
case AUX_FUNC::PARACHUTE_3POS: // we trust the vehicle will be disarmed so even if switch is in release position the chute will not release
case AUX_FUNC::PARACHUTE_ENABLE:
#endif
case AUX_FUNC::PRECISION_LOITER:
#if AP_RANGEFINDER_ENABLED
case AUX_FUNC::RANGEFINDER:
#endif
case AUX_FUNC::SIMPLE_MODE:
case AUX_FUNC::STANDBY:
case AUX_FUNC::SUPERSIMPLE_MODE:
case AUX_FUNC::SURFACE_TRACKING:
#if AP_WINCH_ENABLED
case AUX_FUNC::WINCH_ENABLE:
#endif
case AUX_FUNC::AIRMODE:
case AUX_FUNC::FORCEFLYING:
case AUX_FUNC::CUSTOM_CONTROLLER:
Expand Down Expand Up @@ -270,7 +280,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc
copter.rangefinder_state.enabled = false;
}
break;
#endif
#endif // AP_RANGEFINDER_ENABLED

#if MODE_ACRO_ENABLED
case AUX_FUNC::ACRO_TRAINER:
Expand Down Expand Up @@ -343,7 +353,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc
break;
}
break;
#endif
#endif // HAL_PARACHUTE_ENABLED

case AUX_FUNC::ATTCON_FEEDFWD:
// enable or disable feed forward
Expand Down Expand Up @@ -451,11 +461,11 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc
break;
}
break;
#endif

case AUX_FUNC::WINCH_CONTROL:
// do nothing, used to control the rate of the winch and is processed within AP_Winch
break;
#endif // AP_WINCH_ENABLED

#ifdef USERHOOK_AUXSWITCH
case AUX_FUNC::USER_FUNC1:
Expand Down
6 changes: 6 additions & 0 deletions ArduPlane/Parameters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1362,9 +1362,15 @@ struct RCConversionInfo {
static const RCConversionInfo rc_option_conversion[] = {
{ Parameters::k_param_flapin_channel_old, 0, RC_Channel::AUX_FUNC::FLAP},
{ Parameters::k_param_g2, 968, RC_Channel::AUX_FUNC::SOARING},
#if AP_FENCE_ENABLED
{ Parameters::k_param_fence_channel, 0, RC_Channel::AUX_FUNC::FENCE},
#endif
#if AP_MISSION_ENABLED
{ Parameters::k_param_reset_mission_chan, 0, RC_Channel::AUX_FUNC::MISSION_RESET},
#endif
#if HAL_PARACHUTE_ENABLED
{ Parameters::k_param_parachute_channel, 0, RC_Channel::AUX_FUNC::PARACHUTE_RELEASE},
#endif
{ Parameters::k_param_fbwa_tdrag_chan, 0, RC_Channel::AUX_FUNC::FBWA_TAILDRAGGER},
{ Parameters::k_param_reset_switch_chan, 0, RC_Channel::AUX_FUNC::MODE_SWITCH_RESET},
};
Expand Down
2 changes: 2 additions & 0 deletions ArduPlane/RC_Channel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,9 @@ void RC_Channel_Plane::init_aux_function(const RC_Channel::AUX_FUNC ch_option,
case AUX_FUNC::FBWA_TAILDRAGGER:
case AUX_FUNC::FWD_THR:
case AUX_FUNC::LANDING_FLARE:
#if HAL_PARACHUTE_ENABLED
case AUX_FUNC::PARACHUTE_RELEASE:
#endif
case AUX_FUNC::MODE_SWITCH_RESET:
case AUX_FUNC::CRUISE:
#if HAL_QUADPLANE_ENABLED
Expand Down
174 changes: 174 additions & 0 deletions Tools/autotest/test_build_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,9 @@ def test_disable_feature(self, feature, options):

self.test_compile_with_defines(defines)

self.assert_feature_not_in_code(defines, feature)

def assert_feature_not_in_code(self, defines, feature):
# if the feature is truly disabled then extract_features.py
# should say so:
for target in self.build_targets:
Expand Down Expand Up @@ -222,6 +225,177 @@ def test_enable_feature(self, feature, options):

self.test_compile_with_defines(defines)

self.assert_feature_in_code(defines, feature)

def define_is_whitelisted_for_feature_in_code(self, target, define):
'''returns true if we can not expect the define to be extracted from
the binary'''
# the following defines are known not to work on some
# or all vehicles:
feature_define_whitelist = set([
'AP_RANGEFINDER_ENABLED', # only at vehicle level ATM
'HAL_PERIPH_SUPPORT_LONG_CAN_PRINTF', # no symbol
'AP_DRONECAN_VOLZ_FEEDBACK_ENABLED', # broken, no subscriber
# Baro drivers either come in because you have
# external-probing enabled or you have them specified in
# your hwdef. If you're not probing and its not in your
# hwdef then the code will be elided as unreachable
'AP_BARO_ICM20789_ENABLED',
'AP_BARO_ICP101XX_ENABLED',
'AP_BARO_ICP201XX_ENABLED',
'AP_BARO_BMP085_ENABLED',
'AP_BARO_BMP280_ENABLED',
'AP_BARO_BMP388_ENABLED',
'AP_BARO_BMP581_ENABLED',
'AP_BARO_DPS280_ENABLED',
'AP_BARO_FBM320_ENABLED',
'AP_BARO_KELLERLD_ENABLED',
'AP_BARO_LPS2XH_ENABLED',
'AP_BARO_MS56XX_ENABLED',
'AP_BARO_SPL06_ENABLED',
'AP_CAMERA_SEND_FOV_STATUS_ENABLED', # elided unless AP_CAMERA_SEND_FOV_STATUS_ENABLED
'AP_COMPASS_LSM9DS1_ENABLED', # must be in hwdef, not probed
'AP_COMPASS_MAG3110_ENABLED', # must be in hwdef, not probed
'AP_COMPASS_MMC5XX3_ENABLED', # must be in hwdef, not probed
'AP_MAVLINK_AUTOPILOT_VERSION_REQUEST_ENABLED', # completely elided
'AP_MAVLINK_MSG_HIL_GPS_ENABLED', # no symbol available
'AP_MAVLINK_MSG_RELAY_STATUS_ENABLED', # no symbol available
'AP_MAVLINK_MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES_ENABLED', # no symbol available
'HAL_MSP_SENSORS_ENABLED', # no symbol available
'AP_OSD_LINK_STATS_EXTENSIONS_ENABLED', # FIXME: need a new define/feature
'HAL_OSD_SIDEBAR_ENABLE', # FIXME: need a new define/feature
'HAL_PLUSCODE_ENABLE', # FIXME: need a new define/feature
'AP_SERIALMANAGER_REGISTER_ENABLED', # completely elided without a caller
'AP_OPTICALFLOW_ONBOARD_ENABLED', # only instantiated on Linux
'HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL', # entirely elided if no user
'AP_PLANE_BLACKBOX_LOGGING', # entirely elided if no user
])
if target.lower() != "copter":
feature_define_whitelist.add('MODE_ZIGZAG_ENABLED')
feature_define_whitelist.add('MODE_SYSTEMID_ENABLED')
feature_define_whitelist.add('MODE_SPORT_ENABLED')
feature_define_whitelist.add('MODE_FOLLOW_ENABLED')
feature_define_whitelist.add('MODE_TURTLE_ENABLED')
feature_define_whitelist.add('MODE_GUIDED_NOGPS_ENABLED')
feature_define_whitelist.add('MODE_FLOWHOLD_ENABLED')
feature_define_whitelist.add('MODE_FLIP_ENABLED')
feature_define_whitelist.add('MODE_BRAKE_ENABLED')
feature_define_whitelist.add('AP_TEMPCALIBRATION_ENABLED')
feature_define_whitelist.add('AC_PAYLOAD_PLACE_ENABLED')
feature_define_whitelist.add('AP_AVOIDANCE_ENABLED')
feature_define_whitelist.add('AP_WINCH_ENABLED')
feature_define_whitelist.add('AP_WINCH_DAIWA_ENABLED')
feature_define_whitelist.add('AP_WINCH_PWM_ENABLED')
feature_define_whitelist.add(r'AP_MOTORS_FRAME_.*_ENABLED')

if target.lower() != "plane":
# only on Plane:
feature_define_whitelist.add('AP_ICENGINE_ENABLED')
feature_define_whitelist.add('AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED')
feature_define_whitelist.add('AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED')
feature_define_whitelist.add('AP_ADVANCEDFAILSAFE_ENABLED')
feature_define_whitelist.add('AP_TUNING_ENABLED')
feature_define_whitelist.add('HAL_LANDING_DEEPSTALL_ENABLED')
feature_define_whitelist.add('HAL_SOARING_ENABLED')
feature_define_whitelist.add('AP_PLANE_BLACKBOX_LOGGING')
feature_define_whitelist.add('QAUTOTUNE_ENABLED')
feature_define_whitelist.add('AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED')
feature_define_whitelist.add('HAL_QUADPLANE_ENABLED')
feature_define_whitelist.add('AP_BATTERY_WATT_MAX_ENABLED')

if target.lower() not in ["plane", "copter"]:
feature_define_whitelist.add('HAL_ADSB_ENABLED')
feature_define_whitelist.add('AP_LANDINGGEAR_ENABLED')
# only Plane and Copter instantiate Parachute
feature_define_whitelist.add('HAL_PARACHUTE_ENABLED')
# only Plane and Copter have AP_Motors:

if target.lower() not in ["rover", "copter"]:
# only Plane and Copter instantiate Beacon
feature_define_whitelist.add('AP_BEACON_ENABLED')

if target.lower() != "rover":
# only on Rover:
feature_define_whitelist.add('HAL_TORQEEDO_ENABLED')
feature_define_whitelist.add('AP_ROVER_ADVANCED_FAILSAFE_ENABLED')
if target.lower() != "sub":
# only on Sub:
feature_define_whitelist.add('AP_BARO_KELLERLD_ENABLED')
if target.lower() not in frozenset(["rover", "sub"]):
# only Rover and Sub get nmea airspeed
feature_define_whitelist.add('AP_AIRSPEED_NMEA_ENABLED')
if target.lower() not in frozenset(["copter", "rover"]):
feature_define_whitelist.add('HAL_SPRAYER_ENABLED')
feature_define_whitelist.add('HAL_PROXIMITY_ENABLED')
feature_define_whitelist.add('AP_PROXIMITY_.*_ENABLED')
feature_define_whitelist.add('AP_OAPATHPLANNER_ENABLED')

if target.lower() in ["blimp", "antennatracker"]:
# no airspeed on blimp/tracker
feature_define_whitelist.add(r'AP_AIRSPEED_.*_ENABLED')
feature_define_whitelist.add(r'HAL_MOUNT_ENABLED')
feature_define_whitelist.add(r'AP_MOUNT_.*_ENABLED')
feature_define_whitelist.add(r'HAL_MOUNT_.*_ENABLED')
feature_define_whitelist.add(r'HAL_SOLO_GIMBAL_ENABLED')
feature_define_whitelist.add(r'AP_OPTICALFLOW_ENABLED')
feature_define_whitelist.add(r'AP_OPTICALFLOW_.*_ENABLED')
feature_define_whitelist.add(r'HAL_MSP_OPTICALFLOW_ENABLED')
# missing calls to fence.check():
feature_define_whitelist.add(r'AP_FENCE_ENABLED')
# RPM not instantiated on Blimp or Rover:
feature_define_whitelist.add(r'AP_RPM_ENABLED')
feature_define_whitelist.add(r'AP_RPM_.*_ENABLED')
# rangefinder init is not called:
feature_define_whitelist.add(r'HAL_MSP_RANGEFINDER_ENABLED')
# these guys don't instantiate anything which uses sd-card storage:
feature_define_whitelist.add(r'AP_SDCARD_STORAGE_ENABLED')
feature_define_whitelist.add(r'AP_RANGEFINDER_ENABLED')
feature_define_whitelist.add(r'AP_RANGEFINDER_.*_ENABLED')

if target.lower() in ["blimp", "antennatracker", "sub"]:
# no OSD on Sub/blimp/tracker
feature_define_whitelist.add(r'OSD_ENABLED')
feature_define_whitelist.add(r'OSD_PARAM_ENABLED')
# AP_OSD is not instantiated, , so no MSP backend:
feature_define_whitelist.add(r'HAL_WITH_MSP_DISPLAYPORT')
# camera instantiated in specific vehicles:
feature_define_whitelist.add(r'AP_CAMERA_ENABLED')
feature_define_whitelist.add(r'AP_CAMERA_.*_ENABLED')
# button update is not called in these vehicles
feature_define_whitelist.add(r'HAL_BUTTON_ENABLED')
# precland not instantiated on these vehicles
feature_define_whitelist.add(r'AC_PRECLAND_ENABLED')
feature_define_whitelist.add(r'AC_PRECLAND_.*_ENABLED')
# RSSI is not initialised - probably should be for some
feature_define_whitelist.add(r'AP_RSSI_ENABLED')

if target.lower() in ["antennatracker", "sub"]:
# missing the init call to the relay library:
feature_define_whitelist.add(r'AP_RELAY_ENABLED')
feature_define_whitelist.add(r'AP_RC_CHANNEL_AUX_FUNCTION_STRINGS_ENABLED')

for some_re in feature_define_whitelist:
if re.match(some_re, define):
return True

def assert_feature_in_code(self, defines, feature):
# if the feature is truly disabled then extract_features.py
# should say so:
for target in self.build_targets:
path = self.target_to_elf_path(target)
extracter = extract_features.ExtractFeatures(path)
(compiled_in_feature_defines, not_compiled_in_feature_defines) = extracter.extract()
for define in defines:
if not defines[define]:
continue
if define in compiled_in_feature_defines:
continue
error = f"feature gated by {define} not compiled into ({target}); extract_features.py bug?"
if self.define_is_whitelisted_for_feature_in_code(target, define):
print("warn: " + error)
continue
raise ValueError(error)

def board(self):
'''returns board to build for'''
return self._board
Expand Down
11 changes: 4 additions & 7 deletions libraries/AP_Parachute/AP_Parachute.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
/// @brief Parachute release library
#pragma once

#include "AP_Parachute_config.h"

#if HAL_PARACHUTE_ENABLED

#include <AP_Param/AP_Param.h>
#include <AP_Common/AP_Common.h>

Expand All @@ -22,13 +26,6 @@
#define AP_PARACHUTE_CRITICAL_SINK_DEFAULT 0 // default critical sink speed in m/s to trigger emergency parachute
#define AP_PARACHUTE_OPTIONS_DEFAULT 0 // default parachute options: enabled disarm after parachute release

#ifndef HAL_PARACHUTE_ENABLED
// default to parachute enabled to match previous configs
#define HAL_PARACHUTE_ENABLED 1
#endif

#if HAL_PARACHUTE_ENABLED

/// @class AP_Parachute
/// @brief Class managing the release of a parachute
class AP_Parachute {
Expand Down
8 changes: 8 additions & 0 deletions libraries/AP_Parachute/AP_Parachute_config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once

#include <AP_HAL/AP_HAL_Boards.h>

#ifndef HAL_PARACHUTE_ENABLED
// default to parachute enabled to match previous configs
#define HAL_PARACHUTE_ENABLED 1
#endif
Loading
Loading