M5Unit-ENV 1.6.0 git rev:f6fd6b0
Loading...
Searching...
No Matches
unit_QMP6988.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_ENV_UNIT_QMP6988_HPP
11#define M5_UNIT_ENV_UNIT_QMP6988_HPP
12#include <M5UnitComponent.hpp>
13#include <m5_utility/stl/extension.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <limits> // NaN
16
17namespace m5 {
18namespace unit {
19
24namespace qmp6988 {
25
30enum class PowerMode : uint8_t {
31 Sleep,
32 Forced,
33 Normal = 0x03,
34};
35
40enum class Oversampling : uint8_t {
41 Skipped,
42 X1,
43 X2,
44 X4,
45 X8,
46 X16,
47 X32,
48 X64,
49};
50
55enum class OversamplingSetting : uint8_t {
56 HighSpeed,
57 LowPower,
58 Standard,
62 UltraHightAccuracy [[deprecated("Use UltraHighAccuracy")]] = UltraHighAccuracy,
63};
64
69enum class Filter : uint8_t {
70 Off,
71 Coeff2,
72 Coeff4,
73 Coeff8,
74 Coeff16,
75 Coeff32,
76};
77
82enum class Standby : uint8_t {
83 Time1ms,
84 Time5ms,
85 Time50ms,
86 Time250ms,
87 Time500ms,
88 Time1sec,
89 Time2sec,
90 Time4sec,
91};
92
97enum class UseCase : uint8_t {
98 Weather,
99 Drop,
100 Elevator,
101 Stair,
102 Indoor,
103};
104
106struct Calibration {
107 int32_t b00{}, bt1{}, bp1{};
108 int64_t bt2{};
109 int32_t b11{}, bp2{}, b12{}, b21{}, bp3{}, a0{}, a1{}, a2{};
110};
112
117struct Data {
118 std::array<uint8_t, 6> raw{};
120 inline float temperature() const
121 {
122 return celsius();
123 }
124 float celsius() const;
125 float fahrenheit() const;
126 float pressure() const;
130 const Calibration* calib{};
131};
132
133} // namespace qmp6988
134
139class UnitQMP6988 : public Component, public PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data> {
140 M5_UNIT_COMPONENT_HPP_BUILDER(UnitQMP6988, 0x70);
141
142public:
147 struct config_t {
149 bool start_periodic{true};
151 qmp6988::Oversampling osrs_pressure{qmp6988::Oversampling::X8};
153 qmp6988::Oversampling osrs_temperature{qmp6988::Oversampling::X1};
155 qmp6988::Filter filter{qmp6988::Filter::Coeff4};
157 qmp6988::Standby standby{qmp6988::Standby::Time1sec};
158 };
159
160 explicit UnitQMP6988(const uint8_t addr = DEFAULT_ADDRESS)
161 : Component(addr), _data{new m5::container::CircularBuffer<qmp6988::Data>(1)}
162 {
163 auto ccfg = component_config();
164 ccfg.clock = 400 * 1000U;
165 component_config(ccfg);
166 }
167 virtual ~UnitQMP6988()
168 {
169 }
170
171 virtual bool begin() override;
172 virtual void update(const bool force = false) override;
173
176
177 inline config_t config() const
178 {
179 return _cfg;
180 }
182 inline void config(const config_t& cfg)
183 {
184 _cfg = cfg;
185 }
187
191 inline float temperature() const
192 {
193 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
194 }
196 inline float celsius() const
197 {
198 return !empty() ? oldest().celsius() : std::numeric_limits<float>::quiet_NaN();
199 }
201 inline float fahrenheit() const
202 {
203 return !empty() ? oldest().fahrenheit() : std::numeric_limits<float>::quiet_NaN();
204 }
206 inline float pressure() const
207 {
208 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
209 }
211
214
223 inline bool startPeriodicMeasurement(const qmp6988::Oversampling osrsPressure,
224 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f,
225 const qmp6988::Standby st)
226 {
227 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement(osrsPressure,
228 osrsTemperature, f, st);
229 }
236 {
237 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::startPeriodicMeasurement();
238 }
244 {
245 return PeriodicMeasurementAdapter<UnitQMP6988, qmp6988::Data>::stopPeriodicMeasurement();
246 }
248
251
262 bool measureSingleshot(qmp6988::Data& d, const qmp6988::Oversampling osrsPressure,
263 const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f);
271
274
280 bool readOversampling(qmp6988::Oversampling& osrsPressure, qmp6988::Oversampling& osrsTemperature);
288 bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature);
295 bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure);
302 bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature);
322 bool writeFilter(const qmp6988::Filter f);
335 bool writeStandbyTime(const qmp6988::Standby st);
349 bool writePowerMode(const qmp6988::PowerMode mode);
358
363 bool softReset();
364
365protected:
366 bool start_periodic_measurement();
367 bool start_periodic_measurement(const qmp6988::Oversampling ost, const qmp6988::Oversampling osp,
368 const qmp6988::Filter f, const qmp6988::Standby st);
369 bool stop_periodic_measurement();
370
371 bool read_calibration(qmp6988::Calibration& c);
372
373 bool read_measurement(qmp6988::Data& d, const bool only_temperature = false);
374 bool is_data_ready();
375
376 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitQMP6988, qmp6988::Data);
377
378protected:
379 std::unique_ptr<m5::container::CircularBuffer<qmp6988::Data>> _data{};
380 qmp6988::Calibration _calibration{};
381 config_t _cfg{};
382 bool _only_temperature{};
383};
384
386namespace qmp6988 {
387namespace command {
388
389constexpr uint8_t CHIP_ID{0xD1};
390
391constexpr uint8_t READ_PRESSURE{0xF7}; // ~ F9 3bytes
392constexpr uint8_t READ_TEMPERATURE{0xFA}; // ~ FC 3bytes
393
394constexpr uint8_t IO_SETUP{0xF5};
395constexpr uint8_t CONTROL_MEASUREMENT{0xF4};
396constexpr uint8_t GET_STATUS{0xF3};
397constexpr uint8_t IIR_FILTER{0xF1};
398
399constexpr uint8_t SOFT_RESET{0xE0};
400
401constexpr uint8_t READ_COMPENSATION_COEFFICIENT{0xA0}; // ~ 0xB8 25 bytes
402
403} // namespace command
404} // namespace qmp6988
406
407} // namespace unit
408} // namespace m5
409#endif
Barometric pressure sensor to measure atmospheric pressure and altitude estimation.
Definition unit_QMP6988.hpp:139
float celsius() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:196
bool writeOversampling(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions.
Definition unit_QMP6988.cpp:341
bool readStandbyTime(qmp6988::Standby &st)
Read the standby time.
Definition unit_QMP6988.cpp:444
config_t config() const
Gets the configuration.
Definition unit_QMP6988.hpp:177
bool measureSingleshot(qmp6988::Data &d, const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f)
Measurement single shot.
Definition unit_QMP6988.cpp:290
bool readFilter(qmp6988::Filter &f)
Read the IIR filter co-efficient.
Definition unit_QMP6988.cpp:425
bool writePowerMode(const qmp6988::PowerMode mode)
Write the power mode.
Definition unit_QMP6988.cpp:404
bool writeFilter(const qmp6988::Filter f)
Write the IIR filter co-efficient.
Definition unit_QMP6988.cpp:435
float fahrenheit() const
Oldest measured temperature (Fahrenheit)
Definition unit_QMP6988.hpp:201
bool softReset()
Soft reset.
Definition unit_QMP6988.cpp:475
bool readOversampling(qmp6988::Oversampling &osrsPressure, qmp6988::Oversampling &osrsTemperature)
Read the oversampling conditions.
Definition unit_QMP6988.cpp:330
bool writeOversamplingPressure(const qmp6988::Oversampling osrsPressure)
Write the oversampling conditions for pressure.
Definition unit_QMP6988.cpp:358
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_QMP6988.hpp:191
bool writeOversamplingTemperature(const qmp6988::Oversampling osrsTemperature)
Write the oversampling conditions for temperature.
Definition unit_QMP6988.cpp:373
bool startPeriodicMeasurement(const qmp6988::Oversampling osrsPressure, const qmp6988::Oversampling osrsTemperature, const qmp6988::Filter f, const qmp6988::Standby st)
Start periodic measurement.
Definition unit_QMP6988.hpp:223
void config(const config_t &cfg)
Set the configuration.
Definition unit_QMP6988.hpp:182
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_QMP6988.hpp:243
bool writeStandbyTime(const qmp6988::Standby st)
Write the standby time.
Definition unit_QMP6988.cpp:454
bool startPeriodicMeasurement()
Start periodic measurement using current register settings.
Definition unit_QMP6988.hpp:235
bool writeUseCaseSetting(const qmp6988::UseCase uc)
Write the settings based on use cases.
Definition unit_QMP6988.cpp:469
float pressure() const
Oldest measured pressure (Pa)
Definition unit_QMP6988.hpp:206
bool readPowerMode(qmp6988::PowerMode &mode)
Read the power mode.
Definition unit_QMP6988.cpp:394
Top level namespace of M5Stack.
For QMP6988.
Unit-related namespace.
Settings for begin.
Definition unit_QMP6988.hpp:147
qmp6988::Filter filter
Filter if start on begin.
Definition unit_QMP6988.hpp:155
qmp6988::Standby standby
Standby time if start on begin.
Definition unit_QMP6988.hpp:157
qmp6988::Oversampling osrs_pressure
pressure oversampling if start on begin
Definition unit_QMP6988.hpp:151
qmp6988::Oversampling osrs_temperature
temperature oversampling if start on begin
Definition unit_QMP6988.hpp:153
bool start_periodic
Start periodic measurement on begin?
Definition unit_QMP6988.hpp:149
Light sensor measurement data.
Definition unit_HatYun.hpp:32
Measurement data group.
Definition unit_QMP6988.hpp:117
float temperature() const
temperature (Celsius)
Definition unit_QMP6988.hpp:120
const Calibration * calib
Points to the owning unit's calibration for compensation.
Definition unit_QMP6988.hpp:130
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_QMP6988.cpp:169
float celsius() const
temperature (Celsius)
Definition unit_QMP6988.cpp:158
float pressure() const
Definition unit_QMP6988.cpp:174
std::array< uint8_t, 6 > raw
Definition unit_QMP6988.hpp:118
UseCase
Preset settings.
Definition unit_QMP6988.hpp:97
@ Stair
Stair detection.
OversamplingSetting
Oversampling Settings.
Definition unit_QMP6988.hpp:55
PowerMode
Operation mode.
Definition unit_QMP6988.hpp:30
Filter
Filter setting.
Definition unit_QMP6988.hpp:69
@ Coeff32
co-efficient 32
Oversampling
Oversampling value.
Definition unit_QMP6988.hpp:40
Standby
Measurement standby time for power mode Normal.
Definition unit_QMP6988.hpp:82