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

📄 demod.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// demod.cpp : 僀儞僾儕儊儞僥乕僔儑儞 僼傽僀儖
//

#include "stdafx.h"
#include "demo.h"
#include "demod.h"

#include"math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define STB0899_NBREGS 10


/* MACRO definitions */
#define ABS(X) ((X)<0 ? (-(X)) : (X))
#define MAX(X,Y) ((X)>=(Y) ? (X) : (Y))
#define MIN(X,Y) ((X)<=(Y) ? (X) : (Y)) 
#define INRANGE(X,Y,Z) (((X<=Y) && (Y<=Z))||((Z<=Y) && (Y<=X)) ? 1 : 0)  

#define BYTES2WORD(X,Y) ((X<<8)+(Y))

#define LSB(X) ((X & 0xFF))
#define MSB(Y) ((Y>>8)& 0xFF)

#define WAIT_N_MS(X) Sleep(X)	/* requires windows.h on PC platform */

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


// Cdemod 僟僀傾儘僌

//-----
#include"MainFrm.h"
#include"nim.h"
//-----


Cdemod::Cdemod(CWnd* pParent /*=NULL*/)
	: CDialog(Cdemod::IDD, pParent)
{
	m_pParent=pParent;
	m_nID=Cdemod::IDD;
	//{{AFX_DATA_INIT(Cdemod)
	m_address = _T("");
	m_data = _T("");
	m_mclk = _T("");
	m_xtal = _T("");
	m_rs_onoff = FALSE;
	m_edit_rs_onoff = _T("");
	m_slave_address = _T("");
	//}}AFX_DATA_INIT
}


void Cdemod::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(Cdemod)
	DDX_CBString(pDX, IDC_COMBO_address, m_address);
	DDX_Text(pDX, IDC_EDIT_data, m_data);
	DDX_Text(pDX, IDC_EDIT_mclk, m_mclk);
	DDX_Text(pDX, IDC_EDIT_xtal, m_xtal);
	DDX_Check(pDX, IDC_CHECK_rs_onoff, m_rs_onoff);
	DDX_Text(pDX, IDC_EDIT_rs_onoff, m_edit_rs_onoff);
	DDX_Text(pDX, IDC_EDIT_slave_address, m_slave_address);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(Cdemod, CDialog)
	//{{AFX_MSG_MAP(Cdemod)
	ON_CBN_KILLFOCUS(IDC_COMBO_address, OnKillfocusCOMBOaddress)
	ON_BN_CLICKED(IDC_BUTTON_write, OnBUTTONwrite)
	ON_BN_CLICKED(IDC_BUTTON_read, OnBUTTONread)
	ON_BN_CLICKED(IDC_CHECK_rs_onoff, OnCHECKrsonoff)
	ON_BN_CLICKED(IDC_BUTTON_test, OnBUTTONtest)
	ON_LBN_DBLCLK(IDC_LIST_demod, OnDblclkLISTdemod)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Cdemod 儊僢僙乕僕 僴儞僪儔
//message---
#include "message.h"
void Cdemod::message_add(CString message)
{

}

void Cdemod::show_message()
{
	Cmessage dlg	;
	msg = message_gloval	;
	dlg.message = msg	;
	dlg.DoModal()	;

}

void Cdemod::message_reset()
{
	message_gloval="";
	msg="";
	//time-----
	_ftime( &tstruct_original );
	//---------

}

void Cdemod::message(CString message)
{
	//time-----
	_ftime( &tstruct );
	CString t;
	t.Format( "%.6u |", (tstruct.time*1000+tstruct.millitm)-(tstruct_original.time*1000+tstruct_original.millitm));
	message_gloval+=t;
	message_gloval+="\t";
	//---------
	message_gloval+=message	;
	message_gloval+=" #"	;

}

void Cdemod::message_top(CString t)
{
	t+="#";
	message_gloval=t+message_gloval;

}

//-----
long Cdemod::PowOf2(int number)
{
	int i;
	long result=1;
	
	for(i=0;i<number;i++)
		result*=2;
		
	return result;

}


void Cdemod::OnOK() 
{
	//-----
	((Cnim*)m_pParent)->BoxDone_demod();//051111
//	DestroyWindow();	
	//-----
	CDialog::OnOK();
}

void Cdemod::OnCancel() 
{
	// TODO: 偙偺埵抲偵摿暿側屻張棟傪捛壛偟偰偔偩偝偄丅
	
//	CDialog::OnCancel();
}

BOOL Cdemod::Create()
{
	return CDialog::Create(m_nID,m_pParent);

}

BOOL Cdemod::OnInitDialog() 
{
	CDialog::OnInitDialog();

	init_combo();
	set_list();
	set_dialog_parameter();
	set_dialog_button();

	return TRUE;  // 僐儞僩儘乕儖偵僼僅乕僇僗傪愝掕偟側偄偲偒丄栠傝抣偼 TRUE 偲側傝傑偡
	              // 椺奜: OCX 僾儘僷僥傿 儁乕僕偺栠傝抣偼 FALSE 偲側傝傑偡
}
void Cdemod::OnBUTTONtest() 
{
	message_reset();
	int i;
	int data;
	CString t; 
	for(i=0;i<=0xFF;i++){
		demod_getdata(i,&data);
		t.Format("%.2X,%.2X",i,data);
		((Cnim*)m_pParent)->demod.reg[i]=data;
		message(t);

	}
	show_message();

}

void Cdemod::i2c_write(int *data, int num)
{
	((Cnim*)m_pParent)->m_i2c.i2c_write(data,num);

}



void Cdemod::set_dialog_parameter()
{
	m_slave_address.Format(" %.2X ",slave_address());
	m_xtal.Format(" %.3lf ",demod_xtal()/1.e6); //Hz -> MHz
	m_mclk.Format(" %.1lf ",demod_288_get_mclk_freq(((Cnim*)m_pParent)->demod.reg)/1.e6); //Hz -> MHz
	UpdateData(FALSE);
}

void Cdemod::get_status()
{

}

void Cdemod::nim_receive(long freq_,long baud_,int *byte_,int *register_)
{

message_reset();
message_result_reset();

	demod_288_init(register_);
	demod_288_search(freq_,baud_,byte_,register_);

message_result();
//show_message();

}


void Cdemod::clear_list()
{
	CListBox* pLB=(CListBox*)GetDlgItem(IDC_LIST_demod);
 			pLB->AddString("!");/**/
	while( pLB-> DeleteString( 0 ) );
}

void Cdemod::set_register_from_address_baseaddress()
{

}

void Cdemod::get_register_from_address_baseaddress()
{

}

void Cdemod::stb0899_setdata(long address, long baseaddress, long data,BOOL pointed,int size)
{
}

long Cdemod::stb0899_getdata(long address, long baseaddress)
{
	long data[10]={0,0,0,0};

	return data[0]|(data[1]<<8)|(data[2]<<16)|(data[3]<<24);
}

void Cdemod::set_list()
{
	clear_list();
	CString t,tt,ttt;
	CListBox* pLB=(CListBox*)GetDlgItem(IDC_LIST_demod);
	int i;
	
	t=" address[H]";
	t+="\t";
	t+=" data[H]";
	pLB->AddString(t);

	for(i=0;i<0xFF;i++){
		t.Format("  %.2X",i);	t+="\t\t";
		tt.Format("  %.2X",((Cnim*)m_pParent)->demod.reg[i]);
		t+=tt;
		if(((Cnim*)m_pParent)->demod.reg[i]<0);
		// if(((Cnim*)m_pParent)->demod.reg[i]<0) pLB->AddString("  :\t\t  :");
		else pLB->AddString(t);
	}
}
void Cdemod::get_register()
{
	int address,data;
	UpdateData(TRUE);
	if( (sscanf(m_address, "%x", &address )==TRUE) ){
		demod_getdata(address,&data);
		set_dialog_address_data(address,data);
		((Cnim*)m_pParent)->demod.reg[address]=data;
	}
	else{
	}
}

void Cdemod::set_register()
{
	long address,data;
	UpdateData(TRUE);
	if( (sscanf(m_address, "%x", &address )==TRUE) && (sscanf(m_data, "%x", &data )==TRUE) ){

		demod_setdata(address,data);
		set_dialog_address_data(address,data);

		((Cnim*)m_pParent)->demod.reg[address]=data;

	}
	else{
	}
}
void Cdemod::init_combo()
{
	CString t; 
	CComboBox* pCB_address=(CComboBox*)GetDlgItem(IDC_COMBO_address);
	pCB_address->GetEditSel();

	int i;
	for(i=0;i<0xFF;i++){
		t.Format("%.2X",i); 
		pCB_address->AddString(t);
	}

	UpdateData(FALSE);
}
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************
//******************************************************************************************************************************************************


void Cdemod::bus_open(int *register_)
{
	int address,data;
	address=0x01;
	data=register_[address];
	demod_setdata(address,data|0x80);

}

void Cdemod::bus_close(int *register_)
{
	int address,data;
	address=0x01;
	data=register_[address];
	demod_setdata(address,data&0x7F);
}

void Cdemod::OnKillfocusCOMBOaddress() 
{
}

void Cdemod::demod_setdata(int address, int data)
{

//CString t; 
//t.Format("<demod_setdata::%.2X,%.2X>",address,data); 
//message(t);


	((Cnim*)m_pParent)->demod_setdata(address,data);

}

int Cdemod::slave_address()
{
	return ((Cnim*)m_pParent)->demod.slave_address;
}

void Cdemod::demod_getdata(int address, int *data)
{
	((Cnim*)m_pParent)->demod_getdata(address,data);

//CString t; 
//t.Format("<demod_getdata::%.2X,%.2X>",address,*data); 
//message(t);

}

void Cdemod::set_dialog_address_data(int address, int data)
{
	m_address.Format(" %.2X",address);
	m_data.Format(" %.2X",data);
	UpdateData(FALSE);
}

void Cdemod::OnBUTTONwrite() 
{
	set_register();
	set_list();
}

void Cdemod::OnBUTTONread() 
{
	get_register();
	set_list();
}

int Cdemod::demod_288_search(long freq_, long baud_, int *byte_, int *register_)//kHz,ksps
{
	//V0.04[061109] [STB0288+ix2410]
	//----------------------
	int flag=0;
	int status;

	//V0.05[061204] [TILT1]
	//disable check_signal() in manual search mode
	if(baud_!=0)	//manual search mode
	{
		status=demod_288_algo(freq_,baud_,byte_,register_);//kHz,ksps
	}
	else{			//blind search mode
		if(check_signal(freq_,baud_,byte_,register_) )
		{
	message("  < check signal OK! >");
			status=demod_288_algo(freq_,baud_,byte_,register_);//kHz,ksps
		}
		else{
			status=0;
	message("  < signal not exist !? >");

		}
	}

//		//if(check_signal(freq_,baud_,byte_,register_) )
//		if(1)
//		{
//	message("  < check signal OK! >");
//			status=demod_288_algo(freq_,baud_,byte_,register_);//kHz,ksps
//		}
//		else{
//			status=0;
//	message("  < signal not exist !? >");
//
//		}


	//status=demod_288_algo(freq_,baud_,byte_,register_);//kHz,ksps
	if(status==1) flag=1; //lock
	return flag;
	//----------------------


	/*
	int flag=0;
	int status;
	status=demod_288_algo(freq_,baud_,byte_,register_);//kHz,ksps
	if(status==1) flag=1; //lock
	return flag;
	*/
}

int Cdemod::demod_288_algo(long freq_, long baud_, int *byte_, int *register_) //kHz,ksps
{
CString t; 

	int address;
	int flag=0;
	long MasterClock_Hz;
	long tunfreq_Khz; //kHz
	long SearchFreq_Khz; //kHz
	long SymbolRate_Bds; //sps??
	long coarseOffset_Khz=0;
	long carrierOffset_Khz=0;
	long coarseSymbolRate_Bds=0;
	// long timeout;
	long tdata;
	long kt;
	// long nbErr;
	// long maxPckError;
	//
	long timing=0;
	//
	int retry = 0;
	int symbolrate_ok;
	int lock=0;

	int known = 0; 

	int direcTV = 0;
	//int enabledRates;

	int tunerIQ;
	long MinOffset_Khz=-5000; //-5MHz
	long MaxOffset_Khz=5000; //+5MHz

	//---pIntResults---
	long pIntResults_SymbolRate_Bds;
	int pIntResults_PunctureRate;
	//	typedef enum
	//	{
	//		FE_1_2	= 1,
	//		FE_2_3	= 1<<1,   
	//		FE_3_4	= 1<<2,   
	//		FE_5_6	= 1<<3,
	//		FE_6_7	= 1<<4,
	//		FE_7_8	= 1<<5
	//	}FE_288_Rate_t;
	long pIntResults_Frequency_Khz;
	FE_288_SIGNALTYPE_t pIntResults_SignalType; //
	//	NOAGC1=0,	:1
	//	AGC1OK,		:2
	//	NOTIMING,	:3
	//	ANALOGCARRIER,	:4
	//	TIMINGOK,	:5
	//	NOAGC2,		:6
	//	AGC2OK,		:7
	//	NOCARRIER,	:8
	//	CARRIEROK,	:9
	//	NODATA,		:10
	//	FALSELOCK,	:11
	//	DATAOK,		:12
	//	OUTOFRANGE,	:13
	//	RANGEOK		:14

	//-----------------

	int F288_FECMODE;
	int F288_ALPHA=7;
	int F288_BETA=28;
	int F288_SYM;
	int F288_IND1_ACC=0;
	int F288_IND2_ACC=0xFF;

	SearchFreq_Khz=freq_; //kHz
	SymbolRate_Bds=baud_*1000; //sps?

	FE_288_SIGNALTYPE_t signalType=NOAGC1;

t.Format("SEARCH>> FE_288_Algo::Begin"); message(t);
t.Format("SEARCH>> FE_288_Algo::Searched frequency=%f MHz",(double)(SearchFreq_Khz)/1000.0); message(t);
t.Format("SEARCH>> FE_288_Algo::Search range=+/-%f MHz",(double)(ABS(MaxOffset_Khz))/1000.0); message(t);

	tun_setfreq(freq_,baud_,byte_); /* Set tuner frequency */
	tunfreq_Khz=tun_getfreq(byte_); /* Read tuner frequency */
	/* ( Check tuner status ) */ 
	WAIT_N_MS(100);

message("WAIT_N_MS(100)");

	tunerIQ=get_iq_wiring(); /* Get tuner IQ wiring */
	kt = 56; 
	known = (SymbolRate_Bds!=0);
	coarseOffset_Khz=tunerIQ*(SearchFreq_Khz-tunfreq_Khz); /* begin coarse algorithm with tuner residual offset */

	address=0x30;	demod_getdata(address,&F288_FECMODE);
	F288_FECMODE>>=4;
	F288_FECMODE&=0x0F;
	direcTV = (F288_FECMODE==4); /* Store current FEC mode */

	if(direcTV) {
		//address=0x37;
		//demod_getdata(address,&enabledRates); /* Store enabled puncture rates */
	}

		//		do
		//		{
	do
	{

⌨️ 快捷键说明

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