PythonによるRTコンポーネント講座(その4)
コンポーネント間で通信をします。アウトポートを持つコンポーネントが読み込んだ文字を、
インポート側で表示します。サンプルプログラムはここ。
C:\Python24\Lib\site-packages\OpenRTM\examples\SimpleIOのプログラムとほぼ同じです。
まず、アウトポートを持つ以下のコンポーネントをTemplateで作ってください。
Programming language selection | Python | |
モジュール定義 | Module name | ConsoleIn |
Module description | Console In Component | |
Module version | 0.0.1 | |
Module vender | あなたの名前 | |
Module category | TEST | |
Component type | DataFlowComponent | |
Component's activity type | PERIODIC | |
Number of maximum instance | 1 | |
OutPort definition | 名前 | out |
タイプ | TimedLong | |
Output directory | 適当なフォルダ |
例の如く、C++をPythonにした以外はパクッてます。
あとは、ソースを書き換えます。まず、onExcute(self, ec_id)のコメント文をはずしてください。そして、
print "Please input number: ",
self._d_out.data = long(sys.stdin.readline())
print "Sending to subscriber: ", self._data.data
self._outOut.write()
と書き込んでください。printは文字を表示します。
sys.stdin.readline()で入力した文字を読み込めます。
self._d_out.dataに入力したデータを格納して、self._outOut.write()でOutportに出力します。
次はインポートを持つコンポーネントを作成します。
Programming language selection | Python | |
モジュール定義 | Module name | ConsoleOut |
Module description | Console Out Component | |
Module version | 0.0.1 | |
Module vender | あなたの名前 | |
Module category | TEST | |
Component type | DataFlowComponent | |
Component's activity type | PERIODIC | |
Number of maximum instance | 1 | |
InPort definition | 名前 | in |
タイプ | TimedLong | |
Output directory | 適当なフォルダ |
プログラムは、onExecute(self, ec_id)のコメント分を外して、
if self._inIn.isNew():
inport = self._inIn.read()
print "Received",inport.data
と書き込みます。self._inIn.isNew()は新たにデータの入力があったかを確認します。あったらTrue、なかったらFalseです。
inport = self._inIn.read()はself._inIn.read()だけではなぜか知りませんけど駄目みたいです。self._inIn.read()でインポートのデータを読み込みます。あとはprintで表示してます。
さて、作ったら前回のようにrtc.confを作ったコンポーネント両方と同じフォルダに入れます。あとは、rtm-naming、Open New System Editorを起動します。
あとは下の矢印のようにエディタに持っていきます。
次に、
というようにConsoleInの端子からドラッグして、ConsoleOutの端子にドロップします。
あとは両方Activateにして、文字を入力してやるだけです。
次回は回覧人数200人突破記念(そのうち150人ぐらいは自分で学校のパソコンから再読み込みしまくって人数増やした)、pyODEのコンポーネント化をやります。