diff options
| author | TerryMathews <terry@terrymathews.net> | 2017-04-08 00:30:54 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-08 00:30:54 -0400 | 
| commit | 3899bec4b603a0880055c60df534c5a86ad44a52 (patch) | |
| tree | dd3ac70f403290fafff4bf8005925a3d5eed69cd /tmk_core/common | |
| parent | 2a2be010d9d8c10d872c01637f4b4cd263f9bc1b (diff) | |
| parent | 154305ce1be16b2c8abce5e5d4dee421f295d6b3 (diff) | |
Merge pull request #1 from qmk/master
Catchup
Diffstat (limited to 'tmk_core/common')
| -rw-r--r-- | tmk_core/common/action.c | 29 | ||||
| -rw-r--r-- | tmk_core/common/action_code.h | 10 | ||||
| -rw-r--r-- | tmk_core/common/action_layer.c | 12 | ||||
| -rw-r--r-- | tmk_core/common/action_layer.h | 5 | ||||
| -rw-r--r-- | tmk_core/common/action_macro.h | 26 | ||||
| -rw-r--r-- | tmk_core/common/action_tapping.c | 11 | ||||
| -rw-r--r-- | tmk_core/common/avr/bootloader.c | 12 | ||||
| -rw-r--r-- | tmk_core/common/avr/timer.c | 33 | ||||
| -rw-r--r-- | tmk_core/common/command.c | 3 | ||||
| -rw-r--r-- | tmk_core/common/eeconfig.h | 1 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 9 | ||||
| -rw-r--r-- | tmk_core/common/matrix.h | 2 | ||||
| -rw-r--r-- | tmk_core/common/report.h | 7 | 
13 files changed, 124 insertions, 36 deletions
| diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index d485b46c77..94de36918d 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -33,6 +33,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "nodebug.h"  #endif +#ifdef FAUXCLICKY_ENABLE +#include <fauxclicky.h> +#endif  void action_exec(keyevent_t event)  { @@ -41,6 +44,16 @@ void action_exec(keyevent_t event)          dprint("EVENT: "); debug_event(event); dprintln();      } +#ifdef FAUXCLICKY_ENABLE +    if (IS_PRESSED(event)) { +        FAUXCLICKY_ACTION_PRESS; +    } +    if (IS_RELEASED(event)) { +        FAUXCLICKY_ACTION_RELEASE; +    } +    fauxclicky_check(); +#endif +  #ifdef ONEHAND_ENABLE      if (!IS_NOEVENT(event)) {          process_hand_swap(&event); @@ -49,6 +62,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 +120,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 +146,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 33da35f35f..b15aaa0eb3 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_layer.c b/tmk_core/common/action_layer.c index a3c7579642..58d919a04d 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -16,8 +16,14 @@   */  uint32_t default_layer_state = 0; +__attribute__((weak)) +uint32_t default_layer_state_set_kb(uint32_t state) { +    return state; +} +  static void default_layer_state_set(uint32_t state)  { +    state = default_layer_state_set_kb(state);      debug("default_layer_state: ");      default_layer_debug(); debug(" to ");      default_layer_state = state; @@ -57,8 +63,14 @@ void default_layer_xor(uint32_t state)   */  uint32_t layer_state = 0; +__attribute__((weak)) +uint32_t layer_state_set_kb(uint32_t state) { +    return state; +} +  static void layer_state_set(uint32_t state)  { +    state = layer_state_set_kb(state);      dprint("layer_state: ");      layer_debug(); dprint(" to ");      layer_state = state; diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 025cf5420f..d89ed6e5ce 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -29,6 +29,9 @@ extern uint32_t default_layer_state;  void default_layer_debug(void);  void default_layer_set(uint32_t state); +__attribute__((weak)) +uint32_t default_layer_state_set_kb(uint32_t state); +  #ifndef NO_ACTION_LAYER  /* bitwise operation */  void default_layer_or(uint32_t state); @@ -69,6 +72,8 @@ void layer_xor(uint32_t state);  #define layer_xor(state)  #define layer_debug() +__attribute__((weak)) +uint32_t layer_state_set_kb(uint32_t state);  #endif  /* pressed actions cache */ diff --git a/tmk_core/common/action_macro.h b/tmk_core/common/action_macro.h index aedc32ec6b..f373f5068e 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/action_tapping.c b/tmk_core/common/action_tapping.c index e16e11be7f..bd9a69ae0a 100644 --- a/tmk_core/common/action_tapping.c +++ b/tmk_core/common/action_tapping.c @@ -228,6 +228,7 @@ bool process_tapping(keyrecord_t *keyp)          if (WITHIN_TAPPING_TERM(event)) {              if (event.pressed) {                  if (IS_TAPPING_KEY(event.key)) { +#ifndef TAPPING_FORCE_HOLD                      if (!tapping_key.tap.interrupted && tapping_key.tap.count > 0) {                          // sequential tap.                          keyp->tap = tapping_key.tap; @@ -237,11 +238,11 @@ bool process_tapping(keyrecord_t *keyp)                          tapping_key = *keyp;                          debug_tapping_key();                          return true; -                    } else { -                        // FIX: start new tap again -                        tapping_key = *keyp; -                        return true;                      } +#endif +                    // FIX: start new tap again +                    tapping_key = *keyp; +                    return true;                  } else if (is_tap_key(event.key)) {                      // Sequential tap can be interfered with other tap key.                      debug("Tapping: Start with interfering other tap.\n"); @@ -257,7 +258,7 @@ bool process_tapping(keyrecord_t *keyp)                      return true;                  }              } else { -                if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n") {}; +                if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n");                  process_record(keyp);                  return true;              } diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c index ad547b9853..34db8d0b0a 100644 --- a/tmk_core/common/avr/bootloader.c +++ b/tmk_core/common/avr/bootloader.c @@ -1,6 +1,7 @@  #include <stdint.h>  #include <stdbool.h>  #include <avr/io.h> +#include <avr/eeprom.h>  #include <avr/interrupt.h>  #include <avr/wdt.h>  #include <util/delay.h> @@ -89,6 +90,12 @@ void bootloader_jump(void) {              _delay_ms(5);          #endif +        #ifdef BOOTLOADHID_BOOTLOADER +            // force bootloadHID to stay in bootloader mode, so that it waits +            // for a new firmware to be flashed +            eeprom_write_byte((uint8_t *)1, 0x00); +        #endif +          // watchdog reset          reset_key = BOOTLOADER_RESET_KEY;          wdt_enable(WDTO_250MS); @@ -114,6 +121,11 @@ void bootloader_jump(void) {      #endif  } +#ifdef __AVR_ATmega32A__ +// MCUSR is actually called MCUCSR in ATmega32A +#define MCUSR MCUCSR +#endif +  /* this runs before main() */  void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));  void bootloader_jump_after_watchdog_reset(void) diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c index 84af444885..369015200d 100644 --- a/tmk_core/common/avr/timer.c +++ b/tmk_core/common/avr/timer.c @@ -29,25 +29,35 @@ volatile uint32_t timer_count;  void timer_init(void)  { -    // Timer0 CTC mode -    TCCR0A = 0x02; -  #if TIMER_PRESCALER == 1 -    TCCR0B = 0x01; +    uint8_t prescaler = 0x01;  #elif TIMER_PRESCALER == 8 -    TCCR0B = 0x02; +    uint8_t prescaler = 0x02;  #elif TIMER_PRESCALER == 64 -    TCCR0B = 0x03; +    uint8_t prescaler = 0x03;  #elif TIMER_PRESCALER == 256 -    TCCR0B = 0x04; +    uint8_t prescaler = 0x04;  #elif TIMER_PRESCALER == 1024 -    TCCR0B = 0x05; +    uint8_t prescaler = 0x05;  #else  #   error "Timer prescaler value is NOT vaild."  #endif +#ifndef __AVR_ATmega32A__ +    // Timer0 CTC mode +    TCCR0A = 0x02; + +    TCCR0B = prescaler; +      OCR0A = TIMER_RAW_TOP;      TIMSK0 = (1<<OCIE0A); +#else +    // Timer0 CTC mode +    TCCR0 = (1 << WGM01) | prescaler; + +    OCR0 = TIMER_RAW_TOP; +    TIMSK = (1 << OCIE0); +#endif  }  inline @@ -107,7 +117,12 @@ uint32_t timer_elapsed32(uint32_t last)  }  // excecuted once per 1ms.(excess for just timer count?) -ISR(TIMER0_COMPA_vect) +#ifndef __AVR_ATmega32A__ +#define TIMER_INTERRUPT_VECTOR TIMER0_COMPA_vect +#else +#define TIMER_INTERRUPT_VECTOR TIMER0_COMP_vect +#endif +ISR(TIMER_INTERRUPT_VECTOR, ISR_NOBLOCK)  {      timer_count++;  } diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 5f29bc0b4e..f79d5a257b 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -235,8 +235,11 @@ static void print_status(void)      print("\n\t- Status -\n");      print_val_hex8(host_keyboard_leds()); +#ifndef PROTOCOL_VUSB +    // these aren't set on the V-USB protocol, so we just ignore them for now      print_val_hex8(keyboard_protocol);      print_val_hex8(keyboard_idle); +#endif  #ifdef NKRO_ENABLE      print_val_hex8(keymap_config.nkro);  #endif diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index d8caa346f9..280dc7ab67 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -33,6 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define EECONFIG_BACKLIGHT                          (uint8_t *)6  #define EECONFIG_AUDIO                              (uint8_t *)7  #define EECONFIG_RGBLIGHT                           (uint32_t *)8 +#define EECONFIG_UNICODEMODE                        (uint8_t *)12  /* debug bit */ diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 371d93f3e5..eac1f1dd81 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" @@ -50,6 +51,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #ifdef RGBLIGHT_ENABLE  #   include "rgblight.h"  #endif +#ifdef FAUXCLICKY_ENABLE +#   include "fauxclicky.h" +#endif  #ifdef SERIAL_LINK_ENABLE  #   include "serial_link/system/serial_link.h"  #endif @@ -107,6 +111,9 @@ void keyboard_init(void) {  #ifdef RGBLIGHT_ENABLE      rgblight_init();  #endif +#ifdef FAUXCLICKY_ENABLE +    fauxclicky_init(); +#endif  #if defined(NKRO_ENABLE) && defined(FORCE_NKRO)      keymap_config.nkro = 1;  #endif @@ -188,7 +195,7 @@ MATRIX_LOOP_END:  #endif  #ifdef VISUALIZER_ENABLE -    visualizer_update(default_layer_state, layer_state, host_keyboard_leds()); +    visualizer_update(default_layer_state, layer_state, visualizer_get_mods(), host_keyboard_leds());  #endif      // update LED diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h index cee3593eee..2543f5abce 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 0c799eca39..8fb28b6ce3 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; | 
