M5Unit-METER 0.3.0 git rev:2c09d95
Loading...
Searching...
No Matches
unit_DualKmeter.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
11#define M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16#include <array>
17
18namespace m5 {
19namespace unit {
20
25namespace dual_kmeter {
26
31enum class Channel : uint8_t {
32 One,
33 Two,
34};
35
40enum class MeasurementUnit : uint8_t {
41 Celsius,
43};
44
49struct Data {
50 std::array<uint8_t, 4> raw{};
52
55 inline float temperature() const
56 {
57 return static_cast<int32_t>((static_cast<uint32_t>(raw[3]) << 24) | (static_cast<uint32_t>(raw[2]) << 16) |
58 (static_cast<uint32_t>(raw[1]) << 8) | static_cast<uint32_t>(raw[0])) *
59 0.01f;
60 }
61};
62
63} // namespace dual_kmeter
64
90class UnitDualKmeter : public Component, public PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data> {
91 M5_UNIT_COMPONENT_HPP_BUILDER(UnitDualKmeter, 0x11);
92
93public:
98 struct config_t {
100 bool start_periodic{true};
102 uint32_t interval{100};
104 dual_kmeter::Channel measurement_channel{dual_kmeter::Channel::One};
106 dual_kmeter::MeasurementUnit measurement_unit{dual_kmeter::MeasurementUnit::Celsius};
107 };
108
109 explicit UnitDualKmeter(const uint8_t addr = DEFAULT_ADDRESS)
110 : Component(addr), _data{new m5::container::CircularBuffer<dual_kmeter::Data>(1)}
111 {
112 auto ccfg = component_config();
113 ccfg.clock = 100 * 1000U;
114 component_config(ccfg);
115 }
116 virtual ~UnitDualKmeter()
117 {
118 }
119
120 virtual bool begin() override;
121 virtual void update(const bool force = false) override;
122
125
127 {
128 return _cfg;
129 }
131 inline void config(const config_t& cfg)
132 {
133 _cfg = cfg;
134 }
136
142 {
143 return _munit;
144 }
148 {
149 return _channel;
150 }
154 {
155 _munit = munit;
156 }
158
162 inline float temperature() const
163 {
164 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
165 }
167
170
175 {
176 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement();
177 }
186 const uint32_t interval, const dual_kmeter::Channel channel = dual_kmeter::Channel::One,
187 const dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius)
188 {
189 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement(interval,
190 channel, munit);
191 }
197 {
198 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::stopPeriodicMeasurement();
199 }
201
207 bool readStatus(uint8_t& status);
208
214 bool readFirmwareVersion(uint8_t& ver);
215
218
228 dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius,
229 const uint32_t timeoutMs = 100);
240 const dual_kmeter::MeasurementUnit munit = dual_kmeter::MeasurementUnit::Celsius,
241 const uint32_t timeoutMs = 100);
243
246
257 bool writeCurrentChannel(const dual_kmeter::Channel channel);
259
260protected:
261 inline bool read_register(const uint8_t reg, uint8_t* rbuf, const uint32_t len)
262 {
263 return readRegister(reg, rbuf, len, 0, false);
264 }
265 inline bool read_register8(const uint8_t reg, uint8_t& v)
266 {
267 return readRegister8(reg, v, 0, false);
268 }
269
270 bool start_periodic_measurement();
271 bool start_periodic_measurement(const uint32_t interval, const dual_kmeter::Channel channel,
272 const dual_kmeter::MeasurementUnit munit);
273 bool stop_periodic_measurement();
274
275 bool read_measurement(dual_kmeter::Data& d, const dual_kmeter::MeasurementUnit munit);
276 bool read_internal_measurement(dual_kmeter::Data& d, const dual_kmeter::MeasurementUnit munit);
277
278 bool is_data_ready()
279 {
280 uint8_t s{};
281 return readStatus(s) && (s == 0U);
282 }
283 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitDualKmeter, dual_kmeter::Data);
284
285protected:
286 std::unique_ptr<m5::container::CircularBuffer<dual_kmeter::Data>> _data{};
287 dual_kmeter::MeasurementUnit _munit{dual_kmeter::MeasurementUnit::Celsius};
288 dual_kmeter::Channel _channel{}, _current_channel{};
289 config_t _cfg{};
290};
291
292namespace dual_kmeter {
294namespace command {
295constexpr uint8_t TEMPERATURE_CELSIUS_REG{0x00}; // R
296constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0x04}; // R
297constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0x10}; // R
298constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0x14}; // R
299constexpr uint8_t CHANNEL_REG{0x20}; // R/W
300constexpr uint8_t STATUS_REG{0x30}; // R
301constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x40}; // R
302constexpr uint8_t TEMPERATURE_FAHRENHEIT_STRING_REG{0x50}; // R
303constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x60}; // R
304constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_STRING_REG{0x70}; // R
305constexpr uint8_t FIRMWARE_VERSION_REG{0xFE}; // R
306} // namespace command
308} // namespace dual_kmeter
309
310} // namespace unit
311} // namespace m5
312
313#endif
config_t config()
Gets the configuration.
Definition unit_DualKmeter.hpp:126
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_DualKmeter.hpp:196
bool measureInternalSingleshot(dual_kmeter::Data &data, const dual_kmeter::Channel channel, const dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure internal temperature single shot.
Definition unit_DualKmeter.cpp:145
bool readStatus(uint8_t &status)
Read status.
Definition unit_DualKmeter.cpp:109
dual_kmeter::MeasurementUnit measurementUnit() const
Gets the measurement unit on periodic measurement.
Definition unit_DualKmeter.hpp:141
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_DualKmeter.hpp:174
bool writeCurrentChannel(const dual_kmeter::Channel channel)
Write the current measure channel.
Definition unit_DualKmeter.cpp:179
float temperature() const
Oldest temperature.
Definition unit_DualKmeter.hpp:162
void setMeasurementUnit(const dual_kmeter::MeasurementUnit munit)
Set the measurement unit on periodic measurement.
Definition unit_DualKmeter.hpp:153
bool readFirmwareVersion(uint8_t &ver)
Read firmware version.
Definition unit_DualKmeter.cpp:115
bool startPeriodicMeasurement(const uint32_t interval, const dual_kmeter::Channel channel=dual_kmeter::Channel::One, const dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius)
Start periodic measurement.
Definition unit_DualKmeter.hpp:185
bool measureSingleshot(dual_kmeter::Data &data, const dual_kmeter::Channel channel, dual_kmeter::MeasurementUnit munit=dual_kmeter::MeasurementUnit::Celsius, const uint32_t timeoutMs=100)
Measure temperature single shot.
Definition unit_DualKmeter.cpp:121
dual_kmeter::Channel measurementChannel() const
Gets the measurement channel on periodic measurement.
Definition unit_DualKmeter.hpp:147
void config(const config_t &cfg)
Set the configuration.
Definition unit_DualKmeter.hpp:131
bool readCurrentChannel(dual_kmeter::Channel &channel)
Read the current measure channel.
Definition unit_DualKmeter.cpp:169
For DualKmeter.
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_DualKmeter.hpp:98
bool start_periodic
Start periodic measurement on begin?
Definition unit_DualKmeter.hpp:100
uint32_t interval
periodic interval(ms) if start on begin
Definition unit_DualKmeter.hpp:102
dual_kmeter::Channel measurement_channel
measurement unit if start on begin
Definition unit_DualKmeter.hpp:104
Measurement data group.
Definition unit_DualKmeter.hpp:49
float temperature() const
Temperature value.
Definition unit_DualKmeter.hpp:55
std::array< uint8_t, 4 > raw
Raw data.
Definition unit_DualKmeter.hpp:50
Channel channel
Which channel?
Definition unit_DualKmeter.hpp:51
@ One
Assert after one conversion.
@ Two
Assert after two conversion.
MeasurementUnit
measurement unit on periodic measurement
Definition unit_DualKmeter.hpp:40
@ Celsius
Temperature unit is celsius.
@ Fahrenheit
Temperature unit is fahrenheit.
Channel
Channel to be measured.
Definition unit_DualKmeter.hpp:31