/**
 * @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 "gpio.h"
#include "key.h"
// #include "kscan.h"
#include "types.h"
#include "pwrmgr.h"
// #include "app_iic.h"
#include "tkl_wakeup.h"


STATIC key_check_t  g_key_check;
STATIC TIMER_ID     key_timer_id = NULL;
/**
 * @brief user_key_edge_handleCb 按键中断定时器处理回调
 *
 * @param[in] param: none
 *
 * @return none
 */
STATIC void user_key_check_timeout_handlercb(TIMER_ID timer_id, VOID_T *arg)
{
    if(g_key_check.state == KEY_DOWN)
    {
        if(hal_gpio_read(g_key_check.num) ==0)
        {
            g_key_check.decode_time++;
            if(g_key_check.decode_time >=KEY_DECODE_TIME)
                g_key_check.state =  KEY_DECODE;
        }
        else
        {
            g_key_check.state = KEY_UP;
            g_key_check.num = KEY_NUM_DUMMY;
            g_key_check.long_time = 0;
        }
    }
    else if(g_key_check.state == KEY_DECODE)
    {
        if(hal_gpio_read(g_key_check.num) ==0)
        {
            g_key_check.long_time++;
            if(g_key_check.num == KEY_NUM_DOWN&&g_key_check.long_time>KEY_LONG_PRESS_TIME)
            {
                TAL_PR_DEBUG("long down");
                g_key_check.state = KEY_LONG_DOWN;
                g_key_check.decode_time=0;
                tal_sw_timer_stop(key_timer_id);
            }
        }
    }
}


/**
 * @brief user_key_edge_handleCb 边沿沿中断处理回调
 *
 * @param[in] param: none
 *
 * @return none
 */
STATIC VOID_T user_key_edge_handleCb(gpio_pin_e pin,gpio_polarity_e type)
{

    //TAL_PR_DEBUG("key=%d  posedge %d\r\n",pin,type);
    /*当前没有按键按下检测*/

    if(g_key_check.state == KEY_UP)
    {
        if(type == POL_FALLING)
        {   
            //下降沿 按键按下
            g_key_check.state = KEY_DOWN;
            g_key_check.num = pin;
            g_key_check.long_time = 0;
            tal_sw_timer_start(key_timer_id,KEY_CHECK_TIMER_PERIOD,TAL_TIMER_CYCLE);
        } 
    }
    if(type == POL_RISING && pin == g_key_check.num)
    {
        tal_sw_timer_stop(key_timer_id);

        if(g_key_check.state == KEY_DECODE)
        {   
            TAL_PR_DEBUG("short down");
        } 
        if(g_key_check.state == KEY_LONG_DOWN && g_key_check.num == KEY_NUM_DOWN)/*长按松手 如果是P15需要发送事件,其他不需要*/
        {
            TAL_PR_DEBUG("long up");
        }
        g_key_check.num = KEY_NUM_DUMMY;
        g_key_check.state = KEY_UP;
        g_key_check.decode_time = 0;
        g_key_check.long_time = 0;

    }
}

/**
 * @brief oled_key_init oled 按键初始化
 *
 * @param[in] param: none
 *
 * @return none
 */
void user_key_init()
{
    /*初始化按键LED、大灯、充电开关*/
	// hal_gpio_pull_set(KEY_LED_PIN,GPIO_PULL_UP_S);
    // hal_gpio_pin_init(KEY_LED_PIN,GPIO_OUTPUT);
	// hal_gpio_pull_set(MAX_LED_PIN,GPIO_PULL_UP_S);
    // hal_gpio_pin_init(MAX_LED_PIN,GPIO_OUTPUT);
	// hal_gpio_pull_set(CH_PIN,GPIO_PULL_UP_S);
    // hal_gpio_pin_init(CH_PIN,GPIO_OUTPUT);

    // KEY_LED_Set();

    hal_gpio_pull_set(GEAR_DOWN_KEY_PIN, GPIO_PULL_UP_S);
    hal_gpioin_register(GEAR_DOWN_KEY_PIN, user_key_edge_handleCb, user_key_edge_handleCb);
    
    

    g_key_check.state = KEY_UP;
    g_key_check.num = KEY_NUM_DUMMY;
    g_key_check.long_time = 0;
    g_key_check.decode_time = 0;
    tal_sw_timer_create(user_key_check_timeout_handlercb, NULL, &key_timer_id);

    /* 按住锁电按键上电，此时中断无法检测到下降沿，采用定时器去检测，如果2S检测一直为低，发送事件显示logo，否则掉电 */  
    //tal_sw_timer_create(oled_key_power_lock_check_timeout_handlercb, NULL, &power_lock_timer_id);
    //tal_sw_timer_start(power_lock_timer_id,20,TAL_TIMER_CYCLE);
}


