// 协议栈模型
// 秒寻科技
// zt 2024-08-31

package psmodel

/*********************************************************
网管数据来源
**********************************************************/
const (
	PS_SOURCE_CENTER = 0x00 // 监控中心
	PS_SOURCE_GUI    = 0x01 // 本地网管
	PS_SOURCE_ALARM  = 0x02 // 告警模块
)

/*********************************************************
定义AP层协议
**********************************************************/
//定义AP层协议头
const (
	PS_FRAME_MIN_LEN          = 17   //AP层最小帧长，协议框架17字节
	PS_FRAME_MCPA_PAYLOAD_LEN = 260  //MCPA，数据载荷256字节
	PS_FRAME_MCPB_PAYLOAD_LEN = 264  //MCPB，数据载荷256字节
	PS_FRAME_MAX_LEN          = 562  // AP层最大帧长
	PS_MCP_A_DATA_LEN         = 64   //MCP-A监控对象数据单元最大长度
	PS_MCP_B_DATA_LEN         = 256  //MCP-B监控对象数据单元最大长度，帧号4个字节，数据256字节
	PS_AP_END_FLAG            = 0x7E //开始标志符，小端模式
)

//AP头，4字节
type AP_HEAD_T struct {
	StartFlag uint8 `json:"start_flag"`
}

/*********************************************************
定义VP层协议
**********************************************************/
//VP头，11个字节
type VP_HEAD_T struct {
	ProjectID int   `json:"project_id"` //项目编号，省市各1个字节，项目编号2个字节，以16进制大写字母表示
	PacketNo  uint8 `json:"packet_no"`  //通信包号，由发送端产生，接收端原值返回
	DeviceID  int   `json:"device_id"`  // 设备编号
	VpFlag    uint8 `json:"vp_flag"`    // vp层交互标志
	McpType   uint8 `json:"mcp_type"`   // 监控应用层协议标识
}

//VP层交互标志
const (
	VP_RESP = 0x01
	VP_CMMD = 0x80
)

/*********************************************************
定义MCP层协议
**********************************************************/
//MCP头，2个字节
type MCP_HEAD_T struct {
	Comd uint8 // 命令单元
	Resp uint8 // 应答单元
}

//定义MCP 协议类型
const (
	MCP_A = 0x01
	MCP_B = 0x02
)

//定义MCP-A命令单元
const (
	MCP_A_REPORT    = 0x01 // 告警上报
	MCP_A_QUERY     = 0x02 // 查询命令
	MCP_A_CONFIGURE = 0x03 // 设置命令
)

//定义MCP-B命令单元
const (
	MCP_B_CONTROL       = 0x80 // 升级控制命令
	MCP_B_FILE_TRANSFER = 0x81 // 文件传输命令
)

//定义MCP应答单元
const (
	MCP_RESP_SUCC = 0x01 // 表示命令执行成功
	MCP_RESP_ERR  = 0x02 // 监控对象命令错误
	MCP_CMD       = 0xFF // 表示该消息为命令
)

//MCP-A监控对象结构
type LTV_T struct {
	Len     uint16                   `json:"len"`      //监控对象长度
	Tag     uint16                   `json:"tag"`      //监控对象标号
	AbyData [PS_MCP_A_DATA_LEN]uint8 `json:"aby_data"` //监控数据
}

//MCP-B监控对象结构，用于软件升级
type LTV_B_T struct {
	Len     uint16                   `json:"len"`      //监控对象长度
	Tag     uint16                   `json:"tag"`      //监控对象标号
	AbyData [PS_MCP_B_DATA_LEN]uint8 `json:"aby_data"` //监控数据
}

/*********************************************************
定义协议栈
**********************************************************/
//协议头
type PS_HEAD_T struct {
	StApHead  AP_HEAD_T  `json:"st_ap_head"`  // AP协议头
	StVpHead  VP_HEAD_T  `json:"st_vp_head"`  // VP标准协议头
	StMcpHead MCP_HEAD_T `json:"st_mcp_head"` // MCP协议头
}

//协议尾
type PS_TAIL_T struct {
	Crc      uint16 `json:"crc"`       // CRC16校验值
	StopFlag uint8  `json:"stop_flag"` // 结束标识符号
}
