X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Frf2xx%2Flayers%2FIEEE154MessageLayerP.nc;h=56379e3b2d331edf97963be8a3e65270357baa89;hb=54538a754044acac23adbda11567f0e774ea1b80;hp=5d4f566cc784834edceec417ab170de9d5abc10a;hpb=e855a271834e27716a9c5d79cbf364aac22eb3bd;p=tinyos-2.x.git 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)); } }