« AKBじゃんけんは、パーを出し続けた松井珠理奈さんが優勝- FORTRANを思い出したり。 | トップページ | ピサの斜塔がポータブルの3Dスキャナで内部をスキャンされた。思っている以上に傾いてる、、、 »

2013年9月19日 (木)

Mac OS X, Xcode4.6, Objective-CでHID(ゲームパッドとかジョイスティック)を使う(備忘録)

来月頭、とある大きな展示会にMacを使ったゲームを出す(いや、仕事とはあんまり(全く?)関係ないけど成り行き上、、、)。

でゲームと言えばゲームパッドかジョイスティックだろう、ということでゲームパッドを使うことにしたのだが、、、

だがどうやって動かすか最初全く分からなかった。ググっても初心者がわかるようなものがないし、、、(そもそもちょっと前の制御と、IOKitが出てからの制御が違うのでよけいに混乱)

で最終的にできるようになったのだが、その備忘録を。Objective-Cはど素人なので変なことを書いている可能性も高いが、、、

☆HIDってのはUSBの規格の中に含まれているHuman Interface Deviceのこと。キーボード、マウス、ジョイスティック、ハンドルとかいろいろ含まれる。

とにかく情報としては

https://developer.apple.com/library/mac/documentation/devicedrivers/conceptual/HID/intro/intro.html#//apple_ref/doc/uid/TP40000970-CH202-SW1

が全て。

①Linked Frameworks and Librariesに"IOKit.framework"を追加する。

②ライブラリ集として、サンプルプログラムのHID Config Save

https://developer.apple.com/library/mac/samplecode/HID_Config_Save/Introduction/Intro.html

にある、HID Utilitilesをフォルダごと自分のプロジェクトに追加する。

Add FILES to "***"で、Copy items into destination group's folderにチェックを入れ(入れなくてもいいけど)、FolderはCreate groups for any added folders.

このHID Config Saveが唯一の頼りになる例だった。が、HIDのマニュアルと結構違うことを書いていて大混乱。

③.hファイルに、#import "HID_Utilities_External.h"を追加する。

これで準備OK。

④今回のゲームパッドはElecomのこれを使った。

⑤では実際のプログラムはこちら。.mと.hをまとめて一本に。

「HIDAppDelegate.txt」をダウンロード

キーの設定は以下のコードの繰り返し。

    //  X AXIS
    searchHIDInfo.device.vendorID = (uint32_t)vendorID;
    searchHIDInfo.device.productID = (uint32_t)productID;
    searchHIDInfo.device.locID = (uint32_t)locID;
    searchHIDInfo.device.usagePage = 0x01;
    searchHIDInfo.device.usage = 0x04;
    searchHIDInfo.element.usagePage = 0x01;
    searchHIDInfo.element.usage = 0x30;
    searchHIDInfo.element.cookie = 0x11;
   
    IOHIDDeviceRef outIOHIDDeviceRef = NULL;
IOHIDElementRef outIOHIDElementRef = NULL;
    HIDFindDeviceAndElement(&searchHIDInfo, &outIOHIDDeviceRef, &outIOHIDElementRef);
   
    // if the calibration parameters haven't been set yet…
    double_t granularity = IOHIDElement_GetCalibrationGranularity(outIOHIDElementRef);
    if (granularity < 0) {
        // … do it now
        HIDSetupElementCalibration(outIOHIDElementRef);
    }
   
    IOHIDValueRef tIOHIDValueRef;
    if (kIOReturnSuccess ==
        IOHIDDeviceGetValue(IOHIDElementGetDevice(outIOHIDElementRef), outIOHIDElementRef, &tIOHIDValueRef))
    {
        actionRecs[kActionXAxis].fValue = [self calibrateElementValue:tIOHIDValueRef];
        actionRecs[kActionXAxis].fOldValue = actionRecs[kActionXAxis].fValue;
    }
    actionRecs[kActionXAxis].fDeviceRef = outIOHIDDeviceRef;
    actionRecs[kActionXAxis].fElementRef = outIOHIDElementRef;

このデバイス固有のパラメータを変えたらエレコム以外にも使える。

あとコールバック関数だが、、、

static void Handle_InputValueCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDValueRef inIOHIDValueRef) {
// call the class method
[(__bridge HIDAppDelegate *) inContext inputValueResult:inResult sender:inSender value:inIOHIDValueRef];
   
}

__bridgeというものを使わないとエラーに。それもよくわからんが、とりあえずつけると動く。

ビルドするとlongとuinit32_tの型が違うとかHID Utilities内でいっぱいwarning出るけど気にしないで(私は全部直したものを使ってますが)。

で動かすと、X, Y, 1,3,12ボタンを押すと、ログ画面に押された値がでる。

動いた!

もっとシューティングゲームみたいなタイミングが重要なものにはQueueを使えばいいが、

私のアプリには今回のコードで十分。

Queueを使うときも今回のプログラム+HID Config Saveのコピペで大丈夫と思う。

---

ということでこれだけのことをやるのに、仕事の合間にちょっとずつ進めて1カ月くらいかかっちゃった。初心者に優しくないなあ、、、ということで私と同じ初心者がちょっとでも早く動かせるように備忘録として公開しました。

---

関連リンク:

Mac OS X (Xcode, cocoa)でFTDIのICおよびD2XXを使う(備忘録というか、、、)

« AKBじゃんけんは、パーを出し続けた松井珠理奈さんが優勝- FORTRANを思い出したり。 | トップページ | ピサの斜塔がポータブルの3Dスキャナで内部をスキャンされた。思っている以上に傾いてる、、、 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/512682/58221067

この記事へのトラックバック一覧です: Mac OS X, Xcode4.6, Objective-CでHID(ゲームパッドとかジョイスティック)を使う(備忘録):

« AKBじゃんけんは、パーを出し続けた松井珠理奈さんが優勝- FORTRANを思い出したり。 | トップページ | ピサの斜塔がポータブルの3Dスキャナで内部をスキャンされた。思っている以上に傾いてる、、、 »

最近の記事

最近のコメント

2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
フォト
無料ブログはココログ