]> git.earman.xyz Git - sensor-watch.git/commitdiff
Fill out watch_utility_convert_to_unix_time
authorWesley Ellis <tahnok@gmail.com>
Wed, 24 Nov 2021 02:32:25 +0000 (21:32 -0500)
committerWesley Ellis <tahnok@gmail.com>
Wed, 24 Nov 2021 02:32:25 +0000 (21:32 -0500)
watch-library/watch/watch_utility.c

index 0e95d4dc69461c14c95a517cb4eefd789a406bda..df80840497c46c51666bf8cd821a0700415deb3c 100644 (file)
@@ -36,8 +36,34 @@ const char * watch_utility_get_weekday(watch_date_time date_time) {
 }
 
 uint32_t watch_utility_convert_to_unix_time(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, uint32_t utc_offset) {
-    // TODO
-    return 0;
+    uint16_t DAYS_SO_FAR[] = {
+        0,   // Jan
+        31,  // Feb
+        59,  // March
+        90,  // April
+        120, // May
+        151, // June
+        181, // July
+        212, // August
+        243, // September
+        273, // October
+        304, // November
+        334  // December
+    };
+
+
+    uint32_t year_adj = year + 4800;
+    uint32_t febs = year_adj - (month <= 2 ? 1 : 0);  /* Februaries since base. */
+    uint32_t leap_days = 1 + (febs / 4) - (febs / 100) + (febs / 400);
+    uint32_t days = 365 * year_adj + leap_days + DAYS_SO_FAR[month - 1] + day - 1;
+    days -= 2472692;  /* Adjust to Unix epoch. */
+
+    uint32_t timestamp = days * 86400;
+    timestamp += (hour + utc_offset) * 3600;
+    timestamp += minute * 60;
+    timestamp += second;
+
+    return timestamp;
 }
 
 uint32_t watch_utility_date_time_to_unix_time(watch_date_time date_time, uint32_t utc_offset) {