X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fcc2420%2FCC2420ActiveMessageP.nc;h=f3d5de3987dca244cca393046eae84d606713874;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=d6a6fbd09466c775e56b74a8b92295d260370179;hpb=12235829757689b4afb8f04001109a452d2b35d2;p=tinyos-2.x.git diff --git a/tos/chips/cc2420/CC2420ActiveMessageP.nc b/tos/chips/cc2420/CC2420ActiveMessageP.nc index d6a6fbd0..f3d5de39 100644 --- a/tos/chips/cc2420/CC2420ActiveMessageP.nc +++ b/tos/chips/cc2420/CC2420ActiveMessageP.nc @@ -1,4 +1,4 @@ -/* tab:4 +/* * "Copyright (c) 2005 Stanford University. All rights reserved. * * Permission to use, copy, modify, and distribute this software and @@ -34,7 +34,7 @@ #include "CC2420.h" -module CC2420ActiveMessageP { +module CC2420ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; @@ -53,27 +53,57 @@ module CC2420ActiveMessageP { interface CC2420Config; interface ActiveMessageAddress; interface RadioBackoff as SubBackoff; + + interface Resource as RadioResource; + interface Leds; } } implementation { + uint16_t pending_length; + message_t *pending_message = NULL; + /***************** Resource event ****************/ + event void RadioResource.granted() { + uint8_t rc; + cc2420_header_t* header = call CC2420PacketBody.getHeader( pending_message ); + + signal SendNotifier.aboutToSend[header->type](header->dest, pending_message); + rc = call SubSend.send( pending_message, pending_length ); + if (rc != SUCCESS) { + call RadioResource.release(); + signal AMSend.sendDone[header->type]( pending_message, rc ); + } + } - enum { - CC2420_SIZE = MAC_HEADER_SIZE + MAC_FOOTER_SIZE, - }; - /***************** AMSend Commands ****************/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { cc2420_header_t* header = call CC2420PacketBody.getHeader( msg ); + + if (len > call Packet.maxPayloadLength()) { + return ESIZE; + } + header->type = id; header->dest = addr; header->destpan = call CC2420Config.getPanAddr(); header->src = call AMPacket.address(); - signal SendNotifier.aboutToSend[id](addr, msg); - - return call SubSend.send( msg, len + CC2420_SIZE ); + if (call RadioResource.immediateRequest() == SUCCESS) { + error_t rc; + signal SendNotifier.aboutToSend[id](addr, msg); + + rc = call SubSend.send( msg, len ); + if (rc != SUCCESS) { + call RadioResource.release(); + } + + return rc; + } else { + pending_length = len; + pending_message = msg; + return call RadioResource.request(); + } } command error_t AMSend.cancel[am_id_t id](message_t* msg) { @@ -157,7 +187,7 @@ implementation { } command uint8_t Packet.maxPayloadLength() { - return TOSH_DATA_LENGTH; + return call SubSend.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { @@ -167,6 +197,7 @@ implementation { /***************** SubSend Events ****************/ event void SubSend.sendDone(message_t* msg, error_t result) { + call RadioResource.release(); signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } @@ -174,15 +205,11 @@ implementation { /***************** SubReceive Events ****************/ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { - if(!(call CC2420PacketBody.getMetadata(msg))->crc) { - return msg; - } - if (call AMPacket.isForMe(msg)) { - return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); + return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { - return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); + return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } @@ -199,18 +226,18 @@ implementation { /***************** RadioBackoff ***********************/ async event void SubBackoff.requestInitialBackoff(message_t *msg) { - signal RadioBackoff.requestInitialBackoff[((cc2420_header_t*)(msg->data - - sizeof(cc2420_header_t)))->type](msg); + signal RadioBackoff.requestInitialBackoff[(TCAST(cc2420_header_t* ONE, + (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCongestionBackoff(message_t *msg) { - signal RadioBackoff.requestCongestionBackoff[((cc2420_header_t*)(msg->data - - sizeof(cc2420_header_t)))->type](msg); + signal RadioBackoff.requestCongestionBackoff[(TCAST(cc2420_header_t* ONE, + (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCca(message_t *msg) { // Lower layers than this do not configure the CCA settings - signal RadioBackoff.requestCca[((cc2420_header_t*)(msg->data - - sizeof(cc2420_header_t)))->type](msg); + signal RadioBackoff.requestCca[(TCAST(cc2420_header_t* ONE, + (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async command void RadioBackoff.setInitialBackoff[am_id_t amId](uint16_t backoffTime) { @@ -234,8 +261,6 @@ implementation { async command void RadioBackoff.setCca[am_id_t amId](bool useCca) { call SubBackoff.setCca(useCca); } - - /***************** Defaults ****************/ default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { @@ -247,6 +272,7 @@ implementation { } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { + call RadioResource.release(); } default event void SendNotifier.aboutToSend[am_id_t amId](am_addr_t addr, message_t *msg) {