summaryrefslogtreecommitdiffstats
path: root/app/time_fn.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/time_fn.c')
-rw-r--r--app/time_fn.c125
1 files changed, 120 insertions, 5 deletions
diff --git a/app/time_fn.c b/app/time_fn.c
index 87fb48f..3e58854 100644
--- a/app/time_fn.c
+++ b/app/time_fn.c
@@ -1,3 +1,4 @@
+#include <math.h>
#include "project.h"
static int is_leap (unsigned year)
@@ -17,7 +18,7 @@ static int is_leap (unsigned year)
UTC time_epoch_to_utc (EPOCH epoch)
{
- UTC u;
+ UTC u = {0};
uint64_t day;
unsigned y400, y100, y4;
@@ -152,9 +153,6 @@ UTC time_epoch_to_utc (EPOCH epoch)
return u;
}
-
-
-
EPOCH time_utc_to_epoch (UTC u)
{
unsigned y400;
@@ -221,7 +219,7 @@ void time_print_utc (const char *p, UTC u, const char *t)
{
const char *dname[] = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"};
const char *mname[] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
- printf ("%s%s %04d-%s-%02d %02d:%02d:%02d.%09d %s\r\n", p ? p : "", dname[u.wday], u.year, mname[u.month], u.mday, u.hour, u.minute, u.second, u.nanosecond , t ? t : "");
+ printf ("%s%s %04d-%s-%02d %02d:%02d:%02d.%09d %s\r\n", p ? p : "", dname[u.wday], u.year, mname[u.month], u.mday, u.hour, u.minute, u.second, u.nanosecond, t ? t : "");
}
void time_print_epoch (const char *p, EPOCH e, const char *t)
@@ -230,3 +228,120 @@ void time_print_epoch (const char *p, EPOCH e, const char *t)
time_print_utc (p, u, t);
}
+
+double
+time_utc_to_tjd (UTC u)
+{
+ unsigned y400;
+ unsigned y100;
+ unsigned y4;
+
+ double ret;
+ unsigned jd;
+
+ static int const mdays[] =
+ { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
+ static int const lmdays[] =
+ { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
+
+ u.is_leap = is_leap (u.year);
+
+ if (u.year < 100)
+ u.year += 2000;
+
+
+ if (!u.jday) {
+ if (u.is_leap)
+ u.jday = u.mday + lmdays[u.month];
+ else
+ u.jday = u.mday + mdays[u.month];
+ }
+
+ u.year -= 1601;
+ y400 = u.year / 400;
+ u.year -= y400 * 400;
+ y100 = u.year / 100;
+ u.year -= y100 * 100;
+ y4 = u.year / 4;
+ u.year -= y4 * 4;
+
+ jd = u.jday - 1;
+ jd += u.year * 365;
+ jd += y4 * 1461;
+ jd += y100 * 36524;
+ jd += y400 * 146097;
+
+
+ jd += 2305813;
+ jd -= 2451545;
+
+
+
+ ret = (double) u.nanosecond;
+ ret /= 1000000000.;
+ ret += (double) u.second;
+ ret /= 60.;
+ ret += (double) u.minute;
+ ret /= 60.;
+ ret += (double) u.hour;
+ ret /= 24.;
+
+ ret += .5;
+
+ ret += (double) jd;
+
+ return ret;
+}
+
+double
+time_utc_to_ra (UTC u)
+{
+ double tjd = time_utc_to_tjd (u);
+ double T = tjd / 36525.;
+ double theta0 =
+ 280.46061837 + (360.98564736629 * tjd) + (0.000387933 * T * T) -
+ (T * T * T / 38710000.0);
+
+ return remainder (theta0, 360.);
+}
+
+
+ST
+time_ra_to_st (double ra)
+{
+ ST ret;
+ unsigned i;
+
+ while (ra < 0.)
+ ra += 360.;
+
+ if (ra >= 360.0)
+ ra = remainder (ra, 360.);
+
+ ra *= 240.0;
+
+ i = (int) (floor (ra) + .5);
+ ra -= (double) i;
+ ra *= 1000000000.;
+
+ ret.nanosecond = (unsigned) (ra + .5);
+ ret.second = i % 60;
+ i /= 60;
+ ret.minute = i % 60;
+ i /= 60;
+ ret.hour = i;
+
+ return ret;
+}
+
+
+
+ST time_utc_to_lst (UTC u, double lon)
+{
+ double ra;
+
+ ra = time_utc_to_ra (u);
+ return time_ra_to_st (ra + lon);
+}
+
+