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