]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/rf2xx/layers/ActiveMessageLayerP.nc
fix packet length calculation
[tinyos-2.x.git] / tos / chips / rf2xx / layers / ActiveMessageLayerP.nc
index c37c2bb8b9f1f8a77a15b68dd1823eedb6e345a6..a652486ebc7a1feb553d084b0b1744df5bd3d45f 100644 (file)
@@ -33,13 +33,14 @@ module ActiveMessageLayerP
                interface AMSend[am_id_t id];
                interface Receive[am_id_t id];
                interface Receive as Snoop[am_id_t id]; 
+               interface SendNotifier[am_id_t id];
        }
 
        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;
        }
@@ -47,28 +48,32 @@ 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);
                call AMPacket.setDestination(msg, addr);
 
-               return call SubSend.send(msg, len);
+               signal SendNotifier.aboutToSend[id](addr, msg);
+
+               return call SubSend.send(msg);
        }
 
        inline event void SubSend.sendDone(message_t* msg, error_t error)
@@ -87,23 +92,29 @@ 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)
+       {
        }
 
 /*----------------- 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;
        }
@@ -212,7 +223,6 @@ implementation
                call SubPacket.clear(msg);
        }
 
-
 /*----------------- Packet -----------------*/
 
        command void Packet.clear(message_t* msg)