SSブログ

センサーの反応検知にリスナーを使ってみる [JMRI]

以前作ったスクリプトではwaitSensorActivewaitSensorInactiveを使ってセンサーの反応を検知していたのですが、リスナーを使った検知方法がようやくわかってきました。waitSensorActiveなどを使った方法ではセンサーが反応するまで処理が止まってしまうため何かと不便なのです。。。
リスナーは車両がセンサーに差し掛かる、センサーから外れるなどの変化(イベント)に反応して実行されます。

まず、JMRI付属の「ListenerExample.py」を参考にセンサーの反応をScript Outputに出力するようにしてみます。

 1: import jarray
 2: import jmri
 3: class SnListener(java.beans.PropertyChangeListener):
 4:     def propertyChange(self, event):
 5:         if event.newValue == 2:
 6:             print "active"
 7:         else:
 8:             print "inactive"
 9: sn1 = sensors.provideSensor("1")
10: snlistener = SnListener()
11: sn1.addPropertyChangeListener(snlistener)



スクリプトの説明
3〜8行目class SnListenerにイベント発生時の処理を記述します(実際は4行目以降のdef propertyChangeの内容が実行されます)。
5行目以降ではevent.newValueにイベントの状態が入っているので、条件分岐でactive、inactiveを出力します。ちなみにセンサーの場合車両がさしかかっている状態で2、車両が外れたときには4が入っています。
9行目ではアドレス1のセンサーをsn1と定義しています。
10行目でSnListenerクラスのインスタンスを生成します。クラスとインスタンスの関係は私も上手く説明できるほど理解できていないのですが、友人の話では「設計図」と「その設計図から作られた製品」の関係のようなものであるようです。
11行目でsn1にリスナーをアタッチします。

ちなみに、外部からこのセンサーの状態を問い合わせるにはsn1.getState()event.newValueの値が返ってきます。


nice!(1)  コメント(0)  トラックバック(0) 

nice! 1

コメント 0

コメントを書く

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

トラックバック 0

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