📄 pcm3780_diintfrm.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "PCM3780_DIINTFRM.h"
#include "EventThread.h"
#include "stdio.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//Init some value
m_lDriverHandle = NULL;
m_EventThread = NULL;
m_dwEventChan = 0;
for(int i=0; i<24; i++){
m_dwEventCount[i] = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
char szDescription[80];
TListItem *ListItem;
PT_DioSetPortMode ptDioSetPortMode;
RealeaseSrc();
//This function is for getting the device number
DRV_SelectDevice(Handle, True, (ULONG*)&m_ulDeviceNum, szDescription);
labDeviceName->Caption = AnsiString(szDescription);
//Open Device
m_dwErrCde = DRV_DeviceOpen(m_ulDeviceNum, &m_lDriverHandle);
if(m_dwErrCde != SUCCESS){
DRV_GetErrorMessage(m_dwErrCde, (LPSTR)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Message");
return;
}
//Get Device Features
m_ptDevFeatures.buffer = &m_DevFeatures;
m_ptDevFeatures.size = sizeof(DEVFEATURES);
m_dwErrCde = DRV_DeviceGetFeatures(m_lDriverHandle, &m_ptDevFeatures);
if(m_dwErrCde != SUCCESS){
DRV_GetErrorMessage(m_dwErrCde, (LPSTR)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Message");
return;
}
//Record some device specific parameter
m_dwBoardID = m_DevFeatures.dwBoardID;
m_usMaxChanNum = m_DevFeatures.usMaxDIChl;
//Set All the Ports perform DI
ptDioSetPortMode.dir = 0;
for(int i=0; i<m_usMaxChanNum/8; i++){
ptDioSetPortMode.port = i;
m_dwErrCde = DRV_DioSetPortMode(m_lDriverHandle, &ptDioSetPortMode);
if(m_dwErrCde != SUCCESS){
DRV_GetErrorMessage(m_dwErrCde, (LPSTR)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Handle");
DRV_DeviceClose(&m_lDriverHandle);
return;
}
}
//Update UI
//cmbPort
cmbPort->Clear();
for(int i=0; i<m_usMaxChanNum/8; i++){
cmbPort->Items->Add(AnsiString(i));
}
cmbPort->ItemIndex = 0;
//lsvInt
lsvInt->Clear();
for(int i=0; i<m_usMaxChanNum; i++){
ListItem = lsvInt->Items->Add();
ListItem->Caption = "Port"+AnsiString(i/8)+"_Chan"+AnsiString(i%8);
ListItem->SubItems->Add("0");
}
btnStop->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnExitClick(TObject *Sender)
{
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnScanClick(TObject *Sender)
{
tmrDIScan->Enabled = true;
btnStop->Enabled = true;
btnScan->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tmrDIScanTimer(TObject *Sender)
{
PT_DioReadPortByte ptDioReadPortByte;
USHORT usData;
ptDioReadPortByte.port = (USHORT)cmbPort->ItemIndex;
ptDioReadPortByte.value = &usData;
m_dwErrCde = DRV_DioReadPortByte(m_lDriverHandle, &ptDioReadPortByte);
if(m_dwErrCde != SUCCESS){
tmrDIScan->Enabled = false;
DRV_GetErrorMessage(m_dwErrCde, (char*)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Message");
btnStopClick(Sender);
return;
}
txtData->Text = IntToHex(usData, 2)+"(H)";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender)
{
tmrDIScan->Enabled = false;
btnStop->Enabled = false;
btnScan->Enabled = true;
}
//---------------------------------------------------------------------------
void TForm1::RealeaseSrc()
{
DWORD dwExitCode;
//Stop Timer
tmrDIScan->Enabled = false;
tmrDIInt->Enabled = false;
//Stop Thread
if(m_EventThread){
GetExitCodeThread((void*)m_EventThread->Handle, &dwExitCode );
if( dwExitCode == STILL_ACTIVE ){
TerminateThread((void*)m_EventThread->Handle, (ULONG)4);
}
delete m_EventThread;
m_EventThread = NULL;
}
if(m_lDriverHandle){
DRV_DeviceClose(&m_lDriverHandle);
m_lDriverHandle = NULL;
}
}
void __fastcall TForm1::btnSelectDevClick(TObject *Sender)
{
FormCreate(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
RealeaseSrc();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::lsvIntChange(TObject *Sender, TListItem *Item,
TItemChange Change)
{
PT_EnableEvent ptEnableEvent;
DWORD dwChecked;
DWORD dwExitCode;
if(Item->Checked){
dwChecked = 1;
}else{
dwChecked = 0;
}
//prevent the undesirable access when this control initializing
if((m_dwEventChan & (0x01<< Item->Index))== dwChecked <<Item->Index ){
return;
}
//Enable or Disable Event
if(Item->Index >= 0){
if(Item->Checked){
ptEnableEvent.Enabled = 1;
m_dwEventChan |= 0x01<<Item->Index;
}else{
ptEnableEvent.Enabled = 0;
m_dwEventChan &= ~(0x01<<Item->Index);
}
ptEnableEvent.EventType = ADS_EVT_INTERRUPT_DI0 + Item->Index;
ptEnableEvent.Count = 1;
m_dwEventCount[Item->Index] = 0;
m_dwErrCde = DRV_EnableEvent(m_lDriverHandle, &ptEnableEvent);
if(m_dwErrCde != SUCCESS){
DRV_GetErrorMessage(m_dwErrCde, (LPSTR)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Handle");
DRV_DeviceClose(&m_lDriverHandle);
return;
}
//Create Thread and Enable timer
if(m_dwEventChan && (!m_EventThread)){
m_EventThread = new TEventThread(false);
tmrDIInt->Enabled = true;
}
//Terminate the thread and timer when all the events are disabled
if((!m_dwEventChan)&&(m_EventThread)){
GetExitCodeThread((void*)m_EventThread->Handle, &dwExitCode );
if( dwExitCode == STILL_ACTIVE ){
TerminateThread((void*)m_EventThread->Handle, 4);
m_EventThread = NULL;
}
// Disable the timer
tmrDIInt->Enabled = false;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnDisableClick(TObject *Sender)
{
PT_EnableEvent ptEnableEvent;
DWORD dwExitCode;
//1. Terminate the Thread
if((!m_dwEventChan)&&(m_EventThread)){
GetExitCodeThread((void*)m_EventThread->Handle, &dwExitCode );
if( dwExitCode == STILL_ACTIVE ){
TerminateThread((void*)m_EventThread->Handle, 4);
m_EventThread = NULL;
}
}
//2. Disable all the events
ptEnableEvent.Enabled = 0;
ptEnableEvent.Count = 1;
for(int i=0; i<m_usMaxChanNum; i++){
ptEnableEvent.EventType = ADS_EVT_INTERRUPT_DI0 + i;
m_dwErrCde = DRV_EnableEvent(m_lDriverHandle, &ptEnableEvent);
if(m_dwErrCde != SUCCESS){
DRV_GetErrorMessage(m_dwErrCde, (LPSTR)m_ErrMsg);
Application->MessageBoxA((char*)m_ErrMsg, "Driver Handle");
DRV_DeviceClose(&m_lDriverHandle);
return;
}
}
//3. Update UI
for(int i=0; i<m_usMaxChanNum; i++){
lsvInt->Items->Item[i]->Checked = false;
m_dwEventCount[i] = 0;
}
//4. Disable the Timer
tmrDIInt->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tmrDIIntTimer(TObject *Sender)
{
float ratio;
DWORD dwTime;
char szBuf[20];
m_dwCurrentTime = GetTickCount();
dwTime = m_dwCurrentTime - m_dwStartTime;
if(dwTime > 1000)
{
m_dwStartTime = m_dwCurrentTime;
for (int i=0; i<m_usMaxChanNum; i++){
ratio = (float)(((float)(m_dwEventCount[i]) / (float)dwTime) * 1000.0);
sprintf( szBuf, "%.3f", ratio );
lsvInt->Items->Item[i]->SubItems[0].Text = AnsiString(szBuf);
m_dwEventCount[i] = 0;
}
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -