/********************************************************
*                                                                                                            
* 文 件 名： ParsePackIoData.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-03-28
* 作    者： 联锁组
* 功能描述： IO数据解析
* 修改记录：   
*
********************************************************/ 

#include "ParsePackIoData.h"



/*解包相关*/
IoDataStruct CollBoardDataStru[BOARD_SUM_MAX];   /*IO到CI数据帧结构体*/
UINT8 CollBroadStruCurSum = 0u;	/*IO到CI数据结构体当前总数*/

UINT32 preRawLen = 0; /*透传数据长度*/
UINT8 preTempDataBuf[BOARD_SUM_MAX * (BOARD_COLL_DATA_LEN + 1U)] = { 0U };		/*数据临时数组*/

/*
* 功能描述： 解析IO数据
* 参数说明： void    
* 返回值  ： 0:解析失败
*			 1:解析成功      
*/
UINT8 ParseIoToCiData(void )
{									/*队列数据总长度*/
	UINT8 tempDataBuf[BOARD_SUM_MAX *(BOARD_COLL_DATA_LEN + 1U)] = {0u};		/*数据临时数组*/
	/*BOARD_SUM_MAX:定义一个联锁站采集驱动板数目最大值
	  BOARD_COLL_DATA_LEN:一个采集板采集数据长度
	  1:板卡地址
	*/
	
	UINT32 rawLen = 0U; /*透传数据长度*/

	rawLen = InnetRawIoRecv(tempDataBuf, (UINT32)sizeof(tempDataBuf));
	if (rawLen > 0U)
	{
		(void)memcpy(preTempDataBuf, tempDataBuf, rawLen);
		preRawLen = rawLen;
	}
	else
	{
		(void)memcpy(tempDataBuf, preTempDataBuf, preRawLen);
		rawLen = preRawLen;
	}
		
	/*解析IO到CI数据帧*/
	(void)ParseIoToCiDataFrame(tempDataBuf, (UINT16)rawLen);

    return CI_SUCCESS;
	

}


/*
* 功能描述： 解析IO到CI数据帧
* 参数说明： const UINT8* dataBuf, 数据缓冲区
*            const UINT16 dataLength, 数据长度
* 返回值  ： 0: 数据解析失败
*			 1: 数据解析成功      
*/
UINT8 ParseIoToCiDataFrame(const UINT8* dataBuf, const UINT16 dataLength)
{
	UINT16 ii = 0u;
	UINT16 jj = 0u;
	UINT8 kk = 0u;
	UINT8 currentValue = 0u;
    BoardDataStruct* pColBoardStru = NULL;			/*采集板数据结构体*/
	UINT16 colBoardSum = 0u;							/*采集板数据结构体总数*/
    UINT8 boardIndex = 0u;                           /*采集板索引*/
#ifdef LOGPRINT
    UINT8 colPData[BOARD_SUM_MAX * (BOARD_COLL_DATA_LEN + 1U)] = {0u};                          /*打印的采集数据*/
#endif    
	
    colBoardSum = GetColRelayStructSum();/*本联锁采集板总数*/
    pColBoardStru = GetColRelayStruct();/*本联锁采集板数据*/
	if ((dataBuf != NULL) && (dataLength > 0u))
	{
		/*解析IO采集数据包*/
        for (ii = 0u; (ii < colBoardSum * (BOARD_COLL_DATA_LEN + 1u)) && (ii < dataLength); ii += (BOARD_COLL_DATA_LEN + 1u))
        {
            CollBoardDataStru[boardIndex].BoardAddress = dataBuf[ii];

            for (jj = 0u; jj < BOARD_COLL_DATA_LEN; jj++)
            {
                currentValue = dataBuf[ii + jj + 1u];

                for (kk = 0u; kk < 8u; kk++)
                {
                    if (((currentValue >> kk) & 0x01u) == 0x01u)
                    {
                        CollBoardDataStru[boardIndex].PosValueBuf[jj * 8U + kk] = RELAY_STATE_UP;
                        
                    }
                    else
                    {
						
                        CollBoardDataStru[boardIndex].PosValueBuf[jj * 8U + kk] = RELAY_STATE_DOWN;
                        
                    }

                }
            }

            boardIndex++;
        }

        CollBroadStruCurSum = boardIndex;

        
#ifdef LOGPRINT
        
        for (ii = 0u; (ii < colBoardSum * (BOARD_COLL_DATA_LEN + 1u)) && (ii < dataLength); ii++)
        {
            colPData[ii] = dataBuf[ii];
        }

        /*打印采集数据*/
        if (CI_SUCCESS == RecordCollectDataLog(colPData))
        {
            /*打印采集数据错误处理*/
        }
        
#endif
		
		return CI_SUCCESS;
	}
	else
	{
		/*数据无效*/
		return CI_ERROR;
	}
}


/*
* 功能描述： 组IO数据
* 参数说明： void    
* 返回值  ： 0:组包失败
*			 1:组包成功      
*/
UINT8 PackCiToIoData(void)
{
	UINT16 ii = 0u;									/*游标*/
	UINT16 jj = 0u;									/*游标*/
	QueueStruct* ciToIoDataQueue = Get2oo2CiToIoDataQueue();
	BoardDataStruct* pDrvBoardStru = NULL;			/*驱动板数据结构体*/
	UINT16 drvBoardSum = 0u;							/*驱动板数据结构体总数*/
	UINT8 relayDrvState = 0u;	                    /*继电器驱动状态*/
	UINT8 drvDataBuf[BOARD_DRV_DATA_LEN + 1U] = {0u};		/*驱动数据数组*/
	UINT16 drvData = 0u;			                    /*驱动板数据*/
	UINT16 relayId = 0u;								/*继电器ID*/
#ifdef LOGPRINT
    UINT8 drvPData[CITOIO_DATA_STRU_SUM_MAX * (BOARD_DRV_DATA_LEN + 1U)] = {0u};  /*打印的驱动数据*/
    UINT16 drvPDataLen = 0u;                          /*打印的驱动数据长度*/
#endif
	if (NULL != ciToIoDataQueue)
	{
		drvBoardSum = GetDrvRelayStructSum();	    /*获取驱动板结构体总数*/
		pDrvBoardStru = GetDrvRelayStruct();		/*获取驱动板结构体 不会返回NULL*/
		
		debug_infor_printf((const)"Runing: PackCiToIoData, drvBoardSum = %d", drvBoardSum);

		for (ii = 0u; ii < drvBoardSum; ii++)
		{
			drvData = 0u;/*驱动信息清零*/

			drvDataBuf[0] = pDrvBoardStru[ii].BoardAddress;

			for (jj = 0u; jj < DRV_BOARD_POSITION_MAX; jj++)
			{
				relayId = pDrvBoardStru[ii].RelayIdBuf[jj];

				if ((0u != relayId) && (relayId < RELAY_SUM_MAX))
				{
					relayDrvState = GetRelayDriveState(relayId);		/*获取继电器驱动状态*/

					if (RELAY_STATE_DOWN == relayDrvState)
					{ /*继电器驱动落下*/

					}
					else if (RELAY_STATE_UP == relayDrvState)
					{ /*继电器驱动吸起*/

						drvData = drvData | (0x0001u << jj);
					}
					else
					{ /*继电器驱动无效*/

					  /*继电器落下*/
					}
				}
			}

			ShortToCharLE(drvData, &drvDataBuf[1]); /*将UINT16通过小端方式存入数组*/
#if 0                
			if (0u == QueueWrite(BOARD_DRV_DATA_LEN + 1, drvDataBuf, ciToIoDataQueue))
			{ /*写队列失败*/

				QueueClear(ciToIoDataQueue);   /*清队列*/

				debug_infor_printf((const)"Error: PackCiToIoData, QueueWrite = 0");

				return CI_ERROR;
			}
#endif
#ifdef LOGPRINT
			for (jj = 0u; jj < BOARD_DRV_DATA_LEN + 1u; jj++)
			{
				drvPData[drvPDataLen++] = drvDataBuf[jj];
			}
#endif

		}

		(void)InnetRawIoSend(drvPData, drvPDataLen);
		pDrvBoardStru = NULL;/*清指针*/

		 /*重置继电器驱动状态*/
		ClearRelayDriveState();

#ifdef LOGPRINT
		/*打印驱动数据*/
		if (drvPData == NULL)
		{

		}
		else
		{
			if (CI_SUCCESS == RecordDriverDataLog(drvPData))
			{
				/*打印驱动数据错误处理*/
			}
		}

#endif
		return CI_SUCCESS;
	}
	else
	{
		debug_infor_printf((const)"Error: PackCiToIoData, ciToIoDataQueue = NULL");
		return CI_ERROR;
	}        
}


/*
* 功能描述： 获取采集板结构体数组长度
* 参数说明： void    
* 返回值  ： 0: 获取失败
*           >0: 采集板结构体数组长度      
*/
UINT8 GetCollBroadStruCurSum(void)
{
	return CollBroadStruCurSum;
}


/*
* 功能描述： 获取采集板结构体数组
* 参数说明： void    
* 返回值  ： NULL: 获取失败
*           !NULL: 采集板结构体数组指针      
*/
IoDataStruct* GetCollBoardDataStruct(void)
{
	if (CollBroadStruCurSum == 0u)
	{
		return NULL;
	}
	else
	{
		return CollBoardDataStru;
	}
}

/*
* 功能描述： 重置IO到CI数据帧
* 参数说明： void    
* 返回值  ： void      
*/
void ResetIoToCiData(void)
{
    UINT16 ii = 0u;
    UINT16 jj = 0u;

    BoardDataStruct* colBoard = GetColRelayStruct();/*获取采集板数据*/

	for (ii = 0u; ii < GetColRelayStructSum(); ii++)
	{
        CollBoardDataStru[ii].BoardAddress = colBoard[ii].BoardAddress;

        for (jj = 0u; jj < COL_BOARD_POSITION_MAX; jj++)
        {
            CollBoardDataStru[ii].PosValueBuf[jj] = RELAY_STATE_DOWN;
        }
	}

    CollBroadStruCurSum = (UINT8)GetColRelayStructSum();/*采集数据与采集板一致*/
}























