/**
 *@file sr_led.h
 *@brief LED抽象接口
 *@details 提供LED控制相关枚举、结构体
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author Lierda-RDC
 *@date 2024-04-01
 *@example ZhaoyangSDK\example\component\led_example.c
 */

#ifndef _SR_LED_H
#define _SR_LED_H

#include "board.h"
#include "sr_stddef.h"


/**
 * @brief LED的索引，ID号
 */
 #ifndef SR_LED_NUM
 #define SR_LED_NUM  1
 #endif
typedef enum SR_LED_ID
{
#if (SR_LED_NUM >=1)
    LED0 = 0u,
#endif
#if (SR_LED_NUM >=2)
    LED1,
#endif
#if (SR_LED_NUM >=3)
    LED2,
#endif
#if (SR_LED_NUM >=4)
    LED3,
#endif
#if (SR_LED_NUM >=5)
    LED4,
#endif
#if (SR_LED_NUM >=6)
    LED5,
#endif
#if (SR_LED_NUM >=7)
    LED6,
#endif
#if (SR_LED_NUM >=8)
    LED7,
#endif
#if (SR_LED_NUM >=9)
    LED8,
#endif
#if (SR_LED_NUM >=10)
    LED9,
#endif
    LED_MAX /*!<预留LED最大ID*/
} SR_LED_ID_E;


/**
 * @brief LED的电平类型
 */
typedef enum SR_LED_LVL
{
    SR_LED_OFF = 0,    /*!<0  灭*/
    SR_LED_ON = 1,     /*!<1  亮*/
    SR_LED_TOGGLE = 2, /*!<2  翻转*/

} SR_LED_LVL_E;
#define IS_LED_LVL(x)       (((x)>=SR_LED_OFF) && ((x)<=SR_LED_TOGGLE))

/**
 * @brief LED管理器
 */
typedef struct
{
    unsigned char blink_count;   /*! 闪烁次数：[0xFF]一直闪烁*/
    unsigned char breath_enable; /*! 呼吸灯使能:  [1]使能  [0]禁止*/
    unsigned short on_time;      /*! 亮时常 ，单位ms*/
    unsigned short off_time;     /*! 灭时长 ，单位ms*/
    unsigned short delay_time;   /*! 闪烁效果延迟生效时长，单位  ms*/
} SR_LED_MNG_T;

/*-----------------------------------内部接口--------------------------*/

/**
 * @brief LED闪烁控制任务，10ms周期执行
 *
 * @return 无
 */
void SR_LedBlinkTask(void);

/**
 * @brief LED呼吸灯控制任务  1ms周期执行
 *
 * @return 无
 */
void SR_LedBreathTask(void); // 呼吸灯控制任务  1ms周期执行

/*-----------------------------------对外抽象API接口---------------------------------------*/

/**
 * @brief LED亮灭控制
 *
 * @param[in] id     LED灯的编号
 * @param[in] level  LED电平
 *
 * @return 成功返回0，失败返回错误码
 */
int SR_LedSwitch(SR_LED_ID_E id, SR_LED_LVL_E level);

/**
 * @brief LED闪烁控制
 *
 * @param[in] id  LED灯的编号
 * @param[in] blinkCnt 闪烁次数 0xFF：一直闪烁  其它：指定次数
 * @param[in] onTime   每周期亮的时长, 单位ms
 * @param[in] offTime  每周期灭的时长, 单位ms
 * @param[in] delayTime  闪烁延迟生效的时长, 单位ms
 *
 * @return 成功返回0，失败返回错误码
 */
int SR_LedBlink(SR_LED_ID_E id, uint8_t blinkCnt, uint16_t onTime, uint16_t offTime, uint16_t delayTime);

#ifdef SR_LED_USE_BREATH // 呼吸灯功能（预留）

/**
 * @brief LED呼吸灯使能/禁止
 *
 * @param[in] id      LED灯的编号
 * @param[in] enable  0：禁止  1：使能
 *
 * @return 成功返回0，失败返回错误码
 */
int SR_LedBreath(SR_LED_ID_E id, uint8_t enable);

/**
 * @brief LED呼吸灯参数设置
 *
 * @param[in] pwmPeriod    pwm周期，默认10ms
 * @param[in] breathSpeed  呼吸灯亮度渐变速率，取值为pwmPeriod整倍数，默认150ms
 *
 * @return 成功返回0，失败返回错误码
 */
void SR_LedSetBreathParam(uint8_t pwmPeriod, uint8_t breathSpeed);

#endif
/*-------------------------------------------------------------------------------------*/

#endif
