Hi,

for timestamps in TinyOS 2.1 it is better to use the interfaces 
TimeSyncAMSend and TimeSyncPacket. On a sender: you should read the 
timer (e.g. “sendertime = call Alarm.getNow()”), put its value to some 
field of the radio packet you are going to send, send the packet by the 
command “call TimeSyncAMSend.Send()”. On a receiver: in the “Receive” 
event you can extract the sender timestamp by reading the corresponding 
field of the received message; also you can call the command 
TimeSyncPacket.eventTime(msg)” to read the time of the receiver 
corresponding to the sender timestamp (i.e. this value is the receiver 
time at the moment when the sender makes its time reading, which is then 
put in the packet). Don’t forget to use proper precision and width tags, 
i.e. if you use 32-bit timer clocked by 32768 Hz oscillator your 
interfaces declarations in “…C.nc file” should look like these:

interface TimeSyncAMSend<T32khz,uint32_t>;

interface TimeSyncPacket<T32khz,uint32_t>;

in “…AppC.nc file” it should be like this:

App.Send -> ActiveMessageC.TimeSyncAMSend32khz[AM_MYMSG];

Anyway, look attentively through the TEP 133 and TEP 102 – everything is 
explained there:

http://www.tinyos.net/tinyos-2.1.0/doc/html/tep133.html

http://www.tinyos.net/tinyos-2.1.0/doc/html/tep102.html

If you are interested why the code with “RadioTimeStamping” does not 
work in TinyOS 2.1: because this interface is not provided by the 
CC2420TransmitP.nc module there. As for the CC2420Transmit interface: it 
is still present in TinyOS 2.1 (provided by CC2420TransmitP.nc), but, in 
order to use it, of course, in your “…App.nc” file it is necessary to 
“wire” the interface in a way like this:

components CC2420TransmitC;

App.CC2420Transmit->CC2420TransmitC.CC2420Transmit;

Also, you used millisecond-timer in your application (uses interface 
Timer<TMilli> as Timer0;), while the event 
“RadioTimeStamping.transmittedSFD” returns 16-bit value of the timer 
clocked by 32768 Hz oscillator – of course it is incompatible in such a 
way. Besides, the code like this

mytimebuf=(((((timertime&0x0000FFFFUL)>((uint32_t)time&0x0000FFFFUL))?timertime:(timertime-0x00010000UL))&0xFFFF0000UL)|((uint32_t)time&0x0000FFFFUL));

is absolutely unreadable, it is wrong to code like this. Sorry, it is my 
fault, I did this, I don’t know why. Of course, it’s a crime to code 
like this. It is better to use “if-else” statements.

>
> 2009/4/23 sara so <[email protected] <mailto:[email protected]>>
>
>     Hi,
>     Thanks for your help but I have tried to follow your small code ... it
>     is always complaining about no such interface CC2420TransmitC??
>     uses interface RadioTimeStamping; also this interface is not
>     avialable??
>     This is my code in case you want to take a look?
>
>     #include <Timer.h>
>     #include "CC2420.h"
>     #include "BlinkToRadio.h"
>
>     module BlinkToRadioC{
>     uses interface Boot;
>     uses interface Leds;
>     uses interface Timer<TMilli> as Timer0;
>
>     uses interface Packet;
>     uses interface AMPacket;
>     uses interface AMSend;
>     uses interface Receive;
>     uses interface SplitControl as AMControl;
>     uses interface RadioTimeStamping;
>     implementation {
>     message_t pkt;
>     bool busy = FALSE;
>     uint32_t timertime;
>     uint32_t mytimebuf;
>     uint32_t transmittime;
>     uint8_t mytime[4];
>     event void Boot.booted() {
>     call AMControl.start();
>     }
>
>     event void AMControl.startDone(error_t err) {
>     if (err == SUCCESS) {
>     call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
>     }
>     else {
>     call AMControl.start();
>     }
>     }
>
>     event void AMControl.stopDone(error_t err) {
>     }
>
>     event void Timer0.fired() {
>
>     if (!busy) {
>     BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)(call
>     Packet.getPayload(&pkt, NULL));
>
>     if (call AMSend.send(2, &pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) {
>     busy = TRUE;
>     }
>     }
>     }
>
>     event void AMSend.sendDone(message_t* msg, error_t err) {
>     if (&pkt == msg) {
>     busy = FALSE;
>     }
>     }
>
>     async event void RadioTimeStamping.transmittedSFD(uint16_t time,
>     message_t* p_msg){
>
>     //get the current time and replace the lower half-word with
>     SFD-captured timer content:
>     timertime= call Timer0.getNow(); //timeget(); is that ok ?
>     
> mytimebuf=(((((timertime&0x0000FFFFUL)>((uint32_t)time&0x0000FFFFUL))?timertime:(timertime-0x00010000UL))&0xFFFF0000UL)|((uint32_t)time&0x0000FFFFUL));
>     transmittime=mytimebuf;
>     //load the 32-bit timestamp to a uint8_t 4-elements' array:
>     for(v=0;v<4;v++){
>     mytime[v]=(uint8_t)((mytimebuf>>((3-v)*8))&0x000000FFUL);
>     }
>     //write the timestamp to the CC2420 RAM:
>     call CC2420Transmit.modify(
>     offsetof(pkt,timeStamp)+sizeof(message_header_t), mytime, 4);
>     }
>
>     async event void RadioTimeStamping.receivedSFD(uint16_t time,
>     message_t* p_msg){
>
>     }
>     }
>

_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to