111 lines
3.7 KiB
Python
111 lines
3.7 KiB
Python
import java
|
|
import java.awt
|
|
import java.awt.event
|
|
import jmri
|
|
import jmri.jmrit.jython.Jynstrument as Jynstrument
|
|
import java.awt.CardLayout as CardLayout
|
|
import jmri.util.swing.ResizableImagePanel as ResizableImagePanel
|
|
import java.awt.event.MouseListener as MouseListener
|
|
import jmri.jmrit.throttle.interfaces.AddressListener as AddressListener
|
|
from java.lang import Thread, Runnable
|
|
|
|
class SoundOn2xF0(Jynstrument, AddressListener, MouseListener):
|
|
# Jynstrument mandatory part
|
|
# Here this JYnstrument like to be in a ThrottleFrame and no anywhere else
|
|
def getExpectedContextClassName(self):
|
|
return "jmri.jmrit.throttle.UIImplementation.ThrottleFrame"
|
|
|
|
def init(self):
|
|
self.setLayout( CardLayout() )
|
|
self.labelOff = ResizableImagePanel(self.getFolder() + "/SoundOff.png",100,100 )
|
|
self.labelOn = ResizableImagePanel(self.getFolder() + "/SoundOn.png",100,100 )
|
|
self.add(self.labelOff, "off")
|
|
self.add(self.labelOn, "on")
|
|
self.addComponentListener(self.labelOff)
|
|
self.addComponentListener(self.labelOn)
|
|
self.addMouseListener(self)
|
|
self.getContext().addAddressListener(self)
|
|
self.throttle = self.getContext().getThrottle()
|
|
self.onOffValue = False # There is no way to ask for value, hence this value
|
|
self.updateThrottle()
|
|
self.setIcon()
|
|
|
|
def quit(self): # very important to clean up everything to make sure GC will collect us
|
|
self.cleanThrottle()
|
|
if (self.getContext() != None) :
|
|
self.getContext().removeAddressListener(self)
|
|
|
|
# this is a good way to make sure that we're are actaully GCed
|
|
# using memory watcher in development menu, we can force a GC from there
|
|
def __del__(self):
|
|
print "in destructor"
|
|
|
|
#Inner workings:
|
|
def updateThrottle(self): # update throttle informations when a new one is detected
|
|
pass
|
|
|
|
def cleanThrottle(self): # clean up throttle information when it is deconnected
|
|
self.throttle = None
|
|
|
|
def switch(self): # actually do function value change
|
|
if self.throttle != None :
|
|
t = Thread( Sequence( self.throttle ) )
|
|
t.start()
|
|
self.onOffValue = not self.onOffValue
|
|
self.setIcon()
|
|
|
|
def setIcon(self): # update appearance
|
|
cl = self.getLayout()
|
|
if self.onOffValue :
|
|
cl.show(self, "on")
|
|
else :
|
|
cl.show(self, "off")
|
|
|
|
#AddressListener part: to listen for address changes in address panel (release, acquired)
|
|
def notifyAddressChosen(self, address):
|
|
pass
|
|
|
|
def notifyAddressThrottleFound(self, throttle):
|
|
self.throttle = throttle
|
|
self.updateThrottle()
|
|
self.setIcon()
|
|
|
|
def notifyAddressReleased(self, address):
|
|
self.cleanThrottle()
|
|
self.setIcon()
|
|
|
|
def notifyConsistAddressChosen(self, address):
|
|
self.notifyAddressChosen(address)
|
|
|
|
def notifyConsistAddressThrottleFound(self, throttle):
|
|
self.notifyAddressThrottleFound(throttle)
|
|
|
|
def notifyConsistAddressReleased(self, address):
|
|
self.notifyAddressReleased(address)
|
|
|
|
#MouseListener part: to listen for mouse events
|
|
def mouseReleased(self, event):
|
|
self.switch()
|
|
|
|
def mousePressed(self, event):
|
|
pass
|
|
def mouseClicked(self, event):
|
|
pass
|
|
def mouseExited(self, event):
|
|
pass
|
|
def mouseEntered(self, event):
|
|
pass
|
|
|
|
class Sequence(Thread):
|
|
def __init__( self, t ):
|
|
self.throttle = t
|
|
self.timeSleep = 500
|
|
|
|
def run(self):
|
|
funVal = self.throttle.getFunction(0)
|
|
self.throttle.setFunction(0, not funVal ) # HERE!
|
|
print self.timeSleep
|
|
Thread.sleep(self.timeSleep)
|
|
self.throttle.setFunction(0, funVal ) # HERE!
|
|
|