interface LowPowerListening;
interface PacketField<uint8_t> as PacketLinkQuality;
+ interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketTimeStamp<TRF230, uint16_t>;
interface PacketLastTouch;
AMPacket = DefaultPacketC;
PacketAcknowledgements = DefaultPacketC;
PacketLinkQuality = DefaultPacketC.PacketLinkQuality;
+ PacketTransmitPower = DefaultPacketC.PacketTransmitPower;
+ PacketRSSI = DefaultPacketC.PacketRSSI;
PacketTimeStamp = DefaultPacketC.PacketTimeStamp;
LowPowerListening = LowPowerListeningLayerC;
RF230LayerC.RF230Config -> DefaultMacP;
RF230LayerC.PacketLinkQuality -> DefaultPacketC.PacketLinkQuality;
RF230LayerC.PacketTransmitPower -> DefaultPacketC.PacketTransmitPower;
+ RF230LayerC.PacketRSSI -> DefaultPacketC.PacketRSSI;
RF230LayerC.PacketTimeStamp -> DefaultPacketC.PacketTimeStamp;
}
{
nx_uint8_t flags;
nx_uint8_t lqi;
+ nx_uint8_t power; // shared between TXPOWER and RSSI
nx_uint16_t timestamp;
} defpacket_metadata_t;
DEFPACKET_WAS_ACKED = 0x01, // PacketAcknowledgements
DEFPACKET_TIMESTAMP = 0x02, // PacketTimeStamp
DEFPACKET_LAST_TOUCH = 0x04, // PacketLastTouch.touch
+ DEFPACKET_TXPOWER = 0x10, // PacketTransmitPower
+ DEFPACKET_RSSI = 0x20, // PacketRSSI
DEFPACKET_CLEAR_METADATA = 0x00,
};
interface PacketAcknowledgements;
interface PacketField<uint8_t> as PacketLinkQuality;
interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketField<uint16_t> as PacketSleepInterval;
interface PacketTimeStamp<TRF230, uint16_t>;
PacketAcknowledgements = DefaultPacketP;
PacketLinkQuality = DefaultPacketP.PacketLinkQuality;
PacketTransmitPower = DefaultPacketP.PacketTransmitPower;
+ PacketRSSI = DefaultPacketP.PacketRSSI;
PacketSleepInterval = DefaultPacketP.PacketSleepInterval;
PacketTimeStamp = DefaultPacketP;
interface Packet;
interface PacketField<uint8_t> as PacketLinkQuality;
interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketField<uint16_t> as PacketSleepInterval;
interface PacketTimeStamp<TRF230, uint16_t>;
getMeta(msg)->timestamp = value;
}
-/*----------------- Global fields -----------------*/
-
- norace uint8_t flags;
- enum
- {
- FLAG_TXPOWER = 0x01,
- FLAG_SLEEPINT = 0x02,
- };
-
- norace uint8_t transmitPower;
-
- // TODO: Move sleepInterval into the metadata
- norace uint16_t sleepInterval;
-
/*----------------- PacketTransmitPower -----------------*/
async command bool PacketTransmitPower.isSet(message_t* msg)
{
- return flags & FLAG_TXPOWER;
+ return getMeta(msg)->flags & DEFPACKET_TXPOWER;
}
async command uint8_t PacketTransmitPower.get(message_t* msg)
{
- return transmitPower;
+ return getMeta(msg)->power;
}
async command void PacketTransmitPower.clear(message_t* msg)
{
- flags &= ~FLAG_TXPOWER;
+ getMeta(msg)->flags &= ~DEFPACKET_TXPOWER;
}
async command void PacketTransmitPower.set(message_t* msg, uint8_t value)
{
- flags |= FLAG_TXPOWER;
- transmitPower = value;
+ getMeta(msg)->flags &= ~DEFPACKET_RSSI;
+ getMeta(msg)->flags |= DEFPACKET_TXPOWER;
+ getMeta(msg)->power = value;
+ }
+
+/*----------------- PacketRSSI -----------------*/
+
+ async command bool PacketRSSI.isSet(message_t* msg)
+ {
+ return getMeta(msg)->flags & DEFPACKET_RSSI;
+ }
+
+ async command uint8_t PacketRSSI.get(message_t* msg)
+ {
+ return getMeta(msg)->power;
}
+ async command void PacketRSSI.clear(message_t* msg)
+ {
+ getMeta(msg)->flags &= ~DEFPACKET_RSSI;
+ }
+
+ async command void PacketRSSI.set(message_t* msg, uint8_t value)
+ {
+ getMeta(msg)->flags &= ~DEFPACKET_TXPOWER;
+ getMeta(msg)->flags |= DEFPACKET_RSSI;
+ getMeta(msg)->power = value;
+ }
+
+/*----------------- Global fields -----------------*/
+
+ norace uint8_t flags;
+ enum
+ {
+ FLAG_SLEEPINT = 0x01,
+ };
+
+ // TODO: Move sleepInterval into the metadata
+ norace uint16_t sleepInterval;
+
/*----------------- PacketSleepInterval -----------------*/
async command bool PacketSleepInterval.isSet(message_t* msg)
uses
{
interface RF230Config;
+
interface PacketField<uint8_t> as PacketLinkQuality;
interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketTimeStamp<TRF230, uint16_t>;
async event void lastTouch(message_t* msg);
RF230Config = RF230LayerP;
PacketLinkQuality = RF230LayerP.PacketLinkQuality;
PacketTransmitPower = RF230LayerP.PacketTransmitPower;
+ PacketRSSI = RF230LayerP.PacketRSSI;
PacketTimeStamp = RF230LayerP.PacketTimeStamp;
RF230LayerP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique("RadioAlarm")];
interface BusyWait<TMicro, uint16_t>;
- interface RF230Config;
interface PacketField<uint8_t> as PacketLinkQuality;
interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketTimeStamp<TRF230, uint16_t>;
+
+ interface RF230Config;
interface Tasklet;
interface RadioAlarm;
{
uint16_t time;
uint8_t irq;
+ uint8_t temp;
atomic time = capturedTime;
radioIrq = FALSE;
{
ASSERT( state == STATE_RX_ON || state == STATE_PLL_ON_2_RX_ON );
- // the most likely place for busy channel
- rssiBusy += readRegister(RF230_PHY_RSSI) - (rssiBusy >> 2);
+ // the most likely place for busy channel, with no TRX_END
+ if( irq == RF230_IRQ_RX_START )
+ {
+ temp = readRegister(RF230_PHY_RSSI);
+
+ rssiBusy += temp - (rssiBusy >> 2);
+ call PacketRSSI.set(rxMsg, temp);
+ }
+ else
+ call PacketRSSI.clear(rxMsg);
/*
* The timestamp corresponds to the first event which could not
interface PacketAcknowledgements;
interface PacketField<uint8_t> as PacketLinkQuality;
+ interface PacketField<uint8_t> as PacketTransmitPower;
+ interface PacketField<uint8_t> as PacketRSSI;
interface PacketTimeStamp<TMicro, uint16_t>;
interface LowPowerListening;
interface PacketLastTouch;
Packet = MAC;
AMPacket = MAC;
- PacketAcknowledgements = MAC;
- PacketLinkQuality = MAC;
- PacketTimeStamp = MAC;
- PacketLastTouch = MAC;
- LowPowerListening = MAC;
+ PacketAcknowledgements = MAC.PacketAcknowledgements;
+ PacketLinkQuality = MAC.PacketLinkQuality;
+ PacketTransmitPower = MAC.PacketTransmitPower;
+ PacketRSSI = MAC.PacketRSSI;
+ PacketTimeStamp = MAC.PacketTimeStamp;
+ PacketLastTouch = MAC.PacketLastTouch;
+ LowPowerListening = MAC.LowPowerListening;
}