#include "vl53l0x_api.h"
#include "vl53l0x_platform.h"
#include "required_version.h"
#include <malloc.h>
#include "useLidar.h"
#include "ch.h"
#include "hal.h"
#include "shell.h"
#include "chprintf.h"
void print_pal_error(BaseSequentialStream *chp, VL53L0X_Error Status){
char buf[VL53L0X_MAX_STRING_LENGTH];
VL53L0X_GetPalErrorString(Status, buf);
chprintf(chp,"API Status: %i : %s\r\n", Status, buf);
}
void print_range_status(BaseSequentialStream *chp,VL53L0X_RangingMeasurementData_t* pRangingMeasurementData){
char buf[VL53L0X_MAX_STRING_LENGTH];
uint8_t RangeStatus;
/*
* New Range Status: data is valid when pRangingMeasurementData->RangeStatus = 0
*/
RangeStatus = pRangingMeasurementData->RangeStatus;
VL53L0X_GetRangeStatusString(RangeStatus, buf);
chprintf(chp,"Range Status: %i : %s\r\n", RangeStatus, buf);
}
VL53L0X_Error VL53L0XdeviceSetup(VL53L0X_Dev_t *pMyDevice)
{
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_RangingMeasurementData_t RangingMeasurementData;
int i;
uint32_t refSpadCount;
uint8_t isApertureSpads;
uint8_t VhvSettings;
uint8_t PhaseCal;
// Initialize Comms
pMyDevice->I2cDevAddr = 0x29; // chibi-style
pMyDevice->comms_type = 1;
pMyDevice->comms_speed_khz = 100;
// call init anyway
VL53L0X_comms_initialise(0,0);
if(Status == VL53L0X_ERROR_NONE)
{
Status = VL53L0X_StaticInit(pMyDevice); // Device Initialization
}
if(Status == VL53L0X_ERROR_NONE)
{
Status = VL53L0X_PerformRefCalibration(pMyDevice,
&VhvSettings, &PhaseCal); // Device Initialization
}
if(Status == VL53L0X_ERROR_NONE)
{
Status = VL53L0X_PerformRefSpadManagement(pMyDevice,
&refSpadCount, &isApertureSpads); // Device Initialization
}
if(Status == VL53L0X_ERROR_NONE)
{
// no need to do this when we use VL53L0X_PerformSingleRangingMeasurement
Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
}
// Enable/Disable Sigma and Signal check
/* if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetSequenceStepEnable(pMyDevice,VL53L0X_SEQUENCESTEP_DSS, 1);
}*/
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckValue(pMyDevice,
VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
(FixPoint1616_t)(0.1*65536));
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckValue(pMyDevice,
VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
(FixPoint1616_t)(60*65536));
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,
33000);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
VL53L0X_VCSEL_PERIOD_PRE_RANGE, 18);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
VL53L0X_VCSEL_PERIOD_FINAL_RANGE, 14);
}
return Status;
}
VL53L0X_Error rangingTest(BaseSequentialStream *chp,VL53L0X_Dev_t *pMyDevice)
{
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_RangingMeasurementData_t RangingMeasurementData;
int i;
uint32_t refSpadCount;
uint8_t isApertureSpads;
uint8_t VhvSettings;
uint8_t PhaseCal;
if(Status == VL53L0X_ERROR_NONE)
{
chprintf(chp,"Call of VL53L0X_StaticInit\r\n");
Status = VL53L0X_StaticInit(pMyDevice); // Device Initialization
print_pal_error(chp,Status);
}
if(Status == VL53L0X_ERROR_NONE)
{
chprintf(chp,"Call of VL53L0X_PerformRefCalibration\r\n");
Status = VL53L0X_PerformRefCalibration(pMyDevice,
&VhvSettings, &PhaseCal); // Device Initialization
print_pal_error(chp,Status);
}
if(Status == VL53L0X_ERROR_NONE)
{
chprintf(chp,"Call of VL53L0X_PerformRefSpadManagement\r\n");
Status = VL53L0X_PerformRefSpadManagement(pMyDevice,
&refSpadCount, &isApertureSpads); // Device Initialization
chprintf(chp,"refSpadCount = %d, isApertureSpads = %d\r\n", refSpadCount, isApertureSpads);
print_pal_error(chp,Status);
}
if(Status == VL53L0X_ERROR_NONE)
{
// no need to do this when we use VL53L0X_PerformSingleRangingMeasurement
chprintf(chp,"Call of VL53L0X_SetDeviceMode\r\n");
Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
print_pal_error(chp,Status);
}
// Enable/Disable Sigma and Signal check
/* if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetSequenceStepEnable(pMyDevice,VL53L0X_SEQUENCESTEP_DSS, 1);
}*/
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckValue(pMyDevice,
VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
(FixPoint1616_t)(0.1*65536));
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetLimitCheckValue(pMyDevice,
VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
(FixPoint1616_t)(60*65536));
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,
33000);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
VL53L0X_VCSEL_PERIOD_PRE_RANGE, 18);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetVcselPulsePeriod(pMyDevice,
VL53L0X_VCSEL_PERIOD_FINAL_RANGE, 14);
}
/*
* Step 4 : Test ranging mode
*/
if(Status == VL53L0X_ERROR_NONE)
{
for(i=0;i<50;i++){
chprintf(chp,"Call of VL53L0X_PerformSingleRangingMeasurement\r\n");
Status = VL53L0X_PerformSingleRangingMeasurement(pMyDevice,
&RangingMeasurementData);
print_pal_error(chp,Status);
print_range_status(chp,&RangingMeasurementData);
if (Status != VL53L0X_ERROR_NONE) break;
chprintf(chp,"Measured distance: %i\r\n\r\n", RangingMeasurementData.RangeMilliMeter);
}
}
return Status;
}
// make this into a shell command
extern void setPause(bool pause);
void shellLidar(BaseSequentialStream *chp, int argc, char *argv[])
{
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_Dev_t MyDevice;
VL53L0X_Dev_t *pMyDevice = &MyDevice;
VL53L0X_Version_t Version;
VL53L0X_Version_t *pVersion = &Version;
VL53L0X_DeviceInfo_t DeviceInfo;
int32_t status_int;
int32_t init_done = 0;
// TCHAR SerialCommStr[MAX_VALUE_NAME];
setPause(true);
chprintf(chp,"VL53L0X API Simple Ranging example\r\n\r\n");
// chprintf(chp,"Press a Key to continue!\r\n\r\n");
// getchar();
// Initialize Comms
pMyDevice->I2cDevAddr = 0x29; // chibi-style
pMyDevice->comms_type = 1;
pMyDevice->comms_speed_khz = 100;
// call init anyway
VL53L0X_comms_initialise(0,0);
/*
* Disable VL53L0X API logging if you want to run at full speed
*/
#ifdef VL53L0X_LOG_ENABLE
VL53L0X_trace_config("test.log", TRACE_MODULE_ALL, TRACE_LEVEL_ALL, TRACE_FUNCTION_ALL);
#endif
/*
* Get the version of the VL53L0X API running in the firmware
*/
if(Status == VL53L0X_ERROR_NONE)
{
status_int = VL53L0X_GetVersion(pVersion);
if (status_int != 0)
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
/*
* Verify the version of the VL53L0X API running in the firmware
*/
if(Status == VL53L0X_ERROR_NONE)
{
if( pVersion->major != VERSION_REQUIRED_MAJOR ||
pVersion->minor != VERSION_REQUIRED_MINOR ||
pVersion->build != VERSION_REQUIRED_BUILD )
{
chprintf(chp,"VL53L0X API Version Error: Your firmware has %d.%d.%d (revision %d). This example requires %d.%d.%d.\r\n",
pVersion->major, pVersion->minor, pVersion->build, pVersion->revision,
VERSION_REQUIRED_MAJOR, VERSION_REQUIRED_MINOR, VERSION_REQUIRED_BUILD);
}
}
if(Status == VL53L0X_ERROR_NONE)
{
chprintf(chp,"Call of VL53L0X_DataInit\r\n");
Status = VL53L0X_DataInit(&MyDevice); // Data initialization
print_pal_error(chp,Status);
}
if(Status == VL53L0X_ERROR_NONE)
{
Status = VL53L0X_GetDeviceInfo(&MyDevice, &DeviceInfo);
if(Status == VL53L0X_ERROR_NONE)
{
chprintf(chp,"VL53L0X_GetDeviceInfo:\r\n");
chprintf(chp,"Device Name : %s\r\n", DeviceInfo.Name);
chprintf(chp,"Device Type : %s\r\n", DeviceInfo.Type);
chprintf(chp,"Device ID : %s\r\n", DeviceInfo.ProductId);
chprintf(chp,"ProductRevisionMajor : %d\r\n", DeviceInfo.ProductRevisionMajor);
chprintf(chp,"ProductRevisionMinor : %d\r\n", DeviceInfo.ProductRevisionMinor);
if ((DeviceInfo.ProductRevisionMinor != 1) && (DeviceInfo.ProductRevisionMinor != 1)) {
chprintf(chp,"Error expected cut 1.1 but found cut %d.%d\r\n",
DeviceInfo.ProductRevisionMajor, DeviceInfo.ProductRevisionMinor);
Status = VL53L0X_ERROR_NOT_SUPPORTED;
}
}
print_pal_error(chp,Status);
}
if(Status == VL53L0X_ERROR_NONE)
{
Status = rangingTest(chp,pMyDevice);
}
print_pal_error(chp,Status);
// Implementation specific
/*
* Disconnect comms - part of VL53L0X_platform.c
*/
if(init_done == 0)
{
chprintf(chp,"Close Comms\r\n");
status_int = VL53L0X_comms_close();
if (status_int != 0)
Status = VL53L0X_ERROR_CONTROL_INTERFACE;
}
print_pal_error(chp,Status);
// chprintf(chp,"\r\nPress a Key to continue!");
// getchar();
setPause(false);
return (0);
}