303 *type_is_aperture = (tmp >> 7) & 0x01;
323 enables->
tcc = (sequence_config >> 4) & 0x1;
324 enables->
dss = (sequence_config >> 3) & 0x1;
325 enables->
msrc = (sequence_config >> 2) & 0x1;
326 enables->
pre_range = (sequence_config >> 6) & 0x1;
327 enables->
final_range = (sequence_config >> 7) & 0x1;
334 #define decodeVcselPeriod(reg_val) (((reg_val) + 1) << 1) 347 #define calcMacroPeriod(vcsel_period_pclks) ((((uint32_t)2304 * (vcsel_period_pclks) * 1655) + 500) / 1000) 350 return ((timeout_period_mclks * macro_period_ns) + (macro_period_ns / 2)) / 1000;
360 return (uint16_t)((reg_val & 0x00FF) <<
361 (uint16_t)((reg_val & 0xFF00) >> 8)) + 1;
406 uint16_t
const StartOverhead = 1910;
407 uint16_t
const EndOverhead = 960;
408 uint16_t
const MsrcOverhead = 660;
409 uint16_t
const TccOverhead = 590;
410 uint16_t
const DssOverhead = 690;
411 uint16_t
const PreRangeOverhead = 660;
412 uint16_t
const FinalRangeOverhead = 550;
415 uint32_t budget_us = StartOverhead + EndOverhead;
426 }
else if (enables.
msrc) {
431 budget_us += (timeouts.
pre_range_us + PreRangeOverhead);
448 return (((timeout_period_us * 1000) + (macro_period_ns / 2)) / macro_period_ns);
459 uint32_t ls_byte = 0;
460 uint16_t ms_byte = 0;
462 if (timeout_mclks > 0) {
463 ls_byte = timeout_mclks - 1;
465 while ((ls_byte & 0xFFFFFF00) > 0) {
470 return (ms_byte << 8) | (ls_byte & 0xFF);
487 uint16_t
const StartOverhead = 1320;
488 uint16_t
const EndOverhead = 960;
489 uint16_t
const MsrcOverhead = 660;
490 uint16_t
const TccOverhead = 590;
491 uint16_t
const DssOverhead = 690;
492 uint16_t
const PreRangeOverhead = 660;
493 uint16_t
const FinalRangeOverhead = 550;
495 uint32_t
const MinTimingBudget = 20000;
497 if (budget_us < MinTimingBudget) {
return false; }
499 uint32_t used_budget_us = StartOverhead + EndOverhead;
510 }
else if (enables.
msrc) {
515 used_budget_us += (timeouts.
pre_range_us + PreRangeOverhead);
519 used_budget_us += FinalRangeOverhead;
527 if (used_budget_us > budget_us) {
532 uint32_t final_range_timeout_us = budget_us - used_budget_us;
542 uint16_t final_range_timeout_mclks =
585 bool spad_type_is_aperture;
587 printf(
"Failed to get SPAD info\n");
594 uint8_t ref_spad_map[6];
596 printf(
"Failed to read SPAD map\n");
607 uint8_t first_spad_to_enable = spad_type_is_aperture ? 12 : 0;
608 uint8_t spads_enabled = 0;
610 for (uint8_t i = 0; i < 48; i++) {
611 if (i < first_spad_to_enable || spads_enabled == spad_count) {
614 ref_spad_map[i / 8] &= ~(1 << (i % 8));
615 }
else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) {
621 memcpy(®_spad_map[1], ref_spad_map, 6);
656 printf(
"Failed SingleRefCalibration1\n");
666 printf(
"Failed SingleRefCalibration2\n");
741 uint8_t b[3] = { reg, uint8_t(value>>8), uint8_t(value) };
int printf(const char *fmt,...)
virtual Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, Device::PeriodicCb) override=0
#define calcMacroPeriod(vcsel_period_pclks)
void write_register(uint8_t reg, uint8_t value)
uint16_t read_register16(uint8_t reg)
AP_HAL::OwnPtr< AP_HAL::I2CDevice > dev
static AP_RangeFinder_Backend * detect(RangeFinder::RangeFinder_State &_state, AP_HAL::OwnPtr< AP_HAL::I2CDevice > dev)
uint32_t getMeasurementTimingBudget(void)
bool get_reading(uint16_t &reading_cm)
uint32_t get_bus_id(void) const
bool get_SPAD_info(uint8_t *count, bool *type_is_aperture)
uint8_t getVcselPulsePeriod(vcselPeriodType type)
virtual Semaphore * get_semaphore() override=0
void start_continuous(void)
virtual bool take(uint32_t timeout_ms) WARN_IF_UNUSED=0
bool performSingleRefCalibration(uint8_t vhv_init_byte)
uint16_t decodeTimeout(uint16_t reg_val)
static const RegData tuning_data[]
virtual void delay(uint16_t ms)=0
static uint16_t be16toh(be16_t value)
static AP_HAL::OwnPtr< AP_HAL::Device > dev
uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks)
#define decodeVcselPeriod(reg_val)
uint16_t msrc_dss_tcc_mclks
virtual bool transfer(const uint8_t *send, uint32_t send_len, uint8_t *recv, uint32_t recv_len) override=0
AP_RangeFinder_VL53L0X(RangeFinder::RangeFinder_State &_state, AP_HAL::OwnPtr< AP_HAL::I2CDevice > dev)
uint16_t encodeTimeout(uint16_t timeout_mclks)
uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks)
void getSequenceStepEnables(SequenceStepEnables *enables)
bool setMeasurementTimingBudget(uint32_t budget_us)
void getSequenceStepTimeouts(SequenceStepEnables const *enables, SequenceStepTimeouts *timeouts)
const AP_HAL::HAL & hal
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
bool read_registers(uint8_t first_reg, uint8_t *recv, uint32_t recv_len)
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
void set_status(RangeFinder::RangeFinder_Status status)
RangeFinder::RangeFinder_State & state
uint32_t measurement_timing_budget_us
void write_register16(uint8_t reg, uint16_t value)
uint16_t final_range_mclks
bool write_register(uint8_t reg, uint8_t val, bool checked=false)
uint16_t pre_range_vcsel_period_pclks
uint8_t read_register(uint8_t reg)
uint16_t final_range_vcsel_period_pclks
AP_HAL::Scheduler * scheduler