]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/ftsp/TimeSyncP.nc
fix logical operator bug found by Thomas Schmid
[tinyos-2.x.git] / tos / lib / ftsp / TimeSyncP.nc
index 4313f6664913ac01dd41429f55b0f93d6a59b0ce..6a17381db172e17fc18e04081fc29f3bca3ad3e8 100644 (file)
@@ -43,9 +43,16 @@ generic module TimeSyncP(typedef precision_tag)
         interface TimeSyncAMSend<precision_tag,uint32_t> as Send;
         interface Receive;
         interface Timer<TMilli>;
+        interface Random;
         interface Leds;
         interface TimeSyncPacket<precision_tag,uint32_t>;
         interface LocalTime<precision_tag> as LocalTime;
+
+
+#ifdef LOW_POWER_LISTENING
+        interface LowPowerListening;
+#endif
+
     }
 }
 implementation
@@ -61,7 +68,7 @@ implementation
         IGNORE_ROOT_MSG       = 4,              // after becoming the root ignore other roots messages (in send period)
         ENTRY_VALID_LIMIT     = 4,              // number of entries to become synchronized
         ENTRY_SEND_LIMIT      = 3,              // number of entries to send sync messages
-        ENTRY_THROWOUT_LIMIT  = 100,            // if time sync error is bigger than this clear the table
+        ENTRY_THROWOUT_LIMIT  = 500,            // if time sync error is bigger than this clear the table
     };
 
     typedef struct TableItem
@@ -227,8 +234,6 @@ implementation
         uint32_t age, oldestTime = 0;
         int32_t timeError;
 
-        tableEntries = 0;
-
         // clear table if the received entry's been inconsistent for some time
         timeError = msg->localTime;
         call GlobalTime.local2Global((uint32_t*)(&timeError));
@@ -238,10 +243,11 @@ implementation
         {
             if (++numErrors>3)
                 clearTable();
+            return; // don't incorporate a bad reading
         }
-        else
-            numErrors = 0;
 
+        tableEntries = 0; // don't reset table size unless you're recounting
+        numErrors = 0;
 
         for(i = 0; i < MAX_ENTRIES; ++i) {
             age = msg->localTime - table[i].localTime;
@@ -278,7 +284,7 @@ implementation
 
         if( msg->rootID < outgoingMsg->rootID &&
             // jw: after becoming the root ignore other roots messages (in send period)
-            ~(heartBeats < IGNORE_ROOT_MSG && outgoingMsg->rootID == TOS_NODE_ID) ){
+            !(heartBeats < IGNORE_ROOT_MSG && outgoingMsg->rootID == TOS_NODE_ID) ){
             outgoingMsg->rootID = msg->rootID;
             outgoingMsg->seqNum = msg->seqNum;
         }
@@ -311,7 +317,9 @@ implementation
         if( diff < -16 || diff > 16 )
             return msg;
 #endif
-        if( (state & STATE_PROCESSING) == 0 ) {
+
+        if( (state & STATE_PROCESSING) == 0
+            && call TimeSyncPacket.isValid(msg)) {
             message_t* old = processedMsg;
 
             processedMsg = msg;
@@ -352,7 +360,9 @@ implementation
         }
 
         outgoingMsg->globalTime = globalTime;
-
+#ifdef LOW_POWER_LISTENING
+        call LowPowerListening.setRemoteWakeupInterval(&outgoingMsgBuffer, LPL_INTERVAL);
+#endif
         // we don't send time sync msg, if we don't have enough data
         if( numEntries < ENTRY_SEND_LIMIT && outgoingMsg->rootID != TOS_NODE_ID ){
             ++heartBeats;
@@ -405,11 +415,8 @@ implementation
     }
 
     command error_t TimeSyncMode.setMode(uint8_t mode_){
-        if (mode == mode_)
-            return SUCCESS;
-
-        if (mode_ == TS_USER_MODE){
-            call Timer.startPeriodic((uint32_t)1000 * BEACON_RATE);
+        if (mode_ == TS_TIMER_MODE){
+            call Timer.startPeriodic((uint32_t)(896U+(call Random.rand16()&0xFF)) * BEACON_RATE);
         }
         else
             call Timer.stop();
@@ -457,10 +464,9 @@ implementation
 
     command error_t StdControl.start()
     {
-        mode = TS_TIMER_MODE;
         heartBeats = 0;
         outgoingMsg->nodeID = TOS_NODE_ID;
-        call Timer.startPeriodic((uint32_t)1000 * BEACON_RATE);
+        call TimeSyncMode.setMode(TS_TIMER_MODE);
 
         return SUCCESS;
     }