HardFOC Core
API reference
Loading...
Searching...
No Matches
Bmp581Handler.h
Go to the documentation of this file.
1
16#ifndef COMPONENT_HANDLER_BMP581_HANDLER_H_
17#define COMPONENT_HANDLER_BMP581_HANDLER_H_
18
19#include <atomic>
20#include <cstddef>
21#include <cstdint>
22#include <memory>
23
24#include "base/BaseI2c.h"
25#include "core/hf-core-drivers/external/hf-bmp581-driver/inc/bmp581.hpp"
26#include "RtosMutex.h"
27
28//==============================================================================
29// CRTP REGISTER ADAPTER
30//==============================================================================
31
41class HalI2cBmp581Comm : public bmp581::BusInterface<HalI2cBmp581Comm> {
42public:
45 static constexpr bmp581::Interface kInterface = bmp581::Interface::I2c;
46
47 explicit HalI2cBmp581Comm(BaseI2c& i2c_device) noexcept;
48
51 bool WriteRegs(std::uint8_t reg, const std::uint8_t* data, std::size_t len) noexcept;
52 bool ReadRegs(std::uint8_t reg, std::uint8_t* out, std::size_t len) noexcept;
53 void DelayUs(std::uint32_t us) noexcept;
54 bool EnsureInitialized() noexcept;
56
57private:
58 BaseI2c& i2c_device_;
59 std::uint8_t tx_scratch_[8]{};
60 std::uint8_t rx_scratch_[8]{};
61 std::uint8_t reg_scratch_{0};
62};
63
64//==============================================================================
65// HANDLER CONFIGURATION
66//==============================================================================
67
71 bmp581::Config config{bmp581::BarometricReferencePreset()};
75 std::uint8_t device_index{0};
76};
77
78//==============================================================================
79// HANDLER
80//==============================================================================
81
86public:
87 using DriverType = bmp581::Driver<HalI2cBmp581Comm>;
88
94 explicit Bmp581Handler(BaseI2c& i2c_device,
96 RtosMutex* bus_mutex = nullptr) noexcept;
97
98 Bmp581Handler(const Bmp581Handler&) = delete;
102
108 bool EnsureInitialized() noexcept;
109
111 [[nodiscard]] bool IsPresent() const noexcept {
112 return initialized_.load(std::memory_order_acquire);
113 }
114
116 [[nodiscard]] std::uint8_t ChipId() const noexcept { return chip_id_; }
117
119 [[nodiscard]] const bmp581::EffectiveOsr& EffectiveOsr() const noexcept { return effective_; }
120
121 //==========================================================================
122 // Live data
123 //==========================================================================
124
126 bmp581::DriverResult<bool> DataReady() noexcept;
127
129 bmp581::DriverResult<bmp581::Sample> ReadSample() noexcept;
130
132 bmp581::DriverResult<void> Configure(const bmp581::Config& cfg) noexcept;
133
135 bmp581::DriverResult<void> Reset() noexcept;
136
138 struct Counters {
139 std::uint32_t samples{0};
140 std::uint32_t bus_errors{0};
141 };
142 [[nodiscard]] Counters GetCounters() const noexcept;
143
144private:
145 bool EnsureInitializedLocked() noexcept;
146
149 std::unique_ptr<DriverType> driver_;
150
151 std::uint8_t chip_id_{0};
152 bmp581::EffectiveOsr effective_{};
153 std::atomic<bool> initialized_{false};
154
155 std::atomic<std::uint32_t> samples_{0};
156 std::atomic<std::uint32_t> bus_errors_{0};
157
158 RtosMutex private_mutex_;
159 RtosMutex* bus_mutex_;
160};
161
162#endif // COMPONENT_HANDLER_BMP581_HANDLER_H_
Handler wrapping one BMP581 on a BaseI2c device.
Definition Bmp581Handler.h:85
bool EnsureInitializedLocked() noexcept
Definition Bmp581Handler.cpp:85
bmp581::DriverResult< bool > DataReady() noexcept
Whether a fresh sample is waiting (INT_STATUS.drdy).
Definition Bmp581Handler.cpp:119
bool EnsureInitialized() noexcept
Probe (chip id + NVM ready), optional soft reset, apply the configured preset. Idempotent.
Definition Bmp581Handler.cpp:77
RtosMutex * bus_mutex_
Definition Bmp581Handler.h:159
bmp581::Driver< HalI2cBmp581Comm > DriverType
Definition Bmp581Handler.h:87
Bmp581Handler(const Bmp581Handler &)=delete
std::atomic< std::uint32_t > samples_
Definition Bmp581Handler.h:155
std::uint8_t ChipId() const noexcept
Chip id read at probe (0 until present).
Definition Bmp581Handler.h:116
RtosMutex private_mutex_
Definition Bmp581Handler.h:158
Bmp581Handler & operator=(Bmp581Handler &&)=delete
bmp581::EffectiveOsr effective_
Definition Bmp581Handler.h:152
Bmp581HandlerConfig config_
Definition Bmp581Handler.h:147
bmp581::DriverResult< void > Reset() noexcept
Soft reset; the handler re-applies the current configuration.
Definition Bmp581Handler.cpp:157
bmp581::DriverResult< void > Configure(const bmp581::Config &cfg) noexcept
Re-apply a new configuration (standby hop handled by the driver).
Definition Bmp581Handler.cpp:141
std::unique_ptr< DriverType > driver_
Definition Bmp581Handler.h:149
Bmp581Handler & operator=(const Bmp581Handler &)=delete
std::atomic< bool > initialized_
Definition Bmp581Handler.h:153
HalI2cBmp581Comm comm_
Definition Bmp581Handler.h:148
std::atomic< std::uint32_t > bus_errors_
Definition Bmp581Handler.h:156
Bmp581Handler(Bmp581Handler &&)=delete
bool IsPresent() const noexcept
True once EnsureInitialized() has succeeded.
Definition Bmp581Handler.h:111
Counters GetCounters() const noexcept
Definition Bmp581Handler.cpp:169
std::uint8_t chip_id_
Definition Bmp581Handler.h:151
const bmp581::EffectiveOsr & EffectiveOsr() const noexcept
Effective OSR / ODR validity captured after configuration.
Definition Bmp581Handler.h:119
bmp581::DriverResult< bmp581::Sample > ReadSample() noexcept
Read pressure [Pa] and temperature [°C].
Definition Bmp581Handler.cpp:127
CRTP register transport bridging bmp581::BusInterface to a BaseI2c device.
Definition Bmp581Handler.h:41
std::uint8_t tx_scratch_[8]
Definition Bmp581Handler.h:59
static constexpr bmp581::Interface kInterface
Definition Bmp581Handler.h:45
void DelayUs(std::uint32_t us) noexcept
Definition Bmp581Handler.cpp:52
bool EnsureInitialized() noexcept
Definition Bmp581Handler.cpp:62
bool WriteRegs(std::uint8_t reg, const std::uint8_t *data, std::size_t len) noexcept
Definition Bmp581Handler.cpp:24
BaseI2c & i2c_device_
Definition Bmp581Handler.h:58
std::uint8_t rx_scratch_[8]
Definition Bmp581Handler.h:60
bool ReadRegs(std::uint8_t reg, std::uint8_t *out, std::size_t len) noexcept
Definition Bmp581Handler.cpp:37
std::uint8_t reg_scratch_
Definition Bmp581Handler.h:61
Diagnostics counters since construction.
Definition Bmp581Handler.h:138
Construction-time configuration for one BMP581.
Definition Bmp581Handler.h:69
std::uint8_t device_index
Logical index for diagnostics.
Definition Bmp581Handler.h:75
bmp581::Config config
Sensor configuration applied by EnsureInitialized().
Definition Bmp581Handler.h:71
bool soft_reset_on_init
Soft reset before configuring (recommended; clears stale IIR / mode).
Definition Bmp581Handler.h:73