]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/rf230/RF230LayerP.nc
update RF230Sniffer to the new interfaces
[tinyos-2.x.git] / tos / chips / rf230 / RF230LayerP.nc
index b35705ab62ba93fc7a83963aa3d67ee23c1282af..85058a77ae29271d2bf52797a55947a62ab0623c 100644 (file)
@@ -54,15 +54,18 @@ module RF230LayerP
 
                interface BusyWait<TMicro, uint16_t>;
 
-               interface RF230Config;
                interface PacketField<uint8_t> as PacketLinkQuality;
                interface PacketField<uint8_t> as PacketTransmitPower;
-               interface PacketTimeStamp<TRF230, uint16_t>;
+               interface PacketField<uint8_t> as PacketRSSI;
+               interface PacketField<uint8_t> as PacketTimeSyncOffset;
+
+               interface PacketTimeStamp<TRF230, uint32_t>;
+               interface LocalTime<TRF230>;
+
+               interface RF230Config;
                interface Tasklet;
                interface RadioAlarm;
 
-               async event void lastTouch(message_t* msg);
-
 #ifdef RF230_DEBUG
                interface DiagMsg;
 #endif
@@ -388,12 +391,13 @@ implementation
                uint8_t length;
                uint8_t* data;
                uint8_t header;
+               uint32_t time32;
 
                if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq )
                        return EBUSY;
 
                if( call RF230Config.requiresRssiCca(msg) 
-                               && readRegister(RF230_PHY_RSSI) > ((rssiClear + rssiBusy) >> 3) )
+                               && (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) )
                        return EBUSY;
 
                writeRegister(RF230_TRX_STATE, RF230_PLL_ON);
@@ -408,6 +412,8 @@ implementation
                        writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower);
                }
 
+               time32 = call LocalTime.get();
+
                // we have missed an incoming message in this short amount of time
                if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_PLL_ON )
                {
@@ -444,14 +450,16 @@ implementation
 
                length -= header;
 
-               // first upload the header
+               // first upload the header to gain some time
                do {
                        call HplRF230.spiSplitReadWrite(*(data++));
                }
                while( --header != 0 );
 
-               call PacketTimeStamp.set(msg, time);
-               signal lastTouch(msg);
+               time32 += (int16_t)(time) - (int16_t)(time32);
+
+               if( call PacketTimeSyncOffset.isSet(msg) )
+                       ((timesync_footer_t*)(msg->data + call PacketTimeSyncOffset.get(msg)))->time_offset += time32;
 
                do {
                        call HplRF230.spiSplitReadWrite(*(data++));
@@ -490,6 +498,11 @@ implementation
                }
 #endif
 
+               if( call PacketTimeSyncOffset.isSet(msg) )
+                       ((timesync_footer_t*)(msg->data + call PacketTimeSyncOffset.get(msg)))->time_offset -= time32;
+
+               call PacketTimeStamp.set(msg, time32);
+
                // wait for the TRX_END interrupt
                state = STATE_BUSY_TX_2_RX_ON;
                cmd = CMD_TRANSMIT;
@@ -585,7 +598,7 @@ implementation
                        length = call RF230Config.getLength(rxMsg);
 
                        call DiagMsg.str("rx");
-                       call DiagMsg.uint16(call PacketTimeStamp.isSet(rxMsg) ? call PacketTimeStamp.get(rxMsg) : 0);
+                       call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0);
                        call DiagMsg.uint16(call RadioAlarm.getNow());
                        call DiagMsg.uint8(crc != 0);
                        call DiagMsg.uint8(length);
@@ -621,7 +634,9 @@ implementation
                if( isSpiAcquired() )
                {
                        uint16_t time;
+                       uint32_t time32;
                        uint8_t irq;
+                       uint8_t temp;
                        
                        atomic time = capturedTime;
                        radioIrq = FALSE;
@@ -674,8 +689,21 @@ implementation
                                {
                                        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 interrupt
+                                       if( irq == RF230_IRQ_RX_START )
+                                       {
+                                               temp = readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK;
+
+                                               rssiBusy += temp - (rssiBusy >> 2);
+
+#ifdef RF230_RSSI_ENERGY
+                                               temp = readRegister(RF230_PHY_ED_LEVEL);
+#endif
+
+                                               call PacketRSSI.set(rxMsg, temp);
+                                       }
+                                       else
+                                               call PacketRSSI.clear(rxMsg);
 
                                        /*
                                         * The timestamp corresponds to the first event which could not
@@ -686,7 +714,11 @@ implementation
                                         * CMD_TRANSMIT.
                                         */
                                        if( irq == RF230_IRQ_RX_START ) // just to be cautious
-                                               call PacketTimeStamp.set(rxMsg, time - RX_SFD_DELAY);
+                                       {
+                                               time32 = call LocalTime.get();
+                                               time32 += (int16_t)(time - RX_SFD_DELAY) - (int16_t)(time32);
+                                               call PacketTimeStamp.set(rxMsg, time32);
+                                       }
                                        else
                                                call PacketTimeStamp.clear(rxMsg);
 
@@ -723,7 +755,7 @@ implementation
                                        else
                                        {
                                                // the most likely place for clear channel (hope to avoid acks)
-                                               rssiClear += readRegister(RF230_PHY_RSSI) - (rssiClear >> 2);
+                                               rssiClear += (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) - (rssiClear >> 2);
                                        }
 
                                        cmd = CMD_DOWNLOAD;