• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 #include "chre/core/sensor_type_helpers.h"
18 
19 #include <cinttypes>
20 
21 #include "chre/platform/assert.h"
22 #include "chre_api/chre.h"
23 
24 namespace chre {
25 
getReportingMode(uint8_t sensorType)26 ReportingMode SensorTypeHelpers::getReportingMode(uint8_t sensorType) {
27   if (isVendorSensorType(sensorType)) {
28     return getVendorSensorReportingMode(sensorType);
29   }
30 
31   switch (sensorType) {
32     case CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT:
33     case CHRE_SENSOR_TYPE_STATIONARY_DETECT:
34     case CHRE_SENSOR_TYPE_SIGNIFICANT_MOTION:
35       return ReportingMode::OneShot;
36     case CHRE_SENSOR_TYPE_LIGHT:
37     case CHRE_SENSOR_TYPE_PROXIMITY:
38     case CHRE_SENSOR_TYPE_STEP_COUNTER:
39     case CHRE_SENSOR_TYPE_HINGE_ANGLE:
40       return ReportingMode::OnChange;
41     default:
42       return ReportingMode::Continuous;
43   }
44 }
45 
isCalibrated(uint8_t sensorType)46 bool SensorTypeHelpers::isCalibrated(uint8_t sensorType) {
47   if (isVendorSensorType(sensorType)) {
48     return getVendorSensorIsCalibrated(sensorType);
49   }
50 
51   switch (sensorType) {
52     case CHRE_SENSOR_TYPE_ACCELEROMETER:
53     case CHRE_SENSOR_TYPE_GYROSCOPE:
54     case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD:
55       return true;
56     default:
57       return false;
58   }
59 }
60 
getBiasEventType(uint8_t sensorType,uint16_t * eventType)61 bool SensorTypeHelpers::getBiasEventType(uint8_t sensorType,
62                                          uint16_t *eventType) {
63   CHRE_ASSERT(eventType != nullptr);
64 
65   if (isVendorSensorType(sensorType)) {
66     return getVendorSensorBiasEventType(sensorType, eventType);
67   }
68 
69   bool success = true;
70   switch (sensorType) {
71     case CHRE_SENSOR_TYPE_ACCELEROMETER:
72       *eventType = CHRE_EVENT_SENSOR_ACCELEROMETER_BIAS_INFO;
73       break;
74     case CHRE_SENSOR_TYPE_GYROSCOPE:
75       *eventType = CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO;
76       break;
77     case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD:
78       *eventType = CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO;
79       break;
80     case CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER:
81       *eventType = CHRE_EVENT_SENSOR_UNCALIBRATED_ACCELEROMETER_BIAS_INFO;
82       break;
83     case CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE:
84       *eventType = CHRE_EVENT_SENSOR_UNCALIBRATED_GYROSCOPE_BIAS_INFO;
85       break;
86     case CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD:
87       *eventType = CHRE_EVENT_SENSOR_UNCALIBRATED_GEOMAGNETIC_FIELD_BIAS_INFO;
88       break;
89     default:
90       success = false;
91   }
92 
93   return success;
94 }
95 
getLastEventSize(uint8_t sensorType)96 size_t SensorTypeHelpers::getLastEventSize(uint8_t sensorType) {
97   if (isOnChange(sensorType)) {
98     if (isVendorSensorType(sensorType)) {
99       return getVendorSensorLastEventSize(sensorType);
100     }
101 
102     switch (sensorType) {
103       case CHRE_SENSOR_TYPE_ACCELEROMETER:
104       case CHRE_SENSOR_TYPE_GYROSCOPE:
105       case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD:
106       case CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER:
107       case CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE:
108       case CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD:
109         return sizeof(chreSensorThreeAxisData);
110       case CHRE_SENSOR_TYPE_PRESSURE:
111       case CHRE_SENSOR_TYPE_LIGHT:
112       case CHRE_SENSOR_TYPE_ACCELEROMETER_TEMPERATURE:
113       case CHRE_SENSOR_TYPE_GYROSCOPE_TEMPERATURE:
114       case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD_TEMPERATURE:
115       case CHRE_SENSOR_TYPE_HINGE_ANGLE:
116         return sizeof(chreSensorFloatData);
117       case CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT:
118       case CHRE_SENSOR_TYPE_STATIONARY_DETECT:
119       case CHRE_SENSOR_TYPE_STEP_DETECT:
120       case CHRE_SENSOR_TYPE_SIGNIFICANT_MOTION:
121         return sizeof(chreSensorOccurrenceData);
122       case CHRE_SENSOR_TYPE_PROXIMITY:
123         return sizeof(chreSensorByteData);
124       case CHRE_SENSOR_TYPE_STEP_COUNTER:
125         return sizeof(chreSensorUint64Data);
126       default:
127         // Update implementation to prevent undefined from being used.
128         CHRE_ASSERT(false);
129         return 0;
130     }
131   }
132   return 0;
133 }
134 
getSensorTypeName(uint8_t sensorType)135 const char *SensorTypeHelpers::getSensorTypeName(uint8_t sensorType) {
136   if (isVendorSensorType(sensorType)) {
137     return getVendorSensorTypeName(sensorType);
138   }
139 
140   switch (sensorType) {
141     case CHRE_SENSOR_TYPE_INVALID:
142       return "Unknown";
143     case CHRE_SENSOR_TYPE_ACCELEROMETER:
144       return "Accelerometer";
145     case CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT:
146       return "Instant Motion";
147     case CHRE_SENSOR_TYPE_STATIONARY_DETECT:
148       return "Stationary Detect";
149     case CHRE_SENSOR_TYPE_GYROSCOPE:
150       return "Gyroscope";
151     case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD:
152       return "Geomagnetic Field";
153     case CHRE_SENSOR_TYPE_PRESSURE:
154       return "Pressure";
155     case CHRE_SENSOR_TYPE_LIGHT:
156       return "Light";
157     case CHRE_SENSOR_TYPE_PROXIMITY:
158       return "Proximity";
159     case CHRE_SENSOR_TYPE_SIGNIFICANT_MOTION:
160       return "Significant Motion";
161     case CHRE_SENSOR_TYPE_STEP_DETECT:
162       return "Step Detect";
163     case CHRE_SENSOR_TYPE_STEP_COUNTER:
164       return "Step Counter";
165     case CHRE_SENSOR_TYPE_HINGE_ANGLE:
166       return "Hinge Angle";
167     case CHRE_SENSOR_TYPE_ACCELEROMETER_TEMPERATURE:
168       return "Accelerometer Temp";
169     case CHRE_SENSOR_TYPE_GYROSCOPE_TEMPERATURE:
170       return "Gyroscope Temp";
171     case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD_TEMPERATURE:
172       return "Geomagnetic Field Temp";
173     case CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER:
174       return "Uncal Accelerometer";
175     case CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE:
176       return "Uncal Gyroscope";
177     case CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD:
178       return "Uncal Geomagnetic Field";
179     default:
180       CHRE_ASSERT(false);
181       return "";
182   }
183 }
184 
toUncalibratedSensorType(uint8_t sensorType)185 uint8_t SensorTypeHelpers::toUncalibratedSensorType(uint8_t sensorType) {
186   switch (sensorType) {
187     case CHRE_SENSOR_TYPE_ACCELEROMETER:
188       return CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER;
189     case CHRE_SENSOR_TYPE_GYROSCOPE:
190       return CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE;
191     case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD:
192       return CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD;
193     default:
194       /* empty */
195       break;
196   }
197 
198   return sensorType;
199 }
200 
getLastSample(uint8_t sensorType,const ChreSensorData * event,ChreSensorData * lastEvent)201 void SensorTypeHelpers::getLastSample(uint8_t sensorType,
202                                       const ChreSensorData *event,
203                                       ChreSensorData *lastEvent) {
204   if (!isOnChange(sensorType)) {
205     // no op
206     return;
207   }
208 
209   if (isVendorSensorType(sensorType)) {
210     getVendorLastSample(sensorType, event, lastEvent);
211   } else {
212     switch (sensorType) {
213       case CHRE_SENSOR_TYPE_LIGHT:
214       case CHRE_SENSOR_TYPE_HINGE_ANGLE:
215         copyLastSample<chreSensorFloatData>(&event->floatData,
216                                             &lastEvent->floatData);
217         break;
218       case CHRE_SENSOR_TYPE_PROXIMITY:
219         copyLastSample<chreSensorByteData>(&event->byteData,
220                                            &lastEvent->byteData);
221         break;
222       case CHRE_SENSOR_TYPE_STEP_COUNTER:
223         copyLastSample<chreSensorUint64Data>(&event->uint64Data,
224                                              &lastEvent->uint64Data);
225         break;
226       default:
227         LOGE("Unhandled sensor type %" PRIu8, sensorType);
228     }
229   }
230 }
231 
232 }  // namespace chre
233