OS X用GigE Visionカメラドライバ - その27 [OS X用GigE Vision]
また明日から安曇野。歳をくったせいかどうも体調が脆くなってて、しかもこないだから万全とは言えないので、あまり行きたくない。
ところで、抄訳の続き。今日はSwissKnifeノードのところ。Gen<i>Camの一番特徴的な部分ではあるけど、読んでてこれ決めたやつの技術的なセンスは、やっぱりどうもイマイチだよなあ、としみじみ思った。少なくとも僕ならこんなことしない。それについては訳が終わってからまとめることにして、これを過ぎるとあともう少し。早く終わらせたい。
次の例は二つの数の積を検査する方法を示している。XTimesYノードは504(=12*42)をIIntegerインターフェイスを使って表示する。
標準実装に使われているSwissKnifeは非常にパワフルである。しかし、一般の人の実装作業を簡単にするために、規格では数式処理の限られた集合だけを許している。次の操作が規格ではサポートされている。
条件操作
<condition> ? <true expr.> : <false expr.>
関数
SGN,NEG
SwissKnifeの中だけで使える関数(IntSwissKnifeではダメ)
ひとつは次に示す実体参照を使う方法である。
さらにノードの最大値最小値増分は、変数名の拡張子.Min、.Max、.Incと、完全を期すために.Valuもアクセスできる。また.Entry.NameがNameのEnumEntryの整数値をアクセスするために使える。[min,max]レンジの中央値を計算するためのSwissKnifeの例を挙げる。
次の例はナマのシャッタ値(整数)とタイムベース値(これも整数)から浮動小数点のシャッタ絶対値を変換するConverterである。
Converterは追加の<IsLinear>エレメントを持っている。それはYesあるいはNoが設定されて、Converterの式がTOとFROMの関係がリニアかどうかを表す。この場合TOに表示された増分はFROMに変換される。
ところで、抄訳の続き。今日はSwissKnifeノードのところ。Gen<i>Camの一番特徴的な部分ではあるけど、読んでてこれ決めたやつの技術的なセンスは、やっぱりどうもイマイチだよなあ、としみじみ思った。少なくとも僕ならこんなことしない。それについては訳が終わってからまとめることにして、これを過ぎるとあともう少し。早く終わらせたい。
2.8.13 SwissKnife, IntSwissKnife,Converter,IntConverter
GenICamの中で式を計算するために、浮動小数点数をあつかうSwissKnifeと整数をあつかうIntSwissKnifeが導入された。ともに同じシンタクスを使う。次の例は二つの数の積を検査する方法を示している。XTimesYノードは504(=12*42)をIIntegerインターフェイスを使って表示する。
<IntSwissKnife Name="XTimesY"> <pVariable Name="X">XValue</pVariable> <pVariable Name="Y">YValue</pVariable> <Formula>X*Y</Formula> </IntSwissKnife> <Integer Name="XValue"> <Value>42</Value> </Integer> <Integer Name="YValue"> <Value>12</Value> </Integer><Formula>エレメントは数式を表し、<pVariable>エレメントは定義された変数を参照する。<pVariable>エレメントはIIntegerノードを指していて、数式の中に定義された名前をそのNameアトリビュートに持っている。変数名は大文字でなければならない。
標準実装に使われているSwissKnifeは非常にパワフルである。しかし、一般の人の実装作業を簡単にするために、規格では数式処理の限られた集合だけを許している。次の操作が規格ではサポートされている。
(,) | 括弧 |
+,−,*,/ | 四則 |
% | 剰余 |
** | ベキ |
&,|,^,〜 | ビット間演算 |
< > ,=, > , < , < =, > = | 論理演算 |
&&,|| | 論理積と論理和 |
<< , >> | 左シフト右シフト |
ATAN,COS,SIN,TAN,ABS,EXP,LN,LG,SQRT, TRUNC,FLOOR,CEIL,ROUND(x,presision), ASIN,ACOS,SGN,NEG,E,PIXMLファイルの中に式を埋めるとき、<、>、\&の文字は直接使えない。これらの文字がXML文法の一部(メタキャラ)だからである。これに対する二つの解がある。
ひとつは次に示す実体参照を使う方法である。
< < > > & &例えば(x > 0)&&(x < 10)は
<formula>(x > 0) && (x < 10)</formula>となる。もうひとつは式全体をXMLテキストではない、と示す方法である。そのためには<![CDATA[と]]でかこむ。
<formula><![CDATA[ (x>0) && (x<10) ]]>/formula>SwissKnifeのシンタクスはいくつかの拡張がある。Constantエントリを使って名前付き定数が定義できる。さらにExpressionエントリを使って名前付き数式(Named sub expression)が定義できる。以下にその例を示す。
<SwissKnife Name="Result"> <pVariable Name="X">ValueX</pVariable> <pVariable Name="Y">ValueY</pVariable> <Constant Name="Two">2.0</Constant> <Expression Name="TwoX">2.0*X</Expression> <Formula> TwoX * Y + Two </Formula> </SwissKnife>名前付き数式は他の名前付き数式を含んではならない。
さらにノードの最大値最小値増分は、変数名の拡張子.Min、.Max、.Incと、完全を期すために.Valuもアクセスできる。また.Entry.NameがNameのEnumEntryの整数値をアクセスするために使える。[min,max]レンジの中央値を計算するためのSwissKnifeの例を挙げる。
<SwissKnife Name="MidRange"> <pVariable Name="Gain.Max">Gain</pVariable> <pVariable Name="Gain.Min">Gain</pVariable> <Formula> (Gain.Max - Gain.Min) / 2 </Formula> </SwissKnife>SwissKnifeと対照的にConverterは双方向である。これはIFloatインターフェイスを実装し、SwissKinfeに似ているが、IIntegerかIFloatインターフェイスを指している追加の<pValue>エレメントを持っている。ふたつの計算がある。<FormulaFrom>は整数から浮動小数点数をどう作るかを記述して、<FormulaTo>は整数から浮動小数点数をどう作るかを記述する。<Slope>エントリは式が単調増加あるいは単調減少か、または変動する(その場合数値の範囲すべてが使われる)かを示す。あるいはAutomaticを指定するがそのときは機能を探査して決定される。
次の例はナマのシャッタ値(整数)とタイムベース値(これも整数)から浮動小数点のシャッタ絶対値を変換するConverterである。
<Converter Name="ShutterAbs"> <pVariable Name="TIMEBASE">TimeBase</pVariable> <FormulaTo> FROM / TIMEBASE </FormulaTo> <FormulaFrom> TO * TIMEBASE </FormulaFrom> <pValue>ShutterRaw</pValue> <Slope>Increasing</Slope> </Converter> <Integer Name="ShutterRaw"> <Value>2</Value> </Integer> <Integer Name="TimeBase"> <Value>10</Value> </Integer>IntConverterはConverterと同じように動作するがIInterfaceを実装する。
Converterは追加の<IsLinear>エレメントを持っている。それはYesあるいはNoが設定されて、Converterの式がTOとFROMの関係がリニアかどうかを表す。この場合TOに表示された増分はFROMに変換される。
2015-03-03 21:11
nice!(0)
コメント(0)
トラックバック(0)
コメント 0