📄 adtdemo.cpp
字号:
#include <afxwin.h>
#include <windows.h>
#include "resource.h"
#include "math.h"
#include "iostream.h"
#include "shlwapi.h"
#include "sbsadtdef.h"
#include "sbsadtd.h"
#define ID_TIMER 1//设定一个定时器的ID值
/*
//_ADTDEMO_MODE_1_ 软件触发AD,AD完成转换触发中断
//_ADTDEMO_MODE_2_ 硬件时钟触发AD,FIFO半满触发中断
*/
#define _ADTDEMO_MODE_1_
#define _ADTDEMO_MODE_2_
BYTE m_nADTVxD = 0;
short nTmp = 0;
int m_nADTNum = 0;
char m_chValue[20];
char TMPBuffer[20];
BOOL m_bRunning = FALSE;
SBSADTB sbscb;
SBSADSETTINGS ADSettings;
SBSCLK CLKSettings;
SBSDIOINT DIOSettings;
float ADValue = 0.0;
short ADChannel = 0;
HANDLE m_hADThread = 0; //ADThread
HANDLE m_hEvtThread = 0; //EvtThread
HANDLE m_hEventAD[10];// = 0;
DWORD dwThreadid=0;
unsigned int m_nSec = 0;
BOOL m_bDIOREAD = TRUE;
BOOL m_bClose = FALSE;
BYTE DIOValue = 0;
BOOL CALLBACK DlgProc(HWND, WPARAM, WPARAM,LPARAM);
DWORD WINAPI StaADThread(LPVOID lpData);
DWORD WINAPI ServiceEvt(LPVOID lParam);
BOOL InitADTBoard(HWND hDlg);
BOOL FreeADTBroad(HWND hDlg);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance, (LPCTSTR)IDD_DLG_ADT_DEMO, 0, DlgProc);
return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE: //关闭窗口消息
//卸载设备驱动程序
if(0!=m_nADTVxD)
break;
KillTimer (hDlg, ID_TIMER);
//关闭对话框
EndDialog(hDlg,TRUE);
break;
case WM_TIMER://定时器消息
if (0!=m_nADTVxD)
break;
if (!m_bRunning) break;
// sbsDAConvert(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_DA, NULL, FALSE), GetDlgItemInt(hDlg, IDC_EDIT_DA, NULL, FALSE));
sbsUpDataDA(m_nADTNum);
/* DIO read 20070111
if (m_bDIOREAD)
{
sbsDIOInputByte(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE), &DIOValue);
itoa(DIOValue, TMPBuffer, 10);
SetDlgItemText(hDlg, IDC_EDIT_IO, TMPBuffer);
}
else
{
sbsDIOOutputByte(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE), \
GetDlgItemInt(hDlg, IDC_EDIT_IO, NULL, FALSE));
}
*/
break;
case WM_INITDIALOG:
m_nADTVxD = sbsInit(2);
if (m_nADTVxD!=0)
{
MessageBox(hDlg,"Load Device Error","error",MB_OK);
ExitProcess(1);
EndDialog(hDlg,TRUE); //关闭对话框
}
SetDlgItemText(hDlg, IDC_EDIT_BASE, "768");
/*ADT cards list*/
SetDlgItemText(hDlg, IDC_EDIT_ADT, "ADT680");
/* SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT650");
SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT652");
SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT860");
SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT680");
SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
*/
/* DIO ports list
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"0");
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"1");
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"2");
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_IO, CBS_SORT, (WPARAM)0, (LPARAM)0);
*/
/*D/A channels list
for (nTmp=0; nTmp<4; nTmp++)
{
char value[8] = {0};
itoa(nTmp, value, 10);
SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_ADDSTRING, (WPARAM)0, (LPARAM)value);
}
SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_DA, CBS_SORT, (WPARAM)0, (LPARAM)0);
*/
/*IRQ NO list*/
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)0, (LPARAM)"2");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)1, (LPARAM)"5");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)2, (LPARAM)"7");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)3, (LPARAM)"9");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)4, (LPARAM)"10");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)5, (LPARAM)"11");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)6, (LPARAM)"12");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)7, (LPARAM)"15");
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);
SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CBS_SORT, (WPARAM)0, (LPARAM)0);
/*Initialization variables*/
m_bRunning = FALSE;
m_bClose = FALSE;
m_bDIOREAD = TRUE;
/*Initialization Dialog*/
// CheckRadioButton(hDlg, IDC_RADIO_READ, IDC_RADIO_WRITE, IDC_RADIO_READ);
SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Start");
// SetDlgItemText(hDlg, IDC_EDIT_DA, "2048");
/****************************************/
//设置系统定时器
//为I/O
/****************************************/
if (!SetTimer (hDlg, ID_TIMER, 100, NULL)) // 启动定时器
{
MessageBox (hDlg, "定时器太多!","error", MB_OK) ;
return FALSE ;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
/* case IDC_RADIO_READ:
m_bDIOREAD = TRUE;
break;
case IDC_RADIO_WRITE:
m_bDIOREAD = FALSE;
break;
*/
case IDC_BUTTON_RUN:
GetDlgItemText(hDlg, IDC_BUTTON_RUN, m_chValue, 255);
if (strcmp(m_chValue, "Start")==0)
{
if (!InitADTBoard(hDlg)) return FALSE;
SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Pause");
#ifdef _ADTDEMO_MODE_2_
for (nTmp=0; nTmp<1024; nTmp++)
sbsADSample(m_nADTNum, &ADValue, &ADChannel);
#endif
sbsIRQClear(m_nADTNum);
m_bRunning = TRUE;
m_bClose = FALSE;
}
else
{
m_bRunning = FALSE;
m_bClose = TRUE;
FreeADTBroad(hDlg);
SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Start");
}
break;
}
}
return FALSE;
}
BOOL InitADTBoard(HWND hDlg)
{
//线程处理转换
m_hADThread = CreateThread(NULL,
0,
StaADThread,
hDlg,
CREATE_SUSPENDED,
&dwThreadid);
if (m_hADThread)
{
ResumeThread(m_hADThread);
}
else
{
MessageBox (hDlg, "启动A/D失败!","error", MB_OK) ;
EndDialog(hDlg,TRUE);
return FALSE;
}
m_hEvtThread = CreateThread(NULL,
0x1000,
ServiceEvt,
hDlg,
CREATE_SUSPENDED,
&dwThreadid);
if (m_hEvtThread)
{
ResumeThread(m_hEvtThread);
}
else
{
MessageBox (hDlg, "启动Event thread失败!","error", MB_OK) ;
EndDialog(hDlg,TRUE);
return FALSE;
}
/*from dialog get value for run*/
nTmp = SBS_ADT_860;
/* GetDlgItemText(hDlg, IDC_COMBO_ADTLIST, m_chValue, 255);
if (strcmp(m_chValue, "ADT650")==0)
{
nTmp = SBS_ADT_650;
}
else if (strcmp(m_chValue, "ADT652")==0)
{
nTmp = SBS_ADT_652;
}
else if (strcmp(m_chValue, "ADT700")==0)
{
nTmp = SBS_ADT_700;
}
else if (strcmp(m_chValue, "ADT860")==0)
{
nTmp = SBS_ADT_860;
}
else if (strcmp(m_chValue, "ADT680")==0)
{
nTmp = SBS_ADT_680;
}
else if (strcmp(m_chValue, "ADT800")==0)
{
nTmp = SBS_ADT_800;
}
else return FALSE;
*/
/*Init Board*/
sbscb.boardtype = nTmp;
sbscb.base_address = GetDlgItemInt(hDlg, IDC_EDIT_BASE, NULL, FALSE);
sbscb.DMA_level = 0;
sbscb.int_level = GetDlgItemInt(hDlg, IDC_COMBO_IRQ, NULL, FALSE);
m_nADTNum = sbsInitBoard(&sbscb);
if (m_nADTNum<0)
{
MessageBox(0, "Can't InitBoard with m_nADTNum", "Error", MB_OK);
return FALSE;
}
#ifdef _ADTDEMO_MODE_1_
/*AD Set*/
ADSettings.sedi = 0; //单端
ADSettings.scnint = 2;//0: 9.3us 1: 5.3us 2:AD多通道不自动扫描
ADSettings.ADOutType = 0;//AD完成后的输出方式 0:不用FIFO 1:使用FIFO
ADSettings.ADTrig = 0; //AD的触发方式 0:软件触发, 1:硬件触发,具体为计数/定时器2(OUT2)触发
ADSettings.low_channel = 0;
ADSettings.gain = 1;//1倍增益
ADSettings.high_channel = 15;
ADSettings.polarity = 0;//0:双极性 1:单极性
ADSettings.range = 0; //0:量程为5V 1:量程10
sbsADSetConfig(m_nADTNum, &ADSettings);
#endif
#ifdef _ADTDEMO_MODE_2_
/*AD Set*/
ADSettings.sedi = 0; //单端
ADSettings.scnint = 2;//0: 9.3us 1: 5.3us 2:AD多通道不自动扫描
ADSettings.ADOutType = 1;//AD完成后的输出方式 0:不用FIFO 1:使用FIFO
ADSettings.ADTrig = 1; //AD的触发方式 0:软件触发, 1:硬件触发,具体为计数/定时器2(OUT2)触发
ADSettings.low_channel = 0;
ADSettings.gain = 1;//1倍增益
ADSettings.high_channel = 15;
ADSettings.polarity = 0;//0:双极性 1:单极性
ADSettings.range = 0; //0:量程为5V 1:量程10
sbsADSetConfig(m_nADTNum, &ADSettings);
#endif
/*clock set*/
CLKSettings.ClkFrq = 0;
CLKSettings.ClkDevNo = 0;
CLKSettings.Clk1Mode = 2;
CLKSettings.Clk2Mode = 2;
CLKSettings.Clk3Mode = 2;
CLKSettings.Clk1Divisor = 60000;
CLKSettings.Clk2Divisor = 200;
CLKSettings.Clk3Divisor = 5000;
sbsCLKSetConfig(m_nADTNum, &CLKSettings);
/*DIO set*/
DIOSettings.DIODevNo =0;// GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE);
if (m_bDIOREAD)
{
DIOSettings.DIOPort1RW = 1;
DIOSettings.DIOPort2RW = 1;
DIOSettings.DIOPort3RW = 1;
}
else
{
DIOSettings.DIOPort1RW = 0;
DIOSettings.DIOPort2RW = 0;
DIOSettings.DIOPort3RW = 0;
}
sbsDIOSetConfig(m_nADTNum, &DIOSettings);
/*Event*/
// if (m_nADTNum == 0)
{
m_hEventAD[m_nADTNum] = CreateEvent(NULL, FALSE, FALSE, NULL); //*****************响应中断的事件句柄
if (!m_hEventAD[m_nADTNum])
{
MessageBox(0, "Can't create event with m_hEventAD", "Error", MB_OK);
return FALSE;
}
}
/*irq set*/
/************************************************************************/
/* IRQS1 IRQS0 中断源 */
/* 0 0 AD 转换数据有效 */
/* 0 1 计数/定时器0(OUT0) */
/* 1 0 外部中断(下降沿有效) */
/* 1 1 计数/定时器1(OUT1) */
/************************************************************************/
sbsIRQSetConfig(m_nADTNum, 0, m_hEventAD[m_nADTNum]); //***********AD转换数据有效
return TRUE;
}
BOOL FreeADTBroad(HWND hDlg)
{
sbsFreeBoard(m_nADTNum);
if (m_hEventAD[m_nADTNum]){
CloseHandle(m_hEventAD[m_nADTNum]);
m_hEventAD[m_nADTNum] = NULL;
}
sbsIRQClear(m_nADTNum);
if(m_hADThread)
{
CloseHandle(m_hADThread);
m_hADThread = NULL;
}
if(m_hEvtThread)
{
CloseHandle(m_hEvtThread);
m_hEvtThread = NULL;
}
return TRUE;
}
DWORD WINAPI ServiceEvt(LPVOID lpData)
{
HWND hDlg = (HWND)lpData;
char buffer[512] = {0};
memset(buffer, 0, sizeof(buffer));
#ifdef _ADTDEMO_MODE_1_
while (1)
{
if (!m_bRunning) continue;
if (m_bClose)
{
m_bRunning = FALSE;
break;
}
WaitForSingleObject(m_hEventAD[m_nADTNum], INFINITE); //*****************直到采集到输入信号后返回,否则一直等待
sbsIRQClear(m_nADTNum); // 清除中断
if (m_nSec > 2000000000) m_nSec = 0;
memset(m_chValue, 0, sizeof(m_chValue));
sprintf(m_chValue, "%d", m_nSec);
SetDlgItemText(hDlg, IDC_EDIT_IRQ, m_chValue);
m_nSec++;
}
#endif
#ifdef _ADTDEMO_MODE_2_
while (1)
{
if (!m_bRunning) continue;
WaitForSingleObject(m_hEventAD[m_nADTNum], INFINITE);
sbsIRQClear(m_nADTNum); // 清除中断
for (short i=0; i<512; i++)
sbsADSample(m_nADTNum, &ADValue, &ADChannel); //*******************读AD卡。
sprintf(buffer, "%f", ADValue);
SetDlgItemText(hDlg, IDC_EDIT_AD0, buffer);
if (m_nSec > 2000000000) m_nSec = 0;
memset(m_chValue, 0, sizeof(m_chValue));
sprintf(m_chValue, "%d", m_nSec);
SetDlgItemText(hDlg, IDC_EDIT_IRQ, m_chValue);
m_nSec++;
}
#endif
return 0;
}
DWORD WINAPI StaADThread(LPVOID lpData)
{
#ifdef _ADTDEMO_MODE_1_
char buffer[512] = {0};
memset(buffer, 0, sizeof(buffer));
HWND hDlg = (HWND)lpData;
float ADValue = 0.0;
signed short ADChannel = 0;
int nIDEDIT = 0;
//采用事件驱动
while (1)
{
if (!m_bRunning) continue;
if (m_bClose)
{
m_bRunning = FALSE;
break;
}
/* AD 转换和显示 20070111*/
sbsADStartConversion(m_nADTNum); // 启动A/D变换
//Sleep(100);
while (sbsADConversionDone(m_nADTNum) == 2); // 监测A/D变换是否结束
sbsADSample(m_nADTNum, &ADValue, &ADChannel);
switch(ADChannel)
{
case 0: nIDEDIT = IDC_EDIT_AD0; break;
case 1: nIDEDIT = IDC_EDIT_AD1; break;
case 2: nIDEDIT = IDC_EDIT_AD2; break;
case 3: nIDEDIT = IDC_EDIT_AD3; break;
case 4: nIDEDIT = IDC_EDIT_AD4; break;
case 5: nIDEDIT = IDC_EDIT_AD5; break;
case 6: nIDEDIT = IDC_EDIT_AD6; break;
/* case 7: nIDEDIT = IDC_EDIT_AD7; break;
case 8: nIDEDIT = IDC_EDIT_AD8; break;
case 9: nIDEDIT = IDC_EDIT_AD9; break;
case 10: nIDEDIT = IDC_EDIT_AD10; break;
case 11: nIDEDIT = IDC_EDIT_AD11; break;
case 12: nIDEDIT = IDC_EDIT_AD12; break;
case 13: nIDEDIT = IDC_EDIT_AD13; break;
case 14: nIDEDIT = IDC_EDIT_AD14; break;
case 15: nIDEDIT = IDC_EDIT_AD15; break;
*/
}
sprintf(buffer, "%f", ADValue);
SetDlgItemText(hDlg, nIDEDIT, buffer);
Sleep(500);
}
#endif
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -