Time of Flight Sensor
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Dependents: Ultrasound_And_IMU
Fork of X_NUCLEO_6180XA1 by
Revision 54:17f3bb228b13, committed 2016-11-30
- Comitter:
- mapellil
- Date:
- Wed Nov 30 08:25:04 2016 +0000
- Parent:
- 53:663a22f7c44d
- Child:
- 55:a37f407230ca
- Commit message:
- Aligned GetLux and GetDistance API with ST_INTERFACES, added isSensorxxPresentAPI, other minor fix.
Changed in this revision
--- a/Components/VL6180X/vl6180x_class.cpp Tue Sep 27 12:18:09 2016 +0000
+++ b/Components/VL6180X/vl6180x_class.cpp Wed Nov 30 08:25:04 2016 +0000
@@ -979,7 +979,7 @@
return status;
}
-int VL6180X::VL6180x_RangeGetResult(VL6180xDev_t dev, int32_t *pRange_mm) {
+int VL6180X::VL6180x_RangeGetResult(VL6180xDev_t dev, uint32_t *pRange_mm) {
int status;
uint8_t RawRange;
int32_t Upscale;
@@ -2734,6 +2734,7 @@
return (r_status|l_status);
case(range_continuous_interrupt):
+ if (gpio1Int==NULL) return 1;
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2742,6 +2743,7 @@
return (r_status|l_status);
case(als_continuous_interrupt):
+ if (gpio1Int==NULL) return 1;
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2750,6 +2752,7 @@
return (r_status|l_status);
case(interleaved_mode_interrupt):
+ if (gpio1Int==NULL) return 1;
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2842,6 +2845,7 @@
return (r_status|l_status);
case(range_continuous_interrupt_low_threshold):
+ if (gpio1Int==NULL) return 1;
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2855,7 +2859,8 @@
else
return (r_status|l_status);
- case(range_continuous_interrupt_high_threshold):
+ case(range_continuous_interrupt_high_threshold):
+ if (gpio1Int==NULL) return 1;
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2870,6 +2875,7 @@
return (r_status|l_status);
case(range_continuous_interrupt_out_of_window):
+ if (gpio1Int==NULL) return 1;
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2884,6 +2890,7 @@
return (r_status|l_status);
case(als_continuous_interrupt_low_threshold):
+ if (gpio1Int==NULL) return 1;
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2898,6 +2905,7 @@
return (r_status|l_status);
case(als_continuous_interrupt_high_threshold):
+ if (gpio1Int==NULL) return 1;
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
@@ -2912,6 +2920,7 @@
return (r_status|l_status);
case(als_continuous_interrupt_out_of_window):
+ if (gpio1Int==NULL) return 1;
l_status=VL6180x_AlsConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
r_status=VL6180x_RangeConfigInterrupt(Device, CONFIG_GPIO_INTERRUPT_DISABLED);
if((!r_status)&&(!l_status))
--- a/Components/VL6180X/vl6180x_class.h Tue Sep 27 12:18:09 2016 +0000
+++ b/Components/VL6180X/vl6180x_class.h Wed Nov 30 08:25:04 2016 +0000
@@ -466,25 +466,6 @@
}
/**
- * @brief Get ranging result and only that
- *
- * @par Function Description
- * Unlike @a VL6180x_RangeGetMeasurement() this function only retrieves the range in millimeter \n
- * It does any required up-scale translation\n
- * It can be called after having started a measure and after a succes \n
- * measure is finisched either in polling mode or in interrupt mode \n
- * @warning these function is not doing wrap around filtering \n
- * This function doesn't perform any data ready check!
- *
- * @param pRange_mm Pointer to range distance
- * @return 0 on success
- */
- int GetRange(int32_t *piData)
- {
- return VL6180x_RangeGetResult(Device, piData);
- }
-
-/**
* @brief Get a single distance measure result
*
* @par Function Description
@@ -505,7 +486,7 @@
RangeWaitDeviceReady(2000);
for (status=1;
status!=0;
- status=GetRange((int32_t *)piData));
+ status=VL6180x_RangeGetResult(Device, piData));
}
StopMeasurement(range_single_shot_polling);
RangeWaitDeviceReady(2000);
@@ -1102,19 +1083,6 @@
/** @} */
/**
- * @brief Get the ALS (light in Lux) level
- *
- * @par Function Description
- * Get the ALS (light in Lux) level
- * @param *piData The pointer to variable to write in the measure in Lux
- * @return 0 On success
- */
- int GetLight(uint32_t *piData)
- {
- return VL6180x_AlsGetLux(Device, piData);
- }
-
-/**
* @brief Get a single light (in Lux) measure result
*
* @par Function Description
@@ -1132,7 +1100,7 @@
AlsWaitDeviceReady(2000);
for (status=1;
status!=0;
- status=GetLight(piData));
+ status=VL6180x_AlsGetLux(Device, piData));
}
StopMeasurement(als_single_shot_polling);
AlsWaitDeviceReady(2000);
@@ -1176,7 +1144,7 @@
int VL6180x_RangePollMeasurement(VL6180xDev_t dev, VL6180x_RangeData_t *pRangeData);
int VL6180x_RangeGetMeasurementIfReady(VL6180xDev_t dev, VL6180x_RangeData_t *pRangeData);
int VL6180x_RangeGetMeasurement(VL6180xDev_t dev, VL6180x_RangeData_t *pRangeData);
- int VL6180x_RangeGetResult(VL6180xDev_t dev, int32_t *pRange_mm);
+ int VL6180x_RangeGetResult(VL6180xDev_t dev, uint32_t *pRange_mm);
int VL6180x_RangeConfigInterrupt(VL6180xDev_t dev, uint8_t ConfigGpioInt);
int VL6180x_RangeGetInterruptStatus(VL6180xDev_t dev, uint8_t *pIntStatus);
int VL6180x_AlsPollMeasurement(VL6180xDev_t dev, VL6180x_AlsData_t *pAlsData);
--- a/Components/VL6180X/vl6180x_def.h Tue Sep 27 12:18:09 2016 +0000
+++ b/Components/VL6180X/vl6180x_def.h Wed Nov 30 08:25:04 2016 +0000
@@ -251,7 +251,7 @@
* @brief Range and any optional measurement data.
*/
typedef struct {
- int32_t range_mm; /*!< range distance in mm. */
+ uint32_t range_mm; /*!< range distance in mm. */
int32_t signalRate_mcps; /*!< signal rate (MCPS)\n these is a 9.7 fix point value, which is effectively a measure of target reflectance.*/
uint32_t errorStatus; /*!< Error status of the current measurement. \n
see @a ::RangeError_u @a VL6180x_GetRangeStatusErrString() */
--- a/ST_INTERFACES.lib Tue Sep 27 12:18:09 2016 +0000 +++ b/ST_INTERFACES.lib Wed Nov 30 08:25:04 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/teams/ST/code/ST_INTERFACES/#a7810e7acf8d +https://developer.mbed.org/teams/ST/code/ST_INTERFACES/#e2bf4d06a8fc
--- a/X_NUCLEO_COMMON.lib Tue Sep 27 12:18:09 2016 +0000 +++ b/X_NUCLEO_COMMON.lib Wed Nov 30 08:25:04 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#216930edb6b7 +https://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#12be3dfc15fd
--- a/x_nucleo_6180xa1.cpp Tue Sep 27 12:18:09 2016 +0000
+++ b/x_nucleo_6180xa1.cpp Wed Nov 30 08:25:04 2016 +0000
@@ -68,15 +68,21 @@
{
int status, n_dev=0; uint8_t sensor_address;
- sensor_top->VL6180x_Off();
- sensor_bottom->VL6180x_Off();
- sensor_left->VL6180x_Off();
- sensor_right->VL6180x_Off();
+ if (sensor_top) sensor_top->VL6180x_Off();
+ if (sensor_bottom) sensor_bottom->VL6180x_Off();
+ if (sensor_left) sensor_left->VL6180x_Off();
+ if (sensor_right) sensor_right->VL6180x_Off();
sensor_address = NEW_SENSOR_TOP_ADDRESS;
status=sensor_top->Init(&sensor_address);
if(status)
{
- printf("Sensor top not present\n\r");
+ printf("Error: Mandatory top sensor fail, Init failed!\n\r");
+ if (sensor_top !=NULL) { delete sensor_top; sensor_top=NULL; }
+ if (sensor_left !=NULL) {delete sensor_left; sensor_left=NULL; }
+ if (sensor_bottom !=NULL){ delete sensor_bottom; sensor_bottom=NULL; }
+ if (sensor_right !=NULL) { delete sensor_right; sensor_right=NULL; }
+ n_dev=0;
+ return 1;
}
else
{
@@ -84,10 +90,12 @@
n_dev++;
}
sensor_address = NEW_SENSOR_BOTTOM_ADDRESS;
- status=sensor_bottom->Init(&sensor_address);
+ status=1;
+ if (sensor_bottom) status=sensor_bottom->Init(&sensor_address);
if(status)
{
printf("Sensor bottom not present\n\r");
+ if (sensor_bottom !=NULL) { delete sensor_bottom; sensor_bottom=NULL; }
}
else
{
@@ -95,10 +103,12 @@
n_dev++;
}
sensor_address = NEW_SENSOR_LEFT_ADDRESS;
- status=sensor_left->Init(&sensor_address);
+ status=1;
+ if (sensor_left) status=sensor_left->Init(&sensor_address);
if(status)
{
printf("Sensor left not present\n\r");
+ if (sensor_left !=NULL) {delete sensor_left; sensor_left=NULL; }
}
else
{
@@ -106,10 +116,12 @@
n_dev++;
}
sensor_address = NEW_SENSOR_RIGHT_ADDRESS;
- status=sensor_right->Init(&sensor_address);
+ status=1;
+ if (sensor_right) status=sensor_right->Init(&sensor_address);
if(status)
{
printf("Sensor right not present\n\r");
+ if (sensor_right !=NULL) { delete sensor_right; sensor_right=NULL; }
}
else
{
--- a/x_nucleo_6180xa1.h Tue Sep 27 12:18:09 2016 +0000
+++ b/x_nucleo_6180xa1.h Wed Nov 30 08:25:04 2016 +0000
@@ -63,6 +63,9 @@
{
protected:
/** Constructor 1
+ * @brief x_nucleo_6180xa1 board Constructor. Default the INT gpio \
+ * configuration as the electrical schematic. Self sensing for optional \
+ * expansion sensors (L/B/R).
* @param[in] &i2c device I2C to be used for communication
*/
X_NUCLEO_6180XA1(DevI2C *ext_i2c) : dev_i2c(ext_i2c)
@@ -83,6 +86,10 @@
gpio0_right=new STMPE1600DigiOut(*dev_i2c, GPIO_15);
sensor_right=new VL6180X(*dev_i2c, *gpio0_right, D2);
+
+ if (InitBoard()) { // init failed
+ printf ("ERROR Init X-NUCLEO-6180XA1 Board\n\r");
+ }
}
/** Constructor 2
@@ -145,7 +152,6 @@
*/
static X_NUCLEO_6180XA1 *Instance(DevI2C *ext_i2c, PinName gpio1_top, PinName gpio1_bottom,
PinName gpio1_left, PinName gpio1_right);
-
/**
* @brief Initialize the board and sensors with deft values
@@ -160,6 +166,42 @@
bool RdSwitch () {
return Switch->RdSwitch();
}
+
+ /**
+ * @brief Check the presence of sensor top. To be called after InitBoard
+ * @return true is present, false if absent
+ */
+ bool isSensorTopPresent() {
+ if (sensor_top) return true;
+ return false;
+ }
+
+ /**
+ * @brief Check the presence of sensor bottom. To be called after InitBoard
+ * @return true is present, false if absent
+ */
+ bool isSensorBottomPresent() {
+ if (sensor_bottom) return true;
+ return false;
+ }
+
+ /**
+ * @brief Check the presence of sensor left. To be called after InitBoard
+ * @return true is present, false if absent
+ */
+ bool isSensorLeftPresent() {
+ if (sensor_left) return true;
+ return false;
+ }
+
+ /**
+ * @brief Check the presence of sensor right. To be called after InitBoard
+ * @return true is present, false if absent
+ */
+ bool isSensorRightPresent() {
+ if (sensor_right) return true;
+ return false;
+ }
DevI2C *dev_i2c;
VL6180X *sensor_top;
