Line data Source code
1 : #pragma once 2 : 3 : #include "AP_RangeFinder_config.h" 4 : 5 : #if AP_RANGEFINDER_VL53L0X_ENABLED 6 : 7 : #include "AP_RangeFinder.h" 8 : #include "AP_RangeFinder_Backend.h" 9 : #include <AP_HAL/I2CDevice.h> 10 : 11 : class AP_RangeFinder_VL53L0X : public AP_RangeFinder_Backend 12 : { 13 : 14 : public: 15 : // static detection function 16 : static AP_RangeFinder_Backend *detect(RangeFinder::RangeFinder_State &_state, AP_RangeFinder_Params &_params, AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev); 17 : 18 : // update state 19 : void update(void) override; 20 : 21 : protected: 22 : 23 0 : virtual MAV_DISTANCE_SENSOR _get_mav_distance_sensor_type() const override { 24 0 : return MAV_DISTANCE_SENSOR_LASER; 25 : } 26 : 27 : private: 28 : // constructor 29 : AP_RangeFinder_VL53L0X(RangeFinder::RangeFinder_State &_state, AP_RangeFinder_Params &_params, AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev); 30 : 31 : __INITFUNC__ bool init(); 32 : void timer(); 33 : 34 : // check sensor ID 35 : bool check_id(void); 36 : 37 : // get a reading 38 : bool get_reading(uint16_t &reading_cm); 39 : AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev; 40 : 41 : uint8_t read_register(uint8_t reg); 42 : uint16_t read_register16(uint8_t reg); 43 : 44 : void write_register(uint8_t reg, uint8_t value); 45 : void write_register16(uint8_t reg, uint16_t value); 46 : 47 : struct SequenceStepEnables { 48 : bool tcc:1, msrc:1, dss:1, pre_range:1, final_range:1; 49 : }; 50 : 51 : struct SequenceStepTimeouts { 52 : uint16_t pre_range_vcsel_period_pclks, final_range_vcsel_period_pclks; 53 : 54 : uint16_t msrc_dss_tcc_mclks, pre_range_mclks, final_range_mclks; 55 : uint32_t msrc_dss_tcc_us, pre_range_us, final_range_us; 56 : }; 57 : 58 : struct RegData { 59 : uint8_t reg; 60 : uint8_t value; 61 : }; 62 : 63 : static const RegData tuning_data[]; 64 : 65 : enum vcselPeriodType { VcselPeriodPreRange, VcselPeriodFinalRange }; 66 : 67 : bool get_SPAD_info(uint8_t * count, bool *type_is_aperture); 68 : void getSequenceStepEnables(SequenceStepEnables * enables); 69 : uint32_t getMeasurementTimingBudget(void); 70 : void getSequenceStepTimeouts(SequenceStepEnables const * enables, SequenceStepTimeouts * timeouts); 71 : uint8_t getVcselPulsePeriod(vcselPeriodType type); 72 : uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks); 73 : uint16_t decodeTimeout(uint16_t reg_val); 74 : bool setMeasurementTimingBudget(uint32_t budget_us); 75 : uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks); 76 : uint16_t encodeTimeout(uint16_t timeout_mclks); 77 : bool performSingleRefCalibration(uint8_t vhv_init_byte); 78 : void start_continuous(void); 79 : 80 : uint8_t stop_variable; 81 : uint32_t measurement_timing_budget_us; 82 : uint32_t start_ms; 83 : 84 : uint32_t sum_mm; 85 : uint32_t counter; 86 : }; 87 : 88 : #endif // AP_RANGEFINDER_VL53L0X_ENABLED