#ifndef __PTZ_AREA_SCAN_H_
#define __PTZ_AREA_SCAN_H_

/*区域扫描区域参数回传*/
#define SCAN_HA 0X0B//水平边界A
#define SCAN_HB 0X0C//水平边界B
#define SCAN_VA 0X0D//垂直边界A
#define SCAN_VB 0X0E//垂直边界B
#define SCAN_INT_H 0X0F//水平间隔角度
#define SCAN_INT_V 0X10//垂直间隔角度
#define SCAN_SPEED 0X11//扫描转速
#define SCAN_STOP_TIME 0X12//每个位置停止时间
#define SCAN_WAY 0X13//扫描方式
#define SCAN_ENABLE 0X14//扫描使能
/*预置位扫描预置位参数回传*/
#define PP_HANGLE 0X15 //预置位水平角度
#define PP_VANGLE 0X16 //预置位垂直角度
#define PP_STOP_TIME 0X17 //预置位停止时间
#define PP_SPEED 0X18 //预置位扫描速度

typedef struct _PtzArea_//云台区域扫描参数
{
  float hori_start_angle;//水平起始边界
  char  hsa;//水平边界A是否被设置，1设置。0未被设置
 
  float hori_end_angle;//水平结束边界
  char  hea;//水平边界B是否被设置，1设置。0未被设置
 
  float vert_start_angle;//垂直起始边界
  char  vsa;//垂直边界A是否被设置，1设置。0未被设置
  
  float vert_end_angle;//垂直结束边界
  char  vea;//垂直边界B是否被设置，1设置。0未被设置
  
  float hori_step_angle;//水平间隔角度
  char  h_step;//水平间隔角度是否被设置，1设置。0未被设置
  
  float vert_step_angle;//垂直间隔角度
  char  v_step;//垂直间隔角度是否被设置，1设置。0未被设置
  
  float hori_scan_speed;//水平转动速度
  float vert_scan_speed;//垂直转动速度
  unsigned short int step_stop_time;//单步转动每个位置的停止时间，单位是ms，并且必须大于电机默认的停止时间
  char  scan_mode;//0默认连续扫描，1连续扫描，2单步扫描
  char  enable;//区域扫描是否有效，1有效，0无效
  
  unsigned int crc;//效验码
}PtzArea;

typedef struct _AreaScan_
{
  unsigned char sin_mul_mode;//0默认单区域扫描，1单区域扫描 ，2多区域扫描
  unsigned char start_num;//起始区域编号
  unsigned char end_num;  //结束区域编号
  short int actual_num;//当前实际的扫描区域编号
  char  scan_mode;//0默认连续扫描，1连续扫描，2单步扫描
  short int  order;//扫描顺序
  float hori_speed;//水平转速
  float vert_speed;//垂直转速
//  char hori_arrive_flag;//区域是否到达的标记，1正在转向指定预置位，0到达预置位
//  char vert_arrive_flag;//区域是否到达的标记，1正在转向指定预置位，0到达预置位
  unsigned char state;    //扫描状态，即扫描进行程度
  unsigned char state_a;  //扫描状态，即扫描进行程度
  unsigned char save_state;//保存的状态
  unsigned char last_state;//上一次扫描状态
  unsigned char allow_scan_area_num;//在指定的区域编号范围，允许扫描的区域数量
  
  float hori_target_angle;//水平目标角度
  float vert_target_angle;//垂直目标角度
  float hori_step_angle;//水平单步角度
  float vert_step_angle;//垂直单步角度
  float hori_start_angle;//水平起始边界
  float hori_end_angle;//水平结束边界
  float vert_start_angle;//垂直起始边界
  float vert_end_angle;//垂直结束边界
  
  unsigned int hori_step_num_a;//水平总步数(整数步数)
  float hori_step_num_b;//水平总步数(小数步数)
  unsigned int hori_step_count;//水平步数计数
  
  unsigned int vert_step_num_a;//水平总步数(整数步数)
  float vert_step_num_b;//水平总步数(小数步数)
  unsigned int vert_step_count;//垂直步数计数
  
  char start_flag;//判断是不是第一次启动，0第一次启动，1不是第一次启动
  unsigned short int step_stop_time;//单步停止时间
  unsigned short int step_stop_time_count;//单步停止时间计时
  
  short int hori_scan_dir;//水平扫描当前方向，1由水平起始边界扫描到水平结束边界
                     //-1由水平结束边界扫描到水平起始边界
  short int vert_scan_dir;//垂直扫描当前方向，1由垂直起始边界扫描到垂直结束边界
                     //-1由垂直结束边界扫描到垂直起始边界
  
  //360度全景连续扫描
  float hori_start_angle_360;//360度全景连续扫描每一层的水平起始角度
  float hori_end_angle_360;//判断每一层扫描完的最远结束角度
  float hori_near_angle_360;//最近角度距离
  float hori_far_angle_360;//最远角度距离
  char hori_scan_dir_360;//360度扫描时水平轴转动方向
  
  //扫描暂停数据保存
  unsigned char pause_state;
  float pause_hori_angle;
  float pause_vert_angle;
  char pause_hori_arrive_flag;
  char pause_vert_arrive_flag;
  char pause_hori_start_stop;
  char pause_vert_start_stop;
  char pause_hori_direction;
  char pause_vert_direction;
}AreaScan;

//PtzAreaScan

///区域总数
#define AREA_AMOUNT               15//15 

///区域有效
#define AREA_ENABLE   1
///区域无效
#define AREA_DISABLE  0

#define AREA_FLASH_ADD            0X00830000//区域扫描数据存入Flash的首地址
#define AREA_BACKUP_FLASH_ADD     0X00840000//区域扫描备份数据存入Flash的首地址

#define AREA_SAVE_FLASH_NUM       3     //区域扫描数据写入FLASH的尝试次数 
#define AREA_READ_FLASH_NUM       3     //区域扫描数据FLASH读入的尝试次数

#define AREA_MUL_SCAN           2     //多区域扫描
#define AREA_SIN_SCAN           1     //单区域扫描

#define AREA_SCAN_MODE_STEP     2     //单步扫描模式
#define AREA_SCAN_MODE_CONT     1     //连续扫描模式

#define AREA_SCAN_END_ANGLE_INC_360 20.0   //360度连续扫描判断一层扫描是否结束的最远角度相对于起始角度的增量


//区域扫描启动
#define AREA_SCAN_START            1

//单步扫描
#define AREA_SCAN_STEP             20

//连续扫描
#define AREA_SCAN_CONT             40
#define AREA_SCAN_CONT_360         65//360度全范围连续扫描

//区域扫描暂停
#define AREA_SCAN_PAUSE_A          80
#define AREA_SCAN_PAUSE_B          81

//区域扫描恢复
#define AREA_SCAN_RECOVERY         120

//区域扫描关闭
#define AREA_SCAN_CLOSE_A          250
#define AREA_SCAN_CLOSE_B          0


/**区域扫描结束回传\单步扫描到位回传**/

#define AREA_SCAN_RETURN_OFF           0//关闭
#define AREA_SCAN_RETURN_ON            1//打开
//扫描结束回传
#define AREA_SCAN_END_RETURN_OFF              0//扫描结束关闭
#define AREA_SCAN_END_RETURN_ON               1//扫描结束打开
#define AREA_SCAN_END_RETURN_DATA             2//扫描结束数据回传
//区域扫描到位回传
#define AREA_STEP_SCAN_LOCATION_RETURN_ON     3//单步扫描到位回传打开
#define AREA_STEP_SCAN_LOCATION_RETURN_OFF    4//单步扫描到位回传关闭
#define AREA_STEP_SCAN_LOCATION_RETURN_HORI   5//单步扫描水平到位回传设定水平角度（回传理想设定角度，不是实际角度）
#define AREA_STEP_SCAN_LOCATION_RETURN_VERT   6//单步扫描垂直到位回传设定垂直角度（回传理想设定角度，不是实际角度）

extern PtzArea g_area[AREA_AMOUNT];
extern AreaScan g_area_scan;


void ptz_send_area_data(char dev, unsigned short int ScanNum);
unsigned int  ptz_area_crc(PtzArea bit);
char ptz_area_save();
char ptz_area_read();
char ptz_area_auto_enable(PtzArea area);
void ptz_area_scan_end_return_return();
void ptz_area_scan_end_return_save(char dev);
void ptz_area_step_scan_location_return_return(char angle_choice);
void ptz_area_step_scan_location_return_save(char dev);

void init_area_scan_module();
#endif