#ifndef __PTZ_FAULT_DETECT_H_
#define __PTZ_FAULT_DETECT_H_
#include "Usart.h"
#include "ptz_default_value.h"
#include "ptz_type_select.h"

#define  ROTATE_FAULT_MAX_NUM       10//8  //判断转动故障连续最大次数

//判断无法转动的模拟电压等级阈值电压
#define PTZ_HORI_VOLTAGE_LEVEL     1900.0
#define PTZ_VERT_VOLTAGE_LEVEL     1900.0
//判断无法转动速度的阈值速度
#define PTZ_HORI_DETECT_SPEED      (PTZ_HORI_MIN_SPEED / 3.0)
#define PTZ_VERT_DETECT_SPEED      (PTZ_VERT_MIN_SPEED / 3.0)
   
//故障标志
#define FAULT        1    //故障
#define NO_FAULT     0    //没有故障

/*故障指令代号*/
#define HORI_ROT         0X21
#define HORI_HALL        0X22
#define HORI_PDE         0X23

#define VERT_ROT         0X24
#define VERT_HALL        0X25
#define VERT_PDE         0X26

#define WORK_TEMP        0X27//温度故障
#define WORK_VOLT        0X28//电压故障
#define CAMERA_POWER     0X29//电源状态

#define NTC_HORI         0X2B//水平NTC温度
#define NTC_VERT         0X2C//垂直NTC温度

#define Phase_Curr_H     0X2D//水平相电流
#define Phase_Curr_V     0X2E//垂直相电流


#define ALL_FAULT_STATE  0X20//所有都故障

#define WORK_ELECTRIC_CURRENT 0x2A//工作电流
#define VERT_PHOTOELECT_SWITCH     0x2F//垂直光电开关


//上传云台转动方向
#define PTZ_UP       1//上
#define PTZ_DOWN     2//下
#define PTZ_LEFT     3//左
#define PTZ_RIGHT    4//右


/******************************云台工作状态判断*****************************/
#define SELF_CHECKING  1//云台自检中
#define AREA_SCANING   2//区域扫描中
#define AREA_PAUSING   3//区域扫描暂停中
#define AREA_RECOING   4//区域扫描恢复中
#define AREA_CLOSING   5//区域扫描关闭中
#define PP_SCANING     6//预置位扫描中
#define PP_PAUSING     7//预置位扫描暂停中
#define PP_RECOING     8//预置位扫描恢复中
#define PP_CLOSING     9//预置位扫描关闭中
#define HORI_VREF_SAMP 10//正在进行水平电压采集
#define VERT_VREF_SAMP 11//正在进行垂直电压采集
#define HOVE_VREF_SAMP 12//水平电压采集和垂直电压同时采集
#define HORI_PD_ERROR  13//水平位置更新出错
#define VERT_PD_ERROR  14//垂直位置更新出错
#define HOVE_PD_ERROR  15//水平垂直位置更新都出错
#define MOTOR_COLD_CANNOT_ROT 16//电机低温无法转动，加热中


#define MOTOR_HORI_COLD_CANNOT_ROT 0xfa//云台水平电机无法转动，转动故障
#define MOTOR_VERT_COLD_CANNOT_ROT 0xfb//云台垂直电机无法转动，转动故障
#define MOTOR_HORI_CANNOT_ROT 0xfc//云台水平电机无法转动，转动故障
#define MOTOR_VERT_CANNOT_ROT 0xfd//云台垂直电机无法转动，转动故障
#define MOTOR_HOVE_CANNOT_ROT 0xfe//云台所有电机无法转动，转动故障
#define OTHER_MODE 0   //其他模式

//直齿轻型云台
#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D  
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     70.0 //65.0 
  #define PTZ_TEMP_DETECT_MIN     -40.0//-25.0 //山火云台温度阈值-40-70

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     18.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0

  //霍尔故障阈值
  #define PTZ_HALL_DETECT         30//30

  //相电流运行最大值
  #define PHASE_CURRENT           6.0

#endif
//L6235D蜗轮蜗杆中型云台
#ifdef PTZ_MEDIUM_WORM_L6235D_AS5047D 
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     18.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0

  //霍尔故障阈值
  #define PTZ_HALL_DETECT         30//30

  //相电流运行最大值
  #define PHASE_CURRENT           4.8
#endif 

//L6235D涡轮蜗杆重型云台
#ifdef PTZ_HEAVY_WORM_L6235D_AS5047D
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     18.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0

  //霍尔故障阈值
  #define PTZ_HALL_DETECT         30//30

  //相电流运行最大值
  #define PHASE_CURRENT           5.0
#endif 

#ifdef PTZ_SUPER_LIGHT_WORM_L6235D_AS5047D_12V 
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     14.0//30.0
  #define PTZ_VOLT_DETECT_MIN     9.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0

  //霍尔故障阈值
  #define PTZ_HALL_DETECT         30//30

  //相电流运行最大值
  #define PHASE_CURRENT           3.0
#endif 


#ifdef PTZ_SUPER_LIGHT_WORM_L6235D_AS5047D_24V 
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     18.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0

  //霍尔故障阈值
  #define PTZ_HALL_DETECT         30//30

  //相电流运行最大值
  #define PHASE_CURRENT           3.0
#endif 


//步进电机
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_DRV8711_AS5047D_12V
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     14.0//30.0
  #define PTZ_VOLT_DETECT_MIN     9.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0
#endif


//步进电机
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_DRV8711_AS5047D_24V
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     9.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0
#endif

//步进电机
#ifdef PTZ_SUPER_LIGHT_WORM_STEP_TMC2160_AS5047D_24V
  //工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     9.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0
#endif

//中型步进电机
#ifdef PTZ_MEDIUM_WORM_STEP_TMC2160_AS5047D_24V
//工作温度阈值
  #define PTZ_TEMP_DETECT_MAX     65.0 //70.0 
  #define PTZ_TEMP_DETECT_MIN     -25.0//70.0 

  //工作电压阈值
  #define PTZ_VOLT_DETECT_MAX     30.0//30.0
  #define PTZ_VOLT_DETECT_MIN     9.0//30.0

  //工作电流阈值
  #define PTZ_CURRENT_DETECT      6.0//5.0
#endif



///需要判断能否执行的指令
typedef struct _PtzCmdType_
{//当参数为1时表示该指令能够执行，0表示不能够被执行
  char manual_control;//手动控制，包括上下左右等方向控制,和角度控制

  char manual_stop;//手动停止指令
  
  char preset_bit_set;//预置位设置
  char preset_bit_del;//预置位删除
  char preset_bit_call;//预置位调用
  
  char preset_bit_scan_start;//预置位扫描启动
  char preset_bit_scan_pause;//预置位扫描暂停
  char preset_bit_scan_recovery;//预置位扫描恢复
  char preset_bit_scan_close;//预置位扫描关闭
  
  char area_set;//区域数据设置
  char area_scan_start;//区域扫描启动
  char area_scan_pause;//区域扫描暂停
  char area_scan_recovery;//区域扫描恢复
  char area_scan_close;//区域扫描关闭
  
  char set_zero;//设置0位

}PtzCmdType;


//云台工作模式判断
typedef struct _PtzWorkMode_
{
  char mode;
  char data_a;
  char data_b;
}PtzWorkMode;




PtzWorkMode ptz_work_mode_judge();
PtzCmdType ptz_cmd_execute_judge();
void ptz_send_work_mode(char dev);
void init_status_monitor_module();
void ptz_send_fault_state(char dev, unsigned char FaultState);
#endif