//////////////////////////////////
// tef6901ah tuner chip routines

//////////////////////////////////



int1 station_searching;
char module_initializing;

unsigned int16 c_PLL;
char c_band,w_band;
float w_freq3;
float w_PLL2;
float w_freq2;


//
unsigned int8 rbyte0,rbyte1,rbyte2,rbyte3,rbyte4,rbyte5,rbyte6;
unsigned int16 level_tt;

unsigned int8 tas;
int1 ifcapg;
char ifcap_val,ifcf_val,init_val,volume_val;
//char r_LEV;
char level;


char read_tef(void);
char write_tef(char msa_wr, char data_wr);
char write_tun(char w_band5, unsigned int16 w_PLL5);
char init_tef(void);

char tun_goto_freq(char w_band2,float w_freq);
char tun_goto_PLL(char w_band3, unsigned int16 w_PLL);
char tun_seek(int1 seek_dir);
char read_level(int1 level_mode);

void change_band(void);
#inline
void show_freq(void);

void ifcap_align(void);
void ifcf_align(void);
void init_circuitA(void);
void init_circuitB(void);
void init_circuitC(void);

///////////////////////////////////////////////////////////////////////////////////////////////////////
char read_tef() {

rbyte0=0;rbyte1=0;rbyte2=0;rbyte3=0;rbyte4=0;rbyte5=0;rbyte6=0;

i2c_start(tef);
	
if ((i2c_write(tef,0xc3))==1){fprintf(ser2,"%s","err01 ");return 1;}		// return error code 1 when no ack 

rbyte0=i2c_read(tef,1);
rbyte1=i2c_read(tef,1);
rbyte2=i2c_read(tef,1);
rbyte3=i2c_read(tef,1);
rbyte4=i2c_read(tef,1);
rbyte5=i2c_read(tef,1);

rbyte6=i2c_read(tef,0);

i2c_stop(tef);
//
stin = bit_test(rbyte3,2);
tas = rbyte3&0x03;
ifcapg = bit_test(rbyte5,7);

fprintf(ser2,"stin= %u* ",stin);
fprintf(ser2,"tas= %u* ",tas);
fprintf(ser2,"%u %u %u %u %u %u %u \n\r",rbyte0,rbyte1,rbyte2,rbyte3,rbyte4,rbyte5,rbyte6);

return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char write_tef(char msa_wr, char data_wr)
{
 
i2c_start(tef);
if ((i2c_write(tef,0xc2))==1){return 1;}			// return error code 1 when no ack 
  
if ((i2c_write(tef,msa_wr))==1){return 2;}
if ((i2c_write(tef,data_wr))==1){return 3;}	
i2c_stop(tef);


return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char write_tun(char w_band5, unsigned int16 w_PLL5)
{
char bw,pllm,plll,daa,agc,band;

bw=0xfe;
daa=0x60;
agc=0x0c;

if (w_band5==0){band=0x20;}			// FM
else if (w_band5==1){band=0xec;}	// MW
else if (w_band5==2){band=0xec;}	// LW
else if (w_band5==3){band=0xd0;}	// SW1
else if (w_band5==4){band=0xb0;}	// SW2
else if (w_band5==5){band=0x90;}	// SW3
else if (w_band5==6){band=0x70;}	// SW4

plll=w_PLL5;
pllm=w_PLL5>>8;

i2c_start(tef);
if ((i2c_write(tef,0xc2))==1){return 4;}	// return error code 4 when no ack 	
  
if ((i2c_write(tef,0x20))==1){return 5;}	
if ((i2c_write(tef,bw))==1){return 6;}	
if ((i2c_write(tef,pllm))==1){return 7;}
if ((i2c_write(tef,plll))==1){return 8;}
if ((i2c_write(tef,daa))==1){return 9;}	
if ((i2c_write(tef,agc))==1){return 10;}	
if ((i2c_write(tef,band))==1){return 11;}

i2c_stop(tef);


return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char init_tef()
{

// check IFCAP	
// fram address 0x01fe
ifcap_val = read_fram(0x01fe);
if (ifcap_val==0xff){ifcap_val=8;}


// check IFCF	
// EEPROM address 0x01fd
ifcf_val = read_fram(0x01fd);
if (ifcf_val==0xff){ifcf_val=32;}

// check volume	
// EEPROM address 0x01ff
volume_val = read_fram(0x01ff);
if (volume_val==0xff){volume_val=30;}


write_tef(0x20,0xfe);	// bandwidth
write_tef(0x21,0x08);	// PLLM
write_tef(0x22,0x5e);	// PLLL		085e= 96.4MhZ
write_tef(0x23,0x60);	// DAA
write_tef(0x24,0x0c);	// AGC
write_tef(0x25,0x20);	// BAND: FM, FREF=100khZ, hi injection
//write_tef(0x25,0xec);	// BAND: AM
//
//
write_tef(0x26,0x84);	// 
write_tef(0x27,ifcf_val);	// IFCF
write_tef(0x28,ifcap_val);	// IFCAP
write_tef(0x29,0x4a);	// ACD
write_tef(0x2a,0x85);	// SENSE, weak signal
write_tef(0x2b,0x66);	// 
write_tef(0x2c,0x7c);	// SNC
write_tef(0x2d,0x6f);	// HIGHCUT

write_tef(0x2e,0x6a);	// SOFTMUTE
//write_tef(0x2f,0x09);	// RADIO: stereo, direct RDS
write_tef(0x2f,0x19);	// RADIO: stereo, buffered RDS
write_tef(0x30,0x0a);	// INPUT: radio, db... muted

write_tef(0x31,volume_val);	// VOLUME
write_tef(0x32,0x0c);	// 
write_tef(0x33,0x0c);	// 
write_tef(0x34,0x00);	// 
write_tef(0x35,0x03);	// OUTPUT: rear muted
write_tef(0x36,0x80);	// 
write_tef(0x37,0x1c);	// LOUDNESS on

write_tef(0x38,0x06);	// power

write_tef(0x39,0x00);	// reserved
write_tef(0x3a,0x00);	// 
write_tef(0x3b,0x00);	// 
write_tef(0x3c,0x00);	// 
write_tef(0x3d,0x00);	// 
write_tef(0x3e,0x00);	// 
write_tef(0x3f,0x00);	// test

output_bit(tef_rdcl,1);


// check INIT
// fram address 0xfc
init_val = read_fram(0x01fc);
if (init_val==0xff){				
				init_circuitA();
				init_circuitB();
				init_circuitC();
				}




return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
char tun_goto_freq(char w_band2,float w_freq)
{
float w_PLL2;
unsigned int16 w_PLL3;
float w_freq2;

if(w_band2==0){		// FM
			//fprintf(ser2," **w_freq=%f** ",w_freq);
			w_freq2 = w_freq*1000000;
			if((w_freq<=87.45)||(w_freq>=108.05)){return 1;}	// FM band 87.5 .. 108.0 MhZ
			w_PLL2 = ((w_freq2+10700000)*2) / 100000;		// FM, high side injection
			w_PLL3 = (unsigned int16)w_PLL2;

			}

else if((w_band2==1)||(w_band2==2)){		// MW or LW
			w_freq2 = w_freq*1000;
			if((w_freq<=143)||(w_freq>=1711)){return 1;}		// MW band 522 .. 1710 khZ
			w_PLL2 = ((w_freq2+10700000)*20) / 20000;		// AM
			w_PLL3 = (unsigned int16)w_PLL2;
			
			//write_tef(0x25,0xec);	// BAND: MW or LW
			}

else if(w_band2==3){		// SW1
			w_freq2 = w_freq*1000;
			if((w_freq<=2299)||(w_freq>=5101)){return 1;}		// SW1 band 2300 .. 5100 khZ
			w_PLL2 = ((w_freq2+10700000)*16) / 10000;		// AM
			w_PLL3 = (unsigned int16)w_PLL2;
			
			//write_tef(0x25,0xd0);	// BAND: SW1
			}

else if(w_band2==4){		// SW2
			w_freq2 = w_freq*1000;
			if((w_freq<=5799)||(w_freq>=13871)){return 1;}		// SW2 band 5800 .. 13870 khZ
			w_PLL2 = ((w_freq2+10700000)*10) / 10000;		// AM
			w_PLL3 = (unsigned int16)w_PLL2;
			
			//write_tef(0x25,0xb0);	// BAND: SW2
			}

else if(w_band2==5){		// SW3
			w_freq2 = w_freq*1000;
			if((w_freq<=11499)||(w_freq>=19021)){return 1;}		// SW3 band 11500 .. 19020 khZ
			w_PLL2 = ((w_freq2+10700000)*8) / 10000;		// AM
			w_PLL3 = (unsigned int16)w_PLL2;
			
			//write_tef(0x25,0x90);	// BAND: SW3
			}

else if(w_band2==6){		// SW4
			w_freq2 = w_freq*1000;
			if((w_freq<=17479)||(w_freq>=26101)){return 1;}		// SW4 band 17480 .. 26100 khZ
			w_PLL2 = ((w_freq2+10700000)*6) / 10000;		// AM
			w_PLL3 = (unsigned int16)w_PLL2;
			
			//write_tef(0x25,0x70);	// BAND: SW4
			}

//fprintf(ser2," **w_PLL3=%lu** ",w_PLL3);


write_tun(w_band2, w_PLL3);

c_band = w_band2;
c_freq = w_freq;
c_PLL = w_PLL3;


if (c_band==0){rds_init();}				//
show_freq();
nokia_erase_y(4);
nokia_erase_y(5);
read_level(1);

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
char tun_goto_PLL(char w_band3, unsigned int16 w_PLL4)
{
unsigned int32 w_PLL3;


if(w_band3==0){		// FM
			w_PLL3 = ((unsigned int32)(w_PLL4));		
			w_PLL3*=50000;			// 100000/2
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000000;
			}

if((w_band3==1)||(w_band3==2)){		// MW or LW
			w_PLL3 = ((unsigned int32)(w_PLL4));	
			w_PLL3*=1000;			// 20000/20
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000;
			
			//write_tef(0x25,0xec);	// BAND: MW or LW
			}

if(w_band3==3){		// SW1
			w_PLL3 = ((unsigned int32)(w_PLL4));	
			w_PLL3*=625;			// 10000/16
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000;
			
			//write_tef(0x25,0xd0);	// BAND: SW1
			}

if(w_band3==4){		// SW2
			w_PLL3 = ((unsigned int32)(w_PLL4));	
			w_PLL3*=1000;			// 10000/10
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000;
			
			//write_tef(0x25,0xb0);	// BAND: SW2
			}

if(w_band3==5){		// SW3
			w_PLL3 = ((unsigned int32)(w_PLL4));	
			w_PLL3*=1250;			// 10000/8
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000;
			
			//write_tef(0x25,0x90);	// BAND: SW3
			}

if(w_band3==6){		// SW4
			w_PLL3 = ((unsigned int32)(w_PLL4));	
			w_PLL3*=1666.6666667;			// 10000/6
			w_PLL3-=10700000;
			w_PLL2 = ((float)(w_PLL3));
			w_freq2 = w_PLL2/1000;
			
			//write_tef(0x25,0x70);	// BAND: SW4
			}


write_tun(w_band3, w_PLL4);

c_band = w_band3;
c_freq = w_freq2;
//fprintf(ser2," w_PLL4=%Lu ",w_PLL4);
//fprintf(ser2," w_PLL3=%lu ",w_PLL3);
//fprintf(ser2," w_PLL2=%f ",w_PLL2);
//fprintf(ser2," c_freq=%f ",c_freq);

c_PLL = w_PLL4;


if (c_band==0){rds_init();}				//
show_freq();
nokia_erase_y(4);
nokia_erase_y(5);
read_level(1);

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////

char tun_seek(int1 seek_dir)
{


//
if(seek_dir){						// tuning step up
			
			if (c_band==0){w_freq3=c_freq+0.05;}
			else if ((c_band==1)||(c_band==2)){w_freq3=c_freq+1;}
			else if (c_band==3){w_freq3=c_freq+0.625;}
			else if (c_band==4){w_freq3=c_freq+1;}
			else if (c_band==5){w_freq3=c_freq+1.25;}
			else if (c_band==6){w_freq3=c_freq+1.67;}
			}
//
else if (!seek_dir){				// step down
					
					if (c_band==0){w_freq3=c_freq-0.05;}
					else if ((c_band==1)||(c_band==2)){w_freq3=c_freq-1;}
					else if (c_band==3){w_freq3=c_freq-0.625;}
					else if (c_band==4){w_freq3=c_freq-1;}
					else if (c_band==5){w_freq3=c_freq-1.25;}
					else if (c_band==6){w_freq3=c_freq-1.67;}
					}		
//

//fprintf(ser2," ****w_freq3=%f**** ",w_freq3);
//fprintf(ser2," ****FM %3.2g MhZ****",c_freq+0.001);

tun_goto_freq(c_band,w_freq3);

//show_freq();
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
char read_level(int1 level_mode)
{
if (level_mode==1){goto level_cont;}

if (level_tt!=500){level_tt++;return 1;}
else {level_tt=0;}


level_cont:

//if (level_tt>=500){level_tt=0;}
//else if (level_tt>=1){level_tt++;return 1;}
//else if (level_tt==0){level_tt=1;}

i2c_start(tef);
if ((i2c_write(tef,0xc3))==1){return 1;}		// return error code 1 when no ack 
rbyte0=i2c_read(tef,1);
rbyte1=i2c_read(tef,1);
rbyte2=i2c_read(tef,1);
rbyte3=i2c_read(tef,0);
i2c_stop(tef);

stin = bit_test(rbyte3,2);
level=rbyte1;


//printf(nokia_printchar,"%03u",level);
fprintf(ser2," level=%03u\n\r",level);

nokia_gotoxy(60,4);
if(level==0){printf(nokia_printchar,"%s","---");}
else {printf(nokia_printchar,"%3lu",(unsigned int32)level);}

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////

void change_band()
{
fprintf(ser2," ** band change from %u ** ",c_band);
preset_char= '*';

if (c_band==0){tun_goto_freq(1,648);}						// goto BAND 1: MW
else if (c_band==1){tun_goto_freq(2,235);}					// goto BAND 2: LW
else if (c_band==2){tun_goto_freq(3,2300);}					// goto BAND 3: SW1
else if (c_band==3){tun_goto_freq(4,7880);}					// goto BAND 4: SW2
else if (c_band==4){tun_goto_freq(5,11500);}				// goto BAND 5: SW3
else if (c_band==5){tun_goto_freq(6,26000);}				// goto BAND 6: SW4
//else if (c_band==6){tun_goto_freq(0,92.0);rds_init();}		// goto BAND 0: FM
else if (c_band==6){tun_goto_freq(0,92.0);}		// goto BAND 0: FM

//
//



}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#inline
void show_freq()
{


if(c_band==0){			// FM band 87.5 .. 108.0 MhZ

				fprintf(ser2,"\n\r FM %3.2g MhZ",c_freq+0.002);
				nokia_gotoxy(0,0);x_pos=0; 
				//fprintf(ser2,"\n\r fase1");
				if((c_freq+0.001)<100){	//fprintf(ser2,"\n\r fase2a");
										printf(nokia_print_DMM_digit,"%2.2g",c_freq+0.002);
										//fprintf(ser2,"\n\r fase2a1");
										nokia_gotoxy(39,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0); 
                  						//fprintf(ser2,"\n\r fase2a2");
										nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
										//fprintf(ser2,"\n\r fase2a3");
										}
				else{	//fprintf(ser2,"\n\r fase2b");
						printf(nokia_print_DMM_digit,"%3.1g",c_freq+0.002);
						nokia_gotoxy(39,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
						nokia_gotoxy(59,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);  
					}

				//fprintf(ser2,"\n\r fase3");
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				//fprintf(ser2,"\n\r fase4");
				printf(nokia_printchar,"%s","FM ");
				//fprintf(ser2,"\n\r fase5");
				printf(nokia_printchar,"%c",preset_char);
				//fprintf(ser2,"\n\r fase6");
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				//fprintf(ser2,"\n\r fase7");
				}


else if(c_band==1){		//MW band 522 .. 
				fprintf(ser2," MW %4.2g khZ",c_freq);
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%3.1g",c_freq+0.001);
				nokia_gotoxy(39,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
				nokia_gotoxy(59,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","MW ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","khZ");

				}


else if(c_band==2){		//LW ...1710 khZ
				fprintf(ser2," LW %3.2g khZ",c_freq);
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%3.1g",c_freq+0.001);
				nokia_gotoxy(39,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
				nokia_gotoxy(59,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","LW ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","khZ");



				}



else if(c_band==3){		// SW1 band 2300 .. 5100 khZ
				fprintf(ser2," SW1 %4.2g MhZ",c_freq);
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%3.1g",(c_freq+0.001)/10);
				nokia_gotoxy(39,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
				nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","SW1 ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","khZ");
			

				}


else if(c_band==4){		// SW2 band 5800 .. 13870 khZ
				fprintf(ser2," SW2 %5.2g MhZ",c_freq);
	if(c_freq<10000){
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%3.1g",(c_freq+0.001)/10);
				nokia_gotoxy(39,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);
				nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","SW2 ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","khZ");
					}		
	else if(c_freq>=10000){		
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%2.2g",(c_freq+0.001)/1000);
				nokia_gotoxy(39,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);
				nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","SW2 ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","MhZ");
						}					
				}

else if(c_band==5){		// SW3 band 11500 .. 19020 khZ
				fprintf(ser2," SW3 %5.2g MhZ",c_freq);
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%2.2g",(c_freq+0.001)/1000);
				nokia_gotoxy(39,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);
				nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","SW3 ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","MhZ");


				}

else if(c_band==6){		// SW4 band 17480 .. 26100 khZ
				fprintf(ser2," SW4 %5.2g MhZ",c_freq);
				nokia_gotoxy(0,0);x_pos=0; 
				printf(nokia_print_DMM_digit,"%2.2g",(c_freq+0.001)/1000);
				nokia_gotoxy(39,2);nokia_write_data(0xe0);nokia_write_data(0xe0);nokia_write_data(0xe0);
				nokia_gotoxy(59,2);nokia_write_data(0x00);nokia_write_data(0x00);nokia_write_data(0x00);  
				nokia_erase_y(3);
				nokia_gotoxy(0,3);neg_lcd=0;
				printf(nokia_printchar,"%s","SW4 ");
				printf(nokia_printchar,"%c",preset_char);
				printf(nokia_printchar,"%lu  ",(unsigned int32)preset);
				nokia_gotoxy(65,3);neg_lcd=0;
				printf(nokia_printchar,"%s","MhZ");

				}







}




//////////////////////////////////////////////////////////////////////////////////////////////////////
void ifcap_align()	// ala
{
char ifcap_val2;


nokia_clean_ddram();
nokia_gotoxy(10,5);printf(nokia_printchar,"%s","IFCAP align 1");
fprintf(ser2,"%s"," IFCAP align 1 ");
delay_ms(1000);

for (ifcap_val2=0x0f;ifcap_val2!=0;ifcap_val2--){
											write_tef(0x28,(ifcap_val2|0x80));
											read_tef();
											if (!ifcapg){
														ifcap_val=ifcap_val2;
														break;
														}
												}

write_tef(0x28,(ifcap_val&0x0f));
//fprintf(ser2," ifcap_val= %3u ",ifcap_val);

write_fram(0x01fe,ifcap_val);

fprintf(ser2," IFCAP=%3u  ",ifcap_val);

nokia_erase_y(5);
nokia_gotoxy(10,5);printf(nokia_printchar,"%s","IFCAP=");
printf(nokia_printchar,"%3lu",(unsigned int32)ifcap_val);


delay_ms(2000);
nokia_erase_y(5);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void ifcf_align()	// alb
{
char i;
char ifcf_val2,ifcf_val3;
char ifcf_lev_under[65];
char ifcf_lev_over[65];
int1 ifcf_set;
char level;
signed int8 ifcf_diff[65],ifcf_diff2;
signed int8 cf_v;

ifcap_val=8;	// set to center position;
ifcf_val=32;

write_tef(0x27,ifcf_val);	// IFCF
write_tef(0x28,ifcap_val);	// IFCAP

ifcf_set=0;

nokia_clean_ddram();
nokia_gotoxy(10,5);printf(nokia_printchar,"%s","IFCF align");
fprintf(ser2,"%s"," IFCF align ");
delay_ms(1000);

//tun_goto_freq(0,98.00);		// please tune to a station in the middle of FM band

write_tef(0x27,0x80);		// IFCFA to 1
delay_ms(100);
write_tef(0x27,0xc0);		// IFNBW to 1
delay_ms(100);
//
c_freq-=0.05;
tun_goto_freq(0,c_freq);		// tune to RF -50khZ
delay_ms(100);
//
for (ifcf_val2=0;ifcf_val2!=64;ifcf_val2++){
											write_tef(0x27,ifcf_val2);delay_ms(100);
											i2c_start(tef);
											if ((i2c_write(tef,0xc3))==1){nop;}		
											rbyte0=i2c_read(tef,1);
											rbyte1=i2c_read(tef,0);
											i2c_stop(tef);
											level=rbyte1;
											ifcf_lev_under[ifcf_val2] = level;
											fprintf(ser2," u%u=%u ",ifcf_val2,ifcf_lev_under[ifcf_val2]);
											nokia_gotoxy(10,5);printf(nokia_printchar,"%s","Please wait");
											}
//
tun_goto_freq(0,c_freq+0.10);		// tune to RF +50khZ
delay_ms(100);

//
for (ifcf_val2=0;ifcf_val2!=64;ifcf_val2++){
											write_tef(0x27,ifcf_val2);delay_ms(100);
											i2c_start(tef);
											if ((i2c_write(tef,0xc3))==1){nop;}	
											rbyte0=i2c_read(tef,1);
											rbyte1=i2c_read(tef,0);
											i2c_stop(tef);
											level=rbyte1;
											ifcf_lev_over[ifcf_val2] = level;
											fprintf(ser2," o%u=%u ",ifcf_val2,ifcf_lev_over[ifcf_val2]);
											nokia_gotoxy(10,5);printf(nokia_printchar,"%s","Please wait");
											}
//

for (i=0;i!=64;i++){
					ifcf_diff[i]= ifcf_lev_over[i] - ifcf_lev_under[i];
					fprintf(ser2," diff%d ",ifcf_diff[i]);
					}
//


for(cf_v=0;cf_v!=50;cf_v++){
							if(ifcf_set==1){break;}
							fprintf(ser2," cf_v=%u ",cf_v);

							for (i=5;i!=60;i++){
												ifcf_diff2 = ifcf_diff[i];
												ifcf_val3=i;
												if ((ifcf_diff2>=-cf_v)&&(ifcf_diff2<=cf_v)){ifcf_set=1;break;}
												}


								}
////


//ifcf_val3=16;	// test


write_tef(0x27,ifcf_val3);		// IFCFA to 0 and IFNBW to 0
delay_ms(100);


//ifcf_val=ifcf_val3-4;
ifcf_val=ifcf_val3;

//printf("ifcf_val= %u ",ifcf_val);
fprintf(ser2," IFCF=%3u   ",ifcf_val);

nokia_erase_y(5);
nokia_gotoxy(10,5);printf(nokia_printchar,"%s","IFCF=");printf(nokia_printchar,"%3lu",(unsigned int32)ifcf_val);


write_fram(0x01fd,ifcf_val);

delay_ms(2000);
nokia_erase_y(5);

tun_goto_freq(0,c_freq-0.05);		// tune to RF 


}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void init_circuitA()
{

module_initializing=0;

OUTPUT_D(0x800);
nop;nop;

SET_TRIS_D(0x3ff);
OUTPUT_BIT(joy_com,1);
nop;nop;




write_tef(0x30,0x00);	// INPUT: radio, db... 
write_tef(0x35,0x00);	// OUTPUT: not muted

//blank_displays();
nokia_clean_ddram();
//nokia_gotoxy(0,2);printf(nokia_printchar,"%s","Starting....");
//nokia_gotoxy(0,3);printf(nokia_printchar,"%s","init");


//
/*
for(fix=0;fix!=9;fix++){
						tun_goto_freq(0,f_radio[fix]);
						delay_ms(100);
						get_level();	// level = signal level 0..255
						lcd_module_display();
						if(level>=220){break;}
						}
*/


//blank_displays();
nokia_clean_ddram();
nokia_gotoxy(1,0);printf(nokia_printchar,"%s","IFCF align? ");
nokia_gotoxy(1,3); printf(nokia_printchar,"%s","ENTER: accept");
nokia_gotoxy(1,4); printf(nokia_printchar,"%s","< > to cancel ");


fprintf(ser2,"%s","\n\r **IFCF align?** ");
fprintf(ser2,"%s"," ENTER to accept");
fprintf(ser2,"%s"," < > to cancel \n\r");

while(INPUT(right)==1){;}
while(INPUT(enter)==1){;}
module_initializing=1;

while((INPUT(left)==0)&&(INPUT(right)==0)&&(INPUT(enter)==0)){nop;}
if(INPUT(enter)!=1){goto initA_end;}

// IFCAP	
ifcap_align();

nokia_clean_ddram();
nokia_gotoxy(1,0);printf(nokia_printchar,"%s","* IFCF align *");
nokia_gotoxy(1,2);printf(nokia_printchar,"%s","Please tune to");
nokia_gotoxy(1,3);printf(nokia_printchar,"%s","a known freq  " );
nokia_gotoxy(1,4);printf(nokia_printchar,"%s","near 98.0 MhZ ");
nokia_gotoxy(1,5);printf(nokia_printchar,"%s","+ press ENTER.");

fprintf(ser2,"%s","\n\r*** IFCF align  *** ");
fprintf(ser2,"%s","Please tune to a ");
fprintf(ser2,"%s","known station near 98.0 MhZ ");
fprintf(ser2,"%s","and press ENTER.\n\r ");


while(INPUT(enter)==1);
delay_ms(2500);
//blank_displays();
nokia_clean_ddram();
//nokia_gotoxy(1,1);printf(nokia_printchar,"                   ");

c_freq=98.0;tun_goto_freq(0,98.0);
//lcd_module_display();
//nokia_lcd_display();
nokia_gotoxy(0,3);printf(nokia_printchar,"%s","tune+ENTER");


while(INPUT(enter)==0){

					if(INPUT(left)==1){
										while(INPUT(left)==1){delay_ms(5);}
										preset_char= '*';	//tun_seek(0);
										c_freq-=0.05;
										tun_goto_freq(0,c_freq);
									}
					else if(INPUT(right)==1){
										while(INPUT(right)==1){delay_ms(5);}
										preset_char= '*';//tun_seek(1);
										c_freq+=0.05;
										tun_goto_freq(0,c_freq);
										}	

					module_initializing=2;
					
					}




//nokia_gotoxy(1,1);printf(nokia_printchar,"                    ");
//blank_displays();




initA_end:

//////////////
release_joystick();


//nokia_gotoxy(1,1);printf(nokia_printchar,"                    ");
//blank_displays();


}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void init_circuitB()
{

if(module_initializing!=2){return;}

//  IFCF	
ifcf_align();
//delay_ms(1000);

// IFCAP	2nd pass
ifcap_align();

write_fram(0x01fc,0x01);	// init_value enabled

}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void init_circuitC()
{
unsigned int16 rtt;
float search_freq;
char init_ok;
//float f_radio[9]={97.90,98.60,93.70,97.50,100.10,100.60,100.90,101.80,102.10};
char fix,level_1,level_2;

init_ok=0;


OUTPUT_D(0x800);
nop;nop;

SET_TRIS_D(0x3ff);
OUTPUT_BIT(joy_com,1);
nop;nop;


//blank_displays();
nokia_clean_ddram();
nokia_gotoxy(1,1);printf(nokia_printchar,"%s","Init presets?");
nokia_gotoxy(1,3);printf(nokia_printchar,"%s","ENTER: accept");
nokia_gotoxy(1,4);printf(nokia_printchar,"%s","< > to cancel");
fprintf(ser2,"%s"," **Init presets?** ");
fprintf(ser2,"%s"," Push ENTER to accept ");
fprintf(ser2,"%s"," Press < > to cancel ");


while((INPUT(left)==0)&&(INPUT(right)==0)&&(INPUT(enter)==0)){;}
if(INPUT(enter)==1){
			//nokia_gotoxy(1,1);printf(nokia_printchar,"                    ");
			//blank_displays();
			//for(ix=0;ix!=252;ix++){write_EEPROM(ix,0xff);}	// reset EEPROM	
			//write_EEPROM(0xfc,0x11);
			nokia_clean_ddram();

			search_freq=87.50;
			
			for(fix=0;fix!=15;fix++){
									
									station_searching=1;
									preset=fix; //goto_preset(2);		// goto preset in mode 2 (no up/down)
									tun_goto_freq(0,search_freq);
									while(station_searching){
													delay_ms(10);
													read_level(1);	// level = signal level 0..255
													
													//nokia_gotoxy(1,1);printf(nokia_printchar,"%s","                    ");
													//blank_displays();
													
													//lcd_module_display();
													//nokia_lcd_display();
													//show_freq();
													nokia_gotoxy(9,6);printf(nokia_printchar,"%s","init presets");
													if(level>=90){
																	level_1=level;
																	search_freq+=0.05;tun_seek(1);
																	delay_ms(50);
																	read_level(1);	// level = signal level 0..255
																	level_2=level;
			
																	if(level_2>=level_1){;}
																	else{search_freq-=0.05;tun_seek(0);}		// goto strongest signal
			
																	for(rtt=0;rtt<=3000;rtt++){rds_main();if(syndrome_detected==1){rtt+=50;};}
																	//
																	if(rds_q>=2){
																				for(rtt=0;rtt<=10000;rtt++){rds_main();if(syndrome_detected==1){rtt+=50;};}
																				save_preset();nokia_clean_ddram();
																				station_searching=0;search_freq+=0.10;tun_seek(1);
																				
																				}
																	else{search_freq+=0.05;tun_seek(1);}
																	if(c_freq>=108.0){break;}
																	}
													else{search_freq+=0.05;tun_seek(1);}
													if(c_freq>=108.0){break;}
													}
									}
station_searching=0;			

			}
// 

release_joystick();

nokia_clean_ddram();
preset=0; goto_preset(2);		// goto preset in mode 2 (no up/down)

}
//////////////////////////////////////////////////////////////////////////////////////////////////////

