SSブログ

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

また明日から安曇野。歳をくったせいかどうも体調が脆くなってて、しかもこないだから万全とは言えないので、あまり行きたくない。

ところで、抄訳の続き。今日は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は非常にパワフルである。しかし、一般の人の実装作業を簡単にするために、規格では数式処理の限られた集合だけを許している。次の操作が規格ではサポートされている。
(,) 括弧
+,−,*,/ 四則
% 剰余
** ベキ
&,|,^,〜 ビット間演算
< > ,=, > , < , < =, > = 論理演算
&&,|| 論理積と論理和
<< , >> 左シフト右シフト
条件操作
    <condition> ? <true expr.> : <false expr.>
関数
    SGN,NEG
SwissKnifeの中だけで使える関数(IntSwissKnifeではダメ)
    ATAN,COS,SIN,TAN,ABS,EXP,LN,LG,SQRT,
    TRUNC,FLOOR,CEIL,ROUND(x,presision),
    ASIN,ACOS,SGN,NEG,E,PI
XMLファイルの中に式を埋めるとき、<>\&の文字は直接使えない。これらの文字がXML文法の一部(メタキャラ)だからである。これに対する二つの解がある。

ひとつは次に示す実体参照を使う方法である。
<    &lt;
>    &gt;
&    &amp;
例えば(x > 0)&&(x < 10)は
<formula>(x &gt; 0) &amp;&amp; (x &lt; 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に変換される。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

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