module_base: remove CRTP template pattern to reduce flash bloat (#26476)

* module_base: claude rewrite to remove CRTP bloat

* module_base: apply to all drivers/modules

* format

* fix build errors

* fix missing syntax

* remove reference to module.h in files that need module_base.h

* remove old ModuleBase<T>

* add module_base.cpp to px4_protected_layers.cmake

* fix IridiumSBD can_stop()

* fix IridiumSBD.cpp

* clang-tidy: downcast static cast

* get_instance() template accessor, revert clang-tidy global

* rename module_base.h to module.h

* revert changes in zenoh/Kconfig.topics
This commit is contained in:
Jacob Dahl
2026-02-19 15:17:17 +13:00
committed by GitHub
parent 657854ae1b
commit ce3e62841f
227 changed files with 1741 additions and 1496 deletions
@@ -43,6 +43,6 @@
extern "C" __EXPORT int eulernav_bahrs_main(int argc, char *argv[])
{
EulerNavDriver::main(argc, argv);
ModuleBase::main(EulerNavDriver::desc, argc, argv);
return OK;
}
@@ -52,20 +52,27 @@ EulerNavDriver::~EulerNavDriver()
deinitialize();
}
int EulerNavDriver::run_trampoline(int argc, char *argv[])
{
return ModuleBase::run_trampoline_impl(desc, [](int ac, char *av[]) -> ModuleBase * {
return EulerNavDriver::instantiate(ac, av);
}, argc, argv);
}
int EulerNavDriver::task_spawn(int argc, char *argv[])
{
int task_id = px4_task_spawn_cmd("bahrs", SCHED_DEFAULT, SCHED_PRIORITY_FAST_DRIVER,
Config::TASK_STACK_SIZE, (px4_main_t)&run_trampoline, argv);
if (task_id < 0) {
_task_id = -1;
desc.task_id = -1;
PX4_ERR("Failed to spawn task.");
} else {
_task_id = task_id;
desc.task_id = task_id;
}
return (_task_id < 0) ? 1 : 0;
return (desc.task_id < 0) ? 1 : 0;
}
EulerNavDriver *EulerNavDriver::instantiate(int argc, char *argv[])
@@ -232,6 +239,8 @@ void EulerNavDriver::deinitialize()
_is_initialized = false;
}
ModuleBase::Descriptor EulerNavDriver::desc{task_spawn, custom_command, print_usage};
void EulerNavDriver::processDataBuffer()
{
static_assert(Config::MIN_MESSAGE_LENGTH >= (sizeof(CSerialProtocol::SMessageHeader) + sizeof(CSerialProtocol::CrcType_t)));
@@ -45,9 +45,11 @@
#include <containers/Array.hpp>
#include "CSerialProtocol.h"
class EulerNavDriver : public ModuleBase<EulerNavDriver>, public ModuleParams
class EulerNavDriver : public ModuleBase, public ModuleParams
{
public:
static Descriptor desc;
/// @brief Class constructor
/// @param device_name Serial port to open
EulerNavDriver(const char *device_name);
@@ -57,6 +59,9 @@ public:
/// @brief Required by ModuleBase
static int task_spawn(int argc, char *argv[]);
/// @brief Required by ModuleBase
static int run_trampoline(int argc, char *argv[]);
/// @brief Required by ModuleBase
static EulerNavDriver *instantiate(int argc, char *argv[]);
+6 -4
View File
@@ -44,6 +44,8 @@
using namespace time_literals;
ModuleBase::Descriptor ILabs::desc{task_spawn, custom_command, print_usage};
// GPS epoch: 1980-01-06 00:00:00 UTC
constexpr uint64_t GPS_EPOCH_SECS = 315964800ULL;
@@ -152,8 +154,8 @@ int ILabs::task_spawn(int argc, char *argv[]) {
return PX4_ERROR;
}
_object.store(instance);
_task_id = task_id_is_work_queue;
desc.object.store(instance);
desc.task_id = task_id_is_work_queue;
instance->ScheduleNow();
@@ -227,7 +229,7 @@ int ILabs::print_status() {
void ILabs::Run() {
if (should_exit()) {
_sensor.deinit();
exit_and_cleanup();
exit_and_cleanup(desc);
return;
}
@@ -530,5 +532,5 @@ void ILabs::processData(InertialLabs::SensorsData *data) {
}
extern "C" __EXPORT int ilabs_main(int argc, char *argv[]) {
return ILabs::main(argc, argv);
return ModuleBase::main(ILabs::desc, argc, argv);
}
+3 -1
View File
@@ -59,8 +59,10 @@
#include "sensor.h"
class ILabs : public ModuleBase<ILabs>, public ModuleParams, public px4::ScheduledWorkItem {
class ILabs : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem {
public:
static Descriptor desc;
ILabs(const char *port);
~ILabs() override;
+10 -8
View File
@@ -35,6 +35,8 @@
#include "MicroStrain.hpp"
ModuleBase::Descriptor MicroStrain::desc{task_spawn, custom_command, print_usage};
device::Serial device_uart{};
MicroStrain::MicroStrain(const char *uart_port) :
@@ -1851,7 +1853,7 @@ void MicroStrain::Run()
{
if (should_exit()) {
ScheduleClear();
exit_and_cleanup();
exit_and_cleanup(desc);
return;
}
@@ -1911,8 +1913,8 @@ int MicroStrain::task_spawn(int argc, char *argv[])
if (dev == nullptr || strlen(dev) == 0) {
print_usage("no device specified");
_object.store(nullptr);
_task_id = -1;
desc.object.store(nullptr);
desc.task_id = -1;
return PX4_ERROR;
}
@@ -1921,8 +1923,8 @@ int MicroStrain::task_spawn(int argc, char *argv[])
MicroStrain *instance = new MicroStrain(dev);
if (instance) {
_object.store(instance);
_task_id = task_id_is_work_queue;
desc.object.store(instance);
desc.task_id = task_id_is_work_queue;
if (instance->init()) {
return PX4_OK;
@@ -1933,8 +1935,8 @@ int MicroStrain::task_spawn(int argc, char *argv[])
}
delete instance;
_object.store(nullptr);
_task_id = -1;
desc.object.store(nullptr);
desc.task_id = -1;
return PX4_ERROR;
}
@@ -1995,5 +1997,5 @@ $ microstrain stop
extern "C" __EXPORT int microstrain_main(int argc, char *argv[])
{
return MicroStrain::main(argc, argv);
return ModuleBase::main(MicroStrain::desc, argc, argv);
}
+3 -1
View File
@@ -86,9 +86,11 @@ using matrix::Vector2f;
static constexpr float sq(float x) { return x * x; };
class MicroStrain : public ModuleBase<MicroStrain>, public ModuleParams, public px4::ScheduledWorkItem
class MicroStrain : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem
{
public:
static Descriptor desc;
MicroStrain(const char *_device);
~MicroStrain() override;
+6 -4
View File
@@ -72,6 +72,8 @@
using matrix::Vector2f;
ModuleBase::Descriptor SbgEcom::desc{task_spawn, custom_command, print_usage};
SbgEcom::SbgEcom(const char *device_name, uint32_t baudrate, const char *config_file, const char *config_string):
ModuleParams(nullptr),
ScheduledWorkItem(MODULE_NAME, px4::serial_port_to_wq(device_name)),
@@ -952,7 +954,7 @@ void SbgEcom::Run()
{
if (should_exit()) {
ScheduleClear();
exit_and_cleanup();
exit_and_cleanup(desc);
return;
}
@@ -1065,8 +1067,8 @@ int SbgEcom::task_spawn(int argc, char **argv)
return PX4_ERROR;
}
_task_id = task_id_is_work_queue;
_object.store(instance);
desc.task_id = task_id_is_work_queue;
desc.object.store(instance);
instance->ScheduleNow();
return PX4_OK;
@@ -1121,5 +1123,5 @@ int SbgEcom::print_status()
extern "C" __EXPORT int sbgecom_main(int argc, char **argv)
{
return SbgEcom::main(argc, argv);
return ModuleBase::main(SbgEcom::desc, argc, argv);
}
+3 -1
View File
@@ -63,10 +63,12 @@
#include <uORB/topics/vehicle_local_position.h>
#include <uORB/topics/vehicle_magnetometer.h>
class SbgEcom : public ModuleBase<SbgEcom>, public ModuleParams, public px4::ScheduledWorkItem
class SbgEcom : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem
{
public:
static Descriptor desc;
SbgEcom(const char *port, uint32_t baudrate, const char *config_file, const char *config_string);
~SbgEcom() override;
+6 -4
View File
@@ -40,6 +40,8 @@
using matrix::Vector2f;
ModuleBase::Descriptor VectorNav::desc{task_spawn, custom_command, print_usage};
VectorNav::VectorNav(const char *port) :
ModuleParams(nullptr),
ScheduledWorkItem(MODULE_NAME, px4::serial_port_to_wq(port)),
@@ -682,7 +684,7 @@ void VectorNav::Run()
if (should_exit()) {
VnSensor_unregisterAsyncPacketReceivedHandler(&_vs);
VnSensor_disconnect(&_vs);
exit_and_cleanup();
exit_and_cleanup(desc);
return;
} else if (!_initialized) {
@@ -797,8 +799,8 @@ int VectorNav::task_spawn(int argc, char *argv[])
return PX4_ERROR;
}
_object.store(instance);
_task_id = task_id_is_work_queue;
desc.object.store(instance);
desc.task_id = task_id_is_work_queue;
instance->ScheduleNow();
@@ -858,5 +860,5 @@ $ vectornav stop
extern "C" __EXPORT int vectornav_main(int argc, char *argv[])
{
return VectorNav::main(argc, argv);
return ModuleBase::main(VectorNav::desc, argc, argv);
}
+3 -1
View File
@@ -75,9 +75,11 @@ extern "C" {
using namespace time_literals;
class VectorNav : public ModuleBase<VectorNav>, public ModuleParams, public px4::ScheduledWorkItem
class VectorNav : public ModuleBase, public ModuleParams, public px4::ScheduledWorkItem
{
public:
static Descriptor desc;
VectorNav(const char *port);
~VectorNav() override;