Files
JIMRI/jython/CombineSensors.py
T
2026-06-17 14:00:51 +02:00

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"])