summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/datetime/DateTimeController.cpp31
-rw-r--r--src/components/datetime/DateTimeController.h9
-rw-r--r--src/main.cpp4
-rw-r--r--src/systemtask/SystemTask.h2
4 files changed, 20 insertions, 26 deletions
diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp
index 3bfbdc7..fbaa01b 100644
--- a/src/components/datetime/DateTimeController.cpp
+++ b/src/components/datetime/DateTimeController.cpp
@@ -14,7 +14,7 @@ namespace {
DateTime::DateTime(Controllers::Settings& settingsController) : settingsController {settingsController} {
}
-void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t) {
+void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> t) {
this->currentDateTime = t;
UpdateTime(previousSystickCounter); // Update internal state without updating the time
}
@@ -30,7 +30,7 @@ void DateTime::SetTime(
/* .tm_year = */ year - 1900,
};
tm.tm_isdst = -1; // Use DST value from local time zone
- currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm));
+ currentDateTime = std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::from_time_t(std::mktime(&tm)));
NRF_LOG_INFO("%d %d %d ", day, month, year);
NRF_LOG_INFO("%d %d %d ", hour, minute, second);
@@ -45,27 +45,20 @@ void DateTime::SetTime(
void DateTime::UpdateTime(uint32_t systickCounter) {
// Handle systick counter overflow
- uint32_t systickDelta = 0;
- if (systickCounter < previousSystickCounter) {
- systickDelta = 0xffffff - previousSystickCounter;
- systickDelta += systickCounter + 1;
- } else {
- systickDelta = systickCounter - previousSystickCounter;
- }
+ uint32_t systickDelta = (systickCounter - previousSystickCounter) & 0xffffff;
+ previousSystickCounter = systickCounter;
/*
* 1000 ms = 1024 ticks
*/
- auto correctedDelta = systickDelta / 1024;
- auto rest = (systickDelta - (correctedDelta * 1024));
- if (systickCounter >= rest) {
- previousSystickCounter = systickCounter - rest;
- } else {
- previousSystickCounter = 0xffffff - (rest - systickCounter);
- }
-
- currentDateTime += std::chrono::seconds(correctedDelta);
- uptime += std::chrono::seconds(correctedDelta);
+ // auto newSeconds = systickDelta >> 10;
+ // auto rest = systickDelta & ((1 << 10)-1);
+ subsecondTicks += systickDelta & ((1 << 10)-1);
+ systickDelta = (systickDelta >> 10) + (subsecondTicks >> 10);
+ subsecondTicks &= ((1 << 10)-1);
+
+ currentDateTime += std::chrono::seconds(systickDelta);
+ uptime += std::chrono::seconds(systickDelta);
auto dp = date::floor<date::days>(currentDateTime);
auto time = date::make_time(currentDateTime - dp);
diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h
index 00bbc2e..cf9d52c 100644
--- a/src/components/datetime/DateTimeController.h
+++ b/src/components/datetime/DateTimeController.h
@@ -65,7 +65,7 @@ namespace Pinetime {
const char* DayOfWeekShortToString() const;
static const char* MonthShortToStringLow(Months month);
- std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const {
+ std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> CurrentDateTime() const {
return currentDateTime;
}
std::chrono::seconds Uptime() const {
@@ -73,7 +73,7 @@ namespace Pinetime {
}
void Register(System::SystemTask* systemTask);
- void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t);
+ void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> t);
std::string FormattedTime();
private:
@@ -84,9 +84,10 @@ namespace Pinetime {
uint8_t hour = 0;
uint8_t minute = 0;
uint8_t second = 0;
+ uint16_t subsecondTicks = 0;
- uint32_t previousSystickCounter = 0;
- std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> currentDateTime;
+ uint32_t previousSystickCounter = 0; // FIXME: This could probably be 16 bits?
+ std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> currentDateTime;
std::chrono::seconds uptime {0};
bool isMidnightAlreadyNotified = false;
diff --git a/src/main.cpp b/src/main.cpp
index fa492d0..b58c7ed 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -164,9 +164,9 @@ Pinetime::System::SystemTask systemTask(spi,
*/
extern uint32_t __start_noinit_data;
extern uint32_t __stop_noinit_data;
-static constexpr uint32_t NoInit_MagicValue = 0xDEAD0000;
+static constexpr uint32_t NoInit_MagicValue = 0x3E470000;
uint32_t NoInit_MagicWord __attribute__((section(".noinit")));
-std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> NoInit_BackUpTime __attribute__((section(".noinit")));
+std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> NoInit_BackUpTime __attribute__((section(".noinit")));
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index c5b0379..704711c 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -35,7 +35,7 @@
#include "drivers/Watchdog.h"
#include "systemtask/Messages.h"
-extern std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> NoInit_BackUpTime;
+extern std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds> NoInit_BackUpTime;
namespace Pinetime {
namespace Drivers {
class Cst816S;