[cooja] getMemory() now returns MemoryInterface

Including code adaptions based on new memory methods to keep code compilable
This commit is contained in:
Enrico Joerns 2014-07-23 00:01:19 +02:00
parent 19d07beb16
commit 9dd29d56c9
8 changed files with 92 additions and 73 deletions

View File

@ -43,6 +43,8 @@ import org.contikios.cooja.MoteInterfaceHandler;
import org.contikios.cooja.MoteMemory;
import org.contikios.cooja.MoteType;
import org.contikios.cooja.Simulation;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryLayout;
import org.contikios.cooja.motes.AbstractEmulatedMote;
import avrora.arch.avr.AVRProperties;
import avrora.core.LoadableProgram;
@ -54,7 +56,6 @@ import avrora.sim.mcu.EEPROM;
import avrora.sim.platform.MicaZ;
import avrora.sim.platform.PlatformFactory;
import java.nio.ByteOrder;
import org.contikios.cooja.mote.memory.MemoryLayout;
/**
* @author Joakim Eriksson, Fredrik Osterlind
@ -267,7 +268,8 @@ public class MicaZMote extends AbstractEmulatedMote implements Mote {
return config;
}
public MoteMemory getMemory() {
@Override
public MemoryInterface getMemory() {
return myMemory;
}

View File

@ -52,6 +52,7 @@ import org.contikios.cooja.Simulation;
import org.contikios.cooja.Watchpoint;
import org.contikios.cooja.WatchpointMote;
import org.contikios.cooja.interfaces.IPAddress;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryLayout;
import org.contikios.cooja.motes.AbstractEmulatedMote;
import org.contikios.cooja.mspmote.interfaces.Msp802154Radio;
@ -188,7 +189,8 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
myCpu = cpu;
}
public MoteMemory getMemory() {
@Override
public MemoryInterface getMemory() {
return myMemory;
}

View File

@ -28,6 +28,7 @@
package org.contikios.cooja;
import java.util.Collection;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.jdom.Element;
@ -63,7 +64,7 @@ public interface Mote {
* @see #setMemory(MoteMemory)
* @return Mote memory
*/
public MoteMemory getMemory();
public MemoryInterface getMemory();
/**
* Returns mote type.

View File

@ -42,6 +42,7 @@ import org.contikios.cooja.MoteMemory;
import org.contikios.cooja.MoteType;
import org.contikios.cooja.SectionMoteMemory;
import org.contikios.cooja.Simulation;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.motes.AbstractWakeupMote;
/**
@ -98,7 +99,7 @@ public class ContikiMote extends AbstractWakeupMote implements Mote {
}
@Override
public MoteMemory getMemory() {
public MemoryInterface getMemory() {
return myMemory;
}

View File

@ -42,9 +42,9 @@ import org.jdom.Element;
import org.contikios.cooja.ClassDescription;
import org.contikios.cooja.Mote;
import org.contikios.cooja.MoteInterface;
import org.contikios.cooja.MoteMemory;
import org.contikios.cooja.MoteMemory.MemoryEventType;
import org.contikios.cooja.MoteMemory.MemoryMonitor;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryInterface.SegmentMonitor;
import org.contikios.cooja.mote.memory.VarMemory;
/**
* Read-only interface to IPv4 or IPv6 address.
@ -54,21 +54,22 @@ import org.contikios.cooja.MoteMemory.MemoryMonitor;
@ClassDescription("IP Address")
public class IPAddress extends MoteInterface {
private static Logger logger = Logger.getLogger(IPAddress.class);
private final MoteMemory moteMem;
private final VarMemory moteMem;
private static final int IPv6_MAX_ADDRESSES = 4;
private boolean ipv6IsGlobal = false;
private int ipv6AddressIndex = -1;
private static final int MONITORED_SIZE = 150;
private MemoryMonitor memMonitor;
private SegmentMonitor memMonitor;
public IPAddress(final Mote mote) {
moteMem = mote.getMemory();
moteMem = new VarMemory(mote.getMemory());
memMonitor = new MemoryMonitor() {
public void memoryChanged(MoteMemory memory, MemoryEventType type, int address) {
if (type != MemoryEventType.WRITE) {
memMonitor = new MemoryInterface.SegmentMonitor() {
@Override
public void memoryChanged(MemoryInterface memory, SegmentMonitor.EventType type, long address) {
if (type != SegmentMonitor.EventType.WRITE) {
return;
}
setChanged();
@ -76,11 +77,11 @@ public class IPAddress extends MoteInterface {
}
};
if (isVersion4()) {
moteMem.addMemoryMonitor(moteMem.getVariableAddress("uip_hostaddr"), 4, memMonitor);
moteMem.addVarMonitor(SegmentMonitor.EventType.WRITE, "uip_hostaddr", memMonitor);
} else if (isVersion6()) {
moteMem.addMemoryMonitor(moteMem.getVariableAddress("uip_ds6_netif_addr_list_offset"), 1, memMonitor);
moteMem.addMemoryMonitor(moteMem.getVariableAddress("uip_ds6_addr_size"), 1, memMonitor);
moteMem.addMemoryMonitor(moteMem.getVariableAddress("uip_ds6_if"), MONITORED_SIZE, memMonitor);
moteMem.addVarMonitor(SegmentMonitor.EventType.WRITE, "uip_ds6_netif_addr_list_offset", memMonitor);
moteMem.addVarMonitor(SegmentMonitor.EventType.WRITE, "uip_ds6_addr_size", memMonitor);
moteMem.addVarMonitor(SegmentMonitor.EventType.WRITE, "uip_ds6_if", memMonitor);
}
}
@ -205,11 +206,11 @@ public class IPAddress extends MoteInterface {
super.removed();
if (memMonitor != null) {
if (isVersion4()) {
moteMem.removeMemoryMonitor(moteMem.getVariableAddress("rimeaddr_node_addr"), 4, memMonitor);
moteMem.removeVarMonitor("rimeaddr_node_addr", memMonitor);
} else if (isVersion6()) {
moteMem.removeMemoryMonitor(moteMem.getVariableAddress("uip_ds6_netif_addr_list_offset"), 1, memMonitor);
moteMem.removeMemoryMonitor(moteMem.getVariableAddress("uip_ds6_addr_size"), 1, memMonitor);
moteMem.removeMemoryMonitor(moteMem.getVariableAddress("uip_ds6_if"), MONITORED_SIZE, memMonitor);
moteMem.removeVarMonitor("uip_ds6_netif_addr_list_offset", memMonitor);
moteMem.removeVarMonitor("uip_ds6_addr_size", memMonitor);
moteMem.removeVarMonitor("uip_ds6_if", memMonitor);
}
}
}

View File

@ -43,9 +43,9 @@ import org.jdom.Element;
import org.contikios.cooja.ClassDescription;
import org.contikios.cooja.Mote;
import org.contikios.cooja.MoteInterface;
import org.contikios.cooja.MoteMemory;
import org.contikios.cooja.MoteMemory.MemoryEventType;
import org.contikios.cooja.MoteMemory.MemoryMonitor;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryInterface.SegmentMonitor;
import org.contikios.cooja.mote.memory.VarMemory;
/**
* Read-only interface to Rime address read from Contiki variable: linkaddr_node_addr.
@ -57,18 +57,19 @@ import org.contikios.cooja.MoteMemory.MemoryMonitor;
@ClassDescription("Rime address")
public class RimeAddress extends MoteInterface {
private static Logger logger = Logger.getLogger(RimeAddress.class);
private MoteMemory moteMem;
private VarMemory moteMem;
public static final int RIME_ADDR_LENGTH = 2;
private MemoryMonitor memMonitor = null;
private SegmentMonitor memMonitor = null;
public RimeAddress(final Mote mote) {
moteMem = mote.getMemory();
moteMem = new VarMemory(mote.getMemory());
if (hasRimeAddress()) {
memMonitor = new MemoryMonitor() {
public void memoryChanged(MoteMemory memory, MemoryEventType type, int address) {
if (type != MemoryEventType.WRITE) {
memMonitor = new SegmentMonitor() {
@Override
public void memoryChanged(MemoryInterface memory, SegmentMonitor.EventType type, long address) {
if (type != SegmentMonitor.EventType.WRITE) {
return;
}
setChanged();
@ -76,7 +77,7 @@ public class RimeAddress extends MoteInterface {
}
};
/* TODO XXX Timeout? */
moteMem.addMemoryMonitor(moteMem.getVariableAddress("linkaddr_node_addr"), RIME_ADDR_LENGTH, memMonitor);
moteMem.addVarMonitor(SegmentMonitor.EventType.WRITE, "linkaddr_node_addr", memMonitor);
}
}
@ -131,7 +132,7 @@ public class RimeAddress extends MoteInterface {
public void removed() {
super.removed();
if (memMonitor != null) {
moteMem.removeMemoryMonitor(moteMem.getVariableAddress("linkaddr_node_addr"), RIME_ADDR_LENGTH, memMonitor);
moteMem.removeVarMonitor("linkaddr_node_addr", memMonitor);
}
}

View File

@ -47,6 +47,7 @@ import org.contikios.cooja.Simulation;
import org.contikios.cooja.interfaces.ApplicationRadio;
import org.contikios.cooja.interfaces.ApplicationSerialPort;
import org.contikios.cooja.interfaces.Radio;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryLayout;
/**
@ -111,7 +112,7 @@ public abstract class AbstractApplicationMote extends AbstractWakeupMote impleme
}
@Override
public MoteMemory getMemory() {
public MemoryInterface getMemory() {
return memory;
}

View File

@ -100,6 +100,10 @@ import org.contikios.cooja.VisPlugin;
import org.contikios.cooja.dialogs.TableColumnAdjuster;
import org.contikios.cooja.dialogs.UpdateAggregator;
import org.contikios.cooja.interfaces.IPAddress;
import org.contikios.cooja.mote.memory.MemoryBuffer;
import org.contikios.cooja.mote.memory.MemoryInterface;
import org.contikios.cooja.mote.memory.MemoryInterface.SegmentMonitor;
import org.contikios.cooja.mote.memory.VarMemory;
import org.contikios.cooja.motes.AbstractEmulatedMote;
import org.contikios.cooja.util.ArrayQueue;
import org.contikios.cooja.util.StringUtils;
@ -695,24 +699,24 @@ public class BufferListener extends VisPlugin {
private void registerSegmentMonitor(int size, boolean notify) throws Exception {
byte[] pointerValue = mote.getMemory().getMemorySegment(pointerAddress, pointerSize);
int segmentAddress = mote.getMemory().parseInt(pointerValue);
int segmentAddress = MemoryBuffer.wrap(mote.getMemory().getLayout(), pointerValue).getInt();
segmentMonitor = new SegmentMemoryMonitor(bl, mote, segmentAddress, size);
if (notify) {
segmentMonitor.memoryChanged(mote.getMemory(), MemoryEventType.WRITE, -1);
segmentMonitor.memoryChanged(mote.getMemory(), EventType.WRITE, -1);
}
lastSegmentAddress = segmentAddress;
}
@Override
final public void memoryChanged(MoteMemory memory,
org.contikios.cooja.MoteMemory.MemoryEventType type, int address) {
if (type == MemoryEventType.READ) {
final public void memoryChanged(MemoryInterface memory,
EventType type, long address) {
if (type == EventType.READ) {
return;
}
byte[] pointerValue = mote.getMemory().getMemorySegment(pointerAddress, pointerSize);
int segmentAddress = mote.getMemory().parseInt(pointerValue);
int segmentAddress = MemoryBuffer.wrap(mote.getMemory().getLayout(), pointerValue).getInt();
if (segmentAddress == lastSegmentAddress) {
return;
}
@ -738,7 +742,7 @@ public class BufferListener extends VisPlugin {
}
}
static class SegmentMemoryMonitor implements org.contikios.cooja.MoteMemory.MemoryMonitor {
static class SegmentMemoryMonitor implements SegmentMonitor {
protected final BufferListener bl;
protected final Mote mote;
@ -755,7 +759,7 @@ public class BufferListener extends VisPlugin {
this.size = size;
if (address != 0) {
if (!mote.getMemory().addMemoryMonitor(address, size, this)) {
if (!mote.getMemory().addSegmentMonitor(SegmentMonitor.EventType.WRITE, address, size, this)) {
throw new Exception("Could not register memory monitor on: " + mote);
}
}
@ -776,18 +780,18 @@ public class BufferListener extends VisPlugin {
public void dispose() {
if (address != 0) {
mote.getMemory().removeMemoryMonitor(address, size, this);
mote.getMemory().removeSegmentMonitor(address, size, this);
}
}
@Override
public void memoryChanged(MoteMemory memory, MemoryEventType type, int address) {
public void memoryChanged(MemoryInterface memory, EventType type, long address) {
byte[] newData = getAddress()==0?null:mote.getMemory().getMemorySegment(getAddress(), getSize());
addBufferAccess(bl, mote, oldData, newData, type, this.address);
oldData = newData;
}
void addBufferAccess(BufferListener bl, Mote mote, byte[] oldData, byte[] newData, MemoryEventType type, int address) {
void addBufferAccess(BufferListener bl, Mote mote, byte[] oldData, byte[] newData, EventType type, int address) {
BufferAccess ba = new BufferAccess(
mote,
mote.getSimulation().getSimulationTime(),
@ -957,7 +961,7 @@ public class BufferListener extends VisPlugin {
public boolean include(RowFilter.Entry<? extends Object, ? extends Object> entry) {
if (hideReads) {
int row = (Integer) entry.getIdentifier();
if (logs.get(row).type == MemoryEventType.READ) {
if (logs.get(row).type == SegmentMonitor.EventType.READ) {
return false;
}
}
@ -1013,13 +1017,13 @@ public class BufferListener extends VisPlugin {
public final byte[] mem;
private boolean[] accessedBitpattern = null;
public final MemoryEventType type;
public final SegmentMonitor.EventType type;
public final String sourceStr;
public final String stackTrace;
public final int address;
public BufferAccess(
Mote mote, long time, int address, byte[] newData, byte[] oldData, MemoryEventType type, boolean withStackTrace) {
Mote mote, long time, int address, byte[] newData, byte[] oldData, SegmentMonitor.EventType type, boolean withStackTrace) {
this.mote = mote;
this.time = time;
this.mem = newData==null?NULL_DATA:newData;
@ -1538,7 +1542,7 @@ public class BufferListener extends VisPlugin {
bl,
mote,
getPointerAddress(mote),
mote.getMemory().getIntegerLength(),
mote.getMemory().getLayout().intSize,
getSize(mote)
);
}
@ -1622,16 +1626,18 @@ public class BufferListener extends VisPlugin {
@ClassDescription("Integer array")
public static class IntegerParser extends StringParser {
private VarMemory varMem = new VarMemory(null);
@Override
public String parseString(BufferAccess ba) {
StringBuilder sb = new StringBuilder();
varMem.associateMemory(ba.mote.getMemory());
int intLen = ba.mote.getMemory().getIntegerLength();
int intLen = ba.mote.getMemory().getLayout().intSize;
sb.append("<html>");
for (int i=0; i < ba.mem.length/intLen; i++) {
byte[] mem = Arrays.copyOfRange(ba.mem, i*intLen,(i+1)*intLen);
boolean[] diff = Arrays.copyOfRange(ba.getAccessedBitpattern(), i*intLen,(i+1)*intLen);
int val = ba.mote.getMemory().parseInt(mem);
int val = MemoryBuffer.wrap(ba.mote.getMemory().getLayout(), mem).getInt();
boolean red = false;
for (boolean changed: diff) {
@ -1802,14 +1808,14 @@ public class BufferListener extends VisPlugin {
public static class NodeIDBuffer extends SegmentBuffer {
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists("node_id")) {
if (!mote.getMemory().getSymbolMap().containsKey("node_id")) {
return -1;
}
return mote.getMemory().getVariableAddress("node_id");
return (int) mote.getMemory().getSymbolMap().get("node_id").addr;
}
@Override
public int getSize(Mote mote) {
return mote.getMemory().getIntegerLength();
return mote.getMemory().getLayout().intSize;
}
}
@ -1818,11 +1824,11 @@ public class BufferListener extends VisPlugin {
public static class Queuebuf0Buffer extends SegmentBuffer {
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists("buframmem")) {
if (!mote.getMemory().getSymbolMap().containsKey("buframmem")) {
return -1;
}
int offset = 0;
return mote.getMemory().getVariableAddress("buframmem") + offset;
return (int) mote.getMemory().getSymbolMap().get("buframmem").addr + offset;
}
@Override
public int getSize(Mote mote) {
@ -1834,10 +1840,10 @@ public class BufferListener extends VisPlugin {
public static class PacketbufBuffer extends SegmentBuffer {
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists("packetbuf_aligned")) {
if (!mote.getMemory().getSymbolMap().containsKey("packetbuf_aligned")) {
return -1;
}
return mote.getMemory().getVariableAddress("packetbuf_aligned");
return (int) mote.getMemory().getSymbolMap().get("packetbuf_aligned").addr;
}
@Override
public int getSize(Mote mote) {
@ -1847,19 +1853,21 @@ public class BufferListener extends VisPlugin {
@ClassDescription("*packetbufptr")
public static class PacketbufPointerBuffer extends PointerBuffer {
VarMemory varMem = new VarMemory(null);
@Override
public int getPointerAddress(Mote mote) {
if (!mote.getMemory().variableExists("packetbufptr")) {
if (!mote.getMemory().getSymbolMap().containsKey("packetbufptr")) {
return -1;
}
return mote.getMemory().getVariableAddress("packetbufptr");
return (int) mote.getMemory().getSymbolMap().get("packetbufptr").addr;
}
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists("packetbufptr")) {
if (!mote.getMemory().getSymbolMap().containsKey("packetbufptr")) {
return -1;
}
return mote.getMemory().getIntValueOf("packetbufptr");
varMem.associateMemory(mote.getMemory());
return varMem.getIntValueOf("packetbufptr");
}
@Override
public int getSize(Mote mote) {
@ -1872,23 +1880,25 @@ public class BufferListener extends VisPlugin {
public String variable;
public int size;
public int offset;
VarMemory varMem = new VarMemory(null);
@Override
public int getPointerAddress(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return mote.getMemory().getVariableAddress(variable);
return (int) mote.getMemory().getSymbolMap().get(variable).addr;
}
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return mote.getMemory().getIntValueOf(variable)+offset;
varMem.associateMemory(mote.getMemory());
return varMem.getIntValueOf(variable)+offset;
}
@Override
public int getSize(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return size;
@ -1968,14 +1978,14 @@ public class BufferListener extends VisPlugin {
public int offset;
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return mote.getMemory().getVariableAddress(variable)+offset;
return (int) mote.getMemory().getSymbolMap().get(variable).addr+offset;
}
@Override
public int getSize(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return size;
@ -2052,14 +2062,14 @@ public class BufferListener extends VisPlugin {
public String variable;
@Override
public int getAddress(Mote mote) {
if (!mote.getMemory().variableExists(variable)) {
if (!mote.getMemory().getSymbolMap().containsKey(variable)) {
return -1;
}
return mote.getMemory().getVariableAddress(variable);
return (int) mote.getMemory().getSymbolMap().get(variable).addr;
}
@Override
public int getSize(Mote mote) {
return mote.getMemory().getIntegerLength();
return mote.getMemory().getLayout().intSize;
}
@Override