#include "indicator_led.h"
#include "rtdevice.h"

#define ADC_DEV_NAME        "adc1"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     5           /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

#define LED_NUM 24 // LED灯珠个数

rt_thread_t led_blink_thread = RT_NULL;
rt_thread_t led_breath_thread = RT_NULL;

// 灯是否处于特定颜色还是闪烁状态
uint8_t LED_Blink_State[LED_NUM] = {LED_NOT_BLINKING};
// 呼吸灯是否开启
uint8_t LED_Breath_State = LED_BREATH_OFF;
// 灯闪烁颜色缓存
RGBColor_TypeDef LED_Blink_Color[LED_NUM] = {0};
const RGBColor_TypeDef LED_OFF = {0, 0, 0};
const RGBColor_TypeDef LED_ON = {255, 255, 255};
/**
 * @brief           设置呼吸LED的开关
 * @param  LedBreath_state    开/关 LED_BREATH_ON/LED_BREATH_OFF
 */
void LED_BreathTurn(uint8_t LedBreath_state)
{
    LED_Breath_State = LedBreath_state;
    // if (LedBreath_state == LED_BREATH_OFF)
    // {
    //     // rt_thread_suspend(led_breath_thread);
    //     LED_SetMore(LED_BREATH_ID(1), LED_BREATH_ID(12), LED_OFF);
    // }
    // else if (LedBreath_state == LED_BREATH_ON)
    // {
    //     // rt_thread_resume(led_breath_thread);
    // }
}
/**
 * @brief           设置特定LED的颜色或开关
 * @param  LedId    LED的序号(0~LED_NUM-1) 
 * @param  Color    颜色/开关 LED_RED,LED_BLUE,LED_OFF,LED_ON(白色)……
 */
void LED_Set(uint16_t LedId, RGBColor_TypeDef Color)
{
    LedId=LED_CHARGE_ID(LedId);
    LED_Blink_State[LedId] = 0;
    Set_LEDColor(LedId, Color);
    RGB_Reflash();
}
/**
 * @brief           设置连续多个特定LED的颜色或开关
 * @param  LedId_begin    LED的序号(0~LED_NUM-1)开始  
 * @param  LedId_end    LED的序号(0~LED_NUM-1)结束 
 * @param  Color    颜色/开关 LED_RED,LED_BLUE,LED_OFF,LED_ON(白色)……
 */
void LED_SetMore(uint16_t LedId_begin, uint16_t LedId_end, RGBColor_TypeDef Color)
{
    LedId_begin=LED_CHARGE_ID(LedId_begin);
    LedId_end=LED_CHARGE_ID(LedId_end);
    for (int LedId = LedId_begin; LedId <= LedId_end; LedId++)
    {
        LED_Blink_State[LedId] = 0;
        Set_LEDColor(LedId, Color);
    }
    RGB_Reflash();
}

/**
 * @brief           设置特定LED的闪烁
 * @param  LedId    LED的序号(0~LED_NUM-1) 
 * @param  Color    颜色 LED_RED,LED_BLUE……
 */
void LED_Blink(uint16_t LedId, RGBColor_TypeDef Color)
{
    LedId=LED_CHARGE_ID(LedId);
    LED_Blink_State[LedId] = 1;
    LED_Blink_Color[LedId] = Color;
}
/**
 * @brief           设置连续多个特定LED的闪烁
 * @param  LedId_begin    LED的序号(0~LED_NUM-1)开始 
 * @param  LedId_end    LED的序号(0~LED_NUM-1)结束 
 * @param  Color    颜色 LED_RED,LED_BLUE……
 */
void LED_BlinkMore(uint16_t LedId_begin, uint16_t LedId_end, RGBColor_TypeDef Color)
{
    LedId_begin=LED_CHARGE_ID(LedId_begin);
    LedId_end=LED_CHARGE_ID(LedId_end);
    for (int LedId = LedId_begin; LedId <= LedId_end; LedId++)
    {
        LED_Blink_State[LedId] = 1;
        LED_Blink_Color[LedId] = Color;
    }
}
/**
 * @brief           每0.5s判断各盏灯是否要翻转
 */
void led_blink_entry(void *parameter)
{
    uint8_t LED_Blink_ON = 1;
    while (1)
    {
        for (int LedId = 0; LedId < LED_NUM; LedId++)
        {
            if (LED_Blink_State[LedId] == LED_IS_BLINKING)
            {
                if (LED_Blink_ON)
                {
                    Set_LEDColor(LedId, LED_Blink_Color[LedId]);
                }
                else
                {
                    Set_LEDColor(LedId, LED_OFF);
                }
            }
        }
        LED_Blink_ON = !LED_Blink_ON;
        RGB_Reflash();
        rt_thread_mdelay(500);
    }
}

/**
 * @brief   流水灯
 */
void led_breath_entry(void *parameter)
{
    int count = 0;
    while (1)
    {
        for (int i = LED_BREATH_ID(1); i <= LED_BREATH_ID(12); i++)
        {
            if (LED_Breath_State==LED_BREATH_OFF)
            {
                rt_thread_mdelay(100);
                i = LED_BREATH_ID(1);
                continue;
            }
            
            switch (count)
            {
            case 0:
                Set_LEDColor(i, LED_RED);
                break;
            case 1:
                Set_LEDColor(i, LED_GREEN);
                break;
            case 2:
                Set_LEDColor(i, LED_BLUE);
                break;
            default:
                return;
                break;
            }
            RGB_Reflash();
            rt_thread_delay(40);
        }
        count = (count + 1) % 3;
    }
}

#define BORAD_NOT_CORRECT 25
#define BORAD_CORRECT_VOL 250

/**
 * @brief 检测一下当前接入的是否是正确的板
*/
static int borad_check(void)
{
    rt_adc_device_t adc_dev;
    rt_uint32_t value, vol;
    rt_err_t ret = RT_EOK;

    /* 查找设备 */
    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if (adc_dev == RT_NULL)
    {
        rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
        return RT_ERROR;
    }

    /* 使能设备 */
    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

    /* 读取采样值 */
    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);

    /* 转换为对应电压值 */
    vol = value * REFER_VOLTAGE / CONVERT_BITS;
    if(vol>=BORAD_CORRECT_VOL)
    {
        rt_kprintf("NOT correct borad!\n");
        rt_kprintf("the value is :%d \n", value);
        rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
        return BORAD_NOT_CORRECT;
    }
    /* 关闭通道 */
    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(borad_check, adc voltage convert sample);

/**
 * @brief LED的初始化
*/
int led_init(void)
{
    if (borad_check()==BORAD_NOT_CORRECT)
    {
        return 0;
    }    
    led_blink_thread = rt_thread_create("led blink control thread", led_blink_entry, RT_NULL, 1024, 20, 20);
    if (led_blink_thread == RT_NULL)
    {
        rt_kprintf("led blink control thread creat failed!\n");
        return 0;
    }
    led_breath_thread = rt_thread_create("led breath control thread", led_breath_entry, RT_NULL, 1024, 20, 20);
    if (led_breath_thread == RT_NULL)
    {
        rt_kprintf("led breath control thread creat failed!\n");
        return 0;
    }
    rt_thread_mdelay(200); // avoid multi-thread on LED matrix transmit.
    rt_thread_startup(led_blink_thread);
    rt_thread_startup(led_breath_thread);
}