}
uses {
interface Timer<TMilli> as Timer;
+#ifdef DUPLICATE_DEBUG
+ interface SerialDebug;
+#endif
}
}
-implementation {
+implementation {
known_t knownTable[TABLE_ENTRIES];
-
+
+#ifdef DUPLICATE_DEBUG
+ void sdDebug(uint16_t p) {
+ call SerialDebug.putPlace(p);
+ }
+ known_t dupOldest;
+ unsigned last;
+ task void dump() {
+ sdDebug(3000 + last);
+ sdDebug(dupOldest.src);
+ sdDebug(dupOldest.dest);
+ sdDebug(dupOldest.seqno);
+ sdDebug(dupOldest.age);
+ sdDebug(4000);
+ sdDebug(knownTable[last].src);
+ sdDebug(knownTable[last].dest);
+ sdDebug(knownTable[last].seqno);
+ sdDebug(knownTable[last].age);
+ sdDebug(5000);
+ }
+#else
+ void sdDebug(uint16_t p) {};
+#endif
+
/** helper functions */
task void ageMsgsTask() {
unsigned i;
}
/*** duplicate interface */
- async command bool Duplicate.isNew(am_addr_t src, uint8_t seqno) {
+ async command bool Duplicate.isNew(am_addr_t src, am_addr_t dest, uint8_t seqno) {
bool rVal = TRUE;
unsigned i;
for(i=0; i < TABLE_ENTRIES; i++) {
if((knownTable[i].age < MAX_AGE) &&
(src == knownTable[i].src) &&
+ (dest == knownTable[i].dest) &&
(seqno == knownTable[i].seqno)) {
knownTable[i].age = 0;
rVal = FALSE;
break;
}
}
+ sdDebug(100 + rVal);
+ sdDebug(200 + i);
return rVal;
}
- async command void Duplicate.remember(am_addr_t src, uint8_t seqno) {
+ async command void Duplicate.remember(am_addr_t src, am_addr_t dest, uint8_t seqno) {
unsigned oldest = findOldest();
+#ifdef DUPLICATE_DEBUG
+ dupOldest = knownTable[oldest];
+ last = oldest;
+ post dump();
+#endif
knownTable[oldest].src = src;
+ knownTable[oldest].dest = dest;
knownTable[oldest].seqno = seqno;
knownTable[oldest].age = 0;
+ post ageMsgsTask();
}
/** helper interfaces */
event void Timer.fired() {
+ call Timer.startOneShot(AGE_INTERVALL);
post ageMsgsTask();
}
uint8_t i;
for(i = 0; i < TABLE_ENTRIES; i++) {
atomic {
- knownTable[i].age = MAX_AGE;
+ knownTable[i].age = MAX_AGE;
}
}
- call Timer.startPeriodic(AGE_INTERVALL);
+ call Timer.startOneShot(AGE_INTERVALL);
return SUCCESS;
}
}