Line data Source code
1 0 : /* 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 1 : #define VEML7700_ALS_GAIN_ELEM_COUNT 4 19 : /** 20 : * @brief Number of enumerators in enum veml7700_als_it. 21 : */ 22 1 : #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 1 : #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 1 : #define VEML7700_ALS_INT_HIGH_MASK BIT(14) 38 : 39 : /** 40 : * @brief VEML7700 gain options for ambient light measurements. 41 : */ 42 0 : 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 0 : 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 0 : 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 1 : 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 1 : 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_ */