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

146 lines
5.5 KiB
Python

# This is a proof of concept script showing how to bridge a throttle
# from one system to another.
#
# The test configuration for this scrip has a LocoNet system
# configured as the first connection and an XPressNet based system
# configured as the second connection. This means the XpressNet based
# system's ThrottleManager is the system throttle manager.
#
# If you are using software throttles, this should work with any system
# as the controlling throttles, so long as that system is listed as the
# last connection in the connection preferences.
#
# If you want to control the trains with a hardware throttle, the system
# you use needs to be able to get updates about the throttle status from
# the layout. This is not possible with all systems.
#
# In this version of the script, the controlled system MUST be a
# LocoNet based system. If you have more than one loconet
# connection configured, the first loconet connection in the list of
# loconet connections will be used.
#
# This version of the script works with address 3.
#
# Author: Paul Bender, copyright 2004,2010
# Part of the JMRI distribution
# Updated: steambigboy, 2024
#
import jmri
import java
import java.beans
from time import sleep
lnMemo = jmri.InstanceManager.getList(jmri.jmrix.loconet.LocoNetSystemConnectionMemo).get(0);
# define some global objects as placeholders
# First, define the property change listener. for the
# throttle. This one sends speed and direction information
# to the second loconet throttle and prints information about
# received events.
class tbListener(java.beans.PropertyChangeListener):
oldValue = None
newValue = None
def propertyChange(self, event):
print "change",event.propertyName
print "from", event.oldValue, "to", event.newValue
print "a slot check", a.lnSlot.getSlot()
if(a.lnSlot == None):
return
if(event.propertyName == "IsForward"):
print "Fw: ", event.newValue
a.lnThrottle.setIsForward(event.newValue)
if(event.propertyName == "SpeedSetting"):
print "Speed: ", event.newValue
a.lnThrottle.setSpeedSetting(event.newValue)
if(event.propertyName == "F0"):
print "F0: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F1"):
print "F1: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F2"):
print "F2: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F3"):
print "F3: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F4"):
print "F4: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F5"):
print "F5: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F6"):
print "F6: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F7"):
print "F7: ", event.newValue
a.lnThrottle.setF0(event.newValue)
if(event.propertyName == "F8"):
print "F8: ", event.newValue
a.lnThrottle.setF0(event.newValue)
# Second, we create a listener for the loconet slot
# this listener is necessary to create the loconet
# throttle.
class tbSlotListener(jmri.jmrix.loconet.SlotListener):
def notifyChangedSlot(self,slot):
print "slot changed"
if(a.lnSlot == None):
a.lnSlot = slot
print "LocoAddress", a.lnSlot.locoAddr()
print "Slot", a.lnSlot.getSlot()
a.lnThrottle = jmri.jmrix.loconet.LocoNetThrottle(lnMemo, slot);
print "lnThrottle:", a.lnThrottle
# class to keep this thread running
class ThrottleBridge(jmri.jmrit.automat.AbstractAutomaton) :
# we need some class global data for items we can't initilize
# until we get some information back from the layout
lnThrottle = None
lnSlot = None
#init() is called exactly once at the begining to do any
#necessary configuration
def init(self):
# we want to get a throttle for two systems assigned
# to the same address.
print "XpressNet"
# One throttle is easy, all we need to do is
# call the getThrottle routine
self.xnThrottle = self.getThrottle(3,False);
print "XNet: ", self.xnThrottle
print "XNet details: ", self.xnThrottle.getDccAddress()
print "XNet status: ", self.xnThrottle.getSpeedStepMode()
# print "XNet discon: ", self.xnThrottle.notifyThrottleDisconnect()
if (self.xnThrottle == None) :
print "Couldn't assign throttle!"
else:
# If the throttle was available, then we need to add
# a throttle listener to it
self.tl = tbListener()
self.xnThrottle.addPropertyChangeListener(self.tl)
# and then request the second throttle.
# The second throttle takes more work, because
# it isn't the default manager.
self.sl = tbSlotListener()
lnMemo.getSlotManager().slotFromLocoAddress(3,self.sl)
# self.xnThrottle.throttleDispose()
return
#handle() is called repeated until it returns false.
def handle(self):
sleep(100.)
return 1
#end of class definition
# create one of these
a = ThrottleBridge()
#set the name
a.setName("Throttle Bridge")
# adn start it running
a.start()