mc146818a: add frequency to time source and convert to use time source
[qemupp.git] / include / timer.hpp
blobd8d3c1aa6749f522ab7ea8ee8325613a02c2b7a7
1 #ifndef TIMER_HPP
2 #define TIMER_HPP
4 #include <functional>
5 #include <inttypes.h>
7 #include "marshal.hpp"
9 #define USEC_PER_SEC 1000000
11 enum TimeUnit
13 SEC = 0,
14 MSEC,
15 USEC,
16 NSEC,
17 PC_FREQ0, /* 1.193182Mhz */
18 PC_FREQ1, /* 32.768 Khz */
21 class Timer
23 public:
24 Timer(void);
26 void set(std::function<void (void)> func);
28 template <typename T>
29 void set(T *obj, void (T::*method)(void)) {
30 this->func = std::bind(method, obj);
33 void update(uint64_t next_deadline, TimeUnit unit);
34 void cancel(void);
36 uint64_t get_deadline(void);
37 void fire(void);
39 void marshal(Marshaller *m, const char *name);
41 private:
42 uint64_t deadline;
43 std::function<void (void)> func;
46 class TimeSource
48 public:
49 static TimeSource *get_instance(void);
51 virtual uint64_t now(TimeUnit unit) = 0;
52 virtual void arm(Timer *timer) = 0;
53 virtual void cancel(Timer *timer) = 0;
56 static inline uint64_t now(TimeUnit unit)
58 return TimeSource::get_instance()->now(unit);
61 uint64_t time_to_ns(uint64_t when, TimeUnit unit);
62 uint64_t ns_to_time(uint64_t when, TimeUnit unit);
64 void register_time_source(TimeSource *ts);
66 #endif