]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - protocol/vusb/vusb.c
Remove MCU dependent code from common/keyboard.c
[tmk_firmware.git] / protocol / vusb / vusb.c
index 0bfe21e92e2a272f14c665f0d2aa3e0be78acf5a..328885a9b5c99f95e66d853bf90fecc92d84d61d 100644 (file)
@@ -42,12 +42,12 @@ void vusb_transfer_keyboard(void)
     if (usbInterruptIsReady()) {
         if (kbuf_head != kbuf_tail) {
             usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t));
-            if (!debug_keyboard) {
-                print("keys: ");
-                for (int i = 0; i < REPORT_KEYS; i++) { phex(kbuf[kbuf_tail].keys[i]); print(" "); }
-                print(" mods: "); phex((kbuf[kbuf_tail]).mods); print("\n");
-            }
             kbuf_tail = (kbuf_tail + 1) % KBUF_SIZE;
+            if (debug_keyboard) {
+                print("V-USB: kbuf["); pdec(kbuf_tail); print("->"); pdec(kbuf_head); print("](");
+                phex((kbuf_head < kbuf_tail) ? (KBUF_SIZE - kbuf_tail + kbuf_head) : (kbuf_head - kbuf_tail));
+                print(")\n");
+            }
         }
     }
 }
@@ -88,23 +88,45 @@ static void send_keyboard(report_keyboard_t *report)
     } else {
         debug("kbuf: full\n");
     }
+
+    // NOTE: send key strokes of Macro
+    usbPoll();
+    vusb_transfer_keyboard();
 }
 
 
+typedef struct {
+    uint8_t report_id;
+    report_mouse_t report;
+} __attribute__ ((packed)) vusb_mouse_report_t;
+
 static void send_mouse(report_mouse_t *report)
 {
-    report->report_id = REPORT_ID_MOUSE;
+    vusb_mouse_report_t r = {
+        .report_id = REPORT_ID_MOUSE,
+        .report = *report
+    };
     if (usbInterruptIsReady3()) {
-        usbSetInterrupt3((void *)report, sizeof(*report));
+        usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
     }
 }
 
+
+typedef struct {
+    uint8_t  report_id;
+    uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
 static void send_system(uint16_t data)
 {
-    // Not need static?
-    static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
-    report[1] = data&0xFF;
-    report[2] = (data>>8)&0xFF;
+    static uint16_t last_data = 0;
+    if (data == last_data) return;
+    last_data = data;
+
+    report_extra_t report = {
+        .report_id = REPORT_ID_SYSTEM,
+        .usage = data
+    };
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     }
@@ -116,10 +138,10 @@ static void send_consumer(uint16_t data)
     if (data == last_data) return;
     last_data = data;
 
-    // Not need static?
-    static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
-    report[1] = data&0xFF;
-    report[2] = (data>>8)&0xFF;
+    report_extra_t report = {
+        .report_id = REPORT_ID_CONSUMER,
+        .usage = data
+    };
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     }
@@ -146,8 +168,8 @@ usbRequest_t    *rq = (void *)data;
         if(rq->bRequest == USBRQ_HID_GET_REPORT){
             debug("GET_REPORT:");
             /* we only have one report type, so don't look at wValue */
-            usbMsgPtr = (void *)keyboard_report_prev;
-            return sizeof(*keyboard_report_prev);
+            usbMsgPtr = (void *)keyboard_report;
+            return sizeof(*keyboard_report);
         }else if(rq->bRequest == USBRQ_HID_GET_IDLE){
             debug("GET_IDLE: ");
             //debug_hex(vusb_idle_rate);