⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcm3780_diintfrm.cpp

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 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 + -