From 3efbab131f2a978795fffb5f8efc63ab2b516658 Mon Sep 17 00:00:00 2001
From: Franz Pletz <fpletz@fnordicwalking.de>
Date: Wed, 21 Aug 2019 16:12:31 +0200
Subject: [PATCH] feat(utime.c): add python functions to set time

---
 Documentation/pycardium/utime.rst | 13 ++++++++++++-
 pycardium/modules/qstrdefs.h      |  2 ++
 pycardium/modules/utime.c         | 20 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/Documentation/pycardium/utime.rst b/Documentation/pycardium/utime.rst
index 958c888c..2d30d3d4 100644
--- a/Documentation/pycardium/utime.rst
+++ b/Documentation/pycardium/utime.rst
@@ -25,7 +25,18 @@ alarm.
 
 .. py:function:: utime.time()
 
-   Return the current timestamp in seconds since 2000-01-01
+   Return the current timestamp in seconds since 2000-01-01 00:00.
+
+.. py:function:: utime.set_time(secs)
+
+   Sets the time to ``secs`` seconds since 2000-01-01 00:00.
+   
+.. py:function:: utime.set_unix_time(secs)
+
+   Sets the time to ``secs`` seconds since 1970-01-01 00:00 UTC.
+   This corresponds a regular Unix timestamp which can be obtained
+   by running ``date +%s`` in a command line or ``int(time.time())``
+   in Python.
 
 .. py:function:: utime.localtime([secs])
 
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index 68b5a14e..acf598f1 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -47,6 +47,8 @@ Q(ticks_diff)
 Q(localtime)
 Q(mktime)
 Q(time)
+Q(set_time)
+Q(set_unix_time)
 
 /* vibra */
 Q(vibra)
diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c
index 15fa8167..13012d79 100644
--- a/pycardium/modules/utime.c
+++ b/pycardium/modules/utime.c
@@ -16,6 +16,23 @@
 /* MicroPython has its epoch at 2000-01-01. Our RTC is in UTC */
 #define EPOCH_OFFSET 946684800UL
 
+static mp_obj_t time_set_time(mp_obj_t secs)
+{
+	uint64_t timestamp =
+		mp_obj_get_int(secs) * 1000ULL + EPOCH_OFFSET * 1000ULL;
+	epic_rtc_set_milliseconds(timestamp);
+	return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(time_set_time_obj, time_set_time);
+
+static mp_obj_t time_set_unix_time(mp_obj_t secs)
+{
+	uint64_t timestamp = mp_obj_get_int(secs) * 1000ULL;
+	epic_rtc_set_milliseconds(timestamp);
+	return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(time_set_unix_time_obj, time_set_unix_time);
+
 static mp_obj_t time_time(void)
 {
 	mp_int_t seconds;
@@ -101,6 +118,9 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(time_alarm_obj, 1, 2, time_alarm);
 static const mp_rom_map_elem_t time_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) },
 	{ MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_set_time), MP_ROM_PTR(&time_set_time_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_set_unix_time),
+	  MP_ROM_PTR(&time_set_unix_time_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&time_localtime_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&time_mktime_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) },
-- 
GitLab