/* Copyright 2018 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */

#ifndef METAL__LED_H
#define METAL__LED_H

/*!
 * @file led.h
 * @brief API for manipulating LEDs
 */

struct metal_led;

struct metal_led_vtable {
    int (*led_exist)(struct metal_led *led, char *label);
    void (*led_enable)(struct metal_led *led);
    void (*led_on)(struct metal_led *led);
    void (*led_off)(struct metal_led *led);
    void (*led_toggle)(struct metal_led *led);
};

/*!
 * @brief A handle for an LED
 */
struct metal_led {
    const struct metal_led_vtable *vtable;
};

/*!
 * @brief Get a handle for an LED
 * @param label The DeviceTree label for the desired LED
 * @return A handle to the LED, or NULL if none is found for the requested label
 */
struct metal_led* metal_led_get(char *label);

/*!
 * @brief Get a handle for a channel of an RGB LED
 * @param label The DeviceTree label for the desired LED
 * @param color The color for the LED in the DeviceTree
 * @return A handle to the LED, or NULL if none is found for the requested label and color
 */
struct metal_led* metal_led_get_rgb(char *label, char *color);

/*!
 * @brief Enable an LED
 * @param led The handle for the LED
 */
inline void metal_led_enable(struct metal_led *led) { led->vtable->led_enable(led); }

/*!
 * @brief Turn an LED on
 * @param led The handle for the LED
 */
inline void metal_led_on(struct metal_led *led) { led->vtable->led_on(led); }

/*!
 * @brief Turn an LED off
 * @param led The handle for the LED
 */
inline void metal_led_off(struct metal_led *led) { led->vtable->led_off(led); }

/*!
 * @brief Toggle the on/off state of an LED
 * @param led The handle for the LED
 */
inline void metal_led_toggle(struct metal_led *led) { led->vtable->led_toggle(led); }

#endif
