]> git.earman.xyz Git - sensor-watch.git/commitdiff
mars clock: add support for sols
authorJoey Castillo <joeycastillo@utexas.edu>
Sat, 5 Mar 2022 14:59:32 +0000 (09:59 -0500)
committerJoey Castillo <joeycastillo@utexas.edu>
Sat, 5 Mar 2022 14:59:32 +0000 (09:59 -0500)
movement/watch_faces/clock/mars_time_face.c
movement/watch_faces/clock/mars_time_face.h

index 510cc75d943d6090518d281fd0bd97f95b68e06a..264f714f998796c5a903d7313e264f04deca527c 100644 (file)
 // note: lander coordinates come from Mars24's `marslandmarks.xml` file
 static double site_longitudes[MARS_TIME_NUM_SITES] = {
     0,                      // Mars Coordinated Time, at the meridian
-    360.0 - 137.441635,     // Curiosity lander site
-    360.0 - 135.623447,     // InSight lander site
+    360.0 - 109.9,          // Zhurong lander site
     360.0 - 77.45088572,    // Perseverance lander site
-    360.0 - 109.9           // Zhurong lander site
+    360.0 - 135.623447,     // InSight lander site
+    360.0 - 137.441635,     // Curiosity lander site
 };
 
 static char site_names[MARS_TIME_NUM_SITES][3] = {
     "MC",
-    "CU",
-    "IN",
+    "ZH",
     "PE",
-    "ZH"
+    "IN",
+    "CU",
+};
+
+static uint16_t landing_sols[MARS_TIME_NUM_SITES] = {
+    0,
+    52387,
+    52304,
+    51511,
+    49269,
 };
 
 typedef struct {
@@ -63,6 +71,8 @@ static void _update(movement_settings_t *settings, mars_time_state_t *state) {
     char buf[11];
     watch_date_time date_time = watch_rtc_get_date_time();
     uint32_t now = watch_utility_date_time_to_unix_time(date_time, movement_timezone_offsets[settings->bit.time_zone] * 60);
+    // TODO: I'm skipping over some steps here.
+    // https://www.giss.nasa.gov/tools/mars24/help/algorithm.html
     double jdut = 2440587.5 + ((double)now / 86400.0);
     double jdtt = jdut + ((37.0 + 32.184) / 86400.0);
     double jd2k = jdtt - 2451545.0;
@@ -78,11 +88,21 @@ static void _update(movement_settings_t *settings, mars_time_state_t *state) {
         lmt = fmod(lmst + 24, 24);
     }
 
-    mars_clock_hms_t mars_time;
-    _h_to_hms(&mars_time, lmt);
-    sprintf(&buf[0], "%s  %02d%02d%02d", site_names[state->current_site], mars_time.hour, mars_time.minute, mars_time.second);
-    watch_set_colon();
-    watch_set_indicator(WATCH_INDICATOR_24H);
+    if (state->displaying_sol) {
+        // TODO: this is not right, mission sol should turn over at midnight local time?
+        uint16_t sol = floor(msd) - landing_sols[state->current_site];
+        if (sol < 1000) sprintf(&buf[0], "%s  Sol%3d", site_names[state->current_site], sol);
+        else sprintf(&buf[0], "%s s%6d", site_names[state->current_site], sol);
+        watch_clear_colon();
+        watch_clear_indicator(WATCH_INDICATOR_24H);        
+    } else {
+        mars_clock_hms_t mars_time;
+        _h_to_hms(&mars_time, lmt);
+        sprintf(&buf[0], "%s  %02d%02d%02d", site_names[state->current_site], mars_time.hour, mars_time.minute, mars_time.second);
+        watch_set_colon();
+        watch_set_indicator(WATCH_INDICATOR_24H);        
+    }
+
     watch_display_string(buf, 0);
 }
 
@@ -112,6 +132,10 @@ bool mars_time_face_loop(movement_event_t event, movement_settings_t *settings,
             movement_move_to_next_face();
             break;
         case EVENT_LIGHT_BUTTON_UP:
+            state->displaying_sol = !state->displaying_sol;
+            _update(settings, state);
+            break;
+        case EVENT_LIGHT_LONG_PRESS:
             movement_illuminate_led();
             break;
         case EVENT_ALARM_BUTTON_UP:
index d41c0dada11f3fb60bfa410874de096fc0a7b009..d34792e98c8a58988888555e04e629da71249c79 100644 (file)
 
 typedef enum {
     MARS_TIME_MERIDIAN,
-    MARS_TIME_CURIOSITY_SITE,
-    MARS_TIME_INSIGHT_SITE,
-    MARS_TIME_PERSEVERANCE_SITE,
     MARS_TIME_ZHURONG_SITE,
+    MARS_TIME_PERSEVERANCE_SITE,
+    MARS_TIME_INSIGHT_SITE,
+    MARS_TIME_CURIOSITY_SITE,
     MARS_TIME_NUM_SITES,
 } mars_time_site_t;
 
 typedef struct {
     mars_time_site_t current_site;
+    bool displaying_sol;
 } mars_time_state_t;
 
 void mars_time_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr);