239 lines
8.5 KiB
C++
239 lines
8.5 KiB
C++
// Copyright 2012 The ChromiumOS Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef GESTURES_ACTIVITY_LOG_H_
|
|
#define GESTURES_ACTIVITY_LOG_H_
|
|
|
|
#include "include/gestures.h"
|
|
|
|
#include <string>
|
|
|
|
#include <gtest/gtest.h> // For FRIEND_TEST
|
|
#include <json/value.h>
|
|
|
|
// This is a class that circularly buffers all incoming and outgoing activity
|
|
// so that end users can report issues and engineers can reproduce them.
|
|
|
|
namespace gestures {
|
|
|
|
class PropRegistry;
|
|
|
|
class ActivityLog {
|
|
FRIEND_TEST(ActivityLogTest, SimpleTest);
|
|
FRIEND_TEST(ActivityLogTest, WrapAroundTest);
|
|
FRIEND_TEST(ActivityLogTest, VersionTest);
|
|
FRIEND_TEST(LoggingFilterInterpreterTest, SimpleTest);
|
|
FRIEND_TEST(PropRegistryTest, PropChangeTest);
|
|
public:
|
|
enum EntryType {
|
|
kHardwareState = 0,
|
|
kTimerCallback,
|
|
kCallbackRequest,
|
|
kGesture,
|
|
kPropChange
|
|
};
|
|
struct PropChangeEntry {
|
|
const char* name;
|
|
enum {
|
|
kBoolProp = 0,
|
|
kDoubleProp,
|
|
kIntProp,
|
|
kShortProp
|
|
} type;
|
|
union {
|
|
GesturesPropBool bool_val;
|
|
double double_val;
|
|
int int_val;
|
|
short short_val;
|
|
// No string because string values can't change
|
|
} value;
|
|
};
|
|
struct Entry {
|
|
EntryType type;
|
|
struct details {
|
|
HardwareState hwstate; // kHardwareState
|
|
stime_t timestamp; // kTimerCallback, kCallbackRequest
|
|
Gesture gesture; // kGesture
|
|
PropChangeEntry prop_change; // kPropChange
|
|
} details;
|
|
};
|
|
|
|
explicit ActivityLog(PropRegistry* prop_reg);
|
|
void SetHardwareProperties(const HardwareProperties& hwprops);
|
|
|
|
// Log*() functions record an argument into the buffer
|
|
void LogHardwareState(const HardwareState& hwstate);
|
|
void LogTimerCallback(stime_t now);
|
|
void LogCallbackRequest(stime_t when);
|
|
void LogGesture(const Gesture& gesture);
|
|
void LogPropChange(const PropChangeEntry& prop_change);
|
|
|
|
// Dump allocates, and thus must not be called on a signal handler.
|
|
void Dump(const char* filename);
|
|
void Clear() { head_idx_ = size_ = 0; }
|
|
|
|
// Returns a JSON string representing all the state in the buffer
|
|
std::string Encode();
|
|
void AddEncodeInfo(Json::Value* root);
|
|
Json::Value EncodeCommonInfo();
|
|
size_t size() const { return size_; }
|
|
size_t MaxSize() const { return kBufferSize; }
|
|
Entry* GetEntry(size_t idx) {
|
|
return &buffer_[(head_idx_ + idx) % kBufferSize];
|
|
}
|
|
|
|
static const char kKeyInterpreterName[];
|
|
static const char kKeyNext[];
|
|
static const char kKeyRoot[];
|
|
static const char kKeyType[];
|
|
static const char kKeyHardwareState[];
|
|
static const char kKeyTimerCallback[];
|
|
static const char kKeyCallbackRequest[];
|
|
static const char kKeyGesture[];
|
|
static const char kKeyPropChange[];
|
|
// HardwareState keys:
|
|
static const char kKeyHardwareStateTimestamp[];
|
|
static const char kKeyHardwareStateButtonsDown[];
|
|
static const char kKeyHardwareStateTouchCnt[];
|
|
static const char kKeyHardwareStateFingers[];
|
|
static const char kKeyHardwareStateRelX[];
|
|
static const char kKeyHardwareStateRelY[];
|
|
static const char kKeyHardwareStateRelWheel[];
|
|
static const char kKeyHardwareStateRelHWheel[];
|
|
// FingerState keys (part of HardwareState):
|
|
static const char kKeyFingerStateTouchMajor[];
|
|
static const char kKeyFingerStateTouchMinor[];
|
|
static const char kKeyFingerStateWidthMajor[];
|
|
static const char kKeyFingerStateWidthMinor[];
|
|
static const char kKeyFingerStatePressure[];
|
|
static const char kKeyFingerStateOrientation[];
|
|
static const char kKeyFingerStatePositionX[];
|
|
static const char kKeyFingerStatePositionY[];
|
|
static const char kKeyFingerStateTrackingId[];
|
|
static const char kKeyFingerStateFlags[];
|
|
// TimerCallback keys:
|
|
static const char kKeyTimerCallbackNow[];
|
|
// CallbackRequest keys:
|
|
static const char kKeyCallbackRequestWhen[];
|
|
// Gesture keys:
|
|
static const char kKeyGestureType[];
|
|
static const char kValueGestureTypeContactInitiated[];
|
|
static const char kValueGestureTypeMove[];
|
|
static const char kValueGestureTypeScroll[];
|
|
static const char kValueGestureTypeMouseWheel[];
|
|
static const char kValueGestureTypePinch[];
|
|
static const char kValueGestureTypeButtonsChange[];
|
|
static const char kValueGestureTypeFling[];
|
|
static const char kValueGestureTypeSwipe[];
|
|
static const char kValueGestureTypeSwipeLift[];
|
|
static const char kValueGestureTypeFourFingerSwipe[];
|
|
static const char kValueGestureTypeFourFingerSwipeLift[];
|
|
static const char kValueGestureTypeMetrics[];
|
|
static const char kKeyGestureStartTime[];
|
|
static const char kKeyGestureEndTime[];
|
|
static const char kKeyGestureMoveDX[];
|
|
static const char kKeyGestureMoveDY[];
|
|
static const char kKeyGestureMoveOrdinalDX[];
|
|
static const char kKeyGestureMoveOrdinalDY[];
|
|
static const char kKeyGestureScrollDX[];
|
|
static const char kKeyGestureScrollDY[];
|
|
static const char kKeyGestureScrollOrdinalDX[];
|
|
static const char kKeyGestureScrollOrdinalDY[];
|
|
static const char kKeyGestureMouseWheelDX[];
|
|
static const char kKeyGestureMouseWheelDY[];
|
|
static const char kKeyGestureMouseWheelTicksDX[];
|
|
static const char kKeyGestureMouseWheelTicksDY[];
|
|
static const char kKeyGesturePinchDZ[];
|
|
static const char kKeyGesturePinchOrdinalDZ[];
|
|
static const char kKeyGesturePinchZoomState[];
|
|
static const char kKeyGestureButtonsChangeDown[];
|
|
static const char kKeyGestureButtonsChangeUp[];
|
|
static const char kKeyGestureFlingVX[];
|
|
static const char kKeyGestureFlingVY[];
|
|
static const char kKeyGestureFlingOrdinalVX[];
|
|
static const char kKeyGestureFlingOrdinalVY[];
|
|
static const char kKeyGestureFlingState[];
|
|
static const char kKeyGestureSwipeDX[];
|
|
static const char kKeyGestureSwipeDY[];
|
|
static const char kKeyGestureSwipeOrdinalDX[];
|
|
static const char kKeyGestureSwipeOrdinalDY[];
|
|
static const char kKeyGestureFourFingerSwipeDX[];
|
|
static const char kKeyGestureFourFingerSwipeDY[];
|
|
static const char kKeyGestureFourFingerSwipeOrdinalDX[];
|
|
static const char kKeyGestureFourFingerSwipeOrdinalDY[];
|
|
static const char kKeyGestureMetricsType[];
|
|
static const char kKeyGestureMetricsData1[];
|
|
static const char kKeyGestureMetricsData2[];
|
|
// PropChange keys:
|
|
static const char kKeyPropChangeType[];
|
|
static const char kKeyPropChangeName[];
|
|
static const char kKeyPropChangeValue[];
|
|
static const char kValuePropChangeTypeBool[];
|
|
static const char kValuePropChangeTypeDouble[];
|
|
static const char kValuePropChangeTypeInt[];
|
|
static const char kValuePropChangeTypeShort[];
|
|
|
|
// Hardware Properties keys:
|
|
static const char kKeyHardwarePropRoot[];
|
|
static const char kKeyHardwarePropLeft[];
|
|
static const char kKeyHardwarePropTop[];
|
|
static const char kKeyHardwarePropRight[];
|
|
static const char kKeyHardwarePropBottom[];
|
|
static const char kKeyHardwarePropXResolution[];
|
|
static const char kKeyHardwarePropYResolution[];
|
|
static const char kKeyHardwarePropXDpi[];
|
|
static const char kKeyHardwarePropYDpi[];
|
|
static const char kKeyHardwarePropOrientationMinimum[];
|
|
static const char kKeyHardwarePropOrientationMaximum[];
|
|
static const char kKeyHardwarePropMaxFingerCount[];
|
|
static const char kKeyHardwarePropMaxTouchCount[];
|
|
static const char kKeyHardwarePropSupportsT5R2[];
|
|
static const char kKeyHardwarePropSemiMt[];
|
|
static const char kKeyHardwarePropIsButtonPad[];
|
|
static const char kKeyHardwarePropHasWheel[];
|
|
|
|
static const char kKeyProperties[];
|
|
|
|
private:
|
|
// Extends the tail of the buffer by one element and returns that new element.
|
|
// This may cause an older element to be overwritten if the buffer is full.
|
|
Entry* PushBack();
|
|
|
|
size_t TailIdx() const { return (head_idx_ + size_ - 1) % kBufferSize; }
|
|
|
|
// JSON-encoders for various types
|
|
Json::Value EncodeHardwareProperties() const;
|
|
Json::Value EncodeHardwareState(const HardwareState& hwstate);
|
|
Json::Value EncodeTimerCallback(stime_t timestamp);
|
|
Json::Value EncodeCallbackRequest(stime_t timestamp);
|
|
Json::Value EncodeGesture(const Gesture& gesture);
|
|
Json::Value EncodePropChange(const PropChangeEntry& prop_change);
|
|
|
|
// Encode user-configurable properties
|
|
Json::Value EncodePropRegistry();
|
|
|
|
#ifdef GESTURES_LARGE_LOGGING_BUFFER
|
|
static const size_t kBufferSize = 65536;
|
|
#else
|
|
static const size_t kBufferSize = 8192;
|
|
#endif
|
|
|
|
Entry buffer_[kBufferSize];
|
|
size_t head_idx_;
|
|
size_t size_;
|
|
|
|
// We allocate this to be number of entries * max fingers/entry, and
|
|
// if buffer_[i] is a kHardwareState type, then the fingers for it are
|
|
// at finger_states_[i * (max fingers/entry)].
|
|
std::unique_ptr<FingerState[]> finger_states_;
|
|
size_t max_fingers_;
|
|
|
|
HardwareProperties hwprops_;
|
|
PropRegistry* prop_reg_;
|
|
};
|
|
|
|
} // namespace gestures
|
|
|
|
#endif // GESTURES_ACTIVITY_LOG_H_
|