Umm. I can start the timer from receive() event now. I misplaced the call
statement. Stupid mistake, really!!!

Thanks,
Ittipong


2009/4/23 Ittipong Khemapech <[email protected]>

> I start the timer within the receive() event and *nothing* happens. No
> packet is transmitted by the source. I'm pretty sure that the radio is on at
> that time.
>
> I posted this problem several weeks ago and still got no reply. That's why
> I have to use the InitW2RTimer and it's started in the receivedSFD() event.
>
> Anybody got the same experience?
>
> Thanks,
> Ittipong
>
>
> 2009/4/21 Ittipong Khemapech <[email protected]>
>
> It wasn't me asking about the previous Timer questions. Many thanks for
>> your hints. Will try and get back soon.
>>
>> Ittipong
>>
>> 2009/4/21 Michael Schippling <[email protected]>
>>
>> I guess this is what you were trying to get at in previous
>>> Timer questions, right?
>>>
>>> It looks like it should work the way you want. The only thing
>>> I can see that is questionable is the long atomic {block} for
>>> your message sending in DataSendTimer.fired(). This might
>>> block interrupts for too long.
>>>
>>> I would try to simplify the Timer scheme on it's own, flashing
>>> LEDs or something to see if it works the way you expect, and then
>>> start adding the radio message drivers back in.
>>>
>>> I think you should also be able to use the receive() method instead
>>> of starting your first timer, because it is called after the message
>>> is fully received.
>>>
>>> MS
>>>
>>> Ittipong Khemapech wrote:
>>>
>>>> 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
>>>>
>>>
>>
>
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to