📄 demod.cpp
字号:
// 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 + -