Mac用USBデバイス-64 Cocoaクラス [Mac用USBデバイス工作]
今日から具体的な実装を始める。とりあえずトップレベルのCocoaクラスのヘッダを考える。
IIDCCameraクラスのisochChannelはバス上に他のIIDCカメラがあったときに衝突しないように、クラススタティックな変数から作って保持する。どうせ他のFireWireデバイスのアイソクロナスチャンネルは0だろうから大きい目の数字を使うことにすればいい。
isSameDeviceメソッドは、デバイスが外れたときに確認できるようにするためのもの。
その他に
supportedFormatsAndModesはカメラがサポートしているフォーマットとモードを文字列の配列で返す。現在のフォーマットとモードはその中の一つを返す。フォーマットとモードを設定するメソッドはsupportedFormatsAndModesが返した配列の要素を選んで設定する。
フィーチャも文字列の配列として返す。文字列はIIDCの仕様書に定義されたフィーチャの名前を使う。もちろん物理デバイスをアクセスして実装されているフィーチャだけを選んで配列にする。
フィーチャはたくさんあるのでこの実装は簡単だけどすごく面倒になる。フィーチャの値が変更されると通知をポストする。全部のフィーチャに対して通知する必要があるかどうかは疑問なのでそれは後で考えることにする。
それと
こんな感じだろう。
Cocoaクラスの実装
クラスの名前は「IIDC」をつけることにする。 順に実装を考えてみる。まずカメラのクラスから。IIDCCamera
カメラを表すクラスのインターフェイスを考える。@interface IIDCCamera : NSObject { io_service_t iidcDevice; IOFireWireLibDeviceRef deviceInterface; UInt32 commandBase; UInt32 isochChannel; } - (id)initWithDevice:(io_service_t)device; - (BOOL)isSameDevice:(io_service_t)device; ....io_iterator_tから返ってきたio_service_tをもらって初期化する。カメラのオブジェクトはそれを保持する。これからデバイスインターフェイスをとってくるのはこのクラスの仕事で、I/O Kitを呼ぶことになる。commandBaseは、コマンドレジスタへのオフセットで、isochChannelはアイソクロナスチャンネルの値を保持する。アイソクロナスチャンネルというのはFireWireでのアイソクロナス転送は送り元や受け取り先のアドレスがパケットに乗らないので転送元を区別するための6ビット幅のチャンネル番号をつけることになっている。受け取り側はアドレスではなくこのチャンネル番号を見て送り元を特定する。
IIDCCameraクラスのisochChannelはバス上に他のIIDCカメラがあったときに衝突しないように、クラススタティックな変数から作って保持する。どうせ他のFireWireデバイスのアイソクロナスチャンネルは0だろうから大きい目の数字を使うことにすればいい。
isSameDeviceメソッドは、デバイスが外れたときに確認できるようにするためのもの。
その他に
- (NSArray *)supportedFormatsAndModes; - (NSString *)currentFormatAndMode; - (Float32)currentFrameRate; - (void)setFormatAndMode:(NSString *)formatAndMode andFrameRate:(Float32)fRate; - (NSDictionary *)cameraProperties; - (NSArray *)cameraFeatures; // array of NSString(CFStringRef) - (void)boundaryMinimum:(UInt32 *)min andMaximum:(UInt32 *)max forFeature:(NSString *)feature;なんかのフォーマットやフィーチャを制御するためのメソッドを作っておかないといけない。
supportedFormatsAndModesはカメラがサポートしているフォーマットとモードを文字列の配列で返す。現在のフォーマットとモードはその中の一つを返す。フォーマットとモードを設定するメソッドはsupportedFormatsAndModesが返した配列の要素を選んで設定する。
フィーチャも文字列の配列として返す。文字列はIIDCの仕様書に定義されたフィーチャの名前を使う。もちろん物理デバイスをアクセスして実装されているフィーチャだけを選んで配列にする。
フィーチャはたくさんあるのでこの実装は簡単だけどすごく面倒になる。フィーチャの値が変更されると通知をポストする。全部のフィーチャに対して通知する必要があるかどうかは疑問なのでそれは後で考えることにする。
それと
- (void)startIsochTransfer; - (void)stopIsochTransfer;が必要。これが呼ばれるとデータ転送を始めたり止めたりするためのレジスタをアクセスする。これは直接呼ばれないで、Faucetオブジェクトが呼ぶためのもの。
こんな感じだろう。
2010-02-10 22:11
nice!(0)
コメント(2)
トラックバック(0)
可展面の勉強ではお世話になりました川合工房でございます。おかげさまで切り折り紙も学問的に一歩先にすすめることができました。
このたび以下のような問題を作ってみました。
http://moon.ap.teacup.com/applet/kiriorigami/20100211/archive
decafishさまには簡単すぎるかと思いますが、遊んでいただけると幸いです。このようなコメント欄での連絡申し訳ありません。
by 川合工房 (2010-02-11 21:55)
コメントありがとうございます。レスポンスが遅くなって申し訳ありませんでした。
川合工房さんは造形と紙のテクスチャが美しいので、いつもほれぼれと見ていました。
問題の解答はわかりました。でもそれに答えるだけならまるで子供のお使いのようなので、僕なりの興味を反映させた話題をまとめたいと思います。
明日、もう一度見に来てください。よろしくお願いします。
by decafish (2010-02-14 21:32)