/********************************************************                                                                                                       
* 文件名  ： RsspInitWl.h   
* 版权说明： 
* 版本号  ： 1.0
* 创建时间： 2013.3.1
* 作者    ： 车载及协议部
* 功能描述： RSSP层初始化以及内存释放。
* 使用注意：调用RsspInit函数后，必须有相对应的调用RsspFreeSpace
*   
* 修改记录：   
*   时间		修改人	理由
* ------------  ------  ---------------
*	2013.3.1	楼宇伟	初版作成
********************************************************/ 

#include "stdlib.h"
#include "CommonMemory.h"
#include "RsspIFWl.h"
#include "RsspStructWl.h"
#include "RsspCommonWl.h"
#include "RsspLnkNodeMgrWl.h"
#include "RsspTmpMsgLnkCommonWl.h"
#include "dsuRsspFunc.h"


#ifdef __cplusplus
extern "C" {
#endif

 /**
* @brief RsspInit_WL RSRSP初始化
* @param pRsspStruct RSSPI实例 取值范围:参考结构体RSSP_INFO_STRU
* @return 0:失败 1:成功
*/
	UINT8 RsspInit_WL(RSSP_INFO_STRU* pRsspStruct)
	{
		/*- 定义局部变量*/
		UINT8 rtn = 0; /*-< 设置函数返回值为失败*/
		UINT32 mallocLen = 0u; /*分配空间长度*/

		if (NULL != pRsspStruct) /*-< 参数是否非空*/
		{
			/*记录数组分配空间*/
			pRsspStruct->RecordArray = (UINT8*)malloc(pRsspStruct->RecordArraySize + 2); /*-< 分配日志数组*/
			if (NULL != pRsspStruct->RecordArray) /*-< 分配成功*/
			{
				CommonMemSet(pRsspStruct->RecordArray, sizeof(UINT8) * (pRsspStruct->RecordArraySize + 2), 0, sizeof(UINT8) * (pRsspStruct->RecordArraySize + 2)); /*-< 清零日志数组*/

				/*输出协议给应用数组AppArray分配空间*/
				pRsspStruct->AppArraySize = (pRsspStruct->OutputSize + RSSP_FIXED_LEN_WL + 14 + 26) * (pRsspStruct->MaxNumLink) + 2; /*-< 得到应用数组长度*/
				pRsspStruct->AppArray = (UINT8*)malloc(pRsspStruct->AppArraySize); /*-< 分配应用数组*/
			}
			if (NULL != pRsspStruct->AppArray) /*-< 分配成功*/
			{
				CommonMemSet(pRsspStruct->AppArray, sizeof(UINT8) * pRsspStruct->AppArraySize, 0, sizeof(UINT8) * pRsspStruct->AppArraySize); /*-< 清零应用数组*/

				/*链路数组分配空间*/
				pRsspStruct->VarArraySize = RSSP_VAR_NODE_LEN_WL * pRsspStruct->MaxNumLink + 32 + 14 * (pRsspStruct->MaxNumLink + 2) + 32; /*-< 得到链路数组长度*/
				pRsspStruct->VarArray = (UINT8*)malloc(pRsspStruct->VarArraySize); /*-< 分配链路数组*/
			}
			if (NULL != pRsspStruct->VarArray) /*-< 分配成功*/
			{
				CommonMemSet(pRsspStruct->VarArray, sizeof(UINT8) * pRsspStruct->VarArraySize, 0, sizeof(UINT8) * pRsspStruct->VarArraySize); /*-< 清零链路数组*/

				/*数据帧分配空间*/
				pRsspStruct->FrameDataMaxLen = 2 + 8 + RSSP_FIXED_LEN_WL + 32 + (pRsspStruct->InputSize > pRsspStruct->OutputSize ? pRsspStruct->InputSize : pRsspStruct->OutputSize); /*-< 得到数据帧数组长度*/
				pRsspStruct->FrameData = (UINT8*)malloc(pRsspStruct->FrameDataMaxLen); /*-< 分配数据帧数组*/
			}
			if (NULL != pRsspStruct->FrameData) /*-< 分配成功*/
			{
				CommonMemSet(pRsspStruct->FrameData, sizeof(UINT8) * pRsspStruct->FrameDataMaxLen, 0, sizeof(UINT8) * pRsspStruct->FrameDataMaxLen); /*-< 清零数组帧数组*/

				/*数据堆栈链表分配空间*/
				rtn = InitMsgNodeStack_WL(pRsspStruct->MaxNumLink * (pRsspStruct->MaxNumPerCycle + 2) * 2, pRsspStruct->FrameDataMaxLen, &pRsspStruct->StackOfDataLink); /*-< 调用函数初始化链路堆栈链表*/
				if (1 == rtn) /*-< 调用函数是否成功*/
				{
					rtn = InitLnkNodeArr_WL(pRsspStruct->MaxNumLink, pRsspStruct); /*-< 调用函数初始化链路链路节点*/
				}
				if (1 == rtn) /*-< 调用函数是否成功*/
				{
					rtn = 0; /*-< 设置函数返回值为失败*/
					pRsspStruct->OutnetQueueSize = (pRsspStruct->OutputSize + 8) * pRsspStruct->MaxNumLink * (pRsspStruct->MaxNumPerCycle + 2); /*-< 得到输入数据队列长度*/
					rtn = QueueInitial(&pRsspStruct->OutnetQueueA, pRsspStruct->OutnetQueueSize); /*-< 初始化红网队列长度*/
					if (1 == rtn) /*-< 调用函数是否成功*/
					{
						rtn = QueueInitial(&pRsspStruct->OutnetQueueB, pRsspStruct->OutnetQueueSize); /*-< 初始化蓝网队列*/
					}
				}
				if (1 == rtn) /*-< 调用函数是否成功*/
				{
					pRsspStruct->DataToAppSize = (pRsspStruct->InputSize + 6) * pRsspStruct->MaxNumLink * (pRsspStruct->MaxNumPerCycle + 2); /*-< 得到到应用数据队列长度*/
					rtn = QueueInitial(&pRsspStruct->DataToApp, pRsspStruct->DataToAppSize); /*-< 初始化到应用数据队列*/
				}
				if (1 == rtn) /*-< 调用函数是否成功*/
				{
					pRsspStruct->OutputDataQueueSize = (pRsspStruct->OutputSize + 8) * pRsspStruct->MaxNumLink * (pRsspStruct->MaxNumPerCycle + 2); /*-< 得到输出数据队列长度*/
					rtn = QueueInitial(&pRsspStruct->OutputDataQueue, pRsspStruct->OutputDataQueueSize); /*-< 初始化输出数据队列*/
				}
				if (1 == rtn) /*-< 调用函数是否成功*/
				{
					rtn = 0; /*-< 设置函数返回值为失败*/
					/*无应用发送数据个数默认值为3*/
					pRsspStruct->NoSendAppData = NONE_SEND_APP_DATA_WL; /*-< 设置输出时无应用给协议应用数据周期数*/

					pRsspStruct->NetsRecvPkgNumsLen = 0u; /*-< 设置各网收到包数数组长度为0*/
					pRsspStruct->NetsRecvPkgNums = (RsppiNetsRecvPkgNum*)malloc(sizeof(RsppiNetsRecvPkgNum) * pRsspStruct->MaxNumLink); /*-< 分配各网收到包数数组*/
					if (NULL != pRsspStruct->NetsRecvPkgNums) /*-< 分配成功*/
					{
						CommonMemSet(pRsspStruct->NetsRecvPkgNums, sizeof(RsppiNetsRecvPkgNum) * pRsspStruct->MaxNumLink, 0, sizeof(RsppiNetsRecvPkgNum) * pRsspStruct->MaxNumLink); /*-< 清零各网收到包数数组*/

						mallocLen = sizeof(UINT8) * ((pRsspStruct->OutputSize > pRsspStruct->InputSize) ? pRsspStruct->OutputSize : pRsspStruct->InputSize); /*-< 得到应用长度*/
						mallocLen += 32u; /*-< 得到应用加帧头长度*/
						pRsspStruct->gpSendSingleOutMsg = (UINT8*)malloc(mallocLen); /*-< 分配应用加帧头数组*/
						if (NULL != pRsspStruct->gpSendSingleOutMsg) /*-< 分配成功*/
						{
							CommonMemSet(pRsspStruct->gpSendSingleOutMsg, mallocLen, 0u, mallocLen); /*-< 清零应用加帧头数组*/

							rtn = 1; /*-< 设置函数返回值为成功*/
						}

					}

				}
			}
		}

		return rtn; /*-< 返回函数返回值*/
	}

/***********************************************************************
 * 方法名   : RsspFreeSpace_WL
 * 功能描述 : 通过该函数，释放RSSP层开辟的空间。
 * 输入参数 : 
 *	参数名		类型			输入输出		描述
 *  --------------------------------------------------------------
 *	pRsspStruct  RSSP_INFO_STRU*	INOUT			RSSP层统一结构体，需进行初始值设置。
 * 返回值   : UINT8  1：正常返回  0：错误返回
 ***********************************************************************/
UINT8 RsspFreeSpace_WL(RSSP_INFO_STRU *pRsspStruct)
{
	UINT8 ret = 1;

	/* 全局通信节点数组空间释放 */
	DestoryLnkNodeArr_WL(pRsspStruct);

	/* 临时报文堆栈空间释放:不会失败  */
	ret = DestoryMsgNodeStack_WL(&pRsspStruct->StackOfDataLink);

	/* 临时缓存区 */
	if (NULL != pRsspStruct->FrameData)
	{
		free(pRsspStruct->FrameData);
		pRsspStruct->FrameData = NULL;
	}
	else
	{
		/* 什么不做 */
	}
#ifndef RSSP_NO_HLHT
	/*释放RSSP配置信息*/
	if (NULL != pRsspStruct->pDsuRsspInfoStruWL)
	{
		FreeDsuRsspi(&pRsspStruct->pDsuRsspInfoStruWL);
	}
#endif
	return ret;
}

#ifdef __cplusplus
}
#endif
