10#ifndef M5_UNIT_TOF_UNIT_VL53L0X_HPP
11#define M5_UNIT_TOF_UNIT_VL53L0X_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <m5_utility/types.hpp>
62 std::array<uint8_t, 12>
raw{};
68 return ((
raw[0] & 0x78) >> 3) == 11;
77 return valid() ? m5::types::big_uint16_t(
raw[10],
raw[11]).get() : -1;
87class UnitVL53L0X :
public Component,
public PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data> {
104 explicit UnitVL53L0X(
const uint8_t addr = DEFAULT_ADDRESS)
105 : Component(addr), _data{new
m5::container::CircularBuffer<vl53l0x::Data>(1)}
107 auto ccfg = component_config();
108 ccfg.clock = 400 * 1000U;
109 component_config(ccfg);
111 virtual ~UnitVL53L0X()
115 virtual bool begin()
override;
116 virtual void update(
const bool force =
false)
override;
140 return !empty() ? oldest().range() : -1;
145 return !empty() && oldest().valid();
150 return !empty() ? oldest().range_status() : vl53l0x::RangeStatus::Unknown;
173 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::startPeriodicMeasurement();
182 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::startPeriodicMeasurement(
mode);
190 return PeriodicMeasurementAdapter<UnitVL53L0X, vl53l0x::Data>::stopPeriodicMeasurement();
250 bool start_periodic_measurement();
255 bool stop_periodic_measurement();
257 bool read_data_ready_status();
258 bool read_measurement(vl53l0x::Data& d);
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);
266 bool write_default_settings();
268 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitVL53L0X, vl53l0x::Data);
271 vl53l0x::Mode _mode{vl53l0x::Mode::Unknown};
273 std::unique_ptr<m5::container::CircularBuffer<vl53l0x::Data>> _data{};
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};
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};
307constexpr uint8_t ALGO_PHASECAL_LIM{0x30};
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.
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