/**
 * @file app_key.c
 * @brief This is app_key file
 * @version 1.0
 * @date 2021-09-10
 *
 * @copyright Copyright 2021-2023 Tuya Inc. All Rights Reserved.
 *
 */


#include "board.h"

#include "tal_log.h"
#include "tal_sw_timer.h"
#include "tal_gpio.h"
#include "tal_rtc.h"
#include "tal_key.h"
#include "tal_sdk_test.h"

#include "tuya_ble_api.h"
#include "tuya_ble_protocol_callback.h"

#include "app_key.h"
#include "user.h"
#include "tal_adc.h"
/***********************************************************************
 ********************* constant ( macro and enum ) *********************
 **********************************************************************/
#define APP_KEY_PIN BOARD_KEY_PIN

/***********************************************************************
 ********************* struct ******************************************
 **********************************************************************/


/***********************************************************************
 ********************* variable ****************************************
 **********************************************************************/
STATIC TIMER_ID app_key_timer_id = NULL;
STATIC TIMER_ID app_adc_timer_id = NULL;

STATIC VOID_T app_key_handler(UINT32_T state);
STATIC tal_key_param_t key_press_param = {
    .pin = APP_KEY_PIN,
    .valid_level = TUYA_KEY_LEVEL_LOW,
    .count_len = 3,
    .count_array = {5, 300, 500},
    .handler = app_key_handler,
};

/***********************************************************************
 ********************* function ****************************************
 **********************************************************************/


VOID_T user_wakeup_handler(VOID_T)
{
    tal_cpu_force_wakeup();

    OPERATE_RET ret = 0;
    ret = tal_uart_init(TUYA_UART_NUM_0, &tal_uart_cfg);
    if(ret == 0)
    {
        TAL_PR_DEBUG("tal_uart_init success");
    }
//    tal_ble_advertising_start(&tal_adv_param);
    test_sleep_flag = 0;
}

STATIC VOID_T app_key_handler(UINT32_T state)
{
    
    TAL_PR_DEBUG("*******app_key_handler*******");
//    TAL_PR_INFO("Key state: %d", state);
    switch (state) {
        //Short press
        case 1: {
            extern uint8_t test_sleep_flag;
            if(test_sleep_flag == 1)
            {
                user_wakeup_handler();
                INT32_T  adc_value = 0;
                TUYA_ADC_BASE_CFG_T adc_cfg = {
                    .ch_nums = 1,
                    .ch_list.data = (1<<5),
                    .width = 12,
                    .type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,
                };
                OPERATE_RET ret = 0;
                ret = tal_adc_init(TUYA_ADC_NUM_0, &adc_cfg);
                if (ret == OPRT_OK) {
                    ret = tal_adc_read_single_channel(TUYA_ADC_NUM_0, 5, &adc_value);
                    TAL_PR_DEBUG("*****tal_adc_read_single_channel:%d", adc_value);
                }
                tal_adc_deinit(TUYA_ADC_NUM_0);
                tal_sw_timer_start(app_adc_timer_id, 10, TAL_TIMER_ONCE);
            }
        } break;

        //Long press
        case 2: {
            tuya_ble_device_factory_reset();
            tuya_ble_disconnect_and_reset_timer_start();
        } break;

        //Long long press timeout
        case 3: {
        } break;

        //Short press release
        case 5: {
        } break;

        //Long press release
        case 6: {
        } break;

        default: {
        } break;
    }
}

UINT32_T tal_key_get_pin_level(UINT32_T pin)
{
    // Weak function instance
    TUYA_GPIO_LEVEL_E level = TUYA_GPIO_LEVEL_LOW;
    tal_gpio_read(pin, &level);
    return level;
}

STATIC VOID_T app_key_irq_cb(VOID_T *args)
{
    TUYA_GPIO_LEVEL_E level = TUYA_GPIO_LEVEL_LOW;
    tal_gpio_read(APP_KEY_PIN, &level);

    if (level == TUYA_GPIO_LEVEL_LOW) {
        tal_sw_timer_start(app_key_timer_id, 10, TAL_TIMER_CYCLE);
    }
}

STATIC VOID_T app_key_timeout_handler(TIMER_ID timer_id, VOID_T *arg)
{
    if (!tal_key_timeout_handler(&key_press_param)) {
        tal_sw_timer_stop(app_key_timer_id);
    }
}
STATIC VOID_T app_adc_timeout_handler(TIMER_ID timer_id, VOID_T *arg)
{
    TAL_PR_DEBUG("app_adc_timeout_handler");
    app_key_init();
    TUYA_WAKEUP_SOURCE_BASE_CFG_T wakeup_cfg = {
        .source = TUYA_WAKEUP_SOURCE_GPIO,
        .wakeup_para.gpio_param.gpio_num = TUYA_GPIO_NUM_7,
        .wakeup_para.gpio_param.level = TUYA_GPIO_LEVEL_LOW,
    };
    tkl_wakeup_source_set(&wakeup_cfg);
}
VOID_T app_key_init(VOID_T)
{
    TUYA_GPIO_BASE_CFG_T gpio_cfg = {
        .mode = TUYA_GPIO_PULLUP,
        .direct = TUYA_GPIO_INPUT,
        .level = TUYA_GPIO_LEVEL_LOW,
    };
    TUYA_GPIO_IRQ_T gpio_irq = {
        .mode = TUYA_GPIO_IRQ_RISE_FALL,
        .cb = app_key_irq_cb,
        .arg = NULL,
    };
    OPERATE_RET ret=0;
    ret = tal_gpio_init(APP_KEY_PIN, &gpio_cfg);
    TAL_PR_DEBUG("******tal_gpio_init,ret = %d",ret);
    ret = tal_gpio_irq_init(APP_KEY_PIN, &gpio_irq);
    TAL_PR_DEBUG("******tal_gpio_irq_init,ret = %d",ret);
    tal_gpio_irq_enable(APP_KEY_PIN);

    tal_key_init(&key_press_param);

    tal_sw_timer_create(app_key_timeout_handler, NULL, &app_key_timer_id);
    tal_sw_timer_create(app_adc_timeout_handler, NULL, &app_adc_timer_id);
    // TUYA_GPIO_BASE_CFG_T gpio_cftest_led = {
    //     .mode = TUYA_GPIO_PUSH_PULL,
    //     .direct = TUYA_GPIO_OUTPUT,
    //     .level = TUYA_GPIO_LEVEL_HIGH,
    // };
    // tal_gpio_init(TUYA_GPIO_NUM_26, &gpio_cftest_led);
    // tal_gpio_init(TUYA_GPIO_NUM_31, &gpio_cftest_led);
    // tal_gpio_init(TUYA_GPIO_NUM_32, &gpio_cftest_led);
    // tal_gpio_write(TUYA_GPIO_NUM_26,TUYA_GPIO_LEVEL_HIGH);
    // tal_gpio_write(TUYA_GPIO_NUM_31,TUYA_GPIO_LEVEL_HIGH);
    // tal_gpio_write(TUYA_GPIO_NUM_32,TUYA_GPIO_LEVEL_HIGH);
}

