-
Notifications
You must be signed in to change notification settings - Fork 331
/
UsbDcs52Adapter.java
193 lines (170 loc) · 7.76 KB
/
UsbDcs52Adapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package jmri.jmrix.loconet.usb_dcs52;
import jmri.jmrix.loconet.LnCommandStationType;
import jmri.jmrix.loconet.LnPacketizer;
import jmri.jmrix.loconet.LocoNetMessage;
import jmri.jmrix.loconet.LocoNetSystemConnectionMemo;
import jmri.jmrix.loconet.locobuffer.LocoBufferAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import purejavacomm.SerialPort;
import purejavacomm.UnsupportedCommOperationException;
/**
* Update the code in jmri.jmrix.loconet.locobuffer so that it refers to the
* option settings for the Digitrax DCS52's USB interface
* <p>
* Based on PR3Adapter.java
*
* @author Bob Jacobsen Copyright (C) 2004, 2005, 2006, 2008
* @author B. Milhaupt Copyright (C) 2019
*/
public class UsbDcs52Adapter extends LocoBufferAdapter {
public UsbDcs52Adapter() {
super(new UsbDcs52SystemConnectionMemo());
options.remove(option2Name);
options.put(option2Name, new Option(Bundle.getMessage("CommandStationTypeLabel"), commandStationOptions(), false));
}
/**
* Sets up the serial port characteristics. Always uses flow control, which is
* not considered a user-settable option. Sets the DCS52 USB interface for the appropriate
* operating mode, based on the selected "command station type".
*
* @param activeSerialPort the port to be configured
*/
@Override
protected void setSerialPort(SerialPort activeSerialPort) throws UnsupportedCommOperationException {
// find the baud rate value, configure comm options
int baud = 57600; // default, but also defaulted in the initial value of selectedSpeed
for (int i = 0; i < validBaudNumbers().length; i++) {
if (validBaudRates()[i].equals(mBaudRate)) {
baud = validBaudNumbers()[i];
}
}
activeSerialPort.setSerialPortParams(baud, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// configure flow control to always on
int flow = SerialPort.FLOWCONTROL_RTSCTS_OUT;
if (getOptionState(option1Name).equals(validOption1[1])) {
flow = SerialPort.FLOWCONTROL_NONE;
}
configureLeadsAndFlowControl(activeSerialPort, flow);
log.info("USB DCS52 adapter"
+ (activeSerialPort.getFlowControlMode() == SerialPort.FLOWCONTROL_RTSCTS_OUT ? " set hardware flow control, mode=" : " set no flow control, mode=")
+ activeSerialPort.getFlowControlMode()
+ " RTSCTS_OUT=" + SerialPort.FLOWCONTROL_RTSCTS_OUT
+ " RTSCTS_IN=" + SerialPort.FLOWCONTROL_RTSCTS_IN);
}
/**
* Set up all of the other objects to operate with a DCS52 USB interface connected to this
* port. This overrides the version in loconet.locobuffer, but it has to
* duplicate much of the functionality there, so the code is basically
* copied.
*/
@Override
public void configure() {
setCommandStationType(getOptionState(option2Name));
setTurnoutHandling(getOptionState(option3Name));
if (commandStationType == LnCommandStationType.COMMAND_STATION_USB_DCS52_ALONE) {
// DCS52 USB in standalone programmer case:
// connect to a packetizing traffic controller
// that does echoing
//
// Note - already created a LocoNetSystemConnectionMemo, so re-use
// it when creating a PR2 Packetizer. (If create a new one, will
// end up with two "LocoNet" menus...)
jmri.jmrix.loconet.pr2.LnPr2Packetizer packets =
new jmri.jmrix.loconet.pr2.LnPr2Packetizer(this.getSystemConnectionMemo());
packets.connectPort(this);
// set traffic controller and configure command station and mangers
this.getSystemConnectionMemo().setLnTrafficController(packets);
// do the common manager config
this.getSystemConnectionMemo().configureCommandStation(commandStationType,
mTurnoutNoRetry, mTurnoutExtraSpace, mTranspondingAvailable); // never transponding!
this.getSystemConnectionMemo().configureManagersPR2();
// start operation
packets.startThreads();
// set mode
LocoNetMessage msg = new LocoNetMessage(6);
msg.setOpCode(0xD3);
msg.setElement(1, 0x10);
msg.setElement(2, 1); // set PR2
msg.setElement(3, 0);
msg.setElement(4, 0);
packets.sendLocoNetMessage(msg);
} else {
// MS100 modes - connecting to a separate command station
// get transponding option
setTranspondingAvailable(getOptionState("TranspondingPresent"));
// connect to a packetizing traffic controller
LnPacketizer packets = getPacketizer(getOptionState(option4Name));
packets.connectPort(this);
// set traffic controller and configure command station and mangers
this.getSystemConnectionMemo().setLnTrafficController(packets);
// do the common manager config
this.getSystemConnectionMemo().configureCommandStation(commandStationType,
mTurnoutNoRetry, mTurnoutExtraSpace, mTranspondingAvailable);
this.getSystemConnectionMemo().configureManagersMS100();
// start operation
packets.startThreads();
// set mode
LocoNetMessage msg = new LocoNetMessage(6);
msg.setOpCode(0xD3);
msg.setElement(1, 0x10);
msg.setElement(2, 0); // set MS100, no power
msg.setElement(3, 0);
msg.setElement(4, 0);
packets.sendLocoNetMessage(msg);
}
}
/**
* {@inheritDoc}
*
* @return String[] containing the single valid baud rate, "57,600".
*/
@Override
public String[] validBaudRates() {
return new String[]{"57,600 baud"}; // NOI18N
}
/**
* {@inheritDoc}
*
* @return int[] containing the single valid baud rate, 57600.
*/
@Override
public int[] validBaudNumbers() {
return new int[]{57600};
}
// Option 1 does flow control, inherited from LocoBufferAdapter
/**
* The DCS52 USB interface can be used as a "Standalone Programmer", or with various LocoNet
* command stations, or as an interface to a "Standalone LocoNet". Provide those
* options.
*
* @return an array of strings containing the various command station names and
* name(s) of modes without command stations
*/
public String[] commandStationOptions() {
String[] retval = new String[commandStationNames.length + 1];
retval[0] = LnCommandStationType.COMMAND_STATION_USB_DCS52_ALONE.getName();
retval[1] = LnCommandStationType.COMMAND_STATION_DCS052.getName();
int count = 2;
for (String commandStationName : commandStationNames) {
if (!commandStationName.equals(LnCommandStationType.COMMAND_STATION_DCS052.getName())) {
// include all but COMMAND_STATION_DCS052, which was forced to
// the front of the list (above)
retval[count++] = commandStationName;
}
}
// Note: Standalone loconet does not make sense for DCS240 USB interface.
return retval;
}
@Override
public UsbDcs52SystemConnectionMemo getSystemConnectionMemo() {
LocoNetSystemConnectionMemo m = super.getSystemConnectionMemo();
if (m instanceof UsbDcs52SystemConnectionMemo) {
return (UsbDcs52SystemConnectionMemo) m;
}
log.error("Cannot cast the system connection memo to a UsbDcs52SystemConnection Memo.");
return null;
}
private final static Logger log = LoggerFactory.getLogger(UsbDcs52Adapter.class);
}