M5Unit-TOF 0.1.0 git rev:d9853ac
Loading...
Searching...
No Matches
unit_VL53L0X.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_TOF_UNIT_VL53L0X_HPP
11#define M5_UNIT_TOF_UNIT_VL53L0X_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <m5_utility/types.hpp>
16#include <array>
17#include <limits> // NaN
18
19namespace m5 {
20namespace unit {
21namespace vl53l0x {
26enum class Operating : uint8_t {
29};
30
35enum class Mode : int8_t {
36 Unknown = -1,
37 Default,
39 LongRange,
40 HighSpeed,
41};
42
47enum class RangeStatus : uint8_t {
48 OK,
49 HardwareFailure,
50 PhaseFailure,
51 MinRangeFailure,
52 SignalFailure,
53 SigmaFailure,
54 Unknown = 255
55};
56
61struct Data {
62 std::array<uint8_t, 12> raw{};
66 inline bool valid() const
67 {
68 return ((raw[0] & 0x78) >> 3) == 11;
69 }
75 inline int16_t range() const
76 {
77 return valid() ? m5::types::big_uint16_t(raw[10], raw[11]).get() : -1;
78 }
79};
80
81} // namespace vl53l0x
82
87class UnitVL53L0X : public Component, public PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data> {
88 M5_UNIT_COMPONENT_HPP_BUILDER(UnitVL53L0X, 0x29);
89
90public:
95 struct config_t {
97 vl53l0x::Operating operating{vl53l0x::Operating::Condition2V8};
99 vl53l0x::Mode mode{vl53l0x::Mode::LongRange};
101 bool start_periodic{true};
102 };
103
104 explicit UnitVL53L0X(const uint8_t addr = DEFAULT_ADDRESS)
105 : Component(addr), _data{new m5::container::CircularBuffer<vl53l0x::Data>(1)}
106 {
107 auto ccfg = component_config();
108 ccfg.clock = 400 * 1000U;
109 component_config(ccfg);
110 }
111 virtual ~UnitVL53L0X()
112 {
113 }
114
115 virtual bool begin() override;
116 virtual void update(const bool force = false) override;
117
120
121 inline config_t config() const
122 {
123 return _cfg;
124 }
126 inline void config(const config_t& cfg)
127 {
128 _cfg = cfg;
129 }
131
134
138 inline int16_t range() const
139 {
140 return !empty() ? oldest().range() : -1;
141 }
143 inline bool valid() const
144 {
145 return !empty() && oldest().valid();
146 }
149 {
150 return !empty() ? oldest().range_status() : vl53l0x::RangeStatus::Unknown;
151 }
153
156
160 {
161 return _mode;
162 }
164
167
172 {
173 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::startPeriodicMeasurement();
174 }
181 {
182 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::startPeriodicMeasurement(mode);
183 }
189 {
190 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::stopPeriodicMeasurement();
191 }
193
196
205
207 bool softReset();
208
214 bool writeMode(const vl53l0x::Mode mode);
215
218
223 bool readSignalRateLimit(float& mcps);
229 bool writeSignalRateLimit(const float mcps);
231
235
240 bool readI2CAddress(uint8_t& i2c_address);
246 bool changeI2CAddress(const uint8_t i2c_address);
248
249protected:
250 bool start_periodic_measurement();
251 inline bool start_periodic_measurement(const vl53l0x::Mode mode)
252 {
253 return writeMode(mode) && start_periodic_measurement();
254 }
255 bool stop_periodic_measurement();
256
257 bool read_data_ready_status();
258 bool read_measurement(vl53l0x::Data& d);
259
260 bool write_default_values();
261 bool perform_single_ref_calibration(bool VHV);
262 bool write_vcsel_period_range(const uint8_t pre_pclk, const uint8_t final_pclk);
263
264 bool soft_reset();
265
266 bool write_default_settings();
267
268 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitVL53L0X, vl53l0x::Data);
269
270protected:
271 vl53l0x::Mode _mode{vl53l0x::Mode::Unknown};
272 uint8_t _stop{}; // stop variable
273 std::unique_ptr<m5::container::CircularBuffer<vl53l0x::Data>> _data{};
274 config_t _cfg{};
275};
276
278namespace vl53l0x {
279namespace command {
280constexpr uint8_t SYSTEM_RANGE_START{0x00};
281constexpr uint8_t SYSTEM_SEQUENCE_CONFIG{0x01};
282constexpr uint8_t SYSTEM_INTERMEASUREMENT_PERIOD{0x04};
283constexpr uint8_t SYSTEM_INTERRUPT_CONFIG_GPIO{0x0A};
284constexpr uint8_t SYSTEM_INTERRUPT_CLEAR{0x0B};
285constexpr uint8_t RESULT_INTERRUPT_STATUS{0x13};
286constexpr uint8_t RESULT_RANGE_STATUS{0x14};
287constexpr uint8_t RESULT_RANGE_STATUS_RESULT{0x1E};
288constexpr uint8_t ALGO_PHASECAL_CONFIG_TIMEOUT{0x30};
289constexpr uint8_t GLOBAL_CONFIG_VCSEL_WIDTH{0x32};
290constexpr uint8_t FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT{0x44};
291constexpr uint8_t MSRC_CONFIG_TIMEOUT_MACROP{0x46};
292constexpr uint8_t FINAL_RANGE_CONFIG_VALID_PHASE_LOW{0x47};
293constexpr uint8_t FINAL_RANGE_CONFIG_VALID_PHASE_HIGH{0x48};
294constexpr uint8_t PRE_RANGE_CONFIG_VCSEL_PERIOD{0x50};
295constexpr uint8_t PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI{0x51};
296constexpr uint8_t PRE_RANGE_CONFIG_VALID_PHASE_LOW{0x56};
297constexpr uint8_t PRE_RANGE_CONFIG_VALID_PHASE_HIGH{0x57};
298constexpr uint8_t MSRC_CONFIG_CONTROL{0x60};
299
300constexpr uint8_t FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI{0x71};
301constexpr uint8_t GPIO_HV_MUX_ACTIVE_HIGH{0x84};
302constexpr uint8_t I2C_SLAVE_DEVICE_ADDRESS{0x8A};
303constexpr uint8_t VHV_CONFIG_PAD_SCL_SDA_EXTSUP_HV{0x89};
304constexpr uint8_t SOFT_RESET{0xBF};
305constexpr uint8_t MODEL_ID{0xC0};
306
307constexpr uint8_t ALGO_PHASECAL_LIM{0x30};
308} // namespace command
309} // namespace vl53l0x
311
312} // namespace unit
313} // namespace m5
314#endif
ToF unit.
Definition unit_VL53L0X.hpp:87
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_VL53L0X.hpp:171
bool writeSignalRateLimit(const float mcps)
Write the signal range limit.
Definition unit_VL53L0X.cpp:307
bool softReset()
Software reset.
Definition unit_VL53L0X.cpp:437
int16_t range() const
Oldest measured range(mm)
Definition unit_VL53L0X.hpp:138
vl53l0x::Mode mode() const
Gets the inner mode.
Definition unit_VL53L0X.hpp:159
void config(const config_t &cfg)
Set the configration.
Definition unit_VL53L0X.hpp:126
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_VL53L0X.hpp:188
bool readSignalRateLimit(float &mcps)
Read the signal range limit.
Definition unit_VL53L0X.cpp:361
bool measureSingleshot(vl53l0x::Data &d)
Measurement single shot in the current settings.
Definition unit_VL53L0X.cpp:255
vl53l0x::RangeStatus range_status() const
Oldest measured range status.
Definition unit_VL53L0X.hpp:148
bool writeMode(const vl53l0x::Mode mode)
Write the operation mode.
Definition unit_VL53L0X.cpp:317
bool valid() const
Is valid oldest data?
Definition unit_VL53L0X.hpp:143
config_t config() const
Gets the configration.
Definition unit_VL53L0X.hpp:121
bool startPeriodicMeasurement(const vl53l0x::Mode mode)
Start periodic measurement.
Definition unit_VL53L0X.hpp:180
bool changeI2CAddress(const uint8_t i2c_address)
Change unit I2C address.
Definition unit_VL53L0X.cpp:465
bool readI2CAddress(uint8_t &i2c_address)
Read the I2C address.
Definition unit_VL53L0X.cpp:459
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_VL53L0X.hpp:95
vl53l0x::Mode mode
Operation mode.
Definition unit_VL53L0X.hpp:99
bool start_periodic
Start periodic measurement on begin?
Definition unit_VL53L0X.hpp:101
vl53l0x::Operating operating
Operatiing condition.
Definition unit_VL53L0X.hpp:97
Measurement data group.
Definition unit_VL53L0X.hpp:61
std::array< uint8_t, 12 > raw
Definition unit_VL53L0X.hpp:62
RangeStatus range_status() const
Range status.
Definition unit_VL53L0X.cpp:85
bool valid() const
Is data valid?
Definition unit_VL53L0X.hpp:66
int16_t range() const
range (mm)
Definition unit_VL53L0X.hpp:75
Operating
Operating condition.
Definition unit_VL53L0X.hpp:26
@ ConditionStandard
Standard mode (1.6 - 1.9 V)
@ Condition2V8
2V8 mode (2.6 - 3.5 V) (as default)
Mode
Operation Mode.
Definition unit_VL53L0X.hpp:35
@ HighSpeed
interval 20ms (limited to 1.2m)
@ HighAccuracy
interval 200ms (limited to 1.2m)
@ Default
interval 30ms (limited to 1.2m)
@ LongRange
interval 33ms (limited to 2.0m)
RangeStatus
Range status interpretation.
Definition unit_VL53L0X.hpp:47