}
async command uint32_t LocalTimeTMilli.get() {
- return (call LocalTime32kHz.get() / 32);
+ return (call WideLocalTime.get() / 32);
}
}
}
implementation {
components PacketStampP as PS;
+ components LocalTimeC as LT;
+
PacketTimeStamp32khz = PS;
PacketTimeStampMilli = PS;
+ PS.LocalTimeMilli -> LT;
}
interface PacketTimeStamp<T32khz, uint32_t> as PacketTimeStamp32khz;
interface PacketTimeStamp<TMilli, uint32_t> as PacketTimeStampMilli;
}
+ uses {
+ interface LocalTime<TMilli> as LocalTimeMilli;
+ }
}
implementation {
async command bool PacketTimeStamp32khz.isValid(message_t* msg) {
async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) {
getMetadata(msg)->time = value;
}
-
async command bool PacketTimeStampMilli.isValid(message_t* msg) {
return TRUE;
}
async command void PacketTimeStampMilli.clear(message_t* msg) {
}
async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) {
- return (getMetadata(msg)->time / 32);
+ uint32_t now = call LocalTimeMilli.get();
+ uint32_t delay = (now * 32) - (getMetadata(msg)->time);
+ return now - (delay / 32);
}
async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) {
getMetadata(msg)->time = value * 32;
implementation {
components TimeSyncMessageP as TS;
components ActiveMessageC as AM;
-
+ components LocalTimeC as LT;
+
SplitControl = AM;
Receive = AM.Receive;
TS.SubSend -> AM.AMSend;
TS.AMPacket -> AM.AMPacket;
+ TS.LocalTimeMilli -> LT;
TimeSyncAMSend32khz = TS;
TimeSyncAMSendMilli = TS;
uses {
interface AMSend as SubSend[am_id_t id];
interface AMPacket;
+ interface LocalTime<TMilli> as LocalTimeMilli;
}
}
implementation {
}
command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) {
- return (getMetadata(msg)->time / 32);
+ uint32_t now = call LocalTimeMilli.get();
+ uint32_t delay = (now * 32) - (getMetadata(msg)->time);
+ return now - (delay / 32);
};
event void SubSend.sendDone[uint8_t id](message_t* msg, error_t result) {