blob: 2e56af876283ac392c6b2a4caee44ddfd2898485 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 GARNET_BIN_UI_INPUT_READER_TOUCHSCREEN_H_
#define GARNET_BIN_UI_INPUT_READER_TOUCHSCREEN_H_
#include <cstddef>
#include <hid-parser/parser.h>
namespace mozart {
class Touchscreen {
public:
static constexpr size_t MAX_TOUCH_POINTS = 10;
enum Capabilities : uint32_t {
CONTACT_ID = 1 << 0,
TIP_SWITCH = 1 << 1,
X = 1 << 2,
Y = 1 << 3,
SCAN_TIME = 1 << 16,
CONTACT_COUNT = 1 << 17,
BUTTON = 1 << 18,
};
struct ContactReport {
uint32_t id;
// x and y are have units of 10 microns (10^-5 meters). This seems to give
// the most precision without having the values overflow. If the report
// descriptor does not define units, the value will be passed on
// unconverted.
int32_t x;
int32_t y;
};
struct Report {
// Scan time in microseconds. If the report descriptor does not
// define units, the value will be passed on unconverted.
uint32_t scan_time;
size_t contact_count;
bool button;
ContactReport contacts[MAX_TOUCH_POINTS];
};
struct Descriptor {
// The min and max of x and y have units of 10^-5 meters. If the
// report descriptor does not define units, the value will be passed
// on unconverted.
int32_t x_min;
int32_t x_max;
int32_t x_resolution;
int32_t y_min;
int32_t y_max;
int32_t y_resolution;
int32_t max_finger_id;
};
Touchscreen()
: touch_points_(0),
scan_time_(),
contact_count_(),
capabilities_(0),
report_size_(0) {
for (size_t i = 0; i < MAX_TOUCH_POINTS; i++) {
configs_[i] = {};
}
}
bool ParseTouchscreenDescriptor(const hid::ReportDescriptor *desc);
bool ParseReport(const uint8_t *data, size_t len, Report *report) const;
bool SetDescriptor(Touchscreen::Descriptor *touch_desc);
uint8_t report_id() const { return report_id_; }
size_t touch_points() const { return touch_points_; }
int32_t contact_id_max() const { return contact_id_max_; }
uint32_t capabilities() const { return capabilities_; }
private:
struct TouchPointConfig {
uint32_t capabilities;
hid::Attributes contact_id;
hid::Attributes tip_switch;
hid::Attributes x;
hid::Attributes y;
};
size_t touch_points_;
TouchPointConfig configs_[MAX_TOUCH_POINTS];
hid::Attributes scan_time_;
hid::Attributes contact_count_;
hid::Attributes button_;
uint32_t capabilities_;
size_t report_size_;
uint8_t report_id_;
int32_t contact_id_max_;
};
} // namespace mozart
#endif // GARNET_BIN_UI_INPUT_READER_TOUCHSCREEN_H_