>大富豪さん
あけましておめでとうございます。
2つある質問のまずはコチラ
>★入力側のソースも公開していらっしゃいますが、
>出力と入力をひとつのソースにまとめるのって結構大変ですか?
から行きたいのですが、
実は以前示したサンプルスクリプトで既に出力と入力をひとまとめに出来ています。
// 受信
;uio2aki_inp inp1, inp2 ; 各ポートの入力を取得(ポート1で入力を使いたいならシステム設定を書き込んでピンの入出力を変更する必要あり[コマンド:0xF9])
title "led = "+led;+", inp2="+inp2
この部分の「;」によるコメントアウト記号2つを消してみてください。
この状態でスイッチ入力を試してみるとタイトルバーの『inp2=15』の数値が変わって入力値を受け取れていることが分かります。
(スイッチを簡単に試すには、ジャンパーワイヤ(オス-オス)で片っぽGNDに刺して、もう片方をJ2-0~3ピンにちょんちょん触ってみると分かりやすいと思います。)
あと補足ですが、USB-IO2.0(AKI)は初期状態だと「J2-0~3はスイッチを押すとそこのビットが0になる(プルアップ)」ので、inp2の値のビットを反転させて使ってやると分かり易いかもしれません。
具体的にはこんな感じです。
// 受信
uio2aki_inp inp1, inp2 ; 各ポートの入力を取得
inp2 = inp2 ^ 0b1111 ; 分かり易くする為ビットを反転
push = ""
if inp2 & 1/*(0b0001)*/ : push += "J2-0, "
if inp2 & 2/*(0b0010)*/ : push += "J2-1, "
if inp2 & 4/*(0b0100)*/ : push += "J2-2, "
if inp2 & 8/*(0b1000)*/ : push += "J2-3, "
title "led = "+led+", inp2="+inp2+" push="+push
次にコチラ
>★本件で使っているデバイス(基板)は、
>複数同時接続してもプログラム側で
>同時利用できないんですよね。
>(hspusbio.asのコマンド[uio_seldev]では同時利用できない感じ)
hspusbio.asのコマンド[uio_seldev] のバグなのかなと思います。
モジュールを見ると「#deffunc uio_seldev int n」としているので、数行下の「CreateFile devpath(dev),……」は本当は『devpath(n)』じゃないと駄目だと思うんですよね。
ただそのままの修正だと uio_seldev で切り替える度にデバイスハンドルを閉じたり開いたり繰り返すので、書き換えて乗っ取ってみました。
(ここまで来ると簡易的な乗っ取りじゃなくて1つのモジュールにするべきかもしれませんが、今のところとりあえずこれで。)
注意点ですが「認識した複数デバイスのどれがどっち?」という識別方法の良いアイディアが出なかったので、メインデバイスのスイッチ(J2-0~3のどれか)を押して貰って識別するという方法をとっています。
/*
mod_usbio_p2aki.as - ver.1.1 by MIZUSHIKI
------------------------------------------------------------------------
HSP3同梱の標準モジュール mod_usbio.as を無理やり拡張したモジュールです。
必ず他のモジュールより先に #include "mod_usbio_p2aki.as" してください。
(その内ちゃんとした mod_usbio2aki.as を作るかもしれません。)
*/
//【 簡易的に mod_usbio.as を乗っ取って拡張 】
#undef print@m0
#define print@m0 if(vid==0x1352 && pid==0x121){ pid=0x100 }:logmes
// ↑ProductID==0x121のとき0x121->0x100偽装して使えるようにする。(本当はモジュールの中身に判定を書き足すのが正しい)
#include "mod_usbio.as" // ← ※他のモジュールより先に記述する必要あり。(モジュール名「@m0」だと仮定して拡張します)
// ↓uio_getdevs, uio_seldev, uio_free を書き換えて乗っ取り
#undef uio_getdevs
#define global ctype uio_getdevs devs@m0
#undef uio_seldev
#define global uio_seldev uio_seldev@mod_usbio_p2aki
#undef uio_free
#define global uio_free uio_free@mod_usbio_p2aki
#module mod_usbio_p2aki
#deffunc uio_seldev@mod_usbio_p2aki int n
if (n>=devs@m0) :return
if length(hHID@m0) <= n : hHID@m0(n) = 0
if hHID@m0(n) != 0 {
selDev = n
return hHID@m0(selDev)
}
CreateFile@m0 devpath@m0(n),0xC0000000,3,NULL,3,0
if (stat==-1) : return
selDev = n
hHID@m0(selDev)=stat
dim hPreparsedData
dim Caps,16
HidD_GetPreparsedData@m0 hHID@m0(selDev),hPreparsedData
HidP_GetCaps@m0 hPreparsedData,Caps
HidD_FreePreparsedData@m0 hPreparsedData
InputByte@m0(selDev) = Caps(1)&0xffff
OutputByte@m0(selDev) = Caps(1)>>16&0xffff
return hHID@m0(selDev)
#define global uio2aki_out(%1=-1,%2=-1) uio2aki_out@mod_usbio_p2aki %1,%2
#deffunc uio2aki_out@mod_usbio_p2aki int port1, int port2
if length(hHID@m0) <= selDev : return 1 ; ERROR
if hHID@m0(selDev)==0 : return 1 ; ERROR
dim sz,1
sdim dat,OutputByte@m0(selDev)+1
poke dat,0,0
poke dat,1,0x20 //入出力コマンド
if port1 != -1 {
poke dat,2,1 //出力1 ポート
poke dat,3,port1 //出力1 値
}
if port2 != -1 {
poke dat,4,2 //出力2 ポート
poke dat,5,port2 //出力2 値
}
WriteFile@m0 hHID@m0(selDev), dat, OutputByte@m0(selDev), sz, 0
return (sz!=OutputByte@m0(selDev))
#deffunc uio2aki_inp var port1, var port2
if length(hHID@m0) <= selDev : return 1 ; ERROR
if hHID@m0(selDev)==0 : return 1 ; ERROR
if OutputByte@m0(selDev)<InputByte@m0(selDev) : return 1 ; ERROR
dim sz,1
SendCnt = (SendCnt+1) \ 0xFF
sdim dat,InputByte@m0(selDev)+1
poke dat,0,0
poke dat,1,0x20 //入出力コマンド
poke dat,InputByte@m0(selDev)-1,SendCnt //識別カウンタ
WriteFile@m0 hHID@m0(selDev), dat, InputByte@m0(selDev), sz, 0
if sz!=InputByte@m0(selDev) : return 1 ; ERROR
//入力処理
f=1
repeat 100
ReadFile@m0 hHID@m0(selDev), dat, InputByte@m0(selDev), sz, 0
if stat==0 : break
if peek(dat,InputByte@m0-1)==SendCnt {
port1 = peek(dat,2)
port2 = peek(dat,3)
f=0 : break
}
loop
return f
#deffunc uio_free@mod_usbio_p2aki onexit
repeat length(hHID@m0)
if hHID@m0(cnt) != 0 : CloseHandle@m0 hHID@m0(cnt) : hHID@m0(cnt)=0
loop
devs@m0=0
return
#global
//========================================================↑mod_usbio_p2aki.as==
;#include "mod_usbio_p2aki.as"
title "USB-IO2.0(AKI) test mod-Ver1.1"
// USB-IO初期化
mes "USB-IOを2つ接続してください。",1
repeat
uio_find
mes "( "+uio_getdevs()+" / 2 )",1
if uio_getdevs()==2 :break
wait 10
color 255,255,255:boxf ginfo_cx-ginfo_mesx,ginfo_cy:color:pos ginfo_cx-ginfo_mesx
loop
pos 0,ginfo_cy+ginfo_mesy
mes "デバイスの識別をします。メインデバイスのスイッチを押してください。"
repeat
uio_seldev 0
uio2aki_inp inp1_0, inp2_0
uio_seldev 1
uio2aki_inp inp1_0, inp2_1
mes strf("inp2_0=%d(%s), inp2_1=%d(%s)", inp2_0,ToBit4(inp2_0), inp2_1,ToBit4(inp2_1) ), 1
if inp2_0 != 0b1111 : mainDev=0 : subDev=1 :break
if inp2_1 != 0b1111 : mainDev=1 : subDev=0 :break
wait 10
color 255,255,255:boxf ginfo_cx-ginfo_mesx,ginfo_cy:color:pos ginfo_cx-ginfo_mesx
loop
pos 0,ginfo_cy+ginfo_mesy
mes "接続(メイン) // hHID="+hHID@m0(mainDev)+", InputByte="+InputByte@m0(mainDev)+", OutputByte="+OutputByte@m0(mainDev)+" // mainDev="+mainDev
mes "接続(サブ ) // hHID="+hHID@m0(subDev)+", InputByte="+InputByte@m0(subDev)+", OutputByte="+OutputByte@m0(subDev)+" // subDev="+subDev
// 送信
uio_seldev mainDev ; メインデバイス
uio2aki_out 0b01010101 ; bit指定で LED 0 2 4 6 点灯(1つ飛ばし)
uio_seldev subDev ; サブデバイス
uio2aki_out 0b00001111 ; bit指定で LED 0 1 2 3 点灯 (前方4つ)
stop
#module
#defcfunc ToBit4 int p
b="" : repeat 4 : b = ""+((p>>cnt)&1)+b : loop
return "0b"+b
#global