Files
2026-06-17 14:00:51 +02:00

212 lines
8.9 KiB
Python

import jmri
import os
RunDispatch = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/RunDispatch.py')
exec(open(RunDispatch).read())
FileResetButtonMaster = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/ResetButtonMaster.py')
exec(open(FileResetButtonMaster).read())
StopDispatcherSystem = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/StopDispatcherSystem.py')
exec(open(FileResetButtonMaster).read())
# FileMoveTrain has to go before CreateScheduler
FileMoveTrain = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/MoveTrain.py')
exec(open(FileMoveTrain).read())
CreateScheduler = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/Scheduler.py')
exec(open(CreateScheduler).read())
CreateSchedulerPanel = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/SchedulerPanel.py')
exec(open(CreateSchedulerPanel).read())
CreateSimulation = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/Simulation.py')
exec(open(CreateSimulation).read())
CreatePlatformPanel = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/PlatformPanel.py')
exec(open(CreatePlatformPanel).read())
global instanceList
instanceList = []
class RunDispatcherMaster(jmri.jmrit.automat.AbstractAutomaton ):
def __init__(self):
global g
global le
global glb_reset_all_trains
self.logLevel = 0
g = StationGraph()
new_train_master = NewTrainMaster()
instanceList.append(new_train_master)
if new_train_master.setup():
new_train_master.setName('New Train Master')
new_train_master.start()
stop_master = StopMaster()
if stop_master.setup():
stop_master.setName('Stop Master')
stop_master.start()
reset_button_master = ResetButtonMaster()
instanceList.append(reset_button_master)
if reset_button_master.setup():
pass
reset_button_master.setName('Reset Button Master')
reset_button_master.start()
dispatch_master = DispatchMaster()
instanceList.append(dispatch_master)
if dispatch_master.setup():
dispatch_master.setName('Dispatch Master')
dispatch_master.start()
simulation_master = SimulationMaster()
instanceList.append(simulation_master)
if simulation_master.setup():
simulation_master.setName('Simulation Master')
simulation_master.start()
global scheduler_master #global so cas be referenced before killing threads
scheduler_master = SchedulerMaster()
instanceList.append(scheduler_master)
if scheduler_master.setup():
scheduler_master.setName('Scheduler Master')
scheduler_master.start()
monitorTrack_master = MonitorTrackMaster()
instanceList.append(monitorTrack_master)
if monitorTrack_master.setup():
monitorTrack_master.setName('Monitor Track Master')
monitorTrack_master.start()
off_action_master = OffActionMaster()
instanceList.append(off_action_master)
if off_action_master.setup():
off_action_master.setName('Off-Action Master')
off_action_master.start()
else:
if self.logLevel > 0: print("Off-Action Master not started")
# ensure the memory label contents are wiped out if we are starting from scratch
if "glb_reset_all_trains" not in globals():
glb_reset_all_trains = True # first time round delete all memory variables
# print "glb_reset_all_trains", glb_reset_all_trains
#set default values of buttons
sensors.getSensor("Express").setKnownState(INACTIVE)
sensors.getSensor("simulateSensor").setKnownState(INACTIVE)
sensors.getSensor("setDispatchSensor").setKnownState(ACTIVE)
sensors.getSensor("stopMasterSensor").setKnownState(INACTIVE)
sensors.getSensor("modifyMasterSensor").setKnownState(INACTIVE)
sensors.getSensor("checkRouteSensor").setKnownState(INACTIVE)
sensors.getSensor("checkRouteSensor").setKnownState(ACTIVE)
sensors.getSensor("soundSensor").setKnownState(INACTIVE)
sensors.getSensor("stopAtStopSensor").setKnownState(ACTIVE)
sensors.getSensor("editRoutesSensor").setKnownState(INACTIVE)
sensors.getSensor("viewScheduledSensor").setKnownState(INACTIVE)
sensors.getSensor("showClockSensor").setKnownState(INACTIVE)
sensors.getSensor("timetableSensor").setKnownState(INACTIVE)
sensors.getSensor("departureTimeSensor").setKnownState(INACTIVE)
sensors.getSensor("helpSensor").setKnownState(INACTIVE)
global stored_simulate
if 'stored_simulate' in globals():
if stored_simulate == ACTIVE:
sensors.getSensor("simulateSensor").setKnownState(ACTIVE)
self.waitMsec(2000) #wait for panel to load, it may have train values
if glb_reset_all_trains == True:
# print "removing train values"
StopMaster().remove_train_values()
# StopMaster().remove_all_trains_from_trains_allocated()
self.update_operations_routes_and_locations()
def update_operations_routes_and_locations(self):
# operations is used by dispatcher system
# when a new route is created
# and the route contains a station or action it is added to operations>locations
# If we are using two config files one for simulation and one for real running they get out of sync
# To allow us to use operations to get a list of all stations and actions we update them here
self.update_operations_locations()
self.update_operations_actions()
def update_operations_locations(self):
LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
for station_name in self.get_list_of_stopping_points():
if LocationManager.getLocationByName(station_name) is None:
LocationManager.newLocation(station_name)
print "added", station_name
def update_operations_actions(self):
LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
for action in self.get_list_of_actions():
# print "action", action
if LocationManager.getLocationByName(action) is None:
LocationManager.newLocation(action)
# print "added", action
# ***********************************************************
# gets the list of stopping points (stations, sidings etc.)
# ***********************************************************
def get_list_of_stopping_points(self):
stopping_points_set = set()
# First, get stopping points from block comments
for block in blocks.getNamedBeanSet():
comment = block.getComment()
if comment != None:
if "stop" in comment.lower():
stopping_points_set.add(block.getUserName())
# Second, automatically add blocks associated with LayoutTurntables
editorManager = jmri.InstanceManager.getDefault(jmri.jmrit.display.EditorManager)
for editor in editorManager.getAll():
if isinstance(editor, jmri.jmrit.display.layoutEditor.LayoutEditor):
# The returned object is a Java Set, which needs to be converted to a list for safe iteration in Jython
for turntable in list(editor.getLayoutTurntables()):
layout_block = turntable.getLayoutBlock()
if layout_block is not None and layout_block.getUserName() is not None:
stopping_points_set.add(layout_block.getUserName())
return sorted(list(stopping_points_set))
def action_directory_in_DispatcherSystem(self):
path = jmri.util.FileUtil.getScriptsPath() + "DispatcherSystem" + java.io.File.separator + "actions"
if not os.path.exists(path):
os.makedirs(path)
return path + java.io.File.separator
def action_directory(self):
path = jmri.util.FileUtil.getUserFilesPath() + "dispatcher" + java.io.File.separator + "actions"
if not os.path.exists(path):
os.makedirs(path)
return path + java.io.File.separator
def get_list_of_actions(self):
directory1 = self.action_directory_in_DispatcherSystem()
files = os.listdir(directory1)
# print "files in dispatcher system action directory", files
python_files = [str(os.path.basename(f)) for f in files if f.endswith(".py")]
# print "directory1", directory1, "python_files", python_files
directory = self.action_directory()
files = os.listdir(directory)
python_files2 = [str(os.path.basename(f)) for f in files if f.endswith(".py")]
python_files.extend(python_files2)
return python_files