|
|
|
@ -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,6 +68,9 @@ |
|
|
|
|
#ifdef BLUETOOTH_ENABLE |
|
|
|
|
#include "bluetooth.h" |
|
|
|
|
#endif |
|
|
|
|
#ifdef ADAFRUIT_BLE_ENABLE |
|
|
|
|
#include "adafruit_ble.h" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
#include "virtser.h" |
|
|
|
@ -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) |
|
|
|
|
#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) |
|
|
|
|
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) |
|
|
|
|
#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(); |
|
|
|
@ -1059,6 +1115,10 @@ int main(void) |
|
|
|
|
rgblight_task(); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef ADAFRUIT_BLE_ENABLE |
|
|
|
|
adafruit_ble_task(); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef VIRTSER_ENABLE |
|
|
|
|
virtser_task(); |
|
|
|
|
CDC_Device_USBTask(&cdc_device); |
|
|
|
|