blob: 84a1076b14b1d3f8ee523b469c9fdefdbea48d65 [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 }
352 return eventsRead;
353}
354
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000355void SensorDevice::onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded) {
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000356 std::unique_lock<std::mutex> lock(mDynamicSensorsMutex);
357
Brian Stack6c49e6f2018-09-24 15:44:32 -0700358 // Allocate a sensor_t structure for each dynamic sensor added and insert
359 // it into the dictionary of connected dynamic sensors keyed by handle.
360 for (size_t i = 0; i < dynamicSensorsAdded.size(); ++i) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000361 const sensor_t& sensor = dynamicSensorsAdded[i];
Brian Stack6c49e6f2018-09-24 15:44:32 -0700362
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000363 auto it = mConnectedDynamicSensors.find(sensor.handle);
Brian Stack6c49e6f2018-09-24 15:44:32 -0700364 CHECK(it == mConnectedDynamicSensors.end());
365
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000366 mConnectedDynamicSensors.insert(std::make_pair(sensor.handle, sensor));
Brian Stack6c49e6f2018-09-24 15:44:32 -0700367 }
368
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000369 mDynamicSensorsCv.notify_all();
Brian Stack6c49e6f2018-09-24 15:44:32 -0700370}
371
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000372void SensorDevice::onDynamicSensorsDisconnected(
373 const std::vector<int32_t>& /* dynamicSensorHandlesRemoved */) {
Brian Stack6c49e6f2018-09-24 15:44:32 -0700374 // TODO: Currently dynamic sensors do not seem to be removed
Brian Stack6c49e6f2018-09-24 15:44:32 -0700375}
376
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700377void SensorDevice::writeWakeLockHandled(uint32_t count) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000378 if (mHalWrapper != nullptr && mHalWrapper->supportsMessageQueues()) {
379 mHalWrapper->writeWakeLockHandled(count);
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700380 }
381}
382
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000383void SensorDevice::autoDisable(void* ident, int handle) {
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700384 Mutex::Autolock _l(mLock);
Peng Xu042baec2017-08-09 19:28:27 -0700385 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
386 if (activationIndex < 0) {
387 ALOGW("Handle %d cannot be found in activation record", handle);
388 return;
389 }
390 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700391 info.removeBatchParamsForIdent(ident);
Brian Stackaa6dc092019-05-10 13:36:40 -0700392 if (info.numActiveClients() == 0) {
393 info.isActive = false;
394 }
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700395}
396
Peng Xu6a2d3a02015-12-21 12:00:23 -0800397status_t SensorDevice::activate(void* ident, int handle, int enabled) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000398 if (mHalWrapper == nullptr) return NO_INIT;
Steven Morelandd15c0302016-12-20 11:14:50 -0800399
Brian Stack156da082018-10-01 15:58:53 -0700400 Mutex::Autolock _l(mLock);
401 return activateLocked(ident, handle, enabled);
402}
403
404status_t SensorDevice::activateLocked(void* ident, int handle, int enabled) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700405 bool activateHardware = false;
Mathias Agopianf001c922010-11-11 17:58:51 -0800406
Brian Stack156da082018-10-01 15:58:53 -0700407 status_t err(NO_ERROR);
408
Peng Xu042baec2017-08-09 19:28:27 -0700409 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
410 if (activationIndex < 0) {
411 ALOGW("Handle %d cannot be found in activation record", handle);
412 return BAD_VALUE;
413 }
414 Info& info(mActivationCount.editValueAt(activationIndex));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700415
Steve Blocka5512372011-12-20 16:23:08 +0000416 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000417 "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%zu", ident,
418 handle, enabled, info.batchParams.size());
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700419
Mathias Agopianf001c922010-11-11 17:58:51 -0800420 if (enabled) {
Mark Salyzyndb458612014-06-10 14:50:02 -0700421 ALOGD_IF(DEBUG_CONNECTIONS, "enable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700422
Aravind Akella4949c502015-02-11 15:54:35 -0800423 if (isClientDisabledLocked(ident)) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000424 ALOGW("SensorDevice::activate, isClientDisabledLocked(%p):true, handle:%d", ident,
425 handle);
xiamengsen94ae1312021-02-05 15:35:34 +0800426 return NO_ERROR;
Aravind Akella4949c502015-02-11 15:54:35 -0800427 }
428
Aravind Akella724d91d2013-06-27 12:04:23 -0700429 if (info.batchParams.indexOfKey(ident) >= 0) {
Brian Stack0c305fe2019-04-09 12:49:24 -0700430 if (info.numActiveClients() > 0 && !info.isActive) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700431 activateHardware = true;
Brian Stack0c305fe2019-04-09 12:49:24 -0700432 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800433 } else {
Aravind Akella724d91d2013-06-27 12:04:23 -0700434 // Log error. Every activate call should be preceded by a batch() call.
435 ALOGE("\t >>>ERROR: activate called without batch");
Mathias Agopianf001c922010-11-11 17:58:51 -0800436 }
437 } else {
Mark Salyzyndb458612014-06-10 14:50:02 -0700438 ALOGD_IF(DEBUG_CONNECTIONS, "disable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700439
Steven Morelandd15c0302016-12-20 11:14:50 -0800440 // If a connected dynamic sensor is deactivated, remove it from the
441 // dictionary.
442 auto it = mConnectedDynamicSensors.find(handle);
443 if (it != mConnectedDynamicSensors.end()) {
Steven Morelandd15c0302016-12-20 11:14:50 -0800444 mConnectedDynamicSensors.erase(it);
445 }
446
Aravind Akella724d91d2013-06-27 12:04:23 -0700447 if (info.removeBatchParamsForIdent(ident) >= 0) {
Aravind Akella4949c502015-02-11 15:54:35 -0800448 if (info.numActiveClients() == 0) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700449 // This is the last connection, we need to de-activate the underlying h/w sensor.
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700450 activateHardware = true;
Aravind Akella724d91d2013-06-27 12:04:23 -0700451 } else {
Steven Morelandd15c0302016-12-20 11:14:50 -0800452 // Call batch for this sensor with the previously calculated best effort
453 // batch_rate and timeout. One of the apps has unregistered for sensor
454 // events, and the best effort batch parameters might have changed.
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000455 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w batch 0x%08x %" PRId64 " %" PRId64,
456 handle, info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000457 mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
458 info.bestBatchParams.mTBatch);
Mathias Agopian50b66762010-11-29 17:26:51 -0800459 }
460 } else {
461 // sensor wasn't enabled for this ident
462 }
Aravind Akella4949c502015-02-11 15:54:35 -0800463
464 if (isClientDisabledLocked(ident)) {
465 return NO_ERROR;
466 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800467 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800468
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700469 if (activateHardware) {
470 err = doActivateHardwareLocked(handle, enabled);
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700471
Aravind Akella724d91d2013-06-27 12:04:23 -0700472 if (err != NO_ERROR && enabled) {
473 // Failure when enabling the sensor. Clean up on failure.
474 info.removeBatchParamsForIdent(ident);
Brian Stack0c305fe2019-04-09 12:49:24 -0700475 } else {
476 // Update the isActive flag if there is no error. If there is an error when disabling a
477 // sensor, still set the flag to false since the batch parameters have already been
478 // removed. This ensures that everything remains in-sync.
479 info.isActive = enabled;
Mathias Agopianac9a96d2013-07-12 02:01:16 -0700480 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800481 }
482
Mathias Agopianf001c922010-11-11 17:58:51 -0800483 return err;
484}
485
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700486status_t SensorDevice::doActivateHardwareLocked(int handle, bool enabled) {
487 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w activate handle=%d enabled=%d", handle,
488 enabled);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000489 status_t err = mHalWrapper->activate(handle, enabled);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700490 ALOGE_IF(err, "Error %s sensor %d (%s)", enabled ? "activating" : "disabling", handle,
491 strerror(-err));
492 return err;
493}
494
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000495status_t SensorDevice::batch(void* ident, int handle, int flags, int64_t samplingPeriodNs,
496 int64_t maxBatchReportLatencyNs) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000497 if (mHalWrapper == nullptr) return NO_INIT;
Aravind Akella724d91d2013-06-27 12:04:23 -0700498
499 if (samplingPeriodNs < MINIMUM_EVENTS_PERIOD) {
500 samplingPeriodNs = MINIMUM_EVENTS_PERIOD;
501 }
Peng Xu2bec6232016-07-01 17:13:10 -0700502 if (maxBatchReportLatencyNs < 0) {
503 maxBatchReportLatencyNs = 0;
504 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700505
Aravind Akella724d91d2013-06-27 12:04:23 -0700506 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000507 "SensorDevice::batch: ident=%p, handle=0x%08x, flags=%d, period_ns=%" PRId64
508 " timeout=%" PRId64,
Aravind Akella724d91d2013-06-27 12:04:23 -0700509 ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
510
511 Mutex::Autolock _l(mLock);
Brian Stack156da082018-10-01 15:58:53 -0700512 return batchLocked(ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
513}
514
515status_t SensorDevice::batchLocked(void* ident, int handle, int flags, int64_t samplingPeriodNs,
516 int64_t maxBatchReportLatencyNs) {
Peng Xu042baec2017-08-09 19:28:27 -0700517 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
518 if (activationIndex < 0) {
519 ALOGW("Handle %d cannot be found in activation record", handle);
520 return BAD_VALUE;
521 }
522 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700523
524 if (info.batchParams.indexOfKey(ident) < 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700525 BatchParams params(samplingPeriodNs, maxBatchReportLatencyNs);
Aravind Akella724d91d2013-06-27 12:04:23 -0700526 info.batchParams.add(ident, params);
527 } else {
528 // A batch has already been called with this ident. Update the batch parameters.
529 info.setBatchParamsForIdent(ident, flags, samplingPeriodNs, maxBatchReportLatencyNs);
530 }
531
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000532 status_t err = updateBatchParamsLocked(handle, info);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700533 if (err != NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000534 ALOGE("sensor batch failed 0x%08x %" PRId64 " %" PRId64 " err=%s", handle,
535 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch, strerror(-err));
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700536 info.removeBatchParamsForIdent(ident);
537 }
538
539 return err;
540}
541
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000542status_t SensorDevice::updateBatchParamsLocked(int handle, Info& info) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700543 BatchParams prevBestBatchParams = info.bestBatchParams;
544 // Find the minimum of all timeouts and batch_rates for this sensor.
545 info.selectBatchParams();
546
547 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000548 "\t>>> curr_period=%" PRId64 " min_period=%" PRId64 " curr_timeout=%" PRId64
549 " min_timeout=%" PRId64,
Peng Xu2bec6232016-07-01 17:13:10 -0700550 prevBestBatchParams.mTSample, info.bestBatchParams.mTSample,
551 prevBestBatchParams.mTBatch, info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700552
553 status_t err(NO_ERROR);
554 // If the min period or min timeout has changed since the last batch call, call batch.
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700555 if (prevBestBatchParams != info.bestBatchParams && info.numActiveClients() > 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700556 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w BATCH 0x%08x %" PRId64 " %" PRId64, handle,
557 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000558 err = mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
559 info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700560 }
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700561
Aravind Akella724d91d2013-06-27 12:04:23 -0700562 return err;
563}
564
Peng Xu6a2d3a02015-12-21 12:00:23 -0800565status_t SensorDevice::setDelay(void* ident, int handle, int64_t samplingPeriodNs) {
Peng Xu2bec6232016-07-01 17:13:10 -0700566 return batch(ident, handle, 0, samplingPeriodNs, 0);
Mathias Agopian667102f2011-09-14 16:43:34 -0700567}
568
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700569int SensorDevice::getHalDeviceVersion() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000570 if (mHalWrapper == nullptr) return -1;
Steven Morelandd15c0302016-12-20 11:14:50 -0800571 return SENSORS_DEVICE_API_VERSION_1_4;
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700572}
573
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000574status_t SensorDevice::flush(void* /*ident*/, int handle) {
575 return mHalWrapper->flush(handle);
Aravind Akella724d91d2013-06-27 12:04:23 -0700576}
577
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700578bool SensorDevice::isClientDisabled(void* ident) const {
Aravind Akella4949c502015-02-11 15:54:35 -0800579 Mutex::Autolock _l(mLock);
580 return isClientDisabledLocked(ident);
581}
582
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700583bool SensorDevice::isClientDisabledLocked(void* ident) const {
584 return mDisabledClients.count(ident) > 0;
585}
586
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000587std::vector<void*> SensorDevice::getDisabledClientsLocked() const {
588 std::vector<void*> vec;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700589 for (const auto& it : mDisabledClients) {
590 vec.push_back(it.first);
591 }
592
593 return vec;
594}
595
596void SensorDevice::addDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
597 mDisabledClients[ident] |= 1 << reason;
598}
599
600void SensorDevice::removeDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
601 if (isClientDisabledLocked(ident)) {
602 mDisabledClients[ident] &= ~(1 << reason);
603 if (mDisabledClients[ident] == 0) {
604 mDisabledClients.erase(ident);
605 }
606 }
607}
608
609void SensorDevice::setUidStateForConnection(void* ident, SensorService::UidState state) {
610 Mutex::Autolock _l(mLock);
611 if (state == SensorService::UID_STATE_ACTIVE) {
612 removeDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
613 } else {
614 addDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
615 }
616
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000617 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700618 int handle = mActivationCount.keyAt(i);
619 Info& info = mActivationCount.editValueAt(i);
620
621 if (info.hasBatchParamsForIdent(ident)) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700622 updateBatchParamsLocked(handle, info);
623 bool disable = info.numActiveClients() == 0 && info.isActive;
624 bool enable = info.numActiveClients() > 0 && !info.isActive;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700625
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000626 if ((enable || disable) && doActivateHardwareLocked(handle, enable) == NO_ERROR) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700627 info.isActive = enable;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700628 }
629 }
630 }
Aravind Akella4949c502015-02-11 15:54:35 -0800631}
632
Brian Stackbce04d72019-03-21 10:54:10 -0700633bool SensorDevice::isSensorActive(int handle) const {
634 Mutex::Autolock _l(mLock);
635 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
636 if (activationIndex < 0) {
637 return false;
638 }
Chris Kuiperc63880a2021-08-04 15:06:11 -0700639 return mActivationCount.valueAt(activationIndex).isActive;
Brian Stackbce04d72019-03-21 10:54:10 -0700640}
641
Anh Pham5198c992021-02-10 14:15:30 +0100642void SensorDevice::onMicSensorAccessChanged(void* ident, int handle, nsecs_t samplingPeriodNs) {
643 Mutex::Autolock _l(mLock);
644 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
645 if (activationIndex < 0) {
646 ALOGW("Handle %d cannot be found in activation record", handle);
647 return;
648 }
649 Info& info(mActivationCount.editValueAt(activationIndex));
650 if (info.hasBatchParamsForIdent(ident)) {
651 ssize_t index = info.batchParams.indexOfKey(ident);
652 BatchParams& params = info.batchParams.editValueAt(index);
653 params.mTSample = samplingPeriodNs;
654 }
655}
656
Aravind Akella4949c502015-02-11 15:54:35 -0800657void SensorDevice::enableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000658 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800659 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700660
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000661 for (void* client : getDisabledClientsLocked()) {
662 removeDisabledReasonForIdentLocked(client,
663 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700664 }
665
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000666 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Aravind Akella4949c502015-02-11 15:54:35 -0800667 Info& info = mActivationCount.editValueAt(i);
668 if (info.batchParams.isEmpty()) continue;
669 info.selectBatchParams();
670 const int sensor_handle = mActivationCount.keyAt(i);
671 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> reenable actuating h/w sensor enable handle=%d ",
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000672 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000673 status_t err = mHalWrapper->batch(sensor_handle, info.bestBatchParams.mTSample,
674 info.bestBatchParams.mTBatch);
Steven Morelandd15c0302016-12-20 11:14:50 -0800675 ALOGE_IF(err, "Error calling batch on sensor %d (%s)", sensor_handle, strerror(-err));
Aravind Akella4949c502015-02-11 15:54:35 -0800676
677 if (err == NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000678 err = mHalWrapper->activate(sensor_handle, 1 /* enabled */);
Aravind Akella4949c502015-02-11 15:54:35 -0800679 ALOGE_IF(err, "Error activating sensor %d (%s)", sensor_handle, strerror(-err));
680 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700681
682 if (err == NO_ERROR) {
683 info.isActive = true;
684 }
Aravind Akella4949c502015-02-11 15:54:35 -0800685 }
686}
687
688void SensorDevice::disableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000689 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800690 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000691 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Brian Stack4a11fed2019-04-22 15:07:50 -0700692 Info& info = mActivationCount.editValueAt(i);
Aravind Akella4949c502015-02-11 15:54:35 -0800693 // Check if this sensor has been activated previously and disable it.
694 if (info.batchParams.size() > 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000695 const int sensor_handle = mActivationCount.keyAt(i);
696 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> actuating h/w sensor disable handle=%d ",
697 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000698 mHalWrapper->activate(sensor_handle, 0 /* enabled */);
Steven Morelandd15c0302016-12-20 11:14:50 -0800699
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000700 // Add all the connections that were registered for this sensor to the disabled
701 // clients list.
702 for (size_t j = 0; j < info.batchParams.size(); ++j) {
703 addDisabledReasonForIdentLocked(info.batchParams.keyAt(j),
704 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
705 ALOGI("added %p to mDisabledClients", info.batchParams.keyAt(j));
706 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700707
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000708 info.isActive = false;
Aravind Akella4949c502015-02-11 15:54:35 -0800709 }
710 }
711}
712
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000713status_t SensorDevice::injectSensorData(const sensors_event_t* injected_sensor_event) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000714 return mHalWrapper->injectSensorData(injected_sensor_event);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700715}
716
717status_t SensorDevice::setMode(uint32_t mode) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000718 if (mHalWrapper == nullptr) return NO_INIT;
719 return mHalWrapper->setOperationMode(static_cast<SensorService::Mode>(mode));
Peng Xua8fad9b2017-03-17 12:20:27 -0700720}
Steven Morelandd15c0302016-12-20 11:14:50 -0800721
Peng Xua8fad9b2017-03-17 12:20:27 -0700722int32_t SensorDevice::registerDirectChannel(const sensors_direct_mem_t* memory) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700723 Mutex::Autolock _l(mLock);
724
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000725 return mHalWrapper->registerDirectChannel(memory, nullptr);
Peng Xua8fad9b2017-03-17 12:20:27 -0700726}
727
728void SensorDevice::unregisterDirectChannel(int32_t channelHandle) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000729 mHalWrapper->unregisterDirectChannel(channelHandle);
Peng Xua8fad9b2017-03-17 12:20:27 -0700730}
731
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000732int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle,
733 const struct sensors_direct_cfg_t* config) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700734 Mutex::Autolock _l(mLock);
735
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000736 return mHalWrapper->configureDirectChannel(sensorHandle, channelHandle, config);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700737}
738
Mathias Agopian667102f2011-09-14 16:43:34 -0700739// ---------------------------------------------------------------------------
740
Brian Stack156da082018-10-01 15:58:53 -0700741int SensorDevice::Info::numActiveClients() const {
Aravind Akella4949c502015-02-11 15:54:35 -0800742 SensorDevice& device(SensorDevice::getInstance());
743 int num = 0;
744 for (size_t i = 0; i < batchParams.size(); ++i) {
745 if (!device.isClientDisabledLocked(batchParams.keyAt(i))) {
746 ++num;
747 }
748 }
749 return num;
750}
751
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000752status_t SensorDevice::Info::setBatchParamsForIdent(void* ident, int, int64_t samplingPeriodNs,
Aravind Akella724d91d2013-06-27 12:04:23 -0700753 int64_t maxBatchReportLatencyNs) {
754 ssize_t index = batchParams.indexOfKey(ident);
Mathias Agopian667102f2011-09-14 16:43:34 -0700755 if (index < 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000756 ALOGE("Info::setBatchParamsForIdent(ident=%p, period_ns=%" PRId64 " timeout=%" PRId64
757 ") failed (%s)",
Aravind Akella724d91d2013-06-27 12:04:23 -0700758 ident, samplingPeriodNs, maxBatchReportLatencyNs, strerror(-index));
Mathias Agopian667102f2011-09-14 16:43:34 -0700759 return BAD_INDEX;
760 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700761 BatchParams& params = batchParams.editValueAt(index);
Peng Xu2bec6232016-07-01 17:13:10 -0700762 params.mTSample = samplingPeriodNs;
763 params.mTBatch = maxBatchReportLatencyNs;
Mathias Agopian667102f2011-09-14 16:43:34 -0700764 return NO_ERROR;
765}
766
Aravind Akella724d91d2013-06-27 12:04:23 -0700767void SensorDevice::Info::selectBatchParams() {
Peng Xu2bec6232016-07-01 17:13:10 -0700768 BatchParams bestParams; // default to max Tsample and max Tbatch
Aravind Akella4949c502015-02-11 15:54:35 -0800769 SensorDevice& device(SensorDevice::getInstance());
Aravind Akella724d91d2013-06-27 12:04:23 -0700770
Aravind Akella4949c502015-02-11 15:54:35 -0800771 for (size_t i = 0; i < batchParams.size(); ++i) {
Peng Xu2bec6232016-07-01 17:13:10 -0700772 if (device.isClientDisabledLocked(batchParams.keyAt(i))) {
773 continue;
Aravind Akella724d91d2013-06-27 12:04:23 -0700774 }
Peng Xu2bec6232016-07-01 17:13:10 -0700775 bestParams.merge(batchParams[i]);
776 }
777 // if mTBatch <= mTSample, it is in streaming mode. set mTbatch to 0 to demand this explicitly.
778 if (bestParams.mTBatch <= bestParams.mTSample) {
779 bestParams.mTBatch = 0;
Mathias Agopianf001c922010-11-11 17:58:51 -0800780 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700781 bestBatchParams = bestParams;
782}
783
784ssize_t SensorDevice::Info::removeBatchParamsForIdent(void* ident) {
785 ssize_t idx = batchParams.removeItem(ident);
786 if (idx >= 0) {
787 selectBatchParams();
788 }
789 return idx;
Mathias Agopianf001c922010-11-11 17:58:51 -0800790}
791
Peng Xu4f707f82016-09-26 11:28:32 -0700792void SensorDevice::notifyConnectionDestroyed(void* ident) {
793 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700794 mDisabledClients.erase(ident);
Peng Xu4f707f82016-09-26 11:28:32 -0700795}
796
Peng Xu53632542017-01-23 20:06:27 -0800797bool SensorDevice::isDirectReportSupported() const {
Steven Morelandd15c0302016-12-20 11:14:50 -0800798 return mIsDirectReportSupported;
Peng Xu53632542017-01-23 20:06:27 -0800799}
Steven Morelandd15c0302016-12-20 11:14:50 -0800800
Anthony Stange12924862020-03-20 10:46:15 -0400801float SensorDevice::getResolutionForSensor(int sensorHandle) {
802 for (size_t i = 0; i < mSensorList.size(); i++) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000803 if (sensorHandle == mSensorList[i].handle) {
804 return mSensorList[i].resolution;
805 }
Anthony Stange12924862020-03-20 10:46:15 -0400806 }
807
808 auto it = mConnectedDynamicSensors.find(sensorHandle);
809 if (it != mConnectedDynamicSensors.end()) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000810 return it->second.resolution;
Anthony Stange12924862020-03-20 10:46:15 -0400811 }
812
813 return 0;
814}
815
Mathias Agopianf001c922010-11-11 17:58:51 -0800816// ---------------------------------------------------------------------------
817}; // namespace android