VL52L8CX: C++ bindings for manufacturer driver.

feature/vl53l8cx
Phil Howard 2024-04-16 15:16:56 +01:00
rodzic bf99ae4863
commit 2274a09cd1
12 zmienionych plików z 696 dodań i 0 usunięć

4
.gitmodules vendored
Wyświetl plik

@ -25,3 +25,7 @@
[submodule "drivers/mlx90640/src"]
path = drivers/mlx90640/src
url = https://github.com/melexis/mlx90640-library
[submodule "drivers/vl53l8cx/src"]
path = drivers/vl53l8cx/src
url = https://github.com/ST-mirror/VL53L8CX_ULD_driver
branch = no-fw/lite/en

Wyświetl plik

@ -36,6 +36,7 @@ add_subdirectory(servo)
add_subdirectory(encoder)
add_subdirectory(motor)
add_subdirectory(vl53l5cx)
add_subdirectory(vl53l8cx)
add_subdirectory(pcf85063a)
add_subdirectory(pms5003)
add_subdirectory(sh1107)

Wyświetl plik

@ -0,0 +1 @@
include(${CMAKE_CURRENT_LIST_DIR}/vl53l8cx.cmake)

Wyświetl plik

@ -0,0 +1,235 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L8CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L8CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#include "platform.h"
#include "pico/stdlib.h"
uint8_t RdByte(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_value)
{
const uint8_t buf[2] = {
RegisterAdress >> 8,
RegisterAdress & 0xff
};
i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), true);
if(i2c_read_blocking(p_platform->i2c, p_platform->address, p_value, 1, false) != PICO_ERROR_GENERIC){
return 0;
}
return 255;
}
uint8_t WrByte(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t value)
{
const uint8_t buf[3] = {
RegisterAdress >> 8,
RegisterAdress & 0xff,
value,
};
if(i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), false) != PICO_ERROR_GENERIC) {
return 0;
}
return 255;
}
uint8_t WrMulti(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size)
{
uint8_t buf[2];
buf[0] = RegisterAdress >> 8;
buf[1] = RegisterAdress & 0xff;
// Send the 16-bit address with no STOP condition
int result = i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), true);
// Handle an error early... it gets dicey from here
if(result == PICO_ERROR_GENERIC) return 255;
// The VL53L8CX does not support "Repeated Start" and the Pico's I2C API doesn't
// let us send more bytes without sending another start condition.
// The horrow below lets us send out "p_values" followed by a STOP condition,
// without having to copy everything into a temporary buffer.
uint8_t *src = p_values;
// Send the rest of the data, followed by a STOP condition
// This re-implements the relevant portion of i2c_write_blocking_internal which is NOT sent a timeout check function by i2c_write_blocking
for (int byte_ctr = 0; byte_ctr < size; ++byte_ctr) {
bool last = byte_ctr == size - 1;
p_platform->i2c->hw->data_cmd =
bool_to_bit(last) << I2C_IC_DATA_CMD_STOP_LSB | *src++;
// Wait until the transmission of the address/data from the internal
// shift register has completed. For this to function correctly, the
// TX_EMPTY_CTRL flag in IC_CON must be set. The TX_EMPTY_CTRL flag
// was set in i2c_init.
do {
tight_loop_contents();
} while (!(p_platform->i2c->hw->raw_intr_stat & I2C_IC_RAW_INTR_STAT_TX_EMPTY_BITS));
if (p_platform->i2c->hw->tx_abrt_source) {
// Note clearing the abort flag also clears the reason, and
// this instance of flag is clear-on-read! Note also the
// IC_CLR_TX_ABRT register always reads as 0.
p_platform->i2c->hw->clr_tx_abrt;
// An abort on the LAST byte means things are probably fine
if(last) {
// TODO Could there be an abort while waiting for the STOP
// condition here? If so, additional code would be needed here
// to take care of the abort.
do {
tight_loop_contents();
} while (!(p_platform->i2c->hw->raw_intr_stat & I2C_IC_RAW_INTR_STAT_STOP_DET_BITS));
} else {
// Ooof, unhandled abort. Fail?
return 255;
}
}
}
// Not sure it matters where we clear this, but by default a "nostop" style write
// will set this flag so the next transaction starts with a "Repeated Start."
p_platform->i2c->restart_on_next = false;
return 0;
}
uint8_t RdMulti(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size)
{
const uint8_t buf[2] = {
RegisterAdress >> 8,
RegisterAdress & 0xff
};
i2c_write_blocking(p_platform->i2c, p_platform->address, buf, sizeof(buf), true);
if(i2c_read_blocking(p_platform->i2c, p_platform->address, p_values, size, false) != PICO_ERROR_GENERIC){
return 0;
}
return 255;
}
uint8_t Reset_Sensor(
VL53L8CX_Platform *p_platform)
{
uint8_t status = 0;
/* (Optional) Need to be implemented by customer. This function returns 0 if OK */
/* Set pin LPN to LOW */
/* Set pin AVDD to LOW */
/* Set pin VDDIO to LOW */
WaitMs(p_platform, 100);
/* Set pin LPN of to HIGH */
/* Set pin AVDD of to HIGH */
/* Set pin VDDIO of to HIGH */
WaitMs(p_platform, 100);
return status;
}
void SwapBuffer(
uint8_t *buffer,
uint16_t size)
{
uint32_t i, tmp;
/*for(auto i = 0u; i < size / 4u; i++) {
uint32_t *dword = &((uint32_t *)buffer)[i];
*dword = __builtin_bswap32(*dword);
}*/
/* Example of possible implementation using <string.h> */
for(i = 0; i < size; i = i + 4)
{
tmp = (
buffer[i]<<24)
|(buffer[i+1]<<16)
|(buffer[i+2]<<8)
|(buffer[i+3]);
memcpy(&(buffer[i]), &tmp, 4);
}
}
uint8_t WaitMs(
VL53L8CX_Platform *p_platform,
uint32_t TimeMs)
{
sleep_ms(TimeMs);
return 0;
}

Wyświetl plik

@ -0,0 +1,220 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L8CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L8CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef _PLATFORM_H_
#define _PLATFORM_H_
#pragma once
#include <stdint.h>
#include <string.h>
#include "hardware/i2c.h"
/**
* @brief Structure VL53L8CX_Platform needs to be filled by the customer,
* depending on his platform. At least, it contains the VL53L8CX I2C address.
* Some additional fields can be added, as descriptors, or platform
* dependencies. Anything added into this structure is visible into the platform
* layer.
*/
typedef struct
{
/* To be filled with customer's platform. At least an I2C address/descriptor
* needs to be added */
/* Example for most standard platform : I2C address of sensor */
uint16_t address;
i2c_inst_t *i2c;
uint8_t *firmware;
} VL53L8CX_Platform;
/*
* @brief The macro below is used to define the number of target per zone sent
* through I2C. This value can be changed by user, in order to tune I2C
* transaction, and also the total memory size (a lower number of target per
* zone means a lower RAM). The value must be between 1 and 4.
*/
#define VL53L8CX_NB_TARGET_PER_ZONE 1U
/*
* @brief The macro below can be used to avoid data conversion into the driver.
* By default there is a conversion between firmware and user data. Using this macro
* allows to use the firmware format instead of user format. The firmware format allows
* an increased precision.
*/
// #define VL53L8CX_USE_RAW_FORMAT
/*
* @brief All macro below are used to configure the sensor output. User can
* define some macros if he wants to disable selected output, in order to reduce
* I2C access.
*/
// #define VL53L8CX_DISABLE_AMBIENT_PER_SPAD
// #define VL53L8CX_DISABLE_NB_SPADS_ENABLED
// #define VL53L8CX_DISABLE_NB_TARGET_DETECTED
// #define VL53L8CX_DISABLE_SIGNAL_PER_SPAD
// #define VL53L8CX_DISABLE_RANGE_SIGMA_MM
// #define VL53L8CX_DISABLE_DISTANCE_MM
// #define VL53L8CX_DISABLE_REFLECTANCE_PERCENT
// #define VL53L8CX_DISABLE_TARGET_STATUS
// #define VL53L8CX_DISABLE_MOTION_INDICATOR
/**
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @param (uint16_t) Address : I2C location of value to read.
* @param (uint8_t) *p_values : Pointer of value to read.
* @return (uint8_t) status : 0 if OK
*/
uint8_t RdByte(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_value);
/**
* @brief Mandatory function used to write one single byte.
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @param (uint16_t) Address : I2C location of value to read.
* @param (uint8_t) value : Pointer of value to write.
* @return (uint8_t) status : 0 if OK
*/
uint8_t WrByte(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t value);
/**
* @brief Mandatory function used to read multiples bytes.
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @param (uint16_t) Address : I2C location of values to read.
* @param (uint8_t) *p_values : Buffer of bytes to read.
* @param (uint32_t) size : Size of *p_values buffer.
* @return (uint8_t) status : 0 if OK
*/
uint8_t RdMulti(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size);
/**
* @brief Mandatory function used to write multiples bytes.
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @param (uint16_t) Address : I2C location of values to write.
* @param (uint8_t) *p_values : Buffer of bytes to write.
* @param (uint32_t) size : Size of *p_values buffer.
* @return (uint8_t) status : 0 if OK
*/
uint8_t WrMulti(
VL53L8CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size);
/**
* @brief Optional function, only used to perform an hardware reset of the
* sensor. This function is not used in the API, but it can be used by the host.
* This function is not mandatory to fill if user don't want to reset the
* sensor.
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @return (uint8_t) status : 0 if OK
*/
uint8_t Reset_Sensor(
VL53L8CX_Platform *p_platform);
/**
* @brief Mandatory function, used to swap a buffer. The buffer size is always a
* multiple of 4 (4, 8, 12, 16, ...).
* @param (uint8_t*) buffer : Buffer to swap, generally uint32_t
* @param (uint16_t) size : Buffer size to swap
*/
void SwapBuffer(
uint8_t *buffer,
uint16_t size);
/**
* @brief Mandatory function, used to wait during an amount of time. It must be
* filled as it's used into the API.
* @param (VL53L8CX_Platform*) p_platform : Pointer of VL53L8CX platform
* structure.
* @param (uint32_t) TimeMs : Time to wait in ms.
* @return (uint8_t) status : 0 if wait is finished.
*/
uint8_t WaitMs(
VL53L8CX_Platform *p_platform,
uint32_t TimeMs);
#endif // _PLATFORM_H_

@ -0,0 +1 @@
Subproject commit dd336946de28bcf76ff363564722759f3a36f34c

Wyświetl plik

@ -0,0 +1,16 @@
add_library(vl53l8cx INTERFACE)
target_sources(vl53l8cx INTERFACE
${CMAKE_CURRENT_LIST_DIR}/vl53l8cx.cpp
${CMAKE_CURRENT_LIST_DIR}/platform.c
${CMAKE_CURRENT_LIST_DIR}/src/VL53L8CX_ULD_API/src/vl53l8cx_api.c
${CMAKE_CURRENT_LIST_DIR}/src/VL53L8CX_ULD_API/src/vl53l8cx_plugin_detection_thresholds.c
)
target_include_directories(vl53l8cx INTERFACE
${CMAKE_CURRENT_LIST_DIR}
${CMAKE_CURRENT_LIST_DIR}/src/VL53L8CX_ULD_API/inc
)
# Pull in pico libraries that we need
target_link_libraries(vl53l8cx INTERFACE pico_stdlib hardware_i2c)

Wyświetl plik

@ -0,0 +1,85 @@
#include "vl53l8cx.hpp"
namespace pimoroni {
bool VL53L8CX::init() {
if(!is_alive()) {
return false;
}
uint8_t status = vl53l8cx_init(configuration);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::is_alive() {
uint8_t is_alive = 0;
uint8_t status = vl53l8cx_is_alive(configuration, &is_alive);
return is_alive == 1 && status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::start_ranging() {
uint8_t status = vl53l8cx_start_ranging(configuration);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::stop_ranging() {
uint8_t status = vl53l8cx_stop_ranging(configuration);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::enable_motion_indicator(Resolution resolution) {
uint8_t status = vl53l8cx_motion_indicator_init(configuration, motion_configuration, resolution);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_motion_distance(uint16_t distance_min, uint16_t distance_max) {
uint8_t status = vl53l8cx_motion_indicator_set_distance_motion(configuration, motion_configuration, distance_min, distance_max);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_i2c_address(uint8_t i2c_address) {
/* Must be a 7-bit i2c address */
uint8_t status = vl53l8cx_set_i2c_address(configuration, i2c_address);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_ranging_mode(RangingMode ranging_mode) {
uint8_t status = vl53l8cx_set_ranging_mode(configuration, (uint8_t)ranging_mode);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_ranging_frequency_hz(uint8_t ranging_frequency_hz) {
uint8_t status = vl53l8cx_set_ranging_frequency_hz(configuration, ranging_frequency_hz);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_resolution(Resolution resolution) {
/* One of VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8 */
uint8_t status = vl53l8cx_set_resolution(configuration, (uint8_t)resolution);
if(status == VL53L8CX_STATUS_OK) {
this->resolution = resolution;
}
return status == VL53L8CX_STATUS_OK;
}
VL53L8CX::Resolution VL53L8CX::get_resolution() {
//Resolution resolution = RESOLUTION_4X4;
//vl53l8cx_get_resolution(configuration, (uint8_t *)&resolution);
return this->resolution;
}
bool VL53L8CX::set_integration_time_ms(uint32_t integration_time_ms) {
/* Integration time between 2ms and 1000ms */
uint8_t status = vl53l8cx_set_integration_time_ms(configuration, integration_time_ms);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_sharpener_percent(uint8_t sharpener_percent) {
/* Sharpener intensity from 0 to 99 */
uint8_t status = vl53l8cx_set_sharpener_percent(configuration, sharpener_percent);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_target_order(TargetOrder target_order) {
uint8_t status = vl53l8cx_set_target_order(configuration, (uint8_t)target_order);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::set_power_mode(PowerMode power_mode) {
uint8_t status = vl53l8cx_set_power_mode(configuration, (uint8_t)power_mode);
return status == VL53L8CX_STATUS_OK;
}
bool VL53L8CX::data_ready() {
uint8_t is_ready;
uint8_t status = vl53l8cx_check_data_ready(configuration, &is_ready);
return status == VL53L8CX_STATUS_OK && is_ready;
}
bool VL53L8CX::get_data(ResultsData *results) {
uint8_t status = vl53l8cx_get_ranging_data(configuration, results);
return status == VL53L8CX_STATUS_OK;
}
}

Wyświetl plik

@ -0,0 +1,84 @@
#pragma once
extern "C" {
#include "drivers/vl53l8cx/src/VL53L8CX_ULD_API/inc/vl53l8cx_api.h"
#include "drivers/vl53l8cx/src/VL53L8CX_ULD_API/inc/vl53l8cx_plugin_motion_indicator.h"
}
#include <new>
#include "common/pimoroni_i2c.hpp"
#include "src/VL53L8CX_ULD_API/inc/vl53l8cx_api.h"
#include "src/VL53L8CX_ULD_API/inc/vl53l8cx_plugin_motion_indicator.h"
namespace pimoroni {
class VL53L8CX {
public:
typedef VL53L8CX_ResultsData ResultsData;
enum TargetOrder : uint8_t {
TARGET_ORDER_CLOSEST = VL53L8CX_TARGET_ORDER_CLOSEST,
TARGET_ORDER_STRONGEST = VL53L8CX_TARGET_ORDER_STRONGEST
};
enum Resolution : uint8_t {
RESOLUTION_4X4 = VL53L8CX_RESOLUTION_4X4,
RESOLUTION_8X8 = VL53L8CX_RESOLUTION_8X8
};
enum RangingMode : uint8_t {
RANGING_MODE_CONTINUOUS = VL53L8CX_RANGING_MODE_CONTINUOUS,
RANGING_MODE_AUTONOMOUS = VL53L8CX_RANGING_MODE_AUTONOMOUS
};
enum PowerMode : uint8_t {
POWER_MODE_SLEEP = VL53L8CX_POWER_MODE_SLEEP,
POWER_MODE_WAKEUP = VL53L8CX_POWER_MODE_WAKEUP
};
// 7-bit version of the default address (0x52)
static const uint8_t DEFAULT_ADDRESS = VL53L8CX_DEFAULT_I2C_ADDRESS >> 1;
VL53L8CX(I2C *i2c, uint8_t *firmware, uint8_t i2c_addr=DEFAULT_ADDRESS, void* configuration_buffer=nullptr, void* motion_configuration_buffer=nullptr) {
if(!configuration_buffer) configuration_buffer = new VL53L8CX_Configuration;
if(!motion_configuration_buffer) motion_configuration_buffer = new VL53L8CX_Motion_Configuration;
configuration = new(configuration_buffer) VL53L8CX_Configuration{
.platform = VL53L8CX_Platform{
.address = i2c_addr,
.i2c = i2c->get_i2c(),
.firmware = firmware
},
};
motion_configuration = new(motion_configuration_buffer) VL53L8CX_Motion_Configuration{};
}
~VL53L8CX() {
delete configuration;
delete motion_configuration;
}
bool init();
bool is_alive();
bool start_ranging();
bool stop_ranging();
bool enable_motion_indicator(Resolution resolution);
bool set_motion_distance(uint16_t distance_min, uint16_t distance_max);
bool set_i2c_address(uint8_t i2c_address);
bool set_ranging_mode(RangingMode ranging_mode);
bool set_ranging_frequency_hz(uint8_t ranging_frequency_hz);
bool set_resolution(Resolution resolution);
Resolution get_resolution();
bool set_integration_time_ms(uint32_t integration_time_ms);
bool set_sharpener_percent(uint8_t sharpener_percent);
bool set_target_order(TargetOrder target_order);
bool set_power_mode(PowerMode power_mode);
bool data_ready();
bool get_data(ResultsData *results);
VL53L8CX_Configuration* get_configuration() {
return configuration;
}
private:
VL53L8CX_Configuration *configuration;
VL53L8CX_Motion_Configuration *motion_configuration;
Resolution resolution = RESOLUTION_8X8;
};
}

Wyświetl plik

@ -23,6 +23,7 @@ add_subdirectory(breakout_bh1745)
add_subdirectory(breakout_icp10125)
add_subdirectory(breakout_scd41)
add_subdirectory(breakout_vl53l5cx)
add_subdirectory(breakout_vl53l8cx)
add_subdirectory(breakout_pms5003)
add_subdirectory(breakout_oled_128x128)
add_subdirectory(breakout_mlx90640)

Wyświetl plik

@ -0,0 +1,12 @@
set(OUTPUT_NAME vl53l8cx_demo)
add_executable(
${OUTPUT_NAME}
vl53l8cx_demo.cpp
)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib hardware_i2c vl53l8cx pimoroni_i2c)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

Wyświetl plik

@ -0,0 +1,36 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "vl53l8cx.hpp"
#include "src/vl53l8cx_firmware.h"
#include "common/pimoroni_i2c.hpp"
using namespace pimoroni;
I2C i2c(4, 5);
VL53L8CX vl53l8cx(&i2c, (uint8_t *)&vl53l8cx_firmware_bin);
int main() {
stdio_init_all();
bool result = vl53l8cx.init();
if(!result) {
printf("Error initializing...\n");
}
vl53l8cx.set_ranging_mode(VL53L8CX::RANGING_MODE_AUTONOMOUS);
vl53l8cx.set_resolution(VL53L8CX::RESOLUTION_4X4);
vl53l8cx.start_ranging();
while(true) {
if(vl53l8cx.data_ready()) {
VL53L8CX::ResultsData result;
if(vl53l8cx.get_data(&result)) {
printf("Distance: %dmm\n", result.distance_mm[0]);
}
}
sleep_ms(20);
}
return 0;
}