From 5b8f47a70a57765ba04a4d75dfa31a2f55f75029 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 20 Mar 2021 16:20:42 +0000 Subject: add alarm support --- app/httpd.c | 297 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 app/httpd.c (limited to 'app/httpd.c') diff --git a/app/httpd.c b/app/httpd.c new file mode 100644 index 0000000..5c96c44 --- /dev/null +++ b/app/httpd.c @@ -0,0 +1,297 @@ +#include "project.h" + +#if 0 +#define FS_FILE_FLAGS_HEADER_INCLUDED 0x01 +#define FS_FILE_FLAGS_HEADER_PERSISTENT 0x02 +#define FS_FILE_FLAGS_HEADER_HTTPVER_1_1 0x04 +#define FS_FILE_FLAGS_SSI 0x08 +#endif + + +static char html_buf[8192]; + +EPOCH alarm; + +static uint32_t make_alarm (void) +{ + uint64_t abs = ref_get(); + EPOCH e, ad; + double ra, lra; + UTC u; + ST l; + char buf[128]; + + PTB_INIT (html_buf); + PTB_ADD ("\n"); + PTB_ADD ("\n"); + PTB_ADD ("
\n"); + + PTB_ADD ("

Alarm

\n"); + + u = time_epoch_to_utc (alarm); + utc_to_str (buf, &u); + ra = time_utc_to_ra (u); + lra = ra_normalize (ra + gps_lon); + l = time_ra_to_st (lra); + + PTB_ADD ("
\n");
+
+  e = ref_decompose (abs);
+  ad = time_epoch_sub (alarm, e);
+
+  if (ad.s >= 0) {
+    unsigned d, h, m, s;
+    s = ad.s;
+    m = s / 60;
+    s -= m * 60;
+    h = m / 60;
+    m -= h * 60;
+    d = h / 24;
+    h -= d * 24;
+
+    PTB_ADD (" in %d days, %02d:%02d:%02d\n", d, h, m, s);
+  }
+
+  PTB_ADD (" UTC: %s\n", buf);
+  PTB_ADD (" RA:                  %.9f\n", ra);
+  PTB_ADD ("
\n"); + + PTB_ADD ("\n"); + PTB_ADD ("\n", lra); + PTB_ADD ("\n", l.hour, l.minute, l.second, l.nanosecond / 1000); + PTB_ADD ("
LRA:
LST:
\n"); + + PTB_ADD ("\n"); + PTB_ADD ("\n"); + return PTB_LEN; +} + + + +static uint32_t make_index (void) +{ + uint64_t abs = ref_get(); + EPOCH e, ad; + double ra, lra; + UTC u; + ST l; + char buf[128]; + + PTB_INIT (html_buf); + PTB_ADD ("\n"); + PTB_ADD ("\n"); + PTB_ADD ("\n"); + PTB_ADD ("
\n"); + PTB_ADD ("

Now

\n"); + + e = ref_decompose (abs); + u = time_epoch_to_utc (e); + utc_to_str (buf, &u); + ra = time_utc_to_ra (u); + lra = ra + gps_lon; + l = time_ra_to_st (lra); + + + + PTB_ADD ("
\n");
+  PTB_ADD (" UTC: %s\n", buf);
+  PTB_ADD (" RA:                  %.9f\n", ra);
+  PTB_ADD (" LRA:                 %.9f\n", lra);
+  PTB_ADD (" LST:                 %02d:%02d:%02d.%06d\n", l.hour, l.minute, l.second, l.nanosecond / 1000);
+  PTB_ADD ("
\n"); + PTB_ADD ("\n"); + PTB_ADD ("

Alarm

\n"); + + u = time_epoch_to_utc (alarm); + utc_to_str (buf, &u); + ra = time_utc_to_ra (u); + lra = ra_normalize (ra + gps_lon); + l = time_ra_to_st (lra); + + PTB_ADD ("
\n");
+
+  ad = time_epoch_sub (alarm, e);
+
+  if (ad.s >= 0) {
+    unsigned d, h, m, s;
+    s = ad.s;
+    m = s / 60;
+    s -= m * 60;
+    h = m / 60;
+    m -= h * 60;
+    d = h / 24;
+    h -= d * 24;
+
+    PTB_ADD (" in %d days, %02d:%02d:%02d\n", d, h, m, s);
+  }
+
+  PTB_ADD (" UTC: %s\n", buf);
+  PTB_ADD (" RA:                  %.9f\n", ra);
+  PTB_ADD (" LRA:                 %.9f\n", lra);
+  PTB_ADD (" LST:                 %02d:%02d:%02d.%06d\n", l.hour, l.minute, l.second, l.nanosecond / 1000);
+  PTB_ADD ("
\n"); + + PTB_ADD ("
\n"); + + PTB_ADD ("

GPS

\n"); + PTB_ADD ("
\n");
+  PTB_ADD ("%s\n", gps_info);
+  PTB_ADD (" %s\n", gps_pos);
+  PTB_ADD (" %s\n", gps_svin_info);
+  PTB_ADD ("\n");
+
+  PTB_ADD ("%s", gps_svinfo);
+  PTB_ADD ("
\n"); + PTB_ADD ("\n"); + PTB_ADD ("\n"); + + return PTB_LEN; +} + + +static int cgi_set_lra (double lra) +{ + uint64_t abs = ref_get(); + EPOCH e = ref_decompose (abs); + double ra = ra_normalize (lra - gps_lon); + alarm = time_ra_to_next_epoch (e, ra); + + return 0; +} + + + +static int cgi_set_lst (char *lst_str) +{ + double ra = 0; + char *a2, *a3; + char *s = NULL, *m = NULL, *h = NULL; + unsigned i = 0; + + printf ("set lst = %s\n", lst_str); + + a2 = index (lst_str, ':'); + + if (!a2) { + h = NULL; + m = NULL; + s = lst_str; + } else { + a2++; + a3 = index (a2, ':'); + + if (!a3) { + m = lst_str; + s = a2; + } else { + a3++; + h = lst_str; + m = a2; + s = a3; + } + } + + ra = atof (s); + + + if (h) + i += atoi (h); + + i *= 60; + + if (m) i += atoi (m); + + i *= 60; + + ra += (double) i; + + ra /= 240.; + + return cgi_set_lra (ra); +} + +static char *uri_unescape (char *c) +{ + char *ret = c, *ptr; + + for (ptr = c; *c; ++c, ++ptr) { + + if (*c != '%') { + *ptr = *c; + continue; + } + + if (!c[1] || !c[2]) break; + + *ptr = (xtoi (c[1]) << 4) | xtoi (c[2]); + + c += 2; + } + + * ptr = 0; + + return ret; +} + + +static const char *cgi_set_handler (int idx, int num_params, char *params[], char *values[]) +{ + do { + if (num_params != 1)break; + + if (!strcmp (params[0], "lra")) { + if (cgi_set_lra (atof (values[0]))) + break; + } else if (!strcmp (params[0], "lst")) { + if (cgi_set_lst (uri_unescape (values[0]))) + break; + } else + break; + + return "/index.html"; + + } while (0); + + return "/error.html"; +} + + +int fs_open_custom (struct fs_file *file, const char *name) +{ + int len; + + if (!strcmp (name, "/index.html")) + len = make_index(); + else if (!strcmp (name, "/alarm.html")) + len = make_alarm(); + else { + printf ("looking for url=%s, found nothing\n", name); + return 0; + } + + file->data = (const char *)html_buf; + file->len = len; + file->index = file->len; + file->pextension = NULL; + file->flags = 0; + + + return 1; +} + + + + +void fs_close_custom (struct fs_file *file) +{ +} + + + +static tCGI cgi_handlers[] = {{"/alarm_set.cgi", cgi_set_handler}}; +void cgi_init (void) +{ + http_set_cgi_handlers (cgi_handlers, sizeof (cgi_handlers) / sizeof (cgi_handlers[0])); +} + + -- cgit v1.2.3