INSAT Mini Project
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Components/VL6180X/vl6180x_class.cpp
- Committer:
- gallonm
- Date:
- 2015-09-11
- Revision:
- 3:454541a079f4
- Parent:
- 1:1de1ea2994d9
- Child:
- 4:a5abf7757947
File content as of revision 3:454541a079f4:
/** ****************************************************************************** * @file vl6180x_class.cpp * @author AST / EST * @version V0.0.1 * @date 14-April-2015 * @brief Implementation file for the HTS221 driver class ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> * * 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 STMicroelectronics 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. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "vl6180x_class.h" #define Fix7_2_KCPs(x) ((((uint32_t)(x))*1000)>>7) int VL6180X::VL6180x_InitData(VL6180xDev_t dev) { 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); 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 ); 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; } int VL6180X::VL6180XReadID(uint8_t *rl_id) { if(!rl_id) { return API_ERROR; } return VL6180X_IO_Read(rl_id, IDENTIFICATION_MODEL_ID, 1); } int VL6180X::VL6180X_IO_Read(uint8_t *pBuffer, uint8_t RegisterAddress, uint16 NumByteToRead) { int lecture lecture=dev_i2c.i2c_read(pBuffer, DevAddress, RegisterAddress, NumByteToRead); if(lecture!=0) { return API_ERROR; } return API_NO_ERROR; } 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; } #undef Fix7_2_KCPs /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/