信号機、センサーのリスナー [python]
スクリプトにトライされる方で、私のようにプログラミングに不慣れなものはJMRIのスクリプトサンプルを見ての解読になると思いますが、例が少なく情報を求めてネット上をさまよい歩きましたので、どなたかの参考になればと思っています。
今回は信号機のリスナーで、現示が変わったときに動作するリスナーです。
class sListener(java.beans.PropertyChangeListener):
def propertyChange(self, event):
basho = singoList.index(event.source.systemName)
train = memories.getMemory(memoriList[basho]).getValue()
if train != "": #(1) そこに列車がいるときのみ以下の動作をする。
genji = signals.getSignalHead(singoList[basho]).getAppearanceName()
print "signal", train, basho, genji
c.cont(train, basho, genji)
#以下、リスナーの登録
singoList = ['IH:SE8C:"LT273";"LT274"', 'IH:SE8C:"LT275";"LT276"', 'IH:SE8C:"LT287";"LT288"', 'IH:SE8C:"LT285";"LT286"', 'IH:SE8C:"LT283";"LT284"', 'IH43', 'IH:SE8C:"LT261";"LT262"', 'IH:SE8C:"LT263";"LT264"', 'IH:SE8C:"LT301";"LT302"', 'IH:SE8C:"LT303";"LT304"', 'IH45', 'IH:SE8C:"LT265";"LT266"', 'IH:SE8C:"LT267";"LT268"', 'IH:SE8C:"LT305";"LT306"', 'IH:SE8C:"LT307";"LT308"', 'IH46', 'IH:SE8C:"LT257";"LT258"', 'IH:SE8C:"LT259";"LT260"', 'IH:SE8C:"LT277";"LT278"', 'IH:SE8C:"LT279";"LT280"', 'IH:SE8C:"LT281";"LT282"', 'IH44', 'IH:SE8C:"LT269";"LT270"', 'IH:SE8C:"LT271";"LT272"']
b = sListener()
for i in singoList:
signals.getSignalHead(i).addPropertyChangeListener(b)
信号現示が変化したらその場所を信号機リストから探し出し、場所を特定、
そこの列車IDをメモリー値から読み出します。
(1)で列車がいるときのみ、信号現示を読み出し、c.contの列車を制御する関数をコールします。
分かってしまえば特段難しくはありません。
同様にセンサーのリストです。
センサーリストはIS25は場内または閉塞区間のセンサーです。これらのセンサーは今のところなんの機能も持たせてないのですが、
緊急停止みたいなことをやってみようかと思っています。現在は設定していませんので、ifで飛ばしてます。
センサーの値はactiveのときは2、inactiveのときは4が入っていました。(スクリプトを書いて調べました。)
センサーがactiveのときは現示を赤に、それ以外のときは、参照すべき信号機を見るようにして、c.contの列車を制御する関数をコールします。
class sensListener(java.beans.PropertyChangeListener):
def propertyChange(self, event):
if (event.source.systemName != "IS25"):#イベントが起こったセンサー名がIS25以外の時
basho = sensList.index(event.source.systemName)
train = memories.getMemory(memoriList[basho]).getValue()
if (event.newValue == 2):
genji = "Red"
elif (event.newValue == 4):
genji = signals.getSignalHead(singoList[basho]).getAppearanceName()
print "sensor", train, basho, genji
c.cont(train, basho, genji)
sensList = ['IS25', 'IS25', 'IS133', 'IS134', 'IS25', 'IS25', 'IS25', 'IS25', 'IS132', 'IS131', 'IS25', 'IS25', 'IS25', 'IS130', 'IS129', 'IS25', 'IS25', 'IS25', 'IS136', 'IS135', 'IS25', 'IS25', 'IS25', 'IS25']
d = sensListener()
for i in sensList:
sensors.provideSensor(i).addPropertyChangeListener(d)
たぶん同じようにポイントのリスナーも作れると思います。
コメント 0