Merge pull request #1057 from priyadi/selectable_output
Implement runtime selectable output (USB or BT)
This commit is contained in:
		
						commit
						0c2b6951a6
					
				@ -1,4 +1,7 @@
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
#ifdef PROTOCOL_LUFA
 | 
			
		||||
#include "outputselect.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef TAPPING_TERM
 | 
			
		||||
#define TAPPING_TERM 200
 | 
			
		||||
@ -243,6 +246,36 @@ bool process_record_quantum(keyrecord_t *record) {
 | 
			
		||||
	  return false;
 | 
			
		||||
      break;
 | 
			
		||||
	#endif
 | 
			
		||||
    #ifdef PROTOCOL_LUFA
 | 
			
		||||
    case OUT_AUTO:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        set_output(OUTPUT_AUTO);
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
    case OUT_USB:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        set_output(OUTPUT_USB);
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
    #ifdef BLUETOOTH_ENABLE
 | 
			
		||||
    case OUT_BT:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        set_output(OUTPUT_BLUETOOTH);
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef ADAFRUIT_BLE_ENABLE
 | 
			
		||||
    case OUT_BLE:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        set_output(OUTPUT_ADAFRUIT_BLE);
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
    #endif
 | 
			
		||||
    #endif
 | 
			
		||||
    case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        // MAGIC actions (BOOTMAGIC without the boot)
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,6 @@
 | 
			
		||||
#ifdef RGBLIGHT_ENABLE
 | 
			
		||||
  #include "rgblight.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "action_layer.h"
 | 
			
		||||
#include "eeconfig.h"
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
@ -141,6 +141,16 @@ enum quantum_keycodes {
 | 
			
		||||
    PRINT_ON,
 | 
			
		||||
    PRINT_OFF,
 | 
			
		||||
 | 
			
		||||
    // output selection
 | 
			
		||||
    OUT_AUTO,
 | 
			
		||||
    OUT_USB,
 | 
			
		||||
#ifdef BLUETOOTH_ENABLE
 | 
			
		||||
    OUT_BT,
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef ADAFRUIT_BLE_ENABLE
 | 
			
		||||
    OUT_BLE,
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // always leave at the end
 | 
			
		||||
    SAFE_RANGE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
{
 | 
			
		||||
#ifdef BLUETOOTH_ENABLE
 | 
			
		||||
    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 BLUETOOTH_ENABLE
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#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);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    uint8_t timeout = 255;
 | 
			
		||||
 | 
			
		||||
    uint8_t where = where_to_send();
 | 
			
		||||
 | 
			
		||||
#ifdef BLUETOOTH_ENABLE
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#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);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    uint8_t timeout = 255;
 | 
			
		||||
    uint8_t where = where_to_send();
 | 
			
		||||
 | 
			
		||||
#ifdef BLUETOOTH_ENABLE
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
#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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										56
									
								
								tmk_core/protocol/lufa/outputselect.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								tmk_core/protocol/lufa/outputselect.c
									
									
									
									
									
										Normal file
									
								
							@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								tmk_core/protocol/lufa/outputselect.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								tmk_core/protocol/lufa/outputselect.h
									
									
									
									
									
										Normal file
									
								
							@ -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);
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user