summaryrefslogtreecommitdiffstats
path: root/watch-library/watch
diff options
context:
space:
mode:
authorjoeycastillo <joeycastillo@utexas.edu>2021-11-24 12:26:16 -0500
committerGitHub <noreply@github.com>2021-11-24 12:26:16 -0500
commit4a71def034590236b8a3527960cb2331876529a5 (patch)
tree482d9ed26504c9af16f80393accd34b6c8c40106 /watch-library/watch
parent7817e6696e438c8af74342ef10b576975a0e5448 (diff)
parent1a1a862d7941f720df79fb62fa03211cf083e127 (diff)
downloadSensor-Watch-4a71def034590236b8a3527960cb2331876529a5.tar.gz
Sensor-Watch-4a71def034590236b8a3527960cb2331876529a5.tar.bz2
Sensor-Watch-4a71def034590236b8a3527960cb2331876529a5.zip
Merge pull request #23 from tahnok/totp
Add initial TOTP watch face impl
Diffstat (limited to 'watch-library/watch')
-rw-r--r--watch-library/watch/watch_utility.c35
-rw-r--r--watch-library/watch/watch_utility.h21
2 files changed, 56 insertions, 0 deletions
diff --git a/watch-library/watch/watch_utility.c b/watch-library/watch/watch_utility.c
index bfa3073a..df808404 100644
--- a/watch-library/watch/watch_utility.c
+++ b/watch-library/watch/watch_utility.c
@@ -35,6 +35,41 @@ const char * watch_utility_get_weekday(watch_date_time date_time) {
return weekdays[(date_time.unit.day + 13 * (date_time.unit.month + 1) / 5 + date_time.unit.year + date_time.unit.year / 4 + 525) % 7];
}
+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) {
+ 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) {
+ return watch_utility_convert_to_unix_time(date_time.unit.year + WATCH_RTC_REFERENCE_YEAR, date_time.unit.month, date_time.unit.day, date_time.unit.hour, date_time.unit.minute, date_time.unit.second, utc_offset);
+}
+
float watch_utility_thermistor_temperature(uint16_t value, bool highside, float b_coefficient, float nominal_temperature, float nominal_resistance, float series_resistance) {
float reading = (float)value;
diff --git a/watch-library/watch/watch_utility.h b/watch-library/watch/watch_utility.h
index aada783f..a6035dc3 100644
--- a/watch-library/watch/watch_utility.h
+++ b/watch-library/watch/watch_utility.h
@@ -38,6 +38,27 @@
*/
const char * watch_utility_get_weekday(watch_date_time date_time);
+/** @brief Returns the UNIX time (seconds since 1970) for a given date/time in UTC.
+ * @param date_time The watch_date_time that you wish to convert.
+ * @param year The year of the date you wish to convert.
+ * @param month The month of the date you wish to convert.
+ * @param day The day of the date you wish to convert.
+ * @param hour The hour of the date you wish to convert.
+ * @param minute The minute of the date you wish to convert.
+ * @param second The second of the date you wish to convert.
+ * @return A UNIX timestamp for the given date/time and UTC offset.
+ * @note Implemented by Wesley Ellis (tahnok) and based on BSD-licensed code by Josh Haberman:
+ * https://blog.reverberate.org/2020/05/12/optimizing-date-algorithms.html
+ */
+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);
+
+/** @brief Returns the UNIX time (seconds since 1970) for a given watch_date_time struct.
+ * @param date_time The watch_date_time that you wish to convert.
+ * @param utc_offset The number of seconds that date_time is offset from UTC, or 0 if the time is UTC.
+ * @return A UNIX timestamp for the given watch_date_time and UTC offset.
+ */
+uint32_t watch_utility_date_time_to_unix_time(watch_date_time date_time, uint32_t utc_offset);
+
/** @brief Returns a temperature in degrees Celsius for a given thermistor voltage divider circuit.
* @param value The raw analog reading from the thermistor pin (0-65535)
* @param highside True if the thermistor is connected to VCC and the series resistor is connected