/*
 * Copyright 2018-2020 NXP
 * All rights reserved.
 *
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef __LED_H__
#define __LED_H__

/*!
 * @addtogroup LED
 * @{
 */

/*******************************************************************************
 * Definitions
 ******************************************************************************/
/*! @brief Definition to determine whether enable dimming. */
#ifndef LED_DIMMING_ENABLEMENT
#define LED_DIMMING_ENABLEMENT (0U) /*!< Enable or disable the dimming feature */
#endif

/*! @brief Definition to determine whether enable color wheel. */
#ifndef LED_COLOR_WHEEL_ENABLEMENT
#define LED_COLOR_WHEEL_ENABLEMENT (0U) /*!< Enable or disable the color wheel feature */
#endif

/*! @brief The handle of LED */
typedef void *led_handle_t;

/*! @brief Definition of LED handle size. */
#if (defined(LED_DIMMING_ENABLEMENT) && (LED_DIMMING_ENABLEMENT > 0U))
/* HAL_GPIO_HANDLE_SIZE * 3 + HAL_PWM_HANDLE_SIZE *3 + LED dedicated size */
#define LED_HANDLE_SIZE ((16U * 3U) + (8U * 3U) + 40U)
#else
/* HAL_GPIO_HANDLE_SIZE * 3 + LED dedicated size */
#define LED_HANDLE_SIZE ((16U * 3U) + 36U)
#endif

/*!
 * @brief Defines the led handle
 *
 * This macro is used to define a 4 byte aligned led handle.
 * Then use "(led_handle_t)name" to get the led handle.
 *
 * The macro should be global and could be optional. You could also define led handle by yourself.
 *
 * This is an example,
 * @code
 * LED_HANDLE_DEFINE(ledHandle);
 * @endcode
 *
 * @param name The name string of the led handle.
 */
#define LED_HANDLE_DEFINE(name) uint32_t name[((LED_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]

/*!
 * @brief Defines the led handle array
 *
 * This macro is used to define a 4 byte aligned led handle array.
 * Then use "(led_handle_t)name[0]" to get the first led handle.
 *
 * The macro should be global and could be optional. You could also define these led handle by yourself.
 *
 * This is an example,
 * @code
 * LED_HANDLE_ARRAY_DEFINE(ledHandleArray,1);
 * @endcode
 *
 * @param name The name string of the led handle array.
 * @param count The amount of led handle.
 */
#define LED_HANDLE_ARRAY_DEFINE(name, count) \
    uint32_t name[count][((LED_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]

/*! @brief Definition of LED timer interval,unit is ms. */
#define LED_TIMER_INTERVAL (100U)

/*! @brief Definition of LED dimming update interval,unit is ms. */
#define LED_DIMMING_UPDATE_INTERVAL (100U)

/*! @brief Definition of LED flash cycle forever. */
#define LED_FLASH_CYCLE_FOREVER (0xFFFFFFFFU)

/*! @brief Definition of LED blip interval,unit is ms. */
#define LED_BLIP_INTERVAL (250U)

/*! @brief The status type of LED */
typedef enum _led_status
{
    kStatus_LED_Success          = kStatus_Success,                  /*!< Success */
    kStatus_LED_Error            = MAKE_STATUS(kStatusGroup_LED, 1), /*!< Failed */
    kStatus_LED_InvalidParameter = MAKE_STATUS(kStatusGroup_LED, 2), /*!< Invalid parameter*/
} led_status_t;

/*! @brief The flash type of LED */
typedef enum _led_flash_type
{
    kLED_FlashOneColor = 0x00U, /*!< Fast with one color */
#if (defined(LED_COLOR_WHEEL_ENABLEMENT) && (LED_COLOR_WHEEL_ENABLEMENT > 0U))
    kLED_FlashColorWheel, /*!< Fast with color wheel */
#endif                    /* (defined(LED_COLOR_WHEEL_ENABLEMENT) && (LED_COLOR_WHEEL_ENABLEMENT > 0U)) */
} led_flash_type_t;

/*! @brief The color struct of LED */
typedef uint32_t led_color_t;

/*! @brief Definition to set LED color. */
#define LED_MAKE_COLOR(r, g, b) ((led_color_t)((((led_color_t)b) << 16) | (((led_color_t)g) << 8) | ((led_color_t)r)))

/*! @brief The color type of LED */
enum _led_color
{
    kLED_Black      = LED_MAKE_COLOR(0, 0, 0),       /*!< Black */
    kLED_Red        = LED_MAKE_COLOR(255, 0, 0),     /*!< Red */
    kLED_Green      = LED_MAKE_COLOR(0, 255, 0),     /*!< Green */
    kLED_Yellow     = LED_MAKE_COLOR(255, 255, 0),   /*!< Yellow */
    kLED_Blue       = LED_MAKE_COLOR(0, 0, 255),     /*!< Blue */
    kLED_Pink       = LED_MAKE_COLOR(255, 0, 255),   /*!< Pink */
    kLED_Aquamarine = LED_MAKE_COLOR(0, 255, 255),   /*!< Aquamarine */
    kLED_White      = LED_MAKE_COLOR(255, 255, 255), /*!< White */
};

#if defined(__CC_ARM)
#pragma anon_unions
#endif
/*! @brief The pin config struct of LED */
typedef struct _led_pin_config
{
    uint8_t dimmingEnable; /*!< dimming enable, 0 - disable, 1 - enable */
    union
    {
        struct
        {
            uint8_t port;            /*!< GPIO Port */
            uint8_t pin;             /*!< GPIO Pin */
            uint8_t pinStateDefault; /*!< GPIO Pin voltage when LED is off (0 - low level, 1 - high level)*/
        } gpio;
        struct
        {
            uint32_t sourceClock;    /*!< The clock source of the PWM module */
            uint8_t instance;        /*!< PWM instance of the pin */
            uint8_t channel;         /*!< PWM channel of the pin */
            uint8_t pinStateDefault; /*!< The Pin voltage when LED is off (0 - low level, 1 - high level)*/
        } dimming;
    };
} led_pin_config_t;

/*! @brief The pin config struct of rgb LED */
typedef struct _led_rgb_config
{
    led_pin_config_t redPin;   /*!< Red pin setting */
    led_pin_config_t greenPin; /*!< Green pin setting */
    led_pin_config_t bluePin;  /*!< Blue pin setting */
} led_rgb_config_t;

/*! @brief The pin config struct of monochrome LED */
typedef struct _led_monochrome_config
{
    led_pin_config_t monochromePin; /*!< Monochrome pin setting */
} led_monochrome_config_t;

/*! @brief The type of LED */
typedef enum _led_type
{
    kLED_TypeRgb        = 0x01U, /*!< RGB LED */
    kLED_TypeMonochrome = 0x02U, /*!< Monochrome LED */
} led_type_t;

/*! @brief The config struct of LED */
typedef struct _led_config
{
    led_type_t type;
    union
    {
        led_rgb_config_t ledRgb;               /*!< RGB setting */
        led_monochrome_config_t ledMonochrome; /*!< Monochrome setting */
    };
} led_config_t;

/*! @brief The flash config struct of LED */
typedef struct _led_flash_config
{
    uint32_t times;             /*!< Flash times, LED_FLASH_CYCLE_FOREVER for forever */
    uint16_t period;            /*!< Flash period, unit is ms */
    led_flash_type_t flashType; /*!< Flash type, one color or color wheel. Refer to #led_flash_type_t */
    uint8_t duty;               /*!< Duty of the LED on for one period (duration = duty * period / 100). */
} led_flash_config_t;

/*******************************************************************************
 * API
 ******************************************************************************/

#if defined(__cplusplus)
extern "C" {
#endif /* _cplusplus */

/*!
 * @brief Initializes a LED with the LED handle and the user configuration structure.
 *
 * This function configures the LED with user-defined settings. The user can configure the configuration
 * structure. The parameter ledHandle is a pointer to point to a memory space of size #LED_HANDLE_SIZE allocated by the
 * caller. The LED supports two types LED, RGB and monochrome. Please refer to #led_type_t. These two types can be set
 * by using #led_config_t. The LED also supports LED dimming mode.
 *
 * Example below shows how to use this API to configure the LED.
 * For monochrome LED,
 *  @code
 *   static LED_HANDLE_DEFINE(s_ledMonochromeHandle);
 *   led_config_t ledMonochromeConfig;
 *   ledMonochromeConfig.type = kLED_TypeMonochrome;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimmingEnable = 0;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.gpio.port = 0;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.gpio.pin = 1;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.gpio.pinStateDefault = 0;
 *   LED_Init((led_handle_t)s_ledMonochromeHandle, &ledMonochromeConfig);
 *  @endcode
 * For rgb LED,
 *  @code
 *   static LED_HANDLE_DEFINE(s_ledRgbHandle);
 *   led_config_t ledRgbConfig;
 *   ledRgbConfig.type = kLED_TypeRgb;
 *   ledRgbConfig.ledRgb.redPin.dimmingEnable = 0;
 *   ledRgbConfig.ledRgb.redPin.gpio.port = 0;
 *   ledRgbConfig.ledRgb.redPin.gpio.pin = 1;
 *   ledRgbConfig.ledRgb.redPin.gpio.pinStateDefault = 0;
 *   ledRgbConfig.ledRgb.greenPin.dimmingEnable = 0;
 *   ledRgbConfig.ledRgb.greenPin.gpio.port = 0;
 *   ledRgbConfig.ledRgb.greenPin.gpio.pin = 2;
 *   ledRgbConfig.ledRgb.greenPin.gpio.pinStateDefault = 0;
 *   ledRgbConfig.ledRgb.bluePin.dimmingEnable = 0;
 *   ledRgbConfig.ledRgb.bluePin.gpio.port = 0;
 *   ledRgbConfig.ledRgb.bluePin.gpio.pin = 3;
 *   ledRgbConfig.ledRgb.bluePin.gpio.pinStateDefault = 0;
 *   LED_Init((led_handle_t)s_ledRgbHandle, &ledRgbConfig);
 *  @endcode
 * For dimming monochrome LED,
 *  @code
 *   static LED_HANDLE_DEFINE(s_ledMonochromeHandle);
 *   led_config_t ledMonochromeConfig;
 *   ledMonochromeConfig.type = kLED_TypeMonochrome;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimmingEnable = 1;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimming.sourceClock = 48000000;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimming.instance = 0;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimming.channel = 1;
 *   ledMonochromeConfig.ledMonochrome.monochromePin.dimming.pinStateDefault = 0;
 *   LED_Init((led_handle_t)s_ledMonochromeHandle, &ledMonochromeConfig);
 *  @endcode
 * For multiple LEDs,
 *  @code
 *   static LED_HANDLE_ARRAY_DEFINE(s_ledArrayHandle, count);
 *   led_config_t ledArrayConfig[count];
 *   for(uint8_t i = 0; i < count; i++ )
 *   {
 *       ledArrayConfig[i].type = kLED_TypeMonochrome;
 *       ledArrayConfig[i].ledMonochrome.monochromePin.dimmingEnable = 1;
 *       ledArrayConfig[i].ledMonochrome.monochromePin.dimming.sourceClock = 48000000;
 *       ledArrayConfig[i].ledMonochrome.monochromePin.dimming.instance = 0;
 *       ledArrayConfig[i].ledMonochrome.monochromePin.dimming.channel = 1;
 *       ledArrayConfig[i].ledMonochrome.monochromePin.dimming.pinStateDefault = 0;
 *       LED_Init((led_handle_t)s_ledArrayHandle[i], &ledArrayConfig[i]);
 *   }
 *  @endcode
 *
 * @param ledHandle Pointer to point to a memory space of size #LED_HANDLE_SIZE allocated by the caller.
 * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
 * You can define one handle in the following two ways:
 * #LED_HANDLE_DEFINE(ledHandle);
 * or
 * uint32_t ledHandle[((LED_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
 * You can define multiple handles in the following way:
 * #LED_HANDLE_ARRAY_DEFINE(ledHandleArray, count);
 * @param  ledConfig Pointer to user-defined configuration structure.
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success LED initialization succeed.
 */
led_status_t LED_Init(led_handle_t ledHandle, led_config_t *ledConfig);

/*!
 * @brief Deinitializes a LED instance.
 *
 * This function deinitializes the LED instance.
 *
 * @param ledHandle LED handle pointer.
 * @retval kStatus_LED_Success LED de-initialization succeed.
 */
led_status_t LED_Deinit(led_handle_t ledHandle);

/*!
 * @brief Sets the LED color.
 *
 * This function sets the LED color. The function only supports the RGB LED.
 * The default color is #kLED_White. Please refer to #LED_MAKE_COLOR(r,g,b).
 *
 * @param ledHandle LED handle pointer.
 * @param ledRgbColor LED color.
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success Color setting succeed.
 */
led_status_t LED_SetColor(led_handle_t ledHandle, led_color_t ledRgbColor);

/*!
 * @brief Turns on or off the LED.
 *
 * This function turns on or off the led.
 *
 * @param ledHandle LED handle pointer.
 * @param turnOnOff Setting value, 1 - turns on, 0 - turns off.
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success Successfully turn on or off the LED.
 */
led_status_t LED_TurnOnOff(led_handle_t ledHandle, uint8_t turnOnOff);

/*!
 * @brief Blips the LED.
 *
 * This function blips the led.
 *
 * @param ledHandle LED handle pointer.
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success Successfully blip the LED.
 */
led_status_t LED_Blip(led_handle_t ledHandle);

/*!
 * @brief Flashes the LED.
 *
 * This function flashes the led. The flash configuration is passed by using #led_flash_config_t.
 *
 * @param ledHandle LED handle pointer.
 * @param ledFlash LED flash configuration.
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success Successfully flash the LED.
 */
led_status_t LED_Flash(led_handle_t ledHandle, led_flash_config_t *ledFlash);

/*!
 * @brief Adjusts the brightness of the LED.
 *
 * This function adjust the brightness of the LED.
 *
 * @param ledHandle LED handle pointer.
 * @param dimmingPeriod The duration of the dimming (unit is ms).
 * @param increasement Brighten or dim (1 - brighten, 0 - dim).
 * @retval kStatus_LED_Error An error occurred.
 * @retval kStatus_LED_Success Successfully adjust the brightness of the LED.
 */
led_status_t LED_Dimming(led_handle_t ledHandle, uint16_t dimmingPeriod, uint8_t increasement);

/*!
 * @brief Prepares to enter low power consumption.
 *
 * This function is used to prepare to enter low power consumption.
 *
 * @param ledHandle LED handle pointer.
 * @retval kStatus_LED_Success Successful operation.
 */
led_status_t LED_EnterLowpower(led_handle_t ledHandle);

/*!
 * @brief Restores from low power consumption.
 *
 * This function is used to restore from low power consumption.
 *
 * @param ledHandle LED handle pointer.
 * @retval kStatus_LED_Success Successful operation.
 */
led_status_t LED_ExitLowpower(led_handle_t ledHandle);

#if defined(__cplusplus)
}
#endif
/*! @}*/
#endif /* __LED_H__ */
