19
19
package processing .app ;
20
20
21
21
import cc .arduino .packages .BoardPort ;
22
+ import processing .app .helpers .CircularBuffer ;
23
+ import processing .app .helpers .Ticks ;
22
24
import processing .app .legacy .PApplet ;
23
25
24
- import processing .app .helpers .*;
25
- import static processing .app .I18n .tr ;
26
-
27
- import java .awt .*;
28
- import java .awt .event .*;
29
- import java .awt .geom .*;
30
26
import javax .swing .*;
31
- import javax .swing .border .*;
27
+ import javax .swing .border .EmptyBorder ;
28
+ import java .awt .*;
29
+ import java .awt .event .ActionListener ;
30
+ import java .awt .geom .AffineTransform ;
31
+ import java .awt .geom .Rectangle2D ;
32
+
33
+ import static processing .app .I18n .tr ;
32
34
33
35
public class SerialPlotter extends AbstractMonitor {
34
- private StringBuffer messageBuffer ;
35
- private CircularBuffer buffer ;
36
- private GraphPanel graphPanel ;
37
- private JComboBox serialRates ;
38
36
37
+ private final StringBuffer messageBuffer ;
38
+ private CircularBuffer buffer ;
39
+ private JComboBox <String > serialRates ;
39
40
private Serial serial ;
40
41
private int serialRate ;
41
42
42
43
private class GraphPanel extends JPanel {
43
44
private double minY , maxY , rangeY ;
44
45
private Rectangle bounds ;
45
46
private int xOffset ;
46
- private Font font ;
47
- private Color graphColor ;
48
-
47
+ private final Font font ;
48
+ private final Color graphColor ;
49
+
49
50
public GraphPanel () {
50
51
font = Theme .getFont ("console.font" );
51
52
graphColor = Theme .getColor ("header.bgcolor" );
52
53
xOffset = 20 ;
53
54
}
54
-
55
+
55
56
@ Override
56
57
public void paintComponent (Graphics g1 ) {
57
- Graphics2D g = (Graphics2D )g1 ;
58
+ Graphics2D g = (Graphics2D ) g1 ;
58
59
g .setRenderingHint (RenderingHints .KEY_ANTIALIASING , RenderingHints .VALUE_ANTIALIAS_ON );
59
60
g .setFont (font );
60
61
super .paintComponent (g );
61
-
62
+
62
63
bounds = g .getClipBounds ();
63
64
setBackground (Color .WHITE );
64
- if (buffer .isEmpty ()) {
65
+ if (buffer .isEmpty ()) {
65
66
return ;
66
67
}
67
-
68
- minY = buffer .min ();
69
- maxY = buffer .max ();
68
+
69
+ minY = buffer .min () / 2 ;
70
+ maxY = buffer .max () * 2 ;
70
71
Ticks ticks = new Ticks (minY , maxY , 3 );
71
72
minY = Math .min (minY , ticks .getTick (0 ));
72
73
maxY = Math .max (maxY , ticks .getTick (ticks .getTickCount () - 1 ));
@@ -77,45 +78,45 @@ public void paintComponent(Graphics g1) {
77
78
78
79
g .setStroke (new BasicStroke (1.0f ));
79
80
FontMetrics fm = g .getFontMetrics ();
80
- for (int i = 0 ; i < ticks .getTickCount (); ++i ) {
81
+ for (int i = 0 ; i < ticks .getTickCount (); ++i ) {
81
82
double tick = ticks .getTick (i );
82
83
Rectangle2D fRect = fm .getStringBounds (String .valueOf (tick ), g );
83
- xOffset = Math .max (xOffset , (int )fRect .getWidth () + 15 );
84
+ xOffset = Math .max (xOffset , (int ) fRect .getWidth () + 15 );
84
85
85
86
// draw tick
86
- g .drawLine (xOffset - 5 , (int )transformY (tick ), xOffset + 2 , (int )transformY (tick ));
87
+ g .drawLine (xOffset - 5 , (int ) transformY (tick ), xOffset + 2 , (int ) transformY (tick ));
87
88
// draw tick label
88
- g .drawString (String .valueOf (tick ), xOffset - (int )fRect .getWidth () - 10 , transformY (tick ) - (float )fRect .getHeight () * 0.5f + fm .getAscent ());
89
+ g .drawString (String .valueOf (tick ), xOffset - (int ) fRect .getWidth () - 10 , transformY (tick ) - (float ) fRect .getHeight () * 0.5f + fm .getAscent ());
89
90
}
90
91
91
92
g .drawLine (bounds .x + xOffset , bounds .y + 5 , bounds .x + xOffset , bounds .y + bounds .height - 10 );
92
-
93
- g .setTransform (AffineTransform .getTranslateInstance (xOffset , 0 ));
94
- float xstep = (float )(bounds .width - xOffset ) / (float )buffer .capacity ();
95
-
93
+
94
+ g .setTransform (AffineTransform .getTranslateInstance (xOffset , 0 ));
95
+ float xstep = (float ) (bounds .width - xOffset ) / (float ) buffer .capacity ();
96
+
96
97
g .setColor (graphColor );
97
98
g .setStroke (new BasicStroke (0.75f ));
98
-
99
- for (int i = 0 ; i < buffer .size () - 1 ; ++i ) {
99
+
100
+ for (int i = 0 ; i < buffer .size () - 1 ; ++i ) {
100
101
g .drawLine (
101
- (int )(i * xstep ), (int )transformY (buffer .get (i )),
102
- (int )((i + 1 ) * xstep ), (int )transformY (buffer .get (i + 1 ))
102
+ (int ) (i * xstep ), (int ) transformY (buffer .get (i )),
103
+ (int ) ((i + 1 ) * xstep ), (int ) transformY (buffer .get (i + 1 ))
103
104
);
104
105
}
105
106
}
106
-
107
+
107
108
@ Override
108
109
public Dimension getMinimumSize () {
109
110
return new Dimension (200 , 100 );
110
111
}
111
-
112
+
112
113
@ Override
113
114
public Dimension getPreferredSize () {
114
115
return new Dimension (500 , 250 );
115
116
}
116
-
117
+
117
118
private float transformY (double rawY ) {
118
- return (float )(5 + (bounds .height - 10 ) * (1.0 - (rawY - minY ) / rangeY ));
119
+ return (float ) (5 + (bounds .height - 10 ) * (1.0 - (rawY - minY ) / rangeY ));
119
120
}
120
121
}
121
122
@@ -124,93 +125,80 @@ public SerialPlotter(BoardPort port) {
124
125
125
126
serialRate = PreferencesData .getInteger ("serial.debug_rate" );
126
127
serialRates .setSelectedItem (serialRate + " " + tr ("baud" ));
127
- onSerialRateChange (new ActionListener () {
128
- public void actionPerformed (ActionEvent event ) {
129
- String wholeString = (String ) serialRates .getSelectedItem ();
130
- String rateString = wholeString .substring (0 , wholeString .indexOf (' ' ));
131
- serialRate = Integer .parseInt (rateString );
132
- PreferencesData .set ("serial.debug_rate" , rateString );
133
- try {
134
- close ();
135
- Thread .sleep (100 ); // Wait for serial port to properly close
136
- open ();
137
- } catch (InterruptedException e ) {
138
- // noop
139
- } catch (Exception e ) {
140
- System .err .println (e );
141
- }
128
+ onSerialRateChange (event -> {
129
+ String wholeString = (String ) serialRates .getSelectedItem ();
130
+ String rateString = wholeString .substring (0 , wholeString .indexOf (' ' ));
131
+ serialRate = Integer .parseInt (rateString );
132
+ PreferencesData .set ("serial.debug_rate" , rateString );
133
+ try {
134
+ close ();
135
+ Thread .sleep (100 ); // Wait for serial port to properly close
136
+ open ();
137
+ } catch (Exception e ) {
138
+ // ignore
142
139
}
143
140
});
144
141
145
142
messageBuffer = new StringBuffer ();
146
143
}
147
-
144
+
148
145
protected void onCreateWindow (Container mainPane ) {
149
146
mainPane .setLayout (new BorderLayout ());
150
-
151
- Font consoleFont = Theme .getFont ("console.font" );
152
- Font editorFont = PreferencesData .getFont ("editor.font" );
153
- Font font = new Font (consoleFont .getName (), consoleFont .getStyle (), editorFont .getSize ());
154
-
147
+
155
148
buffer = new CircularBuffer (500 );
156
- graphPanel = new GraphPanel ();
157
-
149
+ GraphPanel graphPanel = new GraphPanel ();
150
+
158
151
mainPane .add (graphPanel , BorderLayout .CENTER );
159
-
152
+
160
153
JPanel pane = new JPanel ();
161
154
pane .setLayout (new BoxLayout (pane , BoxLayout .X_AXIS ));
162
155
pane .setBorder (new EmptyBorder (4 , 4 , 4 , 4 ));
163
-
164
- serialRates = new JComboBox ();
165
- for (int i = 0 ; i < serialRateStrings .length ; i ++)
166
- serialRates .addItem (serialRateStrings [i ] + " " + tr ("baud" ));
167
-
156
+
157
+ serialRates = new JComboBox <>();
158
+ for (String serialRateString : serialRateStrings ) serialRates .addItem (serialRateString + " " + tr ("baud" ));
159
+
168
160
serialRates .setMaximumSize (serialRates .getMinimumSize ());
169
161
170
162
pane .add (Box .createRigidArea (new Dimension (8 , 0 )));
171
163
pane .add (serialRates );
172
-
164
+
173
165
mainPane .add (pane , BorderLayout .SOUTH );
174
166
}
175
-
176
- protected void onEnableWindow (boolean enable )
177
- {
178
- serialRates .setEnabled (enable );
167
+
168
+ protected void onEnableWindow (boolean enable ) {
169
+ serialRates .setEnabled (enable );
179
170
}
180
-
181
- public void onSerialRateChange (ActionListener listener ) {
171
+
172
+ private void onSerialRateChange (ActionListener listener ) {
182
173
serialRates .addActionListener (listener );
183
174
}
184
-
175
+
185
176
public void message (final String s ) {
186
177
messageBuffer .append (s );
187
- while (true ) {
178
+ while (true ) {
188
179
int linebreak = messageBuffer .indexOf ("\n " );
189
- if (linebreak == -1 ) {
180
+ if (linebreak == -1 ) {
190
181
break ;
191
182
}
192
-
183
+
193
184
String line = messageBuffer .substring (0 , linebreak );
194
185
line = line .trim ();
195
186
messageBuffer .delete (0 , linebreak + 1 );
196
-
187
+
197
188
try {
198
189
double value = Double .valueOf (line );
199
190
buffer .add (value );
200
- } catch (NumberFormatException e ) {
201
- continue ; // ignore lines that can't be cast to a number
191
+ } catch (NumberFormatException e ) {
192
+ // ignore
202
193
}
203
194
}
204
195
205
- SwingUtilities .invokeLater (new Runnable () {
206
- public void run () {
207
- SerialPlotter .this .repaint ();
208
- }});
196
+ SwingUtilities .invokeLater (SerialPlotter .this ::repaint );
209
197
}
210
-
198
+
211
199
public void open () throws Exception {
212
200
super .open ();
213
-
201
+
214
202
if (serial != null ) return ;
215
203
216
204
serial = new Serial (getBoardPort ().getAddress (), serialRate ) {
0 commit comments