Connect the adafruit ble code to the lufa main loop
There are now 3 potential locations to send HID reports: 1. USB 2. The bluefruit easy key 3. Adafruit BLE Generally speaking, if USB is connected then we should prefer to send the reports there; it is generally the best channel for this. The bluefruit module has no feedback about bluetooth connectivity so the code must speculatively send reports over both USB and bluetooth. The BLE module has connectivity feedback. In general we want to prefer to send HID reports over USB while connected there, even if BLE is connected. Except that it is convenient to force them over BLE while testing the implementation. This policy has been extracted out into a where_to_send function which returns a bitmask of which of the channels should be used.
This commit is contained in:
parent
7f88c9506c
commit
044fa3ff85
1 changed files with 71 additions and 11 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue