// 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 KEYBOARD_MAX_NUM_KEYS uint32 = 256;
const KEYBOARD_MAX_NUM_LEDS uint32 = 256;
const KEYBOARD_MAX_PRESSED_KEYS uint32 = 256;

/// Describes the format of the input report that will be sent from the keyboard
/// to the device.
type KeyboardInputDescriptor = table {
    /// The list of keys that this keyboard contains.
    2: keys3 vector<fuchsia.input.Key>:KEYBOARD_MAX_NUM_KEYS;
};

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

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

/// A single report created by a keyboard device.
type KeyboardInputReport = table {
    /// The list of keys that are currently pressed down.
    2: pressed_keys3 vector<fuchsia.input.Key>:KEYBOARD_MAX_PRESSED_KEYS;
};

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