28 void setup()
override;
30 void dump_config()
override;
32 void update()
override;
46 uint16_t start_overhead = 1910;
47 uint16_t end_overhead = 960;
48 uint16_t msrc_overhead = 660;
49 uint16_t tcc_overhead = 590;
50 uint16_t dss_overhead = 690;
51 uint16_t pre_range_overhead = 660;
52 uint16_t final_range_overhead = 550;
55 uint32_t budget_us = start_overhead + end_overhead;
57 get_sequence_step_enables_(&enables);
58 get_sequence_step_timeouts_(&enables, &timeouts);
61 budget_us += (timeouts.msrc_dss_tcc_us + tcc_overhead);
64 budget_us += 2 * (timeouts.msrc_dss_tcc_us + dss_overhead);
65 }
else if (enables.msrc) {
66 budget_us += (timeouts.msrc_dss_tcc_us + msrc_overhead);
69 if (enables.pre_range)
70 budget_us += (timeouts.pre_range_us + pre_range_overhead);
72 if (enables.final_range)
73 budget_us += (timeouts.final_range_us + final_range_overhead);
75 measurement_timing_budget_us_ = budget_us;
83 uint16_t start_overhead = 1320;
84 uint16_t end_overhead = 960;
85 uint16_t msrc_overhead = 660;
86 uint16_t tcc_overhead = 590;
87 uint16_t dss_overhead = 690;
88 uint16_t pre_range_overhead = 660;
89 uint16_t final_range_overhead = 550;
91 uint32_t min_timing_budget = 20000;
93 if (budget_us < min_timing_budget) {
97 uint32_t used_budget_us = start_overhead + end_overhead;
99 get_sequence_step_enables_(&enables);
100 get_sequence_step_timeouts_(&enables, &timeouts);
103 used_budget_us += (timeouts.msrc_dss_tcc_us + tcc_overhead);
107 used_budget_us += 2 * (timeouts.msrc_dss_tcc_us + dss_overhead);
108 }
else if (enables.msrc) {
109 used_budget_us += (timeouts.msrc_dss_tcc_us + msrc_overhead);
112 if (enables.pre_range) {
113 used_budget_us += (timeouts.pre_range_us + pre_range_overhead);
116 if (enables.final_range) {
117 used_budget_us += final_range_overhead;
125 if (used_budget_us > budget_us) {
130 uint32_t final_range_timeout_us = budget_us - used_budget_us;
140 uint16_t final_range_timeout_mclks =
141 timeout_microseconds_to_mclks_(final_range_timeout_us, timeouts.final_range_vcsel_period_pclks);
143 if (enables.pre_range) {
144 final_range_timeout_mclks += timeouts.pre_range_mclks;
147 write_byte_16(0x71, encode_timeout_(final_range_timeout_mclks));
151 measurement_timing_budget_us_ = budget_us;
157 uint8_t sequence_config = reg(0x01).get();
158 enables->
tcc = (sequence_config >> 4) & 0x1;
159 enables->
dss = (sequence_config >> 3) & 0x1;
160 enables->
msrc = (sequence_config >> 2) & 0x1;
161 enables->
pre_range = (sequence_config >> 6) & 0x1;
162 enables->
final_range = (sequence_config >> 7) & 0x1;
175 read_byte_16(0x51, &value);
182 read_byte_16(0x71, &value);
195 if (type == VCSEL_PERIOD_PRE_RANGE) {
196 vcsel = reg(0x50).get();
197 }
else if (type == VCSEL_PERIOD_FINAL_RANGE) {
198 vcsel = reg(0x70).get();
203 return (vcsel + 1) << 1;
207 return ((2304UL * vcsel_period_pclks * 1655UL) + 500UL) / 1000UL;
211 uint32_t macro_period_ns = get_macro_period_(vcsel_period_pclks);
212 return ((timeout_period_mclks * macro_period_ns) + (macro_period_ns / 2)) / 1000;
215 uint32_t macro_period_ns = get_macro_period_(vcsel_period_pclks);
216 return (((timeout_period_us * 1000) + (macro_period_ns / 2)) / macro_period_ns);
221 uint8_t msb = (reg_val >> 8) & 0xFF;
222 uint8_t lsb = (reg_val >> 0) & 0xFF;
223 return (uint16_t(lsb) << msb) + 1;
227 uint32_t ls_byte = 0;
228 uint16_t ms_byte = 0;
230 if (timeout_mclks <= 0)
233 ls_byte = timeout_mclks - 1;
235 while ((ls_byte & 0xFFFFFF00) > 0) {
240 return (ms_byte << 8) | (ls_byte & 0xFF);
244 reg(0x00) = 0x01 | vhv_init_byte;
246 uint32_t start =
millis();
247 while ((reg(0x13).
get() & 0x07) == 0) {
248 if (
millis() - start > 1000)
263 bool initiated_read_{
false};
264 bool waiting_for_interrupt_{
false};
268 uint16_t timeout_us_{};
const float DATA
For components that import data from directly connected sensors like DHT.
uint32_t get_macro_period_(uint8_t vcsel_period_pclks)
uint16_t pre_range_vcsel_period_pclks
uint32_t timeout_mclks_to_microseconds_(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks)
bool set_measurement_timing_budget_(uint32_t budget_us)
uint16_t decode_timeout_(uint16_t reg_val)
static bool enable_pin_setup_complete
This class simplifies creating components that periodically check a state.
void set_signal_rate_limit(float signal_rate_limit)
uint32_t IRAM_ATTR HOT millis()
uint32_t measurement_timing_budget_us_
uint16_t msrc_dss_tcc_mclks
void set_timeout_us(uint32_t timeout_us)
uint16_t timeout_start_us_
uint32_t timeout_microseconds_to_mclks_(uint32_t timeout_period_us, uint8_t vcsel_period_pclks)
void get_sequence_step_enables_(SequenceStepEnables *enables)
static std::list< VL53L0XSensor * > vl53_sensors
bool perform_single_ref_calibration_(uint8_t vhv_init_byte)
uint16_t final_range_vcsel_period_pclks
void IRAM_ATTR HOT yield()
void set_enable_pin(GPIOPin *enable)
float get_setup_priority() const override
void set_long_range(bool long_range)
uint8_t get_vcsel_pulse_period_(VcselPeriodType type)
uint32_t get_measurement_timing_budget_()
Base-class for all sensors.
uint16_t encode_timeout_(uint16_t timeout_mclks)
uint16_t final_range_mclks
void get_sequence_step_timeouts_(SequenceStepEnables const *enables, SequenceStepTimeouts *timeouts)