summaryrefslogtreecommitdiff
path: root/quantum/qmk_settings.c
diff options
context:
space:
mode:
authorIlya Zhuravlev <whatever@xyz.is>2021-07-01 14:33:37 -0400
committerIlya Zhuravlev <whatever@xyz.is>2021-07-17 23:46:10 -0400
commit6b0df5146fc61fb853a9a7c7a397df0ca3be24e9 (patch)
tree5bf65d462bbe2565954965843957c82630406072 /quantum/qmk_settings.c
parentb34258dbd644f13aeed00c3fa75e8d8297067f09 (diff)
qmk_settings: implement setting persistence
Diffstat (limited to 'quantum/qmk_settings.c')
-rw-r--r--quantum/qmk_settings.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/quantum/qmk_settings.c b/quantum/qmk_settings.c
index 346cd8023c..50c4e39395 100644
--- a/quantum/qmk_settings.c
+++ b/quantum/qmk_settings.c
@@ -1,9 +1,11 @@
#include "qmk_settings.h"
#include <stddef.h>
-#include "progmem.h"
#include <string.h>
+#include "progmem.h"
+#include "dynamic_keymap.h"
+
qmk_settings_t QS;
#define DECLARE_SETTING(id, field) { .qsid=id, .ptr=&QS.field, .sz=sizeof(QS.field) }
@@ -26,6 +28,42 @@ static const qmk_settings_proto_t *find_setting(uint16_t qsid) {
return NULL;
}
+static void load_settings(void) {
+ for (size_t i = 0; i < sizeof(qmk_settings_t); ++i) {
+ uint8_t byte;
+ byte = dynamic_keymap_get_qmk_settings(i);
+ memcpy((char*)&QS + i, &byte, 1);
+ }
+}
+
+static void save_settings(void) {
+ for (size_t i = 0; i < sizeof(qmk_settings_t); ++i) {
+ uint8_t old_byte, new_byte;
+ old_byte = dynamic_keymap_get_qmk_settings(i);
+ memcpy(&new_byte, (char*)&QS + i, 1);
+ if (old_byte != new_byte)
+ dynamic_keymap_set_qmk_settings(i, new_byte);
+ }
+}
+
+void qmk_settings_init(void) {
+ load_settings();
+}
+
+void qmk_settings_reset(void) {
+ /* TODO: this should take values from various #define's */
+ QS.grave_esc_override = 0;
+ QS.debounce_time = 5;
+ QS.auto_shift = 0;
+ QS.auto_shift_timeout = 175;
+ QS.osk_tap_toggle = 0;
+ QS.osk_timeout = 5000;
+ QS.tapping_term = 200;
+ QS.tap_hold = 0;
+
+ save_settings();
+}
+
int qmk_settings_get(uint16_t qsid, void *setting, size_t maxsz) {
const qmk_settings_proto_t *proto = find_setting(qsid);
if (!proto || pgm_read_word(&proto->sz) > maxsz)
@@ -39,5 +77,6 @@ int qmk_settings_set(uint16_t qsid, const void *setting, size_t maxsz) {
if (!proto || pgm_read_word(&proto->sz) > maxsz)
return -1;
memcpy(pgm_read_ptr(&proto->ptr), setting, pgm_read_word(&proto->sz));
+ save_settings();
return 0;
}