// USB-HIDLib 使用例 // 『昼夜逆転』工作室 http://jsdiy.web.fc2.com /* プロジェクトの準備 1. プロジェクトに「UsbHidLib.cs」を追加する。 2. ソースに「using UsbHid;」を記述する。 ソース記述の手順 1. HidDeviceMgrオブジェクトを生成する。 2. HidDeviceMgr.GetDeviceList()でデバイス一覧を取得する。 3. HidDeviceMgr.TargetDevice()で目的のデバイスを決定する。HidDeviceオブジェクトが返る。 4. 以降、HidDeviceオブジェクトを通してデバイスを操作する。 詳細はサンプルソース内のコメントを参照。 */ using System; using UsbHid; //HIDデバイステスト(コンソールアプリ) namespace hiddevc { class Program { static void Main(string[] args) { HidDeviceMgr hidMgr = new HidDeviceMgr(); HidDeviceInfo[] hidInfos = hidMgr.GetDeviceList(0x16C0, 0x05DF); //V-USB/exsamples/hid-data if (hidInfos.Length == 0) { Console.WriteLine("該当するデバイスが見つかりませんでした。"); return; } HidDevice hid = hidMgr.TargetDevice(0); //例として目的のデバイスが0番目だったとする //インタラプト転送(IN)を使用する場合はコールバック関数を登録し、受信を開始する bool isOK = hid.InterruptInStart(Kitaaaa); byte[] rbuf = null; byte[] wbuf = null; //feature report : 256byte wbuf = new byte[256]; for (int i = 0; i < wbuf.Length; i++) wbuf[i] = (byte)(i % 0x100); //0x00,..,0xFF,0x00,..,0xFF,.. isOK = hid.SetFeatureReport(wbuf); Console.WriteLine("コントロール転送でfeatureレポートを256byte送信: " + (isOK ? "OK" : "NG")); rbuf = hid.GetFeatureReport(wbuf.Length); Console.WriteLine("コントロール転送でfeatureレポートを256byte受信: " + (rbuf != null ? "OK" : "NG")); if (rbuf != null) { for (int i = 0; i < rbuf.Length; i++) Console.Write("{0:X2} ", rbuf[i]); Console.WriteLine(); } Console.WriteLine(); //output report : 16byte wbuf = new byte[16]; for (int i = 0; i < wbuf.Length; i++) wbuf[i] = (byte)(i + 0x10); //0x10,0x11,0x12,.. isOK = hid.SetOutputReport(wbuf); Console.WriteLine("コントロール転送でoutputレポートを16byte送信: " + (isOK ? "OK" : "NG")); Console.WriteLine("送信内容は 0x10,0x11,0x12,..,0x1F"); Console.WriteLine(); /* デバイスのレポートデスクリプタでレポートID:2番を設定していたとして、そのレポートを取得する場合の例 wbuf = new byte[16 + 1]; //実データのサイズ+レポートIDの分1byteを確保する //実データを[1]以降に格納する([0]にはレポートIDが格納される) for (int i = 1; i < wbuf.Length; i++) wbuf[i] = (byte)((i-1) + 0x10); //0x10,0x11,0x12,.. isOK = hid.SetOutputReport(2, wbuf, false); //第1引数にレポートIDを指定する */ //outputしたものが先頭16byteに反映されているか確認 //・デバイス内ではfeatureレポートと共用のバッファに書き込んでいる。 rbuf = hid.GetFeatureReport(256); Console.WriteLine("コントロール転送でfeatureレポートを256byte受信: " + (rbuf != null ? "OK" : "NG")); if (rbuf != null) { Console.Write("先頭16byteは "); for (int i = 0; i < 16; i++) Console.Write("{0:X2} ", rbuf[i]); Console.WriteLine(); } Console.WriteLine(); //input report : 8byte rbuf = hid.GetInputReport(8); //このようにしても(先頭8byte分だけは)確認できる //[ESC]キーを入力するまで待機。 //・待機中、ピン状態のコールバックのテストが行える。 Console.WriteLine("PC0~PC5をGNDとショートさせてコールバック動作を確認してください。"); Console.WriteLine("[ESC]キーで終了します。"); Console.WriteLine("※先頭00はデフォルトのレポートID。次の1byteがポート状態。残りはダミー値。"); ConsoleKeyInfo keyInfo; while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Escape) { } //アプリ終了前にインタラプト転送(IN)の受信を終了する hid.InterruptInStop(); } //PC0-PC5の任意のピンをGNDに落とすと、ピン状態を表す値がデバイスからインタラプト転送されてくる //インタラプト転送(IN)受信時のコールバック //・staticメソッドとすること。 //・メソッド名(Kitaaaa)と変数名(data)は任意の名前で構わない。 static void Kitaaaa(byte[] data) { if (data.Length == 0) { Console.Write("error."); } else { for (int i = 0; i < data.Length; i++) Console.Write("{0:X2} ", data[i]); } Console.WriteLine(); } } }