blob: 3f0d1999a45cb502f5c5804c7e56fbdd40c7158d [file] [log] [blame]
// Copyright 2017 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.
library fuchsia.ui.input;
// Descriptors are used to describe the capabilities of an input device.
//
// Devices can have multiple descriptors of multiple kinds, for example:
// `KeyboardDescriptor`, `MouseDescriptor`, `StylusDescriptor`,
// `TouchscreenDescriptor` and `SensorDescriptor`
//
// An input device will generate `InputReport` corresponding to the
// capabilities of that device listed in its descriptor.
// For instance a input device with a `KeyboardDescriptor` will generate
// `KeyboardReport` when a key is pressed on the keyboard.
// Describe a `Range` of values
struct Range {
int32 min;
int32 max;
};
struct RangeF {
float32 min;
float32 max;
};
enum AxisScale {
LINEAR = 0;
LOGARITHMIC = 1;
};
// An `Axis` is defined as a `range` and `resolution`.
struct Axis {
Range range;
int32 resolution = 1;
AxisScale scale = AxisScale.LINEAR;
};
struct AxisF {
RangeF range;
float32 resolution = 1.0;
AxisScale scale = AxisScale.LINEAR;
};
// `MediaButtonsDescriptor` describes the media buttons.
struct MediaButtonsDescriptor {
// A bitmask that represents the list of media buttons available.
// The mask bit values are located in usages.fidl.
uint32 buttons;
};
// Keyboards
// `KeyboardDescriptor` describes the capabilities of a keyboard.
struct KeyboardDescriptor {
// The list of HID keyboard usages that this keyboard can generate.
vector<uint32> keys;
};
// `KeyboardReport` lists the keys currently pressed down.
struct KeyboardReport {
// `pressed_keys` is the list of HID usage that are currently pressed down on
// the keyboard.
vector<uint32> pressed_keys;
};
// Mouse
// `MouseDescriptor` describes the capabilities of a mouse.
struct MouseDescriptor {
// The range of relative X and Y movement which can be described by a mouse
// report.
Axis rel_x;
Axis rel_y;
// The range of relative vertical and horizontal scroll which can be
// described by a mouse report.
Axis? vscroll;
Axis? hscroll;
// The list of HID mouse usages that this mouse can generate.
uint32 buttons;
};
// `MouseReport` gives the relative mouvement of the mouse and currently
// pressed buttons.
struct MouseReport {
// Relative X and Y positional displacement.
int32 rel_x;
int32 rel_y;
// Relative horizontal and vertical scrolling displacement.
int32 rel_hscroll;
int32 rel_vscroll;
// buttons currently down
uint32 pressed_buttons;
};
// Stylus
// `Stylus` describes the capabilities of a stylus.
struct StylusDescriptor {
// Ranges for the `x` and `y` axis of the stylus.
Axis x;
Axis y;
// Range for the pressure of the tip
Axis? pressure;
bool is_invertible = false;
// The list of HID button usages that this stylus can generate.
uint32 buttons;
};
// `StylusReport` describes the current state of the stylus.
struct StylusReport {
// Current position of the stylus within the range described in
// `StylusDescriptor`
int32 x;
int32 y;
// Pressure applied on the stylus tip
uint32 pressure;
// Whether the stylus has made contact with the surface.
bool is_in_contact;
// Whether the stylus is within range. If `is_in_contact` is false, then the stylus
// is hovering.
bool in_range;
// Whether the stylus is thought to be inverted.
bool is_inverted;
// List of buttons currently pressed down.
uint32 pressed_buttons;
};
// Touchscreen
// `TouchscreenDescriptor` describes the capabilities of a touchscreen.
struct TouchscreenDescriptor {
// Ranges of the `x` and `y` axis.
Axis x;
Axis y;
uint32 max_finger_id;
};
// `Touch` describes one touch on a touchscreen, which should correspond to
// one finger.
struct Touch {
// Identifier for a finger that is down.
// Note: `finger_id` might not be sequential and will range from 0 to
// `max_finger_id`
uint32 finger_id;
// Location within the axis defined in `TouchscreenDescriptor`
int32 x;
int32 y;
// Area pressed.
uint32 width;
uint32 height;
};
// `TouchscreenReport` describes the current touches recorded by the touchscreen
// and holds a `Touch` per finger down.
struct TouchscreenReport {
vector<Touch> touches;
};
// Motion Sensors
// Descriptive categories for sensor devices.
// We assume that each (SensorType,SensorLocation) pair is unique to the system.
enum SensorType {
ACCELEROMETER = 0;
GYROSCOPE = 1;
MAGNETOMETER = 2;
LIGHTMETER = 3;
};
enum SensorLocation {
UNKNOWN = 0;
BASE = 1;
LID = 2;
};
// `SensorDescriptor` describes the capabilities of a sensor device. It does
// not capture properties that can be changed after initialization, such as the
// current sampling frequency.
struct SensorDescriptor {
SensorType type;
SensorLocation loc;
// Min and max sampling frequencies for a sensor.
uint32 min_sampling_freq;
uint32 max_sampling_freq;
// Max number of sensor events that could be in hardware FIFO.
uint32 fifo_max_event_count;
// Physical range of a specific sensor.
// Accelerometer ranges are given in Gs.
// Gyroscope ranges are given in deg/s.
// Magnetometer ranges are given in multiples of 1/16 uT.
// Light meter ranges can be given in Lux or units not specified.
int32 phys_min;
int32 phys_max;
};
// `SensorReport` describes the sensor event delivered from the event stream.
union SensorReport {
1: array<int16>:3 vector;
2: uint16 scalar;
};
/// `MediaButtonsReport` describes the media buttons event delivered from the event stream.
/// Each bool in the report represents a single button where true means the button
/// is being pressed. A single report should be sent on every state change.
struct MediaButtonsReport {
bool volume_up;
bool volume_down;
bool mic_mute;
bool reset;
bool pause;
};
// Device and Report
struct DeviceInfo {
uint32 vendor_id;
uint32 product_id;
uint32 version;
string name;
};
// `DeviceDescriptor` describes one input device.
struct DeviceDescriptor {
DeviceInfo? device_info;
KeyboardDescriptor? keyboard;
MediaButtonsDescriptor? media_buttons;
MouseDescriptor? mouse;
StylusDescriptor? stylus;
TouchscreenDescriptor? touchscreen;
SensorDescriptor? sensor;
};
// `InputReport` is an input `report` triggered by an input device.
struct InputReport {
// `event_time` is in nanoseconds when the event was recorded.
uint64 event_time;
KeyboardReport? keyboard;
MediaButtonsReport? media_buttons;
MouseReport? mouse;
StylusReport? stylus;
TouchscreenReport? touchscreen;
SensorReport? sensor;
uint64 trace_id = 0; // Unique ID to connect trace async begin/end events.
};