Hi,
I have been trying to figure the problems out for days. No idea what causes
it.
I have a source receiving a packet from the base station. After the SFD is
received, a timer is called to run to make sure that the reception is
completed. The source waits for a wait_interval duration to send its data
packet. So, another timer is used for timing the transmission.
I am using AlarmToTimer component. The command startOneShot is called. What
I expect is that the source should send *only after* it receives the packet
from base station. It seems to me that the source keeps sending.
Look forward to hear from you soon.
Thanks,
Ittipong
The codes are as follows:
MyDef.h
---------------------------------------------------------------------------------------------------
#ifndef MYDEF_H_
#define MYDEF_H_
enum {
WAIT_TO_RECEIVE = 1024
};
#endif
==================================================
SourceAppC.nc
----------------------------------------------------------------------------------------------------
#include "MyDef.h"
#include "DataMsg.h"
#include "ControlMsg.h"
configuration SourceAppC {
}
implementation {
components MainC;
components ActiveMessageC;
components new AMSenderC(AM_DATAMSG) as AMSenderDataC;
components new AMReceiverC(AM_CONTROLMSG) as AMReceiverCtrlC;
components new Alarm32khz32C() as Alarm2Timer;
components new AlarmToTimerC(T32khz) as W2RTimer;
components new AlarmToTimerC(T32khz) as SendTimer;
components CC2420TransmitC;
components CC2420ActiveMessageC;
components SourceC as App;
// Wiring
App.Boot -> MainC;
App.Packet -> AMSenderDataC;
App.AMPacket -> AMSenderDataC;
App.AMSend -> AMSenderDataC;
App.Receive -> AMReceiverCtrlC;
App.AMControl -> ActiveMessageC;;
App.InitW2RTimer -> W2RTimer;
App.DataSendTimer -> SendTimer;
W2RTimer.Alarm -> Alarm2Timer;
SendTimer.Alarm -> Alarm2Timer;
App.CC2420Packet -> CC2420ActiveMessageC;
App.RadioTimeStamping -> CC2420TransmitC;
App.CC2420Transmit -> CC2420TransmitC;
}
=====================================================
SourceC.nc
----------------------------------------------------------------------------------------------------------
#include <Timer.h>
#include "MyDef.h"
#include "DataMsg.h"
#include "ControlMsg.h"
module SourceC {
uses {
interface Boot;
interface AMSend;
interface Receive;
interface AMPacket;
interface Packet;
interface Timer<T32khz> as InitW2RTimer;
interface Timer<T32khz> as DataSendTimer;
interface RadioTimeStamping;
interface SplitControl as AMControl;
interface CC2420Packet;
interface CC2420Transmit;
}
}
implementation {
message_t dpkt, cpkt;
bool sending = FALSE;
uint16_t pktseq, sentpkts;
uint8_t current_tx;
uint8_t base_addr, me;
uint32_t no_slot, slot_length, slot_start;
uint32_t wait_interval;
uint16_t rcv_no;
task void callInitW2RTimer() {
call InitW2RTimer.startOneShot(WAIT_TO_RECEIVE);
}
task void callDataSendTimer() {
call DataSendTimer.startOneShot(wait_interval);
}
event void Boot.booted() {
call AMControl.start();
}
event void AMControl.startDone(error_t err) {
if (err != SUCCESS) {
call AMControl.start();
}
}
event void AMControl.stopDone(error_t err) {
}
event void InitW2RTimer.fired() {
post callDataSendTimer();
}
event void DataSendTimer.fired() {
if (!sending) {
atomic {
DataMsg* dataMsg = (DataMsg*)(call Packet.getPayload(&dpkt,
NULL));
sentpkts++;
pktseq++;
call CC2420Packet.setPower(&dpkt, MAX_TX);
current_tx = call CC2420Packet.getPower(&dpkt);
dataMsg->pkt_type = 1;
dataMsg->source_id = me;
dataMsg->rcv_no = rcv_no;
dataMsg->tx_power = current_tx;
dataMsg->snt_no = sentpkts;
dataMsg->seq_no = pktseq;
dataMsg->slot = no_slot;
dataMsg->length = slot_length;
dataMsg->start = slot_start;
dataMsg->wait = wait_interval;
if (call AMSend.send(base_addr, &dpkt, sizeof(DataMsg)) ==
SUCCESS) {
sending = TRUE;
}
}
}
}
event void AMSend.sendDone(message_t *msg, error_t error) {
if (&dpkt == msg) {
atomic {
sending = FALSE;
}
}
}
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t
len) {
if (len == sizeof(ControlMsg)) {
atomic {
ControlMsg* controlMsg = (ControlMsg*) payload;
base_addr = controlMsg->base_id;
me = TOS_NODE_ID;
rcv_no = controlMsg->snt_no;
no_slot = controlMsg->no_alloc_slot;
slot_length = controlMsg->slot_length;
slot_start = controlMsg->slot_start;
wait_interval = (uint32_t) (((me - 1) * slot_length) +
slot_start);
}
}
return msg;
}
async event void RadioTimeStamping.transmittedSFD(uint16_t time,
message_t* p_msg) {
}
async event void RadioTimeStamping.receivedSFD(uint16_t time) {
post callInitW2RTimer();
}
async event void CC2420Transmit.sendDone(message_t* p_msg, error_t error)
{
}
}
====================================================================
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help