2219 lines
105 KiB
Python
2219 lines
105 KiB
Python
###############################################################################
|
|
#
|
|
# class NewTrainMaster *
|
|
# Sets up a train in a section
|
|
#
|
|
# class StopMaster *
|
|
# Turns the dispatch system off
|
|
#
|
|
# class OffActionMaster *
|
|
# allows actions when buttons are turned off
|
|
# a) toggles the Setupdispatch SetupRoute buttons
|
|
#
|
|
# class ResetButtonMaster *
|
|
# if a button is turned on, this class turns off all the others.
|
|
# allows only one station button to be active at a time
|
|
#
|
|
# class MoveTrain
|
|
# Calls dispatcher to move train from one station to another
|
|
# given engine and start and end positions
|
|
#
|
|
# class DispatchMaster *
|
|
# monitors the station buttons, and dependent on the mode one is in
|
|
# Setup dispatch, setup route, run route
|
|
# calls the appropriate action
|
|
#
|
|
# class RunDispatchMaster
|
|
# starts the classes marked with * above in threads so they can do their work
|
|
# also starts class scheduler and class simulation which are in different files
|
|
#
|
|
# class MonitorTrack
|
|
# looks at the allocated trains and ensures that if the blocks are occupied
|
|
# the name of the engine is displayed
|
|
#
|
|
###############################################################################
|
|
import java
|
|
import jmri
|
|
import os
|
|
import copy
|
|
import sys
|
|
import re
|
|
|
|
# include the graphics library
|
|
my_path_to_jars = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/jars/jgrapht.jar')
|
|
sys.path.append(my_path_to_jars) # add the jar to your path
|
|
from org.jgrapht.alg import DijkstraShortestPath
|
|
from org.jgrapht.graph import DefaultWeightedEdge
|
|
from org.jgrapht.graph import DirectedWeightedMultigraph
|
|
|
|
#############################################################################################
|
|
#
|
|
# Set some global variables
|
|
#
|
|
|
|
logLevel = 0 # for debugging
|
|
if 'trains' not in globals():
|
|
trains = {} # dictionary of trains shared over classes
|
|
global instanceList # instance list of threads shared over classes
|
|
global g
|
|
g = None # graph shared over classes
|
|
|
|
time_to_stop_in_station = 10000 # time to stop in station in stopping mode(msec)
|
|
|
|
stopping_sensor_choice = "not_set" # has value
|
|
|
|
#############################################################################################
|
|
# the file was split up to avoid errors
|
|
# so now include the split files
|
|
|
|
FileResetButtonMaster = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/ResetButtonMaster.py')
|
|
execfile(FileResetButtonMaster)
|
|
|
|
StopDispatcherSystem = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/StopDispatcherSystem.py')
|
|
execfile(StopDispatcherSystem)
|
|
|
|
|
|
# FileMoveTrain has to go before CreateScheduler
|
|
FileMoveTrain = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/MoveTrain.py')
|
|
execfile(FileMoveTrain)
|
|
|
|
CreateScheduler = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/Scheduler.py')
|
|
execfile(CreateScheduler)
|
|
|
|
CreateSchedulerPanel = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/SchedulerPanel.py')
|
|
execfile(CreateSchedulerPanel)
|
|
|
|
CreateSimulation = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/Simulation.py')
|
|
execfile(CreateSimulation)
|
|
|
|
my_path_to_jars = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/jars/jgrapht.jar')
|
|
sys.path.append(my_path_to_jars) # add the jar to your path
|
|
CreateGraph = jmri.util.FileUtil.getExternalFilename('program:jython/DispatcherSystem/CreateGraph.py')
|
|
exec(open (CreateGraph).read())
|
|
le = LabelledEdge
|
|
g = StationGraph()
|
|
|
|
#############################################################################################
|
|
class StopMaster(jmri.jmrit.automat.AbstractAutomaton):
|
|
logLevel = 0
|
|
|
|
def init(self):
|
|
if self.logLevel > 0: print 'Create Stop Thread'
|
|
|
|
def setup(self):
|
|
self.stop_master_sensor = sensors.getSensor("stopMasterSensor")
|
|
self.modify_master_sensor = sensors.getSensor("modifyMasterSensor")
|
|
self.start_scheduler = sensors.getSensor("startSchedulerSensor")
|
|
self.start_scheduler.setKnownState(INACTIVE)
|
|
return True
|
|
|
|
def handle(self):
|
|
global timebase
|
|
self.stop_modify_sensors = [sensors.getSensor(sensorName) for sensorName in ["stopMasterSensor", "modifyMasterSensor"]]
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.stop_modify_sensors)
|
|
sensor_active = [sensor.getUserName() for sensor in self.stop_modify_sensors if sensor.getKnownState() == ACTIVE]
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_that_went_active = [sensor for sensor in self.stop_modify_sensors if sensor.getKnownState() == ACTIVE][0]
|
|
sensor_that_went_active1 = [sensor.getUserName() for sensor in self.stop_modify_sensors if sensor.getKnownState() == ACTIVE]
|
|
# start_sensor = sensors.getSensor("startDispatcherSensor")
|
|
stop_sensor = sensors.getSensor("stopMasterSensor")
|
|
modify_sensor = sensors.getSensor("modifyMasterSensor")
|
|
|
|
if sensor_that_went_active == modify_sensor:
|
|
self.stop_via_table()
|
|
modify_sensor.setKnownState(INACTIVE)
|
|
return True
|
|
elif sensor_that_went_active == stop_sensor:
|
|
self.stop_timebase_and_remove_timebase_listener()
|
|
|
|
self.optionally_reset_all_trains()
|
|
stop_sensor.setKnownState(INACTIVE)
|
|
return
|
|
|
|
def optionally_reset_all_trains(self):
|
|
global stored_simulate, glb_reset_all_trains
|
|
opt1= "keep as is"
|
|
opt2 = "reset all trains"
|
|
res = OptionDialog().customQuestionMessage2str("reset positions of trains?", "", opt2, opt1)
|
|
# store the state of the simulate button
|
|
stored_simulate = sensors.getSensor("simulateSensor").getKnownState()
|
|
if res == opt2:
|
|
|
|
self.stop_route_threads()
|
|
# print "self.stop_route_threads()"
|
|
self.remove_train_values()
|
|
# print "self.remove_train_values()"
|
|
self.delete_active_transits()
|
|
# print "self.delete_active_transits()"
|
|
self.stop_all_threads()
|
|
# print "self.stop_all_threads()"
|
|
self.remove_all_trains_from_trains_dispatched()
|
|
self.remove_all_trains_from_trains_allocated()
|
|
glb_reset_all_trains = True
|
|
# print "set glb_reset_all_trains", glb_reset_all_trains
|
|
else:
|
|
self.delete_active_transits()
|
|
# print "self.delete_active_transits()"
|
|
self.stop_all_threads()
|
|
|
|
self.remove_all_trains_from_trains_dispatched()
|
|
# print "self.stop_all_threads()"
|
|
glb_reset_all_trains = False
|
|
global MoveTrain_index
|
|
MoveTrain_index = 0 # reset the indexing of trains moving in print statements in MoveTrain()
|
|
|
|
def stop_via_table(self):
|
|
global CreateAndShowGUI3_frame
|
|
# delete any previous frames
|
|
if "CreateAndShowGUI3_frame" in globals():
|
|
CreateAndShowGUI3_frame.setVisible(False)
|
|
else:
|
|
# print "not in globals"
|
|
pass
|
|
createandshowGUI3(self)
|
|
|
|
def stop_timebase_and_remove_timebase_listener(self):
|
|
global timebase
|
|
global tListener
|
|
self.new_train_sensor = sensors.getSensor("startDispatcherSensor")
|
|
self.new_train_sensor.setKnownState(INACTIVE)
|
|
try:
|
|
#stop the scheduler timebase listener
|
|
# print "stopping timebase", timebase, "tlistener", tListener, "started? before", timebase.getRun()
|
|
if self.logLevel > 0: print "removing listener"
|
|
timebase.removeMinuteChangeListener(tListener)
|
|
timebase.setRun(False)
|
|
# print "stopping timebase", timebase, "tlistener", tListener, "started? after", timebase.getRun()
|
|
return False
|
|
except NameError:
|
|
if self.logLevel > 0: print "Name error"
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
def stop_route_threads(self):
|
|
# #remove the train from the transit
|
|
# msg = "Delete all active Transits?\n"+"\nCaution this may disrupt running trains\n"
|
|
# title = "Transits"
|
|
# opt1 = "just remove the route threads (stops trains at end of current transit)"
|
|
# opt2 = "delete transits as well (stops trains immediately)"
|
|
# requested_delete_transits = OptionDialog().customQuestionMessage2str(msg, title, opt1, opt2)
|
|
|
|
instance_list = java.util.concurrent.CopyOnWriteArrayList()
|
|
for train in instanceList:
|
|
instance_list.add(train)
|
|
#stop all threads
|
|
for thread in instance_list:
|
|
thread_name = "" + thread.getName()
|
|
if thread_name.startswith("running_route_"):
|
|
#determine the train name
|
|
train_name = self.determine_train_name(thread_name,thread)
|
|
#remove the train from the transit
|
|
#self.delete_transits()
|
|
#remove the train from the list of trains
|
|
self.remove_train_name(train_name)
|
|
if thread is not None:
|
|
if thread.isRunning():
|
|
if self.logLevel > 0: print 'Stop "{}" thread'.format(thread.getName())
|
|
thread.stop()
|
|
instance_list = [instance for instance in instance_list if instance != thread]
|
|
else:
|
|
#need this for scheduler in wait state
|
|
thread.stop()
|
|
instance_list = [instance for instance in instance_list if instance != thread]
|
|
|
|
def determine_train_name(self,thread_name, thread):
|
|
# print "thread", thread # this is the RunRoute class object
|
|
route = thread
|
|
train_name = route.train_name
|
|
return train_name
|
|
|
|
def remove_train_from_transit(self, train_name):
|
|
if self.logLevel > 0: print "train_name to remove from trainsit", train_name
|
|
DF = jmri.InstanceManager.getDefault(jmri.jmrit.dispatcher.DispatcherFrame)
|
|
#DF.setState(DF.ICONIFIED);
|
|
activeTrainsList = DF.getActiveTrainsList()
|
|
for i in range(0, activeTrainsList.size()) :
|
|
activeTrain = activeTrainsList.get(i)
|
|
if train_name == activeTrain.getTrainName():
|
|
DF.terminateActiveTrain(activeTrain, True, False)
|
|
DF = None
|
|
|
|
def remove_train_name(self, train_name):
|
|
global trains_allocated
|
|
global trains_dispatched
|
|
if self.logLevel > 0: print "train to remove", train_name
|
|
# for train in trains_allocated:
|
|
# if self.logLevel > 0: print "train in trains_allocated", train, ": trains_allocated", trains_allocated
|
|
# if train == train_name:
|
|
# trains_allocated.remove(train)
|
|
trains_dispatched_list = java.util.concurrent.CopyOnWriteArrayList()
|
|
for train in trains_dispatched:
|
|
trains_dispatched_list.add(train)
|
|
|
|
for train in trains_dispatched_list:
|
|
#print "train in trains_alloceted", train, ": trains_allocated", trains_allocated
|
|
if train == train_name:
|
|
trains_dispatched.remove(train)
|
|
|
|
def remove_all_trains_from_trains_allocated(self):
|
|
global trains_allocated
|
|
if self.logLevel > 0: print "train to remove", train_name
|
|
|
|
trains_allocated_list = java.util.concurrent.CopyOnWriteArrayList()
|
|
for train in trains_allocated:
|
|
trains_allocated_list.add(train)
|
|
for train in trains_allocated_list:
|
|
if self.logLevel > 0: print "train in trains_allocated", train, ": trains_allocated", trains_allocated
|
|
trains_allocated.remove(train)
|
|
|
|
def remove_all_trains_from_trains_dispatched(self):
|
|
global trains_dispatched
|
|
if self.logLevel > 0: print "train to remove", train_name
|
|
|
|
trains_dispatched_list = java.util.concurrent.CopyOnWriteArrayList()
|
|
for train in trains_dispatched:
|
|
trains_dispatched_list.add(train)
|
|
for train in trains_dispatched_list:
|
|
trains_dispatched.remove(train)
|
|
|
|
def stop_all_threads(self):
|
|
|
|
# perform actions required before stopping threads
|
|
global scheduler_master #global so cas be referenced before killing threads
|
|
# scheduler_master = SchedulerMaster() this has been set in RunDispatchMaster
|
|
scheduler_master.exit()
|
|
|
|
# stop all threads even if there are duplications
|
|
summary = jmri.jmrit.automat.AutomatSummary.instance()
|
|
automatsList = java.util.concurrent.CopyOnWriteArrayList()
|
|
|
|
for automat in summary.getAutomats():
|
|
automatsList.add(automat)
|
|
# print "automatsList", automatsList
|
|
for automat in automatsList:
|
|
# print "automat", automat
|
|
if "StopMaster" not in str(automat): automat.stop()
|
|
# print automat, "stopped"
|
|
# print "automatsList2", automatsList
|
|
# print "end stop_all_threads"
|
|
|
|
def remove_listener(self):
|
|
try:
|
|
#stop the scheduler timebase listener
|
|
if self.logLevel > 0: print "removing listener"
|
|
timebase.removeMinuteChangeListener(TimeListener())
|
|
return False
|
|
except NameError:
|
|
if self.logLevel > 0: print "Name error"
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
def delete_active_transits(self):
|
|
|
|
DF = jmri.InstanceManager.getDefault(jmri.jmrit.dispatcher.DispatcherFrame)
|
|
#DF.setState(DF.ICONIFIED);
|
|
activeTrainsList = DF.getActiveTrainsList()
|
|
|
|
active_trains_list = java.util.concurrent.CopyOnWriteArrayList()
|
|
for activeTrain in activeTrainsList:
|
|
active_trains_list.add(activeTrain)
|
|
|
|
for activeTrain in active_trains_list:
|
|
# print "i", i
|
|
# activeTrain = activeTrainsList.get(i)
|
|
if self.logLevel > 0: print "active train", activeTrain
|
|
DF.terminateActiveTrain(activeTrain, True, False)
|
|
DF = None
|
|
|
|
# set the colours of the tracks back to normal
|
|
LayoutBlockManager=jmri.InstanceManager.getDefault(jmri.jmrit.display.layoutEditor.LayoutBlockManager)
|
|
for block in blocks.getNamedBeanSet():
|
|
layoutBlock = LayoutBlockManager.getLayoutBlock(block)
|
|
if layoutBlock != None:
|
|
layoutBlock.setUseExtraColor(False)
|
|
|
|
|
|
#
|
|
# TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
# #if self.logLevel > 1: print "Section"
|
|
# TransitList = java.util.concurrent.CopyOnWriteArrayList()
|
|
# for transit in TransitManager.getNamedBeanSet():
|
|
# TransitList.add(transit)
|
|
#
|
|
# for transit in TransitList:
|
|
# if self.logLevel > 1: print "deleting Transit ", transit.getUserName()
|
|
# TransitManager.deleteTransit(transit)
|
|
|
|
def remove_values(self, train_name):
|
|
if train_name != None and train_name != "" :
|
|
for block in blocks.getNamedBeanSet():
|
|
if block.getValue() == train_name:
|
|
block.setValue(None)
|
|
|
|
def remove_train_values(self):
|
|
for block in blocks.getNamedBeanSet():
|
|
block.setValue(None)
|
|
|
|
# End of class StopMaster
|
|
|
|
class OffActionMaster(jmri.jmrit.automat.AbstractAutomaton):
|
|
|
|
button_sensors_to_watch = []
|
|
def __init__(self):
|
|
self.logLevel = 0
|
|
|
|
def init(self):
|
|
if self.logLevel > 0: print 'Create OffActionMaster Thread'
|
|
self.get_run_buttons()
|
|
self.get_route_dispatch_buttons()
|
|
|
|
self.button_sensors_to_watch = self.run_stop_sensors
|
|
if self.logLevel > 0: print "button to watch" , str(self.button_sensors_to_watch)
|
|
#wait for one to go inactive
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, INACTIVE)
|
|
|
|
if self.logLevel > 0: print "button went inactive"
|
|
sensor_that_went_inactive = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == INACTIVE][0]
|
|
if self.logLevel > 0: print "sensor_that_went_inactive" , sensor_that_went_inactive
|
|
start_sensor = sensors.getSensor("startDispatcherSensor")
|
|
stop_sensor = sensors.getSensor("stopMasterSensor")
|
|
modify_sensor = sensors.getSensor("modifyMasterSensor")
|
|
if self.logLevel > 0: print "start_sensor" , start_sensor
|
|
if self.logLevel > 0: print "stop_sesor" , stop_sensor
|
|
if sensor_that_went_inactive in self.run_stop_sensors:
|
|
if self.logLevel > 0: print "run stop sensor went inactive"
|
|
|
|
if sensor_that_went_inactive == start_sensor:
|
|
self.sensor_to_look_for = stop_sensor
|
|
if self.logLevel > 0: print "start sensor went inactive"
|
|
if self.logLevel > 0: print "setting stop sensor active"
|
|
stop_sensor.setKnownState(ACTIVE)
|
|
# modify_sensor.setKnownState(ACTIVE)
|
|
# self.waitMsec(5000)
|
|
# if self.logLevel > 0: print "setting start sensor active"
|
|
# start_sensor.setKnownState(ACTICE)
|
|
elif sensor_that_went_inactive == stop_sensor:
|
|
self.sensor_to_look_for = start_sensor
|
|
if self.logLevel > 0: print "stop sensor went inactive"
|
|
if self.logLevel > 0: print "setting start sensor active"
|
|
start_sensor.setKnownState(ACTIVE)
|
|
# self.waitMsec(5000)
|
|
# start_sensor.setKnownState(ACTICE)
|
|
pass#
|
|
|
|
if self.logLevel > 0: print "finished OffActionMaster setup"
|
|
|
|
def setup(self):
|
|
if self.logLevel > 0: print "starting OffActionMaster setup"
|
|
#get dictionary of buttons self.button_dict
|
|
#self.get_route_dispatch_buttons()
|
|
|
|
return True
|
|
|
|
def handle(self):
|
|
if self.logLevel > 0: print "started handle"
|
|
#for pairs of buttons, if one goes off the other is set on
|
|
#self.button_sensors_to_watch = self.run_sensor_to_look_for
|
|
if self.logLevel > 0: print "button to watch" , str(self.button_sensors_to_watch)
|
|
#wait for one to go active
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, INACTIVE)
|
|
#determine which one changed
|
|
if self.logLevel > 0: print "sensor went inactive"
|
|
sensor_that_went_inactive = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == INACTIVE][0]
|
|
|
|
if sensor_that_went_inactive in self.run_stop_sensors:
|
|
if self.logLevel > 0: print "run stop sensor went inactive"
|
|
start_sensor = sensors.getSensor("startDispatcherSensor")
|
|
stop_sensor = sensors.getSensor("stopMasterSensor")
|
|
modify_sensor = sensors.getSensor("modifyMasterSensor")
|
|
if sensor_that_went_inactive == start_sensor:
|
|
self.sensor_to_look_for = stop_sensor
|
|
if self.logLevel > 0: print "start sensor went inactive"
|
|
if self.logLevel > 0: print "setting stop sensor active"
|
|
stop_sensor.setKnownState(ACTIVE)
|
|
# modify_sensor.setKnownState(ACTIVE)
|
|
# self.waitMsec(5000)
|
|
# if self.logLevel > 0: print "setting start sensor active"
|
|
# start_sensor.setKnownState(ACTICE)
|
|
elif sensor_that_went_inactive == stop_sensor:
|
|
self.sensor_to_look_for = start_sensor
|
|
if self.logLevel > 0: print "stop sensor went inactive"
|
|
if self.logLevel > 0: print "setting start sensor active"
|
|
start_sensor.setKnownState(ACTIVE)
|
|
|
|
if self.logLevel > 0: print "end handle"
|
|
#self.waitMsec(20000)
|
|
return False
|
|
|
|
def get_route_dispatch_buttons(self):
|
|
self.setuproute_or_rundispatch_or_setstoppingdistance_sensors = \
|
|
[sensors.getSensor(sensorName) for sensorName in ["setDispatchSensor", "setRouteSensor", "setStoppingDistanceSensor", "setStationWaitTimeSensor", "setStationDirectionSensor"]]
|
|
#self.route_dispatch_states = [self.check_sensor_state(rd_sensor) for rd_sensor in self.setup_route_or_run_dispatch_sensors]
|
|
pass
|
|
|
|
def get_run_buttons(self):
|
|
self.run_stop_sensors = [sensors.getSensor(sensorName) for sensorName in ["startDispatcherSensor"]]
|
|
|
|
|
|
|
|
#DF = None
|
|
|
|
class DispatchMaster(jmri.jmrit.automat.AbstractAutomaton):
|
|
|
|
# Monitors the Station buttons and performs actions dependent upon what mode one is in e.g.:
|
|
# Run Dispatch
|
|
# Setup Route
|
|
# Set stopping Length
|
|
# Set Station Wait Time
|
|
# Set Station Direction
|
|
# Restrict Operation of Transit (only run if a block is not occupied)
|
|
|
|
button_sensors_to_watch = []
|
|
button_dict = {}
|
|
|
|
def __init__(self):
|
|
self.logLevel = 0
|
|
global trains_dispatched
|
|
if "trains_dispatched" not in globals():
|
|
trains_dispatched = []
|
|
self.od = OptionDialog()
|
|
|
|
def init(self):
|
|
if self.logLevel > 0: print 'Create DispatchMaster Thread'
|
|
|
|
|
|
def setup(self):
|
|
#global DF
|
|
|
|
if self.logLevel > 1: print "starting DispatchMaster setup"
|
|
|
|
#get dictionary of buttons self.button_dict
|
|
self.get_buttons()
|
|
#set all move_to buttons inactive
|
|
for sensor in self.button_sensors:
|
|
sensor.setKnownState(INACTIVE)
|
|
#store the values in a clone
|
|
#self.store_button_states()
|
|
# #at moment there are no trains so:
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
|
|
if self.logLevel > 0: print "self.button_sensors_to_watch_init", [str(sensor.getUserName()) for sensor in self.button_sensors_to_watch]
|
|
|
|
self.sensor_active = None
|
|
if self.logLevel > 0: print "finished DispatchMaster setup"
|
|
|
|
#DF = jmri.InstanceManager.getDefault(jmri.jmrit.dispatcher.DispatcherFrame)
|
|
|
|
self.rbm = ResetButtonMaster()
|
|
return True
|
|
|
|
def handle(self):
|
|
|
|
global trains_allocated
|
|
global trains_dispatched
|
|
|
|
#only one button is active. We will keep it that way
|
|
# print "dispatch master"
|
|
if self.logLevel > 0: print "**********************"
|
|
if self.logLevel > 0: print "handle DispatchMaster1"
|
|
#if self.logLevel > 0: print "buttons to watch",[str(sensor.getUserName()) for sensor in self.button_sensors_to_watch]
|
|
if self.logLevel > 0: print "**********************"
|
|
#wait for one to go active
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
|
|
#determine the button
|
|
if self.logLevel > 0: print "sensor went active"
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
if self.logLevel > 0: print "sensor_changed",sensor_changed.getUserName()
|
|
|
|
#find location of that want to move to
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
if self.logLevel > 0: print "button_sensor_name",button_sensor_name
|
|
if self.logLevel > 0: print "button_station_name",button_station_name
|
|
|
|
#set up route, dispatch train or run route
|
|
if self.logLevel > 0: print "!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
setup_dispatch_sensor = sensors.getSensor("setDispatchSensor")
|
|
set_route_sensor = sensors.getSensor("setRouteSensor")
|
|
run_route_sensor = sensors.getSensor("runRouteSensor")
|
|
modify_stopping_length_sensor = sensors.getSensor("setStoppingDistanceSensor")
|
|
modify_station_wait_time_sensor = sensors.getSensor("setStationWaitTimeSensor")
|
|
modify_station_direction_sensor = sensors.getSensor("setStationDirectionSensor")
|
|
modify_stop_sensors_sensor = sensors.getSensor("setStopSensor")
|
|
inhibit_running_transit_if_block_occupied_sensor = sensors.getSensor("setTransitBlockRestrictionSensor")
|
|
if self.logLevel > 0: print "set_route_sensor.getKnownState()",set_route_sensor.getKnownState(),
|
|
self.reset_buttons(button_sensors_to_watch_JavaList)
|
|
if set_route_sensor.getKnownState() == ACTIVE:
|
|
if self.logLevel > 0: print ("set_route")
|
|
test = self.set_route(sensor_changed, button_sensor_name, button_station_name)
|
|
if self.logLevel > 0: print "test = " , test
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
elif setup_dispatch_sensor.getKnownState() == ACTIVE:
|
|
if self.logLevel > 0: print ("dispatch_train")
|
|
self.dispatch_train(sensor_changed, button_sensor_name, button_station_name)
|
|
#self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
elif modify_stopping_length_sensor.getKnownState() == ACTIVE:
|
|
# print "A"
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
if self.modify_individual_stopping_length(sensor_changed, button_sensor_name, button_station_name):
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
else:
|
|
# reset all buttons so we check all of them
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
elif modify_station_wait_time_sensor.getKnownState() == ACTIVE:
|
|
if self.modify_individual_station_wait_time(sensor_changed, button_sensor_name, button_station_name):
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
else:
|
|
#reset all buttons so we check all of them
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
elif modify_station_direction_sensor.getKnownState() == ACTIVE:
|
|
# sensor_changed_saved = sensor_changed
|
|
if self.modify_individual_station_direction(sensor_changed, button_sensor_name, button_station_name):
|
|
# The self.trainInfo files for the express routes need to be regenerated
|
|
# so that the express routes are the shortest path allowed
|
|
ResetButtonMaster().regenerate_traininfo_files("Regenerated TrainInfo Files")
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
else:
|
|
#reset all buttons so we check all of them
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
elif modify_stop_sensors_sensor.getKnownState() == ACTIVE:
|
|
if self.modify_stop_sensors1(sensor_changed, button_sensor_name, button_station_name):
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
else:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
elif inhibit_running_transit_if_block_occupied_sensor.getKnownState() == ACTIVE:
|
|
if self.restrict_transit_operation(sensor_changed, button_sensor_name, button_station_name):
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
#ensure that we can press inhibit_running_transit_if_block_occupied_sensor
|
|
#self.rbm.switch_sensors_requiring_station_buttons(inhibit_running_transit_if_block_occupied_sensor, "sensor_off")
|
|
else:
|
|
#reset all buttons so we check all of them
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
else:
|
|
title = "station button error"
|
|
msg = "select one of 'Run Dispatch', 'Setup Route', 'Set Stopping Length', 'Set Station Wait Time' \nfor the station buttons to have effect"
|
|
self.od.displayMessage(msg,title)
|
|
pass
|
|
|
|
if self.logLevel > 0: print "end handle1"
|
|
self.waitMsec(1000)
|
|
# print "end dispatch master"
|
|
return True
|
|
|
|
def reset_buttons(self, button_sensors_to_watch_JavaList):
|
|
#print "resetting buttons", button_sensors_to_watch_JavaList
|
|
for button in button_sensors_to_watch_JavaList:
|
|
button.setKnownState(INACTIVE)
|
|
|
|
|
|
def set_route(self, sensor_changed, button_sensor_name, button_station_name):
|
|
|
|
sensor_changed.setKnownState(ACTIVE) #put the state of the button back to active so we can see it
|
|
no_stations_chosen = 1
|
|
RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
|
|
route = RouteManager.newRoute("temp_name")
|
|
|
|
LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
|
|
location = LocationManager.newLocation(button_station_name)
|
|
#print "addLocation1", location
|
|
route.addLocation(location)
|
|
|
|
|
|
first_station = button_station_name
|
|
prev_station = first_station
|
|
last_station = first_station
|
|
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
selected_actions = []
|
|
stop_mode = None
|
|
complete = False
|
|
i = 0
|
|
while complete == False:
|
|
i +=1
|
|
#select station start
|
|
no_stations_chosen = i+1
|
|
if self.logLevel > 0: print ("In loop")
|
|
opt1 = "Select another station"
|
|
opt2 = "Complete Route"
|
|
opt3 = "Set action to run in this station"
|
|
opt4 = "Specify Stopping Mode at Station"
|
|
if i == 1:
|
|
msg = "Start of Route Selectiom"
|
|
msg = msg + "\nselected station " + button_station_name + "."
|
|
title = "Continue selecting stations?"
|
|
s = self.od.customQuestionMessage2str(msg, title, opt1, opt3)
|
|
else:
|
|
msg = "selected station " + button_station_name + ". \n"
|
|
if selected_actions != None and selected_actions != []:
|
|
msg += " and actions " + ", ".join(selected_actions) + "\n"
|
|
msg += "Have you more stations on route?"
|
|
title = "Continue selecting stations"
|
|
if prev_station == last_station: # start of route
|
|
s = self.od.customQuestionMessage3str(msg,title, opt1, opt2, opt3)
|
|
else:
|
|
transit_name = self.get_transit_name(prev_station, last_station)
|
|
if self.forward_stopping_sensor_exists(transit_name):
|
|
routeLocation = route.getLastLocationByName(button_station_name)
|
|
if stop_mode == None:
|
|
self.save_stop_mode("Use Default", routeLocation) # set default option
|
|
s = self.od.customQuestionMessage4str(msg,title, opt1, opt2, opt3, opt4)
|
|
else:
|
|
s = self.od.customQuestionMessage3str(msg,title, opt1, opt2, opt3)
|
|
|
|
if self.od.CLOSED_OPTION == True:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
RouteManager.deregister(route)
|
|
return
|
|
elif s == opt1:
|
|
selected_actions = []
|
|
self.get_buttons()
|
|
# self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
# self.button_sensors_to_watch.remove(sensor_changed)
|
|
prev_sensor_changed = sensor_changed
|
|
prev_station = last_station
|
|
[last_station, sensor_changed] = self.wait_for_button(prev_sensor_changed)
|
|
button_station_name = last_station
|
|
location = LocationManager.newLocation(button_station_name)
|
|
routeLocation = route.addLocation(location)
|
|
loc = route.getLastLocationByName(button_station_name)
|
|
stop_mode = None
|
|
elif s == opt2:
|
|
complete = True
|
|
elif s == opt3:
|
|
selected_actions = self.add_actions(route,LocationManager, button_station_name, no_stations_chosen, selected_actions)
|
|
complete = False
|
|
i -= 1
|
|
elif s == opt4:
|
|
stop_mode = self.get_stop_mode()
|
|
routeLocation = route.getLastLocationByName(button_station_name)
|
|
if stop_mode != None:
|
|
self.save_stop_mode(stop_mode, routeLocation)
|
|
complete = False
|
|
Firstloop = False
|
|
|
|
|
|
route_name_prefix = first_station + "_to_" + last_station
|
|
route_name = route_name_prefix
|
|
i = 0
|
|
while RouteManager.getRouteByName(route_name) != None:
|
|
i+=1
|
|
route_name = route_name_prefix + "_" + str(i)
|
|
route.setName(route_name)
|
|
msg = "completed route " + route_name + ". you may see the route by clicking View/Edit Routes."
|
|
opt1 = "Create another route"
|
|
opt2 = "Finish selecting routes"
|
|
opt3 = "View Route"
|
|
reply = self.od.customQuestionMessage2str(msg, title, opt1, opt2)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
if reply == opt3:
|
|
self.show_routes()
|
|
elif reply == opt1:
|
|
self.save_routes()
|
|
elif reply == opt2:
|
|
self.save_routes()
|
|
set_route_sensor = sensors.getSensor("setRouteSensor")
|
|
ResetButtonMaster().switch_sensors_requiring_station_buttons(set_route_sensor, "sensor_off")
|
|
self.reset_selection_buttons()
|
|
if self.logLevel > 0: print ("terminated dispatch")
|
|
return True
|
|
|
|
def get_transit_name(self, station_from_name, station_to_name):
|
|
StateVertex_start = station_from_name
|
|
StateVertex_end = station_to_name
|
|
|
|
if g.g_express.containsVertex(StateVertex_start) and g.g_express.containsVertex(StateVertex_end):
|
|
paths = DijkstraShortestPath.findPathBetween(g.g_express, StateVertex_start, StateVertex_end)
|
|
else:
|
|
OptionDialog().displayMessage("You have an old route with a station that does not exist. \n Delete it!!")
|
|
return None
|
|
e = paths[paths.size()-1]
|
|
traininfoFileName = self.get_filename(e, "fwd")
|
|
trainInfo = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(traininfoFileName)
|
|
transit_name = trainInfo.getTransitName()
|
|
return transit_name
|
|
|
|
def forward_stopping_sensor_exists(self, transit_name):
|
|
forward_stopping_sensor = self.forward_stopping_sensor(transit_name)
|
|
if forward_stopping_sensor != None:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def forward_stopping_sensor(self, transit_name):
|
|
transit = transits.getTransit(transit_name)
|
|
transit_section_list = transit.getTransitSectionList()
|
|
transit_section = transit_section_list[transit.getMaxSequence()-1]
|
|
section = transit_section.getSection()
|
|
forward_stopping_sensor = section.getForwardStoppingSensor()
|
|
return forward_stopping_sensor
|
|
|
|
def wait_for_button(self, prev_sensor_changed):
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
if prev_sensor_changed in self.button_sensors_to_watch:
|
|
self.button_sensors_to_watch.remove(prev_sensor_changed)
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
prev_sensor_changed.setKnownState(INACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
return [button_station_name, sensor_changed]
|
|
|
|
def get_stop_mode(self):
|
|
title = "Set Stop mode"
|
|
|
|
msg = "set Stop mode"
|
|
opt1 = "Use Stop Sensor"
|
|
opt2 = "Use Default"
|
|
opt3 = "Use Speed Profile"
|
|
reply = self.od.customQuestionMessage3str(msg,title,opt1,opt2,opt3)
|
|
return reply
|
|
|
|
def save_stop_mode(self, stop_mode, location):
|
|
# if stop_mode != "Use Default":
|
|
self.set_value_in_comment(location, stop_mode, "stopMode")
|
|
|
|
def set_value_in_comment(self, location, value, duration_string):
|
|
comment = location.getComment() #Null
|
|
if comment == None:
|
|
comment = ""
|
|
delim_start = "[" + duration_string + "-"
|
|
delim_end = "-" + duration_string + "]"
|
|
comment = self.insert_between(comment, delim_start, delim_end, value)
|
|
location.setComment(comment)
|
|
|
|
def insert_between(self, string, delim1, delim2, value):
|
|
first, _, rest = string.partition(delim1)
|
|
_, _, rest = rest.partition(delim2)
|
|
|
|
# print "string", string, "first.strip()", first.strip(), "rest.strip()", rest.strip()
|
|
new_val = delim1 + str(value) + delim2
|
|
modified_text = new_val.join([first.strip(), rest.strip()])
|
|
# print "modified_text",modified_text
|
|
|
|
# print "given", string , "insert" , new_val, "result" , modified_text
|
|
return modified_text
|
|
|
|
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 add_actions(self, route, LocationManager, button_station_name, no_stations_chosen, selected_actions):
|
|
directory1 = self.action_directory_in_DispatcherSystem()
|
|
files = os.listdir(directory1)
|
|
# print "files in dispatcher system action directory", files
|
|
|
|
python_files = [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 = [f for f in files if f.endswith(".py")]
|
|
# print "directory", directory, "python_files2", python_files2
|
|
python_files.extend(python_files2)
|
|
# print "directory", directory, "python_files", python_files
|
|
# display the list to select the required python file
|
|
if python_files == []:
|
|
lines = ["No action files available\n" ,
|
|
"You have not set the Jython script location correctly.\n",
|
|
"It is pointing to:\n",
|
|
directory1,
|
|
"\n\nThere are some default files in the Jython Script area or you can write your own ",
|
|
"and put them in your user area.\nSee the documentation."]
|
|
msg = "".join(lines)
|
|
self.od.displayMessage(msg)
|
|
return ["none selected yet"]
|
|
else:
|
|
select_action_file = True
|
|
iteration = 1
|
|
# selected_actions = []
|
|
while select_action_file:
|
|
if iteration == 0:
|
|
msg = "select action file \n(must be in directory " + directory + " )"
|
|
python_file = modifiableJComboBox(python_files,msg).return_val()
|
|
self.add_python_file_to_route(python_file, route, LocationManager)
|
|
selected_actions.append(python_file)
|
|
else:
|
|
if selected_actions == []:
|
|
selected_actions1 = ["none selected yet"]
|
|
else:
|
|
selected_actions1 = selected_actions
|
|
title = "selected " + ','.join(selected_actions1)
|
|
if iteration == 1:
|
|
opt1 = "select action file"
|
|
else:
|
|
opt1 = "select another action file"
|
|
opt2 = "finished adding action files"
|
|
options = [opt1, opt2]
|
|
[python_file, option, index] = OptionDialog().ListOptions(python_files, title, options)
|
|
if option == opt1:
|
|
selected_actions.append(python_file)
|
|
self.add_python_file_to_route(python_file, route, LocationManager)
|
|
elif option == opt2:
|
|
select_action_file = False
|
|
iteration += 1
|
|
# what_to_do = self.check_whether_select_another_station(button_station_name, selected_actions, no_stations_chosen)
|
|
return selected_actions
|
|
|
|
def add_python_file_to_route(self, python_file, route, LocationManager):
|
|
location = LocationManager.newLocation(python_file)
|
|
route.addLocation(location)
|
|
|
|
def check_whether_select_another_station(self, button_station_name, selected_actions, no_of_stations_chosen):
|
|
if no_of_stations_chosen == 1:
|
|
msg = "selected station " + button_station_name + ". \n" + \
|
|
" and actions " + ", ".join(selected_actions) + "\n" + \
|
|
"Continue with selecting route?"
|
|
else:
|
|
msg = "selected station " + button_station_name + ". \n" + \
|
|
" and actions " + ", ".join(selected_actions) + "\n" + \
|
|
"Have you more stations on route?"
|
|
title = "Continue selecting stations"
|
|
|
|
opt1 = "Select another station"
|
|
opt2 = "Complete Route"
|
|
opt3 = 'cancel'
|
|
|
|
if no_of_stations_chosen == 1:
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt3)
|
|
if s == self.od.CLOSED_OPTION:
|
|
return 'cancel'
|
|
if s == opt1:
|
|
return 'continue'
|
|
if s == opt3:
|
|
return 'cancel'
|
|
|
|
else:
|
|
s = self.od.customQuestionMessage3str(msg,title,opt1,opt2,opt3)
|
|
if s == self.od.CLOSED_OPTION:
|
|
return 'cancel'
|
|
if s == opt1:
|
|
return 'continue'
|
|
if s == opt2:
|
|
return 'complete'
|
|
if s == opt3:
|
|
return 'cancel'
|
|
|
|
def show_routes(self):
|
|
a = jmri.jmrit.operations.routes.RoutesTableAction()
|
|
a.actionPerformed(None)
|
|
|
|
def save_routes(self):
|
|
jmri.jmrit.operations.OperationsXml.save()
|
|
|
|
def modify_individual_stopping_length(self, sensor_changed, button_sensor_name, button_station_name):
|
|
msg = "selected station " + button_station_name + ". \nSelect the next station to modify the stopping length?"
|
|
title = "Select next Station"
|
|
|
|
opt1 = "Select next station"
|
|
opt2 = "Cancel stopping length modification"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if s == opt2:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#set name of route
|
|
if self.logLevel > 0: print ("in modify stopping length")
|
|
|
|
# #modify stopping length
|
|
# RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
|
|
# route = RouteManager.newRoute("temp_name")
|
|
#
|
|
# LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
|
|
# #if self.logLevel > 0: print "button_station_name", button_station_name
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
first_station = button_station_name
|
|
station_from = first_station
|
|
last_station = first_station
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
complete = False
|
|
while complete == False:
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
# route.addLocation(location)
|
|
last_station = button_station_name
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
|
|
for e in g.g_express.edgeSet():
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
break
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
msg = "selected transit " + filename_fwd + ". \nDo you wish to modify the stopping length fraction ?"
|
|
title = "Continue selecting stations"
|
|
|
|
opt1 = "Cancel Stopping length modification"
|
|
opt2 = "Modify length"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
# sensors.getSensor("setStoppingDistanceSensor").setKnownState(INACTIVE)
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
elif s == opt1:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
# sensors.getSensor("setStoppingDistanceSensor").setKnownState(INACTIVE)
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
if s == opt2:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
complete = True
|
|
Firstloop = False
|
|
self.get_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
|
|
self.set_stopping_length_fraction(found_edge)
|
|
|
|
def set_stopping_length_fraction(self,found_edge):
|
|
|
|
#go to this bit when complete == True
|
|
print "found_edge", found_edge
|
|
# get length of last section of transit
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
trainInfo_fwd = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_fwd)
|
|
last_section = self.last_section_of_transit(trainInfo_fwd)
|
|
length_of_last_section = float(self.length_of_last_section(last_section))/10.0 # length in cm
|
|
overall_stopping_distance = ResetButtonMaster().get_overall_stopping_distance()
|
|
overall_stopping_distance_str = str(int(overall_stopping_distance))
|
|
[e, previous_stopping_position] = self.get_stopping_position(found_edge)
|
|
# print "V", [e, previous_stopping_position]
|
|
# print "type", type(previous_stopping_position)
|
|
default_value = round(float(previous_stopping_position),1) + round(float(overall_stopping_distance),1)
|
|
print "default_value", default_value
|
|
# stopping_fraction = self.get_stopping_fraction(stopping_position, length_of_last_section)
|
|
title = "Stop train before end of section"
|
|
msg = "Transit name: " + str(filename_fwd) + \
|
|
".\n" + \
|
|
"\nLength of last section: " + str(round(length_of_last_section, 1)) + " cm " + \
|
|
" (" + str(round(length_of_last_section/2.54, 1)) + " inches)" + \
|
|
"\nPrevious stopping position: " + str(round(float(default_value),1)) + " cm " + \
|
|
" (" + str(round(float(default_value)/2.54, 1)) + " inches )" + \
|
|
"\nbefore the calculated stopping position" + \
|
|
"\nthis includes an overall_stopping_distance of " + overall_stopping_distance_str + "cm" + \
|
|
"\n\nEnter new total stopping position in cm:"
|
|
while True:
|
|
new_total_stopping_position = self.od.input(msg, title, default_value)
|
|
try:
|
|
value = float(new_total_stopping_position)
|
|
break # success
|
|
except ValueError:
|
|
JOptionPane.showMessageDialog(
|
|
None,
|
|
"Please enter a valid number.",
|
|
"Invalid Input",
|
|
JOptionPane.ERROR_MESSAGE
|
|
)
|
|
|
|
new_stopping_position = float(new_total_stopping_position) - overall_stopping_distance
|
|
|
|
if new_stopping_position == None: return
|
|
|
|
# save the new stopping length position
|
|
self.save_stopping_position(found_edge, new_stopping_position)
|
|
sensors.getSensor("stoppingDistanceSet").setKnownState(ACTIVE) # allow the waiting process to continue
|
|
return True
|
|
|
|
def get_default_stopping_position(self):
|
|
return 0
|
|
|
|
def save_stopping_position(self, edge, stopping_position):
|
|
folder = "stopping_positions"
|
|
filename = "stopping_positions.txt"
|
|
# print "A"
|
|
my_list = self.read_list(folder, filename)
|
|
# print "B"
|
|
new_tuple = [edge, stopping_position]
|
|
# print "C new_tuple", new_tuple
|
|
my_list = self.update_list(my_list, new_tuple)
|
|
# print "D", my_list
|
|
self.write_list(my_list, folder, filename)
|
|
# print "E"
|
|
|
|
def update_list(self, my_list, new_tuple):
|
|
# print "new-tuple", new_tuple
|
|
new_tuple = str(new_tuple[0]), int(float(new_tuple[1]))
|
|
# print "new-tuple2", new_tuple
|
|
edge, b = new_tuple
|
|
# print "edge", edge, "b", b
|
|
# print "my_list", my_list
|
|
# if my_list == [["",""]] or my_list == [] or my_list == ["", ""]:
|
|
if my_list == ["", ""]:
|
|
# print "xx my_list", my_list
|
|
my_list = [new_tuple] # Append if not found
|
|
# print "my_list2", my_list
|
|
return my_list
|
|
for i, (x, _) in enumerate(my_list):
|
|
if x == edge:
|
|
my_list[i] = new_tuple # Replace existing tuple
|
|
# print "my_list3", my_list
|
|
break
|
|
else:
|
|
my_list.append(new_tuple) # Append if not found
|
|
# print "my_list4", my_list
|
|
# print "my_list5", my_list
|
|
return my_list
|
|
|
|
def get_stopping_position(self, edge_ref,):
|
|
folder = "stopping_positions"
|
|
filename = "stopping_positions.txt"
|
|
# print "X"
|
|
my_list = self.read_list(folder, filename)
|
|
# print "X1", my_list
|
|
if my_list == ["",""]:
|
|
# print "a", [edge_ref, 0]
|
|
return [edge_ref, 0]
|
|
for edge, stopping_position in my_list:
|
|
# print "edge", edge, "edge_ref", edge_ref
|
|
if str(edge) == str(edge_ref):
|
|
# print "b"
|
|
return [edge_ref, stopping_position]
|
|
# print "x2"
|
|
#if stopping position is not saved return 0
|
|
return [edge_ref, 0]
|
|
|
|
def get_stopping_positions(self):
|
|
|
|
folder = "stopping_positions"
|
|
filename = "stopping_positions.txt"
|
|
|
|
stopping_position_list = self.read_list(folder, filename)
|
|
|
|
if stopping_position_list == ["",""]:
|
|
return []
|
|
else:
|
|
return stopping_position_list
|
|
|
|
def get_stopping_positions_desc(self):
|
|
|
|
overall_stopping_distance = ResetButtonMaster().get_overall_stopping_distance()
|
|
|
|
folder = "stopping_positions"
|
|
filename = "stopping_positions.txt"
|
|
|
|
stopping_position_list = self.read_list(folder, filename)
|
|
|
|
if stopping_position_list == ["",""]:
|
|
return []
|
|
else:
|
|
stopping_position_list = ["direction: " + str(edge) + ": extra " + str(stop_pos) + " cm total: " + str(int(stop_pos) + int(overall_stopping_distance)) + " cm" for edge, stop_pos in stopping_position_list ]
|
|
return stopping_position_list
|
|
|
|
def directory(self, folder):
|
|
path = jmri.util.FileUtil.getUserFilesPath() + "dispatcher" + java.io.File.separator + folder
|
|
if not os.path.exists(path):
|
|
os.makedirs(path)
|
|
return path + java.io.File.separator
|
|
|
|
def write_list(self, a_list, folder, filename):
|
|
# print "write_list", a_list
|
|
# store list in binary file so 'wb' mode
|
|
file = self.directory(folder) + filename
|
|
# print "block_info" , a_list
|
|
# print "file" + file
|
|
with open(file, 'wb') as fp:
|
|
for items in a_list:
|
|
# print "items", items
|
|
i = 0
|
|
for item in items:
|
|
# print "item i", i, item
|
|
fp.write('%s' %item)
|
|
if i == 0: fp.write(",")
|
|
i+=1
|
|
fp.write('\n')
|
|
#fp.write('\n'.join(item))
|
|
#fp.write(items)
|
|
|
|
# Read list to memory
|
|
def read_list(self, folder, filename):
|
|
# for reading also binary mode is important
|
|
# print "read_list"
|
|
file = self.directory(folder) + filename
|
|
# print "file " , file
|
|
n_list = []
|
|
try:
|
|
with open(file, 'rb') as fp:
|
|
for line in fp:
|
|
x = line[:-1]
|
|
# print "x", x
|
|
y = x.split(",")
|
|
# print "y" , y
|
|
n_list.append(y)
|
|
return n_list
|
|
except:
|
|
return ["", ""]
|
|
|
|
def modify_individual_station_wait_time(self, sensor_changed, button_sensor_name, button_station_name):
|
|
msg = "selected station " + button_station_name + ". \nSelect the next station to modify the station wait time?"
|
|
title = "Select next Station"
|
|
|
|
opt1 = "Select next station"
|
|
opt2 = "Cancel station wait time modification"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if s == opt2:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#set name of route
|
|
if self.logLevel > 0: print ("in modify station wait time")
|
|
|
|
# #modify stopping length
|
|
# RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
|
|
# route = RouteManager.newRoute("temp_name")
|
|
#
|
|
# LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
|
|
# #if self.logLevel > 0: print "button_station_name", button_station_name
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
first_station = button_station_name
|
|
last_station = first_station
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
complete = False
|
|
while complete == False:
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
# route.addLocation(location)
|
|
last_station = button_station_name
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
|
|
for e in g.g_express.edgeSet():
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
break
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
msg = "selected station " + button_station_name + ". \nDo you wish to modify the station wait time ?"
|
|
title = "Continue selecting stations"
|
|
|
|
opt1 = "Cancel Station Wait Time modification"
|
|
opt2 = "Modify station wait time"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
sensors.getSensor("setStationWaitTimeSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
elif s == opt1:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
sensors.getSensor("setStationWaitTimeSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
if s == opt2:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
complete = True
|
|
Firstloop = False
|
|
self.get_buttons()
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
|
|
#go to this bit when complete == True
|
|
|
|
#get traininfo and stopping fraction
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
trainInfo_fwd = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_fwd)
|
|
station_wait_time = trainInfo_fwd.getWaitTime()
|
|
|
|
default_value = round(station_wait_time,1)
|
|
title = "Pause train at beginning of section"
|
|
msg = "Transit name: " + str(filename_fwd) + \
|
|
".\nStation Wait Time is: " + str(round(station_wait_time,2)) + \
|
|
"\n\nEnter new station wait time in secs:"
|
|
new_station_wait_time = self.od.input(msg, title, default_value)
|
|
if new_station_wait_time == None: return
|
|
msg = "new Station Wait Time: "+ str(round(float(new_station_wait_time),1))
|
|
self.od.displayMessage(msg)
|
|
trainInfo_fwd.setWaitTime(float(new_station_wait_time))
|
|
|
|
#write the newtraininfo back to file
|
|
jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(trainInfo_fwd, filename_fwd)
|
|
|
|
#do same with reverse
|
|
filename_rvs = self.get_filename(found_edge, "rvs")
|
|
trainInfo_rvs = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_rvs)
|
|
#stopping_fraction = trainInfo_rvs.getStopBySpeedProfileAdjust()
|
|
trainInfo_rvs.setWaitTime(float(new_station_wait_time))
|
|
|
|
#write the newtraininfo back to file
|
|
jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(trainInfo_rvs, filename_rvs)
|
|
|
|
if self.logLevel > 0: print "saved new station wait time", float(new_stopping_fraction)
|
|
|
|
return True
|
|
|
|
def modify_stop_sensors1(self, sensor_changed, button_sensor_name, button_station_name):
|
|
msg = "selected station " + button_station_name + ". \nSelect the next station to modify the stop sensor?"
|
|
title = "Select next Station"
|
|
|
|
opt1 = "Select next station"
|
|
opt2 = "Cancel stop sensor modification"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if s == opt2:
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#set name of route
|
|
if self.logLevel > 0: print ("in modify stopping length")
|
|
|
|
# #modify stopping length
|
|
# RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
|
|
# route = RouteManager.newRoute("temp_name")
|
|
#
|
|
# LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
|
|
# #if self.logLevel > 0: print "button_station_name", button_station_name
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
first_station = button_station_name
|
|
station_from = first_station
|
|
last_station = first_station
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
complete = False
|
|
while complete == False:
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
# route.addLocation(location)
|
|
last_station = button_station_name
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
|
|
for e in g.g_express.edgeSet():
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
break
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
msg = "selected transit " + filename_fwd + ". \nDo you wish to set the stop sensor ?"
|
|
title = "Continue selecting stations"
|
|
|
|
opt1 = "Cancel setting Stop Sensor"
|
|
opt2 = "Set Stop Sensor"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
# sensors.getSensor("setStoppingDistanceSensor").setKnownState(INACTIVE)
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
elif s == opt1:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
# sensors.getSensor("setStoppingDistanceSensor").setKnownState(INACTIVE)
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
if s == opt2:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
complete = True
|
|
Firstloop = False
|
|
self.get_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
|
|
#go to this bit when complete == True
|
|
|
|
#get traininfo and stopping fraction
|
|
# print "A"
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
trainInfo_fwd = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_fwd)
|
|
# stopping_fraction = trainInfo_fwd.getStopBySpeedProfileAdjust()
|
|
|
|
# set the stop sensor
|
|
last_section = self.last_section_of_transit(trainInfo_fwd)
|
|
# print "last section", last_section
|
|
sensor_name = self.choose_stop_sensor(last_section)
|
|
# print "sensor_name", sensor_name
|
|
last_section.setForwardStoppingSensorName(sensor_name)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.reset_selection_buttons() #set/reset a dummy sensor to reset the buttons
|
|
return True
|
|
|
|
|
|
def choose_stop_sensor(self, section):
|
|
title = "set stop sensor for section " + section.getUserName()
|
|
list_items = [sensor.getUserName() \
|
|
for sensor in sensors.getNamedBeanSet() \
|
|
if sensor.getUserName() != None and not sensor.getUserName().startswith("IY:AUTO")]
|
|
list_items.sort()
|
|
if self.logLevel > 1: print "list_items", list_items
|
|
options = ["choose stop sensor","fred"]
|
|
ans = modifiableJComboBox(list_items, title).return_val()
|
|
|
|
if self.logLevel > 1: print "option", ans
|
|
sensor= sensors.getSensor(str(ans))
|
|
if self.logLevel > 1: print "sensor", sensor.getUserName()
|
|
return str(ans)
|
|
|
|
def modify_individual_station_direction(self, sensor_changed, button_sensor_name, button_station_name):
|
|
global g
|
|
msg = "selected station " + button_station_name + ". \nSelect the next station to modify the station direction?"
|
|
title = "Select next Station"
|
|
|
|
opt1 = "Select next station"
|
|
opt2 = "Cancel station direction modification"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
return False
|
|
if s == opt2:
|
|
return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#set name of route
|
|
if self.logLevel > 0: print ("in modify station direction")
|
|
|
|
first_station = button_station_name
|
|
last_station = first_station
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
complete = False
|
|
while complete == False:
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name = sensor_changed.getUserName()
|
|
button_station_name = self.get_block_name_from_button_sensor_name(button_sensor_name)
|
|
|
|
# We now have the blocks we want to use, provided the station blocks are next to each other.
|
|
# Probably they are not,
|
|
# so we need to find the two adjacent blocks on the route between the two station blocks
|
|
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
# route.addLocation(location)
|
|
last_station = button_station_name
|
|
|
|
# print "last station", last_station , "first station", first_station, "button_sensor_name", button_sensor_name, "button_station_name", button_station_name
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
done = False
|
|
for e in g.g_express.edgeSet():
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
# print "from_station_name",str(from_station_name), "to_station_name", str(to_station_name)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
# print "breaking ", "last station", last_station , "first station", first_station, "button_sensor_name", button_sensor_name, "button_station_name", button_station_name
|
|
# print "breaking from_station_name",str(from_station_name), "to_station_name", str(to_station_name)
|
|
done = True
|
|
break
|
|
if done == False:
|
|
done1 = False
|
|
for e in g.g_express.edgeSet():
|
|
to_station_name = g.g_stopping.getEdgeSource(e)
|
|
from_station_name = g.g_stopping.getEdgeTarget(e)
|
|
# print "from_station_name",str(from_station_name), "to_station_name", str(to_station_name)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
# print "breaking ", "last station", last_station , "first station", first_station, "button_sensor_name", button_sensor_name, "button_station_name", button_station_name
|
|
# print "breaking from_station_name", from_station_name, "to_station_name", to_station_name
|
|
done1 = True
|
|
break
|
|
if done1 == False:
|
|
msg = "there is no direct route between " + to_station_name + " and " + from_station_name + \
|
|
"\nThis is probably because the route is not allowed due to missing signal masts\n" + \
|
|
"Please select two other stations"
|
|
self.od.displayMessage(msg,title)
|
|
self.get_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
return
|
|
|
|
# filename_fwd = self.get_filename(found_edge, "fwd")
|
|
# filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
msg = "selected station " + button_station_name + ". \nDo you wish to modify the station direction ?"
|
|
title = "Continue selecting stations"
|
|
|
|
opt1 = "Allow only the direction from " + from_station_name + " towards " + str(to_station_name)
|
|
opt2 = "Allow only the direction from " + to_station_name + " towards " + from_station_name
|
|
opt3 = "Allow 2-way working "
|
|
|
|
s = self.od.customQuestionMessage3str(msg,title,opt1,opt2, opt3)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
sensors.getSensor("setStationDirectionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
elif s == opt1:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
first_two_blocks = self.getFirstTwoBlocksInAllowedDirection(e, first_station)
|
|
first_two_blocks = self.swapPositions(first_two_blocks,0,1)
|
|
list_of_inhibited_blocks = self.store_the_two_blocks(first_two_blocks)
|
|
g = StationGraph() # recalculate the weights on the edges
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
return True
|
|
if s == opt2:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
first_two_blocks = self.getFirstTwoBlocksInAllowedDirection(e, first_station)
|
|
list_of_inhibited_blocks = self.store_the_two_blocks(first_two_blocks)
|
|
g = StationGraph() # recalculate the weights on the edges
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
return True
|
|
if s == opt3:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
first_two_blocks = self.getFirstTwoBlocksInAllowedDirection(e, first_station)
|
|
list_of_inhibited_blocks = self.remove_the_two_blocks(first_two_blocks)
|
|
first_two_blocks = self.swapPositions(first_two_blocks,0,1)
|
|
list_of_inhibited_blocks = self.remove_the_two_blocks(first_two_blocks) #remove from file
|
|
g = StationGraph() # recalculate the weights on the edges
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
return True
|
|
Firstloop = False
|
|
self.get_buttons()
|
|
self.reset_selection_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
|
|
def restrict_transit_operation(self, sensor_changed, button_sensor_name, button_station_name):
|
|
msg = "selected station " + button_station_name + ". \nSelect the next station to restrict operation of transit?"
|
|
title = "Select next Station"
|
|
opt1 = "Select next station"
|
|
opt2 = "Cancel station transit restriction"
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
return False
|
|
if s == opt2:
|
|
return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#set name of route
|
|
if self.logLevel > 0: print ("in restrict transit")
|
|
|
|
# #modify stopping length
|
|
# RouteManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.routes.RouteManager)
|
|
# route = RouteManager.newRoute("temp_name")
|
|
#
|
|
# LocationManager=jmri.InstanceManager.getDefault(jmri.jmrit.operations.locations.LocationManager)
|
|
# #if self.logLevel > 0: print "button_station_name", button_station_name
|
|
# location = LocationManager.newLocation(button_station_name)
|
|
first_station = button_station_name
|
|
last_station = first_station
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
complete = False
|
|
while complete == False:
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed1 = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name1 = sensor_changed1.getUserName()
|
|
button_station_name1 = self.get_block_name_from_button_sensor_name(button_sensor_name1)
|
|
|
|
last_station = button_station_name1
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
found_edge = None
|
|
for e in g.g_express.edgeSet():
|
|
from_station_name = g.g_stopping.getEdgeSource(e)
|
|
to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
if from_station_name == first_station and to_station_name == last_station:
|
|
found_edge = e
|
|
break
|
|
|
|
success = True
|
|
if found_edge == None:
|
|
msg = "selected station " + first_station + ". \nCannot be reached from " + last_station
|
|
title = "Error"
|
|
opt1 = "Try Again: Select second Station Again"
|
|
opt2 = "Cancel station transit restriction"
|
|
s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
if self.od.CLOSED_OPTION == True:
|
|
return False
|
|
if s == opt2:
|
|
return False
|
|
if s == opt1:
|
|
sensors.getSensor(sensor_changed1.getUserName()).setKnownState(INACTIVE)
|
|
success = False
|
|
|
|
if success:
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
msg = "selected station " + button_station_name + ". \nDo you wish to set the block that must be clear for the transit to run ?"
|
|
title = "Select Option"
|
|
|
|
opt2 = "Select Station to Select its Block"
|
|
opt1 = "Cancel: Choose another transit"
|
|
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt2,opt1)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed1.setKnownState(INACTIVE)
|
|
sensors.getSensor("setTransitBlockRestrictionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
elif s == opt1: #cancel
|
|
sensor_changed1.setKnownState(INACTIVE)
|
|
sensors.getSensor("setTransitBlockRestrictionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
if s == opt2: #proceed
|
|
sensor_changed1.setKnownState(INACTIVE)
|
|
#choose another station block: the dependent station block. The transit set by the first two station blocks only runs if the last station block is free
|
|
[result, sensor_changed, button_sensor_name2, button_station_name2] = \
|
|
self.set_transit_block(sensor_changed, button_sensor_name, button_station_name, \
|
|
sensor_changed1, button_sensor_name1, button_station_name1)
|
|
if result == False:
|
|
sensor_changed1.setKnownState(INACTIVE)
|
|
sensors.getSensor("setTransitBlockRestrictionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return False
|
|
else:
|
|
complete = True
|
|
Firstloop = False
|
|
|
|
sensor_to_change = sensors.getSensor("setTransitBlockRestrictionSensor")
|
|
self.rbm.switch_sensors_requiring_station_buttons(sensor_to_change, "sensor_off")
|
|
self.reset_selection_buttons()
|
|
self.get_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
#self.button_sensors_to_watch.remove(sensor_changed)
|
|
sensor_to_change.setKnownState(INACTIVE)
|
|
|
|
#go to this bit when complete == True
|
|
|
|
# new code
|
|
# write aquired information to file
|
|
|
|
|
|
# # set transit block
|
|
filename_fwd = self.get_filename(found_edge, "fwd")
|
|
transit_name = re.sub(r'_\d+_fwd\.xml$', '', filename_fwd)
|
|
|
|
transit_block_name = button_station_name2
|
|
|
|
transit_tuple = [transit_name, transit_block_name]
|
|
|
|
self.store_the_restricted_transit(transit_tuple)
|
|
|
|
# self.write_to_TrainInfo(found_edge, new_transit_block_name)
|
|
|
|
if self.logLevel > 0: print "saved new block_name for Transit", new_transit_block_name
|
|
|
|
return True
|
|
|
|
def store_the_restricted_transit(self, new_restricted_transit):
|
|
folder = "restrictTransits"
|
|
filename = "restrictTransits.txt"
|
|
restricted_transits = self.read_list(folder,filename)
|
|
if restricted_transits == ["",""]:
|
|
restricted_transits = []
|
|
print "restricted_transits", restricted_transits
|
|
print "new_restricted_transit", new_restricted_transit
|
|
existing = restricted_transits
|
|
to_add = new_restricted_transit
|
|
|
|
print "to_add", to_add
|
|
remove_key = new_restricted_transit[0]
|
|
print "remove_key", remove_key
|
|
# remove any similar transit
|
|
if existing != []:
|
|
existing = [t for t in existing if t[0] not in remove_key]
|
|
print "existing", existing
|
|
# add the new transit
|
|
existing.append(to_add)
|
|
print "existing1", existing
|
|
self.write_list(existing, folder, filename)
|
|
# print "final" , existing
|
|
return existing
|
|
|
|
def reset_selection_buttons(self):
|
|
# set the dummy contrtol sensor active which triggers the routine in ResetButtonnMaster
|
|
# the buttons are reset so we can select buttons Set Stopping Length throug restrict transit operation again
|
|
sensors.getSensor("DummyControlSensor").setKnownState(ACTIVE)
|
|
self.waitMsec(3000)
|
|
sensors.getSensor("DummyControlSensor").setKnownState(INACTIVE)
|
|
|
|
# def write_to_TrainInfo(self, edge, new_transit_block_name):
|
|
#
|
|
# filename_fwd = self.get_filename(edge, "fwd")
|
|
# filename_rvs = self.get_filename(edge, "rvs")
|
|
#
|
|
# trainInfo_fwd = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_fwd)
|
|
# transit_block_name = trainInfo_fwd.getBlockName()
|
|
# trainInfo_fwd.setBlockName(new_transit_block_name)
|
|
#
|
|
# #transit_block_name1 = trainInfo_fwd.getBlockName()
|
|
# # write the newtraininfo back to file
|
|
# jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(trainInfo_fwd, filename_fwd)
|
|
#
|
|
# # do same with reverse
|
|
# # filename_rvs = self.get_filename(found_edge, "rvs")
|
|
# trainInfo_rvs = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_rvs)
|
|
# trainInfo_rvs.setBlockName(new_transit_block_name)
|
|
# # write the newtraininfo back to file
|
|
# jmri.jmrit.dispatcher.TrainInfoFile().writeTrainInfo(trainInfo_rvs, filename_rvs)
|
|
#
|
|
# def retrieve_from_Traininfo(self, edge):
|
|
# filename_fwd = self.get_filename(edge, "fwd")
|
|
# trainInfo_fwd = jmri.jmrit.dispatcher.TrainInfoFile().readTrainInfo(filename_fwd)
|
|
# transit_block_name = trainInfo_fwd.getBlockName()
|
|
# return [transit_block_name]
|
|
|
|
def set_transit_block(self, sensor_changed, button_sensor_name, button_station_name,
|
|
sensor_changed1, button_sensor_name1, button_station_name1):
|
|
|
|
|
|
# we have the sensor, sensor_name and block name for the first two stations defining the transit
|
|
# we now wish to specify the triple for the block which needs to be free for the transit to run
|
|
|
|
# msg = "selected stations " + button_station_name + " and " + button_station_name1 + \
|
|
# "\nSelect the next station to specify the block that has to be free to enabler the transit to run?"
|
|
# title = "Select next Station"
|
|
#
|
|
# opt1 = "Select next station"
|
|
# opt2 = "Cancel station transit restriction"
|
|
#
|
|
# s = self.od.customQuestionMessage2str(msg,title,opt1,opt2)
|
|
# if self.od.CLOSED_OPTION == True:
|
|
# return False
|
|
# if s == opt2:
|
|
# return False
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "button_sensor_name", button_sensor_name
|
|
#
|
|
if self.logLevel > 0: print ("in restrict transit: choose 3rd Station")
|
|
|
|
first_station = button_station_name
|
|
last_station = button_station_name1
|
|
if self.logLevel > 0: print "first_station", first_station, "last_station", last_station
|
|
transit_block_station = None
|
|
# route.addLocation(location)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
self.button_sensors_to_watch.remove(sensor_changed)
|
|
self.button_sensors_to_watch.remove(sensor_changed1)
|
|
|
|
if self.logLevel > 0: print ("In loop")
|
|
button_sensors_to_watch_JavaList = java.util.Arrays.asList(self.button_sensors_to_watch)
|
|
self.waitSensorState(button_sensors_to_watch_JavaList, ACTIVE)
|
|
sensor_changed = [sensor for sensor in self.button_sensors_to_watch if sensor.getKnownState() == ACTIVE][0]
|
|
button_sensor_name2 = sensor_changed.getUserName()
|
|
button_station_name2 = self.get_block_name_from_button_sensor_name(button_sensor_name2)
|
|
|
|
transit_block_station = button_station_name2
|
|
|
|
#get the transit corresponding to first_station last_station
|
|
|
|
# for e in g.g_express.edgeSet():
|
|
# from_station_name = g.g_stopping.getEdgeSource(e)
|
|
# to_station_name = g.g_stopping.getEdgeTarget(e)
|
|
# if from_station_name == first_station and to_station_name == last_station:
|
|
# found_edge = e
|
|
# break
|
|
# filename_fwd = self.get_filename(found_edge, "fwd")
|
|
# filename_rvs = self.get_filename(found_edge, "rvs")
|
|
|
|
|
|
msg = "for transit from station" + first_station + "to station " + last_station + \
|
|
"\nselected station " + transit_block_station + \
|
|
". \nDo you wish the transit not to run when this station is occupied ?"
|
|
title = "Selected stations"
|
|
|
|
opt1 = "Cancel and select another transit"
|
|
opt2 = "restrict this transit"
|
|
|
|
s = self.od.customQuestionMessage2str(msg,title,opt2,opt1)
|
|
if self.od.CLOSED_OPTION == True :
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
sensors.getSensor("setTransitBlockRestrictionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return [False, sensor_changed, button_sensor_name2, button_station_name2]
|
|
elif s == opt1:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
sensors.getSensor("setTransitBlockRestrictionSensor").setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return [False, sensor_changed, button_sensor_name2, button_station_name2]
|
|
if s == opt2:
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
complete = True
|
|
self.get_buttons()
|
|
self.button_sensors_to_watch = copy.copy(self.button_sensors)
|
|
return [True, sensor_changed, button_sensor_name2, button_station_name2]
|
|
|
|
|
|
def swapPositions(self, list, pos1, pos2):
|
|
#swap positions of list
|
|
list[pos1], list[pos2] = list[pos2], list[pos1]
|
|
return list
|
|
|
|
def getFirstTwoBlocksInAllowedDirection(self, e, first_station_block):
|
|
path_name = e.getItem("path_name")
|
|
# get last occurence in path in case path goes through turntable and return
|
|
index = path_name[::-1].index(first_station_block)
|
|
position_of_station_block = len(path_name) - index - 1
|
|
first = path_name[position_of_station_block]
|
|
second = path_name[position_of_station_block+1]
|
|
first2blocks = [first,second]
|
|
return first2blocks
|
|
|
|
def get_section(self, path_name, last_block_name, penultimate):
|
|
# first_block = blocks.getBlock(first_block_name)
|
|
# last_block = blocks.getBlock(last_block_name)
|
|
# print "path_name", path_name
|
|
if self.logLevel > 1: print "in get section"
|
|
list_of_sections = []
|
|
for section in sections.getNamedBeanSet():
|
|
if section.getEntryBlock() != None:
|
|
# print "z", section.getUserName()
|
|
seq_no = section.getBlockSequenceNumber(section.getExitBlock())
|
|
# print "a" , seq_no
|
|
if seq_no == 0:
|
|
pb_no = 1
|
|
else:
|
|
pb_no = seq_no - 1
|
|
# print "b", seq_no -1
|
|
try:
|
|
# print
|
|
penultimate_block = section.getBlockBySequenceNumber(pb_no)
|
|
except:
|
|
pass
|
|
if penultimate_block is not None:
|
|
# print "c"
|
|
# print "penultimate_block", penultimate_block.getUserName(), "penultimate", penultimate
|
|
if section.getEntryBlock().getUserName() in path_name and \
|
|
section.getExitBlock().getUserName() == last_block_name and \
|
|
penultimate_block.getUserName() == penultimate and \
|
|
section.getUserName().__contains__(":"): # section is not first section from siding
|
|
list_of_sections.append(section)
|
|
if self.logLevel > 1: print "exiting get_section"
|
|
return list_of_sections
|
|
|
|
def getLastBlockInAllowedDirection(self, e, first_station_block):
|
|
path_name = e.getItem("path_name")
|
|
if self.logLevel > 0: print "path_name", path_name
|
|
# get last occurence in path in case path goes through turntable and return
|
|
index = path_name[::-1].index(first_station_block)
|
|
position_of_station_block = len(path_name) - 1 #- index - 1
|
|
last = path_name[position_of_station_block]
|
|
penultimate = path_name[position_of_station_block-1]
|
|
last2blocks = [last,penultimate]
|
|
return last2blocks
|
|
|
|
def delete_block_pair_from_list(self, entry_to_delete):
|
|
folder = "blockDirections"
|
|
filename = "blockDirections.txt"
|
|
existing = self.read_list(folder,filename)
|
|
if entry_to_delete != "no inhibited directions":
|
|
existing.remove(entry_to_delete)
|
|
self.write_list(existing, folder, filename)
|
|
return existing
|
|
|
|
def store_the_two_blocks(self, first_two_blocks):
|
|
folder = "blockDirections"
|
|
filename = "blockDirections.txt"
|
|
list_inhibited_blocks = self.read_list(folder,filename)
|
|
existing = list_inhibited_blocks
|
|
to_add = first_two_blocks
|
|
#to_add = first_two_blocks[0]+"."+first_two_blocks[1]
|
|
if to_add not in existing:
|
|
# print "not in existing", "to_add", to_add, "existing", existing
|
|
existing.append(to_add)
|
|
self.write_list(existing, folder, filename)
|
|
# print "final" , existing
|
|
return existing
|
|
|
|
def remove_the_two_blocks(self, first_two_blocks):
|
|
folder = "blockDirections"
|
|
filename = "blockDirections.txt"
|
|
list_inhibited_blocks = self.read_list(folder,filename)
|
|
existing = list_inhibited_blocks
|
|
to_remove = first_two_blocks
|
|
if to_remove in existing:
|
|
# print "in existing", "to_remove", to_remove, "existing", existing
|
|
existing.remove(to_remove)
|
|
self.write_list(existing, folder, filename)
|
|
# print "final" , existing
|
|
return existing
|
|
|
|
def last_section_of_transit(self, trainInfo_fwd):
|
|
|
|
transit_id = trainInfo_fwd.getTransitId()
|
|
TransitManager = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
transit = TransitManager.getTransit(transit_id)
|
|
# print "transit_id", transit_id
|
|
last_seq_no = transit.getMaxSequence()
|
|
section_list = transit.getSectionListBySeq(last_seq_no)
|
|
last_section = section_list[0] #assume no alternate section
|
|
# print "last_section", last_section
|
|
return last_section
|
|
|
|
def length_of_last_section(self, last_section):
|
|
length_in_mm = last_section.getActualLength()
|
|
return length_in_mm
|
|
|
|
def get_filename(self, e, suffix):
|
|
|
|
# suffix is "fwd" or "rvs"
|
|
# e is edge
|
|
|
|
from_station_name = g.g_express.getEdgeSource(e)
|
|
to_station_name = g.g_express.getEdgeTarget(e)
|
|
neighbor_name = e.getItem("neighbor_name")
|
|
index = e.getItem("index")
|
|
|
|
filename = "From " + str(from_station_name) + " To " + str(to_station_name) + " Via " + str(neighbor_name) + " " + str(index)
|
|
filename = filename.replace(" ", "_")
|
|
filename = filename + "_" + suffix + ".xml"
|
|
|
|
return filename
|
|
|
|
def get_transit(self, transit_name):
|
|
# print e
|
|
# signal_mast_list = e.getItem("signal_mast_list")
|
|
# start_signal_mast = signal_mast_list[0].getUserName()
|
|
# end_signal_mast = signal_mast_list[-1].getUserName()
|
|
# transit_name = "From " + start_signal_mast + " to " + end_signal_mast
|
|
# if self.logLevel > 1: print "transit_name",transit_name
|
|
# transits = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
transit_list = [transit for transit in transits.getNamedBeanSet() if transit.getUserName() == transit_name]
|
|
if self.logLevel > 1: print "transit_list",transit_list
|
|
if transit_list == []:
|
|
return None
|
|
else:
|
|
transit = transit_list[0]
|
|
if self.logLevel > 1: print "transit", transit.getUserName()
|
|
if self.logLevel > 1: print "transit_username", transit.getUserName()
|
|
if self.logLevel > 1: print "transit exists", transit.getUserName(), transit
|
|
#e.setItem(transit=transit)
|
|
return transit
|
|
|
|
def get_existing_transit(self, e):
|
|
# print "edge =" , e
|
|
signal_mast_list = e.getItem("signal_mast_list")
|
|
start_signal_mast = signal_mast_list[0].getUserName()
|
|
end_signal_mast = signal_mast_list[-1].getUserName()
|
|
transit_name = "From " + start_signal_mast + " to " + end_signal_mast
|
|
if self.logLevel > 1: print "transit_name",transit_name
|
|
transits = jmri.InstanceManager.getDefault(jmri.TransitManager)
|
|
transit_list = [transit for transit in transits.getNamedBeanSet() if transit.getUserName() == transit_name]
|
|
if self.logLevel > 1: print "transit_list",transit_list
|
|
|
|
if transit_list == []:
|
|
return None
|
|
else:
|
|
transit = transit_list[0]
|
|
if self.logLevel > 1: print "transit", transit.getUserName()
|
|
if self.logLevel > 1: print "transit_username", transit.getUserName()
|
|
if self.logLevel > 1: print "transit exists", transit.getUserName(), transit
|
|
e.setItem(transit=transit)
|
|
return transit
|
|
|
|
def dispatch_train(self, sensor_changed, button_sensor_name, button_station_name):
|
|
global trains_allocated
|
|
global trains_dispatched
|
|
global g
|
|
|
|
#find what train we want to move
|
|
#select only from available trains %%%%todo%%%%%
|
|
all_trains = self.get_all_roster_entries_with_speed_profile()
|
|
#trains to choose from are the allocated - dispatched
|
|
trains_to_choose = copy.copy(trains_allocated)
|
|
if self.logLevel > 0: print "trains_dispatched", trains_dispatched
|
|
if self.logLevel > 0: print "trains_allocated",trains_allocated
|
|
if self.logLevel > 0: print "trains_to_choose",trains_to_choose
|
|
if trains_dispatched != []:
|
|
for train in trains_dispatched:
|
|
if self.logLevel > 0: print "removing" ,train
|
|
trains_to_choose.remove(train)
|
|
if self.logLevel > 0: print "trains_to_choose",trains_to_choose
|
|
if trains_to_choose == []:
|
|
str_trains_dispatched= (' '.join(trains_dispatched))
|
|
msg = ("There are no trains available for dispatch\nTrains dispatched are:\n"+str_trains_dispatched + \
|
|
"\nYou have to wait until a train has stopped\nbefore dispatching it again")
|
|
title = "Cannot move train"
|
|
opt1 = "continue"
|
|
opt2 = "reset all allocations"
|
|
result = OptionDialog().customQuestionMessage2str(msg, title, opt1, opt2)
|
|
if result == "reset all allocations":
|
|
trains_dispatched = []
|
|
sensor_changed.setKnownState(INACTIVE)
|
|
else:
|
|
#####################################################
|
|
#
|
|
# get train to move & whether express or slow
|
|
# if the block pressed is not the station where the train is#
|
|
# the station where the train is is occupied
|
|
#####################################################
|
|
if self.logLevel > 0: print "+++++++++++++++++++"
|
|
if self.logLevel > 0: print "checking pressed button"
|
|
if self.logLevel > 0: print "+++++++++++++++++++"
|
|
msg = "select train you want to move"
|
|
list_items = trains_to_choose
|
|
express = self.get_express_flag()
|
|
# if express:
|
|
options = ["express", "stopping"]
|
|
# default = "express"
|
|
# else:
|
|
# options = ["stopping", "express"]
|
|
# default = "stopping"
|
|
title = "title"
|
|
result = self.od.ListOptions(list_items, msg, options)
|
|
if self.od.CLOSED_OPTION == False:
|
|
my_list = result[0]
|
|
option = result[1]
|
|
if self.logLevel > 0: print "option= " ,option, " list = ",my_list
|
|
train_to_move = str(my_list)
|
|
train_type = str(option)
|
|
|
|
if self.logLevel > 0: print "train_to_move",train_to_move
|
|
if self.logLevel > 0: print "train_type" , train_type
|
|
|
|
if train_type is None or train_to_move is None:
|
|
if self.logLevel > 0: print ("train_type is None or train_to_move is None")
|
|
else:
|
|
for station_block_name in g.station_block_list:
|
|
|
|
# choose the block in station_block_list that has the required train in it
|
|
# block_value_state must be true
|
|
block_value_state = self.check_train_in_block(station_block_name, train_to_move)
|
|
|
|
# the block must be occupied
|
|
# block_occupied_state must be true
|
|
block_occupied_state = self.check_sensor_state_given_block_name(station_block_name)
|
|
|
|
# do not attempt to move to where you are
|
|
# button_pressed_in_occupied_station must be false
|
|
button_pressed_in_occupied_station = (button_station_name == station_block_name)
|
|
|
|
if block_value_state == True and block_occupied_state == True and button_pressed_in_occupied_station == False:
|
|
if train_type == "express":
|
|
if self.logLevel > 0: print "moving express"
|
|
if g == None:
|
|
if self.logLevel > 0: print "G IS NONE"
|
|
if self.logLevel > 1: print("b")
|
|
move_train = MoveTrain(station_block_name, button_station_name, train_to_move, g.g_express)
|
|
instanceList.append(move_train)
|
|
if move_train.setup():
|
|
move_train.setName(train_to_move)
|
|
move_train.start()
|
|
if self.logLevel > 0: print "station_block_name",station_block_name
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "**********************"
|
|
elif False == False:
|
|
if self.logLevel > 0: print "moving slow"
|
|
if g == None:
|
|
if self.logLevel > 0: print "G IS NONE"
|
|
move_train = MoveTrain(station_block_name, button_station_name, train_to_move, g.g_stopping)
|
|
instanceList.append(move_train)
|
|
if move_train.setup():
|
|
move_train.setName(train_to_move)
|
|
if self.logLevel > 0: print "********calling thread move**************"
|
|
move_train.start()
|
|
if self.logLevel > 0: print "********called thread move***************"
|
|
self.waitMsec(time_to_stop_in_station)
|
|
if self.logLevel > 0: print "station_block_name",station_block_name
|
|
if self.logLevel > 0: print "button_station_name", button_station_name
|
|
if self.logLevel > 0: print "**********************"
|
|
else:
|
|
#express flag not set up
|
|
pass
|
|
break
|
|
|
|
#set old button which activated the same train to inactive
|
|
if self.button_dict != {}:
|
|
if self.logLevel > 0: print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
if self.logLevel > 0: print "self.button_dict = ",self.button_dict
|
|
if self.logLevel > 0: print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
if train_to_move in self.button_dict:
|
|
old_button_sensor = self.button_dict[train_to_move]
|
|
old_button_sensor.setKnownState(INACTIVE)
|
|
self.button_sensors_to_watch.append(old_button_sensor)
|
|
#associate new button with train
|
|
if self.logLevel > 0: print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
if self.logLevel > 0: print "train_to_move", train_to_move
|
|
if self.logLevel > 0: print "sensor_changed", sensor_changed
|
|
if self.logLevel > 0: print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
self.button_dict[train_to_move] = sensor_changed
|
|
if self.logLevel > 0: print "self.button_dict = ",self.button_dict
|
|
self.waitMsec(1000)
|
|
|
|
def get_block_name_from_button_sensor_name(self, button_sensor_name):
|
|
#button_sensor_name MoveToblock8_stored
|
|
#block_name block8
|
|
block_name = button_sensor_name.replace("MoveTo","").replace("_stored","").replace("_"," ")
|
|
for block in blocks.getNamedBeanSet():
|
|
if block.getUserName().replace("_"," ") == block_name:
|
|
break
|
|
return block.getUserName()
|
|
|
|
def get_button_sensor_given_block_name(self, block_name):
|
|
button_sensor_name = "MoveTo"+block_name.replace(" ","_") +"_stored"
|
|
button_sensor = sensors.getSensor(button_sensor_name)
|
|
return button_sensor
|
|
|
|
def get_express_flag(self):
|
|
self.express_sensor = sensors.getSensor("Express")
|
|
if self.express_sensor is None:
|
|
OptionDialog().displayMessage("No Express Sensor set up")
|
|
return None
|
|
express_state = self.express_sensor.getKnownState()
|
|
if self.logLevel > 0: print express_state,jmri.Sensor.ACTIVE
|
|
#msg = "express sensor is ", str(express_state)
|
|
#OptionDialog().displayMessage(msg)
|
|
if express_state == jmri.Sensor.ACTIVE:
|
|
express_flag = True
|
|
else:
|
|
express_flag = False
|
|
return express_flag
|
|
|
|
def get_blockcontents(self, block_name):
|
|
block = blocks.getBlock(block_name)
|
|
value = block.getValue()
|
|
return value
|
|
|
|
def check_train_in_block(self, block_name, train_name):
|
|
mem_val = self.get_blockcontents(block_name)
|
|
if train_name == mem_val:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def check_sensor_state_given_block_name(self, station_block_name):
|
|
#if sellayoutBlockf.logLevel > 0: print("station block name {}".format(station_block_name))
|
|
layoutBlock = layoutblocks.getLayoutBlock(station_block_name)
|
|
station_sensor = layoutBlock.getOccupancySensor()
|
|
if station_sensor is None:
|
|
OptionDialog().displayMessage(' Sensor in block {} not found'.format(station_block_name))
|
|
return
|
|
currentState = True if station_sensor.getKnownState() == ACTIVE else False
|
|
return currentState
|
|
|
|
def get_all_roster_entries_with_speed_profile(self):
|
|
roster_entries_with_speed_profile = []
|
|
r = jmri.jmrit.roster.Roster.getDefault()
|
|
for roster_entry in jmri.jmrit.roster.Roster.getAllEntries(r):
|
|
if self.logLevel > 0: print "roster_entry.getSpeedProfile()",roster_entry,roster_entry.getSpeedProfile()
|
|
if roster_entry.getSpeedProfile() != None:
|
|
roster_entries_with_speed_profile.append(roster_entry.getId())
|
|
if self.logLevel > 0: print "roster_entry.getId()",roster_entry.getId()
|
|
if self.logLevel > 0: print "roster_entries_with_speed_profile",roster_entries_with_speed_profile
|
|
return roster_entries_with_speed_profile
|
|
|
|
def get_buttons(self):
|
|
self.button_sensors = [self.get_button_sensor_given_block_name(station_block_name) for station_block_name in g.station_block_list]
|
|
self.button_sensor_states = [self.check_sensor_state(button_sensor) for button_sensor in self.button_sensors]
|
|
# for button_sensor in self.button_sensors:
|
|
# self.button_dict[button_sensor] = self.check_sensor_state(button_sensor)
|
|
|
|
|
|
def check_sensor_state(self, sensor):
|
|
#if self.logLevel > 0: print("check_sensor_state",sensor)
|
|
if sensor == None :
|
|
#if self.logLevel > 0: print('Sensor in check_sensor_state is none')
|
|
return None
|
|
#sensor = sensors.getSensor(sensor_name)
|
|
if sensor is None:
|
|
OptionDialog().displayMessage('Sensor {} not found'.format( sensor_name))
|
|
return
|
|
currentState = True if sensor.getKnownState() == ACTIVE else False
|
|
#if self.logLevel > 0: print("check_sensor_state {}".format(currentState))
|
|
return currentState
|
|
|
|
def store_button_states(self):
|
|
self.button_sensor_states_old = self.button_sensor_states
|
|
if self.logLevel > 0: print "self.button_sensor_states_old",self.button_sensor_states_old
|
|
#self.button_dict_old = dict(self.button_dict)
|
|
|
|
def get_button_sensor_given_block_name(self, block_name):
|
|
button_sensor_name = "MoveTo"+block_name.replace(" ","_") +"_stored"
|
|
button_sensor = sensors.getSensor(button_sensor_name)
|
|
return button_sensor
|
|
|
|
def show_operations_trains(self):
|
|
a = jmri.jmrit.operations.trains.TrainsTableAction()
|
|
a.actionPerformed(None)
|
|
|
|
# End of class StopMaster
|