16a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu/* 26a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * Copyright (C) 2016 The Android Open Source Project 36a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * 46a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * Licensed under the Apache License, Version 2.0 (the "License"); 56a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * you may not use this file except in compliance with the License. 66a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * You may obtain a copy of the License at 76a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * 86a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * http://www.apache.org/licenses/LICENSE-2.0 96a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * 106a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * Unless required by applicable law or agreed to in writing, software 116a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * distributed under the License is distributed on an "AS IS" BASIS, 126a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * See the License for the specific language governing permissions and 146a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu * limitations under the License. 156a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu */ 166a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 176a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#ifndef ANDROID_SENSOR_SERVICE_UTIL_RECENT_EVENT_LOGGER_H 186a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#define ANDROID_SENSOR_SERVICE_UTIL_RECENT_EVENT_LOGGER_H 196a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 206a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include "RingBuffer.h" 216a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include "SensorServiceUtils.h" 226a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 236a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <hardware/sensors.h> 246a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <utils/String8.h> 256a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 266a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#include <mutex> 276a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 286a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xunamespace android { 296a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xunamespace SensorServiceUtil { 306a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 316a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu// A circular buffer that record the last N events of a sensor type for debugging. The size of this 326a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu// buffer depends on sensor type and is controlled by logSizeBySensorType(). The last N events 336a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu// generated from the sensor are stored in this buffer. The buffer is NOT cleared when the sensor 346a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu// unregisters and as a result very old data in the dumpsys output can be seen, which is an intended 356a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu// behavior. 366a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xuclass RecentEventLogger : public Dumpable { 376a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xupublic: 386a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu RecentEventLogger(int sensorType); 396a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu void addEvent(const sensors_event_t& event); 406a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu bool populateLastEvent(sensors_event_t *event) const; 416a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu bool isEmpty() const; 426a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu virtual ~RecentEventLogger() {} 436a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 446a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu // Dumpable interface 456a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu virtual std::string dump() const override; 466a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 476a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xuprotected: 486a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu struct SensorEventLog { 496a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu SensorEventLog(const sensors_event_t& e); 506a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu timespec mWallTime; 516a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu sensors_event_t mEvent; 526a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu }; 536a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 546a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu const int mSensorType; 556a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu const size_t mEventSize; 566a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 576a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu mutable std::mutex mLock; 586a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu RingBuffer<SensorEventLog> mRecentEvents; 596a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 606a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xuprivate: 616a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu static size_t logSizeBySensorType(int sensorType); 626a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu}; 636a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 646a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} // namespace SensorServiceUtil 656a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu} // namespace android; 666a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 676a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu#endif // ANDROID_SENSOR_SERVICE_UTIL_RECENT_EVENT_LOGGER_H 686a2d3a06caa337857cf60cfc70a9a78909ad3608Peng Xu 69