configuration LocalTimeC {
provides {
interface LocalTime<T32khz> as LocalTimeT32khz;
- interface LocalTime<TMilli> as LocalTimeTMilli;
interface WideLocalTime<T32khz> as WideLocalTime;
}
}
implementation {
components LocalTimeP, Counter32khz16C as Counter;
LocalTimeT32khz = LocalTimeP;
- LocalTimeTMilli = LocalTimeP;
WideLocalTime = LocalTimeP;
LocalTimeP.Counter32khz16 -> Counter;
}
module LocalTimeP {
provides {
interface LocalTime<T32khz> as LocalTime32kHz;
- interface LocalTime<TMilli> as LocalTimeTMilli;
interface WideLocalTime<T32khz> as WideLocalTime;
}
uses {
++counter2sec;
if(counter2sec == 0) ++dayCounter;
if(dayCounter < 0) dayCounter = 0;
- }
-
- async command uint32_t LocalTimeTMilli.get() {
- return (call WideLocalTime.get() / 32);
- }
+ }
}
*/
configuration PacketStampC {
- provides {
+ provides {
+ interface TimeSyncPacket<T32khz, uint32_t> as TimeSyncPacket32khz;
interface PacketTimeStamp<T32khz, uint32_t> as PacketTimeStamp32khz;
+
+ interface TimeSyncPacket<TMilli, uint32_t> as TimeSyncPacketMilli;
interface PacketTimeStamp<TMilli, uint32_t> as PacketTimeStampMilli;
}
}
implementation {
components PacketStampP as PS;
components LocalTimeC as LT;
-
+ components HilTimerMilliC as HilMilli;
+
PacketTimeStamp32khz = PS;
+ TimeSyncPacket32khz = PS;
+
PacketTimeStampMilli = PS;
- PS.LocalTimeMilli -> LT;
+ TimeSyncPacketMilli = PS;
+
+ PS.LocalTime32khz -> LT;
+ PS.LocalTimeMilli -> HilMilli;
}
module PacketStampP {
provides {
interface PacketTimeStamp<T32khz, uint32_t> as PacketTimeStamp32khz;
+ interface TimeSyncPacket<T32khz, uint32_t> as TimeSyncPacket32khz;
+
interface PacketTimeStamp<TMilli, uint32_t> as PacketTimeStampMilli;
+ interface TimeSyncPacket<TMilli, uint32_t> as TimeSyncPacketMilli;
}
uses {
interface LocalTime<TMilli> as LocalTimeMilli;
+ interface LocalTime<T32khz> as LocalTime32khz;
}
}
implementation {
- async command bool PacketTimeStamp32khz.isValid(message_t* msg) {
- return TRUE;
+ // 32 kHz interface
+ // get the time when SFD event was generated
+ async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg) {
+ return getMetadata(msg)->sfdtime;
}
- async command void PacketTimeStamp32khz.clear(message_t* msg) {
+ // set the time when SFD event was generated?
+ async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) {
+ getMetadata(msg)->sfdtime = value;
}
- async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg) {
+ // return time when event was generated at the source
+ command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) {
return getMetadata(msg)->time;
+ };
+
+ // Milli interface
+ // get the time when SFD was send/received
+ async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) {
+ return call LocalTimeMilli.get() -
+ (call LocalTime32khz.get() - getMetadata(msg)->sfdtime)/32;
}
- async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) {
- getMetadata(msg)->time = value;
+ // set the time when SFD was send/received?
+ async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) {
+ getMetadata(msg)->sfdtime =
+ call LocalTime32khz.get() - (call LocalTimeMilli.get() - value)*32;
}
- async command bool PacketTimeStampMilli.isValid(message_t* msg) {
+ // return time when event was generated
+ command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) {
+ return call LocalTimeMilli.get() -
+ (call LocalTime32khz.get() - getMetadata(msg)->time)/32;
+ };
+
+ // not really supported functions, valid section
+ command bool TimeSyncPacket32khz.isValid(message_t* msg) {
return TRUE;
}
- async command void PacketTimeStampMilli.clear(message_t* msg) {
+ command bool TimeSyncPacketMilli.isValid(message_t* msg) {
+ return TRUE;
}
- async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) {
- uint32_t now = call LocalTimeMilli.get();
- uint32_t delay = (now * 32) - (getMetadata(msg)->time);
- return now - (delay / 32);
+ async command bool PacketTimeStamp32khz.isValid(message_t* msg) {
+ return TRUE;
}
- async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) {
- getMetadata(msg)->time = value * 32;
+ async command bool PacketTimeStampMilli.isValid(message_t* msg) {
+ return TRUE;
+ }
+
+ // not really supported functions, clear section
+ async command void PacketTimeStamp32khz.clear(message_t* msg) {
+ }
+ async command void PacketTimeStampMilli.clear(message_t* msg) {
}
}
interface Packet;
interface AMPacket;
- interface PacketTimeStamp<T32khz, uint32_t> as PacketTimeStamp32khz;
- interface PacketTimeStamp<TMilli, uint32_t> as PacketTimeStampMilli;
-
interface TimeSyncAMSend<T32khz, uint32_t> as TimeSyncAMSend32khz[am_id_t id];
interface TimeSyncPacket<T32khz, uint32_t> as TimeSyncPacket32khz;
implementation {
components TimeSyncMessageP as TS;
components ActiveMessageC as AM;
- components LocalTimeC as LT;
+ components PacketStampC as PS;
SplitControl = AM;
Packet = AM;
AMPacket = AM;
- PacketTimeStamp32khz = AM;
- PacketTimeStampMilli = AM;
-
TS.SubSend -> AM.AMSend;
TS.AMPacket -> AM.AMPacket;
- TS.LocalTimeMilli -> LT;
+ TS.PacketTimeStamp32khz -> PS;
+ TS.PacketTimeStampMilli -> PS;
+
TimeSyncAMSend32khz = TS;
TimeSyncAMSendMilli = TS;
TimeSyncPacket32khz = TS;
/**
* Expose the time sync capabilities of the eyesIFX platform
*/
-#include "radiopacketfunctions.h"
module TimeSyncMessageP {
provides {
uses {
interface AMSend as SubSend[am_id_t id];
interface AMPacket;
- interface LocalTime<TMilli> as LocalTimeMilli;
+ interface PacketTimeStamp<T32khz, uint32_t> as PacketTimeStamp32khz;
+ interface PacketTimeStamp<TMilli, uint32_t> as PacketTimeStampMilli;
}
}
implementation {
message_t* msg,
uint8_t len,
uint32_t event_time) {
- getMetadata(msg)->time = event_time;
+ call PacketTimeStamp32khz.set(msg, event_time);
resolution = RES_32_K;
return call SubSend.send[id](addr, msg, len);
}
command bool TimeSyncPacket32khz.isValid(message_t* msg) {
- return TRUE;
+ return call PacketTimeStamp32khz.isValid(msg);
}
command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) {
- return getMetadata(msg)->time;
+ return call PacketTimeStamp32khz.timestamp(msg);
};
command error_t TimeSyncAMSendMilli.send[am_id_t id](am_addr_t addr,
message_t* msg,
uint8_t len,
uint32_t event_time) {
- getMetadata(msg)->time = (event_time * 32);
+
+ call PacketTimeStampMilli.set(msg, event_time);
resolution = RES_1_K;
return call SubSend.send[id](addr, msg, len);
}
}
command bool TimeSyncPacketMilli.isValid(message_t* msg) {
- return TRUE;
+ return call PacketTimeStamp32khz.isValid(msg);
}
command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) {
- uint32_t now = call LocalTimeMilli.get();
- uint32_t delay = (now * 32) - (getMetadata(msg)->time);
- return now - (delay / 32);
+ return call PacketTimeStampMilli.timestamp(msg);
};
event void SubSend.sendDone[uint8_t id](message_t* msg, error_t result) {