HSP3でUSB-IO2.0(AKI)を使ったサンプルスクリプト – 出力編

USB-IO2.0(AKI)という挿せば即USBデバイスとして使えるようになる機器を動かす為のサンプル の出力編。
[8つのLEDを光らせる]
動作している状況は https://twitter.com/millline/status/1606898916704030720 の動画を参照ください。
・mod_usbio_p2aki.asモジュール は簡易版のため注意点アリ。モジュール内冒頭を確認してください。
・回路はJ1-0~7にLEDを取り付けてください。(+抵抗)

USB-IO2.0(AKI)という挿せば即USBデバイスとして使えるようになる機器を動かす為のサンプル の出力編。
[8つのLEDを光らせる]
動作している状況は https://twitter.com/millline/status/1606898916704030720 の動画を参照ください。
・mod_usbio_p2aki.asモジュール は簡易版のため注意点アリ。モジュール内冒頭を確認してください。
・回路はJ1-0~7にLEDを取り付けてください。(+抵抗)

  • タグ:
  • タグはありません
/*
    mod_usbio_p2aki.as - ver.1.0                                by MIZUSHIKI
    ------------------------------------------------------------------------
    HSP3同梱の標準モジュール mod_usbio.as を無理やり拡張したモジュールです。
    必ず他のモジュールより先に #include "mod_usbio_p2aki.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」だと仮定して拡張します)

#module mod_usbio_p2aki
#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 hHID@m0==0 : return 1  ; ERROR
	dim sz,1
	sdim dat,OutputByte@m0+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, dat, OutputByte@m0, sz, 0
	return (sz!=OutputByte@m0)
	
#deffunc uio2aki_inp var port1, var port2
	if hHID@m0==0 : return 1  ; ERROR
	if OutputByte@m0<InputByte@m0 : return 1  ; ERROR
	dim sz,1
	SendCnt = (SendCnt+1) \ 0xFF
	sdim dat,InputByte@m0+1
	poke dat,0,0
	poke dat,1,0x20                 //入出力コマンド
	poke dat,InputByte@m0-1,SendCnt //識別カウンタ
	WriteFile@m0 hHID@m0, dat, InputByte@m0, sz, 0
	if sz!=InputByte@m0 : return 1  ; ERROR
	//入力処理
	f=1
	repeat 100
		ReadFile@m0 hHID@m0, dat, InputByte@m0, 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
#global
//========================================================↑mod_usbio_p2aki.as==

;#include"mod_usbio_p2aki.as"

	title "USB-IO2.0(AKI) OutputTest"
	// USB-IO初期化
	mes "USB-IOを接続してください"
	repeat
		uio_find : if stat==0 :break
		wait 10
	loop
	mes "接続 // hHID="+hHID@m0+", InputByte="+InputByte@m0+", OutputByte="+OutputByte@m0

	// 送信
	uio2aki_out 0b01010101  ; bit指定で とりあえず LED 0 2 4 6 点灯させてみる(ポート1のみ)
	
	led_mae = 0b00000000  ; 点灯させているLEDを記録しておく変数
*main
	wait 1
	// マウスのいる位置で点灯させるLEDを変更
	id = mousex / (ginfo_sx/8)
	led = 1<<id  ; bitシフト:LED点灯IDを指定
	if mousey < ginfo_sy/2 : led = 0b00000000  ; 画面の上半分にいるときは無点灯に

	// キーボード1~8でLED点灯IDを指定
	repeat 8
		getkey key, 49+cnt : if key : led |= 1<<cnt  ; bitシフト:LED点灯IDを指定して重ねる
	loop
	
	title strf("led=%03d(%s)",led,ToBit8(led))
	if led_mae == led : goto *main  ; LED点灯箇所が前回と同じならデータ送信しない
	led_mae = led

	// 画面描画
	redraw 0
	color 255,255,255 : boxf 0,ginfo_sy/2 : color 255
	repeat 8
		if (led>>cnt)&1 : boxf (ginfo_sx/8)*cnt, ginfo_sy/2, (ginfo_sx/8)*(cnt+1),  ; 点灯箇所を色塗り
	loop
	redraw 1

	// 送信
	uio2aki_out led  ; bit指定で ポート1のLED点灯(第2引数でポート2にも送信可。ただしシステム設定を書き込んでピンの入出力設定を変更する必要あり[コマンド:0xF9])
	if stat {
		// USB抜いても差し直したら再接続&再送信
		uio_find : if stat==0 && hHID@m0!=0 : mes "再接続 // hHID="+hHID@m0+", InputByte="+InputByte@m0+", OutputByte="+OutputByte@m0 : uio2aki_out led
	}
goto *main

#module
#defcfunc ToBit8 int p
	b="" : repeat 8 : b = ""+((p>>cnt)&1)+b : loop
	return "0b"+b
#global