summary refs log tree commit diff
path: root/quantum/eeconfig.h
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2021-10-07 01:47:14 +0100
committerGitHub <noreply@github.com>2021-10-07 01:47:14 +0100
commit60297a1099e5a310bd10a4d59fcb80bbc7fe4be5 (patch)
treef2a6dd86ea81921ea5e6d96039880cd350630404 /quantum/eeconfig.h
parent951331cd8d24480bb95cdf2fe4527ea99b32f1c1 (diff)
Reuse of EEPROM debounce logic (#14699)
* reuse rgb debounce logic

* Refactor led matrix

* Remove log line

* timeout should not be hard coded
Diffstat (limited to 'quantum/eeconfig.h')
-rw-r--r--quantum/eeconfig.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h
index bd39971b2c..22d874273c 100644
--- a/quantum/eeconfig.h
+++ b/quantum/eeconfig.h
@@ -111,3 +111,29 @@ void     eeconfig_update_haptic(uint32_t val);
 
 bool eeconfig_read_handedness(void);
 void eeconfig_update_handedness(bool val);
+
+#define EECONFIG_DEBOUNCE_HELPER(name, offset, config)                     \
+    static uint8_t dirty_##name = false;                                   \
+                                                                           \
+    static inline void eeconfig_init_##name(void) {                        \
+        eeprom_read_block(&config, offset, sizeof(config));                \
+        dirty_##name = false;                                              \
+    }                                                                      \
+    static inline void eeconfig_flush_##name(bool force) {                 \
+        if (force || dirty_##name) {                                       \
+            eeprom_update_block(&config, offset, sizeof(config));          \
+            dirty_##name = false;                                          \
+        }                                                                  \
+    }                                                                      \
+    static inline void eeconfig_flush_##name##_task(uint16_t timeout) {    \
+        static uint16_t flush_timer = 0;                                   \
+        if (timer_elapsed(flush_timer) > timeout) {                        \
+            eeconfig_flush_##name(false);                                  \
+            flush_timer = timer_read();                                    \
+        }                                                                  \
+    }                                                                      \
+    static inline void eeconfig_flag_##name(bool v) { dirty_##name |= v; } \
+    static inline void eeconfig_write_##name(typeof(config) conf) {        \
+        memcpy(&config, &conf, sizeof(config));                            \
+        eeconfig_flag_##name(true);                                        \
+    }