-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSerTermGUI.java
502 lines (460 loc) · 22.4 KB
/
SerTermGUI.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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
/*
* SerialGUI.java
*
* Created on November 5, 2007, 3:45 PM
*
* @author Goldscott
*/
//import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.*;
import java.util.Enumeration;
import java.util.TooManyListenersException;
//import javax.swing.JOptionPane;
public class SerTermGUI extends javax.swing.JFrame implements SerialPortEventListener{
/** Creates new form SerialGUI */
public SerTermGUI() {
getPorts();
initComponents();
displayFormat = RxFormat.ASCII;
//Display some instructions upon opening
textWin.append(">>Select Port, Specify Baud Rate (default 9600), Open Port.\n");
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jOptionPane1 = new javax.swing.JOptionPane();
rxformat = new javax.swing.ButtonGroup();
scrollPane = new javax.swing.JScrollPane();
textWin = new javax.swing.JTextArea();
textbar = new javax.swing.JTextField();
portBox = new javax.swing.JComboBox();
baudField = new javax.swing.JTextField();
baudButton = new javax.swing.JButton();
portToggle = new javax.swing.JToggleButton();
clearButton = new javax.swing.JButton();
SendButton = new javax.swing.JButton();
plainAscii = new javax.swing.JRadioButton();
int16 = new javax.swing.JRadioButton();
jLabel1 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Serial ZigBee Graphical Network");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
textWin.setColumns(20);
textWin.setLineWrap(true);
textWin.setRows(5);
scrollPane.setViewportView(textWin);
textbar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
textbarActionPerformed(evt);
}
});
portBox.setModel(new javax.swing.DefaultComboBoxModel(portList));
portBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
portBoxActionPerformed(evt);
}
});
baudField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
baudFieldActionPerformed(evt);
}
});
baudButton.setText("Set Baud");
baudButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
baudButtonActionPerformed(evt);
}
});
portToggle.setText("Open Port");
portToggle.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
portToggleActionPerformed(evt);
}
});
clearButton.setText("Clear Terminal");
clearButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clearButtonActionPerformed(evt);
}
});
SendButton.setText("Send");
SendButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
SendButtonActionPerformed(evt);
}
});
rxformat.add(plainAscii);
plainAscii.setSelected(true);
plainAscii.setText("Plain ASCII");
plainAscii.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
plainAsciiActionPerformed(evt);
}
});
rxformat.add(int16);
int16.setText("int16");
int16.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
int16ActionPerformed(evt);
}
});
jLabel1.setText("Receive Display Format");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(jSeparator1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE)
.add(org.jdesktop.layout.GroupLayout.LEADING, int16)
.add(org.jdesktop.layout.GroupLayout.LEADING, plainAscii)
.add(org.jdesktop.layout.GroupLayout.LEADING, scrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE)
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(textbar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 190, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(SendButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE))
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(baudField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 56, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(baudButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 87, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 18, Short.MAX_VALUE)
.add(clearButton))
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(portBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 114, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(18, 18, 18)
.add(portToggle, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE))
.add(org.jdesktop.layout.GroupLayout.LEADING, jLabel1))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(scrollPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 235, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(textbar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(SendButton))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(portBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(portToggle))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(clearButton)
.add(baudField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(baudButton))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 9, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(1, 1, 1)
.add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(plainAscii)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(int16)
.addContainerGap(42, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void SendButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SendButtonActionPerformed
//Send button is the same action as hitting Enter on the textbar
textbarActionPerformed(evt);
}//GEN-LAST:event_SendButtonActionPerformed
private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed
//remove all text from the window
textWin.replaceRange("",0,textWin.getText().length());
}//GEN-LAST:event_clearButtonActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
//when user closes, make sure to close open ports and open I/O streams
if (portIdentifier.isCurrentlyOwned()) { //if port open, close port
portToggle.setText("Open Port");
if (inputStream != null) //close input stream
try {inputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
if (outputStream != null) //close output stream
try {outputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
serialPort.removeEventListener();
if (serialPort != null) serialPort.close();
open=false;
textWin.append(">>Port "+portName+" is now closed.\n");
}
}//GEN-LAST:event_formWindowClosing
private void baudButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_baudButtonActionPerformed
//only change baud when port is closed
boolean reopen = false;
if (portIdentifier.isCurrentlyOwned()) {//if port open, prompt user to close
textWin.append(">>Closing Port " +portName+ ".\n");
reopen = true;
//JOptionPane.showMessageDialog(this, "Must Close Port First.", "Error", JOptionPane.ERROR_MESSAGE);
}
String newbaud = baudField.getText();//get text from user
//do simple check to make sure baudrate is valid
if (newbaud.equals("")) {
textWin.append(">>Must Enter Valid Baud Rate\n");
//JOptionPane.showMessageDialog(this, "Must Enter Valid Baud Rate.");
}
else {//convert string to int. when user re-opens port, it will be new baudrate
baudRate=Integer.valueOf(newbaud).intValue();
textWin.append(">>Baud rate changed to " +baudRate+ "\n");
if (reopen == true) {
try {
connect(portName);
}
catch ( Exception e ) {
e.printStackTrace();
}
textWin.append(">>Opening Port: " +portName+", Baud Rate: "+baudRate+"\n");
}
}
}//GEN-LAST:event_baudButtonActionPerformed
private void portToggleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_portToggleActionPerformed
//only open valid port. portList[0]="select port" - not a valid port
//if ((String)portBox.getSelectedItem() == portList[0]) {
if (portBox.getSelectedItem().equals(portList[0])) {
textWin.append(">>Must Select Valid Port.\n");
portToggle.setSelected(open);
//JOptionPane.showMessageDialog(this, "Must Select Valid Port.", "Error", JOptionPane.ERROR_MESSAGE);
}
//if port open, close port & I/O streams
else if (portIdentifier.isCurrentlyOwned()) {
portToggle.setText("Open Port");
//close input stream
if (inputStream != null) {
try { inputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
//close output stream
if (outputStream != null) {
try { outputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
//close serial port
System.out.println("closing serial port.");
serialPort.removeEventListener();
if (serialPort != null) {
serialPort.close();
}
System.out.println("closed serial port.");
open=false;
textWin.append(">>Port "+portName+" is now closed.\n");
}
else {//else port is closed, so open it
portToggle.setText("Close Port");
portName=(String)portBox.getSelectedItem();
textWin.append(">>Opening Port: " +portName+", Baud Rate: "+baudRate+"\n");
try {
connect(portName);
}
catch ( Exception e ) {
e.printStackTrace();
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException ex) {
ex.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);
textWin.append(">>Port opened.\n");
}
System.out.println("end of toggle function");
}//GEN-LAST:event_portToggleActionPerformed
//open serial port
void connect ( String portName ) throws Exception
{
//make sure port is not currently in use
portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() ) {
System.out.println("Error: Port is currently in use");
}
else {
//create CommPort and identify available serial/parallel ports
commPort = portIdentifier.open(this.getClass().getName(),2000);
serialPort = (SerialPort) commPort;//cast all to serial
//set baudrate, 8N1 stopbits, no parity
serialPort.setSerialPortParams(baudRate,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
//start I/O streams
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
open=true;
}
}
private void portBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_portBoxActionPerformed
if (open==true) { //if port open, make user close port before changing port
textWin.append("Must Close Port Before Changing Port.\n");
//JOptionPane.showMessageDialog(this, "Must Close Port Before Changing Port.");
}
else {
portName = (String)portBox.getSelectedItem();
textWin.append(">>Port Selected: " +portName+ ", Baud Rate: "+baudRate+"\n");
}
}//GEN-LAST:event_portBoxActionPerformed
private void textbarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textbarActionPerformed
String text = textbar.getText(); //get text from field
textWin.append(">>"+text + "\n"); //write text to terminal followed by new line
textbar.selectAll(); //highlight text so it can be easily overwritten
//if serial port open, write to serial port
if (open==true) {
if (!text.equals("+++") && displayFormat == RxFormat.ASCII){
text=text+"\r"; //append carriage return to text (except for +++ for XBee)
}
try {
outputStream.write(text.getBytes()); //write to serial port
} catch (IOException ex) {
ex.printStackTrace();
}
}
}//GEN-LAST:event_textbarActionPerformed
private void baudFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_baudFieldActionPerformed
//hitting "enter" does the same thing as pressing the "Set Baud" button
baudButtonActionPerformed(evt);
}//GEN-LAST:event_baudFieldActionPerformed
private void plainAsciiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_plainAsciiActionPerformed
if (plainAscii.isSelected()) {
displayFormat = RxFormat.ASCII;
}
}//GEN-LAST:event_plainAsciiActionPerformed
private void int16ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_int16ActionPerformed
if (int16.isSelected()) {
displayFormat = RxFormat.INT16;
}
}//GEN-LAST:event_int16ActionPerformed
/*
private void listPorts() {
//display available ports to the terminal
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
while ( portEnum.hasMoreElements() )
{
portIdentifier = (CommPortIdentifier) portEnum.nextElement();
textWin.append(portIdentifier.getName() + "\n");
}
}
*/
//run before initializing GUI
//creates a string array of all the ports
//to be displayed in dropdown box upon opening program
private void getPorts() {
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
tempPortList = new String[MAX_PORTS]; //create array of 20 ports
int numports = 0;
int i;
tempPortList[0]="Select Port";
//fill up a temporary list of length MAX_PORTS with the portnames
while ( portEnum.hasMoreElements() )
{
portIdentifier = (CommPortIdentifier) portEnum.nextElement();
numports++;
tempPortList[numports]=portIdentifier.getName();
}
//make the actual port list only as long as necessary
portList = new String[numports];
for (i=0; i < numports; i++) {
portList[i] = tempPortList[i];
}
}
//serial event: when data is received from serial port
//display the data on the terminal
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
byte[] buffer = new byte[MAX_DATA]; //create a buffer (enlarge if buffer overflow occurs)
int numBytes=0; //how many bytes read (smaller than buffer)
int int16value;
switch (displayFormat) {
case ASCII: {
try { //read the input stream and store to buffer, count number of bytes read
while ((numBytes=inputStream.read(buffer)) > 0) {
//convert to string of size numBytes
String str= new String(buffer).substring(0,numBytes);
str=str.replace('\r','\n'); //replace CR with Newline
textWin.append(str); //write to terminal
}
} catch (IOException ex) {
ex.printStackTrace();
}
break;
}
case INT16: {
readall(inputStream, buffer, 2); //put two bytes in buffer
int16value = 256*(int)buffer[1] + (int)buffer[0];
textWin.append(int16value + "\n"); //write to terminal
break;
}
}
//scroll terminal to bottom
textWin.setCaretPosition(textWin.getText().length());
break;
}
}
//fill buffer with numBytes bytes from is
public void readall(InputStream is, byte[] buffer, int numBytes) {
int tempRead=0;
while( tempRead < numBytes ) {
try {
tempRead = tempRead + is.read(buffer, tempRead, numBytes - tempRead);
} catch (IOException ex) {
ex.printStackTrace();
}
}
return;
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SerTermGUI().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton SendButton;
private javax.swing.JButton baudButton;
private javax.swing.JTextField baudField;
private javax.swing.JButton clearButton;
private javax.swing.JRadioButton int16;
private javax.swing.JLabel jLabel1;
private javax.swing.JOptionPane jOptionPane1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JRadioButton plainAscii;
private javax.swing.JComboBox portBox;
private javax.swing.JToggleButton portToggle;
private javax.swing.ButtonGroup rxformat;
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTextArea textWin;
private javax.swing.JTextField textbar;
// End of variables declaration//GEN-END:variables
private String[] tempPortList, portList; //list of ports for combobox dropdown
private String portName;
private CommPort commPort;
private SerialPort serialPort;
private CommPortIdentifier portIdentifier = null;
private InputStream inputStream;
private OutputStream outputStream;
private int baudRate=9600;
private boolean open=false;
public enum RxFormat {ASCII, INT16;}
private RxFormat displayFormat;
//constants
static final int MAX_PORTS = 20; //maximum number of ports to look for
static final int MAX_DATA = 64;//maximum length of serial data received
}