From ca64db983a848b5fbcb38705547f547b26c8e435 Mon Sep 17 00:00:00 2001 From: andreaskoepke Date: Thu, 10 Jul 2008 12:47:44 +0000 Subject: [PATCH] Comply with semantics described in TEP, use HilTimerMilli as base for LocalTime in milli seconds. TestFtsp works, however FTSP relies on the assumption that message_t.data = call Send.getPayload (just like BaseStation) but this is not true for RedMac/SpeckMacD on an eyesIFX node. After suitable modification of TimeSyncP (replace TimeSyncMsg* msg = (TimeSyncMsg*)(processedMsg->data); with TimeSyncMsg* msg = (TimeSyncMsg*)(call Send.getPayload(processedMsg, sizeof(TimeSyncMsg))); it works. --- tos/platforms/eyesIFX/LocalTimeC.nc | 2 - tos/platforms/eyesIFX/LocalTimeP.nc | 7 +-- tos/platforms/eyesIFX/PacketStampC.nc | 15 ++++-- tos/platforms/eyesIFX/PacketStampP.nc | 58 +++++++++++++++++------ tos/platforms/eyesIFX/TimeSyncMessageC.nc | 12 ++--- tos/platforms/eyesIFX/TimeSyncMessageP.nc | 19 ++++---- 6 files changed, 70 insertions(+), 43 deletions(-) diff --git a/tos/platforms/eyesIFX/LocalTimeC.nc b/tos/platforms/eyesIFX/LocalTimeC.nc index 5ad9f1e0..3812f416 100644 --- a/tos/platforms/eyesIFX/LocalTimeC.nc +++ b/tos/platforms/eyesIFX/LocalTimeC.nc @@ -30,14 +30,12 @@ configuration LocalTimeC { provides { interface LocalTime as LocalTimeT32khz; - interface LocalTime as LocalTimeTMilli; interface WideLocalTime as WideLocalTime; } } implementation { components LocalTimeP, Counter32khz16C as Counter; LocalTimeT32khz = LocalTimeP; - LocalTimeTMilli = LocalTimeP; WideLocalTime = LocalTimeP; LocalTimeP.Counter32khz16 -> Counter; } diff --git a/tos/platforms/eyesIFX/LocalTimeP.nc b/tos/platforms/eyesIFX/LocalTimeP.nc index 2136381a..afebf830 100644 --- a/tos/platforms/eyesIFX/LocalTimeP.nc +++ b/tos/platforms/eyesIFX/LocalTimeP.nc @@ -30,7 +30,6 @@ module LocalTimeP { provides { interface LocalTime as LocalTime32kHz; - interface LocalTime as LocalTimeTMilli; interface WideLocalTime as WideLocalTime; } uses { @@ -91,10 +90,6 @@ implementation { ++counter2sec; if(counter2sec == 0) ++dayCounter; if(dayCounter < 0) dayCounter = 0; - } - - async command uint32_t LocalTimeTMilli.get() { - return (call WideLocalTime.get() / 32); - } + } } diff --git a/tos/platforms/eyesIFX/PacketStampC.nc b/tos/platforms/eyesIFX/PacketStampC.nc index 88f1a0a1..276914fd 100644 --- a/tos/platforms/eyesIFX/PacketStampC.nc +++ b/tos/platforms/eyesIFX/PacketStampC.nc @@ -28,17 +28,26 @@ */ configuration PacketStampC { - provides { + provides { + interface TimeSyncPacket as TimeSyncPacket32khz; interface PacketTimeStamp as PacketTimeStamp32khz; + + interface TimeSyncPacket as TimeSyncPacketMilli; interface PacketTimeStamp 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; } diff --git a/tos/platforms/eyesIFX/PacketStampP.nc b/tos/platforms/eyesIFX/PacketStampP.nc index e92f3c27..29214129 100644 --- a/tos/platforms/eyesIFX/PacketStampP.nc +++ b/tos/platforms/eyesIFX/PacketStampP.nc @@ -32,36 +32,66 @@ module PacketStampP { provides { interface PacketTimeStamp as PacketTimeStamp32khz; + interface TimeSyncPacket as TimeSyncPacket32khz; + interface PacketTimeStamp as PacketTimeStampMilli; + interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface LocalTime as LocalTimeMilli; + interface LocalTime 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) { } } diff --git a/tos/platforms/eyesIFX/TimeSyncMessageC.nc b/tos/platforms/eyesIFX/TimeSyncMessageC.nc index 03ace249..cfc4f726 100644 --- a/tos/platforms/eyesIFX/TimeSyncMessageC.nc +++ b/tos/platforms/eyesIFX/TimeSyncMessageC.nc @@ -38,9 +38,6 @@ configuration TimeSyncMessageC { interface Packet; interface AMPacket; - interface PacketTimeStamp as PacketTimeStamp32khz; - interface PacketTimeStamp as PacketTimeStampMilli; - interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; @@ -51,7 +48,7 @@ configuration TimeSyncMessageC { implementation { components TimeSyncMessageP as TS; components ActiveMessageC as AM; - components LocalTimeC as LT; + components PacketStampC as PS; SplitControl = AM; @@ -60,13 +57,12 @@ implementation { 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; diff --git a/tos/platforms/eyesIFX/TimeSyncMessageP.nc b/tos/platforms/eyesIFX/TimeSyncMessageP.nc index 9eceba8b..32b96f26 100644 --- a/tos/platforms/eyesIFX/TimeSyncMessageP.nc +++ b/tos/platforms/eyesIFX/TimeSyncMessageP.nc @@ -30,7 +30,6 @@ /** * Expose the time sync capabilities of the eyesIFX platform */ -#include "radiopacketfunctions.h" module TimeSyncMessageP { provides { @@ -43,7 +42,8 @@ module TimeSyncMessageP { uses { interface AMSend as SubSend[am_id_t id]; interface AMPacket; - interface LocalTime as LocalTimeMilli; + interface PacketTimeStamp as PacketTimeStamp32khz; + interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { @@ -60,7 +60,7 @@ 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); } @@ -79,18 +79,19 @@ implementation { 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); } @@ -108,13 +109,11 @@ implementation { } 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) { -- 2.39.2