Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
als_driver.cpp
- Committer:
- vijaynvr
- Date:
- 2015-02-08
- Revision:
- 0:bc9f26b5dadf
File content as of revision 0:bc9f26b5dadf:
/*******************************************************************************
################################################################################
# (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
################################################################################
********************************************************************************/
/*
'''
Application-level methods used by VL6180X for ALS operations.
'''
*/
//# ST libraries
#include "als_driver.h"
#include "debug.h"
#include "platform.h"
#include "utilities.h"
//-----------------------------------------------------------------------------
// global variable declarations
//-----------------------------------------------------------------------------
static uint16_t _integration_period = DEFAULT_INTEGRATION_PERIOD;
static float_t _lux_resolution = DEFAULT_LUX_RESOLUTION;
static uint32_t _als_scaler = DEFAULT_ALS_SCALER;
static uint32_t _als_real_gain_val = DEFAULT_ALS_GAIN;
//-----------------------------------------------------------------------------
// method definitions
//-----------------------------------------------------------------------------
sensor_error als_set_dynamic_config(uint8_t device_base_address)
{
/*
'''
Device setup for ALS parameters. These settings can be applied at any time. The status of operation bit (bit 0) of the SYSALS_START is not important.
:rtype: none
'''
*/
LOG_FUNCTION_START((void*)&device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
sensor_error als_set_systemMode(uint8_t device_base_address, uint8_t mode)
{
uint8_t startRegVal;
sensor_error ret = SENSOR_ERROR_NONE;
LOG_FUNCTION_START((void*)&device_base_address, (void*)&mode);
switch (mode)
{
case ALS_START_SINGLESHOT:
i2c_write_byte(SYSALS_START, mode, device_base_address);
// i2c_write_byte(SYSALS_START, (uint8_t)ALS_START_SINGLESHOT, I2C_ADDR);
break;
case ALS_START_CONTINUOUS:
// ensure mode bit is set!
startRegVal = i2c_read_byte(SYSALS_START, device_base_address);
startRegVal |= 0x03;
i2c_write_byte(SYSALS_START, startRegVal, device_base_address);
break;
case ALS_STOP:
// ensure mode bit is left unaffected!
startRegVal = i2c_read_byte(SYSALS_START, device_base_address);
startRegVal |= 0x01;
// set the bit, as it is a toggle state, not a 0=Off, 1=ON!
i2c_write_byte(SYSALS_START, startRegVal, device_base_address);
break;
default:
ret = COMMON_INVALID_PARAMS;
}
LOG_FUNCTION_END(ret);
return ret;
}
uint8_t als_get_systemMode(uint8_t device_base_address)
{
uint8_t ret=0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_byte(SYSALS_START, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
uint16_t als_get_result(uint8_t device_base_address)
{
uint16_t ret=0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_word(RESULT_ALS_VAL, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
uint16_t als_get_lux(uint8_t device_base_address)
{
//uint16_t ret=0;
float rawValue = 0.0f;
float integrationTimeRatio = DEFAULT_INTEGRATION_PERIOD/_integration_period;
uint32_t luxValue = 0;
LOG_FUNCTION_START((void*)&device_base_address);
rawValue = (float_t)als_get_result(device_base_address);
luxValue = roundFloatToInt(rawValue * integrationTimeRatio * _lux_resolution);
luxValue /= float(_als_scaler * _als_real_gain_val);
LOG_FUNCTION_END((uint16_t)luxValue);
return luxValue;
}
sensor_error als_set_thresholds(uint8_t device_base_address, uint16_t low_threshold, uint16_t high_threshold)
{
LOG_FUNCTION_START((void*)&device_base_address,(void*)&low_threshold, (void*)&high_threshold);
i2c_write_word(SYSALS_THRESH_LOW, low_threshold, device_base_address);
i2c_write_word(SYSALS_THRESH_HIGH, high_threshold, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
sensor_error als_set_high_threshold(uint8_t device_base_address, uint16_t threshold)
{
LOG_FUNCTION_START((void*)&device_base_address,(void*)&threshold);
i2c_write_word(SYSALS_THRESH_HIGH, threshold, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint16_t als_get_high_threshold(uint8_t device_base_address)
{
uint16_t ret = 0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_word(SYSALS_THRESH_HIGH, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
sensor_error als_set_low_threshold(uint8_t device_base_address, uint16_t threshold)
{
LOG_FUNCTION_START((void*)&device_base_address,(void*)&threshold);
i2c_write_word(SYSALS_THRESH_LOW, threshold, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint16_t als_get_low_threshold(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
uint16_t ret = i2c_read_word(SYSALS_THRESH_LOW, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
sensor_error als_set_interMeasurement_period(uint8_t device_base_address, uint16_t intermeasurement_period)
{
LOG_FUNCTION_START((void*)&device_base_address, (void*)&intermeasurement_period);
//clipping: range is 0-2550ms
if (intermeasurement_period >= 255 *10)
intermeasurement_period = 255 *10;
i2c_write_byte(SYSALS_INTERMEASUREMENT_PERIOD, (uint8_t)(intermeasurement_period/10), device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint16_t als_get_interMeasurement_period(uint8_t device_base_address)
{
uint16_t ret=0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_byte(SYSALS_INTERMEASUREMENT_PERIOD, device_base_address);
ret *=10; //retun as time in ms
LOG_FUNCTION_END(ret);
return ret;
}
sensor_error als_set_analogue_gain(uint8_t device_base_address, uint8_t light_analogue_gain)
{
const uint8_t GainDark = 0x40;
uint8_t GainTotal;
LOG_FUNCTION_START((void*)&device_base_address, (void*)&light_analogue_gain);
if (light_analogue_gain > 7)
{
// ALS_SetAnalogueGainLight: Clipping value to 7
light_analogue_gain = 7;
}
GainTotal = GainDark | light_analogue_gain; // add both together
i2c_write_byte(SYSALS_ANALOGUE_GAIN, GainTotal, device_base_address);
if(light_analogue_gain == 0)
{
_als_real_gain_val = 20.0f;
}
else if(light_analogue_gain == 1)
{
_als_real_gain_val = 10.0f;
}
else if(light_analogue_gain == 2)
{
_als_real_gain_val = 5.0f;
}
else if(light_analogue_gain == 3)
{
_als_real_gain_val = 2.5f;
}
else if(light_analogue_gain == 4)
{
_als_real_gain_val = 1.67f;
}
else if(light_analogue_gain == 5)
{
_als_real_gain_val = 1.25;
}
else if(light_analogue_gain == 6)
{
_als_real_gain_val = 1.0;
}
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint8_t als_get_analogue_gain(uint8_t device_base_address)
{
int8_t ret=0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_byte(SYSALS_ANALOGUE_GAIN, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
sensor_error als_set_integration_period(uint8_t device_base_address, uint16_t integration_period)
{
int myTime;
LOG_FUNCTION_START((void*)&device_base_address, (void*)&integration_period);
myTime = integration_period - 1;
if (myTime < 0)
{
myTime = 0;
}
else if (myTime > 464)
{
// ALS_SetIntegrationPeriod: Clipping value to 465ms
myTime = 464;
}
else if (myTime == 255)
{
myTime++;
// can't write 255 since this causes the device to lock out.
}
i2c_write_word(SYSALS_INTEGRATION_PERIOD, myTime, device_base_address);
_integration_period = myTime;
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint16_t als_get_integration_period(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
uint16_t intTime = i2c_read_word(SYSALS_INTEGRATION_PERIOD, device_base_address);
intTime +=1;
_integration_period = intTime;
LOG_FUNCTION_END(intTime);
return intTime;
}
uint8_t als_get_result_status(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
uint8_t resultStatus = i2c_read_byte(RESULT_ALS_STATUS, device_base_address);
LOG_FUNCTION_END(resultStatus);
return resultStatus;
}
bool_t als_get_device_ready(uint8_t device_base_address)
{
bool_t deviceReady = FALSE;
LOG_FUNCTION_START((void*)&device_base_address);
if ((i2c_read_byte(RESULT_ALS_STATUS, device_base_address) & ALS_DEVICE_READY) == ALS_DEVICE_READY)
{
deviceReady = TRUE;
}
LOG_FUNCTION_END(deviceReady);
return deviceReady;
}
uint8_t als_get_result_error_codes(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
uint8_t errorCode = (i2c_read_byte(RESULT_ALS_STATUS, device_base_address) & 0xF0) >> 4;
LOG_FUNCTION_END(errorCode);
return errorCode;
}
sensor_error als_set_interleaved_mode(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
i2c_write_byte(INTERLEAVED_MODE_ENABLE, 1, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
sensor_error als_clear_interleaved_mode(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
i2c_write_byte(INTERLEAVED_MODE_ENABLE, 0, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint8_t als_get_interleaved_mode(uint8_t device_base_address)
{
uint8_t ret=0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = i2c_read_byte(INTERLEAVED_MODE_ENABLE, device_base_address);
LOG_FUNCTION_END(ret);
return ret;
}
///////////////////////
sensor_error als_set_system_interrupt_config_gpio(uint8_t device_base_address, uint8_t ALS_GPIO_interrupt_config)
{
uint8_t cmd, reg;
sensor_error ret = SENSOR_ERROR_NONE;
LOG_FUNCTION_START((void*)&device_base_address, (void*)&ALS_GPIO_interrupt_config);
switch (ALS_GPIO_interrupt_config)
{
case CONFIG_GPIO_INTERRUPT_DISABLED:
case CONFIG_GPIO_INTERRUPT_LEVEL_LOW:
case CONFIG_GPIO_INTERRUPT_LEVEL_HIGH:
case CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW:
case CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY:
cmd = ALS_GPIO_interrupt_config << 3; // shift command upto bits [5:3]
reg = i2c_read_byte(SYSTEM_INTERRUPT_CONFIG_GPIO, device_base_address);
reg &= 0x07; // preserve only the range part of the reg
i2c_write_byte(SYSTEM_INTERRUPT_CONFIG_GPIO, (reg | cmd), device_base_address);
_integration_period = als_get_integration_period(device_base_address);
break;
default :
ret = COMMON_INVALID_PARAMS;
break;
}
LOG_FUNCTION_END(ret);
return ret;
}
uint8_t als_get_system_interrupt_config_gpio(uint8_t device_base_address)
{
uint8_t ret = 0;
LOG_FUNCTION_START((void*)&device_base_address);
//# expose only bits [5:3], then shift down 3 places
ret = ( (i2c_read_byte(SYSTEM_INTERRUPT_CONFIG_GPIO, device_base_address) & 0x38) >> 3 );
LOG_FUNCTION_END(ret);
return ret;
}
uint8_t als_get_result_interrupt_status_gpio(uint8_t device_base_address)
{
uint8_t ret = 0;
LOG_FUNCTION_START((void*)&device_base_address);
ret = ( (i2c_read_byte(RESULT_INTERRUPT_STATUS_GPIO, device_base_address) & 0x38) >> 3 );
LOG_FUNCTION_END(ret);
return ret;
}
sensor_error als_set_system_interrupt_clear(uint8_t device_base_address)
{
LOG_FUNCTION_START((void*)&device_base_address);
i2c_write_byte(SYSTEM_INTERRUPT_CLEAR, INTERRUPT_CLEAR_ALS, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
sensor_error als_set_history_buffer_mode_enable(uint8_t device_base_address)
{
uint8_t mode;
sensor_error ret = SENSOR_ERROR_NONE;
LOG_FUNCTION_START((void*)&device_base_address);
mode = i2c_read_byte(SYSTEM_HISTORY_CTRL, device_base_address);
mode = mode | 0x03; // set bits 0 and 1 to set to ALS mode and enable
i2c_write_byte(SYSTEM_HISTORY_CTRL, mode, device_base_address);
LOG_FUNCTION_END(NULL);
return ret;
}
sensor_error als_set_scaler(uint8_t device_base_address, uint8_t scaler)
{
const uint32_t cMask = 0x0f;
LOG_FUNCTION_START((void*)&device_base_address);
_als_scaler = (uint32_t)scaler & cMask;
i2c_write_byte(FW_ALS_RESULT_SCALER, (uint8_t)_als_scaler, device_base_address);
LOG_FUNCTION_END(NULL);
return SENSOR_ERROR_NONE;
}
uint32_t als_get_scaler(uint8_t device_base_address)
{
const uint32_t cMask = 0x0f;
LOG_FUNCTION_START((void*)&device_base_address);
_als_scaler = (uint32_t)i2c_read_byte(FW_ALS_RESULT_SCALER, device_base_address) & cMask;
LOG_FUNCTION_END(_als_scaler);
return _als_scaler;
}