event based mote interfaces: less dependencies on tick polling + using new mote time events

This commit is contained in:
fros4943 2009-05-26 14:24:20 +00:00
parent fba3701a86
commit d996ae1476
12 changed files with 182 additions and 116 deletions

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiBeeper.java,v 1.9 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiBeeper.java,v 1.10 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -101,7 +101,7 @@ public class ContikiBeeper extends Beeper implements ContikiMoteInterface, Polle
return new String[]{"beep_interface"};
}
private TimeEvent stopBeepEvent = new TimeEvent(0) {
private TimeEvent stopBeepEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
myEnergyConsumption = 0.0;
}
@ -117,7 +117,7 @@ public class ContikiBeeper extends Beeper implements ContikiMoteInterface, Polle
moteMem.setByteValueOf("simBeeped", (byte) 0);
/* Schedule stop beeping (reset energy consumption) */
mote.getSimulation().scheduleEvent(stopBeepEvent, mote.getSimulation().getSimulationTime());
mote.getSimulation().scheduleEvent(stopBeepEvent, mote.getSimulation().getSimulationTime()+Simulation.MILLISECOND);
}
}

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiButton.java,v 1.12 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiButton.java,v 1.13 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -38,6 +38,7 @@ import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
import se.sics.cooja.interfaces.Button;
@ -63,20 +64,19 @@ import se.sics.cooja.interfaces.Button;
*/
public class ContikiButton extends Button implements ContikiMoteInterface {
private SectionMoteMemory moteMem;
private Mote mote;
private ContikiMote mote;
private static Logger logger = Logger.getLogger(ContikiButton.class);
/**
* Creates an interface to the button at mote.
*
* @param mote
* Button's mote.
* @param mote Mote
* @see Mote
* @see se.sics.cooja.MoteInterfaceHandler
*/
public ContikiButton(Mote mote) {
this.mote = mote;
this.mote = (ContikiMote) mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
}
@ -84,20 +84,23 @@ public class ContikiButton extends Button implements ContikiMoteInterface {
return new String[]{"button_interface"};
}
private TimeEvent releaseButtonEvent = new TimeEvent(0) {
private TimeEvent pressButtonEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
doPressButton();
}
};
/* Force mote awake when button is down */
mote.setState(Mote.State.ACTIVE);
private TimeEvent releaseButtonEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
/* Wait until button change is handled by Contiki */
if (moteMem.getByteValueOf("simButtonChanged") == 0) {
/*logger.info("Releasing button at: " + t);*/
releaseButton();
} else {
/* Reschedule button release */
mote.getSimulation().scheduleEvent(releaseButtonEvent, t+1);
if (moteMem.getByteValueOf("simButtonChanged") != 0) {
/* Postpone button release */
mote.getSimulation().scheduleEvent(releaseButtonEvent, t + Simulation.MILLISECOND);
return;
}
/*logger.info("Releasing button at: " + t);*/
doReleaseButton();
}
};
@ -105,34 +108,40 @@ public class ContikiButton extends Button implements ContikiMoteInterface {
* Clicks button: Presses and immediately releases button.
*/
public void clickButton() {
pressButton();
mote.getSimulation().scheduleEvent(pressButtonEvent, mote.getSimulation().getSimulationTime());
mote.getSimulation().scheduleEvent(releaseButtonEvent, mote.getSimulation().getSimulationTime() + Simulation.MILLISECOND);
}
/* Schedule release button */
mote.getSimulation().scheduleEvent(releaseButtonEvent, mote.getSimulation().getSimulationTime());
public void pressButton() {
mote.getSimulation().scheduleEvent(pressButtonEvent, mote.getSimulation().getSimulationTime());
}
public void releaseButton() {
mote.getSimulation().scheduleEvent(releaseButtonEvent, mote.getSimulation().getSimulationTime());
}
private void doReleaseButton() {
moteMem.setByteValueOf("simButtonIsDown", (byte) 0);
if (moteMem.getByteValueOf("simButtonIsActive") == 1) {
moteMem.setByteValueOf("simButtonChanged", (byte) 1);
/* If mote is inactive, wake it up */
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
setChanged();
notifyObservers();
}
}
public void pressButton() {
private void doPressButton() {
moteMem.setByteValueOf("simButtonIsDown", (byte) 1);
if (moteMem.getByteValueOf("simButtonIsActive") == 1) {
moteMem.setByteValueOf("simButtonChanged", (byte) 1);
/* If mote is inactive, wake it up */
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
setChanged();
notifyObservers();

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiCFS.java,v 1.9 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiCFS.java,v 1.10 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -84,8 +84,6 @@ public class ContikiCFS extends MoteInterface implements ContikiMoteInterface, P
public final double ENERGY_CONSUMPTION_PER_READ_CHAR_mQ;
public final double ENERGY_CONSUMPTION_PER_WRITTEN_CHAR_mQ;
private double myEnergyConsumption = 0.0;
/**
* Creates an interface to the filesystem at mote.
*
@ -109,12 +107,6 @@ public class ContikiCFS extends MoteInterface implements ContikiMoteInterface, P
return new String[]{"cfs_interface"};
}
private TimeEvent doneEvent = new TimeEvent(0) {
public void execute(long t) {
myEnergyConsumption = 0.0;
}
};
public void doActionsAfterTick() {
if (moteMem.getByteValueOf("simCFSChanged") == 1) {
lastRead = moteMem.getIntValueOf("simCFSRead");
@ -124,15 +116,8 @@ public class ContikiCFS extends MoteInterface implements ContikiMoteInterface, P
moteMem.setIntValueOf("simCFSWritten", 0);
moteMem.setByteValueOf("simCFSChanged", (byte) 0);
myEnergyConsumption =
ENERGY_CONSUMPTION_PER_READ_CHAR_mQ*lastRead +
ENERGY_CONSUMPTION_PER_WRITTEN_CHAR_mQ*lastWritten;
this.setChanged();
this.notifyObservers(mote);
/* Reset energy consumption */
mote.getSimulation().scheduleEvent(doneEvent, mote.getSimulation().getSimulationTime());
}
}
@ -230,7 +215,7 @@ public class ContikiCFS extends MoteInterface implements ContikiMoteInterface, P
}
public double energyConsumption() {
return myEnergyConsumption;
return 0.0;
}
public Collection<Element> getConfigXML() {

View File

@ -26,18 +26,23 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiClock.java,v 1.8 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiClock.java,v 1.9 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
import java.util.Collection;
import javax.swing.JPanel;
import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.Mote.State;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
import se.sics.cooja.interfaces.Clock;
import se.sics.cooja.interfaces.PolledAfterAllTicks;
import se.sics.cooja.interfaces.PolledBeforeActiveTicks;
/**
@ -45,7 +50,10 @@ import se.sics.cooja.interfaces.PolledBeforeActiveTicks;
*
* Contiki variables:
* <ul>
* <li>int simCurrentTime
* <li>clock_time_t simCurrentTime
* <li>clock_time_t simNextExpirationTime
* <li>int simProcessRunValue
* <li>int simEtimerPending
* </ul>
*
* Core interface:
@ -58,13 +66,16 @@ import se.sics.cooja.interfaces.PolledBeforeActiveTicks;
*
* @author Fredrik Osterlind
*/
public class ContikiClock extends Clock implements ContikiMoteInterface, PolledBeforeActiveTicks {
public class ContikiClock extends Clock implements ContikiMoteInterface, PolledBeforeActiveTicks, PolledAfterAllTicks {
private static Logger logger = Logger.getLogger(ContikiClock.class);
private Mote mote = null;
private SectionMoteMemory moteMem = null;
private int timeDrift = 0;
private Simulation simulation;
private ContikiMote mote;
private SectionMoteMemory moteMem;
private long moteTime; /* Microseconds */
private long timeDrift; /* Microseconds */
/**
* @param mote Mote
*
@ -72,8 +83,11 @@ public class ContikiClock extends Clock implements ContikiMoteInterface, PolledB
* @see se.sics.cooja.MoteInterfaceHandler
*/
public ContikiClock(Mote mote) {
this.mote = mote;
this.simulation = mote.getSimulation();
this.mote = (ContikiMote) mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
timeDrift = 0;
moteTime = 0;
}
public static String[] getCoreInterfaceDependencies() {
@ -81,30 +95,51 @@ public class ContikiClock extends Clock implements ContikiMoteInterface, PolledB
}
public void setTime(long newTime) {
/* TODO: check if this is correct even if newTime > MAX_INT */
moteMem.setIntValueOf("simCurrentTime", (int)newTime);
moteTime = newTime;
if (moteTime > 0) {
moteMem.setIntValueOf("simCurrentTime", (int)(newTime/1000));
}
}
public void setDrift(int timeDrift) {
this.timeDrift = timeDrift;
public void setDrift(long drift) {
this.timeDrift = drift - (drift % 1000); /* Round to ms */
setTime(timeDrift);
}
public int getDrift() {
public long getDrift() {
return timeDrift;
}
public long getTime() {
return moteMem.getIntValueOf("simCurrentTime");
return moteTime;
}
public void doActionsBeforeTick() {
/* Update time */
long moteTime = mote.getSimulation().getSimulationTime() + timeDrift;
if (moteTime > 0) {
setTime(moteTime);
}
setTime(mote.getSimulation().getSimulationTime() + timeDrift);
}
public void doActionsAfterTick() {
/* Request next tick for remaining events / timers */
int processRunValue = moteMem.getIntValueOf("simProcessRunValue");
if (processRunValue != 0) {
/* Handle next Contiki event in one millisecond */
mote.scheduleNextWakeup(simulation.getSimulationTime() + 1000L);
return;
}
int etimersPending = moteMem.getIntValueOf("simEtimerPending");
if (etimersPending == 0) {
/* No timers */
return;
}
/* Request tick next wakeup time */
int nextExpirationTime = moteMem.getIntValueOf("simNextExpirationTime");
mote.scheduleNextWakeup(simulation.getSimulationTime() + 1000L*nextExpirationTime);
}
public JPanel getInterfaceVisualizer() {
return null;

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiPIR.java,v 1.6 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiPIR.java,v 1.7 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -38,6 +38,7 @@ import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
import se.sics.cooja.interfaces.PIR;
@ -72,7 +73,7 @@ public class ContikiPIR extends PIR implements ContikiMoteInterface {
private double energyActivePerTick = -1;
private Mote mote;
private ContikiMote mote;
private SectionMoteMemory moteMem;
private double myEnergyConsumption = 0.0;
@ -89,7 +90,7 @@ public class ContikiPIR extends PIR implements ContikiMoteInterface {
ENERGY_CONSUMPTION_PIR_mA = mote.getType().getConfig().getDoubleValue(
ContikiPIR.class, "ACTIVE_CONSUMPTION_mA");
this.mote = mote;
this.mote = (ContikiMote) mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
if (energyActivePerTick < 0) {
@ -101,14 +102,24 @@ public class ContikiPIR extends PIR implements ContikiMoteInterface {
return new String[]{"pir_interface"};
}
public void triggerChange() {
/**
* Simulates a change in the PIR sensor.
*/
public void triggerChange() {
mote.getSimulation().scheduleEvent(pirEvent, mote.getSimulation().getSimulationTime());
}
private TimeEvent pirEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
doTriggerChange();
}
};
public void doTriggerChange() {
if (moteMem.getByteValueOf("simPirIsActive") == 1) {
moteMem.setByteValueOf("simPirChanged", (byte) 1);
mote.setState(Mote.State.ACTIVE);
this.setChanged();
this.notifyObservers();
mote.scheduleImmediateWakeup();
}
}

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiRS232.java,v 1.8 2009/04/23 09:17:01 fros4943 Exp $
* $Id: ContikiRS232.java,v 1.9 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -35,6 +35,7 @@ import java.util.Vector;
import org.apache.log4j.Logger;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
import se.sics.cooja.dialogs.SerialUI;
import se.sics.cooja.interfaces.PolledAfterActiveTicks;
@ -67,7 +68,7 @@ import se.sics.cooja.interfaces.PolledAfterActiveTicks;
public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, PolledAfterActiveTicks {
private static Logger logger = Logger.getLogger(ContikiRS232.class);
private Mote mote = null;
private ContikiMote mote = null;
private SectionMoteMemory moteMem = null;
/**
@ -89,7 +90,7 @@ public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, Poll
ENERGY_CONSUMPTION_PER_CHAR_mQ =
mote.getType().getConfig().getDoubleValue(ContikiRS232.class, "CONSUMPTION_PER_CHAR_mQ");
this.mote = mote;
this.mote = (ContikiMote) mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
}
@ -118,7 +119,7 @@ public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, Poll
public void writeString(String message) {
final byte[] dataToAppend = message.getBytes();
TimeEvent writeStringEvent = new TimeEvent(0) {
TimeEvent writeStringEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
/* Append to existing buffer */
int oldSize = moteMem.getIntValueOf("simSerialReceivingLength");
@ -134,7 +135,7 @@ public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, Poll
moteMem.setByteArray("simSerialReceivingData", newData);
moteMem.setByteValueOf("simSerialReceivingFlag", (byte) 1);
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
}
};
mote.getSimulation().scheduleEvent(
@ -158,13 +159,13 @@ public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, Poll
pendingBytes.add(b);
}
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
if (pendingBytesEvent != null) {
/* Event is already scheduled, no need to reschedule */
return;
}
pendingBytesEvent = new TimeEvent(0) {
pendingBytesEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
ContikiRS232.this.pendingBytesEvent = null;
if (pendingBytes.isEmpty()) {
@ -207,13 +208,13 @@ public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, Poll
public void writeByte(final byte b) {
pendingBytes.add(b);
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
if (pendingBytesEvent != null) {
/* Event is already scheduled, no need to reschedule */
return;
}
pendingBytesEvent = new TimeEvent(0) {
pendingBytesEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
ContikiRS232.this.pendingBytesEvent = null;
if (pendingBytes.isEmpty()) {

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiRadio.java,v 1.27 2009/04/16 14:26:35 fros4943 Exp $
* $Id: ContikiRadio.java,v 1.28 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -40,6 +40,7 @@ import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
import se.sics.cooja.interfaces.PolledAfterActiveTicks;
import se.sics.cooja.interfaces.Position;
@ -86,7 +87,7 @@ import se.sics.cooja.radiomediums.UDGM;
* @author Fredrik Osterlind
*/
public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledAfterActiveTicks {
private Mote myMote;
private ContikiMote mote;
private SectionMoteMemory myMoteMemory;
@ -146,7 +147,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
RADIO_TRANSMISSION_RATE_kbps = mote.getType().getConfig().getDoubleValue(
ContikiRadio.class, "RADIO_TRANSMISSION_RATE_kbps");
this.myMote = mote;
this.mote = (ContikiMote) mote;
this.myMoteMemory = (SectionMoteMemory) mote.getMemory();
// Calculate energy consumption of a listening radio
@ -185,11 +186,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
}
public boolean isReceiving() {
if (isLockedAtReceiving()) {
return true;
}
return myMoteMemory.getIntValueOf("simInSize") != 0;
return isLockedAtReceiving();
}
public boolean isInterfered() {
@ -208,7 +205,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
}
lockInReceivingMode();
lastEventTime = myMote.getSimulation().getSimulationTime();
lastEventTime = mote.getSimulation().getSimulationTime();
lastEvent = RadioEvent.RECEPTION_STARTED;
this.setChanged();
this.notifyObservers();
@ -226,6 +223,12 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
// Unlock (if locked)
myMoteMemory.setByteValueOf("simReceiving", (byte) 0);
mote.scheduleImmediateWakeup();
lastEventTime = mote.getSimulation().getSimulationTime();
lastEvent = RadioEvent.RECEPTION_FINISHED;
this.setChanged();
this.notifyObservers();
return;
}
@ -236,8 +239,9 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
myMoteMemory.setIntValueOf("simInSize", packetToMote.getPacketData().length);
myMoteMemory.setByteArray("simInDataBuffer", packetToMote.getPacketData());
lastEventTime = myMote.getSimulation().getSimulationTime();
lastEventTime = mote.getSimulation().getSimulationTime();
lastEvent = RadioEvent.RECEPTION_FINISHED;
mote.scheduleImmediateWakeup();
this.setChanged();
this.notifyObservers();
}
@ -251,7 +255,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
isInterfered = true;
lastEvent = RadioEvent.RECEPTION_INTERFERED;
lastEventTime = myMote.getSimulation().getSimulationTime();
lastEventTime = mote.getSimulation().getSimulationTime();
this.setChanged();
this.notifyObservers();
}
@ -280,7 +284,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
}
public Position getPosition() {
return myMote.getInterfaces().getPosition();
return mote.getInterfaces().getPosition();
}
/**
@ -305,11 +309,11 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
*/
private void lockInReceivingMode() {
// If mote is inactive, try to wake it up
if (myMote.getState() != Mote.State.ACTIVE) {
if (mote.getState() != Mote.State.ACTIVE) {
if (RAISES_EXTERNAL_INTERRUPT) {
myMote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
}
if (myMote.getState() != Mote.State.ACTIVE) {
if (mote.getState() != Mote.State.ACTIVE) {
return;
}
}
@ -335,7 +339,7 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
lastEvent = RadioEvent.HW_ON;
}
lastEventTime = myMote.getSimulation().getSimulationTime();
lastEventTime = mote.getSimulation().getSimulationTime();
this.setChanged();
this.notifyObservers();
}
@ -356,12 +360,12 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
/* Are we transmitting but should stop? */
/* TODO Use time events */
if (isTransmitting
&& myMote.getSimulation().getSimulationTime() >= transmissionEndTime) {
&& mote.getSimulation().getSimulationTime() >= transmissionEndTime) {
myMoteMemory.setByteValueOf("simTransmitting", (byte) 0);
myMoteMemory.setIntValueOf("simOutSize", 0);
isTransmitting = false;
lastEventTime = myMote.getSimulation().getSimulationTime();
lastEventTime = mote.getSimulation().getSimulationTime();
lastEvent = RadioEvent.TRANSMISSION_FINISHED;
// TODO Energy consumption of transmitted packet?
this.setChanged();
@ -386,10 +390,10 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
isTransmitting = true;
// Calculate transmission duration (ms)
int duration = (int) ((280 + 10 * size) / RADIO_TRANSMISSION_RATE_kbps);
transmissionEndTime = myMote.getSimulation().getSimulationTime() + Math.max(1, duration);
lastEventTime = myMote.getSimulation().getSimulationTime();
// Calculate transmission duration (us)
long duration = (int) (Simulation.MILLISECOND*((280 + 10 * size) / RADIO_TRANSMISSION_RATE_kbps));
transmissionEndTime = mote.getSimulation().getSimulationTime() + Math.max(1, duration);
lastEventTime = mote.getSimulation().getSimulationTime();
lastEvent = RadioEvent.TRANSMISSION_STARTED;
this.setChanged();
@ -494,10 +498,10 @@ public class ContikiRadio extends Radio implements ContikiMoteInterface, PolledA
}
public Mote getMote() {
return myMote;
return mote;
}
public String toString() {
return "Radio at " + myMote;
return "Radio at " + mote;
}
}

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiVib.java,v 1.6 2009/02/25 14:46:24 fros4943 Exp $
* $Id: ContikiVib.java,v 1.7 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
@ -38,6 +38,7 @@ import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
import se.sics.cooja.contikimote.ContikiMoteInterface;
/**
@ -72,7 +73,7 @@ public class ContikiVib extends MoteInterface implements ContikiMoteInterface {
private double energyActiveVibPerTick = -1;
private Mote mote;
private ContikiMote mote;
private SectionMoteMemory moteMem;
private double myEnergyConsumption = 0.0;
@ -89,7 +90,7 @@ public class ContikiVib extends MoteInterface implements ContikiMoteInterface {
ENERGY_CONSUMPTION_VIB_mA = mote.getType().getConfig().getDoubleValue(
ContikiVib.class, "ACTIVE_CONSUMPTION_mA");
this.mote = mote;
this.mote = (ContikiMote) mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
if (energyActiveVibPerTick < 0) {
@ -105,10 +106,20 @@ public class ContikiVib extends MoteInterface implements ContikiMoteInterface {
* Simulates a change in the vibration sensor.
*/
public void triggerChange() {
mote.getSimulation().scheduleEvent(vibrateEvent, mote.getSimulation().getSimulationTime());
}
private TimeEvent vibrateEvent = new MoteTimeEvent(mote, 0) {
public void execute(long t) {
doTriggerChange();
}
};
public void doTriggerChange() {
if (moteMem.getByteValueOf("simVibIsActive") == 1) {
moteMem.setByteValueOf("simVibChanged", (byte) 1);
mote.setState(Mote.State.ACTIVE);
mote.scheduleImmediateWakeup();
}
}

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: Battery.java,v 1.7 2009/03/09 14:08:54 fros4943 Exp $
* $Id: Battery.java,v 1.8 2009/05/26 14:24:20 fros4943 Exp $
*/
package se.sics.cooja.interfaces;
@ -37,6 +37,7 @@ import org.apache.log4j.Logger;
import org.jdom.Element;
import se.sics.cooja.*;
import se.sics.cooja.contikimote.ContikiMote;
/**
* A Battery represents the energy source for a mote. This implementation has no
@ -79,7 +80,7 @@ public class Battery extends MoteInterface implements PolledAfterAllTicks {
*/
public final double INITIAL_ENERGY;
private Mote mote = null;
private ContikiMote mote = null;
private double cpuEnergyConsumptionLPMPerMs;
private double cpuEnergyConsumptionAwakePerMs;
@ -108,7 +109,7 @@ public class Battery extends MoteInterface implements PolledAfterAllTicks {
cpuEnergyConsumptionAwakePerMs = CPU_ENERGY_CONSUMPTION_AWAKE_mA * 0.001; /* TODO Voltage */
cpuEnergyConsumptionLPMPerMs = CPU_ENERGY_CONSUMPTION_LPM_mA * 0.001; /* TODO Voltage */
this.mote = mote;
this.mote = (ContikiMote) mote;
}
public void doActionsAfterTick() {
@ -135,7 +136,7 @@ public class Battery extends MoteInterface implements PolledAfterAllTicks {
/* Check if we are out of energy */
if (getEnergyConsumption() > INITIAL_ENERGY) {
mote.setState(Mote.State.DEAD);
mote.scheduleImmediateWakeup();
}
setChanged();

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: Clock.java,v 1.5 2009/03/09 14:08:54 fros4943 Exp $
* $Id: Clock.java,v 1.6 2009/05/26 14:24:21 fros4943 Exp $
*/
package se.sics.cooja.interfaces;
@ -61,11 +61,20 @@ public abstract class Clock extends MoteInterface {
*
* @param timeDrift Time drift
*/
public abstract void setDrift(int timeDrift);
public abstract void setDrift(long timeDrift);
/**
* The clock drift provides information about the mote's internal time,
* and can the used to calculate for instance its startup time.
*
* The startup time is the negative drift time.
*
* The mote internal time can be calculated by:
* [current simulation time] + [mote drift].
*
* @see Simulation#getSimulationTime()
* @return Time drift
*/
public abstract int getDrift();
public abstract long getDrift();
}

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: IPAddress.java,v 1.5 2009/04/28 07:29:26 fros4943 Exp $
* $Id: IPAddress.java,v 1.6 2009/05/26 14:24:21 fros4943 Exp $
*/
package se.sics.cooja.interfaces;
@ -77,7 +77,7 @@ public class IPAddress extends MoteInterface {
/* Postpone until IP has been set */
mote.getSimulation().scheduleEvent(
this,
mote.getSimulation().getSimulationTime() + 1);
mote.getSimulation().getSimulationTime() + Simulation.MILLISECOND);
return;
}
};

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: RimeAddress.java,v 1.2 2009/04/28 07:29:26 fros4943 Exp $
* $Id: RimeAddress.java,v 1.3 2009/05/26 14:24:21 fros4943 Exp $
*/
package se.sics.cooja.interfaces;
@ -75,7 +75,7 @@ public class RimeAddress extends MoteInterface {
/* Postpone until address has been set */
mote.getSimulation().scheduleEvent(
this,
mote.getSimulation().getSimulationTime() + 1);
mote.getSimulation().getSimulationTime() + Simulation.MILLISECOND);
return;
}
};