Class module for ISL29011 Ambient Light Sensor

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

ISL29011.h

Committer:
Evan Hosseini
Date:
2018-01-31
Revision:
5:953adca17438
Parent:
0:b37e4acdfa7b

File content as of revision 5:953adca17438:

/**
 * @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