// 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.hardware.light;
using zx;

const uint8 LIGHT_NAME_LEN = 32;

enum Capability {
    // This capability indicates that the light supports setting brightness to a uint8_t value.
    // If this capability is not supported, the light only supports off and on state.
    BRIGHTNESS = 0;
    // This capability indicates that the light supports setting an RGB value.
    RGB = 1;
};

struct Rgb {
    uint8 red;
    uint8 green;
    uint8 blue;
};

[Layout = "Simple"]
protocol Light {
    // Returns a board specific name for the light.
    // For example, "mute" for a microphone mute indicator light, "bluetooth" for
    // Bluetooth pairing light, etc.
    GetName(uint32 index) -> (zx.status status, string:LIGHT_NAME_LEN? name);

    // Returns the number of physical lights.
    // This will typically be 1 for a simple LED, but may be greater than one for an array of LEDs
    // or a more complicated lighting device.
    // The multiple lights are addressed using "index" parameter in the calls below.
    GetCount() -> (uint32 count);

    // Returns true if the light with given index
    HasCapability(uint32 index, Capability capability) -> (zx.status status, bool has);

    // Returns the current value (zero or non-zero for simple lights, or 0 - 255 for lights
    // that support brightness). Returns error for RGB lights.
    GetSimpleValue(uint32 index) -> (zx.status status, uint8 value);

    // Sets the current value (zero or non-zero for simple lights, or 0 - 255 for lights
    // that support brightness). Returns error for RGB lights.
    SetSimpleValue(uint32 index, uint8 value) -> (zx.status status);

    // Returns the current RGB value for the light. Returns error for non-RGB lights.
    GetRgbValue(uint32 index) -> (zx.status status, Rgb value);

    // Sets the current RGB value for the light. Returns error for non-RGB lights.
    SetRgbValue(uint32 index, Rgb value) -> (zx.status status);

    // TODO: Ideas for future expansion
    // - Hardware blinking configuration, for lights that have hardware or MCU support for blinking.
};
