]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - tmk_core/protocol/lufa/lufa.c
Fixes issue #900
[qmk_firmware.git] / tmk_core / protocol / lufa / lufa.c
index aeb5f07815378f1da7f37c0f38080cabad30621d..097189770668460ad3e817a64babc039fd1c64fd 100644 (file)
@@ -52,6 +52,7 @@
 #include "descriptor.h"
 #include "lufa.h"
 #include "quantum.h"
+#include <util/atomic.h>
 
 #ifdef NKRO_ENABLE
   #include "keycode_config.h"
 #ifdef BLUETOOTH_ENABLE
     #include "bluetooth.h"
 #endif
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
 
 #ifdef VIRTSER_ENABLE
     #include "virtser.h"
 #endif
 
 #if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
-    #include "rgblight.h"        
+    #include "rgblight.h"
 #endif
 
 #ifdef MIDI_ENABLE
@@ -377,7 +381,9 @@ void EVENT_USB_Device_WakeUp()
 #ifdef CONSOLE_ENABLE
 static bool console_flush = false;
 #define CONSOLE_FLUSH_SET(b)   do { \
-    uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\
+    console_flush = b; \
+  } \
 } while (0)
 
 // called every 1ms
@@ -590,9 +596,35 @@ static uint8_t keyboard_leds(void)
     return keyboard_led_stats;
 }
 
+#define SendToUSB 1
+#define SendToBT  2
+#define SendToBLE 4
+
+static inline uint8_t where_to_send(void) {
+#ifdef ADAFRUIT_BLE_ENABLE
+#if 0
+  if (adafruit_ble_is_connected()) {
+    // For testing, send to BLE as a priority
+    return SendToBLE;
+  }
+#endif
+
+  // This is the real policy
+  if (USB_DeviceState != DEVICE_STATE_Configured) {
+    if (adafruit_ble_is_connected()) {
+      return SendToBLE;
+    }
+  }
+#endif
+  return ((USB_DeviceState == DEVICE_STATE_Configured) ? SendToUSB : 0)
+#ifdef BLUETOOTH_ENABLE
+    || SendToBT
+#endif
+    ;
+}
+
 static void send_keyboard(report_keyboard_t *report)
 {
-
 #ifdef BLUETOOTH_ENABLE
     bluefruit_serial_send(0xFD);
     for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
@@ -601,9 +633,17 @@ static void send_keyboard(report_keyboard_t *report)
 #endif
 
     uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
+    }
+#endif
+
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     /* Select the Keyboard Report Endpoint */
 #ifdef NKRO_ENABLE
@@ -656,8 +696,17 @@ static void send_mouse(report_mouse_t *report)
 
     uint8_t timeout = 255;
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    uint8_t where = where_to_send();
+
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      // FIXME: mouse buttons
+      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
+    }
+#endif
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     /* Select the Mouse Report Endpoint */
     Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
@@ -683,7 +732,7 @@ static void send_system(uint16_t data)
 
     report_extra_t r = {
         .report_id = REPORT_ID_SYSTEM,
-        .usage = data
+        .usage = data - SYSTEM_POWER_DOWN + 1
     };
     Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM);
 
@@ -715,9 +764,16 @@ static void send_consumer(uint16_t data)
 #endif
 
     uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      adafruit_ble_send_consumer_key(data, 0);
+    }
+#endif
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     report_extra_t r = {
         .report_id = REPORT_ID_CONSUMER,
@@ -1127,7 +1183,7 @@ int main(void)
 
     print("Keyboard start.\n");
     while (1) {
-        #ifndef BLUETOOTH_ENABLE
+        #if !defined(BLUETOOTH_ENABLE) && !defined(ADAFRUIT_BLE_ENABLE)
         while (USB_DeviceState == DEVICE_STATE_Suspended) {
             print("[s]");
             suspend_power_down();
@@ -1143,11 +1199,15 @@ int main(void)
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        
+
 #if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
         rgblight_task();
 #endif
 
+#ifdef ADAFRUIT_BLE_ENABLE
+        adafruit_ble_task();
+#endif
+
 #ifdef VIRTSER_ENABLE
         virtser_task();
         CDC_Device_USBTask(&cdc_device);