blob: b5804c83823a4efc7e635acc9f1eab738326e23c [file] [log] [blame]
Brian3afd6fc2014-04-02 20:41:49 -07001#include "aos/common/util/phased_loop.h"
brians343bc112013-02-10 01:53:46 +00002
brians343bc112013-02-10 01:53:46 +00003namespace aos {
4namespace time {
5
6void PhasedLoopXMS(int ms, int offset) {
Brian Silverman7645d2f2013-03-30 18:53:56 -07007 const Time frequency = Time::InMS(ms);
Brian Silverman0079a9d2013-10-24 15:57:35 -07008 SleepUntil((Time::Now() / static_cast<int32_t>(frequency.ToNSec())) *
9 static_cast<int32_t>(frequency.ToNSec()) +
Brian Silverman7645d2f2013-03-30 18:53:56 -070010 frequency + Time::InUS(offset));
brians343bc112013-02-10 01:53:46 +000011}
12
Brian Silvermandcaa3f72015-11-29 05:32:08 +000013int PhasedLoop::Iterate(const Time &now) {
14 const Time next_time = Time::InNS(((now - offset_).ToNSec() + 1) /
15 interval_.ToNSec() * interval_.ToNSec()) +
16 ((now < offset_) ? Time::kZero : interval_) + offset_;
17
18 const Time difference = next_time - last_time_;
19 const int result = difference.ToNSec() / interval_.ToNSec();
20 CHECK_EQ(difference, interval_ * result);
21 CHECK_EQ(0, (next_time - offset_).ToNSec() % interval_.ToNSec());
22 CHECK_GE(next_time, now);
23 CHECK_LE(next_time - now, interval_);
24 last_time_ = next_time;
25 return result;
26}
27
brians343bc112013-02-10 01:53:46 +000028} // namespace timing
29} // namespace aos