60 extern pthread_mutex_t px4_modules_mutex;
118 ModuleBase() : _task_should_exit{
false} {}
119 virtual ~ModuleBase() {}
128 static int main(
int argc,
char *argv[])
131 strcmp(argv[1],
"-h") == 0 ||
132 strcmp(argv[1],
"help") == 0 ||
133 strcmp(argv[1],
"info") == 0 ||
134 strcmp(argv[1],
"usage") == 0) {
135 return T::print_usage();
138 if (strcmp(argv[1],
"start") == 0) {
140 return start_command_base(argc - 1, argv + 1);
143 if (strcmp(argv[1],
"status") == 0) {
144 return status_command();
147 if (strcmp(argv[1],
"stop") == 0) {
148 return stop_command();
152 int ret = T::custom_command(argc - 1, argv + 1);
168 static int run_trampoline(
int argc,
char *argv[])
178 T *
object = T::instantiate(argc, argv);
179 _object.store(
object);
185 PX4_ERR(
"failed to instantiate object");
201 static int start_command_base(
int argc,
char *argv[])
208 PX4_ERR(
"Task already running");
211 ret = T::task_spawn(argc, argv);
214 PX4_ERR(
"Task start failed (%i)", ret);
227 static int stop_command()
233 T *
object = _object.load();
236 object->request_stop();
245 if (++i > 100 && _task_id != -1) {
246 if (_task_id != task_id_is_work_queue) {
252 delete _object.load();
253 _object.store(
nullptr);
258 }
while (_task_id != -1);
277 static int status_command()
282 if (is_running() && _object.load()) {
283 T *
object = _object.load();
284 ret =
object->print_status();
287 PX4_INFO(
"not running");
299 virtual int print_status()
317 static bool is_running()
319 return _task_id != -1;
327 virtual void request_stop()
329 _task_should_exit.store(
true);
336 bool should_exit()
const 338 return _task_should_exit.load();
346 static void exit_and_cleanup()
354 delete _object.load();
355 _object.store(
nullptr);
365 static int wait_until_running()
373 }
while (!_object.load() && ++i < 400);
376 PX4_ERR(
"Timed out while waiting for thread to start");
386 static T *get_instance()
388 return (T *)_object.load();
395 static px4::atomic<T *> _object;
401 static constexpr
const int task_id_is_work_queue = -2;
407 static void lock_module()
409 pthread_mutex_lock(&px4_modules_mutex);
415 static void unlock_module()
417 pthread_mutex_unlock(&px4_modules_mutex);
421 px4::atomic_bool _task_should_exit{
false};
425 px4::atomic<T *> ModuleBase<T>::_object{
nullptr};
428 int ModuleBase<T>::_task_id = -1;
492 #define PRINT_MODULE_USAGE_COMMAND(name) \ 493 PRINT_MODULE_USAGE_COMMAND_DESCR(name, NULL); 498 #define PRINT_MODULE_USAGE_DEFAULT_COMMANDS() \ 499 PRINT_MODULE_USAGE_COMMAND("stop"); \ 500 PRINT_MODULE_USAGE_COMMAND_DESCR("status", "print status info"); 515 const char *description,
bool is_optional);
527 const char *description,
bool is_optional);
552 const char *description,
bool is_optional);
__BEGIN_DECLS __EXPORT void PRINT_MODULE_DESCRIPTION(const char *description)
Module documentation and command usage help methods.
Definition: module.cpp:51
__EXPORT int px4_task_delete(px4_task_t pid)
Deletes a task - does not do resource cleanup.
Definition: px4_posix_tasks.cpp:283
Provides atomic integers and counters.
__EXPORT void PRINT_MODULE_USAGE_NAME(const char *executable_name, const char *category)
Prints the command name.
Definition: module.cpp:61
A set of useful macros for enhanced runtime and compile time error detection and warning suppression...
__EXPORT void PRINT_MODULE_USAGE_ARG(const char *values, const char *description, bool is_optional)
Prints the definition for an argument, which does not have the typical -p <val> form, but for example 'param set '.
Definition: module.cpp:158
__EXPORT void PRINT_MODULE_USAGE_PARAM_STRING(char option_char, const char *default_val, const char *values, const char *description, bool is_optional)
Prints a string parameter.
Definition: module.cpp:132
__EXPORT void PRINT_MODULE_USAGE_PARAM_COMMENT(const char *comment)
Prints a comment, that applies to the next arguments or parameters.
Definition: module.cpp:87
Platform dependant logging/debug implementation.
__EXPORT void PRINT_MODULE_USAGE_PARAM_FLAG(char option_char, const char *description, bool is_optional)
Prints a flag parameter, without any value.
Definition: module.cpp:122
__EXPORT void PRINT_MODULE_USAGE_NAME_SIMPLE(const char *executable_name, const char *category)
Prints the name for a command without any sub-commands (.
Definition: module.cpp:72
__EXPORT void PRINT_MODULE_USAGE_SUBCATEGORY(const char *subcategory)
Specify a subcategory (optional).
Definition: module.cpp:67
__EXPORT void PRINT_MODULE_USAGE_COMMAND_DESCR(const char *name, const char *description)
Prints a command with a short description what it does.
Definition: module.cpp:77
__EXPORT void PRINT_MODULE_USAGE_PARAM_INT(char option_char, int default_val, int min_val, int max_val, const char *description, bool is_optional)
Prints an integer parameter.
Definition: module.cpp:92
__EXPORT void PRINT_MODULE_USAGE_PARAM_FLOAT(char option_char, float default_val, float min_val, float max_val, const char *description, bool is_optional)
Prints a float parameter.
Definition: module.cpp:107