X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fcc2420%2Freceive%2FCC2420ReceiveP.nc;h=5bd4e852e54eb383c85a67d7be24b94a80e15a47;hb=aa7578fd1472c62c1d22d0801fe0f55b36093bdf;hp=812bd79126797a31bf49280ce16c985e39724c78;hpb=898e5cea2a1802fb61f1a27fa25c6094c232f378;p=tinyos-2.x.git diff --git a/tos/chips/cc2420/receive/CC2420ReceiveP.nc b/tos/chips/cc2420/receive/CC2420ReceiveP.nc index 812bd791..5bd4e852 100644 --- a/tos/chips/cc2420/receive/CC2420ReceiveP.nc +++ b/tos/chips/cc2420/receive/CC2420ReceiveP.nc @@ -40,7 +40,7 @@ #include "message.h" #include "AM.h" -module CC2420ReceiveP { +module CC2420ReceiveP @safe() { provides interface Init; provides interface StdControl; @@ -60,7 +60,8 @@ module CC2420ReceiveP { uses interface CC2420Packet; uses interface CC2420PacketBody; uses interface CC2420Config; - + uses interface PacketTimeStamp; + uses interface Leds; } @@ -80,8 +81,8 @@ implementation { SACK_HEADER_LENGTH = 7, }; - uint16_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ]; - + uint32_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ]; + uint8_t m_timestamp_head; uint8_t m_timestamp_size; @@ -97,7 +98,7 @@ implementation { norace uint8_t m_bytes_left; - norace message_t* m_p_rx_buf; + norace message_t* ONE_NOK m_p_rx_buf; message_t m_rx_buf; @@ -109,7 +110,7 @@ implementation { void receive(); void waitForNextPacket(); void flush(); - bool passesAddressCheck(message_t *msg); + bool passesAddressCheck(message_t * ONE msg); task void receiveDone_task(); @@ -125,6 +126,10 @@ implementation { reset_state(); m_state = S_STARTED; atomic receivingPacket = FALSE; + /* Note: + We use the falling edge because the FIFOP polarity is reversed. + This is done in CC2420Power.startOscillator from CC2420ControlP.nc. + */ call InterruptFIFOP.enableFallingEdge(); } return SUCCESS; @@ -145,7 +150,7 @@ implementation { * Start frame delimiter signifies the beginning/end of a packet * See the CC2420 datasheet for details. */ - async command void CC2420Receive.sfd( uint16_t time ) { + async command void CC2420Receive.sfd( uint32_t time ) { if ( m_timestamp_size < TIMESTAMP_QUEUE_SIZE ) { uint8_t tail = ( ( m_timestamp_head + m_timestamp_size ) % TIMESTAMP_QUEUE_SIZE ); @@ -194,8 +199,8 @@ implementation { async event void RXFIFO.readDone( uint8_t* rx_buf, uint8_t rx_len, error_t error ) { cc2420_header_t* header = call CC2420PacketBody.getHeader( m_p_rx_buf ); - cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( m_p_rx_buf ); - uint8_t* buf = (uint8_t*) header; + uint8_t tmpLen __DEPUTY_UNUSED__ = sizeof(message_t) - (offsetof(message_t, data) - sizeof(cc2420_header_t)); + uint8_t* COUNT(tmpLen) buf = TCAST(uint8_t* COUNT(tmpLen), header); rxFrameLength = buf[ 0 ]; switch( m_state ) { @@ -280,16 +285,25 @@ implementation { call SpiResource.release(); } - if ( m_timestamp_size ) { - if ( rxFrameLength > 10 ) { - metadata->time = m_timestamp_queue[ m_timestamp_head ]; + //new packet is buffered up, or we don't have timestamp in fifo, or ack + if ( ( m_missed_packets && call FIFO.get() ) || !call FIFOP.get() + || !m_timestamp_size + || rxFrameLength <= 10) { + call PacketTimeStamp.clear(m_p_rx_buf); + } + else { + if (m_timestamp_size==1) + call PacketTimeStamp.set(m_p_rx_buf, m_timestamp_queue[ m_timestamp_head ]); m_timestamp_head = ( m_timestamp_head + 1 ) % TIMESTAMP_QUEUE_SIZE; m_timestamp_size--; - } - } else { - metadata->time = 0xffff; + + if (m_timestamp_size>0) { + call PacketTimeStamp.clear(m_p_rx_buf); + m_timestamp_head = 0; + m_timestamp_size = 0; + } } - + // We may have received an ack that should be processed by Transmit // buf[rxFrameLength] >> 7 checks the CRC if ( ( buf[ rxFrameLength ] >> 7 ) && rx_buf ) { @@ -324,15 +338,18 @@ implementation { */ task void receiveDone_task() { cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( m_p_rx_buf ); - uint8_t* buf = (uint8_t*) call CC2420PacketBody.getHeader( m_p_rx_buf );; + cc2420_header_t* header = call CC2420PacketBody.getHeader( m_p_rx_buf); + uint8_t length = header->length; + uint8_t tmpLen __DEPUTY_UNUSED__ = sizeof(message_t) - (offsetof(message_t, data) - sizeof(cc2420_header_t)); + uint8_t* COUNT(tmpLen) buf = TCAST(uint8_t* COUNT(tmpLen), header); - metadata->crc = buf[ rxFrameLength ] >> 7; - metadata->lqi = buf[ rxFrameLength ] & 0x7f; - metadata->rssi = buf[ rxFrameLength - 1 ]; + metadata->crc = buf[ length ] >> 7; + metadata->lqi = buf[ length ] & 0x7f; + metadata->rssi = buf[ length - 1 ]; - if(passesAddressCheck(m_p_rx_buf)) { + if (passesAddressCheck(m_p_rx_buf) && length >= CC2420_SIZE) { m_p_rx_buf = signal Receive.receive( m_p_rx_buf, m_p_rx_buf->data, - rxFrameLength ); + length - CC2420_SIZE); } atomic receivingPacket = FALSE;