1 /*
2 * Copyright (C) 2016 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 "chre/core/sensor.h"
18
19 #include "chre/core/event_loop_manager.h"
20 #include "chre_api/chre/version.h"
21
22 namespace chre {
23 Mutex Sensor::mSamplingStatusMutex;
24
Sensor(Sensor && other)25 Sensor::Sensor(Sensor &&other)
26 : PlatformSensor(std::move(other)), mFlushRequestPending(false) {
27 *this = std::move(other);
28 }
29
operator =(Sensor && other)30 Sensor &Sensor::operator=(Sensor &&other) {
31 PlatformSensor::operator=(std::move(other));
32
33 mSensorRequests = std::move(other.mSensorRequests);
34
35 mFlushRequestTimerHandle = other.mFlushRequestTimerHandle;
36 other.mFlushRequestTimerHandle = CHRE_TIMER_INVALID;
37
38 mFlushRequestPending = other.mFlushRequestPending.load();
39 other.mFlushRequestPending = false;
40
41 mLastEvent = other.mLastEvent;
42 other.mLastEvent = nullptr;
43
44 mLastEventValid = other.mLastEventValid;
45 other.mLastEventValid = false;
46
47 return *this;
48 }
49
~Sensor()50 Sensor::~Sensor() {
51 if (mLastEvent != nullptr) {
52 LOGD("Releasing lastEvent: sensor %s, size %zu", getSensorName(),
53 getLastEventSize());
54 memoryFree(mLastEvent);
55 }
56 }
57
init()58 void Sensor::init() {
59 size_t lastEventSize = getLastEventSize();
60 if (lastEventSize > 0) {
61 mLastEvent = static_cast<ChreSensorData *>(memoryAlloc(lastEventSize));
62 if (mLastEvent == nullptr) {
63 FATAL_ERROR("Failed to allocate last event memory for %s",
64 getSensorName());
65 }
66 }
67 }
68
populateSensorInfo(struct chreSensorInfo * info,uint32_t targetApiVersion) const69 void Sensor::populateSensorInfo(struct chreSensorInfo *info,
70 uint32_t targetApiVersion) const {
71 info->sensorType = getSensorType();
72 info->isOnChange = isOnChange();
73 info->isOneShot = isOneShot();
74 info->reportsBiasEvents = reportsBiasEvents();
75 info->supportsPassiveMode = supportsPassiveMode();
76 info->unusedFlags = 0;
77 info->sensorName = getSensorName();
78
79 // minInterval was added in CHRE API v1.1 - do not attempt to populate for
80 // nanoapps targeting v1.0 as their struct will not be large enough
81 if (targetApiVersion >= CHRE_API_VERSION_1_1) {
82 info->minInterval = getMinInterval();
83 }
84 }
85
clearPendingFlushRequest()86 void Sensor::clearPendingFlushRequest() {
87 cancelPendingFlushRequestTimer();
88 mFlushRequestPending = false;
89 }
90
cancelPendingFlushRequestTimer()91 void Sensor::cancelPendingFlushRequestTimer() {
92 if (mFlushRequestTimerHandle != CHRE_TIMER_INVALID) {
93 EventLoopManagerSingleton::get()->cancelDelayedCallback(
94 mFlushRequestTimerHandle);
95 mFlushRequestTimerHandle = CHRE_TIMER_INVALID;
96 }
97 }
98
setLastEvent(ChreSensorData * event)99 void Sensor::setLastEvent(ChreSensorData *event) {
100 if (event == nullptr) {
101 mLastEventValid = false;
102 } else {
103 CHRE_ASSERT(event->header.readingCount > 0);
104
105 SensorTypeHelpers::getLastSample(getSensorType(), event, mLastEvent);
106 mLastEventValid = true;
107 }
108 }
109
getSamplingStatus(struct chreSensorSamplingStatus * status) const110 bool Sensor::getSamplingStatus(struct chreSensorSamplingStatus *status) const {
111 CHRE_ASSERT(status != nullptr);
112 LockGuard<Mutex> mLock(mSamplingStatusMutex);
113
114 memcpy(status, &mSamplingStatus, sizeof(*status));
115 return true;
116 }
117
setSamplingStatus(const struct chreSensorSamplingStatus & status)118 void Sensor::setSamplingStatus(const struct chreSensorSamplingStatus &status) {
119 LockGuard<Mutex> mLock(mSamplingStatusMutex);
120 mSamplingStatus = status;
121 }
122
123 } // namespace chre
124