100 lines
4.0 KiB
Python
100 lines
4.0 KiB
Python
#
|
|
# Outline cab signalling methods for JMRI
|
|
# Works with a Tethered DT402D (v14 firmware), but not in duplex wireless mode.
|
|
# Info sought on whether a change to op-code is required to get radio transmission.
|
|
#
|
|
# Copyright (c) 2011 by Nigel Cliffe, 23rd August 2011
|
|
|
|
import jmri
|
|
|
|
# set the intended LocoNet connection by its index; when you have just 1 connection index = 0
|
|
connectionIndex = 0
|
|
|
|
def locoNetCabSigMesg(loco, mast, vertical, diagonal, horizontal, blink):
|
|
# Message variables are Loco = Decimal loco address, others are binary 1 or 0
|
|
# mast = 1 means show mast, mast = 0 means hide mast.
|
|
# vertical, diagonal, horizontal are the arms (1=show, 0=hide)
|
|
# blink (1=blink, 0=no blink)
|
|
# Calculate the two byte loco address value
|
|
locoD1 = loco / 128 # integer division, automatically rounds
|
|
locoD2 = loco % 128 # modulo division, gets the remainder.
|
|
signalD3 = mast*16 + vertical*8 + diagonal*4 + horizontal*2 + blink*1
|
|
# values are in Decimal at this stage, some are clearer in Hex!
|
|
# thanks to BillyBob (on LocoNetHackers) for Op-code message format
|
|
sendLocoNetMsg(16,229,16,127,00,00,00, locoD1, locoD2, signalD3, 00,112,00,00,00,00,00)
|
|
return
|
|
|
|
# sendLocoNetMsg copied from elsewhere, extended to 15 ARGs
|
|
def sendLocoNetMsg(msgLength,opcode,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8,ARG9,ARG10,ARG11,ARG12,ARG13,ARG14,ARG15) :
|
|
# format and send the specific LocoNet message
|
|
# send up to 11 bytes in the message - includes checksum
|
|
packet = jmri.jmrix.loconet.LocoNetMessage(msgLength)
|
|
if msgLength == 4 :
|
|
packet.setElement(0, opcode)
|
|
packet.setElement(1, ARG1)
|
|
packet.setElement(2, ARG2)
|
|
else :
|
|
packet.setElement(0, opcode)
|
|
packet.setElement(1, ARG1)
|
|
packet.setElement(2, ARG2)
|
|
packet.setElement(3, ARG3)
|
|
packet.setElement(4, ARG4)
|
|
packet.setElement(5, ARG5)
|
|
packet.setElement(6, ARG6)
|
|
packet.setElement(7, ARG7)
|
|
packet.setElement(8, ARG8)
|
|
packet.setElement(9, ARG9)
|
|
packet.setElement(10, ARG10)
|
|
packet.setElement(11, ARG11)
|
|
packet.setElement(12, ARG12)
|
|
packet.setElement(13, ARG13)
|
|
packet.setElement(14, ARG14)
|
|
packet.setElement(15, ARG15)
|
|
|
|
jmri.InstanceManager.getList(jmri.jmrix.loconet.LocoNetSystemConnectionMemo).get(connectionIndex).getLnTrafficController().sendLocoNetMessage(packet)
|
|
print "Packet", packet # print packet to Script Output window
|
|
return
|
|
|
|
|
|
# User Interface follows
|
|
|
|
import javax.swing
|
|
|
|
def sendCabSignal(event):
|
|
locoNetCabSigMesg(int(locoAddr.text), showSignal.selected, vertSignal.selected, diagSignal.selected, horiSignal.selected, blinkSignal.selected)
|
|
return
|
|
|
|
f = javax.swing.JFrame("DT402 Cab Signalling Tool") # argument is the frames title
|
|
f.contentPane.setLayout(javax.swing.BoxLayout(f.contentPane, javax.swing.BoxLayout.Y_AXIS))
|
|
locoAddr = javax.swing.JTextField(5) # sized to hold 5 characters, initially empty
|
|
temppanel1 = javax.swing.JPanel()
|
|
temppanel1.add(javax.swing.JLabel("Loco Address: "))
|
|
temppanel1.add(locoAddr)
|
|
temppanel2 = javax.swing.JPanel()
|
|
temppanel2.add(javax.swing.JLabel("Signal state"))
|
|
showSignal = javax.swing.JCheckBox("Show")
|
|
showSignal.setSelected(False)
|
|
temppanel2.add(showSignal)
|
|
vertSignal = javax.swing.JCheckBox("Vertical")
|
|
vertSignal.setSelected(False)
|
|
temppanel2.add(vertSignal)
|
|
diagSignal = javax.swing.JCheckBox("Diagonal")
|
|
diagSignal.setSelected(False)
|
|
temppanel2.add(diagSignal)
|
|
horiSignal = javax.swing.JCheckBox("Horizontal")
|
|
horiSignal.setSelected(False)
|
|
temppanel2.add(horiSignal)
|
|
blinkSignal = javax.swing.JCheckBox("Blink")
|
|
blinkSignal.setSelected(False)
|
|
temppanel2.add(blinkSignal)
|
|
temppanel3 = javax.swing.JPanel()
|
|
sendButton = javax.swing.JButton("Send Cab Signal")
|
|
sendButton.actionPerformed = sendCabSignal
|
|
temppanel3.add(sendButton)
|
|
|
|
f.contentPane.add(temppanel1)
|
|
f.contentPane.add(temppanel2)
|
|
f.contentPane.add(temppanel3)
|
|
f.pack()
|
|
f.show()
|