added a set of new mspsim-based mote types using CC1120, CC1101 and the Enc28j60 ethernet chip
minor changes: removed some obsolete stack monitoring code, improved mspsim-cooja window handler integration
This commit is contained in:
parent
ba39d98a86
commit
92655159c8
4 changed files with 83 additions and 54 deletions
|
@ -1,3 +1,3 @@
|
||||||
se.sics.cooja.GUI.MOTETYPES = + se.sics.cooja.mspmote.ESBMoteType se.sics.cooja.mspmote.SkyMoteType se.sics.cooja.mspmote.Z1MoteType se.sics.cooja.mspmote.WismoteMoteType se.sics.cooja.mspmote.Exp5438MoteType
|
se.sics.cooja.GUI.MOTETYPES = + se.sics.cooja.mspmote.ESBMoteType se.sics.cooja.mspmote.SkyMoteType se.sics.cooja.mspmote.Z1MoteType se.sics.cooja.mspmote.WismoteMoteType se.sics.cooja.mspmote.Exp5438MoteType se.sics.cooja.mspmote.SkyMoteType com.thingsquare.cooja.mspsim.CC430MoteType com.thingsquare.cooja.mspsim.Exp1120MoteType com.thingsquare.cooja.mspsim.Exp1101MoteType com.thingsquare.cooja.mspsim.Exp2420MoteType com.thingsquare.cooja.mspsim.Trxeb2520MoteType com.thingsquare.cooja.mspsim.Trxeb1120MoteType com.thingsquare.cooja.mspsim.Eth1120MoteType
|
||||||
se.sics.cooja.GUI.JARFILES = + cooja_mspsim.jar mspsim.jar coffee.jar jipv6.jar
|
se.sics.cooja.GUI.JARFILES = + cooja_mspsim.jar mspsim.jar coffee.jar jipv6.jar
|
||||||
se.sics.cooja.GUI.PLUGINS = + se.sics.cooja.mspmote.plugins.MspCLI se.sics.cooja.mspmote.plugins.MspCodeWatcher se.sics.cooja.mspmote.plugins.MspStackWatcher se.sics.cooja.mspmote.plugins.MspCycleWatcher
|
se.sics.cooja.GUI.PLUGINS = + se.sics.cooja.mspmote.plugins.MspCLI se.sics.cooja.mspmote.plugins.MspCodeWatcher se.sics.cooja.mspmote.plugins.MspStackWatcher se.sics.cooja.mspmote.plugins.MspCycleWatcher
|
||||||
|
|
|
@ -34,7 +34,12 @@ import java.io.File;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import se.sics.cooja.Simulation;
|
import se.sics.cooja.Simulation;
|
||||||
|
import se.sics.mspsim.platform.GenericNode;
|
||||||
|
import se.sics.mspsim.platform.ti.Exp1101Node;
|
||||||
|
import se.sics.mspsim.platform.ti.Exp1120Node;
|
||||||
import se.sics.mspsim.platform.ti.Exp5438Node;
|
import se.sics.mspsim.platform.ti.Exp5438Node;
|
||||||
|
import se.sics.mspsim.platform.ti.Trxeb1120Node;
|
||||||
|
import se.sics.mspsim.platform.ti.Trxeb2520Node;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fredrik Osterlind
|
* @author Fredrik Osterlind
|
||||||
|
@ -42,15 +47,39 @@ import se.sics.mspsim.platform.ti.Exp5438Node;
|
||||||
public class Exp5438Mote extends MspMote {
|
public class Exp5438Mote extends MspMote {
|
||||||
private static Logger logger = Logger.getLogger(Exp5438Mote.class);
|
private static Logger logger = Logger.getLogger(Exp5438Mote.class);
|
||||||
|
|
||||||
public Exp5438Node exp5438Node = null;
|
public GenericNode exp5438Node = null;
|
||||||
|
private String desc = "";
|
||||||
|
|
||||||
public Exp5438Mote(MspMoteType moteType, Simulation sim) {
|
public Exp5438Mote(MspMoteType moteType, Simulation sim) {
|
||||||
super(moteType, sim);
|
super(moteType, sim);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean initEmulator(File fileELF) {
|
protected boolean initEmulator(File fileELF) {
|
||||||
|
/* Hack: Try to figure out what type of Mspsim-node we should be used by checking file extension */
|
||||||
|
String filename = fileELF.getName();
|
||||||
|
if (filename.endsWith(".exp1101")) {
|
||||||
|
exp5438Node = new Exp1101Node();
|
||||||
|
desc = "Exp5438+CC1101";
|
||||||
|
} else if (filename.endsWith(".exp1120")) {
|
||||||
|
exp5438Node = new Exp1120Node();
|
||||||
|
desc = "Exp5438+CC1120";
|
||||||
|
} else if (filename.endsWith(".trxeb2520")) {
|
||||||
|
exp5438Node = new Trxeb2520Node();
|
||||||
|
desc = "Trxeb2520";
|
||||||
|
} else if (filename.endsWith(".trxeb1120")) {
|
||||||
|
exp5438Node = new Trxeb1120Node(false);
|
||||||
|
desc = "Trxeb1120";
|
||||||
|
} else if (filename.endsWith(".eth1120")) {
|
||||||
|
exp5438Node = new Trxeb1120Node(true);
|
||||||
|
desc = "Eth1120";
|
||||||
|
} else if (filename.endsWith(".exp2420") || filename.endsWith(".exp5438")) {
|
||||||
|
exp5438Node = new Exp5438Node();
|
||||||
|
desc = "Exp5438+CC2420";
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("unknown file extension, cannot figure out what Mspsim node type to use: " + filename);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
exp5438Node = new Exp5438Node();
|
|
||||||
registry = exp5438Node.getRegistry();
|
registry = exp5438Node.getRegistry();
|
||||||
prepareMote(fileELF, exp5438Node);
|
prepareMote(fileELF, exp5438Node);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -64,7 +93,7 @@ public class Exp5438Mote extends MspMote {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Exp5438 " + getID();
|
return desc + " " + getID();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,9 @@ import se.sics.cooja.mspmote.interfaces.MspDebugOutput;
|
||||||
import se.sics.cooja.mspmote.interfaces.MspMoteID;
|
import se.sics.cooja.mspmote.interfaces.MspMoteID;
|
||||||
import se.sics.cooja.mspmote.interfaces.UsciA1Serial;
|
import se.sics.cooja.mspmote.interfaces.UsciA1Serial;
|
||||||
|
|
||||||
|
import com.thingsquare.cooja.mspsim.CC1101Radio;
|
||||||
|
import com.thingsquare.cooja.mspsim.CC1120Radio;
|
||||||
|
|
||||||
@ClassDescription("EXP430F5438 mote")
|
@ClassDescription("EXP430F5438 mote")
|
||||||
@AbstractionLevelDescription("Emulated level")
|
@AbstractionLevelDescription("Emulated level")
|
||||||
public class Exp5438MoteType extends MspMoteType {
|
public class Exp5438MoteType extends MspMoteType {
|
||||||
|
|
|
@ -30,13 +30,13 @@
|
||||||
|
|
||||||
package se.sics.cooja.mspmote;
|
package se.sics.cooja.mspmote;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Observable;
|
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.jdom.Element;
|
import org.jdom.Element;
|
||||||
|
@ -53,8 +53,8 @@ import se.sics.cooja.Watchpoint;
|
||||||
import se.sics.cooja.WatchpointMote;
|
import se.sics.cooja.WatchpointMote;
|
||||||
import se.sics.cooja.interfaces.IPAddress;
|
import se.sics.cooja.interfaces.IPAddress;
|
||||||
import se.sics.cooja.motes.AbstractEmulatedMote;
|
import se.sics.cooja.motes.AbstractEmulatedMote;
|
||||||
import se.sics.cooja.mspmote.interfaces.MspSerial;
|
|
||||||
import se.sics.cooja.mspmote.interfaces.Msp802154Radio;
|
import se.sics.cooja.mspmote.interfaces.Msp802154Radio;
|
||||||
|
import se.sics.cooja.mspmote.interfaces.MspSerial;
|
||||||
import se.sics.cooja.mspmote.plugins.CodeVisualizerSkin;
|
import se.sics.cooja.mspmote.plugins.CodeVisualizerSkin;
|
||||||
import se.sics.cooja.mspmote.plugins.MspBreakpoint;
|
import se.sics.cooja.mspmote.plugins.MspBreakpoint;
|
||||||
import se.sics.cooja.plugins.Visualizer;
|
import se.sics.cooja.plugins.Visualizer;
|
||||||
|
@ -65,7 +65,8 @@ import se.sics.mspsim.cli.LineOutputStream;
|
||||||
import se.sics.mspsim.core.EmulationException;
|
import se.sics.mspsim.core.EmulationException;
|
||||||
import se.sics.mspsim.core.MSP430;
|
import se.sics.mspsim.core.MSP430;
|
||||||
import se.sics.mspsim.platform.GenericNode;
|
import se.sics.mspsim.platform.GenericNode;
|
||||||
import se.sics.mspsim.ui.JFrameWindowManager;
|
import se.sics.mspsim.ui.ManagedWindow;
|
||||||
|
import se.sics.mspsim.ui.WindowManager;
|
||||||
import se.sics.mspsim.util.ComponentRegistry;
|
import se.sics.mspsim.util.ComponentRegistry;
|
||||||
import se.sics.mspsim.util.ConfigManager;
|
import se.sics.mspsim.util.ConfigManager;
|
||||||
import se.sics.mspsim.util.DebugInfo;
|
import se.sics.mspsim.util.DebugInfo;
|
||||||
|
@ -95,10 +96,8 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
||||||
|
|
||||||
/* Stack monitoring variables */
|
/* Stack monitoring variables */
|
||||||
private boolean stopNextInstruction = false;
|
private boolean stopNextInstruction = false;
|
||||||
private boolean monitorStackUsage = false;
|
|
||||||
private int stackPointerLow = Integer.MAX_VALUE;
|
public GenericNode mspNode = null;
|
||||||
private int heapStartAddress;
|
|
||||||
private StackOverflowObservable stackOverflowObservable = new StackOverflowObservable();
|
|
||||||
|
|
||||||
public MspMote(MspMoteType moteType, Simulation simulation) {
|
public MspMote(MspMoteType moteType, Simulation simulation) {
|
||||||
this.simulation = simulation;
|
this.simulation = simulation;
|
||||||
|
@ -113,8 +112,43 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
||||||
initEmulator(myMoteType.getContikiFirmwareFile());
|
initEmulator(myMoteType.getContikiFirmwareFile());
|
||||||
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
||||||
|
|
||||||
/* TODO Setup COOJA-specific window manager */
|
/* TODO Create COOJA-specific window manager */
|
||||||
registry.registerComponent("windowManager", new JFrameWindowManager());
|
registry.removeComponent("windowManager");
|
||||||
|
registry.registerComponent("windowManager", new WindowManager() {
|
||||||
|
public ManagedWindow createWindow(String name) {
|
||||||
|
return new ManagedWindow() {
|
||||||
|
public void setVisible(boolean b) {
|
||||||
|
logger.warn("setVisible() ignored");
|
||||||
|
}
|
||||||
|
public void setTitle(String string) {
|
||||||
|
logger.warn("setTitle() ignored");
|
||||||
|
}
|
||||||
|
public void setSize(int width, int height) {
|
||||||
|
logger.warn("setSize() ignored");
|
||||||
|
}
|
||||||
|
public void setBounds(int x, int y, int width, int height) {
|
||||||
|
logger.warn("setBounds() ignored");
|
||||||
|
}
|
||||||
|
public void removeAll() {
|
||||||
|
logger.warn("removeAll() ignored");
|
||||||
|
}
|
||||||
|
public void pack() {
|
||||||
|
logger.warn("pack() ignored");
|
||||||
|
}
|
||||||
|
public boolean isVisible() {
|
||||||
|
logger.warn("isVisible() return false");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public String getTitle() {
|
||||||
|
logger.warn("getTitle() return \"\"");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
public void add(Component component) {
|
||||||
|
logger.warn("add() ignored");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
debuggingInfo = ((MspMoteType)getType()).getFirmwareDebugInfo();
|
debuggingInfo = ((MspMoteType)getType()).getFirmwareDebugInfo();
|
||||||
|
@ -156,45 +190,6 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
||||||
myMemory = (MspMoteMemory) memory;
|
myMemory = (MspMoteMemory) memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stack monitoring variables */
|
|
||||||
public class StackOverflowObservable extends Observable {
|
|
||||||
public void signalStackOverflow() {
|
|
||||||
setChanged();
|
|
||||||
notifyObservers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable/disable stack monitoring
|
|
||||||
*
|
|
||||||
* @param monitoring Monitoring enabled
|
|
||||||
*/
|
|
||||||
public void monitorStack(boolean monitoring) {
|
|
||||||
this.monitorStackUsage = monitoring;
|
|
||||||
resetLowestStackPointer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Lowest SP since stack monitoring was enabled
|
|
||||||
*/
|
|
||||||
public int getLowestStackPointer() {
|
|
||||||
return stackPointerLow;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets lowest stack pointer variable
|
|
||||||
*/
|
|
||||||
public void resetLowestStackPointer() {
|
|
||||||
stackPointerLow = Integer.MAX_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Stack overflow observable
|
|
||||||
*/
|
|
||||||
public StackOverflowObservable getStackOverflowObservable() {
|
|
||||||
return stackOverflowObservable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares CPU, memory and ELF module.
|
* Prepares CPU, memory and ELF module.
|
||||||
*
|
*
|
||||||
|
@ -204,6 +199,9 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
||||||
*/
|
*/
|
||||||
protected void prepareMote(File fileELF, GenericNode node) throws IOException {
|
protected void prepareMote(File fileELF, GenericNode node) throws IOException {
|
||||||
this.commandHandler = new CommandHandler(System.out, System.err);
|
this.commandHandler = new CommandHandler(System.out, System.err);
|
||||||
|
|
||||||
|
this.mspNode = node;
|
||||||
|
|
||||||
node.setCommandHandler(commandHandler);
|
node.setCommandHandler(commandHandler);
|
||||||
|
|
||||||
ConfigManager config = new ConfigManager();
|
ConfigManager config = new ConfigManager();
|
||||||
|
@ -225,7 +223,6 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
|
||||||
MapEntry[] allEntries = map.getAllEntries();
|
MapEntry[] allEntries = map.getAllEntries();
|
||||||
myMemory = new MspMoteMemory(this, allEntries, myCpu);
|
myMemory = new MspMoteMemory(this, allEntries, myCpu);
|
||||||
|
|
||||||
heapStartAddress = map.heapStartAddress;
|
|
||||||
myCpu.reset();
|
myCpu.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue