212 lines
8.9 KiB
Python
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
|