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

📄 demod.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				break;
			case 3: /* Packet errors */

t.Format("demod_288_fecmode:%d\n",demod_288_fecmode(register_)); tt+=t;

				if(demod_288_fecmode(register_) != 0x04)
					ber *= 204; /* DVB */
				else
					ber *= 147; /* DirecTV */
				break;
		}
	}
//MessageBox(tt);	
	return ber;
}

long Cdemod::demod_288_get_error_count()
{
	int lsb,msb;
	demod_getdata(0x27,&lsb);
	demod_getdata(0x26,&msb);
	return (BYTES2WORD(msb,lsb));
}



int Cdemod::demod_288_cf(int *register_)
{
	return (register_[0x24]>>7)&0x01;

}

int Cdemod::demod_288_vstatus_6(int *register_)
{
	return (register_[0x24]>>6)&0x01;

}

int Cdemod::demod_288_vstatus_5(int *register_)
{
	return (register_[0x24]>>5)&0x01;

}

int Cdemod::demod_288_prf(int *register_)
{
	return (register_[0x24]>>4)&0x01;

}

int Cdemod::demod_288_lk(int *register_)
{
	return (register_[0x24]>>3)&0x01;

}

int Cdemod::demod_288_pr(int *register_)
{
	return (register_[0x24])&0x07;
}

int Cdemod::demod_288_errmode(int *register_)
{
	return (register_[0x3B]>>7)&0x01;
}

int Cdemod::demod_288_errsource(int *register_)
{
	return (register_[0x3B]>>4)&0x03;

}

int Cdemod::demod_288_noe(int *register_)
{
	return (register_[0x3B])&0x03;


}

int Cdemod::demod_288_fecmode(int *register_)
{
	return (register_[0x30]>>4)&0x0F;
}

void Cdemod::demod_288_read_data_read_only(int *register_)
{

	int address;
	address=0x00;	demod_getdata(address,&register_[address]);
	address=0x07;	demod_getdata(address,&register_[address]);
	address=0x08;	demod_getdata(address,&register_[address]);
	address=0x10;	demod_getdata(address,&register_[address]);
	address=0x1e;	demod_getdata(address,&register_[address]);
	address=0x1f;	demod_getdata(address,&register_[address]);
	address=0x24;	demod_getdata(address,&register_[address]);
	address=0x25;	demod_getdata(address,&register_[address]);
	address=0x26;	demod_getdata(address,&register_[address]);
	address=0x27;	demod_getdata(address,&register_[address]);
	address=0x2d;	demod_getdata(address,&register_[address]);
	address=0x2e;	demod_getdata(address,&register_[address]);
	address=0x2f;	demod_getdata(address,&register_[address]);
	address=0x3e;	demod_getdata(address,&register_[address]);
	address=0x3f;	demod_getdata(address,&register_[address]);
	address=0x4b;	demod_getdata(address,&register_[address]);
	address=0x4c;	demod_getdata(address,&register_[address]);
	address=0x60;	demod_getdata(address,&register_[address]);
	address=0x61;	demod_getdata(address,&register_[address]);
	address=0x62;	demod_getdata(address,&register_[address]);
	address=0x63;	demod_getdata(address,&register_[address]);
	address=0x64;	demod_getdata(address,&register_[address]);
	address=0x65;	demod_getdata(address,&register_[address]);
	address=0x66;	demod_getdata(address,&register_[address]);
	address=0x67;	demod_getdata(address,&register_[address]);
	address=0x68;	demod_getdata(address,&register_[address]);
	address=0x69;	demod_getdata(address,&register_[address]);
	address=0x6a;	demod_getdata(address,&register_[address]);
	address=0x6b;	demod_getdata(address,&register_[address]);
	address=0x6c;	demod_getdata(address,&register_[address]);

}

int Cdemod::demod_288_timing_lock(int *register_)
{
	return (register_[0x1E]>>7)&0x01;
}

long Cdemod::demod_288_agc(int *register_)
{
	int data;
	data=register_[0x10];
	if(data>0x100/2) { //2's complement
		data=0x100-data;
		data*=-1;
	}
	return data;
}

void Cdemod::demod_288_start_fine_algorithm(int flag, int *register_)
{
	int address=0x50;
	register_[address]&=0xFD;
	register_[address]|=(flag<<1);
	demod_setdata(address,register_[address]);
}

void Cdemod::demod_288_start_coarse_algorithm(int flag, int *register_)
{
	int address=0x50;
	register_[address]&=0xFE;
	register_[address]|=(flag);
	demod_setdata(address,register_[address]);

}

void Cdemod::OnCHECKrsonoff() 
{
	UpdateData(TRUE);
	if(m_rs_onoff) {
		demod_288_set_rs_onoff(0,((Cnim*)m_pParent)->demod.reg);
	}
	else {
		demod_288_set_rs_onoff(1,((Cnim*)m_pParent)->demod.reg);
	}
	set_dialog_button();


}

void Cdemod::set_dialog_button()
{
	if( demod_288_rs_onoff( ((Cnim*)m_pParent)->demod.reg ) ){
		m_edit_rs_onoff=" enabled";
		m_rs_onoff=0;
	}
	else{
		m_edit_rs_onoff=" disabled";
		m_rs_onoff=1;
	}
	UpdateData(FALSE);

}

BOOL Cdemod::demod_288_rs_onoff(int *register_)
{
	BOOL rs_onoff; //1:enable/0:disable
	rs_onoff=(register_[0x39]>>5)&0x01;
	return rs_onoff;
}

void Cdemod::demod_288_set_rs_onoff(BOOL flag, int *register_)
{
	int address=0x39;
	if(flag) register_[address]|=0x20;
	else register_[address]&=0xDF;
	demod_setdata(address,register_[address]);
}


long Cdemod::demod_288_get_timing_loop(int *register_)
{
//CString t;
	int address;
	address=0x22;
	int F288_TIMING_LOOP_FREQ_MSB;
	int F288_TIMING_LOOP_FREQ_LSB;
	long timing;
	demod_getdata(address,&F288_TIMING_LOOP_FREQ_MSB);
	demod_getdata(address+1,&F288_TIMING_LOOP_FREQ_LSB);
	timing=BYTES2WORD(F288_TIMING_LOOP_FREQ_MSB,F288_TIMING_LOOP_FREQ_LSB);
//t.Format("  (demod_288_get_timing_loop: timing=%ld \t(%.8X) )",timing,timing); message(t);
	//仠曄峏丗亄亅嬌惈愝掕
	if(timing>0x10000/2) { //2's complement
		timing=0x10000-timing;
		timing*=-1;
	}
	return timing;
}


void Cdemod::message_result()
{
	CString t; 
	message_top("       |");
	message_top("        ______________________________________________________________________");
	//message_top("     _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/");
	message_top(" ");
	t.Format("signal_type=%d",((Cnim*)m_pParent)->nim_status.signal_type); 
	message_top(t);
	t.Format("symbolrate=%d",((Cnim*)m_pParent)->nim_status.symbolrate); 
	message_top(t);
	t.Format("freq=%d",((Cnim*)m_pParent)->nim_status.freq); 
	message_top(t);
	t.Format("lock_up_time=%d",((Cnim*)m_pParent)->nim_status.lock_up_time); 
	message_top(t);
	if(((Cnim*)m_pParent)->nim_status.signal_type==13) message_top("LOCKED!!");
	else message_top("FALSE ?");
	message_top("< RESULT >");

}

void Cdemod::message_result_reset()
{
	((Cnim*)m_pParent)->nim_status.signal_type=0; 
	((Cnim*)m_pParent)->nim_status.symbolrate=0; 
	((Cnim*)m_pParent)->nim_status.freq=0; 
	((Cnim*)m_pParent)->nim_status.lock_up_time=0; 

}

int Cdemod::get_elapsed_time()
{
	char   *stopstring="";
	_ftime( &tstruct );
	CString t;
	t.Format( "%.3u", (tstruct.time*1000+tstruct.millitm)-(tstruct_original.time*1000+tstruct_original.millitm));
	return strtol( t, &stopstring,10);

}


//V0.03[xxxxxx]
BOOL Cdemod::tun_setbw(long baud_, int *byte_) //ksps
{
	BOOL flag=0;
	((Cnim*)m_pParent)->tun_setbw(baud_,byte_);
	return flag;

}



void Cdemod::OnDblclkLISTdemod() 
{
	OnBUTTONtest();	
}

void Cdemod::demod_read_all_data()
{
	int i;
	int data;
	message_reset();
	CString t; 

	for(i=0;i<=0xFF;i++) {
		demod_getdata(i,&data);
		((Cnim*)m_pParent)->demod.reg[i]=data;
	t.Format("%.2X, %.2X",i,data); 
	message(t);
	}
	show_message();

}


//V0.04[061109] [STB0288+ix2410]
//check signal existence
BOOL Cdemod::check_signal(long freq_, long baud_, int *byte_, int *register_)
{

message(" ");
message("Cdemod::check_signal");
message(" ");

CString t; 
//baud_=45000000;
baud_=50000000;
demod_288_set_symbolrate(baud_,register_); //sps /* Set symbolrate to 1.000MBps (minimum 	symbol rate) */	

	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 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

	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=0*1000; //sps?
	//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 ) */ 

	//--------------------------------
	//--  tuner PLL lock up time	--
	//--  typ:10ms乛max:50ms		--
	//--------------------------------
	WAIT_N_MS(10);	//test 10ms OK??
	// WAIT_N_MS(100); // <- original:100ms
message("WAIT_N_MS(10)");
// 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 */
	}
message(" ");
message("-----1-----");
message(" ");
		/* ( Set maximum tuner bandwidth ) TunerSetBandwidth(hTuner,50000000)*/

t.Format("SEARCH>> FE_288_Algo::Kt=%d",kt); message(t);

		/* Setup of non-modified parameters */
		F288_ALPHA=7;
		F288_BETA=28;
message(" ");
message("-----2-----");
message(" ");

		address=0x16;
		register_[address]&=0xF0;
		register_[address]|=F288_ALPHA;
		demod_setdata(address,register_[address]); //F288_ALPHA

		address+=1;
		register_[address]&=0xC0;
		register_[address]|=F288_BETA;
		demod_setdata(address,register_[address]); //F288_BETA

		if(direcTV) {
			F288_SYM=0;
			address=0x30;
			register_[address]&=0xFE;
			register_[address]|=F288_SYM;
			demod_setdata(address,register_[address]); /* force IQ normal */
		}
message(" ");
message("-----3-----");
message(" ");

		/* Set Kt value */
		address=0x51;
		register_[address]=kt;
		demod_setdata(address,register_[address]);

		demod_288_froze_lock(1,register_);

		F288_IND1_ACC=0;
		F288_IND2_ACC=0xFF;
		address=0x5E;
		register_[address]=F288_IND1_ACC;
		demod_setdata(address,register_[address]);
		address+=1;
		register_[address]=F288_IND2_ACC;
		demod_setdata(address,register_[address]);

		demod_288_set_symbolrate(1000000,register_); //sps /* Set symbolrate to 1.000MBps (minimum 	symbol rate) */	

		demod_288_set_derot_freq(coarseOffset_Khz*1000,register_); //Hz /* Set carrier loop offset to 0KHz or previous iteration value */

		demod_288_set_frequency_offset_detector(1,register_); /* Frequency offset detector on */

		coarseSymbolRate_Bds=demod_288_coarse(register_,&coarseOffset_Khz);/* Symbolrate coarse search */

		coarseOffset_Khz *= tunerIQ;

t.Format("coarseOffset_Khz=%d (%d-%d)",coarseOffset_Khz,MinOffset_Khz,MaxOffset_Khz); message(t);
t.Format("SymbolRate_Bds=%d ",SymbolRate_Bds); message(t);

message(" ");
message("-----4-----");
message(" ");

		if(known) /* symbol rate is already known, so keep only the offset and force the symbol rate */
			demod_288_set_symbolrate(SymbolRate_Bds,register_);
		else /* take into account the symbol rate returned by the coarse algorithm */
			SymbolRate_Bds=coarseSymbolRate_Bds;

t.Format("SEARCH>> FE_288_Algo::SymbolRate=%d Kbds, Offset=%d KHz",SymbolRate_Bds/1000,coarseOffset_Khz); message(t);

		MasterClock_Hz=demod_288_get_mclk_freq(register_);
		if(SymbolRate_Bds>1000) {

message(" if(SymbolRate_Bds>1000)");
t.Format("SymbolRate_Bds=%d ",SymbolRate_Bds); message(t);
t.Format("MasterClock_Hz=%d ",MasterClock_Hz); message(t);
t.Format("(%d) ",MasterClock_Hz/(SymbolRate_Bds/1000)); message(t);

			symbolrate_ok = (MasterClock_Hz/(SymbolRate_Bds/1000))>2100; /* to avoid a divide by zero error */ 

		}
		else {
message(" else {");
			symbolrate_ok = TRUE;
		}

message(" ");
message("-----5-----");
message(" ");

t.Format("SymbolRate_Bds=%d ",SymbolRate_Bds); message(t);

t.Format("%d %d %d %d ",
		 (SymbolRate_Bds >= 1000000) ,
		 (coarseOffset_Khz>=MinOffset_Khz),
		 (coarseOffset_Khz<MaxOffset_Khz),
		 (symbolrate_ok)); 
message(t);

t.Format("coarseSymbolRate_Bds:%d ",
		 (coarseSymbolRate_Bds >= 1000000) 
		 ); 
message(t);




	flag=(SymbolRate_Bds >= 1000000) &
		 (coarseOffset_Khz>=MinOffset_Khz) &
		 (coarseOffset_Khz<MaxOffset_Khz) &
		 (symbolrate_ok) ;

message("");
t.Format("[%d] FREQ=%d",flag,freq_-coarseOffset_Khz); message(t);
message("");



message(" ");
message("Cdemod::check_signal / END---");
message(" ");

	//-----
	//(stop "autocentre algorithm" for lock stablity.[ex, 1404/2.621Msps-blind search])
	demod_288_start_autocenter_algorithm(0,register_); /* STOP autocentre algorithm */
	//-----

	return flag;
}

void Cdemod::message2(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+=" #"	;

}

int Cdemod::demod_288_check_TMG_LOCK()
{
	int flag;
	int F288_TMG_LOCK;
	demod_getdata(0x1E,&F288_TMG_LOCK); 
	F288_TMG_LOCK&=0x80;
	if(F288_TMG_LOCK==0x80) flag=1;
	else flag=0;
	return flag;

}

int Cdemod::democd_288_check_CF()
{
	int flag;
	int F288_CF;
	demod_getdata(0x24,&F288_CF); 
	F288_CF&=0x80;
	if(F288_CF==0x80) flag=1;
	else flag=0;
	return flag;
}


//V0.05[061204]
//lock again after signal re-connected
void Cdemod::demod_288_rewrite_derotetor(int *register_)
{
	long coarseOffset_Khz=0;
	coarseOffset_Khz=((Cnim*)m_pParent)->nim_status.df_last_locked;
	demod_288_set_derot_freq(coarseOffset_Khz*1000,register_); //Hz /* Set carrier loop offset to 0KHz or previous iteration value */
	demod_288_set_frequency_offset_detector(1,register_); /* Frequency offset detector on */

}

⌨️ 快捷键说明

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