You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.6 KiB
124 lines
3.6 KiB
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "chre/core/sensor.h"
|
|
|
|
#include "chre/core/event_loop_manager.h"
|
|
#include "chre_api/chre/version.h"
|
|
|
|
namespace chre {
|
|
Mutex Sensor::mSamplingStatusMutex;
|
|
|
|
Sensor::Sensor(Sensor &&other)
|
|
: PlatformSensor(std::move(other)), mFlushRequestPending(false) {
|
|
*this = std::move(other);
|
|
}
|
|
|
|
Sensor &Sensor::operator=(Sensor &&other) {
|
|
PlatformSensor::operator=(std::move(other));
|
|
|
|
mSensorRequests = std::move(other.mSensorRequests);
|
|
|
|
mFlushRequestTimerHandle = other.mFlushRequestTimerHandle;
|
|
other.mFlushRequestTimerHandle = CHRE_TIMER_INVALID;
|
|
|
|
mFlushRequestPending = other.mFlushRequestPending.load();
|
|
other.mFlushRequestPending = false;
|
|
|
|
mLastEvent = other.mLastEvent;
|
|
other.mLastEvent = nullptr;
|
|
|
|
mLastEventValid = other.mLastEventValid;
|
|
other.mLastEventValid = false;
|
|
|
|
return *this;
|
|
}
|
|
|
|
Sensor::~Sensor() {
|
|
if (mLastEvent != nullptr) {
|
|
LOGD("Releasing lastEvent: sensor %s, size %zu", getSensorName(),
|
|
getLastEventSize());
|
|
memoryFree(mLastEvent);
|
|
}
|
|
}
|
|
|
|
void Sensor::init() {
|
|
size_t lastEventSize = getLastEventSize();
|
|
if (lastEventSize > 0) {
|
|
mLastEvent = static_cast<ChreSensorData *>(memoryAlloc(lastEventSize));
|
|
if (mLastEvent == nullptr) {
|
|
FATAL_ERROR("Failed to allocate last event memory for %s",
|
|
getSensorName());
|
|
}
|
|
}
|
|
}
|
|
|
|
void Sensor::populateSensorInfo(struct chreSensorInfo *info,
|
|
uint32_t targetApiVersion) const {
|
|
info->sensorType = getSensorType();
|
|
info->isOnChange = isOnChange();
|
|
info->isOneShot = isOneShot();
|
|
info->reportsBiasEvents = reportsBiasEvents();
|
|
info->supportsPassiveMode = supportsPassiveMode();
|
|
info->unusedFlags = 0;
|
|
info->sensorName = getSensorName();
|
|
|
|
// minInterval was added in CHRE API v1.1 - do not attempt to populate for
|
|
// nanoapps targeting v1.0 as their struct will not be large enough
|
|
if (targetApiVersion >= CHRE_API_VERSION_1_1) {
|
|
info->minInterval = getMinInterval();
|
|
}
|
|
}
|
|
|
|
void Sensor::clearPendingFlushRequest() {
|
|
cancelPendingFlushRequestTimer();
|
|
mFlushRequestPending = false;
|
|
}
|
|
|
|
void Sensor::cancelPendingFlushRequestTimer() {
|
|
if (mFlushRequestTimerHandle != CHRE_TIMER_INVALID) {
|
|
EventLoopManagerSingleton::get()->cancelDelayedCallback(
|
|
mFlushRequestTimerHandle);
|
|
mFlushRequestTimerHandle = CHRE_TIMER_INVALID;
|
|
}
|
|
}
|
|
|
|
void Sensor::setLastEvent(ChreSensorData *event) {
|
|
if (event == nullptr) {
|
|
mLastEventValid = false;
|
|
} else {
|
|
CHRE_ASSERT(event->header.readingCount > 0);
|
|
|
|
SensorTypeHelpers::getLastSample(getSensorType(), event, mLastEvent);
|
|
mLastEventValid = true;
|
|
}
|
|
}
|
|
|
|
bool Sensor::getSamplingStatus(struct chreSensorSamplingStatus *status) const {
|
|
CHRE_ASSERT(status != nullptr);
|
|
LockGuard<Mutex> mLock(mSamplingStatusMutex);
|
|
|
|
memcpy(status, &mSamplingStatus, sizeof(*status));
|
|
return true;
|
|
}
|
|
|
|
void Sensor::setSamplingStatus(const struct chreSensorSamplingStatus &status) {
|
|
LockGuard<Mutex> mLock(mSamplingStatusMutex);
|
|
mSamplingStatus = status;
|
|
}
|
|
|
|
} // namespace chre
|