1 /* 2 * Copyright (C) 2009 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 #define LOG_TAG "sensor" 18 #include <utils/Log.h> 19 20 #include <android/looper.h> 21 #include <android/sensor.h> 22 #include <android/sharedmem.h> 23 #include <cutils/native_handle.h> 24 #include <sensor/Sensor.h> 25 #include <sensor/SensorManager.h> 26 #include <sensor/SensorEventQueue.h> 27 #include <utils/Looper.h> 28 #include <utils/RefBase.h> 29 #include <utils/Timers.h> 30 #include <vndk/hardware_buffer.h> 31 32 #include <poll.h> 33 34 using android::sp; 35 using android::Sensor; 36 using android::SensorManager; 37 using android::SensorEventQueue; 38 using android::String8; 39 using android::String16; 40 41 /*****************************************************************************/ 42 #define ERROR_INVALID_PARAMETER(message) ALOGE("%s: " message, __func__) 43 44 // frequently used checks 45 #define RETURN_IF_MANAGER_IS_NULL(retval) do {\ 46 if (manager == nullptr) { \ 47 ERROR_INVALID_PARAMETER("manager cannot be NULL"); \ 48 return retval; \ 49 } \ 50 } while (false) 51 #define RETURN_IF_SENSOR_IS_NULL(retval) do {\ 52 if (sensor == nullptr) { \ 53 ERROR_INVALID_PARAMETER("sensor cannot be NULL"); \ 54 return retval; \ 55 } \ 56 } while (false) 57 #define RETURN_IF_QUEUE_IS_NULL(retval) do {\ 58 if (queue == nullptr) { \ 59 ERROR_INVALID_PARAMETER("queue cannot be NULL"); \ 60 return retval; \ 61 } \ 62 } while (false) 63 64 ASensorManager* ASensorManager_getInstance() { 65 return ASensorManager_getInstanceForPackage(nullptr); 66 } 67 68 ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) { 69 if (packageName) { 70 return &SensorManager::getInstanceForPackage(String16(packageName)); 71 } else { 72 return &SensorManager::getInstanceForPackage(String16()); 73 } 74 } 75 76 int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { 77 RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 78 Sensor const* const* l; 79 int c = static_cast<SensorManager*>(manager)->getSensorList(&l); 80 if (list) { 81 *list = reinterpret_cast<ASensorList>(l); 82 } 83 return c; 84 } 85 86 ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) { 87 RETURN_IF_MANAGER_IS_NULL(nullptr); 88 return static_cast<SensorManager*>(manager)->getDefaultSensor(type); 89 } 90 91 ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp) { 92 RETURN_IF_MANAGER_IS_NULL(nullptr); 93 Sensor const* const* sensorList; 94 size_t size = static_cast<SensorManager*>(manager)->getSensorList(&sensorList); 95 for (size_t i = 0; i < size; ++i) { 96 if (ASensor_getType(sensorList[i]) == type && 97 ASensor_isWakeUpSensor(sensorList[i]) == wakeUp) { 98 return reinterpret_cast<ASensor const *>(sensorList[i]); 99 } 100 } 101 return nullptr; 102 } 103 104 ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, 105 ALooper* looper, int ident, ALooper_callbackFunc callback, void* data) { 106 RETURN_IF_MANAGER_IS_NULL(nullptr); 107 108 if (looper == nullptr) { 109 ERROR_INVALID_PARAMETER("looper cannot be NULL"); 110 return nullptr; 111 } 112 113 sp<SensorEventQueue> queue = 114 static_cast<SensorManager*>(manager)->createEventQueue(); 115 if (queue != 0) { 116 ALooper_addFd(looper, queue->getFd(), ident, ALOOPER_EVENT_INPUT, callback, data); 117 queue->looper = looper; 118 queue->incStrong(manager); 119 } 120 return static_cast<ASensorEventQueue*>(queue.get()); 121 } 122 123 int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue) { 124 RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 125 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 126 127 sp<SensorEventQueue> q = static_cast<SensorEventQueue*>(queue); 128 ALooper_removeFd(q->looper, q->getFd()); 129 q->decStrong(manager); 130 return 0; 131 } 132 133 int ASensorManager_createSharedMemoryDirectChannel(ASensorManager *manager, int fd, size_t size) { 134 RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 135 136 if (fd < 0) { 137 ERROR_INVALID_PARAMETER("fd is invalid."); 138 return android::BAD_VALUE; 139 } 140 141 if (size < sizeof(ASensorEvent)) { 142 ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); 143 return android::BAD_VALUE; 144 } 145 146 native_handle_t *resourceHandle = native_handle_create(1 /* nFd */, 0 /* nInt */); 147 if (!resourceHandle) { 148 return android::NO_MEMORY; 149 } 150 151 resourceHandle->data[0] = fd; 152 int ret = static_cast<SensorManager *>(manager)->createDirectChannel( 153 size, ASENSOR_DIRECT_CHANNEL_TYPE_SHARED_MEMORY, resourceHandle); 154 native_handle_delete(resourceHandle); 155 return ret; 156 } 157 158 int ASensorManager_createHardwareBufferDirectChannel( 159 ASensorManager *manager, AHardwareBuffer const *buffer, size_t size) { 160 RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 161 162 if (buffer == nullptr) { 163 ERROR_INVALID_PARAMETER("buffer cannot be NULL"); 164 return android::BAD_VALUE; 165 } 166 167 if (size < sizeof(ASensorEvent)) { 168 ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); 169 return android::BAD_VALUE; 170 } 171 172 const native_handle_t *resourceHandle = AHardwareBuffer_getNativeHandle(buffer); 173 if (!resourceHandle) { 174 return android::NO_MEMORY; 175 } 176 177 return static_cast<SensorManager *>(manager)->createDirectChannel( 178 size, ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER, resourceHandle); 179 } 180 181 void ASensorManager_destroyDirectChannel(ASensorManager *manager, int channelId) { 182 RETURN_IF_MANAGER_IS_NULL(void()); 183 184 static_cast<SensorManager *>(manager)->destroyDirectChannel(channelId); 185 } 186 187 int ASensorManager_configureDirectReport( 188 ASensorManager *manager, ASensor const *sensor, int channelId, int rate) { 189 RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); 190 191 int sensorHandle; 192 if (sensor == nullptr) { 193 if (rate != ASENSOR_DIRECT_RATE_STOP) { 194 ERROR_INVALID_PARAMETER( 195 "sensor cannot be null when rate is not ASENSOR_DIRECT_RATE_STOP"); 196 return android::BAD_VALUE; 197 } 198 sensorHandle = -1; 199 } else { 200 sensorHandle = static_cast<Sensor const *>(sensor)->getHandle(); 201 } 202 return static_cast<SensorManager *>(manager)->configureDirectChannel( 203 channelId, sensorHandle, rate); 204 } 205 206 /*****************************************************************************/ 207 208 int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor, 209 int32_t samplingPeriodUs, int64_t maxBatchReportLatencyUs) { 210 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 211 RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 212 if (samplingPeriodUs < 0 || maxBatchReportLatencyUs < 0) { 213 ERROR_INVALID_PARAMETER("samplingPeriodUs and maxBatchReportLatencyUs cannot be negative"); 214 return android::BAD_VALUE; 215 } 216 217 return static_cast<SensorEventQueue*>(queue)->enableSensor( 218 static_cast<Sensor const*>(sensor)->getHandle(), samplingPeriodUs, 219 maxBatchReportLatencyUs, 0); 220 } 221 222 int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor) { 223 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 224 RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 225 226 return static_cast<SensorEventQueue*>(queue)->enableSensor( 227 static_cast<Sensor const*>(sensor)); 228 } 229 230 int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor) { 231 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 232 RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 233 234 return static_cast<SensorEventQueue*>(queue)->disableSensor( 235 static_cast<Sensor const*>(sensor)); 236 } 237 238 int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec) { 239 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 240 RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); 241 242 if (usec < 0) { 243 ERROR_INVALID_PARAMETER("usec cannot be negative"); 244 return android::BAD_VALUE; 245 } 246 247 return static_cast<SensorEventQueue*>(queue)->setEventRate( 248 static_cast<Sensor const*>(sensor), us2ns(usec)); 249 } 250 251 int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) { 252 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 253 254 struct pollfd pfd; 255 pfd.fd = static_cast<SensorEventQueue*>(queue)->getFd(); 256 pfd.events = POLLIN; 257 pfd.revents = 0; 258 259 int nfd = poll(&pfd, 1, 0); 260 261 if (nfd < 0) 262 return -errno; 263 264 if (pfd.revents != POLLIN) 265 return -1; 266 267 return (nfd == 0) ? 0 : 1; 268 } 269 270 ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count) { 271 RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); 272 if (events == nullptr) { 273 ERROR_INVALID_PARAMETER("events cannot be NULL"); 274 return android::BAD_VALUE; 275 } 276 277 ssize_t actual = static_cast<SensorEventQueue*>(queue)->read(events, count); 278 if (actual > 0) { 279 static_cast<SensorEventQueue*>(queue)->sendAck(events, actual); 280 } 281 return actual; 282 } 283 284 /*****************************************************************************/ 285 286 const char* ASensor_getName(ASensor const* sensor) { 287 RETURN_IF_SENSOR_IS_NULL(nullptr); 288 return static_cast<Sensor const*>(sensor)->getName().string(); 289 } 290 291 const char* ASensor_getVendor(ASensor const* sensor) { 292 RETURN_IF_SENSOR_IS_NULL(nullptr); 293 return static_cast<Sensor const*>(sensor)->getVendor().string(); 294 } 295 296 int ASensor_getType(ASensor const* sensor) { 297 RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID); 298 return static_cast<Sensor const*>(sensor)->getType(); 299 } 300 301 float ASensor_getResolution(ASensor const* sensor) { 302 RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID); 303 return static_cast<Sensor const*>(sensor)->getResolution(); 304 } 305 306 int ASensor_getMinDelay(ASensor const* sensor) { 307 RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID); 308 return static_cast<Sensor const*>(sensor)->getMinDelay(); 309 } 310 311 int ASensor_getFifoMaxEventCount(ASensor const* sensor) { 312 RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 313 return static_cast<Sensor const*>(sensor)->getFifoMaxEventCount(); 314 } 315 316 int ASensor_getFifoReservedEventCount(ASensor const* sensor) { 317 RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); 318 return static_cast<Sensor const*>(sensor)->getFifoReservedEventCount(); 319 } 320 321 const char* ASensor_getStringType(ASensor const* sensor) { 322 RETURN_IF_SENSOR_IS_NULL(nullptr); 323 return static_cast<Sensor const*>(sensor)->getStringType().string(); 324 } 325 326 int ASensor_getReportingMode(ASensor const* sensor) { 327 RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID); 328 return static_cast<Sensor const*>(sensor)->getReportingMode(); 329 } 330 331 bool ASensor_isWakeUpSensor(ASensor const* sensor) { 332 RETURN_IF_SENSOR_IS_NULL(false); 333 return static_cast<Sensor const*>(sensor)->isWakeUpSensor(); 334 } 335 336 bool ASensor_isDirectChannelTypeSupported(ASensor const *sensor, int channelType) { 337 RETURN_IF_SENSOR_IS_NULL(false); 338 return static_cast<Sensor const *>(sensor)->isDirectChannelTypeSupported(channelType); 339 } 340 341 int ASensor_getHighestDirectReportRateLevel(ASensor const *sensor) { 342 RETURN_IF_SENSOR_IS_NULL(ASENSOR_DIRECT_RATE_STOP); 343 return static_cast<Sensor const *>(sensor)->getHighestDirectReportRateLevel(); 344 } 345