Example #1
0
    def init(self):
        #

        self.arrivesMemoryVariable = "Arrives Freight House"
        self.departsMemoryVariable = "Departs Freight House"
        self.freightHouse = Building()
        self.freightHouse.init(self.arrivesMemoryVariable,
                               self.departsMemoryVariable)

        self.scheduleTimes = []
        self.scheduleTimes.append(
            memories.provideMemory(self.arrivesMemoryVariable))

        #self.stove = lights.provideLight("NL120");
        #self.platformLights = lights.provideLight("NL121");
        #self.officeLight = lights.provideLight("NL122");
        #self.dockLight = lights.provideLight("NL123");

        #self.platformIndicator = lights.provideLight("IL121");
        #self.officeIndicator = lights.provideLight("IL122");
        #self.dockIndicator = lights.provideLight("IL123");

        #self.platformLightDimmer = lights.provideLight("NL124");
        #self.officeLightDimmer = lights.provideLight("NL125");
        #self.dockLightDimmer = lights.provideLight("NL126");

        self.freightDock = TriStateSensor(
            sensors.provideSensor("Freight Dock Dim"),
            sensors.provideSensor("Freight Dock On"),
            sensors.provideSensor("Freight Dock Off"))

        self.freightOffice = TriStateSensor(
            sensors.provideSensor("Freight Office Dim"),
            sensors.provideSensor("Freight Office On"),
            sensors.provideSensor("Freight Office Off"))

        self.freightPlatform = TriStateSensor(
            sensors.provideSensor("Freight Platform Dim"),
            sensors.provideSensor("Freight Platform On"),
            sensors.provideSensor("Freight Platform Off"))

        self.freightStove = TriStateSensor(
            None, sensors.provideSensor("Freight Stove"), None)

        self.sideDoor = sensors.provideSensor(
            "Mine Bldg Side Soor")  # Mine Bldg Side Door
        self.lockerRoom = sensors.provideSensor(
            "Mine Bldg S2")  # Mine Bldg Level 2 - Locker Room
        self.tipple = sensors.provideSensor("Mine Bldg S3")  # Mine Bldg Tipple
    def init(self) :
      	  arOn = lights.provideLight("NL101")
	  arDim = lights.provideLight("NL106")
	  jOn = sensors.provideSensor("Depot Platform On")
	  jOff = sensors.provideSensor("Depot Platform Off")
	  jDim = sensors.provideSensor("Depot Platform Dim")
      	  self.depotPlatform = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL102")
	  arDim = lights.provideLight("NL107")
	  jOn = sensors.provideSensor("Depot Waiting Room On")
	  jOff = sensors.provideSensor("Depot Waiting Room Off")
	  jDim = sensors.provideSensor("Depot Waiting Room Dim")
      	  self.depotWaitingRoom = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("LL145")
	  arDim = lights.provideLight("LL149")
	  jOn = sensors.provideSensor("Mine Building Roof Sign On")
	  jOff = sensors.provideSensor("Mine Building Roof Sign Off")
	  jDim = sensors.provideSensor("Mine Building Roof Sign Dim")
      	  self.roofSign = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL143")
	  arDim = lights.provideLight("LL147")
	  jOn = sensors.provideSensor("Mine Building Level 2 On")
	  jOff = sensors.provideSensor("Mine Building Level 2 Off")
	  jDim = sensors.provideSensor("Mine Building Level 2 Dim")
      	  self.mineS2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL144")
	  arDim = lights.provideLight("LL148")
	  jOn = sensors.provideSensor("Mine Building Level 3 On")
	  jOff = sensors.provideSensor("Mine Building Level 3 Off")
	  jDim = sensors.provideSensor("Mine Building Level 3 Dim")
      	  self.mineS3 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                    

      	  arOn = lights.provideLight("LL140")
	  arDim = lights.provideLight("LL146")
	  jOn = sensors.provideSensor("Mine Building Loading Dock On")
	  jOff = sensors.provideSensor("Mine Building Loading Dock Off")
	  jDim = sensors.provideSensor("Mine Building Loading Dock Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("Mine Bldg Side Door Light")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg Side Door")
	  jOff = None
	  jDim = None
      	  self.s2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)
          
      	  arOn = lights.provideLight("LL143")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg S2")
	  jOff = None
	  jDim = None
      	  self.s2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL144")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg S3")
	  jOff = None
	  jDim = None
      	  self.s3 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                    

          

      	  arOn = lights.provideLight("LL79")
	  arDim = lights.provideLight("LL80")
	  jOn = sensors.provideSensor("Winding House Boiler Low")
	  jOff = sensors.provideSensor("Winding House Boiler Off")
	  jDim = sensors.provideSensor("Winding House Boiler High")
      	  self.boilerFire = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL74")
	  arDim = lights.provideLight("LL75")
	  jOn = sensors.provideSensor("Winding House Engine Room On")
	  jOff = sensors.provideSensor("Winding House Engine Room Off")
	  jDim = sensors.provideSensor("Winding House Engine Room Dim")
      	  self.engineRoom = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("NL123")
	  arDim = lights.provideLight("NL126")
	  jOn = sensors.provideSensor("Freight Dock On")
	  jOff = sensors.provideSensor("Freight Dock Off")
	  jDim = sensors.provideSensor("Freight Dock Dim")
      	  self.freightDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL121")
	  arDim = lights.provideLight("NL124")
	  jOn = sensors.provideSensor("Freight Platform On")
	  jOff = sensors.provideSensor("Freight Platform Off")
	  jDim = sensors.provideSensor("Freight Platform Dim")
      	  self.freightPlatform = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                                        

      	  arOn = lights.provideLight("NL122")
	  arDim = lights.provideLight("NL125")
	  jOn = sensors.provideSensor("Freight Office On")
	  jOff = sensors.provideSensor("Freight Office Off")
	  jDim = sensors.provideSensor("Freight Office Dim")
      	  self.freightOffice = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL120")
	  jOn = sensors.provideSensor("Freight Stove")
      	  self.freightStove = foggyhollow.arduino.DimmableLight(None, arOn, None, jOn, None)          

      	  arOn = lights.provideLight("Level 1 Blue Light")
	  arDim = lights.provideLight("Level 1 Blue Dim")
	  jOn = sensors.provideSensor("L1 Blue Light On")
	  jOff = sensors.provideSensor("L1 Blue Light Off")
	  jDim = sensors.provideSensor("L1 Blue Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)
          self.l1Blue = TriStateSensor(jDim,jOn, jOff)
          self.l1Blue.setState(TriStateSensor.ON)

      	  arOn = lights.provideLight("NL133")
	  arDim = lights.provideLight("Level 1 Violet Dim")
	  jOn = sensors.provideSensor("L1 Violet Light On")
	  jOff = sensors.provideSensor("L1 Violet Light Off")
	  jDim = sensors.provideSensor("L1 Violet Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("Level 1 Yellow Light")
	  arDim = lights.provideLight("Level 1 Yellow Dim")
	  jOn = sensors.provideSensor("L1 Yellow Light On")
	  jOff = sensors.provideSensor("L1 Yellow Light Off")
	  jDim = sensors.provideSensor("L1 Yellow Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = sensors.provideSensor("Rock Wobble")
	  jOn = sensors.provideSensor("Rock Wobble")
	  jOff = sensors.provideSensor("Rock Off")
      	  self.dragonRock = foggyhollow.arduino.DimmableSensor(None, arOn, None, jOn, jOff)          


          self.demoModeListener = self.DemoModeListener()
          self.demoModeListener.init(self.demoOff, 20)
          
          self.demoMode = sensors.provideSensor("Building Light Demo")
          self.demoMode.setState(jmri.Sensor.ACTIVE)
          self.demoMode.addPropertyChangeListener(self.demoModeListener)          

          self.backgroundSound  = jmri.jmrit.Sound(jmri.util.FileUtil.getExternalFilename("preference:resources/sounds/DangerousMineNoiseReduction16bit.wav"))
          self.waitMsec(5000)

          return;
class AceOfSpadesBackgroundSound(jmri.jmrit.automat.AbstractAutomaton) :

    
    def init(self) :
      	  arOn = lights.provideLight("NL101")
	  arDim = lights.provideLight("NL106")
	  jOn = sensors.provideSensor("Depot Platform On")
	  jOff = sensors.provideSensor("Depot Platform Off")
	  jDim = sensors.provideSensor("Depot Platform Dim")
      	  self.depotPlatform = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL102")
	  arDim = lights.provideLight("NL107")
	  jOn = sensors.provideSensor("Depot Waiting Room On")
	  jOff = sensors.provideSensor("Depot Waiting Room Off")
	  jDim = sensors.provideSensor("Depot Waiting Room Dim")
      	  self.depotWaitingRoom = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("LL145")
	  arDim = lights.provideLight("LL149")
	  jOn = sensors.provideSensor("Mine Building Roof Sign On")
	  jOff = sensors.provideSensor("Mine Building Roof Sign Off")
	  jDim = sensors.provideSensor("Mine Building Roof Sign Dim")
      	  self.roofSign = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL143")
	  arDim = lights.provideLight("LL147")
	  jOn = sensors.provideSensor("Mine Building Level 2 On")
	  jOff = sensors.provideSensor("Mine Building Level 2 Off")
	  jDim = sensors.provideSensor("Mine Building Level 2 Dim")
      	  self.mineS2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL144")
	  arDim = lights.provideLight("LL148")
	  jOn = sensors.provideSensor("Mine Building Level 3 On")
	  jOff = sensors.provideSensor("Mine Building Level 3 Off")
	  jDim = sensors.provideSensor("Mine Building Level 3 Dim")
      	  self.mineS3 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                    

      	  arOn = lights.provideLight("LL140")
	  arDim = lights.provideLight("LL146")
	  jOn = sensors.provideSensor("Mine Building Loading Dock On")
	  jOff = sensors.provideSensor("Mine Building Loading Dock Off")
	  jDim = sensors.provideSensor("Mine Building Loading Dock Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("Mine Bldg Side Door Light")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg Side Door")
	  jOff = None
	  jDim = None
      	  self.s2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)
          
      	  arOn = lights.provideLight("LL143")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg S2")
	  jOff = None
	  jDim = None
      	  self.s2 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL144")
	  arDim = None
	  jOn = sensors.provideSensor("Mine Bldg S3")
	  jOff = None
	  jDim = None
      	  self.s3 = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                    

          

      	  arOn = lights.provideLight("LL79")
	  arDim = lights.provideLight("LL80")
	  jOn = sensors.provideSensor("Winding House Boiler Low")
	  jOff = sensors.provideSensor("Winding House Boiler Off")
	  jDim = sensors.provideSensor("Winding House Boiler High")
      	  self.boilerFire = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("LL74")
	  arDim = lights.provideLight("LL75")
	  jOn = sensors.provideSensor("Winding House Engine Room On")
	  jOff = sensors.provideSensor("Winding House Engine Room Off")
	  jDim = sensors.provideSensor("Winding House Engine Room Dim")
      	  self.engineRoom = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("NL123")
	  arDim = lights.provideLight("NL126")
	  jOn = sensors.provideSensor("Freight Dock On")
	  jOff = sensors.provideSensor("Freight Dock Off")
	  jDim = sensors.provideSensor("Freight Dock Dim")
      	  self.freightDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL121")
	  arDim = lights.provideLight("NL124")
	  jOn = sensors.provideSensor("Freight Platform On")
	  jOff = sensors.provideSensor("Freight Platform Off")
	  jDim = sensors.provideSensor("Freight Platform Dim")
      	  self.freightPlatform = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)                                        

      	  arOn = lights.provideLight("NL122")
	  arDim = lights.provideLight("NL125")
	  jOn = sensors.provideSensor("Freight Office On")
	  jOff = sensors.provideSensor("Freight Office Off")
	  jDim = sensors.provideSensor("Freight Office Dim")
      	  self.freightOffice = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = lights.provideLight("NL120")
	  jOn = sensors.provideSensor("Freight Stove")
      	  self.freightStove = foggyhollow.arduino.DimmableLight(None, arOn, None, jOn, None)          

      	  arOn = lights.provideLight("Level 1 Blue Light")
	  arDim = lights.provideLight("Level 1 Blue Dim")
	  jOn = sensors.provideSensor("L1 Blue Light On")
	  jOff = sensors.provideSensor("L1 Blue Light Off")
	  jDim = sensors.provideSensor("L1 Blue Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)
          self.l1Blue = TriStateSensor(jDim,jOn, jOff)
          self.l1Blue.setState(TriStateSensor.ON)

      	  arOn = lights.provideLight("NL133")
	  arDim = lights.provideLight("Level 1 Violet Dim")
	  jOn = sensors.provideSensor("L1 Violet Light On")
	  jOff = sensors.provideSensor("L1 Violet Light Off")
	  jDim = sensors.provideSensor("L1 Violet Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)          

      	  arOn = lights.provideLight("Level 1 Yellow Light")
	  arDim = lights.provideLight("Level 1 Yellow Dim")
	  jOn = sensors.provideSensor("L1 Yellow Light On")
	  jOff = sensors.provideSensor("L1 Yellow Light Off")
	  jDim = sensors.provideSensor("L1 Yellow Light Dim")
      	  self.loadingDock = foggyhollow.arduino.DimmableLight(arDim, arOn, jDim, jOn, jOff)

      	  arOn = sensors.provideSensor("Rock Wobble")
	  jOn = sensors.provideSensor("Rock Wobble")
	  jOff = sensors.provideSensor("Rock Off")
      	  self.dragonRock = foggyhollow.arduino.DimmableSensor(None, arOn, None, jOn, jOff)          


          self.demoModeListener = self.DemoModeListener()
          self.demoModeListener.init(self.demoOff, 20)
          
          self.demoMode = sensors.provideSensor("Building Light Demo")
          self.demoMode.setState(jmri.Sensor.ACTIVE)
          self.demoMode.addPropertyChangeListener(self.demoModeListener)          

          self.backgroundSound  = jmri.jmrit.Sound(jmri.util.FileUtil.getExternalFilename("preference:resources/sounds/DangerousMineNoiseReduction16bit.wav"))
          self.waitMsec(5000)

          return;

    class DemoModeListener(java.beans.PropertyChangeListener) :
        def init(self, callback, delayMinutes):
            self.demoOff = callback
            self.delayMinutes = delayMinutes

        def propertyChange(self, event):
            if (event.source.getState() == jmri.Sensor.ACTIVE) :
                #
                #  Schedule demo mode to end
                #self.scheduler.enter(60*self.delayMinutes, 1, self.demoOff, argument=(event.source,))
                threading.Timer(60*self.delayMinutes, self.demoOff, [event.source]).start()                                
            return  
        
    def demoOff(self, sensor) :
        import jmri
        sensor.setState(jmri.Sensor.INACTIVE)        
        return  

    
    def handle(self):
        self.backgroundSound.play()

        self.waitMsec(60000) # Wait 1 minute

        return  (True)
Example #4
0
    def init(self):


        #
        #  Mine Building Lights
        self.roofSign = TriStateSensor(sensors.provideSensor("Mine Bldg Roof Sign Dim"),
                                          sensors.provideSensor("Mine Building Roof Sign On"),
                                          sensors.provideSensor("Mine Building Roof Sign Off"))
        
        self.loadingDock = TriStateSensor(sensors.provideSensor("Mine Building Loading Dock Dim"),
                                          sensors.provideSensor("Mine Building Loading Dock On"),
                                          sensors.provideSensor("Mine Building Loading Dock Off"))

        self.mineSideDoor = TriStateSensor(None, lights.provideLight("Mine Bldg Side Door Light"), None)
        self.mineS2Light = TriStateSensor(None, lights.provideLight("Mine Bldg S2 Light"), None)
        self.mineS3Light = TriStateSensor(None, lights.provideLight("Mine Bldg S3 Light"), None)

        #
        #  Hoist Call Buttons
        self.hoistS2 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To S2"), None)
        self.hoistS1 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To S1"), None)
        self.hoistL1 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To L1"), None)        

        
        #
        #  Tipple lights
        self.leftBridge = TriStateSensor(None, lights.provideLight("Tipple Bridge Left Light"), None)
        self.rightBridge = TriStateSensor(None, lights.provideLight("Tipple Bridge Right Light"), None)
        self.insideLights = TriStateSensor(None, lights.provideLight("Tipple Inside Lights"), None)        
        self.chuteLight = TriStateSensor(None, lights.provideLight("Tipple Chute Light"), None)
        self.gateLight = TriStateSensor(None, lights.provideLight("Tipple Gate Light"), None)
        self.lantern = TriStateSensor(lights.provideLight("Tipple EOT Lantern Red"), lights.provideLight("Tipple EOT Lantern White"), None)

        #
        # Tipple chutes
        self.rightChute = TriStateSensor(None, sensors.provideSensor("Tipple Chute Right"), None)
        self.leftChute = TriStateSensor(None, sensors.provideSensor("Tipple Chute Left"), None)                
        #
        #  Winding House Lights
        self.whSideDoor = TriStateSensor(None, lights.provideLight("Winding House Side Door Light"), None)
        self.whBridge = TriStateSensor(None, lights.provideLight("Winding House Bridge Light"), None)
        self.wh2ndFloor = TriStateSensor(None, lights.provideLight("Winding House 2nd Floor Light"), None)
        self.whEngineRoom = TriStateSensor(sensors.provideSensor("Winding House Engine Room Dim"),
                                          sensors.provideSensor("Winding House Engine Room On"),
                                          sensors.provideSensor("Winding House Engine Room Off"))
        
        self.boilerFire = TriStateSensor(sensors.provideSensor("Winding House Boiler Low"),
                                       sensors.provideSensor("Winding House Boiler High"),
                                       sensors.provideSensor("Winding House Boiler Off"))


        #
        #  Level 1 Lights
        self.l1BlueLight = TriStateSensor(sensors.provideSensor("L1 Blue Light Dim"),
                                          sensors.provideSensor("L1 Blue Light On"),
                                          sensors.provideSensor("L1 Blue Light Off"))

        self.l1YellowLight = TriStateSensor(sensors.provideSensor("L1 Yellow Light Dim"),
                                          sensors.provideSensor("L1 Yellow Light On"),
                                          sensors.provideSensor("L1 Yellow Light Off"))

        self.l1VioletLight = TriStateSensor(sensors.provideSensor("Level 1 Violet Light Dim"),
                                            sensors.provideSensor("Level 1 Violet Light On"),
                                            sensors.provideSensor("Level 1 Violet Light Off"))

        self.demoModeListener = self.DemoModeListener()
        self.demoModeListener.init(self.simulateActivity, self.shutdown)
        
        self.demoActive = sensors.provideSensor("S3 Demo")
        self.demoActive.addPropertyChangeListener(self.demoModeListener)        
Example #5
0
class MineSimulator(jmri.jmrit.automat.AbstractAutomaton):
    
    def init(self):


        #
        #  Mine Building Lights
        self.roofSign = TriStateSensor(sensors.provideSensor("Mine Bldg Roof Sign Dim"),
                                          sensors.provideSensor("Mine Building Roof Sign On"),
                                          sensors.provideSensor("Mine Building Roof Sign Off"))
        
        self.loadingDock = TriStateSensor(sensors.provideSensor("Mine Building Loading Dock Dim"),
                                          sensors.provideSensor("Mine Building Loading Dock On"),
                                          sensors.provideSensor("Mine Building Loading Dock Off"))

        self.mineSideDoor = TriStateSensor(None, lights.provideLight("Mine Bldg Side Door Light"), None)
        self.mineS2Light = TriStateSensor(None, lights.provideLight("Mine Bldg S2 Light"), None)
        self.mineS3Light = TriStateSensor(None, lights.provideLight("Mine Bldg S3 Light"), None)

        #
        #  Hoist Call Buttons
        self.hoistS2 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To S2"), None)
        self.hoistS1 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To S1"), None)
        self.hoistL1 = TriStateSensor(None, sensors.provideSensor("IS Call Hoist To L1"), None)        

        
        #
        #  Tipple lights
        self.leftBridge = TriStateSensor(None, lights.provideLight("Tipple Bridge Left Light"), None)
        self.rightBridge = TriStateSensor(None, lights.provideLight("Tipple Bridge Right Light"), None)
        self.insideLights = TriStateSensor(None, lights.provideLight("Tipple Inside Lights"), None)        
        self.chuteLight = TriStateSensor(None, lights.provideLight("Tipple Chute Light"), None)
        self.gateLight = TriStateSensor(None, lights.provideLight("Tipple Gate Light"), None)
        self.lantern = TriStateSensor(lights.provideLight("Tipple EOT Lantern Red"), lights.provideLight("Tipple EOT Lantern White"), None)

        #
        # Tipple chutes
        self.rightChute = TriStateSensor(None, sensors.provideSensor("Tipple Chute Right"), None)
        self.leftChute = TriStateSensor(None, sensors.provideSensor("Tipple Chute Left"), None)                
        #
        #  Winding House Lights
        self.whSideDoor = TriStateSensor(None, lights.provideLight("Winding House Side Door Light"), None)
        self.whBridge = TriStateSensor(None, lights.provideLight("Winding House Bridge Light"), None)
        self.wh2ndFloor = TriStateSensor(None, lights.provideLight("Winding House 2nd Floor Light"), None)
        self.whEngineRoom = TriStateSensor(sensors.provideSensor("Winding House Engine Room Dim"),
                                          sensors.provideSensor("Winding House Engine Room On"),
                                          sensors.provideSensor("Winding House Engine Room Off"))
        
        self.boilerFire = TriStateSensor(sensors.provideSensor("Winding House Boiler Low"),
                                       sensors.provideSensor("Winding House Boiler High"),
                                       sensors.provideSensor("Winding House Boiler Off"))


        #
        #  Level 1 Lights
        self.l1BlueLight = TriStateSensor(sensors.provideSensor("L1 Blue Light Dim"),
                                          sensors.provideSensor("L1 Blue Light On"),
                                          sensors.provideSensor("L1 Blue Light Off"))

        self.l1YellowLight = TriStateSensor(sensors.provideSensor("L1 Yellow Light Dim"),
                                          sensors.provideSensor("L1 Yellow Light On"),
                                          sensors.provideSensor("L1 Yellow Light Off"))

        self.l1VioletLight = TriStateSensor(sensors.provideSensor("Level 1 Violet Light Dim"),
                                            sensors.provideSensor("Level 1 Violet Light On"),
                                            sensors.provideSensor("Level 1 Violet Light Off"))

        self.demoModeListener = self.DemoModeListener()
        self.demoModeListener.init(self.simulateActivity, self.shutdown)
        
        self.demoActive = sensors.provideSensor("S3 Demo")
        self.demoActive.addPropertyChangeListener(self.demoModeListener)        

    def getDelay(self, delay):
        if (sensors.provideSensor("Building Light Demo").getState() == ACTIVE) :
            delay = float(delay) / 3.0            
        return delay
        
    def simulateActivity(self):

        self.shutdown()
        self.waitMsec(5000)
        #
        self.l1BlueLight.scheduleStateChange(TriStateSensor.DIM, 0)
        self.l1VioletLight.setPeriodicStateChange(self.getDelay(3.0), self.getDelay(4.0), self.getDelay(5.0), 1)                                            
        self.callHoist("S1", 0.5)
        
        self.boilerFire.scheduleStateChange(TriStateSensor.DIM, 0)
        self.mineSideDoor.scheduleStateChange(TriStateSensor.ON, self.getDelay(0.5))
        self.whSideDoor.scheduleStateChange(TriStateSensor.ON, self.getDelay(.8))
        self.whEngineRoom.scheduleStateChange(TriStateSensor.ON, self.getDelay(1))

        self.whEngineRoom.setPeriodicStateChange(self.getDelay(2.0), self.getDelay(3.0), self.getDelay(1), 0)
        self.boilerFire.setPeriodicStateChange(self.getDelay(2.0), self.getDelay(2.0), self.getDelay(5.0), 1)
        self.wh2ndFloor.setPeriodicStateChange(self.getDelay(3.0), self.getDelay(3.0), self.getDelay(6.0), 0)
        self.whBridge.setPeriodicStateChange(self.getDelay(2.0), self.getDelay(2.0), self.getDelay(6.0), 0)                                

        self.loadingDock.scheduleStateChange(TriStateSensor.DIM, self.getDelay(1.5))
        self.roofSign.scheduleStateChange(TriStateSensor.ON, self.getDelay(2.2))
        self.roofSign.scheduleStateChange(TriStateSensor.DIM, self.getDelay(2.8))        

        self.callHoist("S2", 3)
        
        self.mineS2Light.scheduleStateChange(TriStateSensor.ON, self.getDelay(4))
        self.whEngineRoom.scheduleStateChange(TriStateSensor.OFF, self.getDelay(5))

        self.mineS2Light.scheduleStateChange(TriStateSensor.OFF, self.getDelay(6))
        self.mineS3Light.scheduleStateChange(TriStateSensor.ON, self.getDelay(7))

        self.roofSign.scheduleStateChange(TriStateSensor.ON, self.getDelay(7.5))
        self.loadingDock.scheduleStateChange(TriStateSensor.ON, self.getDelay(8))
        
        
        self.insideLights.scheduleStateChange(TriStateSensor.ON, self.getDelay(10))
        self.rightBridge.scheduleStateChange(TriStateSensor.ON, self.getDelay(11))
        self.lantern.scheduleStateChange(TriStateSensor.ON, self.getDelay(11.5))
        self.leftBridge.scheduleStateChange(TriStateSensor.ON, self.getDelay(12))

        self.lantern.scheduleStateChange(TriStateSensor.DIM, self.getDelay(13))
        
        self.chuteLight.scheduleStateChange(TriStateSensor.ON, self.getDelay(15))
        self.gateLight.scheduleStateChange(TriStateSensor.ON, self.getDelay(16))

        prob = java.util.Random().nextInt(10)
        if (prob < 3):
            self.rightChute.scheduleStateChange(TriStateSensor.ON, self.getDelay(17))
            self.rightChute.scheduleStateChange(TriStateSensor.OFF, self.getDelay(19))            
        elif (prob < 6):
            self.leftChute.scheduleStateChange(TriStateSensor.ON, self.getDelay(17))
            self.leftChute.scheduleStateChange(TriStateSensor.OFF, self.getDelay(19))                        
        else :
            self.leftChute.scheduleStateChange(TriStateSensor.ON, self.getDelay(17))
            self.rightChute.scheduleStateChange(TriStateSensor.ON, self.getDelay(17.5))
            self.leftChute.scheduleStateChange(TriStateSensor.OFF, self.getDelay(18.5))
            self.rightChute.scheduleStateChange(TriStateSensor.OFF, self.getDelay(19))                        
        
        self.gateLight.scheduleStateChange(TriStateSensor.OFF, self.getDelay(20))
        self.chuteLight.scheduleStateChange(TriStateSensor.OFF, self.getDelay(21))

        self.lantern.scheduleStateChange(TriStateSensor.OFF, self.getDelay(21.5))
        
        self.leftBridge.scheduleStateChange(TriStateSensor.OFF, self.getDelay(22))

        self.rightBridge.scheduleStateChange(TriStateSensor.OFF, self.getDelay(23))                
        self.insideLights.scheduleStateChange(TriStateSensor.OFF, self.getDelay(24))

        self.mineS3Light.scheduleStateChange(TriStateSensor.OFF, self.getDelay(25))
        self.mineS2Light.scheduleStateChange(TriStateSensor.ON, self.getDelay(26))
        self.callHoist("L1", 26.5)
        self.l1YellowLight.scheduleStateChange(TriStateSensor.ON, self.getDelay(28))
        self.callHoist("S2", 30)        
        self.l1YellowLight.scheduleStateChange(TriStateSensor.OFF, self.getDelay(30))                                          


        self.mineS2Light.scheduleStateChange(TriStateSensor.OFF, self.getDelay(35))
        self.loadingDock.scheduleStateChange(TriStateSensor.OFF, self.getDelay(36))
        self.mineSideDoor.scheduleStateChange(TriStateSensor.OFF, self.getDelay(36.5))
        self.whSideDoor.scheduleStateChange(TriStateSensor.OFF, self.getDelay(30.2))                
        self.roofSign.scheduleStateChange(TriStateSensor.DIM, self.getDelay(29))        



    def callHoist(self, level, delay):
        if (sensors.provideSensor("Hoist Motor Enabled").getState() == ACTIVE):
            if (level == "S2"):
                self.hoistS2.scheduleStateChange(TriStateSensor.ON, self.getDelay(delay))
            elif (level == "S1") :
                self.hoistL1.scheduleStateChange(TriStateSensor.ON, self.getDelay(delay))
            elif (level == "L1") :
                self.hoistL1.scheduleStateChange(TriStateSensor.ON, self.getDelay(delay))
                
    def turnAllLightsOff(self):

        self.leftChute.setState(TriStateSensor.OFF)
        self.rightChute.setState(TriStateSensor.OFF)        
        
        self.whSideDoor.setState(TriStateSensor.OFF)
        self.whBridge.setState(TriStateSensor.OFF)
        self.wh2ndFloor.setState(TriStateSensor.OFF)
        self.whEngineRoom.setState(TriStateSensor.OFF)        

        self.leftBridge.setState(TriStateSensor.OFF)
        self.rightBridge.setState(TriStateSensor.OFF)
        self.insideLights.setState(TriStateSensor.OFF)
        self.chuteLight.setState(TriStateSensor.OFF)
        self.gateLight.setState(TriStateSensor.OFF)
        self.lantern.setState(TriStateSensor.OFF)        

        self.roofSign.setState(TriStateSensor.OFF)
        self.loadingDock.setState(TriStateSensor.OFF)
        self.mineSideDoor.setState(TriStateSensor.OFF)
        self.mineS2Light.setState(TriStateSensor.OFF)
        self.mineS3Light.setState(TriStateSensor.OFF)
        
    def shutdown(self):
        
        self.turnAllLightsOff()
        self.whSideDoor.cancelScheduledTasks()
        self.whBridge.cancelScheduledTasks()
        self.wh2ndFloor.cancelScheduledTasks()
        self.whEngineRoom.cancelScheduledTasks()

        self.leftBridge.cancelScheduledTasks()
        self.rightBridge.cancelScheduledTasks()
        self.insideLights.cancelScheduledTasks()
        self.chuteLight.cancelScheduledTasks()
        self.gateLight.cancelScheduledTasks()
        self.lantern.cancelScheduledTasks()

        self.roofSign.cancelScheduledTasks()
        self.loadingDock.cancelScheduledTasks()
        self.mineSideDoor.cancelScheduledTasks()
        self.mineS2Light.cancelScheduledTasks()
        self.mineS3Light.cancelScheduledTasks

        
    def handle(self):
        
        if (self.demoActive.getState() == ACTIVE) :
            self.simulateActivity()
        else :
            self.shutdown()
            
        self.waitChange([self.demoActive], int(self.getDelay(40*60*1000)))

        if (self.demoActive.getState() == ACTIVE) :
            return True
        else:
            self.shutdown()
            return False

    class DemoModeListener(java.beans.PropertyChangeListener) :
        def init(self, simProc, shutdownProc):
            self.shutdownProc = shutdownProc
            self.simProc = simProc

        def propertyChange(self, event):
            if (event.source.getState() == jmri.Sensor.ACTIVE) :
                self.shutdownProc()
            else:
                self.simProc()
            return  
Example #6
0
    def init(self):

        self.debug = sensors.provideSensor("Private").getState() == ACTIVE
        self.trainPresentSensor = sensors.provideSensor("OS: Freight House")

        locoNumber = memories.provideMemory("L1 Loco Number").getValue()
        self.mineTrain = MineTrain()
        self.mineTrain.init(locoNumber, 1)
        self.tippleLights = sensors.provideSensor("Tipple Lights")
        self.bridgeLights = sensors.provideSensor("Lake Cavern Bridge")
        self.stoppingAtTipple = sensors.provideSensor("Stopping at Tipple")
        self.stoppingAtLake = sensors.provideSensor("Stopping at Lake")
        self.tippleSensor = sensors.provideSensor("OS:L1:Tipple")
        self.leftTunnelSensor = sensors.provideSensor("OS:L1:Left Tunnel")
        self.frontTunnelSensor = sensors.provideSensor("OS:L1:Front Tunnel")
        self.rightTunnelSensor = sensors.provideSensor("OS:L1:Right Tunnel")
        self.backTunnelSensor = sensors.provideSensor("OS:L1:Back Tunnel")
        self.backCavernSensor = sensors.provideSensor("OS:L1:Back Cavern")
        self.hoistCavernEntranceSensor = sensors.provideSensor(
            "OS:L1:Hoist Cavern Entrance")
        self.hoistCavernEOTSensor = sensors.provideSensor("OS:L1:Hoist EOT")
        self.hoistCavernSensor = sensors.provideSensor("OS:L1:Hoist Cavern")

        self.splash = []
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/singleSwimmer.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash2.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash3.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash4.wav"))

        self.rightTunnelSignal = masts.getSignalMast("SM-L1-RT-E")
        self.hoistCavernEntranceSignal = masts.getSignalMast("SM-L1-HCE-E")
        self.backTunnelSignal = masts.getSignalMast("SM-L1-E-Back Tunnel")

        self.raiseHoistSound = jmri.jmrit.Sound(
            jmri.util.FileUtil.getExternalFilename(
                "preference:resources/sounds/Short-Short-Long-Signal.wav"))
        self.lowerHoistSound = jmri.jmrit.Sound(
            jmri.util.FileUtil.getExternalFilename(
                "preference:resources/sounds/Short-Long-Signal.wav"))

        self.t1FHSensor = sensors.provideSensor("OS: T1 Freight House")
        self.t1DSensor = sensors.provideSensor("OS: T1 Depot")
        self.t1WTSensor = sensors.provideSensor("OS: T1 Water Tower")
        self.t1BSensor = sensors.provideSensor("OS: T1 Bridge")

        self.roofSignOn = sensors.provideSensor(
            "Mine Building Roof Sign On")  # Mine Bldg Roof Sign
        self.roofSignOff = sensors.provideSensor(
            "Mine Building Roof Sign Off")  # Mine Bldg Roof Sign
        self.roofSignDim = sensors.provideSensor(
            "Mine Building Roof Sign Dim")  # Mine Bldg Roof Sign
        self.roofSign = TriStateSensor(self.roofSignDim, self.roofSignOn,
                                       self.roofSignOff)

        self.boilerFire = TriStateSensor(
            sensors.provideSensor("Winding House Boiler Low"),
            sensors.provideSensor("Winding House Boiler High"),
            sensors.provideSensor("Winding House Boiler Off"))
        self.boilerFire.setState(TriStateSensor.DIM)
        self.boilerFire.setPeriodicStateChange(0.0, 5.0, 1.0, 1)

        self.loadingDock = TriStateSensor(
            sensors.provideSensor("Mine Building Loading Dock Dim"),
            sensors.provideSensor("Mine Building Loading Dock On"),
            sensors.provideSensor("Mine Building Loading Dock Off"))
        self.sideDoor = sensors.provideSensor(
            "Mine Bldg Side Soor")  # Mine Bldg Side Door
        self.lockerRoom = sensors.provideSensor(
            "Mine Bldg S2")  # Mine Bldg Level 2 - Locker Room
        self.tipple = sensors.provideSensor("Mine Bldg S3")  # Mine Bldg Tipple

        self.roofSign.setState(TriStateSensor.OFF)

        self.occupancySensors = []
        self.occupancySensors.append(self.t1FHSensor)
        self.occupancySensors.append(self.t1DSensor)
        self.occupancySensors.append(self.t1WTSensor)
        self.occupancySensors.append(self.t1BSensor)

        self.hoistLevelIndicators = []
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L4 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L3 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L2 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L1 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S1 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S2 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S3 Indicator"))

        for i in range(len(self.hoistLevelIndicators)):
            sen = self.hoistLevelIndicators[i]
            sen.requestUpdateFromLayout()
            knownState = sen.getKnownState()
            print "Known state [" + str(i) + "] is " + str(knownState)
            rawState = sen.getRawState()
            print "Raw state [" + str(i) + "] is " + str(rawState)

        self.hoistCallButtons = []
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L4"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L3"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L2"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L1"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S1"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S2"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S3"))

        self.hoistBottomSensor = sensors.provideSensor("Hoist L3 Indicator")

        self.scheduleTimes = []
        self.scheduleTimes.append(memories.provideMemory("Arrives Depot"))

        self.bridgeLight = sensors.provideSensor("Winding House Bridge")
        self.sideDoorLight = sensors.provideSensor("Winding House Side Door")
        self.engineRoomLights = sensors.provideSensor(
            "Winding House Engine Room")
        self.engineRoomDim = sensors.provideSensor(
            "Winding House Engine Room Dim")
        self.secondFloorLight = sensors.provideSensor(
            "Winding House 2nd Floor Inside")

        #        self.boilerIntensity = sensors.provideSensor("Winding House Boiler Intensity")
        #        self.boilerFire = sensors.provideSensor("Winding House Boiler Fire")

        self.level1Light = sensors.provideSensor("Level 1 Light")
        self.level1LightDim = sensors.provideSensor("Level 1 Light Dim")

        self.engineRoomLightDimmer = sensors.provideSensor(
            "Winding House Engine Room Dim")
        self.currentHoistIdx = -1
        self.mineTour = sensors.provideSensor("Mine Tour")
Example #7
0
class WindingHouse(jmri.jmrit.automat.AbstractAutomaton):
    def init(self):

        self.debug = sensors.provideSensor("Private").getState() == ACTIVE
        self.trainPresentSensor = sensors.provideSensor("OS: Freight House")

        locoNumber = memories.provideMemory("L1 Loco Number").getValue()
        self.mineTrain = MineTrain()
        self.mineTrain.init(locoNumber, 1)
        self.tippleLights = sensors.provideSensor("Tipple Lights")
        self.bridgeLights = sensors.provideSensor("Lake Cavern Bridge")
        self.stoppingAtTipple = sensors.provideSensor("Stopping at Tipple")
        self.stoppingAtLake = sensors.provideSensor("Stopping at Lake")
        self.tippleSensor = sensors.provideSensor("OS:L1:Tipple")
        self.leftTunnelSensor = sensors.provideSensor("OS:L1:Left Tunnel")
        self.frontTunnelSensor = sensors.provideSensor("OS:L1:Front Tunnel")
        self.rightTunnelSensor = sensors.provideSensor("OS:L1:Right Tunnel")
        self.backTunnelSensor = sensors.provideSensor("OS:L1:Back Tunnel")
        self.backCavernSensor = sensors.provideSensor("OS:L1:Back Cavern")
        self.hoistCavernEntranceSensor = sensors.provideSensor(
            "OS:L1:Hoist Cavern Entrance")
        self.hoistCavernEOTSensor = sensors.provideSensor("OS:L1:Hoist EOT")
        self.hoistCavernSensor = sensors.provideSensor("OS:L1:Hoist Cavern")

        self.splash = []
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/singleSwimmer.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash2.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash3.wav"))
        self.splash.append(
            self.mineTrain.loadSoundFile(
                "preference:resources/sounds/Splash4.wav"))

        self.rightTunnelSignal = masts.getSignalMast("SM-L1-RT-E")
        self.hoistCavernEntranceSignal = masts.getSignalMast("SM-L1-HCE-E")
        self.backTunnelSignal = masts.getSignalMast("SM-L1-E-Back Tunnel")

        self.raiseHoistSound = jmri.jmrit.Sound(
            jmri.util.FileUtil.getExternalFilename(
                "preference:resources/sounds/Short-Short-Long-Signal.wav"))
        self.lowerHoistSound = jmri.jmrit.Sound(
            jmri.util.FileUtil.getExternalFilename(
                "preference:resources/sounds/Short-Long-Signal.wav"))

        self.t1FHSensor = sensors.provideSensor("OS: T1 Freight House")
        self.t1DSensor = sensors.provideSensor("OS: T1 Depot")
        self.t1WTSensor = sensors.provideSensor("OS: T1 Water Tower")
        self.t1BSensor = sensors.provideSensor("OS: T1 Bridge")

        self.roofSignOn = sensors.provideSensor(
            "Mine Building Roof Sign On")  # Mine Bldg Roof Sign
        self.roofSignOff = sensors.provideSensor(
            "Mine Building Roof Sign Off")  # Mine Bldg Roof Sign
        self.roofSignDim = sensors.provideSensor(
            "Mine Building Roof Sign Dim")  # Mine Bldg Roof Sign
        self.roofSign = TriStateSensor(self.roofSignDim, self.roofSignOn,
                                       self.roofSignOff)

        self.boilerFire = TriStateSensor(
            sensors.provideSensor("Winding House Boiler Low"),
            sensors.provideSensor("Winding House Boiler High"),
            sensors.provideSensor("Winding House Boiler Off"))
        self.boilerFire.setState(TriStateSensor.DIM)
        self.boilerFire.setPeriodicStateChange(0.0, 5.0, 1.0, 1)

        self.loadingDock = TriStateSensor(
            sensors.provideSensor("Mine Building Loading Dock Dim"),
            sensors.provideSensor("Mine Building Loading Dock On"),
            sensors.provideSensor("Mine Building Loading Dock Off"))
        self.sideDoor = sensors.provideSensor(
            "Mine Bldg Side Soor")  # Mine Bldg Side Door
        self.lockerRoom = sensors.provideSensor(
            "Mine Bldg S2")  # Mine Bldg Level 2 - Locker Room
        self.tipple = sensors.provideSensor("Mine Bldg S3")  # Mine Bldg Tipple

        self.roofSign.setState(TriStateSensor.OFF)

        self.occupancySensors = []
        self.occupancySensors.append(self.t1FHSensor)
        self.occupancySensors.append(self.t1DSensor)
        self.occupancySensors.append(self.t1WTSensor)
        self.occupancySensors.append(self.t1BSensor)

        self.hoistLevelIndicators = []
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L4 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L3 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L2 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist L1 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S1 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S2 Indicator"))
        self.hoistLevelIndicators.append(
            sensors.provideSensor("Hoist S3 Indicator"))

        for i in range(len(self.hoistLevelIndicators)):
            sen = self.hoistLevelIndicators[i]
            sen.requestUpdateFromLayout()
            knownState = sen.getKnownState()
            print "Known state [" + str(i) + "] is " + str(knownState)
            rawState = sen.getRawState()
            print "Raw state [" + str(i) + "] is " + str(rawState)

        self.hoistCallButtons = []
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L4"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L3"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L2"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To L1"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S1"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S2"))
        self.hoistCallButtons.append(
            sensors.provideSensor("IS Call Hoist To S3"))

        self.hoistBottomSensor = sensors.provideSensor("Hoist L3 Indicator")

        self.scheduleTimes = []
        self.scheduleTimes.append(memories.provideMemory("Arrives Depot"))

        self.bridgeLight = sensors.provideSensor("Winding House Bridge")
        self.sideDoorLight = sensors.provideSensor("Winding House Side Door")
        self.engineRoomLights = sensors.provideSensor(
            "Winding House Engine Room")
        self.engineRoomDim = sensors.provideSensor(
            "Winding House Engine Room Dim")
        self.secondFloorLight = sensors.provideSensor(
            "Winding House 2nd Floor Inside")

        #        self.boilerIntensity = sensors.provideSensor("Winding House Boiler Intensity")
        #        self.boilerFire = sensors.provideSensor("Winding House Boiler Fire")

        self.level1Light = sensors.provideSensor("Level 1 Light")
        self.level1LightDim = sensors.provideSensor("Level 1 Light Dim")

        self.engineRoomLightDimmer = sensors.provideSensor(
            "Winding House Engine Room Dim")
        self.currentHoistIdx = -1
        self.mineTour = sensors.provideSensor("Mine Tour")


#        self.boilerIntensity.setState(INACTIVE)
#        self.boilerFire.setState(ACTIVE)

    def findHoist(self):
        i = 0
        while (self.currentHoistIdx < 0
               and i < len(self.hoistLevelIndicators)):
            if (self.hoistLevelIndicators[i].getState() == ACTIVE):
                self.currentHoistIdx = i
            i = i + 1

    def turnOn(self, sensor, dim, isDim, indicator):
        if (self.debug):
            print "Turning on " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(time.time()).strftime("%I:%M")
        if (dim is not None):
            if (isDim):
                dim.setState(ACTIVE)
            else:
                dim.setState(INACTIVE)
        try:
            sensor.setState(ACTIVE)
            self.waitMsec(250)
            sensor.setState(ACTIVE)
            self.waitMsec(250)
            sensor.setState(ACTIVE)
        except:
            sensor.setState(jmri.jmrix.nce.NceLight.ON)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.ON)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.ON)
        if (self.debug):
            print "Turned on " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(time.time()).strftime("%I:%M")

    def turnOffDimmable(self, onSensor, offSensor, dimSensor):
        if (self.debug):
            print "Turning off " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(mktime(
                time.localtime())).strftime("%I:%M")
        try:
            onSensor.setState(INACTIVE)
            offSensor
            self.waitMsec(250)
            onSensor.setState(INACTIVE)
            self.waitMsec(250)
            onSensor.setState(INACTIVE)
        except:
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
        if (self.debug):
            print "Turned off " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(mktime(
                time.localtime())).strftime("%I:%M")

    def turnOff(self, sensor, indicator):
        if (self.debug):
            print "Turning off " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(mktime(
                time.localtime())).strftime("%I:%M")
        try:
            sensor.setState(INACTIVE)
            self.waitMsec(250)
            sensor.setState(INACTIVE)
            self.waitMsec(250)
            sensor.setState(INACTIVE)
        except:
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
        if (self.debug):
            print "Turned off " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(mktime(
                time.localtime())).strftime("%I:%M")

    def dimLightAfter(self, departureTime, offset, sensor, dimmer, indicator):
        xtime = departureTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [sensor, dimmer, True, indicator]).start()

    def turnOffLightAfter(self, departureTime, offset, light, indicator):
        xtime = departureTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOff,
                        [light, indicator]).start()
        if (self.debug):
            print "Scheduled turning off " + light.getUserName()

    def turnOffLightBefore(self, departureTime, offset, light, indicator):
        xtime = departureTime - timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOff,
                        [light, indicator]).start()

    def turnOnLightBefore(self, arrivalTime, offset, light, dimmer, isDim,
                          indicator):
        xtime = arrivalTime - timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [light, dimmer, isDim, indicator]).start()

    def turnOnLightAfter(self, arrivalTime, offset, light, dimmer, isDim,
                         indicator):
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [light, dimmer, isDim, indicator]).start()

    def scheduleDeparture(self):
        memVal = memories.provideMemory("Departs Depot").getValue()
        if (memVal != None):
            departureTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")

            if (self.mineTour.getState() != ACTIVE):
                self.turnOffLightAfter(departureTime, 5, self.engineRoomDim,
                                       None)
                self.turnOffLightAfter(departureTime, 9, self.bridgeLight,
                                       None)
                self.turnOffLightAfter(departureTime, 11, self.sideDoorLight,
                                       None)

                self.turnOffLightAfter(departureTime, 8, self.engineRoomLights,
                                       None)
                self.turnOnLightAfter(departureTime, 8, self.secondFloorLight,
                                      None, False, None)

    def scheduleArrival(self):
        memVal = memories.provideMemory("Arrives Depot").getValue()
        if (memVal != None):
            arrivalTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")

            if (self.mineTour.getState() == ACTIVE):
                if (self.roofSign.getState() == TriStateSensor.ON):
                    arrivalTime = datetime.fromtimestamp(time.time())
                    #  Schedule a mine tour to begin 1 minute after train arrives ... there are delays in the mine tour function
                    print "Scheduling mine tour"

                    threading.Timer(10, self.mineTourB, [arrivalTime]).start()
            else:
                #  Turn on winding house lights
                self.turnOnLightBefore(arrivalTime, 15, self.engineRoomLights,
                                       None, False, None)
                if (java.util.Random().nextInt(100) < 50):
                    self.turnOnLightBefore(arrivalTime, 15, self.engineRoomDim,
                                           None, False, None)
                else:
                    self.turnOffLightBefore(arrivalTime, 15,
                                            self.engineRoomDim, None)
                self.turnOnLightBefore(arrivalTime, 14, self.sideDoorLight,
                                       None, False, None)
                self.turnOnLightBefore(arrivalTime, 13, self.bridgeLight, None,
                                       False, None)

    def setHoistLevel(self, gotoIdx):
        if (self.mineTour.getState() == ACTIVE):
            i = 0
            self.currentHoistIdx = -1
            while (self.currentHoistIdx < 0
                   and i < len(self.hoistLevelIndicators)):
                if (self.hoistLevelIndicators[i].getState() == ACTIVE):
                    self.currentHoistIdx = i
                i = i + 1
            print "In setHoistLevel, currentHoistIdx = " + str(
                self.currentHoistIdx)
            if (self.currentHoistIdx > 0):
                if (gotoIdx > self.currentHoistIdx):  # Going up
                    self.raiseHoistSound.play()
                    self.waitMsec(8000)
                elif (gotoIdx < self.currentHoistIdx):  # Going down
                    self.lowerHoistSound.play()
                    self.waitMsec(8000)
                if (self.mineTour.getState() == ACTIVE):
                    self.hoistCallButtons[gotoIdx].setState(ACTIVE)

    def moveHoist(self, arrivalTime, offset, gotoIdx):
        delta = timedelta(minutes=(abs(offset)))
        if (offset > 0):
            xtime = arrivalTime + delta
        else:
            xtime = arrivalTime - delta
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.setHoistLevel,
                        [gotoIdx]).start()
        print "Hoist scheduled to goto level " + str(
            gotoIdx) + " after " + str(delay.total_seconds()) + " seconds"

    def waitBlockOccupied(self, sensor):
        self.ostate = sensor.getState()
        self.waitingFor.setValue(sensor.getUserName())
        self.waitChange([sensor], 30000)
        if (self.ostate == sensor.getState()):
            print "Sensor timed out " + sensor.getUserName()
        self.waitingFor.setValue("")
        return

    def undergroundTour(self):
        #
        #  Find train  by running until it gets to tipple.
        self.stoppingAtTipple.setState(ACTIVE)
        self.mineTrain.startTrain(True)

        self.waitBlockOccupied(self.tippleSensor)
        if (self.rightTunnelSignal.getAspect() == "Stop"):
            self.waitMsec(2100)
            self.mineTrain.stopTrain()
            self.waitMsec(2000)
            self.mineTrain.startTrainSlow(False)

            # Stop at cavern entrance
            self.waitBlockOccupied(self.hoistCavernEntranceSensor)
            #
            #  Wait for cage to reach L3
            self.stoppingAtTipple.setState(INACTIVE)
            self.waitSensorActive(self.hoistBottomSensor)

            #
            #  Wait for tourists to board train
            self.waitMsec(20000)

            #  Go back to tipple
            self.stoppingAtTipple.setState(ACTIVE)
            self.mineTrain.startTrainSlow(True)
            self.waitBlockOccupied(self.tippleSensor)
            self.mineTrain.stopTrain()
            self.waitMsec(10000)

            #
            #  Go to Lake Cavern
            self.stoppingAtTipple.setState(INACTIVE)
            self.stoppingAtLake.setState(ACTIVE)
            self.mineTrain.startTrainSlow(True)

            #  Turn on bridge lights when we enter tunnel
            self.waitBlockOccupied(self.rightTunnelSensor)
            self.bridgeLights.setState(ACTIVE)

            self.waitBlockOccupied(self.backCavernSensor)
            if (self.backTunnelSignal.getAspect() == "Stop"):

                self.waitMsec(1200)
                self.mineTrain.stopTrain()
                for i in range(0, 5):
                    splashProb = java.util.Random().nextInt(100)
                    delay = java.util.Random().nextInt(3)
                    if (splashProb > 20):
                        self.splash[i].play()
                        self.waitMsec(2000 * delay)

                self.mineTrain.startTrainSlow(True)

                self.waitMsec(3000)
                self.bridgeLights.setState(INACTIVE)

            #
            #  wait for tourists to get off train
            self.waitBlockOccupied(self.hoistCavernEntranceSensor)
            self.mineTrain.stopTrain()
            self.waitMsec(20000)

            #
            #  Move train away from turnout
            self.mineTrain.startTrainSlow()
            self.waitBlockOccupied(self.tippleSensor)
            self.mineTrain.stopTrain()

    #
    #  Mine tour B takes visitors on a top-down tour of the mine.  First going up to the tipple & winding house,
    #  then down to the locker room before going down into the mine.
    def mineTourB(self, arrivalTime):
        if (self.roofSign.getState() == TriStateSensor.ON):
            self.findHoist()
            self.boilerFire.setState(TriStateSensor.ON)
            #            self.boilerIntensity.setState(ACTIVE)
            self.roofSign.setState(TriStateSensor.ON)

            #  Roof sign indicates a tour in progress.  We don't start another tour (triggered by train arrival) if a tour is
            #  already in progress.
            #self.mineBuilding.turnOnLightBefore(arrivalTime, 5, self.roofSign, None, False, None)

            #
            #  Begin tour.  Turn on side light and move cage to surface level.  Don't keep the side door light on while
            #  the tour is going.
            self.turnOnLightAfter(arrivalTime, 1, self.sideDoor, None, False,
                                  None)
            self.moveHoist(arrivalTime, 1,
                           4)  # Move hoist to surface to pick up tourists
            self.turnOffLightAfter(arrivalTime, 4, self.sideDoor, None)

            #
            #  Go up to tipple level
            self.turnOnLightAfter(arrivalTime, 5, self.tipple, None, False,
                                  None)
            #self.moveHoist(arrivalTime, 8, 6) # Move hoist to tipple - Go up to tipple to see ore dump
            self.turnOnLightAfter(arrivalTime, 10, self.bridgeLight, None,
                                  False, None)
            self.turnOffLightAfter(arrivalTime, 12, self.bridgeLight, None)
            self.turnOffLightAfter(arrivalTime, 12, self.tipple, None)

            #
            #  Go down to locker level
            self.turnOnLightAfter(arrivalTime, 14, self.lockerRoom, None,
                                  False, None)
            self.moveHoist(arrivalTime, 15, 5)  # Move hoist to locker
            self.turnOffLightAfter(arrivalTime, 23, self.lockerRoom, None)

            self.moveHoist(arrivalTime, 25,
                           1)  # Move hoist to mine level 3 - Tour mine
            self.undergroundTour()

            #self.moveHoist(arrivalTime, 40, 0) # Move hoist to sump - Return down to thermal spring
            #self.moveHoist(arrivalTime, 50, 1) # Move hoist to mine level 3 - Back to main level - tram to Lake Cavern
            self.turnOnLighAfter(arrivalTime, 60, self.level1Light,
                                 self.level1LightDim, False, None)
            self.moveHoist(arrivalTime, 70,
                           3)  # Move hoist to Level 1 - Shower level

            self.turnOnLightAfter(arrivalTime, 75, self.lockerRoom, None,
                                  False, None)
            self.turnOnLighAfter(arrivalTime, 76, self.level1Light,
                                 self.level1LightDim, True, None)
            self.moveHoist(arrivalTime, 80, 5)  # Move hoist to locker
            self.turnOffLightAfter(arrivalTime, 100, self.lockerRoom, None)

            self.turnOnLightAfter(arrivalTime, 93, self.sideDoor, None, False,
                                  None)
            self.moveHoist(arrivalTime, 95, 4)  # Move hoist to surface
            self.turnOffLightAfter(arrivalTime, 105, self.sideDoor, None)

            self.turnOffLightAfter(arrivalTime, 109, self.level1Light, None)

            self.roofSign.scheduleStateChange(TriStateSensor.OFF, 2)

    def handle(self):
        self.debug = sensors.provideSensor("Private").getState() == ACTIVE

        self.waitSensorChange(self.mineTour.getState(), self.mineTour)
        if (self.mineTour.getState() == ACTIVE):
            self.waitMsec(2000)
            self.scheduleArrival()
            self.scheduleDeparture()
        else:
            self.roofSign.setState(TriStateSensor.OFF)
            self.scheduleArrival()

        return True
Example #8
0
class DevilsGulchFreightHouse(jmri.jmrit.automat.AbstractAutomaton):
    def init(self):
        #

        self.arrivesMemoryVariable = "Arrives Freight House"
        self.departsMemoryVariable = "Departs Freight House"
        self.freightHouse = Building()
        self.freightHouse.init(self.arrivesMemoryVariable,
                               self.departsMemoryVariable)

        self.scheduleTimes = []
        self.scheduleTimes.append(
            memories.provideMemory(self.arrivesMemoryVariable))

        #self.stove = lights.provideLight("NL120");
        #self.platformLights = lights.provideLight("NL121");
        #self.officeLight = lights.provideLight("NL122");
        #self.dockLight = lights.provideLight("NL123");

        #self.platformIndicator = lights.provideLight("IL121");
        #self.officeIndicator = lights.provideLight("IL122");
        #self.dockIndicator = lights.provideLight("IL123");

        #self.platformLightDimmer = lights.provideLight("NL124");
        #self.officeLightDimmer = lights.provideLight("NL125");
        #self.dockLightDimmer = lights.provideLight("NL126");

        self.freightDock = TriStateSensor(
            sensors.provideSensor("Freight Dock Dim"),
            sensors.provideSensor("Freight Dock On"),
            sensors.provideSensor("Freight Dock Off"))

        self.freightOffice = TriStateSensor(
            sensors.provideSensor("Freight Office Dim"),
            sensors.provideSensor("Freight Office On"),
            sensors.provideSensor("Freight Office Off"))

        self.freightPlatform = TriStateSensor(
            sensors.provideSensor("Freight Platform Dim"),
            sensors.provideSensor("Freight Platform On"),
            sensors.provideSensor("Freight Platform Off"))

        self.freightStove = TriStateSensor(
            None, sensors.provideSensor("Freight Stove"), None)

        self.sideDoor = sensors.provideSensor(
            "Mine Bldg Side Soor")  # Mine Bldg Side Door
        self.lockerRoom = sensors.provideSensor(
            "Mine Bldg S2")  # Mine Bldg Level 2 - Locker Room
        self.tipple = sensors.provideSensor("Mine Bldg S3")  # Mine Bldg Tipple

    def scheduleDeparture(self):
        memVal = memories.provideMemory(self.departsMemoryVariable).getValue()
        if (memVal != None):

            depStr = memVal[0:19]
            departureTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")
            self.freightOffice.scheduleStateChangeAfter(
                TriStateSensor.DIM, depStr, 3)
            self.freightDock.scheduleStateChangeAfter(TriStateSensor.DIM,
                                                      depStr, 6)
            self.freightPlatform.scheduleStateChangeAfter(
                TriStateSensor.DIM, depStr, 4)

            self.freightDock.scheduleStateChangeAfter(TriStateSensor.OFF,
                                                      depStr, 10)
            self.freightPlatform.scheduleStateChangeAfter(
                TriStateSensor.OFF, depStr, 11)
            self.freightOffice.scheduleStateChangeAfter(
                TriStateSensor.OFF, depStr, 12)
            self.freightStove.scheduleStateChangeAfter(TriStateSensor.OFF,
                                                       depStr, 14)

            if (java.util.Random().nextInt(10) > 5):
                self.freightOffice.scheduleStateChangeAfter(
                    TriStateSensor.DIM, depStr, 18)
                self.freightOffice.scheduleStateChangeAfter(
                    TriStateSensor.OFF, depStr, 22)

                self.freightDock.scheduleStateChangeAfter(
                    TriStateSensor.DIM, depStr, 19)
                self.freightDock.scheduleStateChangeAfter(
                    TriStateSensor.OFF, depStr, 22)

    def scheduleArrival(self):
        memVal = memories.provideMemory("Arrives Depot").getValue()
        if (memVal != None):
            arrStr = memVal[0:19]
            arrivalTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")

            #  Station master arrives & turns on office light
            self.freightOffice.scheduleStateChangeBefore(
                TriStateSensor.ON, arrStr, 10)
            self.freightStove.scheduleStateChangeBefore(
                TriStateSensor.ON, arrStr, 9)

            self.freightPlatform.scheduleStateChangeBefore(
                TriStateSensor.DIM, arrStr, 7)
            self.freightPlatform.scheduleStateChangeBefore(
                TriStateSensor.ON, arrStr, 3)

            self.freightDock.scheduleStateChangeBefore(TriStateSensor.DIM,
                                                       arrStr, 6)
            self.freightDock.scheduleStateChangeBefore(TriStateSensor.ON,
                                                       arrStr, 2)

    def handle(self):

        self.waitChange(self.scheduleTimes)
        self.scheduleArrival()
        self.scheduleDeparture()

        return True
Example #9
0
    def init(self):

        self.shuttingDown = False

        self.throttle = self.getThrottle(
            int(memories.provideMemory("L4 Locomotive").getValue()), False)

        self.activity = memories.provideMemory("S4 Action")

        self.BOT = sensors.provideSensor("OS:L4:BOT")
        self.EOT = sensors.provideSensor("OS:L4:Tipple-EOT")
        self.MineBldg = sensors.provideSensor("OS:L4:Mine Building")
        self.switch = sensors.provideSensor("S3 Auto")
        self.l3switch = sensors.provideSensor("L1 Auto")
        self.l2switch = sensors.provideSensor("L2 Auto")
        self.mineBldgLoadingDockLight = sensors.provideSensor(
            "Mine Bldg Loading Dock")
        self.mineBldgS2Light = sensors.provideSensor("Mine Bldg S2")
        self.mineBldgS3Light = sensors.provideSensor("Mine Bldg S3")
        self.windingHouseBridgeLight = sensors.provideSensor(
            "Winding House Bridge")
        self.gateLight = lights.provideLight("Tipple Gate Light")
        self.chuteLight = lights.provideLight("Tipple Chute Light")

        self.chuteLeft = sensors.provideSensor("Tipple Chute Left")
        self.chuteRight = sensors.provideSensor("Tipple Chute Right")

        self.redLantern = lights.provideLight("LL97")
        self.whiteLantern = lights.provideLight("LL96")
        self.leftBridgeLight = lights.provideLight("LL92")
        self.rightBridgeLight = lights.provideLight("LL93")
        self.tippleLights = lights.provideLight("LL94")

        self.roofSign = TriStateSensor(
            sensors.provideSensor("Mine Building Roof Sign Dim"),
            sensors.provideSensor("Mine Building Roof Sign On"),
            sensors.provideSensor("Mine Building Roof Sign Off"))

        self.roofSign.setState(TriStateSensor.DIM)

        self.whEngineRoom = TriStateSensor(
            sensors.provideSensor("Winding House Engine Room Dim"),
            sensors.provideSensor("Winding House Engine Room On"),
            sensors.provideSensor("Winding House Engine Room Off"))

        self.boilerFire = TriStateSensor(
            sensors.provideSensor("Winding House Boiler Low"),
            sensors.provideSensor("Winding House Boiler High"),
            sensors.provideSensor("Winding House Boiler Off"))

        self.level1Light = sensors.provideSensor("Level 1 Light")
        self.level1LightDim = sensors.provideSensor("Level 1 Light Dim")

        self.s1Button = sensors.provideSensor("IS Call Hoist To S1")
        self.s2Button = sensors.provideSensor("IS Call Hoist To S2")
        self.l3Button = sensors.provideSensor("IS Call Hoist To L3")
        self.s1Indicator = sensors.provideSensor("Hoist S1 Indicator")
        self.s2Indicator = sensors.provideSensor("Hoist S2 Indicator")
        self.l3Indicator = sensors.provideSensor("Hoist L3 Indicator")
        self.useHoist = sensors.provideSensor("Hoist Motor Enabled")

        self.loopCount = 0
        self.buildingLightDemo = sensors.provideSensor("Building Light Demo")
        self.random = java.util.Random()
        self.firstTime = True
        self.trainMoving = False

        masts.getSignalMast("Auto Train Indicator Mast").setAspect("Steady")

        self.whEngineRoom.setPeriodicStateChange(.25, 3.0, 1.0, 0)
        self.boilerFire.setPeriodicStateChange(.25, 2.0, 5.0, 1)

        print "S3 Train Init Complete"
Example #10
0
class TippleTrain(jmri.jmrit.automat.AbstractAutomaton):
    def init(self):

        self.shuttingDown = False

        self.throttle = self.getThrottle(
            int(memories.provideMemory("L4 Locomotive").getValue()), False)

        self.activity = memories.provideMemory("S4 Action")

        self.BOT = sensors.provideSensor("OS:L4:BOT")
        self.EOT = sensors.provideSensor("OS:L4:Tipple-EOT")
        self.MineBldg = sensors.provideSensor("OS:L4:Mine Building")
        self.switch = sensors.provideSensor("S3 Auto")
        self.l3switch = sensors.provideSensor("L1 Auto")
        self.l2switch = sensors.provideSensor("L2 Auto")
        self.mineBldgLoadingDockLight = sensors.provideSensor(
            "Mine Bldg Loading Dock")
        self.mineBldgS2Light = sensors.provideSensor("Mine Bldg S2")
        self.mineBldgS3Light = sensors.provideSensor("Mine Bldg S3")
        self.windingHouseBridgeLight = sensors.provideSensor(
            "Winding House Bridge")
        self.gateLight = lights.provideLight("Tipple Gate Light")
        self.chuteLight = lights.provideLight("Tipple Chute Light")

        self.chuteLeft = sensors.provideSensor("Tipple Chute Left")
        self.chuteRight = sensors.provideSensor("Tipple Chute Right")

        self.redLantern = lights.provideLight("LL97")
        self.whiteLantern = lights.provideLight("LL96")
        self.leftBridgeLight = lights.provideLight("LL92")
        self.rightBridgeLight = lights.provideLight("LL93")
        self.tippleLights = lights.provideLight("LL94")

        self.roofSign = TriStateSensor(
            sensors.provideSensor("Mine Building Roof Sign Dim"),
            sensors.provideSensor("Mine Building Roof Sign On"),
            sensors.provideSensor("Mine Building Roof Sign Off"))

        self.roofSign.setState(TriStateSensor.DIM)

        self.whEngineRoom = TriStateSensor(
            sensors.provideSensor("Winding House Engine Room Dim"),
            sensors.provideSensor("Winding House Engine Room On"),
            sensors.provideSensor("Winding House Engine Room Off"))

        self.boilerFire = TriStateSensor(
            sensors.provideSensor("Winding House Boiler Low"),
            sensors.provideSensor("Winding House Boiler High"),
            sensors.provideSensor("Winding House Boiler Off"))

        self.level1Light = sensors.provideSensor("Level 1 Light")
        self.level1LightDim = sensors.provideSensor("Level 1 Light Dim")

        self.s1Button = sensors.provideSensor("IS Call Hoist To S1")
        self.s2Button = sensors.provideSensor("IS Call Hoist To S2")
        self.l3Button = sensors.provideSensor("IS Call Hoist To L3")
        self.s1Indicator = sensors.provideSensor("Hoist S1 Indicator")
        self.s2Indicator = sensors.provideSensor("Hoist S2 Indicator")
        self.l3Indicator = sensors.provideSensor("Hoist L3 Indicator")
        self.useHoist = sensors.provideSensor("Hoist Motor Enabled")

        self.loopCount = 0
        self.buildingLightDemo = sensors.provideSensor("Building Light Demo")
        self.random = java.util.Random()
        self.firstTime = True
        self.trainMoving = False

        masts.getSignalMast("Auto Train Indicator Mast").setAspect("Steady")

        self.whEngineRoom.setPeriodicStateChange(.25, 3.0, 1.0, 0)
        self.boilerFire.setPeriodicStateChange(.25, 2.0, 5.0, 1)

        print "S3 Train Init Complete"

    def releaseSteam(self):
        self.setActivityMsg("Blow out Boiler")
        self.throttle.setF4(True)
        self.waitMsec(java.util.Random().nextInt(1000) + 1200)
        self.throttle.setF4(False)
        self.setActivityMsg("")

    def forwardWhistle(self):
        self.throttle.setF2(True)
        self.waitMsec(1600)
        self.throttle.setF2(False)
        self.waitMsec(750)
        self.throttle.setF2(True)
        self.waitMsec(1600)
        self.throttle.setF2(False)

    def reverseWhistle(self):
        self.throttle.setF3(not self.throttle.getF3())
        self.waitMsec(600)
        self.throttle.setF3(not self.throttle.getF3())
        self.waitMsec(600)
        self.throttle.setF3(not self.throttle.getF3())

    def moveTrainForward(self):
        if (not self.trainMoving):
            self.throttle.setF5(False)
            self.throttle.setF7(False)
            self.throttle.setF8(False)
            self.waitMsec(1000)
            self.forwardWhistle()
            self.waitMsec(500)
            self.throttle.setF1(True)
            self.waitMsec(1000)
            self.throttle.setIsForward(True)
            self.throttle.setSpeedSetting(0.04)
            self.waitMsec(2000)
            self.throttle.setSpeedSetting(0.1)
            self.trainMoving = True

    def moveTrainReverse(self):
        if (not self.trainMoving):
            self.throttle.setF5(False)
            self.throttle.setF7(False)
            self.throttle.setF8(False)
            self.waitMsec(1000)
            self.reverseWhistle()
            self.waitMsec(500)
            self.throttle.setF1(True)
            self.waitMsec(1000)
            self.throttle.setIsForward(False)
            self.throttle.setSpeedSetting(0.04)
            self.waitMsec(1500)
            self.throttle.setSpeedSetting(0.1)
            self.trainMoving = True

    def stopTrain(self):
        if (self.trainMoving):
            self.throttle.setF7(True)
            self.waitMsec(750)
            self.throttle.setSpeedSetting(0)
            self.waitMsec(1000)
            self.throttle.setF1(False)
            self.waitMsec(1200)
            self.throttle.setF3(not self.throttle.getF3())
            self.waitMsec(1000)
            self.throttle.setF5(True)
            self.trainMoving = False

    def turnOutTippleLights(self):
        #if (self.redLantern.getState() == ON or self.whiteLantern.getState() == ON) :
        #self.waitSensorInactive(self.EOT)
        now = datetime.fromtimestamp(time.time())
        self.turnOffLightAfter(now, 0, self.redLantern)
        self.turnOffLightAfter(now, 0, self.whiteLantern)
        self.turnOffLightAfter(now, .3, self.tippleLights)
        self.turnOffLightAfter(now, .5, self.leftBridgeLight)

    def turnOnTippleLights(self):
        now = datetime.fromtimestamp(time.time())
        self.turnOnLightAfter(now, .1, self.rightBridgeLight)
        self.turnOnLightAfter(now, .25, self.whiteLantern)
        self.turnOffLightAfter(now, .4, self.rightBridgeLight)
        self.turnOnLightAfter(now, .5, self.tippleLights)
        self.turnOnLightAfter(now, .7, self.leftBridgeLight)

    def stopAtTipple(self):
        self.waitSensorActive(self.EOT)
        self.redLantern.setState(ACTIVE)
        self.waitMsec(1000)
        self.stopTrain()
        self.setActivityMsg("Dumping Ore")

        if self.random.nextInt(100) < 50:
            self.animateChutes()
        #
        #  Wait 2-4 minutes inside tipple before returning to winding house
        self.waitMsec(self.getDelay(self.random.nextInt(120) + 60) * 1000)
        self.setActivityMsg("")
        self.moveTrainForward()

    def animateChutes(self):
        self.shuttingDown = self.switch.getState() == INACTIVE
        if (not self.shuttingDown):
            self.setActivityMsg("Operating Chutes")
            self.chuteLight.setState(ON)
            self.waitMsec(3000)
            self.gateLight.setState(ON)
            self.waitMsec(10000)
            activeChute = self.chuteRight
            if (self.random.nextInt(100) < 50):
                activeChute = self.chuteLeft

            activeChute.setState(ACTIVE)
            self.waitMsec(30000)
            activeChute.setState(INACTIVE)
            self.waitMsec(6000)

            self.gateLight.setState(OFF)
            self.waitMsec(3000)
            self.chuteLight.setState(OFF)
            self.setActivityMsg("")

    def runHoist(self):

        self.roofSign.setState(TriStateSensor.ON)
        self.whEngineRoom.setState(TriStateSensor.ON)
        self.waitMsec(1000)
        self.boilerFire.setState(TriStateSensor.ON)

        if (self.random.nextInt(100) < 20):
            self.setActivityMsg("Calling Hoist to L3")
            self.l3Button.setState(ACTIVE)
            self.level1Light.setState(ACTIVE)
            self.level1LightDim.setState(ACTIVE)
            self.waitSensorActive(self.l3Indicator)
        else:
            self.setActivityMsg("Calling Hoist to Surface")
            self.s1Button.setState(ACTIVE)
            self.mineBldgLoadingDockLight.setState(ACTIVE)
            self.waitSensorActive(self.s1Indicator)
            self.mineBldgLoadingDockLight.setState(INACTIVE)

        self.level1Light.setState(INACTIVE)

        self.waitMsec(10000)
        self.setActivityMsg("Sending Ore to S2")
        self.s2Button.setState(ACTIVE)
        self.mineBldgS2Light.setState(ACTIVE)
        self.waitSensorActive(self.s2Indicator)

        self.waitMsec(10000)
        self.mineBldgS2Light.setState(INACTIVE)
        self.setActivityMsg("")

        self.boilerFire.setState(TriStateSensor.DIM)
        self.roofSign.setState(TriStateSensor.ON)
        self.waitMsec(2000)
        self.whEngineRoom.setState(TriStateSensor.OFF)
        self.waitMsec(2000)

    #
    #  Stop at the hoist to get a load of ore.
    #  If we are returning to the tipple, don't turn the tipple lights off
    def stopAtHoist(self, returnToTipple):
        self.waitSensorActive(self.MineBldg)
        if (returnToTipple):
            self.waitMsec(2000)
        else:
            self.waitMsec(500)

        self.shuttingDown = self.switch.getState() == INACTIVE
        if (self.shuttingDown):
            masts.getSignalMast("Auto Train Indicator Mast").setAspect(
                "Flashing")

        self.stopTrain()

        if (not returnToTipple and self.random.nextInt(100) < 20
                and not self.shuttingDown
                and self.useHoist.getState() == ACTIVE):
            self.runHoist()

        #  Wait 1-3 minutes inside hoist building
        if (not returnToTipple):
            self.turnOnTippleLights()

        self.setActivityMsg("Loading Ore")
        self.waitMsec(self.getDelay(self.random.nextInt(120) + 60) * 1000)
        self.setActivityMsg("")
        self.moveTrainReverse()
        self.mineBldgS3Light.setState(INACTIVE)

    #
    #  Let engineer take a coffee break at the winding house
    def coffeeBreak(self):

        self.shuttingDown = self.switch.getState() == INACTIVE
        if (self.shuttingDown):
            masts.getSignalMast("Auto Train Indicator Mast").setAspect(
                "Flashing")

        self.stopTrain()
        self.waitMsec(1000)
        self.throttle.setF0(False)
        self.waitMsec(1000)
        self.throttle.setF8(True)

        delaySecs = self.getDelay(5 * 60)
        delayMins = delaySecs / float(60.0)
        delayStr = "%0.1f" % delayMins
        delayStr = delayStr + " minute Coffee Break"
        self.setActivityMsg(delayStr)
        self.waitMsec(delaySecs * 1000)

    def getDelay(self, seconds):
        if self.switch.getState() == INACTIVE:
            duration = 0
        else:
            duration = seconds + self.random.nextGaussian() * (seconds)

            if (self.buildingLightDemo.getState() != ACTIVE
                    or self.loopCount < 5):
                duration = duration * .25

        #if (self.debug) :
        #print "Returning delay = " + str(int(duration)) + " seconds (" + str(duration/60.0) + " minutes)"

        return int(duration)

    def handle(self):

        self.loopCount = self.loopCount + 1
        print "Tipple Train Loop Count = " + str(self.loopCount)

        if (self.firstTime):
            self.setActivityMsg("Starting Shift")
        else:
            self.setActivityMsg("")

        if (self.BOT.getState() != ACTIVE):
            self.throttle.setF0(True)
            self.moveTrainForward()
            self.windingHouseBridgeLight.setState(ACTIVE)

            stopForWater = self.random.nextInt(100) < 15
            returnToTipple = self.random.nextInt(100) < 65

            if self.switch.getState() == INACTIVE:
                stopForWater = False
                returnToTipple = False

            if (not returnToTipple):
                self.turnOutTippleLights()

            #
            # Rarely stop when returning to winding house to take on water inside mime bldg.
            if (not self.firstTime):
                if (stopForWater):
                    self.waitSensorActive(self.MineBldg)
                    self.setActivityMsg("Filling Water")
                    self.stopTrain()
                    self.waitMsec(4000)
                    self.throttle.setF6(True)
                    self.waitMsec(self.getDelay(2 * 60) * 1000)
                    self.setActivityMsg("")
                    self.throttle.setF6(False)
                    self.waitMsec(5000)
                    self.moveTrainForward()
                elif (returnToTipple):
                    self.stopAtHoist(True)
                    self.stopAtTipple()

            self.shuttingDown = self.switch.getState() == INACTIVE
            if (self.shuttingDown):
                masts.getSignalMast("Auto Train Indicator Mast").setAspect(
                    "Flashing")

            self.waitSensorActive(self.BOT)
            self.setActivityMsg("")

        #
        #  Wait at BOT, except 1st time through
        if (not self.firstTime):
            self.coffeeBreak()
            if (self.random.nextInt(100) < 10):
                self.releaseSteam()

            self.setActivityMsg("")
        else:
            self.stopTrain()
            self.firstTime = False

        self.throttle.setF8(False)
        self.waitMsec(self.getDelay(2) * 1000)
        self.throttle.setF0(True)
        self.moveTrainReverse()

        self.mineBldgS3Light.setState(ACTIVE)
        self.windingHouseBridgeLight.setState(INACTIVE)

        #
        #  Stop in Mine Building going toward Tipple
        self.stopAtHoist(False)

        #
        #  Stop at tipple
        self.stopAtTipple()

        if (self.switch.getState() != ACTIVE):
            self.stopTrain()

        self.activity.setValue("")

        self.shuttingDown = self.switch.getState() == INACTIVE
        if (self.shuttingDown and self.l3switch.getState() == INACTIVE
                and self.l2switch.getState() == INACTIVE):
            self.whEngineRoom.cancelScheduledTasks()
            self.boilerFire.cancelScheduledTasks()
            masts.getSignalMast("Auto Train Indicator Mast").setAspect(
                "Not Lit")
            self.firstTime = True

        return (not self.shuttingDown)

    def setActivityMsg(self, msg):
        self.shuttingDown = self.switch.getState() == INACTIVE
        if self.shuttingDown:
            self.activity.setValue("Ending Shift")
        else:
            self.activity.setValue(msg)

    def turnOn(self, sensor):
        try:
            sensor.setState(ACTIVE)
        except:
            sensor.setState(ON)

    def turnOff(self, sensor):
        try:
            sensor.setState(INACTIVE)
        except:
            sensor.setState(OFF)

    def turnOffLightAfter(self, departureTime, offset, sensor):
        xtime = departureTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOff, [sensor]).start()

    def turnOnLightAfter(self, arrivalTime, offset, sensor):
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn, [sensor]).start()
Example #11
0
    def init(self):

        self.debug = sensors.provideSensor("Private").getState() == ACTIVE
        self.trainPresentSensor = sensors.provideSensor("OS: Freight House")

        self.t1FHSensor = sensors.provideSensor("OS: T1 Freight House")
        self.t1DSensor = sensors.provideSensor("OS: T1 Depot")
        self.t1WTSensor = sensors.provideSensor("OS: T1 Water Tower")
        self.t1BSensor = sensors.provideSensor("OS: T1 Bridge")

        self.occupancySensors = []
        self.occupancySensors.append(self.t1FHSensor)
        self.occupancySensors.append(self.t1DSensor)
        self.occupancySensors.append(self.t1WTSensor)
        self.occupancySensors.append(self.t1BSensor)

        self.mineTourSwitch = sensors.provideSensor("Mine Tour")

        self.scheduleTimes = []
        self.scheduleTimes.append(memories.provideMemory("Arrives Depot"))

        self.stove = lights.provideLight("NL100")
        #self.platformLights = lights.provideLight("NL101");
        #self.waitingRoomLights = lights.provideLight("NL102");
        self.officeLight = lights.provideLight("NL103")
        self.signLights = lights.provideLight("NL104")
        self.indicatorLights = lights.provideLight("NL105")

        self.platformLights = TriStateSensor(
            sensors.provideSensor("Depot Platform Dim"),
            sensors.provideSensor("Depot Platform On"),
            sensors.provideSensor("Depot Platform Off"))

        self.waitingRoomLights = TriStateSensor(
            sensors.provideSensor("Depot Waiting Room Dim"),
            sensors.provideSensor("Depot Waiting Room On"),
            sensors.provideSensor("Depot Waiting Room Off"))

        #self.roofSign = sensors.provideSensor("Mine Bldg Roof")
        #self.roofDim = sensors.provideSensor("Mine Bldg Roof Dim")
        #self.roofIndicator = lights.provideLight("IL145")

        self.roofSignOn = sensors.provideSensor(
            "Mine Building Roof Sign On")  # Mine Bldg Roof Sign
        self.roofSignOff = sensors.provideSensor(
            "Mine Building Roof Sign Off")  # Mine Bldg Roof Sign
        self.roofSignDim = sensors.provideSensor(
            "Mine Building Roof Sign Dim")  # Mine Bldg Roof Sign
        self.roofSign = TriStateSensor(self.roofSignDim, self.roofSignOn,
                                       self.roofSignOff)

        self.loadingDock = TriStateSensor(
            sensors.provideSensor("Mine Building Loading Dock Dim"),
            sensors.provideSensor("Mine Building Loading Dock On"),
            sensors.provideSensor("Mine Building Loading Dock Off"))

        #        self.waitingRoomLightDimmer = lights.provideLight("NL107")
        #        self.waitingRoomIndicator = lights.provideLight("IL102")

        #        self.platformLightDimmer = lights.provideLight("NL106")
        #        self.platformIndicator = lights.provideLight("IL101")

        self.waterTower = lights.provideLight("NL83")  # Water Tower
        self.waterSpout = sensors.provideSensor("Water Spout")

        self.trainOrderEast = masts.getSignalMast("SM Depot East")
        self.trainOrderWest = masts.getSignalMast("SM Depot West")
        self.switchStand = lights.provideLight("LL130")

        self.trainOrderEast.setAspect("Stop")
        self.waitMsec(2000)
        self.trainOrderWest.setAspect("Stop")
        self.waitMsec(2000)
        self.trainOrderEast.setAspect("Approach")
        self.waitMsec(1500)
        self.trainOrderWest.setAspect("Approach")
        self.waitMsec(2000)
        self.trainOrderEast.setAspect("Clear")
        self.waitMsec(2000)
        self.trainOrderWest.setAspect("Clear")

        self.waterSpout.setState(INACTIVE)

        #
        #  Play with locomotive
        self.locomotive = self.getThrottle(32, False)
        self.locomotive.setF0(True)
        #self.locomotive.setF4(True)

        #
        #  Turn lights on idle locomotives
        self.locomotive41 = self.getThrottle(41, False)
        self.locomotive41.setF0(True)  # Headlight & Firebox
        self.locomotive41.setF11(True)  # Marker Lights

        self.locomotive6 = self.getThrottle(6, False)
        self.locomotive6.setF0(True)  # Headlight & Firebox
        self.locomotive6.setF5(True)  # Marker Lights
        self.locomotive6.setF11(True)  # Cab Light
        self.locomotive6.setIsForward(True)

        #
        #  Turn the lights in the Combine Car "Red Fox" #512 on
        self.combine512 = self.getThrottle(512, True)
        self.combine512.setF0(True)  #  Turn on marker lights

        self.eastBound = True
Example #12
0
class Depot(jmri.jmrit.automat.AbstractAutomaton):
    def init(self):

        self.debug = sensors.provideSensor("Private").getState() == ACTIVE
        self.trainPresentSensor = sensors.provideSensor("OS: Freight House")

        self.t1FHSensor = sensors.provideSensor("OS: T1 Freight House")
        self.t1DSensor = sensors.provideSensor("OS: T1 Depot")
        self.t1WTSensor = sensors.provideSensor("OS: T1 Water Tower")
        self.t1BSensor = sensors.provideSensor("OS: T1 Bridge")

        self.occupancySensors = []
        self.occupancySensors.append(self.t1FHSensor)
        self.occupancySensors.append(self.t1DSensor)
        self.occupancySensors.append(self.t1WTSensor)
        self.occupancySensors.append(self.t1BSensor)

        self.mineTourSwitch = sensors.provideSensor("Mine Tour")

        self.scheduleTimes = []
        self.scheduleTimes.append(memories.provideMemory("Arrives Depot"))

        self.stove = lights.provideLight("NL100")
        #self.platformLights = lights.provideLight("NL101");
        #self.waitingRoomLights = lights.provideLight("NL102");
        self.officeLight = lights.provideLight("NL103")
        self.signLights = lights.provideLight("NL104")
        self.indicatorLights = lights.provideLight("NL105")

        self.platformLights = TriStateSensor(
            sensors.provideSensor("Depot Platform Dim"),
            sensors.provideSensor("Depot Platform On"),
            sensors.provideSensor("Depot Platform Off"))

        self.waitingRoomLights = TriStateSensor(
            sensors.provideSensor("Depot Waiting Room Dim"),
            sensors.provideSensor("Depot Waiting Room On"),
            sensors.provideSensor("Depot Waiting Room Off"))

        #self.roofSign = sensors.provideSensor("Mine Bldg Roof")
        #self.roofDim = sensors.provideSensor("Mine Bldg Roof Dim")
        #self.roofIndicator = lights.provideLight("IL145")

        self.roofSignOn = sensors.provideSensor(
            "Mine Building Roof Sign On")  # Mine Bldg Roof Sign
        self.roofSignOff = sensors.provideSensor(
            "Mine Building Roof Sign Off")  # Mine Bldg Roof Sign
        self.roofSignDim = sensors.provideSensor(
            "Mine Building Roof Sign Dim")  # Mine Bldg Roof Sign
        self.roofSign = TriStateSensor(self.roofSignDim, self.roofSignOn,
                                       self.roofSignOff)

        self.loadingDock = TriStateSensor(
            sensors.provideSensor("Mine Building Loading Dock Dim"),
            sensors.provideSensor("Mine Building Loading Dock On"),
            sensors.provideSensor("Mine Building Loading Dock Off"))

        #        self.waitingRoomLightDimmer = lights.provideLight("NL107")
        #        self.waitingRoomIndicator = lights.provideLight("IL102")

        #        self.platformLightDimmer = lights.provideLight("NL106")
        #        self.platformIndicator = lights.provideLight("IL101")

        self.waterTower = lights.provideLight("NL83")  # Water Tower
        self.waterSpout = sensors.provideSensor("Water Spout")

        self.trainOrderEast = masts.getSignalMast("SM Depot East")
        self.trainOrderWest = masts.getSignalMast("SM Depot West")
        self.switchStand = lights.provideLight("LL130")

        self.trainOrderEast.setAspect("Stop")
        self.waitMsec(2000)
        self.trainOrderWest.setAspect("Stop")
        self.waitMsec(2000)
        self.trainOrderEast.setAspect("Approach")
        self.waitMsec(1500)
        self.trainOrderWest.setAspect("Approach")
        self.waitMsec(2000)
        self.trainOrderEast.setAspect("Clear")
        self.waitMsec(2000)
        self.trainOrderWest.setAspect("Clear")

        self.waterSpout.setState(INACTIVE)

        #
        #  Play with locomotive
        self.locomotive = self.getThrottle(32, False)
        self.locomotive.setF0(True)
        #self.locomotive.setF4(True)

        #
        #  Turn lights on idle locomotives
        self.locomotive41 = self.getThrottle(41, False)
        self.locomotive41.setF0(True)  # Headlight & Firebox
        self.locomotive41.setF11(True)  # Marker Lights

        self.locomotive6 = self.getThrottle(6, False)
        self.locomotive6.setF0(True)  # Headlight & Firebox
        self.locomotive6.setF5(True)  # Marker Lights
        self.locomotive6.setF11(True)  # Cab Light
        self.locomotive6.setIsForward(True)

        #
        #  Turn the lights in the Combine Car "Red Fox" #512 on
        self.combine512 = self.getThrottle(512, True)
        self.combine512.setF0(True)  #  Turn on marker lights

        self.eastBound = True

    def scheduleSignalMast(self, arrivalTime, offset, myMast, myAspect):
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.setSignalMast,
                        [myMast, myAspect]).start()

    def setSignalMast(self, myMast, myAspect):
        myMast.setAspect(myAspect)

    def scheduleTurntableLights(self, arrivalTime, offset, isOn):
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.sequenceTurntableLights,
                        [isOn]).start()

    def sequenceTurntableLights(self, isOn):

        state = jmri.jmrix.nce.NceLight.OFF

        if (isOn):
            state = jmri.jmrix.nce.NceLight.ON

        nextLight = lights.provideLight("NL84")  # Turntable 1
        nextLight.setState(state)
        delayMsec = 2000 + java.util.Random().nextInt(2000)
        self.waitMsec(delayMsec)

        nextLight = lights.provideLight("NL82")  # Turntable 2
        nextLight.setState(state)
        delayMsec = 2000 + java.util.Random().nextInt(2000)
        self.waitMsec(delayMsec)

        nextLight = lights.provideLight("NL83")  # Water Tower
        nextLight.setState(state)

    def turnOn(self, sensor, dim, isDim, indicator):
        if (self.debug):
            print "Turning on " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(time.time()).strftime("%I:%M")
        if (dim is not None and indicator is not None):
            if (isDim):
                dim.setState(jmri.jmrix.nce.NceLight.ON)
                indicator.setTargetIntensity(0.5)
            else:
                dim.setState(jmri.jmrix.nce.NceLight.OFF)
                indicator.setTargetIntensity(1.0)
                indicator.setState(jmri.jmrix.nce.NceLight.ON)

        try:
            sensor.setState(ACTIVE)
            self.waitMsec(250)
            sensor.setState(ACTIVE)
            self.waitMsec(250)
            sensor.setState(ACTIVE)
        except:
            sensor.setState(jmri.jmrix.nce.NceLight.ON)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.ON)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.ON)

    def turnOff(self, sensor, indicator):
        if (self.debug):
            print "Turning off " + sensor.getUserName(
            ) + " at " + datetime.fromtimestamp(mktime(
                time.localtime())).strftime("%I:%M")
        if (indicator is not None):
            indicator.setTargetIntensity(0.0)
            indicator.setState(jmri.jmrix.nce.NceLight.OFF)
        try:
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
            self.waitMsec(250)
            sensor.setState(jmri.jmrix.nce.NceLight.OFF)
        except:
            sensor.setState(INACTIVE)
            self.waitMsec(250)
            sensor.setState(INACTIVE)
            self.waitMsec(250)
            sensor.setState(INACTIVE)

    #
    #  level = 0 -> off
    #  level = 50 -> dim
    #  level = 126 -> bright
    def setCombineLights(self, level):
        self.combine512.setSpeedSetting(level)  # Turn on interior lights
        self.combine512.setF0(level > 0)

    def scheduleCombineLights(self, baseTime, offset, level):
        if (self.debug):
            print "Scheduling combine lights"
        if (offset < 0):
            xtime = baseTime - timedelta(minutes=abs(offset))
        else:
            xtime = baseTime + timedelta(minutes=abs(offset))

        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.setCombineLights,
                        [level]).start()
        if (self.debug):
            print "Combine lights scheduled for level " + str(level)

    def setLocomotiveFunction(self, function, state):
        if (self.debug):
            print " Setting locomotive function " + str(
                function) + " to state = " + str(state)
        if (function == 2):
            self.locomotive.setF2(True)
            self.waitMsec(2000)
            self.locomotive.setF2(False)

        elif (function == 1):  # bell
            self.locomotive.setF1(state)
        elif (function == 3):  # toot
            self.locomotive.setF3(not self.locomotive.getF3())
        elif (function == 4):  # Quill
            self.locomotive.setF4(not self.locomotive.getF4())
        elif (function == 0):  # Headlight
            self.locomotive.setF0(state)
        elif (function == 9):
            self.locomotive.setF9(state)
        elif (function == 10):
            self.locomotive.setF10(state)
        elif (function == 11):  #Firebox
            self.locomotive.setF11(state)
        elif (function == 12):  # Cab
            self.locomotive.setF12(state)
        elif (function == 16):  # Blowdown
            self.locomotive.setF16(state)
        elif (function == 21):  # Water Fill
            self.locomotive.setF21(state)
        if (self.debug):
            print " Done Setting locomotive function " + str(
                function) + " to state = " + str(state)

    def scheduleLocomotive(self, baseTime, offset, function, state):
        if (self.debug):
            print "Scheduling locomotive"
        if (offset < 0):
            xtime = baseTime - timedelta(minutes=abs(offset))
        else:
            xtime = baseTime + timedelta(minutes=abs(offset))

        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.setLocomotiveFunction,
                        [function, state]).start()
        if (self.debug):
            print "Locomotive function scheduled " + str(function)

    def dimLightsAfter(self, departureTime, offset, light, dimmer, indicator):
        xtime = departureTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [light, dimmer, True, indicator]).start()

    def turnOffLightsAfter(self, departureTime, offset, light, indicator):
        xtime = departureTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOff,
                        [light, indicator]).start()

    def turnOffLightsBefore(self, departureTime, offset, light, indicator):
        xtime = departureTime - timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOff,
                        [light, indicator]).start()

    def turnOnLightBefore(self, arrivalTime, offset, light, dimmer, isDim,
                          indicator):
        xtime = arrivalTime - timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [light, dimmer, isDim, indicator]).start()

    def turnOnLightAfter(self, arrivalTime, offset, light, dimmer, isDim,
                         indicator):
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.turnOn,
                        [light, dimmer, isDim, indicator]).start()

    def waterTowerAnimation(self, state):
        self.waterSpout.setState(state)
        #self.waitMsec(3000)
        #print "Activating locomotive fill-water sound"
        #self.locomotive.setF21(ACTIVE) # Water fill
        #self.waitMsec(10000)
        #self.locomotive.setF21(INACTIVE) # Water fill
        #print "Deactivating locomotive fill-water sound"
        #self.waterSpout.setState(INACTIVE)
        #print "Animating water tower complete"

    def animateWaterTower(self, arrivalTime, offset, state):
        if (self.debug):
            print " Scheduling water tower "
        xtime = arrivalTime + timedelta(minutes=offset)
        delay = xtime - datetime.fromtimestamp(time.time())
        threading.Timer(delay.total_seconds(), self.waterTowerAnimation,
                        [state]).start()

    def scheduleDeparture(self):
        memVal = memories.provideMemory("Departs Depot").getValue()
        if (memVal != None):
            depStr = memVal[0:19]
            departureTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")

            if (self.eastBound):
                self.scheduleSignalMast(departureTime, 2, self.trainOrderWest,
                                        "Clear")
                self.scheduleSignalMast(departureTime, 2.2,
                                        self.trainOrderEast, "Approach")
                self.scheduleSignalMast(departureTime, 5, self.trainOrderEast,
                                        "Clear")
                self.scheduleSignalMast(departureTime, 10, self.trainOrderWest,
                                        "Not Lit")
                self.scheduleSignalMast(departureTime, 10.2,
                                        self.trainOrderEast, "Not Lit")
            else:
                self.scheduleSignalMast(departureTime, 2, self.trainOrderEast,
                                        "Clear")
                self.scheduleSignalMast(departureTime, 2.2,
                                        self.trainOrderWest, "Approach")
                self.scheduleSignalMast(departureTime, 5, self.trainOrderWest,
                                        "Clear")
                self.scheduleSignalMast(departureTime, 10, self.trainOrderWest,
                                        "Not Lit")
                self.scheduleSignalMast(departureTime, 10.2,
                                        self.trainOrderEast, "Not Lit")

            self.eastBound = not self.eastBound

            self.scheduleLocomotive(departureTime, -0.3, 2, False)  # Whistle
            self.scheduleLocomotive(departureTime, -0.2, 2, False)  # Whistle
            self.scheduleLocomotive(departureTime, 0.0, 1, True)  # Bell
            self.scheduleLocomotive(departureTime, 1.0, 1, False)  # Bell
            self.scheduleLocomotive(departureTime, 1.2, 12, False)  # Cab
            self.scheduleLocomotive(departureTime, 2.0, 10,
                                    False)  # Class. Light
            self.scheduleLocomotive(departureTime, 2.2, 0, False)  # HeadLight

            self.turnOffLightsAfter(departureTime, 3, self.signLights, None)
            self.platformLights.scheduleStateChangeAfter(
                TriStateSensor.DIM, depStr, 3)
            self.waitingRoomLights.scheduleStateChangeAfter(
                TriStateSensor.DIM, depStr, 5.5)
            #            self.dimLightsAfter(departureTime, 3, self.platformLights, self.platformLightDimmer, self.platformIndicator)
            #            self.dimLightsAfter(departureTime, 5.5, self.waitingRoomLights, self.waitingRoomLightDimmer, self.waitingRoomIndicator)

            if (self.mineTourSwitch.getState() != ACTIVE):
                self.scheduleTurntableLights(departureTime, 7.5, False)

            self.turnOffLightsAfter(departureTime, 7, self.indicatorLights,
                                    None)
            #            self.turnOffLightsAfter(departureTime, 8, self.platformLights, self.platformIndicator)
            self.platformLights.scheduleStateChangeAfter(
                TriStateSensor.OFF, depStr, 8)
            self.turnOffLightsAfter(departureTime, 9, self.stove, None)
            #            self.turnOffLightsAfter(departureTime, 10, self.waitingRoomLights, self.waitingRoomIndicator)
            self.waitingRoomLights.scheduleStateChangeAfter(
                TriStateSensor.OFF, depStr, 10)
            self.turnOffLightsAfter(departureTime, 11, self.officeLight, None)
            self.turnOffLightsAfter(departureTime, 12, self.switchStand, None)

            #            self.turnOnLightAfter(departureTime, 6, self.roofSign, self.roofDim, True, self.roofIndicator)
            self.roofSign.scheduleStateChangeAfter(TriStateSensor.DIM, depStr,
                                                   6.0)
            self.loadingDock.scheduleStateChangeAfter(TriStateSensor.DIM,
                                                      depStr, 6.6)
            #            self.turnOnLightAfter(departureTime, 6.6, self.loadingDock, self.loadingDockDim, True, self.loadingDockIndicator)

            #self.turnOffLightsAfter(departureTime, 9.5, self.roofSign, self.roofIndicator)
            #self.turnOffLightsAfter(departureTime, 10.5, self.loadingDock, self.loadingDockIndicator)
            self.roofSign.scheduleStateChangeAfter(TriStateSensor.OFF, depStr,
                                                   9.5)
            self.loadingDock.scheduleStateChangeAfter(TriStateSensor.OFF,
                                                      depStr, 10.5)

            self.turnOffLightsBefore(departureTime, 3, self.waterTower, None)

    def scheduleArrival(self):
        memVal = memories.provideMemory("Arrives Depot").getValue()
        if (memVal != None):
            arrStr = memVal[0:19]
            arrivalTime = datetime.strptime(memVal, "%Y-%m-%d %H:%M:%S.%f")

            self.scheduleCombineLights(arrivalTime, -5, 50)
            self.scheduleCombineLights(arrivalTime, -1, 127)
            self.scheduleCombineLights(arrivalTime, 10, 50)
            self.scheduleCombineLights(arrivalTime, 11, 0)

            self.scheduleLocomotive(arrivalTime, -4.4, 10,
                                    True)  # Class. Light
            self.scheduleLocomotive(arrivalTime, -4.3, 0, True)  # HeadLight
            self.scheduleLocomotive(arrivalTime, -4.2, 4, True)  #Quill
            self.scheduleLocomotive(arrivalTime, -2.5, 2, False)  # Whistle
            self.scheduleLocomotive(arrivalTime, -1, 1, True)  # Bell on
            self.scheduleLocomotive(arrivalTime, 0, 1, False)  # Bell off
            self.scheduleLocomotive(arrivalTime, 0.2, 3, False)  # Brake set.
            self.scheduleLocomotive(arrivalTime, 0.3, 12, True)  # Cab light

            if (self.mineTourSwitch.getState() != ACTIVE):
                self.scheduleTurntableLights(arrivalTime, -7, True)

            #  Station master arrives & turns on office light
            #self.turnOnLightBefore(arrivalTime, 15.5, self.roofSign, self.roofDim, True, self.roofIndicator)
            #self.turnOnLightBefore(arrivalTime, 16, self.loadingDock, self.loadingDockDim, True, self.loadingDockIndicator)
            self.roofSign.scheduleStateChangeBefore(TriStateSensor.DIM, arrStr,
                                                    15.5)
            self.loadingDock.scheduleStateChangeBefore(TriStateSensor.DIM,
                                                       arrStr, 16)

            self.turnOnLightBefore(arrivalTime, 15, self.officeLight, None,
                                   False, None)
            self.waitingRoomLights.scheduleStateChangeBefore(
                TriStateSensor.DIM, arrStr, 14)
            #            self.turnOnLightBefore(arrivalTime, 14, self.waitingRoomLights, self.waitingRoomLightDimmer, True, self.waitingRoomIndicator)
            self.turnOnLightBefore(arrivalTime, 13, self.stove, None, False,
                                   None)

            if (self.eastBound):
                self.scheduleSignalMast(arrivalTime, -4, self.trainOrderEast,
                                        "Stop")
                self.scheduleSignalMast(arrivalTime, -4.1, self.trainOrderWest,
                                        "Approach")
            else:
                self.scheduleSignalMast(arrivalTime, -4, self.trainOrderWest,
                                        "Stop")
                self.scheduleSignalMast(arrivalTime, -4.1, self.trainOrderEast,
                                        "Approach")

            self.turnOnLightBefore(arrivalTime, 11, self.switchStand, None,
                                   False, None)

            #           self.turnOnLightBefore(arrivalTime, 10, self.platformLights, self.platformLightDimmer, True, self.platformIndicator)
            self.platformLights.scheduleStateChangeBefore(
                TriStateSensor.DIM, arrStr, 10)
            if (self.debug):
                self.turnOnLightBefore(arrivalTime, 9, self.indicatorLights,
                                       None, False, None)


#            self.turnOnLightBefore(arrivalTime, 5, self.waitingRoomLights, self.waitingRoomLightDimmer, False, self.waitingRoomIndicator)
            self.waitingRoomLights.scheduleStateChangeBefore(
                TriStateSensor.ON, arrStr, 5)
            self.platformLights.scheduleStateChangeBefore(
                TriStateSensor.ON, arrStr, 4)
            #self.turnOnLightBefore(arrivalTime, 4, self.platformLights, self.platformLightDimmer, False, self.platformIndicator)
            self.turnOnLightBefore(arrivalTime, 3, self.signLights, None,
                                   False, None)
            #self.turnOnLightBefore(arrivalTime, 2, self.roofSign, self.roofDim, False, self.roofIndicator)
            #self.turnOnLightBefore(arrivalTime, 1.8, self.loadingDock, self.loadingDockDim, False, self.loadingDockIndicator)
            self.roofSign.scheduleStateChangeBefore(TriStateSensor.ON, arrStr,
                                                    2.0)
            self.loadingDock.scheduleStateChangeBefore(TriStateSensor.ON,
                                                       arrStr, 1.8)

            self.turnOnLightAfter(arrivalTime, 1.5, self.waterTower, None,
                                  False, None)
            self.animateWaterTower(arrivalTime, 1.6, ACTIVE)
            self.scheduleLocomotive(arrivalTime, 1.7, 21,
                                    True)  # Water fill  on
            self.scheduleLocomotive(arrivalTime, 2.9, 21,
                                    False)  # Water fill off
            self.animateWaterTower(arrivalTime, 2.3, INACTIVE)
            if (java.util.Random().nextInt(100) > 50):
                self.scheduleLocomotive(arrivalTime, 3.4, 16,
                                        True)  # Blow Down  on
                self.scheduleLocomotive(arrivalTime, 3.6, 16,
                                        False)  # Blow Down off
            self.turnOffLightsAfter(arrivalTime, 4.2, self.waterTower, None)

    def handle(self):
        self.debug = sensors.provideSensor("Private").getState() == ACTIVE

        self.waitChange(self.scheduleTimes)
        self.waitMsec(2000)
        self.scheduleArrival()
        self.scheduleDeparture()

        return True