| // 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. |
| }; |