X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Ftda5250%2Fmac%2FCsmaMacP.nc;h=46c19d3f00ade28edadea12a44a6d46a3bf95847;hb=f139d40721e23194dd9e8f84e3652212ac990e36;hp=28de91414a2145e3e98d880136962514a85b774c;hpb=337d0b13acf569c2640b3ed7b7f5c7cec35d7ddd;p=tinyos-2.x.git diff --git a/tos/chips/tda5250/mac/CsmaMacP.nc b/tos/chips/tda5250/mac/CsmaMacP.nc index 28de9141..46c19d3f 100644 --- a/tos/chips/tda5250/mac/CsmaMacP.nc +++ b/tos/chips/tda5250/mac/CsmaMacP.nc @@ -50,7 +50,6 @@ module CsmaMacP { interface MacSend; interface MacReceive; interface Packet; - interface McuPowerOverride; } uses { interface StdControl as CcaStdControl; @@ -72,6 +71,7 @@ module CsmaMacP { interface Random; interface Timer as ReRxTimer; + interface Duplicate; interface Alarm as Timer; async command am_addr_t amAddress(); @@ -88,27 +88,26 @@ implementation { enum { - BYTE_TIME=13, // byte at 38400 kBit/s, 4b6b encoded - PREAMBLE_BYTE_TIME=9, // byte at 38400 kBit/s, no coding - PHY_HEADER_TIME=51, // 6 Phy Preamble at 38400 + BYTE_TIME=21, // byte at 23405 kBit/s, 4b6b encoded + PREAMBLE_BYTE_TIME=14, // byte at 23405 kBit/s, no coding + PHY_HEADER_TIME=84, // 6 Phy Preamble at 23405 bits/s + SUB_HEADER_TIME=PHY_HEADER_TIME + sizeof(tda5250_header_t)*BYTE_TIME, - SUB_FOOTER_TIME=2*BYTE_TIME, // 2 bytes crc 38400 kBit/s with 4b6b encoding + SUB_FOOTER_TIME=2*BYTE_TIME, // 2 bytes crc MAXTIMERVALUE=0xFFFF, // helps to compute backoff DATA_DETECT_TIME=17, - RX_SETUP_TIME=111, // time to set up receiver - TX_SETUP_TIME=69, // time to set up transmitter + RX_SETUP_TIME=102, // time to set up receiver + TX_SETUP_TIME=58, // time to set up transmitter ADDED_DELAY = 30, - RX_ACK_TIMEOUT=RX_SETUP_TIME + PHY_HEADER_TIME + 19 + 2*ADDED_DELAY, - TX_GAP_TIME=RX_ACK_TIMEOUT + TX_SETUP_TIME + 11, + RX_ACK_TIMEOUT=RX_SETUP_TIME + PHY_HEADER_TIME + 2*ADDED_DELAY, + TX_GAP_TIME=RX_ACK_TIMEOUT + TX_SETUP_TIME + 33, MAX_SHORT_RETRY=7, MAX_LONG_RETRY=4, BACKOFF_MASK=0xFFF, // minimum time around one packet time MIN_PREAMBLE_BYTES=2, TOKEN_ACK_FLAG = 64, TOKEN_ACK_MASK = 0x3f, - INVALID_SNR = 0xffff, - MSG_TABLE_ENTRIES=20, - MAX_AGE=2*MAX_LONG_RETRY*MAX_SHORT_RETRY, + INVALID_SNR = 0xffff }; /**************** Module Global Variables *****************/ @@ -154,24 +153,8 @@ implementation uint16_t restLaufzeit; - /* duplicate suppression */ - typedef struct knownMessage_t { - am_addr_t src; - uint8_t token; - uint8_t age; - } knownMessage_t; + uint16_t rssiValue = 0; - knownMessage_t knownMsgTable[MSG_TABLE_ENTRIES]; - - task void ageMsgsTask() { - unsigned i; - atomic { - for(i = 0; i < MSG_TABLE_ENTRIES; i++) { - if(knownMsgTable[i].age <= MAX_AGE) ++knownMsgTable[i].age; - } - } - } - /****** debug vars & defs & functions ***********************/ #ifdef MACM_DEBUG #define HISTORY_ENTRIES 100 @@ -274,6 +257,7 @@ implementation } void setRxMode() { + rssiValue = INVALID_SNR; if(call RadioModes.RxMode() == FAIL) { post SetRxModeTask(); } @@ -328,15 +312,29 @@ implementation restLaufzeit = restLaufzeit - now; } else { - restLaufzeit += MAXTIMERVALUE - now; + restLaufzeit = (uint16_t)(-1) - restLaufzeit + now; } if(restLaufzeit > BACKOFF_MASK) { - restLaufzeit = backoff(0); + restLaufzeit = call Random.rand16() & 0xFF; } setFlag(&flags, RESUME_BACKOFF); } } - + + void storeStrength(message_t *m) { + if(rssiValue != INVALID_SNR) { + (getMetadata(m))->strength = rssiValue; + } + else { + if(call RssiAdcResource.isOwner()) { + (getMetadata(m))->strength = call ChannelMonitorData.readSnr(); + } + else { + (getMetadata(m))->strength = 1; + } + } + } + void signalSendDone(error_t error) { message_t *m; error_t e = error; @@ -349,6 +347,7 @@ implementation if(isFlagSet(&flags, CANCEL_SEND)) { e = ECANCEL; } + storeStrength(m); clearFlag(&flags, CANCEL_SEND); } signal MacSend.sendDone(m, e); @@ -386,36 +385,11 @@ implementation } bool isNewMsg(message_t* msg) { - uint8_t i; - for(i=0; i < MSG_TABLE_ENTRIES; i++) { - if((getHeader(msg)->src == knownMsgTable[i].src) && - (((getHeader(msg)->token) & TOKEN_ACK_MASK) == knownMsgTable[i].token) && - (knownMsgTable[i].age < MAX_AGE)) { - knownMsgTable[i].age = 0; - return FALSE; - } - } - return TRUE; - } - - unsigned findOldest() { - unsigned i; - unsigned oldIndex = 0; - unsigned age = knownMsgTable[oldIndex].age; - for(i = 1; i < MSG_TABLE_ENTRIES; i++) { - if(age < knownMsgTable[i].age) { - oldIndex = i; - age = knownMsgTable[i].age; - } - } - return oldIndex; + return call Duplicate.isNew(getHeader(msg)->src, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void rememberMsg(message_t* msg) { - unsigned oldest = findOldest(); - knownMsgTable[oldest].src = getHeader(msg)->src; - knownMsgTable[oldest].token = (getHeader(msg)->token) & TOKEN_ACK_MASK; - knownMsgTable[oldest].age = 0; + call Duplicate.remember(getHeader(msg)->src, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void checkSend() { @@ -483,7 +457,6 @@ implementation /**************** Init ************************/ command error_t Init.init(){ - unsigned i; atomic { txBufPtr = NULL; macState = INIT; @@ -491,9 +464,6 @@ implementation shortRetryCounter = 0; longRetryCounter = 0; flags = 0; - for(i = 0; i < MSG_TABLE_ENTRIES; i++) { - knownMsgTable[i].age = MAX_AGE; - } #ifdef MACM_DEBUG histIndex = 0; #endif @@ -562,7 +532,7 @@ implementation return call SubPacket.maxPayloadLength(); } - command void* Packet.getPayload(message_t* msg, uint8_t* len) { + command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubPacket.getPayload(msg, len); } @@ -687,19 +657,18 @@ implementation /****** PacketSerializer events **********************/ async event void PacketReceive.receiveDetected() { + rssiValue = INVALID_SNR; if(macState <= RX_ACK) { storeOldState(60); interruptBackoffTimer(); if(macState == CCA) computeBackoff(); } if(macState <= RX) { - post ReleaseAdcTask(); - storeOldState(61); + storeOldState(61); macState = RX_P; signalMacState(); } else if(macState <= RX_ACK) { - post ReleaseAdcTask(); storeOldState(62); macState = RX_ACK_P; signalMacState(); @@ -720,12 +689,11 @@ implementation macState_t action = RX; if(macState == RX_P) { if(error == SUCCESS) { - post ageMsgsTask(); storeOldState(82); isCnt = isControl(msg); if(msgIsForMe(msg)) { if(!isCnt) { - (getMetadata(m))->strength = 10; + storeStrength(msg); if(isNewMsg(m)) { m = signal MacReceive.receiveDone(msg); rememberMsg(m); @@ -753,7 +721,6 @@ implementation if(error == SUCCESS) { if(ackIsForMe(msg)) { storeOldState(92); - (getMetadata(txBufPtr))->strength = 10; (getMetadata(txBufPtr))->ack = WAS_ACKED; signalSendDone(SUCCESS); } @@ -956,6 +923,8 @@ implementation /***** ChannelMonitorData events ******************/ async event void ChannelMonitorData.getSnrDone(int16_t data) { + atomic if((macState == RX_P) || (macState == RX_ACK_P)) rssiValue = data; + post ReleaseAdcTask(); } /***** unused Radio Modes events **************************/ @@ -982,6 +951,7 @@ implementation /***** abused TimeStamping events **************************/ async event void RadioTimeStamping.receivedSFD( uint16_t time ) { + if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); if(macState == RX_P) call ChannelMonitor.rxSuccess(); } @@ -1012,11 +982,6 @@ implementation // we don't care about urgent Resource requestes async event void RadioResourceRequested.immediateRequested() {} - - /** prevent MCU from going into a too low power mode */ - async command mcu_power_t McuPowerOverride.lowestState() { - return MSP430_POWER_LPM1; - } }