// Sample 1Dlg.cpp : implementation file // #include "stdafx.h" #include "Sample 1.h" #include "Sample 1Dlg.h" #include "Acces32.h" #include "IRQThread.h" #include "aiowdm.h" #include IRQThread *Thrd; signed long CardNum = -1; BOOL GoFlag; //extern BOOL Terminated; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define counts 1000 #define Pi 3.14159265358979323846 int DacNum, Index, BaseAddress; WORD progstruct[20000]; struct TCardData { long CardNum; unsigned long Base; }; TCardData CardData[10]; CSample1Dlg *dlg; ///////////////////////////////////////////////////////////////////////////// // CSample1Dlg dialog CSample1Dlg::CSample1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CSample1Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CSample1Dlg) m_DACBox = _T(""); m_CalcuLabel = _T(""); m_GenerLabel = _T(""); m_CardBox = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSample1Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSample1Dlg) DDX_Control(pDX, IDOK, m_StartTestButtonCtrl); DDX_Control(pDX, IDC_TriangleButton, m_TriangleButtonCtrl); DDX_Control(pDX, IDC_StopTestButton, m_StopTestButtonCtrl); DDX_Control(pDX, IDC_StatusBox, m_StatusBoxCtrl); DDX_Control(pDX, IDC_SineButton, m_SineButtonCtrl); DDX_Control(pDX, IDC_SawButton, m_SawButtonCtrl); DDX_Control(pDX, IDC_DACBox, m_DACBoxCtrl); DDX_Control(pDX, IDC_CurveBox, m_CurveBoxCtrl); DDX_Control(pDX, IDC_CardBox, m_CardBoxCtrl); DDX_Control(pDX, IDC_BoardBox, m_BoardBoxCtrl); DDX_Control(pDX, IDC_CalcuLabel, m_CalcuLabelCtrl); DDX_Control(pDX, IDC_GenerLabel, m_GenerLabelCtrl); DDX_Control(pDX, IDC_DacLabel, m_DacLabelCtrl); DDX_Control(pDX, IDC_PCILabel, m_PCILabelCtrl); DDX_CBString(pDX, IDC_DACBox, m_DACBox); DDX_Text(pDX, IDC_CalcuLabel, m_CalcuLabel); DDX_Text(pDX, IDC_GenerLabel, m_GenerLabel); DDX_CBString(pDX, IDC_CardBox, m_CardBox); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSample1Dlg, CDialog) //{{AFX_MSG_MAP(CSample1Dlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDCANCEL, OnExitButtonClick) ON_WM_TIMER() ON_BN_CLICKED(IDC_SineButton, OnSineButtonClick) ON_BN_CLICKED(IDC_TriangleButton, OnTriangleButtonClick) ON_BN_CLICKED(IDC_SawButton, OnSawButtonClick) ON_WM_SHOWWINDOW() ON_WM_CLOSE() ON_BN_CLICKED(IDC_StopTestButton, OnStopTestButton) ON_BN_CLICKED(IDOK, OnStartTestButton) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSample1Dlg message handlers BOOL CSample1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // 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 if (InPortB(0x61) == 0xAA55) { MessageBox("ACCESNT.SYS not detected. Please copy ACCESNT.SYS into [NT]/system32/drivers and re-run this sample.", "Warning", MB_OK); } // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } // 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 CSample1Dlg::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 CSample1Dlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void InitIRQ() { Thrd = (IRQThread*)AfxBeginThread(RUNTIME_CLASS(IRQThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); Thrd->Terminated = false; Thrd->ResumeThread(); } // end InitIRQ void CtrMode(WORD addr, byte cntr, byte mode) { int ctrl; ctrl = (cntr << 6) | 0x30 | (mode << 1); OutPortB(addr+3,ctrl); } // end CtrMode void CtrLoad(WORD addr, WORD c, WORD val) { OutPortB(addr+c,(val & 0x00FF)); OutPortB(addr+c,((val >> 8) & 0x00ff)); } // end CtrLoad void Stop() { GoFlag = false; InPortB(BaseAddress+6); //disable CTR to promptDAC InPortB(BaseAddress+4); //disable IRQ } // end Stop void Start() { GoFlag = true; InPortB(BaseAddress+5); //enable CTR to promptDAC InPortB(BaseAddress+3); //enable IRQ } // end Start void CSample1Dlg::OnExitButtonClick() { if (CardNum >= 0) { Stop(); Thrd->Terminated = true; AbortRequest(CardNum); } exit(0); } void CSample1Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CDialog::OnTimer(nIDEvent); } void CSample1Dlg::OnSineButtonClick() { int i; double rads, sine; Stop(); m_CalcuLabel = "Calculating sine wave points....."; rads = 2.0 * Pi / (counts - 1); // rad per count for (i = 0; i <= counts; i++) { sine = (sin(rads * i) + 1.0) * 2047; progstruct[i] = short(sine); } // end for m_GenerLabel = "Generating sine wave, press any key to stop...."; UpdateData(false); Start(); } void CSample1Dlg::OnTriangleButtonClick() { int i; WORD slope, temp; Stop(); m_CalcuLabel = "Calculating triangle wave points....."; slope = short(4095.0 / counts * 2.0); // wave form slope for (i = 0; i <= (counts / 2); i++) { temp = slope * i; progstruct[i] = temp; temp = 4095 - temp; progstruct[i + counts / 2] = temp; } // end for m_GenerLabel = "Generating triangle wave, press any key to stop...."; UpdateData(false); Start(); } void CSample1Dlg::OnSawButtonClick() { int i; WORD slope, temp; Stop(); m_CalcuLabel = "Calculating saw tooth wave points....."; slope = short(4095.0 / counts); // saw tooth slope for (i = 0; i <= counts; i++) { temp = slope * i; progstruct[i] = temp; progstruct[i] %= 4095; } // end for m_GenerLabel = "Generating saw tooth wave, press any key to stop...."; UpdateData(false); Start(); } void CSample1Dlg::ISR() { if (GoFlag) { Index++; OutPort(BaseAddress+(DacNum*2), progstruct[Index]); Index %= counts; } // end if } void CSample1Dlg::OnShowWindow(BOOL bShow, UINT nStatus) { CDialog::OnShowWindow(bShow, nStatus); unsigned long DeviceID, NameSize, Base; unsigned char Name[255] = ""; int i, CardIndex; CString ThisString; Index = 0; CardIndex = 0; GoFlag = false; DeviceID = 0; Base = 0; i = 0; for (i = 0; i < GetNumCards();i++) { NameSize = 255; QueryCardInfo(i, &DeviceID, &Base, &NameSize, Name); if ((DeviceID == 0x6cb0) || (DeviceID == 0x6ca8)) { ThisString.Format("%s [%4X]", Name, Base); m_CardBoxCtrl.AddString(ThisString); CardData[CardIndex].CardNum = i; CardData[CardIndex].Base = Base; CardIndex++; } // end if } // end for m_CardBoxCtrl.SetCurSel(0); m_DACBoxCtrl.SetCurSel(0); UpdateData(true); } void CSample1Dlg::OnClose() { if (CardNum >= 0) { Stop(); Thrd->Terminated = true; AbortRequest(CardNum); } CDialog::OnClose(); } void CSample1Dlg::OnStopTestButton() { if (CardNum >= 0) { Stop(); Thrd->Terminated = true; AbortRequest(CardNum); } m_BoardBoxCtrl.ShowWindow(SW_SHOW); m_CardBoxCtrl.ShowWindow(SW_SHOW); m_DACBoxCtrl.ShowWindow(SW_SHOW); m_StartTestButtonCtrl.ShowWindow(SW_SHOW); m_PCILabelCtrl.ShowWindow(SW_SHOW); m_DacLabelCtrl.ShowWindow(SW_SHOW); m_SineButtonCtrl.ShowWindow(SW_HIDE); m_TriangleButtonCtrl.ShowWindow(SW_HIDE); m_SawButtonCtrl.ShowWindow(SW_HIDE); m_StopTestButtonCtrl.ShowWindow(SW_HIDE); m_CurveBoxCtrl.ShowWindow(SW_HIDE); m_StatusBoxCtrl.ShowWindow(SW_HIDE); m_GenerLabelCtrl.ShowWindow(SW_HIDE); m_CalcuLabelCtrl.ShowWindow(SW_HIDE); } void CSample1Dlg::OnStartTestButton() { int channel, ThisIndex; UpdateData(true); //if ((m_CardBox.Compare("") != 0) && (m_DACBox.Compare("") != 0)) { ThisIndex = m_CardBoxCtrl.FindStringExact(-1, m_CardBox); CardNum = CardData[ThisIndex].CardNum; BaseAddress = CardData[ThisIndex].Base; sscanf(m_DACBox.GetBuffer(0), "%x", &DacNum); m_BoardBoxCtrl.ShowWindow(SW_HIDE); m_CardBoxCtrl.ShowWindow(SW_HIDE); m_DACBoxCtrl.ShowWindow(SW_HIDE); m_StartTestButtonCtrl.ShowWindow(SW_HIDE); m_PCILabelCtrl.ShowWindow(SW_HIDE); m_DacLabelCtrl.ShowWindow(SW_HIDE); m_SineButtonCtrl.ShowWindow(SW_SHOW); m_TriangleButtonCtrl.ShowWindow(SW_SHOW); m_SawButtonCtrl.ShowWindow(SW_SHOW); m_StopTestButtonCtrl.ShowWindow(SW_SHOW); m_CurveBoxCtrl.ShowWindow(SW_SHOW); m_StatusBoxCtrl.ShowWindow(SW_SHOW); m_GenerLabelCtrl.ShowWindow(SW_SHOW); m_CalcuLabelCtrl.ShowWindow(SW_SHOW); UpdateData(false); CtrMode(BaseAddress + 0x24,1,2); //counter 1 mode 2 CtrMode(BaseAddress + 0x24,2,2); //counter 2 mode 2 CtrLoad(BaseAddress + 0x24,1,0x5); //load 10 to counter 1 CtrLoad(BaseAddress + 0x24,2,0x30); //load 1000 to counter 2 for (channel = 0; channel <= 15; channel++) OutPort(BaseAddress + (channel * 2), 0x800); InPortB(BaseAddress + 10); InPortB(BaseAddress + 15); InitIRQ(); memset(progstruct,0,sizeof(progstruct)); //clear buffer // } // end if } // end OnStartTestButton