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

📄 nim.cpp

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

#include "stdafx.h"
#include "demo.h"
#include "nim.h"

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

/////////////////////////////////////////////////////////////////////////////
// Cnim 僟僀傾儘僌
//-----
#include"MainFrm.h"
//-----

#define update_term 500
#define update_count_max 4


Cnim::Cnim(CWnd* pParent /*=NULL*/)
	: CDialog(Cnim::IDD, pParent)
{
	m_pParent=pParent;
	m_nID=Cnim::IDD;
	//{{AFX_DATA_INIT(Cnim)
	m_freq = _T("");
	m_symbolrate = _T("");
	m_update_data = -1;
	m_agc = _T("");
	m_agc2 = _T("");
	m_spectral_inversion = _T("");
	m_edit_update = _T("");
	m_df = _T("");
	m_vber = _T("");
	m_qpskber = _T("");
	m_pr = _T("");
	m_baud = _T("");
	//}}AFX_DATA_INIT
}


void Cnim::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(Cnim)
	DDX_Control(pDX, IDC_BUTTON_status_lock4, m_status_lock4);
	DDX_Control(pDX, IDC_BUTTON_status_lock3, m_status_lock3);
	DDX_Control(pDX, IDC_BUTTON_status_lock2, m_status_lock2);
	DDX_Control(pDX, IDC_BUTTON_status_lock, m_status_lock);
	DDX_CBString(pDX, IDC_COMBO_freq, m_freq);
	DDX_CBString(pDX, IDC_COMBO_symbolrate, m_symbolrate);
	DDX_Radio(pDX, IDC_RADIO_update, m_update_data);
	DDX_Text(pDX, IDC_EDIT_agc, m_agc);
	DDX_Text(pDX, IDC_EDIT_agc2, m_agc2);
	DDX_Text(pDX, IDC_EDIT_spectral_inversion, m_spectral_inversion);
	DDX_Text(pDX, IDC_EDIT_update, m_edit_update);
	DDX_Text(pDX, IDC_EDIT_df, m_df);
	DDX_Text(pDX, IDC_EDIT_vber, m_vber);
	DDX_Text(pDX, IDC_EDIT_qpskber, m_qpskber);
	DDX_Text(pDX, IDC_EDIT_pr, m_pr);
	DDX_Text(pDX, IDC_EDIT_baud, m_baud);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(Cnim, CDialog)
	//{{AFX_MSG_MAP(Cnim)
	ON_BN_CLICKED(IDC_BUTTON_test, OnBUTTONtest)
	ON_BN_CLICKED(IDC_BUTTON_demod, OnBUTTONdemod)
	ON_BN_CLICKED(IDC_BUTTON_pll, OnBUTTONpll)
	ON_BN_CLICKED(IDC_BUTTON_mop, OnBUTTONmop)
	ON_BN_CLICKED(IDC_BUTTON_receive, OnBUTTONreceive)
	ON_CBN_KILLFOCUS(IDC_COMBO_freq, OnKillfocusCOMBOfreq)
	ON_CBN_KILLFOCUS(IDC_COMBO_symbolrate, OnKillfocusCOMBOsymbolrate)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_RADIO_update, OnRADIOupdate)
	ON_CBN_SETFOCUS(IDC_COMBO_freq, OnSetfocusCOMBOfreq)
	ON_CBN_SETFOCUS(IDC_COMBO_symbolrate, OnSetfocusCOMBOsymbolrate)
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDC_BUTTON_test2, OnBUTTONtest2)
	ON_BN_CLICKED(IDC_BUTTON_init, OnBUTTONinit)
	ON_BN_CLICKED(IDC_BUTTON_ber, OnBUTTONber)
	ON_BN_CLICKED(IDC_BUTTON_autosearch, OnBUTTONautosearch)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Cnim 儊僢僙乕僕 僴儞僪儔

void Cnim::OnOK() 
{
	kill_timer();
	//-----
	((CMainFrame*)m_pParent)->BoxDone_nim();
//	DestroyWindow();	
	//-----

	m_pll->DestroyWindow();
	m_demod->DestroyWindow();
	
	CDialog::OnOK();
}

void Cnim::OnCancel() 
{
//	CDialog::OnCancel();
}

void Cnim::OnBUTTONtest() 
{
	demod_read_all_data();


//
//		update();
//	//	m_demod->demod_288_calc_symbolrate_test(demod.reg);
//
//
//	//		//BinaryFloatDiv(SymbolRate,MasterClock_Hz,20);
//	//
//	//		CString t; 
//	//		t.Format("%X",m_demod->BinaryFloatDiv(27500,100000,20)); MessageBox(t);
//	//	//	t.Format("%X",m_demod->BinaryFloatDiv(50000,100000,20)); MessageBox(t);
//	//		;
//	//
//	//		//open_dialog_ber();

}

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

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

void Cnim::open_dialog_demod()
{
	//modless dialog
	//if (m_demod == NULL)
	if (!m_demod->IsWindowVisible())
	{
		if (1)
		{
			//m_demod = new Cdemod(this);
			if (m_demod->Create() == TRUE){
	//			GetDlgItem(IDOK)->EnableWindow(FALSE);
			}
		}
		else
			m_demod->SetActiveWindow();	
	}
}

void Cnim::BoxDone_demod()
{
	BoxDone();
//						//m_demod=NULL;
//						BoxDone();

}

void Cnim::open_dialog_pll()
{
	//modless dialog
	//if (m_pll == NULL)
	if (!m_pll->IsWindowVisible())
	{
		//m_pll = new Cpll(this);

//				m_pll->tuner->freq=d[1];
//				int i;
//				for(i=0;i<5;i++) m_pll->tuner->byte[i]=d[20+i];

		if (m_pll->Create() == TRUE){
//			GetDlgItem(IDOK)->EnableWindow(FALSE);
		}
	}
	else
		m_pll->SetActiveWindow();
}

void Cnim::BoxDone_pll()
{
	//m_pll=NULL;
	BoxDone();
}



void Cnim::BoxDone()
{
	if( (m_pll==NULL) &&(m_demod==NULL)/**/ ){
//		GetDlgItem(IDOK)->EnableWindow();
	}

}

void Cnim::OnBUTTONdemod() 
{
	kill_timer();
	open_dialog_demod();
}

void Cnim::OnBUTTONpll() 
{
	kill_timer();
	open_dialog_pll();
}

void Cnim::OnBUTTONmop() 
{
	open_dialog_mop();
}
void Cnim::BoxDone_mop()
{
	m_mop=NULL;
	BoxDone();
	
}
void Cnim::open_dialog_mop()
{
	//modless dialog
	if (m_mop == NULL)
	{
		m_mop = new Cmop(this);
		if (m_mop->Create() == TRUE){
//			GetDlgItem(IDOK)->EnableWindow(FALSE);
		}
	}
	else
		m_mop->SetActiveWindow();
}



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


	init_pll_demod_dialog();
	init_combo();
	set_dialog();
	init_dialog_status();

	init_i2c();

	update_on_off=0;
	update_count=0;

	return TRUE;  // 僐儞僩儘乕儖偵僼僅乕僇僗傪愝掕偟側偄偲偒丄栠傝抣偼 TRUE 偲側傝傑偡
	              // 椺奜: OCX 僾儘僷僥傿 儁乕僕偺栠傝抣偼 FALSE 偲側傝傑偡
}

void Cnim::set_dialog()
{
	CString t; 
	t.Format(" %.3lf",double(tuner.freq)/1000000.); //Hz -> MHz
	//	t.Format(" %.3lf",tuner.freq_/1000.); //Hz -> MHz
	m_freq=t;
	t.Format(" %.3lf",double(demod.symbolrate)/1000000.); //sps -> Msps
	//	t.Format(" %.3lf",demod.symbolrate_/1000.); //ksps -> Msps
	m_symbolrate=t;
	UpdateData(FALSE);

}

void Cnim::get_dialog()
{
//	long data;
	double data_double;
	UpdateData(TRUE);
	//freq
	sscanf(m_freq, "%lf", &data_double );
	tuner.freq=unsigned long(data_double*1000000.);//hz
	//	tuner.freq_=data_double*1000.;//kHz
	//sybmolrate
	sscanf(m_symbolrate, "%lf", &data_double );
	demod.symbolrate=int(data_double*1000000.);//sps
	//	demod.symbolrate_=data_double*1000.;//ksps
}

void Cnim::OnBUTTONinit() 
{
	kill_timer();
	nim_reset();
}

void Cnim::OnBUTTONreceive() 
{
	get_dialog();
	m_demod->message_reset();
	nim_reset();
	nim_receive();
	// m_demod->show_message();

//____________________________________________________________
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
m_demod->message_reset();
CString t;
t.Format("%d\n",nim_status.signal_type);m_demod->message(t);
t.Format("%ld\n",nim_status.symbolrate);m_demod->message(t);
t.Format("%ld\n",nim_status.freq);m_demod->message(t);
//m_demod->show_message();
//____________________________________________________________
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	start_timer();
}

BOOL Cnim::nim_reset()
{
	BOOL flag=0;
	m_demod->demod_288_init(demod.reg);
	return flag;
}

BOOL Cnim::nim_receive()
{
	BOOL flag=0;
	long freq_;
	long baud_;
	int byte_[10];
	int register_[0x1FF];
	int i;
	freq_=tuner.freq/1000; //Hz -> kHz [Hz:unsigned long!!]
	baud_=demod.symbolrate/1000; //sps -> ksps
	for(i=0;i<5;i++) byte_[i]=tuner.byte[i];
	for(i=0;i<0xFF;i++) register_[i]=demod.reg[i];

//CString t; t.Format("freq_=%ld,%ld",freq_,tuner.freq); MessageBox(t);

	m_demod->nim_receive(freq_,baud_,byte_,register_); //kHz,ksps

	//V0.02[060613]
	//update register value after "nim_receive"
	for(i=0;i<5;i++) tuner.byte[i]=byte_[i];
	for(i=0;i<0xFF;i++) demod.reg[i]=register_[i];

	return flag;

}

BOOL Cnim::tun_setfreq(long freq,long baud,int *byte) //kHz
//BOOL Cnim::tun_setfreq()
{
	BOOL flag=0;
	m_pll->tun_setfreq(freq,baud,byte);//kHz
	return flag;
}


//iiiii
void Cnim::init_i2c()
{
		m_i2c.LINK_IC_ADDRESS=demod.slave_address; //DLL;
		m_i2c.Init();
}

void Cnim::test()
{
}

void Cnim::i2c_write(int *data, int num)
{
	int data_[10];
	int i;
	for(i=1;i<num;i++) data_[i-1]=data[i];
	i2c_read_write(1,data[0],&data_[0],num-1);

	//unsigned char data_[10];
	//int i;
	//for(i=1;i<num;i++) data_[i-1]=data[i];
	//i2c_read_write(1,data[0],&data_[0],num-1);
}

void Cnim::init_combo()
{
	CString t;
	double symbolrate[100]={ 1. ,2. ,5. ,10. ,15. ,20. ,21.096 ,22. ,27.5 , 30. ,35. ,40. ,42. ,45. ,-1};
	//double symbolrate[100]={ 20. , 24.45 , 27.5 , 30. ,-1};

	CComboBox* pCB_freq=(CComboBox*)GetDlgItem(IDC_COMBO_freq);
	while( (pCB_freq->DeleteString(0))>0 );
	CComboBox* pCB_symbolrate=(CComboBox*)GetDlgItem(IDC_COMBO_symbolrate);
	while( (pCB_symbolrate->DeleteString(0))>0 );
	int i;
	for(i=950 ; i<=2150; i+=100){
		t.Format("%.3lf",double(i) );
		pCB_freq->AddString(t);
	}
	i=0;
	do{
		t.Format("%.3lf",symbolrate[i] );
		pCB_symbolrate->AddString(t);
		i++;
	}while(symbolrate[i]>0);

}

void Cnim::init_pll_demod_dialog()
{
	m_demod = new Cdemod(this);
	m_pll = new Cpll(this);
	m_ber = new Cber(this);
	m_autosearch = new Cautosearch(this);
}

void Cnim::OnKillfocusCOMBOfreq() 
{
	get_dialog();
	set_dialog();
}

void Cnim::OnKillfocusCOMBOsymbolrate() 
{
	get_dialog();
	set_dialog();
}

int Cnim::pll_getdata(int *byte_)
{
	bus_open();
	int data[10];
	i2c_read_write(0,byte_[0],data,1);
	return data[0];
}

void Cnim::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==0)
	{
		UpdateData(TRUE);
		update();

		//V0.02[060125]
		update_count+=1;
		if(update_count>update_count_max) update_count=0;

		if(m_update_data)	m_update_data=0;
		else				m_update_data=1;
		UpdateData(FALSE);

		//V0.05[061204]
		//lock again after signal re-connected
		observe_tuner();
	}
	
	CDialog::OnTimer(nIDEvent);
}

void Cnim::kill_timer()
{
	update_on_off=0;
	m_update_data=1;
	m_edit_update="";
	KillTimer(0);
	UpdateData(FALSE);
}

void Cnim::update()
{
	if(!m_i2c.check_i2c())	set_dialog_status(); //OK
	else 	{
		//kill_timer();
		set_dialog_status_error(); //ERROR!
	}

}

void Cnim::OnRADIOupdate() 
{
	if(update_on_off){
		kill_timer();
		update_on_off=0;		
	}
	else{
		update_on_off=1;		
//		SetTimer(0,500,NULL);
		SetTimer(0,update_term,NULL);
	}
	UpdateData(FALSE);
}

long Cnim::test2()
{
	long data[10]={0,0,0,0};
	m_i2c.start_s(); 
	m_i2c.data_s(0xD0); m_i2c.a_s();
	m_i2c.data_s(0xF3); m_i2c.a_s();	 //m_i2c.data_s(/*0xF3*/0xFA); m_i2c.a_s();
	m_i2c.data_s(0xFC); m_i2c.a_s();
	//
//	m_i2c.data_s(0x40); m_i2c.a_s();
//	m_i2c.data_s(0x04); m_i2c.a_s();
	m_i2c.data_s(0x00); m_i2c.a_s();
	m_i2c.data_s(0x00); m_i2c.a_s();
	m_i2c.data_s(0x00); m_i2c.a_s();
	m_i2c.data_s(0x00); m_i2c.a_s();
	m_i2c.stop_s();

	//0-----
		m_i2c.start_s(); 
		m_i2c.data_s(0xD0); m_i2c.a_s();
		m_i2c.data_s(0xF3); m_i2c.a_s();
		m_i2c.data_s(0x0C); m_i2c.a_s();
		m_i2c.stop_s();
		m_i2c.start_s(); 
		m_i2c.data_s(0xD1); m_i2c.a_s();
		data[0]=m_i2c.data_g(); m_i2c.a_s();
		m_i2c.stop_s();
	//1-----
		m_i2c.start_s(); 
		m_i2c.data_s(0xD0); m_i2c.a_s();
		m_i2c.data_s(0xF3); m_i2c.a_s();
		m_i2c.data_s(0x0D); m_i2c.a_s();
		m_i2c.stop_s();
		m_i2c.start_s(); 
		m_i2c.data_s(0xD1); m_i2c.a_s();
		data[1]=m_i2c.data_g(); m_i2c.a_s();
		m_i2c.stop_s();

	//2-----
		m_i2c.start_s(); 
		m_i2c.data_s(0xD0); m_i2c.a_s();
		m_i2c.data_s(0xF3); m_i2c.a_s();
		m_i2c.data_s(0x0E); m_i2c.a_s();
		m_i2c.stop_s();
		m_i2c.start_s(); 
		m_i2c.data_s(0xD1); m_i2c.a_s();
		data[2]=m_i2c.data_g(); m_i2c.a_s();
		m_i2c.stop_s();

	//3-----
		m_i2c.start_s(); 

⌨️ 快捷键说明

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