SSブログ

信号機、センサーのリスナー [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)

 

たぶん同じようにポイントのリスナーも作れると思います。

 

 

 


タグ:DCC Python
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

メモリーのリスナーJMRI 3.5.5 ブログトップ

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