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

📄 test4gdlg.cpp

📁 用于误码仪测试
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Test4GDlg.cpp : implementation file
//
//20070806 从“误码仪软件070514(有调试接口)”版本进行了简化
#include "stdafx.h"
#include "Test4G.h"
#include "Test4GDlg.h"



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


signed __int64 nAccTransNum=0;
signed __int64 nCurTransNum=0;
signed __int64 AccOverFlow=0;
float rate[8]={1.25, 1.0625, 2.125, 4.25, 2.5, 0.15552, 0.62208, 2.48832};	
unsigned __int64 TimerSetValue=0;
unsigned __int64 nTimerReadBack=0;
BYTE Value_PATCHK_CTRL[5]	=	{0x00,0x01,0x02,   0x03,0x04};
BYTE Value_PATGEN_CTRL[5]	=	{0x00,0x01,0x02,   0x03,0x04};
//								PRBS7,PRBS23,PRBS31,UDF64,UDF40


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest4GDlg dialog

CTest4GDlg::CTest4GDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTest4GDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTest4GDlg)
	m_nTimer = 10;
	m_radioTX = 0;
	m_nAccErrNum = 0;
	m_nCurErrNum = 0;
	m_strAccErrRate = _T("0.0");
	m_nSelCombox = 0;
	m_nPort = 1;
	m_strPastTime = _T("00:00:00");
	m_strRxConnect = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTest4GDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTest4GDlg)
	DDX_Control(pDX, IDC_EDIT_ERROR, m_ctrError);
	DDX_Control(pDX, IDC_EDIT_RX_CONNET, m_ctrRxConnect);
	DDX_Control(pDX, IDC_PROGRESS1, m_progress);
	DDX_Control(pDX, IDC_EDIT_ACC_RATE, m_ctrEditAccRate);
	DDX_Control(pDX, IDC_EDIT_ACC_NUM, m_ctrEditAccNum);
	DDX_Control(pDX, IDC_EDIT_CUR_NUM, m_ctrEditCurNum);
	DDX_Control(pDX, IDC_MSCOMM1, m_Com);
	DDX_Text(pDX, IDC_EDIT_TIMER, m_nTimer);
	DDX_Radio(pDX, IDC_RADIO_T125G, m_radioTX);
	DDX_Text(pDX, IDC_EDIT_ACC_NUM, m_nAccErrNum);
	DDX_Text(pDX, IDC_EDIT_CUR_NUM, m_nCurErrNum);
	DDX_Text(pDX, IDC_EDIT_ACC_RATE, m_strAccErrRate);
	DDX_CBIndex(pDX, IDC_COMBO1, m_nSelCombox);
	DDX_CBIndex(pDX, IDC_COM_PORT, m_nPort);
	DDX_Text(pDX, IDC_EDIT_PAST_TIME, m_strPastTime);
	DDX_Text(pDX, IDC_EDIT_RX_CONNET, m_strRxConnect);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTest4GDlg, CDialog)
	//{{AFX_MSG_MAP(CTest4GDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_SETTING, OnButtonSetting)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
	ON_BN_CLICKED(IDC_BUTTON_RUN, OnButtonRun)
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)
	ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest4GDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

//	m_ctrCombo1.SetCurSel(0);
//	m_ctrCombo2.SetCurSel(0);
	FlagSetting=0;
	ConnectError=-1;


	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(FALSE);	
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);

	m_font.CreatePointFont(200,"宋体");
	m_ctrEditCurNum.SetFont(&m_font);
	m_ctrEditAccNum.SetFont(&m_font);
	m_ctrEditAccRate.SetFont(&m_font);
	m_ctrRxConnect.SetFont(&m_font);
	m_ctrError.SetFont(&m_font);


	m_progress.SetRange(1,100);
	m_progress.SetStep(1);
	m_progress.SetPos(0);


	 
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTest4GDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTest4GDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTest4GDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}



// 对24C02的读、写
// extern void DelayMs(unsigned int);
// extern void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
// extern void Write24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);

/***************************************************************************/
#define WriteDeviceAddress 0x8E
#define ReadDviceAddress 0x8F

/***************************************************************************/
//#define SCL(BOOL bNewValue)		SetRTSEnable(int i);
//#define SDA(BOOL bNewValue)		SetDTREnable(BOOL bNewValue);
//#define SDAR	GetCTSHolding();				
void CTest4GDlg::SCL(int i)
{
//	int k=m_Com.GetHandshaking();
	if(i==0)
		m_Com.SetRTSEnable(TRUE);
	else
		m_Com.SetRTSEnable(FALSE);
//	k=m_Com.GetRTSEnable();

}

void CTest4GDlg::SDA(int i)
{
	if(i==0)
		m_Com.SetDTREnable(TRUE);
	else
		m_Com.SetDTREnable(FALSE);

}

unsigned char CTest4GDlg::SDAR()
{
	if(m_Com.GetCTSHolding())
		return 0;
	else return 1;

}

/***************************************************************************/

void CTest4GDlg::DelayMs(unsigned int timems)
{
	double dTimerValue;
//timeus=30000000;
	dTimerValue=timems*1.0/1000;
	
	LARGE_INTEGER litmp; 
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim; 
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 获得初始值
    do
       {
          QueryPerformanceCounter(&litmp);
          QPart2 = litmp.QuadPart;//获得中止值
          dfMinus = (double)(QPart2-QPart1);
          dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
       }while(dfTim<dTimerValue);
}

/***************************************************************************/
void CTest4GDlg::Start() 
{
	 SDA(1);
	 SCL(1);
	 SDA(0);
	 SCL(0);
}

/***************************************************************************/
void CTest4GDlg::Stop() 
{
	 SCL(0);
	 SDA(0);
	 SCL(1);
	 SDA(1);
}

/***************************************************************************/
void CTest4GDlg::Ack() 
{
	 SDA(0);
	 SCL(1);
	 SCL(0);
	 SDA(1);
}

/***************************************************************************/
void CTest4GDlg::NoAck() 
{
	 SDA(1);
	 SCL(1);
	 SCL(0);
//	 SDA(1);//
}

/***************************************************************************/
void CTest4GDlg::TestAck() 
{
	 unsigned char ErrorBit;
	 SDA(1);
	 SCL(1);
//	 SDA(0);//ADD
	 ErrorBit=SDAR();
	 SCL(0);
	// return(ErrorBit);
}

/***************************************************************************/
void CTest4GDlg::Write8Bit(unsigned char input)
{
	 unsigned char temp;
	 for(temp=8;temp!=0;temp--)
	 {
		if((input&0x80)==0x80)
				SDA(1);
		else	SDA(0);
		SCL(1);
		SCL(0);
		input=input<<1;
	 }
}

/***************************************************************************/
void CTest4GDlg::WriteDevice(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
{
	 Start();
	 Write8Bit(WriteDeviceAddress);
	 TestAck();
	 Write8Bit(RomAddress);
	 TestAck();
	 for(;number!=0;number--) {
	  Write8Bit(*Wdata);
	  TestAck();
	  Wdata++;
	 }
	 Stop();
	 DelayMs(2);
}

/***************************************************************************/
void CTest4GDlg::WriteByteDevice(unsigned char data,unsigned char RomAddress)
{
	 Start();
	 Write8Bit(WriteDeviceAddress);
	 TestAck();
	 Write8Bit(RomAddress);
	 TestAck();
 
	 Write8Bit(data);
	 TestAck();

	 Stop();
	 DelayMs(2);
}

/***************************************************************************/
unsigned char CTest4GDlg::Read8Bit()
{
	 unsigned char temp,rbyte=0;
	 for(temp=8;temp!=0;temp--) {
	  SCL(1);
	  rbyte=rbyte<<1;
	  rbyte=rbyte| SDAR();
	  SCL(0);
	 }
	 return(rbyte);
}

/***************************************************************************/
void CTest4GDlg::ReadDevice(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
{
	// unsigned char temp,rbyte;
	 Start();
	 Write8Bit(WriteDeviceAddress);
	 TestAck();
	 Write8Bit(RomAddress);
	 TestAck();
	 Start();
	 Write8Bit(ReadDviceAddress);
	 TestAck();
	 while(bytes!=1) {
	 *RamAddress=Read8Bit();
	 Ack();
	 RamAddress++;
	 bytes--;
	 }
	 *RamAddress=Read8Bit();
	 NoAck();
	 Stop();
}



unsigned char CTest4GDlg::ReadByteDevice(unsigned char RomAddress)
{
	 unsigned char data;
/*	 for(int i=0;i<100;i++)
	 {	
		SDA(1);
		SDA(0);
	 }*/

DelayMs(1);
	 Start();
DelayMs(1);
	 Write8Bit(WriteDeviceAddress);
DelayMs(1);
	 TestAck();
DelayMs(1);
	 Write8Bit(RomAddress);
DelayMs(1);
	 TestAck();
DelayMs(1);
	 Start();
DelayMs(1);
	 Write8Bit(ReadDviceAddress);
DelayMs(1);
	 TestAck();
DelayMs(1);
	 data=Read8Bit();
DelayMs(1);
	 NoAck();
DelayMs(1);
	 Stop();
	 return data;
}

#define Addr_CMU_STATUS				0x00
#define Addr_RX_STATUS				0x01
#define Addr_TX_STATUS				0x02
#define Addr_FIFO_STATUS			0x08
#define Addr_RX_SDU_CTRL			0x10
#define Addr_TX_SDU_CTRL			0x12
#define Addr_MODE_CTRL_0			0x17
#define Addr_TX_FIFO_CTRL			0x1E
#define Addr_RX_FT_MODE				0x1F
#define Addr_TX_FT_MODE				0x20
#define Addr_RX_DATA_CTRL			0x21
#define Addr_TX_DATA_CTRL			0x22
#define Addr_CMU_RATE_CTRL			0x23
#define Addr_RX_RATE_CTRL			0x24
#define Addr_TX_RATE_CTRL			0x25
#define Addr_REFCLK_CTRL			0x26
#define Addr_RXIN_CTRL				0x28
#define Addr_RXOUT_CTRL				0x29
#define Addr_TXIN_CTRL				0x2A
#define Addr_TXOUT_CTRL				0x2B
#define Addr_RXCLK_CTRL				0x2C
#define Addr_PATCHK_UD64			0x3A	//8 BYTES
#define Addr_PATCHK_UD40			0x3D	//5 BYTES
#define Addr_PATCHK_TIMER_SET		0x42	//5 BYTES
#define Addr_PATCHK_TIMER_READBACK	0x47	//5 BYTES
#define Addr_PATERR_COUNT			0x4E	//4 BYTES
#define Addr_PATCHK_CTRL			0x52	
#define Addr_PATCHK_STATUS			0x54	
#define Addr_PATGEN_UD64			0x5A	//8 BYTES
#define Addr_PATGEN_UD40			0x5D	//5 BYTES
#define Addr_PATGEN_CTRL			0x62	
#define Addr_RESET                  0x7F


void CTest4GDlg::OnButtonSetting() 
{

	if(nHardwareReady!=1)
	{
		MessageBox("未检测到误码仪,请检查");
		return;
	}
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(TRUE);	
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
	UpdateData(TRUE);//获取对话框数据
								  //1.25G,1.0625G, 2.125G, 4.25G, 2.5G,   155M, 622M,2.48G	
	BYTE Value_CMU_RATE_CTRL[8]	=	{0xE0, 0xA0,   0xA0,	0xA0, 0xE0,   0x60,0x60,0x60};
	BYTE Value_RX_RATE_CTRL[8]	=	{0xA0, 0xA0,   0xC0,	0xE0, 0xC0,   0x00,0x80,0xC0};
	BYTE Value_TX_RATE_CTRL[8]	=	{0xA0, 0xA0,   0xC0,	0xE0, 0xC0,   0x00,0x80,0xC0};


//基本配置
	WriteByteDevice(0x9C,Addr_RX_SDU_CTRL);
	WriteByteDevice(0x9C,Addr_TX_SDU_CTRL);
	WriteByteDevice(0x18,Addr_MODE_CTRL_0);
	WriteByteDevice(0x20,Addr_TX_FIFO_CTRL);



	WriteByteDevice(0x40,Addr_RX_FT_MODE);
	WriteByteDevice(0x40,Addr_TX_FT_MODE);
	//TX/RX DATA CTRL BY TX/RXOEN BIT
	WriteByteDevice(0x88,Addr_RX_DATA_CTRL);
	WriteByteDevice(0x88,Addr_TX_DATA_CTRL);

	WriteByteDevice(0x66,Addr_RXIN_CTRL);
	WriteByteDevice(0x03,Addr_RXOUT_CTRL);
	WriteByteDevice(0x66,Addr_TXIN_CTRL);
	WriteByteDevice(0x03,Addr_TXOUT_CTRL);
	WriteByteDevice(0x40,Addr_RXCLK_CTRL);

	UpdateData(TRUE);

	//速率设置
	//default RCK=0,fast reference clock:125M,106.25M,155.52MHZ
	//CMU_Rate_CTRL default CMU Divider=20,CMU-DIV_SEL[1:0]=11;
	nSelRadio=m_radioTX;

	WriteByteDevice(Value_CMU_RATE_CTRL[nSelRadio],Addr_CMU_RATE_CTRL);
	WriteByteDevice(Value_RX_RATE_CTRL[nSelRadio],Addr_RX_RATE_CTRL);
	WriteByteDevice(Value_TX_RATE_CTRL[nSelRadio],Addr_TX_RATE_CTRL);	


	//码型设置m_nSelComb
	nSelCombo=m_nSelCombox;//m_ctrCombo1.GetCurSel();	//获取码型选择序号

	unsigned char UserDefined40bit[5]={0x3E,0xB0,0x53,0xEB,0x05};//K28.5码型,自定义
	unsigned char UserDefined64bit[8]={0x3E,0x8F,0xA3,0xE8,0xFA};//+k28.5码型,自定义

	
	if(nSelCombo==3)	
	{
		for(int i=0;i<8;i++)
			WriteByteDevice(UserDefined64bit[i],Addr_PATGEN_UD64+i);	
	}
	else if(nSelCombo==4)
	{
		for(int i=0;i<5;i++)
			WriteByteDevice(UserDefined40bit[i],Addr_PATGEN_UD40+i);	
	}
	
//		WriteDevice(PaternK285,Addr_PATGEN_UD40,5);//k28.5 user define
//	WriteDevice(PaternK285P,Addr_PATGEN_UD40,5);//+k28.5 user define

	ValueTemp=Value_PATCHK_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//checker 码型选择设置

	ValueTemp=Value_PATGEN_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);// GEN 码型选择设置
	
	FlagSetting=1;




}

void CTest4GDlg::OnButtonClear() 
{

	m_nCurErrNum=0;
	m_nAccErrNum=0;
	nAccTransNum=0;


	ReadByteDevice(Addr_CMU_STATUS);//清CMU_STATUS
	ReadByteDevice(Addr_RX_STATUS);//清RX_STATUS
	ReadByteDevice(Addr_TX_STATUS);//清TX_STATUS
	ReadByteDevice(Addr_FIFO_STATUS);//清FIFO_STATUS	

	ValueTemp=Value_PATCHK_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start checker=0,	
	ValueTemp=Value_PATGEN_CTRL[nSelCombo];	//disable pattern EN
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start checker=0,




	GetDlgItem(IDC_EDIT_ACC_NUM)->SetWindowText("0");
	GetDlgItem(IDC_EDIT_CUR_NUM)->SetWindowText("0");
	GetDlgItem(IDC_EDIT_ACC_RATE)->SetWindowText("0");


	
}

void CTest4GDlg::OnTimer(UINT nIDEvent) 
{

⌨️ 快捷键说明

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