OS X用GigE Visionカメラドライバ - その25 [OS X用GigE Vision]
GEN<i>CAM規格の抄訳の続き。詳細を理解したいと思って訳し始めたんだけど、ただ訳すだけになって全然内容が頭に入らない。本末転倒だが、やめたらますますわからないだろうし.....
LUTIndexが特定のLUTEntryの選択に使えるということは、LUTIndexノードにある<pSelected>エレメントによって明示されている。
IIntegerやIEnumerationインターフェイスを実装しているノードはpSelectedエントリをいくつでも持てる。それはセレクトされたノードがセレクタノードの値に依存した異なる値を表すことを示している(なんのこっちゃ?)。ノードがセレクタかどうか、どれがセレクトされたノードかという情報は、対応するIsSelectorとGetSelectedFeaturesメソッドを持つISelectorインターフェイスで調べることができる。このインターフェイスを使ってGUIは例えばLUTEntriesのリストを示すことができる。それはLUTIndex(セレクタ)が最小値と最大値の間を動けば、LUTEntry(セレクトされる)からの異なる値の配列を調べるだろうからである。
セレクタと間接アドレシングの構造は複数のインデックスを使った多次元配列のアクセスにも使われることに注意。
<Endianess>エレメントは値としてLittleEndianとBigEndianを持つ。そしてトランスポートレイヤから見たデバイスのエンディアンを参照している。トランスポートレイヤはエンディアンを変更しようとしてはならない。実装は実行しているマシン自身のエンディアンに自覚的でなければならないことに注意。
ときどき複数の整数はバイト境界に整列せず、ひとつのレジスタにパックされている。この場合はMaskedIntRegを使われる。これはRegisterノードからエレメントとアトリビュートを継承する。LSBとMSBエレメントはそれぞれその名の通りである。
LSBは20の桁に対応する。ビッグエンディアンではMSB ≤ LSBが真で、リトルエンディアンでは反対のLSB ≤ MSBが真となる。
Integerノードタイプは異なるソースからのValue、Minimum、Maximum、Incrementを一緒にするために使われる。これはNodeノードからエレメントとアトリビュートを継承する。制限パラメータは定数の<Min>、<Max>、<Inc>エレメントか、またはほかのIIntegerノードの<pMin>、<pMax>、<pInc>エレメントで与えられる。
普通、値は<pValue>エレメントを使う別のノードが与える。一方定数は内部の<Value>エレメントで与えられる。この場合、ノードが「フローティング」変数で、それは制限パラメータの範囲内でユーザによって設定される。定数は初期値である。典型的な例は次の0、2、...、254に設定できるIndexノードである。
Integerノードはマルチプレクサあるいは値の表のように機能する。次の例のように。
<Unit>エレメントは数に物理的な意味を与える。
<Representation>は整数をどう表示するかに対するヒントを与える。これがLinearあるいはLogarithmicであれば、スライダはそれにふさわしい動作をするように実装されなければならない。Booleanであればチェックボックスが使われなければならない。PureNumberは10進数を表示するテキストボックスを使えということである。HexNumberは同様に16進数を表示する。IPV4AddressとMACAddressはIPアドレスやMACアドレスを表示するためのものである。Integer、IntReg、MaskedIntノードは<pSelected>エレメントを持つことができる。該当セクション参照。
それを克服するためにStructRegノードが導入されている。例を挙げる。
2.8.4 配列とセレクタ
前のチャプタで書いた間接アドレシングは配列のアクセスにも使われる。次の例はそれを示している(図-14も参照)。<Integer Name="LUTIndex"> <Value>0</Value> <Min>0</Min> <Max>255</Max> <pSelected>LUTEntry</pSelected> </Integer> <IntReg Name="LUTEntry"> <IntSwissKnife Name="LUTEntryAddress"> <pVariable Name="INDEX">LUTIndex</pVariable> <Formula>0xff00 + INDEX * 4</Formula> </IntSwissKnife> <Length>4</Length> <AccessMode>RW</AccessMode> <pPort>Device</pPort> <Sign>Unsigned</Sign> <Endianess>LittleEndian</Endianess> </IntReg>LUTエントリエレメントはLUTへのポインタとして使われる。このエレメントのアドレスは埋め込まれた<IntSwissKnife>エレメントで、BaseAddress+LUTIndex*sizeof(LUTEntry)の式にしたがってLUTEntryエレメントのアドレスを計算する。LUTIndexは「フローティング」整数ノードでカメラには接続されていない。そのかわりユーザは<Value>から始まって<Min>と<Max>の間で変更できる。
LUTIndexが特定のLUTEntryの選択に使えるということは、LUTIndexノードにある<pSelected>エレメントによって明示されている。
IIntegerやIEnumerationインターフェイスを実装しているノードはpSelectedエントリをいくつでも持てる。それはセレクトされたノードがセレクタノードの値に依存した異なる値を表すことを示している(なんのこっちゃ?)。ノードがセレクタかどうか、どれがセレクトされたノードかという情報は、対応するIsSelectorとGetSelectedFeaturesメソッドを持つISelectorインターフェイスで調べることができる。このインターフェイスを使ってGUIは例えばLUTEntriesのリストを示すことができる。それはLUTIndex(セレクタ)が最小値と最大値の間を動けば、LUTEntry(セレクトされる)からの異なる値の配列を調べるだろうからである。
セレクタと間接アドレシングの構造は複数のインデックスを使った多次元配列のアクセスにも使われることに注意。
2.8.5 Integer、IntReg、MaskedIntReg
IIntegerインターフェイスは64ビット符号付き整数の変数へのアクセスを提供する。それはMimimum、Maximum、Increnentというパラメータを含んだ次の式によって制限される値を持つ。 IntRegノードはバイト配列された整数レジスタに対応する。これはRegisterノードからエレメントとアトリビュートを継承する。以下の例は2バイト符号なし整数レジスタに対応している。このような変数は次の制限パラメータを持っている:Minimum=0、Maximum=65535、Increment=1。<IntReg Name="Gain"> <Address>0x1234</Address> <Length>2</Length> <AccessMode>RW</AccessMode> <pPort>Device</pPort> <Sign>Unsigned</Sign> <Endianess>BigEndian</Endianess> </IntReg><Sign>エレメントは値としてSignedとUnsignedを持つことができる。64ビット符号なし整数は利用不可であることに注意。最も大きな符号なし整数はMaskedIntRegによる263−1である。
<Endianess>エレメントは値としてLittleEndianとBigEndianを持つ。そしてトランスポートレイヤから見たデバイスのエンディアンを参照している。トランスポートレイヤはエンディアンを変更しようとしてはならない。実装は実行しているマシン自身のエンディアンに自覚的でなければならないことに注意。
ときどき複数の整数はバイト境界に整列せず、ひとつのレジスタにパックされている。この場合はMaskedIntRegを使われる。これはRegisterノードからエレメントとアトリビュートを継承する。LSBとMSBエレメントはそれぞれその名の通りである。
<MaskedIntReg Name="Offset"> <Address>0x2345</Address> <Length>2</Length> <AccessMode>RW</AccessMode> <pPort>Device</pPort> <LSB>11</LSB> <MSB>0</MSB> <Sign>Unsigned</Sign> <Endianess>BigEndian</Endianess> </MaskedIntReg>単一のビットに対応する場合がある。これは問い合わせビットとして一般的である。<LSB>と<MSB>を同じあたいにするかわりに、<Bit>エントリを使うことができる。
<MaskedIntReg Name="OffsetInq"> <Address>0x2345</Address> <Length>2</Length> <AccessMode>RW</AccessMode> <pPort>Device</pPort> <Bit>15</Bit> <Sign>Unsigned</Sign> <Endianess>BigEndian</Endianess> </MaskedIntReg>ビット番号の付け方はビッグエンディアンとリトルエンディアンで異なる。32ビット整数では
Littie-Endian | MSB | … | LSB |
31 | … | 0 | |
Big-Endian | MSB | … | LSB |
0 | … | 31 |
Integerノードタイプは異なるソースからのValue、Minimum、Maximum、Incrementを一緒にするために使われる。これはNodeノードからエレメントとアトリビュートを継承する。制限パラメータは定数の<Min>、<Max>、<Inc>エレメントか、またはほかのIIntegerノードの<pMin>、<pMax>、<pInc>エレメントで与えられる。
普通、値は<pValue>エレメントを使う別のノードが与える。一方定数は内部の<Value>エレメントで与えられる。この場合、ノードが「フローティング」変数で、それは制限パラメータの範囲内でユーザによって設定される。定数は初期値である。典型的な例は次の0、2、...、254に設定できるIndexノードである。
<Integer Name="Index"> <Value>0</Value> <Min>0</Min> <Max>255</Max> <Inc>2</Inc> </Integer><pValue>エレメントはIntegerノードと一緒に使われて、任意の数の<pValueCopy>エレメントに囲まれることができる。次の例のように。
<Integer Name="Replicator"> <pValueCopy>SomeInt1</pValueCopy> <pValue>SomeInt2</pValue> <pValueCopy>SomeInt3</pValueCopy> <pValueCopy>SomeInt4</pValueCopy> </Integer>GetValueメソッドはpValueサブノードから読み取った値を返す。SetValueメソッドはXMLファイルにある順番でpValueとpValueCopyサブノードに書き込む。サブノードの[min, max]境界はすべてのサブノードに合う最も大きな境界へ結合する。すべてのサブノードの増分は同じでなければならない。あるいは書き込み禁止でなければならない。
Integerノードはマルチプレクサあるいは値の表のように機能する。次の例のように。
<Integer Name="Multiplexer"> <pIndex>Selector</pIndex> <pValueIndexed Index=”10”>SomeInt1</pValue> <pValueIndexed Index=”20”>SomeInt2</pValue> <ValueDefault>0</ ValueDefault> </Integer> <Integer Name="Table"> <pIndex>Selector</pIndex> <ValueIndexed Index=”10”>100</Value> <ValueIndexed Index=”20”>200</Value> <pValueDefault>SomeNode</pValueDefault> </Integer><pIndex>エントリはIntegerノードを参照する。その値に従って<ValueIndexed>、<pValueIndexed>エントリのひとつが選択されると、Value、pValueエントリのように振る舞う。この二つのエントリのタイプは混合可能である。
<Unit>エレメントは数に物理的な意味を与える。
<Representation>は整数をどう表示するかに対するヒントを与える。これがLinearあるいはLogarithmicであれば、スライダはそれにふさわしい動作をするように実装されなければならない。Booleanであればチェックボックスが使われなければならない。PureNumberは10進数を表示するテキストボックスを使えということである。HexNumberは同様に16進数を表示する。IPV4AddressとMACAddressはIPアドレスやMACアドレスを表示するためのものである。Integer、IntReg、MaskedIntノードは<pSelected>エレメントを持つことができる。該当セクション参照。
2.8.6 StructReg
MaskedIntノードはレジスタからビットフィールドを取り出すのに使われることがある。完全なMaskdIntエントリはそれぞれのビットのために使われるが、そこにはカメラ設定ファイルからたくさんの不要なビットがコピーされている。それは異なるMaskedIntエントリが分け合っているからである。それはすなわち<pPort>や<Endianess>などである。それを克服するためにStructRegノードが導入されている。例を挙げる。
<StructReg Comment="VFormat7InqReg"> <ToolTip>Inquiry register for video format 7 color codes</ToolTip> <Address>0x14</Address> <pAddress>VFormat7ModeCsrBase</pAddress> <Length>4</Length> <AccessMode>RO</AccessMode> <pPort>Device</pPort> <Endianess>BigEndian</Endianess> <StructEntry Name="VFormat7Mono8InqReg"> <ToolTip>Inquiry for ColorCode Mono8</ToolTip> <Bit>31</Bit> </StructEntry> <StructEntry Name="VFormat7YUV422InqReg"> <ToolTip>Inquiry for ColorCode YUV8 422</ToolTip> <Bit>29</Bit> </StructEntry> <StructEntry Name="VFormat7Raw8InqReg"> <Bit>24</Bit> </StructEntry> </StructReg>StructRegノードはMaskedIntエレメントと同じエレメントを含んでいる。さらにMaskedIntエレメントと同じひとつ以上の<StructEntry>エレメントを順に含む。プリプロセッサはStructRefノードをひとまとまりのMaskedIntノードに置き換える。それぞれの<StructEntry>エレメントからひとつのMaskedIntノードが作られてNameアトリビュートやそのサブエレメント、<StructEntry>にすでに存在していないStructRegノードのエレメントがStructEntryエレメントから引き継がれる。上の例の最初のMaskedIntノードは次のようになる。
<MaskedInt Name="VFormat7Mono8InqReg "> <Address>0x14</Address> <pAddress>VFormat7ModeCsrBase</pAddress> <Length>4</Length> <AccessMode>RO</AccessMode> <pPort>Device</pPort> <Endianess>BigEndian</Endianess> <ToolTip>Inquiry for ColorCode Mono8</ToolTip> <Bit>31</Bit> </MaskedInt><ToolTop>エレメントは<StructEntry>エレメントから選ばれていて、<StructReg>ノードからではない。それに対してVFormat7Mono8InqRegという名前を持つエントリは<StructReg>ノードの<ToolTip>エレメントから継承している。<StructReg>エレメントはそれを記述するコメントアトリビュートを持っていない。
2015-02-08 17:11
nice!(0)
コメント(0)
トラックバック(0)
コメント 0