From: <ni...@us...> - 2008-10-13 14:00:32
|
Revision: 367 http://mspsim.svn.sourceforge.net/mspsim/?rev=367&view=rev Author: nifi Date: 2008-10-13 14:00:14 +0000 (Mon, 13 Oct 2008) Log Message: ----------- refactoring for better COOJA integration Modified Paths: -------------- mspsim/se/sics/mspsim/cli/CommandHandler.java mspsim/se/sics/mspsim/cli/DebugCommands.java mspsim/se/sics/mspsim/platform/GenericNode.java mspsim/se/sics/mspsim/platform/esb/ESBGui.java mspsim/se/sics/mspsim/platform/esb/ESBNode.java mspsim/se/sics/mspsim/platform/sky/MoteIVNode.java mspsim/se/sics/mspsim/platform/sky/SkyNode.java Modified: mspsim/se/sics/mspsim/cli/CommandHandler.java =================================================================== --- mspsim/se/sics/mspsim/cli/CommandHandler.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/cli/CommandHandler.java 2008-10-13 14:00:14 UTC (rev 367) @@ -1,41 +1,29 @@ package se.sics.mspsim.cli; - -import java.io.BufferedReader; import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.InterruptedIOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; -import java.util.Map; - import se.sics.mspsim.util.ActiveComponent; import se.sics.mspsim.util.ComponentRegistry; import se.sics.mspsim.util.MapTable; -public class CommandHandler implements ActiveComponent, Runnable { +public class CommandHandler implements ActiveComponent, LineListener { private String scriptDirectory = "scripts"; private Hashtable<String, Command> commands = new Hashtable<String, Command>(); - private boolean exit; - private boolean workaround = false; - private ArrayList<CommandContext[]> currentAsyncCommands = new ArrayList<CommandContext[]>(); - private BufferedReader inReader; - private PrintStream out; - private PrintStream err; + protected final PrintStream out; + protected final PrintStream err; private MapTable mapTable; private ComponentRegistry registry; + private ArrayList<CommandContext[]> currentAsyncCommands = new ArrayList<CommandContext[]>(); private int pidCounter = 0; - public CommandHandler() { - exit = false; - inReader = new BufferedReader(new InputStreamReader(System.in)); - out = System.out; - err = System.err; + public CommandHandler(PrintStream out, PrintStream err) { + this.out = out; + this.err = err; registerCommands(); } @@ -45,55 +33,6 @@ commands.put(cmd, command); } - - private String readLine(BufferedReader inReader2) throws IOException { - if (workaround) { - StringBuilder str = new StringBuilder(); - while(true) { - if (inReader2.ready()) { - int c = inReader2.read(); - if (c == '\n') { - return str.toString(); - } - if (c != '\r') { - str.append((char)c); - } - } else { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - throw new InterruptedIOException(); - } - } - } - } else { - return inReader2.readLine(); - } - } - - public void run() { - String lastLine = null; - while(!exit) { - try { - out.print(">"); - out.flush(); - String line = readLine(inReader);//.readLine(); - // Simple execution of last called command line when not running from terminal with history support - if (((char) 27 + "[A").equals(line)) { - line = lastLine; - } - if (line != null && line.length() > 0) { - lastLine = line; - executeCommand(line, null); - } - } catch (IOException e) { - e.printStackTrace(err); - err.println("Command line tool exiting..."); - exit = true; - } - } - } - public int executeCommand(String commandLine, CommandContext context) { String[][] parts; PrintStream out = context == null ? this.out : context.out; @@ -216,10 +155,6 @@ this.registry = registry; } - public void setWorkaround(boolean w) { - workaround = w; - } - public void start() { mapTable = (MapTable) registry.getComponent(MapTable.class); @@ -229,7 +164,6 @@ ((CommandBundle) commandBundles[i]).setupCommands(registry, this); } } - new Thread(this, "cmd").start(); } private void registerCommands() { @@ -288,12 +222,6 @@ return 1; } }); - registerCommand("workaround", new BasicCommand("activate workaround for Java console input bug", "") { - public int executeCommand(CommandContext context) { - workaround = true; - return 0; - } - }); registerCommand("ps", new BasicCommand("list current executing commands", "") { public int executeCommand(CommandContext context) { @@ -348,4 +276,10 @@ } return false; } + + @Override + public void lineRead(String line) { + executeCommand(line, null); + } + } Modified: mspsim/se/sics/mspsim/cli/DebugCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/DebugCommands.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/cli/DebugCommands.java 2008-10-13 14:00:14 UTC (rev 367) @@ -323,7 +323,7 @@ public int executeCommand(final CommandContext context) { Memory xmem = (Memory) DebugCommands.this.registry.getComponent("xmem"); if (xmem == null) { - context.err.print("No xmem component registered"); + context.err.println("No xmem component registered"); return 0; } int start = context.getArgumentAsAddress(0); @@ -359,7 +359,7 @@ public int executeCommand(final CommandContext context) { Memory xmem = (Memory) DebugCommands.this.registry.getComponent("xmem"); if (xmem == null) { - context.err.print("No xmem component registered"); + context.err.println("No xmem component registered"); return 0; } int adr = context.getArgumentAsAddress(0); Modified: mspsim/se/sics/mspsim/platform/GenericNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/GenericNode.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/platform/GenericNode.java 2008-10-13 14:00:14 UTC (rev 367) @@ -37,13 +37,16 @@ */ package se.sics.mspsim.platform; - +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; import java.io.IOException; +import java.net.URL; import se.sics.mspsim.cli.CommandHandler; import se.sics.mspsim.cli.DebugCommands; import se.sics.mspsim.cli.MiscCommands; import se.sics.mspsim.cli.ProfilerCommands; +import se.sics.mspsim.cli.StreamCommandHandler; import se.sics.mspsim.cli.WindowCommands; import se.sics.mspsim.core.Chip; import se.sics.mspsim.core.MSP430; @@ -68,53 +71,45 @@ protected String firmwareFile = null; protected ELF elf; protected OperatingModeStatistics stats; - + + public ComponentRegistry getRegistry() { + return registry; + } + + public MSP430 getCPU() { + return cpu; + } + public abstract void setupNode(); - - public void setup(ArgumentManager config) throws IOException { + + public void setCommandHandler(CommandHandler handler) { + registry.registerComponent("commandHandler", handler); + } + + public void setupArgs(ArgumentManager config) throws IOException { String[] args = config.getArguments(); if (args.length == 0) { System.out.println("Usage: " + getClass().getName() + " <firmware>"); System.exit(1); } + firmwareFile = args[0]; - this.config = config; + setup(config); - CommandHandler ch = new CommandHandler(); - stats = new OperatingModeStatistics(cpu); - - registry.registerComponent("cpu", cpu); - registry.registerComponent("commandHandler", ch); - registry.registerComponent("debugcmd", new DebugCommands()); - registry.registerComponent("misccmd", new MiscCommands()); - registry.registerComponent("statcmd", new StatCommands(cpu, stats)); - registry.registerComponent("wincmd", new WindowCommands()); - registry.registerComponent("profilecmd", new ProfilerCommands()); - registry.registerComponent("node", this); - registry.registerComponent("config", config); - - // Monitor execution - cpu.setMonitorExec(true); - //cpu.setDebug(true); int[] memory = cpu.getMemory(); - if (args[0].endsWith("ihex")) { // IHEX Reading IHexReader reader = new IHexReader(); - reader.readFile(memory, firmwareFile = args[0]); + reader.readFile(memory, firmwareFile); } else { - loadFirmware(args[0], memory); + loadFirmware(firmwareFile, memory); } - - cpu.reset(); - setupNode(); - if (args.length > 1) { MapTable map = new MapTable(args[1]); cpu.getDisAsm().setMap(map); registry.registerComponent("mapTable", map); } - + if (!config.getPropertyAsBoolean("nogui", false)) { // Setup control and other UI components ControlUI control = new ControlUI(registry); @@ -123,12 +118,39 @@ control.setSourceViewer(sourceViewer); } - registry.start(); - System.out.println("-----------------------------------------------"); System.out.println("MSPSim " + MSP430Constants.VERSION + " starting firmware: " + firmwareFile); System.out.println("-----------------------------------------------"); } + + public void setup(ConfigManager config) throws IOException { + this.config = config; + registry.registerComponent("cpu", cpu); + registry.registerComponent("node", this); + registry.registerComponent("config", config); + + CommandHandler ch = (CommandHandler) registry.getComponent("commandHandler"); + if (ch == null) { + ch = new StreamCommandHandler(System.in, System.out, System.err); + registry.registerComponent("commandHandler", ch); + } + stats = new OperatingModeStatistics(cpu); + registry.registerComponent("debugcmd", new DebugCommands()); + registry.registerComponent("misccmd", new MiscCommands()); + registry.registerComponent("statcmd", new StatCommands(cpu, stats)); + registry.registerComponent("wincmd", new WindowCommands()); + registry.registerComponent("profilecmd", new ProfilerCommands()); + + // Monitor execution + cpu.setMonitorExec(true); + //cpu.setDebug(true); + + setupNode(); + + registry.start(); + + cpu.reset(); + } public void run() { @@ -153,23 +175,42 @@ cpu.step(); } } - - public void loadFirmware(String name, int[] memory) throws IOException { + + public ELF loadFirmware(URL url, int[] memory) throws IOException { + DataInputStream inputStream = new DataInputStream(url.openStream()); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] firmwareData = new byte[2048]; + int read; + while ((read = inputStream.read(firmwareData)) != -1) { + byteStream.write(firmwareData, 0, read); + } + inputStream.close(); + ELF elf = new ELF(byteStream.toByteArray()); + elf.readAll(); + return loadFirmware(elf, memory); + } + + public ELF loadFirmware(String name, int[] memory) throws IOException { + return loadFirmware(ELF.readELF(firmwareFile = name), memory); + } + + public ELF loadFirmware(ELF elf, int[] memory) { stop(); - elf = ELF.readELF(firmwareFile = name); + this.elf = elf; elf.loadPrograms(memory); MapTable map = elf.getMap(); cpu.getDisAsm().setMap(map); cpu.setMap(map); registry.registerComponent("elf", elf); registry.registerComponent("mapTable", map); + return elf; } - + // A step that will break out of breakpoints! public void step(int nr) { if (!cpu.isRunning()) { cpu.stepInstructions(nr); } } - + } Modified: mspsim/se/sics/mspsim/platform/esb/ESBGui.java =================================================================== --- mspsim/se/sics/mspsim/platform/esb/ESBGui.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/platform/esb/ESBGui.java 2008-10-13 14:00:14 UTC (rev 367) @@ -160,7 +160,9 @@ byte[] data = new byte[4]; public int nextData() { - inDataLine.read(data, 0, 4); + if (inDataLine != null) { + inDataLine.read(data, 0, 4); + } //System.out.println("sampled: " + ((data[1] << 8) + data[0])); return (((data[1] & 0xff) << 8) | data[0] & 0xff) >> 4; } Modified: mspsim/se/sics/mspsim/platform/esb/ESBNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/esb/ESBNode.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/platform/esb/ESBNode.java 2008-10-13 14:00:14 UTC (rev 367) @@ -104,12 +104,6 @@ cpu.setDebug(debug); } - - public MSP430 getCPU() { - return cpu; - } - - public void portWrite(IOPort source, int data) { // System.out.println("ESB: Writing to port: " + data); if (source == port2) { @@ -171,7 +165,7 @@ stats.addMonitor(radio); stats.addMonitor(cpu); - if (!config.getPropertyAsBoolean("nogui", false)) { + if (!config.getPropertyAsBoolean("nogui", true)) { gui = new ESBGui(this); // A HACK for some "graphs"!!! @@ -195,7 +189,10 @@ ESBNode node = new ESBNode(); ArgumentManager config = new ArgumentManager(); config.handleArguments(args); - node.setup(config); + if (config.getProperty("nogui") == null) { + config.setProperty("nogui", "false"); + } + node.setupArgs(config); node.start(); } Modified: mspsim/se/sics/mspsim/platform/sky/MoteIVNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/sky/MoteIVNode.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/platform/sky/MoteIVNode.java 2008-10-13 14:00:14 UTC (rev 367) @@ -4,7 +4,6 @@ import se.sics.mspsim.chip.SHT11; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.IOUnit; -import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.PortListener; import se.sics.mspsim.core.USARTListener; import se.sics.mspsim.platform.GenericNode; @@ -63,10 +62,6 @@ cpu.setDebug(debug); } - public MSP430 getCPU() { - return cpu; - } - public void setButton(boolean hi) { port2.setPinState(BUTTON_PIN, hi ? IOPort.PIN_HI : IOPort.PIN_LOW); } @@ -79,9 +74,9 @@ return elf; } - public void setupNodePorts(boolean loadFlash) { + public void setupNodePorts() { sht11 = new SHT11(cpu); - + IOUnit unit = cpu.getIOUnit("Port 5"); if (unit instanceof IOPort) { port5 = (IOPort) unit; Modified: mspsim/se/sics/mspsim/platform/sky/SkyNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/sky/SkyNode.java 2008-10-12 21:18:04 UTC (rev 366) +++ mspsim/se/sics/mspsim/platform/sky/SkyNode.java 2008-10-13 14:00:14 UTC (rev 367) @@ -41,7 +41,6 @@ package se.sics.mspsim.platform.sky; import java.io.IOException; - import se.sics.mspsim.chip.CC2420; import se.sics.mspsim.chip.FileM25P80; import se.sics.mspsim.chip.M25P80; @@ -55,7 +54,6 @@ import se.sics.mspsim.util.ArgumentManager; import se.sics.mspsim.util.NetworkConnection; import se.sics.mspsim.util.OperatingModeStatistics; -import se.sics.mspsim.util.Utils; /** * Emulation of Sky Mote @@ -83,9 +81,9 @@ public void setFlash(M25P80 flash) { this.flash = flash; + registry.registerComponent("xmem", flash); } - // USART Listener public void dataReceived(USART source, int data) { radio.dataReceived(source, data); @@ -101,8 +99,8 @@ return "Tmote Sky"; } - public void setupNodePorts(boolean loadFlash) { - super.setupNodePorts(loadFlash); + public void setupNodePorts() { + super.setupNodePorts(); IOUnit usart0 = cpu.getIOUnit("USART 0"); if (usart0 instanceof USART) { @@ -110,12 +108,12 @@ radio.setCCAPort(port1, CC2420_CCA); radio.setFIFOPPort(port1, CC2420_FIFOP); radio.setFIFOPort(port1, CC2420_FIFO); - if (loadFlash) { - flash = new FileM25P80(cpu, flashFile); + if (flashFile != null) { + setFlash(new FileM25P80(cpu, flashFile)); } ((USART) usart0).setUSARTListener(this); port4 = (IOPort) cpu.getIOUnit("Port 4"); - if (port4 != null && port4 instanceof IOPort) { + if (port4 != null) { port4.setPortListener(this); radio.setSFDPort(port4, CC2420_SFD); } @@ -128,44 +126,49 @@ String fileName = config.getProperty("flashfile"); if (fileName == null) { fileName = firmwareFile; - int ix = fileName.lastIndexOf('.'); - if (ix > 0) { - fileName = fileName.substring(0, ix); + if (fileName != null) { + int ix = fileName.lastIndexOf('.'); + if (ix > 0) { + fileName = fileName.substring(0, ix); + } + fileName = fileName + ".flash"; } - fileName = fileName + ".flash"; } - System.out.println("Using flash file: " + fileName); + System.out.println("Using flash file: " + (fileName == null ? "no file" : fileName)); this.flashFile = fileName; - setupNodePorts(true); + setupNodePorts(); stats.addMonitor(this); stats.addMonitor(radio); stats.addMonitor(cpu); - network = new NetworkConnection(); - final RadioWrapper radioWrapper = new RadioWrapper(radio); - radioWrapper.setPacketListener(new PacketListener() { - public void transmissionStarted() { - } - public void transmissionEnded(byte[] receivedData) { -// System.out.println("**** Sending data len = " + receivedData.length); -// for (int i = 0; i < receivedData.length; i++) { -// System.out.println("Byte: " + Utils.hex8(receivedData[i])); -// } - network.dataSent(receivedData); - } - }); - - network.addPacketListener(new PacketListener() { - public void transmissionStarted() { - } - public void transmissionEnded(byte[] receivedData) { -// System.out.println("**** Receiveing data = " + receivedData.length); - radioWrapper.packetReceived(receivedData); - } - }); + if (config.getPropertyAsBoolean("enableNetwork", false)) { + network = new NetworkConnection(); + final RadioWrapper radioWrapper = new RadioWrapper(radio); + radioWrapper.setPacketListener(new PacketListener() { + public void transmissionStarted() { + } + public void transmissionEnded(byte[] receivedData) { + // System.out.println("**** Sending data len = " + receivedData.length); + // for (int i = 0; i < receivedData.length; i++) { + // System.out.println("Byte: " + Utils.hex8(receivedData[i])); + // } + network.dataSent(receivedData); + } + }); + + network.addPacketListener(new PacketListener() { + public void transmissionStarted() { + } + public void transmissionEnded(byte[] receivedData) { + // System.out.println("**** Receiving data = " + receivedData.length); + radioWrapper.packetReceived(receivedData); + } + }); + } + // UART0 TXreg = 0x77? // cpu.setBreakPoint(0x77, new CPUMonitor() { // public void cpuAction(int type, int adr, int data) { @@ -174,7 +177,7 @@ // } // }); - if (!config.getPropertyAsBoolean("nogui", false)) { + if (!config.getPropertyAsBoolean("nogui", true)) { gui = new SkyGui(this); // A HACK for some "graphs"!!! @@ -185,15 +188,16 @@ dataChart.addDataSource(dss, "Transmit", stats.getDataSource("CC2420", CC2420.MODE_TXRX_ON)); dataChart.addDataSource(dss, "CPU", stats.getDataSource("MSP430 Core", MSP430.MODE_ACTIVE)); } - registry.registerComponent("xmem", flash); } - public static void main(String[] args) throws IOException { SkyNode node = new SkyNode(); ArgumentManager config = new ArgumentManager(); config.handleArguments(args); - node.setup(config); + if (config.getProperty("nogui") == null) { + config.setProperty("nogui", "false"); + } + node.setupArgs(config); node.start(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |