www.pudn.com > tuner2.rar > TDA10021HDlg.cpp


// TDA10021HDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "TDA10021H.h" 
#include "TDA10021HDlg.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTDA10021HDlg dialog 
 
CTDA10021HDlg::CTDA10021HDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CTDA10021HDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CTDA10021HDlg) 
	m_fRfin = 363.0f; 
	m_fSymbolrate = 6.875f; 
	m_iIfagcMax =145; 
	m_iRfagcMax =255; 
	m_iRfagcMin =0; 
	m_iIfagcMin =100; 
	m_bCheckGpib = FALSE; 
	m_iIfagcread = 0; 
	m_iRfagcread = 0; 
	m_iMpegoutput = 0; 
	m_strBer = _T(""); 
	m_strTunerLockingTime = _T(""); 
	m_strUncr = _T(""); 
	m_fRfin1 = 500.0f; 
	m_fRfin2 = 800.0f;	 
	m_lIICdelay =100; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CTDA10021HDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CTDA10021HDlg) 
	DDX_Control(pDX, IDC_ICON6, m_ctlSDA_status); 
	DDX_Control(pDX, IDC_ICON7, m_ctrACK_status); 
	DDX_Control(pDX, IDC_ICON5, m_ctrSCL_status); 
	DDX_Control(pDX, IDC_PROGRESS1, m_progress800); 
	DDX_Control(pDX, IDC_PROGRESS2, m_progress500); 
	DDX_Control(pDX, IDC_PROGRESS_BER, m_ctrlProgressBer); 
	DDX_Control(pDX, IDC_COMBO_MPEGMODE, m_ctrlMpegmode); 
	DDX_Control(pDX, IDC_COMBO_MPEGCLK, m_ctrlMpegclk); 
	DDX_Control(pDX, IDC_COMBO_MODEBCLK, m_ctrlMpegmodeBclk); 
	DDX_Control(pDX, IDC_PROGRESS_AGC, m_ctrlProgressAGC); 
	DDX_Control(pDX, IDC_COMBO_GAIN, m_ctrlGain); 
	DDX_Control(pDX, IDC_ICON4, m_ctrlIcon4); 
	DDX_Control(pDX, IDC_ICON2, m_ctrlIcon2); 
	DDX_Control(pDX, IDC_ICON3, m_ctrlIcon3); 
	DDX_Control(pDX, IDC_ICON1, m_ctrlIcon1); 
	DDX_Control(pDX, IDC_COMBO_QAMSIZE, m_ctrlModulation); 
	DDX_Control(pDX, IDC_ICON0, m_ctrlIcon0); 
	DDX_Control(pDX, IDC_LIST_PLLDATA, m_ctrlPlldatalist); 
	DDX_Control(pDX, IDC_LIST_READREG, m_ctrlRegread); 
	DDX_Text(pDX, IDC_EDIT_RFIN, m_fRfin); 
	DDX_Text(pDX, IDC_EDIT_SR, m_fSymbolrate); 
	DDX_Text(pDX, IDC_EDIT_AGCIF0, m_iIfagcMax); 
	DDX_Text(pDX, IDC_EDIT_AGCRF0, m_iRfagcMax); 
	DDX_Text(pDX, IDC_EDIT_AGCRF1, m_iRfagcMin); 
	DDX_Text(pDX, IDC_EDIT_AGCIF1, m_iIfagcMin); 
	DDX_Check(pDX, IDC_CHECK_GPIB, m_bCheckGpib); 
	DDX_Text(pDX, IDC_EDIT_AGCIF2, m_iIfagcread); 
	DDX_Text(pDX, IDC_EDIT_AGCRF2, m_iRfagcread); 
	DDX_Radio(pDX, IDC_RADIO_MPEGOUT, m_iMpegoutput); 
	DDX_Text(pDX, IDC_BER, m_strBer); 
	DDX_Text(pDX, IDC_TUNERLOCKINGTIME, m_strTunerLockingTime); 
	DDX_Text(pDX, IDC_UCRR, m_strUncr);	 
	DDX_Text(pDX, IDC_EDIT1, m_fRfin1); 
	DDX_Text(pDX, IDC_EDIT2, m_fRfin2); 
	DDX_Text(pDX, IDC_IICDELAY, m_lIICdelay); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CTDA10021HDlg, CDialog) 
	//{{AFX_MSG_MAP(CTDA10021HDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON_READREG, OnButtonReadreg) 
	ON_BN_CLICKED(IDC_BUTTON_RUN, OnButtonRun) 
	ON_BN_CLICKED(IDC_CHECK_GPIB, OnCheckGpib) 
	ON_WM_TIMER() 
	ON_EN_CHANGE(IDC_EDIT_RFIN, KillTimer__)  
	ON_BN_CLICKED(IDC_BUTTON_READREG2, OnButtonWritereg) 
	ON_CBN_EDITCHANGE(IDC_COMBO_MPEGMODE, OnEditchangeComboMpegmode) 
	ON_BN_CLICKED(IDC_UNCRRESET, OnUncrreset) 
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1) 
	ON_EN_CHANGE(IDC_EDIT_SR, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT_AGCRF0, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT_AGCIF0, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT_AGCRF1, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT_AGCIF1, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT1, KillTimer__) 
	ON_EN_CHANGE(IDC_EDIT2, KillTimer__) 
//	ON_BN_CLICKED(IDC_CHECK1, OnCheck1) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CTDA10021HDlg message handlers 
 
BOOL CTDA10021HDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
 
	uSysClk=58000000;	uIF=36125000;	ubQAM=2     ; 
	uBerdepth=3     ;	ubGAIN=0    ;	ubAutoGain=1; 
	ubAutoSpecInv=1 ; 
 
	COMM.I2cInit(100);	COMM.delay1(100); 
	m_ctrlModulation.SetCurSel(2); 
	m_ctrlGain.SetCurSel(0); 
 
	m_ctrlMpegclk.SetCurSel(1); 
	m_ctrlMpegmode.SetCurSel(0); 
	m_ctrlMpegmodeBclk.SetCurSel(9); 
 
	m_ctrlMpegmodeBclk.EnableWindow(FALSE); 
 
	m_ctrlProgressAGC.SendMessage(PBM_SETBKCOLOR,0,RGB(255,255,255));  
	m_ctrlProgressAGC.SendMessage(PBM_SETBARCOLOR,0,RGB(255,0,255));  
 
	m_ctrlProgressBer.SendMessage(PBM_SETBKCOLOR,0,RGB(255,255,255));  
//	m_ctrlProgressBer.SendMessage(PBM_SETBARCOLOR,0,RGB(255,0,0)); 
	m_ctrlProgressBer.SetRange32(0,41); 
 
	m_progress500.SendMessage(PBM_SETBKCOLOR,0,RGB(255,255,255));  
	m_progress500.SetRange32(0,1); 
//	m_progress500.SendMessage(PBM_SETBKCOLOR,0,RGB(255,255,255));  
//	m_progress800.SendMessage(PBM_SETBARCOLOR,0,RGB(255,255,255));  
	m_progress800.SendMessage(PBM_SETBKCOLOR,0,RGB(255,255,255));  
	m_progress800.SetRange32(0,1); 
 
	uncor_count=0; 
	 
 
	VERIFY(CB0.Attach(IDC_BUTTON_RUN,this,RGB(230,255,255),RGB(0,0,255))); 
 
	COMM.delay2=m_lIICdelay; 
 
	SetTimer(IDC_TIMER1,500000,NULL);	 
	OnButtonRun() ; 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CTDA10021HDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CTDA10021HDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CTDA10021HDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CTDA10021HDlg::OnButtonReadreg()  
{ 
	int i,j; 
    char  buff[100]; 
    j=m_ctrlRegread.GetCount(); 
  	for(i=j;i>=0;i--)m_ctrlRegread.DeleteString(i); 
	for(i=0;i<=0x3c;i++) 
	{ 
		ReadValue[0]=RegGetOneRegister(i); 
	//	COMM.I2cReadWrite(READ,CHIP_ADDRESS,&ReadValue[0],1); 
		sprintf(buff,"[%02X]->0x%02x",i,ReadValue[0]); 
		m_ctrlRegread.AddString(buff);	 
	}	 
} 
 
void CTDA10021HDlg::OnButtonRun()  
{ 
	KillTimer(IDC_TIMER); 
 
	TunerWrite(); 
	Q10021Init(); 
	UpdateData(FALSE); 
	SetTimer(IDC_TIMER,100,NULL); 
	 
} 
 
void CTDA10021HDlg::TunerWrite() 
{ 
    int err   ; 
    int i ,j, k     ; 
	CHAR buff[128];	 
	/*******************************************************************/ 
	/**************       Make PLL 5 Byte Data      ********************/ 
	/*******************************************************************/	 
	long maincounter;double error; 
	float if_frequency; 
//	int count=0;	 
	if_frequency=36.125f; 
	 
	maincounter=(long)((m_fRfin+if_frequency)/(62.5*0.001)); 
	error=(double)(m_fRfin+if_frequency)*1000-(double)maincounter*62.5; 
	if(error>(double)62.5/2)maincounter+=1; 
	TunerB[1]=TUNER_ADDRESS; 
	TunerB[2]=(UCHAR)((maincounter>>8)&0x007f) ; 
	TunerB[3]=(UCHAR)(maincounter&0x00ff); 
	TunerB[4]=0x86;//stepsize 62.5, charge pump 250 uA 
	if(m_fRfin<160)	TunerB[5]=0x01; 
	else if(m_fRfin>445) TunerB[5]=0x04; 
	else TunerB[5]=0x02; 
 
	j=m_ctrlPlldatalist.GetCount();  	for(k=j;k>=0;k--)m_ctrlPlldatalist.DeleteString(k); 
	for(k=1;k<=5;k++){sprintf(buff,"Byte[%1d]=0x%02X",k,TunerB[k]);m_ctrlPlldatalist.AddString(buff);} 
     
    i = 0 ; 
    err = -1 ; 
	ChipWriteMasked(0x0f,0x80,0x80); // iic sw on(Bypass Tuner) 
	Sleep(1000); 
//	while ((i < 3)&&(err == -1)) 
//	{		 
	COMM.I2cReadWrite(WRITE,TunerB[1],&TunerB[2],4); 
//		i += 1 ; 
//	} 
	Sleep(500); 
	ChipWriteMasked(0x0f,0x80,0x00); // iic sw off(Bypass Tuner) 
 
	 
	int count=0;//uncor_count;//uncor=(U8) (TDA10021.ChipRead(0x13)&0x7f); 
 
//	while(count<100) 
//	{ 
		if(TunerRead()) 
		{ 
			m_ctrlIcon0.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK)); 
		//	m_ctrlIcon4.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));  
			m_strTunerLockingTime.Format("Tuner locking Time:[%3d msec]",(int)(++count*4.4)); 
	//		count=101; 
		} 
		else 
		{ 
		//	m_ctrlIcon4.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
			m_strTunerLockingTime.Format("Tuner unlocking!"); 
			m_ctrlIcon0.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
		} 
 
//		Sleep(1);  
//		count++;   
//	} 
} 
 
void CTDA10021HDlg::RegSetOneRegister(int reg_id, unsigned char _Data) 
{ 
	unsigned int ChipAddress; 
	unsigned char data[2],UCtmp=-1; 
	 
	ChipAddress  = CHIP_ADDRESS; 
	data[0] = (unsigned char)reg_id; 
	data[1] = _Data;  
	UCtmp=COMM.I2cReadWrite(WRITE,ChipAddress,data,2); 
} 
 
void CTDA10021HDlg::ChipWriteMasked(unsigned short regadd, unsigned short mask, unsigned short data) 
{ 
	unsigned short i; 
   
   i=RegGetOneRegister((int)regadd); 
   i=i&~mask; 
   i=i|(data&mask); 
   RegSetOneRegister((int)regadd,(unsigned char)i); 
} 
 
int CTDA10021HDlg::RegGetOneRegister(int reg_id) 
{ 
	unsigned char    readvalue[2]     ; 
	unsigned int ChipAddress; 
	 
	ChipAddress=CHIP_ADDRESS; 
	readvalue[0]=reg_id; 
	COMM.I2cReadWrite(WRITE,ChipAddress,&readvalue[0],1);   
	COMM.I2cReadWrite(READ,ChipAddress,&readvalue[1],1);  
	return(readvalue[1]) ; 
} 
 
unsigned char CTDA10021HDlg::TunerRead() 
{ 
	int err ; 
    int i   ; 
	i = 0 ; 
    err = -1 ; 
	ChipWriteMasked(0x0f,0x80,0x80); // iic sw on(Bypass Tuner) 
    while ((i < 3)&&(err == -1)) 
	{	err = COMM.I2cReadWrite(READ,TunerB[1],&TunerB[0],1);  
		i += 1 ;		 
	} 
	ChipWriteMasked(0x0f,0x80,0x00); // iic sw off(Bypass Tuner) 
	return TunerB[0]; 
} 
 
void CTDA10021HDlg::Tunerlockchecking() 
{ 
	U8 bSyncReg,uncor;    
	bSyncReg=(U8)RegGetOneRegister(0x11); 
	uncor=(U8)(RegGetOneRegister(0x13)&0x7f); 
    if(uncor){ChipWriteMasked(0x10, 0x20,(U8)(0<<5));ChipWriteMasked(0x10, 0x20,(U8)(1<<5));} 
 
	if(bSyncReg & 0x02)m_ctrlIcon1.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));  
	else m_ctrlIcon1.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
	 
	if(bSyncReg & 0x03)m_ctrlIcon2.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));  
	else m_ctrlIcon2.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
	 
	if(bSyncReg & 0x04)m_ctrlIcon3.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));  
	else m_ctrlIcon3.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
 
	if(uncor==0)m_ctrlIcon4.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));  
	else m_ctrlIcon4.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_NG));  
 
/*	if((bSyncReg & 0x02)&&(bSyncReg & 0x03)&&(bSyncReg & 0x04)&&(uncor=0)) 
	{ 
		KillTimer(IDC_TIMER1); 
		m_fRfin=800; 
	UpdateData(FALSE); 
	}*/ 
 
 
	U8 foundgain;  
	foundgain=ubGAIN;    //0 
//	if((bSyncReg & 0x04)!=1&&uncor!=0) 
//	Q10021RunAlgo((U32)(m_fSymbolrate*1e6),&foundgain,ubAutoGain,ubAutoSpecInv);//ubAutoGain,ubAutoSpecInv-->1,1 
	 
 
 
	if(uncor) 
	{ 
		 
		ChipWriteMasked(0x10, 0x20,(U8)(0<<5));  
	    ChipWriteMasked(0x10, 0x20,(U8)(1<<5)); 
	} 
	uncor_count+=uncor; 
	m_strUncr.Format("Uncorrectable packet:[%3d]",uncor_count); 
	UpdateData(FALSE); 
} 
 
void CTDA10021HDlg::Q10021Init() 
{ 
	UpdateData(TRUE); 
	int ubQAM; 
	ubQAM=m_ctrlModulation.GetCurSel(); 
	 
 
	static  TypeQAM[6][5] =  
	{ 
	    {0x00, 0x50, 0x87, 0xa2, 0x91},  // 16 QAM   <=> qam=0 
	    {0x04, 0x50, 0x64, 0x74, 0x96},  // 32 QAM   <=> qam=1 
	    {0x08, 0x50, 0x43, 0x43, 0x6a},  /* 04. 2. 13*/// 64 QAM   <=> qam=2   0x08, 0x50, 0x37, 0x37, 0x6a 
	    {0x0c, 0x50, 0x30, 0x30, 0x7e},  // 128 QAM  <=> qam=3 
	    {0x10, 0x50, 0x26, 0x23, 0x6b},  // 256 QAM  <=> qam=4 
 	    {0x14, 0x50, 0x78, 0x8c, 0x96}   // 4 QAM    <=> qam=5 
	}; 
      
	ChipWriteMasked(0x00, 0x1c, TypeQAM[ubQAM][0]); 
   	RegSetOneRegister(0x01,  TypeQAM[ubQAM][1]); 
   	RegSetOneRegister(0x05,  TypeQAM[ubQAM][2]);   
   	RegSetOneRegister(0x08,  TypeQAM[ubQAM][3]);   
  	RegSetOneRegister(0x09,  TypeQAM[ubQAM][4]); 
 
	RegSetOneRegister(0x0e, 0x23); 
 
	RegSetOneRegister(0x03, 0x0a); 
	RegSetOneRegister(0x0a, 0x46); 
    RegSetOneRegister(0x0b, 0x58); 
    RegSetOneRegister(0x0c, 0x1e); 
    RegSetOneRegister(0x0d, 0x87); 
 
	RegSetOneRegister(0x28, 0x1c); 
	RegSetOneRegister(0x29, 0x0); 
	RegSetOneRegister(0x2a, 0x01); 
	RegSetOneRegister(0x2e, 0x01); 
	RegSetOneRegister(0x2e, 0x08); 
	RegSetOneRegister(0x34,0x80); 
	RegSetOneRegister(0x1b, 0x31); 
	RegSetOneRegister(0x02, 0x23);	 
	RegSetOneRegister(0x3b,125);     
	RegSetOneRegister(0x3c,20);      
	RegSetOneRegister(0x35,255);     
	RegSetOneRegister(0x36,0);      
	RegSetOneRegister(0x3d,0x00); 
	RegSetOneRegister(0x2b, 0x11); 
	RegSetOneRegister(0x06, 0x77);// 
	RegSetOneRegister(0x1c, 0x30); 
	RegSetOneRegister(0x37,0xfc); 
    RegSetOneRegister(0x38,0x07); 
	RegSetOneRegister(0x2d,0x94); 
	RegSetOneRegister(0x10, 0x78); 
	RegSetOneRegister(0x2c,0x0d); 
	RegSetOneRegister(0x0e, 0x23); 
	RegSetOneRegister(0x04, 0x02); 
 
	RegSetOneRegister(0x00, 0x6b); 
 
     
//	ChipWriteMasked(0x00, 0x01, 1); 
//	ChipWriteMasked(0x00, 0x01, 0); 
} 
 
U32 CTDA10021HDlg::Q10021WriteSymbolRate(U32 uFreqSymb) 
{	 
	U8	pWrite[4], bNdec, bSFil; 
	U32     uBDR, uFreqSymbInv, uFreqSymb240; 
	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=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 
	 
}