blob: ee6373592119caf826a77b3be116bc2b4c66f3db [file] [log] [blame]
Mathias Agopianf001c922010-11-11 17:58:51 -08001/*
2 * Copyright (C) 2010 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 */
Brian Stacka28e9212018-09-19 15:20:30 -070016
Peng Xu3889e6e2017-03-02 19:10:38 -080017#include "SensorDevice.h"
Brian Stacka28e9212018-09-19 15:20:30 -070018
19#include "android/hardware/sensors/2.0/types.h"
Anthony Stangee38a1412020-02-13 21:28:37 -050020#include "android/hardware/sensors/2.1/types.h"
21#include "convertV2_1.h"
Mathias Agopianf001c922010-11-11 17:58:51 -080022
Steven Morelandd15c0302016-12-20 11:14:50 -080023#include <android-base/logging.h>
Mike Ma24743862020-01-29 00:36:55 -080024#include <android/util/ProtoOutputStream.h>
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000025#include <cutils/atomic.h>
Mike Ma24743862020-01-29 00:36:55 -080026#include <frameworks/base/core/proto/android/service/sensor_service.proto.h>
Peng Xu3889e6e2017-03-02 19:10:38 -080027#include <sensors/convert.h>
Ashutosh Joshi5cafc1e2017-02-09 21:44:04 +000028#include <utils/Errors.h>
29#include <utils/Singleton.h>
Steven Morelandd3335112016-12-20 11:14:50 -080030
Peng Xu3889e6e2017-03-02 19:10:38 -080031#include <chrono>
32#include <cinttypes>
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000033#include <cstddef>
Peng Xu3889e6e2017-03-02 19:10:38 -080034#include <thread>
Steven Morelandd15c0302016-12-20 11:14:50 -080035
Brian Stack12f4d322018-09-14 16:18:59 -070036using namespace android::hardware::sensors;
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000037using android::hardware::Return;
Mike Ma24743862020-01-29 00:36:55 -080038using android::util::ProtoOutputStream;
Peng Xu2bec6232016-07-01 17:13:10 -070039
Mathias Agopianf001c922010-11-11 17:58:51 -080040namespace android {
41// ---------------------------------------------------------------------------
Mathias Agopianf001c922010-11-11 17:58:51 -080042
43ANDROID_SINGLETON_STATIC_INSTANCE(SensorDevice)
44
Brian Duddie8e6f31c2019-05-29 13:19:13 -070045namespace {
46
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000047template <typename EnumType>
Brian Stack156da082018-10-01 15:58:53 -070048constexpr typename std::underlying_type<EnumType>::type asBaseType(EnumType value) {
49 return static_cast<typename std::underlying_type<EnumType>::type>(value);
50}
51
52// Used internally by the framework to wake the Event FMQ. These values must start after
53// the last value of EventQueueFlagBits
54enum EventQueueFlagBitsInternal : uint32_t {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000055 INTERNAL_WAKE = 1 << 16,
Brian Stack156da082018-10-01 15:58:53 -070056};
57
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000058enum DevicePrivateBase : int32_t {
59 DEVICE_PRIVATE_BASE = 65536,
Brian Stackbbab1ea2018-10-01 10:49:07 -070060};
61
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000062} // anonymous namespace
63
64SensorDevice::SensorDevice() {
65 if (!connectHalService()) {
Peng Xua8fad9b2017-03-17 12:20:27 -070066 return;
67 }
Ashutosh Joshifea2d262017-04-19 23:27:49 -070068
Brian Stack156da082018-10-01 15:58:53 -070069 initializeSensorList();
70
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000071 mIsDirectReportSupported = (mHalWrapper->unregisterDirectChannel(-1) != INVALID_OPERATION);
Brian Stack156da082018-10-01 15:58:53 -070072}
73
74void SensorDevice::initializeSensorList() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000075 if (mHalWrapper == nullptr) {
76 return;
77 }
Peng Xua8fad9b2017-03-17 12:20:27 -070078
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000079 auto list = mHalWrapper->getSensorsList();
80 const size_t count = list.size();
Anthony Stange12924862020-03-20 10:46:15 -040081
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000082 mActivationCount.setCapacity(count);
83 Info model;
84 for (size_t i = 0; i < count; i++) {
85 sensor_t sensor = list[i];
Anthony Stange12924862020-03-20 10:46:15 -040086
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000087 if (sensor.type < DEVICE_PRIVATE_BASE) {
88 sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor);
89
90 // Some sensors don't have a default resolution and will be left at 0.
91 // Don't crash in this case since CTS will verify that devices don't go to
92 // production with a resolution of 0.
93 if (sensor.resolution != 0) {
94 float quantizedRange = sensor.maxRange;
95 SensorDeviceUtils::quantizeValue(&quantizedRange, sensor.resolution,
96 /*factor=*/1);
97 // Only rewrite maxRange if the requantization produced a "significant"
98 // change, which is fairly arbitrarily defined as resolution / 8.
99 // Smaller deltas are permitted, as they may simply be due to floating
100 // point representation error, etc.
101 if (fabsf(sensor.maxRange - quantizedRange) > sensor.resolution / 8) {
102 ALOGW("%s's max range %.12f is not a multiple of the resolution "
103 "%.12f - updated to %.12f",
104 sensor.name, sensor.maxRange, sensor.resolution, quantizedRange);
105 sensor.maxRange = quantizedRange;
Peng Xua8fad9b2017-03-17 12:20:27 -0700106 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000107 } else {
108 // Don't crash here or the device will go into a crashloop.
109 ALOGW("%s should have a non-zero resolution", sensor.name);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000110 }
111 }
Peng Xua8fad9b2017-03-17 12:20:27 -0700112
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000113 // Check and clamp power if it is 0 (or close)
114 constexpr float MIN_POWER_MA = 0.001; // 1 microAmp
115 if (sensor.power < MIN_POWER_MA) {
116 ALOGI("%s's reported power %f invalid, clamped to %f", sensor.name, sensor.power,
117 MIN_POWER_MA);
118 sensor.power = MIN_POWER_MA;
Peng Xu3889e6e2017-03-02 19:10:38 -0800119 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000120 mSensorList.push_back(sensor);
Peng Xu1a00e2d2017-09-27 23:08:30 -0700121
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000122 mActivationCount.add(list[i].handle, model);
123
124 // Only disable all sensors on HAL 1.0 since HAL 2.0
125 // handles this in its initialize method
126 if (!mHalWrapper->supportsMessageQueues()) {
127 mHalWrapper->activate(list[i].handle, 0 /* enabled */);
Peng Xu1a00e2d2017-09-27 23:08:30 -0700128 }
Steven Morelandd15c0302016-12-20 11:14:50 -0800129 }
Steven Morelandd15c0302016-12-20 11:14:50 -0800130}
131
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000132SensorDevice::~SensorDevice() {}
Brian Stack979887b2018-09-19 15:27:48 -0700133
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000134bool SensorDevice::connectHalService() {
135 std::unique_ptr<ISensorHalWrapper> hidl_wrapper = std::make_unique<HidlSensorHalWrapper>();
136 if (hidl_wrapper->connect(this)) {
137 mHalWrapper = std::move(hidl_wrapper);
138 return true;
Anthony Stangee38a1412020-02-13 21:28:37 -0500139 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000140 // TODO: check aidl connection;
141 return false;
Brian Stack12f4d322018-09-14 16:18:59 -0700142}
143
Brian Stack156da082018-10-01 15:58:53 -0700144void SensorDevice::prepareForReconnect() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000145 mHalWrapper->prepareForReconnect();
Brian Stack156da082018-10-01 15:58:53 -0700146}
147
148void SensorDevice::reconnect() {
149 Mutex::Autolock _l(mLock);
Brian Stack156da082018-10-01 15:58:53 -0700150
151 auto previousActivations = mActivationCount;
152 auto previousSensorList = mSensorList;
153
154 mActivationCount.clear();
155 mSensorList.clear();
156
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000157 if (mHalWrapper->connect(this)) {
Brian Stack156da082018-10-01 15:58:53 -0700158 initializeSensorList();
159
160 if (sensorHandlesChanged(previousSensorList, mSensorList)) {
161 LOG_ALWAYS_FATAL("Sensor handles changed, cannot re-enable sensors.");
162 } else {
163 reactivateSensors(previousActivations);
164 }
165 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000166 mHalWrapper->mReconnecting = false;
Brian Stack156da082018-10-01 15:58:53 -0700167}
168
Arthur Ishiguro4f1dd8a2021-11-12 17:21:24 +0000169bool SensorDevice::sensorHandlesChanged(const std::vector<sensor_t>& oldSensorList,
170 const std::vector<sensor_t>& newSensorList) {
Brian Stack156da082018-10-01 15:58:53 -0700171 bool didChange = false;
172
173 if (oldSensorList.size() != newSensorList.size()) {
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700174 ALOGI("Sensor list size changed from %zu to %zu", oldSensorList.size(),
175 newSensorList.size());
Brian Stack156da082018-10-01 15:58:53 -0700176 didChange = true;
177 }
178
179 for (size_t i = 0; i < newSensorList.size() && !didChange; i++) {
180 bool found = false;
181 const sensor_t& newSensor = newSensorList[i];
182 for (size_t j = 0; j < oldSensorList.size() && !found; j++) {
183 const sensor_t& prevSensor = oldSensorList[j];
184 if (prevSensor.handle == newSensor.handle) {
185 found = true;
186 if (!sensorIsEquivalent(prevSensor, newSensor)) {
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700187 ALOGI("Sensor %s not equivalent to previous version", newSensor.name);
Brian Stack156da082018-10-01 15:58:53 -0700188 didChange = true;
189 }
190 }
191 }
192
193 if (!found) {
194 // Could not find the new sensor in the old list of sensors, the lists must
195 // have changed.
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700196 ALOGI("Sensor %s (handle %d) did not exist before", newSensor.name, newSensor.handle);
Brian Stack156da082018-10-01 15:58:53 -0700197 didChange = true;
198 }
199 }
200 return didChange;
201}
202
203bool SensorDevice::sensorIsEquivalent(const sensor_t& prevSensor, const sensor_t& newSensor) {
204 bool equivalent = true;
205 if (prevSensor.handle != newSensor.handle ||
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000206 (strcmp(prevSensor.vendor, newSensor.vendor) != 0) ||
207 (strcmp(prevSensor.stringType, newSensor.stringType) != 0) ||
208 (strcmp(prevSensor.requiredPermission, newSensor.requiredPermission) != 0) ||
209 (prevSensor.version != newSensor.version) || (prevSensor.type != newSensor.type) ||
210 (std::abs(prevSensor.maxRange - newSensor.maxRange) > 0.001f) ||
211 (std::abs(prevSensor.resolution - newSensor.resolution) > 0.001f) ||
212 (std::abs(prevSensor.power - newSensor.power) > 0.001f) ||
213 (prevSensor.minDelay != newSensor.minDelay) ||
214 (prevSensor.fifoReservedEventCount != newSensor.fifoReservedEventCount) ||
215 (prevSensor.fifoMaxEventCount != newSensor.fifoMaxEventCount) ||
216 (prevSensor.maxDelay != newSensor.maxDelay) || (prevSensor.flags != newSensor.flags)) {
Brian Stack156da082018-10-01 15:58:53 -0700217 equivalent = false;
218 }
219 return equivalent;
220}
221
222void SensorDevice::reactivateSensors(const DefaultKeyedVector<int, Info>& previousActivations) {
223 for (size_t i = 0; i < mSensorList.size(); i++) {
224 int handle = mSensorList[i].handle;
225 ssize_t activationIndex = previousActivations.indexOfKey(handle);
226 if (activationIndex < 0 || previousActivations[activationIndex].numActiveClients() <= 0) {
227 continue;
228 }
229
230 const Info& info = previousActivations[activationIndex];
231 for (size_t j = 0; j < info.batchParams.size(); j++) {
232 const BatchParams& batchParams = info.batchParams[j];
233 status_t res = batchLocked(info.batchParams.keyAt(j), handle, 0 /* flags */,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000234 batchParams.mTSample, batchParams.mTBatch);
Brian Stack156da082018-10-01 15:58:53 -0700235
236 if (res == NO_ERROR) {
237 activateLocked(info.batchParams.keyAt(j), handle, true /* enabled */);
238 }
239 }
240 }
241}
242
Peng Xu2576cb62016-01-20 00:22:09 -0800243void SensorDevice::handleDynamicSensorConnection(int handle, bool connected) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700244 // not need to check mSensors because this is is only called after successful poll()
Peng Xu2576cb62016-01-20 00:22:09 -0800245 if (connected) {
246 Info model;
247 mActivationCount.add(handle, model);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000248 mHalWrapper->activate(handle, 0 /* enabled */);
Peng Xu2576cb62016-01-20 00:22:09 -0800249 } else {
250 mActivationCount.removeItem(handle);
251 }
252}
253
Peng Xu6a2d3a02015-12-21 12:00:23 -0800254std::string SensorDevice::dump() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000255 if (mHalWrapper == nullptr) return "HAL not initialized\n";
Mathias Agopianf001c922010-11-11 17:58:51 -0800256
Peng Xu6a2d3a02015-12-21 12:00:23 -0800257 String8 result;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700258 result.appendFormat("Total %zu h/w sensors, %zu running %zu disabled clients:\n",
259 mSensorList.size(), mActivationCount.size(), mDisabledClients.size());
Ashutosh Joshi96b12d82017-03-15 16:27:12 -0700260
Peng Xua8fad9b2017-03-17 12:20:27 -0700261 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000262 for (const auto& s : mSensorList) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700263 int32_t handle = s.handle;
264 const Info& info = mActivationCount.valueFor(handle);
Brian Stackbce04d72019-03-21 10:54:10 -0700265 if (info.numActiveClients() == 0) continue;
Peng Xua8fad9b2017-03-17 12:20:27 -0700266
267 result.appendFormat("0x%08x) active-count = %zu; ", handle, info.batchParams.size());
268
269 result.append("sampling_period(ms) = {");
270 for (size_t j = 0; j < info.batchParams.size(); j++) {
Peng Xu2bec6232016-07-01 17:13:10 -0700271 const BatchParams& params = info.batchParams[j];
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700272 result.appendFormat("%.1f%s%s", params.mTSample / 1e6f,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000273 isClientDisabledLocked(info.batchParams.keyAt(j)) ? "(disabled)"
274 : "",
275 (j < info.batchParams.size() - 1) ? ", " : "");
Peng Xua8fad9b2017-03-17 12:20:27 -0700276 }
Peng Xu2bec6232016-07-01 17:13:10 -0700277 result.appendFormat("}, selected = %.2f ms; ", info.bestBatchParams.mTSample / 1e6f);
Peng Xua8fad9b2017-03-17 12:20:27 -0700278
279 result.append("batching_period(ms) = {");
280 for (size_t j = 0; j < info.batchParams.size(); j++) {
Peng Xu2bec6232016-07-01 17:13:10 -0700281 const BatchParams& params = info.batchParams[j];
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700282 result.appendFormat("%.1f%s%s", params.mTBatch / 1e6f,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000283 isClientDisabledLocked(info.batchParams.keyAt(j)) ? "(disabled)"
284 : "",
285 (j < info.batchParams.size() - 1) ? ", " : "");
Peng Xua8fad9b2017-03-17 12:20:27 -0700286 }
Peng Xu2bec6232016-07-01 17:13:10 -0700287 result.appendFormat("}, selected = %.2f ms\n", info.bestBatchParams.mTBatch / 1e6f);
Ashutosh Joshi96b12d82017-03-15 16:27:12 -0700288 }
289
Peng Xu6a2d3a02015-12-21 12:00:23 -0800290 return result.string();
Mathias Agopianf001c922010-11-11 17:58:51 -0800291}
292
Mike Ma24743862020-01-29 00:36:55 -0800293/**
294 * Dump debugging information as android.service.SensorDeviceProto protobuf message using
295 * ProtoOutputStream.
296 *
297 * See proto definition and some notes about ProtoOutputStream in
298 * frameworks/base/core/proto/android/service/sensor_service.proto
299 */
300void SensorDevice::dump(ProtoOutputStream* proto) const {
301 using namespace service::SensorDeviceProto;
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000302 if (mHalWrapper == nullptr) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000303 proto->write(INITIALIZED, false);
Mike Ma24743862020-01-29 00:36:55 -0800304 return;
305 }
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000306 proto->write(INITIALIZED, true);
307 proto->write(TOTAL_SENSORS, int(mSensorList.size()));
308 proto->write(ACTIVE_SENSORS, int(mActivationCount.size()));
Mike Ma24743862020-01-29 00:36:55 -0800309
310 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000311 for (const auto& s : mSensorList) {
Mike Ma24743862020-01-29 00:36:55 -0800312 int32_t handle = s.handle;
313 const Info& info = mActivationCount.valueFor(handle);
314 if (info.numActiveClients() == 0) continue;
315
316 uint64_t token = proto->start(SENSORS);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000317 proto->write(SensorProto::HANDLE, handle);
318 proto->write(SensorProto::ACTIVE_COUNT, int(info.batchParams.size()));
Mike Ma24743862020-01-29 00:36:55 -0800319 for (size_t j = 0; j < info.batchParams.size(); j++) {
320 const BatchParams& params = info.batchParams[j];
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000321 proto->write(SensorProto::SAMPLING_PERIOD_MS, params.mTSample / 1e6f);
322 proto->write(SensorProto::BATCHING_PERIOD_MS, params.mTBatch / 1e6f);
Mike Ma24743862020-01-29 00:36:55 -0800323 }
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000324 proto->write(SensorProto::SAMPLING_PERIOD_SELECTED, info.bestBatchParams.mTSample / 1e6f);
325 proto->write(SensorProto::BATCHING_PERIOD_SELECTED, info.bestBatchParams.mTBatch / 1e6f);
Mike Ma24743862020-01-29 00:36:55 -0800326 proto->end(token);
327 }
328}
329
Mathias Agopianf001c922010-11-11 17:58:51 -0800330ssize_t SensorDevice::getSensorList(sensor_t const** list) {
Steven Morelandd15c0302016-12-20 11:14:50 -0800331 *list = &mSensorList[0];
332
333 return mSensorList.size();
Mathias Agopianf001c922010-11-11 17:58:51 -0800334}
335
336status_t SensorDevice::initCheck() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000337 return mHalWrapper != nullptr ? NO_ERROR : NO_INIT;
Mathias Agopianf001c922010-11-11 17:58:51 -0800338}
339
340ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000341 if (mHalWrapper == nullptr) return NO_INIT;
Brian Stack156da082018-10-01 15:58:53 -0700342
Brian Stacka28e9212018-09-19 15:20:30 -0700343 ssize_t eventsRead = 0;
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000344 if (mHalWrapper->supportsMessageQueues()) {
345 eventsRead = mHalWrapper->pollFmq(buffer, count);
346 } else if (mHalWrapper->supportsPolling()) {
347 eventsRead = mHalWrapper->poll(buffer, count);
Brian Stacka28e9212018-09-19 15:20:30 -0700348 } else {
349 ALOGE("Must support polling or FMQ");
350 eventsRead = -1;
351 }
Arthur Ishiguro39e04c62021-12-26 18:40:16 +0000352
353 if (eventsRead > 0) {
354 for (ssize_t i = 0; i < eventsRead; i++) {
355 float resolution = getResolutionForSensor(buffer[i].sensor);
356 android::SensorDeviceUtils::quantizeSensorEventValues(&buffer[i], resolution);
357 }
358 }
359
Brian Stacka28e9212018-09-19 15:20:30 -0700360 return eventsRead;
361}
362
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000363void SensorDevice::onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded) {
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000364 std::unique_lock<std::mutex> lock(mDynamicSensorsMutex);
365
Brian Stack6c49e6f2018-09-24 15:44:32 -0700366 // Allocate a sensor_t structure for each dynamic sensor added and insert
367 // it into the dictionary of connected dynamic sensors keyed by handle.
368 for (size_t i = 0; i < dynamicSensorsAdded.size(); ++i) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000369 const sensor_t& sensor = dynamicSensorsAdded[i];
Brian Stack6c49e6f2018-09-24 15:44:32 -0700370
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000371 auto it = mConnectedDynamicSensors.find(sensor.handle);
Brian Stack6c49e6f2018-09-24 15:44:32 -0700372 CHECK(it == mConnectedDynamicSensors.end());
373
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000374 mConnectedDynamicSensors.insert(std::make_pair(sensor.handle, sensor));
Brian Stack6c49e6f2018-09-24 15:44:32 -0700375 }
376
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000377 mDynamicSensorsCv.notify_all();
Brian Stack6c49e6f2018-09-24 15:44:32 -0700378}
379
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000380void SensorDevice::onDynamicSensorsDisconnected(
381 const std::vector<int32_t>& /* dynamicSensorHandlesRemoved */) {
Brian Stack6c49e6f2018-09-24 15:44:32 -0700382 // TODO: Currently dynamic sensors do not seem to be removed
Brian Stack6c49e6f2018-09-24 15:44:32 -0700383}
384
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700385void SensorDevice::writeWakeLockHandled(uint32_t count) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000386 if (mHalWrapper != nullptr && mHalWrapper->supportsMessageQueues()) {
387 mHalWrapper->writeWakeLockHandled(count);
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700388 }
389}
390
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000391void SensorDevice::autoDisable(void* ident, int handle) {
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700392 Mutex::Autolock _l(mLock);
Peng Xu042baec2017-08-09 19:28:27 -0700393 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
394 if (activationIndex < 0) {
395 ALOGW("Handle %d cannot be found in activation record", handle);
396 return;
397 }
398 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700399 info.removeBatchParamsForIdent(ident);
Brian Stackaa6dc092019-05-10 13:36:40 -0700400 if (info.numActiveClients() == 0) {
401 info.isActive = false;
402 }
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700403}
404
Peng Xu6a2d3a02015-12-21 12:00:23 -0800405status_t SensorDevice::activate(void* ident, int handle, int enabled) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000406 if (mHalWrapper == nullptr) return NO_INIT;
Steven Morelandd15c0302016-12-20 11:14:50 -0800407
Brian Stack156da082018-10-01 15:58:53 -0700408 Mutex::Autolock _l(mLock);
409 return activateLocked(ident, handle, enabled);
410}
411
412status_t SensorDevice::activateLocked(void* ident, int handle, int enabled) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700413 bool activateHardware = false;
Mathias Agopianf001c922010-11-11 17:58:51 -0800414
Brian Stack156da082018-10-01 15:58:53 -0700415 status_t err(NO_ERROR);
416
Peng Xu042baec2017-08-09 19:28:27 -0700417 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
418 if (activationIndex < 0) {
419 ALOGW("Handle %d cannot be found in activation record", handle);
420 return BAD_VALUE;
421 }
422 Info& info(mActivationCount.editValueAt(activationIndex));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700423
Steve Blocka5512372011-12-20 16:23:08 +0000424 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000425 "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%zu", ident,
426 handle, enabled, info.batchParams.size());
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700427
Mathias Agopianf001c922010-11-11 17:58:51 -0800428 if (enabled) {
Mark Salyzyndb458612014-06-10 14:50:02 -0700429 ALOGD_IF(DEBUG_CONNECTIONS, "enable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700430
Aravind Akella4949c502015-02-11 15:54:35 -0800431 if (isClientDisabledLocked(ident)) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000432 ALOGW("SensorDevice::activate, isClientDisabledLocked(%p):true, handle:%d", ident,
433 handle);
xiamengsen94ae1312021-02-05 15:35:34 +0800434 return NO_ERROR;
Aravind Akella4949c502015-02-11 15:54:35 -0800435 }
436
Aravind Akella724d91d2013-06-27 12:04:23 -0700437 if (info.batchParams.indexOfKey(ident) >= 0) {
Brian Stack0c305fe2019-04-09 12:49:24 -0700438 if (info.numActiveClients() > 0 && !info.isActive) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700439 activateHardware = true;
Brian Stack0c305fe2019-04-09 12:49:24 -0700440 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800441 } else {
Aravind Akella724d91d2013-06-27 12:04:23 -0700442 // Log error. Every activate call should be preceded by a batch() call.
443 ALOGE("\t >>>ERROR: activate called without batch");
Mathias Agopianf001c922010-11-11 17:58:51 -0800444 }
445 } else {
Mark Salyzyndb458612014-06-10 14:50:02 -0700446 ALOGD_IF(DEBUG_CONNECTIONS, "disable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700447
Steven Morelandd15c0302016-12-20 11:14:50 -0800448 // If a connected dynamic sensor is deactivated, remove it from the
449 // dictionary.
450 auto it = mConnectedDynamicSensors.find(handle);
451 if (it != mConnectedDynamicSensors.end()) {
Steven Morelandd15c0302016-12-20 11:14:50 -0800452 mConnectedDynamicSensors.erase(it);
453 }
454
Aravind Akella724d91d2013-06-27 12:04:23 -0700455 if (info.removeBatchParamsForIdent(ident) >= 0) {
Aravind Akella4949c502015-02-11 15:54:35 -0800456 if (info.numActiveClients() == 0) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700457 // This is the last connection, we need to de-activate the underlying h/w sensor.
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700458 activateHardware = true;
Aravind Akella724d91d2013-06-27 12:04:23 -0700459 } else {
Steven Morelandd15c0302016-12-20 11:14:50 -0800460 // Call batch for this sensor with the previously calculated best effort
461 // batch_rate and timeout. One of the apps has unregistered for sensor
462 // events, and the best effort batch parameters might have changed.
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000463 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w batch 0x%08x %" PRId64 " %" PRId64,
464 handle, info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000465 mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
466 info.bestBatchParams.mTBatch);
Mathias Agopian50b66762010-11-29 17:26:51 -0800467 }
468 } else {
469 // sensor wasn't enabled for this ident
470 }
Aravind Akella4949c502015-02-11 15:54:35 -0800471
472 if (isClientDisabledLocked(ident)) {
473 return NO_ERROR;
474 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800475 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800476
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700477 if (activateHardware) {
478 err = doActivateHardwareLocked(handle, enabled);
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700479
Aravind Akella724d91d2013-06-27 12:04:23 -0700480 if (err != NO_ERROR && enabled) {
481 // Failure when enabling the sensor. Clean up on failure.
482 info.removeBatchParamsForIdent(ident);
Brian Stack0c305fe2019-04-09 12:49:24 -0700483 } else {
484 // Update the isActive flag if there is no error. If there is an error when disabling a
485 // sensor, still set the flag to false since the batch parameters have already been
486 // removed. This ensures that everything remains in-sync.
487 info.isActive = enabled;
Mathias Agopianac9a96d2013-07-12 02:01:16 -0700488 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800489 }
490
Mathias Agopianf001c922010-11-11 17:58:51 -0800491 return err;
492}
493
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700494status_t SensorDevice::doActivateHardwareLocked(int handle, bool enabled) {
495 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w activate handle=%d enabled=%d", handle,
496 enabled);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000497 status_t err = mHalWrapper->activate(handle, enabled);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700498 ALOGE_IF(err, "Error %s sensor %d (%s)", enabled ? "activating" : "disabling", handle,
499 strerror(-err));
500 return err;
501}
502
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000503status_t SensorDevice::batch(void* ident, int handle, int flags, int64_t samplingPeriodNs,
504 int64_t maxBatchReportLatencyNs) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000505 if (mHalWrapper == nullptr) return NO_INIT;
Aravind Akella724d91d2013-06-27 12:04:23 -0700506
507 if (samplingPeriodNs < MINIMUM_EVENTS_PERIOD) {
508 samplingPeriodNs = MINIMUM_EVENTS_PERIOD;
509 }
Peng Xu2bec6232016-07-01 17:13:10 -0700510 if (maxBatchReportLatencyNs < 0) {
511 maxBatchReportLatencyNs = 0;
512 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700513
Aravind Akella724d91d2013-06-27 12:04:23 -0700514 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000515 "SensorDevice::batch: ident=%p, handle=0x%08x, flags=%d, period_ns=%" PRId64
516 " timeout=%" PRId64,
Aravind Akella724d91d2013-06-27 12:04:23 -0700517 ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
518
519 Mutex::Autolock _l(mLock);
Brian Stack156da082018-10-01 15:58:53 -0700520 return batchLocked(ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
521}
522
523status_t SensorDevice::batchLocked(void* ident, int handle, int flags, int64_t samplingPeriodNs,
524 int64_t maxBatchReportLatencyNs) {
Peng Xu042baec2017-08-09 19:28:27 -0700525 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
526 if (activationIndex < 0) {
527 ALOGW("Handle %d cannot be found in activation record", handle);
528 return BAD_VALUE;
529 }
530 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700531
532 if (info.batchParams.indexOfKey(ident) < 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700533 BatchParams params(samplingPeriodNs, maxBatchReportLatencyNs);
Aravind Akella724d91d2013-06-27 12:04:23 -0700534 info.batchParams.add(ident, params);
535 } else {
536 // A batch has already been called with this ident. Update the batch parameters.
537 info.setBatchParamsForIdent(ident, flags, samplingPeriodNs, maxBatchReportLatencyNs);
538 }
539
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000540 status_t err = updateBatchParamsLocked(handle, info);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700541 if (err != NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000542 ALOGE("sensor batch failed 0x%08x %" PRId64 " %" PRId64 " err=%s", handle,
543 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch, strerror(-err));
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700544 info.removeBatchParamsForIdent(ident);
545 }
546
547 return err;
548}
549
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000550status_t SensorDevice::updateBatchParamsLocked(int handle, Info& info) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700551 BatchParams prevBestBatchParams = info.bestBatchParams;
552 // Find the minimum of all timeouts and batch_rates for this sensor.
553 info.selectBatchParams();
554
555 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000556 "\t>>> curr_period=%" PRId64 " min_period=%" PRId64 " curr_timeout=%" PRId64
557 " min_timeout=%" PRId64,
Peng Xu2bec6232016-07-01 17:13:10 -0700558 prevBestBatchParams.mTSample, info.bestBatchParams.mTSample,
559 prevBestBatchParams.mTBatch, info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700560
561 status_t err(NO_ERROR);
562 // If the min period or min timeout has changed since the last batch call, call batch.
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700563 if (prevBestBatchParams != info.bestBatchParams && info.numActiveClients() > 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700564 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w BATCH 0x%08x %" PRId64 " %" PRId64, handle,
565 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000566 err = mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
567 info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700568 }
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700569
Aravind Akella724d91d2013-06-27 12:04:23 -0700570 return err;
571}
572
Peng Xu6a2d3a02015-12-21 12:00:23 -0800573status_t SensorDevice::setDelay(void* ident, int handle, int64_t samplingPeriodNs) {
Peng Xu2bec6232016-07-01 17:13:10 -0700574 return batch(ident, handle, 0, samplingPeriodNs, 0);
Mathias Agopian667102f2011-09-14 16:43:34 -0700575}
576
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700577int SensorDevice::getHalDeviceVersion() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000578 if (mHalWrapper == nullptr) return -1;
Steven Morelandd15c0302016-12-20 11:14:50 -0800579 return SENSORS_DEVICE_API_VERSION_1_4;
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700580}
581
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000582status_t SensorDevice::flush(void* /*ident*/, int handle) {
583 return mHalWrapper->flush(handle);
Aravind Akella724d91d2013-06-27 12:04:23 -0700584}
585
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700586bool SensorDevice::isClientDisabled(void* ident) const {
Aravind Akella4949c502015-02-11 15:54:35 -0800587 Mutex::Autolock _l(mLock);
588 return isClientDisabledLocked(ident);
589}
590
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700591bool SensorDevice::isClientDisabledLocked(void* ident) const {
592 return mDisabledClients.count(ident) > 0;
593}
594
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000595std::vector<void*> SensorDevice::getDisabledClientsLocked() const {
596 std::vector<void*> vec;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700597 for (const auto& it : mDisabledClients) {
598 vec.push_back(it.first);
599 }
600
601 return vec;
602}
603
604void SensorDevice::addDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
605 mDisabledClients[ident] |= 1 << reason;
606}
607
608void SensorDevice::removeDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
609 if (isClientDisabledLocked(ident)) {
610 mDisabledClients[ident] &= ~(1 << reason);
611 if (mDisabledClients[ident] == 0) {
612 mDisabledClients.erase(ident);
613 }
614 }
615}
616
617void SensorDevice::setUidStateForConnection(void* ident, SensorService::UidState state) {
618 Mutex::Autolock _l(mLock);
619 if (state == SensorService::UID_STATE_ACTIVE) {
620 removeDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
621 } else {
622 addDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
623 }
624
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000625 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700626 int handle = mActivationCount.keyAt(i);
627 Info& info = mActivationCount.editValueAt(i);
628
629 if (info.hasBatchParamsForIdent(ident)) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700630 updateBatchParamsLocked(handle, info);
631 bool disable = info.numActiveClients() == 0 && info.isActive;
632 bool enable = info.numActiveClients() > 0 && !info.isActive;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700633
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000634 if ((enable || disable) && doActivateHardwareLocked(handle, enable) == NO_ERROR) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700635 info.isActive = enable;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700636 }
637 }
638 }
Aravind Akella4949c502015-02-11 15:54:35 -0800639}
640
Brian Stackbce04d72019-03-21 10:54:10 -0700641bool SensorDevice::isSensorActive(int handle) const {
642 Mutex::Autolock _l(mLock);
643 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
644 if (activationIndex < 0) {
645 return false;
646 }
Chris Kuiperc63880a2021-08-04 15:06:11 -0700647 return mActivationCount.valueAt(activationIndex).isActive;
Brian Stackbce04d72019-03-21 10:54:10 -0700648}
649
Anh Pham5198c992021-02-10 14:15:30 +0100650void SensorDevice::onMicSensorAccessChanged(void* ident, int handle, nsecs_t samplingPeriodNs) {
651 Mutex::Autolock _l(mLock);
652 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
653 if (activationIndex < 0) {
654 ALOGW("Handle %d cannot be found in activation record", handle);
655 return;
656 }
657 Info& info(mActivationCount.editValueAt(activationIndex));
658 if (info.hasBatchParamsForIdent(ident)) {
659 ssize_t index = info.batchParams.indexOfKey(ident);
660 BatchParams& params = info.batchParams.editValueAt(index);
661 params.mTSample = samplingPeriodNs;
662 }
663}
664
Aravind Akella4949c502015-02-11 15:54:35 -0800665void SensorDevice::enableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000666 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800667 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700668
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000669 for (void* client : getDisabledClientsLocked()) {
670 removeDisabledReasonForIdentLocked(client,
671 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700672 }
673
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000674 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Aravind Akella4949c502015-02-11 15:54:35 -0800675 Info& info = mActivationCount.editValueAt(i);
676 if (info.batchParams.isEmpty()) continue;
677 info.selectBatchParams();
678 const int sensor_handle = mActivationCount.keyAt(i);
679 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> reenable actuating h/w sensor enable handle=%d ",
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000680 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000681 status_t err = mHalWrapper->batch(sensor_handle, info.bestBatchParams.mTSample,
682 info.bestBatchParams.mTBatch);
Steven Morelandd15c0302016-12-20 11:14:50 -0800683 ALOGE_IF(err, "Error calling batch on sensor %d (%s)", sensor_handle, strerror(-err));
Aravind Akella4949c502015-02-11 15:54:35 -0800684
685 if (err == NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000686 err = mHalWrapper->activate(sensor_handle, 1 /* enabled */);
Aravind Akella4949c502015-02-11 15:54:35 -0800687 ALOGE_IF(err, "Error activating sensor %d (%s)", sensor_handle, strerror(-err));
688 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700689
690 if (err == NO_ERROR) {
691 info.isActive = true;
692 }
Aravind Akella4949c502015-02-11 15:54:35 -0800693 }
694}
695
696void SensorDevice::disableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000697 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800698 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000699 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Brian Stack4a11fed2019-04-22 15:07:50 -0700700 Info& info = mActivationCount.editValueAt(i);
Aravind Akella4949c502015-02-11 15:54:35 -0800701 // Check if this sensor has been activated previously and disable it.
702 if (info.batchParams.size() > 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000703 const int sensor_handle = mActivationCount.keyAt(i);
704 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> actuating h/w sensor disable handle=%d ",
705 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000706 mHalWrapper->activate(sensor_handle, 0 /* enabled */);
Steven Morelandd15c0302016-12-20 11:14:50 -0800707
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000708 // Add all the connections that were registered for this sensor to the disabled
709 // clients list.
710 for (size_t j = 0; j < info.batchParams.size(); ++j) {
711 addDisabledReasonForIdentLocked(info.batchParams.keyAt(j),
712 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
713 ALOGI("added %p to mDisabledClients", info.batchParams.keyAt(j));
714 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700715
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000716 info.isActive = false;
Aravind Akella4949c502015-02-11 15:54:35 -0800717 }
718 }
719}
720
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000721status_t SensorDevice::injectSensorData(const sensors_event_t* injected_sensor_event) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000722 return mHalWrapper->injectSensorData(injected_sensor_event);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700723}
724
725status_t SensorDevice::setMode(uint32_t mode) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000726 if (mHalWrapper == nullptr) return NO_INIT;
727 return mHalWrapper->setOperationMode(static_cast<SensorService::Mode>(mode));
Peng Xua8fad9b2017-03-17 12:20:27 -0700728}
Steven Morelandd15c0302016-12-20 11:14:50 -0800729
Peng Xua8fad9b2017-03-17 12:20:27 -0700730int32_t SensorDevice::registerDirectChannel(const sensors_direct_mem_t* memory) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700731 Mutex::Autolock _l(mLock);
732
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000733 return mHalWrapper->registerDirectChannel(memory, nullptr);
Peng Xua8fad9b2017-03-17 12:20:27 -0700734}
735
736void SensorDevice::unregisterDirectChannel(int32_t channelHandle) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000737 mHalWrapper->unregisterDirectChannel(channelHandle);
Peng Xua8fad9b2017-03-17 12:20:27 -0700738}
739
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000740int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle,
741 const struct sensors_direct_cfg_t* config) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700742 Mutex::Autolock _l(mLock);
743
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000744 return mHalWrapper->configureDirectChannel(sensorHandle, channelHandle, config);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700745}
746
Mathias Agopian667102f2011-09-14 16:43:34 -0700747// ---------------------------------------------------------------------------
748
Brian Stack156da082018-10-01 15:58:53 -0700749int SensorDevice::Info::numActiveClients() const {
Aravind Akella4949c502015-02-11 15:54:35 -0800750 SensorDevice& device(SensorDevice::getInstance());
751 int num = 0;
752 for (size_t i = 0; i < batchParams.size(); ++i) {
753 if (!device.isClientDisabledLocked(batchParams.keyAt(i))) {
754 ++num;
755 }
756 }
757 return num;
758}
759
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000760status_t SensorDevice::Info::setBatchParamsForIdent(void* ident, int, int64_t samplingPeriodNs,
Aravind Akella724d91d2013-06-27 12:04:23 -0700761 int64_t maxBatchReportLatencyNs) {
762 ssize_t index = batchParams.indexOfKey(ident);
Mathias Agopian667102f2011-09-14 16:43:34 -0700763 if (index < 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000764 ALOGE("Info::setBatchParamsForIdent(ident=%p, period_ns=%" PRId64 " timeout=%" PRId64
765 ") failed (%s)",
Aravind Akella724d91d2013-06-27 12:04:23 -0700766 ident, samplingPeriodNs, maxBatchReportLatencyNs, strerror(-index));
Mathias Agopian667102f2011-09-14 16:43:34 -0700767 return BAD_INDEX;
768 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700769 BatchParams& params = batchParams.editValueAt(index);
Peng Xu2bec6232016-07-01 17:13:10 -0700770 params.mTSample = samplingPeriodNs;
771 params.mTBatch = maxBatchReportLatencyNs;
Mathias Agopian667102f2011-09-14 16:43:34 -0700772 return NO_ERROR;
773}
774
Aravind Akella724d91d2013-06-27 12:04:23 -0700775void SensorDevice::Info::selectBatchParams() {
Peng Xu2bec6232016-07-01 17:13:10 -0700776 BatchParams bestParams; // default to max Tsample and max Tbatch
Aravind Akella4949c502015-02-11 15:54:35 -0800777 SensorDevice& device(SensorDevice::getInstance());
Aravind Akella724d91d2013-06-27 12:04:23 -0700778
Aravind Akella4949c502015-02-11 15:54:35 -0800779 for (size_t i = 0; i < batchParams.size(); ++i) {
Peng Xu2bec6232016-07-01 17:13:10 -0700780 if (device.isClientDisabledLocked(batchParams.keyAt(i))) {
781 continue;
Aravind Akella724d91d2013-06-27 12:04:23 -0700782 }
Peng Xu2bec6232016-07-01 17:13:10 -0700783 bestParams.merge(batchParams[i]);
784 }
785 // if mTBatch <= mTSample, it is in streaming mode. set mTbatch to 0 to demand this explicitly.
786 if (bestParams.mTBatch <= bestParams.mTSample) {
787 bestParams.mTBatch = 0;
Mathias Agopianf001c922010-11-11 17:58:51 -0800788 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700789 bestBatchParams = bestParams;
790}
791
792ssize_t SensorDevice::Info::removeBatchParamsForIdent(void* ident) {
793 ssize_t idx = batchParams.removeItem(ident);
794 if (idx >= 0) {
795 selectBatchParams();
796 }
797 return idx;
Mathias Agopianf001c922010-11-11 17:58:51 -0800798}
799
Peng Xu4f707f82016-09-26 11:28:32 -0700800void SensorDevice::notifyConnectionDestroyed(void* ident) {
801 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700802 mDisabledClients.erase(ident);
Peng Xu4f707f82016-09-26 11:28:32 -0700803}
804
Peng Xu53632542017-01-23 20:06:27 -0800805bool SensorDevice::isDirectReportSupported() const {
Steven Morelandd15c0302016-12-20 11:14:50 -0800806 return mIsDirectReportSupported;
Peng Xu53632542017-01-23 20:06:27 -0800807}
Steven Morelandd15c0302016-12-20 11:14:50 -0800808
Anthony Stange12924862020-03-20 10:46:15 -0400809float SensorDevice::getResolutionForSensor(int sensorHandle) {
810 for (size_t i = 0; i < mSensorList.size(); i++) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000811 if (sensorHandle == mSensorList[i].handle) {
812 return mSensorList[i].resolution;
813 }
Anthony Stange12924862020-03-20 10:46:15 -0400814 }
815
816 auto it = mConnectedDynamicSensors.find(sensorHandle);
817 if (it != mConnectedDynamicSensors.end()) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000818 return it->second.resolution;
Anthony Stange12924862020-03-20 10:46:15 -0400819 }
820
821 return 0;
822}
823
Mathias Agopianf001c922010-11-11 17:58:51 -0800824// ---------------------------------------------------------------------------
825}; // namespace android