#include "lynq_led.h"
#include "mbtk_type.h"
#include "mbtk_log.h"
#include "mbtk_info_api.h"

/****************************DEFINE***************************************/
#define QSER_RESULT_FAIL    -1
#define QSER_RESULT_SUCCESS 0
/****************************DEFINE***************************************/

/****************************VARIABLE***************************************/
extern mbtk_info_handle_t* qser_info_handle;
extern int qser_info_handle_num;
/****************************VARIABLE***************************************/


/******************************FUNC*****************************************/
static int qser_led_client_init(void)
{
    if(qser_info_handle == NULL)
    {
        qser_info_handle = mbtk_info_handle_get();
        if(qser_info_handle)
        {
            qser_info_handle_num++;
        }
        else
        {
            LOGE("[qser_led] mbtk_info_handle_get() fail.");
            return QSER_RESULT_FAIL;
        }
    }
    else
    {
        qser_info_handle_num++;
    }

    LOGE("[qser_led] mbtk_info_handle_get() success.");
    return QSER_RESULT_SUCCESS;
}

int qser_led_client_deinit(void)
{
    if(qser_info_handle)
    {
        LOGE("[qser_led] qser_info_handle_num = %d", qser_info_handle_num);
        if(qser_info_handle_num == 1)
        { // 最后一个引用，可释放。
            int ret = mbtk_info_handle_free(&qser_info_handle);
            if(ret)
            {
                LOGE("[qser_led] mbtk_info_handle_free() fail.");
                return QSER_RESULT_FAIL;
            }
            else
            {
                qser_info_handle_num = 0;
                qser_info_handle = NULL;
            }
        }
        else
        {
            qser_info_handle_num--;
        }
    }
    else
    {
        LOGE("[qser_led] handle not inited.");
        return QSER_RESULT_FAIL;
    }

    return QSER_RESULT_SUCCESS;
}

/******************************FUNC*****************************************/

/****************************API***************************************/
int lynq_set_netled_on(int led_mode)
{
    //UNUSED(led_mode);

    if(led_mode != 0 && led_mode != 1)
    {
        LOGE("[qser_led]param is fail.");
        return QSER_RESULT_FAIL;
    }


    int ret = qser_led_client_init();
    if(ret != QSER_RESULT_SUCCESS)
    {
        LOGE("[qser_led]qser_led_client_init fail.");
        return QSER_RESULT_FAIL;
    }

    ret = mbtk_led_set(qser_info_handle, MBTK_LED_TYPE_NET, led_mode);
    if(ret != 0)
    {
        LOGE("[qser_led]mbtk_led_gpio_init fail.");
        qser_led_client_init();
        return QSER_RESULT_FAIL;
    }

    ret = qser_led_client_init();

    return QSER_RESULT_SUCCESS;
}

int lynq_set_statusled_on(int led_mode)
{
    //UNUSED(led_mode);

    if(led_mode != 0 && led_mode != 1)
    {
        LOGE("[qser_led]param is fail.");
        return QSER_RESULT_FAIL;
    }

    int ret = qser_led_client_init();
    if(ret != QSER_RESULT_SUCCESS)
    {
        LOGE("[qser_led]qser_led_client_init fail.");
        return QSER_RESULT_FAIL;
    }

    ret = mbtk_led_set(qser_info_handle, MBTK_LED_TYPE_STATUS, led_mode);
    if(ret != 0)
    {
        LOGE("[qser_led]mbtk_led_gpio_init fail.");
        qser_led_client_init();
        return QSER_RESULT_FAIL;
    }

    ret = qser_led_client_init();

    return QSER_RESULT_SUCCESS;
}
/****************************API***************************************/


