summaryrefslogtreecommitdiff
path: root/quantum/qmk_settings.c
diff options
context:
space:
mode:
authorIlya Zhuravlev <whatever@xyz.is>2021-07-01 15:10:05 -0400
committerIlya Zhuravlev <whatever@xyz.is>2021-07-17 23:46:10 -0400
commit2848a74f62a242955bc0dca92f22dc790b5d5df5 (patch)
treede8183b895f4198f4824c3dd6a99cdfea6e568df /quantum/qmk_settings.c
parent2affa3ac05be96b530408b2bf26d7ca53cdb133b (diff)
qmk_settings: retrieve supported settings
Diffstat (limited to 'quantum/qmk_settings.c')
-rw-r--r--quantum/qmk_settings.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/quantum/qmk_settings.c b/quantum/qmk_settings.c
index 50c4e39395..1524fd048d 100644
--- a/quantum/qmk_settings.c
+++ b/quantum/qmk_settings.c
@@ -64,6 +64,26 @@ void qmk_settings_reset(void) {
save_settings();
}
+void qmk_settings_query(uint16_t qsid_gt, void *buffer, size_t sz) {
+ /* set all FFs, so caller can identify when all settings are retrieved by looking for an 0xFFFF entry */
+ memset(buffer, 0xFF, sz);
+
+ size_t buffer_offset = 0;
+ for (size_t i = 0; i < sizeof(protos)/sizeof(*protos); ++i) {
+ uint16_t qsid;
+
+ /* if output buffer has no space left, bail out */
+ if (buffer_offset + sizeof(qsid) > sz)
+ break;
+
+ qsid = pgm_read_word(&protos[i].qsid);
+ if (qsid > qsid_gt) {
+ memcpy((char*)buffer + buffer_offset, &qsid, sizeof(qsid));
+ buffer_offset += sizeof(qsid);
+ }
+ }
+}
+
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)