/* * Copyright (C) 2018 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/platform/shared/platform_sensor_util.h" #include <cinttypes> #include "chre/core/event_loop_manager.h" #include "chre/core/sensor.h" #include "chre/platform/assert.h" #include "chre/util/memory.h" namespace chre { void updateLastEvent(SensorType sensorType, const void *eventData) { CHRE_ASSERT(eventData); auto *header = static_cast<const chreSensorDataHeader *>(eventData); if (header->readingCount != 1) { // TODO: better error handling when there are more than one samples. LOGE("%" PRIu16 " samples in an event for on-change sensor %" PRIu8, header->readingCount, static_cast<uint8_t>(sensorType)); } else { struct CallbackData { SensorType sensorType; const ChreSensorData *event; }; auto *callbackData = memoryAlloc<CallbackData>(); if (callbackData == nullptr) { LOG_OOM(); } else { callbackData->sensorType = sensorType; callbackData->event = static_cast<const ChreSensorData *>(eventData); auto callback = [](uint16_t /* type */, void *data) { auto *cbData = static_cast<CallbackData *>(data); Sensor *sensor = EventLoopManagerSingleton::get() ->getSensorRequestManager().getSensor(cbData->sensorType); // Mark last event as valid only if the sensor is enabled. Event data // may arrive after sensor is disabled. if (sensor != nullptr && sensor->getRequest().getMode() != SensorMode::Off) { sensor->setLastEvent(cbData->event); } memoryFree(cbData); }; // Schedule a deferred callback. EventLoopManagerSingleton::get()->deferCallback( SystemCallbackType::SensorLastEventUpdate, callbackData, callback); } } } } // namespace chre