unit fmuPoll; interface uses // VCL Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, // This untPage, MifareLib_TLB; type TfmPoll = class(TPage) Memo: TMemo; btnPollStart: TButton; btnPollStop: TButton; btnClear: TButton; lblAccessTime: TLabel; edtAccessTime: TEdit; procedure btnClearClick(Sender: TObject); procedure btnPollStartClick(Sender: TObject); procedure btnPollStopClick(Sender: TObject); private AccessTime: Int64; AccessCount: Integer; procedure UpdateControls; procedure DriverEvent(Sender: TObject; EventID: Integer); procedure PollError(Sender: TObject; ErrorCode: Integer; const ErrorText: WideString); procedure CardFound; end; var fmPoll: TfmPoll; implementation {$R *.DFM} procedure TfmPoll.btnClearClick(Sender: TObject); begin Memo.Clear; end; procedure TfmPoll.DriverEvent(Sender: TObject; EventID: Integer); begin Memo.Lines.Add(Format('DriverEvent: EventID: %d', [EventID])); Driver.EventID := EventID; if Driver.FindEvent = 0 then begin if Driver.EventType = 0 then begin Memo.Lines.Add(Format('CardUIDHex: %s', [ Driver.EventCardUIDHex])); CardFound; end else begin Memo.Lines.Add(Format('PollError: %d, %s', [ Driver.EventErrorCode, Driver.EventErrorText])); end; end; Driver.DeleteEvent; end; procedure TfmPoll.PollError(Sender: TObject; ErrorCode: Integer; const ErrorText: WideString); begin Memo.Lines.Add(Format('Ошибка опроса: %d, %s', [ErrorCode, ErrorText])); end; procedure TfmPoll.CardFound; procedure Check(ResultCode: Integer); begin if ResultCode <> 0 then raise Exception.CreateFmt('%d, %s', [Driver.ResultCode, Driver.ResultDescription]); end; function AuthKey(const Key: Widestring): Integer; begin Check(Driver.RequestAll); Driver.UIDHex := Driver.EventCardUIDHex; Check(Driver.PiccSelect); Driver.KeyType := ktKeyA; //$00000060 Driver.KeyEncoded := Key; Driver.BlockNumber := 1; Result := Driver.PiccAuthKey; end; var TickCount: Integer; begin Memo.Lines.Add('Найдена карта №' + Driver.EventCardUIDHex); TickCount := GetTickCount; Check(Driver.PollStop); try Driver.PortNumber := Driver.EventPortNumber; if AuthKey('F0F0F0F0F0F0F0F0F0F0F0F0') <> 0 then begin Check(AuthKey('0F0F0F0F0F0F0F0F0F0F0F0F')); end; Driver.BlockNumber := 1; Check(Driver.PiccRead); Check(Driver.PiccWrite); Memo.Lines.Add('Блок №1: ' + Driver.BlockDataHex); except on E: Exception do Memo.Lines.Add('Ошибка: ' + E.Message); end; Check(Driver.PollStart); AccessTime := AccessTime + (Integer(GetTickCount) - TickCount); Inc(AccessCount); edtAccessTime.Text := IntToStr(Trunc(AccessTime/AccessCount)); Memo.Lines.Add(' '); end; procedure TfmPoll.UpdateControls; begin if Driver.PollStarted then begin btnPollStart.Enabled := False; btnPollStop.Enabled := True; btnPollStop.SetFocus; end else begin btnPollStop.Enabled := False; btnPollStart.Enabled := True; btnPollStart.SetFocus; end; end; procedure TfmPoll.btnPollStartClick(Sender: TObject); begin AccessTime := 0; AccessCount := 0; EnableButtons(False); try Driver.PollAutoDisable := False; Driver.OnPollError := PollError; Driver.OnDriverEvent := DriverEvent; Driver.PollStart; finally EnableButtons(True); UpdateControls; end; end; procedure TfmPoll.btnPollStopClick(Sender: TObject); begin EnableButtons(False); try Driver.PollStop; Driver.OnCardFound := nil; finally EnableButtons(True); UpdateControls; end; end; end.