generalタグの解釈
Simple Wiki Based Contents Management System
ソフトウェア関連 >> RTコンポーネント関連 >> eSEAT2 >> eSEATの詳細 >> generalタグの解釈

generalタグの解釈

seatmlのスキーマでは、generalタグは下記のように定義されており、1つのseatmlファイル内に、1つのみ記述可能です。
  <xs:element name="general">
    <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="adaptor"/>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="script"/>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="var"/>
          <xs:element minOccurs="0" maxOccurs="1" ref="onexec"/>
          <xs:element minOccurs="0" maxOccurs="1" ref="ontimeout"/>
        </xs:choice>
      <xs:attribute name="name" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
この定義からもわかるように、generalタグの解析では、name属性の処理を行った後に、子ノードであるadaptor, script, onexec,varの定義に従って処理を行います。 (varの処理に関しては未実装です)
name属性の処理では、eSEATのコンポーネント名(ネームサーバーに登録される名前)の設定を行っています。
次に、子ノードの処理は、seatmlファイルの記載順に処理されますので、scriptタグを記述する場合には、その位置に応じて振る舞いが変わることに注意してください。
以下では、各子ノードの処理についてadaptor, script, onexec, ontimeout, varの順に説明していきます。

adaptorタグの処理

adaptorタグでは、eSEATの外部入出力ポートの設定を行っています。eSEATでは、RTCのデータポート、サービスポート、Rawソケットポート、HTTPのソケットポートをサポートしています。HTTPのソケットポートでは、通常のHTTPに加えてCOMETをサポートしていますので、PUSH型の通信を行うことができます。詳細は、サンプルを参照して頂けるとわかると思います。
adaptorタグの処理は、createAdaptorメソッドをコールします。createAdaptorメソッドでは、自身のコンポーネント名とeSEAT_Coreモジュールのグローバルシンボルテーブルを表す辞書を引数として追加し、eSEATのcreateAdaptorメソッドをコールするようになっています。

eSEATのcreateAdaptor

eSEATクラスのcreateAdaptorメソッドでは、adaptorタグのtype属性に応じてデータポート(rtcin, rtcout)、サービスポート(provider, consumer)の生成を行います。typeがそれ以外の場合(socket,web)の時には、eSEAT_Coreに定義されているcreateAdaptorメソッドをコールします。
type属性で上記以外が指定されれば、エラーを返して処理を継続します。
ちなみに各アダプタを生成する場合には、typeに応じて、下のような属性が必要になります、
type必要な属性
rtcin
rtcout
datatype
provider
consumer
interface, class, dispname(option)
sockethost, port
webdir, host, port
また、adaptorとしてwebを設定した場合には、最初に記載された1つのみ有効になり、他の設定は無視されますので気を付けてください。また、webアダプタは、生成後すぐにアクティベートされますので、eSEATのアクティベーション前に動作を開始しています。

scriptタグの処理

scriptタグには、Pythonスクリプトを直接記述するか、execfile属性を使って外部ファイルにあるPythonプログラムを実行します。このタブで設定されたPythonスクリプトは、即時実行されeSEATコンポーネント実行時には評価されませんので気を付けてください。
scriptタブが現れると、procScriptメソッドがコールされ、最初にexecfile属性で指定されたファイルをexecfile関数で実行し、その後scriptタグの要素をexec関数で実行します。この時、scriptタブの要素がそのままexec関数の引数として渡されますので、余計なインデントがあるとエラーとなってしまします。
Python3では、execfile関数がなくなっていますので、execfile関数を utils.exec_script_file関数として再定義しています。
主な用途として、外部ライブラリのimportやeSEAT実行時に使う大域変数の設定、ローカル関数定義などがあると思います。

onexecタグの処理

onexecタグは、eSEATがアクティブになったときにonExecuteメソッドがコールされたとき(周期実行の時)に評価(実行)されるコードを定義します。
内部では、parseExecメソッドを実行しています。
このparseExecメソッドでは、onexecタグの要素eを parseCommands(e)で処理した結果commandを eSEAT_Codeクラスに実装されているregisterCommands('all::onexec', command)を実行します。
registerCommandsメソッドは、eSEATのスロット変数 keysの名前付き配列にcommandを登録しています。

parseCommandメソッドの処理(2017-11-22 この処理はTaskGroupクラスの生成に置き換えられました)

parseCommandメソッドの内部では、引数で与えられたElementTreeの子要素eについて、記載されている順番でコマンドの配列を生成していきます。このコマンドの配列の各要素は、[cmd, *args]の形式でcmdという識別子ごとに可変長の配列を1つの命令として内部で保持しています。また、現在のところcmdの取りうる値は、'c','t', 'l', 'x', 's'のいずれかになります。
現在は、seatmlのタグとcmdの関係は下記のようになっています。
タグ名cmd登録される命令
message
command
c['c', <sendto or host>, text, <encode>, <input>]
statetransitiont['t', <func>, text ]
logl['l', text]
shellx['x', <sendto or host>, text]
scripts['s', <sendro or host>, text, <execfile>]
この表では、<sendto>は、対応するタグのsendto属性の値、textは要素を表しています。

ontimeoutタグの処理

ontimeoutタグは、eSEATがアクティブになったとき、内部のタイマーをセットし、timeout属性値の秒数だけデータポートからの入力またはGUIのイベント発生またはresetTimerメソッドの呼出しがなかった場合に、実行するスクリプトを設定します。
内部では、parseTimeoutメソッドを実行しています。
このparseTimeoutメソッドでは、ontimeoutタグの要素eを parseCommands(e)で処理した結果であるcommand(TaskGroupのインスタンス)にtimeout属性値をセットし、 eSEAT_Codeクラスに実装されているregisterCommands('all::ontimeout', command)を実行します。
registerCommandsメソッドは、eSEATのスロット変数 keysの名前付き配列にcommandを登録しています。

varタグの処理

varタグは、eSEAT_Coreモジュールのグローバルシンボルテーブルを表す辞書に、name属性をkey value属性の値をvalueとして登録しています。これによってeSEATのstate要素内のscriptタグで記述したPythonスクリプトの大域変数としてnameを利用することができます。