vlx lib
Diff: vl6180x_high_level_api.cpp
- Revision:
- 0:bc9f26b5dadf
diff -r 000000000000 -r bc9f26b5dadf vl6180x_high_level_api.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vl6180x_high_level_api.cpp Sun Feb 08 14:26:51 2015 +0000 @@ -0,0 +1,208 @@ +/******************************************************************************* +################################################################################ +# (C) STMicroelectronics 2014 +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License version 2 and only version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +#------------------------------------------------------------------------------ +# Imaging Division +################################################################################ +********************************************************************************/ + + +/** + * @file high_level_api.cpp + * + * Copyright (C) 2014 ST MicroElectronics + * + * @brief High level interface definition for device, providing methods for basic + * ranging. + * + */ + +#include "vl6180x_high_level_api.h" +#include "definitions.h" +#include "common_driver.h" +#include "ranging_driver.h" +#include "als_driver.h" +#include "range_upscaling_driver.h" +#include "debug.h" +#include "utilities.h" + +static uint8_t _device_i2c_addr = 0; + +sensor_error get_vendor(uint8_t *pVendorStr) +{ + LOG_FUNCTION_START((void*)pVendorStr); + + LOG_FUNCTION_END(NULL); + return SENSOR_ERROR_NONE; +} + +sensor_error get_version(int32_t id, uint8_t *pVersionStr) +{ + LOG_FUNCTION_START((void*)&id,(void*)pVersionStr); + + LOG_FUNCTION_END(NULL); + return SENSOR_ERROR_NONE; +} + +uint32_t get_max_range() +{ + uint32_t maxRange = 0; + + maxRange = range_get_upper_limit(_device_i2c_addr); + + return maxRange; +} + +uint32_t get_min_range() +{ + return range_get_lower_limit(_device_i2c_addr);; +} + +sensor_error initialise(uint8_t device_base_address) +{ + + LOG_FUNCTION_START((void*)&device_base_address); + + _device_i2c_addr = device_base_address; + common_initialise(_device_i2c_addr); + + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error start_ranging(int32_t id) +{ + LOG_FUNCTION_START((void*)&id); + + // load settings + common_set_static_config(_device_i2c_addr); + + // ranging setup + range_set_low_threshold(_device_i2c_addr, 10); // threshold defaults are 0mm and 255mm + range_set_high_threshold(_device_i2c_addr, 200);//200mm + range_set_max_convergence_time(_device_i2c_addr, 50); // set max convergence time to 50ms; + + //set ranging in InterruptMode + common_set_gpio1_polarity(_device_i2c_addr, GPIOx_POLARITY_SELECT_OFF); + common_set_gpio1_select(_device_i2c_addr, GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT); + common_set_gpio1_mode(_device_i2c_addr, GPIOx_MODE_SELECT_RANGING); + range_set_system_interrupt_config_gpio(_device_i2c_addr, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + + //range_set_systemMode(_device_i2c_addr, RANGE_START_SINGLESHOT); + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error start_extended_ranging(int32_t id) +{ + LOG_FUNCTION_START((void*)&id); + // load settings onto + er_set_static_config(_device_i2c_addr); + + // ranging setup + // range_set_low_threshold(_device_i2c_addr, 10); // threshold defaults are 0mm and 255mm + // range_set_high_threshold(_device_i2c_addr, 200);//200mm + range_set_max_convergence_time(_device_i2c_addr, 63); // set max convergence time to 50ms; + range_set_crosstalk_compensation_rate(_device_i2c_addr, 0); + + //set ranging in InterruptMode + common_set_gpio1_polarity(_device_i2c_addr, GPIOx_POLARITY_SELECT_OFF); + common_set_gpio1_select(_device_i2c_addr, GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT); + common_set_gpio1_mode(_device_i2c_addr, GPIOx_MODE_SELECT_RANGING); + range_set_system_interrupt_config_gpio(_device_i2c_addr, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error get_range_measurement(int32_t id, sensor_RangeData *pRangeData) +{ + const int cErrorDataShift = 4; + + LOG_FUNCTION_START((void*)&id,(void*)pRangeData); + // start single range measurement + range_set_systemMode(_device_i2c_addr, RANGE_START_SINGLESHOT); + + // poll the till new sample ready + while (range_get_result_interrupt_status_gpio(_device_i2c_addr) != RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + { + timer_wait_us(100); + } + + pRangeData->range_mm = range_get_result(_device_i2c_addr); + pRangeData->signalRate_mcps = decodeFrom9_7_Format(range_get_signal_rate(_device_i2c_addr)); + pRangeData->errorStatus = (range_get_result_status(_device_i2c_addr)) >> cErrorDataShift; + + // clear the interrupt on + range_set_system_interrupt_clear(_device_i2c_addr); + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error start_als(int32_t id) +{ + LOG_FUNCTION_START((void*)&id); + common_set_static_config(_device_i2c_addr); + + als_set_integration_period(_device_i2c_addr, 100); //100ms + als_set_interMeasurement_period(_device_i2c_addr, 200); //200ms + als_set_analogue_gain(_device_i2c_addr, 0); + + als_set_low_threshold(_device_i2c_addr, 0); + als_set_high_threshold(_device_i2c_addr, 0x0FFFF); + + common_set_gpio1_polarity(_device_i2c_addr, GPIOx_POLARITY_SELECT_OFF); + common_set_gpio1_select(_device_i2c_addr, GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT); + common_set_gpio1_mode(_device_i2c_addr, GPIOx_MODE_SELECT_ALS); + als_set_system_interrupt_config_gpio(_device_i2c_addr, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY); + +// als_set_systemMode(_device_i2c_addr, ALS_START_SINGLESHOT); + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error get_als_measurement(int32_t id, sensor_AlsData *pAlsData) +{ + const int cErrorDataShift = 4; + + LOG_FUNCTION_START((void*)&id,(void*)pAlsData); + als_set_systemMode(_device_i2c_addr, ALS_START_SINGLESHOT); + + while (als_get_result_interrupt_status_gpio(_device_i2c_addr) != RES_INT_STAT_GPIO_NEW_SAMPLE_READY) + { + timer_wait_us(100); + } + pAlsData->lux = als_get_lux(_device_i2c_addr); + pAlsData->errorStatus = (als_get_result_status(_device_i2c_addr)) >> cErrorDataShift; + + als_set_system_interrupt_clear(_device_i2c_addr); + LOG_FUNCTION_END(NULL); + + return SENSOR_ERROR_NONE; +} + +sensor_error get_minimum_delay() +{ + + return SENSOR_ERROR_NONE; +} +