#include <RadioAssert.h>
#include <LowPowerListeningLayer.h>
+#include <Lpl.h>
module LowPowerListeningLayerP
{
interface LowPowerListeningConfig as Config;
interface Timer<TMilli>;
interface SystemLowPowerListening;
+
+ interface Leds;
}
}
{
enum
{
- // minimum wakeup time to catch a transmission in milliseconds
- LISTEN_WAKEUP = 6U, // use xxxL if LISTEN_WAKEUP * 10000 > 65535
-
MIN_SLEEP = 2, // the minimum sleep interval in milliseconds
- MAX_SLEEP = 30000, // the maximum sleep interval in milliseconds
- MIN_DUTY = 2, // the minimum duty cycle
};
uint16_t sleepInterval = LPL_DEF_LOCAL_WAKEUP;
ASSERT( error == SUCCESS || error == EBUSY );
if( error == SUCCESS )
+ {
+ call Leds.led2On();
++state;
+ }
else
post transition();
}
ASSERT( error == SUCCESS || error == EBUSY );
if( error == SUCCESS )
+ {
++state;
+ call Leds.led2Off();
+ }
else
post transition();
}
{
state = LISTEN;
if( sleepInterval > 0 )
- call Timer.startOneShot(LISTEN_WAKEUP);
+ call Timer.startOneShot(call Config.getListenLength());
}
else if( state == SLEEP_TIMER )
{
transmitInterval = call LowPowerListening.getRemoteWakeupInterval(txMsg);
if( transmitInterval > 0 )
- call Timer.startOneShot(transmitInterval);
+ call Timer.startOneShot(transmitInterval
+ + 2 * call Config.getListenLength());
state = SEND_SUBSEND;
post transition();
event message_t* SubReceive.receive(message_t* msg)
{
+ call Leds.led0Toggle();
+
if( state == SLEEP_SUBSTOP )
state = LISTEN;
else
return EBUSY;
+ if( call Config.needsAutoAckRequest(msg) )
+ call PacketAcknowledgements.requestAck(msg);
+
txMsg = msg;
txError = FAIL;
if( error != SUCCESS
|| call LowPowerListening.getRemoteWakeupInterval(msg) == 0
|| state == SEND_SUBSEND_DONE_LAST
- || (call Config.getAckRequired(msg) && call PacketAcknowledgements.wasAcked(msg)) )
+ || (call Config.ackRequested(msg) && call PacketAcknowledgements.wasAcked(msg)) )
{
call Timer.stop();
state = SEND_DONE;
state = SEND_SUBSEND;
post transition();
+
+ if( error == SUCCESS )
+ call Leds.led1Toggle();
}
/*----------------- LowPowerListening -----------------*/
{
if( interval < MIN_SLEEP )
interval = 0;
- else if( interval > MAX_SLEEP )
- interval = MAX_SLEEP;
sleepInterval = interval;
{
if( interval < MIN_SLEEP )
interval = 0;
- else if( interval > MAX_SLEEP )
- interval = MAX_SLEEP;
getMeta(msg)->sleepint = interval;
}