#ifndef __PTZ_PRESET_BIT_SCAN_H_
#define __PTZ_PRESET_BIT_SCAN_H_

typedef struct _PresetBit_//云台预置位
{
  float hori_angle;//水平角度
  float vert_angle;//垂直角度
  float hori_scan_speed;//水平转动速度
  float vert_scan_speed;//垂直转动速度
  
  float zoom_v;//镜头变倍电压
  float focus_v;//镜头聚焦电压
  
  unsigned short int  step_stop_time;//预置位扫描时每个位置的停止时间，单位是ms，并且必须大于电机默认的停止时间
  char  enable;//预置位是否有效，1预置位存在，0预置位不存在
  unsigned int crc;//效验码
}PresetBit;

//预置位扫描
typedef struct _PresetBitScan_
{
  unsigned int start_num;//起始预置位编号
  unsigned int end_num;  //结束预置位编号
  unsigned int actual_num;//当前实际的扫描编号
  float hori_speed;//水平转速
  float vert_speed;//垂直转速
  unsigned short int stop_time;
//  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;//上一次扫描状态
  
  char mode;//0循环预置位扫描，1单次预置位扫描
}PresetBitScan;

extern PresetBitScan g_preset_bit_scan;
/**************预置位参数回传**************/
//预置位水平角度
#define PRESET_BIT_HORI_ANGLE  0xA1
//预置位垂直角度
#define PRESET_BIT_VERT_ANGLE  0xA2
//预置位停止时间
#define PRESET_BIT_STOPTIME    0xA3
//预置位扫描速度
#define PRESET_BIT_SPEED       0xA4

///预置位有效
#define PRESET_BIT_ENABLE   1
///预置位无效
#define PRESET_BIT_DISABLE  0

///预置位总数
#define PRESET_BIT_AMOUNT  256


///预置位数据存入Flash的首地址
#define PRESET_BIT_FLASH_ADD           0X007F0000
//预置位备份数据存入Flash的首地址
#define PRESET_BIT_BACKUP_FLASH_ADD    0X00800000

///预置位数据存入Flash的首地址
#define PRESET_BIT_FIRST_FLASH_ADD   0X007F0000//存储首地址
//预置位数据存入Flash的尾地址
#define PRESET_BIT_TAIL_FLASH_ADD    0X0080FFFF//存储尾地址
//把存储区的最后的4K存储区作为数据中转缓存区
#define PRESET_BIT_CACHE_FLASH_ADD   (0X0080FFFF - 1024*4 + 1)//存储尾地址

//预置位数据写入FLASH的尝试次数
#define PRESET_BIT_SAVE_FLASH_NUM       3        
//预置位数据FLASH读入的尝试次数
#define PRESET_BIT_READ_FLASH_NUM       3   


//预置位扫描启动
#define PRESET_BIT_SCAN_START            1
//预置位扫描暂停
#define PRESET_BIT_SCAN_PAUSE_A          20
#define PRESET_BIT_SCAN_PAUSE_B          21

//预置位扫描恢复
#define PRESET_BIT_SCAN_RECOVERY         30

//预置位扫描关闭
#define PRESET_BIT_SCAN_CLOSE_A          40
#define PRESET_BIT_SCAN_CLOSE_B          0


//预置位回传
#define PRESET_BIT_RETURN_OFF       0//预置位回传关
#define PRESET_BIT_RETURN_ON        1//预置位回传开
//预置位扫描，预置位定位回传
#define PRESET_BIT_SCAN_END_RETURN_OFF        0//关闭预置位扫描结束回传
#define PRESET_BIT_SCAN_END_RETURN_ON         1//打开预置位扫描结束回传
#define PRESET_BIT_SCAN_LOCATION_RETURN_ON    2//打开预置位扫描到位回传
#define PRESET_BIT_SCAN_LOCATION_RETURN_OFF   3//关闭预置位扫描到位回传
#define PRESET_BIT_LOCATION_RETURN_ON         4//打开普通调用预置位到位回传
#define PRESET_BIT_LOCATION_RETURN_OFF        5//关闭普通调用预置位到位回传

#define PRESET_BIT_SCAN_END_RETURN_DATA       6//扫描结束数据回传
#define PRESET_BIT_SCAN_LOCATION_RETURN_DATA  7//预置位扫描到位回传
#define PRESET_BIT_LOCATION_RETURN_DATA       8//普通到达预置位回传



#define PRESET_BIT_LOCATION_UDP_CMD_ON           1//UDP收到调用预置位指令
#define PRESET_BIT_LOCATION_UART_422_CMD_ON      2//串口422收到调用预置位指令
#define PRESET_BIT_LOCATION_UART_485_CMD_ON      3//串口485收到调用预置位指令


unsigned int ptz_preset_bit_crc(PresetBit bit);
char ptz_preset_bit_save(PresetBit bit, unsigned int num);
PresetBit ptz_preset_bit_read(unsigned int num);
void ptz_preset_bit_all_erase();
void init_preset_bit_scan_module(void);
void ptz_preset_bit_location_return_return();
void ptz_preset_bit_scan_location_return_return();
void ptz_preset_bit_scan_end_return_return();
void ptz_preset_bit_location_return_save( unsigned int num, char dev);

void presetbit_data_return(char dev, unsigned char ScanNum);


#endif

