/**
 * @file example_shade.c
 * @author www.tuya.com
 * @brief example_shade module is used to 
 * @version 0.1
 * @date 2023-03-09
 *
 * @copyright Copyright (c) tuya.inc 2023
 *
 */

#include "tuya_app_config.h"
#include "ty_sys.h"

#if defined(LIGHT_PRRODUCT_DIMMER) && (LIGHT_PRRODUCT_DIMMER)
#include "tdl_dimmer_manage.h"
#endif

#include "tfm_color_shade.h"

/***********************************************************
************************macro define************************
***********************************************************/
#define LIGHT_SHADE_TIME_MS    (500)

/***********************************************************
***********************typedef define***********************
***********************************************************/


/***********************************************************
********************function declaration********************
***********************************************************/


/***********************************************************
***********************variable define**********************
***********************************************************/
#if defined(LIGHT_PRRODUCT_DIMMER) && (LIGHT_PRRODUCT_DIMMER)
STATIC TDL_DIMMER_HANDLE sg_dimmer_hdl = NULL;
#endif

STATIC TFM_SHADE_HANDEL_T sg_shade_hdl = NULL;
STATIC THREAD_HANDLE sg_shade_thrd = NULL;
STATIC LIGHT_RGBCW_U sg_target_color;
STATIC LIGHT_RGBCW_U sg_src_color;

/*********************************************************
***********************function define**********************
***********************************************************/
STATIC VOID_T __color_shade_step_cb(TFM_SHADE_HANDEL_T handle, LIGHT_RGBCW_T *src_arr, LIGHT_RGBCW_T *curr_arr,\
                                   LIGHT_RGBCW_T *target_arr, UCHAR_T arr_num, VOID_T*arg)
{
    OPERATE_RET rt = OPRT_OK;
    UINT_T i = 0;

    for(i= 0; i<arr_num; i++) {
#if 0
        TAL_PR_NOTICE("color arr idx:%d", i);
        TAL_PR_NOTICE("shade step curr color r:%d g:%d b:%d c:%d w:%d", curr_arr[i].red, curr_arr[i].green,\
                                                                        curr_arr[i].blue, curr_arr[i].cold, curr_arr[i].warm); 
        TAL_PR_NOTICE(""); 
#endif

#if defined(LIGHT_PRRODUCT_DIMMER) && (LIGHT_PRRODUCT_DIMMER)
        TUYA_CALL_ERR_LOG(tdl_dimmer_output_for_shade(sg_dimmer_hdl, &src_arr[i], &curr_arr[i], &target_arr[i])); 
#endif  

    }

    return;
}

STATIC VOID_T __color_shade_task(void *arg)
{
    OPERATE_RET rt = OPRT_OK;
    UINT_T idx = 0, is_on = FALSE;

    for (;;) {
        if(FALSE == tfm_is_color_shade_task_running(sg_shade_hdl)) {

            if(FALSE == is_on) {
                //随机通道 随机值
                UINT_T rand1 = 0, rand2 = 0; 
                rand1 = tal_system_get_random(LIGHT_COLOR_CHANNEL_MAX-1);
                rand2 = tal_system_get_random(LIGHT_COLOR_RESOLUTION);
                sg_target_color.array[rand1] = rand2;
            
                rand1 = tal_system_get_random(LIGHT_COLOR_CHANNEL_MAX-1);
                rand2 = tal_system_get_random(LIGHT_COLOR_RESOLUTION/4);
                sg_target_color.array[rand1] = rand2;

                rand1 = tal_system_get_random(LIGHT_COLOR_CHANNEL_MAX-1);
                rand2 = tal_system_get_random(LIGHT_COLOR_RESOLUTION/8);
                sg_target_color.array[rand1] = rand2;

                TAL_PR_NOTICE("set r:%d g:%d b:%d c:%d w:%d ", sg_target_color.s.red, sg_target_color.s.green, \
                                                               sg_target_color.s.blue, sg_target_color.s.cold, sg_target_color.s.warm);

                tfm_color_shade_set_shade_time_type(sg_shade_hdl, TFM_MAXINUM_SHADE_TIME);
                TUYA_CALL_ERR_LOG(tfm_color_shade_task_start(sg_shade_hdl, &sg_src_color.s, &sg_target_color.s, 1, LIGHT_SHADE_TIME_MS));

                idx = (idx+1)%LIGHT_COLOR_CHANNEL_MAX;
                is_on = TRUE;
            }else {
                tfm_color_shade_set_shade_time_type(sg_shade_hdl, TFM_TARGET_SHADE_TIME);

                TAL_PR_NOTICE("light shade off");

                memset((UCHAR_T *)sg_target_color.array, 0x00, SIZEOF(sg_target_color));
                TUYA_CALL_ERR_LOG(tfm_color_shade_task_start(sg_shade_hdl, &sg_src_color.s, &sg_target_color.s, 1, LIGHT_SHADE_TIME_MS));
                is_on = FALSE;
            }

            memcpy((UCHAR_T *)&sg_src_color, (UCHAR_T *)&sg_target_color, SIZEOF(LIGHT_RGBCW_U));
        }

        tal_system_sleep(1000);
    }

    return;
}



VOID_T example_color_shade(VOID_T)
{
    OPERATE_RET rt = OPRT_OK;

    //初始化 examples_main 函数中照明基础服务中已经调用

    TUYA_CALL_ERR_GOTO(tfm_color_shade_task_create(1, __color_shade_step_cb, NULL, LIGHT_COLOR_RESOLUTION, &sg_shade_hdl), __EXIT);

#if defined(LIGHT_PRRODUCT_DIMMER) && (LIGHT_PRRODUCT_DIMMER)
    TUYA_CALL_ERR_GOTO(tdl_dimmer_find(LIGHT_DEV_NAME, &sg_dimmer_hdl), __EXIT);
#endif

    THREAD_CFG_T thrd_param = {
        .thrdname = "color_shade",
        .priority = THREAD_PRIO_2,
        .stackDepth = 1024
    };
    TUYA_CALL_ERR_GOTO(tal_thread_create_and_start(&sg_shade_thrd, NULL, NULL, __color_shade_task, NULL, &thrd_param), __EXIT);

__EXIT:
    return;
}
