blob: dc37f25024d7c49a27304640835edd0a37dcefab [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// 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 "gestures/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 kValueGestureTypePinch[];
static const char kValueGestureTypeButtonsChange[];
static const char kValueGestureTypeFling[];
static const char kValueGestureTypeSwipe[];
static const char kValueGestureTypeSwipeLift[];
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 kKeyGesturePinchDZ[];
static const char kKeyGesturePinchOrdinalDZ[];
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 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_