64 lines
2.6 KiB
Python
64 lines
2.6 KiB
Python
# Make a master sensor follow a set of follower sensor
|
|
# *) Changes to the known state of the followers map to the known state of the master,
|
|
# following the rules (first applied wins)
|
|
# Any UNKNOWN -> UNKNOWN
|
|
# Any INCONSISTENT -> INCONSISTENT
|
|
# Any ACTIVE -> ACTIVE
|
|
# All INACTIVE -> INACTIVE
|
|
# Otherwise, INCONSISTENT
|
|
# *) changes to the known state of the master does nothing
|
|
#
|
|
# This is hard to do properly in Logix due to limited access to states
|
|
# and events (can't tell which change happened due to what)
|
|
#
|
|
# Author: Bob Jacobsen, copyright 2017
|
|
# Part of the JMRI distribution
|
|
|
|
import jmri
|
|
import java
|
|
import java.beans
|
|
|
|
# Define the listener.
|
|
class CombineSensors(java.beans.PropertyChangeListener):
|
|
def set(self, masterName, followerList) :
|
|
self.master = sensors.getSensor(masterName)
|
|
self.followers = followerList
|
|
# force event to set the initial state
|
|
self.propertyChange(java.beans.PropertyChangeEvent(sensors.getSensor(followerList[0]), "KnownState", 0, 0))
|
|
# set up listeners
|
|
self.master.addPropertyChangeListener(self)
|
|
for follower in self.followers :
|
|
sensors.getSensor(follower).addPropertyChangeListener(self)
|
|
return
|
|
def propertyChange(self, event):
|
|
# print "Receive change of", event.propertyName, "from", self.master.describeState(event.oldValue), "to", self.master.describeState(event.newValue), "in", event.source.userName
|
|
if (event.source != self.master and event.propertyName == "KnownState" ):
|
|
# do the KnownState rules
|
|
for follower in self.followers :
|
|
if (sensors.getSensor(follower).getKnownState() == UNKNOWN) :
|
|
self.master.setKnownState(UNKNOWN)
|
|
return
|
|
for follower in self.followers :
|
|
if (sensors.getSensor(follower).getKnownState() == INCONSISTENT) :
|
|
self.master.setKnownState(INCONSISTENT)
|
|
return
|
|
for follower in self.followers :
|
|
if (sensors.getSensor(follower).getKnownState() == ACTIVE) :
|
|
self.master.setKnownState(ACTIVE)
|
|
return
|
|
inactive = True
|
|
for follower in self.followers :
|
|
if (sensors.getSensor(follower).getKnownState() != INACTIVE) :
|
|
inactive = False
|
|
if (inactive) :
|
|
self.master.setKnownState(INACTIVE)
|
|
return
|
|
self.master.setKnownState(INCONSISTENT)
|
|
return
|
|
|
|
# Example of use - add lines like the following
|
|
# that includes system or user names for the master sensor and
|
|
# the array of followers. These must already exist.
|
|
# CombineSensors().set("IS100",["IS101", "IS102"])
|
|
|