USBデバイス制御Macアプリ試作

ガジェット製作

“Device – HID – Custom Demo”が動作しましたので、今後の開発ベースとなるMacのアプリを作ってみました。

更新情報

  • 2013.4.5 ソース修正
    試作したMacのアプリにdeallocメソッドが抜けていましたので追加しました。ダウンロードファイルを更新しました。

 

今回の試作概要

前回の動作確認で、Microchip社のLibraries for Applicationsに含まれている “Device – HID – Custom Demos” を使用して、PICマイコンにこのサンプルプログラムを書き込み、サンプルのMacアプリをビルドできるようにして動作確認しました。

うまく動作したのですが、サンプルのMacアプリもライセンス条件がよくわからなかったので、Macアプリについては公開できるように全面的に書き直してみました。

今回試作する内容はこんな感じです。

Test app overview

まず、フットキーボード本体には、”Device – HID – Custom Demos”のPICプログラムを書き込みます。

次にMacアプリ側ですが、まずは最低限の動作確認、ということで、以下の機能実装をしてみました。

  • USBデバイスの接続検知
  • USBデバイスの取り外し検知
  • USBデバイスにデータ送信(0x80の送信)

PICマイコンに書き込むプログラムですが、ソースを見てみると、ホストから0x80を受信するとLEDのOn-Off制御をするようになっています。そこで、USBデバイスへのデータ送信は0x80を送ることにしてみます。

 

USBキーボードにデータは送信できるのか???

ところで、USBキーボードは入力装置ですので、USBキーボードからホストにデータを送信できることは当たり前ですが、ホストからUSBキーボードにデータを送れるんでしょうか。ちょっと調べてもわからなかったので、PICマイコンのサンプルプログラム、”Device – HID -Keyboard”のソースを確認したところ、

unsigned char OutBuffer[8];

という宣言文があり、あとの方のコメントで、

//The host can potentially send this OUT report data through the HID OUT endpoint (EP1 OUT),

とありました。ということは、USBキーボードに対して、ホストから少なくとも8バイトのデータを送信できそうです。8バイトあればいろいろできそうですね。ということで、今回試作するMacのアプリのデータ送信は、USBデバイスに8バイトのデータを送る、ということにしたいと思います。

 

開発環境

以下の環境で開発・ビルド・動作確認しました。

項目 バージョン
Mac OS X 10.8.3(Build 12D78)
Xcode 4.6.1(Build 4H512)

 

参考にしたサンプル

今回試作する上で、以下のサンプルプログラムを参考にしました。

  • Microchip Libraries for Applicationsの”Device – HID – Custom Demos”のMacアプリ
  • Apple Developer Programの”HID_Config_Save”
  • Apple Developer Programの”HID_LED_test_tool”

なお、Apple Developer ProgramのサンプルコードはXcode 4.6.1ではビルドできませんでした。いろいろ設定を変えればできるかもしれませんが、すぐには解決できませんでした。参考なので、とりあえずビルドは諦めました。。。

 

クラス図

今回試作するMacアプリのクラス図です。なお、すべてのインスタンス変数とメソッドは書いていません。クラスは3段でかいていますが、1段目はクラス名、2段目はクラス変数、3段目はクラスメソッドです。

Class diagram

まず、アプリのメインウインドウは1つ、USBデバイスの接続ステータスを表示するテキストフィールドと、USBデバイスのLEDのOn-Offをする”Toggle LED”ボタンのみです。

またクラスですが、以下の2つを用意しました。

  • FootKeyboardAppDelegateクラス
    フットキーボード設定アプリのアプリケーションdelegateです。アプリ起動直後、タイマーを設定してUpdateAppWindowメソッドを0.1秒毎に呼び出してもらいます。UpdateAppWindowはFootKeyboardインスタンスのisConnectedをみて、接続されているか取り外されているか確認してその状態をステータス表示します。また、ToggleLEDButtonPressedメソッドは、”Toggle LED”ボタンがクリックされたときに呼び出され、FootKeyboardインスタンスのSendDataToFootKeyboardメソッドを使ってデータを送ります。
  • FootKeyboardクラス
    USBデバイスの制御を行うクラスです。メソッドは初期化するinit、デバイス接続を検知するNewDeviceDetection、デバイスの取り外しを検知するDeviceRemoved、USBデバイスにデータを送信するSendDataToFootKeyboardです。なお、USBデバイスの実際の検知はIOKitにお願いしています。

ソースコード

ということで、言葉で説明するよりソースコードを見ていただいた方が早いと思いますので、今回作成したソースをアップしておきます。なるべく細かくコメントをつけましたのでご参考にされてみてください。

ダウンロードして適当なフォルダに展開後、”FootKeyboardSetter.xcodeproj”をダブルクリックして開くだけです。すぐに動作すると思いますが、”Device – HID – Custom Demo”を接続していないと動作確認できないです。

 

動作確認

早速Build&Runしてみます。

フットキーボードを接続しない状態で立ち上げると、

Mac app device not found

こんな感じでデバイスが見つからない状態表示となります。この状態でフットキーボードを接続すると、

Mac app device detected

このようにデバイスが認識され、”Toggle LED”ボタンが有効になります。ここで、”Toggle LED”ボタンをクリックすると、フットキーポードのLEDをOnにしたり、Offにしたりできました。

 

ここまでできたこと

ずいぶんと長い時間製作に取り組んでいてなかなか進捗がありませんが、これまでの試作で、

  • フットキーボードのボタンを押すと、予め設定したキー入力をすることができる
  • キー入力はcommand + wなどの組み合わせも設定できる
  • Macから8バイトのデータをフットキーボードに送信することができる

ということまで確認できました。あとは、これらを組み合わせて、Macアプリからフットキーボードのキー設定を変更できるようにすればうまく行けそうな気がしてきました。

 

次にすること

今回は、フットキーボードに書き込んだプログラムは “Device – HID – Custom Demos” でしたが、次は、”Device – HID – Keyboard” を書き込んで、Macアプリからデータ送信できるようにしたいと思います。

 

変更履歴

 

日付 変更内容
2013.4.3 初版
2013.4.6 Mac試作アプリにdealloc追加

« »

  • 隆夫 近藤

    ソースコードのダウンロードの方法を教えてください

  • claynets

    はじめまして。

    ダウンロードファイルを確認したのですが、すみません、すべてのファイルが消えていました。今週末の日曜日にこの投稿を優先してファイルアップいたします。大変申し訳ないのですが、少々お待ちください。

  • claynets

    たびたびすみません。

    ネットで調べたら復旧方法の記事がありました。なんかアイコンが変ですが、とりあえずダウンロードできるようになっていると思います。もし問題ありましたらご報告いただけると助かります。

  • 隆夫 近藤

    ありがとうございます