]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/net/TrickleTimerImplP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / net / TrickleTimerImplP.nc
index 1e61b46ede5499253be376da5e899339a5dd7bc1..12e9d5bd2a5deefc667015dfd3c772ae8754b29b 100644 (file)
@@ -168,7 +168,7 @@ implementation {
   event void Timer.fired() {
     uint8_t i;
     uint32_t dt = call Timer.getdt();
-
+    dbg("Trickle", "Trickle Sub-timer fired\n");
     for (i = 0; i < count; i++) {
       uint32_t remaining = trickles[i].time;
       if (remaining != 0) {
@@ -176,11 +176,12 @@ implementation {
        if (remaining == 0) {
          if (trickles[i].count < k) {
            atomic {
+             dbg("Trickle", "Trickle: mark timer %hhi as pending\n", i);
              call Pending.set(i);
            }
            post timerTask();
          }
-
+         call Changed.set(i);
          generateTime(i);
            
          /* Note that this logic is not the exact trickle algorithm.
@@ -191,9 +192,6 @@ implementation {
           */
          trickles[i].count = 0;
        }
-       else {
-         trickles[i].time = remaining;
-       }
       }
     }
     adjustTimer();
@@ -208,31 +206,47 @@ implementation {
     // How much time has elapsed on the current timer
     // since it was scheduled? This value is needed because
     // the time remaining of a running timer is its time
-    // value minus tiem elapsed.
+    // value minus time elapsed.
     uint32_t elapsed = (call Timer.getNow() - call Timer.gett0());
        
     for (i = 0; i < count; i++) {
-      uint32_t time = trickles[i].time;
-      if (time != 0) {
-       atomic {
-         if (!call Changed.get(i)) {
-           call Changed.clear(i);
-           time -= elapsed;
+      uint32_t timeRemaining = trickles[i].time;
+      dbg("Trickle", "Adjusting: timer %hhi (%u)\n", i, timeRemaining);
+
+      if (timeRemaining == 0) { // Not running, go to next timer
+       continue;
+      }
+      
+      atomic {
+       if (!call Changed.get(i)) {
+         if (timeRemaining > elapsed) {
+           dbg("Trickle", "  not changed, elapse time remaining to %u.\n", trickles[i].time - elapsed);
+           timeRemaining -= elapsed;
+           trickles[i].time -= elapsed;
+         }
+         else { // Time has already passed, so fire immediately
+           dbg("Trickle", "  not changed, ready to elapse, fire immediately\n");
+           timeRemaining = 1;
+           trickles[i].time = 1;
          }
        }
-       if (!set) {
-         lowest = time;
-         set = TRUE;
-       }
-       else if (time < lowest) {
-         lowest = time;
+       else {
+         dbg("Trickle", "  changed, fall through.\n");
+         call Changed.clear(i);
        }
       }
+      if (!set) {
+       lowest = timeRemaining;
+       set = TRUE;
+      }
+      else if (timeRemaining < lowest) {
+       lowest = timeRemaining;
+      }
     }
+    
     if (set) {
       uint32_t timerVal = lowest;
-      timerVal = timerVal;
-      dbg("Trickle", "Starting time with time %u.\n", timerVal);
+      dbg("Trickle", "Starting sub-timer with interval %u.\n", timerVal);
       call Timer.startOneShot(timerVal);
     }
     else {
@@ -244,7 +258,7 @@ implementation {
    * running (time != 0), then double the period.
    */
   void generateTime(uint8_t id) {
-    uint32_t time;
+    uint32_t newTime;
     uint16_t rval;
     
     if (trickles[id].time != 0) {
@@ -256,14 +270,14 @@ implementation {
     
     trickles[id].time = trickles[id].remainder;
     
-    time = trickles[id].period;
-    time = time << (scale - 1);
+    newTime = trickles[id].period;
+    newTime = newTime << (scale - 1);
 
     rval = call Random.rand16() % (trickles[id].period << (scale - 1));
-    time += rval;
+    newTime += rval;
     
-    trickles[id].remainder = (trickles[id].period << scale) - time;
-    trickles[id].time += time;
+    trickles[id].remainder = (((uint32_t)trickles[id].period) << scale) - newTime;
+    trickles[id].time += newTime;
     dbg("Trickle,TrickleTimes", "Generated time for %hhu with period %hu (%u) is %u (%i + %hu)\n", id, trickles[id].period, (uint32_t)trickles[id].period << scale, trickles[id].time, (trickles[id].period << (scale - 1)), rval);
   }