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