INIT,
STOP
} macState_t;
-
+
macState_t macState;
/****** debug vars & defs & functions ***********************/
ZERO_BACKOFF_MASK = 0xff
};
- /**************** Module Global Variables *****************/
- typedef union
- {
- uint32_t op;
- struct {
- uint16_t lo;
- uint16_t hi;
- };
- } ui32parts_t;
-
+ /**************** Module Global Variables *****************/
/* flags */
typedef enum {
SWITCHING = 1,
if(needsAckTx(msg)) getHeader(msg)->token |= ACK_REQUESTED;
txMacHdr = macHdr;
setFlag(&flags, MESSAGE_PREPARED);
+ if(macState == SLEEP) {
+ sdDebug(400);
+ } else {
+ sdDebug(401);
+ }
+ if(!call Timer.isRunning()) {
+ sdDebug(402);
+ } else {
+ sdDebug(403);
+ }
+ if(!isFlagSet(&flags, RESUME_BACKOFF)) {
+ sdDebug(404);
+ } else {
+ sdDebug(405);
+ }
if((macState == SLEEP) && (!call Timer.isRunning()) && (!isFlagSet(&flags, RESUME_BACKOFF))) {
if((longRetryCounter == 1) &&
(getHeader(msg)->dest != AM_BROADCAST_ADDR)) {
call Timer.start((call Random.rand16() >> 3) & ZERO_BACKOFF_MASK);
+ sdDebug(406);
}
else {
call Timer.start(backoff(longRetryCounter));
+ sdDebug(407);
}
}
#ifdef SPECKMAC_PERFORMANCE
if(call Timer.isRunning()) {
restLaufzeit = call TimeDiff16.computeDelta(call Timer.getAlarm(), call Timer.getNow());
call Timer.stop();
+ sdDebug(10);
+ sdDebug(restLaufzeit);
if(restLaufzeit > MIN_BACKOFF_MASK << MAX_LONG_RETRY) {
restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK;
}
+ sdDebug(11);
+ sdDebug(restLaufzeit);
setFlag(&flags, RESUME_BACKOFF);
}
}
if(!isFlagSet(&flags, RESUME_BACKOFF)) {
setFlag(&flags, RESUME_BACKOFF);
restLaufzeit = backoff(longRetryCounter);
+ sdDebug(20);
+ sdDebug(restLaufzeit);
updateRetryCounters();
}
}
clearFlag(&flags, RESUME_BACKOFF);
call Timer.start(restLaufzeit);
restLaufzeit = 0;
+ sdDebug(30);
}
else {
// sdDebug(165);
}
}
if(err == SUCCESS) {
+ sdDebug(300);
post PrepareMsgTask();
}
return err;
call ChannelMonitor.rxSuccess();
if(macState <= CCA_ACK) {
if(macState == CCA) {
+ sdDebug(100);
computeBackoff();
#ifdef SPECKMAC_PERFORMANCE
call Performance.macDetectedOnCca();
if(macState != RX_ACK) {
macState = RX_P;
} else {
+ sdDebug(500);
macState = RX_ACK_P;
}
}
else if(macState == RX_ACK_P) {
if(error == SUCCESS) {
if(ackIsForMe(msg)) {
- // sdDebug(202);
+ sdDebug(510);
storeStrength(msg);
getMetadata(txBufPtr)->ack = WAS_ACKED;
getMetadata(txBufPtr)->repetitions = txMacHdr->repetitionCounter;
action = SLEEP;
}
else {
- // sdDebug(203);
+ sdDebug(511);
updateLongRetryCounters(); // this will eventually schedule the right backoff
macState = SLEEP; // so much traffic is going on -- take a nap
setSleepMode();
}
else {
if(call Timer.isRunning()) {
- // sdDebug(204);
+ sdDebug(512);
action = RX_ACK;
}
else {
- // sdDebug(205);
+ sdDebug(513);
updateLongRetryCounters();
action = RX;
}
else if(action == SLEEP) {
macState = SLEEP;
if(isFlagSet(&flags, RESUME_BACKOFF)) {
- if(nav > restLaufzeit) restLaufzeit += nav;
+ if(nav > restLaufzeit) {
+ sdDebug(40);
+ sdDebug(restLaufzeit);
+ restLaufzeit += nav;
+ }
+ sdDebug(41);
+ sdDebug(restLaufzeit);
}
else {
setFlag(&flags, RESUME_BACKOFF);
restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK;
+ sdDebug(42);
+ sdDebug(restLaufzeit);
}
setSleepMode();
}
setFlag(&flags, ACTION_DETECTED);
if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) {
if(macState == CCA) {
+ sdDebug(101);
computeBackoff();
#ifdef SPECKMAC_PERFORMANCE
call Performance.macBusyOnCca();
void checkOnIdle() {
if(macState == RX) {
// sdDebug(240);
- macState = SLEEP;
- setSleepMode();
+ checkCounter++;
+ if(checkCounter < 2) {
+ call Timer.start(DATA_DETECT_TIME);
+ requestAdc();
+ } else {
+ macState = SLEEP;
+ setSleepMode();
+ }
}
else if(macState == CCA) {
checkCounter++;
clearFlag(&flags, RESUME_BACKOFF);
call Timer.start(restLaufzeit);
restLaufzeit = 0;
+ sdDebug(50);
}
else {
// sdDebug(262);
// sdDebug(270);
if((macState == SLEEP) && (!isFlagSet(&flags, SWITCHING))) {
clearFlag(&flags, ACTION_DETECTED);
+ sdDebug(200);
interruptBackoffTimer();
macState = RX;
// sdDebug(271);