interface Ieee154Packet;
interface Packet;
interface Ieee154Send;
+ interface BareSend as Send;
+ interface Receive as Ieee154Receive;
interface SendNotifier;
}
{
interface ActiveMessageAddress;
interface RadioPacket as SubPacket;
- interface Send as SubSend;
+ interface BareSend as SubSend;
+ interface BareReceive as SubReceive;
}
}
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;
}
async command void IEEE154MessageLayer.setSrcAddr(message_t* msg, uint16_t addr)
- {
+ {
getHeader(msg)->src = addr;
}
async command void RadioPacket.clear(message_t* msg)
{
call SubPacket.clear(msg);
- call IEEE154MessageLayer.createDataFrame(msg);
}
/*----------------- Packet -----------------*/
if( len > call RadioPacket.maxPayloadLength() )
return NULL;
- return ((void*)msg) + call RadioPacket.headerLength(msg);
+ return getPayload(msg);
}
/*----------------- Ieee154Send -----------------*/
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));
}
}