upm/src/tcs37727/tcs37727.hpp
Norbert Wesp e83b8ef114 tcs37727: Added upm support for color sensor TCS37727
TCS37727 is a Color Light-To-Digital Converter.
I also added the manufacturer 'ams' of TCS37727.

Signed-off-by: Norbert Wesp <nwesp@phytec.de>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
2017-03-16 17:23:16 -07:00

290 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Author: Norbert Wesp <nwesp@phytec.de>
* Copyright (c) 2017 Phytec Messtechnik GmbH.
*
* based on: RIOT-driver tcs37727 by Johann Fischer <j.fischer@phytec.de>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include <mraa/i2c.hpp>
#include <stdint.h>
#include <stdbool.h>
#define TCS37727_NAME "TCS37727"
#define TCS37727_I2C_ADDRESS 0x29
#define TCS37727_DEVICE_ID 0x49
#define TCS37727_DEVICE_ID_REG 0x92
#define TCS37727_ATIME_DEFAULT 200000 /* Default RGBC integration time */
#define TCS37727_AG_THRESHOLD_LOW 200
#define TCS37727_AG_THRESHOLD_HIGH (65535 - TCS37727_AG_THRESHOLD_LOW)
/* TCS37727 Register Map */
#define TCS37727_ENABLE 0x80 /* Enables states and interrupts */
#define TCS37727_ATIME 0x81 /* RGBC time */
#define TCS37727_PTIME 0x82 /* Proximity time */
#define TCS37727_WTIME 0x83 /* Wait time */
#define TCS37727_AILTL 0x04 /* Clear interrupt low threshold low byte */
#define TCS37727_AILTH 0x05 /* Clear interrupt low threshold high byte */
#define TCS37727_AIHTL 0x06 /* Clear interrupt high threshold low byte */
#define TCS37727_AIHTH 0x07 /* Clear interrupt high threshold high byte */
#define TCS37727_PILTL 0x08 /* Proximity inter. low threshold low byte */
#define TCS37727_PILTH 0x09 /* Proximity inter. low threshold high byte */
#define TCS37727_PIHTL 0x0A /* Proximity inter. high threshold low byte */
#define TCS37727_PIHTH 0x0B /* Proximity inter. high threshold high byte */
#define TCS37727_PERS 0x8C /* Interrupt persistence filters */
#define TCS37727_CONFIG 0x8D /* Configuration */
#define TCS37727_PPULSE 0x8E /* Proximity pulse count */
#define TCS37727_CONTROL 0x8F /* Gain control register */
#define TCS37727_STATUS 0x93 /* Device status */
#define TCS37727_CDATA 0x14 /* Clear ADC data low byte */
#define TCS37727_CDATAH 0x15 /* Clear ADC data high byte */
#define TCS37727_RDATA 0x16 /* Red ADC data low byte */
#define TCS37727_RDATAH 0x17 /* Red ADC data high byte */
#define TCS37727_GDATA 0x18 /* Green ADC data low byte */
#define TCS37727_GDATAH 0x19 /* Green ADC data high byte */
#define TCS37727_BDATA 0x1A /* Blue ADC data low byte */
#define TCS37727_BDATAH 0x1B /* Blue ADC data high byte */
#define TCS37727_PDATA 0x1C /* Proximity ADC data low byte */
#define TCS37727_PDATAH 0x1D /* Proximity ADC data high byte */
/* TCS37727 Command Register */
#define TCS37727_BYTE_TRANS 0x80 /* Repeated byte protocol transaction */
#define TCS37727_INC_TRANS 0xA0 /* Auto-increment protocol transaction */
#define TCS37727_SF_PICLR 0xE5 /* Proximity interrupt clear */
#define TCS37727_SF_CICLR 0xE6 /* Clear channel interrupt clear */
#define TCS37727_SF_PCICLR 0xE7 /* Proximity & Clear channel inter. clear */
/* TCS37727 Enable Register */
#define TCS37727_ENABLE_PIEN (1 << 5) /* Proximity interrupt enable */
#define TCS37727_ENABLE_AIEN (1 << 4) /* Clear channel interrupt enable */
#define TCS37727_ENABLE_WEN (1 << 3) /* Wait enable */
#define TCS37727_ENABLE_PEN (1 << 2) /* Proximity enable */
#define TCS37727_ENABLE_AEN (1 << 1) /* RGBC enable, actives 2-channel ADC */
#define TCS37727_ENABLE_PON (1 << 0) /* Power ON */
/* TCS37727 Control Register */
#define TCS37727_CONTROL_PDRIVE_100 0x00 /* 100 mA LED Drive Strength */
#define TCS37727_CONTROL_PDRIVE_50 0x04 /* 50 mA LED Drive Strength */
#define TCS37727_CONTROL_PDRIVE_25 0x08 /* 25 mA LED Drive Strength */
#define TCS37727_CONTROL_PDRIVE_12 0x0C /* 12.5 mA LED Drive Strength */
#define TCS37727_CONTROL_PDRIVE_MASK 0x0C /* PDRIVE Mask */
#define TCS37727_CONTROL_AGAIN_1 0x00 /* 1 × gain RGBC Gain Value */
#define TCS37727_CONTROL_AGAIN_4 0x01 /* 4 × gain RGBC Gain Value */
#define TCS37727_CONTROL_AGAIN_16 0x02 /* 16 × gain RGBC Gain Value */
#define TCS37727_CONTROL_AGAIN_60 0x03 /* 60 × gain RGBC Gain Value */
#define TCS37727_CONTROL_AGAIN_MASK 0x03 /* AGAIN Mask */
/* TCS37727 ATIME register values */
#define TCS37727_ATIME_MIN 2400 /* 2.4ms integr. time, max count 1024 */
#define TCS37727_ATIME_MAX 614000 /* 614ms integr. time, max count 0xffff */
#define TCS37727_ATIME_TO_REG(val) (256 - (uint8_t)((val) / 2400))
#define TCS37727_ATIME_TO_US(reg) ((256 - (uint8_t)(reg)) * 2400)
/* Coefficients for Lux and CT Equations (DN40) */
/* Coefficients in integer format, multiplied by 1000 */
#define DGF_IF 310
#define R_COEF_IF 136
#define G_COEF_IF 1000
#define B_COEF_IF -444
#define CT_COEF_IF 3810
#define CT_OFFSET_IF 1391
namespace upm {
typedef struct {
uint32_t red; /**< IR compensated channels red */
uint32_t green; /**< IR compensated channels green */
uint32_t blue; /**< IR compensated channels blue */
uint32_t clear; /**< channels clear */
uint32_t lux; /**< Lux */
uint32_t ct; /**< Color temperature */
} tcs37727_data_t;
/**
* @brief TCS37727 Color Light-To-Digital Converter
* @defgroup tcs37727 libupm-tcs37727
* @ingroup ams i2c color
*/
/**
* @library tcs37727
* @sensor tcs37727
* @comname TCS37727 Color Light-To-Digital Converter
* @type color
* @man ams
* @web http://ams.com/eng/Products/Light-Sensors
* @con i2c
*
* @brief API for the TCS37727 Color Light-To-Digital Converter
*
* Description in web-link above:
* The TCS3772 device family provides red, green, blue, and clear (RGBC) light
* sensing and, when coupled with an external IR LED, proximity detection.
* These devices detect light intensity under a variety of lighting conditions
* and through a variety of attenuation materials, including dark glass. The
* proximity detection feature allows a large dynamic range of operation for
* accurate short distance detection, such as in a cell phone, for detecting
* when the user positions the phone close to their ear. An internal state
* machine provides the ability to put the device into a low power state in
* between proximity and RGBC measurements providing very low average power
* consumption.
*
* @snippet tcs37727.cxx Interesting
*/
class TCS37727 {
public:
/**
*
* Instantiates an TCS37727 object
* Settings: Gain 4x, Proximity Detection off
*
* @param bus Number of the used bus
* @param atime_us RGBC integration time
* @param devAddr Address of the used I2C device
*/
TCS37727 (int bus, int atime_us=TCS37727_ATIME_DEFAULT,
int devAddr=TCS37727_I2C_ADDRESS);
/**
* Check device_id of sensor
*
* @return 0 on success
* -1 on error
*/
int checkID(void);
/**
* Set active mode, this enables periodic RGBC measurements
*
* @return 0 on success
* -1 on error
*/
int setActive(void);
/**
* Set standby mode, this disables periodic RGBC measurements
* Also turns off the sensor when proximity measurement is disabled
*
* @return 0 on success
* -1 on error
*/
int setStandby(void);
/**
*
*/
uint8_t trimGain(int rawc);
/**
* Read out data of regs and call further function
* Also saves converted values to variables
*
* @return 0 on success
* -1 on error
*/
int sampleData(void);
/**
* Get the calculated channel red color
*
* @param bSampleData Flag to read sensor
* @return The channel red color on success
* 999 on error
*/
uint32_t getChannelRed(int bSampleData = 0);
/**
* Get the calculated channel green color
*
* @param bSampleData Flag to read sensor
* @return The channel green color on success
* 999 on error
*/
uint32_t getChannelGreen(int bSampleData = 0);
/**
* Get the calculated channel blue color
*
* @param bSampleData Flag to read sensor
* @return The channel blue color on success
* 999 on error
*/
uint32_t getChannelBlue(int bSampleData = 0);
/**
* Get the calculated channel clear color
*
* @param bSampleData Flag to read sensor
* @return The channel clear color on success
* 999 on error
*/
uint32_t getChannelClear(int bSampleData = 0);
/**
* Get the calculated lux value
*
* @param bSampleData Flag to read sensor
* @return The lux value on success
* 999 on error
*/
uint32_t getLux(int bSampleData = 0);
/**
* Get the calculated color temperature
*
* @param bSampleData Flag to read sensor
* @return The color temperature on success
* 999 on error
*/
uint32_t getColorTemperature(int bSampleData = 0);
/**
* Get calculated sensor values
*
* @param data Calculated sensor values
* @param bSampleData Flag to read sensor
* @return 0 on success
* -1 on error
*/
int getData(tcs37727_data_t* data, int bSampleData = 0);
private:
std::string m_name;
int m_controlAddr;
int m_bus;
mraa::I2c m_i2ControlCtx;
int s_atime_us; /* atime value conveted to microseconds */
int s_again; /* amount of gain */
tcs37727_data_t s_data[1];
};
}