aboutsummaryrefslogtreecommitdiff
path: root/src/mode.c
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-02-28 17:37:19 +0530
committerAkshay Nair <phenax5@gmail.com>2026-02-28 17:37:19 +0530
commit18268280dc6c0bd44035b53655ae43e9c88245bd (patch)
treec17b1703d8a3deb4cd67a6e6466d024f02a49bb7 /src/mode.c
parent02c12bfedcf669df81491ea49502a982e980bcda (diff)
downloaddaft-watch-18268280dc6c0bd44035b53655ae43e9c88245bd.tar.gz
daft-watch-18268280dc6c0bd44035b53655ae43e9c88245bd.zip
Add set time mode + test for button
Diffstat (limited to '')
-rw-r--r--src/mode.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mode.c b/src/mode.c
new file mode 100644
index 0000000..b6fad97
--- /dev/null
+++ b/src/mode.c
@@ -0,0 +1,74 @@
+#include <stdint.h>
+
+#include "mode.h"
+#include "rtc.h"
+
+enum Mode current_mode = ModeDisplayTime;
+volatile uint8_t new_minutes = 0;
+volatile uint8_t new_hours = 0;
+volatile uint8_t current_digit_index = 0;
+volatile uint16_t time_set_timeout_ticks = 0;
+
+void increment_digit() {
+ switch (current_digit_index) {
+ case 0:
+ new_hours = (new_hours + 10) % 24;
+ break;
+ case 1:
+ new_hours = (new_hours + 1) % 24;
+ break;
+ case 2:
+ new_minutes = (new_minutes + 10) % 60;
+ break;
+ case 3:
+ new_minutes = (new_minutes + 1) % 60;
+ break;
+ }
+}
+
+void apply_button_state(enum ButtonState button_state) {
+ switch (current_mode) {
+ case ModeDisplayTime:
+ switch (button_state) {
+ case ButtonLongPressed:
+ new_minutes = minutes;
+ new_hours = hours;
+ current_digit_index = 0;
+ current_mode = ModeSetTime;
+ break;
+ default:
+ break;
+ }
+ break;
+ case ModeSetTime:
+ if (button_state == ButtonIdle) {
+ time_set_timeout_ticks =
+ time_set_timeout_ticks == 0 ? 0 : time_set_timeout_ticks - 1;
+ if (time_set_timeout_ticks == 0) {
+ current_mode = ModeDisplayTime;
+ return;
+ }
+ } else {
+ time_set_timeout_ticks = 10 * 1024;
+ }
+
+ switch (button_state) {
+ case ButtonPressed:
+ increment_digit();
+ break;
+ case ButtonLongPressed:
+ if (current_digit_index == 3) {
+ rtc_set_minutes(new_minutes);
+ rtc_set_hours(new_hours);
+ current_mode = ModeDisplayTime;
+ current_digit_index = 0;
+ } else {
+ current_digit_index++;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+}