X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fbyte_radio%2FPacketSerializerP.nc;h=50045419ac79c849a953475757c8096a2b6748bc;hb=4048809c6d3e0e4d48f23621633b7ef0ce725e10;hp=e495ef595c9646d5a3cfb41a7d2badb47bf9fa5e;hpb=1a329382c4f4556fd52d85f4e3f4a67e54911682;p=tinyos-2.x.git diff --git a/tos/lib/byte_radio/PacketSerializerP.nc b/tos/lib/byte_radio/PacketSerializerP.nc index e495ef59..50045419 100644 --- a/tos/lib/byte_radio/PacketSerializerP.nc +++ b/tos/lib/byte_radio/PacketSerializerP.nc @@ -48,7 +48,6 @@ module PacketSerializerP { provides { - interface Init; interface PhySend; interface PhyReceive; interface Packet; @@ -58,33 +57,37 @@ module PacketSerializerP { interface RadioByteComm; interface PhyPacketTx; interface PhyPacketRx; +#ifdef PACKETSERIALIZER_DEBUG + interface SerialDebug; +#endif } } implementation { + +#ifdef PACKETSERIALIZER_DEBUG + void sdDebug(uint16_t p) { + call SerialDebug.putPlace(p); + } +#else + void sdDebug(uint16_t p) {}; +#endif + /* Module Global Variables */ - message_t *txBufPtr; // pointer to tx buffer - message_t *rxBufPtr; // pointer to rx buffer - message_t rxMsg; // rx message buffer - uint16_t crc; // CRC value of either the current incoming or outgoing packet - uint8_t byteCnt; // index into current datapacket + message_t rxMsg; // rx message buffer + message_t *rxBufPtr = &rxMsg; // pointer to rx buffer + message_t *txBufPtr = NULL; // pointer to tx buffer + uint16_t crc = 0; // CRC value of either the current incoming or outgoing packet + uint8_t byteCnt = 0; // index into current datapacket /* Local Function Declarations */ void TransmitNextByte(); void ReceiveNextByte(uint8_t data); + typedef enum { + SFD_OFFSET = sizeof(message_header_t) - sizeof(message_radio_header_t) + 2 + } pserializer_constants_t; - /* Radio Init */ - command error_t Init.init(){ - atomic { - crc = 0; - txBufPtr = NULL; - rxBufPtr = &rxMsg; - byteCnt = 0; - } - return SUCCESS; - } - /*- Radio Send */ async command error_t PhySend.send(message_t* msg, uint8_t len) { message_radio_header_t* header = getHeader(msg); @@ -100,7 +103,7 @@ implementation { } async event void PhyPacketTx.sendHeaderDone() { - TransmitNextByte(); + TransmitNextByte(); } async event void RadioByteComm.txByteReady(error_t error) { @@ -113,18 +116,23 @@ implementation { void TransmitNextByte() { message_radio_header_t* header = getHeader((message_t*) txBufPtr); - if (byteCnt < header->length + sizeof(message_header_t) ) { // send (data + header), compute crc - if(byteCnt == sizeof(message_header_t)) signal RadioTimeStamping.transmittedSFD(0, (message_t*)txBufPtr); + if (byteCnt < header->length + sizeof(message_radio_header_t) ) { // send (data + header), compute crc + if(byteCnt == SFD_OFFSET) { + signal RadioTimeStamping.transmittedSFD(0, (message_t*)txBufPtr); + } crc = crcByte(crc, ((uint8_t *)(txBufPtr))[byteCnt]); call RadioByteComm.txByte(((uint8_t *)(txBufPtr))[byteCnt++]); - } else if (byteCnt == (header->length + sizeof(message_header_t))) { + } + else if (byteCnt == (header->length + sizeof(message_radio_header_t))) { ++byteCnt; call RadioByteComm.txByte((uint8_t)crc); - } else if (byteCnt == (header->length + sizeof(message_header_t)+1)) { + } + else if (byteCnt == (header->length + sizeof(message_radio_header_t)+1)) { ++byteCnt; call RadioByteComm.txByte((uint8_t)(crc >> 8)); - } else { /* (byteCnt > (header->length + sizeof(message_header_t)+1)) */ - call PhyPacketTx.sendFooter(); + } + else { /* (byteCnt > (header->length + sizeof(message_radio_header_t)+1)) */ + call PhyPacketTx.sendFooter(); } } @@ -150,7 +158,7 @@ implementation { message_radio_header_t* header = getHeader((message_t*)(rxBufPtr)); message_radio_footer_t* footer = getFooter((message_t*)rxBufPtr); // we care about wrong crc in this layer - if (footer->crc != 1) error = FAIL; + if(!footer->crc) error = FAIL; rxBufPtr = signal PhyReceive.receiveDone((message_t*)rxBufPtr, ((message_t*)rxBufPtr)->data, header->length, error); } @@ -158,19 +166,23 @@ implementation { void ReceiveNextByte(uint8_t data) { message_radio_footer_t* footer = getFooter((message_t*)rxBufPtr); ((uint8_t *)(rxBufPtr))[byteCnt++] = data; - if ( byteCnt < getHeader(rxBufPtr)->length + sizeof(message_radio_header_t) ) { - if(byteCnt == sizeof(message_radio_header_t)) signal RadioTimeStamping.receivedSFD(0); + if(byteCnt < getHeader(rxBufPtr)->length + sizeof(message_radio_header_t)) { + if(byteCnt == SFD_OFFSET) { + signal RadioTimeStamping.receivedSFD(0); + } crc = crcByte(crc, data); if (getHeader(rxBufPtr)->length > TOSH_DATA_LENGTH) { // this packet is surely corrupt, so whatever... footer->crc = 0; call PhyPacketRx.recvFooter(); } - } else if (byteCnt == (getHeader(rxBufPtr)->length + sizeof(message_radio_header_t))) { - crc = crcByte(crc, data); + } + else if (byteCnt == (getHeader(rxBufPtr)->length + sizeof(message_radio_header_t))) { + crc = crcByte(crc, data); byteCnt = offsetof(message_t, footer) + offsetof(message_radio_footer_t, crc); - } else if (byteCnt == (offsetof(message_t, footer) + sizeof(message_radio_footer_t))) { - footer->crc = (footer->crc == crc); + } + else if (byteCnt == (offsetof(message_t, footer) + sizeof(message_radio_footer_t))) { + footer->crc = (footer->crc == crc); call PhyPacketRx.recvFooter(); } } @@ -193,11 +205,13 @@ implementation { return TOSH_DATA_LENGTH; } - command void* Packet.getPayload(message_t* msg, uint8_t* len) { - if (len != NULL) { - *len = (getHeader(msg))->length; + command void* Packet.getPayload(message_t* msg, uint8_t len) { + if (len <= TOSH_DATA_LENGTH) { + return (void*)msg->data; + } + else { + return NULL; } - return (void*)msg->data; } // Default events for radio send/receive coordinators do nothing.