blob: c86022e748e458181406a13b31a1007eee021435 [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
Arthur Ishiguroadbb40a2021-12-13 04:29:02 +000023#include "AidlSensorHalWrapper.h"
24#include "HidlSensorHalWrapper.h"
25
Steven Morelandd15c0302016-12-20 11:14:50 -080026#include <android-base/logging.h>
Mike Ma24743862020-01-29 00:36:55 -080027#include <android/util/ProtoOutputStream.h>
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000028#include <cutils/atomic.h>
Mike Ma24743862020-01-29 00:36:55 -080029#include <frameworks/base/core/proto/android/service/sensor_service.proto.h>
Arthur Ishiguro65b59812021-12-26 19:09:54 +000030#include <hardware/sensors-base.h>
31#include <hardware/sensors.h>
Peng Xu3889e6e2017-03-02 19:10:38 -080032#include <sensors/convert.h>
Ashutosh Joshi5cafc1e2017-02-09 21:44:04 +000033#include <utils/Errors.h>
34#include <utils/Singleton.h>
Steven Morelandd3335112016-12-20 11:14:50 -080035
Peng Xu3889e6e2017-03-02 19:10:38 -080036#include <chrono>
37#include <cinttypes>
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000038#include <cstddef>
Peng Xu3889e6e2017-03-02 19:10:38 -080039#include <thread>
Mark Wheatley8f285d92023-07-07 20:07:18 +000040#include <mutex>
41#include <condition_variable>
Steven Morelandd15c0302016-12-20 11:14:50 -080042
Brian Stack12f4d322018-09-14 16:18:59 -070043using namespace android::hardware::sensors;
Mike Ma24743862020-01-29 00:36:55 -080044using android::util::ProtoOutputStream;
Peng Xu2bec6232016-07-01 17:13:10 -070045
Mathias Agopianf001c922010-11-11 17:58:51 -080046namespace android {
47// ---------------------------------------------------------------------------
Mathias Agopianf001c922010-11-11 17:58:51 -080048
49ANDROID_SINGLETON_STATIC_INSTANCE(SensorDevice)
50
Brian Duddie8e6f31c2019-05-29 13:19:13 -070051namespace {
52
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000053template <typename EnumType>
Brian Stack156da082018-10-01 15:58:53 -070054constexpr typename std::underlying_type<EnumType>::type asBaseType(EnumType value) {
55 return static_cast<typename std::underlying_type<EnumType>::type>(value);
56}
57
58// Used internally by the framework to wake the Event FMQ. These values must start after
59// the last value of EventQueueFlagBits
60enum EventQueueFlagBitsInternal : uint32_t {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +000061 INTERNAL_WAKE = 1 << 16,
Brian Stack156da082018-10-01 15:58:53 -070062};
63
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000064enum DevicePrivateBase : int32_t {
65 DEVICE_PRIVATE_BASE = 65536,
Brian Stackbbab1ea2018-10-01 10:49:07 -070066};
67
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000068} // anonymous namespace
69
70SensorDevice::SensorDevice() {
71 if (!connectHalService()) {
Peng Xua8fad9b2017-03-17 12:20:27 -070072 return;
73 }
Ashutosh Joshifea2d262017-04-19 23:27:49 -070074
Brian Stack156da082018-10-01 15:58:53 -070075 initializeSensorList();
76
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000077 mIsDirectReportSupported = (mHalWrapper->unregisterDirectChannel(-1) != INVALID_OPERATION);
Brian Stack156da082018-10-01 15:58:53 -070078}
79
80void SensorDevice::initializeSensorList() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000081 if (mHalWrapper == nullptr) {
82 return;
83 }
Peng Xua8fad9b2017-03-17 12:20:27 -070084
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000085 auto list = mHalWrapper->getSensorsList();
86 const size_t count = list.size();
Anthony Stange12924862020-03-20 10:46:15 -040087
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000088 mActivationCount.setCapacity(count);
89 Info model;
90 for (size_t i = 0; i < count; i++) {
91 sensor_t sensor = list[i];
Anthony Stange12924862020-03-20 10:46:15 -040092
Arthur Ishiguro24804dc2021-11-12 17:17:09 +000093 if (sensor.type < DEVICE_PRIVATE_BASE) {
94 sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor);
95
96 // Some sensors don't have a default resolution and will be left at 0.
97 // Don't crash in this case since CTS will verify that devices don't go to
98 // production with a resolution of 0.
99 if (sensor.resolution != 0) {
100 float quantizedRange = sensor.maxRange;
101 SensorDeviceUtils::quantizeValue(&quantizedRange, sensor.resolution,
102 /*factor=*/1);
103 // Only rewrite maxRange if the requantization produced a "significant"
104 // change, which is fairly arbitrarily defined as resolution / 8.
105 // Smaller deltas are permitted, as they may simply be due to floating
106 // point representation error, etc.
107 if (fabsf(sensor.maxRange - quantizedRange) > sensor.resolution / 8) {
108 ALOGW("%s's max range %.12f is not a multiple of the resolution "
109 "%.12f - updated to %.12f",
110 sensor.name, sensor.maxRange, sensor.resolution, quantizedRange);
111 sensor.maxRange = quantizedRange;
Peng Xua8fad9b2017-03-17 12:20:27 -0700112 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000113 } else {
114 // Don't crash here or the device will go into a crashloop.
115 ALOGW("%s should have a non-zero resolution", sensor.name);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000116 }
117 }
Peng Xua8fad9b2017-03-17 12:20:27 -0700118
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000119 // Check and clamp power if it is 0 (or close)
120 constexpr float MIN_POWER_MA = 0.001; // 1 microAmp
121 if (sensor.power < MIN_POWER_MA) {
122 ALOGI("%s's reported power %f invalid, clamped to %f", sensor.name, sensor.power,
123 MIN_POWER_MA);
124 sensor.power = MIN_POWER_MA;
Peng Xu3889e6e2017-03-02 19:10:38 -0800125 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000126 mSensorList.push_back(sensor);
Peng Xu1a00e2d2017-09-27 23:08:30 -0700127
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000128 mActivationCount.add(list[i].handle, model);
129
130 // Only disable all sensors on HAL 1.0 since HAL 2.0
131 // handles this in its initialize method
132 if (!mHalWrapper->supportsMessageQueues()) {
133 mHalWrapper->activate(list[i].handle, 0 /* enabled */);
Peng Xu1a00e2d2017-09-27 23:08:30 -0700134 }
Steven Morelandd15c0302016-12-20 11:14:50 -0800135 }
Steven Morelandd15c0302016-12-20 11:14:50 -0800136}
137
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000138SensorDevice::~SensorDevice() {}
Brian Stack979887b2018-09-19 15:27:48 -0700139
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000140bool SensorDevice::connectHalService() {
Arthur Ishiguroadbb40a2021-12-13 04:29:02 +0000141 std::unique_ptr<ISensorHalWrapper> aidl_wrapper = std::make_unique<AidlSensorHalWrapper>();
142 if (aidl_wrapper->connect(this)) {
143 mHalWrapper = std::move(aidl_wrapper);
144 return true;
145 }
146
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000147 std::unique_ptr<ISensorHalWrapper> hidl_wrapper = std::make_unique<HidlSensorHalWrapper>();
148 if (hidl_wrapper->connect(this)) {
149 mHalWrapper = std::move(hidl_wrapper);
150 return true;
Anthony Stangee38a1412020-02-13 21:28:37 -0500151 }
Arthur Ishiguroadbb40a2021-12-13 04:29:02 +0000152
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000153 // TODO: check aidl connection;
154 return false;
Brian Stack12f4d322018-09-14 16:18:59 -0700155}
156
Brian Stack156da082018-10-01 15:58:53 -0700157void SensorDevice::prepareForReconnect() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000158 mHalWrapper->prepareForReconnect();
Brian Stack156da082018-10-01 15:58:53 -0700159}
160
161void SensorDevice::reconnect() {
162 Mutex::Autolock _l(mLock);
Brian Stack156da082018-10-01 15:58:53 -0700163
164 auto previousActivations = mActivationCount;
165 auto previousSensorList = mSensorList;
166
167 mActivationCount.clear();
168 mSensorList.clear();
169
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000170 if (mHalWrapper->connect(this)) {
Brian Stack156da082018-10-01 15:58:53 -0700171 initializeSensorList();
172
173 if (sensorHandlesChanged(previousSensorList, mSensorList)) {
174 LOG_ALWAYS_FATAL("Sensor handles changed, cannot re-enable sensors.");
175 } else {
176 reactivateSensors(previousActivations);
177 }
178 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000179 mHalWrapper->mReconnecting = false;
Brian Stack156da082018-10-01 15:58:53 -0700180}
181
Arthur Ishiguro4f1dd8a2021-11-12 17:21:24 +0000182bool SensorDevice::sensorHandlesChanged(const std::vector<sensor_t>& oldSensorList,
183 const std::vector<sensor_t>& newSensorList) {
Brian Stack156da082018-10-01 15:58:53 -0700184 bool didChange = false;
185
186 if (oldSensorList.size() != newSensorList.size()) {
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700187 ALOGI("Sensor list size changed from %zu to %zu", oldSensorList.size(),
188 newSensorList.size());
Brian Stack156da082018-10-01 15:58:53 -0700189 didChange = true;
190 }
191
192 for (size_t i = 0; i < newSensorList.size() && !didChange; i++) {
193 bool found = false;
194 const sensor_t& newSensor = newSensorList[i];
195 for (size_t j = 0; j < oldSensorList.size() && !found; j++) {
196 const sensor_t& prevSensor = oldSensorList[j];
197 if (prevSensor.handle == newSensor.handle) {
198 found = true;
199 if (!sensorIsEquivalent(prevSensor, newSensor)) {
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700200 ALOGI("Sensor %s not equivalent to previous version", newSensor.name);
Brian Stack156da082018-10-01 15:58:53 -0700201 didChange = true;
202 }
203 }
204 }
205
206 if (!found) {
207 // Could not find the new sensor in the old list of sensors, the lists must
208 // have changed.
Brian Duddie8e6f31c2019-05-29 13:19:13 -0700209 ALOGI("Sensor %s (handle %d) did not exist before", newSensor.name, newSensor.handle);
Brian Stack156da082018-10-01 15:58:53 -0700210 didChange = true;
211 }
212 }
213 return didChange;
214}
215
216bool SensorDevice::sensorIsEquivalent(const sensor_t& prevSensor, const sensor_t& newSensor) {
217 bool equivalent = true;
218 if (prevSensor.handle != newSensor.handle ||
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000219 (strcmp(prevSensor.vendor, newSensor.vendor) != 0) ||
220 (strcmp(prevSensor.stringType, newSensor.stringType) != 0) ||
221 (strcmp(prevSensor.requiredPermission, newSensor.requiredPermission) != 0) ||
222 (prevSensor.version != newSensor.version) || (prevSensor.type != newSensor.type) ||
223 (std::abs(prevSensor.maxRange - newSensor.maxRange) > 0.001f) ||
224 (std::abs(prevSensor.resolution - newSensor.resolution) > 0.001f) ||
225 (std::abs(prevSensor.power - newSensor.power) > 0.001f) ||
226 (prevSensor.minDelay != newSensor.minDelay) ||
227 (prevSensor.fifoReservedEventCount != newSensor.fifoReservedEventCount) ||
228 (prevSensor.fifoMaxEventCount != newSensor.fifoMaxEventCount) ||
229 (prevSensor.maxDelay != newSensor.maxDelay) || (prevSensor.flags != newSensor.flags)) {
Brian Stack156da082018-10-01 15:58:53 -0700230 equivalent = false;
231 }
232 return equivalent;
233}
234
235void SensorDevice::reactivateSensors(const DefaultKeyedVector<int, Info>& previousActivations) {
236 for (size_t i = 0; i < mSensorList.size(); i++) {
237 int handle = mSensorList[i].handle;
238 ssize_t activationIndex = previousActivations.indexOfKey(handle);
239 if (activationIndex < 0 || previousActivations[activationIndex].numActiveClients() <= 0) {
240 continue;
241 }
242
243 const Info& info = previousActivations[activationIndex];
244 for (size_t j = 0; j < info.batchParams.size(); j++) {
245 const BatchParams& batchParams = info.batchParams[j];
246 status_t res = batchLocked(info.batchParams.keyAt(j), handle, 0 /* flags */,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000247 batchParams.mTSample, batchParams.mTBatch);
Brian Stack156da082018-10-01 15:58:53 -0700248
249 if (res == NO_ERROR) {
250 activateLocked(info.batchParams.keyAt(j), handle, true /* enabled */);
251 }
252 }
253 }
254}
255
Peng Xu2576cb62016-01-20 00:22:09 -0800256void SensorDevice::handleDynamicSensorConnection(int handle, bool connected) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700257 // not need to check mSensors because this is is only called after successful poll()
Peng Xu2576cb62016-01-20 00:22:09 -0800258 if (connected) {
259 Info model;
260 mActivationCount.add(handle, model);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000261 mHalWrapper->activate(handle, 0 /* enabled */);
Peng Xu2576cb62016-01-20 00:22:09 -0800262 } else {
263 mActivationCount.removeItem(handle);
264 }
265}
266
Peng Xu6a2d3a02015-12-21 12:00:23 -0800267std::string SensorDevice::dump() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000268 if (mHalWrapper == nullptr) return "HAL not initialized\n";
Mathias Agopianf001c922010-11-11 17:58:51 -0800269
Peng Xu6a2d3a02015-12-21 12:00:23 -0800270 String8 result;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700271 result.appendFormat("Total %zu h/w sensors, %zu running %zu disabled clients:\n",
272 mSensorList.size(), mActivationCount.size(), mDisabledClients.size());
Ashutosh Joshi96b12d82017-03-15 16:27:12 -0700273
Peng Xua8fad9b2017-03-17 12:20:27 -0700274 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000275 for (const auto& s : mSensorList) {
Peng Xua8fad9b2017-03-17 12:20:27 -0700276 int32_t handle = s.handle;
277 const Info& info = mActivationCount.valueFor(handle);
Brian Stackbce04d72019-03-21 10:54:10 -0700278 if (info.numActiveClients() == 0) continue;
Peng Xua8fad9b2017-03-17 12:20:27 -0700279
280 result.appendFormat("0x%08x) active-count = %zu; ", handle, info.batchParams.size());
281
282 result.append("sampling_period(ms) = {");
283 for (size_t j = 0; j < info.batchParams.size(); j++) {
Peng Xu2bec6232016-07-01 17:13:10 -0700284 const BatchParams& params = info.batchParams[j];
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700285 result.appendFormat("%.1f%s%s", params.mTSample / 1e6f,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000286 isClientDisabledLocked(info.batchParams.keyAt(j)) ? "(disabled)"
287 : "",
288 (j < info.batchParams.size() - 1) ? ", " : "");
Peng Xua8fad9b2017-03-17 12:20:27 -0700289 }
Peng Xu2bec6232016-07-01 17:13:10 -0700290 result.appendFormat("}, selected = %.2f ms; ", info.bestBatchParams.mTSample / 1e6f);
Peng Xua8fad9b2017-03-17 12:20:27 -0700291
292 result.append("batching_period(ms) = {");
293 for (size_t j = 0; j < info.batchParams.size(); j++) {
Peng Xu2bec6232016-07-01 17:13:10 -0700294 const BatchParams& params = info.batchParams[j];
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700295 result.appendFormat("%.1f%s%s", params.mTBatch / 1e6f,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000296 isClientDisabledLocked(info.batchParams.keyAt(j)) ? "(disabled)"
297 : "",
298 (j < info.batchParams.size() - 1) ? ", " : "");
Peng Xua8fad9b2017-03-17 12:20:27 -0700299 }
Peng Xu2bec6232016-07-01 17:13:10 -0700300 result.appendFormat("}, selected = %.2f ms\n", info.bestBatchParams.mTBatch / 1e6f);
Ashutosh Joshi96b12d82017-03-15 16:27:12 -0700301 }
302
Tomasz Wasilczyk83aa0ab2023-08-11 00:06:51 +0000303 return result.c_str();
Mathias Agopianf001c922010-11-11 17:58:51 -0800304}
305
Mike Ma24743862020-01-29 00:36:55 -0800306/**
307 * Dump debugging information as android.service.SensorDeviceProto protobuf message using
308 * ProtoOutputStream.
309 *
310 * See proto definition and some notes about ProtoOutputStream in
311 * frameworks/base/core/proto/android/service/sensor_service.proto
312 */
313void SensorDevice::dump(ProtoOutputStream* proto) const {
314 using namespace service::SensorDeviceProto;
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000315 if (mHalWrapper == nullptr) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000316 proto->write(INITIALIZED, false);
Mike Ma24743862020-01-29 00:36:55 -0800317 return;
318 }
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000319 proto->write(INITIALIZED, true);
320 proto->write(TOTAL_SENSORS, int(mSensorList.size()));
321 proto->write(ACTIVE_SENSORS, int(mActivationCount.size()));
Mike Ma24743862020-01-29 00:36:55 -0800322
323 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000324 for (const auto& s : mSensorList) {
Mike Ma24743862020-01-29 00:36:55 -0800325 int32_t handle = s.handle;
326 const Info& info = mActivationCount.valueFor(handle);
327 if (info.numActiveClients() == 0) continue;
328
329 uint64_t token = proto->start(SENSORS);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000330 proto->write(SensorProto::HANDLE, handle);
331 proto->write(SensorProto::ACTIVE_COUNT, int(info.batchParams.size()));
Mike Ma24743862020-01-29 00:36:55 -0800332 for (size_t j = 0; j < info.batchParams.size(); j++) {
333 const BatchParams& params = info.batchParams[j];
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000334 proto->write(SensorProto::SAMPLING_PERIOD_MS, params.mTSample / 1e6f);
335 proto->write(SensorProto::BATCHING_PERIOD_MS, params.mTBatch / 1e6f);
Mike Ma24743862020-01-29 00:36:55 -0800336 }
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000337 proto->write(SensorProto::SAMPLING_PERIOD_SELECTED, info.bestBatchParams.mTSample / 1e6f);
338 proto->write(SensorProto::BATCHING_PERIOD_SELECTED, info.bestBatchParams.mTBatch / 1e6f);
Mike Ma24743862020-01-29 00:36:55 -0800339 proto->end(token);
340 }
341}
342
Mathias Agopianf001c922010-11-11 17:58:51 -0800343ssize_t SensorDevice::getSensorList(sensor_t const** list) {
Steven Morelandd15c0302016-12-20 11:14:50 -0800344 *list = &mSensorList[0];
345
346 return mSensorList.size();
Mathias Agopianf001c922010-11-11 17:58:51 -0800347}
348
349status_t SensorDevice::initCheck() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000350 return mHalWrapper != nullptr ? NO_ERROR : NO_INIT;
Mathias Agopianf001c922010-11-11 17:58:51 -0800351}
352
353ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000354 if (mHalWrapper == nullptr) return NO_INIT;
Brian Stack156da082018-10-01 15:58:53 -0700355
Brian Stacka28e9212018-09-19 15:20:30 -0700356 ssize_t eventsRead = 0;
Mark Wheatley8f285d92023-07-07 20:07:18 +0000357 if (mInHalBypassMode) [[unlikely]] {
358 eventsRead = getHalBypassInjectedEvents(buffer, count);
Brian Stacka28e9212018-09-19 15:20:30 -0700359 } else {
Mark Wheatley8f285d92023-07-07 20:07:18 +0000360 if (mHalWrapper->supportsMessageQueues()) {
361 eventsRead = mHalWrapper->pollFmq(buffer, count);
362 } else if (mHalWrapper->supportsPolling()) {
363 eventsRead = mHalWrapper->poll(buffer, count);
364 } else {
365 ALOGE("Must support polling or FMQ");
366 eventsRead = -1;
367 }
Brian Stacka28e9212018-09-19 15:20:30 -0700368 }
Arthur Ishiguro39e04c62021-12-26 18:40:16 +0000369
370 if (eventsRead > 0) {
371 for (ssize_t i = 0; i < eventsRead; i++) {
372 float resolution = getResolutionForSensor(buffer[i].sensor);
373 android::SensorDeviceUtils::quantizeSensorEventValues(&buffer[i], resolution);
Arthur Ishiguro65b59812021-12-26 19:09:54 +0000374
375 if (buffer[i].type == SENSOR_TYPE_DYNAMIC_SENSOR_META) {
376 struct dynamic_sensor_meta_event& dyn = buffer[i].dynamic_sensor_meta;
377 if (dyn.connected) {
378 std::unique_lock<std::mutex> lock(mDynamicSensorsMutex);
379 // Give MAX_DYN_SENSOR_WAIT_SEC for onDynamicSensorsConnected to be invoked
380 // since it can be received out of order from this event due to a bug in the
381 // HIDL spec that marks it as oneway.
382 auto it = mConnectedDynamicSensors.find(dyn.handle);
383 if (it == mConnectedDynamicSensors.end()) {
384 mDynamicSensorsCv.wait_for(lock, MAX_DYN_SENSOR_WAIT, [&, dyn] {
385 return mConnectedDynamicSensors.find(dyn.handle) !=
386 mConnectedDynamicSensors.end();
387 });
388 it = mConnectedDynamicSensors.find(dyn.handle);
389 CHECK(it != mConnectedDynamicSensors.end());
390 }
391
392 dyn.sensor = &it->second;
393 }
394 }
Arthur Ishiguro39e04c62021-12-26 18:40:16 +0000395 }
396 }
397
Brian Stacka28e9212018-09-19 15:20:30 -0700398 return eventsRead;
399}
400
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000401void SensorDevice::onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded) {
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000402 std::unique_lock<std::mutex> lock(mDynamicSensorsMutex);
403
Brian Stack6c49e6f2018-09-24 15:44:32 -0700404 // Allocate a sensor_t structure for each dynamic sensor added and insert
405 // it into the dictionary of connected dynamic sensors keyed by handle.
406 for (size_t i = 0; i < dynamicSensorsAdded.size(); ++i) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000407 const sensor_t& sensor = dynamicSensorsAdded[i];
Brian Stack6c49e6f2018-09-24 15:44:32 -0700408
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000409 auto it = mConnectedDynamicSensors.find(sensor.handle);
Brian Stack6c49e6f2018-09-24 15:44:32 -0700410 CHECK(it == mConnectedDynamicSensors.end());
411
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000412 mConnectedDynamicSensors.insert(std::make_pair(sensor.handle, sensor));
Brian Stack6c49e6f2018-09-24 15:44:32 -0700413 }
414
Anthony Stangefb4e33a2021-09-29 15:47:53 +0000415 mDynamicSensorsCv.notify_all();
Brian Stack6c49e6f2018-09-24 15:44:32 -0700416}
417
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000418void SensorDevice::onDynamicSensorsDisconnected(
419 const std::vector<int32_t>& /* dynamicSensorHandlesRemoved */) {
Brian Stack6c49e6f2018-09-24 15:44:32 -0700420 // TODO: Currently dynamic sensors do not seem to be removed
Brian Stack6c49e6f2018-09-24 15:44:32 -0700421}
422
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700423void SensorDevice::writeWakeLockHandled(uint32_t count) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000424 if (mHalWrapper != nullptr && mHalWrapper->supportsMessageQueues()) {
425 mHalWrapper->writeWakeLockHandled(count);
Brian Stackb7bfc0f2018-09-25 09:41:16 -0700426 }
427}
428
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000429void SensorDevice::autoDisable(void* ident, int handle) {
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700430 Mutex::Autolock _l(mLock);
Peng Xu042baec2017-08-09 19:28:27 -0700431 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
432 if (activationIndex < 0) {
433 ALOGW("Handle %d cannot be found in activation record", handle);
434 return;
435 }
436 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700437 info.removeBatchParamsForIdent(ident);
Brian Stackaa6dc092019-05-10 13:36:40 -0700438 if (info.numActiveClients() == 0) {
439 info.isActive = false;
440 }
Jaikumar Ganesh4c01b1a2013-04-16 15:52:23 -0700441}
442
Peng Xu6a2d3a02015-12-21 12:00:23 -0800443status_t SensorDevice::activate(void* ident, int handle, int enabled) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000444 if (mHalWrapper == nullptr) return NO_INIT;
Steven Morelandd15c0302016-12-20 11:14:50 -0800445
Brian Stack156da082018-10-01 15:58:53 -0700446 Mutex::Autolock _l(mLock);
447 return activateLocked(ident, handle, enabled);
448}
449
450status_t SensorDevice::activateLocked(void* ident, int handle, int enabled) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700451 bool activateHardware = false;
Mathias Agopianf001c922010-11-11 17:58:51 -0800452
Brian Stack156da082018-10-01 15:58:53 -0700453 status_t err(NO_ERROR);
454
Peng Xu042baec2017-08-09 19:28:27 -0700455 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
456 if (activationIndex < 0) {
457 ALOGW("Handle %d cannot be found in activation record", handle);
458 return BAD_VALUE;
459 }
460 Info& info(mActivationCount.editValueAt(activationIndex));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700461
Steve Blocka5512372011-12-20 16:23:08 +0000462 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000463 "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%zu", ident,
464 handle, enabled, info.batchParams.size());
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700465
Mathias Agopianf001c922010-11-11 17:58:51 -0800466 if (enabled) {
Mark Salyzyndb458612014-06-10 14:50:02 -0700467 ALOGD_IF(DEBUG_CONNECTIONS, "enable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700468
Aravind Akella4949c502015-02-11 15:54:35 -0800469 if (isClientDisabledLocked(ident)) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000470 ALOGW("SensorDevice::activate, isClientDisabledLocked(%p):true, handle:%d", ident,
471 handle);
xiamengsen94ae1312021-02-05 15:35:34 +0800472 return NO_ERROR;
Aravind Akella4949c502015-02-11 15:54:35 -0800473 }
474
Aravind Akella724d91d2013-06-27 12:04:23 -0700475 if (info.batchParams.indexOfKey(ident) >= 0) {
Brian Stack0c305fe2019-04-09 12:49:24 -0700476 if (info.numActiveClients() > 0 && !info.isActive) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700477 activateHardware = true;
Brian Stack0c305fe2019-04-09 12:49:24 -0700478 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800479 } else {
Aravind Akella724d91d2013-06-27 12:04:23 -0700480 // Log error. Every activate call should be preceded by a batch() call.
481 ALOGE("\t >>>ERROR: activate called without batch");
Mathias Agopianf001c922010-11-11 17:58:51 -0800482 }
483 } else {
Mark Salyzyndb458612014-06-10 14:50:02 -0700484 ALOGD_IF(DEBUG_CONNECTIONS, "disable index=%zd", info.batchParams.indexOfKey(ident));
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700485
Steven Morelandd15c0302016-12-20 11:14:50 -0800486 // If a connected dynamic sensor is deactivated, remove it from the
487 // dictionary.
488 auto it = mConnectedDynamicSensors.find(handle);
489 if (it != mConnectedDynamicSensors.end()) {
Steven Morelandd15c0302016-12-20 11:14:50 -0800490 mConnectedDynamicSensors.erase(it);
491 }
492
Aravind Akella724d91d2013-06-27 12:04:23 -0700493 if (info.removeBatchParamsForIdent(ident) >= 0) {
Aravind Akella4949c502015-02-11 15:54:35 -0800494 if (info.numActiveClients() == 0) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700495 // This is the last connection, we need to de-activate the underlying h/w sensor.
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700496 activateHardware = true;
Aravind Akella724d91d2013-06-27 12:04:23 -0700497 } else {
Steven Morelandd15c0302016-12-20 11:14:50 -0800498 // Call batch for this sensor with the previously calculated best effort
499 // batch_rate and timeout. One of the apps has unregistered for sensor
500 // events, and the best effort batch parameters might have changed.
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000501 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w batch 0x%08x %" PRId64 " %" PRId64,
502 handle, info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000503 mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
504 info.bestBatchParams.mTBatch);
Mathias Agopian50b66762010-11-29 17:26:51 -0800505 }
506 } else {
507 // sensor wasn't enabled for this ident
508 }
Aravind Akella4949c502015-02-11 15:54:35 -0800509
510 if (isClientDisabledLocked(ident)) {
511 return NO_ERROR;
512 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800513 }
Mathias Agopian50b66762010-11-29 17:26:51 -0800514
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700515 if (activateHardware) {
516 err = doActivateHardwareLocked(handle, enabled);
Mathias Agopiana1b7db92011-05-27 16:23:58 -0700517
Aravind Akella724d91d2013-06-27 12:04:23 -0700518 if (err != NO_ERROR && enabled) {
519 // Failure when enabling the sensor. Clean up on failure.
520 info.removeBatchParamsForIdent(ident);
Brian Stack0c305fe2019-04-09 12:49:24 -0700521 } else {
522 // Update the isActive flag if there is no error. If there is an error when disabling a
523 // sensor, still set the flag to false since the batch parameters have already been
524 // removed. This ensures that everything remains in-sync.
525 info.isActive = enabled;
Mathias Agopianac9a96d2013-07-12 02:01:16 -0700526 }
Mathias Agopianf001c922010-11-11 17:58:51 -0800527 }
528
Mathias Agopianf001c922010-11-11 17:58:51 -0800529 return err;
530}
531
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700532status_t SensorDevice::doActivateHardwareLocked(int handle, bool enabled) {
533 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w activate handle=%d enabled=%d", handle,
534 enabled);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000535 status_t err = mHalWrapper->activate(handle, enabled);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700536 ALOGE_IF(err, "Error %s sensor %d (%s)", enabled ? "activating" : "disabling", handle,
537 strerror(-err));
538 return err;
539}
540
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000541status_t SensorDevice::batch(void* ident, int handle, int flags, int64_t samplingPeriodNs,
542 int64_t maxBatchReportLatencyNs) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000543 if (mHalWrapper == nullptr) return NO_INIT;
Aravind Akella724d91d2013-06-27 12:04:23 -0700544
545 if (samplingPeriodNs < MINIMUM_EVENTS_PERIOD) {
546 samplingPeriodNs = MINIMUM_EVENTS_PERIOD;
547 }
Peng Xu2bec6232016-07-01 17:13:10 -0700548 if (maxBatchReportLatencyNs < 0) {
549 maxBatchReportLatencyNs = 0;
550 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700551
Aravind Akella724d91d2013-06-27 12:04:23 -0700552 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000553 "SensorDevice::batch: ident=%p, handle=0x%08x, flags=%d, period_ns=%" PRId64
554 " timeout=%" PRId64,
Aravind Akella724d91d2013-06-27 12:04:23 -0700555 ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
556
557 Mutex::Autolock _l(mLock);
Brian Stack156da082018-10-01 15:58:53 -0700558 return batchLocked(ident, handle, flags, samplingPeriodNs, maxBatchReportLatencyNs);
559}
560
561status_t SensorDevice::batchLocked(void* ident, int handle, int flags, int64_t samplingPeriodNs,
562 int64_t maxBatchReportLatencyNs) {
Peng Xu042baec2017-08-09 19:28:27 -0700563 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
564 if (activationIndex < 0) {
565 ALOGW("Handle %d cannot be found in activation record", handle);
566 return BAD_VALUE;
567 }
568 Info& info(mActivationCount.editValueAt(activationIndex));
Aravind Akella724d91d2013-06-27 12:04:23 -0700569
570 if (info.batchParams.indexOfKey(ident) < 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700571 BatchParams params(samplingPeriodNs, maxBatchReportLatencyNs);
Aravind Akella724d91d2013-06-27 12:04:23 -0700572 info.batchParams.add(ident, params);
573 } else {
574 // A batch has already been called with this ident. Update the batch parameters.
575 info.setBatchParamsForIdent(ident, flags, samplingPeriodNs, maxBatchReportLatencyNs);
576 }
577
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000578 status_t err = updateBatchParamsLocked(handle, info);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700579 if (err != NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000580 ALOGE("sensor batch failed 0x%08x %" PRId64 " %" PRId64 " err=%s", handle,
581 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch, strerror(-err));
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700582 info.removeBatchParamsForIdent(ident);
583 }
584
585 return err;
586}
587
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000588status_t SensorDevice::updateBatchParamsLocked(int handle, Info& info) {
Aravind Akella724d91d2013-06-27 12:04:23 -0700589 BatchParams prevBestBatchParams = info.bestBatchParams;
590 // Find the minimum of all timeouts and batch_rates for this sensor.
591 info.selectBatchParams();
592
593 ALOGD_IF(DEBUG_CONNECTIONS,
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000594 "\t>>> curr_period=%" PRId64 " min_period=%" PRId64 " curr_timeout=%" PRId64
595 " min_timeout=%" PRId64,
Peng Xu2bec6232016-07-01 17:13:10 -0700596 prevBestBatchParams.mTSample, info.bestBatchParams.mTSample,
597 prevBestBatchParams.mTBatch, info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700598
599 status_t err(NO_ERROR);
600 // If the min period or min timeout has changed since the last batch call, call batch.
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700601 if (prevBestBatchParams != info.bestBatchParams && info.numActiveClients() > 0) {
Peng Xu2bec6232016-07-01 17:13:10 -0700602 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w BATCH 0x%08x %" PRId64 " %" PRId64, handle,
603 info.bestBatchParams.mTSample, info.bestBatchParams.mTBatch);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000604 err = mHalWrapper->batch(handle, info.bestBatchParams.mTSample,
605 info.bestBatchParams.mTBatch);
Aravind Akella724d91d2013-06-27 12:04:23 -0700606 }
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700607
Aravind Akella724d91d2013-06-27 12:04:23 -0700608 return err;
609}
610
Peng Xu6a2d3a02015-12-21 12:00:23 -0800611status_t SensorDevice::setDelay(void* ident, int handle, int64_t samplingPeriodNs) {
Peng Xu2bec6232016-07-01 17:13:10 -0700612 return batch(ident, handle, 0, samplingPeriodNs, 0);
Mathias Agopian667102f2011-09-14 16:43:34 -0700613}
614
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700615int SensorDevice::getHalDeviceVersion() const {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000616 if (mHalWrapper == nullptr) return -1;
Steven Morelandd15c0302016-12-20 11:14:50 -0800617 return SENSORS_DEVICE_API_VERSION_1_4;
Jaikumar Ganesh4342fdf2013-04-08 16:43:12 -0700618}
619
Brian Duddie24f2b4c2022-05-05 17:07:05 -0700620status_t SensorDevice::flush(void* ident, int handle) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000621 if (mHalWrapper == nullptr) return NO_INIT;
Brian Duddie24f2b4c2022-05-05 17:07:05 -0700622 if (isClientDisabled(ident)) return INVALID_OPERATION;
623 ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w flush %d", handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000624 return mHalWrapper->flush(handle);
Aravind Akella724d91d2013-06-27 12:04:23 -0700625}
626
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700627bool SensorDevice::isClientDisabled(void* ident) const {
Aravind Akella4949c502015-02-11 15:54:35 -0800628 Mutex::Autolock _l(mLock);
629 return isClientDisabledLocked(ident);
630}
631
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700632bool SensorDevice::isClientDisabledLocked(void* ident) const {
633 return mDisabledClients.count(ident) > 0;
634}
635
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000636std::vector<void*> SensorDevice::getDisabledClientsLocked() const {
637 std::vector<void*> vec;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700638 for (const auto& it : mDisabledClients) {
639 vec.push_back(it.first);
640 }
641
642 return vec;
643}
644
645void SensorDevice::addDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
646 mDisabledClients[ident] |= 1 << reason;
647}
648
649void SensorDevice::removeDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
650 if (isClientDisabledLocked(ident)) {
651 mDisabledClients[ident] &= ~(1 << reason);
652 if (mDisabledClients[ident] == 0) {
653 mDisabledClients.erase(ident);
654 }
655 }
656}
657
658void SensorDevice::setUidStateForConnection(void* ident, SensorService::UidState state) {
659 Mutex::Autolock _l(mLock);
660 if (state == SensorService::UID_STATE_ACTIVE) {
661 removeDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
662 } else {
663 addDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
664 }
665
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000666 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700667 int handle = mActivationCount.keyAt(i);
668 Info& info = mActivationCount.editValueAt(i);
669
670 if (info.hasBatchParamsForIdent(ident)) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700671 updateBatchParamsLocked(handle, info);
672 bool disable = info.numActiveClients() == 0 && info.isActive;
673 bool enable = info.numActiveClients() > 0 && !info.isActive;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700674
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000675 if ((enable || disable) && doActivateHardwareLocked(handle, enable) == NO_ERROR) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700676 info.isActive = enable;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700677 }
678 }
679 }
Aravind Akella4949c502015-02-11 15:54:35 -0800680}
681
Brian Stackbce04d72019-03-21 10:54:10 -0700682bool SensorDevice::isSensorActive(int handle) const {
683 Mutex::Autolock _l(mLock);
684 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
685 if (activationIndex < 0) {
686 return false;
687 }
Chris Kuiperc63880a2021-08-04 15:06:11 -0700688 return mActivationCount.valueAt(activationIndex).isActive;
Brian Stackbce04d72019-03-21 10:54:10 -0700689}
690
Anh Pham5198c992021-02-10 14:15:30 +0100691void SensorDevice::onMicSensorAccessChanged(void* ident, int handle, nsecs_t samplingPeriodNs) {
692 Mutex::Autolock _l(mLock);
693 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
694 if (activationIndex < 0) {
695 ALOGW("Handle %d cannot be found in activation record", handle);
696 return;
697 }
698 Info& info(mActivationCount.editValueAt(activationIndex));
699 if (info.hasBatchParamsForIdent(ident)) {
700 ssize_t index = info.batchParams.indexOfKey(ident);
701 BatchParams& params = info.batchParams.editValueAt(index);
702 params.mTSample = samplingPeriodNs;
703 }
704}
705
Aravind Akella4949c502015-02-11 15:54:35 -0800706void SensorDevice::enableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000707 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800708 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700709
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000710 for (void* client : getDisabledClientsLocked()) {
711 removeDisabledReasonForIdentLocked(client,
712 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700713 }
714
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000715 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Aravind Akella4949c502015-02-11 15:54:35 -0800716 Info& info = mActivationCount.editValueAt(i);
717 if (info.batchParams.isEmpty()) continue;
718 info.selectBatchParams();
719 const int sensor_handle = mActivationCount.keyAt(i);
720 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> reenable actuating h/w sensor enable handle=%d ",
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000721 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000722 status_t err = mHalWrapper->batch(sensor_handle, info.bestBatchParams.mTSample,
723 info.bestBatchParams.mTBatch);
Steven Morelandd15c0302016-12-20 11:14:50 -0800724 ALOGE_IF(err, "Error calling batch on sensor %d (%s)", sensor_handle, strerror(-err));
Aravind Akella4949c502015-02-11 15:54:35 -0800725
726 if (err == NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000727 err = mHalWrapper->activate(sensor_handle, 1 /* enabled */);
Aravind Akella4949c502015-02-11 15:54:35 -0800728 ALOGE_IF(err, "Error activating sensor %d (%s)", sensor_handle, strerror(-err));
729 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700730
731 if (err == NO_ERROR) {
732 info.isActive = true;
733 }
Aravind Akella4949c502015-02-11 15:54:35 -0800734 }
735}
736
737void SensorDevice::disableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000738 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800739 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000740 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Brian Stack4a11fed2019-04-22 15:07:50 -0700741 Info& info = mActivationCount.editValueAt(i);
Aravind Akella4949c502015-02-11 15:54:35 -0800742 // Check if this sensor has been activated previously and disable it.
743 if (info.batchParams.size() > 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000744 const int sensor_handle = mActivationCount.keyAt(i);
745 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> actuating h/w sensor disable handle=%d ",
746 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000747 mHalWrapper->activate(sensor_handle, 0 /* enabled */);
Steven Morelandd15c0302016-12-20 11:14:50 -0800748
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000749 // Add all the connections that were registered for this sensor to the disabled
750 // clients list.
751 for (size_t j = 0; j < info.batchParams.size(); ++j) {
752 addDisabledReasonForIdentLocked(info.batchParams.keyAt(j),
753 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
754 ALOGI("added %p to mDisabledClients", info.batchParams.keyAt(j));
755 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700756
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000757 info.isActive = false;
Aravind Akella4949c502015-02-11 15:54:35 -0800758 }
759 }
760}
761
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000762status_t SensorDevice::injectSensorData(const sensors_event_t* injected_sensor_event) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000763 if (mHalWrapper == nullptr) return NO_INIT;
Brian Duddie24f2b4c2022-05-05 17:07:05 -0700764 ALOGD_IF(DEBUG_CONNECTIONS,
765 "sensor_event handle=%d ts=%" PRId64 " data=%.2f, %.2f, %.2f %.2f %.2f %.2f",
766 injected_sensor_event->sensor, injected_sensor_event->timestamp,
767 injected_sensor_event->data[0], injected_sensor_event->data[1],
768 injected_sensor_event->data[2], injected_sensor_event->data[3],
769 injected_sensor_event->data[4], injected_sensor_event->data[5]);
770
Mark Wheatley8f285d92023-07-07 20:07:18 +0000771 if (mInHalBypassMode) {
772 std::lock_guard _l(mHalBypassLock);
773 mHalBypassInjectedEventQueue.push(*injected_sensor_event);
774 mHalBypassCV.notify_one();
775 return OK;
776 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000777 return mHalWrapper->injectSensorData(injected_sensor_event);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700778}
779
780status_t SensorDevice::setMode(uint32_t mode) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000781 if (mHalWrapper == nullptr) return NO_INIT;
Mark Wheatley8f285d92023-07-07 20:07:18 +0000782 if (mode == SensorService::Mode::HAL_BYPASS_REPLAY_DATA_INJECTION) {
783 if (!mInHalBypassMode) {
784 std::lock_guard _l(mHalBypassLock);
785 while (!mHalBypassInjectedEventQueue.empty()) {
786 // flush any stale events from the injected event queue
787 mHalBypassInjectedEventQueue.pop();
788 }
789 mInHalBypassMode = true;
790 }
791 return OK;
792 } else {
793 if (mInHalBypassMode) {
794 // We are transitioning out of HAL Bypass mode. We need to notify the reader thread
795 // (specifically getHalBypassInjectedEvents()) of this change in state so that it is not
796 // stuck waiting on more injected events to come and therefore preventing events coming
797 // from the HAL from being read.
798 std::lock_guard _l(mHalBypassLock);
799 mInHalBypassMode = false;
800 mHalBypassCV.notify_one();
801 }
802 }
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000803 return mHalWrapper->setOperationMode(static_cast<SensorService::Mode>(mode));
Peng Xua8fad9b2017-03-17 12:20:27 -0700804}
Steven Morelandd15c0302016-12-20 11:14:50 -0800805
Peng Xua8fad9b2017-03-17 12:20:27 -0700806int32_t SensorDevice::registerDirectChannel(const sensors_direct_mem_t* memory) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000807 if (mHalWrapper == nullptr) return NO_INIT;
Peng Xua8fad9b2017-03-17 12:20:27 -0700808 Mutex::Autolock _l(mLock);
809
Arthur Ishiguro28b05082022-04-12 16:26:20 +0000810 int32_t channelHandle;
811 status_t status = mHalWrapper->registerDirectChannel(memory, &channelHandle);
812 if (status != OK) {
813 channelHandle = -1;
814 }
815
816 return channelHandle;
Peng Xua8fad9b2017-03-17 12:20:27 -0700817}
818
819void SensorDevice::unregisterDirectChannel(int32_t channelHandle) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000820 mHalWrapper->unregisterDirectChannel(channelHandle);
Peng Xua8fad9b2017-03-17 12:20:27 -0700821}
822
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000823int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle,
824 const struct sensors_direct_cfg_t* config) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000825 if (mHalWrapper == nullptr) return NO_INIT;
Peng Xua8fad9b2017-03-17 12:20:27 -0700826 Mutex::Autolock _l(mLock);
827
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000828 return mHalWrapper->configureDirectChannel(sensorHandle, channelHandle, config);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700829}
830
Mathias Agopian667102f2011-09-14 16:43:34 -0700831// ---------------------------------------------------------------------------
832
Brian Stack156da082018-10-01 15:58:53 -0700833int SensorDevice::Info::numActiveClients() const {
Aravind Akella4949c502015-02-11 15:54:35 -0800834 SensorDevice& device(SensorDevice::getInstance());
835 int num = 0;
836 for (size_t i = 0; i < batchParams.size(); ++i) {
837 if (!device.isClientDisabledLocked(batchParams.keyAt(i))) {
838 ++num;
839 }
840 }
841 return num;
842}
843
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000844status_t SensorDevice::Info::setBatchParamsForIdent(void* ident, int, int64_t samplingPeriodNs,
Aravind Akella724d91d2013-06-27 12:04:23 -0700845 int64_t maxBatchReportLatencyNs) {
846 ssize_t index = batchParams.indexOfKey(ident);
Mathias Agopian667102f2011-09-14 16:43:34 -0700847 if (index < 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000848 ALOGE("Info::setBatchParamsForIdent(ident=%p, period_ns=%" PRId64 " timeout=%" PRId64
849 ") failed (%s)",
Aravind Akella724d91d2013-06-27 12:04:23 -0700850 ident, samplingPeriodNs, maxBatchReportLatencyNs, strerror(-index));
Mathias Agopian667102f2011-09-14 16:43:34 -0700851 return BAD_INDEX;
852 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700853 BatchParams& params = batchParams.editValueAt(index);
Peng Xu2bec6232016-07-01 17:13:10 -0700854 params.mTSample = samplingPeriodNs;
855 params.mTBatch = maxBatchReportLatencyNs;
Mathias Agopian667102f2011-09-14 16:43:34 -0700856 return NO_ERROR;
857}
858
Aravind Akella724d91d2013-06-27 12:04:23 -0700859void SensorDevice::Info::selectBatchParams() {
Peng Xu2bec6232016-07-01 17:13:10 -0700860 BatchParams bestParams; // default to max Tsample and max Tbatch
Aravind Akella4949c502015-02-11 15:54:35 -0800861 SensorDevice& device(SensorDevice::getInstance());
Aravind Akella724d91d2013-06-27 12:04:23 -0700862
Aravind Akella4949c502015-02-11 15:54:35 -0800863 for (size_t i = 0; i < batchParams.size(); ++i) {
Peng Xu2bec6232016-07-01 17:13:10 -0700864 if (device.isClientDisabledLocked(batchParams.keyAt(i))) {
865 continue;
Aravind Akella724d91d2013-06-27 12:04:23 -0700866 }
Peng Xu2bec6232016-07-01 17:13:10 -0700867 bestParams.merge(batchParams[i]);
868 }
869 // if mTBatch <= mTSample, it is in streaming mode. set mTbatch to 0 to demand this explicitly.
870 if (bestParams.mTBatch <= bestParams.mTSample) {
871 bestParams.mTBatch = 0;
Mathias Agopianf001c922010-11-11 17:58:51 -0800872 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700873 bestBatchParams = bestParams;
874}
875
876ssize_t SensorDevice::Info::removeBatchParamsForIdent(void* ident) {
877 ssize_t idx = batchParams.removeItem(ident);
878 if (idx >= 0) {
879 selectBatchParams();
880 }
881 return idx;
Mathias Agopianf001c922010-11-11 17:58:51 -0800882}
883
Peng Xu4f707f82016-09-26 11:28:32 -0700884void SensorDevice::notifyConnectionDestroyed(void* ident) {
885 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700886 mDisabledClients.erase(ident);
Peng Xu4f707f82016-09-26 11:28:32 -0700887}
888
Peng Xu53632542017-01-23 20:06:27 -0800889bool SensorDevice::isDirectReportSupported() const {
Steven Morelandd15c0302016-12-20 11:14:50 -0800890 return mIsDirectReportSupported;
Peng Xu53632542017-01-23 20:06:27 -0800891}
Steven Morelandd15c0302016-12-20 11:14:50 -0800892
Anthony Stange12924862020-03-20 10:46:15 -0400893float SensorDevice::getResolutionForSensor(int sensorHandle) {
894 for (size_t i = 0; i < mSensorList.size(); i++) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000895 if (sensorHandle == mSensorList[i].handle) {
896 return mSensorList[i].resolution;
897 }
Anthony Stange12924862020-03-20 10:46:15 -0400898 }
899
900 auto it = mConnectedDynamicSensors.find(sensorHandle);
901 if (it != mConnectedDynamicSensors.end()) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000902 return it->second.resolution;
Anthony Stange12924862020-03-20 10:46:15 -0400903 }
904
905 return 0;
906}
907
Mark Wheatley8f285d92023-07-07 20:07:18 +0000908ssize_t SensorDevice::getHalBypassInjectedEvents(sensors_event_t* buffer,
909 size_t maxNumEventsToRead) {
910 std::unique_lock _l(mHalBypassLock);
911 if (mHalBypassInjectedEventQueue.empty()) {
912 // if the injected event queue is empty, block and wait till there are events to process
913 // or if we are no longer in HAL Bypass mode so that this method is not called in a tight
914 // loop. Otherwise, continue copying the injected events into the supplied buffer.
915 mHalBypassCV.wait(_l, [this] {
916 return (!mHalBypassInjectedEventQueue.empty() || !mInHalBypassMode);
917 });
918 }
919 size_t eventsToRead = std::min(mHalBypassInjectedEventQueue.size(), maxNumEventsToRead);
920 for (size_t i = 0; i < eventsToRead; i++) {
921 buffer[i] = mHalBypassInjectedEventQueue.front();
922 mHalBypassInjectedEventQueue.pop();
923 }
924 return eventsToRead;
925}
926
Mathias Agopianf001c922010-11-11 17:58:51 -0800927// ---------------------------------------------------------------------------
928}; // namespace android