feat(baro): add PX4Barometer wrapper and migrate barometer drivers (#27580)

* feat(baro): refactor barometer drivers to use PX4Barometer class

* fix(baro): incoperated feedback

* feat(baro): initialize PX4Barometer with device ID in barometer drivers

* fix(baro): set default temperature to 15°C in PX4Barometer constructor

* fix(baro): clarify default temperature comment in PX4Barometer constructor

---------

Co-authored-by: Claudio Chies <chiesc@chies.com>
This commit is contained in:
Claudio Chies
2026-06-10 15:53:18 +02:00
committed by GitHub
co-authored by Claudio Chies
parent d5f5c50330
commit 709dfec6ff
61 changed files with 346 additions and 208 deletions
+4 -8
View File
@@ -35,6 +35,7 @@
BMP280::BMP280(const I2CSPIDriverConfig &config, bmp280::IBMP280 *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -176,14 +177,9 @@ BMP280::collect()
const float P = (pf * _fcal.p9 + _fcal.p8) * pf + _fcal.p7;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = P;
sensor_baro.temperature = T;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(T);
_px4_baro.update(timestamp_sample, P);
perf_end(_sample_perf);
+2 -1
View File
@@ -36,6 +36,7 @@
#include "bmp280.h"
#include <drivers/drv_hrt.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
@@ -62,7 +63,7 @@ private:
int measure(); //start measure
int collect(); //get results and publish
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
bmp280::IBMP280 *_interface;
@@ -42,5 +42,6 @@ px4_add_module(
bmp280_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -40,5 +40,6 @@ px4_add_module(
bmp388.cpp
bmp388_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
+7 -8
View File
@@ -43,6 +43,7 @@
BMP388::BMP388(const I2CSPIDriverConfig &config, IBMP388 *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -83,6 +84,9 @@ BMP388::init()
this->_item_name = "bmp390";
}
// device type may have been refined above (BMP388 vs BMP390); latch the final device id
_px4_baro.set_device_id(_interface->get_device_id());
if (_interface->get_reg(BMP3_REV_ID_ADDR, &_chip_rev_id) != OK) {
PX4_WARN("failed to get chip rev id");
return -EIO;
@@ -188,14 +192,9 @@ BMP388::collect()
float pressure = (float)(data.pressure / 100.0f); // to Pascal
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = pressure;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temperature);
_px4_baro.update(timestamp_sample, pressure);
perf_end(_sample_perf);
+2 -1
View File
@@ -41,6 +41,7 @@
#include <math.h>
#include <drivers/drv_hrt.h>
#include <lib/cdev/CDev.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <perf/perf_counter.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
@@ -330,7 +331,7 @@ private:
static constexpr uint8_t odr{BMP3_ODR_50_HZ}; // output data rate (not used)
static constexpr uint8_t iir_coef{BMP3_IIR_FILTER_DISABLE}; // IIR coefficient
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
IBMP388 *_interface{nullptr};
unsigned _measure_interval{0}; // interval in microseconds needed to measure
@@ -40,5 +40,6 @@ px4_add_module(
bmp581.cpp
bmp581_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -36,6 +36,7 @@
BMP581::BMP581(const I2CSPIDriverConfig &config, IBMP581 *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -157,14 +158,9 @@ int BMP581::collect()
}
//publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = data.pressure;
sensor_baro.temperature = data.temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(data.temperature);
_px4_baro.update(timestamp_sample, data.pressure);
perf_end(_sample_perf);
+2 -1
View File
@@ -41,6 +41,7 @@
#include <math.h>
#include <drivers/drv_hrt.h>
#include <lib/cdev/CDev.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <perf/perf_counter.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
@@ -282,7 +283,7 @@ private:
static constexpr uint8_t INTERRUPT_POLARITY{BMP5_INT_POL_ACTIVE_HIGH};
static constexpr uint8_t INTERRUPT_DRIVE{BMP5_INT_OD_PUSHPULL};
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
IBMP581 *_interface{nullptr};
unsigned _measure_interval{0}; // interval in microseconds needed to measure
@@ -41,5 +41,6 @@ px4_add_module(
dps310_main.cpp
DEPENDS
drivers__device
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -48,6 +48,7 @@ static void getTwosComplement(T &raw, uint8_t length)
DPS310::DPS310(const I2CSPIDriverConfig &config, device::Device *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comm errors"))
@@ -233,14 +234,9 @@ DPS310::RunImpl()
const float Tcomp = c0 * 0.5f + c1 * Traw_sc;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = Pcomp;
sensor_baro.temperature = Tcomp;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(Tcomp);
_px4_baro.update(timestamp_sample, Pcomp);
perf_end(_sample_perf);
}
+2 -1
View File
@@ -40,6 +40,7 @@
#pragma once
#include <drivers/device/Device.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -80,7 +81,7 @@ private:
static constexpr uint32_t SAMPLE_RATE{32};
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
device::Device *_interface;
@@ -43,5 +43,6 @@ px4_add_module(
MODULE_CONFIG
parameters.yaml
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -35,6 +35,7 @@
SPA06::SPA06(const I2CSPIDriverConfig &config, spa06::ISPA06 *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -235,14 +236,9 @@ SPA06::collect()
float temperature = (float)_cal.c0 * 0.5f + (float)_cal.c1 * ftsc;
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = fp;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temperature);
_px4_baro.update(timestamp_sample, fp);
perf_end(_sample_perf);
@@ -40,6 +40,7 @@
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <lib/perf/perf_counter.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
@@ -63,7 +64,7 @@ private:
int collect(); //get results and publish
int calibrate();
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
spa06::ISPA06 *_interface;
spa06::data_s _data;
@@ -43,5 +43,6 @@ px4_add_module(
MODULE_CONFIG
parameters.yaml
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -35,6 +35,7 @@
SPL06::SPL06(const I2CSPIDriverConfig &config, spl06::ISPL06 *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -224,14 +225,9 @@ SPL06::collect()
float temperature = (float)_cal.c0 * 0.5f + (float)_cal.c1 * ftsc;
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = fp;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temperature);
_px4_baro.update(timestamp_sample, fp);
perf_end(_sample_perf);
@@ -40,6 +40,7 @@
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <lib/perf/perf_counter.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
@@ -63,7 +64,7 @@ private:
int collect(); //get results and publish
int calibrate();
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
spl06::ISPL06 *_interface;
spl06::data_s _data;
@@ -41,5 +41,6 @@ px4_add_module(
ICP101XX.hpp
icp101xx_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -37,7 +37,8 @@ using namespace time_literals;
ICP101XX::ICP101XX(const I2CSPIDriverConfig &config) :
I2C(config),
I2CSPIDriver(config)
I2CSPIDriver(config),
_px4_baro{get_device_id()}
{
}
@@ -237,14 +238,9 @@ ICP101XX::RunImpl()
float pressure = _pressure_Pa;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = now;
sensor_baro.device_id = get_device_id();
sensor_baro.pressure = pressure;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_bad_transfer_perf);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_bad_transfer_perf));
_px4_baro.set_temperature(temperature);
_px4_baro.update(now, pressure);
success = true;
@@ -37,6 +37,7 @@
#include <drivers/drv_hrt.h>
#include <lib/drivers/device/i2c.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -70,7 +71,7 @@ private:
int send_command(Cmd cmd);
int send_command(Cmd cmd, uint8_t *data, uint8_t len);
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
perf_counter_t _reset_perf{perf_alloc(PC_COUNT, MODULE_NAME": reset")};
perf_counter_t _sample_perf{perf_alloc(PC_ELAPSED, MODULE_NAME": read")};
@@ -41,5 +41,6 @@ px4_add_module(
ICP201XX.hpp
icp201xx_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -38,7 +38,8 @@ using namespace time_literals;
ICP201XX::ICP201XX(const I2CSPIDriverConfig &config) :
I2C(config),
I2CSPIDriver(config)
I2CSPIDriver(config),
_px4_baro{get_device_id()}
{
}
@@ -304,14 +305,9 @@ ICP201XX::RunImpl()
perf_end(_sample_perf);
perf_begin(_sample_perf);
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = now;
sensor_baro.device_id = get_device_id();
sensor_baro.pressure = pressure;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_bad_transfer_perf);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_bad_transfer_perf));
_px4_baro.set_temperature(temperature);
_px4_baro.update(now, pressure);
success = true;
@@ -37,6 +37,7 @@
#include <drivers/drv_hrt.h>
#include <lib/drivers/device/i2c.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -72,7 +73,7 @@ private:
bool flush_fifo();
bool configure();
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
perf_counter_t _reset_perf{perf_alloc(PC_COUNT, MODULE_NAME": reset")};
perf_counter_t _sample_perf{perf_alloc(PC_ELAPSED, MODULE_NAME": read")};
@@ -39,5 +39,6 @@ px4_add_module(
LPS22HB_I2C.cpp
LPS22HB_SPI.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -44,6 +44,7 @@
LPS22HB::LPS22HB(const I2CSPIDriverConfig &config, device::Device *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms errors"))
@@ -164,14 +165,9 @@ int LPS22HB::collect()
float pressure_pa = pressure * 100.f;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = pressure_pa;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temperature);
_px4_baro.update(timestamp_sample, pressure_pa);
perf_end(_sample_perf);
return PX4_OK;
+2 -1
View File
@@ -36,6 +36,7 @@
#include <cstring>
#include <drivers/device/Device.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <lib/perf/perf_counter.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
@@ -93,7 +94,7 @@ public:
void RunImpl();
private:
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
device::Device *_interface;
@@ -40,5 +40,6 @@ px4_add_module(
lps25h_i2c.cpp
lps25h_spi.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -35,6 +35,7 @@
LPS25H::LPS25H(const I2CSPIDriverConfig &config, device::Device *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comms_errors"))
@@ -176,14 +177,9 @@ int LPS25H::collect()
float pressure_pa = pressure * 100.f;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = pressure_pa;
sensor_baro.temperature = temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temperature);
_px4_baro.update(timestamp_sample, pressure_pa);
perf_end(_sample_perf);
return PX4_OK;
+2 -1
View File
@@ -42,6 +42,7 @@
#include "lps25h.h"
#include <drivers/device/Device.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <lib/perf/perf_counter.h>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
@@ -177,7 +178,7 @@ private:
int measure();
int collect();
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
device::Device *_interface;
@@ -40,5 +40,6 @@ px4_add_module(
lps33hw_spi.cpp
lps33hw_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -49,6 +49,7 @@ static void getTwosComplement(T &raw, uint8_t length)
LPS33HW::LPS33HW(const I2CSPIDriverConfig &config, device::Device *interface) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": comm errors")),
@@ -179,14 +180,9 @@ LPS33HW::RunImpl()
float pressure_pa = pressure_hPa * 100.f;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = pressure_pa;
sensor_baro.temperature = temp;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(temp);
_px4_baro.update(timestamp_sample, pressure_pa);
perf_end(_sample_perf);
ScheduleDelayed(1000000 / SAMPLE_RATE);
+2 -1
View File
@@ -40,6 +40,7 @@
#pragma once
#include <drivers/device/Device.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -83,7 +84,7 @@ private:
static constexpr uint32_t SAMPLE_RATE{75};
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
device::Device *_interface;
@@ -41,5 +41,6 @@ px4_add_module(
MPC2520.cpp
MPC2520.hpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -44,7 +44,8 @@ static constexpr int32_t combine(uint8_t h, uint8_t m, uint8_t l)
MPC2520::MPC2520(const I2CSPIDriverConfig &config) :
I2C(config),
I2CSPIDriver(config)
I2CSPIDriver(config),
_px4_baro{get_device_id()}
{
//_debug_enabled = true;
}
@@ -243,14 +244,9 @@ void MPC2520::RunImpl()
Traw_sc * Praw_sc * (_prom.c11 + Praw_sc * _prom.c21);
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = now;
sensor_baro.device_id = get_device_id();
sensor_baro.pressure = Pcomp;
sensor_baro.temperature = Tcomp;
sensor_baro.error_count = perf_event_count(_bad_transfer_perf) + perf_event_count(_bad_register_perf);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_bad_transfer_perf) + perf_event_count(_bad_register_perf));
_px4_baro.set_temperature(Tcomp);
_px4_baro.update(now, Pcomp);
success = true;
@@ -37,6 +37,7 @@
#include <drivers/drv_hrt.h>
#include <lib/drivers/device/i2c.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -77,7 +78,7 @@ private:
void RegisterWrite(Register reg, uint8_t value);
void RegisterSetAndClearBits(Register reg, uint8_t setbits, uint8_t clearbits);
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
perf_counter_t _bad_register_perf{perf_alloc(PC_COUNT, MODULE_NAME": bad register")};
perf_counter_t _bad_transfer_perf{perf_alloc(PC_COUNT, MODULE_NAME": bad transfer")};
@@ -40,5 +40,6 @@ px4_add_module(
MPL3115A2.cpp
mpl3115a2_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -56,6 +56,7 @@
MPL3115A2::MPL3115A2(const I2CSPIDriverConfig &config) :
I2C(config),
I2CSPIDriver(config),
_px4_baro{get_device_id()},
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err"))
@@ -268,14 +269,9 @@ int MPL3115A2::collect()
float P = (float)(reading.pressure.q >> 8) + ((float)(reading.pressure.b[0]) / 4.0f);
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = get_device_id();
sensor_baro.pressure = P;
sensor_baro.temperature = T;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(T);
_px4_baro.update(timestamp_sample, P);
perf_end(_sample_perf);
@@ -42,6 +42,7 @@
#include <drivers/device/i2c.h>
#include <drivers/drv_hrt.h>
#include <lib/perf/perf_counter.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <px4_platform_common/px4_config.h>
@@ -77,7 +78,7 @@ private:
int RegisterRead(uint8_t reg, void *data, unsigned count = 1);
int RegisterWrite(uint8_t reg, uint8_t data);
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
bool _collect_phase{false};
@@ -44,5 +44,6 @@ px4_add_module(
DEPENDS
cdev
drivers__device
drivers_barometer
px4_work_queue
)
+2 -1
View File
@@ -34,6 +34,7 @@
#pragma once
#include <drivers/device/device.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -115,7 +116,7 @@ public:
protected:
void print_status() override;
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
device::Device *_interface;
+7 -8
View File
@@ -43,6 +43,7 @@
MS5611::MS5611(device::Device *interface, ms5611::prom_u &prom_buf, const I2CSPIDriverConfig &config) :
I2CSPIDriver(config),
_px4_baro{interface->get_device_id()},
_interface(interface),
_prom(prom_buf.s),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
@@ -133,6 +134,9 @@ MS5611::init()
break;
}
// device type was just refined (MS5611 vs MS5607); latch the final device id
_px4_baro.set_device_id(_interface->get_device_id());
ret = OK;
break;
@@ -342,14 +346,9 @@ MS5611::collect()
// publish
if (_initialized && PX4_ISFINITE(_last_pressure) && PX4_ISFINITE(_last_temperature)) {
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = P;
sensor_baro.temperature = _last_temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(_last_temperature);
_px4_baro.update(timestamp_sample, P);
}
}
@@ -41,5 +41,6 @@ px4_add_module(
MS5837.cpp
MS5837.hpp
DEPENDS
drivers_barometer
px4_work_queue
)
+4 -8
View File
@@ -41,6 +41,7 @@
MS5837::MS5837(const I2CSPIDriverConfig &config) :
I2C(config),
I2CSPIDriver(config),
_px4_baro{get_device_id()},
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
_comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err"))
@@ -340,14 +341,9 @@ int MS5837::_collect()
int32_t pressure_pascal = ((((raw * _SENS) >> 21) - _OFF) >> 13) * 10;
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = get_device_id();
sensor_baro.pressure = pressure_pascal;
sensor_baro.temperature = _last_temperature;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(_last_temperature);
_px4_baro.update(timestamp_sample, pressure_pascal);
}
/* update the measurement state machine */
+2 -1
View File
@@ -35,6 +35,7 @@
#include <drivers/device/device.h>
#include <drivers/device/i2c.h>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -80,7 +81,7 @@ public:
private:
int probe() override;
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
ms5837::prom_u _prom{};
@@ -39,5 +39,6 @@ px4_add_module(
tcbp001ta_spi.cpp
tcbp001ta_main.cpp
DEPENDS
drivers_barometer
px4_work_queue
)
@@ -45,6 +45,7 @@
TCBP001TA::TCBP001TA(tcbp001ta::ITCBP001TA *interface) :
ScheduledWorkItem(MODULE_NAME, px4::device_bus_to_wq(interface->get_device_id())),
_px4_baro{interface->get_device_id()},
_interface(interface),
_sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": sample")),
_measure_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": measure")),
@@ -251,14 +252,9 @@ TCBP001TA::collect()
Praw_sc * Praw_sc * (_fcal.c11 + Praw_sc * _fcal.c21);
// publish
sensor_baro_s sensor_baro{};
sensor_baro.timestamp_sample = timestamp_sample;
sensor_baro.device_id = _interface->get_device_id();
sensor_baro.pressure = P;
sensor_baro.temperature = T;
sensor_baro.error_count = perf_event_count(_comms_errors);
sensor_baro.timestamp = hrt_absolute_time();
_sensor_baro_pub.publish(sensor_baro);
_px4_baro.set_error_count(perf_event_count(_comms_errors));
_px4_baro.set_temperature(T);
_px4_baro.update(timestamp_sample, P);
perf_end(_sample_perf);
@@ -38,6 +38,7 @@
#include <drivers/drv_hrt.h>
#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <lib/drivers/barometer/PX4Barometer.hpp>
#include <uORB/PublicationMulti.hpp>
#include <uORB/topics/sensor_baro.h>
#include <lib/perf/perf_counter.h>
@@ -64,7 +65,7 @@ private:
int measure(); //start measure
int collect(); //get results and publish
uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};
PX4Barometer _px4_baro;
tcbp001ta::ITCBP001TA *_interface;
+1
View File
@@ -32,6 +32,7 @@
############################################################################
add_subdirectory(accelerometer)
add_subdirectory(barometer)
add_subdirectory(device)
add_subdirectory(gyroscope)
add_subdirectory(led)
+34
View File
@@ -0,0 +1,34 @@
############################################################################
#
# Copyright (c) 2026 PX4 Development Team. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name PX4 nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
px4_add_library(drivers_barometer PX4Barometer.cpp)

Some files were not shown because too many files have changed in this diff Show More