Class module for ISL29011 Ambient Light Sensor
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
Diff: ISL29011.h
- Revision:
- 0:b37e4acdfa7b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ISL29011.h Mon Jul 06 19:35:14 2015 +0000 @@ -0,0 +1,251 @@ +/** + * @file ISL29011.h + * @brief Device driver - ISL29011 Ambient Light/IR Proximity Sensor + * @author Tim Barr + * @version 1.0 + * @see http://www.intersil.com/content/dam/Intersil/documents/isl2/isl29011.pdf + * + * Copyright (c) 2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef ISL29011_H +#define ISL29011_H + +#include "mbed.h" + +/** Using the Multitech MTDOT-EVB + * + * Example: + * @code + * #include "mbed.h" + * #include "ISL29011.h" + * + + * + * int main() + * { + + * } + * @endcode + */ + +/** + * @class ISL29011 + * @brief API abstraction for the ISL29011 Ambient Light/Proximity IC + * initial version will be polling only. Interrupt service and rtos support will + * be added at a later point + */ +class ISL29011 +{ +public: + + /** + * @static INT_FLG + * @brief Interrupt flag bit + */ + uint8_t static const INT_FLG = 0x04; + + /** + * @static CT_16BIT + * @brief Conversion time in usec for 16 bit setting + */ + uint32_t static const CT_16BIT = 90000; + + /** + * @static CT_12BIT + * @brief conversion time in usec for 12 bit setting + */ + uint32_t static const CT_12BIT = 5630; + + /** + * @static CT_8BIT + * @brief conversion time in usec for 8 bit setting + */ + uint32_t static const CT_8BIT = 351; + + /** + * @static CT_4BIT + * @brief conversion time in usec for 4 bit setting + */ + uint32_t static const CT_4BIT = 22; + + + /** + * @enum OP_MODE + * @brief operating mode of ILS29011 + */ + enum OPERATION_MODE + { + PWR_DOWN = 0x00, + ALS_ONCE = 0x20, + IR_ONCE = 0x04, + PROX_ONCE = 0xA0, + ALS_CONT = 0xC0, + IR_CONT = 0xE0, + PROX_CONT + }; + + /** + * @enum INT_PERSIST + * @brief Number of cycles measurement needs to be out of threshold to generate an interrupt + */ + enum INT_PERSIST + { + NUMCYCLE_1 = 0x00, + NUMCYCLE_2, NUMCYCLE_4, NUMCYCYLE_8, NUMCYCLE_16 + }; + + /** + * @enum PROX_SCHEME + * @brief Dynamic Range scheme for IR proximity + */ + enum PROX_SCHEME + { + PROX_FULL = 0x00, /* full n (4,8,12,16) bit data */ + PROX_NR = 0x80 /* n-1 (3,7,11,15) bit data */ + }; + + /** + * @enum MOD_FREQ + * @brief Modulation frequency of Proximity LED + */ + enum MOD_FREQ + { + FREQ_DC = 0x00, /* No modulation of LED */ + FREQ_360k = 0x40 /* Proximity LED modulated at 360 kHz */ + }; + + /** + * @enum LED_DRIVE + * @brief Sets the drive current of the IR Proximity LED + */ + enum LED_DRIVE + { + LED_12_5 = 0x00, /* 12.5 mA current drive */ + LED_25 = 0x10, /* 25 mA current drive */ + LED_50 = 0x20, /* 50 mA current drive */ + LED_100 = 0x30 /* 100 mA current driver */ + }; + + /** + * @enum ADC_RESOLUTION + * @brief Measurement resolution for ADC + */ + enum ADC_RESOLUTION + { + ADC_16BIT = 0x00, + ADC_12BIT = 0x04, + ADC_8BIT = 0x08, + ADC_4BIT = 0x0B + }; + + /** + * @enum LUX_RANGE + * @brief Setting for LUX Range of ADC + */ + enum LUX_RANGE + { + RNG_1000 = 0x00, /* Full scale 1,000 LUX */ + RNG_4000, /* Full scale 4,000 LUX */ + RNG_16000, /* Full scale 16,000 LUX */ + RNG_64000 /* Full scale 64,000 LUX */ + }; + + /** + * @enum REGISTER + * @brief The device register map + */ + enum REGISTER + { + COMMAND1 = 0x00, + COMMAND2, DATA_LSB, DATA_MSB, INT_LT_LSB, INT_LT_MSB, INT_HT_LSB, INT_HT_MSB + }; + + /** Create the ISL29011 object + * @param i2c - A defined I2C object + * @param InterruptIn* - pointer to a defined InterruptIn object. Default to NULL if polled + */ + ISL29011(I2C &i2c, InterruptIn* isl_int = NULL); + + /** Get the data + * @return The last valid LUX reading from the ambient light sensor + */ + uint16_t getData(void); + + /** Setup the ISL29011 measurement mode + * @op_mode - Operating moe of sensor using the OPERATION_MODE enum + * @return status of command + */ + uint8_t setMode(OPERATION_MODE op_mode) const; + + /** Set Interrupt Threshold persistence + * @int_persist - Sets the Interrupt Persistence Threshold using the INT_PERSIST enum + * @return status of command + * TODO - Still need to add interrupt support code + */ + uint8_t setPersistence(INT_PERSIST int_persist) const; + + /** Set Proximity measurement parameters + * @prox_scheme - Sets the Proximity measurement scheme using the PROX_SCHEME enum + * @mod_freq - Sets the Moduletion Frequency using the MOD_FREQ enum + * @led_drive - Sets the LED Drive current for Proximity mode using the LED_DRIVE enum + * @return status of command + * NOTE: function added for completeness. MTDOT-EVB does not have IR LED installed at this time + */ + uint8_t setProximity(PROX_SCHEME prox_scheme, MOD_FREQ mod_freq, LED_DRIVE led_drive) const; + + /** Set ADC Resolution + * @adc_resolution - Sets the ADC resolution using the ADC_RESOLUTION enum + * @return status of command + */ + uint8_t setResolution(ADC_RESOLUTION adc_resolution) const; + + /** Set the LUX Full Scale measurement range + * @lux_range - Sets the maximum measured Lux value usngthe LUX_RANGE enum + * @return status of command + */ + uint8_t setRange(LUX_RANGE lux_range ) const; + +private: + + I2C *_i2c; + InterruptIn *_isl_int; + bool _polling_mode; + uint8_t static const _i2c_addr = (0x44 << 1); + uint16_t _lux_data; + + /* Initialize the ISL29011 device + */ + uint8_t init(void); + + /* + * Write to a register (exposed for debugging reasons) + * Note: most writes are only valid in stop mode + * @param reg - The register to be written + * @param data - The data to be written + */ + uint8_t writeRegister(uint8_t const reg, uint8_t const data) const; + + /* + * Read from a register (exposed for debugging reasons) + * @param reg - The register to read from + * @return The register contents + */ + uint8_t readRegister(uint8_t const reg, char* data, uint8_t count = 1) const; + +}; + +#endif