/// 
/// @file       device_dipswitch.c 
/// @function   继电器初始化
/// @author     ypc 
/// @date       2019-05-25
/// @note       v1.0 2019-05-25
///             v2.0 2022-03-22
///

#include "device_relay.h"
#include "ptz_header_file.h"
#include "service_selfcheck.h"
#include "service_statusmonitor.h"
#include "ptz_type_select.h"
///继电器初始化
void init_relay_module()
{
#ifdef PTZ_MOTOR_RELAY
  gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);
  gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_9);
  
  PTZ_MOTOR_RELAY_OFF;
  g_ptz.ptz_motor_relay_state = PTZ_RELAY_OFF;
#endif

}
///云台继电器打开
void ptz_motor_relay_on()
{
#ifdef PTZ_MOTOR_RELAY
  PTZ_MOTOR_RELAY_ON;
  g_ptz.ptz_motor_relay_state = PTZ_RELAY_ON;
#endif
  //关闭云台自检任务
  if(g_ptz.vert_self_check != PTZ_VERT_SELF_CHECK_END)
  {
    OSTaskDel(TASK_VERT_SELF_CHECK_PRIO);
  }
  if(g_ptz.hori_self_check != PTZ_HORI_SELF_CHECK_END)
  {
    OSTaskDel(TASK_HORI_SELF_CHECK_PRIO); 
  }
  g_ptz.hori_self_check = PTZ_HORI_SELF_CHECK_END;
  g_ptz.vert_self_check = PTZ_VERT_SELF_CHECK_END;
  
  //关闭所有自动扫描任务
  OSTaskDel(TASK_AREA_SCAN_PRIO);
  OSTaskDel(TASK_PRESET_BIT_SCAN_PRIO);
  
  //关闭故障检测任务
  OSTaskDel(TASK_FAULT_DETECT_PRIO);
  //将所有故障清除
  g_ptz.fault_detect.hori_rotate_fault      = NO_FAULT;//水平转动故障 清除 
  g_ptz.fault_detect.vert_rotate_fault      = NO_FAULT;//垂直转动故障 清除
  g_ptz.fault_detect.hori_hall_fault        = NO_FAULT;//水平电机霍尔故障 清除
  g_ptz.fault_detect.vert_hall_fault        = NO_FAULT;//垂直电机霍尔故障 清除
  g_ptz.fault_detect.temperature_fault      = NO_FAULT;//温度异常 清除
  g_ptz.fault_detect.voltage_fault          = NO_FAULT;//电压异常 清除
  g_ptz.fault_detect.electric_current_fault = NO_FAULT;//电流异常 清除
  
  g_ptz.fault_detect.Phase_curr_H           = NO_FAULT;//水平相电流过流保护 清除
  g_ptz.fault_detect.Phase_curr_V           = NO_FAULT;//垂直相电流过流保护 清除
  g_ptz.fault_detect.h_ntc_temp_fault       = NO_FAULT;//水平NTC温度异常 清除
  g_ptz.fault_detect.v_ntc_temp_fault       = NO_FAULT;//垂直NTC温度异常 清除
  
  g_ptz.fault_detect.fault                  = NO_FAULT;//故障总标志， 清除
  
  //刹车停转所有电机
  ptz_sem_post_stop_mutex();//释放启停共享资源所
  OSTimeDlyHMSM(0u, 0u, 0u, 20u);//等待一段时间
  g_ptz.vert_angleP.angle_allow_max = 60.0;
  g_ptz.vert_angleP.angle_allow_min = -60.0;  
  ptz_hori_stop(PTZ_HORI_STOP_TIME);
  ptz_vert_stop(PTZ_VERT_STOP_TIME);
  //软件关闭区域扫描
  g_area_scan.state = AREA_SCAN_CLOSE_A;
  //关闭预置位扫描
  g_preset_bit_scan.state = PRESET_BIT_SCAN_CLOSE_A;
  
  /* 考虑继电器打开时，垂直光电开关失效，且垂直角度状态为不可用，，，，若为直齿则设置为可用状态 */
  
#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D
  //继电器打开，角度计算配置为可用（针对简易自检无法完成时，手动矫正，适用于直齿云台）
  g_ptz.vert_as5047d.as5047d_state = 1;
  g_ptz.hori_as5047d.as5047d_state = 1;
  g_ptz.hori_angle_state = 1;
  g_ptz.vert_angle_state = 1;
  
#else
  //垂直光电开关失效，角度状态为不可用
  
  
#endif
}
///云台继电器关闭
void ptz_motor_relay_off()
{
#ifdef PTZ_MOTOR_RELAY
  PTZ_MOTOR_RELAY_OFF;
  g_ptz.ptz_motor_relay_state = PTZ_RELAY_OFF;
#endif
  //重新创建被删除的任务
  init_area_scan_module();
  init_preset_bit_scan_module();
  init_status_monitor_module();
}


