From d87b3077e4c24264d428ad32ab06eebd75d38d94 Mon Sep 17 00:00:00 2001 From: neo Date: Sat, 15 Jun 2024 11:00:22 +0200 Subject: [PATCH] status reporting & failsafe logic wip --- .idea/runConfigurations/debug_AFTS.xml | 4 +- .idea/runConfigurations/debug_v6c.xml | 6 +- ROMFS/px4fmu_common/init.d/CMakeLists.txt | 50 ----- .../init.d/airframes/0001_main_fts | 13 +- ROMFS/px4fmu_common/init.d/rc.airship_apps | 64 ------ .../px4fmu_common/init.d/rc.airship_defaults | 11 -- ROMFS/px4fmu_common/init.d/rc.autostart_ext | 11 -- ROMFS/px4fmu_common/init.d/rc.balloon_apps | 42 ---- .../px4fmu_common/init.d/rc.balloon_defaults | 16 -- ROMFS/px4fmu_common/init.d/rc.boat_defaults | 21 -- ROMFS/px4fmu_common/init.d/rc.fw_apps | 34 ---- ROMFS/px4fmu_common/init.d/rc.fw_defaults | 55 ------ ROMFS/px4fmu_common/init.d/rc.heli_defaults | 17 -- ROMFS/px4fmu_common/init.d/rc.rover_apps | 29 --- ROMFS/px4fmu_common/init.d/rc.rover_defaults | 22 --- ROMFS/px4fmu_common/init.d/rc.thermal_cal | 65 ------- ROMFS/px4fmu_common/init.d/rc.uuv_apps | 31 --- ROMFS/px4fmu_common/init.d/rc.uuv_defaults | 14 -- ROMFS/px4fmu_common/init.d/rc.vehicle_setup | 71 ------- ROMFS/px4fmu_common/init.d/rc.vtol_apps | 46 ----- ROMFS/px4fmu_common/init.d/rc.vtol_defaults | 45 ----- ROMFS/px4fmu_common/init.d/rcS | 26 ++- msg/CMakeLists.txt | 2 +- msg/{FtsState.msg => MainFtsStatus.msg} | 4 +- src/drivers/fts/fts.cpp | 9 +- src/drivers/fts/fts.h | 4 +- src/modules/fts_control/fts_control.cpp | 184 +++++++++++++----- src/modules/fts_control/fts_control.hpp | 105 ++++++++-- src/modules/fts_control/fts_control_params.c | 14 -- src/modules/mavlink/mavlink_main.cpp | 2 +- src/modules/mavlink/mavlink_messages.cpp | 7 +- .../mavlink/streams/MAIN_FTS_STATUS.hpp | 61 ++++++ 32 files changed, 312 insertions(+), 773 deletions(-) delete mode 100644 ROMFS/px4fmu_common/init.d/rc.airship_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.airship_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.autostart_ext delete mode 100644 ROMFS/px4fmu_common/init.d/rc.balloon_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.balloon_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.boat_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.fw_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.fw_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.heli_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.rover_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.rover_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.thermal_cal delete mode 100644 ROMFS/px4fmu_common/init.d/rc.uuv_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.uuv_defaults delete mode 100644 ROMFS/px4fmu_common/init.d/rc.vehicle_setup delete mode 100644 ROMFS/px4fmu_common/init.d/rc.vtol_apps delete mode 100644 ROMFS/px4fmu_common/init.d/rc.vtol_defaults rename msg/{FtsState.msg => MainFtsStatus.msg} (90%) create mode 100644 src/modules/mavlink/streams/MAIN_FTS_STATUS.hpp diff --git a/.idea/runConfigurations/debug_AFTS.xml b/.idea/runConfigurations/debug_AFTS.xml index 7082621..241cf53 100644 --- a/.idea/runConfigurations/debug_AFTS.xml +++ b/.idea/runConfigurations/debug_AFTS.xml @@ -3,8 +3,6 @@ - - + \ No newline at end of file diff --git a/.idea/runConfigurations/debug_v6c.xml b/.idea/runConfigurations/debug_v6c.xml index cc37ca1..82513ea 100644 --- a/.idea/runConfigurations/debug_v6c.xml +++ b/.idea/runConfigurations/debug_v6c.xml @@ -1,10 +1,8 @@ - + - - + \ No newline at end of file diff --git a/ROMFS/px4fmu_common/init.d/CMakeLists.txt b/ROMFS/px4fmu_common/init.d/CMakeLists.txt index 3f19c22..9f0e848 100644 --- a/ROMFS/px4fmu_common/init.d/CMakeLists.txt +++ b/ROMFS/px4fmu_common/init.d/CMakeLists.txt @@ -1,59 +1,9 @@ -############################################################################ -# -# Copyright (c) 2018 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. -# -############################################################################ - add_subdirectory(airframes) px4_add_romfs_files( - rc.airship_apps - rc.airship_defaults - rc.autostart_ext - rc.balloon_apps - rc.balloon_defaults - rc.boat_defaults - rc.fw_apps - rc.fw_defaults - rc.heli_defaults rc.logging rc.mc_apps rc.mc_defaults rcS rc.sensors - rc.thermal_cal - rc.rover_apps - rc.rover_defaults - rc.uuv_apps - rc.uuv_defaults - rc.vehicle_setup - rc.vtol_apps - rc.vtol_defaults ) diff --git a/ROMFS/px4fmu_common/init.d/airframes/0001_main_fts b/ROMFS/px4fmu_common/init.d/airframes/0001_main_fts index 2623ec9..750b3d0 100644 --- a/ROMFS/px4fmu_common/init.d/airframes/0001_main_fts +++ b/ROMFS/px4fmu_common/init.d/airframes/0001_main_fts @@ -8,18 +8,7 @@ # @maintainer GG # -. ${R}etc/init.d/rc.mc_defaults - -# FTS_TYPE = 0 -> MISCONFIGURED MODULE -# FTS_TYPE = 1 -> MAIN FTS MODULE -# FTS_TYPE = 2 -> AUTO FTS MODULE - -param set-default FTS_TYPE 1 - -# FTS_SIM_MODE = 0 -> NORMAL OPERATION -# FTS_SIM_MODE = 1 -> TERMINATION IS NOT EXECUTED BUT SIMULATED VIA MAVLINK MESSAGE & LOGGING - -param set-default FTS_SIM_MODE 0 +#. ${R}etc/init.d/rc.mc_defaults # AFTS_ENABLED = 0 -> AFTS MODULE NOT PRESENT OR DISABLED # AFTS_ENABLED = 1 -> AFTS MODULE PRESENT AND ENABLED diff --git a/ROMFS/px4fmu_common/init.d/rc.airship_apps b/ROMFS/px4fmu_common/init.d/rc.airship_apps deleted file mode 100644 index 837a3a2..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.airship_apps +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/sh -# -# Standard apps for airships. Attitude/Position estimator, Attitude/Position control. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -############################################################################### -# Begin Estimator Group Selection # -############################################################################### - -# -# LPE -# -if param compare SYS_MC_EST_GROUP 1 -then - # - # Try to start LPE. If it fails, start EKF2 as a default. - # Unfortunately we do not build it on px4_fmu-v2 due to a limited flash. - # - if attitude_estimator_q start - then - echo "WARN [init] Estimator LPE unsupported, EKF2 recommended." - local_position_estimator start - else - echo "ERROR [init] Estimator LPE not available. Using EKF2" - param set SYS_MC_EST_GROUP 2 - param save - reboot - fi -else - # - # Q estimator (attitude estimation only) - # - if param compare SYS_MC_EST_GROUP 3 - then - attitude_estimator_q start - else - # - # EKF2 - # - param set SYS_MC_EST_GROUP 2 - ekf2 start & - fi -fi - -############################################################################### -# End Estimator Group Selection # -############################################################################### - -# -# Start Control Allocator -# -control_allocator start - -# -# Start Airship Attitude Controller. -# -airship_att_control start - -# -# Start Land Detector. -# -land_detector start airship diff --git a/ROMFS/px4fmu_common/init.d/rc.airship_defaults b/ROMFS/px4fmu_common/init.d/rc.airship_defaults deleted file mode 100644 index 2b25850..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.airship_defaults +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# -# Airship default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE airship - -# MAV_TYPE_AIRSHIP 7 -param set-default MAV_TYPE 7 diff --git a/ROMFS/px4fmu_common/init.d/rc.autostart_ext b/ROMFS/px4fmu_common/init.d/rc.autostart_ext deleted file mode 100644 index 4291a3d..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.autostart_ext +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# -# External airframe startup script (on SD card) -# - -if [ -e ${SDCARD_EXT_PATH}/rc.autostart ] -then - . ${SDCARD_EXT_PATH}/rc.autostart -else - echo "Error: ${SDCARD_EXT_PATH}/rc.autostart does not exist" -fi diff --git a/ROMFS/px4fmu_common/init.d/rc.balloon_apps b/ROMFS/px4fmu_common/init.d/rc.balloon_apps deleted file mode 100644 index 2adb216..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.balloon_apps +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -# -# Standard apps for balloons -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -# -# Start the attitude and position estimator. -# - -if param compare SYS_MC_EST_GROUP 1 -then - # - # Try to start LPE. If it fails, start EKF2 as a default. - # Unfortunately we do not build it on px4_fmu-v2 due to a limited flash. - # - if attitude_estimator_q start - then - echo "WARN [init] Estimator LPE unsupported, EKF2 recommended." - local_position_estimator start - else - echo "ERROR [init] Estimator LPE not available. Using EKF2" - param set SYS_MC_EST_GROUP 2 - param save - reboot - fi -else - # - # Q estimator (attitude estimation only) - # - if param compare SYS_MC_EST_GROUP 3 - then - attitude_estimator_q start - else - # - # EKF2 - # - param set SYS_MC_EST_GROUP 2 - ekf2 start & - fi -fi diff --git a/ROMFS/px4fmu_common/init.d/rc.balloon_defaults b/ROMFS/px4fmu_common/init.d/rc.balloon_defaults deleted file mode 100644 index 6f7d925..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.balloon_defaults +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# Balloon default parameters -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE fw - -# MAV_TYPE_FREE_BALLOON 8 -param set-default MAV_TYPE 8 - -# -# Default parameters for balloon UAVs. -# -param set-default SYS_MC_EST_GROUP 1 diff --git a/ROMFS/px4fmu_common/init.d/rc.boat_defaults b/ROMFS/px4fmu_common/init.d/rc.boat_defaults deleted file mode 100644 index dbce642..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.boat_defaults +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# -# UGV default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE rover - -# MAV_TYPE_SURFACE_BOAT 11 -param set-default MAV_TYPE 11 - -# -# Default parameters for UGVs. -# -param set-default MIS_TAKEOFF_ALT 0.01 - -param set-default NAV_ACC_RAD 2 - -# Temporary. -param set-default NAV_FW_ALT_RAD 1000 diff --git a/ROMFS/px4fmu_common/init.d/rc.fw_apps b/ROMFS/px4fmu_common/init.d/rc.fw_apps deleted file mode 100644 index f3c5592..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.fw_apps +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -# -# Standard apps for fixed wing -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -# -# Start the attitude and position estimator. -# -ekf2 start & - -# -# Start Control Allocator -# -control_allocator start - -# -# Start attitude controller. -# -fw_rate_control start -fw_att_control start -fw_pos_control start -airspeed_selector start - -# -# Start attitude control auto-tuner -# -fw_autotune_attitude_control start - -# -# Start Land Detector. -# -land_detector start fixedwing diff --git a/ROMFS/px4fmu_common/init.d/rc.fw_defaults b/ROMFS/px4fmu_common/init.d/rc.fw_defaults deleted file mode 100644 index 77b10d8..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.fw_defaults +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# -# Fixed wing default parameters -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE fw - -# MAV_TYPE_FIXED_WING 1 -param set-default MAV_TYPE 1 - -# -# Default parameters for fixed wing UAVs. -# -param set-default COM_POS_FS_DELAY 5 - -# there is a 2.5 factor applied on the _FS thresholds if for invalidation -param set-default COM_POS_FS_EPH 50 -param set-default COM_VEL_FS_EVH 5 - -param set-default COM_POS_LOW_EPH 50 - -# Disable preflight disarm to not interfere with external launching -param set-default COM_DISARM_PRFLT -1 - -param set-default EKF2_ARSP_THR 8 -param set-default EKF2_FUSE_BETA 1 -param set-default EKF2_GPS_CHECK 21 -param set-default EKF2_MAG_ACCLIM 0 -param set-default EKF2_MAG_YAWLIM 0 -param set-default EKF2_REQ_EPH 10 -param set-default EKF2_REQ_EPV 10 -param set-default EKF2_REQ_HDRIFT 0.5 -param set-default EKF2_REQ_SACC 1 -param set-default EKF2_REQ_VDRIFT 1.0 - -param set-default RTL_TYPE 1 -param set-default RTL_RETURN_ALT 100 -param set-default RTL_DESCEND_ALT 100 -param set-default RTL_LAND_DELAY -1 - -# -# FW uses L1 distance for acceptance radius. -# Set a smaller NAV_ACC_RAD for vertical acceptance distance. -# -param set-default NAV_ACC_RAD 10 - -param set-default MIS_TAKEOFF_ALT 25 -param set-default MIS_TKO_LAND_REQ 2 - -# -# FW takeoff acceleration can easily exceed ublox GPS 2G default. -# -param set-default GPS_UBX_DYNMODEL 8 diff --git a/ROMFS/px4fmu_common/init.d/rc.heli_defaults b/ROMFS/px4fmu_common/init.d/rc.heli_defaults deleted file mode 100644 index 42d2aca..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.heli_defaults +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -# -# Helicopter default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -# Inherit from mc -. ${R}etc/init.d/rc.mc_defaults - -param set-default MAV_TYPE 4 - -param set-default COM_PREARM_MODE 2 -param set-default COM_SPOOLUP_TIME 10 - -# No need for minimum collective pitch (or airmode) to keep torque authority -param set-default MPC_MANTHR_MIN 0 diff --git a/ROMFS/px4fmu_common/init.d/rc.rover_apps b/ROMFS/px4fmu_common/init.d/rc.rover_apps deleted file mode 100644 index 4d04b53..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.rover_apps +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Standard apps for unmanned ground vehicles (UGV). -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -# -# Start the attitude and position estimator. -# -ekf2 start & -#attitude_estimator_q start -#local_position_estimator start - -# -# Start Control Allocator -# -control_allocator start - -# -# Start attitude controllers. -# -rover_pos_control start - - -# -# Start Land Detector. -# -land_detector start rover diff --git a/ROMFS/px4fmu_common/init.d/rc.rover_defaults b/ROMFS/px4fmu_common/init.d/rc.rover_defaults deleted file mode 100644 index c4cd9d3..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.rover_defaults +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# -# UGV default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE rover - -# MAV_TYPE_GROUND_ROVER 10 -param set-default MAV_TYPE 10 - -# Enable Airspeed check circuit breaker because Rovers will have no airspeed sensor -param set-default CBRK_AIRSPD_CHK 162128 - -param set-default MIS_TAKEOFF_ALT 0.01 - -param set-default NAV_ACC_RAD 2 -param set-default NAV_LOITER_RAD 2 - -# Temporary. -param set-default NAV_FW_ALT_RAD 1000 diff --git a/ROMFS/px4fmu_common/init.d/rc.thermal_cal b/ROMFS/px4fmu_common/init.d/rc.thermal_cal deleted file mode 100644 index 484b9af..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.thermal_cal +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/sh -# -# Thermal Calibration startup script. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set TEMP_COMP_START "" - -if param compare -s TC_A_ENABLE 1 -then - set TEMP_COMP_START "true" -fi - -if param compare -s TC_B_ENABLE 1 -then - set TEMP_COMP_START "true" -fi - -if param compare -s TC_G_ENABLE 1 -then - set TEMP_COMP_START "true" -fi - -if [ "x$TEMP_COMP_START" != "x" ] -then - temperature_compensation start -fi - -unset TEMP_COMP_START - - -# -# Determine if a thermal calibration should be started. -# - -set TEMP_CALIB_ARGS "" - -if param compare SYS_CAL_ACCEL 1 -then - set TEMP_CALIB_ARGS "${TEMP_CALIB_ARGS} -a" - param set SYS_CAL_ACCEL 0 -fi - -if param compare SYS_CAL_GYRO 1 -then - set TEMP_CALIB_ARGS "${TEMP_CALIB_ARGS} -g" - param set SYS_CAL_GYRO 0 -fi - -if param compare SYS_CAL_BARO 1 -then - set TEMP_CALIB_ARGS "${TEMP_CALIB_ARGS} -b" - param set SYS_CAL_BARO 0 -fi - -# -# Start the thermal calibration cycle. -# -if [ "x$TEMP_CALIB_ARGS" != "x" ] -then - temperature_compensation calibrate ${TEMP_CALIB_ARGS} -fi - -unset TEMP_CALIB_ARGS diff --git a/ROMFS/px4fmu_common/init.d/rc.uuv_apps b/ROMFS/px4fmu_common/init.d/rc.uuv_apps deleted file mode 100644 index d2eb132..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.uuv_apps +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# Standard apps for uuvs. Attitude/Position estimator, Attitude/Position control. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -############################################################################### -# Begin Estimator Group Selection # -############################################################################### - -ekf2 start & - -############################################################################### -# End Estimator Group Selection # -############################################################################### - -# -# Start Control Allocator -# -control_allocator start - -# -# Start UUV Attitude Controller. -# -uuv_att_control start - -# -# Start UUV Land Detector. -# -land_detector start rover diff --git a/ROMFS/px4fmu_common/init.d/rc.uuv_defaults b/ROMFS/px4fmu_common/init.d/rc.uuv_defaults deleted file mode 100644 index 344cfff..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.uuv_defaults +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# -# UUV default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE uuv - -# MAV_TYPE_SUBMARINE 12 -param set-default MAV_TYPE 12 - -# UUV don't have an airspeed sensor, so disable checks around it -param set-default CBRK_AIRSPD_CHK 162128 diff --git a/ROMFS/px4fmu_common/init.d/rc.vehicle_setup b/ROMFS/px4fmu_common/init.d/rc.vehicle_setup deleted file mode 100644 index 4eb568e..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.vehicle_setup +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/sh -# -# Vehicle configuration setup script. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -# -# Fixed wing setup. -# -if [ $VEHICLE_TYPE = fw ] -then - # Start standard fixedwing apps. - . ${R}etc/init.d/rc.fw_apps -fi - -# -# Multicopter setup. -# -if [ $VEHICLE_TYPE = mc ] -then - # Start standard multicopter apps. - . ${R}etc/init.d/rc.mc_apps -fi - -# -# UGV setup. -# -if [ $VEHICLE_TYPE = rover ] -then - # Start standard UGV apps. - . ${R}etc/init.d/rc.rover_apps -fi - -# -# VTOL setup. -# -if [ $VEHICLE_TYPE = vtol ] -then - # Start standard vtol apps. - . ${R}etc/init.d/rc.vtol_apps -fi - -# -# Airship setup. -# -if [ $VEHICLE_TYPE = airship ] -then - # Start airship apps. - . ${R}etc/init.d/rc.airship_apps -fi - -# -# UUV setup -# -if [ $VEHICLE_TYPE = uuv ] -then - # Start standard vtol apps. - . ${R}etc/init.d/rc.uuv_apps -fi - - - -# -# Generic setup (autostart ID not found). -# -if [ $VEHICLE_TYPE = none ] -then - echo "No autostart ID found" - #ekf2 start & -fi diff --git a/ROMFS/px4fmu_common/init.d/rc.vtol_apps b/ROMFS/px4fmu_common/init.d/rc.vtol_apps deleted file mode 100644 index fdc16af..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.vtol_apps +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# Standard apps for vtol: Attitude/Position estimator, Attitude/Position control. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -############################################################################### -# Begin Estimator group selection # -############################################################################### - -ekf2 start & - -############################################################################### -# End Estimator group selection # -############################################################################### - -# -# Start Control Allocator -# -control_allocator start - -airspeed_selector start - -vtol_att_control start - -mc_rate_control start vtol -mc_att_control start vtol -flight_mode_manager start -mc_pos_control start vtol -mc_hover_thrust_estimator start - -if param greater -s MC_AT_EN 0 -then - mc_autotune_attitude_control start -fi - -fw_rate_control start vtol -fw_att_control start vtol -fw_pos_control start vtol -fw_autotune_attitude_control start vtol - -# Start Land Detector -# Multicopter for now until we have something for VTOL -# -land_detector start vtol diff --git a/ROMFS/px4fmu_common/init.d/rc.vtol_defaults b/ROMFS/px4fmu_common/init.d/rc.vtol_defaults deleted file mode 100644 index 2c273e9..0000000 --- a/ROMFS/px4fmu_common/init.d/rc.vtol_defaults +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh -# -# VTOL default parameters. -# -# NOTE: Script variables are declared/initialized/unset in the rcS script. -# - -set VEHICLE_TYPE vtol - -# MAV_TYPE_VTOL_FIXEDROTOR 22 -param set-default MAV_TYPE 22 - -# there is a 2.5 factor applied on COM_POS_FS_EPH if for invalidation -param set-default COM_POS_FS_EPH 50 - -param set-default COM_POS_LOW_EPH 50 - -param set-default MIS_TAKEOFF_ALT 20 -param set-default MIS_YAW_TMT 10 - -param set-default EKF2_ARSP_THR 10 -param set-default EKF2_FUSE_BETA 1 - -param set-default HTE_VXY_THR 2.0 - -param set-default MIS_TKO_LAND_REQ 2 - -param set-default MPC_ACC_HOR_MAX 2 -param set-default MPC_VEL_MANUAL 5 -param set-default MPC_XY_ERR_MAX 5 -param set-default MPC_XY_VEL_MAX 8 -param set-default MPC_JERK_MAX 4.5 -param set-default MPC_YAW_MODE 4 - -# reduce aggressiveness around roll and yaw axis, -# as VTOLs usually have high intertia and lot af drag due to wings -param set-default MC_ROLL_P 5 -param set-default MC_ROLLRATE_MAX 120 -param set-default MC_YAW_P 2 -param set-default MC_YAWRATE_MAX 120 -param set-default MPC_MAN_Y_MAX 90 - -param set-default RTL_TYPE 1 - -param set-default WV_EN 1 diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS index eaf78fb..d7345f6 100644 --- a/ROMFS/px4fmu_common/init.d/rcS +++ b/ROMFS/px4fmu_common/init.d/rcS @@ -379,23 +379,21 @@ else # battery_status start #fi - sensors start - commander start + # ONLY START SENSORS ON AUTO-FTS MODULE + if param compare SYS_AUTOSTART 2 + then + sensors start + commander start - #dshot start - #pwm_out start + # Pre-takeoff continuous magnetometer calibration + if param compare -s MBE_ENABLE 1 + then + mag_bias_estimator start + fi + + fi fi - # - # Configure vehicle type specific parameters. - # Note: rc.vehicle_setup is the entry point for all vehicle type specific setup. - . ${R}etc/init.d/rc.vehicle_setup - - # Pre-takeoff continuous magnetometer calibration - if param compare -s MBE_ENABLE 1 - then - mag_bias_estimator start - fi # # Optional board mavlink streams: rc.board_mavlink diff --git a/msg/CMakeLists.txt b/msg/CMakeLists.txt index b7e7ada..0d5de5f 100644 --- a/msg/CMakeLists.txt +++ b/msg/CMakeLists.txt @@ -90,7 +90,6 @@ set(msg_files FollowTarget.msg FollowTargetEstimator.msg FollowTargetStatus.msg - FtsState.msg GeneratorStatus.msg GeofenceResult.msg GimbalDeviceAttitudeStatus.msg @@ -124,6 +123,7 @@ set(msg_files LogMessage.msg MagnetometerBiasEstimate.msg MagWorkerData.msg + MainFtsStatus.msg ManualControlSetpoint.msg ManualControlSwitches.msg MavlinkLog.msg diff --git a/msg/FtsState.msg b/msg/MainFtsStatus.msg similarity index 90% rename from msg/FtsState.msg rename to msg/MainFtsStatus.msg index a1afe23..5124be3 100644 --- a/msg/FtsState.msg +++ b/msg/MainFtsStatus.msg @@ -1,8 +1,6 @@ uint64 timestamp # time since system start (microseconds) -bool fts_on +uint8 main_fts_state uint8 ground_fts_state uint8 auto_fts_state -uint8 main_fts_state - diff --git a/src/drivers/fts/fts.cpp b/src/drivers/fts/fts.cpp index c550d09..e787d46 100644 --- a/src/drivers/fts/fts.cpp +++ b/src/drivers/fts/fts.cpp @@ -21,7 +21,7 @@ FTS::FTS() : ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::lp_default) { - _fts_state_pub.advertise(); + //_main_fts_status_pub.advertise(); } FTS::~FTS() @@ -89,15 +89,14 @@ void FTS::Run() update_params(); - publish_status(); + //publish_status(); } void FTS::publish_status() { - fts_state_s status{}; - status.fts_on = _fts_on; + main_fts_status_s status{}; status.timestamp = hrt_absolute_time(); - _fts_state_pub.publish(status); + _main_fts_status_pub.publish(status); } int FTS::start() diff --git a/src/drivers/fts/fts.h b/src/drivers/fts/fts.h index bbbc59b..4e74880 100644 --- a/src/drivers/fts/fts.h +++ b/src/drivers/fts/fts.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include @@ -94,7 +94,7 @@ private: bool _fts_initialized = false; bool _fts_on = false; - uORB::Publication _fts_state_pub{ORB_ID(fts_state)}; + uORB::Publication _main_fts_status_pub{ORB_ID(main_fts_status)}; uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; diff --git a/src/modules/fts_control/fts_control.cpp b/src/modules/fts_control/fts_control.cpp index ba49c4f..0645004 100644 --- a/src/modules/fts_control/fts_control.cpp +++ b/src/modules/fts_control/fts_control.cpp @@ -34,6 +34,8 @@ FTSController::init() fts_id.uidBytes[2]=guid[2]; fts_id.uidBytes[3]=guid[3]; + get_instance()->reset(); + // run every 1s ScheduleOnInterval(1000_ms); return true; @@ -50,39 +52,68 @@ FTSController::Run() { perf_begin(_cycle_perf); perf_count(_interval_perf); - // Update all subscriber - update_topics(); - - // Update FTS comm status - update_status(); - // Update AUTO-FTS status + //TODO manage comm timeout if (_auto_fts_message_sub.updated()) { _auto_fts_message_sub.copy(&_auto_fts_message); + //ARMING CONDITIONS ARE MET + switch (_auto_fts_state){ + case AUTO_FTS_STATE_ARMED:{ + //AFTS IS CURRENTLY ARMED + //TODO ADD GEOFENCE LOADED CHECK ETC + //if (_auto_fts_message.config_status != 0 && _auto_fts_message.geofence_loaded != 0 && _auto_fts_message.gps_lock != 0) { + if (_auto_fts_message.gps_lock != 0) { + // FIRING CONTITIONS ARE MET + if (_auto_fts_message.geofence_violated != 0) { + //GEOFENCE VIOLATED, FIRE + _auto_fts_state = AUTO_FTS_STATE_FIRE; + } else { + //GEOFENCE NOT VIOLATED, REMAIN ARMED AND READY + } + } else { + //FIRING CONDITIONS ARE LOST, DISARM AUTO-FTS + _auto_fts_state = AUTO_FTS_STATE_DISARMED; + } + }break; - if (_auto_fts_message.gps_lock != 0) { - arm(); + case AUTO_FTS_STATE_DISARMED: + { + //AFTS IS NOT CURRENTLY ARMED + //TODO ADD GEOFENCE LOADED CHECK ETC + //if (_auto_fts_message.config_status != 0 && _auto_fts_message.geofence_loaded != 0 && _auto_fts_message.gps_lock != 0) { + if (_auto_fts_message.gps_lock != 0) { + if (_auto_fts_message.geofence_violated != 0) { + // FAILSAFE: CANNOT ARM AUTO-FTS WHEN GEOFENCE IS ALREADY VIOLATED + _auto_fts_state = AUTO_FTS_STATE_ERROR; + } else { + // ARM AUTO-FTS + _auto_fts_state = AUTO_FTS_STATE_ARMED; + } + }else { + // REMAIN DISARMED + } + }break; - if (_auto_fts_message.geofence_violated != 0) { - fire(); - } else { - reset(); - } - - } else { - disarm(); - reset(); + case AUTO_FTS_STATE_FIRE: + case AUTO_FTS_STATE_ERROR: + default: { + //DO NOTHING + }break; } } - // Update GROUND-FTS status - if (_ground_fts_message_sub.updated()) { + // Manage communication with GROUND-FTS module + // and update GROUND-FTS status + //TODO manage comm timeout + if (_ground_fts_message_sub.updated()) { _ground_fts_message_sub.copy(&_ground_fts_message); if (_ground_fts_message.message == PING) { //PING COMMAND if (_ground_fts_message.fts_uid == fts_id.uid) { + //PING RECEIVED, GROUND-FTS IS ARMED + _ground_fts_state = GROUND_FTS_STATE_ARMED; _ground_fts_response.message = PONG; _ground_fts_response.fts_uid = fts_id.uid; @@ -95,6 +126,7 @@ FTSController::Run() { _ground_fts_response.fts_uid = fts_id.uid; _ground_fts_response_pub.publish(_ground_fts_response); } + } if (_emergency_command_sub.updated()) { @@ -103,47 +135,80 @@ FTSController::Run() { if (_emergency_command.param == fts_id.uid) { if (_emergency_command.emergency_command == ACTIVATE_FTS) { - //TERMINATE COMMAND - fire(); + //TERMINATE COMMAND RECEIVED + + if(_ground_fts_state == GROUND_FTS_STATE_ARMED) { + _ground_fts_state = GROUND_FTS_STATE_FIRE; + }else{ + // FAILSAFE: CANNOT FIRE GROUND-FTS IF CURRENTLY DISARMED + _ground_fts_state = GROUND_FTS_STATE_ERROR; + } + } } - // Publish FTS controller state - _fts_state.timestamp = hrt_absolute_time(); - - perf_end(_cycle_perf); } -} -void -FTSController::update_status() -{ + switch (_ground_fts_state) { + case GROUND_FTS_STATE_DISARMED:{ - // Update FTS state + }break; + + case GROUND_FTS_STATE_ARMED:{ + + }break; + + case GROUND_FTS_STATE_FIRE: + case GROUND_FTS_STATE_ERROR: + default: + { + //DO NOTHING + }break; + } + + switch (_main_fts_state) { + case MAIN_FTS_STATE_DISARMED:{ + if (_ground_fts_state == GROUND_FTS_STATE_FIRE || _auto_fts_state ==AUTO_FTS_STATE_FIRE){ + _main_fts_state = MAIN_FTS_STATE_ERROR; + } + + }break; + case MAIN_FTS_STATE_ARMED:{ + if (_ground_fts_state == GROUND_FTS_STATE_FIRE || _auto_fts_state ==AUTO_FTS_STATE_FIRE){ + get_instance()->fire(); + } + }break; + case MAIN_FTS_STATE_FIRE: + case MAIN_FTS_STATE_ERROR: + default: + { + //DO NOTHING + }break; + } + + + // Publish new status + update_topics(); + + perf_end(_cycle_perf); } -void FTSController::send_fts_state() -{ -} - - void FTSController::update_topics() { - _fts_state_pub.publish(_fts_state); - + // Publish FTS controller state + _main_fts_status_msg.timestamp = hrt_absolute_time(); + _main_fts_status_msg.main_fts_state = _main_fts_state; + _main_fts_status_msg.ground_fts_state = _ground_fts_state; + _main_fts_status_msg.auto_fts_state = _auto_fts_state; + _main_fts_status_pub.publish(_main_fts_status_msg); } bool FTSController::update_param() { - float fts_comm_timeout_s = 5.0f; - - - _fts_comm_timeout_threshold_us = (uint64_t)fts_comm_timeout_s * 1000000; - - return true; + return 1; } int @@ -170,28 +235,45 @@ FTSController::task_spawn(int argc, char *argv[]) return PX4_ERROR; } -void +uint8_t FTSController::fire() { - fts_drv.fts_on(); + if (_main_fts_state == MAIN_FTS_STATE_ARMED) { + fts_drv.fts_on(); + _main_fts_state = MAIN_FTS_STATE_FIRE; + return 0; + }else{ + return 1; + } } -void +uint8_t FTSController::reset() { + _main_fts_state = MAIN_FTS_STATE_ARMED; + _ground_fts_state = GROUND_FTS_STATE_DISARMED; + _auto_fts_state = AUTO_FTS_STATE_DISARMED; fts_drv.fts_off(); + fts_drv.fts_arm(); + return 0; } -void +uint8_t FTSController::arm() { fts_drv.fts_arm(); + _main_fts_state = MAIN_FTS_STATE_ARMED; + _ground_fts_state = GROUND_FTS_STATE_DISARMED; + _auto_fts_state = AUTO_FTS_STATE_DISARMED; + return 0; } -void +uint8_t FTSController::disarm() { fts_drv.fts_disarm(); + _main_fts_state = MAIN_FTS_STATE_DISARMED; + return 0; } int @@ -226,8 +308,9 @@ FTSController::print_status() perf_print_counter(_cycle_perf); perf_print_counter(_interval_perf); - PX4_INFO("Current FTS state:%u", _fts_state.main_fts_state); - + PX4_INFO("Main FTS state:%s", mfts_status_str(_main_fts_state)); + PX4_INFO("Ground module state:%s", gfts_status_str(_ground_fts_state)); + PX4_INFO("Auto module state:%s", afts_status_str(_auto_fts_state)); return 0; } @@ -242,7 +325,6 @@ FTSController::print_usage(const char *reason) R"DESCR_STR( ### Description - )DESCR_STR"); PRINT_MODULE_USAGE_NAME("fts_controller", "system"); diff --git a/src/modules/fts_control/fts_control.hpp b/src/modules/fts_control/fts_control.hpp index 08d8d23..e02e11e 100644 --- a/src/modules/fts_control/fts_control.hpp +++ b/src/modules/fts_control/fts_control.hpp @@ -13,14 +13,12 @@ #include #include #include -#include #include #include #include #include +#include #include -#include -#include #include using namespace time_literals; @@ -30,7 +28,7 @@ union FTSIDUnion{ uint8_t uidBytes[4]; }; -typedef enum FTS_MESSAGE_TYPE +typedef enum FTS_MESSAGE_TYPE_ENUM { PING=1, /* Send from the host to the FTS. | */ PONG=2, /* Send from the FTS to the host. | */ @@ -39,9 +37,9 @@ typedef enum FTS_MESSAGE_TYPE same message as a response. Then the host shall register the FTS_UID field in the response. | */ FTS_MESSAGE_TYPE_ENUM_END=4, /* | */ -} FTS_MESSAGE_TYPE; +}FTS_MESSAGE_TYPE; -typedef enum MAV_EMERGENCY_COMMAND_TYPE +typedef enum MAV_EMERGENCY_COMMAND_TYPE_ENUM { ACTIVATE_FTS=1, /* Stop motors and open the parachute | */ EMERGENCY_LANDING=2, /* Land wherever as soon as possible | */ @@ -50,7 +48,31 @@ typedef enum MAV_EMERGENCY_COMMAND_TYPE UNHOLD=5, /* Hold position in multi copter mode | */ DISACTIVATE_FTS=6, /* re-enable motors and restore parachute output (testing only) | */ MAV_EMERGENCY_COMMAND_TYPE_ENUM_END=7, /* | */ -} MAV_EMERGENCY_COMMAND_TYPE; +}MAV_EMERGENCY_COMMAND_TYPE; + +typedef enum MAIN_FTS_STATE_ENUM +{ + MAIN_FTS_STATE_ERROR=0, + MAIN_FTS_STATE_DISARMED=1, + MAIN_FTS_STATE_ARMED=2, + MAIN_FTS_STATE_FIRE=3, +} MAIN_FTS_STATE; + +typedef enum GROUND_FTS_STATE_ENUM +{ + GROUND_FTS_STATE_ERROR=0, + GROUND_FTS_STATE_DISARMED=1, + GROUND_FTS_STATE_ARMED=2, + GROUND_FTS_STATE_FIRE=3, +} GROUND_FTS_STATE; + +typedef enum AUTO_FTS_STATE_ENUM +{ + AUTO_FTS_STATE_ERROR=0, + AUTO_FTS_STATE_DISARMED=1, + AUTO_FTS_STATE_ARMED=2, + AUTO_FTS_STATE_FIRE=3, +} AUTO_FTS_STATE; class FTSController : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem { @@ -71,18 +93,58 @@ public: bool init(); int print_status() override; + inline const char* mfts_status_str(uint8_t state){ + switch(state){ + default: + case MAIN_FTS_STATE_ERROR: + return "ERROR"; + case MAIN_FTS_STATE_DISARMED: + return "DISARMED"; + case MAIN_FTS_STATE_ARMED: + return "ARMED"; + case MAIN_FTS_STATE_FIRE: + return "FIRE"; + } + } + + inline const char* gfts_status_str(uint8_t state){ + switch(state){ + default: + case GROUND_FTS_STATE_ERROR: + return "ERROR"; + case GROUND_FTS_STATE_DISARMED: + return "DISARMED"; + case GROUND_FTS_STATE_ARMED: + return "ARMED"; + case GROUND_FTS_STATE_FIRE: + return "FIRE"; + } + } + + inline const char* afts_status_str(uint8_t state){ + switch(state){ + default: + case AUTO_FTS_STATE_ERROR: + return "ERROR"; + case AUTO_FTS_STATE_DISARMED: + return "DISARMED"; + case AUTO_FTS_STATE_ARMED: + return "ARMED"; + case AUTO_FTS_STATE_FIRE: + return "FIRE"; + } + } private: void Run() override; void send_fts_state(); void update_topics(); - void update_status(); bool update_param(); - void fire(); - void reset(); - void arm(); - void disarm(); + uint8_t fire(); + uint8_t reset(); + uint8_t arm(); + uint8_t disarm(); perf_counter_t _cycle_perf; perf_counter_t _interval_perf; @@ -91,20 +153,27 @@ private: uORB::SubscriptionData _ground_fts_message_sub{ORB_ID(ground_fts_message)}; uORB::SubscriptionData _emergency_command_sub{ORB_ID(emergency_command)}; - uORB::Publication _fts_state_pub{ORB_ID(fts_state)}; - uORB::Publication _ground_fts_response_pub{ORB_ID(ground_fts_response)}; + uORB::Publication _main_fts_status_pub{ORB_ID(main_fts_status)}; + uORB::Publication _ground_fts_response_pub{ORB_ID(ground_fts_response)}; FTS fts_drv; hrt_abstime _last_fts_state_update_time{0}; - fts_state_s _fts_state{}; + + // Internal module status + MAIN_FTS_STATE _main_fts_state; + GROUND_FTS_STATE _ground_fts_state; + AUTO_FTS_STATE _auto_fts_state; + + // UORB topics published + main_fts_status_s _main_fts_status_msg{}; + ground_fts_response_s _ground_fts_response{}; + + // UORB topics subscribed auto_fts_message_s _auto_fts_message{}; ground_fts_message_s _ground_fts_message{}; - ground_fts_response_s _ground_fts_response{}; emergency_command_s _emergency_command{}; - uint64_t _fts_comm_timeout_threshold_us{10_s}; // Currently the box emits state at 3 Hz - // Global variable storing the UID of the chip. union FTSIDUnion fts_id; diff --git a/src/modules/fts_control/fts_control_params.c b/src/modules/fts_control/fts_control_params.c index f49cf8a..1e8176c 100644 --- a/src/modules/fts_control/fts_control_params.c +++ b/src/modules/fts_control/fts_control_params.c @@ -44,19 +44,5 @@ * @boolean * @group FTS Control */ -PARAM_DEFINE_INT32(FTS_EN, 0); - -PARAM_DEFINE_INT32(FTS_TYPE, 1); -PARAM_DEFINE_INT32(FTS_SIM_MODE, 1); PARAM_DEFINE_INT32(AFTS_ENABLED, 1); -/** - * The timeout for fts_state message - * - * @unit s - * @reboot_required true - * @decimal 1 - * - * @group FTS Control - */ -PARAM_DEFINE_FLOAT(FTS_COMM_TM, 10.0f); diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index 9ae4302..2094c14 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -1840,7 +1840,7 @@ Mavlink::configure_streams_to_default(const char *configure_single_stream) break; // MODE 13 MFTS TO FC case MAVLINK_MODE_MFTS_FC: - configure_stream_local("MAIN_FTS_MESSAGE", 3.0f); + configure_stream_local("MAIN_FTS_STATUS", 3.0f); break; //MODE 14 MFTS TO GFTS case MAVLINK_MODE_MFTS_GFTS: diff --git a/src/modules/mavlink/mavlink_messages.cpp b/src/modules/mavlink/mavlink_messages.cpp index 39cc8ac..b5ce0ed 100644 --- a/src/modules/mavlink/mavlink_messages.cpp +++ b/src/modules/mavlink/mavlink_messages.cpp @@ -92,6 +92,7 @@ #include "streams/LANDING_TARGET.hpp" #include "streams/LOCAL_POSITION_NED.hpp" #include "streams/MAG_CAL_REPORT.hpp" +#include "streams/MAIN_FTS_STATUS.hpp" #include "streams/MANUAL_CONTROL.hpp" #include "streams/MOUNT_ORIENTATION.hpp" #include "streams/NAV_CONTROLLER_OUTPUT.hpp" @@ -489,8 +490,12 @@ static const StreamListItem streams_list[] = { create_stream_list_item(), #endif // AUTO_FTS_MESSAGE_HPP #if defined(GROUND_FTS_RESPONSE_HPP) - create_stream_list_item() + create_stream_list_item(), #endif // GROUND_FTS_RESPONSE_HPP +#if defined(MAIN_FTS_STATUS_HPP) + create_stream_list_item() +#endif // MAIN_FTS_STATUS_HPP + }; const char *get_stream_name(const uint16_t msg_id) diff --git a/src/modules/mavlink/streams/MAIN_FTS_STATUS.hpp b/src/modules/mavlink/streams/MAIN_FTS_STATUS.hpp new file mode 100644 index 0000000..d622a2d --- /dev/null +++ b/src/modules/mavlink/streams/MAIN_FTS_STATUS.hpp @@ -0,0 +1,61 @@ +#ifndef MAIN_FTS_MESSAGE_HPP +#define MAIN_FTS_MESSAGE_HPP + +#include +#include +#include + +#include +#include +#include + +class MavlinkStreamMainFtsStatus : public MavlinkStream +{ +public: + static MavlinkStream *new_instance(Mavlink *mavlink) { return new MavlinkStreamMainFtsStatus(mavlink); } + + static constexpr const char *get_name_static() { return "MAIN_FTS_STATUS"; } + static constexpr uint16_t get_id_static() { return MAVLINK_MSG_ID_MAIN_FTS_STATUS; } + + const char *get_name() const override { return get_name_static(); } + uint16_t get_id() override { return get_id_static(); } + + uORB::Subscription _main_fts_status_sub{ORB_ID(main_fts_status)}; + + hrt_abstime _last_reset_time{0}; + hrt_abstime _last_update_time{0}; + + unsigned get_size() override + { + return MAVLINK_MSG_ID_MAIN_FTS_STATUS_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES; + } + + bool const_rate() override { return true; } + +private: + explicit MavlinkStreamMainFtsStatus(Mavlink *mavlink) : + MavlinkStream(mavlink) + { + } + + bool send() override + { + mavlink_main_fts_status_t msg{}; + set_default_values(msg); + + mavlink_msg_main_fts_status_send_struct(_mavlink->get_channel(), &msg); + + return true; + + } + + void set_default_values(mavlink_main_fts_status_t &msg) const + { + msg.main_fts_state = 0; + msg.ground_fts_state = 0; + msg.auto_fts_state = 0; + } + +}; + +#endif