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