From: scipio Date: Fri, 14 Sep 2007 00:15:57 +0000 (+0000) Subject: Added white bit to CC1000 and CC2420. X-Git-Tag: release_tinyos_2_1_0_0~741 X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=commitdiff_plain;h=4f1261f39f507f2044ae702a6f93316dcc56360e;p=tinyos-2.x.git Added white bit to CC1000 and CC2420. --- diff --git a/tos/chips/cc1000/CC1000ActiveMessageC.nc b/tos/chips/cc1000/CC1000ActiveMessageC.nc index a7f4d7ab..abf72c05 100644 --- a/tos/chips/cc1000/CC1000ActiveMessageC.nc +++ b/tos/chips/cc1000/CC1000ActiveMessageC.nc @@ -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; + } diff --git a/tos/chips/cc1000/CC1000CsmaRadioC.nc b/tos/chips/cc1000/CC1000CsmaRadioC.nc index 4ca30177..faa5d80e 100644 --- a/tos/chips/cc1000/CC1000CsmaRadioC.nc +++ b/tos/chips/cc1000/CC1000CsmaRadioC.nc @@ -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)]; diff --git a/tos/chips/cc1000/CC1000Msg.h b/tos/chips/cc1000/CC1000Msg.h index 8932aa6a..a2df2697 100644 --- a/tos/chips/cc1000/CC1000Msg.h +++ b/tos/chips/cc1000/CC1000Msg.h @@ -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; diff --git a/tos/chips/cc1000/CC1000SendReceiveP.nc b/tos/chips/cc1000/CC1000SendReceiveP.nc index 31a2fc2c..a4aec398 100644 --- a/tos/chips/cc1000/CC1000SendReceiveP.nc +++ b/tos/chips/cc1000/CC1000SendReceiveP.nc @@ -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 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) { } diff --git a/tos/chips/cc2420/CC2420ActiveMessageC.nc b/tos/chips/cc2420/CC2420ActiveMessageC.nc index 84a6728c..eef5ef37 100644 --- a/tos/chips/cc2420/CC2420ActiveMessageC.nc +++ b/tos/chips/cc2420/CC2420ActiveMessageC.nc @@ -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; diff --git a/tos/chips/cc2420/packet/CC2420PacketC.nc b/tos/chips/cc2420/packet/CC2420PacketC.nc index a1ef8065..5bbaee6d 100644 --- a/tos/chips/cc2420/packet/CC2420PacketC.nc +++ b/tos/chips/cc2420/packet/CC2420PacketC.nc @@ -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; + } }