From 756c13dfa4172ae5722f491fbbbbf9c4494cd27c Mon Sep 17 00:00:00 2001
From: Ferdinand Bachmann <theferdi265@gmail.com>
Date: Sat, 31 Aug 2019 01:19:35 +0200
Subject: [PATCH] epicardium/rtc: fix numerically unstable subsecond decoding

the subsecond encoding function from epic_rtc_set_milliseconds and the
corresponding decoding function from epic_rtc_get_milliseconds are not
numerically stable.

i.e., encoding 5 milliseconds to 20 subsecs and immediately afterwards decoding
that yields 4 milliseconds.

Adding a bias of 999 (0.24 milliseconds) to the decoding function makes it
numerically stable, while never decoding any subsecond value to more than 999
milliseconds.
---
 epicardium/modules/rtc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c
index b07fb6fcc..24cf783cc 100644
--- a/epicardium/modules/rtc.c
+++ b/epicardium/modules/rtc.c
@@ -44,7 +44,7 @@ uint64_t epic_rtc_get_milliseconds(void)
 	while (RTC_GetTime(&sec, &subsec) == E_BUSY) {
 		vTaskDelay(pdMS_TO_TICKS(4));
 	}
-	return subsec * 1000ULL / 4096 + sec * 1000ULL;
+	return (subsec * 1000ULL + 999ULL) / 4096 + sec * 1000ULL;
 }
 
 void epic_rtc_set_milliseconds(uint64_t milliseconds)
-- 
GitLab