Class module for ISL29011 Ambient Light Sensor

Dependents:   mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more

Committer:
Evan Hosseini
Date:
Wed Jan 31 09:58:22 2018 -0600
Revision:
5:953adca17438
Parent:
0:b37e4acdfa7b
Make driver thread safe by making i2c read transactions atomic

Who changed what in which revision?

UserRevisionLine numberNew contents of line
falingtrea 0:b37e4acdfa7b 1 /**
falingtrea 0:b37e4acdfa7b 2 * @file ISL29011.h
falingtrea 0:b37e4acdfa7b 3 * @brief Device driver - ISL29011 Ambient Light/IR Proximity Sensor
falingtrea 0:b37e4acdfa7b 4 * @author Tim Barr
falingtrea 0:b37e4acdfa7b 5 * @version 1.0
falingtrea 0:b37e4acdfa7b 6 * @see http://www.intersil.com/content/dam/Intersil/documents/isl2/isl29011.pdf
falingtrea 0:b37e4acdfa7b 7 *
falingtrea 0:b37e4acdfa7b 8 * Copyright (c) 2015
falingtrea 0:b37e4acdfa7b 9 *
falingtrea 0:b37e4acdfa7b 10 * Licensed under the Apache License, Version 2.0 (the "License");
falingtrea 0:b37e4acdfa7b 11 * you may not use this file except in compliance with the License.
falingtrea 0:b37e4acdfa7b 12 * You may obtain a copy of the License at
falingtrea 0:b37e4acdfa7b 13 *
falingtrea 0:b37e4acdfa7b 14 * http://www.apache.org/licenses/LICENSE-2.0
falingtrea 0:b37e4acdfa7b 15 *
falingtrea 0:b37e4acdfa7b 16 * Unless required by applicable law or agreed to in writing, software
falingtrea 0:b37e4acdfa7b 17 * distributed under the License is distributed on an "AS IS" BASIS,
falingtrea 0:b37e4acdfa7b 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
falingtrea 0:b37e4acdfa7b 19 * See the License for the specific language governing permissions and
falingtrea 0:b37e4acdfa7b 20 * limitations under the License.
falingtrea 0:b37e4acdfa7b 21 *
falingtrea 0:b37e4acdfa7b 22 */
falingtrea 0:b37e4acdfa7b 23
falingtrea 0:b37e4acdfa7b 24 #ifndef ISL29011_H
falingtrea 0:b37e4acdfa7b 25 #define ISL29011_H
falingtrea 0:b37e4acdfa7b 26
falingtrea 0:b37e4acdfa7b 27 #include "mbed.h"
falingtrea 0:b37e4acdfa7b 28
falingtrea 0:b37e4acdfa7b 29 /** Using the Multitech MTDOT-EVB
falingtrea 0:b37e4acdfa7b 30 *
falingtrea 0:b37e4acdfa7b 31 * Example:
falingtrea 0:b37e4acdfa7b 32 * @code
falingtrea 0:b37e4acdfa7b 33 * #include "mbed.h"
falingtrea 0:b37e4acdfa7b 34 * #include "ISL29011.h"
falingtrea 0:b37e4acdfa7b 35 *
falingtrea 0:b37e4acdfa7b 36
falingtrea 0:b37e4acdfa7b 37 *
falingtrea 0:b37e4acdfa7b 38 * int main()
falingtrea 0:b37e4acdfa7b 39 * {
falingtrea 0:b37e4acdfa7b 40
falingtrea 0:b37e4acdfa7b 41 * }
falingtrea 0:b37e4acdfa7b 42 * @endcode
falingtrea 0:b37e4acdfa7b 43 */
falingtrea 0:b37e4acdfa7b 44
falingtrea 0:b37e4acdfa7b 45 /**
falingtrea 0:b37e4acdfa7b 46 * @class ISL29011
falingtrea 0:b37e4acdfa7b 47 * @brief API abstraction for the ISL29011 Ambient Light/Proximity IC
falingtrea 0:b37e4acdfa7b 48 * initial version will be polling only. Interrupt service and rtos support will
falingtrea 0:b37e4acdfa7b 49 * be added at a later point
falingtrea 0:b37e4acdfa7b 50 */
falingtrea 0:b37e4acdfa7b 51 class ISL29011
falingtrea 0:b37e4acdfa7b 52 {
falingtrea 0:b37e4acdfa7b 53 public:
falingtrea 0:b37e4acdfa7b 54
falingtrea 0:b37e4acdfa7b 55 /**
falingtrea 0:b37e4acdfa7b 56 * @static INT_FLG
falingtrea 0:b37e4acdfa7b 57 * @brief Interrupt flag bit
falingtrea 0:b37e4acdfa7b 58 */
falingtrea 0:b37e4acdfa7b 59 uint8_t static const INT_FLG = 0x04;
falingtrea 0:b37e4acdfa7b 60
falingtrea 0:b37e4acdfa7b 61 /**
falingtrea 0:b37e4acdfa7b 62 * @static CT_16BIT
falingtrea 0:b37e4acdfa7b 63 * @brief Conversion time in usec for 16 bit setting
falingtrea 0:b37e4acdfa7b 64 */
falingtrea 0:b37e4acdfa7b 65 uint32_t static const CT_16BIT = 90000;
falingtrea 0:b37e4acdfa7b 66
falingtrea 0:b37e4acdfa7b 67 /**
falingtrea 0:b37e4acdfa7b 68 * @static CT_12BIT
falingtrea 0:b37e4acdfa7b 69 * @brief conversion time in usec for 12 bit setting
falingtrea 0:b37e4acdfa7b 70 */
falingtrea 0:b37e4acdfa7b 71 uint32_t static const CT_12BIT = 5630;
falingtrea 0:b37e4acdfa7b 72
falingtrea 0:b37e4acdfa7b 73 /**
falingtrea 0:b37e4acdfa7b 74 * @static CT_8BIT
falingtrea 0:b37e4acdfa7b 75 * @brief conversion time in usec for 8 bit setting
falingtrea 0:b37e4acdfa7b 76 */
falingtrea 0:b37e4acdfa7b 77 uint32_t static const CT_8BIT = 351;
falingtrea 0:b37e4acdfa7b 78
falingtrea 0:b37e4acdfa7b 79 /**
falingtrea 0:b37e4acdfa7b 80 * @static CT_4BIT
falingtrea 0:b37e4acdfa7b 81 * @brief conversion time in usec for 4 bit setting
falingtrea 0:b37e4acdfa7b 82 */
falingtrea 0:b37e4acdfa7b 83 uint32_t static const CT_4BIT = 22;
falingtrea 0:b37e4acdfa7b 84
falingtrea 0:b37e4acdfa7b 85
falingtrea 0:b37e4acdfa7b 86 /**
falingtrea 0:b37e4acdfa7b 87 * @enum OP_MODE
falingtrea 0:b37e4acdfa7b 88 * @brief operating mode of ILS29011
falingtrea 0:b37e4acdfa7b 89 */
falingtrea 0:b37e4acdfa7b 90 enum OPERATION_MODE
falingtrea 0:b37e4acdfa7b 91 {
falingtrea 0:b37e4acdfa7b 92 PWR_DOWN = 0x00,
falingtrea 0:b37e4acdfa7b 93 ALS_ONCE = 0x20,
falingtrea 0:b37e4acdfa7b 94 IR_ONCE = 0x04,
falingtrea 0:b37e4acdfa7b 95 PROX_ONCE = 0xA0,
falingtrea 0:b37e4acdfa7b 96 ALS_CONT = 0xC0,
falingtrea 0:b37e4acdfa7b 97 IR_CONT = 0xE0,
falingtrea 0:b37e4acdfa7b 98 PROX_CONT
falingtrea 0:b37e4acdfa7b 99 };
falingtrea 0:b37e4acdfa7b 100
falingtrea 0:b37e4acdfa7b 101 /**
falingtrea 0:b37e4acdfa7b 102 * @enum INT_PERSIST
falingtrea 0:b37e4acdfa7b 103 * @brief Number of cycles measurement needs to be out of threshold to generate an interrupt
falingtrea 0:b37e4acdfa7b 104 */
falingtrea 0:b37e4acdfa7b 105 enum INT_PERSIST
falingtrea 0:b37e4acdfa7b 106 {
falingtrea 0:b37e4acdfa7b 107 NUMCYCLE_1 = 0x00,
falingtrea 0:b37e4acdfa7b 108 NUMCYCLE_2, NUMCYCLE_4, NUMCYCYLE_8, NUMCYCLE_16
falingtrea 0:b37e4acdfa7b 109 };
falingtrea 0:b37e4acdfa7b 110
falingtrea 0:b37e4acdfa7b 111 /**
falingtrea 0:b37e4acdfa7b 112 * @enum PROX_SCHEME
falingtrea 0:b37e4acdfa7b 113 * @brief Dynamic Range scheme for IR proximity
falingtrea 0:b37e4acdfa7b 114 */
falingtrea 0:b37e4acdfa7b 115 enum PROX_SCHEME
falingtrea 0:b37e4acdfa7b 116 {
falingtrea 0:b37e4acdfa7b 117 PROX_FULL = 0x00, /* full n (4,8,12,16) bit data */
falingtrea 0:b37e4acdfa7b 118 PROX_NR = 0x80 /* n-1 (3,7,11,15) bit data */
falingtrea 0:b37e4acdfa7b 119 };
falingtrea 0:b37e4acdfa7b 120
falingtrea 0:b37e4acdfa7b 121 /**
falingtrea 0:b37e4acdfa7b 122 * @enum MOD_FREQ
falingtrea 0:b37e4acdfa7b 123 * @brief Modulation frequency of Proximity LED
falingtrea 0:b37e4acdfa7b 124 */
falingtrea 0:b37e4acdfa7b 125 enum MOD_FREQ
falingtrea 0:b37e4acdfa7b 126 {
falingtrea 0:b37e4acdfa7b 127 FREQ_DC = 0x00, /* No modulation of LED */
falingtrea 0:b37e4acdfa7b 128 FREQ_360k = 0x40 /* Proximity LED modulated at 360 kHz */
falingtrea 0:b37e4acdfa7b 129 };
falingtrea 0:b37e4acdfa7b 130
falingtrea 0:b37e4acdfa7b 131 /**
falingtrea 0:b37e4acdfa7b 132 * @enum LED_DRIVE
falingtrea 0:b37e4acdfa7b 133 * @brief Sets the drive current of the IR Proximity LED
falingtrea 0:b37e4acdfa7b 134 */
falingtrea 0:b37e4acdfa7b 135 enum LED_DRIVE
falingtrea 0:b37e4acdfa7b 136 {
falingtrea 0:b37e4acdfa7b 137 LED_12_5 = 0x00, /* 12.5 mA current drive */
falingtrea 0:b37e4acdfa7b 138 LED_25 = 0x10, /* 25 mA current drive */
falingtrea 0:b37e4acdfa7b 139 LED_50 = 0x20, /* 50 mA current drive */
falingtrea 0:b37e4acdfa7b 140 LED_100 = 0x30 /* 100 mA current driver */
falingtrea 0:b37e4acdfa7b 141 };
falingtrea 0:b37e4acdfa7b 142
falingtrea 0:b37e4acdfa7b 143 /**
falingtrea 0:b37e4acdfa7b 144 * @enum ADC_RESOLUTION
falingtrea 0:b37e4acdfa7b 145 * @brief Measurement resolution for ADC
falingtrea 0:b37e4acdfa7b 146 */
falingtrea 0:b37e4acdfa7b 147 enum ADC_RESOLUTION
falingtrea 0:b37e4acdfa7b 148 {
falingtrea 0:b37e4acdfa7b 149 ADC_16BIT = 0x00,
falingtrea 0:b37e4acdfa7b 150 ADC_12BIT = 0x04,
falingtrea 0:b37e4acdfa7b 151 ADC_8BIT = 0x08,
falingtrea 0:b37e4acdfa7b 152 ADC_4BIT = 0x0B
falingtrea 0:b37e4acdfa7b 153 };
falingtrea 0:b37e4acdfa7b 154
falingtrea 0:b37e4acdfa7b 155 /**
falingtrea 0:b37e4acdfa7b 156 * @enum LUX_RANGE
falingtrea 0:b37e4acdfa7b 157 * @brief Setting for LUX Range of ADC
falingtrea 0:b37e4acdfa7b 158 */
falingtrea 0:b37e4acdfa7b 159 enum LUX_RANGE
falingtrea 0:b37e4acdfa7b 160 {
falingtrea 0:b37e4acdfa7b 161 RNG_1000 = 0x00, /* Full scale 1,000 LUX */
falingtrea 0:b37e4acdfa7b 162 RNG_4000, /* Full scale 4,000 LUX */
falingtrea 0:b37e4acdfa7b 163 RNG_16000, /* Full scale 16,000 LUX */
falingtrea 0:b37e4acdfa7b 164 RNG_64000 /* Full scale 64,000 LUX */
falingtrea 0:b37e4acdfa7b 165 };
falingtrea 0:b37e4acdfa7b 166
falingtrea 0:b37e4acdfa7b 167 /**
falingtrea 0:b37e4acdfa7b 168 * @enum REGISTER
falingtrea 0:b37e4acdfa7b 169 * @brief The device register map
falingtrea 0:b37e4acdfa7b 170 */
falingtrea 0:b37e4acdfa7b 171 enum REGISTER
falingtrea 0:b37e4acdfa7b 172 {
falingtrea 0:b37e4acdfa7b 173 COMMAND1 = 0x00,
falingtrea 0:b37e4acdfa7b 174 COMMAND2, DATA_LSB, DATA_MSB, INT_LT_LSB, INT_LT_MSB, INT_HT_LSB, INT_HT_MSB
falingtrea 0:b37e4acdfa7b 175 };
falingtrea 0:b37e4acdfa7b 176
falingtrea 0:b37e4acdfa7b 177 /** Create the ISL29011 object
falingtrea 0:b37e4acdfa7b 178 * @param i2c - A defined I2C object
falingtrea 0:b37e4acdfa7b 179 * @param InterruptIn* - pointer to a defined InterruptIn object. Default to NULL if polled
falingtrea 0:b37e4acdfa7b 180 */
falingtrea 0:b37e4acdfa7b 181 ISL29011(I2C &i2c, InterruptIn* isl_int = NULL);
falingtrea 0:b37e4acdfa7b 182
falingtrea 0:b37e4acdfa7b 183 /** Get the data
falingtrea 0:b37e4acdfa7b 184 * @return The last valid LUX reading from the ambient light sensor
falingtrea 0:b37e4acdfa7b 185 */
falingtrea 0:b37e4acdfa7b 186 uint16_t getData(void);
falingtrea 0:b37e4acdfa7b 187
falingtrea 0:b37e4acdfa7b 188 /** Setup the ISL29011 measurement mode
falingtrea 0:b37e4acdfa7b 189 * @op_mode - Operating moe of sensor using the OPERATION_MODE enum
falingtrea 0:b37e4acdfa7b 190 * @return status of command
falingtrea 0:b37e4acdfa7b 191 */
falingtrea 0:b37e4acdfa7b 192 uint8_t setMode(OPERATION_MODE op_mode) const;
falingtrea 0:b37e4acdfa7b 193
falingtrea 0:b37e4acdfa7b 194 /** Set Interrupt Threshold persistence
falingtrea 0:b37e4acdfa7b 195 * @int_persist - Sets the Interrupt Persistence Threshold using the INT_PERSIST enum
falingtrea 0:b37e4acdfa7b 196 * @return status of command
falingtrea 0:b37e4acdfa7b 197 * TODO - Still need to add interrupt support code
falingtrea 0:b37e4acdfa7b 198 */
falingtrea 0:b37e4acdfa7b 199 uint8_t setPersistence(INT_PERSIST int_persist) const;
falingtrea 0:b37e4acdfa7b 200
falingtrea 0:b37e4acdfa7b 201 /** Set Proximity measurement parameters
falingtrea 0:b37e4acdfa7b 202 * @prox_scheme - Sets the Proximity measurement scheme using the PROX_SCHEME enum
falingtrea 0:b37e4acdfa7b 203 * @mod_freq - Sets the Moduletion Frequency using the MOD_FREQ enum
falingtrea 0:b37e4acdfa7b 204 * @led_drive - Sets the LED Drive current for Proximity mode using the LED_DRIVE enum
falingtrea 0:b37e4acdfa7b 205 * @return status of command
falingtrea 0:b37e4acdfa7b 206 * NOTE: function added for completeness. MTDOT-EVB does not have IR LED installed at this time
falingtrea 0:b37e4acdfa7b 207 */
falingtrea 0:b37e4acdfa7b 208 uint8_t setProximity(PROX_SCHEME prox_scheme, MOD_FREQ mod_freq, LED_DRIVE led_drive) const;
falingtrea 0:b37e4acdfa7b 209
falingtrea 0:b37e4acdfa7b 210 /** Set ADC Resolution
falingtrea 0:b37e4acdfa7b 211 * @adc_resolution - Sets the ADC resolution using the ADC_RESOLUTION enum
falingtrea 0:b37e4acdfa7b 212 * @return status of command
falingtrea 0:b37e4acdfa7b 213 */
falingtrea 0:b37e4acdfa7b 214 uint8_t setResolution(ADC_RESOLUTION adc_resolution) const;
falingtrea 0:b37e4acdfa7b 215
falingtrea 0:b37e4acdfa7b 216 /** Set the LUX Full Scale measurement range
falingtrea 0:b37e4acdfa7b 217 * @lux_range - Sets the maximum measured Lux value usngthe LUX_RANGE enum
falingtrea 0:b37e4acdfa7b 218 * @return status of command
falingtrea 0:b37e4acdfa7b 219 */
falingtrea 0:b37e4acdfa7b 220 uint8_t setRange(LUX_RANGE lux_range ) const;
falingtrea 0:b37e4acdfa7b 221
falingtrea 0:b37e4acdfa7b 222 private:
falingtrea 0:b37e4acdfa7b 223
falingtrea 0:b37e4acdfa7b 224 I2C *_i2c;
falingtrea 0:b37e4acdfa7b 225 InterruptIn *_isl_int;
falingtrea 0:b37e4acdfa7b 226 bool _polling_mode;
falingtrea 0:b37e4acdfa7b 227 uint8_t static const _i2c_addr = (0x44 << 1);
falingtrea 0:b37e4acdfa7b 228 uint16_t _lux_data;
falingtrea 0:b37e4acdfa7b 229
falingtrea 0:b37e4acdfa7b 230 /* Initialize the ISL29011 device
falingtrea 0:b37e4acdfa7b 231 */
falingtrea 0:b37e4acdfa7b 232 uint8_t init(void);
falingtrea 0:b37e4acdfa7b 233
falingtrea 0:b37e4acdfa7b 234 /*
falingtrea 0:b37e4acdfa7b 235 * Write to a register (exposed for debugging reasons)
falingtrea 0:b37e4acdfa7b 236 * Note: most writes are only valid in stop mode
falingtrea 0:b37e4acdfa7b 237 * @param reg - The register to be written
falingtrea 0:b37e4acdfa7b 238 * @param data - The data to be written
falingtrea 0:b37e4acdfa7b 239 */
falingtrea 0:b37e4acdfa7b 240 uint8_t writeRegister(uint8_t const reg, uint8_t const data) const;
falingtrea 0:b37e4acdfa7b 241
falingtrea 0:b37e4acdfa7b 242 /*
falingtrea 0:b37e4acdfa7b 243 * Read from a register (exposed for debugging reasons)
falingtrea 0:b37e4acdfa7b 244 * @param reg - The register to read from
falingtrea 0:b37e4acdfa7b 245 * @return The register contents
falingtrea 0:b37e4acdfa7b 246 */
falingtrea 0:b37e4acdfa7b 247 uint8_t readRegister(uint8_t const reg, char* data, uint8_t count = 1) const;
falingtrea 0:b37e4acdfa7b 248
falingtrea 0:b37e4acdfa7b 249 };
falingtrea 0:b37e4acdfa7b 250
falingtrea 0:b37e4acdfa7b 251 #endif