INSAT Mini Project
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; - + };