X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fcc2420%2Freceive%2FCC2420ReceiveP.nc;h=5bd4e852e54eb383c85a67d7be24b94a80e15a47;hb=aa7578fd1472c62c1d22d0801fe0f55b36093bdf;hp=fd757be55e6e584f1a59d2d2fc2f7ba7b31bf002;hpb=0ab1429a57148045a74254930442ecddd47d63a3;p=tinyos-2.x.git diff --git a/tos/chips/cc2420/receive/CC2420ReceiveP.nc b/tos/chips/cc2420/receive/CC2420ReceiveP.nc index fd757be5..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; @@ -126,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; @@ -281,16 +285,25 @@ implementation { call SpiResource.release(); } - if ( m_timestamp_size ) { - if ( rxFrameLength > 10 ) { - call PacketTimeStamp.set(m_p_rx_buf, 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 { - call PacketTimeStamp.clear(m_p_rx_buf); + + 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 ) { @@ -326,16 +339,17 @@ implementation { task void receiveDone_task() { cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( 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;