センサーの反応検知にリスナーを使ってみる [JMRI]
以前作ったスクリプトではwaitSensorActiveとwaitSensorInactiveを使ってセンサーの反応を検知していたのですが、リスナーを使った検知方法がようやくわかってきました。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の値が返ってきます。
コメント 0