#ifndef PS_H
#define PS_H

#include "sysdef.h"

/*********************************************************
网管数据来源
**********************************************************/

#define PS_SOURCE_GUI 0X01    // 本地网管
#define PS_SOURCE_CENTER 0X02 // 监控中心
#define PS_SOURCE_ALARM 0x03  // 本地上报

/*********************************************************
定义AP层协议
**********************************************************/
/*定义AP层协议头*/
#define UDP_FRAME_MIN_LEN 17           // AP层最小帧长，协议框架17字节
#define UDP_FRAME_MCPA_PAYLOAD_LEN 260 // MCPA，数据载荷256字节
#define UDP_FRAME_MCPB_PAYLOAD_LEN 264 // MCPB，数据载荷256字节
#define UDP_FRAME_MAX_LEN 562          // AP层最大帧长

#define UDP_MCP_A_DATA_LEN 64                      // MCP-A监控对象数据单元最大长度
#define UDP_MCP_A_LTV_LEN (UDP_MCP_A_DATA_LEN + 4) // MCP-A类型的ltv长度
#define UDP_MCP_B_DATA_LEN 260                     // MCP-B监控对象数据单元最大长度，帧号4个字节，数据256字节

#define PS_AP_HEAD_FLAG 0x7E
#define PS_AP_TAIL_FLAG 0x7E

// AP头，1个字节
typedef struct AP_HEAD_S
{
    uint8 byStartFlag; // 起始标识符号
} AP_HEAD_T;

/*********************************************************
定义VP层协议
**********************************************************/

/*VP头，15个字节*/
#define VP_DEVICE_CLASS 0x01 // 声波基站
typedef struct VP_HEAD_S
{
    uint8 abyProjectID[4]; // 项目编号，省市各1个字节，项目编号占2个字节
    uint8 byPackageID;     // 通信包标号
    uint8 abyBtsID[4];     // 基站编号
    uint8 byVpFlag;        // vp层交互标志
    uint8 byMcpType;       // 监控应用层协议标识
} VP_HEAD_T;

// VP层交互标志
typedef enum
{
    VP_RESP = 0x01, // 应答
    VP_CMMD = 0x80, // 命令
} pt_vp_flag_e;

/*********************************************************
定义MCP层协议
**********************************************************/
/*MCP头，2个字节*/
typedef struct MCP_HEAD_S
{
    uint8 byComd; // 命令单元
    uint8 byResp; // 应答单元
} MCP_HEAD_T;

/*定义MCP 协议类型*/
#define MCP_A 0x01 // MCP-A
#define MCP_B 0x02 // MCP-B

/*定义MCP-A命令单元*/
typedef enum
{
    MCP_A_REPORT = 0x01,    // 告警上报
    MCP_A_QUERY = 0x02,     // 查询命令
    MCP_A_CONFIGURE = 0x03, // 设置命令
} mcp_a_comd_e;

/*定义MCP-B命令单元*/
typedef enum
{
    MCP_B_CONTROL = 0x80,       // 升级控制命令
    MCP_B_FILE_TRANSFER = 0x81, // 文件传输命令
} mcp_b_comd_e;

/*定义MCP应答单元*/
typedef enum
{
    MCP_RESP_SUCC = 0x01, // 表示命令执行成功
    MCP_RESP_ERR = 0x02,  // 监控对象命令错误
    MCP_CMD = 0xFF        // 表示该消息为命令
} mcp_resp_e;

// MCP-A监控对象结构
typedef struct
{
    uint16 wLen; // 监控对象长度
    uint16 wTag; // 监控对象标号
    uint8 abyData[UDP_MCP_A_DATA_LEN];
} LTV_T;

// MCP-B监控对象结构，用于软件升级
typedef struct
{
    uint16 wLen; // 监控对象长度
    uint16 wTag; // 监控对象标号
    uint8 abyData[UDP_MCP_B_DATA_LEN];
} LTV_B_T;

/*********************************************************
定义协议栈头
**********************************************************/
/*头*/
typedef struct
{
    AP_HEAD_T stApHead;   // AP协议头
    VP_HEAD_T stVpHead;   // VP标准协议头
    MCP_HEAD_T stMcpHead; // MCP协议头
} PS_HEAD_T;

/*AP尾，3个字节*/
typedef struct
{
    uint16 wCrc;      // CRC16校验值
    uint8 byStopFlag; // 结束标识符号
} PS_TAIL_T;

/*传进协议栈的参数*/
typedef struct
{
    uint8 bySource;       // 消息来源
    uint8 abyBaseID[8];   // 站点编号
    uint8 abyDeviceID[2]; // 设备ID
    uint8 abyLen[2];      // 消息长度
} PT_IN_PARAM_T;

// 供外部使用的函数
void ps_init(void);
uint8 ps_receive_data_from_outsite(uint8 *pbyData, uint8 bySource, uint16 wLen);
uint8 ps_receive_data_from_insite(uint8 *pbyData, uint8 bySource, uint16 wLen);

#endif
