diff -r eee990609da7 -r bdc123ae7b49 esp-idf-lib/components/apds9930/apds9930.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/esp-idf-lib/components/apds9930/apds9930.h Mon Apr 03 11:08:09 2023 +0200 @@ -0,0 +1,448 @@ +/** + * @file APDS-9930.h + * @brief Library for the SparkFun APDS-9930 breakout board + * @author Shawn Hymel (SparkFun Electronics) + * + * @copyright This code is public domain but you buy me a beer if you use + * this and we meet someday (Beerware license). + * + * This library interfaces the Avago APDS-9930 to ESP-IDF over I2C. + * Ported from Arduino library by Davide Depau. + * + * MIT Licensed as described in the file LICENSE + */ + +#ifndef __APDS9930_H__ +#define __APDS9930_H__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define APDS9930_ID_1 0x12 +#define APDS9930_ID_2 0x39 +#define APDS9930_ID_3 0x30 // My chip gives this + + +/* LED Drive values */ +#define APDS9930_LED_DRIVE_100MA 0 +#define APDS9930_LED_DRIVE_50MA 1 +#define APDS9930_LED_DRIVE_25MA 2 +#define APDS9930_LED_DRIVE_12_5MA 3 + +/* Proximity Gain (PGAIN) values */ +#define APDS9930_PGAIN_1X 0 +#define APDS9930_PGAIN_2X 1 +#define APDS9930_PGAIN_4X 2 +#define APDS9930_PGAIN_8X 3 + +/* ALS Gain (AGAIN) values */ +#define APDS9930_AGAIN_1X 0 +#define APDS9930_AGAIN_8X 1 +#define APDS9930_AGAIN_16X 2 +#define APDS9930_AGAIN_120X 3 + + + +/** + * @brief Initialize device descriptor + * + * Default SCL frequency is 100kHz + * + * @param dev Pointer to I2C device descriptor + * @param port I2C port number + * @param addr I2C address (0x39 for APDS9930) + * @param sda_gpio SDA GPIO + * @param scl_gpio SCL GPIO + * @return `ESP_OK` on success + */ +esp_err_t apds9930_init_desc(i2c_dev_t *dev, uint8_t addr, i2c_port_t port, gpio_num_t sda_gpio, gpio_num_t scl_gpio); + +/** + * @brief Free device descriptor + * @param dev Pointer to I2C device descriptor + * @return `ESP_OK` on success + */ +esp_err_t apds9930_free_desc(i2c_dev_t *dev); + + + +/* APDS9930 Class */ +//class APDS9930 { +//public: + + + /* Initialization methods */ +// APDS9930(); +// ~APDS9930(); + +/** + * @brief Setup APDS9930 and initializes registers to defaults + * @param dev Pointer to I2C device descriptor + * @return `ESP_OK` on success + */ +esp_err_t apds9930_init(i2c_dev_t *dev); + +/** + * @brief Reads and returns the contents of the ENABLE register + * @param dev Pointer to I2C device descriptor + * @return Contents of the ENABLE register. 0xFF if error. + */ +uint8_t apds9930_getMode(i2c_dev_t *dev); + +/** + * @brief Enables or disables a feature in the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @param mode which feature to enable + * @param enable ON (1) or OFF (0) + * @return `ESP_OK` on success + */ +esp_err_t apds9930_setMode(i2c_dev_t *dev, uint8_t mode, uint8_t enable); + +/** + * @brief Turn the APDS-9930 on + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_enablePower(i2c_dev_t *dev); + +/** + * @brief Turn the APDS-9930 off + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if operation successful. False otherwise. + */ +esp_err_t apds9930_disablePower(i2c_dev_t *dev); + +/** + * @brief Starts the light (Ambient/IR) sensor on the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @param interrupts true to enable hardware interrupt on high or low light + * @return ESP_OK if sensor enabled correctly. + */ +esp_err_t apds9930_enableLightSensor(i2c_dev_t *dev, bool interrupts); + +/** + * @brief Ends the light sensor on the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if sensor disabled correctly. + */ +esp_err_t apds9930_disableLightSensor(i2c_dev_t *dev); + +/** + * @brief Starts the proximity sensor on the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @param interrupts true to enable hardware external interrupt on proximity + * @return ESP_OK if sensor enabled correctly. + */ +esp_err_t apds9930_enableProximitySensor(i2c_dev_t *dev, bool interrupts); + +/** + * @brief Ends the proximity sensor on the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if sensor disabled correctly. + */ +esp_err_t apds9930_disableProximitySensor(i2c_dev_t *dev); + + +/** + * @brief Returns LED drive strength for proximity and ALS + * @param dev Pointer to I2C device descriptor + * + * Value LED Current + * 0 100 mA + * 1 50 mA + * 2 25 mA + * 3 12.5 mA + * + * @return the value of the LED drive strength. 0xFF on failure. + */ +uint8_t APDS9930_getLEDDrive(i2c_dev_t *dev); + +/** + * @brief Sets the LED drive strength for proximity and ALS + * @param dev Pointer to I2C device descriptor + * + * Value LED Current + * 0 100 mA + * 1 50 mA + * 2 25 mA + * 3 12.5 mA + * + * @param drive the value (0-3) for the LED drive strength + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setLEDDrive(i2c_dev_t *dev, uint8_t drive); + +/** + * @brief Gets the receiver ALS gain level for the ambient light sensor. + * When set the gain is extra scaled down with 0.16. + * @param dev Pointer to I2C device descriptor + * @return 1 if extra ALS gain level is enabled, 0 if not. 0xFF on error. + */ +uint8_t apds9930_getAmbientGainLevel(i2c_dev_t *dev); + +/** + * @brief Sets the receiver ALS gain level for the ambient light sensor + * When asserted, the 1x and 8x gain modes are scaled by 0.16. + * Otherwise AGAIN is scaled by 1. Do not use with AGAIN greater then 8x. + * @param dev Pointer to I2C device descriptor + * @param enable the value (0-1) for the gain level. + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setAmbientGainLevel(i2c_dev_t *dev, uint8_t enable); + +/** + * @brief Returns receiver gain for the ambient light sensor (ALS) + * @param dev Pointer to I2C device descriptor + * + * Value Gain + * 0 1x + * 1 4x + * 2 16x + * 3 120x + * + * @return the value of the ALS gain. 0xFF on failure. + */ +uint8_t apds9930_getAmbientLightGain(i2c_dev_t *dev); + +/** + * @brief Sets the receiver gain for the ambient light sensor (ALS) + * @param dev Pointer to I2C device descriptor + * + * Value Gain + * 0 1x + * 1 4x + * 2 16x + * 3 120x + * + * @param drive the value (0-3) for the gain + * @return ESP_OK if operation successful. False otherwise. + */ +esp_err_t apds9930_setAmbientLightGain(i2c_dev_t *dev, uint8_t gain); + +/** + * @brief Returns receiver gain for proximity detection + * @param dev Pointer to I2C device descriptor + * + * Value Gain + * 0 1x + * 1 2x + * 2 4x + * 3 8x + * + * @return the value of the proximity gain. 0xFF on failure. + */ +uint8_t apds9930_getProximityGain(i2c_dev_t *dev); + +/** + * @brief Sets the receiver gain for proximity detection + * @param dev Pointer to I2C device descriptor + * + * Value Gain + * 0 1x + * 1 2x + * 2 4x + * 3 8x + * + * @param drive the value (0-3) for the gain + * @return True if operation successful. False otherwise. + */ +esp_err_t apds9930_setProximityGain(i2c_dev_t *dev, uint8_t gain); + +/** + * @brief Selects the proximity diode + * @param dev Pointer to I2C device descriptor + * + * Value Diode selection + * 0 Reserved + * 1 Reserved + * 2 Use Ch1 diode + * 3 Reserved + * + * @param[in] drive the value (0-3) for the diode + * @return True if operation successful. False otherwise. + */ +esp_err_t apds9930_setProximityDiode(i2c_dev_t *dev, uint8_t drive); + +/** + * @brief Returns the proximity diode + * @param dev Pointer to I2C device descriptor + * + * Value Diode selection + * 0 Reserved + * 1 Reserved + * 2 Use Ch1 diode + * 3 Reserved + * + * @return the selected diode. 0xFF on failure. + */ +uint8_t apds9930_getProximityDiode(i2c_dev_t *dev); + +/** + * @brief Gets the low threshold for ambient light interrupts + * @param dev Pointer to I2C device descriptor + * @param threshold current low threshold stored on the APDS-9930 + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_getLightIntLowThreshold(i2c_dev_t *dev, uint16_t *threshold); + +/** + * @brief Sets the low threshold for ambient light interrupts + * @param dev Pointer to I2C device descriptor + * @param threshold low threshold value for interrupt to trigger + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setLightIntLowThreshold(i2c_dev_t *dev, uint16_t threshold); + +/** + * @brief Gets the high threshold for ambient light interrupts + * @param dev Pointer to I2C device descriptor + * @param threshold current low threshold stored on the APDS-9930 + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_getLightIntHighThreshold(i2c_dev_t *dev, uint16_t *threshold); + +/** + * @brief Sets the high threshold for ambient light interrupts + * @param dev Pointer to I2C device descriptor + * @param threshold low threshold value for interrupt to trigger + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setLightIntHighThreshold(i2c_dev_t *dev, uint16_t threshold); + +/** + * @brief Gets if ambient light interrupts are enabled or not + * @param dev Pointer to I2C device descriptor + * @return 1 if interrupts are enabled, 0 if not. 0xFF on error. + */ +uint8_t apds9930_getAmbientLightIntEnable(i2c_dev_t *dev); + +/** + * @brief Turns ambient light interrupts on or off + * @param dev Pointer to I2C device descriptor + * @param[in] enable 1 to enable interrupts, 0 to turn them off + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setAmbientLightIntEnable(i2c_dev_t *dev, uint8_t enable); + +/** + * @brief Gets if proximity interrupts are enabled or not + * @param dev Pointer to I2C device descriptor + * @return 1 if interrupts are enabled, 0 if not. 0xFF on error. + */ +uint8_t apds9930_getProximityIntEnable(i2c_dev_t *dev); + +/** + * @brief Turns proximity interrupts on or off + * @param dev Pointer to I2C device descriptor + * @param[in] enable 1 to enable interrupts, 0 to turn them off + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setProximityIntEnable(i2c_dev_t *dev, uint8_t enable); + +/** + * @brief Clears the ambient light interrupt + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if operation completed successfully. + */ +esp_err_t apds9930_clearAmbientLightInt(i2c_dev_t *dev); + +/** + * @brief Clears the proximity interrupt + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if operation completed successfully. + */ +esp_err_t apds9930_clearProximityInt(i2c_dev_t *dev); + +/** + * @brief Clears all interrupts + * @param dev Pointer to I2C device descriptor + * @return ESP_OK if operation completed successfully. + */ +esp_err_t apds9930_clearAllInts(i2c_dev_t *dev); + +/** + * @brief Reads the proximity level as an 16-bit value + * @param dev Pointer to I2C device descriptor + * @param val value of the proximity sensor. + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_readProximity(i2c_dev_t *dev, uint16_t *val); + +/** + * @brief Reads the ambient (clear) light level as a float value + * @param dev Pointer to I2C device descriptor + * @param val value of the light sensor. + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_readAmbientLightLux(i2c_dev_t *dev, float *val); + +/** + * @brief Reads the ambient (clear) light level as a unsigned long value + * @param dev Pointer to I2C device descriptor + * @param val value of the light sensor. + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_readulAmbientLightLux(i2c_dev_t *dev, unsigned long *val); + +float apds9930_floatAmbientToLux(i2c_dev_t *dev, uint16_t Ch0, uint16_t Ch1); + +unsigned long apds9930_ulongAmbientToLux(i2c_dev_t *dev, uint16_t Ch0, uint16_t Ch1); + +/** + * @brief Read the channel 0 light value from the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @param val The value read. + * @return ESP_OK if read is correctly. + */ +esp_err_t apds9930_readCh0Light(i2c_dev_t *dev, uint16_t *val); + +/** + * @brief Read the channel 1 light value from the APDS-9930 + * @param dev Pointer to I2C device descriptor + * @param val The value read. + * @return ESP_OK if read is correctly. + */ +esp_err_t apds9930_readCh1Light(i2c_dev_t *dev, uint16_t *val); + +/** + * @brief Returns the lower threshold for proximity detection + * @param dev Pointer to I2C device descriptor + * @return lower threshold + */ +uint16_t apds9930_getProximityIntLowThreshold(i2c_dev_t *dev); + +/** + * @brief Sets the lower threshold for proximity detection + * @param dev Pointer to I2C device descriptor + * @param threshold the lower proximity threshold + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setProximityIntLowThreshold(i2c_dev_t *dev, uint16_t threshold); + +/** + * @brief Returns the high threshold for proximity detection + * @param dev Pointer to I2C device descriptor + * @return high threshold + */ +uint16_t apds9930_getProximityIntHighThreshold(i2c_dev_t *dev); + +/** + * @brief Sets the high threshold for proximity detection + * @param dev Pointer to I2C device descriptor + * @param threshold the high proximity threshold + * @return ESP_OK if operation successful. + */ +esp_err_t apds9930_setProximityIntHighThreshold(i2c_dev_t *dev, uint16_t threshold); + + +#ifdef __cplusplus +} +#endif + +#endif