11
HascTool 独独独独独独独独独 http:// hasc.jp

HascTool BlockDevelopment

Embed Size (px)

DESCRIPTION

HascTool において、ブロックを開発する手順を解説します。

Citation preview

Page 1: HascTool BlockDevelopment

HascTool独自ブロックの開発

http://hasc.jp

Page 2: HascTool BlockDevelopment

独自ブロックの開発

HascTool ブロック図で様々な処理を記述可能 Java で独自のブロックを開発可能

開発環境のセットアップ HascTool ソースファイル Eclipse RCP 版 + プラグイン( Zest 等)

独自ブロック用のフラグメントプロジェクトを新規作成(プロジェクトを分けたい場合のみ) プラグイン ID: jp.hasc.hasctool.ui

Page 3: HascTool BlockDevelopment

ブロック

RuntimeBean インタフェースを実装した任意のクラス デフォルトコンストラクタ プロパティをセットするための setter メソッド 入力 / 出力ポートを返す getter メソッド

Page 4: HascTool BlockDevelopment

入力・出力ポート

入力ポート MessageProcessor インタフェースを実装した

オブジェクト 入力ポートの processMessage メソッドで、メッセージ

受信時の処理を実装

出力ポート MessageConnector オブジェクト 出力ポートの processMessage メソッドを呼び出して、

メッセージを送信▪ 単に、接続先の入力ポートの processMessage メソッドを呼び

出しているだけ connect メソッドでポート間を接続

Page 5: HascTool BlockDevelopment

メッセージの種類

任意のオブジェクトをメッセージとして送受信可能 入力ポートによって、解釈できるメッセージの種類は異なる 現状では、静的な型チェックは無し

例:ベクトル信号メッセージ 時刻情報 + 実数値の配列▪ 加速度 CSV ファイルの1行に対応

VectorSignalMessage 抽象クラス(のサブクラス) VectorSignalMessages#create() メソッドで生成

例:スカラ信号メッセージ 要素数 1 のベクトル信号メッセージ(時刻情報 + 実数値) ScalaSignalMessage クラス

Page 6: HascTool BlockDevelopment

サンプル スカラ値に、 valueToAdd プロパティの値を加算する

1入力1出力フィルタpublic class SampleAddFilter

implements RuntimeBean, MessageProcessor{

// valueToAdd プロパティprivate double valueToAdd_ = 0;public void setValueToAdd(double

valueToAdd) {this.valueToAdd_ = valueToAdd;

}

// outputPortprivate MessageConnector outputPort_=

new MessageConnector();public MessageConnector

getOutputPort() {return outputPort_;

}

// inputPortpublic MessageProcessor getInputPort()

{return this;

}

// RuntimeBeans interface@Overridepublic void setup(RuntimeContext

context) {}

// MessageProcessor interface @Overridepublic void processMessage(Object

message) throws InterruptedException

{if (message instanceof

ScalarSignalMessage) {// ScalarSignalMessage の場合ScalarSignalMessage inValue =

(ScalarSignalMessage)message;// 新しい値を計算double newValue =

inValue.getScalarValue() + valueToAdd_;

// 結果を出力outputPort_.processMessage(

new ScalarSignalMessage(inValue.getTime(), newValue));

}else{// その他のメッセージ( BEGIN, END など)

は// そのまま出力outputPort_.processMessage(message);

}}

}

Page 7: HascTool BlockDevelopment

ヘルパークラス

AbstractFilter RuntimeBean を実装した抽象クラス 1入力1出力のブロックを作るのに使う

AbstractSink RuntimeBean を実装した抽象クラス 1入力、出力無しのブロックを作るのに使う

Page 8: HascTool BlockDevelopment

別スレッドでの処理

入力ポートのprocessMessageメソッドは、入力ポートごとに、別々のスレッドから非同期に呼び出される可能性がある 1入力ブロックの場合: メッセージ受信時に、同じスレッドで処理を行って

良い。(別スレッドで行っても良い) 多入力ブロックの場合: スレッド間の同期のため、

メッセージをキューにためておき、別スレッドで処理を行う 入力無し(出力のみ)のブロックの場合: 別スレッドで処理

スレッド

キュー

1出力 1入力1出力 2入力1出力

1入力

スレッド

キュー1出力

Page 9: HascTool BlockDevelopment

別スレッド処理に使うクラス

AbstractTask クラス RuntimeBean を実装した抽象クラス 別スレッドで処理を行う場合に使う サブクラスで run メソッドを実装して

処理を記述( Thread クラスと同様)

MessageQueue クラス MessageProcessor を実装したクラス(入力ポート

用) processMessage メソッドで渡されたメッセージ

をキューにためておき、別スレッドから取り出せる

Page 10: HascTool BlockDevelopment

ヘルパークラス

AbstractMultipleInputsFilter クラス AbstractTask を継承した抽象クラス 多入力1出力のブロックを作る時に使う 全入力ポートから入力された信号メッセージの、

時刻が同期され、 processSignalMessages メソッド(サブクラスで実装)が呼び出される

サンプル: VectorAdder クラス

AbstractSource クラス AbstractTask を継承した抽象クラス 入力無し、1出力のブロックを作るのに使う

Page 11: HascTool BlockDevelopment

まとめ

独自ブロックの開発方法の概要を説明

詳細は、以下を参照 readme.html▪ ブロックリファレンス▪ メッセージリファレンス

readme_developer.html▪ 開発環境のセットアップ

各ブロックのソースファイル