#ifndef __PROTOCOL_H
#define __PROTOCOL_H

//设备主动发送的数据包
#define G_COMM_EVT_LOGIN   			0xA001
#define G_COMM_TRANSPARENT			0xA002

//上位机发起的数据包
#define M_COMM_TRANSPARENT    		0xB001
#define M_COMM_SET_GW_UPDATE		0xB002
#define M_COMM_SET_RESET			0xB003
#define M_COMM_GET_GW_RTC			0xB004
#define M_COMM_SET_GW_PARAFILE		0xB005
#define M_COMM_GET_GW_PARA			0xB006
#define M_COMM_GET_GW_RESET			0xB007
#define M_COMM_SET_TERM_PARA		0xB008
#define M_COMM_GET_TERM_PARA		0xB009
#define M_COMM_EXE_REMOTE_CMD		0xB00A
#define M_COMM_SET_SERVER_REDIRECT  0xB00B
#define M_COMM_SET_GATEWAY_WAN_CFG  0xB00C
#define M_COMM_SET_GATEWAY_LAN_CFG  0xB00D
#define M_COMM_GET_GATEWAY_CFG  	0xB00E
#define M_COMM_GATEWAY_STSTUS  		0xB00F
#define M_COMM_GET_NODES_CFG  		0xB010
#define M_COMM_SET_NODES_CFG  		0xB011
#define M_COMM_SET_GATEWAY_WAN_TEST 0xB012
#define M_COMM_GET_NODES_STATUS     0xB013
#define M_COMM_GET_LORA_STATUS      0xB014
#define M_COMM_RSP_HEART_BEAT       0xB015
#define M_COMM_GET_LORA_CFG         0xB016
#define M_COMM_SET_LORA_CFG         0xB017
#define M_COMM_SET_REGULAT      	0xB018
#define M_COMM_SET_UPGRADE_FIRMWARE_IPK         0xB019
#define M_COMM_SET_TERM_UPGRADE_JSON      	0xB01A
#define M_COMM_SET_NODES_TEMPLATE 0xB01B
#define M_COMM_SET_RS485_PORT_CFG         0xB01C
#define M_COMM_GET_GATEWAY_VER         0xB01D
#define M_COMM_RSP_LOGIN_JSON         0xB01E
#define M_COMM_SET_MAC_IP_BIND         0xB01F
#define M_COMM_GET_LAN_STATUS         0xB020
#define M_COMM_SET_RULES_ENGINS_CFG     0xB021
#define M_COMM_SET_RADIO_CFG         0xB022
#define M_COMM_SET_GW_VAP_CFG         0xB023
#define M_COMM_GET_WIRELESS_SCAN_RESULT     0xB024
#define M_COMM_SET_NODES_OBJECT_MODEL 	0xB025
#define M_COMM_SET_VPORT_CFG            0xB026
#define M_COMM_SET_LORAWAN_CFG         0xB027
#define M_COMM_GET_APPS_LIST         0xB028
#define M_COMM_SET_APPS_INSTALL         0xB029
#define M_COMM_SET_APPS_REMOVE         0xB02A

//应答
#define M_COMM_RSP_GENERAL			0xD001
#define M_COMM_RSP_TRANSPARENT   	0xD002
#define M_COMM_RSP_GETRTC			0xD003
#define G_COMM_RSP_SET_RESET   		0xD004
#define M_COMM_RSP_TIMESTAMP   		0xD005
#define G_COMM_RSP_SETGW_UPDATE   	0xD006
#define G_COMM_RSP_TERMUPDATE  		0xD007
#define G_COMM_RSP_SETGWPARAFILE	0xD008
#define G_COMM_RSP_GETGWPARA		0xD009
#define G_COMM_RSP_GWREST			0xD00A
#define G_COMM_RSP_SET_TERM_PARA	0xD00B
#define G_COMM_RSP_GET_TERM_PARA	0xD00C
#define M_COMM_RSP_SET_GW_RTC		0xD00D
#define G_COMM_RSP_REMOTE_CMD		0xD00E
#define G_COMM_RSP_GATEWAY_CFG		0xD00F
#define G_COMM_RSP_GATEWAY_STATUS	0xD010
#define G_COMM_EVT_NODES_CFG		0xD011
#define G_COMM_RSP_NODES_CFG		0xD012
#define G_COMM_CMD_RESULTG          0xD013
#define M_COMM_RSP_GATEWAY_WAN_TEST      0xD014
#define G_COMM_EVT_NODES_STATUS          0xD015
#define G_COMM_RSP_NODES_STATUS          0xD016
#define G_COMM_RSP_LORA_STATUS          0xD017
#define G_COMM_EVT_PERIOD_DATA		0xD018
#define G_COMM_EVT_GATEWAY_LORA_INFO	0xD019
#define G_COMM_EVT_GATEWAY_NET_INFO		0xD020
#define G_COMM_EVT_GATEWAY_CPU_MEM		0xD021
#define G_COMM_EVT_HEART_BEAT		0xD022
#define G_COMM_RSP_LORA_CFG         	0xD023
#define G_COMM_RSP_REGULAT		0xD024
#define G_COMM_SET_GW_STAS_INTV		0xD025
#define G_COMM_RSP_UPGRADE_FIRMWARE_IPK		0xD026
#define G_COMM_RSP_TERM_UPGRADE_JSON		0xD027
#define G_COMM_EVT_TERM_UPGRADE_STATUS		0xD028
#define G_COMM_RSP_EVENT_DATA		0xD029
#define G_COMM_RSP_SERVICE_DATA		0xD02A
#define G_COMM_RSP_GATEWAY_VER		0xD02B
#define G_COMM_LOGIN_JSON		0xD02C
#define G_COMM_RSP_LAN_STATUS         0xD02D
#define G_COMM_EVT_RADIO_STATUS		0xD02E
#define G_COMM_EVT_VAP_STATION		0xD02F
#define G_COMM_RSP_WIRELESS_SCAN_RESULT         0xD030
#define G_COMM_RSP_APPS_LIST         0xD031

//设备发起的数据数
#define G_COMM_TERM_LINK_STATE   	0xC001
#define G_COMM_SET_RESET   			0xC002
#define G_COMM_GET_TIMESTAMP   		0xC003


#define PROTOCOL_VER                1
#define PRODUCT_TYPE                0x11

#define L1_HEAD                     0x68
#define L1_TAIL                     0x97

typedef struct _l1_ctrl_header_t
{
	unsigned int dir:1;
	unsigned int ce_id:10;
	unsigned int cmd_id:5;
	unsigned int flag:4;
	unsigned int d_len:12;
}l1_ctrl_header_t;

typedef struct _l2_ctrl_header_t
{
	unsigned char  proto_ver;
	unsigned char  product_type;
	unsigned short host_cmd;
	unsigned short src_id;
	unsigned short dst_id;
}l2_ctrl_header_t;

#define MAX_PAYLOAD_LEN             (4089-sizeof(l2_ctrl_header_t))    //4081
#define MAX_L1_LEADING              5                                  //HEAD + CTRL_HEAD
#define MAX_L1_TAIL                 2                                  //CHECK + TAIL
#define MAX_L1_OVERHEAD             (MAX_L1_LEADING + MAX_L1_TAIL)
#define MAX_HOST_PACK_LEN           (4089+MAX_L1_OVERHEAD)             //4096


//下位机主动发送的数据包
#define HOST_COMM_NOTIFY_UPGRADE    0xF008
#define HOST_COMM_SEND_VIDEO_PACK   0xAD32
#define HOST_COMM_NOTIFY_BD_START   0xAD51
#define HOST_COMM_NOTIFY_BD_STOP    0xAD52
#define HOST_COMM_NOTIFY_KEY        0xAD53
#define HOST_COMM_NOTIFY_PERIOD_PIC 0xAD54
#define HOST_COMM_NOTIFY_EVENT_FILE 0xAD55

typedef enum _EVENT_SOURCE_E
{
	EVENT_SOURCE_NULL 	    = -1,		//未知或不关注时间源

	//向上位机提交时，需要明确为以下类型
	EVENT_SOURCE_HOST       = 0,        //上位机通知的事件
	EVENT_SOURCE_DEVICE		= 1,		//设备采集到的事件
}EVENT_SOURCE_E;


#pragma pack(1)

//通用消息结构
typedef struct _p_general_cmd_info_t
{
	unsigned short	  mi;		//流水号
	unsigned int   utc;		//主题长度
	int	  dataLen;	//数据长度
	void* data;		//数据
}p_general_cmd_info_t;

typedef struct _p_dsn_cmd_info_t
{
	unsigned short	  mi;		//流水号
	unsigned int   utc;		//主题长度
    char	  dSN[12];	//设备SN号
	int	  dataLen;	//数据长度
	unsigned char*   data;		//数据
}p_dsn_cmd_info_t;


typedef struct _p_clock_t
{
	unsigned char   second;
	unsigned char   min;
	unsigned char   hour;
	unsigned char   day;
	unsigned char   month;
	unsigned short  year;
}p_clock_t;

typedef struct _p_date_t
{
	unsigned char   day;
	unsigned char   month;
	unsigned short  year;
}p_date_t;

typedef struct _p_event_info_t
{
	p_clock_t start;                     //事件开始时间
	p_clock_t stop;                      //事件结束时间
	unsigned char  event_type;                      //事件类型，参考EVENT_TYPE_E
	unsigned char  event_source;                    //事件来源，参考EVENT_SOURCE_E
	unsigned char  res;
}p_event_info_t;

typedef struct _p_finfo_pic_t
{
	unsigned char  pic_type;                        //图片采集类型，参考PIC_TYPE_E
	unsigned char  cam;                             //摄像头通道，参考CAM_E
	unsigned char  pic_res;                         //图片像素，参考PIC_RESOLUTION_E
	unsigned char  pic_format;                      //图片格式，参考PIC_FORMAT_E
}p_finfo_pic_t;

typedef struct _p_finfo_video_t
{
	unsigned char  frame_rate;                      //视频帧率
	unsigned char  cam;                             //摄像头通道，参考CAM_E
	unsigned char  video_res;                       //视频像素，参考VIDEO_RESOLUTION_E
	unsigned char  video_format;                    //视频格式，参考VIDEO_FORMAT_E
}p_finfo_video_t;

typedef struct _p_finfo_youya_t
{
	unsigned char  sample_inteval;                  //采样间隔
	unsigned char  sample_size;                     //采样点字节数，#1油压2字节 + #2油压2字节，共4字节
	unsigned short sample_count;                    //采样点数
}p_finfo_youya_t;

typedef union _p_finfo_u
{
	p_finfo_pic_t pic;
	p_finfo_video_t video;
	p_finfo_youya_t youya;
}p_finfo_u;


typedef struct _p_file_info_t
{
	unsigned char	dfile_type; 						 //参考DFILE_TYPE_E
	p_clock_t file_create_time; 			 //文件创建时间
	p_finfo_u finfo;						 //文件信息
	unsigned short file_index; 						 //文件索引号
	int file_len;							 //文件总长度
	unsigned char  res[4];	
}p_file_info_t;

typedef struct _gap_data_t
{
	unsigned char  value;                           //16进制整数，单位：0.1mm
	unsigned char  offset;                          //16进制整数，单位：0.1mm	
	unsigned char  dir;                             //0：正常，1：偏左超限，2：偏右超限，0xFF：无效
	unsigned char  size;                            //0：正常，1：偏大超限，2：偏小超限，0xFF：无效
	unsigned char  res[4];
}gap_data_t;

//约定:
//1. 响应包命名在发送包命名后加_ret
//2. 如果只有发送包定义而没有响应包定义，则两者定义一样
//3. 如果只有响应包定义而没有发送包定义，则不关注发送包内容

/*********************************** 基本命令 ***********************************/

//心跳
typedef struct _p_heart_beat_t
{
	p_clock_t clock;
	unsigned char  res[4];
}p_heart_beat_t;

//ID
typedef struct _p_param_id_t
{
	unsigned short dev_id;
	unsigned char  res[4];
}p_param_id_t;

//升级文件信息
typedef struct _p_upgrade_file_t
{
	unsigned char  software_ver[4];               //服务端软件版本
	unsigned int file_size;                     //升级文件大小
	unsigned short pack_size;                     //协议分包大小
	unsigned int crc32;                         //文件CRC32校验码
	char  res[16];
}p_upgrade_file_t;

typedef struct _p_upgrade_file_ret_t
{
	unsigned char  software_ver[4];
	unsigned char  hardware_ver[4];
	unsigned short pack_size;	
	unsigned short res1;
	unsigned int res2;
	char  res3[16];
}p_upgrade_file_ret_t;

//升级文件包
typedef struct _p_upgrade_file_pack_t
{
	unsigned short pack_seq;
	unsigned short pack_cnt;
	unsigned short data_size;
	unsigned short n_data_size;
	unsigned short crc16;
}p_upgrade_file_pack_t;


//开始升级
typedef struct _p_upgrade_start_t
{
	unsigned short process;                         //升级后处理。0，自动重启。1，运行灯闪烁，10分钟后再自动重启。默认0.
	unsigned char  res[28];
}p_upgrade_start_t;


typedef struct _p_upgrade_start_ret_t
{
	unsigned char  success;                          //0：校验成功,开始升级；1：校验失败，需要重新发送文件；2：升级包不完整
	unsigned char  software_ver[4];                  //即将升级的软件版本
	unsigned short pack_cnt;                         //缺失包总数，最大为10。当Success为2时有效
	unsigned short pack_seq[10];
	char  res[4];
}p_upgrade_start_ret_t;

typedef struct _p_notify_upgrade_t
{
	unsigned short status;                           //0，升级成功。其它，升级失败。
	unsigned char  res[16];
}p_notify_upgrade_t;

//网络参数
typedef struct _p_param_net_t
{
	unsigned char  device_ip[4];
	unsigned char  gateway[4];
	unsigned char  mask[4];
	unsigned char  host_ip[4];
	unsigned short host_port;
	unsigned short device_port;
	unsigned char  protocol;                  //1-TCP，2-UDP，其他为保留
	unsigned char  heart_beat_type;           //1同步主从式，2同步从主式
	unsigned char  reconnect;                 //是否重连上位机。0，不重连；1，重连。读取命令时无意义，设置时有意义。
	unsigned char  res[15];
}p_param_net_t;

//读取日志
typedef struct _p_read_log_t
{
	unsigned short log_index;
}p_read_log_t;

typedef struct _p_read_log_ret_t
{
	unsigned short log_index;
	unsigned short log_count;
	unsigned short log_size;
}p_read_log_ret_t;

//重启设备
typedef struct _p_reboot_t
{
	char  res[8];
}p_reboot_t;

//恢复默认参数
typedef struct _p_default_t
{
	char  res[8];	
}p_default_t;


typedef struct _temp_humi_t
{
	unsigned char  temp_v;                    //16进制整数，单位：℃
	unsigned char  temp_s;                    //D0:0-整数，1-负数
	unsigned char  humi_v;	                   //16进制整数，单位：RH%
	unsigned char  res;
}temp_humi_t;


/*********************************** 缺口命令 ***********************************/

enum 
{
	PARAM_SET_OK          = 0,
	PARAM_SET_NO_CHANGE,
	PARAM_SET_ERR_CRC,
};

//参数设置返回
typedef struct _p_param_set_ret_t
{
	unsigned int status;                    //0：设置成功；1：参数无改变；2：CRC校验失败；其他：设置失败
	char  res[16];
}p_param_set_ret_t;

//参数获取命令包
typedef struct _p_param_get_t
{
	char  res[16];
}p_param_get_t;


typedef struct _p_param_system2_t
{
	unsigned char  time_thresh;               //如果上位机下发的CLOCK和设备本地的CLOCK相差超过阈值，则需要执行校时操作。
	                               //秒为单位。默认3秒

	unsigned char  comm_timeout;              //范围：0～200，单位：s，默认：60，0表示关闭通讯超时功能
	                               //设备如长时间未收到主机发送的任何命令包，则认为主机离线
	                               
	unsigned short pack_len;                  //传输分包最大长度，字节数；默认：4000（高速模块）
	unsigned char  max_pictures;              //默认32张
	unsigned char  max_file_storage;          //MB为单位，默认64MB

	unsigned char  period_pic_cnt;            //默认6张，每个摄像机3张
	unsigned char  period_pic_interval;       //各张图片之间的采集时间间隔。单位：100MS，默认值5。
	
	unsigned char  log_enable;                //默认开启
	unsigned short pic_commit_delay;          //采集图片提交延时。单位：秒，默认5。
                                   //周期或扳动图片采集完成后，等待一段时间后，如果没有扳动、过车开始信号的话，再提交数据
	unsigned char  res2[8];
	
	unsigned char  pic_resolution;            //图片像素，PIC_RESOLUTION_E
	unsigned char  pic_format;                //图片格式，PIC_FORMAT_E
	unsigned char  report_pic_resolution;     //设备主动抓拍图片像素，PIC_RESOLUTION_E
	
	unsigned char  rv_resolution;             //实时视频像素，VIDEO_RESOLUTION_E
	unsigned char  rv_frame_rate;             //实时视频帧率，范围：5～30，单位：f/s，默认：25
	unsigned char  rv_buffer_time;            //实时视频缓冲时间，范围：0～5，单位：s，默认：5
	unsigned char  rv_timeout;                //实时视频自动关闭等待时间，范围：0～5，单位：分钟，默认：1

	unsigned char  bd_resolution;             //扳动过程录像像素，VIDEO_RESOLUTION_E
	unsigned char  bd_frame_rate;             //扳动过程录像帧率，范围：5～30，单位：f/s，默认：25
	unsigned short bd_timeout;                //扳动过程超时时长范围：10～120，单位：s，默认：15
                                   //超时后，启动“扳动停止后延时采集”定时器。
	unsigned short bd_stop_delay;             //扳动停止后延时采集时间.
	                               //扳动结束后，录像继续录制，油压继续采集一段时间。
	                               //然后开始缺口图片采集。
                                   //单位：100MS，默认值50
                                   
	unsigned char  gc_resolution;             //过车过程录像像素，VIDEO_RESOLUTION_E
	unsigned char  gc_frame_rate;             //过车过程录像帧率，范围：5～30，单位：f/s，默认：25
	unsigned short gc_timeout;                //过车过程超时时长范围：30～120，单位：s，默认：60
                                   //超时后，启动“过车停止后延时采集”定时器。
    unsigned short gc_stop_delay;             //过车结束后，录像继续录制一段时间。然后开始缺口图片采集。
                                   //单位：100MS，默认值100								   
	
	unsigned char  cam_prio;                  //摄像机使用优先级，CAM_PRIO_E

	unsigned short pic_lumi_max;              //采集图像整体亮度过亮被认为是异常.默认150	                               
	unsigned short pic_lumi_min;              //采集图像整体亮度过暗被认为是异常.默认10								  

	unsigned char  res[36];
}p_param_system2_t;

//工作参数
typedef struct _p_param_system_t
{
	unsigned short crc16;
	unsigned char  status;                    //参数读取时有意义：取值0表示读取成功，返回参数有效；其他值表示读取失败。
	unsigned char  res;
	p_param_system2_t p;
}p_param_system_t;

//采集器通用内部参数
typedef struct _p_param_meter_common_t
{
	unsigned char  para1;                     //启动电流判断阀值，单位50mA，默认：10
	unsigned char  para2;
	unsigned char  para3;
	unsigned char  para4;
	unsigned char  para5;                     //扳动过程油压采集周期，单位1ms，默认：20
	unsigned char  para6;
	unsigned char  para7;
	unsigned char  para8;
	unsigned char  ipara1;
	unsigned char  ipara2;
	unsigned char  ipara3;
	unsigned char  ipara4;
	unsigned char  ppara1;
	unsigned char  ppara2;
	unsigned char  ppara3;
	unsigned char  ppara4;
	unsigned char  hpara1;                    //单位0.01V（油位传感器输出下限）默认194
	unsigned char  hpara2;                    //单位0.1V（油位传感器输出上限）默认45
	unsigned char  hpara3;                    //油位传感器电压转换系数，默认50
	unsigned char  hpara4;
	unsigned char  hpara5;                    //与上位机通讯时为保留字段0x0；与mcu通讯时表示油位基准位置
	unsigned char  res[16];
}p_param_meter_common_t;


//采集器内部参数
typedef struct _p_param_meter_t
{
	unsigned short crc16;
	unsigned char  status;
	unsigned char  res;
	p_param_meter_common_t param_meter_common;
}p_param_meter_t;

typedef struct _p_meter_install_t
{
	unsigned char  tparam1;                    //D0，油位是否安装。0，未安装；1，有安装。默认1
									//D1-D7，保留为0
	unsigned char  tparam2;                    //油压传感器安装
									//D0，油压1是否安装。0，未安装；1，有安装。默认1
									//D1，油压2是否安装。0，未安装；1，有安装。默认1
									//D2-D7，保留为0
	unsigned char	tparam3;                    //显示单元是否安装，0，未安装；1，有安装。默认1
	unsigned char  tparam4;                    //电流传感器安装
									//D0，电流1是否安装。0，未安装；1，有安装。默认1
									//D1，电流2是否安装。0，未安装；1，有安装。默认1
									//D2-D7，保留为0
	unsigned char	tparam5;	                //保留为0
}p_meter_install_t;

typedef struct _p_param_run2_t
{
	unsigned char  oil_level_base;             //油箱底部距传感器底部距离，单位1mm，默认：50
	unsigned char  cam_install;                //摄像机安装位置
									//D0，摄像机1是否安装。0，未安装；1，有安装。默认1
									//D1，摄像机2是否安装。0，未安装；1，有安装。默认1
									//D2-D7，保留为0	
	unsigned char  res;
	p_meter_install_t meter_install;//传感器安装    
	
	unsigned short period;                     //单位：分钟，默认：60
                                    //0：表示关闭周期采集	
	unsigned char  res2[16];	
}p_param_run2_t;

//运行参数
typedef struct _p_param_run_t
{
	unsigned short crc16;
	unsigned char  status;
	unsigned char  res;
	p_param_run2_t p;
}p_param_run_t;

//全部参数
typedef struct _p_param_all_t
{
	unsigned short crc16;
	unsigned char  status;
	unsigned char  res;
	p_param_system2_t sys;
	p_param_meter_common_t meter;
	p_param_run2_t run;
	unsigned char  res2[16];	
}p_param_all_t;

typedef struct _p_param_cam2_t
{
	unsigned char  cam;                  //CAM_E
	unsigned short enable_crop;          //是否开启截图。0：原始图像输出，1：截图输出。默认1。
	                          //如果设置了原始图像输出，则将忽略区域设置
	
	unsigned short crop_x;               //截图起点X坐标，左上顶点为原点
	unsigned short crop_y;               //截图起点Y坐标
	unsigned short crop_w;               //截图宽度
	unsigned short crop_h;               //截图高度
	
	unsigned char  rotate;               //0，不旋转；1，顺时针90度旋转；2，顺时针180度旋转；1，顺时针270度旋转。默认0，不旋转。
	
	unsigned char  enable_osd;           //0，不开启；1，开启。默认开启。
	unsigned char  osd_position;         //0-左上；1-右上；2-左下；3-右下。默认0。
	unsigned char  osd_char_width;       //像素为单位的字符宽度。暂不支持配置
	unsigned short osd_width;            //像素为单位的图像宽度。暂不支持配置
	unsigned short osd_height;           //像素为单位的图像高度。暂不支持配置
	unsigned char  language;             //0 – English；1 - Chinese。默认0。中文暂不支持。
	unsigned char  color;                //0-白色；1-黑色；2-自动与背景反色。默认1
	unsigned char  osd_ctrl;             //D1 - OSD是否包含时间。默认1，包含时间
                              //D0 - OSD是否包含text。默认1，包含text
                              //[D7 ~ D2]保留
	unsigned char  text_len;             //文本字符串长度，范围[0, 24]，’\0’不计算在长度内。默认0。
	char  text[24];             //不超过24个有效可打印ascii码字符串，不含’\0’
	unsigned char  res2[16];	
}p_param_cam2_t;

typedef struct _p_param_cam_t
{
	unsigned short crc16;
	unsigned char  status;
	unsigned char  res;
	p_param_cam2_t p;
}p_param_cam_t;

typedef struct _p_param_cam_get_t
{
	unsigned char  cam;								 //摄像机通道,CAM_E		
	unsigned char  res[15];                             //全为0x00
}p_param_cam_get_t;
	

//状态查询
typedef struct _p_query_status_t
{
	unsigned char  res[16];	
}p_query_status_t;

//状态查询返回
typedef struct _p_query_status_ret_t
{
	unsigned short crc16;
	unsigned short result;                              //0，查询结果有效；1，查询失败，结果无效
	p_clock_t clock;                         //设备的实时时钟
	unsigned char  res1;
	unsigned char  sys_err;                             //D0：配置文件是否异常。0，正常；1，异常
                                             //如果异常上位机需要重新配置设备参数
                                             //如果重新配置重启后还是异常，则需要维修。
                                             //D1：软件加载是否异常。0，正常；1，异常
                                             //D2：MCU工作是否异常。0，正常；1，异常
                                             //D3：主控是否发生异常重启。0，否；1，是
	unsigned char  cam1_status;                         //摄像机1的状态: 0，正常；
	                                         //1，摄像机无法检测到，或检测到摄像机硬件故障；2，摄像机图像采集帧率低;
	                                         //3，画面过亮，作为摄像机灯情况的间接判断
	                                         //4，画面过暗，作为摄像机灯情况的间接判断
	unsigned char  cam2_status;                         //摄像机2的状态，定义同上
	unsigned short sensor_status;                       //D0，油位传感器，0正常，1异常
                                             //D1，#1油压传感器，0正常，1异常
                                             //D2，#2油压传感器，0正常，1异常
                                             //D3，温湿度传感器，0正常，1异常
                                             //D4，#1道岔扳动传感器，0正常，1异常
                                             //D5，#2道岔扳动传感器，0正常，1异常
                                             //D6，显示模块，0正常，1异常
                                             //D7-D15，保留，为0
	unsigned short log_len;                             //新增运行日志长度
	unsigned char  res3[16];
}p_query_status_ret_t;

enum
{
	LIGHT_MODE_OFF  = 0,
	LIGHT_MODE_ON,
	LIGHT_MODE_TWINKLE,
};

typedef struct _p_light_ctrl_t
{
	unsigned char  mode;         //1，长亮；2，关灯；3，亮暗快速交替闪烁.LED_E
	unsigned char  res[16];      //全为0x00
}p_light_ctrl_t;

typedef struct _p_light_ctrl_ret_t
{
	unsigned char  res[16];      //全为0x00
}p_light_ctrl_ret_t;

//启动实时拍照
typedef struct _p_real_picture_t
{
	unsigned char  param_resolution:1;                  //是否采用本命令下发的图像像素
	unsigned char	param_pic_format:1;                  //是否采用本命令下发的图片格式
	
	unsigned char  pic_resolution;                      //PIC_RESOLUTION_E，
	                                         //param_resolution==1时有效
	unsigned char  pic_format;                          //VFILE_JPEG，VFILE_JPEG_HJ
	                                         //param_pic_format==1时有效
	
	unsigned char  cam;								 //摄像机通道,CAM_E		
	unsigned char  res[16];
}p_real_picture_t;

typedef struct _p_real_picture_ret_t
{
	p_clock_t file_clock;                    //设备记录的文件开始时间
	unsigned char  result;                              //RP_RET_E
	unsigned char  cam;								 //摄像机通道,CAM_E		
	unsigned char  res1;	
	unsigned short file_index;                          //拍照成功时有意义，用于后续的文件读取和删除等操作
	unsigned char  res2[16];	
}p_real_picture_ret_t;

typedef struct _p_real_picture2_ret_t
{
	unsigned char  result;                              //RP_RET_E
	p_file_info_t file_info;
	unsigned char  res2[16];	
}p_real_picture2_ret_t;

//获取图像文件列表
typedef struct _p_query_file_list_t
{
	unsigned char  query_type;                          //0，全部检索, 1，按事件类型, 2，按文件类型, 3，按图片采集类型，4，按文件索引号
                                             //参考QUERY_TYPE_E
	unsigned char  event_type;                          //参考EVENT_TYPE_E
	unsigned char  file_type;                           //参考DFILE_TYPE_E
	unsigned char  pic_type;                            //参考PIC_TYPE_E
	unsigned short file_index;
	unsigned char  res[16];
}p_query_file_list_t;

typedef struct _p_query_file_list_ret_t
{
	int file_count;                          //文件数量
	unsigned char  res[16];	
}p_query_file_list_ret_t;

typedef struct _p_query_file_list_item_t
{
	p_event_info_t event;
	p_file_info_t file_info;
}p_query_file_list_item_t;


//读取图像文件数据
typedef struct _p_read_file_data_t
{
	unsigned short file_index;                         //相关命令返回的文件索引号
	unsigned char  read_flag;                          //D0：是否读取整个文件，1-是，0-否；D1～D7：保留，全为0
	unsigned char  pack_count;                         //读取包数目，本值记为N，最大为10
	unsigned short pack_index[10];                     //包编号，总计10个读取包，占20个字节，前N个读取包有效
	unsigned char  res[16];
}p_read_file_data_t;

typedef struct _p_read_file_data_ret_t
{
	unsigned short file_index;                         //当前响应包对应的文件索引号
	char  file_status;                        //0：文件存在；-1：文件不存在；-2：同时读取的文件超过4个
	unsigned char  res;
	unsigned short pack_count;                         //包总数
	unsigned short pack_index;                         //包编号
	unsigned short pack_len;                           //本值记为L	
	unsigned char  res2[16];
}p_read_file_data_ret_t;

//删除图像文件
typedef struct _p_remove_file_t
{
	unsigned char  res[16];
	unsigned short remove_count;                       //本次删除的文件总数，记为N
	unsigned short remove_item[5];                     //需要删除的文件索引号列表，前N个有效，最多5个
}p_remove_file_t;

typedef struct _p_remove_file_ret_t
{
	unsigned char  res[16];
	unsigned short remove_count;                       //本次删除的文件总数，记为N
	unsigned short remove_item[5];                     //0：删除成功；1：文件未找到，2：文件访问中。前N个有效	
}p_remove_file_ret_t;

typedef struct _p_stop_read_file_t
{
	unsigned short file_index;                         //需要操作的文件索引号
	unsigned char  res[16];
}p_stop_read_file_t;

typedef struct _p_stop_read_file_ret_t
{
	unsigned short status;                             //操作状态 0，正常；大于0，异常
	unsigned char  res[16];
}p_stop_read_file_ret_t;

//启动实时视频
typedef struct _p_real_video_t
{
	unsigned char  param_resolution:1;                  //是否采用本命令下发的实时视频像素
	unsigned char  param_frame_rate:1;                  //是否采用本命令下发的视频帧率
	unsigned char	param_buffer_time:1;                 //是否采用本命令下发的视频缓冲时间
	unsigned char	param_cam_priority:1;                //是否采用本命令下发的摄像机使用优先级
	unsigned char	param_image_crop:1;                  //是否采用本命令下发的截图设置
	
	unsigned char  video_resolution;                    //VIDEO_RESOLUTION_E，
	                                         //param_resolution==1时有效
	unsigned char  video_frame_rate;                    //范围：5～30，单位：f/s
	                                         //param_frame_rate==1时有效
	unsigned char  video_buffer_time;                   //范围：0～20，单位：s
	                                         //param_buffer_time==1时有效
	unsigned char  cam_priority;                        //0,实时视频优先级高;1,实时视频优先级低
	                                         //param_cam_priority==1时有效
	                                         
	unsigned char  cam;								 //摄像机通道,CAM_E		
	
	unsigned short enable_crop;			             //是否开启截图。0：原始图像输出，1：截图输出。默认1。
							              	 //如果设置了原始图像输出，则将忽略区域设置
							              	 //param_image_crop==1时有效
	unsigned short crop_x;                              //截图起点X坐标，左上顶点为原点
	unsigned short crop_y;                              //截图起点Y坐标
	unsigned short crop_w;                              //截图宽度
	unsigned short crop_h;                              //截图高度
	                                         
	unsigned char  res[16];
}p_real_video_t;

typedef struct _p_real_video_ret_t
{
	unsigned char  param_resolution:1;                  
	unsigned char  param_frame_rate:1;                  
	unsigned char	param_buffer_time:1;                 
	unsigned char	param_cam_priority:1;                
	
	unsigned char  video_resolution;                    
	                                         
	unsigned char  video_frame_rate;                    
	                                         
	unsigned char  video_buffer_time;                   
	                                         
	unsigned char  cam_priority;                        
	                                         
	                                         
	unsigned char  cam;                                 
	unsigned short enable_crop;			             
							              	 
							              	 
	unsigned short crop_x;                              
	unsigned short crop_y;                              
	unsigned short crop_w;                              
	unsigned short crop_h;                              //以上字段同命令包

	unsigned char  result;                              //RV_RET_E
	unsigned char  res[16];	
}p_real_video_ret_t;

//发送实时视频
typedef struct _p_real_video_data_t
{
	unsigned char  res[5];
	unsigned char  frame_seq;
	unsigned char  pack_count;
	unsigned char  pack_seq;
	unsigned short pack_len;
}p_real_video_data_t;

typedef struct _p_real_video_data2_t
{
	p_clock_t clock;                         //帧数据时间戳
	unsigned char  cam;                                 //D1D0:表示摄像机通道号，0x1为通道1，0x2为通道2
                                             //D7-D2：保留为0.
	unsigned char  frame_seq;
	unsigned char  pack_count;
	unsigned char  pack_seq;
	unsigned short pack_len;
}p_real_video_data2_t;

//停止实时视频
typedef struct _p_real_video_stop_t
{
	unsigned char  cam;                                 //摄像机通道,CAM_E        
	unsigned char  res[16];
}p_real_video_stop_t;

typedef struct _p_real_video_stop_ret_t
{
	p_clock_t clock;                         //设备时钟
	unsigned char  cam;                                 //摄像机通道,CAM_E        
	unsigned char  result;                              //0：关闭成功； 1：关闭失败；255：其他原因
	unsigned char  res[16];	
}p_real_video_stop_ret_t;


//读取采集器当前值
typedef struct _p_get_signal_t
{
	unsigned char  res[16];
}p_get_signal_t;

typedef struct _p_get_signal_ret_t
{
	unsigned short crc16;
	p_clock_t clock;
	unsigned char  result;                              //0，正常，结果有效；
                                             //1，采集MCU工作异常，采集数据无效
                                             //2，若干采集通道工作异常，具体哪些通道正常，哪些异常，需要检查通道状态	
	unsigned short status;                              //D0，油位传感器，0正常，1异常
                                             //D1，#1油压传感器，0正常，1异常
                                             //D2，#2油压传感器，0正常，1异常
                                             //D3，温湿度传感器，0正常，1异常
                                             //D4，#1道岔扳动传感器，0正常，1异常
                                             //D5，#2道岔扳动传感器，0正常，1异常
                                             //D6，显示模块，0正常，1异常
                                             //D7-D15，保留，为0
	unsigned char  oil_level_change;                    //0-油位没有波动，1-油位波动
                                             //通道状态D0位正常时，本字段有效    
    unsigned char  event_info;                          //0-无动作，1-道岔扳动，2-过车          
    unsigned short oil_level;                           //油位高度（瞬时值）    单位：0.1mm  范围：0~180mm。
    unsigned short HPData1;                             //1#通道油压 单位：0.1Mpa  范围：0~20Mpa
    unsigned short HPData2;                             //2#通道油压 单位：0.1Mpa  范围：0~20Mpa
    temp_humi_t temp_humi;                   //当前的温湿度数据
    unsigned char  ADATA1;                              //电流通道1工作电流 单位：50ma
    unsigned char  ADATA2;                              //电流通道2工作电流 单位：50ma
	unsigned char  res[16];
}p_get_signal_ret_t;

//采集器通道校正
typedef struct _p_signal_adjust_t
{
	unsigned char  sensor_channel;                      //采集器模拟采样通道编号（有效范围0-4,0xFF表示所有通道）
                                             //0，油位通道；   1，1#油压通道；2，2#油压通道；
                                             //3，1#电流通道； 4，2#电流通道；
    unsigned char  voltage;                             //校正环境（校正命令发送时的电压等级）：1-0V, 2-0.5V, 3-2.5V, 4-4.5V, 5-5V
    unsigned char  res[16];
}p_signal_adjust_t;

typedef struct _p_signal_adjust_ret_t
{
    unsigned short oil_level;                           //校正环境下的油位通道AD原始数值
    unsigned short HPData1;                             //校正环境下的1#油压通道AD原始数值
    unsigned short HPData2;                             //校正环境下的2#油压通道AD原始数值
    unsigned short ADATA1;                              //校正环境下的1#电流通道AD原始数值
    unsigned short ADATA2;                              //校正环境下的2#电流通道AD原始数值
	unsigned char  res[2];

    unsigned short V_oil_level;                           //油位校正后的电压值
    unsigned short V_HPData1;                             //1#油压校正后的电压值
    unsigned short V_HPData2;                             //2#油压校正后的电压值
    unsigned short V_ADATA1;                              //1#电流校正后的电压值
    unsigned short V_ADATA2;                              //2#电流校正后的电压值
	unsigned char  res2[2];
	
	unsigned char  res3[16];	
}p_signal_adjust_ret_t;

//上报扳动开始
typedef struct _p_report_bd_start_t
{
	p_clock_t clock;               
	unsigned char  ampere_num;              //电流传感器通道号.取值为1或者2.表示采集到扳动信号的电流传感器通道号
	unsigned char  res;                     
	unsigned char  video_record;            //0：正在录像；1：启动录像失败。
	unsigned short	bd_start_current;		 //扳动启动电流
	unsigned char  res2[16];
}p_report_bd_start_t;

//上报扳动结束
typedef struct _p_report_bd_stop_t
{
	p_clock_t start_clock;               
	p_clock_t stop_clock;               
	unsigned char  ampere_num;              //电流传感器通道号.取值为1或者2.表示采集到扳动信号的电流传感器通道号
	unsigned char  res;                     
	unsigned short	bd_stop_current;		 //扳动结束电流，单位：mA
	unsigned short	bd_time;                 //扳动扳动时长，单位：ms
	unsigned char  bd_status;               //D0：0-正常，1-超时结束；D1～D7：保留，为0
	unsigned char  res2[16];	
}p_report_bd_stop_t;

//上报按钮事件
typedef struct _p_report_key_t
{
	p_clock_t clock;             //按键时间
	unsigned char  key_type;                //0-塞尺图采集，1-校准图采集，KEY_TYPE_E
	unsigned short file_index;              //对应的图片文件的索引号，用于后续的文件读取和删除等操作
	unsigned char  cam;					 //摄像机通道,CAM_E			
	unsigned char  res[16];	
}p_report_key_t;

typedef struct _p_report_period_pic_t
{
	unsigned short flag;                    //摄像机采集标志
                                 //D0，采集到通道1摄像机的图片; D1，采集到通道2摄像机的图片; D2-D15，保留为0	
	unsigned short file_index[2];           //通道1和通道2摄像机图片文件的索引号，用于后续的文件读取和删除等操作
	unsigned char  res[16];
}p_report_period_pic_t;

//通知扳动开始
typedef struct _p_notify_bd_start_t
{
	p_clock_t clock;
	unsigned char res;                      
	unsigned char cam_num;                  //取值为1或者2.开启录像时有效
	unsigned char video_record;             //录像: 0，不开启；1，开启
	unsigned char res2[16];
}p_notify_bd_start_t;

//通知扳动结束
typedef struct _p_notify_bd_stop_t
{
	p_clock_t start_clock;       //扳动开始时间
	p_clock_t stop_clock;        //扳动结束时间
	unsigned char res;
	unsigned char res2;
	unsigned char res3[16];
}p_notify_bd_stop_t;


//通知过车开始
typedef struct _p_notify_gc_start_t
{
	p_clock_t clock;
	unsigned char cam_num;                  //取值为1或者2.开启录像时有效
	unsigned char video_record;             //录像: 0，不开启；1，开启
	unsigned char res[16];	
}p_notify_gc_start_t;

//通知过车结束
typedef struct _p_notify_gc_stop_t
{
	p_clock_t start;             //开始时间
	p_clock_t stop;              //结束时间
	unsigned char res[16];	
}p_notify_gc_stop_t;

typedef struct _p_report_event_info_t
{
	p_event_info_t event;
	unsigned char  res[16];
	unsigned int file_cnt;
}p_report_event_info_t;

//回传缺口值
typedef struct _p_notify_gap_value_t
{
	gap_data_t gap;
	unsigned char  res[16];
}p_notify_gap_value_t;

typedef struct _p_notify_rec_cam_t
{
	unsigned char  cam_no;                 //摄像机通道号,取值为1或者2.
	unsigned char  res[16];
}p_notify_rec_cam_t;


/************************************* 虚拟转辙机动作消息 ******************************************/

typedef enum _TRIGGER_EVENT_E
{
	TRIGGER_EVENT_NULL  = 0,
	TRIGGER_EVENT_CAM,                    //摄像通道选择按钮
	TRIGGER_EVENT_PICTURE,                //抓拍
	TRIGGER_EVENT_SAICI,                  //栅尺图拍摄
	TRIGGER_EVENT_BD_START,               //扳动开始
	TRIGGER_EVENT_BD_STOP,	              //扳动停止
	TRIGGER_EVENT_STATUS_SYSTEM,
	TRIGGER_EVENT_STATUS_CAM1,
	TRIGGER_EVENT_STATUS_CAM2,
	TRIGGER_EVENT_STATUS_SENSOR,
}TRIGGER_EVENT_E;

typedef struct _bd_start_trigger_t
{
	unsigned char  sensor_channel;                   //电流传感器通道号
                                          //取值为1或者2.
                                          //表示采集到扳动信号的电流传感器通道号	
	unsigned char  res;
	unsigned short bd_start_current;                 //启动电流 单位：mA
	unsigned char  res2[4];	
}bd_start_trigger_t;

typedef struct _bd_stop_trigger_t
{
	unsigned char  sensor_channel;                   //电流传感器通道号
                                          //取值为1或者2.
                                          //表示采集到扳动信号的电流传感器通道号	
	unsigned char  res;
	unsigned short bd_stop_current;                  //结束电流 单位：mA
	unsigned short bd_time;                          //扳动时长 单位：ms
	unsigned char  status;                           //D0：0-正常，1-超时结束
                                          //D1～D7：保留，为0
	unsigned char  res2[3];
	
}bd_stop_trigger_t;

typedef struct _trigger_param_u
{
	bd_start_trigger_t bd_start;
	bd_stop_trigger_t  bd_stop;
	unsigned char status_data;
}trigger_param_u;

typedef struct _vm_trigger_t
{
	TRIGGER_EVENT_E event;               
	trigger_param_u param;
}vm_trigger_t;

#pragma pack() 

#endif /* __PROTOCOL_H */
