From 54538a754044acac23adbda11567f0e774ea1b80 Mon Sep 17 00:00:00 2001 From: mmaroti Date: Thu, 9 Apr 2009 20:48:02 +0000 Subject: [PATCH] Use BareSend/BareReceive instead of Send/Receive to avoid duplication of payload handling code --- tos/chips/rf2xx/layers/ActiveMessageConfig.nc | 7 --- tos/chips/rf2xx/layers/ActiveMessageLayerC.nc | 4 +- tos/chips/rf2xx/layers/ActiveMessageLayerP.nc | 47 +++++++------- tos/chips/rf2xx/layers/DummyLayerC.nc | 8 +-- .../rf2xx/layers/IEEE154MessageLayerC.nc | 19 +++++- .../rf2xx/layers/IEEE154MessageLayerP.nc | 61 +++++++++++++++---- .../rf2xx/layers/LowPowerListeningDummyC.nc | 8 +-- .../rf2xx/layers/LowPowerListeningLayerC.nc | 10 ++- .../rf2xx/layers/LowPowerListeningLayerP.nc | 28 +++------ tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc | 42 ++++++------- tos/chips/rf2xx/layers/MessageBufferLayerC.nc | 8 +-- tos/chips/rf2xx/layers/MessageBufferLayerP.nc | 36 ++--------- tos/chips/rf2xx/layers/PacketLinkLayerC.nc | 6 +- tos/chips/rf2xx/layers/PacketLinkLayerP.nc | 23 ++----- tos/chips/rf2xx/layers/UniqueLayerC.nc | 4 +- tos/chips/rf2xx/layers/UniqueLayerP.nc | 18 ++---- tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc | 6 +- tos/chips/rf2xx/rf212/RF212ActiveMessageP.nc | 5 -- tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc | 6 +- tos/chips/rf2xx/rf230/RF230ActiveMessageP.nc | 5 -- tos/chips/rf2xx/util/BareReceive.nc | 32 ++++++++++ tos/chips/rf2xx/util/BareSend.nc | 54 ++++++++++++++++ 22 files changed, 247 insertions(+), 190 deletions(-) create mode 100644 tos/chips/rf2xx/util/BareReceive.nc create mode 100644 tos/chips/rf2xx/util/BareSend.nc diff --git a/tos/chips/rf2xx/layers/ActiveMessageConfig.nc b/tos/chips/rf2xx/layers/ActiveMessageConfig.nc index d9665af2..1de4576b 100755 --- a/tos/chips/rf2xx/layers/ActiveMessageConfig.nc +++ b/tos/chips/rf2xx/layers/ActiveMessageConfig.nc @@ -25,13 +25,6 @@ interface ActiveMessageConfig { - /** - * This command is called when the message first enters the radio stack - * via the Send.send command. This command should return TRUE if the - * packet is deffinitely not cleared, FALSE otherwise. - */ - command bool forgotToClear(message_t* msg); - /** Same as AMPacket.destination */ command am_addr_t destination(message_t* msg); diff --git a/tos/chips/rf2xx/layers/ActiveMessageLayerC.nc b/tos/chips/rf2xx/layers/ActiveMessageLayerC.nc index 29c6d944..5404beca 100755 --- a/tos/chips/rf2xx/layers/ActiveMessageLayerC.nc +++ b/tos/chips/rf2xx/layers/ActiveMessageLayerC.nc @@ -37,8 +37,8 @@ configuration ActiveMessageLayerC uses { interface RadioPacket as SubPacket; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface ActiveMessageConfig as Config; } } diff --git a/tos/chips/rf2xx/layers/ActiveMessageLayerP.nc b/tos/chips/rf2xx/layers/ActiveMessageLayerP.nc index e8035717..1f9cb5ec 100644 --- a/tos/chips/rf2xx/layers/ActiveMessageLayerP.nc +++ b/tos/chips/rf2xx/layers/ActiveMessageLayerP.nc @@ -39,8 +39,8 @@ module ActiveMessageLayerP uses { interface RadioPacket as SubPacket; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface ActiveMessageConfig as Config; interface ActiveMessageAddress; } @@ -48,22 +48,24 @@ module ActiveMessageLayerP implementation { - activemessage_header_t* getHeader(message_t* msg) { return ((void*)msg) + call SubPacket.headerLength(msg); } + void* getPayload(message_t* msg) + { + return ((void*)msg) + call RadioPacket.headerLength(msg); + } + /*----------------- Send -----------------*/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { - if( call Config.forgotToClear(msg) ) - { - // return FAIL; - call Packet.clear(msg); - } + if( len > call Packet.maxPayloadLength() ) + return EINVAL; + call Packet.setPayloadLength(msg, len); call AMPacket.setSource(msg, call AMPacket.address()); call AMPacket.setGroup(msg, call AMPacket.localGroup()); call AMPacket.setType(msg, id); @@ -71,7 +73,7 @@ implementation signal SendNotifier.aboutToSend[id](addr, msg); - return call SubSend.send(msg, len); + return call SubSend.send(msg); } inline event void SubSend.sendDone(message_t* msg, error_t error) @@ -90,12 +92,12 @@ implementation inline command uint8_t AMSend.maxPayloadLength[am_id_t id]() { - return call SubSend.maxPayloadLength(); + return call Packet.maxPayloadLength(); } inline command void* AMSend.getPayload[am_id_t id](message_t* msg, uint8_t len) { - return call SubSend.getPayload(msg, len); + return call Packet.getPayload(msg, len); } default event void SendNotifier.aboutToSend[am_id_t id](am_addr_t addr, message_t* msg) @@ -104,13 +106,15 @@ implementation /*----------------- Receive -----------------*/ - event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) + event message_t* SubReceive.receive(message_t* msg) { - am_id_t type = call AMPacket.type(msg); + am_id_t id = call AMPacket.type(msg); + void* payload = getPayload(msg); + uint8_t len = call Packet.payloadLength(msg); msg = call AMPacket.isForMe(msg) - ? signal Receive.receive[type](msg, payload, len) - : signal Snoop.receive[type](msg, payload, len); + ? signal Receive.receive[id](msg, payload, len) + : signal Snoop.receive[id](msg, payload, len); return msg; } @@ -219,34 +223,33 @@ implementation call SubPacket.clear(msg); } - /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { - call RadioPacket.clear(msg); + call SubPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { - return call RadioPacket.payloadLength(msg); + return call SubPacket.payloadLength(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { - call RadioPacket.setPayloadLength(msg, len); + call SubPacket.setPayloadLength(msg, len); } command uint8_t Packet.maxPayloadLength() { - return call RadioPacket.maxPayloadLength(); + return call SubPacket.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { - if( len > call RadioPacket.maxPayloadLength() ) + if( len > call SubPacket.maxPayloadLength() ) return NULL; - return ((void*)msg) + call RadioPacket.headerLength(msg); + return ((void*)msg) + call SubPacket.headerLength(msg); } } diff --git a/tos/chips/rf2xx/layers/DummyLayerC.nc b/tos/chips/rf2xx/layers/DummyLayerC.nc index a595974b..1c71a9aa 100644 --- a/tos/chips/rf2xx/layers/DummyLayerC.nc +++ b/tos/chips/rf2xx/layers/DummyLayerC.nc @@ -26,8 +26,8 @@ generic configuration DummyLayerC() provides { interface SplitControl; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioState; interface RadioSend; @@ -41,8 +41,8 @@ generic configuration DummyLayerC() uses { interface SplitControl as SubControl; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface RadioState as SubState; interface RadioSend as SubRadioSend; diff --git a/tos/chips/rf2xx/layers/IEEE154MessageLayerC.nc b/tos/chips/rf2xx/layers/IEEE154MessageLayerC.nc index ff23c69c..8c93f429 100644 --- a/tos/chips/rf2xx/layers/IEEE154MessageLayerC.nc +++ b/tos/chips/rf2xx/layers/IEEE154MessageLayerC.nc @@ -27,16 +27,25 @@ configuration IEEE154MessageLayerC { interface IEEE154MessageLayer; interface RadioPacket; + + // for passthrough wiring + interface BareSend as Send; + + // for gateway wiring interface Ieee154Packet; interface Packet; interface Ieee154Send; + interface Receive as Ieee154Receive; interface SendNotifier; } uses { interface RadioPacket as SubPacket; - interface Send as SubSend; + interface BareSend as SubSend; + + // for gateway wiring + interface BareReceive as SubReceive; } } @@ -48,9 +57,15 @@ implementation IEEE154MessageLayer = IEEE154MessageLayerP; RadioPacket = IEEE154MessageLayerP; SubPacket = IEEE154MessageLayerP; + + // for passthrough + Send = IEEE154MessageLayerP; + SubSend = IEEE154MessageLayerP; + Ieee154Packet = IEEE154MessageLayerP; Packet = IEEE154MessageLayerP; Ieee154Send = IEEE154MessageLayerP; - SubSend = IEEE154MessageLayerP; + Ieee154Receive = IEEE154MessageLayerP; + SubReceive = IEEE154MessageLayerP; SendNotifier = IEEE154MessageLayerP; } diff --git a/tos/chips/rf2xx/layers/IEEE154MessageLayerP.nc b/tos/chips/rf2xx/layers/IEEE154MessageLayerP.nc index 5d4f566c..56379e3b 100644 --- a/tos/chips/rf2xx/layers/IEEE154MessageLayerP.nc +++ b/tos/chips/rf2xx/layers/IEEE154MessageLayerP.nc @@ -32,6 +32,8 @@ module IEEE154MessageLayerP interface Ieee154Packet; interface Packet; interface Ieee154Send; + interface BareSend as Send; + interface Receive as Ieee154Receive; interface SendNotifier; } @@ -39,7 +41,8 @@ module IEEE154MessageLayerP { interface ActiveMessageAddress; interface RadioPacket as SubPacket; - interface Send as SubSend; + interface BareSend as SubSend; + interface BareReceive as SubReceive; } } @@ -69,6 +72,11 @@ implementation return ((void*)msg) + call SubPacket.headerLength(msg); } + void* getPayload(message_t* msg) + { + return ((void*)msg) + call RadioPacket.headerLength(msg); + } + async command uint16_t IEEE154MessageLayer.getFCF(message_t* msg) { return getHeader(msg)->fcf; @@ -179,7 +187,7 @@ implementation } async command void IEEE154MessageLayer.setSrcAddr(message_t* msg, uint16_t addr) - { + { getHeader(msg)->src = addr; } @@ -279,7 +287,6 @@ implementation async command void RadioPacket.clear(message_t* msg) { call SubPacket.clear(msg); - call IEEE154MessageLayer.createDataFrame(msg); } /*----------------- Packet -----------------*/ @@ -309,7 +316,7 @@ implementation if( len > call RadioPacket.maxPayloadLength() ) return NULL; - return ((void*)msg) + call RadioPacket.headerLength(msg); + return getPayload(msg); } /*----------------- Ieee154Send -----------------*/ @@ -331,27 +338,59 @@ implementation command error_t Ieee154Send.send(ieee154_saddr_t addr, message_t* msg, uint8_t len) { - ieee154_header_t* header = getHeader(msg); + if( len > call Packet.maxPayloadLength() ) + return EINVAL; - header->dest = addr; - header->destpan = call Ieee154Packet.localPan(); - header->src = call Ieee154Packet.address(); + call IEEE154MessageLayer.createDataFrame(msg); + call Packet.setPayloadLength(msg, len); + call Ieee154Packet.setSource(msg, call Ieee154Packet.address()); + call Ieee154Packet.setDestination(msg, addr); + call Ieee154Packet.setPan(msg, call Ieee154Packet.localPan()); signal SendNotifier.aboutToSend(addr, msg); - return call SubSend.send(msg, len); + return call SubSend.send(msg); + } + + default event void Ieee154Send.sendDone(message_t* msg, error_t error) + { + } + + default event void SendNotifier.aboutToSend(am_addr_t addr, message_t* msg) + { + } + +/*----------------- Send -----------------*/ + + command error_t Send.send(message_t* msg) + { + // lower leveles can send other frames + call IEEE154MessageLayer.createDataFrame(msg); + + return call SubSend.send(msg); + } + + command error_t Send.cancel(message_t* msg) + { + return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t error) { + // we signal both, only one of them should be connected signal Ieee154Send.sendDone(msg, error); + signal Send.sendDone(msg, error); } - default event void Ieee154Send.sendDone(message_t* msg, error_t error) + default event void Send.sendDone(message_t* msg, error_t error) { } - default event void SendNotifier.aboutToSend(am_addr_t addr, message_t* msg) +/*----------------- Receive -----------------*/ + + event message_t* SubReceive.receive(message_t* msg) { + return signal Ieee154Receive.receive(msg, + getPayload(msg), call Packet.payloadLength(msg)); } } diff --git a/tos/chips/rf2xx/layers/LowPowerListeningDummyC.nc b/tos/chips/rf2xx/layers/LowPowerListeningDummyC.nc index 816710ec..163dc8a1 100644 --- a/tos/chips/rf2xx/layers/LowPowerListeningDummyC.nc +++ b/tos/chips/rf2xx/layers/LowPowerListeningDummyC.nc @@ -26,8 +26,8 @@ configuration LowPowerListeningDummyC provides { interface SplitControl; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; @@ -35,8 +35,8 @@ configuration LowPowerListeningDummyC uses { interface SplitControl as SubControl; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface RadioPacket as SubPacket; } } diff --git a/tos/chips/rf2xx/layers/LowPowerListeningLayerC.nc b/tos/chips/rf2xx/layers/LowPowerListeningLayerC.nc index f6161678..76f0a9a2 100644 --- a/tos/chips/rf2xx/layers/LowPowerListeningLayerC.nc +++ b/tos/chips/rf2xx/layers/LowPowerListeningLayerC.nc @@ -21,15 +21,13 @@ * Author: Miklos Maroti */ -#warning "*** USING LOW POWER LISTENING LAYER" - configuration LowPowerListeningLayerC { provides { interface SplitControl; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; @@ -37,8 +35,8 @@ configuration LowPowerListeningLayerC uses { interface SplitControl as SubControl; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface RadioPacket as SubPacket; interface LowPowerListeningConfig as Config; diff --git a/tos/chips/rf2xx/layers/LowPowerListeningLayerP.nc b/tos/chips/rf2xx/layers/LowPowerListeningLayerP.nc index eae77f1b..0b172040 100644 --- a/tos/chips/rf2xx/layers/LowPowerListeningLayerP.nc +++ b/tos/chips/rf2xx/layers/LowPowerListeningLayerP.nc @@ -29,8 +29,8 @@ module LowPowerListeningLayerP provides { interface SplitControl; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; @@ -39,8 +39,8 @@ module LowPowerListeningLayerP uses { interface SplitControl as SubControl; - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface RadioPacket as SubPacket; interface PacketAcknowledgements; @@ -70,7 +70,6 @@ implementation uint16_t sleepInterval; message_t* txMsg; - uint8_t txLen; error_t txError; /*----------------- state machine -----------------*/ @@ -172,7 +171,7 @@ implementation } else if( state == SEND_SUBSEND) { - txError = call SubSend.send(txMsg, txLen); + txError = call SubSend.send(txMsg); if( txError == SUCCESS ) state = SEND_SUBSEND_DONE; @@ -269,7 +268,7 @@ implementation post transition(); } - event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) + event message_t* SubReceive.receive(message_t* msg) { if( state == SLEEP_SUBSTOP ) state = LISTEN; @@ -277,10 +276,10 @@ implementation if( state == LISTEN && sleepInterval > 0 ) call Timer.startOneShot(AFTER_RECEIVE); - return signal Receive.receive(msg, payload, len); + return signal Receive.receive(msg); } - command error_t Send.send(message_t* msg, uint8_t len) + command error_t Send.send(message_t* msg) { if( state == LISTEN || state == SLEEP ) { @@ -298,7 +297,6 @@ implementation return EBUSY; txMsg = msg; - txLen = len; txError = FAIL; return SUCCESS; @@ -348,16 +346,6 @@ implementation post transition(); } - command uint8_t Send.maxPayloadLength() - { - return call SubSend.maxPayloadLength(); - } - - command void* Send.getPayload(message_t* msg, uint8_t len) - { - return call SubSend.getPayload(msg, len); - } - /*----------------- LowPowerListening -----------------*/ lpl_metadata_t* getMeta(message_t* msg) diff --git a/tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc b/tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc index 4f9a22e2..027ce10d 100644 --- a/tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc +++ b/tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc @@ -27,8 +27,8 @@ module LowpanNetworkLayerC { provides { - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioPacket; interface Receive as NonTinyosReceive[uint8_t network]; @@ -36,56 +36,52 @@ module LowpanNetworkLayerC uses { - interface Send as SubSend; - interface Receive as SubReceive; + interface BareSend as SubSend; + interface BareReceive as SubReceive; interface RadioPacket as SubPacket; } } implementation { -#ifndef TINYOS_6LOWPAN_NETWORK_ID -#define TINYOS_6LOWPAN_NETWORK_ID 0x3f -#endif - lowpan_header_t* getHeader(message_t* msg) { return ((void*)msg) + call SubPacket.headerLength(msg); } - command error_t Send.send(message_t* msg, uint8_t len) + void* getPayload(message_t* msg) { - getHeader(msg)->network = TINYOS_6LOWPAN_NETWORK_ID; - return call SubSend.send(msg, len); + return ((void*)msg) + call RadioPacket.headerLength(msg); } - command error_t Send.cancel(message_t* msg) - { - return call SubSend.cancel(msg); - } +#ifndef TINYOS_6LOWPAN_NETWORK_ID +#define TINYOS_6LOWPAN_NETWORK_ID 0x3f +#endif - command uint8_t Send.maxPayloadLength() + command error_t Send.send(message_t* msg) { - return call SubSend.maxPayloadLength(); + getHeader(msg)->network = TINYOS_6LOWPAN_NETWORK_ID; + return call SubSend.send(msg); } - command void* Send.getPayload(message_t* msg, uint8_t len) + command error_t Send.cancel(message_t* msg) { - return call SubSend.getPayload(msg, len); + return call SubSend.cancel(msg); } - + event void SubSend.sendDone(message_t* msg, error_t error) { signal Send.sendDone(msg, error); } - event message_t *SubReceive.receive(message_t *msg, void *payload, uint8_t len) + event message_t *SubReceive.receive(message_t *msg) { uint8_t network = getHeader(msg)->network; if( network == TINYOS_6LOWPAN_NETWORK_ID ) - return signal Receive.receive(msg, payload, len); + return signal Receive.receive(msg); else - return signal NonTinyosReceive.receive[network](msg, payload, len); + return signal NonTinyosReceive.receive[network](msg, + getPayload(msg), call RadioPacket.payloadLength(msg)); } default event message_t *NonTinyosReceive.receive[uint8_t network](message_t *msg, void *payload, uint8_t len) diff --git a/tos/chips/rf2xx/layers/MessageBufferLayerC.nc b/tos/chips/rf2xx/layers/MessageBufferLayerC.nc index 90402c35..5ef76447 100644 --- a/tos/chips/rf2xx/layers/MessageBufferLayerC.nc +++ b/tos/chips/rf2xx/layers/MessageBufferLayerC.nc @@ -26,8 +26,8 @@ configuration MessageBufferLayerC provides { interface SplitControl; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioChannel; } uses @@ -35,8 +35,6 @@ configuration MessageBufferLayerC interface RadioState; interface RadioSend; interface RadioReceive; - - interface Packet; } } @@ -55,6 +53,4 @@ implementation MessageBufferLayerP.Tasklet -> TaskletC; RadioSend = MessageBufferLayerP; RadioReceive = MessageBufferLayerP; - - Packet = MessageBufferLayerP; } diff --git a/tos/chips/rf2xx/layers/MessageBufferLayerP.nc b/tos/chips/rf2xx/layers/MessageBufferLayerP.nc index 374edaad..224d2e24 100644 --- a/tos/chips/rf2xx/layers/MessageBufferLayerP.nc +++ b/tos/chips/rf2xx/layers/MessageBufferLayerP.nc @@ -31,8 +31,8 @@ module MessageBufferLayerP interface SplitControl; interface Init as SoftwareInit; - interface Send; - interface Receive; + interface BareSend as Send; + interface BareReceive as Receive; interface RadioChannel; } uses @@ -41,8 +41,6 @@ module MessageBufferLayerP interface Tasklet; interface RadioSend; interface RadioReceive; - - interface Packet; } } @@ -208,15 +206,11 @@ implementation post sendTask(); } - command error_t Send.send(message_t* msg, uint8_t len) + command error_t Send.send(message_t* msg) { - if( len > call Packet.maxPayloadLength() ) - return EINVAL; - else if( state != STATE_READY ) + if( state != STATE_READY ) return EBUSY; - call Packet.setPayloadLength(msg, len); - txMsg = msg; state = STATE_TX_PENDING; retries = 0; @@ -250,20 +244,6 @@ implementation return FAIL; } - default event void Send.sendDone(message_t* msg, error_t error) - { - } - - inline command uint8_t Send.maxPayloadLength() - { - return call Packet.maxPayloadLength(); - } - - inline command void* Send.getPayload(message_t* msg, uint8_t len) - { - return call Packet.getPayload(msg, len); - } - /*----------------- Receive -----------------*/ enum @@ -312,9 +292,7 @@ implementation msg = receiveQueue[receiveQueueHead]; } - msg = signal Receive.receive(msg, - call Packet.getPayload(msg, call Packet.maxPayloadLength()), - call Packet.payloadLength(msg)); + msg = signal Receive.receive(msg); atomic { @@ -353,8 +331,4 @@ implementation return m; } - default event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) - { - return msg; - } } diff --git a/tos/chips/rf2xx/layers/PacketLinkLayerC.nc b/tos/chips/rf2xx/layers/PacketLinkLayerC.nc index fb65fe60..efd5a0c5 100644 --- a/tos/chips/rf2xx/layers/PacketLinkLayerC.nc +++ b/tos/chips/rf2xx/layers/PacketLinkLayerC.nc @@ -59,17 +59,15 @@ #include -#warning "*** USING PACKET LINK LAYER" - configuration PacketLinkLayerC { provides { - interface Send; + interface BareSend as Send; interface PacketLink; interface RadioPacket; } uses { - interface Send as SubSend; + interface BareSend as SubSend; interface RadioPacket as SubPacket; interface PacketAcknowledgements; } diff --git a/tos/chips/rf2xx/layers/PacketLinkLayerP.nc b/tos/chips/rf2xx/layers/PacketLinkLayerP.nc index 1bf501f2..b8f284e6 100644 --- a/tos/chips/rf2xx/layers/PacketLinkLayerP.nc +++ b/tos/chips/rf2xx/layers/PacketLinkLayerP.nc @@ -61,13 +61,13 @@ module PacketLinkLayerP { provides { - interface Send; + interface BareSend as Send; interface PacketLink; interface RadioPacket; } uses { - interface Send as SubSend; + interface BareSend as SubSend; interface PacketAcknowledgements; interface Timer as DelayTimer; interface RadioPacket as SubPacket; @@ -79,9 +79,6 @@ implementation { /** The message currently being sent */ message_t *currentSendMsg; - /** Length of the current send message */ - uint8_t currentSendLen; - /** The length of the current send message */ uint16_t totalRetries; @@ -146,7 +143,7 @@ implementation { * a broadcast address message, the receiving end does not * signal receive() more than once for that message. */ - command error_t Send.send(message_t *msg, uint8_t len) { + command error_t Send.send(message_t *msg) { error_t error = EBUSY; if(currentSendMsg == NULL) { @@ -154,9 +151,8 @@ implementation { call PacketAcknowledgements.requestAck(msg); } - if((error = call SubSend.send(msg, len)) == SUCCESS) { + if((error = call SubSend.send(msg)) == SUCCESS) { currentSendMsg = msg; - currentSendLen = len; totalRetries = 0; } } @@ -172,15 +168,6 @@ implementation { return FAIL; } - - command uint8_t Send.maxPayloadLength() { - return call SubSend.maxPayloadLength(); - } - - command void *Send.getPayload(message_t* msg, uint8_t len) { - return call SubSend.getPayload(msg, len); - } - /***************** SubSend Events ***************/ event void SubSend.sendDone(message_t* msg, error_t error) { totalRetries++; @@ -222,7 +209,7 @@ implementation { call PacketAcknowledgements.requestAck(currentSendMsg); } - if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { + if(call SubSend.send(currentSendMsg) != SUCCESS) { post send(); } } diff --git a/tos/chips/rf2xx/layers/UniqueLayerC.nc b/tos/chips/rf2xx/layers/UniqueLayerC.nc index 5d2e5f23..e5333893 100755 --- a/tos/chips/rf2xx/layers/UniqueLayerC.nc +++ b/tos/chips/rf2xx/layers/UniqueLayerC.nc @@ -26,12 +26,12 @@ configuration UniqueLayerC provides { // NOTE, this is a combined layer, should be hooked up at two places - interface Send; + interface BareSend as Send; interface RadioReceive; } uses { - interface Send as SubSend; + interface BareSend as SubSend; interface RadioReceive as SubReceive; interface UniqueConfig as Config; diff --git a/tos/chips/rf2xx/layers/UniqueLayerP.nc b/tos/chips/rf2xx/layers/UniqueLayerP.nc index d341942e..121139db 100755 --- a/tos/chips/rf2xx/layers/UniqueLayerP.nc +++ b/tos/chips/rf2xx/layers/UniqueLayerP.nc @@ -28,7 +28,7 @@ module UniqueLayerP { provides { - interface Send; + interface BareSend as Send; interface RadioReceive; interface Init; @@ -36,7 +36,7 @@ module UniqueLayerP uses { - interface Send as SubSend; + interface BareSend as SubSend; interface RadioReceive as SubReceive; interface UniqueConfig; @@ -55,10 +55,10 @@ implementation return SUCCESS; } - command error_t Send.send(message_t* msg, uint8_t len) + command error_t Send.send(message_t* msg) { call UniqueConfig.setSequenceNumber(msg, ++sequenceNumber); - return call SubSend.send(msg, len); + return call SubSend.send(msg); } command error_t Send.cancel(message_t* msg) @@ -71,16 +71,6 @@ implementation signal Send.sendDone(msg, error); } - command uint8_t Send.maxPayloadLength() - { - return call SubSend.maxPayloadLength(); - } - - command void* Send.getPayload(message_t* msg, uint8_t len) - { - return call SubSend.getPayload(msg, len); - } - tasklet_async event bool SubReceive.header(message_t* msg) { // we could scan here, but better be lazy diff --git a/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc b/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc index e75824e5..46ef3b44 100644 --- a/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc +++ b/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc @@ -90,7 +90,7 @@ implementation #else components LowpanNetworkLayerC; #endif - LowpanNetworkLayerC.SubSend -> UniqueLayerC; + LowpanNetworkLayerC.SubSend -> IEEE154MessageLayerC; LowpanNetworkLayerC.SubReceive -> LowPowerListeningLayerC; LowpanNetworkLayerC.SubPacket -> IEEE154MessageLayerC; @@ -98,6 +98,7 @@ implementation components IEEE154MessageLayerC; IEEE154MessageLayerC.SubPacket -> LowPowerListeningLayerC; + IEEE154MessageLayerC.SubSend -> UniqueLayerC; // -------- UniqueLayer Send part (wired twice) @@ -108,6 +109,7 @@ implementation // -------- Low Power Listening #ifdef LOW_POWER_LISTENING + #warning "*** USING LOW POWER LISTENING LAYER" components LowPowerListeningLayerC; LowPowerListeningLayerC.Config -> RF212ActiveMessageP; LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; @@ -124,6 +126,7 @@ implementation // -------- Packet Link #ifdef PACKET_LINK + #warning "*** USING PACKET LINK LAYER" components PacketLinkLayerC; PacketLink = PacketLinkLayerC; PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; @@ -136,7 +139,6 @@ implementation // -------- MessageBuffer components MessageBufferLayerC; - MessageBufferLayerC.Packet -> ActiveMessageLayerC; MessageBufferLayerC.RadioSend -> TrafficMonitorLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; diff --git a/tos/chips/rf2xx/rf212/RF212ActiveMessageP.nc b/tos/chips/rf2xx/rf212/RF212ActiveMessageP.nc index 27dff12c..86e74556 100644 --- a/tos/chips/rf2xx/rf212/RF212ActiveMessageP.nc +++ b/tos/chips/rf2xx/rf212/RF212ActiveMessageP.nc @@ -152,11 +152,6 @@ implementation /*----------------- ActiveMessageConfig -----------------*/ - command bool ActiveMessageConfig.forgotToClear(message_t* msg) - { - return ! call IEEE154MessageLayer.isDataFrame(msg); - } - command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call IEEE154MessageLayer.getDestAddr(msg); diff --git a/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc b/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc index 4c9ab95d..deb5412b 100644 --- a/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc +++ b/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc @@ -90,7 +90,7 @@ implementation #else components LowpanNetworkLayerC; #endif - LowpanNetworkLayerC.SubSend -> UniqueLayerC; + LowpanNetworkLayerC.SubSend -> IEEE154MessageLayerC; LowpanNetworkLayerC.SubReceive -> LowPowerListeningLayerC; LowpanNetworkLayerC.SubPacket -> IEEE154MessageLayerC; @@ -98,6 +98,7 @@ implementation components IEEE154MessageLayerC; IEEE154MessageLayerC.SubPacket -> LowPowerListeningLayerC; + IEEE154MessageLayerC.SubSend -> UniqueLayerC; // -------- UniqueLayer Send part (wired twice) @@ -108,6 +109,7 @@ implementation // -------- Low Power Listening #ifdef LOW_POWER_LISTENING + #warning "*** USING LOW POWER LISTENING LAYER" components LowPowerListeningLayerC; LowPowerListeningLayerC.Config -> RF230ActiveMessageP; LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; @@ -124,6 +126,7 @@ implementation // -------- Packet Link #ifdef PACKET_LINK + #warning "*** USING PACKET LINK LAYER" components PacketLinkLayerC; PacketLink = PacketLinkLayerC; PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; @@ -136,7 +139,6 @@ implementation // -------- MessageBuffer components MessageBufferLayerC; - MessageBufferLayerC.Packet -> ActiveMessageLayerC; MessageBufferLayerC.RadioSend -> TrafficMonitorLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; diff --git a/tos/chips/rf2xx/rf230/RF230ActiveMessageP.nc b/tos/chips/rf2xx/rf230/RF230ActiveMessageP.nc index 57fa1c22..7758d865 100644 --- a/tos/chips/rf2xx/rf230/RF230ActiveMessageP.nc +++ b/tos/chips/rf2xx/rf230/RF230ActiveMessageP.nc @@ -152,11 +152,6 @@ implementation /*----------------- ActiveMessageConfig -----------------*/ - command bool ActiveMessageConfig.forgotToClear(message_t* msg) - { - return ! call IEEE154MessageLayer.isDataFrame(msg); - } - command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call IEEE154MessageLayer.getDestAddr(msg); diff --git a/tos/chips/rf2xx/util/BareReceive.nc b/tos/chips/rf2xx/util/BareReceive.nc new file mode 100644 index 00000000..5a6efc7c --- /dev/null +++ b/tos/chips/rf2xx/util/BareReceive.nc @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2009, Vanderbilt University + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT + * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Author: Miklos Maroti + */ + +interface BareReceive +{ + /** + * Signals the reception of a message, but only for those messages for + * which SUCCESS was returned in the header event. The usual owner rules + * apply to the message pointers. + */ + event message_t* receive(message_t* msg); +} diff --git a/tos/chips/rf2xx/util/BareSend.nc b/tos/chips/rf2xx/util/BareSend.nc new file mode 100644 index 00000000..29a398de --- /dev/null +++ b/tos/chips/rf2xx/util/BareSend.nc @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2009, Vanderbilt University + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT + * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Author: Miklos Maroti + */ + +interface BareSend +{ + /** + * Starts the transmission of the given message. This command must not + * be called while another send is in progress (so one must wait for the + * sendDone event). Returns EBUSY if a reception is in progress or for + * some other reason the request cannot be temporarily satisfied (e.g. + * the SPI bus access could not be acquired). In this case the send + * command could be retried from a task. Returns SUCCESS if the + * transmission could be started. In this case sendDone will be fired. + */ + command error_t send(message_t* msg); + + /** + * Signals the completion of the send command, exactly once for each + * successfull send command. If the returned error code is SUCCESS, then + * the message was sent (may not have been acknowledged), otherwise + * the message was not transmitted over the air. + */ + event void sendDone(message_t* msg, error_t error); + + /** + * Cancel a requested transmission. Returns SUCCESS if the + * transmission was cancelled properly (not sent in its + * entirety). Note that the component may not know + * if the send was successfully cancelled, if the radio is + * handling much of the logic; in this case, a component + * should be conservative and return an appropriate error code. + */ + command error_t cancel(message_t* msg); +} -- 2.39.2