X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fcc2420%2FCC2420ActiveMessageP.nc;h=0db2423c7b83167d7bf41b4797e85c117b52cb8f;hb=aa7578fd1472c62c1d22d0801fe0f55b36093bdf;hp=45a245f49288b17f35d0f4f3e10e007bf1fcd28e;hpb=121da1045cafe46d32ab8ecf87a98fe19430462c;p=tinyos-2.x.git diff --git a/tos/chips/cc2420/CC2420ActiveMessageP.nc b/tos/chips/cc2420/CC2420ActiveMessageP.nc index 45a245f4..0db2423c 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,37 +34,47 @@ #include "CC2420.h" -module CC2420ActiveMessageP { +module CC2420ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; + interface SendNotifier[am_id_t id]; + interface RadioBackoff[am_id_t id]; } + uses { interface Send as SubSend; interface Receive as SubReceive; interface CC2420Packet; - command am_addr_t amAddress(); + interface CC2420PacketBody; + interface CC2420Config; + interface ActiveMessageAddress; + interface RadioBackoff as SubBackoff; } } implementation { - 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 CC2420Packet.getHeader( msg ); + cc2420_header_t* header = call CC2420PacketBody.getHeader( msg ); + + if (len > call Packet.maxPayloadLength()) { + return ESIZE; + } + header->type = id; header->dest = addr; - header->destpan = TOS_AM_GROUP; - - return call SubSend.send( msg, len + CC2420_SIZE ); + header->destpan = call CC2420Config.getPanAddr(); + header->src = call AMPacket.address(); + + signal SendNotifier.aboutToSend[id](addr, msg); + + return call SubSend.send( msg, len ); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { @@ -75,62 +85,32 @@ implementation { return call Packet.maxPayloadLength(); } - command void* AMSend.getPayload[am_id_t id](message_t* m) { - return call Packet.getPayload(m, NULL); - } - - command void* Receive.getPayload[am_id_t id](message_t* m, uint8_t* len) { - return call Packet.getPayload(m, len); - } - - command uint8_t Receive.payloadLength[am_id_t id](message_t* m) { - return call Packet.payloadLength(m); - } - - command void* Snoop.getPayload[am_id_t id](message_t* m, uint8_t* len) { + command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } - command uint8_t Snoop.payloadLength[am_id_t id](message_t* m) { - return call Packet.payloadLength(m); - } - - event void SubSend.sendDone(message_t* msg, error_t result) { - signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); - } - - /* Receiving a packet */ - - event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { - if (call AMPacket.isForMe(msg)) { - return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); - } - else { - return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); - } - } - + /***************** AMPacket Commands ****************/ command am_addr_t AMPacket.address() { - return call amAddress(); + return call ActiveMessageAddress.amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->src; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->src = addr; } @@ -140,49 +120,148 @@ implementation { } command am_id_t AMPacket.type(message_t* amsg) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { - cc2420_header_t* header = call CC2420Packet.getHeader(amsg); + cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->type = type; } + + command am_group_t AMPacket.group(message_t* amsg) { + return (call CC2420PacketBody.getHeader(amsg))->destpan; + } - default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { - return msg; + command void AMPacket.setGroup(message_t* amsg, am_group_t grp) { + // Overridden intentionally when we send() + (call CC2420PacketBody.getHeader(amsg))->destpan = grp; + } + + command am_group_t AMPacket.localGroup() { + return call CC2420Config.getPanAddr(); } - default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { - return msg; + + /***************** Packet Commands ****************/ + command void Packet.clear(message_t* msg) { + memset(call CC2420PacketBody.getHeader(msg), 0x0, sizeof(cc2420_header_t)); + memset(call CC2420PacketBody.getMetadata(msg), 0x0, sizeof(cc2420_metadata_t)); + } + + command uint8_t Packet.payloadLength(message_t* msg) { + return (call CC2420PacketBody.getHeader(msg))->length - CC2420_SIZE; + } + + command void Packet.setPayloadLength(message_t* msg, uint8_t len) { + (call CC2420PacketBody.getHeader(msg))->length = len + CC2420_SIZE; + } + + command uint8_t Packet.maxPayloadLength() { + return TOSH_DATA_LENGTH; + } + + command void* Packet.getPayload(message_t* msg, uint8_t len) { + return call SubSend.getPayload(msg, len); } - default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { - return; - } + + /***************** SubSend Events ****************/ + event void SubSend.sendDone(message_t* msg, error_t result) { + signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); + } - - command void Packet.clear(message_t* msg) {} - - command uint8_t Packet.payloadLength(message_t* msg) { - return (call CC2420Packet.getHeader(msg))->length - CC2420_SIZE; - } + + /***************** 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); + } + else { + return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); + } + } + + /***************** ActiveMessageAddress Events ****************/ + async event void ActiveMessageAddress.changed() { + } + + /***************** CC2420Config Events ****************/ + event void CC2420Config.syncDone( error_t error ) { + } + + + /***************** RadioBackoff ***********************/ - command void Packet.setPayloadLength(message_t* msg, uint8_t len) { - (call CC2420Packet.getHeader(msg))->length = len + CC2420_SIZE; - } + async event void SubBackoff.requestInitialBackoff(message_t *msg) { + signal RadioBackoff.requestInitialBackoff[(TCAST(cc2420_header_t* ONE, + (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); + } - command uint8_t Packet.maxPayloadLength() { - return TOSH_DATA_LENGTH; - } - - command void* Packet.getPayload(message_t* msg, uint8_t* len) { - if (len != NULL) { - *len = call Packet.payloadLength(msg); - } - return msg->data; - } + async event void SubBackoff.requestCongestionBackoff(message_t *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[(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) { + call SubBackoff.setInitialBackoff(backoffTime); + } + + /** + * Must be called within a requestCongestionBackoff event + * @param backoffTime the amount of time in some unspecified units to backoff + */ + async command void RadioBackoff.setCongestionBackoff[am_id_t amId](uint16_t backoffTime) { + call SubBackoff.setCongestionBackoff(backoffTime); + } + + + /** + * Enable CCA for the outbound packet. Must be called within a requestCca + * event + * @param ccaOn TRUE to enable CCA, which is the default. + */ + 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) { + return msg; + } + + default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { + } + default event void SendNotifier.aboutToSend[am_id_t amId](am_addr_t addr, message_t *msg) { + } + default async event void RadioBackoff.requestInitialBackoff[am_id_t id]( + message_t *msg) { + } + + default async event void RadioBackoff.requestCongestionBackoff[am_id_t id]( + message_t *msg) { + } + + default async event void RadioBackoff.requestCca[am_id_t id]( + message_t *msg) { + } + }