blob: 23517036d19ff610fef20b1fbd90bcd2395644fb [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 SRC_UI_LIB_INPUT_READER_HARDCODED_H_
#define SRC_UI_LIB_INPUT_READER_HARDCODED_H_
#include <fuchsia/ui/input/cpp/fidl.h>
#include <array>
#include <cstddef>
#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <hid/acer12.h>
#include <hid/paradise.h>
#include "src/ui/lib/input_reader/hid_decoder.h"
#include "src/ui/lib/input_reader/protocols.h"
namespace ui_input {
class Hardcoded {
public:
const std::string& name() const { return name_; }
// Matches a protocol with a hardcoded HID Report Descriptor |desc|.
// Returns |Protocol::Other| if there's no match. |hid_decoder| is passed
// so some setup can be done if it's a special device.
Protocol MatchProtocol(const std::vector<uint8_t> desc, HidDecoder* hid_decoder);
void Initialize(Protocol protocol);
void NotifyRegistry(fuchsia::ui::input::InputDeviceRegistry* registry);
void Read(const uint8_t* report, int report_len, bool discard);
bool ParseGamepadDescriptor(const hid::ReportField* fields, size_t count);
bool ParseAmbientLightDescriptor(const hid::ReportField* fields, size_t count);
private:
struct DataLocator {
uint32_t begin;
uint32_t count;
uint32_t match;
};
struct HidGamepadSimple {
int32_t left_x;
int32_t left_y;
int32_t right_x;
int32_t right_y;
uint32_t hat_switch;
};
struct HidAmbientLightSimple {
int16_t illuminance;
};
bool ParseKeyboardReport(const uint8_t* report, size_t len,
fuchsia::ui::input::InputReport* keyboard_report);
void ParseMouseReport(const uint8_t* report, size_t len,
fuchsia::ui::input::InputReport* mouse_report);
bool ParseGamepadMouseReport(const uint8_t* report, size_t len,
fuchsia::ui::input::InputReport* mouse_report);
bool ParseParadiseSensorReport(const uint8_t* report, size_t len, uint8_t* sensor_idx,
fuchsia::ui::input::InputReport* sensor_report);
bool ParseAmbientLightSensorReport(const uint8_t* report, size_t len, uint8_t* sensor_idx,
fuchsia::ui::input::InputReport* sensor_report);
bool ParseReport(const uint8_t* report, size_t len, HidGamepadSimple* gamepad);
bool ParseReport(const uint8_t* report, size_t len, HidAmbientLightSimple* light);
std::vector<DataLocator> decoder_;
const std::string name_ = "Hardcoded Device";
static const uint8_t kMaxSensorCount = 16;
static const uint8_t kNoSuchSensor = 0xFF;
bool has_keyboard_ = false;
fuchsia::ui::input::KeyboardDescriptorPtr keyboard_descriptor_;
bool has_mouse_ = false;
fuchsia::ui::input::MouseDescriptorPtr mouse_descriptor_;
bool has_stylus_ = false;
fuchsia::ui::input::StylusDescriptorPtr stylus_descriptor_;
bool has_touchscreen_ = false;
fuchsia::ui::input::TouchscreenDescriptorPtr touchscreen_descriptor_;
bool has_sensors_ = false;
// Arrays are indexed by the sensor number that was assigned by Zircon.
// Keeps track of the physical sensors multiplexed over the file descriptor.
std::array<fuchsia::ui::input::SensorDescriptorPtr, kMaxSensorCount> sensor_descriptors_;
std::array<fuchsia::ui::input::InputDevicePtr, kMaxSensorCount> sensor_devices_;
MouseDeviceType mouse_device_type_ = MouseDeviceType::NONE;
SensorDeviceType sensor_device_type_ = SensorDeviceType::NONE;
// Keep track of which sensor gave us a report. Index into
// |sensor_descriptors_| and |sensor_devices_|.
uint8_t sensor_idx_ = kNoSuchSensor;
fuchsia::ui::input::InputReportPtr keyboard_report_;
fuchsia::ui::input::InputReportPtr mouse_report_;
fuchsia::ui::input::InputReportPtr touchscreen_report_;
fuchsia::ui::input::InputReportPtr stylus_report_;
fuchsia::ui::input::InputReportPtr sensor_report_;
fuchsia::ui::input::InputDevicePtr input_device_;
Protocol protocol_;
};
} // namespace ui_input
#endif // SRC_UI_LIB_INPUT_READER_HARDCODED_H_