ProtoCore v0.0.2
Deterministic, zero-heap network stack for embedded targets
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 "protocore_config.h"
11
12#if PC_ENABLE_VL53L0X
13
14#if defined(ARDUINO)
16#include <Arduino.h>
17#include <Wire.h>
18#endif
19uint16_t pc_vl53l0x_range_mm(uint8_t hi, uint8_t lo)
20{
21 return (uint16_t)((hi << 8) | lo);
22}
23
24bool pc_vl53l0x_data_ready(uint8_t interrupt_status)
25{
26 return (interrupt_status & 0x07) != 0;
27}
28
29uint8_t pc_vl53l0x_range_status(uint8_t range_status_reg)
30{
31 return (uint8_t)((range_status_reg >> 3) & 0x0F);
32}
33
34bool pc_vl53l0x_range_valid(uint8_t range_status_reg)
35{
36 return pc_vl53l0x_range_status(range_status_reg) == VL53L0X_RANGE_VALID;
37}
38
39#if defined(ARDUINO)
40
41namespace
42{
43// All VL53L0X I2C-binding state, owned by one instance (internal linkage): the device address,
44// so it is one named owner, unreachable from any other translation unit.
45struct Vl53l0xCtx
46{
47 uint8_t addr = 0x29;
48};
49Vl53l0xCtx s_vl;
50
51bool w8(uint8_t reg, uint8_t val)
52{
53 Wire.beginTransmission(s_vl.addr);
54 Wire.write(reg);
55 Wire.write(val);
56 return Wire.endTransmission() == 0;
57}
58
59bool r8(uint8_t reg, uint8_t *val)
60{
61 Wire.beginTransmission(s_vl.addr);
62 Wire.write(reg);
63 if (Wire.endTransmission(false) != 0)
64 {
65 return false;
66 }
67 if (Wire.requestFrom((int)s_vl.addr, 1) != 1)
68 {
69 return false;
70 }
71 *val = (uint8_t)Wire.read();
72 return true;
73}
74
75bool rn(uint8_t reg, uint8_t *buf, uint8_t n)
76{
77 Wire.beginTransmission(s_vl.addr);
78 Wire.write(reg);
79 if (Wire.endTransmission(false) != 0)
80 {
81 return false;
82 }
83 if (Wire.requestFrom((int)s_vl.addr, (int)n) != n)
84 {
85 return false;
86 }
87 for (uint8_t i = 0; i < n; i++)
88 {
89 buf[i] = (uint8_t)Wire.read();
90 }
91 return true;
92}
93} // namespace
94
95bool pc_vl53l0x_begin(uint8_t addr)
96{
98 s_vl.addr = addr;
99 uint8_t id = 0;
101 {
102 return false;
103 }
104 return w8(VL53L0X_REG_SYSRANGE_START, 0x02); // continuous back-to-back ranging
105}
106
107bool pc_vl53l0x_read_mm(uint16_t *mm)
108{
109 if (!mm)
110 {
111 return false;
112 }
113 uint8_t irq = 0;
115 {
116 return false;
117 }
118 uint8_t buf[12];
119 if (!rn(VL53L0X_REG_RESULT_RANGE_STATUS, buf, 12))
120 {
121 return false;
122 }
123 bool valid = pc_vl53l0x_range_valid(buf[0]);
124 *mm = pc_vl53l0x_range_mm(buf[10], buf[11]); // distance at RESULT_RANGE_STATUS + 10/11
126 return valid;
127}
128
129#endif // ARDUINO
130
131#endif // PC_ENABLE_VL53L0X
The one owner of the shared I2C bus bring-up for the peripheral drivers.
void pc_i2c_begin()
Bring up the shared I2C bus on PC_I2C_SDA_PIN / PC_I2C_SCL_PIN (-1 = default).
Definition i2c.h:33
User-facing configuration for ProtoCore.
ST VL53L0X / VL53L1X optical time-of-flight ranging codec (PC_ENABLE_VL53L0X).
bool pc_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_SYSRANGE_START
Definition vl53l0x.h:26
uint16_t pc_vl53l0x_range_mm(uint8_t hi, uint8_t lo)
Combine the range high/low bytes (RESULT_RANGE_STATUS+10 / +11) into millimeters.
#define VL53L0X_MODEL_ID
IDENTIFICATION_MODEL_ID for the VL53L0X.
Definition vl53l0x.h:32
#define VL53L0X_REG_IDENTIFICATION_MODEL_ID
Definition vl53l0x.h:30
bool pc_vl53l0x_range_valid(uint8_t range_status_reg)
True if the range-status field reports a valid measurement (== VL53L0X_RANGE_VALID).
bool pc_vl53l0x_read_mm(uint16_t *mm)
If a measurement is ready, read the distance into mm and clear the interrupt.
uint8_t pc_vl53l0x_range_status(uint8_t range_status_reg)
The DeviceRangeStatus field (bits 6:3) of the RESULT_RANGE_STATUS register.
#define VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR
Definition vl53l0x.h:27
bool pc_vl53l0x_begin(uint8_t addr)
Verify the model id and start continuous back-to-back ranging at addr.
#define VL53L0X_REG_RESULT_RANGE_STATUS
Definition vl53l0x.h:29
#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