Browse Source

manual_control: send initial mode in the beginning

In order for commander to know the desired mode we need to send the
initial position of the mode slot.
master
Julian Oes 4 years ago committed by Matthias Grob
parent
commit
916ffef04c
  1. 87
      src/modules/manual_control/ManualControl.cpp
  2. 1
      src/modules/manual_control/ManualControl.hpp

87
src/modules/manual_control/ManualControl.cpp

@ -164,44 +164,7 @@ void ManualControl::Run()
if (_selector.setpoint().data_source == manual_control_input_s::SOURCE_RC) { if (_selector.setpoint().data_source == manual_control_input_s::SOURCE_RC) {
if (_previous_switches_initialized) { if (_previous_switches_initialized) {
if (switches.mode_slot != _previous_switches.mode_slot) { if (switches.mode_slot != _previous_switches.mode_slot) {
evaluate_mode_slot(switches.mode_slot);
switch (switches.mode_slot) {
case manual_control_switches_s::MODE_SLOT_NONE:
_last_mode_slot_flt = -1;
break;
case manual_control_switches_s::MODE_SLOT_1:
_last_mode_slot_flt = _param_fltmode_1.get();
break;
case manual_control_switches_s::MODE_SLOT_2:
_last_mode_slot_flt = _param_fltmode_2.get();
break;
case manual_control_switches_s::MODE_SLOT_3:
_last_mode_slot_flt = _param_fltmode_3.get();
break;
case manual_control_switches_s::MODE_SLOT_4:
_last_mode_slot_flt = _param_fltmode_4.get();
break;
case manual_control_switches_s::MODE_SLOT_5:
_last_mode_slot_flt = _param_fltmode_5.get();
break;
case manual_control_switches_s::MODE_SLOT_6:
_last_mode_slot_flt = _param_fltmode_6.get();
break;
default:
_last_mode_slot_flt = -1;
PX4_WARN("mode slot overflow");
break;
}
send_mode_command(_last_mode_slot_flt);
} }
if (switches.arm_switch != _previous_switches.arm_switch) { if (switches.arm_switch != _previous_switches.arm_switch) {
@ -268,10 +231,14 @@ void ManualControl::Run()
send_vtol_transition_command(vtol_vehicle_status_s::VEHICLE_VTOL_STATE_MC); send_vtol_transition_command(vtol_vehicle_status_s::VEHICLE_VTOL_STATE_MC);
} }
} }
} else {
// Send an initial command to switch to the mode requested by R
evaluate_mode_slot(switches.mode_slot);
} }
_previous_switches = switches;
_previous_switches_initialized = true; _previous_switches_initialized = true;
_previous_switches = switches;
} else { } else {
_previous_switches = {}; _previous_switches = {};
@ -312,6 +279,48 @@ void ManualControl::Run()
perf_end(_loop_perf); perf_end(_loop_perf);
} }
void ManualControl::evaluate_mode_slot(uint8_t mode_slot)
{
switch (mode_slot) {
case manual_control_switches_s::MODE_SLOT_NONE:
_last_mode_slot_flt = -1;
break;
case manual_control_switches_s::MODE_SLOT_1:
_last_mode_slot_flt = _param_fltmode_1.get();
break;
case manual_control_switches_s::MODE_SLOT_2:
_last_mode_slot_flt = _param_fltmode_2.get();
break;
case manual_control_switches_s::MODE_SLOT_3:
_last_mode_slot_flt = _param_fltmode_3.get();
break;
case manual_control_switches_s::MODE_SLOT_4:
_last_mode_slot_flt = _param_fltmode_4.get();
break;
case manual_control_switches_s::MODE_SLOT_5:
_last_mode_slot_flt = _param_fltmode_5.get();
break;
case manual_control_switches_s::MODE_SLOT_6:
_last_mode_slot_flt = _param_fltmode_6.get();
break;
default:
_last_mode_slot_flt = -1;
PX4_WARN("mode slot overflow");
break;
}
PX4_WARN("send mode slot: %d", _last_mode_slot_flt);
send_mode_command(_last_mode_slot_flt);
}
void ManualControl::send_mode_command(int32_t commander_main_state) void ManualControl::send_mode_command(int32_t commander_main_state)
{ {
if (commander_main_state == -1) { if (commander_main_state == -1) {

1
src/modules/manual_control/ManualControl.hpp

@ -84,6 +84,7 @@ private:
void Run() override; void Run() override;
void evaluate_mode_slot(uint8_t mode_slot);
void send_mode_command(int32_t commander_main_state); void send_mode_command(int32_t commander_main_state);
void send_arm_command(bool should_arm, ArmingOrigin origin); void send_arm_command(bool should_arm, ArmingOrigin origin);
void send_rtl_command(); void send_rtl_command();

Loading…
Cancel
Save