📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,libusb, Spin, ComCtrls, Gauges;
type
TForm1 = class(TForm)
Button3: TButton;
GroupBox1: TGroupBox;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
SpinEdit4: TSpinEdit;
Button8: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;
CheckBox8: TCheckBox;
Label5: TLabel;
StatusBar1: TStatusBar;
Label6: TLabel;
Gauge1: TGauge;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure SpinEdit4Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure setreset(cmd,duration,port:integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
udev: pusb_dev_handle;
S: array [0..255] of char;
buffer:array[0..2] of byte;
numbites:integer;
cb:array[0..7] of Tcheckbox;
const PSCMD_ECHO= 0;
PSCMD_GET= 1;
PSCMD_ON= 2;
PSCMD_OFF= 3;
implementation
{$R *.DFM}
function btbool(data:word;bit:word):boolean;
begin
asm pusha
mov ax,&data
mov bx,&bit
bt ax,bx
jnc @zero
mov &result,1
jmp @out
@zero: mov &result,0
@out: popa
end;
end;
function echo(inputdata:integer):boolean;
var r:integer;
begin
result:=true;
numbites:= usb_control_msg(udev, USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN, PSCMD_ECHO, inputdata, 0, buffer, sizeof(buffer), 5000);
r:= (buffer[0] or (buffer[1] shl 8 ));
if r<>inputdata then result:=false;
if (numbites <>2) then result:=false;
end;
function getstatus():integer;
begin
numbites:= usb_control_msg(udev, (USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN), PSCMD_GET, 0, 0, buffer, sizeof(buffer), 5000);
if (numbites<2) then showmessage(usb_strerror);
result:=(buffer[1] shl 8)+buffer[0];
end;
procedure TForm1.Button3Click(Sender: TObject);
var foundvendor,foundprodukt:boolean;
bus: pusb_bus;
dev: pusb_device;
begin
foundvendor:=false;
foundprodukt:=false;
usb_init; // Initialize libusb
form1.Caption:=usb_strerror;
if(usb_find_busses<1) then showmessage(usb_strerror);
if (usb_find_devices<1) then showmessage(usb_strerror); // Find all devices on all USB devices
bus := usb_get_busses; // Return the list of USB busses found
if bus=nil then showmessage(usb_strerror);
while Assigned(bus) do
begin
dev := bus^.devices;
while Assigned(dev) do
begin
if dev^.descriptor.idVendor=5824 then foundvendor:=true;
if dev^.descriptor.idProduct=1500 then foundprodukt:=true;
if (foundvendor and foundprodukt) then begin
udev:= usb_open(dev);
Button4.Click;
GroupBox1.Visible:=true;
SpinEdit4.OnChange(self);
break;
end else begin foundvendor:=false; foundprodukt:=false; end;
dev := dev^.next;
end;
if (foundvendor and foundprodukt) then break;
bus := bus^.next;
end;
statusbar1.Panels[0].Text:=usb_strerror;
if not (foundvendor and foundprodukt) then showmessage('Powerswitch (VID=0x16C0 PID=0x05DC)'+chr(10)+chr(13)+'Not Found');
end;
procedure TForm1.Button4Click(Sender: TObject);
var i,status:integer;
begin
if Assigned(udev) then
begin
status:=getstatus;
label5.Caption:=inttostr(status);
label5.Visible:=true;
for i:=low(cb) to high(cb) do cb[i].Checked:=btbool(status,i);
end;
statusbar1.Panels[0].Text:=usb_strerror;
end;
procedure TForm1.Button5Click(Sender: TObject);
var i,v,j:integer;
sukkes:boolean;
t:dword;
begin
j:=1000;
label6.Caption:='In Progress';
label6.Visible:=true;
application.ProcessMessages;
sukkes:=true;
t:=0;
Button5.Enabled:=false;
if Assigned(udev) then
begin
randomize;
Gauge1.MaxValue:=j;
t:=gettickcount;
for i:=1 to j do begin
Gauge1.Progress:=i;
v:=random(255);
if not echo(v) then begin
statusbar1.Panels[0].Text:=usb_strerror;
sukkes:=false;
end;
end;
t:=gettickcount-t;
end;
statusbar1.Panels[0].Text:=usb_strerror;
if sukkes then label6.Caption:='PASSED ' + inttostr(t) + ' mS'
else label6.Caption:='NOT PASSED';
Application.ProcessMessages;
Button5.Enabled:=True;
end;
procedure TForm1.setreset(cmd,duration,port:integer);
begin
numbites:= usb_control_msg(udev, (USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN), CMD, duration, port, buffer, sizeof(buffer), 5000);
if(numbites < 0) then showmessage(usb_strerror);
statusbar1.Panels[0].Text:=usb_strerror;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
setreset(PSCMD_ON,0,spinedit1.value);
Button4.Click;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
setreset(PSCMD_Off,0,spinedit1.value);
Button4.Click;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
if spinedit2.value=0 then setreset(PSCMD_Off,spinedit4.value,spinedit3.value)
else setreset(PSCMD_ON,spinedit4.value,spinedit3.value);
end;
procedure TForm1.SpinEdit4Change(Sender: TObject);
begin
if SpinEdit4.Value=0 then label4.Caption:='Permanent switch' else
label4.Caption:=inttostr(SpinEdit4.Value*200)+' ms';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
cb[0]:=checkbox1;
cb[1]:=checkbox2;
cb[2]:=checkbox3;
cb[3]:=checkbox4;
cb[4]:=checkbox5;
cb[5]:=checkbox6;
cb[6]:=checkbox7;
cb[7]:=checkbox8;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if udev<>nil then usb_close(udev);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -