diff --git a/ArduPlane/GCS_Mavlink.cpp b/ArduPlane/GCS_Mavlink.cpp index d0f2e4b4f2..8c7abccd3d 100644 --- a/ArduPlane/GCS_Mavlink.cpp +++ b/ArduPlane/GCS_Mavlink.cpp @@ -981,16 +981,16 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_packet(const mavlink_command_in return MAV_RESULT_ACCEPTED; #endif + case MAV_CMD_DO_CHANGE_SPEED: + return handle_command_DO_CHANGE_SPEED(packet); + default: return GCS_MAVLINK::handle_command_int_packet(packet, msg); } } -MAV_RESULT GCS_MAVLINK_Plane::handle_command_long_packet(const mavlink_command_long_t &packet, const mavlink_message_t &msg) +MAV_RESULT GCS_MAVLINK_Plane::handle_command_DO_CHANGE_SPEED(const mavlink_command_int_t &packet) { - switch(packet.command) { - - case MAV_CMD_DO_CHANGE_SPEED: { // if we're in failsafe modes (e.g., RTL, LOITER) or in pilot // controlled modes (e.g., MANUAL, TRAINING) // this command should be ignored since it comes in from GCS @@ -1001,15 +1001,15 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_long_packet(const mavlink_command_l return MAV_RESULT_FAILED; } - AP_Mission::Mission_Command cmd; - if (AP_Mission::mavlink_cmd_long_to_mission_cmd(packet, cmd) != MAV_MISSION_ACCEPTED) { - return MAV_RESULT_DENIED; - } - if (plane.do_change_speed(cmd)) { + if (plane.do_change_speed(packet.param1, packet.param2, packet.param3)) { return MAV_RESULT_ACCEPTED; } return MAV_RESULT_FAILED; - } +} + +MAV_RESULT GCS_MAVLINK_Plane::handle_command_long_packet(const mavlink_command_long_t &packet, const mavlink_message_t &msg) +{ + switch(packet.command) { case MAV_CMD_NAV_LOITER_UNLIM: plane.set_mode(plane.mode_loiter, ModeReason::GCS_COMMAND); diff --git a/ArduPlane/GCS_Mavlink.h b/ArduPlane/GCS_Mavlink.h index 7d391fcc5a..b84324a079 100644 --- a/ArduPlane/GCS_Mavlink.h +++ b/ArduPlane/GCS_Mavlink.h @@ -54,7 +54,7 @@ private: void handle_change_alt_request(AP_Mission::Mission_Command &cmd) override; MAV_RESULT handle_command_int_do_reposition(const mavlink_command_int_t &packet); MAV_RESULT handle_command_int_guided_slew_commands(const mavlink_command_int_t &packet); - + MAV_RESULT handle_command_DO_CHANGE_SPEED(const mavlink_command_int_t &packet); bool try_send_message(enum ap_message id) override; void packetReceived(const mavlink_status_t &status, const mavlink_message_t &msg) override; diff --git a/ArduPlane/Plane.h b/ArduPlane/Plane.h index 5369536a43..ffc34f3a90 100644 --- a/ArduPlane/Plane.h +++ b/ArduPlane/Plane.h @@ -945,6 +945,7 @@ private: bool is_land_command(uint16_t cmd) const; + bool do_change_speed(uint8_t speedtype, float speed_target_ms, float rhtottle_pct); /* return true if in a specific AUTO mission command */ diff --git a/ArduPlane/commands_logic.cpp b/ArduPlane/commands_logic.cpp index 2edc79b158..e5ac80ae73 100644 --- a/ArduPlane/commands_logic.cpp +++ b/ArduPlane/commands_logic.cpp @@ -946,28 +946,36 @@ void Plane::do_loiter_at_location() bool Plane::do_change_speed(const AP_Mission::Mission_Command& cmd) { - switch (cmd.content.speed.speed_type) - { + return do_change_speed( + (uint8_t)cmd.content.speed.speed_type, + cmd.content.speed.target_ms, + cmd.content.speed.throttle_pct + ); +} + +bool Plane::do_change_speed(uint8_t speedtype, float speed_target_ms, float throttle_pct) +{ + switch (speedtype) { case 0: // Airspeed - if (is_equal(cmd.content.speed.target_ms, -2.0f)) { + if (is_equal(speed_target_ms, -2.0f)) { new_airspeed_cm = -1; // return to default airspeed return true; - } else if ((cmd.content.speed.target_ms >= aparm.airspeed_min.get()) && - (cmd.content.speed.target_ms <= aparm.airspeed_max.get())) { - new_airspeed_cm = cmd.content.speed.target_ms * 100; //new airspeed target for AUTO or GUIDED modes - gcs().send_text(MAV_SEVERITY_INFO, "Set airspeed %u m/s", (unsigned)cmd.content.speed.target_ms); + } else if ((speed_target_ms >= aparm.airspeed_min.get()) && + (speed_target_ms <= aparm.airspeed_max.get())) { + new_airspeed_cm = speed_target_ms * 100; //new airspeed target for AUTO or GUIDED modes + gcs().send_text(MAV_SEVERITY_INFO, "Set airspeed %u m/s", (unsigned)speed_target_ms); return true; } break; case 1: // Ground speed - gcs().send_text(MAV_SEVERITY_INFO, "Set groundspeed %u", (unsigned)cmd.content.speed.target_ms); - aparm.min_gndspeed_cm.set(cmd.content.speed.target_ms * 100); + gcs().send_text(MAV_SEVERITY_INFO, "Set groundspeed %u", (unsigned)speed_target_ms); + aparm.min_gndspeed_cm.set(speed_target_ms * 100); return true; } - if (cmd.content.speed.throttle_pct > 0 && cmd.content.speed.throttle_pct <= 100) { - gcs().send_text(MAV_SEVERITY_INFO, "Set throttle %u", (unsigned)cmd.content.speed.throttle_pct); - aparm.throttle_cruise.set(cmd.content.speed.throttle_pct); + if (throttle_pct > 0 && throttle_pct <= 100) { + gcs().send_text(MAV_SEVERITY_INFO, "Set throttle %u", (unsigned)throttle_pct); + aparm.throttle_cruise.set(throttle_pct); return true; }