// 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 = LINEAR; }; struct AxisF { RangeF range; float32 resolution = 1.0; AxisScale scale = LINEAR; }; // |ButtonsDescriptor| describes the buttons. struct ButtonsDescriptor { // The list of buttons available. 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 { array<int16>:3 vector; uint16 scalar; }; // |ButtonsReport| describes the buttons event delivered from the event stream. union ButtonsReport { // Volume changes +1/-1 for volume up/down, this is a relative value. int8 volume; bool mic_mute; }; // 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; ButtonsDescriptor? 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; ButtonsReport? buttons; MouseReport? mouse; StylusReport? stylus; TouchscreenReport? touchscreen; SensorReport? sensor; };