#include "p_apps.h"
#include "PalmChip.h"

#ifdef _USE_FXS_AG1170

static XCHAR _bRinging = FALSE;
void SlicHandleTimer(UCHAR iVal)
{
	if (_bRinging)
	{
		if (iVal % 2)
		{
			XBYTE[IO_HI_DOUT] &= SLIC_FWD_AND_MASK;	
		}
		else
		{
			XBYTE[IO_HI_DOUT] |= SLIC_FWD_OR_MASK;	
		}
		XBYTE[IO_HI_ENABLE] |= SLIC_FWD_OR_MASK;
	}
}

void SlicActivePolarityReversal()
{
	DCHAR iVal;

	XBYTE[IO_HI_ENABLE] &= SLIC_FWD_AND_MASK;
	iVal = XBYTE[IO_HI_DOUT] & SLIC_FWD_OR_MASK;
	if (iVal)
	{
		XBYTE[IO_HI_DOUT] &= SLIC_FWD_AND_MASK;		// F/R = 0
		XBYTE[IO_HI_ENABLE] |= SLIC_FWD_OR_MASK;
	}
	else
	{
		XBYTE[IO_HI_DOUT] |= SLIC_FWD_OR_MASK;		// F/R = 1
		XBYTE[IO_HI_ENABLE] |= SLIC_FWD_OR_MASK;
	}
}

#endif	//	_USE_FXS_AG1170

#ifdef _USE_FXS

volatile DCHAR Slic_iCidStatus;

void SlicStartRing()
{
	if (Slic_iCidStatus & CID_STATUS_START_OR)
	{
		Slic_iCidStatus &= CID_STATUS_START_AND;
		Slic_iCidStatus |= CID_STATUS_FINISH_OR;
	}
#ifdef _USE_FXS_AM79R70
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] |= 0x01;	// PIO0 = 1
	XBYTE[IO_LO_DOUT] &= 0xfd;	// PIO1 = 0
	XBYTE[IO_LO_DOUT] &= 0xfb;	// PIO2 = 0
#else
	_bRinging = TRUE;
	XBYTE[IO_HI_ENABLE] |= SLIC_RING_OR_MASK;
	XBYTE[IO_HI_DOUT] |= SLIC_RING_OR_MASK;		// PIO14 = 1
#endif
}

void SlicStopRing()
{
	if (!(Slic_iCidStatus & CID_STATUS_FINISH_OR) && !PIO_bHandsetUp)
	{
		Slic_iCidStatus |= CID_STATUS_START_OR;
	}

	if (PIO_bHandsetUp)
	{
		Slic_iCidStatus &= CID_STATUS_START_AND;
		Slic_iCidStatus |= CID_STATUS_FINISH_OR;
	}

#ifdef _USE_FXS_AM79R70
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] &= 0xfe;	// PIO0 = 0
	XBYTE[IO_LO_DOUT] |= 0x02;	// PIO1 = 1
	XBYTE[IO_LO_DOUT] &= 0xfb;	// PIO2 = 0
#else
	_bRinging = FALSE;
	XBYTE[IO_HI_ENABLE] |= SLIC_RING_OR_MASK;
	XBYTE[IO_HI_DOUT] &= SLIC_RING_AND_MASK;		// PIO14 = 0
#endif
}

void SlicRingHandleTimer(UCHAR iTimer)
{
	if (iTimer % 4 == 1)
	{
		SlicStopRing();
#ifdef _USE_FXS_AM79R70
//		if (!(Slic_iCidStatus & CID_STATUS_START_OR) && (Slic_iCidStatus & CID_STATUS_FINISH_OR))
//		{
			SlicIdleMode();
			SysSleep(10000);
			SlicOHTMode();
//		}
#endif
	}
	else if (iTimer % 4 == 0)
	{
		SlicStartRing();
	}
}

#endif	//	_USE_FXS

#ifdef _USE_FXS_AM79R70

void SlicIdleMode()
{
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] |= 0x01;	// PIO0 = 1
	XBYTE[IO_LO_DOUT] &= 0xfd;	// PIO1 = 0
	XBYTE[IO_LO_DOUT] |= 0x04;	// PIO2 = 1
}

void SlicOHTMode()
{
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] &= 0xfe;	// PIO0 = 0
	XBYTE[IO_LO_DOUT] |= 0x02;	// PIO1 = 1
	XBYTE[IO_LO_DOUT] &= 0xfb;	// PIO2 = 0
}

void SlicActiveMode()
{
	// Set SLIC into Active mode: C1=0, C2=1, C3=0
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] &= 0xfe;	// PIO0 = 0
	XBYTE[IO_LO_DOUT] |= 0x02;	// PIO1 = 1
	XBYTE[IO_LO_DOUT] &= 0xfb;	// PIO2 = 0

	// Set SLIC B2EN to use Vbat1
//	XBYTE[IO_HHI_ENABLE] = 0;
	XBYTE[IO_HHI_DOUT] = 0;		// PIO16 = 0
}

void SlicStandbyMode()
{
	// Set SLIC into Standby mode: C1=1, C2=0, C3=1
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] |= 0x01;	// PIO0 = 1
	XBYTE[IO_LO_DOUT] &= 0xfd;	// PIO1 = 0
	XBYTE[IO_LO_DOUT] |= 0x04;	// PIO2 = 1

	// Set SLIC B2EN to use Vbat1
	XBYTE[IO_HHI_ENABLE] = 1;
	XBYTE[IO_HHI_DOUT] = 1;		// PIO16 = 1
}

void SlicActivePRMode()		// Active Polarity Reversal
{
	// Set SLIC into Standby mode: C1=0, C2=1, C3=1
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] &= 0xfe;	// PIO0 = 0
	XBYTE[IO_LO_DOUT] |= 0x02;	// PIO1 = 1
	XBYTE[IO_LO_DOUT] |= 0x04;	// PIO2 = 1

	// Set SLIC B2EN to use Vbat1
//	XBYTE[IO_HHI_ENABLE] = 0;
	XBYTE[IO_HHI_DOUT] = 0;		// PIO16 = 0
}
/*
void SlicOHTPRMode()		// OHT Polarity Reversal
{
	// Set SLIC into Standby mode: C1=1, C2=1, C3=1
	XBYTE[IO_LO_ENABLE] |= SLIC_CTRL_OR_MASK;
	XBYTE[IO_LO_DOUT] |= 0x01;	// PIO0 = 1
	XBYTE[IO_LO_DOUT] |= 0x02;	// PIO1 = 1
	XBYTE[IO_LO_DOUT] |= 0x04;	// PIO2 = 1

	// Set SLIC B2EN to use Vbat1
//	XBYTE[IO_HHI_ENABLE] = 0;
	XBYTE[IO_HHI_DOUT] = 0;		// PIO16 = 0
}
*/
#endif	//	_USE_FXS_AM79R70

