Merge pull request #67 from tripzero/trip
[profile/ivi/automotive-message-broker.git] / lib / timestamp.cpp
1 #include "timestamp.h"
2
3 #include <math.h>
4 #include <time.h>
5 #include <iostream>
6 #include <chrono>
7
8 double amb::currentTime()
9 {
10         return Timestamp::instance()->currentTime();
11 }
12
13 amb::Timestamp* amb::Timestamp::mInstance = nullptr;
14
15 amb::Timestamp::Timestamp()
16 {
17         auto tm = std::chrono::system_clock::now();
18         auto tm2 = std::chrono::steady_clock::now();
19
20         double eTime = (std::chrono::duration_cast<std::chrono::milliseconds>(tm.time_since_epoch()).count() / 1000.00);
21         double sTime = (std::chrono::duration_cast<std::chrono::milliseconds>(tm2.time_since_epoch()).count() / 1000.00);
22
23         startTimeEpoch =  eTime - sTime;
24 }
25
26 double amb::Timestamp::currentTime()
27 {
28         auto tm = std::chrono::steady_clock::now();
29
30         double time = std::chrono::duration_cast<std::chrono::milliseconds>(tm.time_since_epoch()).count() / 1000.00;
31
32         return time;
33 }
34
35 double amb::Timestamp::epochTime(double time)
36 {
37         return startTimeEpoch + time;
38 }
39
40 double amb::Timestamp::currentTime(double time)
41 {
42     return time - startTimeEpoch;
43 }
44
45 double amb::Timestamp::epochTime()
46 {
47         auto tm = std::chrono::system_clock::now();
48
49         double time = std::chrono::duration_cast<std::chrono::milliseconds>(tm.time_since_epoch()).count() / 1000.00;
50
51         return time;
52 }
53
54 amb::Timestamp* amb::Timestamp::instance()
55 {
56         if(!mInstance)
57                 mInstance = new Timestamp();
58
59         return mInstance;
60 }
61
62 double amb::Timestamp::fromTimeval(const struct ::timeval &tv)
63 {
64     return tv.tv_sec*1.0 + tv.tv_usec*1e-6;
65 }
66
67 struct ::timeval amb::Timestamp::toTimeval(const double time)
68 {
69     return { (__time_t) time, (__suseconds_t)fmod(time*1e6, 1e6) };
70 }
71
72 struct ::bcm_timeval amb::Timestamp::toBcmTimeval(const double time)
73 {
74     return { (long) time, (long)fmod(time*1e6, 1e6) };
75 }