blob: cceb7d5c25534d5c383914915a25175e66cead6f [file] [log] [blame]
Brian Stack60fcdcf2018-10-16 14:51:34 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "Sensors.h"
18
Brian Stack897528d2018-10-23 10:38:03 -070019#include <android/hardware/sensors/2.0/types.h>
Brian Stack475d4d42018-10-19 15:58:09 -070020#include <log/log.h>
21
Brian Stack60fcdcf2018-10-16 14:51:34 -070022namespace android {
23namespace hardware {
24namespace sensors {
25namespace V2_0 {
26namespace implementation {
27
28using ::android::hardware::sensors::V1_0::Event;
29using ::android::hardware::sensors::V1_0::OperationMode;
30using ::android::hardware::sensors::V1_0::RateLevel;
31using ::android::hardware::sensors::V1_0::Result;
32using ::android::hardware::sensors::V1_0::SharedMemInfo;
33
Brian Stack2927ab72018-10-23 11:22:55 -070034Sensors::Sensors() : mEventQueueFlag(nullptr) {
35 std::shared_ptr<AccelSensor> accel =
36 std::make_shared<AccelSensor>(1 /* sensorHandle */, this /* callback */);
37 mSensors[accel->getSensorInfo().sensorHandle] = accel;
38}
Brian Stack475d4d42018-10-19 15:58:09 -070039
40Sensors::~Sensors() {
41 deleteEventFlag();
42}
43
Brian Stack60fcdcf2018-10-16 14:51:34 -070044// Methods from ::android::hardware::sensors::V2_0::ISensors follow.
Brian Stack897528d2018-10-23 10:38:03 -070045Return<void> Sensors::getSensorsList(getSensorsList_cb _hidl_cb) {
46 std::vector<SensorInfo> sensors;
47 for (const auto& sensor : mSensors) {
48 sensors.push_back(sensor.second->getSensorInfo());
49 }
50
51 // Call the HIDL callback with the SensorInfo
52 _hidl_cb(sensors);
53
Brian Stack60fcdcf2018-10-16 14:51:34 -070054 return Void();
55}
56
57Return<Result> Sensors::setOperationMode(OperationMode /* mode */) {
58 // TODO implement
59 return Result{};
60}
61
Brian Stack897528d2018-10-23 10:38:03 -070062Return<Result> Sensors::activate(int32_t sensorHandle, bool enabled) {
63 auto sensor = mSensors.find(sensorHandle);
64 if (sensor != mSensors.end()) {
65 sensor->second->activate(enabled);
66 return Result::OK;
67 }
68 return Result::BAD_VALUE;
Brian Stack60fcdcf2018-10-16 14:51:34 -070069}
70
71Return<Result> Sensors::initialize(
Brian Stack475d4d42018-10-19 15:58:09 -070072 const ::android::hardware::MQDescriptorSync<Event>& eventQueueDescriptor,
73 const ::android::hardware::MQDescriptorSync<uint32_t>& wakeLockDescriptor,
74 const sp<ISensorsCallback>& sensorsCallback) {
75 Result result = Result::OK;
76
77 // Save a reference to the callback
78 mCallback = sensorsCallback;
79
80 // Create the Event FMQ from the eventQueueDescriptor. Reset the read/write positions.
81 mEventQueue =
82 std::make_unique<EventMessageQueue>(eventQueueDescriptor, true /* resetPointers */);
83
84 // Ensure that any existing EventFlag is properly deleted
85 deleteEventFlag();
86
87 // Create the EventFlag that is used to signal to the framework that sensor events have been
88 // written to the Event FMQ
89 if (EventFlag::createEventFlag(mEventQueue->getEventFlagWord(), &mEventQueueFlag) != OK) {
90 result = Result::BAD_VALUE;
91 }
92
93 // Create the Wake Lock FMQ that is used by the framework to communicate whenever WAKE_UP
94 // events have been successfully read and handled by the framework.
95 mWakeLockQueue =
96 std::make_unique<WakeLockMessageQueue>(wakeLockDescriptor, true /* resetPointers */);
97
98 if (!mCallback || !mEventQueue || !mWakeLockQueue || mEventQueueFlag == nullptr) {
99 result = Result::BAD_VALUE;
100 }
101
102 return result;
Brian Stack60fcdcf2018-10-16 14:51:34 -0700103}
104
Brian Stack897528d2018-10-23 10:38:03 -0700105Return<Result> Sensors::batch(int32_t sensorHandle, int64_t samplingPeriodNs,
Brian Stack60fcdcf2018-10-16 14:51:34 -0700106 int64_t /* maxReportLatencyNs */) {
Brian Stack897528d2018-10-23 10:38:03 -0700107 auto sensor = mSensors.find(sensorHandle);
Brian Stack237abc62018-10-23 11:09:59 -0700108 if (sensor != mSensors.end()) {
109 sensor->second->batch(samplingPeriodNs);
110 return Result::OK;
Brian Stack897528d2018-10-23 10:38:03 -0700111 }
Brian Stack237abc62018-10-23 11:09:59 -0700112 return Result::BAD_VALUE;
Brian Stack60fcdcf2018-10-16 14:51:34 -0700113}
114
Brian Stacke4f74c72018-10-29 11:51:46 -0700115Return<Result> Sensors::flush(int32_t sensorHandle) {
116 auto sensor = mSensors.find(sensorHandle);
117 if (sensor != mSensors.end()) {
118 return sensor->second->flush();
119 }
120 return Result::BAD_VALUE;
Brian Stack60fcdcf2018-10-16 14:51:34 -0700121}
122
123Return<Result> Sensors::injectSensorData(const Event& /* event */) {
124 // TODO implement
125 return Result{};
126}
127
128Return<void> Sensors::registerDirectChannel(const SharedMemInfo& /* mem */,
Brian Stack9a407f22018-10-19 16:04:11 -0700129 registerDirectChannel_cb _hidl_cb) {
130 _hidl_cb(Result::INVALID_OPERATION, 0 /* channelHandle */);
131 return Return<void>();
Brian Stack60fcdcf2018-10-16 14:51:34 -0700132}
133
134Return<Result> Sensors::unregisterDirectChannel(int32_t /* channelHandle */) {
Brian Stack9a407f22018-10-19 16:04:11 -0700135 return Result::INVALID_OPERATION;
Brian Stack60fcdcf2018-10-16 14:51:34 -0700136}
137
138Return<void> Sensors::configDirectReport(int32_t /* sensorHandle */, int32_t /* channelHandle */,
Brian Stack9a407f22018-10-19 16:04:11 -0700139 RateLevel /* rate */, configDirectReport_cb _hidl_cb) {
140 _hidl_cb(Result::INVALID_OPERATION, 0 /* reportToken */);
141 return Return<void>();
Brian Stack60fcdcf2018-10-16 14:51:34 -0700142}
143
Brian Stack237abc62018-10-23 11:09:59 -0700144void Sensors::postEvents(const std::vector<Event>& events) {
145 std::lock_guard<std::mutex> l(mLock);
146
147 // TODO: read events from the Wake Lock FMQ in the right place
148 std::vector<uint32_t> tmp(mWakeLockQueue->availableToRead());
149 mWakeLockQueue->read(tmp.data(), mWakeLockQueue->availableToRead());
150
151 mEventQueue->write(events.data(), events.size());
152 mEventQueueFlag->wake(static_cast<uint32_t>(EventQueueFlagBits::READ_AND_PROCESS));
153}
154
Brian Stack475d4d42018-10-19 15:58:09 -0700155void Sensors::deleteEventFlag() {
156 status_t status = EventFlag::deleteEventFlag(&mEventQueueFlag);
157 if (status != OK) {
158 ALOGI("Failed to delete event flag: %d", status);
159 }
160}
161
Brian Stack60fcdcf2018-10-16 14:51:34 -0700162} // namespace implementation
163} // namespace V2_0
164} // namespace sensors
165} // namespace hardware
166} // namespace android