usb_report_handling.h (4209B)
1 // Copyright 2023 Stefan Kerkmann (@KarlK90) 2 // SPDX-License-Identifier: GPL-3.0-or-later 3 4 #pragma once 5 6 #include <ch.h> 7 #include <hal.h> 8 #include <stdint.h> 9 10 #include "timer.h" 11 12 typedef struct { 13 time_msecs_t idle_rate; 14 systime_t last_report; 15 uint8_t data[64]; 16 size_t length; 17 } usb_fs_report_t; 18 19 typedef struct { 20 usb_fs_report_t **reports; 21 const void (*get_report)(usb_fs_report_t **, uint8_t, usb_fs_report_t *); 22 const void (*set_report)(usb_fs_report_t **, const uint8_t *, size_t); 23 const void (*reset_report)(usb_fs_report_t **); 24 const void (*set_idle)(usb_fs_report_t **, uint8_t, uint8_t); 25 const uint8_t (*get_idle)(usb_fs_report_t **, uint8_t); 26 const bool (*idle_timer_elasped)(usb_fs_report_t **, uint8_t); 27 } usb_report_storage_t; 28 29 #define QMK_USB_REPORT_STROAGE_ENTRY(_report_id, _report_size) [_report_id] = &((usb_fs_report_t){.data = {[0] = _report_id}, .length = _report_size}) 30 31 #define QMK_USB_REPORT_STORAGE(_get_report, _set_report, _reset_report, _get_idle, _set_idle, _idle_timer_elasped, _report_count, _reports...) \ 32 &((usb_report_storage_t){ \ 33 .reports = (_Alignas(4) usb_fs_report_t *[_report_count]){_reports}, \ 34 .get_report = _get_report, \ 35 .set_report = _set_report, \ 36 .reset_report = _reset_report, \ 37 .get_idle = _get_idle, \ 38 .set_idle = _set_idle, \ 39 .idle_timer_elasped = _idle_timer_elasped, \ 40 }) 41 42 #define QMK_USB_REPORT_STORAGE_DEFAULT(_report_length) \ 43 QMK_USB_REPORT_STORAGE(&usb_get_report, /* _get_report */ \ 44 &usb_set_report, /* _set_report */ \ 45 &usb_reset_report, /* _reset_report */ \ 46 &usb_get_idle_rate, /* _get_idle */ \ 47 &usb_set_idle_rate, /* _set_idle */ \ 48 &usb_idle_timer_elapsed, /* _idle_timer_elasped */ \ 49 1, /* _report_count */ \ 50 QMK_USB_REPORT_STROAGE_ENTRY(0, _report_length)) 51 52 // USB HID SET_REPORT and GET_REPORT handling functions 53 void usb_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length); 54 void usb_shared_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length); 55 56 void usb_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report); 57 void usb_shared_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report); 58 59 void usb_reset_report(usb_fs_report_t **reports); 60 void usb_shared_reset_report(usb_fs_report_t **reports); 61 62 bool usb_get_report_cb(USBDriver *driver); 63 64 // USB HID SET_IDLE and GET_IDLE handling functions 65 void usb_idle_task(void); 66 67 void usb_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate); 68 void usb_shared_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate); 69 70 uint8_t usb_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id); 71 uint8_t usb_shared_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id); 72 73 bool usb_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id); 74 bool usb_shared_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id); 75 76 bool usb_get_idle_cb(USBDriver *driver); 77 bool usb_set_idle_cb(USBDriver *driver);