]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/cc1000/CC1000SendReceiveP.nc
Remove bogus 'tab:4' and 'tab:2' markers.
[tinyos-2.x.git] / tos / chips / cc1000 / CC1000SendReceiveP.nc
index a72f08cba46ca2de96c502ec7c8ec3a78efd2402..19700e066bfe7083e3c3c6d1262fcd3fdafc4655 100644 (file)
@@ -1,6 +1,6 @@
 // $Id$
 
-/*                                                                     tab:4
+/*
  * "Copyright (c) 2000-2005 The Regents of the University  of California.  
  * All rights reserved.
  *
@@ -62,12 +62,13 @@ module CC1000SendReceiveP {
     interface Packet;
     interface ByteRadio;
     interface PacketAcknowledgements;
+    interface LinkPacketMetadata;
   }
   uses {
     //interface PowerManagement;
     interface CC1000Control;
     interface HplCC1000Spi;
-
+    interface CC1000Squelch;
     interface ReadNow<uint16_t> as RssiRx;
     async command am_addr_t amAddress();
   }
@@ -121,26 +122,26 @@ implementation
 
   uint16_t rxShiftBuf;
   message_t rxBuf;
-  message_t *rxBufPtr = &rxBuf;
+  message_t * ONE rxBufPtr = &rxBuf;
 
   uint16_t preambleLength;
-  message_t *txBufPtr;
+  message_t * ONE_NOK txBufPtr;
   uint8_t nextTxByte;
 
   const_uint8_t ackCode[5] = { 0xab, ACK_BYTE1, ACK_BYTE2, 0xaa, 0xaa };
 
   /* Packet structure accessor functions. Note that everything is
    * relative to the data field. */
-  cc1000_header_t *getHeader(message_t *amsg) {
-    return (cc1000_header_t *)(amsg->data - sizeof(cc1000_header_t));
+  cc1000_header_t * ONE getHeader(message_t * ONE amsg) {
+    return TCAST(cc1000_header_t * ONE, (uint8_t *)amsg + offsetof(message_t, data) - sizeof(cc1000_header_t));
   }
 
-  cc1000_footer_t *getFooter(message_t *amsg) {
+  cc1000_footer_t *getFooter(message_t * ONE amsg) {
     return (cc1000_footer_t *)(amsg->footer);
   }
   
-  cc1000_metadata_t *getMetadata(message_t *amsg) {
-    return (cc1000_metadata_t *)((uint8_t *)amsg->footer + sizeof(cc1000_footer_t));
+  cc1000_metadata_t * ONE getMetadata(message_t * ONE amsg) {
+    return TCAST(cc1000_metadata_t * ONE, (uint8_t *)amsg + offsetof(message_t, footer) + sizeof(cc1000_footer_t));
   }
   
   /* State transition functions */
@@ -262,7 +263,7 @@ implementation
          txBufPtr = msg;
        }
       }
-    signal ByteRadio.rts();
+    signal ByteRadio.rts(msg);
 
     return SUCCESS;
   }
@@ -361,14 +362,14 @@ implementation
 
        if (rxShiftBuf == ACK_WORD)
          {
-           getMetadata(txBufPtr)->ack = 1;
+           getMetadata(txBufPtr)->metadataBits |= CC1000_ACK_BIT;
            enterTxDoneState();
            return;
          }
       }
     if (count >= MAX_ACK_WAIT)
       {
-       getMetadata(txBufPtr)->ack = 0;
+       getMetadata(txBufPtr)->metadataBits &= ~CC1000_ACK_BIT;
        enterTxDoneState();
       }
   }
@@ -476,9 +477,9 @@ implementation
     cc1000_metadata_t *rxMetadata = getMetadata(rxBufPtr);
 
     if (result != SUCCESS)
-      rxMetadata->strength = 0;
+      rxMetadata->strength_or_preamble = 0;
     else
-      rxMetadata->strength = data;
+      rxMetadata->strength_or_preamble = data;
   }
 
   void rxData(uint8_t in) {
@@ -497,7 +498,7 @@ implementation
 
     rxShiftBuf = rxShiftBuf << 8 | in;
     nextByte = rxShiftBuf >> f.rxBitOffset;
-    ((uint8_t *)rxBufPtr)[count++] = nextByte;
+    ((uint8_t *COUNT(sizeof(message_t)))rxBufPtr)[count++] = nextByte;
 
     // Adjust rxLength to correspond to the corresponding offset in message_t
     rxLength += offsetof(message_t, data);
@@ -522,7 +523,7 @@ implementation
 
     if (f.ack &&
        rxFooter->crc &&
-       rxHeader->addr == call amAddress())
+       rxHeader->dest == call amAddress())
       {
        enterAckState();
        call CC1000Control.txMode();
@@ -567,6 +568,18 @@ implementation
   }
 
   void packetReceiveDone() {
+    uint16_t snr;
+
+    snr = (uint16_t) getMetadata(rxBufPtr)->strength_or_preamble;
+    /* Higher signal strengths have lower voltages. So see if we're
+       CC1000_WHITE_BIT_THRESH *below* the noise floor. */
+    if ((snr + CC1000_WHITE_BIT_THRESH) < ((call CC1000Squelch.get()))) {
+      getMetadata(rxBufPtr)->metadataBits |= CC1000_WHITE_BIT;
+    }
+    else {
+      getMetadata(rxBufPtr)->metadataBits &= ~CC1000_WHITE_BIT;
+    }
+    
     post signalPacketReceived();
     enterReceivedState();
   }
@@ -632,13 +645,13 @@ implementation
     return TOSH_DATA_LENGTH;
   }
 
-  command void* Packet.getPayload(message_t *msg, uint8_t *len) {
-    if (len != NULL) {
-      cc1000_header_t *header = getHeader(msg);
-
-      *len = header->length;
+  command void* Packet.getPayload(message_t *msg, uint8_t len) {
+    if (len <= TOSH_DATA_LENGTH) {
+      return (void* COUNT_NOK(len))msg->data;
+    }
+    else {
+      return NULL;
     }
-    return (void*)msg->data;
   }
 
   async command error_t PacketAcknowledgements.requestAck(message_t *msg) {
@@ -649,25 +662,22 @@ implementation
     return FAIL;               /* We always ack */
   }
 
-  command void* Receive.getPayload(message_t *m, uint8_t *len) {
-    return call Packet.getPayload(m, len);
-  }
-
-  command uint8_t Receive.payloadLength(message_t *m) {
-    return call Packet.payloadLength(m);
-  }
-
   command uint8_t Send.maxPayloadLength() {
     return call Packet.maxPayloadLength();
   }
 
-  command void* Send.getPayload(message_t *m) {
-    return call Packet.getPayload(m, NULL);
+  command void* Send.getPayload(message_t *m, uint8_t len) {
+    return call Packet.getPayload(m, len);
   }
 
   async command bool PacketAcknowledgements.wasAcked(message_t *msg) {
-    return getMetadata(msg)->ack;
+    return getMetadata(msg)->metadataBits & CC1000_ACK_BIT;
+  }
+
+  async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) {
+    return getMetadata(msg)->metadataBits & CC1000_WHITE_BIT;
   }
+  
   // Default events for radio send/receive coordinators do nothing.
   // Be very careful using these, or you'll break the stack.
   default async event void RadioTimeStamping.transmittedSFD(uint16_t time, message_t *msgBuff) { }