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

📄 mainform.pas

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      ptFAIDmaExStart.TrigVol	     	:= gwTrigVol;
      ptFAIDmaExStart.StartChan 	:= gwStartChl;
      ptFAIDmaExStart.NumChans		:= Min(gwChlNum,gwMaxLogChanNum-1);
      ptFAIDmaExStart.ulDelayCnt     	:= gwDelayCnt;
      ptFAIDmaExStart.SampleRate     	:= gdwPacerRate;
      ptFAIDmaExStart.GainList		:= @ReorderGainCode[0];
      ptFAIDmaExStart.count	      	:= gulConvNum;
      ptFAIDmaExStart.buffer0	      	:= Pointer(GlobalLock(hUserBuf));

      ErrCde := DRV_FAIDmaExStart(DriverHandle,ptFAIDmaExStart);
       if DoesErr(ErrCde) = 1  then
      begin
         GlobalFree(HGLOBAL(hUserBuf));
         GlobalFree(HGLOBAL(hDisplayBuf));
         DRV_DeviceClose(DriverHandle);
         Exit;
      end;

      bThreadloop:=true;
      chkThread:=CheckThread.Create(false);
 

     frmDisplay.Show();
     frmDisplay.lstBuffer.Visible := false;

     butStart.Enabled := False;
     butStop.Enabled  := True;
     butExit.Enabled  := False;

    butStop.Enabled := true;
    butStart.Enabled := false;
    lstDevice.Enabled := false;
    editScanNum.Enabled := false;
    cmbGain.Enabled := false;
    cmbChannel.Enabled := false;
    gulOverrunTime := StrToInt(editOverrunTime.Text);


    bThreadloop := true;
end;

procedure TfrmMain.radGainListClick(Sender: TObject);
begin
   butGainList.Enabled := true;
   cmbGain.Enabled := false;

end;

procedure TfrmMain.radOverallClick(Sender: TObject);
var
   i   : integer;
begin
  butGainList.Enabled := false;
   cmbGain.Enabled := true;
   for i:=0 to 63 do
      gwGain[i] :=  cmbGain.ItemIndex;


end;

procedure TfrmMain.butGainListClick(Sender: TObject);
begin
   gwStartChl := cmbChannel.ItemIndex;
   gwChlNum :=  StrToInt(editScanNum.Text);

   GainList.ShowModal();
end;

procedure TfrmMain.radPacerClick(Sender: TObject);
begin
   editDelayCount.Enabled:=false;
   radFalling.Enabled := false;
   radRising.Enabled := false;
   radDigital.Enabled := false;
   radAI0.Enabled := false;
   radAI1.Enabled := false;
   radAI2.Enabled := false;
   radAI3.Enabled := false;
   radInternal.Checked := true;
   gwTrigMode:=0;
   radCyclic.Enabled := true;
   radNonCyclic.Enabled := true;

end;

procedure TfrmMain.radPostClick(Sender: TObject);
begin
   editDelayCount.Enabled:=false;
   radFalling.Enabled := true;
   radRising.Enabled := true;
    radDigital.Enabled := true;
   radAI0.Enabled := true;
   radAI1.Enabled := true;
   radAI2.Enabled := true;
   radAI3.Enabled := true;
   radExternal.Checked:=true;
   gwTrigMode:=1;
   gwTrigEdge:=0;
   radRising.Checked := True;
   radCyclic.Enabled := true;
   radNonCyclic.Enabled := true;
   
   end;

procedure TfrmMain.CheckEvent();
var
    usEventType : integer;
    szData      : string;
begin
    gulIntCounter := 0;
    gulBfChgCounter := 0;
    gulOverrunCounter := 0;

    while( bThreadloop =true )   do
    begin
        ptCheckEvent.EventType := @usEventType;
        if ( gulOverrunTime = 0 ) then
            ptCheckEvent.Milliseconds := INFINITE
        else
            ptCheckEvent.Milliseconds := gulOverrunTime;


        ErrCde := DRV_CheckEvent(DriverHandle,ptCheckEvent);
        if DoesErr(ErrCde) = 1  then
        begin
         butStopClick(nil);
         Exit;
        end;


        // Process interrupt event
        if ((usEventType and ADS_EVT_INTERRUPT)<>0 ) then
            InterruptEvent();

        // Process buffer change event
        if ((usEventType and ADS_EVT_BUFCHANGE)<>0 )  then
            BufChangeEvent();

        // Process overrun event
        if ((usEventType and ADS_EVT_OVERRUN) <>0 ) then
            OverrunEvent();

        // Process terminate event
        if ((usEventType and ADS_EVT_TERMINATED) <>0 )  then
        begin
            TerminateEvent();
            Exit;
        end;

        frmDisplay.Canvas.Lock();
        szCounter := 'Interrupt Counter = '+ IntToStr(gulIntCounter);
        frmDisplay.Canvas.TextOut(20, 40, szCounter );
        szData := 'Buffer change Counter = '+IntToStr(gulBfChgCounter);
       frmDisplay.Canvas.TextOut( 20, 60, szData );
        szData := 'Overrun Counter = '+ IntToStr(gulOverrunCounter);
        frmDisplay.Canvas.TextOut( 20, 80, szData );
        frmDisplay.Canvas.Unlock();
   end;

end;

procedure TfrmMain.InterruptEvent();
begin
    gulIntCounter:=gulIntCounter+1;

end;

procedure TfrmMain.BufChangeEvent();
var
  szData   : AnsiString;
  i        : integer;
  p        : Pointer;
begin

   gulBfChgCounter:=gulBfChgCounter+1;
   gwCyclicCount := gulBfChgCounter div 2;

   // Get DMA transfer status
   ptFAICheck.ActiveBuf := @gwActiveBuf;
   ptFAICheck.stopped   := @gwStopped;
   ptFAICheck.retrieved := @gulRetrieved;
   ptFAICheck.overrun   := @gwOverrun;
   ptFAICheck.HalfReady := @gwHalfReady;

   ErrCde := DRV_FAICheck(DriverHandle,ptFAICheck);

    // When call DRV_FAITransfer( ), the overrun event flag will be cleaned,
    // otherwise, the application will receive overrun event continously.
    // Get real voltage of buffer from driver
    ptFAITransfer.ActiveBuf := 0;   // single buffer
    ptFAITransfer.DataType := gwDataType;

    if ( 2=gwHalfReady ) then
       ptFAITransfer.start := gulConvNum div 2
    else
       ptFAITransfer.start := 0;

    if ( gulConvNum > gwChlNum ) then
       ptFAITransfer.count := gwChlNum // For demo, we only get few data
    else
       ptFAITransfer.count := 1;  // For demo, we only get few data
    ptFAITransfer.overrun  := @gwOverrun;

    ErrCde := DRV_FAITransfer(DriverHandle,ptFAITransfer);
   frmDisplay.Canvas.Lock();
    frmDisplay.Canvas.Font.Color := clBlue;
    p :=ptFAITransfer.DataBuffer;
     for i:=0 to gwChlNum-1 do
    begin
        if ( gwDataType = 1 ) then
        begin
          szData := 'Buffer ' + IntToStr( i);
          szData := szData + ': ';
          szData := szData + FormatFloat('0.00000000',single(p^) );
          Longint(p) := Longint(p) + SizeOf(Single);
        end
        else
        begin
          szData := 'Buffer ' + IntToStr( i);
          szData := szData + ': ';
          szData := szData + IntToHex( Word(p^), 3 );
          Longint(p) := Longint(p) + SizeOf(Word);
       end;
        frmDisplay.Canvas.TextOut( 20, 120+ 15*i, szData );
    end;
    frmDisplay.Canvas.Unlock();
end;


procedure TfrmMain.OverrunEvent();
begin
     gulOverrunCounter:=gulOverrunCounter+1;
    DRV_ClearOverrun(  DriverHandle );

end;

procedure TfrmMain.TerminateEvent();
var
  szData   : AnsiString;
  i        : integer;
  p        : Pointer;
begin
   // Get real voltage of buffer from driver
   ptFAITransfer.ActiveBuf := 0;   // single buffer
   ptFAITransfer.DataType := gwDataType;
   ptFAITransfer.start    := 0;
   ptFAITransfer.count    := gulConvNum;
   ptFAITransfer.overrun  := @gwOverrun;

   ErrCde := DRV_FAITransfer(DriverHandle, ptFAITransfer);
    if DoesErr(ErrCde) = 1  then
    begin
      DRV_DeviceClose(DriverHandle);
      Exit;
    end;
   // Display data
    frmDisplay.Show();
    frmDisplay.Visible := true;
    frmDisplay.lstBuffer.Clear();
     frmDisplay.lstBuffer.Visible :=true;
    p := ptFAITransfer.DataBuffer;
    for i:=0 to gwChlNum-1 do
    begin
        if ( gwDataType = 1 ) then
        begin
          szData := 'Buffer ' + IntToStr( i );
          szData := szData + ': ';
          szData := szData + FormatFloat('0.00000000',single(p^) );
          Longint(p) := Longint(p) + SizeOf(Single);
        end
        else
        begin
          szData := 'Buffer ' + IntToStr( i);
          szData := szData + ': ';
          szData := szData + IntToHex( Word(p^), 3 );
          Longint(p) := Longint(p) + SizeOf(Word);
       end;
        frmDisplay.lstBuffer.Items.Add(szData);
    end;

   // Free buffer
   GlobalFree(HGLOBAL(hUserBuf));
   GlobalFree(HGLOBAL(hDisplayBuf));
   // Close driver
     ErrCde := DRV_DeviceClose(DriverHandle);
    if DoesErr(ErrCde) = 1  then
    begin
      Exit;
    end;


    butStop.Enabled := false;
    butStart.Enabled := true;
    lstDevice.Enabled := true;
    editScanNum.Enabled := true;
    cmbGain.Enabled := true;
    cmbChannel.Enabled := true;
    butExit.Enabled := true;
    frmDisplay.lstBuffer.Visible :=true;

end;

procedure TfrmMain.butStopClick(Sender: TObject);
var
  szData   : AnsiString;
  i        : integer;
  p        : Pointer;
  ExitCode : DWORD;
begin
   ErrCde := DRV_FAITerminate(DriverHandle);
    if DoesErr(ErrCde) = 1  then
      DRV_DeviceClose(DriverHandle);
end;

procedure TfrmMain.radCyclicClick(Sender: TObject);
begin
     gwCyclicMode := 1;
end;

procedure TfrmMain.radNonCyclicClick(Sender: TObject);
begin
     gwCyclicMode := 0;

end;

procedure TfrmMain.radRawDataClick(Sender: TObject);
begin
     gwDataType := 0;

end;

procedure TfrmMain.radVoltageClick(Sender: TObject);
begin
     gwDataType := 1;

end;

procedure TfrmMain.radClockInternalClick(Sender: TObject);
begin
    editPacerRate.Enabled := true;
    gwClockSrc := 0;

end;

procedure TfrmMain.radClockExternal0Click(Sender: TObject);
begin
     editPacerRate.Enabled := false;
    gwClockSrc := 1;
end;

procedure TfrmMain.radClockExternal1Click(Sender: TObject);
begin
     editPacerRate.Enabled := false;
    gwClockSrc := 2;
end;

procedure TfrmMain.radInternalClick(Sender: TObject);
begin
        gwExtTrig:=0;

end;

procedure TfrmMain.radExternalClick(Sender: TObject);
begin
        gwExtTrig:=1;

end;

procedure TfrmMain.radRisingClick(Sender: TObject);
begin
    gwTrigEdge:=0;

end;

procedure TfrmMain.radFallingClick(Sender: TObject);
begin
    gwTrigEdge:=1;

end;

procedure TfrmMain.radDigitalClick(Sender: TObject);
begin
   editTrigVolt.Enabled := false;
   gwSRCType := 0;
end;

procedure TfrmMain.radAI0Click(Sender: TObject);
begin
   editTrigVolt.Enabled := true;
   gwSRCType := 1;
end;

procedure TfrmMain.radAI1Click(Sender: TObject);
begin
   editTrigVolt.Enabled := true;
   gwSRCType := 2;
end;

procedure TfrmMain.radAI2Click(Sender: TObject);
begin
   editTrigVolt.Enabled := true;
   gwSRCType := 3;
end;

procedure TfrmMain.radAI3Click(Sender: TObject);
begin
   editTrigVolt.Enabled := true;
   gwSRCType := 4;
end;

procedure TfrmMain.radDelayClick(Sender: TObject);
begin
   editDelayCount.Enabled:=true;
   radFalling.Enabled := true;
   radRising.Enabled := true;
   radDigital.Enabled := true;
   radAI0.Enabled := true;
   radAI1.Enabled := true;
   radAI2.Enabled := true;
   radAI3.Enabled := true;
   radExternal.Checked:=true;
   gwTrigMode:=2;
    gwTrigEdge:=1;
   radFalling.Checked := True;
   radCyclic.Enabled := true;
   radNonCyclic.Enabled := true;

end;

procedure TfrmMain.radAboutClick(Sender: TObject);
begin
   editDelayCount.Enabled:=true;
   radFalling.Enabled := true;
   radRising.Enabled := true;
   radDigital.Enabled := true;
   radAI0.Enabled := true;
   radAI1.Enabled := true;
   radAI2.Enabled := true;
   radAI3.Enabled := true;
   radExternal.Checked:=true;
   gwTrigMode:=3;
   gwTrigEdge:=0;
   radRising.Checked := True;
   radCyclic.Enabled := false;
   radNonCyclic.Enabled := false;



end;

procedure TfrmMain.butExitClick(Sender: TObject);
begin
   Close();
end;

procedure TfrmMain.cmbGainChange(Sender: TObject);
var
   i : integer;
begin
   for i:=0 to 63 do
      gwGain[i] :=  cmbGain.ItemIndex;


end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if (butStop.Enabled) then
      butStopClick(Sender);
end;

end.




⌨️ 快捷键说明

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