2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-07 17:43:15 +00:00
|
|
|
#include "fts_control.hpp"
|
2024-06-13 17:24:20 +00:00
|
|
|
#include "px4_platform_common/board_common.h"
|
|
|
|
|
|
|
|
|
|
|
2024-05-11 12:57:54 +00:00
|
|
|
|
|
|
|
|
FTSController::FTSController() :
|
|
|
|
|
ModuleParams(nullptr),
|
|
|
|
|
ScheduledWorkItem("fts_controller", px4::wq_configurations::lp_default),
|
|
|
|
|
_cycle_perf(perf_alloc(PC_ELAPSED, "fts_controller"": cycle")),
|
|
|
|
|
_interval_perf(perf_alloc(PC_INTERVAL, "fts_controller"": interval"))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FTSController::~FTSController()
|
|
|
|
|
{
|
|
|
|
|
ScheduleClear();
|
|
|
|
|
perf_free(_cycle_perf);
|
|
|
|
|
perf_free(_interval_perf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
FTSController::init()
|
|
|
|
|
{
|
|
|
|
|
// Update parameters
|
|
|
|
|
if (!update_param()) {
|
2024-06-07 17:43:15 +00:00
|
|
|
PX4_WARN("fts_control failed to get necessary parameters.");
|
2024-05-11 12:57:54 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
2024-06-13 17:24:20 +00:00
|
|
|
uint8_t guid[PX4_GUID_BYTE_LENGTH];
|
|
|
|
|
board_get_px4_guid(guid);
|
|
|
|
|
fts_id.uidBytes[0]=guid[0];
|
|
|
|
|
fts_id.uidBytes[1]=guid[1];
|
|
|
|
|
fts_id.uidBytes[2]=guid[2];
|
|
|
|
|
fts_id.uidBytes[3]=guid[3];
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-07 17:43:15 +00:00
|
|
|
// run every 1s
|
|
|
|
|
ScheduleOnInterval(1000_ms);
|
2024-05-11 12:57:54 +00:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2024-06-14 08:51:31 +00:00
|
|
|
FTSController::Run() {
|
|
|
|
|
if (should_exit()) {
|
|
|
|
|
ScheduleClear();
|
|
|
|
|
exit_and_cleanup();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
perf_begin(_cycle_perf);
|
|
|
|
|
perf_count(_interval_perf);
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
// Update all subscriber
|
|
|
|
|
update_topics();
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
// Update FTS comm status
|
|
|
|
|
update_status();
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-08 16:58:04 +00:00
|
|
|
// Update AUTO-FTS status
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_auto_fts_message_sub.updated()) {
|
2024-06-08 16:58:04 +00:00
|
|
|
_auto_fts_message_sub.copy(&_auto_fts_message);
|
2024-06-11 17:54:20 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_auto_fts_message.gps_lock != 0) {
|
2024-06-11 17:54:20 +00:00
|
|
|
arm();
|
|
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_auto_fts_message.geofence_violated != 0) {
|
2024-06-11 17:54:20 +00:00
|
|
|
fire();
|
2024-06-14 08:51:31 +00:00
|
|
|
} else {
|
2024-06-11 17:54:20 +00:00
|
|
|
reset();
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
} else {
|
2024-06-11 17:54:20 +00:00
|
|
|
disarm();
|
2024-06-08 16:58:04 +00:00
|
|
|
reset();
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-13 17:24:20 +00:00
|
|
|
// Update GROUND-FTS status
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_ground_fts_message_sub.updated()) {
|
2024-06-13 17:24:20 +00:00
|
|
|
|
|
|
|
|
_ground_fts_message_sub.copy(&_ground_fts_message);
|
|
|
|
|
|
|
|
|
|
if (_ground_fts_message.message == PING) {
|
|
|
|
|
//PING COMMAND
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_ground_fts_message.fts_uid == fts_id.uid) {
|
2024-06-13 17:24:20 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
_ground_fts_response.message = PONG;
|
|
|
|
|
_ground_fts_response.fts_uid = fts_id.uid;
|
2024-06-13 17:24:20 +00:00
|
|
|
_ground_fts_response_pub.publish(_ground_fts_response);
|
|
|
|
|
|
|
|
|
|
}
|
2024-06-14 08:51:31 +00:00
|
|
|
} else if (_ground_fts_message.message == PAIR) {
|
2024-06-13 17:24:20 +00:00
|
|
|
//PAIR COMMAND
|
|
|
|
|
_ground_fts_response.message = PAIR;
|
|
|
|
|
_ground_fts_response.fts_uid = fts_id.uid;
|
2024-06-13 20:19:48 +00:00
|
|
|
_ground_fts_response_pub.publish(_ground_fts_response);
|
2024-06-13 17:24:20 +00:00
|
|
|
}
|
|
|
|
|
}
|
2024-05-11 12:57:54 +00:00
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
if (_emergency_command_sub.updated()) {
|
|
|
|
|
|
|
|
|
|
_emergency_command_sub.copy(&_emergency_command);
|
|
|
|
|
|
|
|
|
|
if (_emergency_command.param == fts_id.uid) {
|
|
|
|
|
if (_emergency_command.emergency_command == ACTIVATE_FTS) {
|
|
|
|
|
//TERMINATE COMMAND
|
|
|
|
|
fire();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Publish FTS controller state
|
|
|
|
|
_fts_state.timestamp = hrt_absolute_time();
|
|
|
|
|
|
|
|
|
|
perf_end(_cycle_perf);
|
|
|
|
|
}
|
2024-05-11 12:57:54 +00:00
|
|
|
}
|
|
|
|
|
|
2024-06-14 08:51:31 +00:00
|
|
|
void
|
|
|
|
|
FTSController::update_status()
|
2024-05-11 12:57:54 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// Update FTS state
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 17:41:24 +00:00
|
|
|
void FTSController::send_fts_state()
|
2024-05-11 12:57:54 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FTSController::update_topics()
|
|
|
|
|
{
|
2024-06-08 16:58:04 +00:00
|
|
|
_fts_state_pub.publish(_fts_state);
|
2024-05-11 12:57:54 +00:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FTSController::update_param()
|
|
|
|
|
{
|
|
|
|
|
|
2024-06-07 17:43:15 +00:00
|
|
|
float fts_comm_timeout_s = 5.0f;
|
2024-05-11 12:57:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
_fts_comm_timeout_threshold_us = (uint64_t)fts_comm_timeout_s * 1000000;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FTSController::task_spawn(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
FTSController *instance = new FTSController();
|
|
|
|
|
|
|
|
|
|
if (instance) {
|
|
|
|
|
_object.store(instance);
|
|
|
|
|
_task_id = task_id_is_work_queue;
|
|
|
|
|
|
|
|
|
|
if (instance->init()) {
|
|
|
|
|
return PX4_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
PX4_ERR("alloc failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete instance;
|
|
|
|
|
_object.store(nullptr);
|
|
|
|
|
_task_id = -1;
|
|
|
|
|
|
|
|
|
|
return PX4_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FTSController::fire()
|
|
|
|
|
{
|
2024-06-08 16:58:04 +00:00
|
|
|
fts_drv.fts_on();
|
2024-05-11 12:57:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FTSController::reset()
|
|
|
|
|
{
|
2024-06-08 16:58:04 +00:00
|
|
|
fts_drv.fts_off();
|
2024-05-11 12:57:54 +00:00
|
|
|
}
|
|
|
|
|
|
2024-06-12 15:37:25 +00:00
|
|
|
void
|
|
|
|
|
FTSController::arm()
|
|
|
|
|
{
|
|
|
|
|
fts_drv.fts_arm();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FTSController::disarm()
|
|
|
|
|
{
|
|
|
|
|
fts_drv.fts_disarm();
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-11 12:57:54 +00:00
|
|
|
int
|
|
|
|
|
FTSController::custom_command(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
if (!strcmp(argv[0], "fire")) {
|
|
|
|
|
get_instance()->fire();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!strcmp(argv[0], "reset")) {
|
|
|
|
|
get_instance()->reset();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-13 17:24:20 +00:00
|
|
|
if (!strcmp(argv[0], "arm")) {
|
|
|
|
|
get_instance()->arm();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!strcmp(argv[0], "disarm")) {
|
|
|
|
|
get_instance()->disarm();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-11 12:57:54 +00:00
|
|
|
return print_usage("unknown command");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FTSController::print_status()
|
|
|
|
|
{
|
|
|
|
|
perf_print_counter(_cycle_perf);
|
|
|
|
|
perf_print_counter(_interval_perf);
|
|
|
|
|
|
2024-05-28 17:41:24 +00:00
|
|
|
PX4_INFO("Current FTS state:%u", _fts_state.main_fts_state);
|
2024-05-11 12:57:54 +00:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
FTSController::print_usage(const char *reason)
|
|
|
|
|
{
|
|
|
|
|
if (reason) {
|
|
|
|
|
PX4_WARN("%s\n", reason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PRINT_MODULE_DESCRIPTION(
|
|
|
|
|
R"DESCR_STR(
|
|
|
|
|
### Description
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
)DESCR_STR");
|
|
|
|
|
|
|
|
|
|
PRINT_MODULE_USAGE_NAME("fts_controller", "system");
|
|
|
|
|
PRINT_MODULE_USAGE_COMMAND("start");
|
|
|
|
|
PRINT_MODULE_USAGE_COMMAND("status");
|
2024-06-13 17:24:20 +00:00
|
|
|
PRINT_MODULE_USAGE_COMMAND("arm");
|
|
|
|
|
PRINT_MODULE_USAGE_COMMAND("disarm");
|
2024-05-11 12:57:54 +00:00
|
|
|
PRINT_MODULE_USAGE_COMMAND("fire");
|
|
|
|
|
PRINT_MODULE_USAGE_COMMAND("reset");
|
|
|
|
|
PRINT_MODULE_USAGE_DEFAULT_COMMANDS();
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern "C" __EXPORT int fts_controller_main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
return FTSController::main(argc, argv);
|
|
|
|
|
}
|