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

📄 nmeaparserdlg.cpp

📁 Read nmea file and send to com port. you can easly simulate the gps application
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// NMEAParserDemoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Parser.h"
#include "NmeaParser.h"
#include "NMEAParserDlg.h"


#define NMEA_SEND_TIMER		100

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

//// UART SETTING
#define UART_SET_PARITY_NONE	(0<<3)
#define UART_SET_PARITY_ODD		(4<<3)
#define UART_SET_PARITY_EVEN	(5<<3)

#define UART_SET_STOPBIT_ONE	(0<<2)
#define UART_SET_STOPBIT_TWO	(1<<2)

#define UART_SET_FRMLEN_5BIT	0
#define UART_SET_FRMLEN_6BIT	1
#define UART_SET_FRMLEN_7BIT	2
#define UART_SET_FRMLEN_8BIT	3

#define MAX_BAUD_RATE		230000

// IO_CTL code
#define IOCTL_GPS_CH0_SETBAUDRATE	0x1000
#define IOCTL_GPS_CH1_SETBAUDRATE	0x1001

//#define IOCTL_GPS_CH0_RXDATA		0x2000
#define IOCTL_GPS_CH1_TXDATA		0x2000

#define IOCTL_GPS_CH0_CLEAR_RXBUFF	0x3000
#define IOCTL_GPS_GET_RXEVENTHANDLE	0x4000

typedef struct {
	DWORD baudrate;
	BYTE bitsetcode;
} Uart_Config_t;


/////////////////////////////////////////////////////////////////////////////
// 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()

/////////////////////////////////////////////////////////////////////////////
// CNMEAParserDemoDlg dialog

HWND hCommWnd;

CNMEAParserDemoDlg::CNMEAParserDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNMEAParserDemoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNMEAParserDemoDlg)
	m_iBaudRate = -1;
	m_strReceive = _T("");
	m_strSend = _T("");
	m_iSerialPort = 0;
	m_iSerialPort2 = 1;
	m_iSerialPort3 = 2;
	m_iSerialPort4 = 3;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	g_errCnt = 0;    //051101hj
	g_nCnt =0;    //051101hj
	hCommWnd = NULL;
}

void CNMEAParserDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNMEAParserDemoDlg)
	DDX_Control(pDX, IDC_PRG_SPEED, m_cSpeed);
	DDX_Control(pDX, IDC_FILE_LOAD, m_cProgress);
	DDX_Control(pDX, IDC_SLIDER_SPEED, m_SendSpeed);
	DDX_Control(pDX, IDC_SERIAL_PORT, m_cSerialPort);
	DDX_Control(pDX, IDC_SEND, m_EditSend);
	DDX_Control(pDX, IDC_RECEIVE, m_EditReceive);
	DDX_Control(pDX, IDC_BAUD_RATE, m_cBaudRate);
	DDX_Control(pDX, IDC_SAT_VIEW, m_SatView);
	DDX_Control(pDX, IDC_SNR0, m_ctrlSNR0);
	DDX_Control(pDX, IDC_SNR1, m_ctrlSNR1);
	DDX_Control(pDX, IDC_SNR2, m_ctrlSNR2);
	DDX_Control(pDX, IDC_SNR3, m_ctrlSNR3);
	DDX_Control(pDX, IDC_SNR4, m_ctrlSNR4);
	DDX_Control(pDX, IDC_SNR5, m_ctrlSNR5);
	DDX_Control(pDX, IDC_SNR6, m_ctrlSNR6);
	DDX_Control(pDX, IDC_SNR7, m_ctrlSNR7);
	DDX_Control(pDX, IDC_SNR8, m_ctrlSNR8);
	DDX_Control(pDX, IDC_SNR9, m_ctrlSNR9);
	DDX_Control(pDX, IDC_SNR10, m_ctrlSNR10);
	DDX_Control(pDX, IDC_SNR11, m_ctrlSNR11);
	DDX_CBIndex(pDX, IDC_BAUD_RATE, m_iBaudRate);
	DDX_Text(pDX, IDC_RECEIVE, m_strReceive);
	DDX_Text(pDX, IDC_SEND, m_strSend);
	DDX_CBIndex(pDX, IDC_SERIAL_PORT, m_iSerialPort);
	DDX_CBIndex(pDX, IDC_SERIAL_PORT2, m_iSerialPort2);
	DDX_CBIndex(pDX, IDC_SERIAL_PORT3, m_iSerialPort3);
	DDX_CBIndex(pDX, IDC_SERIAL_PORT4, m_iSerialPort4);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNMEAParserDemoDlg, CDialog)
	//{{AFX_MSG_MAP(CNMEAParserDemoDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_PORT_OPEN, OnPortOpen)
	ON_BN_CLICKED(IDC_PORT_CLOSE, OnPortClose)
	ON_BN_CLICKED(IDC_FILE_OPEN, OnFileOpen)
	ON_BN_CLICKED(IDC_SEND_DATA, OnSendData)
	ON_BN_CLICKED(IDC_SEND_DATA_CLEAR, OnSendDataClear)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_SPEED, OnReleasedcaptureSliderSpeed)
	ON_MESSAGE(WM_COMM_READ , OnCommunication) //眠啊
	ON_CBN_SELCHANGE(IDC_SERIAL_PORT, OnSelchangeSerialPort)
	ON_CBN_SELCHANGE(IDC_BAUD_RATE, OnSelchangeBaudRate)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BTN_PAUSE, OnBtnPause)
	ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop)
	ON_BN_CLICKED(IDC_CHK_REPEAT, OnChkRepeat)
	ON_BN_CLICKED(IDC_BTN_STEP, OnBtnStep)
	ON_BN_CLICKED(IDC_BTN_UP, OnBtnUp)
	ON_BN_CLICKED(IDC_BTN_DOWN, OnBtnDown)
	ON_BN_CLICKED(IDC_CHECK_YEAR, OnCheckYear)
	ON_BN_CLICKED(IDC_PORT_OPEN2, OnPortOpen2)
	ON_BN_CLICKED(IDC_PORT_OPEN3, OnPortOpen3)
	ON_BN_CLICKED(IDC_PORT_OPEN4, OnPortOpen4)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNMEAParserDemoDlg message handlers
DWORD CPULoadThread(LPVOID lpParameter);
BOOL CNMEAParserDemoDlg::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);

	// 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
	// cglee m_Sio.InitComm(1, 4800, NOPARITY, 8, ONESTOPBIT, FALSE);

	gRxMegaBuf = (BYTE*)malloc( READMAXSIZE);

	InitSnrRange();
	InitSnrPos();

	m_n3DFix = 0;
	m_nSoundCnt = 0;
	m_nSoundTick = 0;

	m_bRepeat = FALSE;

	hCommWnd = m_hWnd;

	m_SendSpeed.SetRange(1, 100, TRUE);
	m_SendSpeed.SetPos(3);
	m_nTimerSpeed = 3;
	InitNmeaData();

	m_cSpeed.SetRange(0,150);
	m_cSpeed.SetPos(0);

// cglee	m_pGraph = new CGraph(SCATTER_GRAPH);
// cglee	m_gPrevDataSet.SetPosition(0,0);

	m_dwDataCount = 0;

	m_bSimYear = TRUE;

	m_NMEAParser.m_pCommPort = m_CommPort;

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

void CNMEAParserDemoDlg::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 CNMEAParserDemoDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

// cglee		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);
	}
#if 0 // cglee
	else
	{
		CWnd* graphFrame = (CWnd*)GetDlgItem(IDC_STATIC_DRAW);
		CDC* pDC = graphFrame->GetDC();

		m_pGraph->DrawGraph(pDC);
		ReleaseDC(pDC);
	}
#endif

	CDialog::OnPaint();
}

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

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CNMEAParserDemoDlg::OnTimer(UINT nIDEvent) 
{
	if ( nIDEvent == NMEA_SEND_TIMER ) {
		SendNmeaData();
		UpdateText();
	}
	
	CDialog::OnTimer(nIDEvent);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

BOOL CNMEAParserDemoDlg::CreateGpsLog(byte * pLogBuf, TCHAR *lFileName, int wCnt)   //051031hj
{
	TCHAR strPath[128]={0,};
	CTime t = CTime::GetCurrentTime();
	_stprintf(strPath,_T("\\Storage Card\\%s%02d%02d.txt"),lFileName,t.GetHour(),t.GetMinute());
	HANDLE m_hFile = ::CreateFile(strPath, 
							GENERIC_WRITE, 
							FILE_SHARE_READ, 
							NULL, 
							CREATE_ALWAYS, 
							FILE_ATTRIBUTE_NORMAL, 
							0);
	if(!m_hFile || m_hFile == INVALID_HANDLE_VALUE)
		return FALSE;
	//WRITE
	SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);

	DWORD dwWriteBytes = 0;
	
	if(!WriteFile(m_hFile, pLogBuf, wCnt, &dwWriteBytes, NULL))
	{
		CloseHandle(m_hFile);
		return FALSE;
	}

	CloseHandle(m_hFile);
	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CNMEAParserDemoDlg::UpdateText()
{
	CString str;	// used for formatting strings
	CString str2;

	//
	// Update NMEA sentence count
	//
	str.Format(_T("Rx:%X"), m_NMEAParser.m_dwCommandCount);
	SetDlgItemText(IDC_NMEA_RX_COUNT, str);
	str.Format(_T("Crc:%X"), m_NMEAParser.m_dwCrcCount);
	SetDlgItemText(IDC_CRC_ERROR_COUNT, str);
	str.Format(_T("Err:%X"), m_NMEAParser.m_dwErrorCount);
	SetDlgItemText(IDC_BUF_ERROR_COUNT, str);
//	str.Format(_T("Etc:%X"), m_NMEAParser.m_dwCommandEtc);
//	SetDlgItemText(IDC_ETC_COUNT, str);

	//
	// GGA Lat/Lon/Alt
	//
	str.Format(_T("Lat:%.04f"), m_NMEAParser.m_dGGALatitude);
	SetDlgItemText(IDC_LAT, str);
	str.Format(_T("Lon:%.04f"), m_NMEAParser.m_dGGALongitude);
	SetDlgItemText(IDC_LON, str);
	str.Format(_T("Alt:%.04f"), m_NMEAParser.m_dGGAAltitude);
	SetDlgItemText(IDC_ALT, str);

	//
	// GGA GPS Quality
	//
	switch(m_NMEAParser.m_btGGAGPSQuality)
	{
		case 0 : str = _T("Not Avail"); break;
		case 1 : str = _T("SPS mode"); break;
		case 2 : str = _T("DGPS mode"); break;
		case 3 : str = _T("PPS mode"); break;
		default : str = _T("Unknown"); break;
	}
	SetDlgItemText(IDC_GPS_QUAL, str);

	//
	// GSA Fix mode and Dops
	//
#if 0 //cglee
	switch(m_NMEAParser.m_btGSAMode)
	{
		case 'M' : str = _T("(Manual)"); break;
		case 'A' : str = _T("(Automatic)"); break;
		default : str = _T("(?)"); break;
	}
	SetDlgItemText(IDC_GSA_MODE,str);
#endif
	switch(m_NMEAParser.m_btGSAFixMode)
	{
		case 1 : str = _T("Not Avail"); break;
		case 2 : str = _T("2D Fix"); break;
		case 3 : str = _T("3D Fix"); break;
		default : str = _T("Unknown"); break;
	}
	SetDlgItemText(IDC_FIX_MODE, str);
	str.Format(_T("VDOP:%.02f"), m_NMEAParser.m_dGSAVDOP);
	SetDlgItemText(IDC_VDOP, str);
	str.Format(_T("HDOP:%.02f"), m_NMEAParser.m_dGSAHDOP);
	SetDlgItemText(IDC_HDOP, str);
	str.Format(_T("PDOP:%.02f"), m_NMEAParser.m_dGSAPDOP);
	SetDlgItemText(IDC_PDOP, str);

	str = _T("");
	str.Format(_T("%4d/%2d/%2d"), m_NMEAParser.m_wRMCYear, m_NMEAParser.m_btRMCMonth,m_NMEAParser.m_btRMCDay);
	SetDlgItemText(IDC_STATIC_DATE, str);

	str = _T("");
	str.Format(_T("%2d:%2d:%2d"), (m_NMEAParser.m_btGGAHour+9)%24, m_NMEAParser.m_btGGAMinute,m_NMEAParser.m_btGGASecond);
	SetDlgItemText(IDC_TIME, str);

	// Speed
	str = _T("");
	str.Format(_T("%.02fKm/h"), m_NMEAParser.m_dRMCGroundSpeed*1.852);
	SetDlgItemText(IDC_SPEED, str);
	m_cSpeed.SetPos(int(m_NMEAParser.m_dRMCGroundSpeed*1.852));

	// Course
	str = _T("");
	str.Format(_T("%.02f"), m_NMEAParser.m_dRMCCourse);
	SetDlgItemText(IDC_COMPASS, str);

	

	//
	// GSA satellites used in solution
	//
	str = _T("");
	for(int i = 0; i < 12; i++)
	{
// cglee		str2.Format(_T("%02d "), m_NMEAParser.m_wGSASatsInSolution[i]);
		str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
		str += str2;
	}
	SetDlgItemText(IDC_SATS_USED_IN_SOL, str);

	m_NMEAParser.m_nInViewAverage = 0.0;
	m_NMEAParser.m_nWorkAverage = 0.0;
	m_NMEAParser.m_nUsedCount = 0;
	m_NMEAParser.m_nGoodSat = 0;
	for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
	{
		if ( m_NMEAParser.m_GSVSatInfo[i].m_bUsedInSolution ) {
			SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
			m_NMEAParser.m_nWorkAverage += m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality;
			m_NMEAParser.m_nUsedCount ++;
			if ( m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality > 36.00 ) m_NMEAParser.m_nGoodSat++;
		}
		else  {
			SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, 0 );
		}
		// Average
		m_NMEAParser.m_nInViewAverage += m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality;
#if 0		
		if ( IsUsedInSolution(m_NMEAParser.m_GSVSatInfo[i].m_wPRN) )
			SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
		else if ( m_NMEAParser.m_btGSAFixMode == 3 ) // 3D Fix
			SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, 0 );
		else
			SetSnr(i, m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality, m_NMEAParser.m_btGSAFixMode );
#endif
	}

	if ( m_NMEAParser.m_wGSVTotalNumSatsInView ) {
		m_NMEAParser.m_nInViewAverage = m_NMEAParser.m_nInViewAverage / (double)m_NMEAParser.m_wGSVTotalNumSatsInView;
		str = _T("");
		str.Format(_T("Veiw:%02d[%.02f]"), m_NMEAParser.m_wGSVTotalNumSatsInView,m_NMEAParser.m_nInViewAverage);
		SetDlgItemText(IDC_SATS_IN_VIEW, str);
	}

	if ( m_NMEAParser.m_nWorkAverage ) {
		m_NMEAParser.m_nWorkAverage = m_NMEAParser.m_nWorkAverage / (double)m_NMEAParser.m_nUsedCount;
		str = _T("");
		str.Format(_T("Work:%02d[%.02f]"), m_NMEAParser.m_nUsedCount, m_NMEAParser.m_nWorkAverage);
		SetDlgItemText(IDC_AVERAGE, str);
	}

	// str2.Format(_T("%02d "), m_NMEAParser.m_wGSASatsInSolution[i]);
	// str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
	// switch(m_NMEAParser.m_btGSAFixMode)

	for(; i < 12; i++)
	{
		SetSnr(i, 0,0);
	}

#if 0 // cglee
	str = _T("");
	for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
	{
		str2.Format(_T("%02d "), m_NMEAParser.m_GSVSatInfo[i].m_wPRN);
		str += str2;
	}
	SetDlgItemText(IDC_GSV_PRN, str);
#endif

#if 0 // cglee
	str = _T("");
	for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
	{
		str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wSignalQuality);
		str += str2;
	}
	SetDlgItemText(IDC_GSV_SNR, str);
	str = _T("");
	for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
	{
		str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wAzimuth);
		str += str2;
	}
	SetDlgItemText(IDC_GSV_AZ, str);


	str = _T("");
	for(i = 0; i < m_NMEAParser.m_wGSVTotalNumSatsInView; i++)
	{
		str2.Format(_T("%03d "), m_NMEAParser.m_GSVSatInfo[i].m_wElevation);
		str += str2;
	}
	SetDlgItemText(IDC_GSV_ELV, str);
#endif

	// cglee
	m_SatView.DrawSatellites(m_NMEAParser.m_GSVSatInfo );
}

///////////////////////////////////////////////////////////////////////////////

HANDLE CNMEAParserDemoDlg::OpenGPSUart( DWORD baudrate, BYTE fbitcode )
{
	return NULL;
}

int CNMEAParserDemoDlg::ColdReset(void)
{

	return 0;

}

void CNMEAParserDemoDlg::InitSnrRange(void)
{
	int nRange = 60;
	m_ctrlSNR0.SetRange(0, nRange);
	m_ctrlSNR1.SetRange(0, nRange);
	m_ctrlSNR2.SetRange(0, nRange);
	m_ctrlSNR3.SetRange(0, nRange);
	m_ctrlSNR4.SetRange(0, nRange);
	m_ctrlSNR5.SetRange(0, nRange);
	m_ctrlSNR6.SetRange(0, nRange);
	m_ctrlSNR7.SetRange(0, nRange);
	m_ctrlSNR8.SetRange(0, nRange);
	m_ctrlSNR9.SetRange(0, nRange);
	m_ctrlSNR10.SetRange(0, nRange);
	m_ctrlSNR11.SetRange(0, nRange);
}


void CNMEAParserDemoDlg::InitSnrPos(void)
{
	m_ctrlSNR0.SetPos(0);
	m_ctrlSNR1.SetPos(0);
	m_ctrlSNR2.SetPos(0);
	m_ctrlSNR3.SetPos(0);
	m_ctrlSNR4.SetPos(0);
	m_ctrlSNR5.SetPos(0);
	m_ctrlSNR6.SetPos(0);
	m_ctrlSNR7.SetPos(0);
	m_ctrlSNR8.SetPos(0);
	m_ctrlSNR9.SetPos(0);
	m_ctrlSNR10.SetPos(0);
	m_ctrlSNR11.SetPos(0);
}

void CNMEAParserDemoDlg::SetSnr(int index, int snr_val, int mode)
{
	CMacProgressCtrl *pSnr=NULL;
	switch ( index ) {
		case 0 : pSnr = &m_ctrlSNR0; break;
		case 1 : pSnr = &m_ctrlSNR1; break;
		case 2 : pSnr = &m_ctrlSNR2; break;
		case 3 : pSnr = &m_ctrlSNR3; break;
		case 4 : pSnr = &m_ctrlSNR4; break;
		case 5 : pSnr = &m_ctrlSNR5; break;
		case 6 : pSnr = &m_ctrlSNR6; break;
		case 7 : pSnr = &m_ctrlSNR7; break;
		case 8 : pSnr = &m_ctrlSNR8; break;
		case 9 : pSnr = &m_ctrlSNR9; break;
		case 10 : pSnr = &m_ctrlSNR10; break;
		case 11 : pSnr = &m_ctrlSNR11; break;
		default : pSnr=NULL;
	}

	if ( pSnr == NULL ) {
		TRACE("\r\nSNR Index Error %d", index);
		return;
	}

#if 0

⌨️ 快捷键说明

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