1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef CHRE_CORE_SENSOR_TYPE_H_
18 #define CHRE_CORE_SENSOR_TYPE_H_
19 
20 #include <cstdint>
21 
22 #include "chre_api/chre/sensor.h"
23 
24 namespace chre {
25 
26 //! The union of possible CHRE sensor data event type with one sample.
27 union ChreSensorData {
28   struct chreSensorThreeAxisData threeAxisData;
29   struct chreSensorOccurrenceData occurrenceData;
30   struct chreSensorFloatData floatData;
31   struct chreSensorByteData byteData;
32 };
33 
34 /**
35  * This SensorType is designed to wrap constants provided by the CHRE API
36  * to improve type-safety. In addition, an unknown sensor type is provided
37  * for dealing with sensors that are not defined as per the CHRE API
38  * specification. The details of these sensors are left to the CHRE API
39  * sensor definitions.
40  */
41 enum class SensorType : uint8_t {
42   Unknown,
43   Accelerometer,
44   InstantMotion,
45   StationaryDetect,
46   Gyroscope,
47   GeomagneticField,
48   Pressure,
49   Light,
50   Proximity,
51   StepDetect,
52   AccelerometerTemperature,
53   GyroscopeTemperature,
54   GeomagneticFieldTemperature,
55   UncalibratedAccelerometer,
56   UncalibratedGyroscope,
57   UncalibratedGeomagneticField,
58 
59   VendorType0,
60   VendorType1,
61   VendorType2,
62   VendorType3,
63   VendorType4,
64   VendorType5,
65   VendorType6,
66   VendorType7,
67   VendorType8,
68 
69   // Note to future developers: don't forget to update the implementation of
70   // 1) getSensorTypeName,
71   // 2) getSensorTypeFromUnsignedInt,
72   // 3) getUnsignedIntFromSensorType,
73   // 4) getSensorSampleTypeFromSensorType
74   // 5) sensorTypeIsOneShot
75   // 6) sensorTypeIsOnChange
76   // when adding or removing a new entry here :)
77   // Have a nice day.
78 
79   //! The number of sensor types including unknown. This entry must be last.
80   SENSOR_TYPE_COUNT,
81 };
82 
83 /**
84  * This SensorSampleType is designed to help classify SensorType's data type in
85  * event handling.
86  */
87 enum class SensorSampleType {
88   Byte,
89   Float,
90   Occurrence,
91   ThreeAxis,
92   Vendor0,
93   Vendor1,
94   Vendor2,
95   Vendor3,
96   Vendor4,
97   Vendor5,
98   Vendor6,
99   Vendor7,
100   Vendor8,
101   Unknown,
102 };
103 
104 /**
105  * Returns a string representation of the given sensor type.
106  *
107  * @param sensorType The sensor type to obtain a string for.
108  * @return A string representation of the sensor type.
109  */
110 const char *getSensorTypeName(SensorType sensorType);
111 
112 /**
113  * Returns a sensor sample event type for a given sensor type. The sensor type
114  * must not be SensorType::Unknown. This is a fatal error.
115  *
116  * @param sensorType The type of the sensor.
117  * @return The event type for a sensor sample of the given sensor type.
118  */
119 uint16_t getSampleEventTypeForSensorType(SensorType sensorType);
120 
121 /**
122  * Returns a sensor type for a given sensor sample event type.
123  *
124  * @param eventType The event type for a sensor sample.
125  * @return The type of the sensor.
126  */
127 SensorType getSensorTypeForSampleEventType(uint16_t eventType);
128 
129 /**
130  * @return An index into an array for a given sensor type. This is useful to map
131  * sensor type to array index quickly. The range returned corresponds to any
132  * SensorType except for Unknown starting from zero to the maximum value sensor
133  * with no gaps.
134  */
getSensorTypeArrayIndex(SensorType sensorType)135 constexpr size_t getSensorTypeArrayIndex(SensorType sensorType) {
136   return static_cast<size_t>(sensorType) - 1;
137 }
138 
139 /**
140  * @return The number of valid sensor types in the SensorType enum.
141  */
getSensorTypeCount()142 constexpr size_t getSensorTypeCount() {
143   // The number of valid entries in the SensorType enum (not including Unknown).
144   return static_cast<size_t>(SensorType::SENSOR_TYPE_COUNT) - 1;
145 }
146 
147 /**
148  * Translates an unsigned integer as provided by a CHRE-compliant nanoapp to a
149  * SensorType. If the integer sensor type does not match one of the internal
150  * sensor types, SensorType::Unknown is returned.
151  *
152  * @param sensorType The integer sensor type.
153  * @return The strongly-typed sensor if a match is found or SensorType::Unknown.
154  */
155 SensorType getSensorTypeFromUnsignedInt(uint8_t sensorType);
156 
157 /**
158  * Translates a SensorType to an unsigned integer as provided by CHRE API. If
159  * the sensor type is SensorType::Unknown, 0 is returned.
160  *
161  * @param sensorType The strongly-typed sensor.
162  * @return The integer sensor type if sensorType is not SensorType::Unknown.
163  */
164 uint8_t getUnsignedIntFromSensorType(SensorType sensorType);
165 
166 /**
167  * Provides a stable handle for a CHRE sensor type. This handle is exposed to
168  * CHRE nanoapps as a way to refer to sensors that they are subscribing to. This
169  * API is not expected to be called with SensorType::Unknown as nanoapps are not
170  * able to subscribe to the Unknown sensor type.
171  *
172  * @param sensorType The type of the sensor to obtain a handle for.
173  * @return The handle for a given sensor.
174  */
getSensorHandleFromSensorType(SensorType sensorType)175 constexpr uint32_t getSensorHandleFromSensorType(SensorType sensorType) {
176   return static_cast<uint32_t>(sensorType);
177 }
178 
179 /**
180  * Maps a sensor handle to a SensorType or returns SensorType::Unknown if the
181  * provided handle is invalid.
182  *
183  * @param handle The sensor handle for a sensor.
184  * @return The sensor type for a given handle.
185  */
getSensorTypeFromSensorHandle(uint32_t handle)186 constexpr SensorType getSensorTypeFromSensorHandle(uint32_t handle) {
187   return (handle > static_cast<uint32_t>(SensorType::Unknown)
188           && handle < static_cast<uint32_t>(SensorType::SENSOR_TYPE_COUNT))
189       ? static_cast<SensorType>(handle) : SensorType::Unknown;
190 }
191 
192 /**
193  * Obtains the temperature sensor type of the specified sensor type.
194  *
195  * @param sensorType The sensor type to obtain its temperature sensor type for.
196  * @return The temperature sensor type or SensorType::Unknown if not supported
197  *         by CHRE.
198  */
199 SensorType getTempSensorType(SensorType sensorType);
200 
201 /**
202  * Maps a sensorType to its SensorSampleType.
203  *
204  * @param sensorType The type of the sensor to obtain its SensorSampleType for.
205  * @return The SensorSampleType of the sensorType.
206  */
207 SensorSampleType getSensorSampleTypeFromSensorType(SensorType sensorType);
208 
209 /**
210  * This SensorMode is designed to wrap constants provided by the CHRE API to
211  * imrpove type-safety. The details of these modes are left to the CHRE API mode
212  * definitions contained in the chreSensorConfigureMode enum.
213  */
214 enum class SensorMode {
215   Off,
216   ActiveContinuous,
217   ActiveOneShot,
218   PassiveContinuous,
219   PassiveOneShot,
220 };
221 
222 /**
223  * @return true if the sensor mode is considered to be active and would cause a
224  *         sensor to be powered on in order to get sensor data.
225  */
sensorModeIsActive(SensorMode sensorMode)226 constexpr bool sensorModeIsActive(SensorMode sensorMode) {
227   return (sensorMode == SensorMode::ActiveContinuous
228       || sensorMode == SensorMode::ActiveOneShot);
229 }
230 
231 /**
232  * @return true if the sensor mode is considered to be passive and would not
233  *         cause a sensor to be powered on in order to get sensor data.
234  */
sensorModeIsPassive(SensorMode sensorMode)235 constexpr bool sensorModeIsPassive(SensorMode sensorMode) {
236   return (sensorMode == SensorMode::PassiveContinuous
237       || sensorMode == SensorMode::PassiveOneShot);
238 }
239 
240 /**
241  * @return true if the sensor mode is considered to be contunuous.
242  */
sensorModeIsContinuous(SensorMode sensorMode)243 constexpr bool sensorModeIsContinuous(SensorMode sensorMode) {
244   return (sensorMode == SensorMode::ActiveContinuous
245       || sensorMode == SensorMode::PassiveContinuous);
246 }
247 
248 /**
249  * @return true if the sensor mode is considered to be one-shot.
250  */
sensorModeIsOneShot(SensorMode sensorMode)251 constexpr bool sensorModeIsOneShot(SensorMode sensorMode) {
252   return (sensorMode == SensorMode::ActiveOneShot
253       || sensorMode == SensorMode::PassiveOneShot);
254 }
255 
256 /**
257  * Translates a CHRE API enum sensor mode to a SensorMode. This function also
258  * performs input validation and will default to SensorMode::Off if the provided
259  * value is not a valid enum value.
260  *
261  * @param enumSensorMode A potentially unsafe CHRE API enum sensor mode.
262  * @return Returns a SensorMode given a CHRE API enum sensor mode.
263  */
264 SensorMode getSensorModeFromEnum(enum chreSensorConfigureMode enumSensorMode);
265 
266 /**
267  * Indicates whether the sensor type is a one-shot sensor.
268  *
269  * @param sensorType The sensor type of the sensor.
270  * @return true if the sensor is a one-shot sensor.
271  */
272 bool sensorTypeIsOneShot(SensorType sensorType);
273 
274 /**
275  * Indicates whether the sensor type is an on-change sensor.
276  *
277  * @param sensorType The sensor type of the sensor.
278  * @return true if the sensor is an on-change sensor.
279  */
280 bool sensorTypeIsOnChange(SensorType sensorType);
281 
282 /**
283  * Indicates whether the sensor type is a continuous sensor.
284  *
285  * @param sensorType The sensor type of the sensor.
286  * @return true if the sensor is a continuous sensor.
287  */
288 bool sensorTypeIsContinuous(SensorType sensorType);
289 
290 /**
291  * Indicates whether the sensor type reports bias events.
292  *
293  * @param sensorType The sensor type of the sensor.
294  * @return true if the sensor reports bias events.
295  */
296 bool sensorTypeReportsBias(SensorType sensorType);
297 
298 /**
299  * @param sensorType The sensor type.
300  * @param eventType A non-null pointer to where the event type is stored.
301  *
302  * @return true if the sensor type reports bias events.
303  */
304 bool getSensorBiasEventType(SensorType sensorType, uint16_t *eventType);
305 
306 /**
307  * @param sensorType The sensor type.
308  *
309  * @return true if the sensor is a runtime-calibrated sensor.
310  */
311 bool sensorTypeIsCalibrated(SensorType sensorType);
312 
313 /**
314  * @param sensorType The sensor type.
315  *
316  * @return The corresponding runtime-calibrated sensor type. If the sensor does
317  *     not have one, then the input sensorType is returned.
318  */
319 SensorType toCalibratedSensorType(SensorType sensorType);
320 
321 /**
322  * @param sensorType The sensor type.
323  *
324  * @return The corresponding uncalibrated sensor type. If the sensor does not
325  *     have one, then the input sensorType is returned.
326  */
327 SensorType toUncalibratedSensorType(SensorType sensorType);
328 
329 /**
330  * @param sensorType The sensor type.
331  *
332  * @return true if the sensor type is for a valid sensor.
333  */
isValidSensorType(SensorType sensorType)334 inline bool isValidSensorType(SensorType sensorType) {
335   // TODO: Consider asserting that sensorType < SensorType::SENSOR_TYPE_COUNT
336   //       once assertion can be enabled without costing extra memory overhead.
337   return sensorType > SensorType::Unknown
338       && sensorType < SensorType::SENSOR_TYPE_COUNT;
339 }
340 
341 }  // namespace chre
342 
343 #endif  // CHRE_CORE_SENSOR_TYPE_H_
344