#ifndef _LC72131_H
#define _LC72131_H

#include "hardware.h"
#include "ksh148.h"

unsigned char Stereo_Mono = WFM_STEREO;
unsigned char StereoMono_In;
unsigned char SignalFM_IN = WFM_IN;
uint32_t FrcvSQL = 0;
uint16_t fPCH2_tek; 
uint8_t  flagBo_tek = 0;

///////////////////////////////
void BusPause(void) 
{ 
   _delay_us(8);
   return; 
}

///////////////////
void BusStrob(void)
{
   BusPause();
   SetBit(LC72131_Port,CL);
   BusPause();
   ClrBit(LC72131_Port,CL);
}

///////////////////////////
void BusOutH2L(uint8_t Bus)
{
    uint8_t i;

    for(i=0; i < 8; i++)
    {
      if(Bus & 0x80)
	     SetBit(LC72131_Port,DI);
      else
	     ClrBit(LC72131_Port,DI);
      BusStrob();
      Bus <<= 1;
    }
    return;
}

///////////////////////////
void BusOutH2L_4Bit(uint8_t Bus)
{
    uint8_t i;

    for(i=0; i < 4; i++)
    {
      if(Bus & 0x08)
	     SetBit(LC72131_Port,DI);
      else
	     ClrBit(LC72131_Port,DI);
      BusStrob();
      Bus <<= 1;
    }
    return;
}


///////////////////////////
void BusOutL2H(uint8_t Bus)
{
  uint8_t i;

  for(i=0; i < 8; i++)
  {
      if(Bus & 0x01)
	     SetBit(LC72131_Port,DI);
      else
	     ClrBit(LC72131_Port,DI);
      BusStrob();
      Bus >>= 1;
  }
  return;
}

///////////////////////////
// Читает байт с шины DO микросхемы LC72131, старший бит идет первым.
uint8_t BusINL2H(void)
{
   uint8_t i;
   uint8_t Bus = 0;

   for(i=0; i < 8; i++)
   {
      Bus <<= 1;
      if (GetState(LC72131_IN, DO) != 0)
         Bus |= 0x01;
      BusStrob();
   }
   return Bus;
}

#define LC72131_IN1 0x14 // 00010100
#define LC72131_IN2 0x94 // 10010100
#define LC72131_OUT 0x2A // 01010100


////////////////////
void Lc72131Set(void)
{
     uint8_t  dev = 1;
	 uint8_t  cnt = 0xDD;
	 uint16_t fPCH2;    

     if(FindStep)
     {
       dev = 5;
       cnt = 0xD5;	   
     }

     FrcvPCH2 = (RCVPCH1+RCVPCH2) -(FrcvWork-((FrcvWork/50)*50));
     fPCH2 = FrcvPCH2/dev;
	 fPCH2 = fPCH2/2; 

     fPCH2_tek = fPCH2;

     BusOutH2L(LC72131_IN1);

     SetBit(LC72131_Port,CE);

     BusOutL2H(LoBYTE(fPCH2));
     BusOutL2H(HiBYTE(fPCH2));

	  ///////////////////////////////////////
	  //
	  //  -- Lc72131 IN1 --
	  //
	  ///////////////////////////////////////
	  //
	  //  SNS DVS CTE XS R0 R1 R2 R3
	  //
	  //  R0=0, R1=0, R2=1, R3=0  --> 12,5kHz
	  //  R0=1, R1=1, R2=0, R3=0  --> 25  kHz
	  //  R0=1, R1=0, R2=1, R3=1  --> 15  kHz
	  //  R0=0, R1=0, R2=0, R3=1  --> 10  kHz
	  //  R0=0, R1=1, R2=0, R3=1  -->  5  kHz
	  //  R0=1, R1=1, R2=0, R3=1  -->  1  kHz
	  //
	  //  SNS=1,DVS=1 --> FMIN
	  //
	  //  XS=1 --> 7,2 mHz
	  //
	  //  CTE=1 --> IF counter start
	  //  CTE=0 --> IF counter reset
	  //
	  //  11010010 0xD2 -> 12,5 kHz
	  //  
	  //  11010101 0xD5 ->  5,0 kHz
	  //  11011101 0xDD ->  1,0 kHz

     BusOutH2L(cnt);  // 0x95 -> 5kHz

     ClrBit(LC72131_Port,CE);

	  ///////////////////////////////////////
	  //
	  //  -- Lc72131 IN2 --
	  //
	  ///////////////////////////////////////
	  //  IOC1 IOC2 IO1 IO2 BO1 BO2 BO3 BO4
	  //
	  //  BO1 BO2 BO3 BO4 = 0 -> open
	  //  BO1 BO2 BO3 BO4 = 1 -> low
	  //
	  //  IOC1 IOC2 = 0 -> input  mode IO1 IO2
	  //  IOC1 IOC2 = 1 -> output mode IO1 IO2
	  //
	  //  11000001 --> 0xC1
	  //
	  ////////////////////////////////////////
	  //  DNC DOC0 DOC1 DOC2 UL0 UL1 DZ0 DZ1
	  //
	  //  0   0    0    0    0   0   0    0
	  //
	  ////////////////////////////////////////
	  //  GT0 GT1 TBC DLC IFS TEST0 TEST1 TEST2
	  //
	  //  0   0   0   x   1   0     0     0

     BusOutH2L(LC72131_IN2);

      SetBit(LC72131_Port,CE);

      //flagBo = Mod4Lc72131[Modulation];

     // if(!FlagMute) { flagBo |= 0x04; }
     if(Stereo_Mono == WFM_MONO)
	 	 flagBo |= 0x01;
     else
         flagBo &= ~0x01;		 
	 	 
     flagBo_tek = flagBo;
     BusOutH2L(flagBo);
     BusOutH2L(0x00);
     BusOutH2L(0x08);

     ClrBit(LC72131_Port,CE);

     return;
}

////////////////////
void Lc72131Get(void)
{
    uint8_t IO;

    BusOutL2H(LC72131_OUT);

    SetBit(LC72131_Port,CE);
	BusPause(); 
	
	IO = BusINL2H();
	BusINL2H();
	BusINL2H();
	
	StereoMono_In = (IO&0x40)>>6;
	SignalFM_IN   = (IO&0x80)>>7;
	
	ClrBit(LC72131_Port,CE);
}


uint32_t tiks = 0;
////////////////////
void LC72131GetFreq(void)
{
    uint8_t IO2, IO1, IO0;
	uint32_t tmp;
	uint8_t  cnt = 0xFD;	   

    if(FindStep)
       cnt = 0xF5;
    
	BusOutH2L(LC72131_IN2);    
	SetBit(LC72131_Port,CE); 
    BusOutH2L(flagBo_tek);
    BusOutH2L(0x20);
    BusOutH2L(0x08);
    ClrBit(LC72131_Port,CE);

    BusOutH2L(LC72131_IN1);
    SetBit(LC72131_Port,CE);
    BusOutL2H(LoBYTE(fPCH2_tek));
    BusOutL2H(HiBYTE(fPCH2_tek));	
    BusOutH2L(cnt);  // 0x95 -> 5kHz
    ClrBit(LC72131_Port,CE); 
   	
	_delay_ms(4);	
	_delay_us(100);
	     
    BusOutL2H(LC72131_OUT);

    SetBit(LC72131_Port,CE);
	BusPause(); 
	
	IO2 = BusINL2H();
	IO1 = BusINL2H();
	IO0 = BusINL2H();	
	
	ClrBit(LC72131_Port,CE);
	
	FrcvSQL = 0;
	tmp = IO2;
	tmp = (tmp&0x0F)<<16;	
	FrcvSQL = (uint32_t)tmp;
	tmp = IO1;
	tmp = tmp<<8;
	FrcvSQL = FrcvSQL|(uint32_t)tmp;
	tmp = IO0;
	FrcvSQL = FrcvSQL|(uint32_t)tmp;
	
	cnt = 0xDD;
	if(FindStep)
       cnt = 0xD5;
	
	BusOutH2L(LC72131_IN1);
    SetBit(LC72131_Port,CE);
    BusOutL2H(LoBYTE(fPCH2_tek));
    BusOutL2H(HiBYTE(fPCH2_tek));	
    BusOutH2L(cnt);  // 0x95 -> 5kHz
    ClrBit(LC72131_Port,CE); 
}

#endif