| 1 | #include "timer.h"
|
|---|
| 2 |
|
|---|
| 3 | #include <stdio.h>
|
|---|
| 4 | #include <iostream.h>
|
|---|
| 5 |
|
|---|
| 6 | #include <math.h> // modf
|
|---|
| 7 | #include "sys/time.h" // struct timeval
|
|---|
| 8 | #include "slalib/slalib.h" // slacldj
|
|---|
| 9 |
|
|---|
| 10 | void Timer::SetTimer(int tv_sec, double tv_usec)
|
|---|
| 11 | {
|
|---|
| 12 | fSecs = tv_sec;
|
|---|
| 13 | fMs = tv_usec;
|
|---|
| 14 |
|
|---|
| 15 | SetMjd((fMs+fSecs)/(60*60*24) + 40587);
|
|---|
| 16 |
|
|---|
| 17 | fSec = tv_sec%60;
|
|---|
| 18 | tv_sec /= 60;
|
|---|
| 19 |
|
|---|
| 20 | fMin = tv_sec%60;
|
|---|
| 21 | tv_sec /= 60;
|
|---|
| 22 |
|
|---|
| 23 | fHor = tv_sec%24;
|
|---|
| 24 | tv_sec /= 24;
|
|---|
| 25 |
|
|---|
| 26 | // fDiv = fmod((fMs+fSecs)/(60*60*24), 1.0);
|
|---|
| 27 | }
|
|---|
| 28 |
|
|---|
| 29 | void Timer::GetTimeval(struct timeval *tv) const
|
|---|
| 30 | {
|
|---|
| 31 | tv->tv_sec = fSecs;
|
|---|
| 32 | tv->tv_usec = (__suseconds_t)fMs;
|
|---|
| 33 | }
|
|---|
| 34 |
|
|---|
| 35 | /*
|
|---|
| 36 | void Timer::Set(const long mjd)
|
|---|
| 37 | {
|
|---|
| 38 | SetMjd(mjd);
|
|---|
| 39 |
|
|---|
| 40 | //
|
|---|
| 41 | // Express day in Gregorian calendar
|
|---|
| 42 | // (taken from slalib slaDjcl)
|
|---|
| 43 | //
|
|---|
| 44 | const long jd = mjd + 2400001;
|
|---|
| 45 | const long n4 = (((((jd*4-17918)/146097)*6)/4+1)/2+jd-37)*4;
|
|---|
| 46 | const long nd10 = (((n4-237)%1461)/4)*10+5;
|
|---|
| 47 |
|
|---|
| 48 | fYea = n4/1461 - 4712;
|
|---|
| 49 | fMon = ((nd10/306+2)%12) + 1;
|
|---|
| 50 | fDay = (nd10%306)/10 + 1;
|
|---|
| 51 | }
|
|---|
| 52 | */
|
|---|
| 53 | void Timer::SetTimer(const struct timeval *tv)
|
|---|
| 54 | {
|
|---|
| 55 | SetTimer(tv->tv_sec, (double)tv->tv_usec/1000000.0);
|
|---|
| 56 | }
|
|---|
| 57 |
|
|---|
| 58 | Timer::Timer(double t)
|
|---|
| 59 | {
|
|---|
| 60 | double inte;
|
|---|
| 61 | double frac = modf(t, &inte);
|
|---|
| 62 | SetTimer(inte, frac);
|
|---|
| 63 | }
|
|---|
| 64 |
|
|---|
| 65 | Timer::Timer(struct timeval *tv)
|
|---|
| 66 | {
|
|---|
| 67 | SetTimer(tv);
|
|---|
| 68 | }
|
|---|
| 69 |
|
|---|
| 70 | Timer::Timer(const Timer &t)
|
|---|
| 71 | {
|
|---|
| 72 | fMs = t.fMs;
|
|---|
| 73 | fDiv = t.fDiv;
|
|---|
| 74 | fSec = t.fSec;
|
|---|
| 75 | fSecs = t.fSecs;
|
|---|
| 76 | fMin = t.fMin;
|
|---|
| 77 | fHor = t.fHor;
|
|---|
| 78 | fDay = t.fDay;
|
|---|
| 79 | fMon = t.fMon;
|
|---|
| 80 | fYea = t.fYea;
|
|---|
| 81 | fMjd = t.fMjd;
|
|---|
| 82 | }
|
|---|
| 83 |
|
|---|
| 84 | void Timer::SetMjd(double mjd)
|
|---|
| 85 | {
|
|---|
| 86 | //
|
|---|
| 87 | // Express day in Gregorian calendar
|
|---|
| 88 | // (taken from slalib slaDjcl)
|
|---|
| 89 | //
|
|---|
| 90 | fMjd = mjd;
|
|---|
| 91 |
|
|---|
| 92 | const long jd = (long)mjd + 2400001;
|
|---|
| 93 | const long n4 = (((((jd*4-17918)/146097)*6)/4+1)/2+jd-37)*4;
|
|---|
| 94 | const long nd10 = (((n4-237)%1461)/4)*10+5;
|
|---|
| 95 |
|
|---|
| 96 | fYea = n4/1461 - 4712;
|
|---|
| 97 | fMon = ((nd10/306+2)%12) + 1;
|
|---|
| 98 | fDay = (nd10%306)/10 + 1;
|
|---|
| 99 |
|
|---|
| 100 | fDiv = fmod(mjd, 1.0);
|
|---|
| 101 |
|
|---|
| 102 | mjd -= 40587;
|
|---|
| 103 |
|
|---|
| 104 | mjd *= 24;
|
|---|
| 105 | fHor = (int)fmod(mjd, 24);
|
|---|
| 106 |
|
|---|
| 107 | mjd *= 60;
|
|---|
| 108 | fMin = (int)fmod(mjd, 60);
|
|---|
| 109 |
|
|---|
| 110 | mjd *= 60;
|
|---|
| 111 | fSec = (int)fmod(mjd, 60);
|
|---|
| 112 |
|
|---|
| 113 | fMs = fmod(mjd * 1000, 1000)/1000;
|
|---|
| 114 | }
|
|---|
| 115 |
|
|---|
| 116 | double Timer::Now() //[s]
|
|---|
| 117 | {
|
|---|
| 118 | struct timeval tv;
|
|---|
| 119 | gettimeofday(&tv, NULL);
|
|---|
| 120 |
|
|---|
| 121 | SetTimer(&tv);
|
|---|
| 122 |
|
|---|
| 123 | return fMs+fSecs;
|
|---|
| 124 | }
|
|---|
| 125 |
|
|---|
| 126 | Timer::operator double() const //[s]
|
|---|
| 127 | {
|
|---|
| 128 | return fMs+fSecs;
|
|---|
| 129 | }
|
|---|
| 130 |
|
|---|
| 131 | void Timer::Print()
|
|---|
| 132 | {
|
|---|
| 133 | cout << fSec << "s +" << fMs << "s" << endl;
|
|---|
| 134 | }
|
|---|
| 135 |
|
|---|
| 136 | const char *Timer::GetTimeStr()
|
|---|
| 137 | {
|
|---|
| 138 | sprintf(fDateStr, "%2d/%02d/%02d %d:%02d:%02d.%06li",
|
|---|
| 139 | fYea, fMon, fDay, fHor, fMin, fSec, (long)(1000000.0*fMs));
|
|---|
| 140 |
|
|---|
| 141 | return fDateStr;
|
|---|
| 142 | }
|
|---|
| 143 |
|
|---|
| 144 | ostream &operator<<(ostream &out, Timer &t)
|
|---|
| 145 | {
|
|---|
| 146 | char text[256];
|
|---|
| 147 |
|
|---|
| 148 | sprintf(text, "%2d/%02d/%02d %d:%02d:%02d.%01li",
|
|---|
| 149 | t.fYea, t.fMon, t.fDay, t.fHor, t.fMin, t.fSec, (long)(10.0*t.fMs));
|
|---|
| 150 |
|
|---|
| 151 | out << text;
|
|---|
| 152 | return out;
|
|---|
| 153 | }
|
|---|