X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fplatforms%2FeyesIFX%2FLocalTimeP.nc;h=afebf830fa9cfcd7f9afa35fb138338abac2982f;hb=ca64db983a848b5fbcb38705547f547b26c8e435;hp=6e00648de802127ec9f446798b9d56e6bb8bcb12;hpb=4ba4b94611387e857fa1249fe49340aeabe9670e;p=tinyos-2.x.git diff --git a/tos/platforms/eyesIFX/LocalTimeP.nc b/tos/platforms/eyesIFX/LocalTimeP.nc index 6e00648d..afebf830 100644 --- a/tos/platforms/eyesIFX/LocalTimeP.nc +++ b/tos/platforms/eyesIFX/LocalTimeP.nc @@ -39,42 +39,49 @@ module LocalTimeP { implementation { typedef union { - uint32_t op; - struct { - uint16_t lo; - uint16_t hi; - }; - } ui32parts_t; - - typedef union - { - uint64_t op; + int64_t op; struct { uint32_t lo; - uint32_t hi; + int32_t hi; }; - } ui64parts_t; - - uint16_t counter2sec = 127; - uint32_t dayCounter = 0; + } i64parts_t; + uint16_t counter2sec = 126; + int32_t dayCounter = 0; + bool increaseDay = FALSE; async command uint32_t LocalTime32kHz.get() { - ui32parts_t time; + uint32_t time; + unsigned t; + bool dirty1; + bool dirty2; atomic { - time.lo = call Counter32khz16.get(); - time.hi = counter2sec; - if(call Counter32khz16.isOverflowPending()) { - time.hi++; + increaseDay = FALSE; + do { + dirty1 = call Counter32khz16.isOverflowPending(); + t = call Counter32khz16.get(); + dirty2 = call Counter32khz16.isOverflowPending(); + } while (dirty1 != dirty2); + time = counter2sec; + if(dirty1) { + ++time; + if(time == 0) { + increaseDay = TRUE; + } } + time = (time << 16) + t; } - return time.op; + return time; } - async command uint64_t WideLocalTime.get() { - ui64parts_t time; + async command int64_t WideLocalTime.get() { + i64parts_t time; + uint32_t t; atomic { - time.lo = call LocalTime32kHz.get(); + t = call LocalTime32kHz.get(); time.hi = dayCounter; + if(increaseDay) time.hi++; + if(time.hi < 0) time.hi = 0; + time.lo = t; } return time.op; } @@ -82,6 +89,7 @@ implementation { async event void Counter32khz16.overflow() { ++counter2sec; if(counter2sec == 0) ++dayCounter; - } + if(dayCounter < 0) dayCounter = 0; + } }