*/
#include <RadioAssert.h>
+#include <LowPowerListeningLayer.h>
module LowPowerListeningLayerP
{
interface SplitControl;
interface Send;
interface Receive;
+ interface RadioPacket;
interface LowPowerListening;
}
interface SplitControl as SubControl;
interface Send as SubSend;
interface Receive as SubReceive;
+ interface RadioPacket as SubPacket;
- interface PacketField<uint16_t> as PacketSleepInterval;
- interface IEEE154Packet2;
interface PacketAcknowledgements;
+ interface LowPowerListeningConfig as Config;
interface Timer<TMilli>;
}
}
{
OFF = 0,
OFF_SUBSTOP = 1, // must have consecutive indices
- OFF_SUBSTOP_DONE = 2, // must have consecutive indices
+ OFF_SUBSTOP_DONE = 2, // must have consecutive indices
OFF_STOP_END = 3, // must have consecutive indices
OFF_START_END = 4,
- LISTEN_SUBSTART = 5, // must have consecutive indices
- LISTEN_SUBSTART_DONE = 6, // must have consecutive indices
+ LISTEN_SUBSTART = 5, // must have consecutive indices
+ LISTEN_SUBSTART_DONE = 6, // must have consecutive indices
LISTEN_TIMER = 7, // must have consecutive indices
- LISTEN = 8, // must have consecutive indices
+ LISTEN = 8, // must have consecutive indices
SLEEP_SUBSTOP = 9, // must have consecutive indices
- SLEEP_SUBSTOP_DONE = 10, // must have consecutive indices
+ SLEEP_SUBSTOP_DONE = 10, // must have consecutive indices
SLEEP_TIMER = 11, // must have consecutive indices
- SLEEP = 12, // must have consecutive indices
+ SLEEP = 12, // must have consecutive indices
SEND_SUBSTART = 13, // must have consecutive indices
- SEND_SUBSTART_DONE = 14, // must have consecutive indices
+ SEND_SUBSTART_DONE = 14, // must have consecutive indices
SEND_TIMER = 15, // must have consecutive indices
SEND_SUBSEND= 16,
SEND_SUBSEND_DONE = 17,
if( error != SUCCESS
|| call LowPowerListening.getRxSleepInterval(msg) == 0
|| state == SEND_SUBSEND_DONE_LAST
- || (call IEEE154Packet2.getAckRequired(msg) && call PacketAcknowledgements.wasAcked(msg)) )
+ || (call Config.getAckRequired(msg) && call PacketAcknowledgements.wasAcked(msg)) )
{
call Timer.stop();
state = SEND_DONE;
/*----------------- LowPowerListening -----------------*/
+ lpl_metadata_t* getMeta(message_t* msg)
+ {
+ return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg);
+ }
+
command uint16_t LowPowerListening.dutyCycleToSleepInterval(uint16_t dutyCycle)
{
if( dutyCycle >= 10000 )
}
command void LowPowerListening.setLocalSleepInterval(uint16_t interval)
- {
+ {
if( interval < MIN_SLEEP )
interval = 0;
else if( interval > MAX_SLEEP )
}
command uint16_t LowPowerListening.getLocalSleepInterval()
- {
+ {
return sleepInterval;
}
else if( interval > MAX_SLEEP )
interval = MAX_SLEEP;
- call PacketSleepInterval.set(msg, interval);
+ getMeta(msg)->sleepint = interval;
}
command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg)
- {
- if( ! call PacketSleepInterval.isSet(msg) )
- return sleepInterval;
+ {
+ uint16_t sleepint = getMeta(msg)->sleepint;
- return call PacketSleepInterval.get(msg);
+ return sleepint != 0 ? sleepint : sleepInterval;
}
command void LowPowerListening.setRxDutyCycle(message_t *msg, uint16_t dutyCycle)
- {
+ {
call LowPowerListening.setRxSleepInterval(msg,
call LowPowerListening.dutyCycleToSleepInterval(dutyCycle));
}
command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg)
- {
+ {
return call LowPowerListening.sleepIntervalToDutyCycle(
call LowPowerListening.getRxSleepInterval(msg));
}
+
+/*----------------- RadioPacket -----------------*/
+
+ async command uint8_t RadioPacket.headerLength(message_t* msg)
+ {
+ return call SubPacket.headerLength(msg);
+ }
+
+ async command uint8_t RadioPacket.payloadLength(message_t* msg)
+ {
+ return call SubPacket.payloadLength(msg);
+ }
+
+ async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length)
+ {
+ call SubPacket.setPayloadLength(msg, length);
+ }
+
+ async command uint8_t RadioPacket.maxPayloadLength()
+ {
+ return call SubPacket.maxPayloadLength();
+ }
+
+ async command uint8_t RadioPacket.metadataLength(message_t* msg)
+ {
+ return call SubPacket.metadataLength(msg) + sizeof(lpl_metadata_t);
+ }
+
+ async command void RadioPacket.clear(message_t* msg)
+ {
+ getMeta(msg)->sleepint = 0;
+ call SubPacket.clear(msg);
+ }
}