/*****************************************************************************
Copyright: 2013-2018, MIAO XUN TECH. Co., Ltd.
File name:ps_ap.c
Description: 网管协议栈VP层
Author: 周涛
Version: 0.0.01
Date: 2022-4-15
History:
*****************************************************************************/
#include "includes.h"

// 定义本模块使用的全局变量
static VP_PARAM_T gVp_stVpParam = {0};

// 设置VP层系统参数
void ps_vp_set_param(uint32 dwProjectID, uint32 dwBtsID)
{
    gVp_stVpParam.dwProjectID = dwProjectID;
    gVp_stVpParam.dwBtsID = dwBtsID;

    return;
}

// VP层上行处理单元。
// pbyData:从AP层接收的数据，bySource:数据来源，wLen:数据长度
uint8 ps_up_vp_in(uint8 *pbyData, uint8 bySource, uint16 wLen)
{
    PS_HEAD_T *pstHead = (PS_HEAD_T *)pbyData;
    uint8 byFlag = 0;

    // 参数不合法
    if (NULL == pbyData || wLen < UDP_FRAME_MIN_LEN || wLen > UDP_FRAME_MAX_LEN)
    {
        return 1;
    }

    // 对于来自监控中心的消息，检查消息的合法性(项目编号和设备编号是否合法)
    if (bySource == PS_SOURCE_CENTER)
    {
        // 项目编号校验
        // 基站编号校验
        //  站点编号不相同
    }

    // MCP-A帧
    if (MCP_A == pstHead->stVpHead.byMcpType)
    {
        // 根据VP层交互标识做不同的处理
        switch (pstHead->stVpHead.byVpFlag)
        {
        case (uint8)VP_CMMD: /*远端VP层对本机的访问命令*/
            // 把数据送到MCP层请求命令处理接口
            byFlag = ps_up_mcp_in_req(pbyData, bySource, wLen);
            break;
        case (uint8)VP_RESP: /*远端VP层对本机命令的应答（成功）*/
            byFlag = ps_up_mcp_in_res(pbyData, bySource, wLen);
            break;
        default:
            byFlag = 1;
            break;
        }

        if (byFlag)
        {
            return 1; // 失败
        }
    }
    // MCP-B帧
    else if (MCP_B == pstHead->stVpHead.byMcpType)
    {
        // 根据VP层交互标识做不同的处理
        switch (pstHead->stVpHead.byVpFlag)
        {
        case (uint8)VP_CMMD: // 远端VP层对本机的访问命令
            byFlag = ps_up_mcpb_req(pbyData, bySource, wLen);
            break;
        case (uint8)VP_RESP: // 远端VP层对本机命令的应答
        default:
            byFlag = 1;
            break;
        }

        if (!byFlag)
        {
            return 1; // 失败
        }
    }
    // 错误帧
    else
    {
        return 1;
    }

    return 0;
}
