1 /* 2 * Copyright (c) 2023 Andreas Kilian 3 * Copyright (c) 2024 Jeff Welder (Ellenby Technologies, Inc.) 4 * 5 * SPDX-License-Identifier: Apache-2.0 6 */ 7 8 #ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML7700_H_ 9 #define ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML7700_H_ 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 /** 16 * @brief Number of enumerators in enum veml7700_als_gain. 17 */ 18 #define VEML7700_ALS_GAIN_ELEM_COUNT 4 19 /** 20 * @brief Number of enumerators in enum veml7700_als_it. 21 */ 22 #define VEML7700_ALS_IT_ELEM_COUNT 6 23 24 /** 25 * @brief Bit mask to check for the low threshold interrupt flag. 26 * 27 * See <tt>SENSOR_ATTR_VEML7700_INT_MODE</tt> 28 * and <tt>SENSOR_CHAN_VEML7700_INTERRUPT</tt> 29 */ 30 #define VEML7700_ALS_INT_LOW_MASK BIT(15) 31 /** 32 * @brief Bit mask to check for the high threshold interrupt flag. 33 * 34 * See <tt>SENSOR_ATTR_VEML7700_INT_MODE</tt> 35 * and <tt>SENSOR_CHAN_VEML7700_INTERRUPT</tt> 36 */ 37 #define VEML7700_ALS_INT_HIGH_MASK BIT(14) 38 39 /** 40 * @brief VEML7700 gain options for ambient light measurements. 41 */ 42 enum veml7700_als_gain { 43 VEML7700_ALS_GAIN_1 = 0x00, /* 0b00 */ 44 VEML7700_ALS_GAIN_2 = 0x01, /* 0b01 */ 45 VEML7700_ALS_GAIN_1_8 = 0x02, /* 0b10 */ 46 VEML7700_ALS_GAIN_1_4 = 0x03, /* 0b11 */ 47 }; 48 49 /** 50 * @brief VEML7700 integration time options for ambient light measurements. 51 */ 52 enum veml7700_als_it { 53 VEML7700_ALS_IT_25, 54 VEML7700_ALS_IT_50, 55 VEML7700_ALS_IT_100, 56 VEML7700_ALS_IT_200, 57 VEML7700_ALS_IT_400, 58 VEML7700_ALS_IT_800 59 }; 60 61 /** 62 * @brief VEML7700 ALS interrupt persistence protect number options. 63 */ 64 enum veml7700_int_mode { 65 VEML7700_INT_DISABLED = 0xFF, 66 VEML7700_ALS_PERS_1 = 0x00, /* 0b00 */ 67 VEML7700_ALS_PERS_2 = 0x01, /* 0b01 */ 68 VEML7700_ALS_PERS_4 = 0x02, /* 0b10 */ 69 VEML7700_ALS_PERS_8 = 0x03, /* 0b11 */ 70 }; 71 72 /** 73 * @brief VEML7700 specific sensor attributes. 74 * 75 * For high and low threshold window settings (ALS_WH and ALS_WL) 76 * use the generic attributes <tt>SENSOR_ATTR_UPPER_THRESH</tt> and 77 * <tt>SENSOR_ATTR_LOWER_THRESH</tt> with 16-bit unsigned integer 78 * values. Both threshold settings are in lux and converted by the 79 * driver to a value compatible with the sensor. This conversion 80 * depends on the current gain and integration time settings. So a 81 * change in gain or integration time usually requires an update of 82 * threshold window settings. To get the correct threshold values 83 * into the sensor update the thresholds -after- a change of gain 84 * or integration time. 85 * 86 * All attributes must be set for the <tt>SENSOR_CHAN_LIGHT</tt> channel. 87 */ 88 enum sensor_attribute_veml7700 { 89 /** 90 * @brief Gain setting for ALS measurements (ALS_GAIN). 91 * 92 * Use enum veml7700_als_gain for attribute values. 93 */ 94 SENSOR_ATTR_VEML7700_GAIN = SENSOR_ATTR_PRIV_START, 95 /** 96 * @brief Integration time setting for ALS measurements (ALS_IT). 97 * 98 * Use enum veml7700_als_it for attribute values. 99 */ 100 SENSOR_ATTR_VEML7700_ITIME, 101 /** 102 * @brief Enable or disable use of ALS interrupt 103 * (ALS_INT_EN and ALS_PERS). 104 * 105 * Please mind that the VEML7700 does not have an interrupt pin. 106 * That's why this driver does not implement any asynchronous 107 * notification mechanism. Such notifications would require to 108 * periodically query the sensor for it's interrupt state and then 109 * trigger an event based on that state. It's up to the user to 110 * query the interrupt state manually using 111 * <tt>sensor_channel_fetch_chan()</tt> on the 112 * <tt>SENSOR_CHAN_VEML7700_INTERRUPT</tt> channel or using 113 * <tt>sensor_channel_fetch()</tt>. 114 * 115 * Use enum veml7700_int_mode for attribute values. 116 */ 117 SENSOR_ATTR_VEML7700_INT_MODE, 118 }; 119 120 /** 121 * @brief VEML7700 specific sensor channels. 122 */ 123 enum sensor_channel_veml7700 { 124 /** 125 * @brief Channel for raw ALS sensor values. 126 * 127 * This channel represents the raw measurement counts provided by the 128 * sensors ALS register. It is useful for estimating the high/low 129 * threshold window attributes for the sensors interrupt handling. 130 * 131 * You cannot fetch this channel explicitly. Instead, this channel's 132 * value is fetched implicitly using <tt>SENSOR_CHAN_LIGHT</tt>. 133 * Trying to call <tt>sensor_channel_fetch_chan()</tt> with this 134 * enumerator as an argument will result in a <tt>-ENOTSUP</tt>. 135 */ 136 SENSOR_CHAN_VEML7700_RAW_COUNTS = SENSOR_CHAN_PRIV_START, 137 138 /** 139 * @brief Channel for white light sensor values. 140 * 141 * This channel is the White Channel count output of the sensor. 142 * The white channel can be used to correct for light sources with 143 * strong infrared content in the 750-800nm spectrum. 144 */ 145 SENSOR_CHAN_VEML7700_WHITE_RAW_COUNTS, 146 147 /** 148 * @brief This channel is used to query the ALS interrupt state (ALS_INT). 149 * 150 * In order for this channel to provide any meaningful data you need 151 * to enable the ALS interrupt mode using the 152 * <tt>SENSOR_ATTR_VEML7700_INT_MODE</tt> custom sensor attribute. 153 * 154 * It's important to note that the sensor resets it's interrupt state 155 * after retrieving it. 156 */ 157 SENSOR_CHAN_VEML7700_INTERRUPT, 158 }; 159 160 #ifdef __cplusplus 161 } 162 #endif 163 164 #endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML7700_H_ */ 165