From 09d3e2771099ff1ca7e7bd8882644eb2b2807763 Mon Sep 17 00:00:00 2001
From: Ryan <fauxpark@gmail.com>
Date: Wed, 5 Oct 2022 09:19:12 +1100
Subject: [PATCH] Refactor more host code (programmable button & digitizer)
 (#18565)

---
 tmk_core/protocol/chibios/chibios.c  |  4 +--
 tmk_core/protocol/chibios/usb_main.c |  9 ++-----
 tmk_core/protocol/host.c             | 38 +++++++++++++++-------------
 tmk_core/protocol/host.h             |  1 -
 tmk_core/protocol/host_driver.h      |  2 +-
 tmk_core/protocol/lufa/lufa.c        | 13 +++-------
 tmk_core/protocol/vusb/vusb.c        | 13 +++-------
 7 files changed, 30 insertions(+), 50 deletions(-)

diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c
index 024160a9257..82ade4259b0 100644
--- a/tmk_core/protocol/chibios/chibios.c
+++ b/tmk_core/protocol/chibios/chibios.c
@@ -59,11 +59,9 @@ uint8_t keyboard_leds(void);
 void    send_keyboard(report_keyboard_t *report);
 void    send_mouse(report_mouse_t *report);
 void    send_extra(uint8_t report_id, uint16_t data);
-void    send_programmable_button(uint32_t data);
-void    send_digitizer(report_digitizer_t *report);
 
 /* host struct */
-host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra, send_programmable_button};
+host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra};
 
 #ifdef VIRTSER_ENABLE
 void virtser_task(void);
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index 3e64ceab194..3fd34a604e5 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -970,7 +970,7 @@ void send_extra(uint8_t report_id, uint16_t data) {
 #endif
 }
 
-void send_programmable_button(uint32_t data) {
+void send_programmable_button(report_programmable_button_t *report) {
 #ifdef PROGRAMMABLE_BUTTON_ENABLE
     osalSysLock();
     if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
@@ -988,13 +988,8 @@ void send_programmable_button(uint32_t data) {
             return;
         }
     }
-    static report_programmable_button_t report = {
-        .report_id = REPORT_ID_PROGRAMMABLE_BUTTON,
-    };
 
-    report.usage = data;
-
-    usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report));
+    usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(report_programmable_button_t));
     osalSysUnlock();
 #endif
 }
diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c
index 7b051a881b9..e6c12d8a36f 100644
--- a/tmk_core/protocol/host.c
+++ b/tmk_core/protocol/host.c
@@ -16,13 +16,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <stdint.h>
-//#include <avr/interrupt.h>
 #include "keyboard.h"
 #include "keycode.h"
 #include "host.h"
 #include "util.h"
 #include "debug.h"
-#include "digitizer.h"
+
+#ifdef DIGITIZER_ENABLE
+#    include "digitizer.h"
+#endif
 
 #ifdef JOYSTICK_ENABLE
 #    include "joystick.h"
@@ -39,9 +41,8 @@ extern keymap_config_t keymap_config;
 #endif
 
 static host_driver_t *driver;
-static uint16_t       last_system_report              = 0;
-static uint16_t       last_consumer_report            = 0;
-static uint32_t       last_programmable_button_report = 0;
+static uint16_t       last_system_report   = 0;
+static uint16_t       last_consumer_report = 0;
 
 void host_set_driver(host_driver_t *d) {
     driver = d;
@@ -200,13 +201,12 @@ void host_joystick_send(joystick_t *joystick) {
 
 __attribute__((weak)) void send_joystick(report_joystick_t *report) {}
 
+#ifdef DIGITIZER_ENABLE
 void host_digitizer_send(digitizer_t *digitizer) {
-    if (!driver) return;
-
     report_digitizer_t report = {
-#ifdef DIGITIZER_SHARED_EP
+#    ifdef DIGITIZER_SHARED_EP
         .report_id = REPORT_ID_DIGITIZER,
-#endif
+#    endif
         .tip     = digitizer->tipswitch & 0x1,
         .inrange = digitizer->inrange & 0x1,
         .x       = (uint16_t)(digitizer->x * 0x7FFF),
@@ -215,16 +215,22 @@ void host_digitizer_send(digitizer_t *digitizer) {
 
     send_digitizer(&report);
 }
+#endif
 
 __attribute__((weak)) void send_digitizer(report_digitizer_t *report) {}
 
-void host_programmable_button_send(uint32_t report) {
-    if (report == last_programmable_button_report) return;
-    last_programmable_button_report = report;
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+void host_programmable_button_send(uint32_t data) {
+    report_programmable_button_t report = {
+        .report_id = REPORT_ID_PROGRAMMABLE_BUTTON,
+        .usage     = data,
+    };
 
-    if (!driver) return;
-    (*driver->send_programmable_button)(report);
+    send_programmable_button(&report);
 }
+#endif
+
+__attribute__((weak)) void send_programmable_button(report_programmable_button_t *report) {}
 
 uint16_t host_last_system_report(void) {
     return last_system_report;
@@ -233,7 +239,3 @@ uint16_t host_last_system_report(void) {
 uint16_t host_last_consumer_report(void) {
     return last_consumer_report;
 }
-
-uint32_t host_last_programmable_button_report(void) {
-    return last_programmable_button_report;
-}
diff --git a/tmk_core/protocol/host.h b/tmk_core/protocol/host.h
index 6b15f0d0c10..08bd498d389 100644
--- a/tmk_core/protocol/host.h
+++ b/tmk_core/protocol/host.h
@@ -51,7 +51,6 @@ void    host_programmable_button_send(uint32_t data);
 
 uint16_t host_last_system_report(void);
 uint16_t host_last_consumer_report(void);
-uint32_t host_last_programmable_button_report(void);
 
 #ifdef __cplusplus
 }
diff --git a/tmk_core/protocol/host_driver.h b/tmk_core/protocol/host_driver.h
index ae6e40ddc38..bb4dcdd8774 100644
--- a/tmk_core/protocol/host_driver.h
+++ b/tmk_core/protocol/host_driver.h
@@ -28,8 +28,8 @@ typedef struct {
     void (*send_keyboard)(report_keyboard_t *);
     void (*send_mouse)(report_mouse_t *);
     void (*send_extra)(uint8_t, uint16_t);
-    void (*send_programmable_button)(uint32_t);
 } host_driver_t;
 
 void send_joystick(report_joystick_t *report);
 void send_digitizer(report_digitizer_t *report);
+void send_programmable_button(report_programmable_button_t *report);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 6012d96fd59..869ed71d769 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -61,10 +61,6 @@
 extern keymap_config_t keymap_config;
 #endif
 
-#ifdef AUDIO_ENABLE
-#    include "audio.h"
-#endif
-
 #ifdef VIRTSER_ENABLE
 #    include "virtser.h"
 #endif
@@ -89,8 +85,7 @@ static uint8_t keyboard_leds(void);
 static void    send_keyboard(report_keyboard_t *report);
 static void    send_mouse(report_mouse_t *report);
 static void    send_extra(uint8_t report_id, uint16_t data);
-static void    send_programmable_button(uint32_t data);
-host_driver_t  lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra, send_programmable_button};
+host_driver_t  lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra};
 
 #ifdef VIRTSER_ENABLE
 // clang-format off
@@ -676,11 +671,9 @@ static void send_extra(uint8_t report_id, uint16_t data) {
 #endif
 }
 
-static void send_programmable_button(uint32_t data) {
+void send_programmable_button(report_programmable_button_t *report) {
 #ifdef PROGRAMMABLE_BUTTON_ENABLE
-    static report_programmable_button_t r;
-    r = (report_programmable_button_t){.report_id = REPORT_ID_PROGRAMMABLE_BUTTON, .usage = data};
-    send_report(&r, sizeof(r));
+    send_report(report, sizeof(report_programmable_button_t));
 #endif
 }
 
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 013d637b6fc..8456d2c5ab8 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -225,9 +225,8 @@ static uint8_t keyboard_leds(void);
 static void    send_keyboard(report_keyboard_t *report);
 static void    send_mouse(report_mouse_t *report);
 static void    send_extra(uint8_t report_id, uint16_t data);
-static void    send_programmable_button(uint32_t data);
 
-static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_extra, send_programmable_button};
+static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_extra};
 
 host_driver_t *vusb_driver(void) {
     return &driver;
@@ -292,16 +291,10 @@ void send_digitizer(report_digitizer_t *report) {
 #endif
 }
 
-static void send_programmable_button(uint32_t data) {
+void send_programmable_button(report_programmable_button_t *report) {
 #ifdef PROGRAMMABLE_BUTTON_ENABLE
-    static report_programmable_button_t report = {
-        .report_id = REPORT_ID_PROGRAMMABLE_BUTTON,
-    };
-
-    report.usage = data;
-
     if (usbInterruptIsReadyShared()) {
-        usbSetInterruptShared((void *)&report, sizeof(report));
+        usbSetInterruptShared((void *)report, sizeof(report_programmable_button_t));
     }
 #endif
 }