comsdktest.~pas
上传用户:lzd18710
上传日期:2009-11-26
资源大小:3595k
文件大小:32k
源码类别:

通讯编程

开发平台:

Visual Basic

  1. unit comsdktest;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, OleCtrls, zkemkeeper_TLB, Menus, Buttons, Grids,
  6.   ValEdit, ExtCtrls;
  7. type
  8.   TForm1 = class(TForm)
  9.     CZKEM1: TCZKEM;
  10.     Label1: TLabel;
  11.     btnConnect: TButton;
  12.     Memo1: TMemo;
  13.     SaveDialog1: TSaveDialog;
  14.     gbOP: TGroupBox;
  15.     btnSetTime: TButton;
  16.     vleDevInfo: TValueListEditor;
  17.     btnLoadDevInfo: TBitBtn;
  18.     btnSaveDevInfo: TBitBtn;
  19.     Button3: TButton;
  20.     GroupBox1: TGroupBox;
  21.     btnClearData: TButton;
  22.     Button5: TButton;
  23.     Button6: TButton;
  24.     btnBackupUser: TButton;
  25.     btnRestore: TButton;
  26.     Button9: TButton;
  27.     OpenDialog1: TOpenDialog;
  28.     btnDeleteUser: TButton;
  29.     btnSetName: TButton;
  30.     Button10: TButton;
  31.     btnAutoTest: TButton;
  32.     edtNetAddress: TLabeledEdit;
  33.     edtNetPort: TLabeledEdit;
  34.     edtBaudRate: TEdit;
  35.     sbtnRS232: TSpeedButton;
  36.     sbtnTCPIP: TSpeedButton;
  37.     Label5: TLabel;
  38.     btnACUnlock: TButton;
  39.     edtPassword: TEdit;
  40.     Label2: TLabel;
  41.     chkEnabled: TCheckBox;
  42.     Button7: TButton;
  43.     Button8: TButton;
  44.     Button12: TButton;
  45.     Button11: TButton;
  46.     Button14: TButton;
  47.     Button13: TButton;
  48.     Button15: TButton;
  49.     Button16: TButton;
  50.     Button17: TButton;
  51.     Button18: TButton;
  52.     Button19: TButton;
  53.     Button20: TButton;
  54.     btnSMS: TButton;
  55.     Button1: TButton;
  56.     SaveDialog2: TSaveDialog;
  57.     OpenDialog2: TOpenDialog;
  58.     Button2: TButton;
  59.     procedure FormCreate(Sender: TObject);
  60.     procedure btnConnectClick(Sender: TObject);
  61.     procedure btnLoadDevInfoClick(Sender: TObject);
  62.     procedure btnSaveDevInfoClick(Sender: TObject);
  63.     procedure btnSetTimeClick(Sender: TObject);
  64.     procedure btnClearDataClick(Sender: TObject);
  65.     procedure Button5Click(Sender: TObject);
  66.     procedure Button6Click(Sender: TObject);
  67.     procedure Button9Click(Sender: TObject);
  68.     procedure Button3Click(Sender: TObject);
  69.     procedure btnBackupUserClick(Sender: TObject);
  70.     procedure btnRestoreClick(Sender: TObject);
  71.     procedure vleDevInfoValidate(Sender: TObject; ACol, ARow: Integer;
  72.       const KeyName, KeyValue: String);
  73.     procedure btnSetNameClick(Sender: TObject);
  74.     procedure btnDeleteUserClick(Sender: TObject);
  75.     procedure btnAutoTestClick(Sender: TObject);
  76.     procedure sbtnRS232Click(Sender: TObject);
  77.     procedure sbtnTCPIPClick(Sender: TObject);
  78.     procedure btnACUnlockClick(Sender: TObject);
  79.     procedure chkEnabledClick(Sender: TObject);
  80.     procedure Button1Click(Sender: TObject);
  81.     procedure Button4Click(Sender: TObject);
  82.     procedure btnSMSClick(Sender: TObject);
  83.     procedure Button7Click(Sender: TObject);
  84.     procedure Button8Click(Sender: TObject);
  85.     procedure Button12Click(Sender: TObject);
  86.     procedure Button11Click(Sender: TObject);
  87.     procedure Button14Click(Sender: TObject);
  88.     procedure Button13Click(Sender: TObject);
  89.     procedure Button15Click(Sender: TObject);
  90.     procedure Button16Click(Sender: TObject);
  91.     procedure Button17Click(Sender: TObject);
  92.     procedure Button18Click(Sender: TObject);
  93.     procedure CZKEM1FingerFeature(ASender: TObject; Score: Integer);
  94.     procedure CZKEM1Verify(ASender: TObject; UserID: Integer);
  95.     procedure Button19Click(Sender: TObject);
  96.     procedure Button20Click(Sender: TObject);
  97.     procedure Button2Click(Sender: TObject);
  98.     //procedure GroupBox1Click(Sender: TObject);
  99.   private
  100.     { Private declarations }
  101.     DevID: integer;
  102.     Commport: integer;
  103.     Modified: string;
  104.     AppPath:string;
  105.     procedure AddInfo(const s: string);
  106.     procedure ReadDeviceStatus;
  107.     procedure BackupUser(const fn: string);
  108.     procedure RestoreUser(const fn: string);
  109.     function SaveGLogs(const fn: string): integer;
  110.     function BTimeEncode(MinuteSecond: integer): string;
  111.     function BTimeDecode(const TimeStr: string): integer;
  112.     function BNetSpeedEncode(speed: integer): string;
  113.     function BNetSpeedDecode(const speed: string): integer;
  114.   public
  115.     { Public declarations }
  116.   end;
  117. var
  118.   Form1: TForm1;
  119. function decodedata(const s: string): string;
  120. function encodedata(const BinData; size: integer): string;
  121. function LoadFile(const fn: string): string;
  122. procedure SaveFileData(const fn: string; const Data; size: integer);
  123. procedure SaveFile(const fn: string; Data: string);
  124. implementation
  125. uses inifiles, uUser;
  126. {$R *.dfm}
  127. const
  128.   HexOfNum: array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
  129.   StatusNames: array[1..12] of string=(
  130.     'Tatal administrator',
  131.     'Tatal users',
  132.     'Tatal FP',
  133.     'Tatal Password',
  134.     'Tatal manage record',
  135.     'Tatal In and out record',
  136.     'Nominal FP number',
  137.     'Nominal user number',
  138.     'Nominal In and out record number',
  139.     'Remain FP number',
  140.     'Remain user number',
  141.     'Remain In and out record number');
  142.   Languages: array[0..2] of string=(
  143.     'English',
  144.     'Simplified Chinese',
  145.     'Traditional Chinese');
  146.   BaudRates: array[0..6] of string=(
  147.     '1200 bps',
  148.     '2400 bps',
  149.     '4800 bps',
  150.     '9600 bps',
  151.     '19200 bps',
  152.     '38400 bps',
  153.     '115200 bps');
  154.   CRCs: array[0..2] of string=(
  155.     'Nothing',
  156.     'Even',
  157.     'Odd');
  158.   StopBits: array[0..1] of string=(
  159.     'One',
  160.     'Two');
  161.   DateSps: array[0..1] of string=(
  162.     '"/"',
  163.     '"-"');
  164.   MSpeeds: array[0..2] of string=(
  165.     'Low speed',
  166.     'High speed',
  167.     'Auto');
  168.   OnOffs: array[0..1] of string=(
  169.     'Off',
  170.     'On');
  171.   YesNos: array[0..1] of string=(
  172.     'No',
  173.     'Yes');
  174.   DateFormats: array[0..9] of string=(
  175.     'YY-MM-DD','YY/MM/DD','YY.MM.DD',
  176.     'MM-DD-YY','MM/DD/YY','MM.DD.YY',
  177.     'DD-MM-YY','DD/MM/YY','DD.MM.YY',
  178.     'YYYYMMDD');
  179.   NetSpeeds: array[0..4] of string=
  180.     ('10M_H','100M_H','10M_F','100M_F','AUTO');
  181.   NetSpeedValues: array[0..4] of integer=(0,1,4,5,8);
  182. procedure TForm1.FormCreate(Sender: TObject);
  183. var
  184.   s: widestring;
  185.   i,j: integer;
  186. begin
  187.   AppPath:= ExtractFilePath(application.exename);
  188.   CZKEM1.GetSDKVersion(s);
  189.   label1.Caption := s;
  190.   vleDevInfo.ItemProps[2].EditStyle := esPickList;
  191.   for i:=0 to length(Languages)-1 do
  192.     vleDevInfo.ItemProps[2].PickList.Add(Languages[i]);
  193.    vleDevInfo.ItemProps[8].EditStyle := esPickList;
  194.   for i:=0 to length(BaudRates)-1 do
  195.     vleDevInfo.ItemProps[8].PickList.Add(BaudRates[i]);
  196.   vleDevInfo.ItemProps[9].EditStyle := esPickList;
  197.   for i:=0 to length(CRCs)-1 do
  198.     vleDevInfo.ItemProps[9].PickList.Add(CRCs[i]);
  199.   vleDevInfo.ItemProps[10].EditStyle := esPickList;
  200.   for i:=0 to length(StopBits)-1 do
  201.     vleDevInfo.ItemProps[10].PickList.Add(StopBits[i]);
  202.   vleDevInfo.ItemProps[11].EditStyle := esPickList;
  203.   for i:=0 to length(DateSps)-1 do
  204.     vleDevInfo.ItemProps[11].PickList.Add(DateSps[i]);
  205.   for j := 12 to 15 do
  206.   begin
  207.     vleDevInfo.ItemProps[j].EditStyle := esPickList;
  208.     for i:=0 to length(OnOffs)-1 do
  209.       vleDevInfo.ItemProps[j].PickList.Add(OnOffs[i]);
  210.   end;
  211.   vleDevInfo.ItemProps[16].EditStyle := esPickList;
  212.   for i:=0 to length(MSpeeds)-1 do
  213.     vleDevInfo.ItemProps[16].PickList.Add(MSpeeds[i]);
  214. end;
  215. function LoadFile(const fn: string): string;
  216. var
  217.   f: tmemorystream;
  218. begin
  219.   result := '';
  220.   f := tmemorystream.Create;
  221.   try
  222.     f.LoadFromFile(fn);
  223.     f.Position := 0;
  224.     if f.Size>0 then
  225.     begin
  226.       setlength(result, f.size);
  227.       f.Read(result[1], length(result));
  228.     end;
  229.   finally
  230.     f.Free;
  231.   end;
  232. end;
  233. procedure SaveFile(const fn: string; Data: string);
  234. var
  235.   f: tmemorystream;
  236. begin
  237.   f := tmemorystream.Create;
  238.   try
  239.     if length(data)>0 then
  240.       f.Write(Data[1], length(data));
  241.     f.Position := 0;
  242.     f.SaveToFile(fn);
  243.   finally
  244.     f.Free;
  245.   end;
  246. end;
  247. procedure SaveFileData(const fn: string; const Data; size: integer);
  248. var
  249.   f: tmemorystream;
  250. begin
  251.   f := tmemorystream.Create;
  252.   try
  253.     if size>0 then
  254.       f.Write(Data, size);
  255.     f.Position := 0;
  256.     f.SaveToFile(fn);
  257.   finally
  258.     f.Free;
  259.   end;
  260. end;
  261. procedure TForm1.btnConnectClick(Sender: TObject);
  262. var
  263.   ErrorCode: integer;
  264.   c: boolean;
  265. begin
  266.   if btnConnect.Tag = 1 then
  267.   begin
  268.     CZKEM1.RefreshData(DevId);
  269.     CZKEM1.EnableDevice(DevId, TRUE);
  270.     CZKEM1.Disconnect;
  271.     btnConnect.Tag := 0;
  272.     btnConnect.Caption := 'Connect';
  273.   end
  274.   else
  275.   begin
  276.     devid:=strtoint(edtNetPort.Text);
  277.     if edtPassword.Text>'' then
  278.       CZKEM1.SetCommPassword(strtoint(edtPassword.Text));
  279.     if pos('COM', uppercase(edtNetAddress.text))=1 then
  280.     begin
  281.       commport:=ord(edtNetAddress.text[4])-ord('0');
  282.       CZKEM1.CommPort := commport;
  283.       c:=CZKEM1.Connect_Com( commport, DevID, strtoint(edtBaudRate.text));
  284.     end
  285.     else
  286.     begin
  287.       c:=CZKEM1.Connect_net(edtNetAddress.text, Devid);
  288.       Devid:=1;
  289.     end;                                                                    
  290.     if c then
  291.     begin
  292.       AddInfo('Device Connected.');
  293.       ReadDeviceStatus;
  294.       btnConnect.Tag := 1;
  295.       btnConnect.Caption := 'Disconnect';
  296.     end
  297.     else
  298.     begin
  299.       CZKEM1.GetLastError(ErrorCode);
  300.       AddInfo(format('! ConnectDevice ErrorNo.=%d',[ErrorCode]));
  301.     end;
  302.     AddInfo(' ');
  303.   end;
  304. end;
  305. procedure TForm1.AddInfo(const s: string);
  306. begin
  307.   memo1.Lines.Add(s);
  308.   memo1.Refresh;
  309. end;
  310. procedure TForm1.btnLoadDevInfoClick(Sender: TObject);
  311. var
  312.   ErrorCode, Value, i: integer;
  313. begin
  314.   for i:=1 to vleDevInfo.RowCount-1 do
  315.   if CZKEM1.GetDeviceInfo(devid, i, value) then
  316.   begin
  317.     if i=29 then
  318.     begin
  319.       vleDevInfo.Strings.ValueFromIndex[i-1]:=BNetSpeedEncode(Value);
  320.     end
  321.     else if vleDevInfo.ItemProps[i-1].HasPickList then
  322.     begin
  323.       if (value>=0) and (value<vleDevInfo.ItemProps[i-1].PickList.Count) then
  324.         vleDevInfo.Strings.ValueFromIndex[i-1]:=vleDevInfo.ItemProps[i-1].PickList[value]
  325.       else
  326.         vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
  327.     end
  328.     else if (i>=19) and (i<=22) then
  329.       vleDevInfo.Strings.ValueFromIndex[i-1]:=BTimeEncode(Value)
  330.     else
  331.       vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
  332.   end
  333.   else
  334.   begin
  335.     CZKEM1.GetLastError(ErrorCode);
  336.     AddInfo(format('! GetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
  337.   end;
  338.   Modified:=stringofchar(#0,100);
  339.   
  340. {
  341.   Modified:=stringofchar(#0,100);
  342.   for i:=1 to 17 do
  343.   if CZKEM1.GetDeviceInfo(devid, i, value) then
  344.   begin
  345.     if vleDevInfo.ItemProps[i-1].HasPickList then
  346.     begin
  347.       if (value>=0) and (value<vleDevInfo.ItemProps[i-1].PickList.Count) then
  348.         vleDevInfo.Strings.ValueFromIndex[i-1]:=vleDevInfo.ItemProps[i-1].PickList[value]
  349.       else
  350.         vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
  351.     end
  352.     else
  353.       vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
  354.   end
  355.   else
  356.   begin
  357.     CZKEM1.GetLastError(ErrorCode);
  358.     AddInfo(format('! GetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
  359.   end;
  360. }
  361. end;
  362. procedure TForm1.btnSaveDevInfoClick(Sender: TObject);
  363. var
  364.   ErrorCode, Value, i: integer;
  365. begin
  366.   for i:=1 to vleDevInfo.RowCount-1 do
  367.   if Modified[i]='1' then
  368.   begin
  369.     if i=29 then
  370.     begin
  371.       Value := BNetSpeedDecode(vleDevInfo.Strings.ValueFromIndex[i-1]);
  372.     end
  373.     else if vleDevInfo.ItemProps[i-1].HasPickList then
  374.     begin
  375.       for value:=0 to vleDevInfo.ItemProps[i-1].PickList.Count-1 do
  376.       if vleDevInfo.ItemProps[i-1].PickList[value]=vleDevInfo.Strings.ValueFromIndex[i-1] then
  377.         break;
  378.       if value>=vleDevInfo.ItemProps[i-1].PickList.Count then
  379.         value:=0;
  380.     end
  381.     else if (i>=19) and (i<=22) then
  382.       Value := BTimeDecode(vleDevInfo.Strings.ValueFromIndex[i-1])
  383.     else
  384.       value:=strtoint(vleDevInfo.Strings.ValueFromIndex[i-1]);
  385.     if not CZKEM1.SetDeviceInfo(devid, i, value) then
  386.     begin
  387.       CZKEM1.GetLastError(ErrorCode);
  388.       AddInfo(format('! SetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
  389.       exit;
  390.     end
  391.     else
  392.       Modified[i]:=#0;
  393.     if i=2 then
  394.     begin
  395.       edtNetAddress.Text := vleDevInfo.Strings.ValueFromIndex[i-1];
  396.       DevId:=value;
  397.     end;
  398.   end;
  399.   AddInfo('SetDeviceInfo OK');
  400. end;
  401. procedure TForm1.btnSetTimeClick(Sender: TObject);
  402. var
  403.   ErrorCode,
  404.   dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond: integer;
  405. begin
  406.   if CZKEM1.SetDeviceTime(devid) then
  407.   begin
  408.     AddInfo('SetDeviceTime OK.');
  409.     if CZKEM1.GetDeviceTime(devid, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond) then
  410.       AddInfo(Format('DeviceTime=%d-%d-%d %d:%d:%d',[dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond]))
  411.     else
  412.     begin
  413.       CZKEM1.GetLastError(ErrorCode);
  414.       AddInfo(format('! GetDeviceTime ErrorNo.=%d',[ErrorCode]));
  415.     end;
  416.   end
  417.   else
  418.   begin
  419.     CZKEM1.GetLastError(ErrorCode);
  420.     AddInfo(format('! SetDeviceTime ErrorNo.=%d',[ErrorCode]));
  421.   end;
  422. end;
  423. procedure TForm1.btnClearDataClick(Sender: TObject);
  424. begin
  425.   CZKEM1.ClearKeeperData(devid);
  426. end;
  427. procedure TForm1.Button5Click(Sender: TObject);
  428. begin
  429.   CZKEM1.ClearGLog(devid);
  430. end;
  431. procedure TForm1.Button6Click(Sender: TObject);
  432. begin
  433.   CZKEM1.ClearAdministrators(DevId);
  434. end;
  435. procedure TForm1.Button9Click(Sender: TObject);
  436. var
  437.   dwTMachine, dwEnrollNumber,dwEMachineNumber,dwVerifyMode: Integer;
  438.   dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute: Integer;
  439.   s: string;
  440.   f: tfilestream;
  441. begin
  442.   if SaveDialog1.Execute then
  443.   begin
  444.     f:=tfilestream.Create(SaveDialog1.FileName, fmOpenWrite or fmCreate);
  445.     try
  446.     if CZKEM1.ReadGeneralLogData(DevId) then
  447.     while CZKEM1.GetGeneralLogData(DevId,dwTMachine, dwEnrollNumber,dwEMachineNumber,dwVerifyMode,
  448.       dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute) do
  449.     begin
  450.       s:=format('%5d %d %d %4d-%2d-%2d %2d:%2d'#13#10, [dwEnrollNumber,dwVerifyMode,
  451.         dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute]);
  452.       f.Write(s[1],length(s));
  453.     end;
  454.     finally
  455.       f.Free;
  456.     end;
  457.   end;
  458. end;
  459. function NumOfHex(c: Char): integer;
  460. begin
  461.   result := 0;
  462.   if c>='a' then result := ord(c)-ord('a')+10
  463.   else if c>='A' then result := ord(c)-ord('A')+10
  464.   else if c>='0' then result := ord(c)-ord('0');
  465.   if result>16 then
  466.     raise exception.Create('Error of Integer: '+c);
  467. end;
  468. type
  469.   TByteArray=array[0..0] of byte;
  470.   PByteArray=^TByteArray;
  471. function encodedata(const BinData; size: integer): string;
  472. var
  473.   i: integer;
  474.   da: pbytearray;
  475. begin
  476.   setlength(result, size*2);
  477.   da:=@BinData;
  478.   for i:= 0 to size-1 do
  479.   begin
  480.     result[i*2+1]:=HexOfNum[da[i] div 16];
  481.     result[i*2+2]:=HexOfNum[da[i] mod 16];
  482.   end;
  483. end;
  484. function decodedata(const s: string): string;
  485. var
  486.   i: integer;
  487.   da: pbytearray;
  488. begin
  489.   setlength(result, length(s) div 2);
  490.   for i:= 1 to length(result) do
  491.   begin
  492.     result[i]:=char(NumOfHex(s[i*2-1])*16+NumOfHex(s[i*2]));
  493.   end;
  494. end;
  495. procedure TForm1.Button3Click(Sender: TObject);
  496. begin
  497.   CZKEM1.PowerOffDevice(DevID);
  498. end;
  499. procedure TForm1.BackupUser(const fn: string);
  500. var
  501.   f: tinifile;
  502.   dwEnrollNumber,dwBackupNumber,Password,
  503.   dwMachinePrivilege,i,c,Len: integer;
  504.   EnrollData: array[0..2047] of byte;
  505.   s: string;
  506.   Enable: WordBool;
  507.   UName, UPwd: widestring;
  508. begin
  509.   DeleteFile(fn);
  510.   f := tinifile.Create(fn);
  511.   try
  512.     if CZKEM1.ReadAllUserID(DevID) then
  513.     begin
  514.       c:=0;
  515.       while CZKEM1.GetAllUserInfo(DevID, dwEnrollNumber, UName, UPwd,
  516.         dwMachinePrivilege, Enable) do
  517.       begin
  518.         s:=format('Users_%d',[dwEnrollNumber]);
  519.         f.WriteInteger(s,'Privilege',dwMachinePrivilege);
  520.         f.WriteBool(s,'Enabled', Enable);
  521.         f.WriteString(s, 'Name', UName);
  522.         f.WriteString(s, 'Password', UPwd);
  523.         //Try get every fingerprint template
  524.         for i:=0 to 9 do
  525.         begin
  526.           zeromemory(@EnrollData[0], 2048);
  527.           Len:=2048;
  528.           if CZKEM1.GetUserTmp(DevId, dwEnrollNumber, i, EnrollData[0], Len) then
  529.             f.WriteString(s, 'FPT_'+inttostr(i), encodedata(EnrollData[0], Len));
  530.         end;
  531.         inc(c);
  532.       end;
  533.     end;
  534.   finally
  535.     f.Free;
  536.   end;
  537. end;
  538. procedure TForm1.ReadDeviceStatus;
  539. var
  540.   s: widestring;
  541.   ErrorCode, Value, i,
  542.   dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond: integer;
  543. begin
  544.   if CZKEM1.GetFirmwareVersion(devid, s) then
  545.     AddInfo('Firmware Version: '+s)
  546.   else
  547.   begin
  548.     CZKEM1.GetLastError(ErrorCode);
  549.     AddInfo(format('! GetFirmwareVersion ErrorNo.=%d',[ErrorCode]));
  550.   end;
  551.   if CZKEM1.GetSerialNumber(devid, s) then
  552.     AddInfo('Serial Number: '+s)
  553.   else
  554.   begin
  555.     CZKEM1.GetLastError(ErrorCode);
  556.     AddInfo(format('! GetSerialNumber ErrorNo.=%d',[ErrorCode]));
  557.   end;
  558.   if CZKEM1.GetProductCode(devid, s) then
  559.     AddInfo('ProductCode: '+s)
  560.   else
  561.   begin
  562.     CZKEM1.GetLastError(ErrorCode);
  563.     AddInfo(format('! GetProductCode ErrorNo.=%d',[ErrorCode]));
  564.   end;
  565.   if CZKEM1.GetDeviceTime(devid, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond) then
  566.     AddInfo(Format('DeviceTime=%d-%d-%d %d:%d:%d',[dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond]))
  567.   else
  568.   begin
  569.     CZKEM1.GetLastError(ErrorCode);
  570.     AddInfo(format('! GetDeviceTime ErrorNo.=%d',[ErrorCode]));
  571.   end;
  572.   for i:=1 to length(StatusNames) do
  573.   if CZKEM1.GetDeviceStatus(devid, i, value) then
  574.     AddInfo(format('%s: %d', [StatusNames[i],value]))
  575.   else
  576.   begin
  577.     CZKEM1.GetLastError(ErrorCode);
  578.     AddInfo(format('! GetDeviceStatus(%d) ErrorNo.=%d',[i, ErrorCode]));
  579.   end;
  580. end;
  581. procedure TForm1.RestoreUser(const fn: string);
  582. var
  583.   f: tinifile;
  584.   eno,i: integer;
  585.   dwEnrollNumber,dwBackupNumber,Password,
  586.   dwMachinePrivilege, dwEnable, c: integer;
  587.   fpt, s, UName, UPwd: string;
  588.   Sections: Tstrings;
  589. begin
  590.     f:=tinifile.Create(fn);
  591.     try
  592.     Sections := tstringlist.Create;
  593.       try
  594.         f.ReadSections(Sections);
  595.         for i:=1 to 65534 do
  596.         begin
  597.           s:=format('Users_%d',[i]);
  598.           if Sections.IndexOf(s)>=0 then
  599.           begin
  600.             Application.ProcessMessages;
  601.             dwMachinePrivilege := f.ReadInteger(s, 'Privilege', 0);
  602.             dwEnable := f.ReadInteger(s, 'Enabled', 1);
  603.             UPwd := f.ReadString(s, 'Password', '');
  604.             if UPwd='-1' then
  605.               UPwd:='';
  606.             UName := f.ReadString(s, 'Name','');
  607.             CZKEM1.SetUserInfo(DevId, i, UName, UPwd, dwMachinePrivilege, dwEnable<>0);
  608.             for dwBackupNumber:=0 to 9 do
  609.             begin
  610.               fpt:=f.ReadString(s, 'FPT_'+inttostr(dwBackupNumber), '');
  611.               if fpt>'' then
  612.               begin
  613.                 fpt:=decodedata(fpt);
  614.                 if CZKEM1.SetUserTmp(DevId, i, dwBackupNumber, pbyte(@fpt[1])^) then
  615.                   AddInfo(format('SetEnrollData OK: User=%d,FP=%d', [i,dwBackupNumber]))
  616.                 else
  617.                 begin
  618.                   CZKEM1.GetLastError(eno);
  619.                   AddInfo(format('SetEnrollData Fail: User=%d,FP=%d, Error=%d', [i,dwBackupNumber,eno]));
  620.                 end;
  621.               end;
  622.             end;
  623.           end;
  624.         end;
  625.       finally
  626.         sections.Free;
  627.       end;
  628.     finally
  629.       f.free;
  630.     end;
  631. end;
  632. procedure TForm1.vleDevInfoValidate(Sender: TObject; ACol, ARow: Integer;
  633.   const KeyName, KeyValue: String);
  634. begin
  635.   Modified[ARow] := '1';
  636. end;
  637. procedure TForm1.btnSetNameClick(Sender: TObject);
  638. begin
  639.   ShowUserForm(CZKEM1, DevID);
  640. end;
  641. procedure TForm1.btnDeleteUserClick(Sender: TObject);
  642. begin
  643.   CZKEM1.DeleteEnrollData(DevId, 69, DevId, 0);
  644.   CZKEM1.DeleteEnrollData(DevId, 69, DevId, 1);
  645. end;
  646. var
  647.   Testing: Boolean=false;
  648. procedure TForm1.btnAutoTestClick(Sender: TObject);
  649. var
  650.   i: integer;
  651. begin
  652.   Testing:=not Testing;
  653.   if Testing then
  654.     btnAutoTest.Caption := 'End Test'
  655.   else
  656.     btnAutoTest.Caption := 'Start Test';
  657.   i:=0;
  658.   while Testing do
  659.   begin
  660.     AddInfo(Format('-----------Testing %d--------',[i]));
  661.     inc(i);
  662.     btnConnect.Click;
  663.     if btnConnect.Tag=0 then
  664.     begin
  665.       Testing:=not Testing;
  666.       if Testing then
  667.         btnAutoTest.Caption := 'End Test'
  668.       else
  669.         btnAutoTest.Caption := 'Start Test';
  670.       break;
  671.     end;
  672. //    sleep(1000);
  673.     Addinfo('Clear Data...');
  674.     btnClearData.Click;
  675.     if FileExists(OpenDialog1.FileName) then
  676.       RestoreUser(OpenDialog1.FileName);
  677.     Application.ProcessMessages;
  678.     Addinfo('Delete User 69...');
  679.     btnDeleteUser.Click;
  680.     Sleep(2000);
  681.     ReadDeviceStatus;
  682.     Application.ProcessMessages;
  683.     if FileExists(OpenDialog1.FileName) then
  684.       RestoreUser(OpenDialog1.FileName);
  685.     ReadDeviceStatus;
  686.     Addinfo('Clear Data...');
  687.     btnClearData.Click;
  688.     Addinfo('Disconnect...');
  689.     btnConnect.Click;
  690.     Application.ProcessMessages;
  691.   end;
  692. end;
  693. procedure TForm1.btnBackupUserClick(Sender: TObject);
  694. begin
  695.   if savedialog1.Execute then
  696.     BackupUser(savedialog1.FileName);
  697. end;
  698. procedure TForm1.btnRestoreClick(Sender: TObject);
  699. begin
  700.   if OpenDialog1.Execute then
  701.     RestoreUser(OpenDialog1.FileName);
  702. end;
  703. procedure TForm1.sbtnRS232Click(Sender: TObject);
  704. begin
  705.   edtnetAddress.EditLabel.Caption := 'Com Port:';
  706.   edtNetPort.EditLabel.Caption := 'Device ID:';
  707.   edtnetAddress.Text := 'COM1';
  708.   edtNetPort.Text := '1';
  709. end;
  710. procedure TForm1.sbtnTCPIPClick(Sender: TObject);
  711. begin
  712.   edtnetAddress.EditLabel.Caption := 'IP Address:';
  713.   edtNetPort.EditLabel.Caption := 'Port Number:';
  714.   edtnetAddress.Text := '192.168.1.201';
  715.   edtNetPort.Text := '$1112';
  716. end;
  717. procedure TForm1.btnACUnlockClick(Sender: TObject);
  718. begin
  719.   CZKem1.ACUnlock(DevId,200)
  720. end;
  721. procedure TForm1.chkEnabledClick(Sender: TObject);
  722. begin
  723.   CZKEM1.EnableDevice(DevID, chkEnabled.Checked);
  724. end;
  725. const
  726.  TEMP1='A1CA268296295AA10B50AA604009469950016A41194E3C514A3754D318D6B94D4019DDBE7A' +
  727.        '0312DCC078000EE52277F10735AF7A780D44A24FA30B4FB92BB80A819468610C221250401A' +
  728.        '071C7A93092B8A6C400E18147DF109249C53B81740A747F30CC8945FBC12258D42540FDFA4' +
  729.        '39FC10B9867CD20714993DB409C71C26330B453341BC10778873F40788B461B410C6BF4FA3' +
  730.        '09E9B418382C9B266B930740BD5D78136AA73F323DC1283D405FB52D12220739A587380A31' +
  731.        'AB2ED116263F293C0B7A46140614C334EA0F10117E4C56A5A8BACEFFFBEC12C0434C55A299' +
  732.        'AACE6E76A2FCECA846A2FF99995D656F7707A1DFC9184BA2AE799958616D010A12A1EA994B' +
  733.        'A19E6881545C6C0313A1FBA81F48A3BB7688BF5D1521248343A3CC8667AC49392FA1776728' +
  734.        '42A7BC8467BB5215656742A79C6558CC7535556641A28A5646404BA3842663663FA2796521' +
  735.        '3A51A3734545363DA16A312418086E57A2433343383E3A38231A120C026F5CA23454413D39' +
  736.        '3314A227543061A244655246382104A2BA652164A2586454517E2A05A498656448A2615F57' +
  737.        '54C207A4565A978AA2704B43C476A29AA8BD0FE0317773';
  738.   TEMP2='ocoqgo5BMsMGAcUxvArqwlMxCOlEWfwM6qEuYQs4OTSAEHuUQ4EZOKhGQAyTETuTDUYqLABqNQM9wxNhDxUABMcRS/FQJChldAyKtSsjEQIjQ/gOnyYoIRhOKj7AEpQRSJNlMokb'+
  739.         'AAVSrlTxDYAfNwAJLxErMwxKmQ88BcUbINQLSZMVfAZPk1zSBZoiafQMmK9tMwV+C2l8BJmEUzQOhjdctAl4sRdjC9I7SzgIdQt0swomn3Z4B5undLIQijUaQA/gFH9iA521brgI'+
  740.         'dwhXkROGwmF8Cu4pVEQSX4BKCxARfk5Woau7aXQHFKH8qSPAR6L+qrpkcQYWof2agUeiz6mJXGkFGCGhuZgmR6LOiIdUXQscofyYgUqjq4ZmkiWiTKl5KEqjuWRWUS2hKZiCSqap'+
  741.         'YkYyE3h5gUmnqlMzMiRniXhLoZpSPjWkAVVXiHdNoapjPi0hozd1d3YRTqG8eEkapEaGVnh4S6Hvnm4HpOeGZniJRU5cYGdzA6PIhneHgT9LYmhudqLahmWCd3d+Q2qmzMyXV2eY'+
  742.         'lMJzpaqmh3d6hl/DA6Rmd4iXmGPAxAWiVIiageD/';
  743. procedure TForm1.Button1Click(Sender: TObject);
  744. var
  745.   i: integer;
  746. begin
  747.   i:= CZKEM1.GetFPTempLengthStr(TEMP2);
  748.   Memo1.lines.add(format('FPTempLength=%d',[i]));
  749.   if CZKEM1.SetEnrollDataStr(devid, 1, devid, 0, 1, TEMP2, 0) then
  750.     Memo1.lines.add('SetEnrollDataStr OK')
  751.   else
  752.     Memo1.lines.add('SetEnrollDataStr Fail.');
  753. end;
  754. function TForm1.BTimeDecode(const TimeStr: string): integer;
  755. var
  756.   p,m,s: integer;
  757. begin
  758.   p := pos(':', TimeStr);
  759.   m:=strtointdef(copy(TimeStr,1,p-1),-1);
  760.   s:=strtointdef(copy(TimeStr,p+1,100),-1);
  761.   if (m<0) or (s<0) or (m>255) or (s>255) then result := 255;
  762.   result := m *256+s;
  763. end;
  764. function TForm1.BTimeEncode(MinuteSecond: integer): string;
  765. var
  766.   m,s: integer;
  767. begin
  768.   m:=MinuteSecond div 256;
  769.   s:=MinuteSecond mod 256;
  770.   if (MinuteSecond<0) or (m>59) or (s>59) then
  771.     result := 'No'
  772.   else
  773.     result := format('%d:%d', [m,s]);
  774. end;
  775. function TForm1.BNetSpeedDecode(const speed: string): integer;
  776. var
  777.   i: integer;
  778. begin
  779.   result := NetSpeedValues[0];
  780.   for i := 0 to length(NetSpeeds)-1 do
  781.   if speed=NetSpeeds[i] then
  782.   begin
  783.     result := NetSpeedValues[i];
  784.     exit;
  785.   end;
  786. end;
  787. function TForm1.BNetSpeedEncode(speed: integer): string;
  788. var
  789.   i: integer;
  790. begin
  791.   result := NetSpeeds[0];
  792.   for i := 0 to length(NetSpeeds)-1 do
  793.   if speed=NetSpeedValues[i] then
  794.   begin
  795.     result := NetSpeeds[i];
  796.     exit;
  797.   end;
  798. end;
  799. procedure TForm1.Button4Click(Sender: TObject);
  800. begin
  801.   if SaveDialog1.Execute then
  802.     SaveGLogs(SaveDialog1.filename);
  803. end;
  804. function TForm1.SaveGLogs(const fn: string): integer;
  805. var
  806.   dwEnrollNumber, dwSEnrollNumber, Params3,
  807.     Params0, Params1, dwManipulation, Params2, dwYear,
  808.     dwMonth, dwDay, dwHour, dwMinute: Integer;
  809.   s: string;
  810.   f: tfilestream;
  811. begin
  812.   result := 0;
  813.   f:=tfilestream.Create(fn, fmOpenWrite or fmCreate);
  814.   try
  815.   if CZKEM1.ReadSuperLogData(DevId) then
  816.   while CZKEM1.GetSuperLogData(DevId, dwEnrollNumber, dwSEnrollNumber, Params3,
  817.     Params0, Params1, dwManipulation, Params2, dwYear,
  818.     dwMonth, dwDay, dwHour, dwMinute) do
  819.   begin
  820.     s:=format('%5d %5d %5d %5d %5d %5d %d-%d-%d %d:%d'#13#10,[dwSEnrollNumber, dwManipulation,
  821.       Params0, Params1, Params2, Params3,
  822.       dwYear, dwMonth, dwDay, dwHour, dwMinute]);
  823.     f.Write(s[1],length(s));
  824.     inc(result);
  825.   end;
  826.   finally
  827.     f.Free;
  828.   end;
  829. end;
  830. procedure TForm1.btnSMSClick(Sender: TObject);
  831. begin
  832.   if btnSMS.Tag=0 then
  833.   begin
  834.     //CZKEM1.SetSMS(0, 4, 'Welcome to ZK');
  835.    // CZKEM1.SetSMS(1, 2, 'Meet at 10:00');
  836.    // CZKEM1.SetSMS(2, 3, 'Write a report for C12 item');
  837.     //btnSMS.Caption := 'Clear SMS';
  838.     //btnSMS.Tag:=1;
  839.   end
  840.   else
  841.   begin
  842.    // CZKEM1.SetSMS(0, 0, '');
  843.     //CZKEM1.SetSMS(1, 0, '');
  844.    // CZKEM1.SetSMS(2, 0, '');
  845.    // btnSMS.Caption := 'Set SMS';
  846.    // btnSMS.Tag:=0;
  847.   end;
  848. end;
  849. procedure TForm1.Button7Click(Sender: TObject);
  850. var
  851.   w,h: integer;
  852.   image: array of byte;
  853. begin
  854.   setlength(image, 1024*512);
  855.   w := 80;
  856.   if CZKEM1.CaptureImage(TRUE, w, h, Image[0], 'fp.bmp') then
  857.   begin
  858.     addinfo('Captured an image.');
  859.   end
  860.   else
  861.     addinfo('Capture image fail.');
  862. end;
  863. procedure TForm1.Button8Click(Sender: TObject);
  864. begin
  865.   if CZKEM1.UpdateFirmware('emfw.cfg') then
  866.   begin
  867.     addinfo('UpdateFirmware success.pls restart the devie.');
  868.   end
  869.   else
  870.     addinfo('UpdateFirmware fail.');
  871. end;
  872. procedure TForm1.Button12Click(Sender: TObject);
  873. begin
  874.   CZKEM1.clearLCd;
  875. end;
  876. procedure TForm1.Button11Click(Sender: TObject);
  877. begin
  878.   czkem1.EnableClock(0);
  879.   czkem1.WriteLCD(0,0,'        ***          ');
  880.   czkem1.WriteLCD(1,0,'Welcome to ZK');
  881.   czkem1.WriteLCD(2,0,'        ***          ');
  882.   czkem1.WriteLCD(3,0,'        ');
  883.   MessageDlg('Close this window to restore lcd display', mtInformation, [mbOK], 0);
  884.   czkem1.EnableClock(1);
  885. end;
  886. procedure TForm1.Button14Click(Sender: TObject);
  887. begin
  888.   czkem1.Beep(1000);
  889. end;
  890. procedure TForm1.Button13Click(Sender: TObject);
  891. var
  892.   i: integer;
  893. begin
  894.   for i:=0 to 9 do
  895.   begin
  896.     czkem1.PlayVoiceByIndex(i);
  897.     if MessageDlg('Continue next voice?', mtConfirmation, [mbYes,mbNo], 0) <> mrYes then
  898.       exit;
  899.   end;
  900.   czkem1.PlayVoice(30,29);
  901. end;
  902. procedure TForm1.Button15Click(Sender: TObject);
  903. var
  904.   ErrorCode: integer;
  905. begin
  906.   CZkEM1.CancelOperation;
  907.   CZkEM1.DelUserTmp(1, 65530, 0);
  908.   if CZkEM1.StartEnroll(65530, 0) then
  909.     AddInfo('Start Enroll a user, UserID=65530, FingerID=0')
  910.   else
  911.   begin
  912.     CZkEM1.GetLastError(ErrorCode);
  913.     AddInfo('StartEnroll Error, Code='+inttostr(ErrorCode));
  914.   end;
  915. end;
  916. procedure TForm1.Button16Click(Sender: TObject);
  917. var
  918.   ErrorCode: integer;
  919. begin
  920.   CZkEM1.CancelOperation;
  921.   if CZkEM1.StartVerify(65530, 0) then
  922.     AddInfo('Start Verify a user, UserID=65530, FingerID=0')
  923.   else
  924.   begin
  925.     CZkEM1.GetLastError(ErrorCode);
  926.     AddInfo('StartVerify Error, Code='+inttostr(ErrorCode));
  927.   end;
  928. end;
  929. procedure TForm1.Button17Click(Sender: TObject);
  930. var
  931.   ErrorCode: integer;
  932. begin
  933.   CZkEM1.CancelOperation;
  934.   if CZkEM1.StartIdentify then
  935.     AddInfo('StartIdentify user.')
  936.   else
  937.   begin
  938.     CZkEM1.GetLastError(ErrorCode);
  939.     AddInfo('StartIdentify Error, Code='+inttostr(ErrorCode));
  940.   end;
  941. end;
  942. procedure TForm1.Button18Click(Sender: TObject);
  943. var
  944.   ErrorCode: integer;
  945. begin
  946.   if CZkEM1.CancelOperation then
  947.     AddInfo('CancelOperation OK.')
  948.   else
  949.   begin
  950.     CZkEM1.GetLastError(ErrorCode);
  951.     AddInfo('CancelOperation Error, Code='+inttostr(ErrorCode));
  952.   end;
  953. end;
  954. procedure TForm1.CZKEM1FingerFeature(ASender: TObject; Score: Integer);
  955. begin
  956.   AddInfo(format('Finger Feature: %d',[Score]));
  957. end;
  958. procedure TForm1.CZKEM1Verify(ASender: TObject; UserID: Integer);
  959. begin
  960.   AddInfo(format('User Verified: %d',[UserID]));
  961. end;
  962. procedure TForm1.Button19Click(Sender: TObject);
  963. var
  964.   ErrorCode: integer;
  965. begin
  966.   if SaveDialog2.Execute then
  967.   begin
  968.     if CZKEM1.BackupData(SaveDialog2.FileName) then
  969.     begin
  970.       AddInfo('Backup Data to File: "'+SaveDialog2.FileName+'" OK.');
  971.       if OpenDialog2.FileName='' then
  972.         OpenDialog2.FileName := SaveDialog2.FileName;
  973.     end
  974.     else
  975.     begin
  976.       CZkEM1.GetLastError(ErrorCode);
  977.       AddInfo('CancelOperation Error, Code='+inttostr(ErrorCode));
  978.     end;
  979.   end;
  980. end;
  981. procedure TForm1.Button20Click(Sender: TObject);
  982. var
  983.   ErrorCode: integer;
  984. begin
  985.   if OpenDialog2.Execute then
  986.   begin
  987.     if CZKEM1.RestoreData(OpenDialog2.FileName) then
  988.       AddInfo('Restore Data from File: "'+OpenDialog2.FileName+'" OK.')
  989.     else
  990.     begin
  991.       CZkEM1.GetLastError(ErrorCode);
  992.       AddInfo('RestoreData Error, Code='+inttostr(ErrorCode));
  993.     end;
  994.   end;
  995. end;
  996. procedure TForm1.Button2Click(Sender: TObject);
  997. var
  998.   name : string;
  999.   template: widestring;
  1000.   pass : string;
  1001.   machinenum,EnrollNum,pri1,fingerIndex: integer;
  1002.   fL: integer;
  1003.   pri,xx : boolean;
  1004.   cc : integer;
  1005. begin
  1006.     name :='aaa';
  1007.     pass := '';
  1008.     machinenum := 1;
  1009.     EnrollNum := 1;
  1010.     pri := true;
  1011.     pri1 := 0;
  1012.     fingerIndex:=0;
  1013.     fL :=2048;
  1014.  {   template := 'A1CA1C83A04029823D23442FC3177E292C422156AE22421242B554020F3D4' +
  1015.                  'B4F8204DDB62AC21031B41E020B43B135C21326964CC207169F5D83061E9F3A'+
  1016.                  'C20B153364820A2BCA684206CF2228C21465231BC30E5BB75AC20C38C724421C'+
  1017.                  'E04038421190353F820E9CAA18C20B4D273CC21585BC22021441334583139F1B4902068B'+
  1018.                  '13194208718A2CC3087CBB4482538A26646B0C9D840E12ADB8700A1115C304A2ACB98A12C0C2'+
  1019.                  '00A3BBCAA99B15C0C175A4ABBCBA9BAB18C0C176A49ABCCABBAA19C07E72A59ABBCDBBBAAAC0'+
  1020.                  '7E6EA5ABCCCDCCAAAA1BC07E69A5ADDDDDDDAA991CC07E64A5CCEEFFECB9991EC07E6062666C75'+
  1021.                  '060F17A1CBA881C07E5A5B5E646F05121BA2CAA877C07E525254596607171FA2CB887724C07E4D81'+
  1022.                  '4C4725A33CCB777625C07E4B4A4843382BA32CDC646627C07E4948453D332A242935A2C43466C07E'+
  1023.                  '4948443B2F251E2342A2901466C07E4A49463E2E1F1506574B413B3735C0C14B4A462A120B736155'+
  1024.                  '4B443E3CC0C14F50556D07047065A1112248C0C2575E6B00016FA1134459C0C76BA156555DC0C96A6'+
  1025.                  '967E00000';  }
  1026.                  template := 'A1CA20839C26602F0C3CA9652F083ABF462E0978C349ED0C7420396B3A43B8282C11D3C2'+
  1027.                  '552C0569AD2B6C1142BF212A11DB4034EA0A01A7316C0C352340AC172A1148ED12162570ED0A2D3C722E0AD1'+
  1028.                  'C33A2E0872373FAB0C80A7516A18A32E4FA84989A849E8119F25296809449F2DA811459C24E80E501523E70E5B1'+
  1029.                  '949A215870B5255188A9435C210681A393A1F5A387E7B1FC2B240FB0F942F803C1334A03EC0552426E4470FA00'+
  1030.                  '46B14AE108D0C1011C503060709C0C477A2CBBADDC0C373A3ADDBCFD91CC0C36FA4CFDCFFCA9AC0C265686E750'+
  1031.                  '50B14A2EBCA89C0C25F5F6470020C18A2FAAA99C0C15657575B64750F1CA1F9AA82C150A1979B6D1CA3EDAA877'+
  1032.                  '8C14CA187443628A37EA976587E4B8147423A31292931A2D844477E4B81463F352D252739A2F34335C14B4B473F'+
  1033.                  '33261D194BA2511435C14D4D4B442F1B1305615248A11546C14F505254760E09776A5C53A10357C1535559617104'+
  1034.                  '04746BA2032589C1575B606972A4F812355799C260A5DEEB7446757865C369A4CCA764676766E0FFFFFF';
  1035. //    xx := czkem1.GetUserTmpStr(machinenum,EnrollNum,fingerIndex,template,fingerLen);
  1036.        // czkem1.GetUserTmpStr(machinenum,EnrollNum,fingerIndex,template,fL);
  1037.     xx := czkem1.setUserInfo(machinenum,EnrollNum,name,pass,pri1,pri);
  1038.     xx := czkem1.SetUserTmpStr(machinenum,EnrollNum,fingerIndex,template);
  1039. end;
  1040. end.