⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tda10021hdlg.cpp

📁 LG数字一体化高频头TDMK-G5XXD驱动程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	float   fFreqSymb, fSysClk ,fResult, fBDR ;
    
	// add 240 ppm to the SR
    uFreqSymb240  = uFreqSymb*240;
    uFreqSymb240 /= 1000000;
    uFreqSymb240  = uFreqSymb + uFreqSymb240;
    
    // calculate the number of decimation and the antialias filter
   	bNdec = 0;    	bSFil = 0;
	if ((uFreqSymb240/10) < (uSysClk/123)){ bNdec = 0;    bSFil = 1;}
	if ((uFreqSymb240/10) < (uSysClk/160)){ bNdec = 1;    bSFil = 0;}
	if ((uFreqSymb240/10) < (uSysClk/246)){ bNdec = 1;    bSFil = 1;}
	if ((uFreqSymb240/10) < (uSysClk/320)){ bNdec = 2;    bSFil = 0;}
	if ((uFreqSymb240/10) < (uSysClk/492)){ bNdec = 2;    bSFil = 1;}
	if ((uFreqSymb240/10) < (uSysClk/640)){ bNdec = 3;    bSFil = 0;}
	if ((uFreqSymb240/10) < (uSysClk/984)){ bNdec = 3;    bSFil = 1;}

    // program SFIL
    ChipWriteMasked(0x0e, 0x10, (U8)(bSFil<<4));
    // program NDEC
    ChipWriteMasked(0x03, 0xc0, (U8)(bNdec<<6));
    // calculate the inversion of the symbol frequency
	uFreqSymbInv   = uSysClk*16;
	uFreqSymbInv >>= bNdec;		// divide by 2^decim
	uFreqSymbInv  += uFreqSymb/2;	// rounding for division
	uFreqSymbInv  /= uFreqSymb;
	if (uFreqSymbInv > 255)	uFreqSymbInv = 255;
    // calculate the symbol rate
	fFreqSymb = (float)uFreqSymb;
	fSysClk = (float)uSysClk;
	fResult  = (float)(1<<(24+bNdec));
	fResult /= fSysClk;
	fResult *= fFreqSymb;
	uBDR = (U32)fResult;
    // program the value in register of the symbol rate
	pWrite[0] = (U8)(uBDR);
	pWrite[1] = (U8)(uBDR >> 8);
	pWrite[2] = (U8)(uBDR >> 16);
	pWrite[3] = (U8)uFreqSymbInv;
 
    RegSetOneRegister(0x0a, pWrite[0]);
    RegSetOneRegister(0x0b, pWrite[1]);
    RegSetOneRegister(0x0c, pWrite[2]);
    RegSetOneRegister(0x0d, pWrite[3]);
     // return the value programmed
	fBDR = (float)uBDR;
	fSysClk = (float)uSysClk;
	fResult  = fBDR*fSysClk;
	fResult /= (float)(1<<(24+bNdec));
	return (U32)fResult;

}

void CTDA10021HDlg::Q10021WriteQam(U8 bQAM)
{
	static  TypeQAM[6][5] = {
	    {0x00, 0x8c, 0x87, 0xa2, 0x91},  // 16 QAM   <=> qam=0
	    {0x04, 0x8c, 0x64, 0x74, 0x96},  // 32 QAM   <=> qam=1
	    {0x08, 0x6a, 0x43, 0x43, 0x6a}, /* 04. 2. 13*/// 64 QAM   <=> qam=2   0x08, 0x50, 0x37, 0x37, 0x6a
	    {0x0c, 0x78, 0x30, 0x30, 0x7e},  // 128 QAM  <=> qam=3
	    {0x10, 0x5c, 0x26, 0x23, 0x6b},  // 256 QAM  <=> qam=4
 	    {0x14, 0x78, 0x78, 0x8c, 0x96}   // 4 QAM    <=> qam=5
	};
     
	ChipWriteMasked(0x00, 0x1c, TypeQAM[bQAM][0]);
   	RegSetOneRegister(0x01,  TypeQAM[bQAM][1]);
   	RegSetOneRegister(0x05,  TypeQAM[bQAM][2]);  
   	RegSetOneRegister(0x08,  TypeQAM[bQAM][3]);  
  	RegSetOneRegister(0x09,  TypeQAM[bQAM][4]); 
}

U8 CTDA10021HDlg::Q10021RunAlgo(U32 uSR, U8 *pGain, U8 bAutoGain, U8 bAutoSpecInv)
{
	U8 bSyncReg, bAGC1, bAGC2, bSI,bGainFound;
   
    if(bAutoGain)*pGain=0;
    bGainFound=*pGain;
  	// set the gain
    ChipWriteMasked(0x0e,0xe0, (U8)(bGainFound << 5));
	// set the AGC time constant
	ChipWriteMasked(0x02, 0x03, 1);
	// program the CARCONF
	ChipWriteMasked(0x04, 0x3f, 0x0a);
	// only use the central coef and disable other adaptation when gain auto
	if (bAutoGain) ChipWriteMasked(0x1c, 0x08, 0x08);
	// reset the demod     reset CLB bit
    ChipWriteMasked(0x00, 0x01, 0);
	Q10021AlgoDelay(80000, uSR);


	RegSetOneRegister(0x02, 0x23);
	RegSetOneRegister(0x1c, 0x30);
	RegSetOneRegister(0x04, 0x02);
/*



		


	// read the AGC values	// test if there is a signal
    bAGC1=(U8)RegGetOneRegister(0x17);      bAGC2=(U8)RegGetOneRegister(0x2f);
	if (bAGC1 == 255 && bAGC2 == 255) return 1;
	// test the algo in used
	if (bAutoGain)
		{	if ((bGainFound=Q10021AlgoGain( uSR, bGainFound)) == 6)	return 2;// if err
		    else
		   {  	// set the AGC time constant
	        	ChipWriteMasked(0x02, 0x03, 1);
	        	// use all coef
        		ChipWriteMasked(0x1c, 0x08, 0);
	        	// reset the demod
	            ChipWriteMasked(0x00, 0x01, 0);
	        	Q10021AlgoDelay(80000, uSR);
		        *pGain=bGainFound;
			}
		}
      
	// set the AGC time constant
    ChipWriteMasked(0x02, 0x03, 3);
	Q10021AlgoDelay(200000, uSR);
	// read the synchro registers // test if carlock
	bSyncReg=(U8)RegGetOneRegister(0x11);
 	if (!(bSyncReg & 0x02))return 3;

	// test if frame synchro
	if ((bSyncReg & 0x04) && !(bSyncReg & 0x40))
	{ // oK case
	   if (uSR > 3000000)ChipWriteMasked(0x04, 0x3f, 0x02);  else  ChipWriteMasked(0x04, 0x3f, 0x0a);
       return 0;
    }
	// test if auto spectral inv
	else if(bAutoSpecInv)
	   {	// test the other spectral inversion
            bSI=(U8)RegGetOneRegister(0x00);
			if (bSI & 0x20)	bSI &= ~0x20; else	bSI |= 0x20;
			RegSetOneRegister(0x00,bSI);
	     	Q10021AlgoDelay(30000, uSR);
		   	// read the synchro registers
	        bSyncReg=(U8)RegGetOneRegister(0x11);
		    // test if frame sync and DVB
	        if ((bSyncReg & 0x04) && !(bSyncReg & 0x40))
			{ // oK case
		      if (uSR > 3000000)ChipWriteMasked(0x04, 0x3f, 0x02); else  ChipWriteMasked(0x04, 0x3f, 0x0a);
              return 0;
			}
	   }*/
	return 4;
}

void CTDA10021HDlg::Q10021AlgoDelay(U32 uNbSymbol, U32 uSR)
{
	uNbSymbol *= 1000;	uNbSymbol += uSR/2;	uNbSymbol /= uSR;
	Sleep((unsigned short)uNbSymbol);
}

U8 CTDA10021HDlg::Q10021AlgoGain(U32 uSR, U8 bGain)
{
	long lRCentralCoef, lICentralCoef;	U8 pReadCoef[2];
    do
	{	// read the real part of the central coef of the equalizer
		pReadCoef[0]=(U8)RegGetOneRegister(0x50);    	pReadCoef[1]=(U8)RegGetOneRegister(0x51);
		lRCentralCoef = (U32)(pReadCoef[0] << 3 | pReadCoef[1] >> 5);
		if (lRCentralCoef & 0x400)	lRCentralCoef |= 0xFFFFF800;
		// lRCentralCoef^2
		lRCentralCoef *= lRCentralCoef;
		// read the imaginary part of the central coef of the equalizer
		pReadCoef[0]=(U8)RegGetOneRegister(0x90);    	pReadCoef[1]=(U8)RegGetOneRegister(0x91);
		lICentralCoef = (U32)(pReadCoef[0] << 3 | pReadCoef[1] >> 5);
		if (lICentralCoef & 0x400)	lICentralCoef |= 0xFFFFF800;
		// lICentralCoef^2
		lICentralCoef *= lICentralCoef;
		// test the module
  	 if ((lRCentralCoef + lICentralCoef) >490000)
	 {		// no scanning so use all agin - test if gain max is reached
		if (bGain < 5)	{	// try next gain
					bGain++;    ChipWriteMasked(0x0e,0xe0, (U8)(bGain << 5));
					// wait for synchro
					Q10021AlgoDelay(10000, uSR);
						}
		 else	return 6;//err
	 }
	 else return bGain; // if ok
	}while(1);
}

void CTDA10021HDlg::OnCheckGpib() 
{
	if(m_bCheckGpib)return;	
}

void CTDA10021HDlg::OnTimer(UINT nIDEvent) 
{	
	if(IDC_TIMER1)
	{
		if(COMM.I2cSetForRun()!=1)	
		{
			if(m_fRfin!=m_fRfin2) 
			{
				m_fRfin=m_fRfin2;
				UpdateData(FALSE);
				OnButtonRun();
			}
			else if(m_fRfin!=m_fRfin1) 
			{
				m_fRfin=m_fRfin1;
				UpdateData(FALSE);
				OnButtonRun();
			}
			
		}
	}


	if(IDC_TIMER)
	{
		IICStatus();
		
		Tunerlockchecking();
		/* read AGC */
		int _agc=0;int _agcrange=0;int _strength=0;
		m_iIfagcread=(int)RegGetOneRegister(0x2f);
		m_iRfagcread=(int)RegGetOneRegister(0x17);
		
		_agc=m_iIfagcread+m_iRfagcread-m_iIfagcMin;
		_agcrange=m_iIfagcMax+m_iRfagcMax-m_iIfagcMin-m_iRfagcMin;
		_strength=_agcrange-_agc;
		m_ctrlProgressAGC.SetRange32(0,_agcrange);	  
		m_ctrlProgressAGC.SetPos(_strength);

		/* BER calculation */
		QBerCalcu();
	}

		
	CDialog::OnTimer(nIDEvent);
}

void CTDA10021HDlg::KillTimer__() 
{
	KillTimer(IDC_TIMER);
//	KillTimer(IDC_TIMER1);

}

void CTDA10021HDlg::OnButtonWritereg() 
{
	CString str;
	unsigned int data[2];    

	GetDlgItemText(IDC_REGNO,str);
	if( str == "" ) return ;
	data[0] = StrHexToInt(str);

    GetDlgItemText(IDC_WRITEVALUE,str);
	if( str == "" ) return ;
	data[1] = StrHexToInt(str);

	RegSetOneRegister(data[0], data[1]);		
}

UINT CTDA10021HDlg::StrHexToInt(CString str)
{
	 CString work;     int nLength;     ULONG ulRetVal;

     work = str;
     if(strstr(str, "0x") != NULL)
          work = strstr(str, "0x") + 2;

     nLength = work.GetLength() - 1;
     ulRetVal = 0;     
     work.MakeUpper();
     for(int i=0; i<work.GetLength(); i++, nLength--) {
          switch(work.GetAt(i)) {
          case '0' :
          case '1' :
          case '2' :
          case '3' :
          case '4' :
          case '5' :
          case '6' :
          case '7' :
          case '8' :
          case '9' :
			  ulRetVal += (work.GetAt(i) - '0') * (int)pow(16, nLength);
               break;

          case 'A' :
          case 'B' :
          case 'C' :
          case 'D' :
          case 'E' :
          case 'F' :
               ulRetVal += (10 + work.GetAt(i) - 'A') * (int)pow(16, nLength);
               break;

          default :
               return ulRetVal = 0;
          }
     }
     return ulRetVal;
}

void CTDA10021HDlg::QBerCalcu()
{
	
	U8 i, j, k;
	U32 uNbit, utime=0, usymbolrate;   
	double ber;
	
	usymbolrate=(U32)(m_fSymbolrate*1000000);
	uNbit=(U32)(usymbolrate*(ubQAM+4));
	uNbit+=500;
	uNbit/=1000;
	uNbit*=(U32)(0.1*1000);
	uBerdepth=0x00;
	if(uNbit>=1000000)uBerdepth=1;
	if(uNbit>=10000000)uBerdepth=2;
	if(uNbit>=100000000)uBerdepth=3; 
	ChipWriteMasked(0x10, 0xc0,(U8)(uBerdepth<<6));
	if(0.1*1000)
	{	 
		switch(uBerdepth)
		{
		case 0:			 utime=100000000/usymbolrate;			 break;
		case 1:			 utime=1000000000/usymbolrate;			 break;
		case 2:			 utime=1000000000/(usymbolrate/10);		 break;
		case 3:			 utime=1000000000/(usymbolrate/100);	 break;
		}
		utime/=ubQAM+4;
		
		Sleep((int)utime);
		i=(U8)RegGetOneRegister(0x14);
		j=(U8)RegGetOneRegister(0x15); 
		k=(U8)(RegGetOneRegister(0x16)&(0x0f));
		uBER=(U32)(k<<16|j<<8|i);
		if(uBerdepth==0)  {	  uBER*=80;		  uBER/=100;	  
		}  
	}
	if(uBerdepth==0)ber=uBER*1E-5;
	else if (uBerdepth==1)ber=uBER*1E-6;
	else if (uBerdepth==2)ber=uBER*1E-7;
	else ber=uBER*1E-8;
	
	if(1){
	char buff[50];
	sprintf(buff,"Bit Error Rate:[%4.2e]",ber);
	m_strBer=buff;}


	if(ber<5e-3) m_ctrlProgressBer.SetPos(1);
	if(ber<4e-3) m_ctrlProgressBer.SetPos(2);
	if(ber<3e-3) m_ctrlProgressBer.SetPos(3);
	if(ber<2e-3) m_ctrlProgressBer.SetPos(4);
	if(ber<1e-3) m_ctrlProgressBer.SetPos(5);
	if(ber<9e-4) m_ctrlProgressBer.SetPos(6);
	if(ber<8e-4) m_ctrlProgressBer.SetPos(7);
	if(ber<7e-4) m_ctrlProgressBer.SetPos(8);
	if(ber<6e-4) m_ctrlProgressBer.SetPos(9);
	if(ber<5e-4) m_ctrlProgressBer.SetPos(10);
	if(ber<4e-4) m_ctrlProgressBer.SetPos(11);
	if(ber<3e-4) m_ctrlProgressBer.SetPos(12);
	if(ber<2e-4) m_ctrlProgressBer.SetPos(13);
	if(ber<1e-4) m_ctrlProgressBer.SetPos(14);
	if(ber<9e-5) m_ctrlProgressBer.SetPos(15);
	if(ber<8e-5) m_ctrlProgressBer.SetPos(16);
	if(ber<7e-5) m_ctrlProgressBer.SetPos(17);
	if(ber<6e-5) m_ctrlProgressBer.SetPos(18);
	if(ber<5e-5) m_ctrlProgressBer.SetPos(19);
	if(ber<4e-5) m_ctrlProgressBer.SetPos(20);
	if(ber<3e-5) m_ctrlProgressBer.SetPos(21);
	if(ber<2e-5) m_ctrlProgressBer.SetPos(22);
	if(ber<1e-5) m_ctrlProgressBer.SetPos(23);
	if(ber<9e-6) m_ctrlProgressBer.SetPos(24);
	if(ber<8e-6) m_ctrlProgressBer.SetPos(25);
	if(ber<7e-6) m_ctrlProgressBer.SetPos(26);
	if(ber<6e-6) m_ctrlProgressBer.SetPos(27);
	if(ber<5e-6) m_ctrlProgressBer.SetPos(28);
	if(ber<4e-6) m_ctrlProgressBer.SetPos(29);
	if(ber<3e-6) m_ctrlProgressBer.SetPos(30);
	if(ber<2e-6) m_ctrlProgressBer.SetPos(31);
	if(ber<1e-6) m_ctrlProgressBer.SetPos(32);
	if(ber<9e-7) m_ctrlProgressBer.SetPos(33);
	if(ber<8e-7) m_ctrlProgressBer.SetPos(34);
	if(ber<7e-7) m_ctrlProgressBer.SetPos(35);
	if(ber<6e-7) m_ctrlProgressBer.SetPos(36);
	if(ber<5e-7) m_ctrlProgressBer.SetPos(37);
	if(ber<4e-7) m_ctrlProgressBer.SetPos(38);
	if(ber<3e-7) m_ctrlProgressBer.SetPos(39);
	if(ber<2e-7) m_ctrlProgressBer.SetPos(40);
	if(ber<1e-7) m_ctrlProgressBer.SetPos(41);

	if(ber>2.5e-4)m_ctrlProgressBer.SendMessage(PBM_SETBARCOLOR,0,RGB(255,0,0));  
	else m_ctrlProgressBer.SendMessage(PBM_SETBARCOLOR,0,RGB(0,255,0)); 
/*

	if(m_fRfin==m_fRfin1)
	{
		if(ber<3e-4)
		{
			m_progress500.SendMessage(PBM_SETBARCOLOR,0,RGB(0,255,0));
			m_progress500.SetPos(1);
		}
		else
		{
			m_progress500.SendMessage(PBM_SETBARCOLOR,0,RGB(255,0,0));
			m_progress500.SetPos(1);
		}

		m_progress800.SendMessage(PBM_SETBARCOLOR,0,RGB(255,255,255));
	}

	if(m_fRfin==m_fRfin2)
	{
		if(ber<3e-4)
		{
			m_progress800.SendMessage(PBM_SETBARCOLOR,0,RGB(0,255,0));
			m_progress800.SetPos(1);
		}
		else
		{
			m_progress800.SendMessage(PBM_SETBARCOLOR,0,RGB(255,0,0));
			m_progress800.SetPos(1);
		}
		m_progress500.SendMessage(PBM_SETBARCOLOR,0,RGB(255,255,255));
	}
*/
	//if(FreqCount==3)


	UpdateData(FALSE);
}


void CTDA10021HDlg::OnEditchangeComboMpegmode() 
{
	
}

void CTDA10021HDlg::OnUncrreset() 
{
	UpdateData(TRUE);
	uncor_count=0;
	UpdateData(FALSE);
}

void CTDA10021HDlg::OnButton1() 
{
	OnButtonRun() ;	
}

void CTDA10021HDlg::IICStatus()
{
	int iic_test=0,iicSCL_test=0,iicSDA_test=0,iicACK_test=0;
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	
	iic_test=TestIic();
	iicSCL_test=(iic_test&0x02)>>1;
	iicSDA_test=iic_test&0x01;
	iicACK_test=(iic_test&0x04)>>2;
	if(iicSCL_test)
	{m_ctrSCL_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));}
		else
		{m_ctrSCL_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));}
	if(iicSDA_test)
	{m_ctlSDA_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));}
		else
		{m_ctlSDA_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));}
	if(iicACK_test)
	{m_ctrACK_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));}
		else
		{m_ctrACK_status.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));}
	UpdateData(FALSE);

}

int CTDA10021HDlg::TestIic()
{
		int fail=0;
	fail = COMM.I2cGetStatus() ;
		
	// SDA test
	if((fail&SDA)==0)
		fail    &=~0x01 ;
	else
		fail	|=0x01	;
	
	//  SCL test
	if((fail&SCL) == 0)
		 fail	&=~0x02	;
	else
		fail	|=0x02	;
	
	// ACK test
	switch(0/*COMM.I2cStatusTestPPort()*/)//chip ID:0x12->MT351
	{
		case 0:
			fail |= (fail&ACK); 	
		break;
		
		case 1:
			  
		case 2:
			fail = 0;
		break;	       
	}
	
	if((fail&ACK) == 0)
		fail   &=~0x04 ;
	else
		fail |=0x04;
	
	return (fail);

}

void CTDA10021HDlg::OnCheck1() 
{
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -