//*****************************************************************
//* RC5 decode develop after read some articles on:
//* http://www.ustr.net/infrared/infrared1.shtml
//* http://www.sprut.de/electronic/ir/rc5.htm
//*****************************************************************
int rc5_receive(unsigned int * RC5addr, unsigned int * RC5data) 
{
#define TIME_MIN  (500)
#define TIME_MAX  (1100)
#define TIME_STEP (200)

    int           OffTime, OnTime, DevTime, DiTime, i, j, k;
    unsigned int  data = 0, addr = 0;
    unsigned int  bit_mask;

//#ifdef DEBUG
    unsigned char addr1, data1;
//#endif


    if (!IR)
    {
	for (OffTime = 0; !IR && OffTime < TIME_MAX; OffTime += TIME_STEP)
	{
	    DelayUs(TIME_STEP);
	}
	if (OffTime > TIME_MAX) return -1;
	if (OffTime < TIME_MIN) return -1;

	for (OnTime = 0; IR && OnTime < TIME_MAX; OnTime += TIME_STEP)
	{
	    DelayUs(TIME_STEP);
	}
	if (OnTime > TIME_MAX) return -1;
	if (OnTime < TIME_MIN) return -1;


	//********************************************
	//* skip token
	//********************************************
        DevTime = (2 * OffTime + OnTime + OffTime / 2);

        for (k = 0; k < DevTime; k += TIME_STEP)
	{
	    DelayUs(TIME_STEP);
	}

	//********************************************
	//* get address and data
	//********************************************
	DiTime  = (OffTime + OnTime);

	for (i = 0; i < 5; i++)
	{
	    if (IR) 
	    {
		addr <<= 1;
	    }
	    else
	    {
		addr <<= 1; addr |= 1;
	    }
	    for (k = 0; k < DiTime; k += TIME_STEP)
	    {
		DelayUs(TIME_STEP);
	    }
	}
	for (i = 0; i < 6; i++)
	{
	    if (IR) 
	    {
		data <<= 1;
	    }
	    else
	    {
		data <<= 1; data |= 1;
	    }
	    for (k = 0; k < DiTime; k += TIME_STEP)
	    {
		DelayUs(TIME_STEP);
	    }
	}

	*RC5data = data;
	*RC5addr = addr;

#ifdef DEBUG
	//*****************************************************
	//* only to dump the data received
	//*****************************************************
        data1 = data;
        addr1 = addr;

        tmp[0] = '<';

        bit_mask = 1 << (5 - 1);

   	for (i = 0; i < 5; i++)
  	{
  	    if ((addr1 & bit_mask) == 0)
		tmp[i+1] = '0';
	    else
		tmp[i+1] = '1';

  	    addr1 <<= 1;
   	}
        tmp[i+1] = '>';
	tmp[i+2] = '\0';

	WriteLCD( 2, 2, tmp);
	DelayMs(250);
	DelayMs(250);
	DelayMs(250);
	DelayMs(250);
#endif	
	return 0;
    }
    return -1;
}

int intToByte(int integer, unsigned char * byte1, unsigned char * byte2)
{
    *byte1 = (char)(integer >> 8);
    *byte2 = (char)(integer);

    return 0;
}

int byteToInt(unsigned char byte1, unsigned char byte2) 
{
    int integer;

    integer = byte1;
    integer <<= 8;
    integer |= byte2;

    return integer;
}