/*
 * @Author: zhangshu
 * @email: shiliang.zhang@tuya.com
 * @LastEditors: Please set LastEditors
 * @file name: app_key.c
 * @Description:
 * @Copyright: HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD
 * @Company: http://www.tuya.com
 * @Date: 2022-02-08
 * @LastEditTime: 2022-02-08
 */
#include "tal_memory.h"
#include "tal_gpio.h"
#include "tkl_gpio.h"
#include "tuya_hal_gpio.h"

#include "app_common.h"
#include "app_ext_key.h"
#include "app_key.h"
#include "app_mfg.h"
#include "app_battery.h"

#include "bsp.h"

// key push short times
#define KEY_PUSH_TIME_SHORT 700
#define EXT_KEY_1_IO_INDEX 0
#define EXT_KEY_2_IO_INDEX 0
#define EXT_KEY_3_IO_INDEX 0
#define LONE_PRESS_TIME 100

UINT8_T ucSwitchType[CHANNEL_NUM];

STATIC VOID_T gpio_ext_key_interrupt_handler(UINT32_T ext_key_id, KEY_ST_T key_st, UINT32_T push_time);

OPERATE_RET app_ext_key_oem_init(key_config_t *config)
{
  tal_key_gpio_init(config, 4, 50, gpio_ext_key_interrupt_handler);
  TAL_PR_TRACE("key init OK!!!");
  return OPRT_OK;
}

UINT8_T gpio_ext_key_read_keys(TUYA_GPIO_NUM_E *key_pins)
{
  UINT8_T key_value = 0;
  UINT8_T read_level;
  UINT8_T i;
  for (i = 0; i < CHANNEL_NUM; i++)
  {
    tkl_gpio_read(key_pins[i], &read_level);
    key_value |= (read_level << i);
  }
  return key_value;
}

// VOID_T user_active_get(TUYA_GPIO_NUM_E *key_pins)
// {
//   UINT8_T i;
//   UINT8_T j;
//   drv_gpioIrqMode_t mode;
//   // for (i = 0; i < CHANNEL_NUM; i++)
//   // {
//   //   j = i;
//   //   check_pin_register(key_pins[i], &j, mode);
//   //   TAL_PR_DEBUG("key_pins[i] %d, j %d, mode %d", key_pins[i], j, mode);
//   // }

// }

// VOID_T key_press_callback(UINT32_T time_ms,UINT8_T index, TUYA_GPIO_NUM_E *key_pins)
// {
//   UINT8_T key_temp;

// }

STATIC VOID_T gpio_ext_key_interrupt_handler(UINT32_T ext_key_id, KEY_ST_T key_st, UINT32_T push_time)
{
  TUYA_GPIO_NUM_E key_pins[CHANNEL_NUM] = {EXT_KEY_PIN_1, EXT_KEY_PIN_2, EXT_KEY_PIN_3, EXT_KEY_PIN_4};
  UINT8_T i;
  UINT8_T key_value;
  UINT8_T bit_mask;
  UINT8_T changed_bits;
  UINT8_T key_temp;

  key_value = gpio_ext_key_read_keys(key_pins);
  TAL_PR_TRACE("key_value %d != tuya_gpio_key_value_bak %d", key_value, tuya_gpio_key_value_bak);
  TAL_PR_TRACE("ext_key_id %d", ext_key_id);
  TAL_PR_TRACE("key_st %d", key_st);
  TAL_PR_TRACE("push_time %d", push_time);
  if (key_value != tuya_gpio_key_value_bak)
  {
    TAL_PR_TRACE("key_value %d != tuya_gpio_key_value_bak %d == true", key_value, tuya_gpio_key_value_bak);

    changed_bits = key_value ^ tuya_gpio_key_value_bak;
    TAL_PR_TRACE("changed_bits: 0x%02X", changed_bits);

    for (i = 0; i < CHANNEL_NUM; i++)
    {
      bit_mask = (1 << i);

      if (!(changed_bits & bit_mask))
        continue;
      TAL_PR_TRACE("Processing key %d, ucSwitchType[%d]: %d", i, i, ucSwitchType[i]);

      if (ucSwitchType[i] == 0)
      {

        if ((key_value & bit_mask) == bit_mask)
        {
          ucSwitchType[i] = 1;
          TAL_PR_TRACE("Key %d: Toggle switch detected (press)", i);
        }
        else
        {
          // key_press_callback(push_time, i, key_pins);
          key_temp = gpio_ext_key_read_keys(key_pins);
          if (push_time < LONE_PRESS_TIME)
          {
            if ((key_temp & bit_mask) == bit_mask)
              ucSwitchType[i] = 2;
            TAL_PR_TRACE("Key %d: Reset switch detected", i);
          }
          if (push_time > LONE_PRESS_TIME)
          {
            ucSwitchType[i] = 1;
            TAL_PR_TRACE("Key %d: Toggle switch detected (timeout)", i);
          }
          TAL_PR_TRACE("(key_st == KEY_ST_PUSH) %d \r\n", push_time);
        }
      }
    }
    for (i = 0; i < CHANNEL_NUM; i++)
    {
      UINT8_T bit_mask = (1 << i);

      // ֻ仯İ
      if (!(changed_bits & bit_mask))
        continue;

      if (ucSwitchType[i] == 1)
      {
        // ̰忪 - ÿ״̬仯л̵
        TAL_PR_TRACE("Toggle switch %d action", i);
        if (get_rel_status(i))
        {
          rel_off(0, 1);
        }
        else
        {
          rel_on(0, 1);
        }
      }
      else if (ucSwitchType[i] == 2)
      {
        // λ - ֻͷʱл̵
        TAL_PR_TRACE("Reset switch %d: key_value & bit_mask = 0x%02X", i, key_value & bit_mask);
        if ((key_value & bit_mask) == 0x00)
        {
          // ͷʱִж
          if (get_rel_status(i))
          {
            rel_off(0, 1);
          }
          else
          {
            rel_on(0, 1);
          }
          TAL_PR_TRACE("Reset switch %d action executed", i);
        }
      }
    }
    tuya_gpio_key_value_bak = key_value;
    TAL_PR_TRACE("ext_key_lp_reregister");
    // user_active_get(key_pins);
    // if (key_st == KEY_ST_PUSH)
    // {}
    // else
    // {}
  }
}
