diff options
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 82 | 
1 files changed, 71 insertions, 11 deletions
| diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 39d4824b6b..ee2552c190 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -52,6 +52,7 @@  #include "descriptor.h"  #include "lufa.h"  #include "quantum.h" +#include <util/atomic.h>  #ifdef NKRO_ENABLE    #include "keycode_config.h" @@ -67,13 +68,16 @@  #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 @@ -297,7 +301,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 @@ -501,9 +507,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++) { @@ -512,9 +544,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 @@ -567,8 +607,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); @@ -626,9 +675,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, @@ -1038,7 +1094,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(); @@ -1054,11 +1110,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); | 
