diff options
Diffstat (limited to 'tmk_core/protocol')
| -rw-r--r-- | tmk_core/protocol/lufa.mk | 3 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 116 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/outputselect.c | 56 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/outputselect.h | 41 | 
4 files changed, 146 insertions, 70 deletions
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 151d26cbc8..de0cc795f6 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -8,13 +8,14 @@ LUFA_PATH ?= $(LUFA_DIR)/LUFA-git  ifneq (, $(wildcard $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk))      # New build system from 20120730      LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA -    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk  +    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk  else      include $(TMK_PATH)/$(LUFA_PATH)/LUFA/makefile  endif  LUFA_SRC = lufa.c \  	   descriptor.c \ +	   outputselect.c \  	   $(LUFA_SRC_USB)  ifeq ($(strip $(MIDI_ENABLE)), yes) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 6dd5959dc4..ba49284c9b 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -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;      } diff --git a/tmk_core/protocol/lufa/outputselect.c b/tmk_core/protocol/lufa/outputselect.c new file mode 100644 index 0000000000..5d2457bfff --- /dev/null +++ b/tmk_core/protocol/lufa/outputselect.c @@ -0,0 +1,56 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "lufa.h" +#include "outputselect.h" +#ifdef ADAFRUIT_BLE_ENABLE +    #include "adafruit_ble.h" +#endif + +uint8_t desired_output = OUTPUT_DEFAULT; + +void set_output(uint8_t output) { +    set_output_user(output); +    desired_output = output; +} + +__attribute__((weak)) +void set_output_user(uint8_t output) { +} + +uint8_t auto_detect_output(void) { +    if (USB_DeviceState == DEVICE_STATE_Configured) { +        return OUTPUT_USB; +    } + +#ifdef ADAFRUIT_BLE_ENABLE +    if (adafruit_ble_is_connected()) { +        return OUTPUT_ADAFRUIT_BLE; +    } +#endif + +#ifdef BLUETOOTH_ENABLE +    return OUTPUT_BLUETOOTH; // should check if BT is connected here +#endif + +    return OUTPUT_NONE; +} + +uint8_t where_to_send(void) { +    if (desired_output == OUTPUT_AUTO) { +        return auto_detect_output(); +    } +    return desired_output; +} + diff --git a/tmk_core/protocol/lufa/outputselect.h b/tmk_core/protocol/lufa/outputselect.h new file mode 100644 index 0000000000..79b4dd35dd --- /dev/null +++ b/tmk_core/protocol/lufa/outputselect.h @@ -0,0 +1,41 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +enum outputs { +    OUTPUT_AUTO, + +    OUTPUT_NONE, +    OUTPUT_USB, +    OUTPUT_BLUETOOTH, +    OUTPUT_ADAFRUIT_BLE, + +    // backward compatibility +    OUTPUT_USB_AND_BT +}; + +/** + * backward compatibility for BLUETOOTH_ENABLE, send to BT and USB by default + */ +#ifndef OUTPUT_DEFAULT +    #ifdef BLUETOOTH_ENABLE +        #define OUTPUT_DEFAULT OUTPUT_USB_AND_BT +    #else +        #define OUTPUT_DEFAULT OUTPUT_AUTO +    #endif +#endif + +void set_output(uint8_t output); +void set_output_user(uint8_t output); +uint8_t auto_detect_output(void); +uint8_t where_to_send(void);
\ No newline at end of file  | 
