245 lines
6.7 KiB
ObjectPascal
245 lines
6.7 KiB
ObjectPascal
|
|
{******************************************************************
|
||
|
|
|
||
|
|
JEDI-VCL Demo
|
||
|
|
|
||
|
|
Copyright (C) 2002 Project JEDI
|
||
|
|
|
||
|
|
Original author:
|
||
|
|
|
||
|
|
Contributor(s):
|
||
|
|
|
||
|
|
You may retrieve the latest version of this file at the JEDI-JVCL
|
||
|
|
home page, located at http://jvcl.sourceforge.net
|
||
|
|
|
||
|
|
The contents of this file are used with permission, subject to
|
||
|
|
the Mozilla Public License Version 1.1 (the "License"); you may
|
||
|
|
not use this file except in compliance with the License. You may
|
||
|
|
obtain a copy of the License at
|
||
|
|
http://www.mozilla.org/MPL/MPL-1_1Final.html
|
||
|
|
|
||
|
|
Software distributed under the License is distributed on an
|
||
|
|
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||
|
|
implied. See the License for the specific language governing
|
||
|
|
rights and limitations under the License.
|
||
|
|
|
||
|
|
******************************************************************}
|
||
|
|
|
||
|
|
unit DevReader;
|
||
|
|
|
||
|
|
interface
|
||
|
|
|
||
|
|
uses
|
||
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||
|
|
StdCtrls, Buttons, JvHidControllerClass;
|
||
|
|
|
||
|
|
type
|
||
|
|
TReport = packed record
|
||
|
|
ReportID: Byte;
|
||
|
|
Bytes: array [0..63] of Byte;
|
||
|
|
end;
|
||
|
|
|
||
|
|
TMainForm = class(TForm)
|
||
|
|
DevListBox: TListBox;
|
||
|
|
HistoryListBox: TListBox;
|
||
|
|
ReadBtn: TSpeedButton;
|
||
|
|
WriteBtn: TSpeedButton;
|
||
|
|
SaveBtn: TSpeedButton;
|
||
|
|
SaveDialog: TSaveDialog;
|
||
|
|
ReportID: TEdit;
|
||
|
|
Edit1: TEdit;
|
||
|
|
Label1: TLabel;
|
||
|
|
HidCtl: TJvHidDeviceController;
|
||
|
|
InfoBtn: TSpeedButton;
|
||
|
|
procedure HidCtlDeviceChange(Sender: TObject);
|
||
|
|
function HidCtlEnumerate(HidDev: TJvHidDevice;
|
||
|
|
const Idx: Integer): Boolean;
|
||
|
|
procedure ReadBtnClick(Sender: TObject);
|
||
|
|
procedure DevListBoxClick(Sender: TObject);
|
||
|
|
procedure SaveBtnClick(Sender: TObject);
|
||
|
|
procedure FormActivate(Sender: TObject);
|
||
|
|
procedure WriteBtnClick(Sender: TObject);
|
||
|
|
procedure InfoBtnClick(Sender: TObject);
|
||
|
|
procedure HidCtlDeviceDataError(HidDev: TJvHidDevice;
|
||
|
|
Error: Cardinal);
|
||
|
|
public
|
||
|
|
Edits: array [0..63] of TEdit;
|
||
|
|
CurrentDevice: TJvHidDevice;
|
||
|
|
published
|
||
|
|
procedure ShowRead(HidDev: TJvHidDevice; ReportID: Byte;
|
||
|
|
const Data: Pointer; Size: Word);
|
||
|
|
end;
|
||
|
|
|
||
|
|
var
|
||
|
|
MainForm: TMainForm;
|
||
|
|
|
||
|
|
implementation
|
||
|
|
|
||
|
|
uses
|
||
|
|
Info;
|
||
|
|
|
||
|
|
{$R *.DFM}
|
||
|
|
|
||
|
|
procedure TMainForm.HidCtlDeviceChange(Sender: TObject);
|
||
|
|
var
|
||
|
|
Dev: TJvHidDevice;
|
||
|
|
I: Integer;
|
||
|
|
begin
|
||
|
|
ReadBtn.Down := False;
|
||
|
|
ReadBtnClick(Self);
|
||
|
|
if Assigned(DevListBox) then
|
||
|
|
begin
|
||
|
|
for I := 0 to DevListBox.Items.Count - 1 do
|
||
|
|
begin
|
||
|
|
Dev := TJvHidDevice(DevListBox.Items.Objects[I]);
|
||
|
|
Dev.Free;
|
||
|
|
end;
|
||
|
|
DevListBox.Clear;
|
||
|
|
HistoryListBox.Clear;
|
||
|
|
HidCtl.Enumerate;
|
||
|
|
if DevListBox.Items.Count > 0 then
|
||
|
|
begin
|
||
|
|
DevListBox.ItemIndex := 0;
|
||
|
|
DevListBoxClick(Self);
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
function TMainForm.HidCtlEnumerate(HidDev: TJvHidDevice;
|
||
|
|
const Idx: Integer): Boolean;
|
||
|
|
var
|
||
|
|
N: Integer;
|
||
|
|
Dev: TJvHidDevice;
|
||
|
|
begin
|
||
|
|
if Assigned(DevListBox) then
|
||
|
|
begin
|
||
|
|
if HidDev.ProductName <> '' then
|
||
|
|
N := DevListBox.Items.Add(HidDev.ProductName)
|
||
|
|
else
|
||
|
|
N := DevListBox.Items.Add(Format('Device VID=%.4x PID=%.4x',
|
||
|
|
[HidDev.Attributes.VendorID, HidDev.Attributes.ProductID]));
|
||
|
|
HidCtl.CheckOutByIndex(Dev, Idx);
|
||
|
|
DevListBox.Items.Objects[N] := Dev;
|
||
|
|
end;
|
||
|
|
Result := True;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.DevListBoxClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
I: Integer;
|
||
|
|
Dev: TJvHidDevice;
|
||
|
|
begin
|
||
|
|
ReadBtn.Down := False;
|
||
|
|
ReadBtnClick(Self);
|
||
|
|
HistoryListBox.Clear;
|
||
|
|
if Assigned(Edits[0]) and
|
||
|
|
(DevListBox.Items.Count > 0) and (DevListBox.ItemIndex >= 0) then
|
||
|
|
begin
|
||
|
|
Dev := TJvHidDevice(DevListBox.Items.Objects[DevListBox.ItemIndex]);
|
||
|
|
for I := Low(Edits) to High(Edits) do
|
||
|
|
Edits[I].Visible := False;
|
||
|
|
for I := 0 to Dev.Caps.OutputReportByteLength - 2 do
|
||
|
|
Edits[I].Visible := True;
|
||
|
|
WriteBtn.Enabled := Dev.Caps.OutputReportByteLength <> 0;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.ShowRead(HidDev: TJvHidDevice; ReportID: Byte;
|
||
|
|
const Data: Pointer; Size: Word);
|
||
|
|
var
|
||
|
|
I: Integer;
|
||
|
|
Str: string;
|
||
|
|
begin
|
||
|
|
Str := Format('R %.2x ', [ReportID]);
|
||
|
|
for I := 0 to Size - 1 do
|
||
|
|
Str := Str + Format('%.2x ', [Cardinal(PChar(Data)[I])]);
|
||
|
|
HistoryListBox.ItemIndex := HistoryListBox.Items.Add(Str);
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.HidCtlDeviceDataError(HidDev: TJvHidDevice;
|
||
|
|
Error: Cardinal);
|
||
|
|
begin
|
||
|
|
HistoryListBox.ItemIndex := HistoryListBox.Items.Add('READ ERROR: ' + SysErrorMessage(Error));
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.InfoBtnClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if (DevListBox.Items.Count > 0) and (DevListBox.ItemIndex >= 0) then
|
||
|
|
with TInfoForm.Create(Self) do
|
||
|
|
begin
|
||
|
|
Dev := TJvHidDevice(DevListBox.Items.Objects[DevListBox.ItemIndex]);
|
||
|
|
ShowModal;
|
||
|
|
Free;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.ReadBtnClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
CurrentDevice := nil;
|
||
|
|
if (DevListBox.Items.Count > 0) and (DevListBox.ItemIndex >= 0) then
|
||
|
|
begin
|
||
|
|
CurrentDevice := TJvHidDevice(DevListBox.Items.Objects[DevListBox.ItemIndex]);
|
||
|
|
if not CurrentDevice.HasReadWriteAccess then
|
||
|
|
ReadBtn.Down := False;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.WriteBtnClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
I: Integer;
|
||
|
|
Buf: array [0..64] of Byte;
|
||
|
|
Written: Cardinal;
|
||
|
|
ToWrite: Cardinal;
|
||
|
|
Str: string;
|
||
|
|
begin
|
||
|
|
if Assigned(CurrentDevice) then
|
||
|
|
begin
|
||
|
|
Buf[0] := StrToIntDef('$' + ReportID.Text, 0);
|
||
|
|
ReportID.Text := Format('%.2x', [Buf[0]]);
|
||
|
|
ToWrite := CurrentDevice.Caps.OutputReportByteLength;
|
||
|
|
for I := 1 to ToWrite-1 do
|
||
|
|
begin
|
||
|
|
Buf[I] := StrToIntDef('$' + Edits[I-1].Text, 0);
|
||
|
|
Edits[I-1].Text := Format('%.2x', [Buf[I]]);
|
||
|
|
end;
|
||
|
|
CurrentDevice.WriteFile(Buf, ToWrite, Written);
|
||
|
|
Str := Format('W %.2x ', [Buf[0]]);
|
||
|
|
for I := 1 to Written-1 do
|
||
|
|
Str := Str + Format('%.2x ', [Buf[I]]);
|
||
|
|
HistoryListBox.ItemIndex := HistoryListBox.Items.Add(Str);
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.SaveBtnClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
ForceCurrentDirectory := True;
|
||
|
|
if SaveDialog.Execute then
|
||
|
|
HistoryListBox.Items.SaveToFile(SaveDialog.FileName);
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.FormActivate(Sender: TObject);
|
||
|
|
var
|
||
|
|
I, J: Integer;
|
||
|
|
begin
|
||
|
|
if Assigned(Edits[0]) then
|
||
|
|
Exit;
|
||
|
|
Edits[0] := Edit1;
|
||
|
|
for I := 1 to High(Edits) do
|
||
|
|
Edits[I] := TEdit.Create(Self);
|
||
|
|
for J := 0 to 3 do
|
||
|
|
for I := 0 to 15 do
|
||
|
|
with Edits[J*16 + I] do
|
||
|
|
begin
|
||
|
|
Visible := False;
|
||
|
|
Left := Edit1.Left + I*(Edit1.Width+2);
|
||
|
|
Top := Edit1.Top + J*(Edit1.Height+2);
|
||
|
|
Width := Edit1.Width;
|
||
|
|
Anchors := Edit1.Anchors;
|
||
|
|
if not Assigned(Parent) then
|
||
|
|
Parent := Edit1.Parent;
|
||
|
|
TabOrder := Edit1.TabOrder + J*16 + I;
|
||
|
|
end;
|
||
|
|
DevListBoxClick(Self);
|
||
|
|
end;
|
||
|
|
|
||
|
|
end.
|