diff options
| author | Ilya Zhuravlev <whatever@xyz.is> | 2021-07-01 14:33:37 -0400 |
|---|---|---|
| committer | Ilya Zhuravlev <whatever@xyz.is> | 2021-07-17 23:46:10 -0400 |
| commit | 6b0df5146fc61fb853a9a7c7a397df0ca3be24e9 (patch) | |
| tree | 5bf65d462bbe2565954965843957c82630406072 /quantum/qmk_settings.c | |
| parent | b34258dbd644f13aeed00c3fa75e8d8297067f09 (diff) | |
qmk_settings: implement setting persistence
Diffstat (limited to 'quantum/qmk_settings.c')
| -rw-r--r-- | quantum/qmk_settings.c | 41 |
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; } |
