diff options
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/common/action.c | 16 | ||||
| -rw-r--r-- | tmk_core/common/action_code.h | 10 | ||||
| -rw-r--r-- | tmk_core/common/action_macro.h | 26 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 1 | ||||
| -rw-r--r-- | tmk_core/common/matrix.h | 2 | ||||
| -rw-r--r-- | tmk_core/common/report.h | 7 | ||||
| -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 | ||||
| -rw-r--r-- | tmk_core/protocol/vusb/vusb.c | 4 | 
11 files changed, 189 insertions, 93 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index d485b46c7..f03670a7f 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -49,6 +49,13 @@ void action_exec(keyevent_t event)      keyrecord_t record = { .event = event }; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) +    if (has_oneshot_layer_timed_out()) { +        dprintf("Oneshot layer: timeout\n"); +        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); +    } +#endif +  #ifndef NO_ACTION_TAPPING      action_tapping_process(record);  #else @@ -100,7 +107,7 @@ bool process_record_quantum(keyrecord_t *record) {      return true;  } -void process_record(keyrecord_t *record)  +void process_record(keyrecord_t *record)  {      if (IS_NOEVENT(record->event)) { return; } @@ -126,13 +133,6 @@ void process_action(keyrecord_t *record, action_t action)      uint8_t tap_count = record->tap.count;  #endif -#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) -    if (has_oneshot_layer_timed_out()) { -        dprintf("Oneshot layer: timeout\n"); -        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); -    } -#endif -      if (event.pressed) {          // clear the potential weak mods left by previously pressed keys          clear_weak_mods(); diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index 33da35f35..b15aaa0eb 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -47,10 +47,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   * 0100|10| usage(10)     (reserved)   * 0100|11| usage(10)     (reserved)   * - * ACT_MOUSEKEY(0110): TODO: Not needed? + * + * ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space?   * 0101|xxxx| keycode     Mouse key   * - * 011x|xxxx xxxx xxxx    (reseved) + * ACT_SWAP_HANDS(0110): + * 0110|xxxx| keycode     Swap hands (keycode on tap, or options) + * + * + * 0111|xxxx xxxx xxxx    (reserved)   *   *   * Layer Actions(10xx) @@ -67,7 +72,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.   *   ee:    on event(01:press, 10:release, 11:both)   *   * 1001|xxxx|xxxx xxxx   (reserved) - * 1001|oopp|BBBB BBBB   8-bit Bitwise Operation???   *   * ACT_LAYER_TAP(101x):   * 101E|LLLL| keycode    On/Off with tap key    (0x00-DF)[TAP] diff --git a/tmk_core/common/action_macro.h b/tmk_core/common/action_macro.h index aedc32ec6..f373f5068 100644 --- a/tmk_core/common/action_macro.h +++ b/tmk_core/common/action_macro.h @@ -20,11 +20,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "progmem.h" -#define MACRO_NONE      0 + +typedef uint8_t macro_t; + +#define MACRO_NONE      (macro_t*)0  #define MACRO(...)      ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })  #define MACRO_GET(p)    pgm_read_byte(p) -typedef uint8_t macro_t; +// Sends press when the macro key is pressed, release when release, or tap_macro when the key has been tapped +#define MACRO_TAP_HOLD(record, press, release, tap_macro) ( ((record)->event.pressed) ? \ +     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? (press) : MACRO_NONE ) : \ +     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (tap_macro) : (release) ) ) + +// Holds down the modifier mod when the macro key is held, or sends macro instead when tapped +#define MACRO_TAP_HOLD_MOD(record, macro, mod) MACRO_TAP_HOLD(record, (MACRO(D(mod), END)), MACRO(U(mod), END), macro) + +// Holds down the modifier mod when the macro key is held, or pressed a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_MOD(record, key, mod) MACRO_TAP_HOLD_MOD(record, (MACRO(I(10), D(LSFT), T(key), U(LSFT), END)), mod) + + +// Momentary switch layer when held, sends macro if tapped +#define MACRO_TAP_HOLD_LAYER(record, macro, layer) ( ((record)->event.pressed) ? \ +     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? ({layer_on((layer)); MACRO_NONE; }) : MACRO_NONE ) : \ +     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : ({layer_off((layer)); MACRO_NONE; }) ) ) + +// Momentary switch layer when held, presses a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, key, layer) MACRO_TAP_HOLD_LAYER(record, MACRO(I(10), D(LSFT), T(key), U(LSFT), END), layer) +       #ifndef NO_ACTION_MACRO diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 765350792..3aa82231b 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -14,6 +14,7 @@ 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 <stdint.h>  #include "keyboard.h"  #include "matrix.h" diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h index cee3593ee..2543f5abc 100644 --- a/tmk_core/common/matrix.h +++ b/tmk_core/common/matrix.h @@ -50,7 +50,7 @@ void matrix_init(void);  uint8_t matrix_scan(void);  /* whether modified from previous scan. used after matrix_scan. */  bool matrix_is_modified(void) __attribute__ ((deprecated)); -/* whether a swtich is on */ +/* whether a switch is on */  bool matrix_is_on(uint8_t row, uint8_t col);  /* matrix state on row */  matrix_row_t matrix_get_row(uint8_t row); diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 0c799eca3..8fb28b6ce 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -134,13 +134,6 @@ typedef union {      } nkro;  #endif  } __attribute__ ((packed)) report_keyboard_t; -/* -typedef struct { -    uint8_t mods; -    uint8_t reserved; -    uint8_t keys[REPORT_KEYS]; -} __attribute__ ((packed)) report_keyboard_t; -*/  typedef struct {      uint8_t buttons; diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 151d26cbc..de0cc795f 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 6dd5959dc..ba49284c9 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 000000000..5d2457bff --- /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 000000000..79b4dd35d --- /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 diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index a8c13b928..022ac6f6b 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -280,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = {      0x95, 0x06,          //   Report Count (6),      0x75, 0x08,          //   Report Size (8),      0x15, 0x00,          //   Logical Minimum (0), -    0x25, 0xFF, 0x00,    //   Logical Maximum(255), +    0x26, 0xFF, 0x00,    //   Logical Maximum(255),      0x05, 0x07,          //   Usage Page (Key Codes),      0x19, 0x00,          //   Usage Minimum (0),      0x29, 0xFF,          //   Usage Maximum (255), @@ -350,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = {      0xa1, 0x01,                    // COLLECTION (Application)      0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)      0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1) -    0x25, 0xb7, 0x00,              //   LOGICAL_MAXIMUM (0xb7) +    0x26, 0xb7, 0x00,              //   LOGICAL_MAXIMUM (0xb7)      0x19, 0x01,                    //   USAGE_MINIMUM (0x1)      0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)      0x75, 0x10,                    //   REPORT_SIZE (16)  | 
