init.cpp

来自「16 relay output channels and 16 isolated」· C++ 代码 · 共 634 行 · 第 1/2 页

CPP
634
字号
    // 3. Start AI interrupt funciton
    // 3.1 Fill element of PT_FAIIntScanStart
    ptFAIStart.TrigSrc = gwExtTrig;       // Ext trig mode   li.zhe modify
    ptFAIStart.SampleRate = editPacerRate->Text.ToInt();
    ptFAIStart.NumChans = cmbChlCount->Text.ToInt();
    ptFAIStart.StartChan = cmbStartChl->Text.ToInt();
    ptFAIStart.GainList = usGainCode;
    ptFAIStart.count = gulConvNum;
    ptFAIStart.cyclic = chkCyclic->Checked;
    if (giFifoEnable == 1 && giFifoSize > 0)
        ptFAIStart.IntrCount = giFifoSize;
    else
        ptFAIStart.IntrCount = 1;
    // Allocate memory
    hBuf = GlobalAlloc(GHND, sizeof(USHORT) * gulConvNum);
    if(hBuf == 0)
    {
        strcpy(szErrMsg, "Not enough memory for buffer");
        Application->MessageBox(szErrMsg, "Driver Message", MB_OK);
        DRV_DeviceClose(&DeviceHandle);
        return;
    }
    ptFAIStart.buffer = (USHORT far *) hBuf;
     // allocate data memory
     if((hUserBuf=(FLOAT far *)GlobalAlloc(GHND, sizeof(FLOAT) * gulConvNum)) == 0)
     {
         lstrcpy((char *) szErrMsg, "Not enough memory for buffer");
         DRV_DeviceClose((LONG far *)&DeviceHandle);
         Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK);
         return;
     }
    ptFAITransfer.DataBuffer = (FLOAT far  *)GlobalLock(hUserBuf);

    // 3.2 Call advantech API function DRV_FAIIntScanStart
    ErrCde = DRV_FAIIntScanStart(DeviceHandle, &ptFAIStart);
    if (ChkErr(ErrCde))
    {
       ErrCde = DRV_DeviceClose(&DeviceHandle);
       GlobalFree(hBuf);
       return;
    }

    if( giEvtFlag )
    {
       pThread = new CheckThread(false);
       gbThreadFlag = true;  // set the thread flag
    }

    // 4. Entering converting form
    FrmConvert->txtInt->Text=IntToStr(0);
    FrmConvert->txtBuffChange->Text=IntToStr(0);

    FrmConvert->Show();
    frmDataShow->Show();
    frmDataShow->Hide();
    FrmInit->Hide();
    FrmConvert->prgsDataCounts->Max = editConv->Text.ToInt();
    FrmConvert->tmrDataCounts->Enabled = True;
}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::butGainListClick(TObject *Sender)
{
    usStartChan=cmbStartChl->Text.ToInt();
    usChanNum= cmbChlCount->Text.ToInt();
    frmGainList->SetGainList();
    frmGainList->Show();
}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::butExitClick(TObject *Sender)
{
    GlobalFree(hBuf);
    Application->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::chkEventEnableClick(TObject *Sender)
{
    giEvtFlag = chkEventEnable->Checked;
}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::chkFifoClick(TObject *Sender)
{
    long lFifoSize;

    giFifoEnable = chkFifo->Checked;
    if (giFifoEnable == 1)
    {
        editFifo->Enabled = True;

        // Step 1: Device open
        ErrCde = DRV_DeviceOpen(DeviceList[lstDevice->ItemIndex].dwDeviceNum, &DeviceHandle);
        if (ChkErr(ErrCde))
            return;

        // Step 2: Get FIFO size
        ErrCde = DRV_GetFIFOSize(DeviceHandle, &lFifoSize);
        if (ChkErr(ErrCde))
            return;

        // Step 3: Close device
        DRV_DeviceClose (&DeviceHandle);

        giFifoSize = lFifoSize / 2;   // divide by 2 for conversion from byte to word
        editFifo->Text = giFifoSize;
        editConv->Text = IntToStr(lFifoSize);

    }
    else
    {
        editFifo->Enabled = False;
        editFifo->Text = "0";
    }
}
//---------------------------------------------------------------------------



bool TFrmInit::CheckEvent()
{
        //TODO: Add your source code here

         ptCheckEvent.EventType = &usEventType;
        if (chkCyclic->Checked )
	{
            ptCheckEvent.Milliseconds = INFINITE;
        }
	else
	{
            ptCheckEvent.Milliseconds = 1000 * (gulConvNum / gdwPacerRate) + 2000;
	}

        if ((ErrCde = DRV_CheckEvent(DeviceHandle,
            (LPT_CheckEvent)&ptCheckEvent)) != 0)
        {
            Application->MessageBox("Check Event Error !","Thread Message",MB_OK);
            return false;
        }
        // Process interrupt event
        if (usEventType & ADS_EVT_INTERRUPT)
        {
            ulIntCounter++;
        }

        // Process buffer change event
        if (usEventType & ADS_EVT_BUFCHANGE)
        {
            ulBfChgCounter++;
        }

        // Process overrun event
        if (usEventType == ADS_EVT_OVERRUN)
        {
            ulOverrunCounter++;
        }
        FrmConvert->txtInt->Text=IntToStr(ulIntCounter);
        FrmConvert->txtBuffChange->Text=IntToStr(ulBfChgCounter);

        // Process terminate event
        if (usEventType & ADS_EVT_TERMINATED)
        {
            // process terminate event
             Terminate();
             return false;
          }

       return true ;


}

void TFrmInit::StopThread()
{
    //TODO: Add your source code here
    gbThreadFlag = false;

}

void TFrmInit::Terminate()
{
        //TODO: Add your source code here
         LPVOID temp;
         FrmConvert->tmrDataCounts->Enabled = false;

        gbThreadFlag = false;

        ptFAITransfer.ActiveBuf = 0;     // Single buffer
        ptFAITransfer.DataType = guDataType;
        ptFAITransfer.start    = 0;
        ptFAITransfer.count    = gulConvNum;
        ptFAITransfer.overrun  = &gwOverrun;

        if ((ErrCde = DRV_FAITransfer(DeviceHandle,
            (LPT_FAITransfer)&ptFAITransfer)) != 0)
        {
            DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
            GlobalUnlock(hBuf);
            GlobalUnlock(hUserBuf);
            GlobalFree(hBuf);
            GlobalFree(hUserBuf);
            DRV_DeviceClose((LONG far *)&DeviceHandle);
            Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK);
            return;
        }


        if ((ErrCde = DRV_FAITerminate(DeviceHandle)) != 0)
        {
                DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
                GlobalUnlock(hBuf);
                GlobalUnlock(hUserBuf);
                GlobalFree(hBuf);
                GlobalFree(hUserBuf);
                DRV_DeviceClose((LONG far *)&DeviceHandle);
                Application->MessageBox((char *)szErrMsg, "Driver Message", MB_OK);
        }


        // Display Data
        frmDataShow->Show();
        frmDataShow->lstData->Clear();
        if (guDataType == 0)
           temp = (USHORT far *)ptFAITransfer.DataBuffer;
        else
           temp = (FLOAT far *)ptFAITransfer.DataBuffer;

        char szbuff[100];
        for(ULONG i = 0; i < gulConvNum; ++i)
        {
           if (guDataType == 0)
               sprintf(szbuff,"Buff[%2.2d] = %X",i,((USHORT far *)temp)[i]);
           else
               sprintf(szbuff,"Buff[%2.2d] = %10.6f",i,((float far *)temp)[i]);
               frmDataShow->lstData->Items->Add(szbuff);

        }

        FrmConvert->Close();


        if(pThread!=NULL)
        {
            pThread->Terminate();
            DWORD dwExitCode;
            GetExitCodeThread( (void *)pThread->Handle ,&dwExitCode) ;
            if(dwExitCode == STILL_ACTIVE )
               TerminateThread( (void *)pThread->Handle, dwExitCode);
            pThread = NULL;
        }

        // Free buffer
        GlobalUnlock(hBuf);
        GlobalUnlock(hUserBuf);
        GlobalFree(hBuf);
        GlobalFree(hUserBuf);

}


void __fastcall TFrmInit::cmbOverallGainChange(TObject *Sender)
{
    GainCodeFilling();
}
//---------------------------------------------------------------------------


void __fastcall TFrmInit::radOverallClick(TObject *Sender)
{
    GainCodeFilling();

    butGainList->Enabled = False;
    cmbOverallGain->Enabled = True;

}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::radGainListClick(TObject *Sender)
{
        butGainList->Enabled = True;
        cmbOverallGain->Enabled = False;
}
//---------------------------------------------------------------------------
// li.zhe add 2004/11/5
void __fastcall TFrmInit::radExtTrigClick(TObject *Sender)
{
   gwExtTrig = 1;
   radExtTrig->Checked = true;
   radIntTrig->Checked = false;

}
//---------------------------------------------------------------------------

void __fastcall TFrmInit::radIntTrigClick(TObject *Sender)
{
   gwExtTrig = 0;
   radIntTrig->Checked = true;
   radExtTrig->Checked = false;

}
// end li.zhe 2004/11/5
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?