From 963a776fa620e5d8befce5a7d662273a4c411cd2 Mon Sep 17 00:00:00 2001 From: CaFeZn <99124093+CaFeZn@users.noreply.github.com> Date: Tue, 3 Mar 2026 05:13:08 +0800 Subject: [PATCH] feat(heater): Add multi-instance support for heaters (#26325) * heater: add multi-instance support, refactor parameter handling, remove legacy params file This change introduces multi-instance heater support to allow independent temperature control for multiple IMUs. Main changes: - Add support for multiple heater instances - Refactor parameter handling to use per-instance parameters - Remove the legacy parameter file and migrate to the updated parameter structure This improves scalability and makes heater configuration consistent across setups with multiple sensors. * Refactor heater configuration across multiple boards - Updated heater GPIO definitions to introduce a new naming convention for better clarity and consistency. - Replaced `GPIO_HEATER_OUTPUT` with `GPIO_HEATER1_OUTPUT` and adjusted the corresponding output enable macros. - Changed parameter names from `SENS_TEMP_ID` to `HEATER1_IMU_ID` in various board default configurations to reflect the new heater setup. - Ensured all affected board configurations are updated to maintain functionality with the new heater definitions. * heater: fix missing HEATER1_OUTPUT_EN control * heater: fix more missing HEATER1_OUTPUT_EN control * heater: tidy config, docs, and instance handling - Remove unused controller period member and use CONTROLLER_PERIOD_DEFAULT - Improve HEATER${i}_IMU_ID description and instance-related logging/behavior - Add a guard when HEATER_NUM exceeds HEATER_MAX_INSTANCES Note: drop intermediate/reverted change around the 'celsius' spelling. * heater: refactor constructor to remove unused parameter and add instance name function - Remove unused ModuleParams argument from Heater constructor - Add heater_instance_name() helper to provide per-instance work queue task names - Use instance-specific parameter lookup (HEATER{n}_*) during initialization Use heater_instance_name() to label each instance (heater_1/2/3) in work queue. Also drop unused ModuleParams argument from constructor and keep per-instance parameter handle lookup in initialization. * format * board: update GPIO configuration for multiple heater instances, add HEATER_NUM for boards using PX4IO * heater: update heater control to use HEATER1_OUTPUT_EN when using PX4IO for consistency * heater: add a TODO for px4io multi-instance * heater: update missing GPIO_HEATER1_OUTPUT in sky-drones * heater: fix multiple newlines at EOF (resolve CI check failure) * heater: switch to PublicationMulti for heater_status and log multi-instance - Changed _heater_status_pub from Publication to PublicationMulti to support independent per-instance publications without overwriting. - Updated logged_topics.cpp to use add_optional_topic_multi("heater_status") This fixes the issue where multiple heater instances were writing to the same heater_status topic, causing data overwriting and incorrect update rates in logs. --------- Co-authored-by: Jacob Dahl Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com> --- boards/accton-godwit/ga1/src/board_config.h | 8 +- boards/ark/fmu-v6x/init/rc.board_defaults | 4 +- boards/ark/fmu-v6x/src/board_config.h | 8 +- boards/ark/fpv/init/rc.board_defaults | 2 +- boards/ark/fpv/src/board_config.h | 8 +- boards/ark/pi6x/init/rc.board_defaults | 2 +- boards/ark/pi6x/src/board_config.h | 8 +- boards/atl/mantis-edu/src/board_config.h | 6 +- boards/auterion/fmu-v6x/src/board_config.h | 8 +- boards/cuav/fmu-v6x/src/board_config.h | 8 +- boards/cuav/nora/src/board_config.h | 8 +- boards/cuav/x25-evo/init/rc.board_defaults | 2 +- boards/cuav/x25-evo/src/board_config.h | 8 +- boards/cuav/x7pro/init/rc.board_defaults | 2 +- boards/cuav/x7pro/src/board_config.h | 8 +- .../cubeorange/init/rc.board_defaults | 2 +- .../cubepilot/cubeorange/src/board_config.h | 1 + .../cubeorangeplus/init/rc.board_sensors | 4 +- .../cubeorangeplus/src/board_config.h | 1 + boards/cubepilot/io-v2/src/board_config.h | 6 +- boards/cubepilot/io-v2/src/init.c | 4 +- boards/holybro/durandal-v1/src/board_config.h | 8 +- boards/holybro/pix32v5/src/board_config.h | 8 +- boards/narinfc/h7/init/rc.board_defaults | 2 +- boards/narinfc/h7/src/board_config.h | 8 +- boards/px4/fmu-v3/src/board_config.h | 1 + boards/px4/fmu-v4/src/board_config.h | 6 +- boards/px4/fmu-v4/src/init.c | 4 +- boards/px4/fmu-v5/src/board_config.h | 8 +- boards/px4/fmu-v5x/src/board_config.h | 8 +- boards/px4/fmu-v6c/src/board_config.h | 8 +- boards/px4/fmu-v6u/src/board_config.h | 8 +- boards/px4/fmu-v6x/src/board_config.h | 8 +- boards/px4/fmu-v6xrt/src/board_config.h | 10 +- boards/px4/io-v2/src/board_config.h | 6 +- boards/px4/io-v2/src/init.c | 4 +- boards/siyi/n7/src/board_config.h | 8 +- .../smartap-airlink/init/rc.board_defaults | 2 +- .../smartap-airlink/src/board_config.h | 8 +- .../sky-drones/smartap-airlink/src/init.cpp | 4 +- boards/svehicle/e2/src/board_config.h | 8 +- boards/uvify/core/src/board_config.h | 6 +- boards/uvify/core/src/init.c | 4 +- boards/xc-fly/xc-slam/src/board_config.h | 4 +- boards/xc-fly/xc-slim/src/board_config.h | 4 +- boards/zeroone/x6/src/board_config.h | 8 +- src/drivers/heater/CMakeLists.txt | 4 +- src/drivers/heater/heater.cpp | 499 +++++++++++++++--- src/drivers/heater/heater.h | 75 +-- src/drivers/heater/heater_params.c | 97 ---- src/drivers/heater/module.yaml | 90 ++++ src/modules/logger/logged_topics.cpp | 2 +- src/modules/px4iofirmware/px4io.cpp | 7 +- 53 files changed, 729 insertions(+), 306 deletions(-) delete mode 100644 src/drivers/heater/heater_params.c create mode 100644 src/drivers/heater/module.yaml diff --git a/boards/accton-godwit/ga1/src/board_config.h b/boards/accton-godwit/ga1/src/board_config.h index cffa2cc54d..021b73d331 100644 --- a/boards/accton-godwit/ga1/src/board_config.h +++ b/boards/accton-godwit/ga1/src/board_config.h @@ -221,8 +221,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -442,7 +444,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/ark/fmu-v6x/init/rc.board_defaults b/boards/ark/fmu-v6x/init/rc.board_defaults index 7b96f86974..1a625b5e11 100644 --- a/boards/ark/fmu-v6x/init/rc.board_defaults +++ b/boards/ark/fmu-v6x/init/rc.board_defaults @@ -26,12 +26,12 @@ param set-default UAVCAN_ESC_IFACE 2 if ver hwtypecmp ARKV6X000 then - param set-default SENS_TEMP_ID 2818058 + param set-default HEATER1_IMU_ID 2818058 fi if ver hwtypecmp ARKV6X001 then - param set-default SENS_TEMP_ID 3014666 + param set-default HEATER1_IMU_ID 3014666 fi safety_button start diff --git a/boards/ark/fmu-v6x/src/board_config.h b/boards/ark/fmu-v6x/src/board_config.h index a76d357c04..fca9cd57af 100644 --- a/boards/ark/fmu-v6x/src/board_config.h +++ b/boards/ark/fmu-v6x/src/board_config.h @@ -224,8 +224,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -436,7 +438,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/ark/fpv/init/rc.board_defaults b/boards/ark/fpv/init/rc.board_defaults index becc9e8979..bc2ba1b2c7 100644 --- a/boards/ark/fpv/init/rc.board_defaults +++ b/boards/ark/fpv/init/rc.board_defaults @@ -22,7 +22,7 @@ param set-default SENS_IMU_TEMP 10.0 if ver hwtypecmp ARKFPV000 then - param set-default SENS_TEMP_ID 3014666 + param set-default HEATER1_IMU_ID 3014666 fi param set-default BAT1_V_DIV 21.0 diff --git a/boards/ark/fpv/src/board_config.h b/boards/ark/fpv/src/board_config.h index 04e1cc03ec..b8a07fe271 100644 --- a/boards/ark/fpv/src/board_config.h +++ b/boards/ark/fpv/src/board_config.h @@ -205,8 +205,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -318,7 +320,7 @@ GPIO_HW_VER_REV_DRIVE, \ GPIO_CAN1_TX, \ GPIO_CAN1_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_VDD_5V_PGOOD, \ GPIO_VDD_12V_PGOOD, \ GPIO_VDD_12V_EN, \ diff --git a/boards/ark/pi6x/init/rc.board_defaults b/boards/ark/pi6x/init/rc.board_defaults index 9ddf3f88c4..2ccf61b688 100644 --- a/boards/ark/pi6x/init/rc.board_defaults +++ b/boards/ark/pi6x/init/rc.board_defaults @@ -31,7 +31,7 @@ param set-default UAVCAN_ESC_IFACE 1 if ver hwtypecmp ARKPI6X000 then # TODO: Add the correct sensor ID - param set-default SENS_TEMP_ID 2490378 + param set-default HEATER1_IMU_ID 2490378 fi param set-default EKF2_MULTI_IMU 0 diff --git a/boards/ark/pi6x/src/board_config.h b/boards/ark/pi6x/src/board_config.h index b6996ed883..73e7d7d176 100644 --- a/boards/ark/pi6x/src/board_config.h +++ b/boards/ark/pi6x/src/board_config.h @@ -188,8 +188,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -324,7 +326,7 @@ GPIO_HW_VER_REV_DRIVE, \ GPIO_CAN1_TX, \ GPIO_CAN1_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_VDD_5V_HIPOWER_nEN, \ GPIO_VDD_5V_HIPOWER_nOC, \ GPIO_VDD_3V3_SD_CARD_EN, \ diff --git a/boards/atl/mantis-edu/src/board_config.h b/boards/atl/mantis-edu/src/board_config.h index b8c1709a93..9f7bbcafbe 100644 --- a/boards/atl/mantis-edu/src/board_config.h +++ b/boards/atl/mantis-edu/src/board_config.h @@ -121,7 +121,9 @@ #define BOARD_REAR_LED_MASK (1 << 1) | (1 << 2) /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) #define BOARD_HAS_LED_PWM 1 #define BOARD_LED_PWM_DRIVE_ACTIVE_LOW 1 @@ -182,7 +184,7 @@ PX4_ADC_GPIO, \ GPIO_HW_REV_DRIVE, \ GPIO_HW_VER_DRIVE, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_VDD_3V3_SD_CARD_EN, \ GPIO_OTGFS_VBUS \ } diff --git a/boards/auterion/fmu-v6x/src/board_config.h b/boards/auterion/fmu-v6x/src/board_config.h index 671a1c3e5f..3ed583edd1 100644 --- a/boards/auterion/fmu-v6x/src/board_config.h +++ b/boards/auterion/fmu-v6x/src/board_config.h @@ -224,8 +224,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -443,7 +445,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/cuav/fmu-v6x/src/board_config.h b/boards/cuav/fmu-v6x/src/board_config.h index 4fea491131..fea8513544 100644 --- a/boards/cuav/fmu-v6x/src/board_config.h +++ b/boards/cuav/fmu-v6x/src/board_config.h @@ -230,8 +230,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -453,7 +455,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/cuav/nora/src/board_config.h b/boards/cuav/nora/src/board_config.h index 0f289730d2..5e524075fc 100644 --- a/boards/cuav/nora/src/board_config.h +++ b/boards/cuav/nora/src/board_config.h @@ -104,8 +104,10 @@ #define GPIO_CAN2_SILENT_S1 /* PH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN3) /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ #define DIRECT_PWM_OUTPUT_CHANNELS 14 @@ -212,7 +214,7 @@ GPIO_CAN2_RX, \ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_CAN, \ GPIO_nPOWER_IN_ADC, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/cuav/x25-evo/init/rc.board_defaults b/boards/cuav/x25-evo/init/rc.board_defaults index bae8be59e1..8b3e21f251 100644 --- a/boards/cuav/x25-evo/init/rc.board_defaults +++ b/boards/cuav/x25-evo/init/rc.board_defaults @@ -23,7 +23,7 @@ param set-default UAVCAN_SUB_BAT 1 # Enable IMU thermal control param set-default SENS_EN_THERMAL 1 param set-default SENS_IMU_TEMP 45 -param set-default SENS_TEMP_ID 2818058 +param set-default HEATER1_IMU_ID 2818058 # CUAV core board IMU thermal control param set-default CORE_IMU_TEMP 45 diff --git a/boards/cuav/x25-evo/src/board_config.h b/boards/cuav/x25-evo/src/board_config.h index 66a3963ea4..16c96e6d18 100644 --- a/boards/cuav/x25-evo/src/board_config.h +++ b/boards/cuav/x25-evo/src/board_config.h @@ -179,8 +179,10 @@ * PWM in future */ // IMU BOARD HEATER -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) // CORE BOARD HEATER #define GPIO_CORE_HEATER_OUTPUT /* PE6 T15CH2 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN6) #define CORE_HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_CORE_HEATER_OUTPUT, (on_true)) @@ -403,7 +405,7 @@ GPIO_CAN2_RX, \ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_CORE_HEATER_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ diff --git a/boards/cuav/x7pro/init/rc.board_defaults b/boards/cuav/x7pro/init/rc.board_defaults index c6235b2523..ccb50263bb 100644 --- a/boards/cuav/x7pro/init/rc.board_defaults +++ b/boards/cuav/x7pro/init/rc.board_defaults @@ -12,7 +12,7 @@ param set-default BAT2_A_PER_V 24 # Enable IMU thermal control param set-default SENS_EN_THERMAL 1 -param set-default SENS_TEMP_ID 6946850 +param set-default HEATER1_IMU_ID 6946850 rgbled_pwm start safety_button start diff --git a/boards/cuav/x7pro/src/board_config.h b/boards/cuav/x7pro/src/board_config.h index f8a1824ebc..e77d33ca38 100644 --- a/boards/cuav/x7pro/src/board_config.h +++ b/boards/cuav/x7pro/src/board_config.h @@ -104,8 +104,10 @@ #define GPIO_CAN2_SILENT_S1 /* PH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN3) /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ #define DIRECT_PWM_OUTPUT_CHANNELS 14 @@ -212,7 +214,7 @@ GPIO_CAN2_RX, \ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_CAN, \ GPIO_nPOWER_IN_ADC, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/cubepilot/cubeorange/init/rc.board_defaults b/boards/cubepilot/cubeorange/init/rc.board_defaults index 7f961cd33e..0bc5b5c763 100644 --- a/boards/cubepilot/cubeorange/init/rc.board_defaults +++ b/boards/cubepilot/cubeorange/init/rc.board_defaults @@ -12,6 +12,6 @@ param set-default BAT2_A_PER_V 17 # Disable IMU thermal control param set-default SENS_EN_THERMAL 0 -param set-default -s SENS_TEMP_ID 2621474 +param set-default -s HEATER1_IMU_ID 2621474 set IOFW "/etc/extras/cubepilot_io-v2_default.bin" diff --git a/boards/cubepilot/cubeorange/src/board_config.h b/boards/cubepilot/cubeorange/src/board_config.h index 87a5b3c4e5..2c0674475c 100644 --- a/boards/cubepilot/cubeorange/src/board_config.h +++ b/boards/cubepilot/cubeorange/src/board_config.h @@ -59,6 +59,7 @@ #define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ #define PX4IO_HEATER_ENABLED +#define HEATER_NUM 1 /* LEDs */ #define GPIO_nLED_AMBER /* PE12 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) diff --git a/boards/cubepilot/cubeorangeplus/init/rc.board_sensors b/boards/cubepilot/cubeorangeplus/init/rc.board_sensors index 8ef0bff121..5bc7ae7b9c 100644 --- a/boards/cubepilot/cubeorangeplus/init/rc.board_sensors +++ b/boards/cubepilot/cubeorangeplus/init/rc.board_sensors @@ -18,7 +18,7 @@ ms5611 -s -b 4 start if icm42688p -s -b 4 -R 10 -q start -c 15 then # We need to use the temperature of the first isolated IMU for heater control. - param set-default SENS_TEMP_ID 2490402 + param set-default HEATER1_IMU_ID 2490402 if ! icm20948 -s -b 4 -R 10 -M -q start then @@ -28,7 +28,7 @@ else icm45686 -s -b 4 -R 10 start -c 15 icm45686 -s -b 4 -R 6 start -c 13 - param set-default SENS_TEMP_ID 3407906 + param set-default HEATER1_IMU_ID 3407906 fi # SPI1, body-fixed diff --git a/boards/cubepilot/cubeorangeplus/src/board_config.h b/boards/cubepilot/cubeorangeplus/src/board_config.h index a77723b491..6e77fedb47 100644 --- a/boards/cubepilot/cubeorangeplus/src/board_config.h +++ b/boards/cubepilot/cubeorangeplus/src/board_config.h @@ -69,6 +69,7 @@ #define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ #define PX4IO_HEATER_ENABLED +#define HEATER_NUM 1 /* LEDs */ #define GPIO_nLED_AMBER /* PE12 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) diff --git a/boards/cubepilot/io-v2/src/board_config.h b/boards/cubepilot/io-v2/src/board_config.h index 913564eb4a..bd5dd00133 100644 --- a/boards/cubepilot/io-v2/src/board_config.h +++ b/boards/cubepilot/io-v2/src/board_config.h @@ -80,8 +80,10 @@ /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PB14 */ (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN14) -#define HEATER_OUTPUT_EN(on_true) stm32_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB14 */ (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN14) +#define HEATER1_OUTPUT_EN(on_true) stm32_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) #define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN10) diff --git a/boards/cubepilot/io-v2/src/init.c b/boards/cubepilot/io-v2/src/init.c index a623cf789d..e3268a411e 100644 --- a/boards/cubepilot/io-v2/src/init.c +++ b/boards/cubepilot/io-v2/src/init.c @@ -86,7 +86,7 @@ __EXPORT void stm32_boardinitialize(void) { /* configure GPIOs */ - stm32_configgpio(GPIO_HEATER_OUTPUT); + stm32_configgpio(GPIO_HEATER1_OUTPUT); /* LEDS - default to off */ stm32_configgpio(GPIO_LED_AMBER); @@ -141,5 +141,5 @@ __EXPORT void stm32_boardinitialize(void) stm32_configgpio(GPIO_PWM8); /* disable heater */ - HEATER_OUTPUT_EN(false); + HEATER1_OUTPUT_EN(false); } diff --git a/boards/holybro/durandal-v1/src/board_config.h b/boards/holybro/durandal-v1/src/board_config.h index 4f6369b8ce..ab7859f86c 100644 --- a/boards/holybro/durandal-v1/src/board_config.h +++ b/boards/holybro/durandal-v1/src/board_config.h @@ -170,8 +170,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ @@ -299,7 +301,7 @@ GPIO_CAN2_RX, \ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/holybro/pix32v5/src/board_config.h b/boards/holybro/pix32v5/src/board_config.h index 67b3909f78..fb15ab300a 100644 --- a/boards/holybro/pix32v5/src/board_config.h +++ b/boards/holybro/pix32v5/src/board_config.h @@ -204,8 +204,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PI0 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -409,7 +411,7 @@ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ GPIO_CAN3_SILENT_S2, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/narinfc/h7/init/rc.board_defaults b/boards/narinfc/h7/init/rc.board_defaults index c6235b2523..ccb50263bb 100644 --- a/boards/narinfc/h7/init/rc.board_defaults +++ b/boards/narinfc/h7/init/rc.board_defaults @@ -12,7 +12,7 @@ param set-default BAT2_A_PER_V 24 # Enable IMU thermal control param set-default SENS_EN_THERMAL 1 -param set-default SENS_TEMP_ID 6946850 +param set-default HEATER1_IMU_ID 6946850 rgbled_pwm start safety_button start diff --git a/boards/narinfc/h7/src/board_config.h b/boards/narinfc/h7/src/board_config.h index f8a1824ebc..e77d33ca38 100644 --- a/boards/narinfc/h7/src/board_config.h +++ b/boards/narinfc/h7/src/board_config.h @@ -104,8 +104,10 @@ #define GPIO_CAN2_SILENT_S1 /* PH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTH|GPIO_PIN3) /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA8 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN8) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ #define DIRECT_PWM_OUTPUT_CHANNELS 14 @@ -212,7 +214,7 @@ GPIO_CAN2_RX, \ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_CAN, \ GPIO_nPOWER_IN_ADC, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v3/src/board_config.h b/boards/px4/fmu-v3/src/board_config.h index 3c12d70e13..116b10571b 100644 --- a/boards/px4/fmu-v3/src/board_config.h +++ b/boards/px4/fmu-v3/src/board_config.h @@ -164,6 +164,7 @@ * Connected to the IO MCU; tell compiler to enable support */ #define PX4IO_HEATER_ENABLED +#define HEATER_NUM 1 __BEGIN_DECLS diff --git a/boards/px4/fmu-v4/src/board_config.h b/boards/px4/fmu-v4/src/board_config.h index ef6571d84d..60475ab18b 100644 --- a/boards/px4/fmu-v4/src/board_config.h +++ b/boards/px4/fmu-v4/src/board_config.h @@ -140,8 +140,10 @@ /* Heater pins */ #define GPIO_HEATER_INPUT (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTC|GPIO_PIN6) -#define GPIO_HEATER_OUTPUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* Power switch controls */ diff --git a/boards/px4/fmu-v4/src/init.c b/boards/px4/fmu-v4/src/init.c index 6c3ee01335..471c3b271e 100644 --- a/boards/px4/fmu-v4/src/init.c +++ b/boards/px4/fmu-v4/src/init.c @@ -222,7 +222,7 @@ stm32_boardinitialize(void) // Configure heater GPIO. stm32_configgpio(GPIO_HEATER_INPUT); - stm32_configgpio(GPIO_HEATER_OUTPUT); + stm32_configgpio(GPIO_HEATER1_OUTPUT); } /**************************************************************************** @@ -283,7 +283,7 @@ __EXPORT int board_app_initialize(uintptr_t arg) } // Power down the heater. - stm32_gpiowrite(GPIO_HEATER_OUTPUT, 0); + stm32_gpiowrite(GPIO_HEATER1_OUTPUT, 0); // Configure SPI-based devices. spi1 = stm32_spibus_initialize(1); diff --git a/boards/px4/fmu-v5/src/board_config.h b/boards/px4/fmu-v5/src/board_config.h index 8246664dec..c081ada5dd 100644 --- a/boards/px4/fmu-v5/src/board_config.h +++ b/boards/px4/fmu-v5/src/board_config.h @@ -209,8 +209,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PI0 is nARMED @@ -426,7 +428,7 @@ GPIO_CAN1_SILENT_S0, \ GPIO_CAN2_SILENT_S1, \ GPIO_CAN3_SILENT_S2, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v5x/src/board_config.h b/boards/px4/fmu-v5x/src/board_config.h index 846d8e0b6a..8b52624f05 100644 --- a/boards/px4/fmu-v5x/src/board_config.h +++ b/boards/px4/fmu-v5x/src/board_config.h @@ -196,8 +196,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PC12 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -399,7 +401,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v6c/src/board_config.h b/boards/px4/fmu-v6c/src/board_config.h index 87806d3ed7..52429dc1e4 100644 --- a/boards/px4/fmu-v6c/src/board_config.h +++ b/boards/px4/fmu-v6c/src/board_config.h @@ -154,8 +154,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB9 T17CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB9 T17CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ @@ -257,7 +259,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v6u/src/board_config.h b/boards/px4/fmu-v6u/src/board_config.h index a61f2a5a57..4aba129431 100644 --- a/boards/px4/fmu-v6u/src/board_config.h +++ b/boards/px4/fmu-v6u/src/board_config.h @@ -179,8 +179,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PA2 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN2) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA2 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN2) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -368,7 +370,7 @@ GPIO_HW_VER_REV_DRIVE, \ GPIO_CAN1_TX, \ GPIO_CAN1_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v6x/src/board_config.h b/boards/px4/fmu-v6x/src/board_config.h index 3259c421d5..99c949a2b9 100644 --- a/boards/px4/fmu-v6x/src/board_config.h +++ b/boards/px4/fmu-v6x/src/board_config.h @@ -230,8 +230,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -444,7 +446,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/px4/fmu-v6xrt/src/board_config.h b/boards/px4/fmu-v6xrt/src/board_config.h index 85221803a8..790034d188 100644 --- a/boards/px4/fmu-v6xrt/src/board_config.h +++ b/boards/px4/fmu-v6xrt/src/board_config.h @@ -308,9 +308,11 @@ * PWM in future */ #define HEATER_IOMUX (IOMUX_CMOS_OUTPUT | IOMUX_PULL_NONE | IOMUX_SLEW_FAST) -//#define GPIO_HEATER_OUTPUT /* GPIO_EMC_B2_17 QTIMER3 TIMER0 GPIO2_IO27 */ (GPIO_QTIMER3_TIMER0_3 | HEATER_IOMUX) -#define GPIO_HEATER_OUTPUT /* GPIO_EMC_B2_17 GPIO2_IO27 */ (GPIO_PORT2 | GPIO_PIN27 | GPIO_OUTPUT | HEATER_IOMUX) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +//#define GPIO_HEATER1_OUTPUT /* GPIO_EMC_B2_17 QTIMER3 TIMER0 GPIO2_IO27 */ (GPIO_QTIMER3_TIMER0_3 | HEATER_IOMUX) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* GPIO_EMC_B2_17 GPIO2_IO27 */ (GPIO_PORT2 | GPIO_PIN27 | GPIO_OUTPUT | HEATER_IOMUX) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* nARMED GPIO1_IO17 * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -573,7 +575,7 @@ GPIO_FLEXCAN2_RX, \ GPIO_FLEXCAN3_TX, \ GPIO_FLEXCAN3_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_FMU_CAP1, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ diff --git a/boards/px4/io-v2/src/board_config.h b/boards/px4/io-v2/src/board_config.h index e934397996..f5f5c62bd1 100644 --- a/boards/px4/io-v2/src/board_config.h +++ b/boards/px4/io-v2/src/board_config.h @@ -100,8 +100,10 @@ /* HEATER */ -#define GPIO_HEATER_OUTPUT /* PB14 */ (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN14) -#define HEATER_OUTPUT_EN(on_true) (SENSE_PIXHAWK2() ? stm32_gpiowrite(GPIO_HEATER_OUTPUT, !(on_true)) : (void)0) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB14 */ (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN14) +#define HEATER1_OUTPUT_EN(on_true) (SENSE_PIXHAWK2() ? stm32_gpiowrite(GPIO_HEATER1_OUTPUT, !(on_true)) : (void)0) #define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN10) diff --git a/boards/px4/io-v2/src/init.c b/boards/px4/io-v2/src/init.c index 8729d7ef94..8b011c2919 100644 --- a/boards/px4/io-v2/src/init.c +++ b/boards/px4/io-v2/src/init.c @@ -96,7 +96,7 @@ __EXPORT void stm32_boardinitialize(void) by allowing to disable the LED / heater. */ if (SENSE_PIXHAWK2()) { - stm32_configgpio(GPIO_HEATER_OUTPUT); + stm32_configgpio(GPIO_HEATER1_OUTPUT); } else { stm32_configgpio(GPIO_LED_BLUE); @@ -159,5 +159,5 @@ __EXPORT void stm32_boardinitialize(void) stm32_configgpio(GPIO_PWM8); /* disable heater */ - HEATER_OUTPUT_EN(false); + HEATER1_OUTPUT_EN(false); } diff --git a/boards/siyi/n7/src/board_config.h b/boards/siyi/n7/src/board_config.h index e705c87890..fa9b83d778 100644 --- a/boards/siyi/n7/src/board_config.h +++ b/boards/siyi/n7/src/board_config.h @@ -139,8 +139,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PA7 T14CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PWM */ @@ -245,7 +247,7 @@ GPIO_CAN1_TX, \ GPIO_CAN1_RX, \ GPIO_CAN1_SILENT_S0, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_VDD_5V_PERIPH_nEN, \ diff --git a/boards/sky-drones/smartap-airlink/init/rc.board_defaults b/boards/sky-drones/smartap-airlink/init/rc.board_defaults index 56acfa92fd..5655311c0c 100644 --- a/boards/sky-drones/smartap-airlink/init/rc.board_defaults +++ b/boards/sky-drones/smartap-airlink/init/rc.board_defaults @@ -10,7 +10,7 @@ param set-default SER_TEL2_BAUD 921600 # 921600 # Temperature stabilization param set-default SENS_EN_THERMAL 1 # Enable heater -param set-default SENS_TEMP_ID 2359314 # Heated IMU ID +param set-default HEATER1_IMU_ID 2359314 # Heated IMU ID # Battery scaling param set-default BAT1_N_CELLS 4 diff --git a/boards/sky-drones/smartap-airlink/src/board_config.h b/boards/sky-drones/smartap-airlink/src/board_config.h index 158fece58c..d74d40a68f 100644 --- a/boards/sky-drones/smartap-airlink/src/board_config.h +++ b/boards/sky-drones/smartap-airlink/src/board_config.h @@ -178,8 +178,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PC12 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -335,7 +337,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_VDD_3V5_LTE_nEN, \ GPIO_VDD_3V5_LTE_nOC, \ GPIO_VDD_5V_HIPOWER_nEN, \ diff --git a/boards/sky-drones/smartap-airlink/src/init.cpp b/boards/sky-drones/smartap-airlink/src/init.cpp index 73a9582f9b..07aab31e64 100644 --- a/boards/sky-drones/smartap-airlink/src/init.cpp +++ b/boards/sky-drones/smartap-airlink/src/init.cpp @@ -253,8 +253,8 @@ __EXPORT int board_app_initialize(uintptr_t arg) } // Power down the heater - px4_arch_configgpio(GPIO_HEATER_OUTPUT); - px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, 1); + px4_arch_configgpio(GPIO_HEATER1_OUTPUT); + px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, 1); #ifdef CONFIG_MMCSD int ret = stm32_sdio_initialize(); diff --git a/boards/svehicle/e2/src/board_config.h b/boards/svehicle/e2/src/board_config.h index 98677855c9..bb06d291c2 100644 --- a/boards/svehicle/e2/src/board_config.h +++ b/boards/svehicle/e2/src/board_config.h @@ -219,8 +219,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -410,7 +412,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/boards/uvify/core/src/board_config.h b/boards/uvify/core/src/board_config.h index 22708b23e2..fcfaff7ac0 100644 --- a/boards/uvify/core/src/board_config.h +++ b/boards/uvify/core/src/board_config.h @@ -139,8 +139,10 @@ /* Heater pins (reserved) */ #define GPIO_HEATER_INPUT (GPIO_INPUT|GPIO_PULLDOWN|GPIO_PORTC|GPIO_PIN6) -#define GPIO_HEATER_OUTPUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* Power switch controls */ diff --git a/boards/uvify/core/src/init.c b/boards/uvify/core/src/init.c index 6fb6034fba..74c04e643c 100644 --- a/boards/uvify/core/src/init.c +++ b/boards/uvify/core/src/init.c @@ -222,7 +222,7 @@ stm32_boardinitialize(void) // Configure heater GPIO. stm32_configgpio(GPIO_HEATER_INPUT); - stm32_configgpio(GPIO_HEATER_OUTPUT); + stm32_configgpio(GPIO_HEATER1_OUTPUT); } /**************************************************************************** @@ -283,7 +283,7 @@ __EXPORT int board_app_initialize(uintptr_t arg) } // Power down the heater. - stm32_gpiowrite(GPIO_HEATER_OUTPUT, 0); + stm32_gpiowrite(GPIO_HEATER1_OUTPUT, 0); // Configure SPI-based devices. spi1 = stm32_spibus_initialize(1); diff --git a/boards/xc-fly/xc-slam/src/board_config.h b/boards/xc-fly/xc-slam/src/board_config.h index e5f6084ee9..94c52d9489 100644 --- a/boards/xc-fly/xc-slam/src/board_config.h +++ b/boards/xc-fly/xc-slam/src/board_config.h @@ -115,8 +115,8 @@ // /* HEATER PA15 TIM2_CH1 // * PWM in future // */ -// #define GPIO_HEATER_OUTPUT /* PA15 T2CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) -// #define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +// #define GPIO_HEATER1_OUTPUT /* PA15 T2CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) +// #define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) diff --git a/boards/xc-fly/xc-slim/src/board_config.h b/boards/xc-fly/xc-slim/src/board_config.h index e5f6084ee9..94c52d9489 100644 --- a/boards/xc-fly/xc-slim/src/board_config.h +++ b/boards/xc-fly/xc-slim/src/board_config.h @@ -115,8 +115,8 @@ // /* HEATER PA15 TIM2_CH1 // * PWM in future // */ -// #define GPIO_HEATER_OUTPUT /* PA15 T2CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) -// #define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +// #define GPIO_HEATER1_OUTPUT /* PA15 T2CH1 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) +// #define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) diff --git a/boards/zeroone/x6/src/board_config.h b/boards/zeroone/x6/src/board_config.h index 114c3ce101..8c1235826f 100644 --- a/boards/zeroone/x6/src/board_config.h +++ b/boards/zeroone/x6/src/board_config.h @@ -226,8 +226,10 @@ /* HEATER * PWM in future */ -#define GPIO_HEATER_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) -#define HEATER_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER_OUTPUT, (on_true)) +#define GPIO_HEATER_OUTPUT +#define HEATER_NUM 1 +#define GPIO_HEATER1_OUTPUT /* PB10 T2CH3 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10) +#define HEATER1_OUTPUT_EN(on_true) px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, (on_true)) /* PE6 is nARMED * The GPIO will be set as input while not armed HW will have external HW Pull UP. @@ -442,7 +444,7 @@ GPIO_CAN1_RX, \ GPIO_CAN2_TX, \ GPIO_CAN2_RX, \ - GPIO_HEATER_OUTPUT, \ + GPIO_HEATER1_OUTPUT, \ GPIO_nPOWER_IN_A, \ GPIO_nPOWER_IN_B, \ GPIO_nPOWER_IN_C, \ diff --git a/src/drivers/heater/CMakeLists.txt b/src/drivers/heater/CMakeLists.txt index 6f1fe2e249..66450571b2 100644 --- a/src/drivers/heater/CMakeLists.txt +++ b/src/drivers/heater/CMakeLists.txt @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (c) 2016 PX4 Development Team. All rights reserved. +# Copyright (c) 2015-2026 PX4 Development Team. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -36,4 +36,6 @@ px4_add_module( COMPILE_FLAGS SRCS heater.cpp + MODULE_CONFIG + module.yaml ) diff --git a/src/drivers/heater/heater.cpp b/src/drivers/heater/heater.cpp index f11bc46782..53360172ee 100644 --- a/src/drivers/heater/heater.cpp +++ b/src/drivers/heater/heater.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2018-20 PX4 Development Team. All rights reserved. + * Copyright (c) 2018-2026 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -48,47 +48,81 @@ #include #include -ModuleBase::Descriptor Heater::desc{task_spawn, custom_command, print_usage}; - #if defined(BOARD_USES_PX4IO_VERSION) and defined(PX4IO_HEATER_ENABLED) // Heater on some boards is on IO MCU // Use ioctl calls to IO driver to turn heater on/off +// TODO: Multi-instance heater for PX4IO to be implemented # define HEATER_PX4IO #else // Use direct calls to turn GPIO pin on/off # ifndef GPIO_HEATER_OUTPUT # error "To use the heater driver, the board_config.h must define and initialize GPIO_HEATER_OUTPUT" # endif +# if !(HEATER_NUM >=1 && HEATER_NUM <=3) +# error "HEATER_NUM must be defined 1, 2, or 3 in the board_config.h" +# endif +# if HEATER_NUM >= 1 +# ifndef GPIO_HEATER1_OUTPUT +# error "The board_config.h must define every heater's GPIO" +# endif +# endif +# if HEATER_NUM >= 2 +# ifndef GPIO_HEATER2_OUTPUT +# error "The board_config.h must define every heater's GPIO" +# endif +# endif +# if HEATER_NUM == 3 +# ifndef GPIO_HEATER3_OUTPUT +# error "The board_config.h must define every heater's GPIO" +# endif +# endif # define HEATER_GPIO #endif -Heater::Heater() : +Heater *Heater::g_heater[HEATER_MAX_INSTANCES] {}; //! 0-based + +Heater::Heater(uint8_t instance) : + ScheduledWorkItem(heater_instance_name(instance), px4::wq_configurations::lp_default), ModuleParams(nullptr), - ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::lp_default) + _instance(instance) { - _heater_status_pub.advertise(); + initialize_heater_io(); + + char name[32]; + + // Dynamically locate the parameter handle corresponding to the current instance + snprintf(name, sizeof(name), "HEATER%u_IMU_ID", (unsigned)_instance); + _param_handles.imu_id = param_find(name); // + + snprintf(name, sizeof(name), "HEATER%u_TEMP", (unsigned)_instance); + _param_handles.temp = param_find(name); // + + snprintf(name, sizeof(name), "HEATER%u_TEMP_P", (unsigned)_instance); + _param_handles.temp_p = param_find(name); // + + snprintf(name, sizeof(name), "HEATER%u_TEMP_I", (unsigned)_instance); + _param_handles.temp_i = param_find(name); // + + snprintf(name, sizeof(name), "HEATER%u_TEMP_FF", (unsigned)_instance); + _param_handles.temp_ff = param_find(name); // + + _heater_status_pub.advertise(); // + + // Initialization parameter values + update_params(true); } Heater::~Heater() { disable_heater(); -} - -int Heater::custom_command(int argc, char *argv[]) -{ - // Check if the driver is running. - if (!is_running(desc)) { - PX4_INFO("not running"); - return PX4_ERROR; - } - - return print_usage("Unrecognized command."); + ScheduleClear(); } void Heater::disable_heater() { // Reset heater to off state. #ifdef HEATER_PX4IO + // TODO: Multi-instance heater for PX4IO to be implemented if (_io_fd >= 0) { px4_ioctl(_io_fd, PX4IO_HEATER_CONTROL, HEATER_MODE_DISABLED); } @@ -96,7 +130,30 @@ void Heater::disable_heater() #endif #ifdef HEATER_GPIO - px4_arch_configgpio(GPIO_HEATER_OUTPUT); + + switch (_instance) { + case 1 : +#ifdef GPIO_HEATER1_OUTPUT + px4_arch_configgpio(GPIO_HEATER1_OUTPUT); +#endif + break; + + case 2 : +#ifdef GPIO_HEATER2_OUTPUT + px4_arch_configgpio(GPIO_HEATER2_OUTPUT); +#endif + break; + + case 3 : +#ifdef GPIO_HEATER3_OUTPUT + px4_arch_configgpio(GPIO_HEATER3_OUTPUT); +#endif + break; + + default: + break; + } + #endif } @@ -104,6 +161,7 @@ void Heater::initialize_heater_io() { // Initialize heater to off state. #ifdef HEATER_PX4IO + // TODO: Multi-instance heater for PX4IO to be implemented if (_io_fd < 0) { _io_fd = px4_open(IO_HEATER_DEVICE_PATH, O_RDWR); } @@ -115,7 +173,30 @@ void Heater::initialize_heater_io() #endif #ifdef HEATER_GPIO - px4_arch_configgpio(GPIO_HEATER_OUTPUT); + + switch (_instance) { + case 1 : +#ifdef GPIO_HEATER1_OUTPUT + px4_arch_configgpio(GPIO_HEATER1_OUTPUT); +#endif + break; + + case 2 : +#ifdef GPIO_HEATER2_OUTPUT + px4_arch_configgpio(GPIO_HEATER2_OUTPUT); +#endif + break; + + case 3 : +#ifdef GPIO_HEATER3_OUTPUT + px4_arch_configgpio(GPIO_HEATER3_OUTPUT); +#endif + break; + + default: + break; + } + #endif } @@ -123,6 +204,7 @@ void Heater::heater_off() { #ifdef HEATER_PX4IO + // TODO: Multi-instance heater for PX4IO to be implemented if (_io_fd >= 0) { px4_ioctl(_io_fd, PX4IO_HEATER_CONTROL, HEATER_MODE_OFF); } @@ -130,7 +212,33 @@ void Heater::heater_off() #endif #ifdef HEATER_GPIO - HEATER_OUTPUT_EN(false); + + switch (_instance) { + case 1 : +#ifdef GPIO_HEATER1_OUTPUT + HEATER1_OUTPUT_EN(false); + // px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, false); +#endif + break; + + case 2 : +#ifdef GPIO_HEATER2_OUTPUT + HEATER2_OUTPUT_EN(false); + // px4_arch_gpiowrite(GPIO_HEATER2_OUTPUT, false); +#endif + break; + + case 3 : +#ifdef GPIO_HEATER3_OUTPUT + HEATER3_OUTPUT_EN(false); + // px4_arch_gpiowrite(GPIO_HEATER3_OUTPUT, false); +#endif + break; + + default: + break; + } + #endif } @@ -138,6 +246,7 @@ void Heater::heater_on() { #ifdef HEATER_PX4IO + // TODO: Multi-instance heater for PX4IO to be implemented if (_io_fd >= 0) { px4_ioctl(_io_fd, PX4IO_HEATER_CONTROL, HEATER_MODE_ON); } @@ -145,35 +254,106 @@ void Heater::heater_on() #endif #ifdef HEATER_GPIO - HEATER_OUTPUT_EN(true); + + switch (_instance) { + case 1 : +# ifdef GPIO_HEATER1_OUTPUT + HEATER1_OUTPUT_EN(true); + // px4_arch_gpiowrite(GPIO_HEATER1_OUTPUT, true); +# endif + break; + + case 2 : +# ifdef GPIO_HEATER2_OUTPUT + HEATER2_OUTPUT_EN(true); + // px4_arch_gpiowrite(GPIO_HEATER2_OUTPUT, true); +# endif + break; + + case 3 : +# ifdef GPIO_HEATER3_OUTPUT + HEATER3_OUTPUT_EN(true); + // px4_arch_gpiowrite(GPIO_HEATER3_OUTPUT, true); +# endif + break; + + default: + break; + } + #endif } bool Heater::initialize_topics() { - for (uint8_t i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) { - uORB::SubscriptionData sensor_accel_sub{ORB_ID(sensor_accel), i}; + // Force a single read of the parameters to ensure _params.imu_id is already up to date. + update_params(true); - if (sensor_accel_sub.get().timestamp != 0 && - sensor_accel_sub.get().device_id != 0 && - PX4_ISFINITE(sensor_accel_sub.get().temperature)) { + if (!_heater_initialized) { + PX4_ERR("heater %u: params not initialized", (unsigned)_instance); + return false; + } - // If the correct ID is found, exit the for-loop with _sensor_accel_sub pointing to the correct instance. - if (sensor_accel_sub.get().device_id == (uint32_t)_param_sens_temp_id.get()) { - _sensor_accel_sub.ChangeInstance(i); - _sensor_device_id = sensor_accel_sub.get().device_id; - initialize_heater_io(); - return true; - } + const int32_t target = _params.imu_id; + + // Scan multiple instances of accel, matching device_id or auto-select + int8_t selected_instance = -1; + sensor_accel_s accel{}; + + + for (uint8_t i = 0; i < HEATER_MAX_INSTANCES; i++) { + uORB::Subscription s{ORB_ID(sensor_accel), i}; + + if (!s.advertised()) { + continue; + } + + sensor_accel_s a{}; + + if (!s.copy(&a)) { + continue; + } + + if (target == 0) { + // Select the first available option + selected_instance = i; + accel = a; + break; + } + + if ((uint32_t)target == a.device_id) { + selected_instance = i; + accel = a; + break; } } - return false; + if (selected_instance < 0) { + if (target == 0) { + PX4_ERR("heater %u: no sensor_accel instances available", (unsigned)_instance); + + } else { + PX4_ERR("heater %u: no accel matches device_id=%ld", (unsigned)_instance, (long)target); + } + + return false; + } + + _sensor_device_id = accel.device_id; + + // Switch subscription to this instance + _sensor_accel_sub.ChangeInstance(selected_instance); + PX4_INFO("heater %u bound accel instance %d (device_id=%lu)", + (unsigned)_instance, selected_instance, (unsigned long)_sensor_device_id); + + return true; } + + void Heater::Run() { - if (should_exit()) { + if (_should_exit) { #if defined(HEATER_PX4IO) // must be closed from wq thread @@ -182,7 +362,13 @@ void Heater::Run() } #endif - exit_and_cleanup(desc); + ScheduleClear(); + + // Ensure heating is turned off (avoid leaving it in the ON position). + heater_off(); + + delete Heater::g_heater[_instance - 1]; + Heater::g_heater[_instance - 1] = nullptr; return; } @@ -209,16 +395,16 @@ void Heater::Run() // Update the current IMU sensor temperature if valid. if (PX4_ISFINITE(sensor_accel.temperature)) { - temperature_delta = _param_sens_imu_temp.get() - sensor_accel.temperature; + temperature_delta = _params.temp - sensor_accel.temperature; _temperature_last = sensor_accel.temperature; } - _proportional_value = temperature_delta * _param_sens_imu_temp_p.get(); - _integrator_value += temperature_delta * _param_sens_imu_temp_i.get(); + _proportional_value = temperature_delta * _params.temp_p; + _integrator_value += temperature_delta * _params.temp_i; _integrator_value = math::constrain(_integrator_value, -0.25f, 0.25f); - _controller_time_on_usec = static_cast((_param_sens_imu_temp_ff.get() + _proportional_value + + _controller_time_on_usec = static_cast((_params.temp_ff + _proportional_value + _integrator_value) * static_cast(CONTROLLER_PERIOD_DEFAULT)); _controller_time_on_usec = math::constrain(_controller_time_on_usec, 0, CONTROLLER_PERIOD_DEFAULT); @@ -231,16 +417,9 @@ void Heater::Run() _temperature_target_met = false; } - if (_controller_time_on_usec > 0) { - // Turn the heater on. - _heater_on = true; - heater_on(); - ScheduleDelayed(_controller_time_on_usec); - - } else { - // Turn the heater off. - ScheduleDelayed(CONTROLLER_PERIOD_DEFAULT); - } + _heater_on = true; + heater_on(); + ScheduleDelayed(_controller_time_on_usec); } publish_status(); @@ -252,13 +431,13 @@ void Heater::publish_status() status.device_id = _sensor_device_id; status.heater_on = _heater_on; status.temperature_sensor = _temperature_last; - status.temperature_target = _param_sens_imu_temp.get(); + status.temperature_target = _params.temp; status.temperature_target_met = _temperature_target_met; status.controller_period_usec = CONTROLLER_PERIOD_DEFAULT; status.controller_time_on_usec = _controller_time_on_usec; status.proportional_value = _proportional_value; status.integrator_value = _integrator_value; - status.feed_forward_value = _param_sens_imu_temp_ff.get(); + status.feed_forward_value = _params.temp_ff; #ifdef HEATER_PX4IO status.mode = heater_status_s::MODE_PX4IO; @@ -273,32 +452,135 @@ void Heater::publish_status() int Heater::start() { - // Exit the driver if the sensor ID does not match the desired sensor. - if (_param_sens_temp_id.get() == 0) { - PX4_ERR("Valid SENS_TEMP_ID required"); - request_stop(); - return PX4_ERROR; + update_params(true); + + const int32_t target = _params.imu_id; + + // Disabled instance + if (target < 0) { + PX4_INFO("heater %u disabled (HEATER%u_IMU_ID=%ld)", + (unsigned)_instance, (unsigned)_instance, (long)target); + return PX4_OK; + } + + // Auto-select only allowed for legacy single-heater setups + if ((target == 0) && (HEATER_NUM > 1)) { + PX4_INFO("heater %u disabled (HEATER%u_IMU_ID=0 not allowed when HEATER_NUM>1)", + (unsigned)_instance, (unsigned)_instance); + return PX4_OK; } - update_params(true); ScheduleNow(); return PX4_OK; } -int Heater::task_spawn(int argc, char *argv[]) +void Heater::stop() { - Heater *heater = new Heater(); + _should_exit = true; + heater_off(); + ScheduleNow(); +} - if (!heater) { - PX4_ERR("driver allocation failed"); +int Heater::status(uint8_t instance) +{ + + if (instance > 0 && instance <= HEATER_MAX_INSTANCES) { + if (Heater::is_running_instance(instance)) { + PX4_INFO("instance %u: running", (unsigned)instance); + PX4_INFO("instance %u: IMU ID is %lu", (unsigned)instance, Heater::g_heater[instance - 1]->_sensor_device_id); + PX4_INFO("instance %u: IMU Temperature is %f", (unsigned)instance, (double)Heater::g_heater[instance - 1]->_temperature_last); + PX4_INFO("instance %u: Set Temperature is %f", (unsigned)instance, (double)Heater::g_heater[instance - 1]->_params.temp); + + } + + } else { + for (instance = 1; instance <= HEATER_MAX_INSTANCES; instance++) { + if (Heater::is_running_instance(instance)) { + PX4_INFO("instance %u: running", (unsigned)instance); + PX4_INFO("instance %u: IMU ID is %lu", (unsigned)instance, Heater::g_heater[instance - 1]->_sensor_device_id); + PX4_INFO("instance %u: IMU Temperature is %f", (unsigned)instance, (double)Heater::g_heater[instance - 1]->_temperature_last); + PX4_INFO("instance %u: Set Temperature is %f", (unsigned)instance, (double)Heater::g_heater[instance - 1]->_params.temp); + } + } + } + + return PX4_OK; +} + +const char *Heater::heater_instance_name(uint8_t inst) +{ + switch (inst) { + case 1: return "heater_1"; + + case 2: return "heater_2"; + + case 3: return "heater_3"; + + default: return "heater"; + } +} + + +int Heater::stop_all() +{ + for (uint8_t i = 0; i < HEATER_MAX_INSTANCES; i++) { + if (Heater::g_heater[i]) { + Heater::g_heater[i]->stop(); + } + } + + PX4_INFO("All heater stoped"); + + return PX4_OK; +} + +bool Heater::is_running_instance(uint8_t instance) +{ + if (instance < 1 || instance > HEATER_MAX_INSTANCES) { + return false; + } + + return Heater::g_heater[instance - 1] != nullptr; +} + +bool Heater::is_running_any() +{ + for (uint8_t i = 0; i < HEATER_MAX_INSTANCES; i++) { + if (Heater::g_heater[i] != nullptr) { return true; } + } + + return false; +} + +int Heater::start_instance(uint8_t instance) +{ + if (instance < 1 || instance > HEATER_NUM) { + PX4_ERR("invalid instance %u", (unsigned)instance); return PX4_ERROR; } - desc.object.store(heater); - desc.task_id = task_id_is_work_queue; + if (Heater::is_running_instance(instance)) { + PX4_WARN("heater %u already running", (unsigned)instance); + return PX4_OK; + } - heater->start(); - return 0; + Heater *h = new Heater(instance); + + if (!h) { + PX4_ERR("alloc failed"); + return PX4_ERROR; + } + + int ret = h->start(); + + if (ret != PX4_OK) { + h->stop(); + delete h; + return ret; + } + + Heater::g_heater[instance - 1] = h; + return PX4_OK; } void Heater::update_params(const bool force) @@ -309,10 +591,31 @@ void Heater::update_params(const bool force) _parameter_update_sub.copy(¶m_update); // update parameters from storage - ModuleParams::updateParams(); + if (_param_handles.imu_id != PARAM_INVALID) { + param_get(_param_handles.imu_id, &_params.imu_id); + } + + if (_param_handles.temp != PARAM_INVALID) { + param_get(_param_handles.temp, &_params.temp); + } + + if (_param_handles.temp_p != PARAM_INVALID) { + param_get(_param_handles.temp_p, &_params.temp_p); + } + + if (_param_handles.temp_i != PARAM_INVALID) { + param_get(_param_handles.temp_i, &_params.temp_i); + } + + if (_param_handles.temp_ff != PARAM_INVALID) { + param_get(_param_handles.temp_ff, &_params.temp_ff); + } + + _heater_initialized = true; } } + int Heater::print_usage(const char *reason) { if (reason) { @@ -322,7 +625,7 @@ int Heater::print_usage(const char *reason) PRINT_MODULE_DESCRIPTION( R"DESCR_STR( ### Description -Background process running periodically on the LP work queue to regulate IMU temperature at a setpoint. +Background process running periodically on the INS{i} queue to regulate IMU temperature at a setpoint. This task can be started at boot from the startup scripts by setting SENS_EN_THERMAL or via CLI. )DESCR_STR"); @@ -334,7 +637,65 @@ This task can be started at boot from the startup scripts by setting SENS_EN_THE return 0; } + extern "C" __EXPORT int heater_main(int argc, char *argv[]) { - return ModuleBase::main(Heater::desc, argc, argv); + if (argc < 2) { + PX4_INFO("usage: heater {start|stop|status} [-i N]"); + return PX4_ERROR; + } + + int ch; + int myoptind = 2; + const char *myoptarg = nullptr; + int instance = -1; + while ((ch = px4_getopt(argc, argv, "i:", &myoptind, &myoptarg)) != EOF) { + if (ch == 'i') { + instance = (int)strtol(myoptarg, nullptr, 10); + } + } + + if (!strcmp(argv[1], "start")) { + // Compatibility: Without parameters, only the first one is applied by default. + if (instance > 0) { + return Heater::start_instance((uint8_t)instance); + } else { + PX4_INFO("Heater numbers start from 1, trying to start all Heaters"); + for(uint8_t i = 0; i < HEATER_NUM; i++){ + Heater::start_instance(i + 1); + } + + return PX4_OK; + } + } + + if (!strcmp(argv[1], "stop")) { + + // Compatibility: Without parameters, only the first one is applied by default. + if (instance > 0 && instance <= HEATER_MAX_INSTANCES) { + if (Heater::g_heater[instance - 1]) { + Heater::g_heater[instance - 1]->stop(); + return PX4_OK; + } + return PX4_ERROR; + } else { + return Heater::stop_all(); + } + + + } + + if (!strcmp(argv[1], "status")) { + + if (!Heater::is_running_any()) { + PX4_INFO("not running"); + return PX4_OK; + } + + Heater::status(instance); + return PX4_OK; + } + + PX4_INFO("unknown command"); + return PX4_ERROR; } diff --git a/src/drivers/heater/heater.h b/src/drivers/heater/heater.h index 1a38800a51..16b55a65a9 100644 --- a/src/drivers/heater/heater.h +++ b/src/drivers/heater/heater.h @@ -48,10 +48,12 @@ #include #include #include +#include #include #include #include #include +#include #include @@ -59,25 +61,26 @@ using namespace time_literals; #define CONTROLLER_PERIOD_DEFAULT 10000 #define TEMPERATURE_TARGET_THRESHOLD 2.5f +#define HEATER_MAX_INSTANCES 3 // If changed, also need to change `max_num_config_instances` in module.yaml +#if HEATER_NUM > HEATER_MAX_INSTANCES +#error "HEATER_NUM must less than HEATER_MAX_INSTANCES" +#endif -class Heater : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem +class Heater : px4::ScheduledWorkItem, public ModuleParams { public: - static Descriptor desc; - - Heater(); + Heater(uint8_t instance); virtual ~Heater(); /** - * @see ModuleBase::custom_command(). - * @brief main Main entry point to the module that should be - * called directly from the module's main method. - * @param argc The input argument count. - * @param argv Pointer to the input argument array. - * @return Returns 0 iff successful, -1 otherwise. + * @brief Initiates the heater driver work queue, starts a new background task, + * and fails if it is already running. + * @return Returns 1 iff start was successful. */ - static int custom_command(int argc, char *argv[]); + int start(); + + void stop(); /** * @see ModuleBase::print_usage(). @@ -86,21 +89,15 @@ public: */ static int print_usage(const char *reason = nullptr); - /** - * @see ModuleBase::task_spawn(). - * @brief Initializes the class in the same context as the work queue - * and starts the background listener. - * @param argv Pointer to the input argument array. - * @return Returns 0 iff successful, -1 otherwise. - */ - static int task_spawn(int argc, char *argv[]); + static bool is_running_instance(uint8_t instance); + static bool is_running_any(); - /** - * @brief Initiates the heater driver work queue, starts a new background task, - * and fails if it is already running. - * @return Returns 1 iff start was successful. - */ - int start(); + static int start_instance(uint8_t instance); + static int stop_all(); + static int status(uint8_t instance); + static const char *heater_instance_name(uint8_t inst); + + static Heater *g_heater[HEATER_MAX_INSTANCES]; private: @@ -149,7 +146,7 @@ private: float _integrator_value = 0.0f; float _proportional_value = 0.0f; - uORB::Publication _heater_status_pub{ORB_ID(heater_status)}; + uORB::PublicationMulti _heater_status_pub{ORB_ID(heater_status)}; uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; @@ -159,11 +156,23 @@ private: float _temperature_last{NAN}; - DEFINE_PARAMETERS( - (ParamFloat) _param_sens_imu_temp_ff, - (ParamFloat) _param_sens_imu_temp_i, - (ParamFloat) _param_sens_imu_temp_p, - (ParamFloat) _param_sens_imu_temp, - (ParamInt) _param_sens_temp_id - ) + const uint8_t _instance; //! 1-based + + volatile bool _should_exit{false}; + struct { + param_t imu_id; + param_t temp; + param_t temp_p; + param_t temp_i; + param_t temp_ff; + } _param_handles; + + struct { + int32_t imu_id; // HEATER_IMU_ID: <0 disable, 0 auto, >0 match device_id + float temp; // target temperature + float temp_p; + float temp_i; + float temp_ff; + } _params; + }; diff --git a/src/drivers/heater/heater_params.c b/src/drivers/heater/heater_params.c deleted file mode 100644 index 151f9f3eaf..0000000000 --- a/src/drivers/heater/heater_params.c +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2018-19 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file heater_params.c - * Heater parameters. - * - * @author Mark Sauder - * @author Alex Klimaj - * @author Jake Dahl - */ - -/** - * Target IMU device ID to regulate temperature. - * - * @category system - * @group Sensors - */ -PARAM_DEFINE_INT32(SENS_TEMP_ID, 0); - -/** - * Target IMU temperature. - * - * @category system - * @group Sensors - * @unit celcius - * @min 0 - * @max 85.0 - * @decimal 3 - */ -PARAM_DEFINE_FLOAT(SENS_IMU_TEMP, 55.0f); - -/** - * IMU heater controller feedforward value. - * - * @category system - * @group Sensors - * @unit % - * @min 0 - * @max 1.0 - * @decimal 3 - */ -PARAM_DEFINE_FLOAT(SENS_IMU_TEMP_FF, 0.05f); - -/** - * IMU heater controller integrator gain value. - * - * @category system - * @group Sensors - * @unit us/C - * @min 0 - * @max 1.0 - * @decimal 3 - */ -PARAM_DEFINE_FLOAT(SENS_IMU_TEMP_I, 0.025f); - -/** - * IMU heater controller proportional gain value. - * - * @category system - * @group Sensors - * @unit us/C - * @min 0 - * @max 2.0 - * @decimal 3 - */ -PARAM_DEFINE_FLOAT(SENS_IMU_TEMP_P, 1.0f); diff --git a/src/drivers/heater/module.yaml b/src/drivers/heater/module.yaml new file mode 100644 index 0000000000..2e072eb02a --- /dev/null +++ b/src/drivers/heater/module.yaml @@ -0,0 +1,90 @@ +__max_num_config_instances: &max_num_config_instances 3 + +module_name: heater + +parameters: + - group: Sensors + definitions: + HEATER${i}_IMU_ID: + description: + short: The ID of the IMU controlled by heater ${i} + long: | + Specifies the sensor device ID (DEVID) that this heater instance controls. + -1 disables this heater instance. + If set to 0, auto-select is only supported when HEATER_NUM == 1. On boards with multiple heater outputs, + a valid DEVID must be configured for each heater to ensure a 1:1 mapping between heater output and IMU. + + + type: int32 + reboot_required: true + num_instances: *max_num_config_instances + instance_start: 1 + default: [0, 0, 0] + + HEATER${i}_TEMP: + description: + short: Target temperature for heater ${i} + long: | + Specify the target stable temperature (in degrees Celsius) for the IMU. + It is generally recommended to set this between 40°C and 60°C, + which must be higher than the maximum ambient temperature. + + type: float + decimal: 3 + reboot_required: true + num_instances: *max_num_config_instances + instance_start: 1 + unit: celcius + min: 0 + max: 85.0 + default: [55.0, 55.0, 55.0] + + HEATER${i}_TEMP_FF: + description: + short: IMU heater controller ${i} feedforward value + long: | + Used to predict the baseline power consumption required to maintain temperature, + helping to reduce adjustment time. + + type: float + unit: '%' + min: 0 + max: 1.0 + decimal: 3 + reboot_required: false + num_instances: *max_num_config_instances + instance_start: 1 + default: [0.05, 0.05, 0.05] + + HEATER${i}_TEMP_I: + description: + short: IMU heater controller ${i} integrator gain value + long: | + Integral gain is used to eliminate steady-state error, + ensuring that the temperature ultimately reaches the setpoint target. + + type: float + unit: us/C + min: 0 + max: 1.0 + decimal: 3 + reboot_required: false + num_instances: *max_num_config_instances + instance_start: 1 + default: [0.025, 0.025, 0.025] + + HEATER${i}_TEMP_P: + description: + short: IMU heater controller ${i} proportional gain value + long: | + The proportional gain determines how quickly the controller responds to temperature deviations. + + type: float + unit: us/C + min: 0 + max: 2.0 + decimal: 3 + reboot_required: false + num_instances: *max_num_config_instances + instance_start: 1 + default: [1.0, 1.0, 1.0] diff --git a/src/modules/logger/logged_topics.cpp b/src/modules/logger/logged_topics.cpp index 2f28932af7..f0da9de423 100644 --- a/src/modules/logger/logged_topics.cpp +++ b/src/modules/logger/logged_topics.cpp @@ -79,7 +79,7 @@ void LoggedTopics::add_default_topics() add_topic("gps_dump"); add_optional_topic("gimbal_controls", 200); add_optional_topic("gripper"); - add_optional_topic("heater_status"); + add_optional_topic_multi("heater_status"); add_topic("home_position"); add_topic("hover_thrust_estimate", 100); add_topic("input_rc", 500); diff --git a/src/modules/px4iofirmware/px4io.cpp b/src/modules/px4iofirmware/px4io.cpp index 69527d7bf2..176d6bd1eb 100644 --- a/src/modules/px4iofirmware/px4io.cpp +++ b/src/modules/px4iofirmware/px4io.cpp @@ -391,16 +391,17 @@ extern "C" __EXPORT int user_start(int argc, char *argv[]) heartbeat_blink(); } -#if defined(HEATER_OUTPUT_EN) +#if defined(HEATER1_OUTPUT_EN) +// TODO: Multi-instance heater for PX4IO to be implemented if (r_page_setup[PX4IO_P_SETUP_THERMAL] != PX4IO_THERMAL_IGNORE) { if (r_page_setup[PX4IO_P_SETUP_THERMAL] < PX4IO_THERMAL_FULL) { /* switch resistive heater off */ - HEATER_OUTPUT_EN(false); + HEATER1_OUTPUT_EN(false); } else { /* switch resistive heater hard on */ - HEATER_OUTPUT_EN(true); + HEATER1_OUTPUT_EN(true); } }