|
|
@ -53,6 +53,7 @@ |
|
|
|
#include "lufa.h" |
|
|
|
#include "quantum.h" |
|
|
|
#include <util/atomic.h> |
|
|
|
#include "outputselect.h" |
|
|
|
|
|
|
|
#ifdef NKRO_ENABLE |
|
|
|
#include "keycode_config.h" |
|
|
@ -589,59 +590,33 @@ void EVENT_USB_Device_ControlRequest(void) |
|
|
|
|
|
|
|
/******************************************************************************* |
|
|
|
* Host driver |
|
|
|
p |
|
|
|
******************************************************************************/ |
|
|
|
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) |
|
|
|
{ |
|
|
|
uint8_t timeout = 255; |
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef BLUETOOTH_ENABLE |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { |
|
|
|
bluefruit_serial_send(report->raw[i]); |
|
|
|
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { |
|
|
|
bluefruit_serial_send(report->raw[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
uint8_t timeout = 255; |
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef ADAFRUIT_BLE_ENABLE |
|
|
|
if (where & SendToBLE) { |
|
|
|
if (where == OUTPUT_ADAFRUIT_BLE) { |
|
|
|
adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
if (!(where & SendToUSB)) { |
|
|
|
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
@ -681,30 +656,31 @@ static void send_keyboard(report_keyboard_t *report) |
|
|
|
static void send_mouse(report_mouse_t *report) |
|
|
|
{ |
|
|
|
#ifdef MOUSE_ENABLE |
|
|
|
uint8_t timeout = 255; |
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef BLUETOOTH_ENABLE |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x03); |
|
|
|
bluefruit_serial_send(report->buttons); |
|
|
|
bluefruit_serial_send(report->x); |
|
|
|
bluefruit_serial_send(report->y); |
|
|
|
bluefruit_serial_send(report->v); // should try sending the wheel v here |
|
|
|
bluefruit_serial_send(report->h); // should try sending the wheel h here |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x03); |
|
|
|
bluefruit_serial_send(report->buttons); |
|
|
|
bluefruit_serial_send(report->x); |
|
|
|
bluefruit_serial_send(report->y); |
|
|
|
bluefruit_serial_send(report->v); // should try sending the wheel v here |
|
|
|
bluefruit_serial_send(report->h); // should try sending the wheel h here |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
uint8_t timeout = 255; |
|
|
|
|
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef ADAFRUIT_BLE_ENABLE |
|
|
|
if (where & SendToBLE) { |
|
|
|
if (where == OUTPUT_ADAFRUIT_BLE) { |
|
|
|
// FIXME: mouse buttons |
|
|
|
adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h); |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (!(where & SendToUSB)) { |
|
|
|
|
|
|
|
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
@ -746,32 +722,34 @@ static void send_system(uint16_t data) |
|
|
|
|
|
|
|
static void send_consumer(uint16_t data) |
|
|
|
{ |
|
|
|
uint8_t timeout = 255; |
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef BLUETOOTH_ENABLE |
|
|
|
static uint16_t last_data = 0; |
|
|
|
if (data == last_data) return; |
|
|
|
last_data = data; |
|
|
|
uint16_t bitmap = CONSUMER2BLUEFRUIT(data); |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x02); |
|
|
|
bluefruit_serial_send((bitmap>>8)&0xFF); |
|
|
|
bluefruit_serial_send(bitmap&0xFF); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { |
|
|
|
static uint16_t last_data = 0; |
|
|
|
if (data == last_data) return; |
|
|
|
last_data = data; |
|
|
|
uint16_t bitmap = CONSUMER2BLUEFRUIT(data); |
|
|
|
bluefruit_serial_send(0xFD); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x02); |
|
|
|
bluefruit_serial_send((bitmap>>8)&0xFF); |
|
|
|
bluefruit_serial_send(bitmap&0xFF); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
bluefruit_serial_send(0x00); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
uint8_t timeout = 255; |
|
|
|
uint8_t where = where_to_send(); |
|
|
|
|
|
|
|
#ifdef ADAFRUIT_BLE_ENABLE |
|
|
|
if (where & SendToBLE) { |
|
|
|
if (where == OUTPUT_ADAFRUIT_BLE) { |
|
|
|
adafruit_ble_send_consumer_key(data, 0); |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (!(where & SendToUSB)) { |
|
|
|
|
|
|
|
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|