SSブログ

OS X用GigE Visionカメラドライバ - その24 [OS X用GigE Vision]

抄訳の続き。今日から具体的なノードタイプの説明に入るところ。

2.8.2  カテゴリ

Categoryノードはユーザに示すためのグループ機能として使われる。それはICategoryインターフェイスを実装して(抽象型の)ノードを継承する。またそれは機能を示す<pFeature>エレメントのリストを保持している。カテゴリは他のカテゴリを含むことができて、任意の深さのツリーを形成する。

標準的な名前がRootという特別なカテゴリがあって、カテゴリツリーの根元になっている。ユーザがカメラの機能を知るためのスタート地点となる。次の例のノードグラフを図-12に示す。

<Category Name="Root" NameSpace=”Standard” >
  <pFeature>ScalarFeatures</pFeature>
  <pFeature>Trigger</pFeature>
</Category>
<Category Name="ScalarFeatures" >
  <pFeature>Shutter</pFeature>
  <pFeature>Gain</pFeature>
  <pFeature>Offset</pFeature>
  <pFeature>WhiteBalance</pFeature>
</Category>
<Category Name="WhiteBalance" >
  <pFeature>RedGain</pFeature>
  <pFeature>BlueGain</pFeature>
</Category>
<Category Name="Trigger" >
  <pFeature>TriggerMode</pFeature>
  <pFeature>TriggerPolarity</pFeature>
</Category>
0202fig12.png
ユーザがカテゴリツリーを見てノードをアクセスするということは、カテゴリノードの下の機能を表すのノードの一番上のレイヤにあるものだけが見えるということに注意する。グラフの深いほうにあるノードは実装ノードと呼ばれ、実装がデバグのために提供する特殊なブラウズモードだけで到達可能である(そう実装されるべきである)。実装ノードの名前とレイアウトは、例えばベンダが後方互換性を宣言していたとしても、カメラ記述ファイルの新しいリリースで告知なしに変更されることを注意する。

2.8.3  レジスタ

Registerノードはカメラのレジスタ空間の連続するバイトに対応する。RegisterノードはIRegisterインターフェイスを供給し、Nodeノードからエレメントとアトリビュートを継承する。さらにそのエレメントとアトリビュートを特化したレジスタアクセスノード、例えばIntReg、StringRegなどに継承する。しかし、Registerノードは必要なナマのバイナリデータにアクセスするときもインスタンス化される。簡単な例を挙げる。
<Register Name="SensorTemperature">
  <Address>0xff00</Address>
  <Length>4</Length>
  <AccessMode>RO</AccessMode>
  <pPort>Device</pPort>
  <Cachable>No</Cachable>
  <PollingTime>10000</PollingTime>
</Register>
この例はカメラの温度センサを表している。温度はかってに変わるのでCachableがNoになっている。値を表示する場合、10,000msに一回更新されるべきである。

<Address>エレメントはカメラのレジスタ空間のレジスタアドレスを表している。Lengthエレメントはそのレジスタのバイト長さを表している。あるいは別のノード<pLength>エントリを使って読むこともできる。

<AccessMode>エレメントはその名の通り。

<pPort>エレメントはカメラのレジスタ空間へのアクセスを表している。

<Cachable>エレメントはNoCacheWriteThroughWriteAroundの値をとる。WriteThroughはカメラに書いた値はキャッシュに書いたのと同じである。WriteAround読み出せるのはキャッシュに書かれた値だけである。これが意味あるものにするためには例えば、IFloat::Gainはユーザがどんな値でも書き込めるが、読み出すときはカメラ内部のA/D変換機が選択できる値を丸めたものになる。キャッシュはあらゆる実装のオプショナルな機能である。

<PollingTime>エレメントはノードが無効化されてからの、推奨される時間間隔(ms単位)である。実装ではオプショナルな機能で、このポーリング時間はヒントでしかない。

単一の<Address>エントリの代わりにレジスタは複数の<Address><pAddress><IntSwissKnife>型を持てる。

<pAddress>エレメントは最終的なアドレスを提供するIIntegerインターフェイスをもつノードをさしている(間接アドレシングか?)。

<IntSwissKnife>エレメントは複数のソースからアドレスを計算するときに使用される。

<pIndex Offset="12">エレメントはインデクスを供給するIIntegerインターフェイスを持つノードをさしている。エレメントはOffsetアトリビュートを持てる。インデクスとOffsetの積がアドレスに足される。その代わりにオフセットは<pIndex pOffset="OffsetValue">ノードからとることもできる。OffsetとpOffsetのアトリビュートは両方ともレジスタの長さをオフセットとする。

<pInvalidator>エレメントは名前が変ると内容が無効化されるのどの名前を保持する。詳細はセクション。

次の例はこのメカニズムを間接アドレシングに使う方法を示している(図-13参照)。

<Integer Name="BaseAddress">
  <Value>0xff00</Value>
</Integer>
  <IntReg Name="Gain">
  <Address>0x04</Address>
  <pAddress>BaseAddress</pAddress>
  <Length>4</Length>
  <AccessMode>RW</AccessMode>
  <pPort>Device</pPort>
  <Sign>Unsigned</Sign>
  <Endianess>LittleEndian</Endianess>
</IntReg>
<IntReg Name="Offset">
  <Address>0x08</Address>
  <pAddress>BaseAddress</pAddress>
  <Length>4</Length>
  <AccessMode>RW</AccessMode>
  <pPort>Device</pPort>
  <Sign>Unsigned</Sign>
  <Endianess>LittleEndian</Endianess>
</IntReg>
0202fig13.png
これをC/C++の構造体で表すと
struct {                 // BaseAddress 0xff00
    uint32_t Reserved;
    uint32_t Gain;       // Offset 0x04
    uint32_t Offset;     // Offset 0x08
};
となる。構造体のベースアドレスBaseAddressは定数値の整数ノードからきていて、<pAddress>エレメントを使ってノードに供給される。構造体のそれぞれの要素は<Address>エレメントのベースアドレスにオフセットが足される。

このメカニズムは1394DCAM規格のカメラでよく使われている。この規格では標準レジスタブロック全体は共通のベースアドレスを持っていて、実行時にIEEE1212 Configuration ROM構造をパースする必要がある(ConfRomノードタイプも参照)。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。