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

library fuchsia.input.report;

using fuchsia.input;

/// Hardcoded max sizes for keyboard vectors. These sizes should be increased
/// if we ever see keyboards with more objects than can be represented.
const uint32 KEYBOARD_MAX_NUM_KEYS = 256;
const uint32 KEYBOARD_MAX_NUM_LEDS = 256;
const uint32 KEYBOARD_MAX_PRESSED_KEYS = 256;

/// Describes the format of the input report that will be sent from the keyboard
/// to the device.
table KeyboardInputDescriptor {
    // Was used for input2 keys.
    1: reserved;

    /// The list of keys that this keyboard contains.
    2: vector<fuchsia.input.Key>:KEYBOARD_MAX_NUM_KEYS keys3;
};

/// Describes the format of the output report that can be sent to the keyboard..
table KeyboardOutputDescriptor {
    /// The list of keyboard LEDs that can be toggled.
    1: vector<LedType>:KEYBOARD_MAX_NUM_LEDS leds;
};

/// The capabilities of a keyboard device.
table KeyboardDescriptor {
    1: KeyboardInputDescriptor input;
    2: KeyboardOutputDescriptor output;
};

/// A single report created by a keyboard device.
table KeyboardInputReport {
    // Was used for input2 pressed_keys.
    1: reserved;

    /// The list of keys that are currently pressed down.
    2: vector<fuchsia.input.Key>:KEYBOARD_MAX_PRESSED_KEYS pressed_keys3;
};

/// A single report containing output information for a keyboard.
table KeyboardOutputReport {
    /// Each LED in this list will be turned on. Any LED not in this list will be
    /// turned off.
    1: vector<LedType>:KEYBOARD_MAX_NUM_LEDS enabled_leds;
};
