#include "p_apps.h"
#include "p_sip.h"
#include "v_task.h"
#include "my_sip.h"

#define RX_INFO_FREE		0
#define RX_INFO_MSGLEN		1
#define RX_INFO_LEN			3

UCHAR SipRxAlloc()
{
	DCHAR i;

	for (i = 0; i < SIP_MAX_RX_NUM; i ++)
	{
		SdramReadData((USHORT)(SIP_TRANS_SDRAM_POS+SIP_RX_INFO + i));
		if (X_VAL(Sdram_pDataCache, RX_INFO_FREE))
			return i;
	}
	return SIP_MAX_RX_NUM;
}

void SipRxDealloc(UCHAR iRxIndex)
{
	if (iRxIndex == SIP_MAX_RX_NUM)
		return;

	X_VAL(Sdram_pDataCache, RX_INFO_FREE) = 1;
	USHORT2PXCHAR(0, (PXCHAR)(Sdram_pDataCache + RX_INFO_MSGLEN));
	SdramWriteData((USHORT)(SIP_TRANS_SDRAM_POS+iRxIndex + SIP_RX_INFO), RX_INFO_LEN);
}

void SipRxStartup()
{
	DCHAR i;

	for (i = 0; i < SIP_MAX_RX_NUM; i ++)
	{
		SipRxDealloc(i);
	}
}

void SipRxSave(UCHAR iRxIndex)
{
	if (iRxIndex == SIP_MAX_RX_NUM)
		return;

	X_VAL(Sdram_pDataCache, RX_INFO_FREE) = 0;
	USHORT2PXCHAR(Sip_iSendLen, (PXCHAR)(Sdram_pDataCache + RX_INFO_MSGLEN));
	SdramWriteData((USHORT)(SIP_TRANS_SDRAM_POS+iRxIndex + SIP_RX_INFO), RX_INFO_LEN);
	
	SdramSaveEthernetFrame((USHORT)(SIP_TRANS_SDRAM_POS+SIP_RX_BASE + (iRxIndex * 6)), Sip_pDataOut, Sip_iSendLen);
}

void SipRxSend(UCHAR iRx, UCHAR iUdpIndex)
{
	DCHAR iRxIndex;

	iRxIndex = iRx;

	if (iRxIndex == SIP_MAX_RX_NUM)
		return;

	SdramReadData((USHORT)(SIP_TRANS_SDRAM_POS+iRxIndex + SIP_RX_INFO));
	if (X_VAL(Sdram_pDataCache, RX_INFO_FREE))
		return;

	Sip_iSendLen = PXCHAR2USHORT((PXCHAR)(Sdram_pDataCache + RX_INFO_MSGLEN));
	if (Sip_iSendLen)
	{
		SdramCopyEthernetFrame((USHORT)(SIP_TRANS_SDRAM_POS+SIP_RX_BASE + (iRxIndex * 6)), Sip_pDataOut, Sip_iSendLen);
		SipUdpSend(iUdpIndex);
	}
}
