16static const char *
const TAG =
"vl53l0x";
24 LOG_SENSOR(
"",
"VL53L0X",
this);
25 LOG_UPDATE_INTERVAL(
this);
35 ESP_LOGD(TAG,
"'%s' - setup BEGIN", this->
name_.
c_str());
39 if (vl53_sensor->enable_pin_ !=
nullptr) {
41 vl53_sensor->enable_pin_->setup();
42 vl53_sensor->enable_pin_->digital_write(
false);
91 while (
reg(0x83).get() == 0x00) {
93 ESP_LOGE(TAG,
"'%s' - setup timeout", this->
name_.
c_str());
101 uint8_t tmp =
reg(0x92).
get();
102 uint8_t spad_count = tmp & 0x7F;
103 bool spad_type_is_aperture = tmp & 0x80;
113 uint8_t ref_spad_map[6] = {};
122 uint8_t first_spad_to_enable = spad_type_is_aperture ? 12 : 0;
123 uint8_t spads_enabled = 0;
124 for (
int i = 0; i < 48; i++) {
125 uint8_t &
val = ref_spad_map[i / 8];
126 uint8_t mask = 1 << (i % 8);
128 if (i < first_spad_to_enable || spads_enabled == spad_count) {
130 }
else if (
val & mask) {
243 ESP_LOGW(TAG,
"1st reference calibration failed!");
249 ESP_LOGW(TAG,
"2nd reference calibration failed!");
259 reg(0x8A) = final_address & 0x7F;
262 ESP_LOGD(TAG,
"'%s' - setup END", this->
name_.
c_str());
269 ESP_LOGW(TAG,
"%s - update called before prior reading complete - initiated:%d waiting_for_interrupt:%d",
270 this->
name_.
c_str(), this->initiated_read_, this->waiting_for_interrupt_);
291 if (
reg(0x00).get() & 0x01) {
301 if (
reg(0x13).get() & 0x07) {
302 uint16_t range_mm = 0;
307 if (range_mm >= 8190) {
308 ESP_LOGD(TAG,
"'%s' - Distance is out of range, please move the target closer", this->
name_.
c_str());
313 float range_m = range_mm / 1e3f;
314 ESP_LOGD(TAG,
"'%s' - Got distance %.3f m", this->
name_.
c_str(), range_m);
324 uint16_t start_overhead = 1910;
325 uint16_t end_overhead = 960;
326 uint16_t msrc_overhead = 660;
327 uint16_t tcc_overhead = 590;
328 uint16_t dss_overhead = 690;
329 uint16_t pre_range_overhead = 660;
330 uint16_t final_range_overhead = 550;
333 uint32_t budget_us = start_overhead + end_overhead;
339 budget_us += (timeouts.msrc_dss_tcc_us + tcc_overhead);
342 budget_us += 2 * (timeouts.msrc_dss_tcc_us + dss_overhead);
343 }
else if (enables.msrc) {
344 budget_us += (timeouts.msrc_dss_tcc_us + msrc_overhead);
347 if (enables.pre_range)
348 budget_us += (timeouts.pre_range_us + pre_range_overhead);
350 if (enables.final_range)
351 budget_us += (timeouts.final_range_us + final_range_overhead);
361 uint16_t start_overhead = 1320;
362 uint16_t end_overhead = 960;
363 uint16_t msrc_overhead = 660;
364 uint16_t tcc_overhead = 590;
365 uint16_t dss_overhead = 690;
366 uint16_t pre_range_overhead = 660;
367 uint16_t final_range_overhead = 550;
369 uint32_t min_timing_budget = 20000;
371 if (budget_us < min_timing_budget) {
375 uint32_t used_budget_us = start_overhead + end_overhead;
381 used_budget_us += (timeouts.msrc_dss_tcc_us + tcc_overhead);
385 used_budget_us += 2 * (timeouts.msrc_dss_tcc_us + dss_overhead);
386 }
else if (enables.msrc) {
387 used_budget_us += (timeouts.msrc_dss_tcc_us + msrc_overhead);
390 if (enables.pre_range) {
391 used_budget_us += (timeouts.pre_range_us + pre_range_overhead);
394 if (enables.final_range) {
395 used_budget_us += final_range_overhead;
403 if (used_budget_us > budget_us) {
408 uint32_t final_range_timeout_us = budget_us - used_budget_us;
418 uint16_t final_range_timeout_mclks =
421 if (enables.pre_range) {
422 final_range_timeout_mclks += timeouts.pre_range_mclks;
435 uint8_t sequence_config =
reg(0x01).
get();
436 enables->
tcc = (sequence_config >> 4) & 0x1;
437 enables->
dss = (sequence_config >> 3) & 0x1;
438 enables->
msrc = (sequence_config >> 2) & 0x1;
439 enables->
pre_range = (sequence_config >> 6) & 0x1;
440 enables->
final_range = (sequence_config >> 7) & 0x1;
479 return (vcsel + 1) << 1;
483 return ((2304UL * vcsel_period_pclks * 1655UL) + 500UL) / 1000UL;
488 return ((timeout_period_mclks * macro_period_ns) + (macro_period_ns / 2)) / 1000;
493 return (((timeout_period_us * 1000) + (macro_period_ns / 2)) / macro_period_ns);
498 uint8_t msb = (reg_val >> 8) & 0xFF;
499 uint8_t lsb = (reg_val >> 0) & 0xFF;
500 return (uint16_t(lsb) << msb) + 1;
505 uint32_t ls_byte = 0;
506 uint16_t ms_byte = 0;
508 if (timeout_mclks <= 0)
511 ls_byte = timeout_mclks - 1;
513 while ((ls_byte & 0xFFFFFF00) > 0) {
518 return (ms_byte << 8) | (ls_byte & 0xFF);
522 reg(0x00) = 0x01 | vhv_init_byte;
524 uint32_t start =
millis();
525 while ((
reg(0x13).get() & 0x07) == 0) {
526 if (
millis() - start > 1000)
virtual void mark_failed()
Mark this component as failed.
void status_momentary_warning(const std::string &name, uint32_t length=5000)
virtual void digital_write(bool value)=0
constexpr const char * c_str() const
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len, bool stop=true)
uint8_t address_
store the address of the device on the bus
bool read_byte_16(uint8_t a_register, uint16_t *data)
I2CRegister reg(uint8_t a_register)
calls the I2CRegister constructor
void set_i2c_address(uint8_t address)
We store the address of the device on the bus.
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len)
Compat APIs All methods below have been added for compatibility reasons.
bool write_byte_16(uint8_t a_register, uint16_t data)
uint8_t get() const
returns the register value
void publish_state(float state)
Publish a new state to the front-end.
uint16_t timeout_start_us_
uint32_t timeout_mclks_to_microseconds_(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks)
void get_sequence_step_enables_(SequenceStepEnables *enables)
uint32_t measurement_timing_budget_us_
bool perform_single_ref_calibration_(uint8_t vhv_init_byte)
static bool enable_pin_setup_complete
bool waiting_for_interrupt_
uint16_t decode_timeout_(uint16_t reg_val)
uint32_t timeout_microseconds_to_mclks_(uint32_t timeout_period_us, uint8_t vcsel_period_pclks)
static std::list< VL53L0XSensor * > vl53_sensors
void get_sequence_step_timeouts_(SequenceStepEnables const *enables, SequenceStepTimeouts *timeouts)
bool set_measurement_timing_budget_(uint32_t budget_us)
uint32_t get_measurement_timing_budget_()
uint32_t get_macro_period_(uint8_t vcsel_period_pclks)
uint8_t get_vcsel_pulse_period_(VcselPeriodType type)
void dump_config() override
uint16_t encode_timeout_(uint16_t timeout_mclks)
@ VCSEL_PERIOD_FINAL_RANGE
Providing packet encoding functions for exchanging data with a remote host.
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
void IRAM_ATTR HOT yield()
uint32_t IRAM_ATTR HOT micros()
uint32_t IRAM_ATTR HOT millis()
uint16_t final_range_vcsel_period_pclks
uint16_t msrc_dss_tcc_mclks
uint16_t final_range_mclks
uint16_t pre_range_vcsel_period_pclks