/************************************************************************
* 文件名：RpPlatform.h
* 文件描述：冗余协议公用结构体头文件
* 创建时间：2009.11.17    
* 修改记录：
*    2012-8-15 15:54:00 王佩佩 修改记录
*	    1.增加RP协议版本号宏定义
************************************************************************/

#ifndef _RPPLATFORM_H
#define _RPPLATFORM_H

#include "CommonTypes.h"
#include "CommonQueue.h"
#include "RpStruct.h"
#include "RpConfig.h"

/* RP协议版本号定义 */
#define RPCODE_VER_PRODUCT_NO 66
#define RPCODE_VER_MODULE_NO  2
#define RPCODE_VER_MAIN_VER  2
#define RPCODE_VER_SUB_VER  0

#ifdef __cplusplus
extern "C" {
#endif

	typedef void* STACK_DATA_TYPE_RP;

	/*堆栈结构体定义*/
	typedef struct
	{
		STACK_DATA_TYPE_RP* pStackData;         /*空闲节点值，表示的是存储数据的空间*/
		UINT16  Top;          /*目前栈的大小.同时这个值也可以描述当前堆栈中,再填写元素要存放的下标.
								由于本堆栈是一个顺序栈,因此顺序栈中此值应当是初始为零,
								之后逐步增大,即从0到STACK_MAXSIZE-1.*/
		UINT16  TotalSize;     /*此堆栈能够存放节点的最大数*/
	} CommonStackRp;

/*冗余层统一结构*/
typedef struct  Rp_Info
{
	UINT8 LocalID;            		/*设备ID*/
	UINT8 LocalType;            		/*设备type*/
	UINT8 MaxNumLink;                  /*冗余层通信的对象数*/
	UINT8 MaxNumPerCycle;     	/*冗余层一周期允许每个对象的最大有效数据*/
	UINT16 InputSize; 			/*冗余层接受数据中最大一帧的应用数据长度*/
	UINT16 OutputSize; 		/*冗余层发送数据中最大一帧的应用数据长度*/
	UINT8* RecordArray; 		/*冗余层记录数组*/
	UINT16 RecordArraySize;	/*记录数组大小*/
	UINT8* AppArray;			/*冗余层输出模块的出口1，表示外网输出数据*/
	UINT16 AppArraySize; 		/*输出模块的出口数组长度*/
	UINT8* VarArray; 			/*冗余层输出模块的出口2，表示中间变量*/
	UINT16 VarArraySize; 		/*输出模块的出口数组长度*/
	QueueStruct DataToApp;		/*冗余层协议输入给应用的数据队列*/
	UINT32 DataToAppSize; 		/*协议输入给应用的数据队列长度*/
	QueueStruct OutputDataQueue;	/*冗余层应用给协议输出的数据队列*/
	UINT32 OutputDataQueueSize; 	/*应用给协议输出的数据队列长度*/
	QueueStruct OutnetQueueA; 		/*冗余层内网接收队列A(内网->冗余红网队列)*/
	QueueStruct OutnetQueueB; 		/*冗余层内网接收队列B(内网->冗余蓝网队列)*/
	UINT32 OutnetQueueSize; 		/*内网接收队列长度，由协议初始化时填写*/
	RpSNLINK_STRU *SnLinkhead;	/*序列号缓冲链表头指针*/
	CommonStackRp SnLnkStack;		/*序列号缓冲链表堆栈*/
	UINT32  *pSnStack;				/*指向堆栈空间，释放空间时使用*/
	UINT8 *Buff_Rp;				/*临时数据缓冲区*/
	UINT8 interfaceType; /*接口类型0x55:发送/接收标识为4字节;其他(默认值):发送/接收标识为2字节,初始化时设置*/
} RP_INFO_STRU ;

/**
 * @brief RpInit 初始化RP
 * @param fileName FS文件 取值范围:字节数组
 * @param pRpStruct RP实例 取值范围:参考结构体RP_INFO_STRU
 * @return 0:失败 1:成功
 */
UINT8 RpInit(UINT8* fileName,RP_INFO_STRU *pRpStruct);

/***********************************************************************
 * 方法名   : RpLnkDelete
 * 功能描述 : 通过该函数，应用可以删除某个发送节点。当应用不再需要对某个对象发送数据时，利用该函数删除相应的发送节点。
 * 输入参数 : 
 *	参数名				类型							输入输出		描述
 *  --------------------------------------------------------------
 *	 devName     UINT16           IN  设备名称
 *   pdelDevSn   RP_INFO_STRU *   IN  冗余层统一结构
 * 返回值   : UINT8  1：正常返回  0：错误返回
 ***********************************************************************/

UINT8 RpLnkDelete(UINT16 devName,RP_INFO_STRU *pdelDevSn);

/**************************************************************************************
 *功能描述：
 *	释放协议在函数RpInit中分配的内存空间
 *  入口参数：
 * 	 RP_INFO_STRU * pRpStruct 	统一结构体
 *  返回值：
 *	无
 ***************************************************************************************/
UINT8 RpFreeSpace(RP_INFO_STRU *pRpStruct);

/**
 * @brief RpReceive RP输入处理
 * @param pRpStruct RP实例 取值范围:参考结构体RP_INFO_STRU
 * @return 0:失败 1:成功
 */
UINT8 RpReceive(RP_INFO_STRU *pRpStruct);

/**
 * @brief RpOutput RP输出处理
 * @param pRpStruct RP实例 取值范围:参考结构体RP_INFO_STRU
 * @return 0:失败 1:成功
 */
UINT8 RpOutput(RP_INFO_STRU *pRpStruct);

/*****************************************************************************************
*功能描述:
*    刷新冗余层中间变量
*参数说明:
*    RP_INFO_STRU *pRpStruct 统一结构体
*    UINT16 sLen_Input    冗余层中间变量长度
*    UINT8 *Input_Data_LnkMes 冗余层中间变量
*返回值:
*   正确返回1；错误返回0;                                                     
*****************************************************************************************/
UINT8 RpRefresh(UINT16 sLen_Input, UINT8 *Input_Data_LnkMes,RP_INFO_STRU *pRpStruct);

/**
 * @brief RpDelAllLink RP删除所有链路
 * @param rp RP结构体变量 取值范围:参考结构体RP_INFO_STRU
 */
void RpDelAllLink(RP_INFO_STRU* rp);

#ifdef __cplusplus
}
#endif

#endif


