[go: nahoru, domu]

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