Add i8042 back
[qemupp.git] / include / timer.hpp
blob3fc5386d617b16966807f9b2872f35c2b7877daa
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 DriftMode
13 DRIFT_DROP,
14 DRIFT_REINJECT_GRADUAL,
15 DRIFT_REINJECT_FAST,
18 enum TimeUnit
20 SEC = 0,
21 MSEC,
22 USEC,
23 NSEC,
24 PC_FREQ0, /* 1.193182Mhz */
25 PC_FREQ1, /* 32.768 Khz */
28 class Timer
30 public:
31 Timer(void);
33 void set(std::function<void (void)> func);
35 template <typename T>
36 void set(T *obj, void (T::*method)(void)) {
37 this->func = std::bind(method, obj);
40 void update(uint64_t next_deadline, TimeUnit unit);
41 void cancel(void);
43 uint64_t get_deadline(void);
44 void fire(void);
46 void pickle(Marshaller *m, const char *name);
48 private:
49 uint64_t deadline;
50 std::function<void (void)> func;
53 class TimeSource
55 public:
56 static TimeSource *get_instance(void);
58 virtual uint64_t now(TimeUnit unit) = 0;
59 virtual void arm(Timer *timer) = 0;
60 virtual void cancel(Timer *timer) = 0;
63 static inline uint64_t now(TimeUnit unit)
65 return TimeSource::get_instance()->now(unit);
68 static inline void marshal(Marshaller *m, const char *name, DriftMode *mode)
70 uint32_t val = (int)*mode;
71 marshal(m, name, &val);
72 *mode = (DriftMode)val;
75 uint64_t time_to_ns(uint64_t when, TimeUnit unit);
76 uint64_t ns_to_time(uint64_t when, TimeUnit unit);
78 void register_time_source(TimeSource *ts);
80 #endif