interface AMPacket;
interface Packet;
interface PacketAcknowledgements;
+ interface LinkPacketMetadata;
}
}
implementation {
SplitControl = Radio;
Packet = Radio;
PacketAcknowledgements = Radio;
-
+ LinkPacketMetadata = Radio;
+
AMSend = AM;
Receive = AM.Receive;
Snoop = AM.Snoop;
AM.SubReceive -> Radio.Receive;
AM.amAddress -> Address;
AM.Packet -> Radio;
+
}
interface CsmaBackoff;
interface RadioTimeStamping;
interface PacketAcknowledgements;
-
+ interface LinkPacketMetadata;
+
interface LowPowerListening;
}
}
LowPowerListening = Csma;
RadioTimeStamping = SendReceive;
PacketAcknowledgements = SendReceive;
-
+ LinkPacketMetadata = SendReceive;
+
Csma.CC1000Control -> Control;
Csma.Random -> RandomC;
Csma.CC1000Squelch -> Squelch;
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)];
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;
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();
}
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();
}
}
}
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();
}
}
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) { }
interface Packet;
interface CC2420Packet;
interface PacketAcknowledgements;
+ interface LinkPacketMetadata;
interface RadioBackoff[am_id_t amId];
interface LowPowerListening;
interface PacketLink;
LowPowerListening = LplC;
CC2420Packet = CC2420PacketC;
PacketAcknowledgements = CC2420PacketC;
-
+ LinkPacketMetadata = CC2420PacketC;
// SplitControl Layers
SplitControl = LplC;
interface CC2420Packet;
interface PacketAcknowledgements as Acks;
interface CC2420PacketBody;
+ interface LinkPacketMetadata;
}
}
return (cc2420_metadata_t*)msg->metadata;
}
+ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) {
+ return call CC2420Packet.getLqi(msg) > 105;
+ }
}