Librairie adaptée au laboratoire 2
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Revision 3:454541a079f4, committed 2015-09-11
- Comitter:
- gallonm
- Date:
- Fri Sep 11 14:39:00 2015 +0200
- Parent:
- 2:7684e0b4e40e
- Child:
- 4:a5abf7757947
- Commit message:
- init function, readID function
update sensors.h
Changed in this revision
--- a/Components/Interfaces/LightSensor.h Thu Sep 10 08:40:54 2015 +0000
+++ b/Components/Interfaces/LightSensor.h Fri Sep 11 14:39:00 2015 +0200
@@ -44,14 +44,14 @@
#include <GenericSensor.h>
/* Classes ------------------------------------------------------------------*/
-/** An abstract class for Humidity sensors
+/** An abstract class for ambient light sensors
*/
class LightSensor : public GenericSensor
{
public:
/**
* @brief Get current light [lux]
- * @param[out] pfData Pointer to where to store light to
+ * @param[out] piData Pointer to where to store light to
* @return 0 in case of success, an error code otherwise
*/
virtual int GetLight(int *piData) = 0;
--- a/Components/Interfaces/RangeSensor.h Thu Sep 10 08:40:54 2015 +0000
+++ b/Components/Interfaces/RangeSensor.h Fri Sep 11 14:39:00 2015 +0200
@@ -1,11 +1,11 @@
/**
******************************************************************************
- * @file HumiditySensor.h
+ * @file RangeSensor.h
* @author AST / EST
* @version V0.0.1
* @date 13-April-2015
* @brief This file contains the abstract class describing in general
- * the interfaces of an ambient light sensor (ALS)
+ * the interfaces of a range sensor
******************************************************************************
* @attention
*
@@ -37,24 +37,24 @@
*/
/* Define to prevent from recursive inclusion --------------------------------*/
-#ifndef __LIGHT_SENSOR_CLASS_H
-#define __LIGHT_SENSOR_CLASS_H
+#ifndef __RANGE_SENSOR_CLASS_H
+#define __RANGE_SENSOR_CLASS_H
/* Includes ------------------------------------------------------------------*/
#include <GenericSensor.h>
/* Classes ------------------------------------------------------------------*/
-/** An abstract class for Humidity sensors
+/** An abstract class for range sensors
*/
-class LightSensor : public GenericSensor
+class RangeSensor : public GenericSensor
{
public:
/**
- * @brief Get current light [lux]
- * @param[out] pfData Pointer to where to store light to
+ * @brief Get current range [mm]
+ * @param[out] piData Pointer to where to store range to
* @return 0 in case of success, an error code otherwise
*/
- virtual int GetLight(int *piData) = 0;
+ virtual int GetRange(int *piData) = 0;
};
-#endif /* __LIGHT_SENSOR_CLASS_H */
\ No newline at end of file
+#endif /* __RANGE_SENSOR_CLASS_H */
\ No newline at end of file
--- a/Components/VL6180X/vl6180x_class.cpp Thu Sep 10 08:40:54 2015 +0000
+++ b/Components/VL6180X/vl6180x_class.cpp Fri Sep 11 14:39:00 2015 +0200
@@ -38,280 +38,208 @@
/* Includes ------------------------------------------------------------------*/
#include "vl6180x_class.h"
-
+#define Fix7_2_KCPs(x) ((((uint32_t)(x))*1000)>>7)
-/**
- * @brief Set HTS221 Initialization
- * @param HTS221_Init the configuration setting for the HTS221
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-VL6180x_ErrCode_t VL6180X::VL6180X_Init(HUM_TEMP_InitTypeDef *HTS221_Init)
+int VL6180X::VL6180x_InitData(VL6180xDev_t dev)
{
- uint8_t tmp = 0x00;
-
- /* Configure the low level interface ---------------------------------------*/
- if(HTS221_IO_Init() != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- if(HTS221_Power_On() != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- if(HTS221_Calibration() != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Output Data Rate selection */
- tmp &= ~(HTS221_ODR_MASK);
- tmp |= HTS221_Init->OutputDataRate;
-
- if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- HTS221_IO_ITConfig();
-
- return HUM_TEMP_OK;
-}
+ int status, dmax_status ;
+ int8_t offset;
+ uint8_t FreshOutReset;
+ uint32_t CalValue;
+ uint16_t u16;
+ uint32_t XTalkCompRate_KCps;
+
+ LOG_FUNCTION_START("");
+
+ VL6180xDevDataSet(dev, EceFactorM , DEF_ECE_FACTOR_M);
+ VL6180xDevDataSet(dev, EceFactorD , DEF_ECE_FACTOR_D);
+
+#ifdef VL6180x_HAVE_UPSCALE_DATA
+ VL6180xDevDataSet(dev, UpscaleFactor , DEF_UPSCALE);
+#endif
+
+#ifdef VL6180x_HAVE_ALS_DATA
+ VL6180xDevDataSet(dev, IntegrationPeriod, DEF_INT_PEFRIOD);
+ VL6180xDevDataSet(dev, AlsGainCode, DEF_ALS_GAIN);
+ VL6180xDevDataSet(dev, AlsScaler, DEF_ALS_SCALER);
+#endif
+
+#ifdef VL6180x_HAVE_WRAP_AROUND_DATA
+ VL6180xDevDataSet(dev, WrapAroundFilterActive, (VL6180x_WRAP_AROUND_FILTER_SUPPORT >0));
+ VL6180xDevDataSet(dev, DMaxEnable, DEF_DMAX_ENABLE);
+#endif
+
+ _DMax_OneTimeInit(dev);
+ do{
+
+ /* backup offset initial value from nvm these must be done prior any over call that use offset */
+ status = VL6180x_RdByte(dev,SYSRANGE_PART_TO_PART_RANGE_OFFSET, (uint8_t*)&offset);
+ if( status ){
+ VL6180x_ErrLog("SYSRANGE_PART_TO_PART_RANGE_OFFSET rd fail");
+ break;
+ }
+ VL6180xDevDataSet(dev, Part2PartOffsetNVM, offset);
-/**
- * @brief Read ID address of HTS221
- * @param ht_id the pointer where the ID of the device is stored
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_ReadID(uint8_t *ht_id)
-{
- if(!ht_id)
- {
- return HUM_TEMP_ERROR;
- }
-
- return HTS221_IO_Read(ht_id, HTS221_WHO_AM_I_ADDR, 1);
-}
+ status=VL6180x_RdDWord( dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &CalValue);
+ if( status ){
+ VL6180x_ErrLog("Part2PartAmbNVM rd fail");
+ break;
+ }
+ if( (CalValue&0xFFFF0000) == 0 ){
+ CalValue=0x00CE03F8;
+ }
+ VL6180xDevDataSet(dev, Part2PartAmbNVM, CalValue);
+
+ status = VL6180x_RdWord(dev, SYSRANGE_CROSSTALK_COMPENSATION_RATE ,&u16);
+ if( status){
+ VL6180x_ErrLog("SYSRANGE_CROSSTALK_COMPENSATION_RATE rd fail ");
+ break;
+ }
+ XTalkCompRate_KCps = Fix7_2_KCPs(u16);
+ VL6180xDevDataSet(dev, XTalkCompRate_KCps , XTalkCompRate_KCps );
-/**
- * @brief Reboot memory content of HTS221
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_RebootCmd(void)
-{
- uint8_t tmpreg;
-
- /* Read CTRL_REG2 register */
- if(HTS221_IO_Read(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Enable or Disable the reboot memory */
- tmpreg |= HTS221_BOOT_REBOOTMEMORY;
-
- /* Write value to MEMS CTRL_REG2 regsister */
- if(HTS221_IO_Write(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- return HUM_TEMP_OK;
+ dmax_status = _DMax_InitData(dev);
+ if( dmax_status < 0 ){
+ VL6180x_ErrLog("DMax init failure");
+ break;
+ }
+
+ /* Read or wait for fresh out of reset */
+ status = VL6180x_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset);
+ if( status ) {
+ VL6180x_ErrLog("SYSTEM_FRESH_OUT_OF_RESET rd fail");
+ break;
+ }
+ if( FreshOutReset!= 1 || dmax_status )
+ status = CALIBRATION_WARNING;
+
+ }
+ while(0);
+
+ LOG_FUNCTION_END(status);
+ return status;
}
-/**
- * @brief Read HTS221 output register, and calculate the humidity
- * @param pfData the pointer to data output
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_GetHumidity(float* pfData)
+int VL6180X::VL6180XReadID(uint8_t *rl_id)
{
- int16_t H_T_out, humidity_t;
- uint8_t tempReg[2] = {0, 0};
- uint8_t tmp = 0x00;
- float H_rh;
-
- if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Output Data Rate selection */
- tmp &= (HTS221_ODR_MASK);
-
- if(tmp == 0x00)
- {
- if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Serial Interface Mode selection */
- tmp &= ~(HTS221_ONE_SHOT_MASK);
- tmp |= HTS221_ONE_SHOT_START;
-
- if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- do
- {
-
- if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- }
- while(!(tmp & 0x02));
- }
-
-
- if(HTS221_IO_Read(&tempReg[0], (HTS221_HUMIDITY_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD),
- 2) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- H_T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
-
- H_rh = ( float )(((( H_T_out - H0_T0_out ) * ( H1_rh - H0_rh )) / ( H1_T0_out - H0_T0_out )) + H0_rh );
-
- // Truncate to specific number of decimal digits
- humidity_t = (uint16_t)(H_rh * pow(10.0f, HUM_DECIMAL_DIGITS));
- *pfData = ((float)humidity_t) / pow(10.0f, HUM_DECIMAL_DIGITS);
-
- // Prevent data going below 0% and above 100% due to linear interpolation
- if ( *pfData < 0.0f ) *pfData = 0.0f;
- if ( *pfData > 100.0f ) *pfData = 100.0f;
-
- return HUM_TEMP_OK;
+ if(!rl_id)
+ {
+ return API_ERROR;
+ }
+ return VL6180X_IO_Read(rl_id, IDENTIFICATION_MODEL_ID, 1);
}
-/**
- * @brief Read HTS221 output register, and calculate the temperature
- * @param pfData the pointer to data output
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_GetTemperature(float* pfData)
+int VL6180X::VL6180X_IO_Read(uint8_t *pBuffer, uint8_t RegisterAddress, uint16 NumByteToRead)
{
- int16_t T_out, temperature_t;
- uint8_t tempReg[2] = {0, 0};
- uint8_t tmp = 0x00;
- float T_degC;
-
- if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Output Data Rate selection */
- tmp &= (HTS221_ODR_MASK);
-
- if(tmp == 0x00)
- {
- if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Serial Interface Mode selection */
- tmp &= ~(HTS221_ONE_SHOT_MASK);
- tmp |= HTS221_ONE_SHOT_START;
+ int lecture
- if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- do
+ lecture=dev_i2c.i2c_read(pBuffer, DevAddress, RegisterAddress, NumByteToRead);
+ if(lecture!=0)
{
-
- if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
+ return API_ERROR;
}
- while(!(tmp & 0x01));
- }
-
- if(HTS221_IO_Read(&tempReg[0], (HTS221_TEMP_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD),
- 2) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
-
- T_degC = ((float)(T_out - T0_out)) / (T1_out - T0_out) * (T1_degC - T0_degC) + T0_degC;
-
- temperature_t = (int16_t)(T_degC * pow(10.0f, TEMP_DECIMAL_DIGITS));
-
- *pfData = ((float)temperature_t) / pow(10.0f, TEMP_DECIMAL_DIGITS);
-
- return HUM_TEMP_OK;
+ return API_NO_ERROR;
}
-/**
- * @brief Exit the shutdown mode for HTS221
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_On(void)
-{
- uint8_t tmpReg;
-
- /* Read the register content */
- if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Set the power down bit */
- tmpReg |= HTS221_MODE_ACTIVE;
-
- /* Write register */
- if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- return HUM_TEMP_OK;
+
+
+
+
+
+static int _DMax_InitData(VL6180xDev_t dev){
+ int status, warning;
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint32_t Reg2A_KCps;
+ uint32_t RegB8;
+ uint8_t MaxConvTime;
+ uint32_t XTalkCompRate_KCps;
+ uint32_t RangeIgnoreThreshold;
+ int32_t minSignalNeeded;
+ uint8_t SysRangeCheckEn;
+ uint8_t snrLimit;
+ warning=0;
+
+ static const int ROMABLE_DATA MaxConvTimeAdjust=-4;
+
+ LOG_FUNCTION_START("");
+ do{
+ status = VL6180x_RdByte(dev, 0x02A ,&u8);
+ if( status ){
+ VL6180x_ErrLog("Reg 0x02A rd fail");
+ break;
+ }
+
+ if( u8 == 0 ) {
+ warning = CALIBRATION_WARNING;
+ u8 = 40; /* use a default average value */
+ }
+ Reg2A_KCps = Fix7_2_KCPs(u8); /* convert to KCPs */
+
+ status = VL6180x_RdByte(dev, SYSRANGE_RANGE_CHECK_ENABLES, &SysRangeCheckEn);
+ if (status) {
+ VL6180x_ErrLog("SYSRANGE_RANGE_CHECK_ENABLES rd fail ");
+ break;
+ }
+
+ status = VL6180x_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &MaxConvTime);
+ if( status){
+ VL6180x_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail ");
+ break;
+ }
+
+ status = VL6180x_RdDWord(dev, 0x0B8, &RegB8);
+ if( status ){
+ VL6180x_ErrLog("reg 0x0B8 rd fail ");
+ break;
+ }
+
+ status = VL6180x_RdByte(dev, SYSRANGE_MAX_AMBIENT_LEVEL_MULT, &snrLimit);
+ if( status){
+ VL6180x_ErrLog("SYSRANGE_MAX_AMBIENT_LEVEL_MULT rd fail ");
+ break;
+ }
+ _DMaxData(snrLimit_K) = (int32_t)16*1000/snrLimit;
+ XTalkCompRate_KCps = VL6180xDevDataGet(dev, XTalkCompRate_KCps );
+
+ if( Reg2A_KCps >= XTalkCompRate_KCps){
+ _DMaxData(retSignalAt400mm)=( Reg2A_KCps - XTalkCompRate_KCps);
+ }
+ else{
+ _DMaxData(retSignalAt400mm)=0; /* Reg2A_K - XTalkCompRate_KCp <0 is invalid */
+ }
+
+ /* if xtalk range check is off omit it in snr clipping */
+ if( SysRangeCheckEn&RANGE_CHECK_RANGE_ENABLE_MASK ){
+ status = VL6180x_RdWord(dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &u16);
+ if( status){
+ VL6180x_ErrLog("SYSRANGE_RANGE_IGNORE_THRESHOLD rd fail ");
+ break;
+ }
+ RangeIgnoreThreshold = Fix7_2_KCPs(u16);
+ }
+ else{
+ RangeIgnoreThreshold = 0;
+ }
+
+ minSignalNeeded = (RegB8*256)/((int32_t)MaxConvTime+(int32_t)MaxConvTimeAdjust); /* KCps 8+8 bit -(1 to 6 bit) => 15-10 bit */
+ /* minSignalNeeded = max ( minSignalNeeded, RangeIgnoreThreshold - XTalkCompRate_KCps) */
+ if( minSignalNeeded <= RangeIgnoreThreshold - XTalkCompRate_KCps )
+ minSignalNeeded = RangeIgnoreThreshold - XTalkCompRate_KCps;
+
+ u32 = (minSignalNeeded*(uint32_t)snrLimit)/16;
+ _DMaxData(ClipSnrLimit ) = _DMax_RawValueAtRateKCps(dev, u32 ); /* clip to dmax to min signal snr limit rate*/
+ }
+ while(0);
+ if( !status )
+ status = warning;
+ LOG_FUNCTION_END(status);
+ return status;
}
-/**
- * @brief Enter the shutdown mode for HTS221
- * @retval HUM_TEMP_OK in case of success, an error code otherwise
- */
-HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_OFF(void)
-{
- uint8_t tmpReg;
-
- /* Read the register content */
- if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- /* Reset the power down bit */
- tmpReg &= ~(HTS221_MODE_ACTIVE);
-
- /* Write register */
- if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK)
- {
- return HUM_TEMP_ERROR;
- }
-
- return HUM_TEMP_OK;
-}
+#undef Fix7_2_KCPs
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/Components/VL6180X/vl6180x_class.h Thu Sep 10 08:40:54 2015 +0000
+++ b/Components/VL6180X/vl6180x_class.h Fri Sep 11 14:39:00 2015 +0200
@@ -65,60 +65,33 @@
/*** Interface Methods ***/
virtual int Init(void *init_struct) {
- return VL6180X_Init();
- }
-
- virtual int ReadID(uint8_t *ht_id) {
- return VL6180X_ReadID(ht_id);
+ return VL6180x_InitData(VL6180xDev_t dev);
}
-
- /**
- * @brief Reset sensor
- * @return 0 in case of success, an error code otherwise
- */
- virtual int Reset(void) {
- return VL6180X_RebootCmd();
+
+ virtual int ReadID(uint8_t *rl_id) {
+ return VL6180X_ReadID(rl_id);
}
-
- virtual int GetRange(float *pfData) {
- return VL6180X_GetRange(pfData);
- }
-
- virtual int GetLight(float *pfData) {
- return VL6180X_GetLight(pfData);
+ /*
+ virtual int GetRange(int *piData) {
+ return VL6180X_GetRange(piData);
}
- protected:
- /*** Methods ***/
- RANGE_LIGHT_StatusTypeDef VL6180X_Init(RANGE_LIGHT_InitTypeDef *VL6180X_Init);
- RANGE_LIGHT_StatusTypeDef VL6180X_ReadID(uint8_t *ht_id);
- RANGE_LIGHT_StatusTypeDef VL6180X_SetID(uint8_t *ht_id);
- RANGE_LIGHT_StatusTypeDef VL6180X_RebootCmd(void);
- RANGE_LIGHT_StatusTypeDef VL6180X_GetRange(float* pfData);
- RANGE_LIGHT_StatusTypeDef VL6180X_GetLight(float* pfData);
+ virtual int GetLight(int *piData) {
+ return VL6180X_GetLight(piData);
+ }
+ */
- /**
- * @brief Configures VL6180X interrupt lines for NUCLEO boards
- */
- void VL6180X_IO_ITConfig(void)
- {
- /* To be implemented */
- }
-
- /**
- * @brief Configures VL6180X I2C interface
- * @return RANGE_LIGHT_OK in case of success, an error code otherwise
- */
- RANGE_LIGHT_StatusTypeDef VL6180X_IO_Init(void)
- {
- return RANGE_LIGHT_OK; /* done in constructor */
- }
-
+private:
+ /*** Methods ***/
+ int VL6180X_IO_Read(uint8_t *pBuffer, uint8_t RegisterAddress, uint16 NumByteToRead);
+
+
/*** Instance Variables ***/
/* IO Device */
+
DevI2C &dev_i2c;
-
+
};
