// 9222cdmaDlg.cpp : implementation file // #include "stdafx.h" #include "9222cdma.h" #include "9222cdmaDlg.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #ifndef M_PI #define M_PI 3.14159265359 #endif #define P922X_TIMEBASE 80000000.0 #define AI_READ_COUNT 8000 #define AI_SAMPLE_INTERV 10000 #define PATTERN_SIZE 1024 U32 wPattern1[PATTERN_SIZE]; // SineWave U32 wPattern2[PATTERN_SIZE]; // Triangle CRect plotRect; // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // C9222cdmaDlg dialog C9222cdmaDlg::C9222cdmaDlg(I16 hCard, CWnd* pParent /*=NULL*/) : CDialog(C9222cdmaDlg::IDD, pParent) { U32 vi; double fTmp; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); n_PlotWidth = n_PlotHeight = -1; OnBrush = OffBrush = NULL; min_val = 0x00; max_val = 0xFFFF; m_dwSampIntrv = 10000; m_hCard = hCard; m_nTimer = -1; m_hAIMem1 = NULL; m_hAIMem2 = NULL; m_hAOMem1 = NULL; m_hAOMem2 = NULL; m_wRange = AD_B_10_V; max_range = 10.0; min_range = -10.0; m_dwWriteCount = 4096; m_wPostCount = 512; m_dwOverrunCnt = 0; m_dwRdyBufCnt = 0; // Setup the patterns for(vi=0; vi= 256) && ( vi < 768) ) { fTmp = 32768.0 - 128.0 * (double)( vi - 256 ); } else if( vi < 1024 ) { fTmp = 128.0 * (double)( vi - 768 ) - 32768.0; } fTmp = (fTmp)/2; wPattern2[vi] = (U16)(fTmp)+0x00008000; } } void C9222cdmaDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(C9222cdmaDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_DESTROY() ON_WM_VSCROLL() ON_BN_CLICKED(IDC_BT_START, &C9222cdmaDlg::OnStart) ON_BN_CLICKED(IDC_BT_STOP, &C9222cdmaDlg::OnStop) ON_WM_TIMER() END_MESSAGE_MAP() // C9222cdmaDlg message handlers BOOL C9222cdmaDlg::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) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); 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 x_divider = 5; y_divider = 4; OnBrush = CreateSolidBrush( RGB(255,0,0) ); OffBrush = CreateSolidBrush( RGB(125,0,0) ); RedPen.CreatePen( PS_SOLID, 1, RGB(255,0,0)); GreenPen.CreatePen( PS_SOLID, 1, RGB(0,255,0)); YellowPen.CreatePen( PS_SOLID, 1, RGB(255,255,0)); BluePen.CreatePen( PS_SOLID, 1, RGB(0,0,255)); LTBluePen.CreatePen( PS_SOLID, 1, RGB(0,128,255)); LTRedPen.CreatePen( PS_SOLID, 1, RGB(255,128,0)); LTGreenPen.CreatePen( PS_SOLID, 1, RGB(0,128,0)); WhitePen.CreatePen( PS_SOLID, 1, RGB(255,255,255)); if( n_PlotWidth == -1 && n_PlotHeight == -1 ) { ((CWnd*)GetDlgItem(IDC_STATIC_DRAW))->GetWindowRect(&plotRect); ScreenToClient(&plotRect); n_PlotWidth = min( plotRect.Width(), 512); n_PlotHeight = plotRect.Height() - 10; } // set the default SampleRate SetDlgItemInt( IDC_EDIT_BUF_SIZE, (UINT)(m_dwWriteCount) ); SetDlgItemInt( IDC_EDIT_SCAN_ITERVAL, (UINT)(m_dwSampIntrv) ); return TRUE; // return TRUE unless you set the focus to a control } void C9222cdmaDlg::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 C9222cdmaDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 { redraw_display_area(); CDialog::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR C9222cdmaDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void C9222cdmaDlg::redraw_display_area(void) { CPen *oldPen; int oldMode; COLORREF oldColor; CString y_lable; CPen minor_tick( PS_SOLID,1,RGB(132,130,132) ); // CPen y_grid( PS_SOLID,1,RGB(206,203,132) ); int i, x_intv, y_intv; // long total_sec; CClientDC dc_plot(this); // draw the base-line for x-y axises oldPen = (CPen *)dc_plot.SelectStockObject(BLACK_PEN); // redraw the background dc_plot.FillSolidRect( plotRect, RGB(0,0,0) ); // Re-Draw the AREA for Y-Lable { CBrush DIALOG_BRUSH; CRect redraw_area, full_client; GetClientRect(&full_client); ScreenToClient(&full_client); redraw_area.left = full_client.left; redraw_area.top = plotRect.top - 5; redraw_area.right = plotRect.left - 3; redraw_area.bottom = plotRect.bottom + 10; DIALOG_BRUSH.CreateSysColorBrush( COLOR_3DFACE ); dc_plot.FillRect( redraw_area, &DIALOG_BRUSH ); DIALOG_BRUSH.DeleteObject(); } dc_plot.MoveTo( plotRect.left - 3, plotRect.top ); dc_plot.LineTo( plotRect.left - 3, plotRect.bottom ); // calculate the interval for tick/grid y_intv = (plotRect.Height() - 10) /y_divider; x_intv = plotRect.Width()/x_divider; // set the color for tick oldColor = dc_plot.SetTextColor( RGB(0,0,0) ); oldMode = dc_plot.SetBkMode( TRANSPARENT ); for( i=0; i<= y_divider; i++ ) { CString tick_str; CRect tmp_rect, tick_rect; // draw the tick for y-axis dc_plot.MoveTo( plotRect.left -12, plotRect.bottom -5 - (i*y_intv) ); dc_plot.LineTo( plotRect.left -3, plotRect.bottom -5 - (i*y_intv) ); tick_str.Format( _T("%.1f"), ( ((max_range-min_range)/y_divider) * i)+min_range ); // calculate the rectangle for text dc_plot.DrawText( tick_str, &tmp_rect, DT_CALCRECT|DT_SINGLELINE ); tick_rect.right = plotRect.left -14; tick_rect.left = tick_rect.right - tmp_rect.Width(); tick_rect.top = plotRect.bottom -5 - (i*y_intv) - tmp_rect.Height()/2; tick_rect.bottom = tick_rect.top + tmp_rect.Height(); // draw the text dc_plot.DrawText( tick_str, &tick_rect, DT_SINGLELINE|DT_RIGHT ); } // draw the minor_tick for Y axises dc_plot.SelectObject(&minor_tick); for( i=0; i< y_divider; i++ ) { dc_plot.MoveTo( plotRect.left -9, plotRect.bottom -5 - (i*y_intv) - y_intv/2 ); dc_plot.LineTo( plotRect.left -4, plotRect.bottom -5 - (i*y_intv) - y_intv/2 ); } dc_plot.SetTextColor( oldColor ); dc_plot.SetBkMode( oldMode ); dc_plot.SelectObject( oldPen ); } void C9222cdmaDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here if( m_nTimer != -1 ) { KillTimer( m_nTimer ); m_nTimer = -1; } // AI buffer if (m_hAIMem1 != NULL) { GlobalUnfix(m_hAIMem1); GlobalUnlock(m_hAIMem1); GlobalFree(m_hAIMem1); m_hAIMem1 = NULL; } if (m_hAIMem2 != NULL) { GlobalUnfix(m_hAIMem2); GlobalUnlock(m_hAIMem2); GlobalFree(m_hAIMem2); m_hAIMem2 = NULL; } if( OnBrush != NULL ) ::DeleteObject( OnBrush ); if( OffBrush != NULL ) ::DeleteObject( OffBrush ); RedPen.DeleteObject(); GreenPen.DeleteObject(); YellowPen.DeleteObject(); BluePen.DeleteObject(); LTBluePen.DeleteObject(); LTRedPen.DeleteObject(); LTGreenPen.DeleteObject(); WhitePen.DeleteObject(); } void C9222cdmaDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default switch ( nSBCode ) { case SB_LINEUP : m_dwSampIntrv += 160; if (m_dwSampIntrv > 40000 ) m_dwSampIntrv = 40000; break; case SB_LINEDOWN: m_dwSampIntrv -= 160; if (m_dwSampIntrv < 80 ) m_dwSampIntrv = 80; break; } SetDlgItemInt( IDC_EDIT_SCAN_ITERVAL, (UINT)(m_dwSampIntrv) ); CDialog::OnVScroll(nSBCode, nPos, pScrollBar); } void C9222cdmaDlg::OnStop() { // TODO: Add your control notification handler code here U32 count; if( m_nTimer != -1 ) { KillTimer( m_nTimer ); m_nTimer = -1; } AI_AsyncClear(m_hCard, &count); AO_AsyncClear(m_hCard, &count, 0); GetDlgItem( IDC_BT_START )->EnableWindow(TRUE); } void C9222cdmaDlg::OnStart() { // TODO: Add your control notification handler code here DWORD mem_size; CString strTemp; I16 err; GetDlgItem( IDC_BT_START )->EnableWindow(FALSE); /***************** begin of AI buffer setup *****************/ if (m_hAIMem1 != NULL) { GlobalUnfix(m_hAIMem1); GlobalUnlock(m_hAIMem1); GlobalFree(m_hAIMem1); m_hAIMem1 = NULL; } if (m_hAIMem2 != NULL) { GlobalUnfix(m_hAIMem2); GlobalUnlock(m_hAIMem2); GlobalFree(m_hAIMem2); m_hAIMem2 = NULL; } // allocate a memory for user DMA buffer mem_size = AI_READ_COUNT * sizeof(I16); m_hAIMem1 = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, mem_size); m_pAIBuf1 = (U16*) GlobalLock(m_hAIMem1); if (m_pAIBuf1 == NULL ) { AfxMessageBox( TEXT("AI Memory allocation failed"), MB_OK); return; } GlobalFix(m_hAIMem1); m_hAIMem2 = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, mem_size); m_pAIBuf2 = (U16*) GlobalLock(m_hAIMem2); if (m_pAIBuf2 == NULL ) { AfxMessageBox( TEXT("AI Memory allocation failed"), MB_OK); return; } GlobalFix(m_hAIMem2); /***************** end of AI buffer setup *****************/ /***************** begin of AO buffer setup *****************/ m_dwWriteCount = GetDlgItemInt(IDC_EDIT_BUF_SIZE); if (m_hAOMem1 != NULL) { GlobalUnfix(m_hAOMem1); GlobalUnlock(m_hAOMem1); GlobalFree(m_hAOMem1); m_hAOMem1 = NULL; } if (m_hAOMem2 != NULL) { GlobalUnfix(m_hAOMem2); GlobalUnlock(m_hAOMem2); GlobalFree(m_hAOMem2); m_hAOMem2 = NULL; } // allocate a memory for user DMA buffer mem_size = m_dwWriteCount * sizeof(U32); m_hAOMem1 = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, mem_size); m_pAOBuf1 = (U32*) GlobalLock(m_hAOMem1); if (m_pAOBuf1 == NULL ) { AfxMessageBox( TEXT("AO Memory allocation failed"), MB_OK); return; } GlobalFix(m_hAOMem1); m_hAOMem2 = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, mem_size); m_pAOBuf2 = (U32*) GlobalLock(m_hAOMem2); if (m_pAOBuf2 == NULL ) { AfxMessageBox( TEXT("AO Memory allocation failed"), MB_OK); return; } GlobalFix(m_hAOMem2); UpdatePattern( 1, wPattern1 ); UpdatePattern( 2, wPattern1 ); /***************** end of AI buffer setup *****************/ m_oldY[0] = m_oldY[1] = m_oldY[2] = m_oldY[3] = m_oldY[4] = m_oldY[5] = m_oldY[6] = m_oldY[7] = -1; m_oldX[0] = m_oldX[1] = m_oldX[2] = m_oldX[3] = m_oldX[4] = m_oldX[5] = m_oldX[6] = m_oldX[7] = -1; if ((err = AI_9222_Config(m_hCard, P922x_AI_SingEnded|P922x_AI_CONVSRC_INT, P922x_AI_TRGMOD_POST|P922x_AI_TRGSRC_SOFT, 0, TRUE)) != NoError) { strTemp.Format( TEXT("AI_9222_Config error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AI_9222_CounterInterval(m_hCard, AI_SAMPLE_INTERV, AI_SAMPLE_INTERV)) != NoError) { strTemp.Format( TEXT("AI_9222_CounterInterval error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AI_AsyncDblBufferMode (m_hCard, 1)) != NoError) { strTemp.Format( TEXT("AI_AsyncDblBufferMode error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AI_ContBufferSetup (m_hCard, m_pAIBuf1, AI_READ_COUNT, &m_wAIBufID1)) != NoError) { strTemp.Format( TEXT("AI_ContBufferSetup error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AI_ContBufferSetup (m_hCard, m_pAIBuf2, AI_READ_COUNT, &m_wAIBufID2)) != NoError) { strTemp.Format( TEXT("AI_ContBufferSetup error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AO_9222_Config(m_hCard, P922x_AO_CONVSRC_INT, (P922x_AO_TRGMOD_POST|P922x_AO_TRGSRC_SOFT), 0, 0, 0, TRUE)) != NoError) { strTemp.Format( TEXT("AO_9222_Config error=%d"), err); AfxMessageBox( strTemp ); return; } /*Enable Double Buffer Mode*/ if ((err = AO_AsyncDblBufferMode(m_hCard, 1)) != NoError) { strTemp.Format( TEXT("AO_AsyncDblBufferMode error=%d"), err); AfxMessageBox( strTemp ); return; } /*Setup buffer*/ if ((err = AO_ContBufferSetup(m_hCard, m_pAOBuf1, m_dwWriteCount, &m_wAOBufID1)) != NoError) { strTemp.Format( TEXT("AO_ContBufferSetup error=%d"), err); AfxMessageBox( strTemp ); return; } if ((err = AO_ContBufferSetup(m_hCard, m_pAOBuf2, m_dwWriteCount, &m_wAOBufID2)) != NoError) { strTemp.Format( TEXT("AO_ContBufferSetup error=%d"), err); AfxMessageBox( strTemp ); return; } m_bView = 0; if ((err = AI_ContReadChannel(m_hCard, 0, m_wRange, &m_wAIBufID1, AI_READ_COUNT, 0, ASYNCH_OP)) != NoError) { strTemp.Format( TEXT("AI_ContBufferSetup error=%d"), err); AfxMessageBox( strTemp ); return; } /*Start AO0 DAC, Infinite repeate*/ m_dwRdyBufCnt = 0; if ((err = AO_ContWriteChannel(m_hCard, 0, m_wAOBufID1, m_dwWriteCount, 0, m_dwSampIntrv, 0, ASYNCH_OP)) != NoError) { strTemp.Format( TEXT("AO_ContWriteChannel error=%d"), err); AfxMessageBox( strTemp ); return; } m_nTimer = SetTimer( 1, 20, NULL ); } int C9222cdmaDlg::display_buffer_data(U16* pBuf) { CClientDC dc_plot(this); int nDraw_Origin_Y; int cur_channel; int newY = -1; int newX = -1; U32 index; I16 ai_data; U32 dwDataSize = AI_READ_COUNT; // redraw the background dc_plot.FillSolidRect( plotRect, RGB(0,0,0) ); dc_plot.SelectObject(&YellowPen); nDraw_Origin_Y = ( plotRect.bottom - 5 ) - n_PlotHeight/2; cur_channel = 0; for( index=0; index> 16) ); // ( n_PlotHeight * ai_data / 65536) ); // ( (n_PlotHeight/2) * ai_data/32768 ) ); newX = (int)( index*n_PlotWidth/dwDataSize + plotRect.left ); if ( index == 0 ) { dc_plot.MoveTo( newX, newY ); } else { dc_plot.MoveTo( m_oldX[cur_channel], m_oldY[cur_channel] ); dc_plot.LineTo( newX, newY ); } m_oldX[cur_channel] = newX; m_oldY[cur_channel] = newY; } return 0; } void C9222cdmaDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default BOOLEAN HalfReady; BOOLEAN fstop; U16 OverrunFlag; AO_AsyncDblBufferHalfReady(m_hCard, &HalfReady); if( HalfReady ) // half-buffer ready { m_dwRdyBufCnt ++; if(m_dwRdyBufCnt%4 == 1) { UpdatePattern( 1, wPattern2 ); } else if(m_dwRdyBufCnt%4 == 2) { UpdatePattern( 2, wPattern1 ); } else if(m_dwRdyBufCnt%4 == 3) { UpdatePattern( 1, wPattern1 ); } else { UpdatePattern( 2, wPattern2 ); } } AI_AsyncDblBufferHalfReady(m_hCard, &HalfReady, &fstop); if( HalfReady ) // half-buffer ready { if(m_bView == 0) { display_buffer_data( m_pAIBuf1 ); m_bView = 1; } else { display_buffer_data( m_pAIBuf2 ); m_bView= 0; } AI_AsyncDblBufferHandled( m_hCard ); AI_AsyncDblBufferOverrun( m_hCard, 0, &OverrunFlag); if(OverrunFlag) { m_dwOverrunCnt++; AI_AsyncDblBufferOverrun( m_hCard, 1, NULL ); } } CDialog::OnTimer(nIDEvent); } void C9222cdmaDlg::UpdatePattern(int nAOBufIdx, U32* pPatternAddr) { U32 vi; if( nAOBufIdx == 1 ) // m_pAOBuf1 { for(vi=0; vi= PATTERN_SIZE ) { memcpy( &(m_pAOBuf1[vi]), pPatternAddr, PATTERN_SIZE * sizeof(U32) ); } else { memcpy( &(m_pAOBuf1[vi]), pPatternAddr, (m_dwWriteCount - vi) * sizeof(U32) ); } vi += PATTERN_SIZE; } } else // m_pAOBuf2 { for(vi=0; vi= PATTERN_SIZE ) { memcpy( &(m_pAOBuf2[vi]), pPatternAddr, PATTERN_SIZE * sizeof(U32) ); } else { memcpy( &(m_pAOBuf2[vi]), pPatternAddr, (m_dwWriteCount - vi) * sizeof(U32) ); } vi += PATTERN_SIZE; } } }