#ifndef _agent_hyt_H_
#define _agent_hyt_H_





#include "comm_types.h"
#include "sock_utils.h"

#ifdef __cplusplus

extern "C" {
#endif
#pragma pack(push,1)
  
#define PTZ_CONNECT_STATE_DEAD     0
#define PTZ_CONNECT_STATE_FAILED   1
#define PTZ_CONNECT_STATE_SUCCESS  2
    
#define CLIENT_NUM                 3


  
typedef struct _CMD_MAP_INFO_{
  u_int8_t chl_swich;//通道选择
  u_int8_t init;//
  u_int8_t angle_status;//角度回复发送状态选择位0不发送，1发送数据
  u_int8_t speed_status;//速度回复发送状态选择位0不发送，1发送数据
  u_int8_t temp_status;//温度
  u_int8_t voltage_status;//电压
  u_int16_t angle_time;//角度回复时间
  u_int16_t speed_time;//速度回复时间
  u_int16_t temp_time;//温度回复时间
  u_int16_t voltage_time;//电压
  u_int16_t time;//自动回复间隔时间
  struct sockaddr_in client_add; //客户端地址
  
}CMD_MAP_INFO;

extern CMD_MAP_INFO  client_map_info[CLIENT_NUM];
//七字节指令
typedef struct _PTZ_DATA_PACK_{
	u_int8_t head;
	u_int8_t addr;
	u_int8_t command[2];
	u_int8_t data[2];
	u_int8_t checksum;
}PTZ_DATA_PACK;



//变长指令
typedef struct _PTZ_DATA_PACK_A_{
	unsigned char head;//头，默认0XFF
	unsigned char addr;//云台地址
	unsigned char cmd_type;//指令类型，即指控制哪一方面的指令
	unsigned char cmd_func;//指令功能，即指这条指令具体是干什么的
        unsigned short int cmd_len;//协议数据长度
        unsigned int head_crc;//包头校验,包头数据char相加
        
        unsigned char cmd_data[1];//协议传输的具体数据的第一个字节
}PTZ_DATA_PACK_A;


/***************************** 定长协议 HYT_PACK ******************************/  
//======标准Pelco-D协议，command[0] == 0  command[1] == 指令功能
#define HYT_PACK_CMD_1_FUNC_KEEP_UP                       0x08  //向上
#define HYT_PACK_CMD_1_FUNC_KEEP_DUWN                     0x10  //向下
#define HYT_PACK_CMD_1_FUNC_KEEP_LEFT                     0x04  //向左
#define HYT_PACK_CMD_1_FUNC_KEEP_RIGHT                    0x02  //向右
#define HYT_PACK_CMD_1_FUNC_KEEP_LEFT_UP                  0x0c  //左上
#define HYT_PACK_CMD_1_FUNC_KEEP_RIGHT_UP                 0x0a  //右上
#define HYT_PACK_CMD_1_FUNC_KEEP_LEFT_DUWN                0x14  //左下
#define HYT_PACK_CMD_1_FUNC_KEEP_RIGHT_DUWN               0x12  //右下
#define HYT_PACK_CMD_1_FUNC_LOCATE_HORI_ANGLE             0x4b  //水平角度定位
#define HYT_PACK_CMD_1_FUNC_LOCATE_VERT_ANGLE             0x4d  //垂直角度定位
#define HYT_PACK_CMD_1_FUNC_INQUIRE_HORI_ANGLE            0x51  //查询水平角度 
#define HYT_PACK_CMD_1_FUNC_INQUIRE_VERT_ANGLE            0x53  //查询垂直角度
#define HYT_PACK_CMD_1_FUNC_RETURN_HORI_ANGLE             0x59  //回传水平角度  （云台->上位机)
#define HYT_PACK_CMD_1_FUNC_RETURN_VERT_ANGLE             0x5b  //回传垂直角度   (云台->上位机)
#define HYT_PACK_CMD_1_FUNC_SET_PRESET_BIT_V              0x03  //视频设置预置位(当前角度)
#define HYT_PACK_CMD_1_FUNC_SELECT_PRESET_BIT             0x07  //调用预置位
#define HYT_PACK_CMD_1_FUNC_DELETE_PRESET_BIT             0x05  //删除预置位
#define HYT_PACK_CMD_1_FUNC_CONTROL_TOP_POWER_ON          0x09  //控制云台顶端电源开
#define HYT_PACK_CMD_1_FUNC_CONTROL_TOP_POWER_OFF         0x0b  //控制云台顶部电源关
#define HYT_PACK_CMD_1_FUNC_FLASH_ERASE                   0x88  //片外flash擦除
#define HYT_PACK_CMD_1_HORI_ANGLE_ERROR_SWITCH            0x89  //水平角度误差消除开关


//======根据标准协议自定义的7字节协议
//======command[0] == 指令类型或功能 command[1] == 指令功能
/**************************云台水平角度方向定位控制***************************/ 
#define HYT_PACK_CMD_0_FUNC_LOCATE_HORI_ANGLE_SPEED       0x4b  //指定速度水平角度定位
#define HYT_PACK_CMD_0_FUNC_LOCATE_VERT_ANGLE_SPEED       0x4d  //指定速度垂直角度定位
#define HYT_PACK_CMD_0_FUNC_CONTROL_HORI_ANGLE            0xbd  //水平角度控制
#define HYT_PACK_CMD_0_FUNC_ANGLE_LOCATION_RETURN_SWITCH  0xc5  //角度定位回传开关



//设置预置位扫描参数
#define HYT_PACK_CMD_0_FUNC_SET_PRESET_BIT_HORI_A         0xe4  //通过角度设置水平预置位
#define HYT_PACK_CMD_0_FUNC_SET_PRESET_BIT_VERT_A         0xe5  //通过角度设置垂直预置位
#define HYT_PACK_CMD_0_FUNC_SET_PRESET_BIT_STOP_TIME      0xf1  //设置预置位停止时间
#define HYT_PACK_CMD_0_FUNC_SET_PRESET_BIT_SPEED          0xf2  //设置预置位扫描速度
//设置预置位扫描模式  
#define HYT_PACK_CMD_0_TYPE_SET_PRESET_BIT_MODEL          0xf0  //设置预置位扫描模式
//预置位扫描回传  
#define HYT_PACK_CMD_0_TYPE_RETURN_PRESET_BIT_SWITCH      0x9f  //预置位回传开关

#define HYT_PACK_CMD_0_TYPE_INQUIRE_PRESET_SCAN_DATA      0xea  //预置位参数查询
  
/*********************************云台区域扫描控制*****************************/ 
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_START_BORDER_V  0xe6  //通过视频设置扫描水平起始边界 （即以当前位置） 
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_END_BOTDER_V    0xe7  //通过视频设置扫描水平结束边界
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_VERT_START_BORDER_V  0xe8  //通过视频设置扫描垂直起始边界
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_VERT_END_BORDER_V    0xe9  //通过视频设置扫描垂直结束边界 
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_VERT_STOP_TIME  0xf6  //设置区域扫描水平垂直停止时间
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_START_BORDER_A  0xf7  //通过角度设置区域扫描水平起始边界  
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_END_BOTDER_A    0xf8  //通过角度设置区域扫描水平结束边界
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_VERT_START_BORDER_A  0xf9  //通过角度设置区域扫描垂直起始边界
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_VERT_END_BORDER_A    0xfa  //通过角度设置区域扫描垂直结束边界
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_GAP_ANGLE       0xfb  //通过发送角度设置水平扫描间隔角度
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_VERT_GAP_ANGLE       0xfc  //通过发送角度设置垂直扫描间隔角度
#define HYT_PACK_CMD_0_FUNC_SET_SCAN_HORI_VERT_SPEED      0xfd  //设置区域扫描水平垂直扫描速度

#define HYT_PACK_CMD_0_FUNC_SAVE_AREA_SCAN_DATA           0xf3  //保存区域扫描参数
#define HYT_PACK_CMD_0_TYPE_SET_SCAN_STATE                0xf4  //区域扫描状态，使能或不使能某个扫描区域

#define HYT_PACK_CMD_0_TYPE_SET_AREA_SCAN_FUNC            0xf5  //设置区域扫描扫描模式

#define HYT_PACK_CMD_0_TYPE_AREA_SCAN_RETURN_SWITCH       0xc4  //设置区域扫描回传开关

#define HYT_PACK_CMD_0_TYPE_INQUIRE_AREA_SCAN_DATA        0xca  //查询区域扫描参数
  
/***********************云台状态参数查询及实时回传开关 ************************/  
#define HYT_PACK_CMD_0_TYPE_INQUIRE_CURRENT               0xc8  //电流查询与回复
#define HYT_PACK_CMD_0_TYPE_INQUIRE_VOLTAGE               0xcd  //电压查询与回复  
#define HYT_PACK_CMD_0_FUNC_INQUIRE_TEMP                  0xd6  //温度查询与回复  
#define HYT_PACK_CMD_0_TYPE_INQUIRE_SPEED                 0xd0  //速度查询与回复  

#define HYT_PACK_CMD_0_TYPE_INQUIRE_WORK_MODEL            0xe0  //查询工作模式

#define HYT_PACK_CMD_0_TYPE_INQUIRE_WORK_STATE            0xdd  //查询工作状态

#define HYT_PACK_CMD_0_FUNC_INQUIRE_ANGLE_STATE           0x9d  //查询角度状态

#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_SPEED_SWITCH      0xdc  //转速自动回传开关
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_ANGLE_SWITCH      0xe1  //云台角度自动回传开关
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_VERF_SWITCH       0xbf  //云台电机驱动芯片模拟电压输入等级回传
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_CURRENT_SWITCH    0xc1  //云台工作电流实时回传开关
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_VOLTAGE_SWITCH    0xcc  //云台工作电压实时回传开关
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_TEMP_SWITCH       0xd4  //云台工作温度实时回传开关
#define HYT_PACK_CMD_0_FUNC_AUTO_RETURN_CPU_SWITCH        0xb0  //云台CPU占有率实时回传开关
 
/****************************设置&查询云台基准0位 *****************************/  
#define HYT_PACK_CMD_0_TYPE_SET_ZERO_POSITION             0xe3  //零位设置
#define HYT_PACK_CMD_0_TYPE_INQUIRE_ZERO_POSITION         0x3e  //查询基准零位

/********************************云台重启&自检指令*****************************/  
#define HYT_PACK_CMD_0_FUNC_REBOOT                        0xde  //云台重启
#define HYT_PACK_CMD_0_FUNC_COMPLETE_CHECK_AGAIN          0xce  //清除数据重新进行全范围自检
#define HYT_PACK_CMD_0_FUNC_SIMPLY_CHECK_AGAIN            0xbb  //清除数据重新进行简易自检

/********************************  指令回复开关  *****************************/  
#define HYT_PACK_CMD_0_TYPE_SET_CMD_REPLY_SWITCH          0xdf  //开启或关闭指令回复开关

/**********************************加热电阻开关*******************************/  

#define HYT_PACK_CMD_0_TYPE_HEAT_RESISTANCE_SWITCH        0xcf  //加热电阻开关

/********************************指令保存预处理功能*****************************/  

#define HYT_PACK_CMD_0_FUNC_CMD_SAVE_BEFORE               0xba  //指令保存预处理功能

/********************************电磁继电器开关*****************************/  

#define HYT_PACK_CMD_0_TYPE_MOTOR_RELAY_SWITCH            0xc0  //电磁继电器开关  



//角度回复选择
#define PTZ_HORI                0
#define PTZ_VERT                1

#define CMD_ALLOW 1//命令允许
#define CMD_NOT_ALLOW 0//命令不允许
///回复开关
#define CMD_REPLY      1        //回复打开
#define CMD_NO_REPLY   0        //回复关闭
///指令回复
#define CMD_RIGHT 0
#define CMD_WRONG 1 
#define CMD_FAIL  2
//云台回复通道选择
#define PTZ_UART_422  1
#define PTZ_UART_485  2
#define PTZ_UDP       3
#define PTZ_UART_0    4

/**云台定位回传**/
#define LOCATION_RETURN_OFF  0//关闭
#define LOCATION_RETURN_ON   1//打开

#define LOCATION_UDP_CMD_ON           1//收到角度控制指令
#define LOCATION_UART_422_CMD_ON      2//收到角度控制指令
#define LOCATION_UART_485_CMD_ON      3//收到角度控制指令
#define LOCATION_CMD_OFF     0//没有收到角度控制指令

#define LOCATION_HORI        2//水平角度控制到位回复
#define LOCATION_VERT        3//垂直角度控制到位回复

#define PACK_A_HEAD         0XFF
#define PACK_A_TAIL         0X16
//指令类型//指令功能
/**/
#define EDIT_CFG_FILE       0X01 //修改配置文件类型
#define EDIT_IP             0X01//设置IP功能
#define EDIT_MAC            0X02//设置MAC功能
#define EDIT_NETMASK        0X03//设置NETMASK功能
#define EDIT_GATEWAY        0X04//设置GATEWAY功能
#define EDIT_TERM_IP        0X05
#define EDIT_WEB_IP         0X06
#define EDIT_A9_IP          0X07
#define EDIT_HARDWAREVER    0X08
#define EDIT_CMD_ID         0X09
#define EDIT_COMPONENT_ID   0X0A

/**/
#define UPLOAD_CFG_DATA          0X02//云台上传配置文件信息
#define UPLOAD_CFG_DATA_REQUEST  0X01//上传配置文件请求
#define UPLOAD_CFG_DATA_REQUEST_BROADCAST  0X02//广播上传配置文件请求
#define UPLOAD_CFG_DATA_RIGHT    0XEE//上传配置文件且配置文件正确
#define UPLOAD_CFG_DATA_WRONG    0XFF//配置文件错误，无法上传

/**/
#define UPLOAD_VERSION           0X03//上传云台程序版本号
#define UPLOAD_VERSION_REQUEST   0X01//上传版本号请求
#define UPLOAD_VERSION_RIGHT     0XEE//上传版本号且版本号存在

/**/
#define CMDA_REPLY          0XFF//指令回复类型 TYPE
#define CMDA_WRONG          0XFF//指令错误回复功能 FUNC
#define CMDA_RIGHT          0XEE//指令正确且执行成功回复功能 
#define CMDA_FAIL           0XFE//指令正确但执行失败回复功能 

extern int ptz_communicaton;
extern char tiedian_id[3];
#define PTZ_UART_FREE_STATE  0//串口处于空闲状态
#define PTZ_UART_RECV_STATE  1//串口处于数据接收状态
#define PTZ_UART_HAND_STATE  2//串口处于数据处理状态

#define POWER_ON                1  //电源打开
#define POWER_OFF               0  //电源关闭

#define PTZ_UART_RECV_OVERTIME 20 //串口接收超时时间（单位：ms)

void ptz_reply(char dev, unsigned char type);

void task_uart_data_process_init();

void send_udp_data_aim(u_int8_t *buff,u_int16_t buff_size, struct sockaddr* source, socklen_t sourcelen);
void ptz_send_data(char dev,unsigned char *buff, unsigned short int buff_size);
void init_agent_hyt_module();

u_int8_t MotorCalPelcoDSUM(u_int8_t *data,u_int16_t datalen);  
//云台不定长数据指令回复
char ptz_data_pack_a_reply(char dev, unsigned char reply);
void send_udp_data(u_int8_t *buff,u_int16_t buff_size);
void ptz_data_pack_a_process(char dev, PTZ_DATA_PACK_A *pack);
void ptz_data_pack_process(char dev, PTZ_DATA_PACK *pack);
#pragma pack(pop)

#ifdef __cplusplus
}
#endif 











void init_agent_module(void);












#endif

