source: trunk/MagicSoft/Cosy/base/timer.cc@ 5138

Last change on this file since 5138 was 2518, checked in by tbretz, 21 years ago
*** empty log message ***
File size: 2.8 KB
Line 
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
10void 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
29void Timer::GetTimeval(struct timeval *tv) const
30{
31 tv->tv_sec = fSecs;
32 tv->tv_usec = (__suseconds_t)fMs;
33}
34
35/*
36void 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*/
53void Timer::SetTimer(const struct timeval *tv)
54{
55 SetTimer(tv->tv_sec, (double)tv->tv_usec/1000000.0);
56}
57
58Timer::Timer(double t)
59{
60 double inte;
61 double frac = modf(t, &inte);
62 SetTimer(inte, frac);
63}
64
65Timer::Timer(struct timeval *tv)
66{
67 SetTimer(tv);
68}
69
70Timer::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
84void 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
116double Timer::Now() //[s]
117{
118 struct timeval tv;
119 gettimeofday(&tv, NULL);
120
121 SetTimer(&tv);
122
123 return fMs+fSecs;
124}
125
126Timer::operator double() const //[s]
127{
128 return fMs+fSecs;
129}
130
131void Timer::Print()
132{
133 cout << fSec << "s +" << fMs << "s" << endl;
134}
135
136const 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
144ostream &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}
Note: See TracBrowser for help on using the repository browser.