added mote separator background colors + painting LED events as three thin lines (RGB) instead of in a single color
This commit is contained in:
parent
124380e354
commit
e36479f0b5
|
@ -26,7 +26,7 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: TimeLine.java,v 1.9 2009/06/16 12:16:02 fros4943 Exp $
|
* $Id: TimeLine.java,v 1.10 2009/06/25 16:44:08 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja.plugins;
|
package se.sics.cooja.plugins;
|
||||||
|
@ -46,14 +46,41 @@ import java.io.BufferedWriter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Observer;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.AbstractAction;
|
||||||
|
import javax.swing.Action;
|
||||||
|
import javax.swing.Box;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JCheckBox;
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JDialog;
|
||||||
|
import javax.swing.JFileChooser;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.JSplitPane;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.jdom.Element;
|
import org.jdom.Element;
|
||||||
import se.sics.cooja.*;
|
|
||||||
|
import se.sics.cooja.ClassDescription;
|
||||||
|
import se.sics.cooja.GUI;
|
||||||
|
import se.sics.cooja.Mote;
|
||||||
|
import se.sics.cooja.PluginType;
|
||||||
|
import se.sics.cooja.Simulation;
|
||||||
|
import se.sics.cooja.VisPlugin;
|
||||||
|
import se.sics.cooja.Watchpoint;
|
||||||
|
import se.sics.cooja.WatchpointMote;
|
||||||
import se.sics.cooja.interfaces.LED;
|
import se.sics.cooja.interfaces.LED;
|
||||||
import se.sics.cooja.interfaces.Radio;
|
import se.sics.cooja.interfaces.Radio;
|
||||||
import se.sics.cooja.interfaces.Radio.RadioEvent;
|
import se.sics.cooja.interfaces.Radio.RadioEvent;
|
||||||
|
@ -67,6 +94,7 @@ import se.sics.cooja.interfaces.Radio.RadioEvent;
|
||||||
@PluginType(PluginType.SIM_STANDARD_PLUGIN)
|
@PluginType(PluginType.SIM_STANDARD_PLUGIN)
|
||||||
public class TimeLine extends VisPlugin {
|
public class TimeLine extends VisPlugin {
|
||||||
|
|
||||||
|
public static final int LED_PIXEL_HEIGHT = 2;
|
||||||
public static final int EVENT_PIXEL_HEIGHT = 4;
|
public static final int EVENT_PIXEL_HEIGHT = 4;
|
||||||
public static final int TIME_MARKER_PIXEL_HEIGHT = 6;
|
public static final int TIME_MARKER_PIXEL_HEIGHT = 6;
|
||||||
public static final int FIRST_MOTE_PIXEL_OFFSET = TIME_MARKER_PIXEL_HEIGHT + EVENT_PIXEL_HEIGHT;
|
public static final int FIRST_MOTE_PIXEL_OFFSET = TIME_MARKER_PIXEL_HEIGHT + EVENT_PIXEL_HEIGHT;
|
||||||
|
@ -620,7 +648,7 @@ public class TimeLine extends VisPlugin {
|
||||||
h += EVENT_PIXEL_HEIGHT;
|
h += EVENT_PIXEL_HEIGHT;
|
||||||
}
|
}
|
||||||
if (showLEDs) {
|
if (showLEDs) {
|
||||||
h += EVENT_PIXEL_HEIGHT;
|
h += 3*LED_PIXEL_HEIGHT;
|
||||||
}
|
}
|
||||||
if (showLogOutputs) {
|
if (showLogOutputs) {
|
||||||
h += EVENT_PIXEL_HEIGHT;
|
h += EVENT_PIXEL_HEIGHT;
|
||||||
|
@ -796,7 +824,17 @@ public class TimeLine extends VisPlugin {
|
||||||
|
|
||||||
addMouseListener(new MouseAdapter() {
|
addMouseListener(new MouseAdapter() {
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
if (e.isPopupTrigger() || SwingUtilities.isRightMouseButton(e)) {
|
if (e.isPopupTrigger()) {
|
||||||
|
popupMenu.show(Timeline.this, e.getX(), e.getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void mousePressed(MouseEvent e) {
|
||||||
|
if (e.isPopupTrigger()) {
|
||||||
|
popupMenu.show(Timeline.this, e.getX(), e.getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
if (e.isPopupTrigger()) {
|
||||||
popupMenu.show(Timeline.this, e.getX(), e.getY());
|
popupMenu.show(Timeline.this, e.getX(), e.getY());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -826,6 +864,7 @@ public class TimeLine extends VisPlugin {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final Color SEPARATOR_COLOR = new Color(220, 220, 220);
|
||||||
public void paintComponent(Graphics g) {
|
public void paintComponent(Graphics g) {
|
||||||
Rectangle bounds = g.getClipBounds();
|
Rectangle bounds = g.getClipBounds();
|
||||||
/*logger.info("Clip bounds: " + bounds);*/
|
/*logger.info("Clip bounds: " + bounds);*/
|
||||||
|
@ -849,7 +888,19 @@ public class TimeLine extends VisPlugin {
|
||||||
|
|
||||||
/* Paint mote events */
|
/* Paint mote events */
|
||||||
int lineHeightOffset = FIRST_MOTE_PIXEL_OFFSET;
|
int lineHeightOffset = FIRST_MOTE_PIXEL_OFFSET;
|
||||||
|
boolean dark = true;
|
||||||
for (int mIndex = 0; mIndex < allMoteEvents.size(); mIndex++) {
|
for (int mIndex = 0; mIndex < allMoteEvents.size(); mIndex++) {
|
||||||
|
|
||||||
|
/* Mote separators */
|
||||||
|
if (dark) {
|
||||||
|
g.setColor(SEPARATOR_COLOR);
|
||||||
|
g.fillRect(
|
||||||
|
0, lineHeightOffset-2,
|
||||||
|
getWidth(), paintedMoteHeight
|
||||||
|
);
|
||||||
|
}
|
||||||
|
dark = !dark;
|
||||||
|
|
||||||
if (showRadioRXTX) {
|
if (showRadioRXTX) {
|
||||||
MoteEvent firstEvent = getFirstIntervalEvent(allMoteEvents.get(mIndex).radioRXTXEvents, intervalStart);
|
MoteEvent firstEvent = getFirstIntervalEvent(allMoteEvents.get(mIndex).radioRXTXEvents, intervalStart);
|
||||||
if (firstEvent != null) {
|
if (firstEvent != null) {
|
||||||
|
@ -876,7 +927,7 @@ public class TimeLine extends VisPlugin {
|
||||||
if (firstEvent != null) {
|
if (firstEvent != null) {
|
||||||
firstEvent.paintInterval(g, lineHeightOffset, intervalEnd);
|
firstEvent.paintInterval(g, lineHeightOffset, intervalEnd);
|
||||||
}
|
}
|
||||||
lineHeightOffset += EVENT_PIXEL_HEIGHT;
|
lineHeightOffset += 3*LED_PIXEL_HEIGHT;
|
||||||
}
|
}
|
||||||
if (showLogOutputs) {
|
if (showLogOutputs) {
|
||||||
MoteEvent firstEvent = getFirstIntervalEvent(allMoteEvents.get(mIndex).logEvents, intervalStart);
|
MoteEvent firstEvent = getFirstIntervalEvent(allMoteEvents.get(mIndex).logEvents, intervalStart);
|
||||||
|
@ -1255,6 +1306,59 @@ public class TimeLine extends VisPlugin {
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* LEDs are painted in three lines */
|
||||||
|
public void paintInterval(Graphics g, int lineHeightOffset, long end) {
|
||||||
|
MoteEvent ev = this;
|
||||||
|
while (ev != null && ev.time < end) {
|
||||||
|
int w; /* Pixel width */
|
||||||
|
|
||||||
|
/* Calculate event width */
|
||||||
|
if (ev.next != null) {
|
||||||
|
w = (int) (ev.next.time - ev.time)/currentPixelDivisor;
|
||||||
|
} else {
|
||||||
|
w = (int) (end - ev.time)/currentPixelDivisor; /* No more events */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle zero pixel width events */
|
||||||
|
if (w == 0) {
|
||||||
|
if (PAINT_ZERO_WIDTH_EVENTS) {
|
||||||
|
w = 1;
|
||||||
|
} else {
|
||||||
|
ev = ev.next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color color = ev.getEventColor();
|
||||||
|
if (color == null) {
|
||||||
|
/* Skip painting event */
|
||||||
|
ev = ev.next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (color.getRed() > 0) {
|
||||||
|
g.setColor(new Color(color.getRed(), 0, 0));
|
||||||
|
g.fillRect(
|
||||||
|
(int)(ev.time/currentPixelDivisor), lineHeightOffset,
|
||||||
|
w, LED_PIXEL_HEIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (color.getGreen() > 0) {
|
||||||
|
g.setColor(new Color(0, color.getGreen(), 0));
|
||||||
|
g.fillRect(
|
||||||
|
(int)(ev.time/currentPixelDivisor), lineHeightOffset+LED_PIXEL_HEIGHT,
|
||||||
|
w, LED_PIXEL_HEIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (color.getBlue() > 0) {
|
||||||
|
g.setColor(new Color(0, 0, color.getBlue()));
|
||||||
|
g.fillRect(
|
||||||
|
(int)(ev.time/currentPixelDivisor), lineHeightOffset+2*LED_PIXEL_HEIGHT,
|
||||||
|
w, LED_PIXEL_HEIGHT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ev = ev.next;
|
||||||
|
}
|
||||||
|
}
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return
|
return
|
||||||
"LED state:<br>" +
|
"LED state:<br>" +
|
||||||
|
|
Loading…
Reference in a new issue