Browse Source

commander, mavlink: fixed base_mode and custom_mode in mavlink

sbg
Anton Babushkin 12 years ago
parent
commit
d7730a3444
  1. 14
      src/modules/commander/commander.cpp
  2. 52
      src/modules/mavlink/mavlink.c
  3. 22
      src/modules/mavlink/orb_listener.c
  4. 2
      src/modules/mavlink/util.h

14
src/modules/commander/commander.cpp

@ -84,6 +84,7 @@
#include <systemlib/err.h> #include <systemlib/err.h>
#include <systemlib/cpuload.h> #include <systemlib/cpuload.h>
#include "px4_custom_mode.h"
#include "commander_helper.h" #include "commander_helper.h"
#include "state_machine_helper.h" #include "state_machine_helper.h"
#include "calibration_routines.h" #include "calibration_routines.h"
@ -138,13 +139,6 @@ enum MAV_MODE_FLAG {
MAV_MODE_FLAG_ENUM_END = 129, /* | */ MAV_MODE_FLAG_ENUM_END = 129, /* | */
}; };
enum PX4_CUSTOM_MODE {
PX4_CUSTOM_MODE_MANUAL = 1,
PX4_CUSTOM_MODE_SEATBELT,
PX4_CUSTOM_MODE_EASY,
PX4_CUSTOM_MODE_AUTO,
};
/* Mavlink file descriptors */ /* Mavlink file descriptors */
static int mavlink_fd; static int mavlink_fd;
@ -1321,8 +1315,10 @@ toggle_status_leds(vehicle_status_s *status, actuator_armed_s *armed, vehicle_gp
} else if (armed->ready_to_arm) { } else if (armed->ready_to_arm) {
/* ready to arm, blink at 2.5Hz */ /* ready to arm, blink at 2.5Hz */
if (leds_counter % 8 == 0) { if (leds_counter & 8) {
led_toggle(LED_AMBER); led_on(LED_AMBER);
} else {
led_off(LED_AMBER);
} }
} else { } else {

52
src/modules/mavlink/mavlink.c

@ -64,6 +64,7 @@
#include <systemlib/systemlib.h> #include <systemlib/systemlib.h>
#include <systemlib/err.h> #include <systemlib/err.h>
#include <mavlink/mavlink_log.h> #include <mavlink/mavlink_log.h>
#include <commander/px4_custom_mode.h>
#include "waypoints.h" #include "waypoints.h"
#include "orb_topics.h" #include "orb_topics.h"
@ -181,10 +182,11 @@ set_hil_on_off(bool hil_enabled)
} }
void void
get_mavlink_mode_and_state(uint8_t *mavlink_state, uint8_t *mavlink_mode) get_mavlink_mode_and_state(uint8_t *mavlink_state, uint8_t *mavlink_base_mode, uint32_t *mavlink_custom_mode)
{ {
/* reset MAVLink mode bitfield */ /* reset MAVLink mode bitfield */
*mavlink_mode = 0; *mavlink_base_mode = 0;
*mavlink_custom_mode = 0;
/** /**
* Set mode flags * Set mode flags
@ -192,36 +194,31 @@ get_mavlink_mode_and_state(uint8_t *mavlink_state, uint8_t *mavlink_mode)
/* HIL */ /* HIL */
if (v_status.hil_state == HIL_STATE_ON) { if (v_status.hil_state == HIL_STATE_ON) {
*mavlink_mode |= MAV_MODE_FLAG_HIL_ENABLED; *mavlink_base_mode |= MAV_MODE_FLAG_HIL_ENABLED;
} }
/* autonomous mode */ /* arming state */
if (v_status.main_state == MAIN_STATE_AUTO) {
*mavlink_mode |= MAV_MODE_FLAG_AUTO_ENABLED;
}
/* set arming state */
if (v_status.arming_state == ARMING_STATE_ARMED if (v_status.arming_state == ARMING_STATE_ARMED
|| v_status.arming_state == ARMING_STATE_ARMED_ERROR) { || v_status.arming_state == ARMING_STATE_ARMED_ERROR) {
*mavlink_mode |= MAV_MODE_FLAG_SAFETY_ARMED; *mavlink_base_mode |= MAV_MODE_FLAG_SAFETY_ARMED;
} else {
*mavlink_mode &= ~MAV_MODE_FLAG_SAFETY_ARMED;
} }
if (v_status.main_state == MAIN_STATE_MANUAL /* main state */
|| v_status.main_state == MAIN_STATE_SEATBELT *mavlink_base_mode |= MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
|| v_status.main_state == MAIN_STATE_EASY) { if (v_status.main_state == MAIN_STATE_MANUAL) {
*mavlink_base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | (v_status.is_rotary_wing ? MAV_MODE_FLAG_STABILIZE_ENABLED : 0);
*mavlink_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED; *mavlink_custom_mode = PX4_CUSTOM_MODE_MANUAL;
} else if (v_status.main_state == MAIN_STATE_SEATBELT) {
*mavlink_base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_STABILIZE_ENABLED;
*mavlink_custom_mode = PX4_CUSTOM_MODE_SEATBELT;
} else if (v_status.main_state == MAIN_STATE_EASY) {
*mavlink_base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_STABILIZE_ENABLED | MAV_MODE_FLAG_GUIDED_ENABLED;
*mavlink_custom_mode = PX4_CUSTOM_MODE_EASY;
} else if (v_status.main_state == MAIN_STATE_AUTO) {
*mavlink_base_mode |= MAV_MODE_FLAG_AUTO_ENABLED | MAV_MODE_FLAG_STABILIZE_ENABLED | MAV_MODE_FLAG_GUIDED_ENABLED;
*mavlink_custom_mode = PX4_CUSTOM_MODE_AUTO;
} }
if (v_status.navigation_state == MAIN_STATE_EASY) {
*mavlink_mode |= MAV_MODE_FLAG_GUIDED_ENABLED;
}
/** /**
* Set mavlink state * Set mavlink state
**/ **/
@ -645,11 +642,12 @@ int mavlink_thread_main(int argc, char *argv[])
/* translate the current system state to mavlink state and mode */ /* translate the current system state to mavlink state and mode */
uint8_t mavlink_state = 0; uint8_t mavlink_state = 0;
uint8_t mavlink_mode = 0; uint8_t mavlink_base_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_mode); uint32_t mavlink_custom_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_base_mode, &mavlink_custom_mode);
/* send heartbeat */ /* send heartbeat */
mavlink_msg_heartbeat_send(chan, mavlink_system.type, MAV_AUTOPILOT_PX4, mavlink_mode, v_status.navigation_state, mavlink_state); mavlink_msg_heartbeat_send(chan, mavlink_system.type, MAV_AUTOPILOT_PX4, mavlink_base_mode, mavlink_custom_mode, mavlink_state);
/* switch HIL mode if required */ /* switch HIL mode if required */
if (v_status.hil_state == HIL_STATE_ON) if (v_status.hil_state == HIL_STATE_ON)

22
src/modules/mavlink/orb_listener.c

@ -279,15 +279,16 @@ l_vehicle_status(const struct listener *l)
/* translate the current syste state to mavlink state and mode */ /* translate the current syste state to mavlink state and mode */
uint8_t mavlink_state = 0; uint8_t mavlink_state = 0;
uint8_t mavlink_mode = 0; uint8_t mavlink_base_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_mode); uint32_t mavlink_custom_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_base_mode, &mavlink_custom_mode);
/* send heartbeat */ /* send heartbeat */
mavlink_msg_heartbeat_send(chan, mavlink_msg_heartbeat_send(chan,
mavlink_system.type, mavlink_system.type,
MAV_AUTOPILOT_PX4, MAV_AUTOPILOT_PX4,
mavlink_mode, mavlink_base_mode,
v_status.navigation_state, mavlink_custom_mode,
mavlink_state); mavlink_state);
} }
@ -473,8 +474,9 @@ l_actuator_outputs(const struct listener *l)
/* translate the current syste state to mavlink state and mode */ /* translate the current syste state to mavlink state and mode */
uint8_t mavlink_state = 0; uint8_t mavlink_state = 0;
uint8_t mavlink_mode = 0; uint8_t mavlink_base_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_mode); uint32_t mavlink_custom_mode = 0;
get_mavlink_mode_and_state(&mavlink_state, &mavlink_base_mode, &mavlink_custom_mode);
/* HIL message as per MAVLink spec */ /* HIL message as per MAVLink spec */
@ -491,7 +493,7 @@ l_actuator_outputs(const struct listener *l)
-1, -1,
-1, -1,
-1, -1,
mavlink_mode, mavlink_base_mode,
0); 0);
} else if (mavlink_system.type == MAV_TYPE_HEXAROTOR) { } else if (mavlink_system.type == MAV_TYPE_HEXAROTOR) {
@ -505,7 +507,7 @@ l_actuator_outputs(const struct listener *l)
((act_outputs.output[5] - 900.0f) / 600.0f) / 2.0f, ((act_outputs.output[5] - 900.0f) / 600.0f) / 2.0f,
-1, -1,
-1, -1,
mavlink_mode, mavlink_base_mode,
0); 0);
} else if (mavlink_system.type == MAV_TYPE_OCTOROTOR) { } else if (mavlink_system.type == MAV_TYPE_OCTOROTOR) {
@ -519,7 +521,7 @@ l_actuator_outputs(const struct listener *l)
((act_outputs.output[5] - 900.0f) / 600.0f) / 2.0f, ((act_outputs.output[5] - 900.0f) / 600.0f) / 2.0f,
((act_outputs.output[6] - 900.0f) / 600.0f) / 2.0f, ((act_outputs.output[6] - 900.0f) / 600.0f) / 2.0f,
((act_outputs.output[7] - 900.0f) / 600.0f) / 2.0f, ((act_outputs.output[7] - 900.0f) / 600.0f) / 2.0f,
mavlink_mode, mavlink_base_mode,
0); 0);
} else { } else {
@ -533,7 +535,7 @@ l_actuator_outputs(const struct listener *l)
(act_outputs.output[5] - 1500.0f) / 500.0f, (act_outputs.output[5] - 1500.0f) / 500.0f,
(act_outputs.output[6] - 1500.0f) / 500.0f, (act_outputs.output[6] - 1500.0f) / 500.0f,
(act_outputs.output[7] - 1500.0f) / 500.0f, (act_outputs.output[7] - 1500.0f) / 500.0f,
mavlink_mode, mavlink_base_mode,
0); 0);
} }
} }

2
src/modules/mavlink/util.h

@ -51,4 +51,4 @@ extern mavlink_wpm_storage *wpm;
/** /**
* Translate the custom state into standard mavlink modes and state. * Translate the custom state into standard mavlink modes and state.
*/ */
extern void get_mavlink_mode_and_state(uint8_t *mavlink_state, uint8_t *mavlink_mode); extern void get_mavlink_mode_and_state(uint8_t *mavlink_state, uint8_t *mavlink_base_mode, uint32_t *mavlink_custom_mode);

Loading…
Cancel
Save