#include "tal_log.h"
#include "tkl_gpio.h"
#include "tal_thread.h"
#include "tuya_cloud_wifi_defs.h"
#include "tuya_cloud_types.h"
#include "tuya_wifi_status.h"
#include "app_led.h"
#include "app_key.h"
#include "dp_process.h"
#include "app_device.h"
#include "tkl_adc.h"
#include "tkl_timer.h"


#define ADC_CHANNEL             2


OLT_ENV_T olt_env = {
	.power_status_whole = TRUE,
	.power_status_1 = TRUE,
	.power_status_2 = TRUE,
	.power_status_3 = TRUE,
	.power_status_4 = TRUE,
	.power_status_usb_whole = TRUE,
	.power_status_usb_a = TRUE,
	.power_status_usb_c1 = TRUE,	
	.power_status_usb_c1 = TRUE,
	.backlight_status = TRUE,
	.backlight_value = 100,
	.fully_charged_close = FALSE,
	.fully_charged_remain = FALSE,
	.child_lock = FALSE,
	.power_on_status = POWER_ON_STATUS_MEMORY
	
};

OLT_GLB_T olt_glb = {
	.cd_relay_1 = 0,
	.cd_relay_2 = 0,
	.cd_relay_3 = 0,
	.cd_relay_4 = 0,
	.cd_usb_a = 0,
	.cd_usb_c1 = 0,
	.cd_usb_c2 = 0
		
};

THREAD_HANDLE device_task_handle = NULL;


#if 1

STATIC TUYA_ADC_BASE_CFG_T sg_adc_cfg = {
    .ch_list.data = 1<<ADC_CHANNEL,
    .ch_nums = 1,    //adc Number of channel lists
    .width = 12,
    .mode = TUYA_ADC_CONTINUOUS,
    .type = TUYA_ADC_INNER_SAMPLE_VOL,
    .conv_cnt = 1,
};

VOID olt_adc_init(INT_T argc, CHAR_T *argv[])
{
    OPERATE_RET rt = OPRT_OK;
    INT32_T adc_value = 0;

    /* ADC 0 channel 2 init */
    TUYA_CALL_ERR_GOTO(tkl_adc_init(TUYA_ADC_NUM_0, &sg_adc_cfg), __EXIT);

    //TUYA_CALL_ERR_LOG(tkl_adc_read_single_channel(TUYA_ADC_NUM_0, ADC_CHANNEL, &adc_value));
    //TAL_PR_DEBUG("ADC%d value = %d", TUYA_ADC_NUM_0, adc_value);

    //TUYA_CALL_ERR_LOG(tkl_adc_deinit(TUYA_ADC_NUM_0));

__EXIT:
    return;
}

#endif

//#define DELAY_TIME    500*1000    //us

#define TIMER_ID        TUYA_TIMER_NUM_0

STATIC CHAR_T sg_count = 0;

STATIC VOID_T _olt_1_sec_timer_callback(VOID *args)
{
    INT32_T adc_value = 0;

    /* TAL_PR_ , PR_ ，这两种打印里面有锁，不要在中断里使用 */
    //tkl_log_output("\r\n------------- hello gavin --------------\r\n");
    sg_count++;

	//tkl_adc_read_single_channel(TUYA_ADC_NUM_0, ADC_CHANNEL, &adc_value);
    //tkl_log_output("\r\n---------------ADC%d value = %d\r\n", TUYA_ADC_NUM_0, adc_value);

#if 0
    if(sg_count >= 5) {
        sg_count=0;
        tkl_timer_stop(TIMER_ID);
        tkl_timer_deinit(TIMER_ID);
        tkl_log_output("\r\ntimer %d is stop\r\n", TIMER_ID);
    }
#endif	

    return;
}


VOID olt_1_sec_timer(INT_T argc, CHAR_T *argv[])
{
    OPERATE_RET rt = OPRT_OK;	

    TUYA_TIMER_BASE_CFG_T sg_timer_cfg = {
        .mode = TUYA_TIMER_MODE_PERIOD,
        .args = NULL,
        .cb = _olt_1_sec_timer_callback
    };

    TUYA_CALL_ERR_GOTO(tkl_timer_init(TIMER_ID, &sg_timer_cfg), __EXIT);

    /*start timer*/
    TUYA_CALL_ERR_GOTO(tkl_timer_start(TIMER_ID, 1000*1000), __EXIT);
    TAL_PR_NOTICE("timer %d is start", TIMER_ID);

__EXIT:
    return;
}

void olt_relay_led_status_init(void)
{
	olt_set_relay_1_status(olt_env.power_status_1);
	olt_set_relay_2_status(olt_env.power_status_2);
	olt_set_relay_3_status(olt_env.power_status_3);
	olt_set_relay_4_status(olt_env.power_status_4);
	olt_set_whole_led_ctrl_status(LED_ON);
	olt_set_main_power_led_status(olt_env.power_status_whole);
	olt_set_usb_led_status(olt_env.power_status_usb_whole);
}

void olt_relay_ctrl_whole(BOOL_T status)
{
	if (status) {
		olt_env.power_status_whole = TRUE;
		olt_env.power_status_1 = TRUE;
		olt_env.power_status_2 = TRUE;
		olt_env.power_status_3 = TRUE;
		olt_env.power_status_4 = TRUE;	
	}
	else {
		olt_env.power_status_whole = FALSE;
		olt_env.power_status_1 = FALSE;
		olt_env.power_status_2 = FALSE;
		olt_env.power_status_3 = FALSE;
		olt_env.power_status_4 = FALSE;	
	}

	olt_set_relay_1_status(olt_env.power_status_1);
	olt_set_relay_2_status(olt_env.power_status_2);
	olt_set_relay_3_status(olt_env.power_status_3);
	olt_set_relay_4_status(olt_env.power_status_4);	
}

void olt_led_ctrl(void)
{
	olt_set_whole_led_ctrl_status(LED_ON);
	olt_set_main_power_led_status(olt_env.power_status_whole);
	olt_set_usb_led_status(olt_env.power_status_usb_whole);	
}

void olt_adc_read(void)
{
    INT32_T adc_value = 0;

    tkl_adc_read_single_channel(TUYA_ADC_NUM_0, ADC_CHANNEL, &adc_value);
    TAL_PR_DEBUG("-------------ADC%d value = %d", TUYA_ADC_NUM_0, adc_value);

}


STATIC VOID_T olt_device_task(VOID_T *args)
{
    for(;;) {
		tal_system_sleep(50);
		olt_adc_read();
    	//TAL_PR_DEBUG("-------------hello olt--------------");
		
    }

    return;
}


void olt_1_sec_thread_create(void)
{
    THREAD_CFG_T device_thread_cfg = {
        .thrdname = "device_task",
        .priority = THREAD_PRIO_6,
        .stackDepth = 1024*2
    };
    //TUYA_CALL_ERR_LOG(tal_thread_create_and_start(&device_task_handle, NULL, NULL, olt_device_task, NULL, &device_thread_cfg));
    tal_thread_create_and_start(&device_task_handle, NULL, NULL, olt_device_task, NULL, &device_thread_cfg);

}


void olt_app_device_init(void)
{
	olt_key_gpio_init();
	olt_wifi_led_gpio_init();
	olt_led_relay_gpio_init();
	
	olt_relay_led_status_init();
	olt_1_sec_timer(0, NULL);
	olt_adc_init(0, NULL);

	olt_1_sec_thread_create();
}


