@ -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 ) {
# if ndef 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 ) ;