ardupilot/APMrover2/RC_Channel.cpp

243 lines
6.1 KiB
C++
Raw Normal View History

2015-05-13 00:16:45 -03:00
#include "Rover.h"
#include "RC_Channel.h"
// defining these two macros and including the RC_Channels_VarInfo
// header defines the parameter information common to all vehicle
// types
#define RC_CHANNELS_SUBCLASS RC_Channels_Rover
#define RC_CHANNEL_SUBCLASS RC_Channel_Rover
#include <RC_Channel/RC_Channels_VarInfo.h>
Mode *Rover::mode_from_mode_num(const enum Mode::Number num)
2017-07-18 23:19:08 -03:00
{
Mode *ret = nullptr;
switch (num) {
case Mode::Number::MANUAL:
2017-07-18 23:19:08 -03:00
ret = &mode_manual;
break;
case Mode::Number::ACRO:
ret = &mode_acro;
break;
case Mode::Number::STEERING:
2017-07-18 23:19:08 -03:00
ret = &mode_steering;
break;
case Mode::Number::HOLD:
2017-07-18 23:19:08 -03:00
ret = &mode_hold;
break;
case Mode::Number::LOITER:
2018-04-28 03:31:31 -03:00
ret = &mode_loiter;
break;
case Mode::Number::FOLLOW:
ret = &mode_follow;
break;
2018-07-02 04:21:37 -03:00
case Mode::Number::SIMPLE:
ret = &mode_simple;
break;
case Mode::Number::AUTO:
2017-07-18 23:19:08 -03:00
ret = &mode_auto;
break;
case Mode::Number::RTL:
2017-07-18 23:19:08 -03:00
ret = &mode_rtl;
break;
case Mode::Number::SMART_RTL:
ret = &mode_smartrtl;
break;
case Mode::Number::GUIDED:
2017-07-18 23:19:08 -03:00
ret = &mode_guided;
break;
case Mode::Number::INITIALISING:
2017-07-18 23:19:08 -03:00
ret = &mode_initializing;
break;
default:
break;
}
return ret;
}
int8_t RC_Channels_Rover::flight_mode_channel_number() const
{
return rover.g.mode_channel;
}
void RC_Channel_Rover::mode_switch_changed(modeswitch_pos_t new_pos)
{
if (new_pos < 0 || (uint8_t)new_pos > rover.num_modes) {
// should not have been called
return;
}
Mode *new_mode = rover.mode_from_mode_num((Mode::Number)rover.modes[new_pos].get());
if (new_mode != nullptr) {
rover.set_mode(*new_mode, MODE_REASON_TX_COMMAND);
}
}
// init_aux_switch_function - initialize aux functions
void RC_Channel_Rover::init_aux_function(const aux_func_t ch_option, const aux_switch_pos_t ch_flag)
{
// init channel options
switch(ch_option) {
// the following functions do not need initialising:
case SAVE_WP:
case LEARN_CRUISE:
case ARMDISARM:
case MANUAL:
case ACRO:
case STEERING:
case HOLD:
case AUTO:
case GUIDED:
case LOITER:
case FOLLOW:
break;
default:
RC_Channel::init_aux_function(ch_option, ch_flag);
break;
}
}
bool RC_Channels_Rover::has_valid_input() const
{
if (rover.failsafe.bits & FAILSAFE_EVENT_THROTTLE) {
return false;
}
return true;
}
void RC_Channel_Rover::do_aux_function_change_mode(Mode &mode,
const aux_switch_pos_t ch_flag)
{
switch(ch_flag) {
case HIGH:
rover.set_mode(mode, MODE_REASON_TX_COMMAND);
break;
case MIDDLE:
// do nothing
break;
case LOW:
if (rover.control_mode == &mode) {
rc().reset_mode_switch();
}
}
}
void RC_Channel_Rover::do_aux_function(const aux_func_t ch_option, const aux_switch_pos_t ch_flag)
{
switch (ch_option) {
case DO_NOTHING:
break;
case SAVE_WP:
if (ch_flag == HIGH) {
// do nothing if in AUTO mode
if (rover.control_mode == &rover.mode_auto) {
return;
}
// if disarmed clear mission and set home to current location
if (!rover.arming.is_armed()) {
rover.mission.clear();
rover.set_home_to_current_location(false);
return;
}
// record the waypoint if not in auto mode
if (rover.control_mode != &rover.mode_auto) {
// create new mission command
AP_Mission::Mission_Command cmd = {};
// set new waypoint to current location
cmd.content.location = rover.current_loc;
// make the new command to a waypoint
cmd.id = MAV_CMD_NAV_WAYPOINT;
// save command
if (rover.mission.add_cmd(cmd)) {
hal.console->printf("Added waypoint %u", (unsigned)rover.mission.num_commands());
}
}
}
break;
// learn cruise speed and throttle
case LEARN_CRUISE:
if (ch_flag == HIGH) {
rover.cruise_learn_start();
} else if (ch_flag == LOW) {
rover.cruise_learn_complete();
}
break;
2017-11-30 23:15:50 -04:00
// arm or disarm the motors
case ARMDISARM:
if (ch_flag == HIGH) {
rover.arm_motors(AP_Arming::RUDDER);
} else if (ch_flag == LOW) {
rover.disarm_motors();
2017-11-30 23:15:50 -04:00
}
break;
// set mode to Manual
case MANUAL:
do_aux_function_change_mode(rover.mode_manual, ch_flag);
break;
// set mode to Acro
case ACRO:
do_aux_function_change_mode(rover.mode_acro, ch_flag);
break;
// set mode to Steering
case STEERING:
do_aux_function_change_mode(rover.mode_steering, ch_flag);
break;
// set mode to Hold
case HOLD:
do_aux_function_change_mode(rover.mode_hold, ch_flag);
break;
// set mode to Auto
case AUTO:
do_aux_function_change_mode(rover.mode_auto, ch_flag);
break;
// set mode to RTL
case RTL:
do_aux_function_change_mode(rover.mode_rtl, ch_flag);
break;
// set mode to SmartRTL
case SMART_RTL:
do_aux_function_change_mode(rover.mode_smartrtl, ch_flag);
break;
// set mode to Guided
case GUIDED:
do_aux_function_change_mode(rover.mode_guided, ch_flag);
break;
2018-05-24 05:13:12 -03:00
// Set mode to LOITER
case LOITER:
do_aux_function_change_mode(rover.mode_loiter, ch_flag);
2018-05-24 05:13:12 -03:00
break;
2018-05-24 01:47:07 -03:00
// Set mode to Follow
case FOLLOW:
do_aux_function_change_mode(rover.mode_follow, ch_flag);
break;
2018-07-02 04:21:37 -03:00
// set mode to Simple
case SIMPLE:
do_aux_function_change_mode(rover.mode_simple, ch_flag);
break;
default:
RC_Channel::do_aux_function(ch_option, ch_flag);
2018-05-24 01:47:07 -03:00
break;
}
}