// ProtocolsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Protocols.h"
#include "ProtocolsDlg.h"
#include <NIDAQmx.h>
#include <math.h>
#include <time.h>
#include <assert.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 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()
// CProtocolsDlg dialog
CProtocolsDlg::CProtocolsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProtocolsDlg::IDD, pParent)
, m_iPort(0)
, m_iCh(0)
, m_iTrial(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CProtocolsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_AMPC, m_cAmp);
DDX_CBIndex(pDX, IDC_Port, m_iPort);
DDX_CBIndex(pDX, IDC_CH, m_iCh);
DDX_CBIndex(pDX, IDC_TrialNumber, m_iTrial);
}
BEGIN_MESSAGE_MAP(CProtocolsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_Port, &CProtocolsDlg::OnCbnSelchangePort)
ON_BN_CLICKED(IDC_CONNECT, &CProtocolsDlg::OnBnClickedConnect)
ON_BN_CLICKED(IDC_DISCONNECT, &CProtocolsDlg::OnBnClickedDisconnect)
ON_BN_CLICKED(IDC_ServoOn, &CProtocolsDlg::OnBnClickedServeron)
ON_BN_CLICKED(IDC_ServoOff, &CProtocolsDlg::OnBnClickedServooff)
ON_BN_CLICKED(IDC_ErrReset, &CProtocolsDlg::OnBnClickedErrreset)
//ON_BN_CLICKED(IDC_BUTTON2, &CProtocolsDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_go, &CProtocolsDlg::OnBnClickedgo)
ON_BN_CLICKED(IDC_IMStop, &CProtocolsDlg::OnBnClickedImstop)
END_MESSAGE_MAP()
// CProtocolsDlg message handlers
BOOL CProtocolsDlg::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 CProtocolsDlg::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 CProtocolsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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 function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CProtocolsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CProtocolsDlg::OnCbnSelchangePort()
{
// TODO: Add your control notification handler code here
}
void CProtocolsDlg::OnBnClickedConnect()
{
long iRet;
int indx;
CString sRet;
short hTop;
short hMain;
short hSub;
long wKey;
indx = ((CComboBox *)GetDlgItem(IDC_Port))->GetCurSel();
switch(indx)
{
case 0: m_iPort = 1; break;
case 1: m_iPort = 2; break;
case 2: m_iPort = 3; break;
case 3: m_iPort = 4; break;
case 4: m_iPort = 5; break;
case 5: m_iPort = 6; break;
case 6: m_iPort = 7; break;
case 7: m_iPort = 8; break;
}
indx = ((CComboBox *)GetDlgItem(IDC_CH))->GetCurSel();
switch(indx)
{
case 0: m_iCh = 0; break;
}
iRet = m_cAmp.OpenPort(m_iPort);
if (iRet == 0)
{
iRet = m_cAmp.OpenCh(m_iCh);
if (iRet == 0)
{
m_bConnect = true;
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 0)
{
m_bResetErr = true;
}
else
m_bResetErr = false;
ChangeEnable();
sRet = m_cAmp.ChangeMode(m_iCh, 0, &hTop, &hMain, &hSub, &wKey, &iRet);
}
}
// TODO: Add your control notification handler code here
}
void CProtocolsDlg::OnBnClickedDisconnect()
{
long iRet;
iRet = m_cAmp.CloseCh(m_iCh);
if (iRet == 0)
{
iRet = m_cAmp.ClosePort();
if (iRet == 0)
{
m_bConnect = false;
}
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 0)
{
m_bResetErr = true;
}
else
m_bResetErr = false;
ChangeEnable();
}
// TODO: Add your control notification handler code here
}
void CProtocolsDlg::OnBnClickedServeron()
{
CString sRet;
short hTop;
short hMain;
short hSub;
long wKey;
long iRet;
if (m_bConnect == false) return;
sRet = m_cAmp.ServoControl(m_iCh, 1, &hTop, &hMain, &hSub, &wKey, &iRet);
if (iRet == 0)
{
m_bServo = true;
}
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 0)
{
m_bResetErr = true;
}
else
m_bResetErr = false;
ChangeEnable();
// TODO: Add your control notification handler code here
}
void CProtocolsDlg::OnBnClickedServooff()
{
CString sRet;
short hTop;
short hMain;
short hSub;
long wKey;
long iRet;
if (m_bConnect == false) return;
sRet = m_cAmp.ServoControl(m_iCh, 0, &hTop, &hMain, &hSub, &wKey, &iRet);
if (iRet == 0)
{
m_bServo = false;
}
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 1)
{
m_bResetErr = true;
}
else
m_bResetErr = false;
ChangeEnable();
// TODO: Add your control notification handler code here
}
void CProtocolsDlg::ChangeEnable(void)
{
if (m_bConnect == true)
{
(CButton*)GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_Port)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_CH)->EnableWindow(FALSE);
if (m_bResetErr == false)
(CButton*)GetDlgItem(IDC_ErrReset)->EnableWindow(TRUE);
else
(CButton*)GetDlgItem(IDC_ErrReset)->EnableWindow(FALSE);
if (m_bServo == true)
{
(CButton*)GetDlgItem(IDC_ServoOn)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_ServoOff)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_go)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_TrialNumber)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_IMStop)->EnableWindow(TRUE);
}
else
{
(CButton*)GetDlgItem(IDC_ServoOn)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_ServoOff)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_go)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_TrialNumber)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_IMStop)->EnableWindow(FALSE);
}
}
else
{
(CButton*)GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_Port)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_CH)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_ServoOn)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_ServoOff)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_ErrReset)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_IMStop)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_go)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_TrialNumber)->EnableWindow(FALSE);
}
}
void CProtocolsDlg::OnBnClickedErrreset()
{
// TODO: Add your control notification handler code here
CString ResetError(long hCh, short* hpTopCode, short* hpMainCode, short* hpSubCode, long* hpKeyCode, long* hpRetCode);
CString sRet;
short hTop;
short hMain;
short hSub;
long wKey;
long iRet;
if (m_bConnect == false) return;
sRet = m_cAmp.ResetError(m_iCh, &hTop, &hMain, &hSub, &wKey, &iRet);
if (iRet == 0)
{
m_bEMStop = false;
m_bResetErr = true;
ChangeEnable();
}
}
void CProtocolsDlg::OnBnClickedgo()
{
// TODO: Add your control notification handler code here
if (m_bConnect == false) return;
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 0)
m_bResetErr = true;
else
m_bResetErr = false;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// load protocols
// load 1: Acceleration Duration = m_AccDValue in ms
// load 2: Travel Duration = m_LenDValue in ms
// load 3: Pause Duration = m_PauseDValue in ms
// load 4: Travel Velocity = m_VelValue in *10 rps
long myTrial0;//long myTrial[3];
long myTrial1;
long myTrial2;
long myTrial3;
FILE *fp;
int cnt;
int indx;
indx = ((CComboBox *)GetDlgItem(IDC_TrialNumber))->GetCurSel();
switch(indx)
{
case 0:
m_iTrial = 1;
fopen_s(&fp,"#1.txt", "r"); // load parameters of trial #1 from #1.txt
break;
case 1:
m_iTrial = 2;
fopen_s(&fp,"#2.txt", "r");
break;
case 2:
m_iTrial = 3;
fopen_s(&fp,"#3.txt", "r");
break;
case 3:
m_iTrial = 4;
fopen_s(&fp,"#4.txt", "r");
break;
case 4:
m_iTrial = 5;
fopen_s(&fp,"#5.txt", "r");
break;
case 5:
m_iTrial = 6;
fopen_s(&fp,"#6.txt", "r");
break;
case 6:
m_iTrial = 7;
fopen_s(&fp,"#7.txt", "r");
break;
case 7:
m_iTrial = 8;
fopen_s(&fp,"#8.txt", "r");
break;
case 8:
m_iTrial = 9;
fopen_s(&fp,"#9.txt", "r");
break;
case 9:
m_iTrial = 10;
fopen_s(&fp,"#10.txt", "r");
break;
case 10:
m_iTrial =11;
fopen_s(&fp,"#11.txt", "r");
break;
case 11:
m_iTrial =12;
fopen_s(&fp,"#12.txt", "r");
break;
case 12:
m_iTrial =13;
fopen_s(&fp,"#13.txt", "r");
break;
case 13:
m_iTrial =14;
fopen_s(&fp,"#14.txt", "r");
break;
case 14:
m_iTrial =15;
fopen_s(&fp,"#15.txt", "r");
break;
case 15:
m_iTrial =16;
fopen_s(&fp,"#16.txt", "r");
break;
case 16:
m_iTrial =17;
fopen_s(&fp,"#17.txt", "r");
break;
case 17:
m_iTrial =18;
fopen_s(&fp,"#18.txt", "r");
break;
case 18:
m_iTrial =19;
fopen_s(&fp,"#19.txt", "r");
break;
case 19:
m_iTrial =20;
fopen_s(&fp,"#20.txt", "r");
break;
}
if (fp != NULL)
{
// for (cnt = 0; cnt < 4; ++cnt)
// {
fscanf_s (fp, "%ld", &myTrial0);
fscanf_s (fp, "%ld", &myTrial1);
fscanf_s (fp, "%ld", &myTrial2);
fscanf_s (fp, "%ld", &myTrial3);
// }
fclose (fp);
}
long m_AccDValue = myTrial0;
long m_LenDValue = myTrial1;
long m_PauseDValue = myTrial2;
long m_VelValue = myTrial3;
int i=0;
float64 Rs[5000]; //7000
float64 value;
value = m_VelValue*1.5/10;
int32 written;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ********* generate analog voltage to servo motor
TaskHandle taskHandleRs;
DAQmxCreateTask("",&taskHandleRs);
DAQmxCreateAOVoltageChan(taskHandleRs,"Dev1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL);
DAQmxCfgSampClkTiming(taskHandleRs,"",1000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,5000);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// //////////////// velocity profile ///////////////////////////////////////
///***********************************************************************************/////
if(m_AccDValue>0) // ramp start
{
for(i=0;i<m_AccDValue;i++) ///
{ ///
Rs[i]=i*value/(m_AccDValue-1); ///
} ///
}
for(i=m_AccDValue;i<m_AccDValue+m_LenDValue;i++) ///
{ ///
Rs[i]=value; ///
}
if(m_PauseDValue==0) // keep running until "stop" is clicked
{
for(i=m_AccDValue+m_LenDValue;i<5000;i++) ///
{ ///
Rs[i]=value; ///
}
}
else // immediate stop or temporary pause
{
if(m_PauseDValue<1000) // temporary pause: 0 < pause duration < 1 seconds, you can change the value if you want longer pause duration
{
for(i=m_AccDValue+m_LenDValue;i<m_AccDValue+m_LenDValue+m_PauseDValue;i++) ///
{ ///
Rs[i]=0.0; ///
}
for(i=m_AccDValue+m_LenDValue+m_PauseDValue;i<5000;i++)
{
Rs[i]=value; // after a short pause, start running again until the "stop" is clicked
}
}
else // immediately permanently stop
{
for(i=m_AccDValue+m_LenDValue;i<5000;i++) ///
{ ///
Rs[i]=0.0; ///
}
}
}
///***********************************************************************************/////
DAQmxWriteAnalogF64(taskHandleRs,5000,0,10.0,DAQmx_Val_GroupByChannel,Rs,&written,NULL);
DAQmxStartTask(taskHandleRs);
DAQmxWaitUntilTaskDone(taskHandleRs,10.0);
DAQmxStopTask(taskHandleRs);
DAQmxClearTask(taskHandleRs);
}
void CProtocolsDlg::OnBnClickedImstop()
{
// TODO: Add your control notification handler code here
if (m_bConnect == false) return;
CString sRetErr;
long bopExist;
long wpMainCode;
long wpSubCode;
short hTopErr;
short hMainErr;
short hSubErr;
long wKeyErr;
long iRetErr;
sRetErr=m_cAmp.GetError(m_iCh, &bopExist, &wpMainCode, &wpSubCode, &hTopErr, &hMainErr, &hSubErr, &wKeyErr, &iRetErr);
if (bopExist == 0)
{
m_bResetErr = true;
}
else
m_bResetErr = false;
FILE *fpp;
int cnt;
int myTrial0;
int myTrial1;
int myTrial2;
int myTrial3;
fopen_s(&fpp,"#1.txt", "r");
// for (cnt = 0; cnt < 4; ++cnt)
// {
fscanf_s (fpp, "%d", &myTrial0);
fscanf_s (fpp, "%d", &myTrial1);
fscanf_s (fpp, "%d", &myTrial2);
fscanf_s (fpp, "%d", &myTrial3);
// }
fclose (fpp);
int m_VelValue = myTrial3;
TaskHandle taskHandle5=0;
int i=0;
float64 interOn[4000];
float64 value;
value = m_VelValue*1.5/10;
DAQmxCreateTask("",&taskHandle5);
DAQmxCreateAOVoltageChan(taskHandle5,"Dev1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL);
// DAQmxCfgSampClkTiming(taskHandle5,"",1000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,4000); // ramp stop
DAQmxCfgSampClkTiming(taskHandle5,"",1000.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,4000);
for(i=0;i<4000;i++)
{
// interOn[i]=value-i*value/3999; // ramp decrease profile
interOn[i]=0.0; // immediate stop
}
//DAQmxWriteAnalogF64(taskHandle5,4000,0,10.0,DAQmx_Val_GroupByChannel,interOn,&written,NULL); // ramp stop
DAQmxWriteAnalogF64(taskHandle5,4000,0,10.0,DAQmx_Val_GroupByChannel,interOn,NULL,NULL);
DAQmxStartTask(taskHandle5);
// DAQmxWaitUntilTaskDone(taskHandle5,4.0); //// ramp stop
DAQmxStopTask(taskHandle5);
DAQmxClearTask(taskHandle5);
}
This post has been edited by JackOfAllTrades: 19 January 2010 - 12:41 PM

New Topic/Question
Reply




MultiQuote



|