]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Make LQI monitor AM power state and properly recover
authorscipio <scipio>
Tue, 19 Feb 2008 19:50:21 +0000 (19:50 +0000)
committerscipio <scipio>
Tue, 19 Feb 2008 19:50:21 +0000 (19:50 +0000)
from being turned off.

tos/lib/net/lqi/LqiForwardingEngineP.nc
tos/lib/net/lqi/MultiHopLqiP.nc

index f1382902e82e613585802ab0d00fac251758def0..4e2f44053421f08ea7938a4e0ee10d904f3b1c78 100644 (file)
@@ -92,6 +92,7 @@ module LqiForwardingEngineP {
     interface Packet;
   }
   uses {
+    interface SplitControl;
     interface Receive as SubReceive;
     interface AMSend as SubSend;
     interface AMSend as SubSendMine;
@@ -123,8 +124,9 @@ implementation {
   uint16_t sendFailures = 0;
   uint8_t fwd_fail_count = 0;
   uint8_t my_fail_count = 0;
-  int fwdbusy = 0;
-  
+  bool fwdbusy = FALSE;
+  bool running = FALSE;
   lqi_header_t* getHeader(message_t* msg) {
     return (lqi_header_t*) call SubPacket.getPayload(msg, sizeof(lqi_header_t));
   }
@@ -150,8 +152,27 @@ implementation {
     initialize();
     return SUCCESS;
   }
+  message_t* nextMsg();
+  static void forward(message_t* msg);
+
+  event void SplitControl.startDone(error_t err) {
+    message_t* nextToSend;
+    if (err != SUCCESS) {return;}
+    nextToSend = nextMsg();
+    running = TRUE;
+    fwdbusy = FALSE;
+
+    if (nextToSend != NULL) {
+      forward(nextToSend);
+    }
+  }
 
 
+  event void SplitControl.stopDone(error_t err) {
+    if (err != SUCCESS) {return;}
+    running = FALSE;
+  }
   /***********************************************************************
    * Commands and events
    ***********************************************************************/
@@ -163,6 +184,9 @@ implementation {
     if (call RootControl.isRoot()) {
       return FAIL;
     }
+    if (running == FALSE) {
+      return EOFF;
+    }
     call RouteSelect.initializeFields(pMsg);
     
     if (call RouteSelect.selectRoute(pMsg, 0) != SUCCESS) {
@@ -241,8 +265,8 @@ implementation {
   static void forward(message_t* msg) {
     // Failures at the send level do not cause the seq. number space to be 
     // rolled back properly.  This is somewhat broken.
-    if (fwdbusy) {
-      dbg("LQI", "%s forwarding busy, wait for later.\n", __FUNCTION__);
+    if (fwdbusy || running == FALSE) {
+      dbg("LQI", "%s forwarding busy or off, wait for later.\n", __FUNCTION__);
       return;
     }
     else {
@@ -255,8 +279,8 @@ implementation {
                                         call CollectionPacket.getOrigin(msg), 
                                         call AMPacket.destination(msg));
        dbg("LQI", "%s: Send to %hu success.\n", __FUNCTION__, call AMPacket.destination(msg));
+        fwdbusy = TRUE;
       }
-      fwdbusy = TRUE;
     }
   }
 
@@ -365,7 +389,7 @@ implementation {
       if (call SubSendMine.send(call AMPacket.destination(msg),
                            msg,
                            call SubPacket.payloadLength(msg)) == SUCCESS) {
-       dbg("LQI", "Packet not acked, retransmit (%hhu) @%s:\n\t%s\n", my_fail_count, sim_time_string(), fields(msg));
+       dbg("LQI", "Local packet not acked, retransmit (%hhu) @%s:\n\t%s\n", my_fail_count, sim_time_string(), fields(msg));
        call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_WAITACK, 
                                         call CollectionPacket.getSequenceNumber(msg), 
                                         call CollectionPacket.getOrigin(msg), 
@@ -377,8 +401,9 @@ implementation {
                                         call CollectionPacket.getSequenceNumber(msg), 
                                         call CollectionPacket.getOrigin(msg), 
                                          call AMPacket.destination(msg));
-       dbg("LQI", "Packet not acked, retransmit fail @%s:\n\t%s\n", sim_time_string(), fields(msg));
+       dbg("LQI", "Local packet not acked, retransmit fail @%s:\n\t%s\n", sim_time_string(), fields(msg));
        sendFailures++;
+       signal Send.sendDone(msg, FAIL);
        return;
       }
     }
@@ -387,10 +412,10 @@ implementation {
                                       call CollectionPacket.getSequenceNumber(msg), 
                                       call CollectionPacket.getOrigin(msg), 
                                       call AMPacket.destination(msg));
-      dbg("LQI", "Packet failed:\t%s\n", fields(msg));
+      dbg("LQI", "Local packet failed:\t%s\n", fields(msg));
     }
     else if (call PacketAcknowledgements.wasAcked(msg)) {
-      dbg("LQI", "Packet acked:\t%s\n", fields(msg));
+      dbg("LQI", "Local packet acked:\t%s\n", fields(msg));
       call CollectionDebug.logEventMsg(NET_C_FE_SENT_MSG, 
                                       call CollectionPacket.getSequenceNumber(msg), 
                                       call CollectionPacket.getOrigin(msg), 
@@ -398,6 +423,7 @@ implementation {
     }
 
     my_fail_count = 0;
+    dbg("LQI", "Local send done with success %d\n", success);
     signal Send.sendDone(msg, success);
   }
 
index 5291973000b28fe1d4f6b3068353fe8570fbee88..2e7e4855c52f1202d7612915cd1afab5f58df6a5 100644 (file)
@@ -113,9 +113,9 @@ implementation {
   Packet = Forwarder;
   CollectionPacket = Forwarder;
   RootControl = Router;
-
   //CC2420.SubPacket -> DataSender;
   
+  Forwarder.SplitControl -> ActiveMessageC;
   Forwarder.RouteSelectCntl -> Router.RouteControl;
   Forwarder.RouteSelect -> Router;
   Forwarder.SubSend -> DataSender;