// DAsampDlg.cpp : implementation file // #include "stdafx.h" #include "DAsamp.h" #include "DAsampDlg.h" #include "DetectDialog.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif UINT process(LPVOID pParam); int round_int (double x) { const float round_to_nearest = 0.5f; int i; __asm { fld x fadd st, st (0) fadd round_to_nearest fistp i sar i, 1 } return (i); } ///////////////////////////////////////////////////////////////////////////// // 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() ///////////////////////////////////////////////////////////////////////////// // CDAsampDlg dialog CDAsampDlg::CDAsampDlg(CWnd* pParent /*=NULL*/) : CDialog(CDAsampDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDAsampDlg) m_log = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); DetectDialog dDialog; if(dDialog.DoModal() != IDOK) { exit(0); } DeviceIndex = dDialog.index; DeviceIndex = 7 - DeviceIndex; killthread = true; } void CDAsampDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDAsampDlg) DDX_Text(pDX, IDC_EDIT_LOG, m_log); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDAsampDlg, CDialog) //{{AFX_MSG_MAP(CDAsampDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart) ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDAsampDlg message handlers BOOL CDAsampDlg::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 return TRUE; // return TRUE unless you set the focus to a control } void CDAsampDlg::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 CDAsampDlg::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 CDAsampDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CDAsampDlg::OnButtonStart() { // TODO: Add your control notification handler code here double ClockHz; long ErrorCode; char temp[16]; Rot = 0; ClockHz = 40000; m_log = "Opening..."; UpdateData(false); Invalidate(); ErrorCode = DACOutputOpen(DeviceIndex, &ClockHz); if (ErrorCode == ERROR_SUCCESS) { m_log += "\r\nOpened for output at\r\n "; itoa(int(ClockHz), temp, 10); m_log += temp; m_log += " Hz."; UpdateData(false); Invalidate(); killthread = false; myThread = AfxBeginThread(process, this); } else { m_log = "Unable to open card"; UpdateData(false); Invalidate(); } } UINT process(LPVOID pParam) { CDAsampDlg *dlg; unsigned long ErrorCode; int I; double EC, ES; bool BGotDACData; double magicNum; dlg = (CDAsampDlg*) pParam; while(!dlg->killthread) { if(!BGotDACData) { dlg->Rot += .0004; if (dlg->Rot > FullCircle) { dlg->Rot = dlg->Rot - FullCircle; } for (I = 0; I <= 7; I++) { magicNum = dlg->Rot + I * (2.0/7.0) * FullCircle; EC = cos(magicNum); ES = sin(magicNum); dlg->DACData[I].X = round_int(2048 + ES * 2047); dlg->DACData[I].Y = round_int(2048 + EC * 2047); dlg->DACData[I].R = dlg->DACData[I].G = 0; dlg->DACData[I].B = 0xfff; } BGotDACData = true; } ErrorCode = DACOutputFrame(dlg->DeviceIndex, sizeof(dlg->DACData) / sizeof(TDACPoint), &(dlg->DACData[0].X)); if (ErrorCode == ERROR_SUCCESS) { BGotDACData = false; } else if (ErrorCode == ERROR_NOT_READY) { } else { return -1; } } return 0; } void CDAsampDlg::OnButtonStop() { // TODO: Add your control notification handler code here HANDLE threadHandle =myThread -> m_hThread; DWORD result; killthread = true; //let the thread know it is time to stop. do { Sleep(20); //give the other thread a chance to close GetExitCodeThread(threadHandle, &result); }while (result == STILL_ACTIVE); m_log += "\r\nClosing..."; UpdateData(false); Invalidate(); DACOutputClose(DeviceIndex, 1); //the one is a "true" value m_log +="\r\nClosed."; UpdateData(false); Invalidate(); }