DeterministicESPAsyncWebServer v6.28.0
Zero-allocation, bounded-execution async HTTP server for ESP32
Loading...
Searching...
No Matches
vl53l0x.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file vl53l0x.cpp
6 * @brief VL53L0X time-of-flight ranging codec + ESP32 binding (see vl53l0x.h).
7 */
8
10#include "ServerConfig.h"
11
12#if DETWS_ENABLE_VL53L0X
13
14uint16_t vl53l0x_range_mm(uint8_t hi, uint8_t lo)
15{
16 return (uint16_t)((hi << 8) | lo);
17}
18
19bool vl53l0x_data_ready(uint8_t interrupt_status)
20{
21 return (interrupt_status & 0x07) != 0;
22}
23
24uint8_t vl53l0x_range_status(uint8_t range_status_reg)
25{
26 return (uint8_t)((range_status_reg >> 3) & 0x0F);
27}
28
29bool vl53l0x_range_valid(uint8_t range_status_reg)
30{
31 return vl53l0x_range_status(range_status_reg) == VL53L0X_RANGE_VALID;
32}
33
34#if defined(ARDUINO)
35
36#include "services/i2c.h"
37#include <Arduino.h>
38#include <Wire.h>
39
40namespace
41{
42// All VL53L0X I2C-binding state, owned by one instance (internal linkage): the device address,
43// so it is one named owner, unreachable from any other translation unit.
44struct Vl53l0xCtx
45{
46 uint8_t addr = 0x29;
47};
48Vl53l0xCtx s_vl;
49
50bool w8(uint8_t reg, uint8_t val)
51{
52 Wire.beginTransmission(s_vl.addr);
53 Wire.write(reg);
54 Wire.write(val);
55 return Wire.endTransmission() == 0;
56}
57
58bool r8(uint8_t reg, uint8_t *val)
59{
60 Wire.beginTransmission(s_vl.addr);
61 Wire.write(reg);
62 if (Wire.endTransmission(false) != 0)
63 return false;
64 if (Wire.requestFrom((int)s_vl.addr, 1) != 1)
65 return false;
66 *val = (uint8_t)Wire.read();
67 return true;
68}
69
70bool rn(uint8_t reg, uint8_t *buf, uint8_t n)
71{
72 Wire.beginTransmission(s_vl.addr);
73 Wire.write(reg);
74 if (Wire.endTransmission(false) != 0)
75 return false;
76 if (Wire.requestFrom((int)s_vl.addr, (int)n) != n)
77 return false;
78 for (uint8_t i = 0; i < n; i++)
79 buf[i] = (uint8_t)Wire.read();
80 return true;
81}
82} // namespace
83
84bool vl53l0x_begin(uint8_t addr)
85{
87 s_vl.addr = addr;
88 uint8_t id = 0;
90 return false;
91 return w8(VL53L0X_REG_SYSRANGE_START, 0x02); // continuous back-to-back ranging
92}
93
94bool vl53l0x_read_mm(uint16_t *mm)
95{
96 if (!mm)
97 return false;
98 uint8_t irq = 0;
100 return false;
101 uint8_t buf[12];
102 if (!rn(VL53L0X_REG_RESULT_RANGE_STATUS, buf, 12))
103 return false;
104 bool valid = vl53l0x_range_valid(buf[0]);
105 *mm = vl53l0x_range_mm(buf[10], buf[11]); // distance at RESULT_RANGE_STATUS + 10/11
107 return valid;
108}
109
110#endif // ARDUINO
111
112#endif // DETWS_ENABLE_VL53L0X
User-facing configuration for DeterministicESPAsyncWebServer.
The one owner of the shared I2C bus bring-up for the peripheral drivers.
void detws_i2c_begin()
Bring up the shared I2C bus on DETWS_I2C_SDA_PIN / DETWS_I2C_SCL_PIN (-1 = default).
Definition i2c.h:33
ST VL53L0X / VL53L1X optical time-of-flight ranging codec (DETWS_ENABLE_VL53L0X).
#define VL53L0X_REG_SYSRANGE_START
Definition vl53l0x.h:26
bool vl53l0x_begin(uint8_t addr)
Verify the model id and start continuous back-to-back ranging at addr.
#define VL53L0X_MODEL_ID
IDENTIFICATION_MODEL_ID for the VL53L0X.
Definition vl53l0x.h:32
bool vl53l0x_data_ready(uint8_t interrupt_status)
True if a new measurement is ready (any of the low 3 interrupt-status bits set).
#define VL53L0X_REG_IDENTIFICATION_MODEL_ID
Definition vl53l0x.h:30
bool vl53l0x_range_valid(uint8_t range_status_reg)
True if the range-status field reports a valid measurement (== VL53L0X_RANGE_VALID).
bool vl53l0x_read_mm(uint16_t *mm)
If a measurement is ready, read the distance into mm and clear the interrupt.
#define VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR
Definition vl53l0x.h:27
uint8_t vl53l0x_range_status(uint8_t range_status_reg)
The DeviceRangeStatus field (bits 6:3) of the RESULT_RANGE_STATUS register.
#define VL53L0X_REG_RESULT_RANGE_STATUS
Definition vl53l0x.h:29
uint16_t vl53l0x_range_mm(uint8_t hi, uint8_t lo)
Combine the range high/low bytes (RESULT_RANGE_STATUS+10 / +11) into millimeters.
#define VL53L0X_RANGE_VALID
DeviceRangeStatus value that means a valid measurement.
Definition vl53l0x.h:33
#define VL53L0X_REG_RESULT_INTERRUPT_STATUS
Definition vl53l0x.h:28