📄 demod.cpp
字号:
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,®ister_[address]);
address=0x07; demod_getdata(address,®ister_[address]);
address=0x08; demod_getdata(address,®ister_[address]);
address=0x10; demod_getdata(address,®ister_[address]);
address=0x1e; demod_getdata(address,®ister_[address]);
address=0x1f; demod_getdata(address,®ister_[address]);
address=0x24; demod_getdata(address,®ister_[address]);
address=0x25; demod_getdata(address,®ister_[address]);
address=0x26; demod_getdata(address,®ister_[address]);
address=0x27; demod_getdata(address,®ister_[address]);
address=0x2d; demod_getdata(address,®ister_[address]);
address=0x2e; demod_getdata(address,®ister_[address]);
address=0x2f; demod_getdata(address,®ister_[address]);
address=0x3e; demod_getdata(address,®ister_[address]);
address=0x3f; demod_getdata(address,®ister_[address]);
address=0x4b; demod_getdata(address,®ister_[address]);
address=0x4c; demod_getdata(address,®ister_[address]);
address=0x60; demod_getdata(address,®ister_[address]);
address=0x61; demod_getdata(address,®ister_[address]);
address=0x62; demod_getdata(address,®ister_[address]);
address=0x63; demod_getdata(address,®ister_[address]);
address=0x64; demod_getdata(address,®ister_[address]);
address=0x65; demod_getdata(address,®ister_[address]);
address=0x66; demod_getdata(address,®ister_[address]);
address=0x67; demod_getdata(address,®ister_[address]);
address=0x68; demod_getdata(address,®ister_[address]);
address=0x69; demod_getdata(address,®ister_[address]);
address=0x6a; demod_getdata(address,®ister_[address]);
address=0x6b; demod_getdata(address,®ister_[address]);
address=0x6c; demod_getdata(address,®ister_[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 + -