blob: ee621d65631630ae7facc4107d779f6535a221c5 [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) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000575 if (mHalWrapper == nullptr) return NO_INIT;
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000576 return mHalWrapper->flush(handle);
Aravind Akella724d91d2013-06-27 12:04:23 -0700577}
578
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700579bool SensorDevice::isClientDisabled(void* ident) const {
Aravind Akella4949c502015-02-11 15:54:35 -0800580 Mutex::Autolock _l(mLock);
581 return isClientDisabledLocked(ident);
582}
583
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700584bool SensorDevice::isClientDisabledLocked(void* ident) const {
585 return mDisabledClients.count(ident) > 0;
586}
587
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000588std::vector<void*> SensorDevice::getDisabledClientsLocked() const {
589 std::vector<void*> vec;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700590 for (const auto& it : mDisabledClients) {
591 vec.push_back(it.first);
592 }
593
594 return vec;
595}
596
597void SensorDevice::addDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
598 mDisabledClients[ident] |= 1 << reason;
599}
600
601void SensorDevice::removeDisabledReasonForIdentLocked(void* ident, DisabledReason reason) {
602 if (isClientDisabledLocked(ident)) {
603 mDisabledClients[ident] &= ~(1 << reason);
604 if (mDisabledClients[ident] == 0) {
605 mDisabledClients.erase(ident);
606 }
607 }
608}
609
610void SensorDevice::setUidStateForConnection(void* ident, SensorService::UidState state) {
611 Mutex::Autolock _l(mLock);
612 if (state == SensorService::UID_STATE_ACTIVE) {
613 removeDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
614 } else {
615 addDisabledReasonForIdentLocked(ident, DisabledReason::DISABLED_REASON_UID_IDLE);
616 }
617
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000618 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700619 int handle = mActivationCount.keyAt(i);
620 Info& info = mActivationCount.editValueAt(i);
621
622 if (info.hasBatchParamsForIdent(ident)) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700623 updateBatchParamsLocked(handle, info);
624 bool disable = info.numActiveClients() == 0 && info.isActive;
625 bool enable = info.numActiveClients() > 0 && !info.isActive;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700626
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000627 if ((enable || disable) && doActivateHardwareLocked(handle, enable) == NO_ERROR) {
Arthur Ishiguro3cc2c352020-06-01 16:15:19 -0700628 info.isActive = enable;
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700629 }
630 }
631 }
Aravind Akella4949c502015-02-11 15:54:35 -0800632}
633
Brian Stackbce04d72019-03-21 10:54:10 -0700634bool SensorDevice::isSensorActive(int handle) const {
635 Mutex::Autolock _l(mLock);
636 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
637 if (activationIndex < 0) {
638 return false;
639 }
Chris Kuiperc63880a2021-08-04 15:06:11 -0700640 return mActivationCount.valueAt(activationIndex).isActive;
Brian Stackbce04d72019-03-21 10:54:10 -0700641}
642
Anh Pham5198c992021-02-10 14:15:30 +0100643void SensorDevice::onMicSensorAccessChanged(void* ident, int handle, nsecs_t samplingPeriodNs) {
644 Mutex::Autolock _l(mLock);
645 ssize_t activationIndex = mActivationCount.indexOfKey(handle);
646 if (activationIndex < 0) {
647 ALOGW("Handle %d cannot be found in activation record", handle);
648 return;
649 }
650 Info& info(mActivationCount.editValueAt(activationIndex));
651 if (info.hasBatchParamsForIdent(ident)) {
652 ssize_t index = info.batchParams.indexOfKey(ident);
653 BatchParams& params = info.batchParams.editValueAt(index);
654 params.mTSample = samplingPeriodNs;
655 }
656}
657
Aravind Akella4949c502015-02-11 15:54:35 -0800658void SensorDevice::enableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000659 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800660 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700661
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000662 for (void* client : getDisabledClientsLocked()) {
663 removeDisabledReasonForIdentLocked(client,
664 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700665 }
666
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000667 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Aravind Akella4949c502015-02-11 15:54:35 -0800668 Info& info = mActivationCount.editValueAt(i);
669 if (info.batchParams.isEmpty()) continue;
670 info.selectBatchParams();
671 const int sensor_handle = mActivationCount.keyAt(i);
672 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> reenable actuating h/w sensor enable handle=%d ",
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000673 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000674 status_t err = mHalWrapper->batch(sensor_handle, info.bestBatchParams.mTSample,
675 info.bestBatchParams.mTBatch);
Steven Morelandd15c0302016-12-20 11:14:50 -0800676 ALOGE_IF(err, "Error calling batch on sensor %d (%s)", sensor_handle, strerror(-err));
Aravind Akella4949c502015-02-11 15:54:35 -0800677
678 if (err == NO_ERROR) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000679 err = mHalWrapper->activate(sensor_handle, 1 /* enabled */);
Aravind Akella4949c502015-02-11 15:54:35 -0800680 ALOGE_IF(err, "Error activating sensor %d (%s)", sensor_handle, strerror(-err));
681 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700682
683 if (err == NO_ERROR) {
684 info.isActive = true;
685 }
Aravind Akella4949c502015-02-11 15:54:35 -0800686 }
687}
688
689void SensorDevice::disableAllSensors() {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000690 if (mHalWrapper == nullptr) return;
Aravind Akella4949c502015-02-11 15:54:35 -0800691 Mutex::Autolock _l(mLock);
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000692 for (size_t i = 0; i < mActivationCount.size(); ++i) {
Brian Stack4a11fed2019-04-22 15:07:50 -0700693 Info& info = mActivationCount.editValueAt(i);
Aravind Akella4949c502015-02-11 15:54:35 -0800694 // Check if this sensor has been activated previously and disable it.
695 if (info.batchParams.size() > 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000696 const int sensor_handle = mActivationCount.keyAt(i);
697 ALOGD_IF(DEBUG_CONNECTIONS, "\t>> actuating h/w sensor disable handle=%d ",
698 sensor_handle);
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000699 mHalWrapper->activate(sensor_handle, 0 /* enabled */);
Steven Morelandd15c0302016-12-20 11:14:50 -0800700
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000701 // Add all the connections that were registered for this sensor to the disabled
702 // clients list.
703 for (size_t j = 0; j < info.batchParams.size(); ++j) {
704 addDisabledReasonForIdentLocked(info.batchParams.keyAt(j),
705 DisabledReason::DISABLED_REASON_SERVICE_RESTRICTED);
706 ALOGI("added %p to mDisabledClients", info.batchParams.keyAt(j));
707 }
Brian Stack4a11fed2019-04-22 15:07:50 -0700708
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000709 info.isActive = false;
Aravind Akella4949c502015-02-11 15:54:35 -0800710 }
711 }
712}
713
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000714status_t SensorDevice::injectSensorData(const sensors_event_t* injected_sensor_event) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000715 if (mHalWrapper == nullptr) return NO_INIT;
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000716 return mHalWrapper->injectSensorData(injected_sensor_event);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700717}
718
719status_t SensorDevice::setMode(uint32_t mode) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000720 if (mHalWrapper == nullptr) return NO_INIT;
721 return mHalWrapper->setOperationMode(static_cast<SensorService::Mode>(mode));
Peng Xua8fad9b2017-03-17 12:20:27 -0700722}
Steven Morelandd15c0302016-12-20 11:14:50 -0800723
Peng Xua8fad9b2017-03-17 12:20:27 -0700724int32_t SensorDevice::registerDirectChannel(const sensors_direct_mem_t* memory) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000725 if (mHalWrapper == nullptr) return NO_INIT;
Peng Xua8fad9b2017-03-17 12:20:27 -0700726 Mutex::Autolock _l(mLock);
727
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000728 return mHalWrapper->registerDirectChannel(memory, nullptr);
Peng Xua8fad9b2017-03-17 12:20:27 -0700729}
730
731void SensorDevice::unregisterDirectChannel(int32_t channelHandle) {
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000732 mHalWrapper->unregisterDirectChannel(channelHandle);
Peng Xua8fad9b2017-03-17 12:20:27 -0700733}
734
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000735int32_t SensorDevice::configureDirectChannel(int32_t sensorHandle, int32_t channelHandle,
736 const struct sensors_direct_cfg_t* config) {
Arthur Ishiguro7359a582021-12-29 17:49:20 +0000737 if (mHalWrapper == nullptr) return NO_INIT;
Peng Xua8fad9b2017-03-17 12:20:27 -0700738 Mutex::Autolock _l(mLock);
739
Arthur Ishiguro24804dc2021-11-12 17:17:09 +0000740 return mHalWrapper->configureDirectChannel(sensorHandle, channelHandle, config);
Aravind Akellaa9e6cc32015-04-16 18:57:31 -0700741}
742
Mathias Agopian667102f2011-09-14 16:43:34 -0700743// ---------------------------------------------------------------------------
744
Brian Stack156da082018-10-01 15:58:53 -0700745int SensorDevice::Info::numActiveClients() const {
Aravind Akella4949c502015-02-11 15:54:35 -0800746 SensorDevice& device(SensorDevice::getInstance());
747 int num = 0;
748 for (size_t i = 0; i < batchParams.size(); ++i) {
749 if (!device.isClientDisabledLocked(batchParams.keyAt(i))) {
750 ++num;
751 }
752 }
753 return num;
754}
755
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000756status_t SensorDevice::Info::setBatchParamsForIdent(void* ident, int, int64_t samplingPeriodNs,
Aravind Akella724d91d2013-06-27 12:04:23 -0700757 int64_t maxBatchReportLatencyNs) {
758 ssize_t index = batchParams.indexOfKey(ident);
Mathias Agopian667102f2011-09-14 16:43:34 -0700759 if (index < 0) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000760 ALOGE("Info::setBatchParamsForIdent(ident=%p, period_ns=%" PRId64 " timeout=%" PRId64
761 ") failed (%s)",
Aravind Akella724d91d2013-06-27 12:04:23 -0700762 ident, samplingPeriodNs, maxBatchReportLatencyNs, strerror(-index));
Mathias Agopian667102f2011-09-14 16:43:34 -0700763 return BAD_INDEX;
764 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700765 BatchParams& params = batchParams.editValueAt(index);
Peng Xu2bec6232016-07-01 17:13:10 -0700766 params.mTSample = samplingPeriodNs;
767 params.mTBatch = maxBatchReportLatencyNs;
Mathias Agopian667102f2011-09-14 16:43:34 -0700768 return NO_ERROR;
769}
770
Aravind Akella724d91d2013-06-27 12:04:23 -0700771void SensorDevice::Info::selectBatchParams() {
Peng Xu2bec6232016-07-01 17:13:10 -0700772 BatchParams bestParams; // default to max Tsample and max Tbatch
Aravind Akella4949c502015-02-11 15:54:35 -0800773 SensorDevice& device(SensorDevice::getInstance());
Aravind Akella724d91d2013-06-27 12:04:23 -0700774
Aravind Akella4949c502015-02-11 15:54:35 -0800775 for (size_t i = 0; i < batchParams.size(); ++i) {
Peng Xu2bec6232016-07-01 17:13:10 -0700776 if (device.isClientDisabledLocked(batchParams.keyAt(i))) {
777 continue;
Aravind Akella724d91d2013-06-27 12:04:23 -0700778 }
Peng Xu2bec6232016-07-01 17:13:10 -0700779 bestParams.merge(batchParams[i]);
780 }
781 // if mTBatch <= mTSample, it is in streaming mode. set mTbatch to 0 to demand this explicitly.
782 if (bestParams.mTBatch <= bestParams.mTSample) {
783 bestParams.mTBatch = 0;
Mathias Agopianf001c922010-11-11 17:58:51 -0800784 }
Aravind Akella724d91d2013-06-27 12:04:23 -0700785 bestBatchParams = bestParams;
786}
787
788ssize_t SensorDevice::Info::removeBatchParamsForIdent(void* ident) {
789 ssize_t idx = batchParams.removeItem(ident);
790 if (idx >= 0) {
791 selectBatchParams();
792 }
793 return idx;
Mathias Agopianf001c922010-11-11 17:58:51 -0800794}
795
Peng Xu4f707f82016-09-26 11:28:32 -0700796void SensorDevice::notifyConnectionDestroyed(void* ident) {
797 Mutex::Autolock _l(mLock);
Arthur Ishiguro539c27c2020-04-13 09:47:59 -0700798 mDisabledClients.erase(ident);
Peng Xu4f707f82016-09-26 11:28:32 -0700799}
800
Peng Xu53632542017-01-23 20:06:27 -0800801bool SensorDevice::isDirectReportSupported() const {
Steven Morelandd15c0302016-12-20 11:14:50 -0800802 return mIsDirectReportSupported;
Peng Xu53632542017-01-23 20:06:27 -0800803}
Steven Morelandd15c0302016-12-20 11:14:50 -0800804
Anthony Stange12924862020-03-20 10:46:15 -0400805float SensorDevice::getResolutionForSensor(int sensorHandle) {
806 for (size_t i = 0; i < mSensorList.size(); i++) {
Arthur Ishigurod6b9e212021-11-14 01:20:55 +0000807 if (sensorHandle == mSensorList[i].handle) {
808 return mSensorList[i].resolution;
809 }
Anthony Stange12924862020-03-20 10:46:15 -0400810 }
811
812 auto it = mConnectedDynamicSensors.find(sensorHandle);
813 if (it != mConnectedDynamicSensors.end()) {
Arthur Ishiguro71e78ac2021-11-14 01:18:47 +0000814 return it->second.resolution;
Anthony Stange12924862020-03-20 10:46:15 -0400815 }
816
817 return 0;
818}
819
Mathias Agopianf001c922010-11-11 17:58:51 -0800820// ---------------------------------------------------------------------------
821}; // namespace android