kopia lustrzana https://github.com/pimoroni/pimoroni-pico
VL52L8CX: C++ bindings for manufacturer driver.
rodzic
bf99ae4863
commit
2274a09cd1
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
include(${CMAKE_CURRENT_LIST_DIR}/vl53l8cx.cmake)
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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)
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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})
|
|
@ -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;
|
||||
}
|
Ładowanie…
Reference in New Issue