diff --git a/tools/cooja/java/se/sics/cooja/plugins/LogListener.java b/tools/cooja/java/se/sics/cooja/plugins/LogListener.java index 5dd5660e6..0476699bd 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/LogListener.java +++ b/tools/cooja/java/se/sics/cooja/plugins/LogListener.java @@ -108,6 +108,19 @@ public class LogListener extends VisPlugin implements HasQuickHelp { private static final long serialVersionUID = 3294595371354857261L; private static Logger logger = Logger.getLogger(LogListener.class); + private final Color[] BG_COLORS = new Color[] { + new Color(200, 200, 200), + new Color(200, 200, 255), + new Color(200, 255, 200), + new Color(200, 255, 255), + new Color(255, 200, 200), + new Color(255, 255, 200), + new Color(255, 255, 255), + new Color(255, 220, 200), + new Color(220, 255, 220), + new Color(255, 200, 255), + }; + private final static int COLUMN_TIME = 0; private final static int COLUMN_FROM = 1; private final static int COLUMN_DATA = 2; @@ -119,11 +132,11 @@ public class LogListener extends VisPlugin implements HasQuickHelp { "#" }; - private static final long TIME_SECOND = 1000*Simulation.MILLISECOND; - private static final long TIME_MINUTE = 60*TIME_SECOND; - private static final long TIME_HOUR = 60*TIME_MINUTE; + public static final long TIME_SECOND = 1000*Simulation.MILLISECOND; + public static final long TIME_MINUTE = 60*TIME_SECOND; + public static final long TIME_HOUR = 60*TIME_MINUTE; - private boolean formatTimeString = false; + private boolean formatTimeString = true; private boolean hasHours = false; private final JTable logTable; @@ -140,7 +153,7 @@ public class LogListener extends VisPlugin implements HasQuickHelp { private LogOutputListener logOutputListener; - private boolean backgroundColors = false; + private boolean backgroundColors = true; private JCheckBoxMenuItem colorCheckbox; private boolean inverseFilter = false; @@ -219,7 +232,7 @@ public class LogListener extends VisPlugin implements HasQuickHelp { appendCheckBox = new JCheckBoxMenuItem(appendAction); fileMenu.add(appendCheckBox); - colorCheckbox = new JCheckBoxMenuItem("Mote-specific coloring"); + colorCheckbox = new JCheckBoxMenuItem("Mote-specific coloring", backgroundColors); showMenu.add(colorCheckbox); colorCheckbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -309,18 +322,6 @@ public class LogListener extends VisPlugin implements HasQuickHelp { }; DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() { private static final long serialVersionUID = -340743275865216182L; - private final Color[] BG_COLORS = new Color[] { - new Color(200, 200, 200), - new Color(200, 200, 255), - new Color(200, 255, 200), - new Color(200, 255, 255), - new Color(255, 200, 200), - new Color(255, 255, 200), - new Color(255, 255, 255), - new Color(255, 220, 200), - new Color(220, 255, 220), - new Color(255, 200, 255), - }; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { @@ -331,12 +332,8 @@ public class LogListener extends VisPlugin implements HasQuickHelp { if (backgroundColors) { LogData d = logs.get(logTable.getRowSorter().convertRowIndexToModel(row)); - char last = d.getID().charAt(d.getID().length()-1); - if (last >= '0' && last <= '9') { - setBackground(BG_COLORS[last - '0']); - } else { - setBackground(null); - } + int color = (10+d.ev.getMote().getID())%10; + setBackground(BG_COLORS[color]); } else { setBackground(null); } @@ -674,7 +671,7 @@ public class LogListener extends VisPlugin implements HasQuickHelp { } RowFilter wrapped = new RowFilter() { public boolean include(RowFilter.Entry entry) { - if (regexp != null) { + if (regexp != null) { boolean pass = regexp.include(entry); if (inverseFilter && pass) { return false; @@ -698,6 +695,7 @@ public class LogListener extends VisPlugin implements HasQuickHelp { filterTextField.setBackground(Color.red); filterTextField.setToolTipText("Syntax error in regular expression: " + e.getMessage()); } + simulation.getGUI().getDesktopPane().repaint(); } public void trySelectTime(final long time) { @@ -732,19 +730,7 @@ public class LogListener extends VisPlugin implements HasQuickHelp { public String getTime() { if (formatTimeString) { - long t = ev.getTime(); - long h = (t / TIME_HOUR); - t -= (t / TIME_HOUR)*TIME_HOUR; - long m = (t / TIME_MINUTE); - t -= (t / TIME_MINUTE)*TIME_MINUTE; - long s = (t / TIME_SECOND); - t -= (t / TIME_SECOND)*TIME_SECOND; - long ms = t / Simulation.MILLISECOND; - if (hasHours) { - return String.format("%d:%02d:%02d.%03d", h,m,s,ms); - } else { - return String.format("%02d:%02d.%03d", m,s,ms); - } + return getFormattedTime(ev.getTime()); } else { return "" + ev.getTime() / Simulation.MILLISECOND; } @@ -1031,4 +1017,60 @@ public class LogListener extends VisPlugin implements HasQuickHelp { "

^ID:[2-5] Contiki
logs from motes 2 to 5 starting with 'Contiki'"; } + /* Experimental feature: let other plugins learn if a log output would be filtered or not */ + public boolean filterWouldAccept(LogOutputEvent ev) { + RowFilter rowFilter = logFilter.getRowFilter(); + if (rowFilter == null) { + /* No filter */ + return true; + } + + final LogData ld = new LogData(ev); + RowFilter.Entry entry = new RowFilter.Entry() { + public TableModel getModel() { + return model; + } + public int getValueCount() { + return model.getColumnCount(); + } + public Object getValue(int index) { + if (index == COLUMN_TIME) { + return ld.getTime(); + } else if (index == COLUMN_FROM) { + return ld.getID(); + } else if (index == COLUMN_DATA) { + return ld.ev.getMessage(); + } else if (index == COLUMN_CONCAT) { + return ld.getID() + ' ' + ld.ev.getMessage(); + } + return null; + } + public Integer getIdentifier() { + return null; + } + }; + boolean show; + show = rowFilter.include(entry); + return show; + } + public Color getColorOfEntry(LogOutputEvent logEvent) { + int color = (10+logEvent.getMote().getID())%10; + return BG_COLORS[color]; + } + + public static String getFormattedTime(long t) { + long h = (t / LogListener.TIME_HOUR); + t -= (t / TIME_HOUR)*TIME_HOUR; + long m = (t / TIME_MINUTE); + t -= (t / TIME_MINUTE)*TIME_MINUTE; + long s = (t / TIME_SECOND); + t -= (t / TIME_SECOND)*TIME_SECOND; + long ms = t / Simulation.MILLISECOND; + if (h > 0) { + return String.format("%d:%02d:%02d.%03d", h,m,s,ms); + } else { + return String.format("%02d:%02d.%03d", m,s,ms); + } + } + }