X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Frf230%2FRF230LayerP.nc;h=4ba79fca8bf74f60d948f3f78c71a38f29e0186e;hb=adf1de6c009d13b7b52e68535c63b28f59c97400;hp=cda1a21615df48d11208c5282af4e3e83927b7ac;hpb=f51909bb40e6fd22e15fc26f0e0b464ee554ccfe;p=tinyos-2.x.git diff --git a/tos/chips/rf230/RF230LayerP.nc b/tos/chips/rf230/RF230LayerP.nc index cda1a216..4ba79fca 100644 --- a/tos/chips/rf230/RF230LayerP.nc +++ b/tos/chips/rf230/RF230LayerP.nc @@ -25,6 +25,7 @@ #include #include #include +#include module RF230LayerP { @@ -57,14 +58,15 @@ module RF230LayerP interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; - interface PacketTimeStamp; + interface PacketField as PacketTimeSyncOffset; + + interface PacketTimeStamp; + interface LocalTime; interface RF230Config; interface Tasklet; interface RadioAlarm; - async event void lastTouch(message_t* msg); - #ifdef RF230_DEBUG interface DiagMsg; #endif @@ -148,11 +150,11 @@ implementation enum { - SLEEP_WAKEUP_TIME = (uint16_t)(880 * RF230_ALARM_MICROSEC), - CCA_REQUEST_TIME = (uint16_t)(140 * RF230_ALARM_MICROSEC), + SLEEP_WAKEUP_TIME = (uint16_t)(880 * RF230_ALARM_SEC / 1000000UL), + CCA_REQUEST_TIME = (uint16_t)(140 * RF230_ALARM_SEC / 1000000UL), - TX_SFD_DELAY = (uint16_t)(176 * RF230_ALARM_MICROSEC), - RX_SFD_DELAY = (uint16_t)(8 * RF230_ALARM_MICROSEC), + TX_SFD_DELAY = (uint16_t)(176 * RF230_ALARM_SEC / 1000000UL), + RX_SFD_DELAY = (uint16_t)(8 * RF230_ALARM_SEC / 1000000UL), }; tasklet_async event void RadioAlarm.fired() @@ -390,17 +392,12 @@ implementation uint8_t length; uint8_t* data; uint8_t header; + uint32_t time32; + void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; - if( call RF230Config.requiresRssiCca(msg) - && (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) ) - return EBUSY; - - writeRegister(RF230_TRX_STATE, RF230_PLL_ON); - - // do something useful, just to wait a little length = (call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF230_DEF_RFPOWER) & RF230_TX_PWR_MASK; @@ -410,6 +407,16 @@ implementation writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower); } + if( call RF230Config.requiresRssiCca(msg) + && (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) ) + return EBUSY; + + writeRegister(RF230_TRX_STATE, RF230_PLL_ON); + + // do something useful, just to wait a little + time32 = call LocalTime.get(); + timesync = call PacketTimeSyncOffset.isSet(msg) ? msg->data + call PacketTimeSyncOffset.get(msg) : 0; + // we have missed an incoming message in this short amount of time if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_PLL_ON ) { @@ -446,14 +453,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( timesync != 0 ) + *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; do { call HplRF230.spiSplitReadWrite(*(data++)); @@ -492,6 +501,11 @@ implementation } #endif + if( timesync != 0 ) + *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; + + call PacketTimeStamp.set(msg, time32); + // wait for the TRX_END interrupt state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; @@ -587,7 +601,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); @@ -623,6 +637,7 @@ implementation if( isSpiAcquired() ) { uint16_t time; + uint32_t time32; uint8_t irq; uint8_t temp; @@ -681,17 +696,15 @@ implementation 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 - +#ifndef RF230_RSSI_ENERGY call PacketRSSI.set(rxMsg, temp); } else + { call PacketRSSI.clear(rxMsg); +#endif + } /* * The timestamp corresponds to the first event which could not @@ -702,7 +715,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); @@ -728,7 +745,12 @@ implementation else if( cmd == CMD_RECEIVE ) { ASSERT( state == STATE_RX_ON || state == STATE_PLL_ON_2_RX_ON ); - +#ifdef RF230_RSSI_ENERGY + if( irq == RF230_IRQ_TRX_END ) + call PacketRSSI.set(rxMsg, readRegister(RF230_PHY_ED_LEVEL)); + else + call PacketRSSI.clear(rxMsg); +#endif if( state == STATE_PLL_ON_2_RX_ON ) { ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_PLL_ON );