From: <jo...@us...> - 2008-01-26 00:26:57
|
Revision: 86 http://mspsim.svn.sourceforge.net/mspsim/?rev=86&view=rev Author: joxe Date: 2008-01-25 16:26:43 -0800 (Fri, 25 Jan 2008) Log Message: ----------- added duty-cycle diagram Modified Paths: -------------- mspsim/se/sics/mspsim/extutil/jfreechart/DataChart.java mspsim/se/sics/mspsim/platform/sky/SkyNode.java mspsim/se/sics/mspsim/ui/ControlUI.java mspsim/se/sics/mspsim/util/OperatingModeStatistics.java Modified: mspsim/se/sics/mspsim/extutil/jfreechart/DataChart.java =================================================================== --- mspsim/se/sics/mspsim/extutil/jfreechart/DataChart.java 2008-01-24 23:15:41 UTC (rev 85) +++ mspsim/se/sics/mspsim/extutil/jfreechart/DataChart.java 2008-01-26 00:26:43 UTC (rev 86) @@ -18,7 +18,9 @@ import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; +import se.sics.mspsim.chip.CC2420; import se.sics.mspsim.core.MSP430; +import se.sics.mspsim.util.OperatingModeStatistics; import se.sics.mspsim.util.StackMonitor; @SuppressWarnings("serial") @@ -26,9 +28,9 @@ private TimeSeriesCollection dataset; - public DataChart(String title) { + public DataChart(String title, String yaxis) { DateAxis domain = new DateAxis("Time"); - NumberAxis range = new NumberAxis("Bytes"); + NumberAxis range = new NumberAxis(yaxis); XYPlot xyplot = new XYPlot(); xyplot.setDomainAxis(domain); xyplot.setRangeAxis(range); @@ -38,11 +40,15 @@ DefaultXYItemRenderer renderer = new DefaultXYItemRenderer(); renderer.setSeriesPaint(0, Color.red); renderer.setSeriesPaint(1, Color.green); + renderer.setSeriesPaint(2, Color.blue); + renderer.setSeriesPaint(3, Color.black); // renderer.setBaseStroke( // new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL) // ); renderer.setSeriesShapesVisible(0, false); renderer.setSeriesShapesVisible(1, false); + renderer.setSeriesShapesVisible(2, false); + renderer.setSeriesShapesVisible(3, false); xyplot.setRenderer(renderer); domain.setAutoRange(true); @@ -74,12 +80,38 @@ StackMonitor sm = new StackMonitor(cpu); DataSourceSampler dss = new DataSourceSampler(); TimeSeries ts = new TimeSeries("Max Stack", Millisecond.class); - ts.setMaximumItemAge(30000); + ts.setMaximumItemCount(200); addTimeSeries(ts); dss.addDataSource(sm.getMaxSource(), ts); ts = new TimeSeries("Stack", Millisecond.class); - ts.setMaximumItemAge(30000); + ts.setMaximumItemCount(200); addTimeSeries(ts); dss.addDataSource(sm.getSource(), ts); } + + public void setupChipFrame(OperatingModeStatistics oms) { + openFrame("Duty-Cycle Monitor"); + DataSourceSampler dss = new DataSourceSampler(); + dss.setInterval(50); + TimeSeries ts = new TimeSeries("LEDS", Millisecond.class); + ts.setMaximumItemCount(200); + addTimeSeries(ts); + dss.addDataSource(oms.getMultiDataSource("Tmote Sky"), ts); + + ts = new TimeSeries("Listen", Millisecond.class); + ts.setMaximumItemCount(200); + addTimeSeries(ts); + dss.addDataSource(oms.getDataSource("CC2420", CC2420.MODE_RX_ON), ts); + + ts = new TimeSeries("Transmit", Millisecond.class); + ts.setMaximumItemCount(200); + addTimeSeries(ts); + dss.addDataSource(oms.getDataSource("CC2420", CC2420.MODE_TXRX_ON), ts); + + ts = new TimeSeries("CPU", Millisecond.class); + ts.setMaximumItemCount(200); + addTimeSeries(ts); + dss.addDataSource(oms.getDataSource("MSP430 Core", MSP430.MODE_ACTIVE), ts); + + } } Modified: mspsim/se/sics/mspsim/platform/sky/SkyNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/sky/SkyNode.java 2008-01-24 23:15:41 UTC (rev 85) +++ mspsim/se/sics/mspsim/platform/sky/SkyNode.java 2008-01-26 00:26:43 UTC (rev 86) @@ -51,6 +51,7 @@ import se.sics.mspsim.core.USART; import se.sics.mspsim.core.USARTListener; import se.sics.mspsim.extutil.highlight.HighlightSourceViewer; +import se.sics.mspsim.extutil.jfreechart.DataChart; import se.sics.mspsim.ui.ControlUI; import se.sics.mspsim.util.ELF; import se.sics.mspsim.util.IHexReader; @@ -140,6 +141,8 @@ stats = new OperatingModeStatistics(cpu); stats.addMonitor(this); + stats.addMonitor(radio); + stats.addMonitor(cpu); } public void setButton(boolean hi) { @@ -163,7 +166,7 @@ redLed = (data & RED_LED) == 0; blueLed = (data & BLUE_LED) == 0; greenLed = (data & GREEN_LED) == 0; - int newMode = (redLed ? 1 : 0) + (greenLed ? 1 : 0) + (blueLed ? 1 : 0); + int newMode = (redLed ? 1 : 0) + (greenLed ? 1 : 0) + (blueLed ? 1 : 0); if (mode != newMode) { mode = newMode; modeChanged(mode); @@ -225,6 +228,11 @@ cpu.getDisAsm().setMap(map); } + + // A HACK!!! + DataChart dataChart = new DataChart("Duty Cycle", "Duty Cycle"); + dataChart.setupChipFrame(node.stats); + cpu.cpuloop(); } Modified: mspsim/se/sics/mspsim/ui/ControlUI.java =================================================================== --- mspsim/se/sics/mspsim/ui/ControlUI.java 2008-01-24 23:15:41 UTC (rev 85) +++ mspsim/se/sics/mspsim/ui/ControlUI.java 2008-01-26 00:26:43 UTC (rev 86) @@ -84,7 +84,7 @@ this.stackUI = new StackUI(cpu); - DataChart test = new DataChart("Stack Monitor"); + DataChart test = new DataChart("Stack Monitor", "Bytes"); test.setupStackFrame(cpu); stackWindow = new JFrame("Stack"); Modified: mspsim/se/sics/mspsim/util/OperatingModeStatistics.java =================================================================== --- mspsim/se/sics/mspsim/util/OperatingModeStatistics.java 2008-01-24 23:15:41 UTC (rev 85) +++ mspsim/se/sics/mspsim/util/OperatingModeStatistics.java 2008-01-26 00:26:43 UTC (rev 86) @@ -43,6 +43,9 @@ import java.util.HashMap; import java.util.Iterator; +import org.jfree.chart.renderer.category.StatisticalBarRenderer; +import org.jfree.data.statistics.Statistics; + import se.sics.mspsim.core.Chip; import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.OperatingModeListener; @@ -62,15 +65,14 @@ public void addMonitor(Chip chip) { chip.addOperatingModeListener(this); + StatEntry entry = new StatEntry(chip.getName(), chip.getModeMax()); + statistics.put(chip.getName(), entry); } public void modeChanged(Chip source, int mode) { StatEntry entry = statistics.get(source.getName()); - if (entry == null) { - entry = new StatEntry(source.getName(), source.getModeMax()); - statistics.put(source.getName(), entry); - } - entry.updateStat(mode, cpu.cycles); + if (entry != null) + entry.updateStat(mode, cpu.cycles); } public void printStat() { @@ -80,7 +82,78 @@ } } + public DataSource getDataSource(String chip, int mode) { + StatEntry se = statistics.get(chip); + if (se != null) { + return new StatDataSource(se, mode); + } + return null; + } + + public DataSource getMultiDataSource(String chip) { + StatEntry se = statistics.get(chip); + if (se != null) { + return new StatMultiDataSource(se); + } + return null; + } + private class StatDataSource implements DataSource { + + private StatEntry entry; + private int mode; + private long lastCycles; + private long lastValue; + + public StatDataSource(StatEntry entry, int mode) { + this.entry = entry; + this.mode = mode; + lastCycles = cpu.cycles; + } + + // returns percentage since last call... + public int getValue() { + long diff = cpu.cycles - lastCycles; + if (diff == 0) return 0; + long val = entry.getValue(mode, cpu.cycles); + long valDiff = val - lastValue; + lastValue = val; + lastCycles = cpu.cycles; + return (int) (100 * valDiff / diff); + } + } + + private class StatMultiDataSource implements DataSource{ + + private StatEntry entry; + private long lastCycles; + private long[] lastValue; + + public StatMultiDataSource(StatEntry entry) { + this.entry = entry; + lastCycles = cpu.cycles; + lastValue = new long[entry.elapsed.length]; + } + + // returns percentage since last call... + public int getValue() { + long diff = cpu.cycles - lastCycles; + if (diff == 0) return 0; + + long valDiff = 0; + // Assume that 0 means "off" + for (int i = 1; i < lastValue.length; i++) { + // Just sum them - later a multiplicator array might be useful... + long val = entry.getValue(i, cpu.cycles); + valDiff += (val - lastValue[i]); + lastValue[i] = val; + } + lastCycles = cpu.cycles; + return (int) (100 * valDiff / diff); + } + } + + private class StatEntry { String key; long startTime; @@ -92,6 +165,13 @@ elapsed = new long[max + 1]; } + long getValue(int mode, long cycles) { + if (mode == this.mode) { + return elapsed[mode] + (cycles - startTime); + } + return elapsed[mode]; + } + void updateStat(int mode, long cycles) { if (this.mode != -1) { elapsed[this.mode] += cycles - startTime; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |