10#ifndef M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
11#define M5_UNIT_METER_UNIT_DUAL_KMETER_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
50 std::array<uint8_t, 4>
raw{};
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])) *
90class UnitDualKmeter :
public Component,
public PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data> {
91 M5_UNIT_COMPONENT_HPP_BUILDER(UnitDualKmeter, 0x11);
109 explicit UnitDualKmeter(
const uint8_t addr = DEFAULT_ADDRESS)
110 : Component(addr), _data{new
m5::container::CircularBuffer<
dual_kmeter::Data>(1)}
112 auto ccfg = component_config();
113 ccfg.clock = 100 * 1000U;
114 component_config(ccfg);
116 virtual ~UnitDualKmeter()
120 virtual bool begin()
override;
121 virtual void update(
const bool force =
false)
override;
164 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
176 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement();
189 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::startPeriodicMeasurement(interval,
198 return PeriodicMeasurementAdapter<UnitDualKmeter, dual_kmeter::Data>::stopPeriodicMeasurement();
229 const uint32_t timeoutMs = 100);
241 const uint32_t timeoutMs = 100);
261 inline bool read_register(
const uint8_t reg, uint8_t* rbuf,
const uint32_t len)
263 return readRegister(reg, rbuf, len, 0,
false);
265 inline bool read_register8(
const uint8_t reg, uint8_t& v)
267 return readRegister8(reg, v, 0,
false);
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();
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);
283 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitDualKmeter, dual_kmeter::Data);
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{};
295constexpr uint8_t TEMPERATURE_CELSIUS_REG{0x00};
296constexpr uint8_t TEMPERATURE_FAHRENHEIT_REG{0x04};
297constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_REG{0x10};
298constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_REG{0x14};
299constexpr uint8_t CHANNEL_REG{0x20};
300constexpr uint8_t STATUS_REG{0x30};
301constexpr uint8_t TEMPERATURE_CELSIUS_STRING_REG{0x40};
302constexpr uint8_t TEMPERATURE_FAHRENHEIT_STRING_REG{0x50};
303constexpr uint8_t INTERNAL_TEMPERATURE_CELSIUS_STRING_REG{0x60};
304constexpr uint8_t INTERNAL_TEMPERATURE_FAHRENHEIT_STRING_REG{0x70};
305constexpr uint8_t FIRMWARE_VERSION_REG{0xFE};
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
Top level namespace of M5stack.
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