〔 BASICインタプリタのためのUSBポート制御プログラム[ USBcnct.dll / CallHspUSB.dll ] 〕

 "USBcnct.dll"は、テクノキット社のUSB−IOを、【(仮称)十進BASIC】からの制御を可能にするドライバです。
 使用法は同梱のBASICファイルを見てください。

 "CallHspUSB.dll"は、同USB−IOを、HSP用として公開されている"hspusbio.dll"を汎用に利用できるドライバです。
 一般的な高級言語から利用できます。




(仮称)十進BASICについて ⇒
USBcnct.dllについて ⇒
USBcnct.dllソースリストについて ⇒
hspusbio.dllについて ⇒
callhspusb.dllについて ⇒
callhspusb.dllソースリストについて ⇒


(仮称)十進BASICについて

 (仮称)十進BASICは、文教大白石和夫氏により公開されているFull JIS規格に基づくBASICインタプリタです。
 実行ウィンドウは、プログラム作成用、テキスト用、グラフィック用に分かれ、プログラムウィンドウに記述したリストを即実行できます。
 VBに比べわずかな概念で使用できるため、教育用として初心者に最適な言語であると思います。
↓(仮称)十進BASICを実行中の様子
(仮称)十進BASICのページへ ⇒ 
↑先頭へ戻る


USBcnct.dll
 USBcnct.dllは、一般のユーザが容易に(仮称)十進BASICからUSB−IOの制御のできること目的に開発しました。
 このドライバは、直接HID.DLLとデータの送受信を行い、その値を十進数で表示します。
 また、BASIC側にも実行時にリンクする外部関数群(USBcnct.BAS)を用意しましたので、これを実行時にMERGEし、
 中学生レベルでも簡単に制御プログラムの制作が可能になると思います。
USBcnct.dllダウンロード ⇒ 
↑先頭へ戻る


hspusbio.dll
 hspusbio.dllは、簡易言語HSPでUSB−IOを制御するために川平航介氏が開発されたドライバです。
 USB−IO自体は、HID(Human Interface Device:マウスやキーボード等人間が低速で操作する装置)デバイスとしてWindowsに認識されます。
 HIDへの入出力は、Windowsに組み込まれているHID.DLLが担当しています。hspusbio.dllは、高級言語向きの外部関数を実装し、 実際の処理にHID.DLLを呼び出すことで、高級言語からのUSB制御を容易にします。
びんずめ堂USB-IO用プラグインのページへ ⇒ 
↑先頭へ戻る


callhspusb.dll
 CallHspUSB.dllは、一般のユーザが容易に(仮称)十進BASICからUSB−IOの制御のできること目的に開発しました。
 このドライバは、hspusbio.dllを通してHID.DLLとデータの送受信を行います。 高級言語とこのドライバのデータのやりとりを全て整数型の関数に統一することで、操作の簡便化を図りました。
 また、BASIC側にも実行時にリンクする外部関数群(USBCALL.BAS)を用意しましたので、 中学生レベルでも簡単に制御プログラムの制作が可能になると思います。
 BASIC.EXE,hspusbio.dll,CallHspUSB.dllの3ファイルを同じフォルダに入れご利用ください。

callhspusb.dllのダウンロード ⇒ 
↑ (仮称)十進BASICにより制御されるUSB−IO
↑先頭へ戻る


ソースリスト
USBcnct.dllのソースリスト(一部)
unit HIDCall;
{ Copyright(c) Kato Yasuhisa 2011 }
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, JvHidControllerClass, ExtCtrls;

type
  TReport=record
    ReportID:Byte;
    data:array [0..7] of Byte;
  end;

  TMainForm = class(TForm)
    HidCtl: TJvHidDeviceController;
    Edit1: TEdit;
    Timer1: TTimer;
    Edit2: TEdit;
    Label1: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit3: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure HidCtlDeviceChange(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  public
    Activated: Boolean;
  end;

const myvid=$12ED ; //テクノキット VID=$12ED
      mypid=$1003 ; //テクノキット PID=$1003

var
  MainForm: TMainForm;
  HidData:TReport;
  MyDev:TJvHidDevice ;
  rddata:integer ;
implementation

{$R *.dfm}

procedure TMainForm.FormActivate(Sender: TObject);
begin
  if not Activated then Activated := True ;
end;

procedure TMainForm.HidCtlDeviceChange(Sender: TObject);
begin
  MyDev.Free ;
  Edit3.Text:=' 切断' ; Edit1.Text:='' ;
  while HidCtl.CheckOut(mydev) do
  begin
    if (MyDev.Attributes.VendorID=myvid)and(MyDev.Attributes.ProductID=mypid) then begin
      MyDev.NumInputBuffers := 128;
      MyDev.NumOverlappedBuffers := 128;
      Edit3.Text:=' 接続'  ;
      exit ;
   end;
  end;
end;


function bytefromstr(s:string):byte ;
var l,ll:string[4] ;
    cc:array[0..4] of char absolute l ;
    i:byte ;
begin
 l:=s ; ll:='' ;
 if l='' then begin bytefromstr:=0 ; exit end ;
 for i:=1 to length(l) do if cc[i] in ['0'..'9'] then ll:=ll+cc[i] ;
 if ll='' then begin bytefromstr:=0 ; exit end ;
 bytefromstr:=strtoint(ll) ;
end ;

procedure USBOpen ; stdcall ; export ;
begin
 MainForm:=tMainForm.Create(Application);
 MainForm.Show;
end ;

procedure USBWrite(d:integer) ; stdcall ; export ;
var written:dword ;
     b,i:integer ;
     s:string ;
begin
 if mydev=nil then exit ;
 if d in [0..255] then b:=d else b:=255 ;
 case b of
  0..9:s:='   '+inttostr(b)+'D' ;
  10..99:s:='  '+inttostr(b)+'D' ;
  100..255:s:=' '+inttostr(b)+'D' ;
 end ;
 MainForm.Edit1.Text:=s ;
 with Hiddata do begin
  ReportID:=0 ;
  data[0]:= 1 ;
  data[1]:= b ;
  for i:=2 to 7 do data[i]:= 0 ;
 end ;
 if mydev.OpenFile then begin
   myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written);
   mydev.CloseFile ;
 end ;

 with Hiddata do begin
  ReportID:=0 ;
  data[0]:= 2 ;
  data[1]:= 15 ;
  for i:=2 to 7 do data[i]:= 0 ;
 end ;
 if mydev.OpenFile then begin
   myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written);
   mydev.CloseFile ;
 end ;
end ;

function ReadUSBPort:integer ;
var written:dword ;
    rslt:boolean ;
    i:integer ;
begin
 if mydev=nil then begin ReadUSBPort:=-1 ; exit ; end ;
 if mydev.OpenFile then begin
   with Hiddata do begin
    ReportID:=0 ;
    data[0]:=4  ;     // Port-Bを指定
    data[1]:=15 ;     // Port-BをHに
    for i:=2 to 7 do data[i]:= 0 ;
   end ;
   myDev.WriteFile(HidData, mydev.Caps.InputReportByteLength,Written);
   with Hiddata do begin
    ReportID:=0 ;
    data[0]:= 4 ;     // Port-Bを指定
    data[1]:=15 ;     // Port-BをHに
    for i:=2 to 7 do data[i]:= 0 ;
   end ;
   rslt:=myDev.ReadFile(HidData, mydev.Caps.OutputReportByteLength,Written);
   rslt:=myDev.ReadFile(HidData, mydev.Caps.OutputReportByteLength,Written);
   if rslt then ReadUSBPort:=HIDdata.data[1] else ReadUSBPort:=-1 ;
   mydev.CloseFile ;
 end ;
end;

function USBRead(d:integer):integer ;
begin
 USBRead:=ReadUSBPort ;
end ;

procedure USBClose ;
begin
 mydev.Free ;
end ;

procedure TMainForm.Timer1Timer(Sender:TObject);
var s:string ;
    r:integer ;
begin
 r:=ReadUSBPort ; s:='' ;
 if r in [0..255] then begin
     case r of
      0..9: s:='   '+inttostr(r)+'D' ;
      10..99: s:='  '+inttostr(r)+'D' ;
      100..255: s:=' '+inttostr(r)+'D' ;
     end ;
     Edit2.Text:=s ;
   end ;
end;

exports
USBOpen , USBWrite , USBRead , USBClose ;

end.
↑先頭へ戻る


ソースリスト 十進BASICによるUSB-IO制御法はこちらへ
callhspusb.dllのソースリスト
 unit CallHspdll;

 interface
 uses Dialogs ;
 function Usbfind:integer ; stdcall;
 function UsbOut(p,d:integer) : integer ; stdcall;
 function UsbInp(p:integer):integer ; stdcall;
 function UsbClose : integer ; stdcall;

 implementation
 function FUsbFind(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_find@16';
 function FUsbOut(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_out@16';
 function FUsbInp(var p1:integer; p2,p3,p4:integer):shortint; stdcall; external 'hspusbio.dll' name '_uio_inp@16';
 function FUsbClose(p1,p2,p3,p4:integer): shortint; stdcall; external 'hspusbio.dll' name '_uio_free@16';

 function Usbfind:integer ;
 var r:integer ;
 begin
  r:=FUsbFind(0,0,0,0) ;
  case r of
  {0:showmessage('正常に起動') ;}
  -1:showmessage('必要なドライバ(HSPUSBIO.DLL)が見つかりません');
  -2:showmessage('USB-IOが接続されていません');
  end;
  Usbfind:=r ;
 end ;

 function UsbOut(p,d:integer) :integer ;
 var r:integer ;
 begin
  if not(p in [0..1]) then begin showmessage('出力ポートは0または1です') ; UsbOut:=-1 ; exit ; end ;
  if not(d in [0..255]) then begin showmessage('出力データは0〜255の間です') ; UsbOut:=-1 ; exit ; end ;
  r:=Usbfind ; if r<0 then begin UsbOut:=-1 ; exit ; end ;
  r:=FUsbOut(p,d,0,0) ; if r =-1 then showmessage('異常終了しました');
  UsbOut:=r ;
 end ;

 function UsbInp(p:integer):integer ;
 var r,d:integer ;
 begin
  if not(p in [0..1]) then begin showmessage('入力ポートは0または1です') ; UsbInp:=-1 ; exit ; end ;
  r:=Usbfind ; if r<0 then begin UsbInp:=-1 ; exit ; end ;
  r:=FUsbInp(d,p,0,0) ; {FUsbInp関数パラメータ:値を返す変数(ポインタ型),ポート番号,0,0}
  case r of
  -1:begin showmessage('命令を実行できませんでした') ; UsbInp:=0 ; exit ; end ;
  -2:begin showmessage('データの取得に失敗しました') ; UsbInp:=0 ; exit ; end ;
  end ;
  UsbInp:=d and 255 ;
 end ;

 function UsbClose : integer ;
 begin
  FUsbClose(0,0,0,0) ; UsbClose:=0 ;
 end ;

 exports
 Usbfind name 'Usbfind',
 UsbOut name 'UsbOut',
 UsbInp name 'UsbInp',
 UsbClose name 'UsbClose' ;
 end.
↑先頭へ戻る