blob: 9c81ffbdcf7f5c221c2b262503a874424bc9d504 [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
Austin Schuh8aec1ed2016-05-01 13:29:20 -070013int PhasedLoop::Iterate(const monotonic_clock::time_point now) {
14 const monotonic_clock::time_point next_time =
15 monotonic_clock::time_point(
16 (((now - offset_).time_since_epoch() + monotonic_clock::duration(1)) /
17 interval_) *
18 interval_) +
19 ((now.time_since_epoch() < offset_) ? monotonic_clock::zero()
20 : interval_) +
21 offset_;
Brian Silvermandcaa3f72015-11-29 05:32:08 +000022
Austin Schuh8aec1ed2016-05-01 13:29:20 -070023 const monotonic_clock::duration difference = next_time - last_time_;
24 const int result = difference / interval_;
Brian Silvermandcaa3f72015-11-29 05:32:08 +000025 CHECK_EQ(difference, interval_ * result);
Austin Schuh8aec1ed2016-05-01 13:29:20 -070026 CHECK_EQ(
27 0, (next_time - offset_).time_since_epoch().count() % interval_.count());
Brian Silvermandcaa3f72015-11-29 05:32:08 +000028 CHECK_GE(next_time, now);
29 CHECK_LE(next_time - now, interval_);
30 last_time_ = next_time;
31 return result;
32}
33
brians343bc112013-02-10 01:53:46 +000034} // namespace timing
35} // namespace aos