Skip to content
Snippets Groups Projects
Commit e8cc93ec authored by Matthias Grob's avatar Matthias Grob Committed by Beat Küng
Browse files

FlightTasks: create enumeration type for the task index while still offering...

FlightTasks: create enumeration type for the task index while still offering integer index with checks
parent f135e6dd
No related branches found
No related tags found
No related merge requests found
......@@ -25,10 +25,10 @@ const vehicle_local_position_setpoint_s &FlightTasks::getPositionSetpoint()
}
}
int FlightTasks::switchTask(int task_number)
int FlightTasks::switchTask(FlightTaskIndex new_task_index)
{
/* switch to the running task, nothing to do */
if (task_number == _current_task_index) {
if (new_task_index == _current_task_index) {
return 0;
}
......@@ -36,46 +36,42 @@ int FlightTasks::switchTask(int task_number)
if (_current_task) {
_current_task->~FlightTask();
_current_task = nullptr;
_current_task_index = -1;
_current_task_index = FlightTaskIndex::None;
}
switch (task_number) {
case 0:
/* This part will change with the next PR that uses enum */
return -1;
switch (new_task_index) {
case FlightTaskIndex::None:
/* disable tasks is a success */
return 0;
case 1:
_current_task = new (&_task_union.orbit) FlightTaskOrbit(this, "ORB");
case FlightTaskIndex::Stabilized:
_current_task = new (&_task_union.stabilized) FlightTaskManualStabilized(this, "MANSTAB");
break;
case 2:
_current_task = new (&_task_union.sport) FlightTaskSport(this, "SPO");
case FlightTaskIndex::Altitude:
_current_task = new (&_task_union.altitude) FlightTaskManualAltitude(this, "MANALT");
break;
case 3:
_current_task = new (&_task_union.altitude) FlightTaskManualAltitude(this, "MANALT");
case FlightTaskIndex::AltitudeSmooth:
_current_task = new (&_task_union.altitude_smooth) FlightTaskManualAltitudeSmooth(this, "MANALTSM");
break;
case 4:
case FlightTaskIndex::Position:
_current_task = new (&_task_union.position) FlightTaskManualPosition(this, "MANPOS");
break;
case 5:
_current_task = new (&_task_union.stabilized) FlightTaskManualStabilized(this, "MANSTAB");
case FlightTaskIndex::PositionSmooth:
_current_task = new (&_task_union.position_smooth) FlightTaskManualPositionSmooth(this, "MANPOSSM");
break;
case 6:
_current_task = new (&_task_union.altitude_smooth) FlightTaskManualAltitudeSmooth(this, "MANALTSM");
case FlightTaskIndex::Orbit:
_current_task = new (&_task_union.orbit) FlightTaskOrbit(this, "ORB");
break;
case 7:
_current_task = new (&_task_union.position_smooth) FlightTaskManualPositionSmooth(this, "MANPOSSM");
case FlightTaskIndex::Sport:
_current_task = new (&_task_union.sport) FlightTaskSport(this, "SPO");
break;
case -1:
/* disable tasks is a success */
return 0;
default:
/* invalid task */
return -1;
......@@ -85,7 +81,7 @@ int FlightTasks::switchTask(int task_number)
if (!_current_task->initializeSubscriptions(_subscription_array)) {
_current_task->~FlightTask();
_current_task = nullptr;
_current_task_index = -1;
_current_task_index = FlightTaskIndex::None;
return -2;
}
......@@ -95,12 +91,24 @@ int FlightTasks::switchTask(int task_number)
if (!_current_task->updateInitialize() || !_current_task->activate()) {
_current_task->~FlightTask();
_current_task = nullptr;
_current_task_index = -1;
_current_task_index = FlightTaskIndex::None;
return -3;
}
_current_task_index = task_number;
return 1;
_current_task_index = new_task_index;
return 0;
}
int FlightTasks::switchTask(int new_task_index)
{
/* make sure we are in range of the enumeration before casting */
if (static_cast<int>(FlightTaskIndex::None) <= new_task_index &&
static_cast<int>(FlightTaskIndex::Count) > new_task_index) {
return switchTask(FlightTaskIndex(new_task_index));
}
switchTask(FlightTaskIndex::None);
return -1;
}
void FlightTasks::_updateCommand()
......@@ -127,6 +135,7 @@ void FlightTasks::_updateCommand()
}
/* evaluate command */
// TODO: remapping of the Mavlink definition to the internal tasks necessary
int switch_result = switchTask(int(command.param1 + 0.5f));
uint8_t cmd_result = vehicle_command_ack_s::VEHICLE_RESULT_FAILED;
......
......@@ -54,6 +54,19 @@
#include <new>
enum class FlightTaskIndex : int {
None = -1,
Stabilized,
Altitude,
AltitudeSmooth,
Position,
PositionSmooth,
Orbit,
Sport,
Count // number of tasks
};
class FlightTasks : control::SuperBlock
{
public:
......@@ -89,23 +102,21 @@ public:
* Switch to the next task in the available list (for testing)
* @return true on success, false on error
*/
int switchTask()
{
return switchTask(_current_task_index + 1);
}
int switchTask() { return switchTask(static_cast<int>(_current_task_index) + 1); }
/**
* Switch to a specific task (for normal usage)
* @param task number to switch to
* @param task index to switch to
* @return 1 on success, 0 on no change, <0 on error
*/
int switchTask(int task_number);
int switchTask(FlightTaskIndex new_task_index);
int switchTask(int new_task_index);
/**
* Get the number of the active task
* @return number of active task, -1 if there is none
*/
int getActiveTask() const { return _current_task_index; }
int getActiveTask() const { return static_cast<int>(_current_task_index); }
/**
* Check if any task is active
......@@ -133,7 +144,7 @@ private:
} _task_union; /**< storage for the currently active task */
FlightTask *_current_task = nullptr;
int _current_task_index = -1;
FlightTaskIndex _current_task_index = FlightTaskIndex::None;
SubscriptionArray _subscription_array;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment