📄 mainform.pas
字号:
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 + -