////////////////////////////////////////////////////////////////////////////////

/// 按键恢复出厂设置
///
///
/// 包含相关初始化功能 
/// @file    Restore_factory_set.c 
/// @author  LH
/// @date    2022-05-31创建
/// @version v2.0

////////////////////////////////////////////////////////////////////////////////

#include "Restore_factory_set.h"
#include  <includes.h>
#include "gd32f4xx.h"
#include "w25q128.h"
#include "beep.h"


/// @brief      初始化
/// @param[in]  none
/// @return     none 
/// @note       修改日志
///             LH于2022-05-31
static void key_rst_init()
{//使用PE4引脚，输入模式
  gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4);
}



/// @brief      按键擦除任务
/// @param[in]  none
/// @return     none 
/// @note       修改日志
///             LH于2022-05-31
static void Restore_factory_task()
{
  unsigned int i;
  i=0;
  while(1)
  {
    if(gpio_input_bit_get(GPIOE, GPIO_PIN_4) == 0)
    {//检测到按键按下，i+1，同时蜂鸣器报警
      i++;
      beep_enable();
      //打开蜂鸣器
    }else{//只要有一次高电平就清零
      i=0;
      beep_disable();
      //关闭蜂鸣器
    }
    if(i>=300)
    {//按键长按3秒，擦除flash，系统重启
      i=0;
      beep_disable();
      OSTimeDlyHMSM(0u,0u,0u,100u);
      //擦除FLASH
      FLASH_BulkErase();
      OSTimeDlyHMSM(0u,0u,2u,0u);
      //系统重启
      NVIC_SystemReset();
    }
    
    OSTimeDlyHMSM(0u,0u,0u,10u);
  }
}



static OS_STK  task_Restore_stk[TASK_PTZ_RESTORE_STK_SIZE];
static  void  task_create_Restore(void)
{ 
  
   CPU_INT08U  name_err;
   
   OSTaskCreateExt((void (*)(void *)) Restore_factory_task,           
		   (void           *) 0,
		   (OS_STK         *)&task_Restore_stk[TASK_PTZ_RESTORE_STK_SIZE - 1],
		   (INT8U           ) TASK_PTZ_RESTORE_PRIO,                   
		   (INT16U          ) TASK_PTZ_RESTORE_PRIO,
		   (OS_STK         *)&task_Restore_stk[0],
		   (INT32U          ) TASK_PTZ_RESTORE_STK_SIZE,
		   (void           *) 0,
		   (INT16U          )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));     
    #if (OS_TASK_NAME_EN > 0)
    OSTaskNameSet(TASK_PTZ_RESTORE_PRIO, "Restore_factory_task", &name_err);
    #endif

}



void init_reset_module()
{
  key_rst_init();
  task_create_Restore();
}






