mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-23 01:29:33 +00:00
event based mote interfaces: less dependencies on tick polling + using new mote time events
This commit is contained in:
parent
fba3701a86
commit
d996ae1476
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user