HardFOC Core
API reference
Loading...
Searching...
No Matches
AlicatBasis2Handler.h
Go to the documentation of this file.
1
23#ifndef COMPONENT_HANDLER_ALICAT_BASIS2_HANDLER_H_
24#define COMPONENT_HANDLER_ALICAT_BASIS2_HANDLER_H_
25
26#include <atomic>
27#include <cstddef>
28#include <cstdint>
29#include <functional>
30#include <memory>
31
32#include "RtosMutex.h"
33#include "base/BaseUart.h"
34
35#include "core/hf-core-drivers/external/hf-alicat-basis2-driver/inc/alicat_basis2.hpp"
36#include "core/hf-core-drivers/external/hf-alicat-basis2-driver/inc/alicat_basis2_uart_interface.hpp"
37
38//==============================================================================
39// CRTP UART ADAPTER FOR BaseUart
40//==============================================================================
41
54 : public alicat_basis2::UartInterface<HalUartAlicatBasis2Comm> {
55public:
56 explicit HalUartAlicatBasis2Comm(BaseUart& uart) noexcept : uart_(uart) {}
57
58 void write(const std::uint8_t* data, std::size_t length) noexcept;
59 std::size_t read(std::uint8_t* out, std::size_t max,
60 std::uint32_t timeout_ms) noexcept;
61 void flush_rx() noexcept;
62 void delay_ms_impl(std::uint32_t ms) noexcept;
63
64private:
65 BaseUart& uart_;
66};
67
68//==============================================================================
69// HANDLER CONFIGURATION
70//==============================================================================
71
74 std::uint8_t modbus_address{1};
75 std::uint16_t timeout_ms{200};
76 std::uint8_t device_index{0};
82 std::uint8_t flow_decimals_default{3};
83};
84
85inline constexpr AlicatBasis2HandlerConfig MakeDefaultBasis2Config(std::uint8_t addr,
86 std::uint8_t idx) noexcept {
88 c.modbus_address = addr;
89 c.timeout_ms = 200;
90 c.device_index = idx;
91 c.flow_decimals_default = 3;
92 return c;
93}
94
95//==============================================================================
96// HANDLER CLASS
97//==============================================================================
98
115public:
116 using DriverType = alicat_basis2::Driver<HalUartAlicatBasis2Comm>;
117
124 AlicatBasis2Handler(BaseUart& uart,
125 const AlicatBasis2HandlerConfig& config,
126 RtosMutex* bus_mutex = nullptr) noexcept;
127
129 AlicatBasis2Handler& operator=(const AlicatBasis2Handler&) = delete;
130
132 bool EnsureInitialized() noexcept;
133 bool IsInitialized() const noexcept { return initialized_.load(std::memory_order_acquire); }
134
135 std::uint8_t Address() const noexcept { return config_.modbus_address; }
136 std::uint8_t DeviceIndex() const noexcept { return config_.device_index; }
137
139 const alicat_basis2::InstrumentIdentity& Identity() const noexcept { return identity_; }
140 std::uint8_t FlowDecimals() const noexcept { return flow_decimals_; }
141
142 //--------------------------------------------------------------------------
143 // High-level operations (mutex-guarded)
144 //--------------------------------------------------------------------------
145
146 alicat_basis2::DriverResult<alicat_basis2::InstantaneousData>
147 ReadInstantaneous() noexcept;
148
149 alicat_basis2::DriverResult<alicat_basis2::InstrumentIdentity>
150 RereadIdentity() noexcept;
151
152 alicat_basis2::DriverResult<void> Tare() noexcept;
153 alicat_basis2::DriverResult<void> SetGas(alicat_basis2::Gas g) noexcept;
154 alicat_basis2::DriverResult<void> SetSetpoint(float user_units) noexcept;
155 alicat_basis2::DriverResult<void> SetSetpointSource(alicat_basis2::SetpointSource s) noexcept;
156 alicat_basis2::DriverResult<void> SetCommWatchdogMs(std::uint16_t ms) noexcept;
157 alicat_basis2::DriverResult<void> SetMaxSetpointRamp(std::uint32_t pct_per_ms_x_10e7) noexcept;
158 alicat_basis2::DriverResult<void> SetAutotareEnabled(bool enabled) noexcept;
159 alicat_basis2::DriverResult<void> ResetTotalizer() noexcept;
160 alicat_basis2::DriverResult<void> SetTotalizerLimitMode(alicat_basis2::TotalizerLimitMode m) noexcept;
161 alicat_basis2::DriverResult<void> SetTotalizerBatch(std::uint32_t value_scaled) noexcept;
162 alicat_basis2::DriverResult<void> SetFlowAveragingMs(std::uint16_t ms) noexcept;
163 alicat_basis2::DriverResult<void> SetReferenceTemperatureC(float c) noexcept;
164 alicat_basis2::DriverResult<void> ConfigureMeasurementTrigger(std::uint16_t bits) noexcept;
165 alicat_basis2::DriverResult<void> StartMeasurementSamples(std::uint16_t n) noexcept;
166 alicat_basis2::DriverResult<alicat_basis2::MeasurementData> ReadMeasurement() noexcept;
167 alicat_basis2::DriverResult<void> SetModbusAddress(std::uint8_t addr) noexcept;
168 alicat_basis2::DriverResult<void> SetAsciiUnitId(char id) noexcept;
169 alicat_basis2::DriverResult<void> SetBaudRate(alicat_basis2::BaudRate br) noexcept;
170 alicat_basis2::DriverResult<void> FactoryRestore() noexcept;
171
184 alicat_basis2::DriverResult<std::uint8_t>
185 Discover(std::uint8_t* present_bitmap, std::size_t bitmap_bytes,
186 std::uint16_t probe_timeout_ms = 30) noexcept;
187
188 //--------------------------------------------------------------------------
189 // Multi-baud discovery + bus normalisation
190 //--------------------------------------------------------------------------
191
196 std::uint8_t address{0};
197 std::uint32_t baud_bps{0};
198 };
199
213 using HostBaudSetter = std::function<bool(std::uint32_t bps)>;
214
249 alicat_basis2::DriverResult<std::size_t>
250 DiscoverAcrossBauds(DiscoveredDevice* out,
251 std::size_t max_devices,
252 const HostBaudSetter& set_host_baud,
253 std::uint16_t probe_timeout_ms = 30,
254 std::uint32_t settle_ms = 25,
255 const std::uint32_t* baud_list_bps = nullptr,
256 std::size_t baud_list_count = 0) noexcept;
257
287 alicat_basis2::DriverResult<std::size_t>
288 NormalizeBusBaud(std::uint32_t target_bps,
289 const DiscoveredDevice* devices,
290 std::size_t device_count,
291 const HostBaudSetter& set_host_baud,
292 std::uint8_t* failed_addresses_bitmap = nullptr,
293 std::size_t failed_bitmap_bytes = 0,
294 std::uint16_t verify_timeout_ms = 100) noexcept;
295
297 DriverType* GetDriver() noexcept { return driver_.get(); }
298
299private:
302 std::unique_ptr<DriverType> driver_;
303 alicat_basis2::InstrumentIdentity identity_{};
304 std::uint8_t flow_decimals_{3};
305
306 std::atomic<bool> initialized_{false};
307
308 RtosMutex private_mutex_;
309 RtosMutex* bus_mutex_{&private_mutex_};
310
311 bool EnsureInitializedLocked() noexcept;
312};
313
314#endif // COMPONENT_HANDLER_ALICAT_BASIS2_HANDLER_H_
constexpr AlicatBasis2HandlerConfig MakeDefaultBasis2Config(std::uint8_t addr, std::uint8_t idx) noexcept
Definition AlicatBasis2Handler.h:85
Thread-safe access layer to one BASIS-2 instrument on a shared bus.
Definition AlicatBasis2Handler.h:114
AlicatBasis2HandlerConfig config_
Definition AlicatBasis2Handler.h:300
std::uint8_t DeviceIndex() const noexcept
Definition AlicatBasis2Handler.h:136
const alicat_basis2::InstrumentIdentity & Identity() const noexcept
Cached identity (filled by EnsureInitialized).
Definition AlicatBasis2Handler.h:139
HalUartAlicatBasis2Comm comm_
Definition AlicatBasis2Handler.h:301
std::uint8_t Address() const noexcept
Definition AlicatBasis2Handler.h:135
std::uint8_t FlowDecimals() const noexcept
Definition AlicatBasis2Handler.h:140
alicat_basis2::Driver< HalUartAlicatBasis2Comm > DriverType
Definition AlicatBasis2Handler.h:116
std::function< bool(std::uint32_t bps)> HostBaudSetter
Callback used by DiscoverAcrossBauds / NormalizeBusBaud to retune the host UART when probing a new ba...
Definition AlicatBasis2Handler.h:213
std::unique_ptr< DriverType > driver_
Definition AlicatBasis2Handler.h:302
RtosMutex private_mutex_
Definition AlicatBasis2Handler.h:308
CRTP adapter that turns a BaseUart& into a transport the alicat_basis2::Driver can drive.
Definition AlicatBasis2Handler.h:54
void delay_ms_impl(std::uint32_t ms) noexcept
Definition AlicatBasis2Handler.cpp:56
std::size_t read(std::uint8_t *out, std::size_t max, std::uint32_t timeout_ms) noexcept
Definition AlicatBasis2Handler.cpp:42
void flush_rx() noexcept
Definition AlicatBasis2Handler.cpp:52
void write(const std::uint8_t *data, std::size_t length) noexcept
Definition AlicatBasis2Handler.cpp:36
BaseUart & uart_
Definition AlicatBasis2Handler.h:65
HalUartAlicatBasis2Comm(BaseUart &uart) noexcept
Definition AlicatBasis2Handler.h:56
One discovered instrument and the baud rate it was found at.
Definition AlicatBasis2Handler.h:195
Construction-time configuration for a single BASIS-2 slave.
Definition AlicatBasis2Handler.h:73
std::uint8_t modbus_address
1..247 — must be unique on the bus.
Definition AlicatBasis2Handler.h:74