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.
daktil_manuform
Wez Furlong 2016-11-27 22:51:30 -08:00
parent 7f88c9506c
commit 044fa3ff85
1 changed files with 71 additions and 11 deletions

View File

@ -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);