diff options
| author | Ilya Zhuravlev <whatever@xyz.is> | 2021-06-29 19:43:11 -0400 |
|---|---|---|
| committer | Ilya Zhuravlev <whatever@xyz.is> | 2021-07-17 23:46:10 -0400 |
| commit | 8dc2d0728872b13576da33af010cbc5a461051cb (patch) | |
| tree | d174b7c8f5022bf819ec9172affc1732099a9270 /quantum/qmk_settings.c | |
| parent | c0cd1bfc6c6ee9fddf53ab31529e0a119c85b05f (diff) | |
qmk_settings: initial prototype
Diffstat (limited to 'quantum/qmk_settings.c')
| -rw-r--r-- | quantum/qmk_settings.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/quantum/qmk_settings.c b/quantum/qmk_settings.c new file mode 100644 index 0000000000..d63a54a8c5 --- /dev/null +++ b/quantum/qmk_settings.c @@ -0,0 +1,36 @@ +#include "qmk_settings.h" + +#include <stddef.h> +#include "progmem.h" +#include <string.h> + +qmk_settings_t QS; + +#define DECLARE_SETTING(id, field) { .qsid=id, .ptr=&QS.field, .sz=sizeof(QS.field) } + +static const qmk_settings_proto_t protos[] PROGMEM = { + DECLARE_SETTING(1, grave_esc_override), +}; + +static const qmk_settings_proto_t *find_setting(uint16_t qsid) { + for (size_t i = 0; i < sizeof(protos)/sizeof(*protos); ++i) + if (pgm_read_word(&protos[i].qsid) == qsid) + return &protos[i]; + return NULL; +} + +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) + return -1; + memcpy(setting, pgm_read_ptr(&proto->ptr), pgm_read_word(&proto->sz)); + return 0; +} + +int qmk_settings_set(uint16_t qsid, const void *setting, size_t maxsz) { + const qmk_settings_proto_t *proto = find_setting(qsid); + if (!proto || pgm_read_word(&proto->sz) > maxsz) + return -1; + memcpy(pgm_read_ptr(&proto->ptr), setting, pgm_read_word(&proto->sz)); + return 0; +} |
