/**
  Copyright (c) 2008 Freescale Semiconductor
  Freescale Confidential Proprietary
  \file       Phy.c	
  \brief    	Physical Layer RF
  \author   	Freescale Semiconductor
  \author     Ioseph Martinez, b06623
  \author   	Guadalajara Applications Laboratory RTAC Americas
  \version    0.8
  \date     	29/Jan/2008
  \warning 

  * History:
  
*/
/*****************************************************************************/

#include "Phy.h"

UINT8 gu8PhyState = PHY_STATE_JOB_IDLE;


UINT8 *gu8PhyDataBuffer;
UINT8 gu8PhyLengthBuffer;
UINT8 gu8PhyDataBits;
UINT8 gu8PhyLength;
UINT8 gu8PhyIndex;
UINT8 gu8PhyToggle;



UINT8 u8fnPhyGetState(void)
{
  return gu8PhyState;
}

void static vfnPhyInternalBits(void)
{
  UINT8 temp;
  
  temp = !(gu8PhyDataBits&0x80);
  if(gu8PhyToggle){
    PHY_PINOUTPUT = (~PHY_PINOUTPUT); 
    gu8PhyLength--;
    gu8PhyDataBits = gu8PhyDataBits<<1; 
  } 
  else
  {
    PHY_PINOUTPUT = !temp;
  }
  
  gu8PhyToggle = !gu8PhyToggle; 
}

void vfnPhyTimerCall(void)
{
  if(gu8PhyState == PHY_STATE_JOB_BITS)
  {
    vfnPhyInternalBits();;
    if(!gu8PhyLength)
    {
      gu8PhyState = PHY_STATE_JOB_IDLE;  
    }
  } 
  else if(gu8PhyState == PHY_STATE_JOB_BYTES)
  { 
    vfnPhyInternalBits();
    if(!gu8PhyLength)
    {
      gu8PhyIndex++;
      gu8PhyDataBits = gu8PhyDataBuffer[gu8PhyIndex];
      gu8PhyLengthBuffer--;
      gu8PhyLength = 8;
      gu8PhyToggle = 0;
    }
    if(!gu8PhyLengthBuffer)
    {
      gu8PhyState = PHY_STATE_JOB_IDLE;  
    }  
  }
  else if(gu8PhyState == PHY_STATE_JOB_AGC)
  {
    PHY_PINOUTPUT = 1;
    gu8PhyLength--;
    if(!gu8PhyLength)
    {
      gu8PhyState = PHY_STATE_JOB_IDLE;  
    }
  }
  else if(gu8PhyState == PHY_STATE_JOB_DELAY)
  {
    PHY_PINOUTPUT = PHY_PINOUTPUT_IDLE;
    gu8PhyLength--;
    if(!gu8PhyLength)
    {
      gu8PhyState = PHY_STATE_JOB_IDLE;  
    }    
  }
  else
  {
    PHY_PINOUTPUT = PHY_PINOUTPUT_IDLE;  
  }
}

void vfnPhySendBits(UINT8 Data, UINT8 Length)
{
  gu8PhyState = PHY_STATE_JOB_BITS;
  gu8PhyDataBits = Data;
  gu8PhyLength = Length;
  gu8PhyToggle = 0;  
}


void vfnPhySendBytes(UINT8 *Data, UINT8 Length)
{
  gu8PhyState = PHY_STATE_JOB_BYTES;
  gu8PhyDataBuffer = Data;
  gu8PhyLengthBuffer = Length;
  gu8PhyDataBits = gu8PhyDataBuffer[0]; 
  gu8PhyIndex = 0;
  gu8PhyToggle = 0;
  gu8PhyLength = 8;
}

void vfnPhySendAGC(void)
{
  gu8PhyLength = 4;
  gu8PhyState = PHY_STATE_JOB_AGC; 
}

void vfnPhyBitDelay(void)
{
  gu8PhyLength = 4;
  gu8PhyState = PHY_STATE_JOB_DELAY; 
}

void vfnPhySendPID(void)
{

  vfnPhySendBits(0x08,8);
  while(gu8PhyState != PHY_STATE_JOB_IDLE){;}
/* 4 bits time delay between PID */
  vfnPhyBitDelay();
  while(gu8PhyState != PHY_STATE_JOB_IDLE){;}
}

void vfnPhySendMsg(UINT8 *Data, UINT8 Length)
{
/*Preamble is 2-bit 0b00,ID is 6-bit 0b001000 */
  vfnPhySendPID();
  vfnPhySendPID();
  vfnPhySendPID();
/*Preamble is 2-bit 0b00,header is 4-bit 0b0110 */
  vfnPhySendBits(0x18,6);
  while(gu8PhyState != PHY_STATE_JOB_IDLE){;}
  vfnPhySendBytes(Data, Length);
  while(gu8PhyState != PHY_STATE_JOB_IDLE){;}    
}