]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Added white bit to CC1000 and CC2420.
authorscipio <scipio>
Fri, 14 Sep 2007 00:15:57 +0000 (00:15 +0000)
committerscipio <scipio>
Fri, 14 Sep 2007 00:15:57 +0000 (00:15 +0000)
tos/chips/cc1000/CC1000ActiveMessageC.nc
tos/chips/cc1000/CC1000CsmaRadioC.nc
tos/chips/cc1000/CC1000Msg.h
tos/chips/cc1000/CC1000SendReceiveP.nc
tos/chips/cc2420/CC2420ActiveMessageC.nc
tos/chips/cc2420/packet/CC2420PacketC.nc

index a7f4d7ab49ecc1efd4b37d7a66c0893fb5d90fb8..abf72c0544b23d95228c045e1512f19f1ec42284 100644 (file)
@@ -50,6 +50,7 @@ configuration CC1000ActiveMessageC {
     interface AMPacket;
     interface Packet;
     interface PacketAcknowledgements;
+    interface LinkPacketMetadata;
   }
 }
 implementation {
@@ -60,7 +61,8 @@ implementation {
   SplitControl = Radio;
   Packet       = Radio;
   PacketAcknowledgements = Radio;
-
+  LinkPacketMetadata = Radio;
+  
   AMSend   = AM;
   Receive  = AM.Receive;
   Snoop    = AM.Snoop;
@@ -70,4 +72,5 @@ implementation {
   AM.SubReceive -> Radio.Receive;
   AM.amAddress -> Address;
   AM.Packet     -> Radio;
+  
 }
index 4ca30177bad4aba3e7174f6be1fe8e3e0bf14c54..faa5d80e2dcd928dbcb8df5c830e59d5353d2472 100644 (file)
@@ -60,7 +60,8 @@ configuration CC1000CsmaRadioC {
     interface CsmaBackoff;
     interface RadioTimeStamping;
     interface PacketAcknowledgements;
-
+    interface LinkPacketMetadata;
+    
     interface LowPowerListening;
   }
 }
@@ -87,7 +88,8 @@ implementation {
   LowPowerListening = Csma;
   RadioTimeStamping = SendReceive;
   PacketAcknowledgements = SendReceive;
-
+  LinkPacketMetadata = SendReceive;
+  
   Csma.CC1000Control -> Control;
   Csma.Random -> RandomC;
   Csma.CC1000Squelch -> Squelch;
@@ -100,6 +102,7 @@ implementation {
   SendReceive.HplCC1000Spi -> Hpl;
   SendReceive.amAddress -> ActiveMessageAddressC;
   SendReceive.RssiRx -> Rssi.Rssi[unique(UQ_CC1000_RSSI)];
+  SendReceive.CC1000Squelch -> Squelch;
   
   Csma.RssiNoiseFloor -> Rssi.Rssi[unique(UQ_CC1000_RSSI)];
   Csma.RssiCheckChannel -> Rssi.Rssi[unique(UQ_CC1000_RSSI)];
index 8932aa6a3d4b5b422d59f8b0bad4f03c865d15a6..a2df2697cc2e260f32fc007fec02cfce3b9011c8 100644 (file)
@@ -15,9 +15,20 @@ typedef nx_struct CC1KFooter {
   nxle_uint16_t crc;  
 } cc1000_footer_t;
 
+typedef enum {
+  CC1000_ACK_BIT   = 0x1,
+  CC1000_WHITE_BIT = 0x2,
+  /* 60 comes from the mica2 data sheet (MPR/MIB guide) and Dongjin Son's work in SenSys 2006.
+     Son's work showed that a SINR of 6dB is sufficient for > 90% PRR. Figure 7-2 of the data
+     sheet shows that a 6dB difference is approximately equal to a VRSSI voltage difference of
+     0.15V. Since the battery voltage is 2.8V (approximately), 60/1024 * 2.8 is roughly equal
+     to 0.15. This deserves some experimental testing. -pal */
+  CC1000_WHITE_BIT_THRESH = 60
+} CC1KMetadataBits;
+
 typedef nx_struct CC1KMetadata {
   nx_int16_t strength_or_preamble; /* negative when used for preamble length */
-  nx_uint8_t ack;
+  nx_uint8_t metadataBits;
   nx_uint16_t time;
   nx_uint8_t sendSecurityMode;
   nx_uint8_t receiveSecurityMode;  
index 31a2fc2c634a255efabffcdecf1221b778ebb62c..a4aec3989936334a092b3ae7dd5f1ccc412a8421 100644 (file)
@@ -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();
   }
@@ -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();
       }
   }
@@ -567,6 +568,24 @@ implementation
   }
 
   void packetReceiveDone() {
+    message_t* pBuf;
+    uint16_t snr;
+    atomic {
+      if (radioState != RECEIVED_STATE) {
+       return;
+      }
+      pBuf = rxBufPtr;
+    }
+    snr = (uint16_t) getMetadata(pBuf)->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(pBuf)->metadataBits |= CC1000_WHITE_BIT;
+    }
+    else {
+      getMetadata(pBuf)->metadataBits &= ~CC1000_WHITE_BIT;
+    }
+    
     post signalPacketReceived();
     enterReceivedState();
   }
@@ -658,8 +677,13 @@ implementation
   }
 
   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) { }
index 84a6728cf90e8ea728eb2fdeb7ddfdd9bcdf9fdb..eef5ef37af1f140c455b0be654fe89c5a96ece44 100644 (file)
@@ -47,6 +47,7 @@ configuration CC2420ActiveMessageC {
     interface Packet;
     interface CC2420Packet;
     interface PacketAcknowledgements;
+    interface LinkPacketMetadata;
     interface RadioBackoff[am_id_t amId];
     interface LowPowerListening;
     interface PacketLink;
@@ -86,7 +87,7 @@ implementation {
   LowPowerListening = LplC;
   CC2420Packet = CC2420PacketC;
   PacketAcknowledgements = CC2420PacketC;
-  
+  LinkPacketMetadata = CC2420PacketC;
   
   // SplitControl Layers
   SplitControl = LplC;
index a1ef8065ac342b78a164b3476dc5bfb065aaaf9a..5bbaee6dfe93443be6fee63c1f412dd8f540ff2a 100644 (file)
@@ -44,6 +44,7 @@ module CC2420PacketC {
     interface CC2420Packet;
     interface PacketAcknowledgements as Acks;
     interface CC2420PacketBody;
+    interface LinkPacketMetadata;
   }
 
 }
@@ -94,4 +95,7 @@ implementation {
     return (cc2420_metadata_t*)msg->metadata;
   }
 
+  async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) {
+    return call CC2420Packet.getLqi(msg) > 105;
+  }
 }