From 6734a398117c6877819d673f6b21efb6a42fa97b Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 13 Mar 2020 11:00:28 +1100 Subject: [PATCH 01/14] Update Spanish keymap and sendstring LUT (#8364) --- quantum/keymap_extras/keymap_spanish.h | 191 +++++++++++++++------ quantum/keymap_extras/sendstring_spanish.h | 28 +-- 2 files changed, 154 insertions(+), 65 deletions(-) diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 19a3c5284be..26725a0c93d 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -13,61 +13,150 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef KEYMAP_SPANISH_H -#define KEYMAP_SPANISH_H + +#pragma once #include "keymap.h" -// Normal characters -#define ES_OVRR KC_GRV -#define ES_APOS KC_MINS -#define ES_IEXL KC_EQL +// clang-format off -#define ES_GRV KC_LBRC -#define ES_PLUS KC_RBRC +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ º │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ¡ │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ` │ + │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ñ │ ´ │ Ç │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define ES_MORD KC_GRV // º +#define ES_1 KC_1 // 1 +#define ES_2 KC_2 // 2 +#define ES_3 KC_3 // 3 +#define ES_4 KC_4 // 4 +#define ES_5 KC_5 // 5 +#define ES_6 KC_6 // 6 +#define ES_7 KC_7 // 7 +#define ES_8 KC_8 // 8 +#define ES_9 KC_9 // 9 +#define ES_0 KC_0 // 0 +#define ES_QUOT KC_MINS // ' +#define ES_IEXL KC_EQL // ¡ +// Row 2 +#define ES_Q KC_Q // Q +#define ES_W KC_W // W +#define ES_E KC_E // E +#define ES_R KC_R // R +#define ES_T KC_T // T +#define ES_Y KC_Y // Y +#define ES_U KC_U // U +#define ES_I KC_I // I +#define ES_O KC_O // O +#define ES_P KC_P // P +#define ES_GRV KC_LBRC // ` (dead) +#define ES_PLUS KC_RBRC // + +// Row 3 +#define ES_A KC_A // A +#define ES_S KC_S // S +#define ES_D KC_D // D +#define ES_F KC_F // F +#define ES_G KC_G // G +#define ES_H KC_H // H +#define ES_J KC_J // J +#define ES_K KC_K // K +#define ES_L KC_L // L +#define ES_NTIL KC_SCLN // Ñ +#define ES_ACUT KC_QUOT // ´ (dead) +#define ES_CCED KC_NUHS // Ç +// Row 4 +#define ES_LABK KC_NUBS // < +#define ES_Z KC_Z // Z +#define ES_X KC_X // X +#define ES_C KC_C // C +#define ES_V KC_V // V +#define ES_B KC_B // B +#define ES_N KC_N // N +#define ES_M KC_M // M +#define ES_COMM KC_COMM // , +#define ES_DOT KC_DOT // . +#define ES_MINS KC_SLSH // - -#define ES_NTIL KC_SCLN -#define ES_ACUT KC_QUOT -#define ES_CCED KC_NUHS +/* Shifted symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ª │ ! │ " │ · │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ¿ │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │   │   │   │   │   │   │   │   │   │ ^ │ * │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │   │   │   │   │   │   │   │   │   │   │ ¨ │   │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │ > │   │   │   │   │   │   │   │ ; │ : │ _ │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define ES_FORD S(ES_MORD) // ª +#define ES_EXLM S(ES_1) // ! +#define ES_DQUO S(ES_2) // " +#define ES_BULT S(ES_3) // · +#define ES_DLR S(ES_4) // $ +#define ES_PERC S(ES_5) // % +#define ES_AMPR S(ES_6) // & +#define ES_SLSH S(ES_7) // / +#define ES_LPRN S(ES_8) // ( +#define ES_RPRN S(ES_9) // ) +#define ES_EQL S(ES_0) // = +#define ES_QUES S(ES_QUOT) // ? +#define ES_IQUE S(ES_IEXL) // ¿ +// Row 2 +#define ES_CIRC S(ES_GRV) // ^ (dead) +#define ES_ASTR S(ES_PLUS) // * +// Row 3 +#define ES_DIAE S(ES_GRV) // ¨ (dead) +// Row 4 +#define ES_RABK S(ES_LABK) // > +#define ES_SCLN S(KC_COMM) // ; +#define ES_COLN S(KC_DOT) // : +#define ES_UNDS S(ES_MINS) // _ -#define ES_LESS KC_NUBS -#define ES_MINS KC_SLSH +/* AltGr symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ \ │ | │ @ │ # │ ~ │ € │ ¬ │   │   │   │   │   │   │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │   │   │   │   │   │   │   │   │   │ [ │ ] │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │   │   │   │   │   │   │   │   │   │   │ { │ } │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │   │   │   │   │   │   │   │   │   │   │   │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define ES_BSLS ALGR(ES_MORD) // (backslash) +#define ES_PIPE ALGR(ES_1) // | +#define ES_AT ALGR(ES_2) // @ +#define ES_HASH ALGR(ES_3) // # +#define ES_TILD ALGR(ES_4) // ~ +#define ES_EURO ALGR(ES_5) // € +#define ES_NOT ALGR(ES_6) // ¬ +// Row 2 +#define ES_LBRC ALGR(ES_GRV) // [ +#define ES_RBRC ALGR(ES_PLUS) // ] +// Row 3 +#define ES_LCBR ALGR(ES_ACUT) // { +#define ES_RCBR ALGR(ES_CCED) // } -// Shifted characters -#define ES_ASML LSFT(ES_OVRR) -#define ES_QUOT LSFT(KC_2) -#define ES_OVDT LSFT(KC_3) -#define ES_AMPR LSFT(KC_6) -#define ES_SLSH LSFT(KC_7) -#define ES_LPRN LSFT(KC_8) -#define ES_RPRN LSFT(KC_9) -#define ES_EQL LSFT(KC_0) -#define ES_QUES LSFT(ES_APOS) -#define ES_IQUE LSFT(ES_IEXL) - -#define ES_CIRC LSFT(ES_GRV) -#define ES_ASTR LSFT(ES_PLUS) - -#define ES_UMLT LSFT(ES_GRV) - -#define ES_GRTR LSFT(ES_LESS) -#define ES_SCLN LSFT(KC_COMM) -#define ES_COLN LSFT(KC_DOT) -#define ES_UNDS LSFT(ES_MINS) - -// Alt Gr-ed characters -#define ES_BSLS ALGR(ES_OVRR) -#define ES_PIPE ALGR(KC_1) -#define ES_AT ALGR(KC_2) -#define ES_HASH ALGR(KC_3) -#define ES_TILD ALGR(ES_NTIL) -#define ES_EURO ALGR(KC_5) -#define ES_NOT ALGR(KC_6) - -#define ES_LBRC ALGR(ES_GRV) -#define ES_RBRC ALGR(ES_PLUS) - -#define ES_LCBR ALGR(ES_ACUT) -#define ES_RCBR ALGR(ES_CCED) - -#endif +// DEPRECATED +#define ES_OVRR ES_MORD +#define ES_APOS ES_QUOT +#define ES_LESS ES_LABK +#define ES_ASML ES_FORD +#define ES_OVDT ES_BULT +#define ES_UMLT ES_DIAE +#define ES_GRTR ES_RABK diff --git a/quantum/keymap_extras/sendstring_spanish.h b/quantum/keymap_extras/sendstring_spanish.h index 70e67165396..405cf9b0a37 100644 --- a/quantum/keymap_extras/sendstring_spanish.h +++ b/quantum/keymap_extras/sendstring_spanish.h @@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = { KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), - KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0) }; const uint8_t ascii_to_altgr_lut[16] PROGMEM = { @@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = { KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), - KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0), + KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0) }; const uint8_t ascii_to_keycode_lut[128] PROGMEM = { @@ -74,27 +74,27 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = { XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, // ! " # $ % & ' - KC_SPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, ES_APOS, + KC_SPC, ES_1, ES_2, ES_3, ES_4, ES_5, ES_6, ES_QUOT, // ( ) * + , - . / - KC_8, KC_9, ES_PLUS, ES_PLUS, KC_COMM, ES_MINS, KC_DOT, KC_7, + ES_8, ES_9, ES_PLUS, ES_PLUS, ES_COMM, ES_MINS, ES_DOT, ES_7, // 0 1 2 3 4 5 6 7 - KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, + ES_0, ES_1, ES_2, ES_3, ES_4, ES_5, ES_6, ES_7, // 8 9 : ; < = > ? - KC_8, KC_9, KC_DOT, KC_COMM, ES_LESS, KC_0, ES_LESS, ES_APOS, + ES_8, ES_9, ES_DOT, ES_COMM, ES_LABK, ES_0, ES_LABK, ES_QUOT, // @ A B C D E F G - KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + ES_2, ES_A, ES_B, ES_C, ES_D, ES_E, ES_F, ES_G, // H I J K L M N O - KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + ES_H, ES_I, ES_J, ES_K, ES_L, ES_M, ES_N, ES_O, // P Q R S T U V W - KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + ES_P, ES_Q, ES_R, ES_S, ES_T, ES_U, ES_V, ES_W, // X Y Z [ \ ] ^ _ - KC_X, KC_Y, KC_Z, ES_GRV, ES_OVRR, ES_PLUS, ES_GRV, ES_MINS, + ES_X, ES_Y, ES_Z, ES_GRV, ES_MORD, ES_PLUS, ES_GRV, ES_MINS, // ` a b c d e f g - ES_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + ES_GRV, ES_A, ES_B, ES_C, ES_D, ES_E, ES_F, ES_G, // h i j k l m n o - KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + ES_H, ES_I, ES_J, ES_K, ES_L, ES_M, ES_N, ES_O, // p q r s t u v w - KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + ES_P, ES_Q, ES_R, ES_S, ES_T, ES_U, ES_V, ES_W, // x y z { | } ~ DEL - KC_X, KC_Y, KC_Z, ES_ACUT, KC_1, ES_CCED, ES_NTIL, KC_DEL + ES_X, ES_Y, ES_Z, ES_ACUT, ES_1, ES_CCED, ES_NTIL, KC_DEL }; From 2b63896466d611bd05912af8b1abb524315a9169 Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 13 Mar 2020 11:09:30 +1100 Subject: [PATCH 02/14] Update Swedish keymap and add sendstring LUT (#8365) --- quantum/keymap_extras/keymap_swedish.h | 215 +++++++++++++++------ quantum/keymap_extras/sendstring_swedish.h | 100 ++++++++++ 2 files changed, 253 insertions(+), 62 deletions(-) create mode 100644 quantum/keymap_extras/sendstring_swedish.h diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h index 96fd0c5c658..86e0761f26d 100644 --- a/quantum/keymap_extras/keymap_swedish.h +++ b/quantum/keymap_extras/keymap_swedish.h @@ -14,74 +14,165 @@ * along with this program. If not, see . */ -#ifndef KEYMAP_SWEDISH_H -#define KEYMAP_SWEDISH_H +#pragma once #include "keymap.h" -// Normal characters -#define SE_HALF KC_GRV -#define SE_PLUS KC_MINS -#define SE_ACUT KC_EQL +// clang-format off -#define SE_AM KC_LBRC -#define SE_QUOT KC_RBRC // this is the "umlaut" char on Nordic keyboards, Apple layout -#define SE_AE KC_QUOT // ä -#define SE_OSLH KC_SCLN // ö -#define SE_APOS KC_NUHS +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ ´ │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Å │ ¨ │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ ' │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define SE_SECT KC_GRV // § +#define SE_1 KC_1 // 1 +#define SE_2 KC_2 // 2 +#define SE_3 KC_3 // 3 +#define SE_4 KC_4 // 4 +#define SE_5 KC_5 // 5 +#define SE_6 KC_6 // 6 +#define SE_7 KC_7 // 7 +#define SE_8 KC_8 // 8 +#define SE_9 KC_9 // 9 +#define SE_0 KC_0 // 0 +#define SE_PLUS KC_MINS // + +#define SE_ACUT KC_EQL // ´ (dead) +// Row 2 +#define SE_Q KC_Q // Q +#define SE_W KC_W // W +#define SE_E KC_E // E +#define SE_R KC_R // R +#define SE_T KC_T // T +#define SE_Y KC_Y // Y +#define SE_U KC_U // U +#define SE_I KC_I // I +#define SE_O KC_O // O +#define SE_P KC_P // P +#define SE_ARNG KC_LBRC // Å +#define SE_DIAE KC_RBRC // ¨ (dead) +// Row 3 +#define SE_A KC_A // A +#define SE_S KC_S // S +#define SE_D KC_D // D +#define SE_F KC_F // F +#define SE_G KC_G // G +#define SE_H KC_H // H +#define SE_J KC_J // J +#define SE_K KC_K // K +#define SE_L KC_L // L +#define SE_ODIA KC_SCLN // Ö +#define SE_ADIA KC_QUOT // Ä +#define SE_QUOT KC_NUHS // ' +// Row 4 +#define SE_LABK KC_NUBS // < +#define SE_Z KC_Z // Z +#define SE_X KC_X // X +#define SE_C KC_C // C +#define SE_V KC_V // V +#define SE_B KC_B // B +#define SE_N KC_N // N +#define SE_M KC_M // M +#define SE_COMM KC_COMM // , +#define SE_DOT KC_DOT // . +#define SE_MINS KC_SLSH // - -#define SE_LESS KC_NUBS -#define SE_MINS KC_SLSH +/* Shifted symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ½ │ ! │ " │ # │ ¤ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │   │   │   │   │   │   │   │   │   │   │ ^ │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │   │   │   │   │   │   │   │   │   │   │   │ * │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │ > │   │   │   │   │   │   │   │ ; │ : │ _ │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define SE_HALF S(SE_SECT) // ½ +#define SE_EXLM S(SE_1) // ! +#define SE_DQUO S(SE_2) // " +#define SE_HASH S(SE_3) // # +#define SE_CURR S(SE_4) // ¤ +#define SE_PERC S(SE_5) // % +#define SE_AMPR S(SE_6) // & +#define SE_SLSH S(SE_7) // / +#define SE_LPRN S(SE_8) // ( +#define SE_RPRN S(SE_9) // ) +#define SE_EQL S(SE_0) // = +#define SE_QUES S(SE_PLUS) // ? +#define SE_GRV S(SE_ACUT) // ` (dead) +// Row 2 +#define SE_CIRC S(SE_DIAE) // ^ (dead) +// Row 3 +#define SE_ASTR S(SE_QUOT) // * +// Row 4 +#define SE_RABK S(SE_LABK) // > +#define SE_SCLN S(SE_COMM) // ; +#define SE_COLN S(SE_DOT) // : +#define SE_UNDS S(SE_MINS) // _ -// Shifted characters -#define SE_SECT LSFT(SE_HALF) -#define SE_QUO2 LSFT(KC_2) -#define SE_BULT LSFT(KC_4) -#define SE_AMPR LSFT(KC_6) -#define SE_SLSH LSFT(KC_7) -#define SE_LPRN LSFT(KC_8) -#define SE_RPRN LSFT(KC_9) -#define SE_EQL LSFT(KC_0) -#define SE_QUES LSFT(SE_PLUS) -#define SE_GRV LSFT(SE_ACUT) +/* AltGr symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │   │   │ @ │ £ │ $ │ € │   │ { │ [ │ ] │ } │ \ │   │       │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │   │   │   │   │   │   │   │   │   │   │ ~ │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │ + * │      │   │   │   │   │   │   │   │   │   │   │   │   │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │    │ | │   │   │   │   │   │   │ µ │   │   │   │          │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │    │    │    │                        │    │    │    │    │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define SE_AT ALGR(SE_2) // @ +#define SE_PND ALGR(SE_3) // £ +#define SE_DLR ALGR(SE_4) // $ +#define SE_EURO ALGR(SE_5) // € +#define SE_LCBR ALGR(SE_7) // { +#define SE_LBRC ALGR(SE_8) // [ +#define SE_RBRC ALGR(SE_9) // ] +#define SE_RCBR ALGR(SE_0) // } +#define SE_BSLS ALGR(SE_PLUS) // (backslash) +// Row 2 +#define SE_TILD ALGR(SE_DIAE) // ~ (dead) +// Row 4 +#define SE_PIPE ALGR(SE_LABK) // | +#define SE_MICR ALGR(SE_M) // µ -#define SE_CIRC LSFT(KC_RBRC) // ^ +// DEPRECATED +#include "keymap_nordic.h" -#define SE_GRTR LSFT(SE_LESS) -#define SE_SCLN LSFT(KC_COMM) -#define SE_COLN LSFT(KC_DOT) -#define SE_UNDS LSFT(SE_MINS) +#undef NO_AE +#undef NO_CIRC +#undef NO_OSLH -// Alt Gr-ed characters -#define SE_AT ALGR(KC_2) -#define SE_PND ALGR(KC_3) -#define SE_DLR ALGR(KC_4) -#define SE_LCBR ALGR(KC_7) -#define SE_LBRC ALGR(KC_8) -#define SE_RBRC ALGR(KC_9) -#define SE_RCBR ALGR(KC_0) -#define SE_PIPE ALGR(KC_NUBS) - -#define SE_EURO ALGR(KC_E) -#define SE_TILD ALGR(SE_QUOT) - -#define SE_BSLS ALGR(KC_MINS) -#define SE_MU ALGR(KC_M) - -#define SE_AA KC_LBRC // å -#define SE_ASTR LSFT(KC_BSLS) // * - -// Norwegian unique MAC characters (not vetted for Swedish) -#define SE_ACUT_MAC KC_EQL // = -#define SE_APOS_MAC KC_NUBS // ' -#define SE_AT_MAC KC_BSLS // @ -#define SE_BSLS_MAC ALGR(LSFT(KC_7)) // '\' -#define SE_DLR_MAC ALGR(KC_4) // $ -#define SE_GRV_MAC ALGR(SE_BSLS) // ` -#define SE_GRTR_MAC LSFT(KC_GRV) // > -#define SE_LCBR_MAC ALGR(LSFT(KC_8)) // { -#define SE_LESS_MAC KC_GRV // < -#define SE_PIPE_MAC ALGR(KC_7) // | -#define SE_RCBR_MAC ALGR(LSFT(KC_9)) // } - -#endif +#define NO_AE SE_AE +#define NO_CIRC SE_CIRC +#define NO_OSLH SE_ODIA +#define NO_AA SE_ARNG +#define NO_ASTR SE_ASTR +// Swedish macOS symbols (not vetted) +#define NO_ACUT_MAC SE_ACUT +#define NO_APOS_MAC SE_LABK +#define NO_AT_MAC SE_ADIA +#define NO_BSLS_MAC S(SE_LCBR) +#define NO_DLR_MAC SE_CURR +#define NO_GRV_MAC SE_BSLS +#define NO_GRTR_MAC SE_HALF +#define NO_LCBR_MAC S(SE_LBRC) +#define NO_LESS_MAC SE_SECT +#define NO_PIPE_MAC SE_LCBR +#define NO_RCBR_MAC S(SE_RBRC) diff --git a/quantum/keymap_extras/sendstring_swedish.h b/quantum/keymap_extras/sendstring_swedish.h new file mode 100644 index 00000000000..8b07d423019 --- /dev/null +++ b/quantum/keymap_extras/sendstring_swedish.h @@ -0,0 +1,100 @@ +/* Copyright 2019 + * + * 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 . + */ + +// Sendstring lookup tables for Swedish layouts + +#pragma once + +#include "keymap_swedish.h" +#include "quantum.h" + +// clang-format off + +const uint8_t ascii_to_shift_lut[16] PROGMEM = { + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + + KCLUT_ENTRY(0, 1, 1, 1, 0, 1, 1, 0), + KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1), + KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1), + KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0) +}; + +const uint8_t ascii_to_altgr_lut[16] PROGMEM = { + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + + KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0) +}; + +const uint8_t ascii_to_keycode_lut[128] PROGMEM = { + // NUL SOH STX ETX EOT ENQ ACK BEL + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // BS TAB LF VT FF CR SO SI + KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // DLE DC1 DC2 DC3 DC4 NAK SYN ETB + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // CAN EM SUB ESC FS GS RS US + XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // ! " # $ % & ' + KC_SPC, SE_1, SE_2, SE_3, SE_4, SE_5, SE_6, SE_QUOT, + // ( ) * + , - . / + SE_8, SE_9, SE_QUOT, SE_PLUS, SE_COMM, SE_MINS, SE_DOT, SE_7, + // 0 1 2 3 4 5 6 7 + SE_0, SE_1, SE_2, SE_3, SE_4, SE_5, SE_6, SE_7, + // 8 9 : ; < = > ? + SE_8, SE_9, SE_DOT, SE_COMM, SE_LABK, SE_0, SE_LABK, SE_PLUS, + // @ A B C D E F G + SE_2, SE_A, SE_B, SE_C, SE_D, SE_E, SE_F, SE_G, + // H I J K L M N O + SE_H, SE_I, SE_J, SE_K, SE_L, SE_M, SE_N, SE_O, + // P Q R S T U V W + SE_P, SE_Q, SE_R, SE_S, SE_T, SE_U, SE_V, SE_W, + // X Y Z [ \ ] ^ _ + SE_X, SE_Y, SE_Z, SE_8, SE_PLUS, SE_9, SE_DIAE, SE_MINS, + // ` a b c d e f g + SE_ACUT, SE_A, SE_B, SE_C, SE_D, SE_E, SE_F, SE_G, + // h i j k l m n o + SE_H, SE_I, SE_J, SE_K, SE_L, SE_M, SE_N, SE_O, + // p q r s t u v w + SE_P, SE_Q, SE_R, SE_S, SE_T, SE_U, SE_V, SE_W, + // x y z { | } ~ DEL + SE_X, SE_Y, SE_Z, SE_7, SE_LABK, SE_0, SE_DIAE, KC_DEL +}; From 904610718332d4526248221edc91be76f012c0e0 Mon Sep 17 00:00:00 2001 From: James Young Date: Thu, 12 Mar 2020 17:24:07 -0700 Subject: [PATCH 03/14] Restore getting_started_github.md doc --- docs/getting_started_github.md | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 docs/getting_started_github.md diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md new file mode 100644 index 00000000000..07f523f5781 --- /dev/null +++ b/docs/getting_started_github.md @@ -0,0 +1,65 @@ +# How to Use Github with QMK + +Github can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK. + +?> This guide assumes you're somewhat comfortable with running things at the command line, and have git installed on your system. + +Start on the [QMK Github page](https://github.com/qmk/qmk_firmware), and you'll see a button in the upper right that says "Fork": + +![Fork on Github](http://i.imgur.com/8Toomz4.jpg) + +If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: + +![Download from Github](http://i.imgur.com/N1NYcSz.jpg) + +And be sure to select "HTTPS", and select the link and copy it: + +![HTTPS link](http://i.imgur.com/eGO0ohO.jpg) + +From here, enter `git clone --recurse-submodules ` into the command line, and then paste your link: + +``` +user@computer:~$ git clone --recurse-submodules https://github.com/whoeveryouare/qmk_firmware.git +Cloning into 'qmk_firmware'... +remote: Enumerating objects: 9, done. +remote: Counting objects: 100% (9/9), done. +remote: Compressing objects: 100% (5/5), done. +remote: Total 183883 (delta 5), reused 4 (delta 4), pack-reused 183874 +Receiving objects: 100% (183883/183883), 132.90 MiB | 9.57 MiB/s, done. +Resolving deltas: 100% (119972/119972), done. +... +Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca18b' +Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' +Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' +Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' +Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2' +``` + +You now have your QMK fork on your local machine, and you can add your keymap, compile it and flash it to your board. Once you're happy with your changes, you can add, commit, and push them to your fork like this: + +``` +user@computer:~$ git add . +user@computer:~$ git commit -m "adding my keymap" +[master cccb1608] adding my keymap + 1 file changed, 1 insertion(+) + create mode 100644 keyboards/planck/keymaps/mine/keymap.c +user@computer:~$ git push +Counting objects: 1, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (1/1), done. +Writing objects: 100% (1/1), 1.64 KiB | 0 bytes/s, done. +Total 1 (delta 1), reused 0 (delta 0) +remote: Resolving deltas: 100% (1/1), completed with 1 local objects. +To https://github.com/whoeveryouare/qmk_firmware.git + + 20043e64...7da94ac5 master -> master +``` + +Your changes now exist on your fork on Github - if you go back there (`https://github.com//qmk_firmware`), you can create a "New Pull Request" by clicking this button: + +![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg) + +Here you'll be able to see exactly what you've committed - if it all looks good, you can finalize it by clicking "Create Pull Request": + +![Create Pull Request](http://i.imgur.com/Ojydlaj.jpg) + +After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :) From abd8e75cb730c89dfc3982ccda2ae88f5a56768c Mon Sep 17 00:00:00 2001 From: nickolaij Date: Fri, 13 Mar 2020 12:22:27 +1000 Subject: [PATCH 04/14] [Keyboard] Abacus Keyboard ReMerge (#8308) * added abacus keyboard * keymap updates * Update keyboards/abacus/config.h * Update keyboards/abacus/config.h * Update keyboards/abacus/keymaps/default/keymap.c * Update keyboards/abacus/keymaps/default/keymap.c * Update keyboards/abacus/keymaps/default/keymap.c * start cleaning up for merge * cleaned for merge * cleaned * cleaned * Update keyboards/abacus/abacus.h * Update keyboards/abacus/keymaps/default/keymap.c * Update keyboards/abacus/keymaps/default/readme.md * Update keyboards/abacus/readme.md * Update keyboards/abacus/readme.md * Update keyboards/abacus/rules.mk * Update keyboards/abacus/info.json * Update keyboards/abacus/info.json * Update keyboards/abacus/info.json * Update keyboards/abacus/readme.md * Update keyboards/abacus/info.json * Update keyboards/abacus/rules.mk * Update keyboards/abacus/rules.mk --- keyboards/abacus/abacus.c | 17 +++ keyboards/abacus/abacus.h | 41 ++++++ keyboards/abacus/config.h | 133 ++++++++++++++++++ keyboards/abacus/info.json | 62 +++++++++ keyboards/abacus/keymaps/default/keymap.c | 148 +++++++++++++++++++++ keyboards/abacus/keymaps/default/readme.md | 4 + keyboards/abacus/readme.md | 15 +++ keyboards/abacus/rules.mk | 36 +++++ 8 files changed, 456 insertions(+) create mode 100644 keyboards/abacus/abacus.c create mode 100644 keyboards/abacus/abacus.h create mode 100644 keyboards/abacus/config.h create mode 100644 keyboards/abacus/info.json create mode 100644 keyboards/abacus/keymaps/default/keymap.c create mode 100644 keyboards/abacus/keymaps/default/readme.md create mode 100644 keyboards/abacus/readme.md create mode 100644 keyboards/abacus/rules.mk diff --git a/keyboards/abacus/abacus.c b/keyboards/abacus/abacus.c new file mode 100644 index 00000000000..aef62aa921c --- /dev/null +++ b/keyboards/abacus/abacus.c @@ -0,0 +1,17 @@ +/* Copyright 2020 nickolaij + * + * 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 . + */ + +#include "abacus.h" diff --git a/keyboards/abacus/abacus.h b/keyboards/abacus/abacus.h new file mode 100644 index 00000000000..7f221c3c347 --- /dev/null +++ b/keyboards/abacus/abacus.h @@ -0,0 +1,41 @@ +/* Copyright 2020 nickolaij + * + * 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 . + */ + +#pragma once +#include "quantum.h" +#define XXX KC_NO + + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, XXX, XXX, k34, XXX, k35, k36, k37, k38} \ +} diff --git a/keyboards/abacus/config.h b/keyboards/abacus/config.h new file mode 100644 index 00000000000..7fa98985392 --- /dev/null +++ b/keyboards/abacus/config.h @@ -0,0 +1,133 @@ +/* +Copyright 2020 nickolaij + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER nickolaij +#define PRODUCT abacus +#define DESCRIPTION A first attempt at a custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * + */ +#define MATRIX_ROW_PINS { D3, D2, D4, C6 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, D7, B3, E6, B2, B4, B6, B5} +#define UNUSED_PINS {B0} + +#define DIP_SWITCH_PINS { D0 } + +#define ENCODERS_PAD_A { F1 } +#define ENCODERS_PAD_B { F0 } +#define ENCODER_RESOLUTION 4 + +/* COL2ROW, ROW2COL*/ +#define DIODE_DIRECTION COL2ROW +#define RGB_DI_PIN D1 + +#ifdef RGB_DI_PIN +# define RGBLED_NUM 17 +# define RGBLIGHT_HUE_STEP 8 +# define RGBLIGHT_SAT_STEP 8 +# define RGBLIGHT_VAL_STEP 8 +# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ +# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +/*== choose animations ==*/ +# define RGBLIGHT_EFFECT_BREATHING +# define RGBLIGHT_EFFECT_RAINBOW_MOOD +# define RGBLIGHT_EFFECT_RAINBOW_SWIRL +# define RGBLIGHT_EFFECT_SNAKE +# define RGBLIGHT_EFFECT_KNIGHT +# define RGBLIGHT_EFFECT_STATIC_GRADIENT +/*== customize breathing effect ==*/ +/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/ +# define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64 +/*==== use exp() and sin() ====*/ +# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7 +# define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255 +#endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT + +/* disable these deprecated features by default */ +#ifndef LINK_TIME_OPTIMIZATION_ENABLE + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION +#endif +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 diff --git a/keyboards/abacus/info.json b/keyboards/abacus/info.json new file mode 100644 index 00000000000..dd4d15cd521 --- /dev/null +++ b/keyboards/abacus/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "Abacus", + "url": "https://www.github.com/nickolaij", + "maintainer": "nickolaij", + "width": 12.75, + "height": 4, + "layouts": { + "LAYOUT": { + "key_count": 45, + "layout": [ + {"label":"k00", "x":0, "y":0, "w":1}, + {"label":"k01", "x":1, "y":0, "w":1}, + {"label":"k02", "x":2, "y":0, "w":1}, + {"label":"k03", "x":3, "y":0, "w":1}, + {"label":"k04", "x":4, "y":0, "w":1}, + {"label":"k05", "x":5, "y":0, "w":1}, + {"label":"k06", "x":6, "y":0, "w":1}, + {"label":"k07", "x":7, "y":0, "w":1}, + {"label":"k08", "x":8, "y":0, "w":1}, + {"label":"k09", "x":9, "y":0, "w":1}, + {"label":"k0a", "x":10, "y":0, "w":1}, + {"label":"k0b", "x":11, "y":0, "w":1.75}, + + {"label":"k10", "x":0, "y":1, "w":1.25}, + {"label":"k11", "x":1.25, "y":1, "w":1}, + {"label":"k12", "x":2.25, "y":1, "w":1}, + {"label":"k13", "x":3.25, "y":1, "w":1}, + {"label":"k14", "x":4.25, "y":1, "w":1}, + {"label":"k15", "x":5.25, "y":1, "w":1}, + {"label":"k16", "x":6.25, "y":1, "w":1}, + {"label":"k17", "x":7.25, "y":1, "w":1}, + {"label":"k18", "x":8.25, "y":1, "w":1}, + {"label":"k19", "x":9.25, "y":1, "w":1}, + {"label":"k1a", "x":10.25, "y":1, "w":1}, + {"label":"k1b", "x":11.25, "y":1, "w":1.5}, + + {"label":"k20", "x":0, "y":2, "w":1.75}, + {"label":"k21", "x":1.75, "y":2, "w":1}, + {"label":"k22", "x":2.75, "y":2, "w":1}, + {"label":"k23", "x":3.75, "y":2, "w":1}, + {"label":"k24", "x":4.75, "y":2, "w":1}, + {"label":"k25", "x":5.75, "y":2, "w":1}, + {"label":"k26", "x":6.75, "y":2, "w":1}, + {"label":"k27", "x":7.75, "y":2, "w":1}, + {"label":"k28", "x":8.75, "y":2, "w":1}, + {"label":"k29", "x":9.75, "y":2, "w":1}, + {"label":"k2a", "x":10.75, "y":2, "w":1}, + {"label":"k2b", "x":11.75, "y":2, "w":1}, + + {"label":"k30", "x":0, "y":3, "w":1.25}, + {"label":"k31", "x":1.25, "y":3, "w":1}, + {"label":"k32", "x":2.25, "y":3, "w":1}, + {"label":"k33", "x":3.25, "y":3, "w":2.75}, + {"label":"k34", "x":6, "y":3, "w":2.75}, + {"label":"k35", "x":8.75, "y":3, "w":1}, + {"label":"k36", "x":9.75, "y":3, "w":1}, + {"label":"k37", "x":10.75, "y":3, "w":1}, + {"label":"k38", "x":11.75, "y":3, "w":1} + ] + } + } +} diff --git a/keyboards/abacus/keymaps/default/keymap.c b/keyboards/abacus/keymaps/default/keymap.c new file mode 100644 index 00000000000..c1d5bd88278 --- /dev/null +++ b/keyboards/abacus/keymaps/default/keymap.c @@ -0,0 +1,148 @@ +/* Copyright 2020 nickolaij + * + * 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 . + */ +#include QMK_KEYBOARD_H + +// wait DELAY ms before unregistering media keys +#define MEDIA_KEY_DELAY 10 + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE, + _UPPER, + _LOWER +}; + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + NICKURL = SAFE_RANGE, + ALTTAB +}; + +enum unicode_names { + LOVEEYES, + THINK, + UPSIDEDOWN, + NOMOUTH, + PARTY, + HEART, + EGGPLANT, + PEACH, + EMOJI100, + EMOJIB +}; + +const uint32_t PROGMEM unicode_map[] = { + [LOVEEYES] = 0x1f60d, + [THINK] = 0x1f914, + [UPSIDEDOWN] = 0x1f643, + [NOMOUTH] = 0x1f636, + [PARTY] = 0x1f973, + [HEART] = 0x1f495, + [EMOJI100] = 0x1f4af, + [PEACH] = 0x1f351, + [EGGPLANT] = 0x1f346, + [EMOJIB] = 0x1f171 +}; + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Base */ + [_BASE] = LAYOUT( + KC_ESCAPE, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPACE, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_BSLASH, + KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_UP, KC_DELETE, + KC_LCTRL, KC_LGUI, MO(_UPPER), KC_SPACE, KC_ENTER, MO(_LOWER), KC_LEFT, KC_DOWN, KC_RIGHT + ), + [_UPPER] = LAYOUT( + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + ALTTAB, _______, _______, _______, _______, _______, _______, _______, KC_LBRACKET, KC_RBRACKET, KC_QUOTE, KC_SLASH, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MINUS, KC_EQUAL, _______, _______, + KC_LALT, _______, _______, _______, _______, _______, KC_HOME, _______, KC_END + ), + [_LOWER] = LAYOUT( + NICKURL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, KC_F11, KC_F12, RGB_MODE_PLAIN, RGB_MODE_BREATHE, RGB_MODE_RAINBOW, RGB_MODE_SWIRL, RGB_MODE_SNAKE, RGB_MODE_KNIGHT, RGB_MODE_GRADIENT, XXXXXXX, RGB_TOG, + _______, X(LOVEEYES), X(THINK), X(UPSIDEDOWN), X(NOMOUTH), X(PARTY), X(PEACH), X(HEART), X(EGGPLANT), X(EMOJI100), X(EMOJIB), RGB_HUI, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______ + ) + + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case NICKURL: + if (record->event.pressed) { + SEND_STRING("https://www.github.com/nickolaij"); + } else { + tap_code(KC_ENTER); + } + return true; + break; + + case ALTTAB: + if (record->event.pressed) { + tap_code16(A(KC_TAB)); + } + return true; + break; + + default: + return true; + + } +} + + +void dip_switch_update_user(uint8_t index, bool active) { + switch (index) { + case 0: + if(active) { + switch(get_highest_layer(layer_state)) { + case _BASE: + tap_code16(LCTL(KC_F)); + break; + case _UPPER: + tap_code(KC_MUTE); + break; + case _LOWER: + tap_code(KC_MEDIA_PLAY_PAUSE); + break; + } + } + } +} + + +void matrix_init_user(void) { + set_unicode_input_mode(UC_WINC); +} + +void encoder_update_user(uint8_t index, bool clockwise) { + + switch(get_highest_layer(layer_state)) { + case _BASE: + clockwise ? tap_code(KC_PGDN) : tap_code(KC_PGUP); + break; + case _UPPER: + clockwise ? tap_code(KC_VOLU) : tap_code(KC_VOLD); + break; + case _LOWER: + clockwise ? tap_code(KC_MEDIA_NEXT_TRACK) : tap_code(KC_MEDIA_PREV_TRACK); + break; + } +} diff --git a/keyboards/abacus/keymaps/default/readme.md b/keyboards/abacus/keymaps/default/readme.md new file mode 100644 index 00000000000..0c6098f0e98 --- /dev/null +++ b/keyboards/abacus/keymaps/default/readme.md @@ -0,0 +1,4 @@ +# The default keymap for Abacus + +This is made based on my first few days of playing with it and honing in on what feels right. +I've repurposed the DIP switch function for the encoder switches and added some functionality for multiple layers also effecting the encoders output. diff --git a/keyboards/abacus/readme.md b/keyboards/abacus/readme.md new file mode 100644 index 00000000000..1f58a25a4ac --- /dev/null +++ b/keyboards/abacus/readme.md @@ -0,0 +1,15 @@ +# Abacus + +![abacus](https://i.imgur.com/IFtuWaK.jpg) + +A first attempt at a PCB design for a mechanical keyboard. Includes rotary encoder and RGB underglow. + +* Keyboard Maintainer: [nickolaij](https://github.com/nickolaij) +* Hardware Supported: Abacus PCB, [Elite C Microcontroller](https://keeb.io/products/elite-c-usb-c-pro-micro-replacement-arduino-compatible-atmega32u4) or Pro Micro Microcontroller (Elite C has additional pins for encoder) +* Hardware Availability: [Abacus PCB Github](https://github.com/nickolaij/Abacus_Rev2) + +Make example for this keyboard (after setting up your build environment): + + make abacus:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/abacus/rules.mk b/keyboards/abacus/rules.mk new file mode 100644 index 00000000000..d3112166961 --- /dev/null +++ b/keyboards/abacus/rules.mk @@ -0,0 +1,36 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# ATmega32A bootloadHID +# ATmega328P USBasp +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration +MOUSEKEY_ENABLE = no # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs +UNICODEMAP_ENABLE = yes +ENCODER_ENABLE = yes +DIP_SWITCH_ENABLE = yes +LTO_ENABLE = yes From 28d94b72484967f12b521e87b2745bc24d792471 Mon Sep 17 00:00:00 2001 From: Koichi Katano <36572567+kkatano@users.noreply.github.com> Date: Fri, 13 Mar 2020 11:30:59 +0900 Subject: [PATCH 05/14] [Keyboard] Add Wallaby (#8398) * Add wallaby * Update readme.md * Update keyboards/wallaby/keymaps/default/keymap.c * Update keyboards/wallaby/rules.mk --- keyboards/wallaby/config.h | 252 ++++++++++++++++++++ keyboards/wallaby/info.json | 101 ++++++++ keyboards/wallaby/keymaps/default/keymap.c | 27 +++ keyboards/wallaby/keymaps/default/readme.md | 1 + keyboards/wallaby/readme.md | 13 + keyboards/wallaby/rules.mk | 34 +++ keyboards/wallaby/wallaby.c | 25 ++ keyboards/wallaby/wallaby.h | 44 ++++ 8 files changed, 497 insertions(+) create mode 100644 keyboards/wallaby/config.h create mode 100644 keyboards/wallaby/info.json create mode 100644 keyboards/wallaby/keymaps/default/keymap.c create mode 100644 keyboards/wallaby/keymaps/default/readme.md create mode 100644 keyboards/wallaby/readme.md create mode 100644 keyboards/wallaby/rules.mk create mode 100644 keyboards/wallaby/wallaby.c create mode 100644 keyboards/wallaby/wallaby.h diff --git a/keyboards/wallaby/config.h b/keyboards/wallaby/config.h new file mode 100644 index 00000000000..0f142f18f2c --- /dev/null +++ b/keyboards/wallaby/config.h @@ -0,0 +1,252 @@ +/* +Copyright 2020 Koichi Katano + +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x5967 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Koichi Katano +#define PRODUCT Wallaby +#define DESCRIPTION A Tenkeyless PCB + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * + */ +#define MATRIX_ROW_PINS { B5, B4, B3, B2, B1, B0 } +#define MATRIX_COL_PINS { D5, C7, C6, D4, D0, E6, F0, F1, F4, F5, F6, F7, D7, D6, D1, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL*/ +#define DIODE_DIRECTION COL2ROW + +/* + * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN. + */ +// #define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6 + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ +// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +// /*== all animations enable ==*/ +// #define RGBLIGHT_ANIMATIONS +// /*== or choose animations ==*/ +// #define RGBLIGHT_EFFECT_BREATHING +// #define RGBLIGHT_EFFECT_RAINBOW_MOOD +// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL +// #define RGBLIGHT_EFFECT_SNAKE +// #define RGBLIGHT_EFFECT_KNIGHT +// #define RGBLIGHT_EFFECT_CHRISTMAS +// #define RGBLIGHT_EFFECT_STATIC_GRADIENT +// #define RGBLIGHT_EFFECT_RGB_TEST +// #define RGBLIGHT_EFFECT_ALTERNATING +// /*== customize breathing effect ==*/ +// /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/ +// #define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64 +// /*==== use exp() and sin() ====*/ +// #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7 +// #define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255 +// #endif + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +/* defined by default; to change, uncomment and set to the combination you want */ +// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP H +//#define MAGIC_KEY_HELP_ALT SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER0_ALT GRAVE +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER B +//#define MAGIC_KEY_BOOTLOADER_ALT ESC +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_EEPROM_CLEAR BSPACE +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT + +/* disable these deprecated features by default */ +#ifndef LINK_TIME_OPTIMIZATION_ENABLE + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION +#endif +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/wallaby/info.json b/keyboards/wallaby/info.json new file mode 100644 index 00000000000..47987f0c4a9 --- /dev/null +++ b/keyboards/wallaby/info.json @@ -0,0 +1,101 @@ +{ + "keyboard_name": "Wallaby", + "url": "https://github.com/kkatano/wallaby", + "maintainer": "Koichi Katano", + "width": 18.26, + "height": 6.47, + "layouts": { + "LAYOUT_tkl_ansi": { + "key_count": 87, + "layout": [ + {"label":"1", "x":0, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6.5, "y":0}, + {"label":"7", "x":7.5, "y":0}, + {"label":"8", "x":8.5, "y":0}, + {"label":"9", "x":9.5, "y":0}, + {"label":"10", "x":11, "y":0}, + {"label":"11", "x":12, "y":0}, + {"label":"12", "x":13, "y":0}, + {"label":"13", "x":14, "y":0}, + {"label":"14", "x":15.26, "y":0}, + {"label":"15", "x":16.26, "y":0}, + {"label":"16", "x":17.26, "y":0}, + {"label":"17", "x":0, "y":1.47}, + {"label":"18", "x":1, "y":1.47}, + {"label":"19", "x":2, "y":1.47}, + {"label":"20", "x":3, "y":1.47}, + {"label":"21", "x":4, "y":1.47}, + {"label":"22", "x":5, "y":1.47}, + {"label":"23", "x":6, "y":1.47}, + {"label":"24", "x":7, "y":1.47}, + {"label":"25", "x":8, "y":1.47}, + {"label":"26", "x":9, "y":1.47}, + {"label":"27", "x":10, "y":1.47}, + {"label":"28", "x":11, "y":1.47}, + {"label":"29", "x":12, "y":1.47}, + {"label":"30", "x":13, "y":1.47, "w":2}, + {"label":"31", "x":15.26, "y":1.47}, + {"label":"32", "x":16.26, "y":1.47}, + {"label":"33", "x":17.26, "y":1.47}, + {"label":"34", "x":0, "y":2.47, "w":1.5}, + {"label":"35", "x":1.5, "y":2.47}, + {"label":"36", "x":2.5, "y":2.47}, + {"label":"37", "x":3.5, "y":2.47}, + {"label":"38", "x":4.5, "y":2.47}, + {"label":"39", "x":5.5, "y":2.47}, + {"label":"40", "x":6.5, "y":2.47}, + {"label":"41", "x":7.5, "y":2.47}, + {"label":"42", "x":8.5, "y":2.47}, + {"label":"43", "x":9.5, "y":2.47}, + {"label":"44", "x":10.5, "y":2.47}, + {"label":"45", "x":11.5, "y":2.47}, + {"label":"46", "x":12.5, "y":2.47}, + {"label":"47", "x":13.5, "y":2.47, "w":1.5}, + {"label":"48", "x":15.26, "y":2.47}, + {"label":"49", "x":16.26, "y":2.47}, + {"label":"50", "x":17.26, "y":2.47}, + {"label":"51", "x":0, "y":3.47, "w":1.75}, + {"label":"52", "x":1.75, "y":3.47}, + {"label":"53", "x":2.75, "y":3.47}, + {"label":"54", "x":3.75, "y":3.47}, + {"label":"55", "x":4.75, "y":3.47}, + {"label":"56", "x":5.75, "y":3.47}, + {"label":"57", "x":6.75, "y":3.47}, + {"label":"58", "x":7.75, "y":3.47}, + {"label":"59", "x":8.75, "y":3.47}, + {"label":"60", "x":9.75, "y":3.47}, + {"label":"61", "x":10.75, "y":3.47}, + {"label":"62", "x":11.75, "y":3.47}, + {"label":"63", "x":12.75, "y":3.47, "w":2.25}, + {"label":"64", "x":0, "y":4.47, "w":2.25}, + {"label":"65", "x":2.25, "y":4.47}, + {"label":"66", "x":3.25, "y":4.47}, + {"label":"67", "x":4.25, "y":4.47}, + {"label":"68", "x":5.25, "y":4.47}, + {"label":"69", "x":6.25, "y":4.47}, + {"label":"70", "x":7.25, "y":4.47}, + {"label":"71", "x":8.25, "y":4.47}, + {"label":"72", "x":9.25, "y":4.47}, + {"label":"73", "x":10.25, "y":4.47}, + {"label":"74", "x":11.25, "y":4.47}, + {"label":"75", "x":12.25, "y":4.47, "w":2.75}, + {"label":"76", "x":16.26, "y":4.47}, + {"label":"77", "x":0, "y":5.47, "w":1.25}, + {"label":"78", "x":1.25, "y":5.47, "w":1.25}, + {"label":"79", "x":2.5, "y":5.47, "w":1.25}, + {"label":"80", "x":3.75, "y":5.47, "w":6.25}, + {"label":"81", "x":10, "y":5.47, "w":1.25}, + {"label":"82", "x":11.25, "y":5.47, "w":1.25}, + {"label":"83", "x":12.5, "y":5.47, "w":1.25}, + {"label":"84", "x":13.75, "y":5.47, "w":1.25}, + {"label":"85", "x":15.26, "y":5.47}, + {"label":"86", "x":16.26, "y":5.47}, + {"label":"87", "x":17.26, "y":5.47} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/wallaby/keymaps/default/keymap.c b/keyboards/wallaby/keymaps/default/keymap.c new file mode 100644 index 00000000000..be9457589bb --- /dev/null +++ b/keyboards/wallaby/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +/* Copyright 2020 Koichi Katano + * + * 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 . + */ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_tkl_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/wallaby/keymaps/default/readme.md b/keyboards/wallaby/keymaps/default/readme.md new file mode 100644 index 00000000000..517ef1e8576 --- /dev/null +++ b/keyboards/wallaby/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for wallaby diff --git a/keyboards/wallaby/readme.md b/keyboards/wallaby/readme.md new file mode 100644 index 00000000000..89c9f9c5670 --- /dev/null +++ b/keyboards/wallaby/readme.md @@ -0,0 +1,13 @@ +# wallaby + +A Tenkeyless PCB for YMDK aluminium case compatible with Filco + +* Keyboard Maintainer: [Koichi Katano](https://github.com/kkatano) +* Hardware Supported: Wallaby PCB +* Hardware Availability: https://github.com/kkatano/wallaby + +Make example for this keyboard (after setting up your build environment): + + make wallaby:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/wallaby/rules.mk b/keyboards/wallaby/rules.mk new file mode 100644 index 00000000000..1f9b6d4daad --- /dev/null +++ b/keyboards/wallaby/rules.mk @@ -0,0 +1,34 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# ATmega32A bootloadHID +# ATmega328P USBasp +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs + +LAYOUTS = tkl_ansi diff --git a/keyboards/wallaby/wallaby.c b/keyboards/wallaby/wallaby.c new file mode 100644 index 00000000000..b27ff4e29c8 --- /dev/null +++ b/keyboards/wallaby/wallaby.c @@ -0,0 +1,25 @@ +/* Copyright 2020 Koichi Katano + * + * 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 . + */ + +#include "wallaby.h" + +bool led_update_kb(led_t led_state) { + if (led_update_user(led_state)) { + writePin(B6, led_state.caps_lock); + writePin(B7, led_state.scroll_lock); + } + return true; +} diff --git a/keyboards/wallaby/wallaby.h b/keyboards/wallaby/wallaby.h new file mode 100644 index 00000000000..f5ab30b8309 --- /dev/null +++ b/keyboards/wallaby/wallaby.h @@ -0,0 +1,44 @@ +/* Copyright 2020 Koichi Katano + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_tkl_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0E, k0F, k0G, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \ + k40, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4F, \ + k50, k51, k52, k56, k5A, k5B, k5C, k5D, k5E, k5F, k5G \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, KC_NO, k0E, k0F, k0G }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, KC_NO, KC_NO, KC_NO }, \ + { k40, KC_NO, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, KC_NO, KC_NO, k4F, KC_NO }, \ + { k50, k51, k52, KC_NO, KC_NO, KC_NO, k56, KC_NO, KC_NO, KC_NO, k5A, k5B, k5C, k5D, k5E, k5F, k5G } \ +} From 3cd2a27ac0f963bc2023c3004f6f8eff0eb62a81 Mon Sep 17 00:00:00 2001 From: francislan Date: Fri, 13 Mar 2020 09:49:44 -0700 Subject: [PATCH 06/14] Decouple mouse cursor and mouse wheel in accelerated mode (#6685) * Decouples mouse cursor and mouse wheel movements in accelerated mode. * Fixed comment indentation. * Updated docs Co-authored-by: Francis LAN --- docs/feature_mouse_keys.md | 3 ++ tmk_core/common/mousekey.c | 72 +++++++++++++++++++++++++------------- tmk_core/common/mousekey.h | 6 ++++ 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/docs/feature_mouse_keys.md b/docs/feature_mouse_keys.md index 363662f633b..88a2c7c05e5 100644 --- a/docs/feature_mouse_keys.md +++ b/docs/feature_mouse_keys.md @@ -58,6 +58,8 @@ This is the default mode. You can adjust the cursor and scrolling acceleration u |`MOUSEKEY_INTERVAL` |50 |Time between cursor movements | |`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops | |`MOUSEKEY_TIME_TO_MAX` |20 |Time until maximum cursor speed is reached | +|`MOUSEKEY_WHEEL_DELAY` |300 |Delay between pressing a wheel key and wheel movement | +|`MOUSEKEY_WHEEL_INTERVAL` |100 |Time between wheel movements | |`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action | |`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached | @@ -66,6 +68,7 @@ Tips: * Setting `MOUSEKEY_DELAY` too low makes the cursor unresponsive. Setting it too high makes small movements difficult. * For smoother cursor movements, lower the value of `MOUSEKEY_INTERVAL`. If the refresh rate of your display is 60Hz, you could set it to `16` (1/60). As this raises the cursor speed significantly, you may want to lower `MOUSEKEY_MAX_SPEED`. * Setting `MOUSEKEY_TIME_TO_MAX` or `MOUSEKEY_WHEEL_TIME_TO_MAX` to `0` will disable acceleration for the cursor or scrolling respectively. This way you can make one of them constant while keeping the other accelerated, which is not possible in constant speed mode. +* Setting `MOUSEKEY_WHEEL_INTERVAL` too low will make scrolling too fast. Setting it too high will make scrolling too slow when the wheel key is held down. Cursor acceleration uses the same algorithm as the X Window System MouseKeysAccel feature. You can read more about it [on Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys). diff --git a/tmk_core/common/mousekey.c b/tmk_core/common/mousekey.c index 2df7728a41f..00357f5f67c 100644 --- a/tmk_core/common/mousekey.c +++ b/tmk_core/common/mousekey.c @@ -39,6 +39,9 @@ static uint16_t last_timer = 0; #ifndef MK_3_SPEED +static uint16_t last_timer_c = 0; +static uint16_t last_timer_w = 0; + /* * Mouse keys acceleration algorithm * http://en.wikipedia.org/wiki/Mouse_keys @@ -56,6 +59,10 @@ uint8_t mk_time_to_max = MOUSEKEY_TIME_TO_MAX; /* ramp used to reach maximum pointer speed (NOT SUPPORTED) */ // int8_t mk_curve = 0; /* wheel params */ +/* milliseconds between the initial key press and first repeated motion event (0-2550) */ +uint8_t mk_wheel_delay = MOUSEKEY_WHEEL_DELAY / 10; +/* milliseconds between repeated motion events (0-255) */ +uint8_t mk_wheel_interval = MOUSEKEY_WHEEL_INTERVAL; uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED; uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX; @@ -96,33 +103,48 @@ static uint8_t wheel_unit(void) { } void mousekey_task(void) { - if (timer_elapsed(last_timer) < (mousekey_repeat ? mk_interval : mk_delay * 10)) { - return; - } - if (mouse_report.x == 0 && mouse_report.y == 0 && mouse_report.v == 0 && mouse_report.h == 0) { - return; - } - if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; - if (mouse_report.x > 0) mouse_report.x = move_unit(); - if (mouse_report.x < 0) mouse_report.x = move_unit() * -1; - if (mouse_report.y > 0) mouse_report.y = move_unit(); - if (mouse_report.y < 0) mouse_report.y = move_unit() * -1; - /* diagonal move [1/sqrt(2)] */ - if (mouse_report.x && mouse_report.y) { - mouse_report.x = times_inv_sqrt2(mouse_report.x); - if (mouse_report.x == 0) { - mouse_report.x = 1; - } - mouse_report.y = times_inv_sqrt2(mouse_report.y); - if (mouse_report.y == 0) { - mouse_report.y = 1; + // report cursor and scroll movement independently + report_mouse_t const tmpmr = mouse_report; + if ((mouse_report.x || mouse_report.y) && + timer_elapsed(last_timer_c) > (mousekey_repeat ? mk_interval : mk_delay * 10)) { + if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; + mouse_report.v = 0; + mouse_report.h = 0; + if (mouse_report.x > 0) mouse_report.x = move_unit(); + if (mouse_report.x < 0) mouse_report.x = move_unit() * -1; + if (mouse_report.y > 0) mouse_report.y = move_unit(); + if (mouse_report.y < 0) mouse_report.y = move_unit() * -1; + /* diagonal move [1/sqrt(2)] */ + if (mouse_report.x && mouse_report.y) { + mouse_report.x = times_inv_sqrt2(mouse_report.x); + if (mouse_report.x == 0) { mouse_report.x = 1; } + mouse_report.y = times_inv_sqrt2(mouse_report.y); + if (mouse_report.y == 0) { mouse_report.y = 1; } } + mousekey_send(); + last_timer_c = last_timer; + mouse_report = tmpmr; + } + if ((mouse_report.v || mouse_report.h) && + timer_elapsed(last_timer_w) > (mousekey_repeat ? mk_wheel_interval: mk_wheel_delay * 10)) { + if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; + mouse_report.x = 0; + mouse_report.y = 0; + if (mouse_report.v > 0) mouse_report.v = wheel_unit(); + if (mouse_report.v < 0) mouse_report.v = wheel_unit() * -1; + if (mouse_report.h > 0) mouse_report.h = wheel_unit(); + if (mouse_report.h < 0) mouse_report.h = wheel_unit() * -1; + /* diagonal move [1/sqrt(2)] */ + if (mouse_report.v && mouse_report.h) { + mouse_report.v = times_inv_sqrt2(mouse_report.v); + if (mouse_report.v == 0) { mouse_report.v = 1; } + mouse_report.h = times_inv_sqrt2(mouse_report.h); + if (mouse_report.h == 0) { mouse_report.h = 1; } + } + mousekey_send(); + last_timer_w = last_timer; + mouse_report = tmpmr; } - if (mouse_report.v > 0) mouse_report.v = wheel_unit(); - if (mouse_report.v < 0) mouse_report.v = wheel_unit() * -1; - if (mouse_report.h > 0) mouse_report.h = wheel_unit(); - if (mouse_report.h < 0) mouse_report.h = wheel_unit() * -1; - mousekey_send(); } void mousekey_on(uint8_t code) { diff --git a/tmk_core/common/mousekey.h b/tmk_core/common/mousekey.h index 48946987cee..05e4538234e 100644 --- a/tmk_core/common/mousekey.h +++ b/tmk_core/common/mousekey.h @@ -55,6 +55,12 @@ along with this program. If not, see . # ifndef MOUSEKEY_TIME_TO_MAX # define MOUSEKEY_TIME_TO_MAX 20 # endif +# ifndef MOUSEKEY_WHEEL_DELAY +# define MOUSEKEY_WHEEL_DELAY 300 +# endif +# ifndef MOUSEKEY_WHEEL_INTERVAL +# define MOUSEKEY_WHEEL_INTERVAL 100 +# endif # ifndef MOUSEKEY_WHEEL_MAX_SPEED # define MOUSEKEY_WHEEL_MAX_SPEED 8 # endif From f89439ae09c06d0e85f59af2bc5e020d141f23d6 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Fri, 13 Mar 2020 17:24:38 +0000 Subject: [PATCH 07/14] format code according to conventions [skip ci] --- tmk_core/common/mousekey.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tmk_core/common/mousekey.c b/tmk_core/common/mousekey.c index 00357f5f67c..74fa88abddd 100644 --- a/tmk_core/common/mousekey.c +++ b/tmk_core/common/mousekey.c @@ -39,8 +39,8 @@ static uint16_t last_timer = 0; #ifndef MK_3_SPEED -static uint16_t last_timer_c = 0; -static uint16_t last_timer_w = 0; +static uint16_t last_timer_c = 0; +static uint16_t last_timer_w = 0; /* * Mouse keys acceleration algorithm @@ -62,7 +62,7 @@ uint8_t mk_time_to_max = MOUSEKEY_TIME_TO_MAX; /* milliseconds between the initial key press and first repeated motion event (0-2550) */ uint8_t mk_wheel_delay = MOUSEKEY_WHEEL_DELAY / 10; /* milliseconds between repeated motion events (0-255) */ -uint8_t mk_wheel_interval = MOUSEKEY_WHEEL_INTERVAL; +uint8_t mk_wheel_interval = MOUSEKEY_WHEEL_INTERVAL; uint8_t mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED; uint8_t mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX; @@ -105,8 +105,7 @@ static uint8_t wheel_unit(void) { void mousekey_task(void) { // report cursor and scroll movement independently report_mouse_t const tmpmr = mouse_report; - if ((mouse_report.x || mouse_report.y) && - timer_elapsed(last_timer_c) > (mousekey_repeat ? mk_interval : mk_delay * 10)) { + if ((mouse_report.x || mouse_report.y) && timer_elapsed(last_timer_c) > (mousekey_repeat ? mk_interval : mk_delay * 10)) { if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; mouse_report.v = 0; mouse_report.h = 0; @@ -117,16 +116,19 @@ void mousekey_task(void) { /* diagonal move [1/sqrt(2)] */ if (mouse_report.x && mouse_report.y) { mouse_report.x = times_inv_sqrt2(mouse_report.x); - if (mouse_report.x == 0) { mouse_report.x = 1; } + if (mouse_report.x == 0) { + mouse_report.x = 1; + } mouse_report.y = times_inv_sqrt2(mouse_report.y); - if (mouse_report.y == 0) { mouse_report.y = 1; } + if (mouse_report.y == 0) { + mouse_report.y = 1; + } } mousekey_send(); last_timer_c = last_timer; mouse_report = tmpmr; } - if ((mouse_report.v || mouse_report.h) && - timer_elapsed(last_timer_w) > (mousekey_repeat ? mk_wheel_interval: mk_wheel_delay * 10)) { + if ((mouse_report.v || mouse_report.h) && timer_elapsed(last_timer_w) > (mousekey_repeat ? mk_wheel_interval : mk_wheel_delay * 10)) { if (mousekey_repeat != UINT8_MAX) mousekey_repeat++; mouse_report.x = 0; mouse_report.y = 0; @@ -137,9 +139,13 @@ void mousekey_task(void) { /* diagonal move [1/sqrt(2)] */ if (mouse_report.v && mouse_report.h) { mouse_report.v = times_inv_sqrt2(mouse_report.v); - if (mouse_report.v == 0) { mouse_report.v = 1; } + if (mouse_report.v == 0) { + mouse_report.v = 1; + } mouse_report.h = times_inv_sqrt2(mouse_report.h); - if (mouse_report.h == 0) { mouse_report.h = 1; } + if (mouse_report.h == 0) { + mouse_report.h = 1; + } } mousekey_send(); last_timer_w = last_timer; From 9e8767917d628afd3dc43759d1d50151c61944a1 Mon Sep 17 00:00:00 2001 From: fredizzimo Date: Fri, 13 Mar 2020 20:09:38 +0200 Subject: [PATCH 08/14] Fix pressing two keys with the same keycode but different modifiers (#2710) * Fix extra keyboard report during test_fixture teardown * Add tests for pressing two keys with only different modifers * Fix #1708 When two keys that use the same keycode, but different modifiers were pressed at the same time, the second keypress wasn't registered. This is fixed by forcing a key release when we detect a new press for the same keycode. * Fix the NKRO version of is_key_pressed * Fix uninitalized loop variable Co-authored-by: Jack Humbert --- tests/basic/keymap.c | 3 +- tests/basic/test_keypress.cpp | 118 ++++++++++++++++++++++++++++- tests/test_common/test_fixture.cpp | 7 +- tmk_core/common/action.c | 7 ++ tmk_core/common/report.c | 26 +++++++ tmk_core/common/report.h | 2 + 6 files changed, 158 insertions(+), 5 deletions(-) diff --git a/tests/basic/keymap.c b/tests/basic/keymap.c index 02b3cc961a2..951ce8e0cc9 100644 --- a/tests/basic/keymap.c +++ b/tests/basic/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM { // 0 1 2 3 4 5 6 7 8 9 {KC_A, KC_B, KC_NO, KC_LSFT, KC_RSFT, KC_LCTL, COMBO1, SFT_T(KC_P), M(0), KC_NO}, - {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_EQL, KC_PLUS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, {KC_C, KC_D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, }, @@ -43,3 +43,4 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { } return MACRO_NONE; }; + diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp index e5247911cbb..551458a0d9d 100644 --- a/tests/basic/test_keypress.cpp +++ b/tests/basic/test_keypress.cpp @@ -18,6 +18,7 @@ using testing::_; using testing::Return; +using testing::InSequence; class KeyPress : public TestFixture {}; @@ -121,4 +122,119 @@ TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) { EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL))); EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); keyboard_task(); -} \ No newline at end of file +} + +TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) { + TestDriver driver; + InSequence s; + + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) { + TestDriver driver; + InSequence s; + + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(1, 1); //KC_PLS + // BUG: Should really still return KC_EQL, but this is fine too + // It's also called twice for some reason + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) { + TestDriver driver; + InSequence s; + + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(0, 1); // KQ_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) { + TestDriver driver; + InSequence s; + + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + press_key(1, 1); // KC_PLUS + // BUG: The sequence is a bit strange, but it works, the end result is that + // KC_PLUS is sent + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(0, 1); //KC_EQL + // I guess it's fine to still report shift here + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + release_key(1, 1); // KC_PLUS + // This report is not needed + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp index 8caf1fca4a1..20ed838eb6a 100644 --- a/tests/test_common/test_fixture.cpp +++ b/tests/test_common/test_fixture.cpp @@ -32,14 +32,15 @@ TestFixture::TestFixture() {} TestFixture::~TestFixture() { TestDriver driver; - layer_clear(); - clear_all_keys(); // Run for a while to make sure all keys are completely released EXPECT_CALL(driver, send_keyboard_mock(_)).Times(AnyNumber()); + layer_clear(); + clear_all_keys(); idle_for(TAPPING_TERM + 10); testing::Mock::VerifyAndClearExpectations(&driver); // Verify that the matrix really is cleared - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(Between(0, 1)); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0); + idle_for(TAPPING_TERM + 10); } void TestFixture::run_one_scan_loop() { diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 0ec4a43eee7..2deafd465f7 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -754,6 +754,13 @@ void register_code(uint8_t code) { */ #endif { + // Force a new key press if the key is already pressed + // without this, keys with the same keycode, but different + // modifiers will be reported incorrectly, see issue #1708 + if (is_key_pressed(keyboard_report, code)) { + del_key(code); + send_keyboard_report(); + } add_key(code); send_keyboard_report(); } diff --git a/tmk_core/common/report.c b/tmk_core/common/report.c index f4758b48ec7..f4cdca7281f 100644 --- a/tmk_core/common/report.c +++ b/tmk_core/common/report.c @@ -68,6 +68,32 @@ uint8_t get_first_key(report_keyboard_t* keyboard_report) { #endif } +/** \brief Checks if a key is pressed in the report + * + * Returns true if the keyboard_report reports that the key is pressed, otherwise false + * Note: The function doesn't support modifers currently, and it returns false for KC_NO + */ +bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key) { + if (key == KC_NO) { + return false; + } +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + if ((key>>3) < KEYBOARD_REPORT_BITS) { + return keyboard_report->nkro.bits[key>>3] & 1<<(key&7); + } else { + return false; + } + } +#endif + for (int i=0; i < KEYBOARD_REPORT_KEYS; i++) { + if (keyboard_report->keys[i] == key) { + return true; + } + } + return false; +} + /** \brief add key byte * * FIXME: Needs doc diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index ecd5da89a06..645e0161212 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -19,6 +19,7 @@ along with this program. If not, see . #define REPORT_H #include +#include #include "keycode.h" /* report id */ @@ -236,6 +237,7 @@ static inline uint16_t KEYCODE2CONSUMER(uint8_t key) { uint8_t has_anykey(report_keyboard_t* keyboard_report); uint8_t get_first_key(report_keyboard_t* keyboard_report); +bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key); void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code); void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code); From 5e98eaaaff8fde1ce25b9bad6c00a982718cb467 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Fri, 13 Mar 2020 18:44:56 +0000 Subject: [PATCH 09/14] format code according to conventions [skip ci] --- tests/basic/keymap.c | 1 - tests/basic/test_keypress.cpp | 176 +++++++++++++++++----------------- tmk_core/common/action.c | 4 +- tmk_core/common/report.c | 32 +++---- tmk_core/common/report.h | 2 +- 5 files changed, 107 insertions(+), 108 deletions(-) diff --git a/tests/basic/keymap.c b/tests/basic/keymap.c index 951ce8e0cc9..2b5747abb7c 100644 --- a/tests/basic/keymap.c +++ b/tests/basic/keymap.c @@ -43,4 +43,3 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { } return MACRO_NONE; }; - diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp index 551458a0d9d..ecd6e98e442 100644 --- a/tests/basic/test_keypress.cpp +++ b/tests/basic/test_keypress.cpp @@ -17,8 +17,8 @@ #include "test_common.hpp" using testing::_; -using testing::Return; using testing::InSequence; +using testing::Return; class KeyPress : public TestFixture {}; @@ -125,116 +125,116 @@ TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) { } TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) { - TestDriver driver; - InSequence s; + TestDriver driver; + InSequence s; - press_key(1, 1); // KC_PLUS - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(1, 1); // KC_PLUS - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - press_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); } TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) { - TestDriver driver; - InSequence s; + TestDriver driver; + InSequence s; - press_key(1, 1); // KC_PLUS - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - press_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(1, 1); //KC_PLS - // BUG: Should really still return KC_EQL, but this is fine too - // It's also called twice for some reason - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(1, 1); // KC_PLS + // BUG: Should really still return KC_EQL, but this is fine too + // It's also called twice for some reason + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); } TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) { - TestDriver driver; - InSequence s; + TestDriver driver; + InSequence s; - press_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); // KQ_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(0, 1); // KQ_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - press_key(1, 1); // KC_PLUS - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(1, 1); // KC_PLUS - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(1, 1); // KC_PLUS + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); } TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) { - TestDriver driver; - InSequence s; + TestDriver driver; + InSequence s; - press_key(0, 1); // KC_EQL - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(0, 1); // KC_EQL + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - press_key(1, 1); // KC_PLUS - // BUG: The sequence is a bit strange, but it works, the end result is that - // KC_PLUS is sent - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + press_key(1, 1); // KC_PLUS + // BUG: The sequence is a bit strange, but it works, the end result is that + // KC_PLUS is sent + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(0, 1); //KC_EQL - // I guess it's fine to still report shift here - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(0, 1); // KC_EQL + // I guess it's fine to still report shift here + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); - release_key(1, 1); // KC_PLUS - // This report is not needed - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); - EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); - run_one_scan_loop(); - testing::Mock::VerifyAndClearExpectations(&driver); + release_key(1, 1); // KC_PLUS + // This report is not needed + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); } diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 2deafd465f7..555a71ebc62 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -758,8 +758,8 @@ void register_code(uint8_t code) { // without this, keys with the same keycode, but different // modifiers will be reported incorrectly, see issue #1708 if (is_key_pressed(keyboard_report, code)) { - del_key(code); - send_keyboard_report(); + del_key(code); + send_keyboard_report(); } add_key(code); send_keyboard_report(); diff --git a/tmk_core/common/report.c b/tmk_core/common/report.c index f4cdca7281f..1bcb6f2adb9 100644 --- a/tmk_core/common/report.c +++ b/tmk_core/common/report.c @@ -74,24 +74,24 @@ uint8_t get_first_key(report_keyboard_t* keyboard_report) { * Note: The function doesn't support modifers currently, and it returns false for KC_NO */ bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key) { - if (key == KC_NO) { - return false; - } -#ifdef NKRO_ENABLE - if (keyboard_protocol && keymap_config.nkro) { - if ((key>>3) < KEYBOARD_REPORT_BITS) { - return keyboard_report->nkro.bits[key>>3] & 1<<(key&7); - } else { - return false; + if (key == KC_NO) { + return false; + } +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + if ((key >> 3) < KEYBOARD_REPORT_BITS) { + return keyboard_report->nkro.bits[key >> 3] & 1 << (key & 7); + } else { + return false; + } } - } #endif - for (int i=0; i < KEYBOARD_REPORT_KEYS; i++) { - if (keyboard_report->keys[i] == key) { - return true; - } - } - return false; + for (int i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (keyboard_report->keys[i] == key) { + return true; + } + } + return false; } /** \brief add key byte diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 645e0161212..b7d104a4592 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -237,7 +237,7 @@ static inline uint16_t KEYCODE2CONSUMER(uint8_t key) { uint8_t has_anykey(report_keyboard_t* keyboard_report); uint8_t get_first_key(report_keyboard_t* keyboard_report); -bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key); +bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key); void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code); void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code); From f81b0e35a6a25a9a6e633dc65a4900bed2458cfb Mon Sep 17 00:00:00 2001 From: skullydazed Date: Fri, 13 Mar 2020 15:47:04 -0700 Subject: [PATCH 10/14] Add decorators for determining keyboard and keymap based on current directory (#8191) * Use pathlib everywhere we can * Improvements based on @erovia's feedback * rework qmk compile and qmk flash to use pathlib * style * Remove the subcommand_name argument from find_keyboard_keymap() * add experimental decorators * Create decorators for finding keyboard and keymap based on current directory. Decorators were inspired by @Erovia's brilliant work on the proof of concept. --- lib/python/qmk/cli/__init__.py | 5 ++ lib/python/qmk/cli/compile.py | 37 ++++++++----- lib/python/qmk/cli/flash.py | 47 +++++++++++------ lib/python/qmk/cli/list/keymaps.py | 3 ++ lib/python/qmk/cli/new/keymap.py | 3 ++ lib/python/qmk/commands.py | 69 ------------------------ lib/python/qmk/decorators.py | 85 ++++++++++++++++++++++++++++++ lib/python/qmk/path.py | 2 +- 8 files changed, 152 insertions(+), 99 deletions(-) create mode 100644 lib/python/qmk/decorators.py diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 5149a6215af..eb524217cde 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -2,6 +2,8 @@ We list each subcommand here explicitly because all the reliable ways of searching for modules are slow and delay startup. """ +from milc import cli + from . import cformat from . import compile from . import config @@ -16,3 +18,6 @@ from . import kle2json from . import new from . import pyformat from . import pytest + +if not hasattr(cli, 'config_source'): + cli.log.warning("Your QMK CLI is out of date. Please upgrade with `pip3 install --upgrade qmk` or by using your package manager.") diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index 3068c97d81e..6480d624b04 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -8,13 +8,17 @@ from argparse import FileType from milc import cli import qmk.path -from qmk.commands import compile_configurator_json, create_make_command, find_keyboard_keymap, parse_configurator_json +from qmk.decorators import automagic_keyboard, automagic_keymap +from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), help='The configurator export to compile') @cli.argument('-kb', '--keyboard', help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') @cli.argument('-km', '--keymap', help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') +@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the make command to be run.") @cli.subcommand('Compile a QMK Firmware.') +@automagic_keyboard +@automagic_keymap def compile(cli): """Compile a QMK Firmware. @@ -22,8 +26,10 @@ def compile(cli): If a keyboard and keymap are provided this command will build a firmware based on that. """ + command = None + if cli.args.filename: - # If a configurator JSON was provided skip straight to compiling it + # If a configurator JSON was provided generate a keymap and compile it # FIXME(skullydazed): add code to check and warn if the keymap already exists when compiling a json keymap. user_keymap = parse_configurator_json(cli.args.filename) keymap_path = qmk.path.keymap(user_keymap['keyboard']) @@ -32,16 +38,23 @@ def compile(cli): cli.log.info('Wrote keymap to {fg_cyan}%s/%s/keymap.c', keymap_path, user_keymap['keymap']) else: - # Perform the action the user specified - user_keyboard, user_keymap = find_keyboard_keymap() - if user_keyboard and user_keymap: + if cli.config.compile.keyboard and cli.config.compile.keymap: # Generate the make command for a specific keyboard/keymap. - command = create_make_command(user_keyboard, user_keymap) + command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap) - else: - cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') - cli.echo('usage: qmk compile [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [filename]') - return False + elif not cli.config.compile.keyboard: + cli.log.error('Could not determine keyboard!') + elif not cli.config.compile.keymap: + cli.log.error('Could not determine keymap!') - cli.log.info('Compiling keymap with {fg_cyan}%s\n\n', ' '.join(command)) - subprocess.run(command) + # Compile the firmware, if we're able to + if command: + cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) + if not cli.args.dry_run: + cli.echo('\n') + subprocess.run(command) + + else: + cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') + cli.echo('usage: qmk compile [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [filename]') + return False diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index f669c3cb7e7..f8497071efd 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -6,9 +6,11 @@ A bootloader must be specified. import subprocess from argparse import FileType -import qmk.path from milc import cli -from qmk.commands import compile_configurator_json, create_make_command, find_keyboard_keymap, parse_configurator_json + +import qmk.path +from qmk.decorators import automagic_keyboard, automagic_keymap +from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json def print_bootloader_help(): @@ -28,12 +30,15 @@ def print_bootloader_help(): cli.echo('For more info, visit https://docs.qmk.fm/#/flashing') -@cli.argument('-bl', '--bootloader', default='flash', help='The flash command, corresponding to qmk\'s make options of bootloaders.') @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), help='The configurator export JSON to compile.') +@cli.argument('-b', '--bootloaders', action='store_true', help='List the available bootloaders.') +@cli.argument('-bl', '--bootloader', default='flash', help='The flash command, corresponding to qmk\'s make options of bootloaders.') @cli.argument('-km', '--keymap', help='The keymap to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied.') @cli.argument('-kb', '--keyboard', help='The keyboard to build a firmware for. Use this if you dont have a configurator file. Ignored when a configurator file is supplied.') -@cli.argument('-b', '--bootloaders', action='store_true', help='List the available bootloaders.') +@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the make command to be run.") @cli.subcommand('QMK Flash.') +@automagic_keyboard +@automagic_keymap def flash(cli): """Compile and or flash QMK Firmware or keyboard/layout @@ -42,12 +47,13 @@ def flash(cli): If no file is supplied, keymap and keyboard are expected. - If bootloader is omitted, the one according to the rules.mk will be used. - + If bootloader is omitted the make system will use the configured bootloader for that keyboard. """ + command = '' + if cli.args.bootloaders: # Provide usage and list bootloaders - cli.echo('usage: qmk flash [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') + cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') print_bootloader_help() return False @@ -60,16 +66,23 @@ def flash(cli): cli.log.info('Wrote keymap to {fg_cyan}%s/%s/keymap.c', keymap_path, user_keymap['keymap']) else: - # Perform the action the user specified - user_keyboard, user_keymap = find_keyboard_keymap() - if user_keyboard and user_keymap: + if cli.config.flash.keyboard and cli.config.flash.keymap: # Generate the make command for a specific keyboard/keymap. - command = create_make_command(user_keyboard, user_keymap, cli.args.bootloader) + command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, cli.args.bootloader) - else: - cli.log.error('You must supply a configurator export or both `--keyboard` and `--keymap`.') - cli.echo('usage: qmk flash [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') - return False + elif not cli.config.flash.keyboard: + cli.log.error('Could not determine keyboard!') + elif not cli.config.flash.keymap: + cli.log.error('Could not determine keymap!') - cli.log.info('Flashing keymap with {fg_cyan}%s\n\n', ' '.join(command)) - subprocess.run(command) + # Compile the firmware, if we're able to + if command: + cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) + if not cli.args.dry_run: + cli.echo('\n') + subprocess.run(command) + + else: + cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') + cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') + return False diff --git a/lib/python/qmk/cli/list/keymaps.py b/lib/python/qmk/cli/list/keymaps.py index d199d29bc3d..cec9ca0224e 100644 --- a/lib/python/qmk/cli/list/keymaps.py +++ b/lib/python/qmk/cli/list/keymaps.py @@ -1,12 +1,15 @@ """List the keymaps for a specific keyboard """ from milc import cli + import qmk.keymap +from qmk.decorators import automagic_keyboard from qmk.errors import NoSuchKeyboardError @cli.argument("-kb", "--keyboard", help="Specify keyboard name. Example: 1upkeyboards/1up60hse") @cli.subcommand("List the keymaps for a specific keyboard") +@automagic_keyboard def list_keymaps(cli): """List the keymaps for a specific keyboard """ diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index cbe50692ec0..5ae26285659 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -4,12 +4,15 @@ import shutil from pathlib import Path import qmk.path +from qmk.decorators import automagic_keyboard, automagic_keymap from milc import cli @cli.argument('-kb', '--keyboard', help='Specify keyboard name. Example: 1upkeyboards/1up60hse') @cli.argument('-km', '--keymap', help='Specify the name for the new keymap directory') @cli.subcommand('Creates a new keymap for the keyboard of your choosing') +@automagic_keyboard +@automagic_keymap def new_keymap(cli): """Creates a new keymap for the keyboard of your choosing. """ diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index cdb8ee037ad..3d4ed161636 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -1,12 +1,8 @@ """Helper functions for commands. """ import json -from pathlib import Path - -from milc import cli import qmk.keymap -from qmk.path import is_keyboard, is_keymap_dir, under_qmk_firmware def create_make_command(keyboard, keymap, target=None): @@ -59,71 +55,6 @@ def compile_configurator_json(user_keymap, bootloader=None): return create_make_command(user_keymap['keyboard'], user_keymap['keymap'], bootloader) -def find_keyboard_keymap(): - """Returns `(keyboard_name, keymap_name)` based on the user's current environment. - - This determines the keyboard and keymap name using the following precedence order: - - * Command line flags (--keyboard and --keymap) - * Current working directory - * `keyboards/` - * `keyboards//keymaps/` - * `layouts/**/` - * `users/` - * Configuration - * cli.config..keyboard - * cli.config..keymap - """ - # Check to make sure their copy of MILC supports config_source - if not hasattr(cli, 'config_source'): - cli.log.error("Your QMK CLI is out of date. Please upgrade using pip3 or your package manager.") - exit(1) - - # State variables - relative_cwd = under_qmk_firmware() - keyboard_name = "" - keymap_name = "" - - # If the keyboard or keymap are passed as arguments use that in preference to anything else - if cli.config_source[cli._entrypoint.__name__]['keyboard'] == 'argument': - keyboard_name = cli.config[cli._entrypoint.__name__]['keyboard'] - if cli.config_source[cli._entrypoint.__name__]['keymap'] == 'argument': - keymap_name = cli.config[cli._entrypoint.__name__]['keymap'] - - if not keyboard_name or not keymap_name: - # If we don't have a keyboard_name and keymap_name from arguments try to derive one or both - if relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'keyboards': - # Try to determine the keyboard and/or keymap name - current_path = Path('/'.join(relative_cwd.parts[1:])) - - if current_path.parts[-2] == 'keymaps': - if not keymap_name: - keymap_name = current_path.parts[-1] - if not keyboard_name: - keyboard_name = '/'.join(current_path.parts[:-2]) - elif not keyboard_name and is_keyboard(current_path): - keyboard_name = str(current_path) - - elif relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'layouts': - # Try to determine the keymap name from the community layout - if is_keymap_dir(relative_cwd) and not keymap_name: - keymap_name = relative_cwd.name - - elif relative_cwd and relative_cwd.parts and relative_cwd.parts[0] == 'users': - # Try to determine the keymap name based on which userspace they're in - if not keymap_name and len(relative_cwd.parts) > 1: - keymap_name = relative_cwd.parts[1] - - # If we still don't have a keyboard and keymap check the config - if not keyboard_name and cli.config[cli._entrypoint.__name__]['keyboard']: - keyboard_name = cli.config[cli._entrypoint.__name__]['keyboard'] - - if not keymap_name and cli.config[cli._entrypoint.__name__]['keymap']: - keymap_name = cli.config[cli._entrypoint.__name__]['keymap'] - - return (keyboard_name, keymap_name) - - def parse_configurator_json(configurator_file): """Open and parse a configurator json export """ diff --git a/lib/python/qmk/decorators.py b/lib/python/qmk/decorators.py new file mode 100644 index 00000000000..94e14bf375a --- /dev/null +++ b/lib/python/qmk/decorators.py @@ -0,0 +1,85 @@ +"""Helpful decorators that subcommands can use. +""" +import functools +from pathlib import Path + +from milc import cli + +from qmk.path import is_keyboard, is_keymap_dir, under_qmk_firmware + + +def automagic_keyboard(func): + """Sets `cli.config..keyboard` based on environment. + + This will rewrite cli.config..keyboard if the user did not pass `--keyboard` and the directory they are currently in is a keyboard or keymap directory. + """ + @functools.wraps(func) + def wrapper(*args, **kwargs): + # Check to make sure their copy of MILC supports config_source + if not hasattr(cli, 'config_source'): + cli.log.error("This subcommand requires a newer version of the QMK CLI. Please upgrade using `pip3 install --upgrade qmk` or your package manager.") + exit(1) + + # Ensure that `--keyboard` was not passed and CWD is under `qmk_firmware/keyboards` + if cli.config_source[cli._entrypoint.__name__]['keyboard'] != 'argument': + relative_cwd = under_qmk_firmware() + + if relative_cwd and len(relative_cwd.parts) > 1 and relative_cwd.parts[0] == 'keyboards': + # Attempt to extract the keyboard name from the current directory + current_path = Path('/'.join(relative_cwd.parts[1:])) + + if 'keymaps' in current_path.parts: + # Strip current_path of anything after `keymaps` + keymap_index = len(current_path.parts) - current_path.parts.index('keymaps') - 1 + current_path = current_path.parents[keymap_index] + + if is_keyboard(current_path): + cli.config[cli._entrypoint.__name__]['keyboard'] = str(current_path) + cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'keyboard_directory' + + return func(*args, **kwargs) + + return wrapper + + +def automagic_keymap(func): + """Sets `cli.config..keymap` based on environment. + + This will rewrite cli.config..keymap if the user did not pass `--keymap` and the directory they are currently in is a keymap, layout, or user directory. + """ + @functools.wraps(func) + def wrapper(*args, **kwargs): + # Check to make sure their copy of MILC supports config_source + if not hasattr(cli, 'config_source'): + cli.log.error("This subcommand requires a newer version of the QMK CLI. Please upgrade using `pip3 install --upgrade qmk` or your package manager.") + exit(1) + + # Ensure that `--keymap` was not passed and that we're under `qmk_firmware` + if cli.config_source[cli._entrypoint.__name__]['keymap'] != 'argument': + relative_cwd = under_qmk_firmware() + + if relative_cwd and len(relative_cwd.parts) > 1: + # If we're in `qmk_firmware/keyboards` and `keymaps` is in our path, try to find the keyboard name. + if relative_cwd.parts[0] == 'keyboards' and 'keymaps' in relative_cwd.parts: + current_path = Path('/'.join(relative_cwd.parts[1:])) # Strip 'keyboards' from the front + + if 'keymaps' in current_path.parts and current_path.name != 'keymaps': + while current_path.parent.name != 'keymaps': + current_path = current_path.parent + cli.config[cli._entrypoint.__name__]['keymap'] = current_path.name + cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'keymap_directory' + + # If we're in `qmk_firmware/layouts` guess the name from the community keymap they're in + elif relative_cwd.parts[0] == 'layouts' and is_keymap_dir(relative_cwd): + cli.config[cli._entrypoint.__name__]['keymap'] = relative_cwd.name + cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'layouts_directory' + + # If we're in `qmk_firmware/users` guess the name from the userspace they're in + elif relative_cwd.parts[0] == 'users': + # Guess the keymap name based on which userspace they're in + cli.config[cli._entrypoint.__name__]['keymap'] = relative_cwd.parts[1] + cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'users_directory' + + return func(*args, **kwargs) + + return wrapper diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py index bfaa439249d..7306c433b86 100644 --- a/lib/python/qmk/path.py +++ b/lib/python/qmk/path.py @@ -65,7 +65,7 @@ def normpath(path): path = Path(path) if path.is_absolute(): - return Path(path) + return path return Path(os.environ['ORIG_CWD']) / path From 40e8d60ecd68c1c43e1fc911e993626943930fd0 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 14 Mar 2020 10:44:43 +1100 Subject: [PATCH 11/14] Fix bootloader for Maypad (#8411) --- keyboards/keyhive/maypad/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/keyhive/maypad/rules.mk b/keyboards/keyhive/maypad/rules.mk index a14772f6a2c..1e6415d444c 100644 --- a/keyboards/keyhive/maypad/rules.mk +++ b/keyboards/keyhive/maypad/rules.mk @@ -9,7 +9,7 @@ MCU = atmega32u4 # QMK DFU qmk-dfu # ATmega32A bootloadHID # ATmega328P USBasp -BOOTLOADER = atmel-dfu +BOOTLOADER = caterina # Build Options # change yes to no to disable From 0fdd37ee19d07d6f15217074dd3291fda4c4cb2f Mon Sep 17 00:00:00 2001 From: Jonas Avellana <14019120+ninjonas@users.noreply.github.com> Date: Fri, 13 Mar 2020 17:56:21 -0600 Subject: [PATCH 12/14] [Keymap] ninjonas keymap updates (#8373) * [keymap(ninjonas)] ninjonas keymap updates * [refactor] switching encoder rotation logic. recent pull seems to have flipped encoder stuff * [keymap(lily58)] added chrome change profile key on RAISE Co-authored-by: Jonas Avellana --- keyboards/crkbd/keymaps/ninjonas/config.h | 2 +- keyboards/kyria/keymaps/ninjonas/config.h | 2 +- keyboards/kyria/keymaps/ninjonas/encoder.c | 84 ---------------- keyboards/kyria/keymaps/ninjonas/keymap.c | 6 +- keyboards/kyria/keymaps/ninjonas/oled.c | 40 +++++++- keyboards/kyria/keymaps/ninjonas/rules.mk | 3 +- keyboards/lily58/keymaps/ninjonas/keymap.c | 2 +- keyboards/lily58/keymaps/ninjonas/rules.mk | 1 + keyboards/pinky/3/keymaps/ninjonas/config.h | 2 +- keyboards/pinky/3/keymaps/ninjonas/keymap.c | 6 +- users/ninjonas/README.md | 25 +++-- users/ninjonas/combos.c | 55 +++++++++++ users/ninjonas/config.h | 11 ++- users/ninjonas/encoder.c | 104 ++++++++++++++++++++ users/ninjonas/ninjonas.h | 23 +++-- users/ninjonas/process_records.c | 14 --- users/ninjonas/process_records.h | 1 - users/ninjonas/rules.mk | 5 +- users/ninjonas/tap_dances.c | 66 ++++++++----- users/ninjonas/tap_dances.h | 14 +-- 20 files changed, 293 insertions(+), 173 deletions(-) delete mode 100644 keyboards/kyria/keymaps/ninjonas/encoder.c create mode 100644 users/ninjonas/combos.c create mode 100644 users/ninjonas/encoder.c diff --git a/keyboards/crkbd/keymaps/ninjonas/config.h b/keyboards/crkbd/keymaps/ninjonas/config.h index 33fe4a5c9b9..8a4ddad7482 100644 --- a/keyboards/crkbd/keymaps/ninjonas/config.h +++ b/keyboards/crkbd/keymaps/ninjonas/config.h @@ -20,7 +20,7 @@ along with this program. If not, see . #pragma once -#define TAPPING_TERM 300 +#define TAPPING_TERM 200 #define MASTER_LEFT diff --git a/keyboards/kyria/keymaps/ninjonas/config.h b/keyboards/kyria/keymaps/ninjonas/config.h index dd919e382fd..5673e6c3d83 100644 --- a/keyboards/kyria/keymaps/ninjonas/config.h +++ b/keyboards/kyria/keymaps/ninjonas/config.h @@ -16,7 +16,7 @@ #pragma once -#define TAPPING_TERM 300 +#define TAPPING_TERM 200 #ifdef OLED_DRIVER_ENABLE #define OLED_DISPLAY_128X64 diff --git a/keyboards/kyria/keymaps/ninjonas/encoder.c b/keyboards/kyria/keymaps/ninjonas/encoder.c deleted file mode 100644 index e3a4f26616d..00000000000 --- a/keyboards/kyria/keymaps/ninjonas/encoder.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2020 ninjonas - * - * 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 . - */ -#include "ninjonas.h" - -#ifdef ENCODER_ENABLE -void encoder_update_user(uint8_t index, bool clockwise) { - if (index == 0) { - switch (get_highest_layer(layer_state)) { - case _LOWER: - if (clockwise) { - tap_code16(SGUI(KC_TAB)); - } else { - tap_code16(LGUI(KC_TAB)); - } - break; - case _RAISE: - if (clockwise) { - tap_code(KC_PGUP); - } else { - tap_code(KC_PGDN); - } - break; - case _ADJUST: - if (clockwise) { - rgblight_increase_hue(); - } else { - rgblight_decrease_hue(); - } - break; - default: - if (clockwise) { - tap_code(KC_BRIU); - } else { - tap_code(KC_BRID); - } - break; - } - } else if (index == 1) { - switch (get_highest_layer(layer_state)) { - case _LOWER: - if (clockwise) { - tap_code(KC_UP); - } else { - tap_code(KC_DOWN); - } - break; - case _RAISE: - if (clockwise) { - tap_code16(LCTL(KC_TAB)); - } else { - tap_code16(LCTL(LSFT(KC_TAB))); - } - break; - case _ADJUST: - if (clockwise) { - rgblight_increase_val(); - } else { - rgblight_decrease_val(); - } - break; - default: - if (clockwise) { - tap_code(KC_VOLU); - } else { - tap_code(KC_VOLD); - } - break; - } - } -} -#endif \ No newline at end of file diff --git a/keyboards/kyria/keymaps/ninjonas/keymap.c b/keyboards/kyria/keymaps/ninjonas/keymap.c index df492a46615..ae4b3b7ba91 100644 --- a/keyboards/kyria/keymaps/ninjonas/keymap.c +++ b/keyboards/kyria/keymaps/ninjonas/keymap.c @@ -24,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+-----——-+——------+-——-----+——------+——-----| |------—+——------+——------+——------+——------+--------| _____________________QWERTY_L2______________________, _____________________QWERTY_R2______________________, // |--------+-----——-+——------+-——-----+——------+——-----+———-----------. ,——————————————+------—+——------+——------+——------+——------+--------| - _____________________QWERTY_L3______________________,XXXXXXX,KC_LALT, T_CPNU,XXXXXXX,_____________________QWERTY_R3______________________, + _____________________QWERTY_L3______________________,XXXXXXX,KC_LALT, T_CPAP,XXXXXXX,_____________________QWERTY_R3______________________, // `--------------------------+--------+--------+-------+-------+------| |------+-------+-------+--------+--------+--------+--------+--------' _____________MOD_LEFT_____________,T_LBRC, T_RBRC,________MOD_RIGHT________,KC_MUTE // `----------------------------------------' `----------------------------------------' @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+-----——-+——------+-——-----+——------+——-----| |------—+——------+——------+——------+——------+--------| _____________________DVORAK_L2______________________, _____________________DVORAK_R2______________________, // |--------+-----——-+——------+-——-----+——------+——-----+———-----------. ,——————————————+------—+——------+——------+——------+——------+--------| - _____________________DVORAK_L3______________________,XXXXXXX,KC_LALT, T_CPNU,XXXXXXX,_____________________DVORAK_R3______________________, + _____________________DVORAK_L3______________________,XXXXXXX,KC_LALT, T_CPAP,XXXXXXX,_____________________DVORAK_R3______________________, // `--------------------------+--------+--------+-------+-------+------| |------+-------+-------+--------+--------+--------+--------+--------' _____________MOD_LEFT_____________,T_LBRC, T_RBRC,________MOD_RIGHT________,KC_MUTE // `----------------------------------------' `----------------------------------------' @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+-----——-+——------+-——-----+——------+——-----| |------—+——------+——------+——------+——------+--------| _____________________COLEMAK_L2_____________________, _____________________COLEMAK_R2_____________________, // |--------+-----——-+——------+-——-----+——------+——-----+———-----------. ,——————————————+------—+——------+——------+——------+——------+--------| - _____________________COLEMAK_L3_____________________,XXXXXXX,KC_LALT, T_CPNU,XXXXXXX,_____________________COLEMAK_R3_____________________, + _____________________COLEMAK_L3_____________________,XXXXXXX,KC_LALT, T_CPAP,XXXXXXX,_____________________COLEMAK_R3_____________________, // `--------------------------+--------+--------+-------+-------+------| |------+-------+-------+--------+--------+--------+--------+--------' _____________MOD_LEFT_____________,T_LBRC, T_RBRC,________MOD_RIGHT________,KC_MUTE // `----------------------------------------' `----------------------------------------' diff --git a/keyboards/kyria/keymaps/ninjonas/oled.c b/keyboards/kyria/keymaps/ninjonas/oled.c index 419c1b72778..65976205b71 100644 --- a/keyboards/kyria/keymaps/ninjonas/oled.c +++ b/keyboards/kyria/keymaps/ninjonas/oled.c @@ -105,8 +105,12 @@ void oled_white_space(void){ oled_write_P(PSTR(" "), false); } +void oled_slash_separator(void){ + oled_write_P(PSTR(" / "), false); +} + void render_layout_state(void) { - oled_write_P(PSTR("\nLayout: "), false); + oled_write_P(PSTR("Layout: "), false); switch (biton32(default_layer_state)) { case _COLEMAK: oled_write_P(PSTR("Colemak"), false); @@ -121,6 +125,37 @@ void render_layout_state(void) { oled_write_ln_P(PSTR("Undefined"), false); } } +#ifdef ENCODER_ENABLE +static void render_encoder_state(void) { + oled_write_P(PSTR("\nEnc: "), false); + bool lower = layer_state_is(_LOWER) & !layer_state_is(_ADJUST); + bool raise = layer_state_is(_RAISE) & !layer_state_is(_ADJUST); + bool adjust = layer_state_is(_ADJUST); + + if(lower){ + oled_write_P(PSTR("APPSW"), left_encoder_rotated); + oled_slash_separator(); + oled_write_P(PSTR("UPDN"), right_encoder_rotated); + } else if(raise){ + oled_write_P(PSTR("PGUD"), left_encoder_rotated); + oled_slash_separator(); + oled_write_P(PSTR("TABSW"), right_encoder_rotated); + } else if(adjust){ + oled_write_P(PSTR("RHUE"), left_encoder_rotated); + oled_slash_separator(); + oled_write_P(PSTR("RBRI"), right_encoder_rotated); + } else { + oled_write_P(PSTR("BRI"), left_encoder_rotated); + oled_slash_separator(); + oled_write_P(PSTR("VOL"), right_encoder_rotated); + } + + if (timer_elapsed(encoder_rotated_timer) > 200) { + left_encoder_rotated = false; + right_encoder_rotated = false; + } +} +#endif static void render_layer_state(void) { oled_write_P(PSTR("\nLayer:"), false); @@ -156,6 +191,9 @@ void render_mod_state(uint8_t modifiers) { static void render_status(void) { render_qmk_logo(); render_layout_state(); + #ifdef ENCODER_ENABLE + render_encoder_state(); + #endif render_layer_state(); render_mod_state(get_mods()|get_oneshot_mods()); } diff --git a/keyboards/kyria/keymaps/ninjonas/rules.mk b/keyboards/kyria/keymaps/ninjonas/rules.mk index 3b2894a175e..e7e4726bace 100644 --- a/keyboards/kyria/keymaps/ninjonas/rules.mk +++ b/keyboards/kyria/keymaps/ninjonas/rules.mk @@ -3,5 +3,4 @@ ENCODER_ENABLE = yes # Enables the use of one or more encoders RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow LINK_TIME_OPTIMIZATION_ENABLE = yes -SRC += encoder.c \ - oled.c \ No newline at end of file +SRC += oled.c \ No newline at end of file diff --git a/keyboards/lily58/keymaps/ninjonas/keymap.c b/keyboards/lily58/keymaps/ninjonas/keymap.c index 2976f9eaf33..6d2f1c32138 100644 --- a/keyboards/lily58/keymaps/ninjonas/keymap.c +++ b/keyboards/lily58/keymaps/ninjonas/keymap.c @@ -125,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, XXXXXXX, _____________MOUSE_1______________, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _____________MOUSE_2______________, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - __________________________________, __________________________________ + __________________________________, _______, _______, _______, K_CPRF ), /* ADJUST diff --git a/keyboards/lily58/keymaps/ninjonas/rules.mk b/keyboards/lily58/keymaps/ninjonas/rules.mk index c582662134c..dc3fe55bca2 100644 --- a/keyboards/lily58/keymaps/ninjonas/rules.mk +++ b/keyboards/lily58/keymaps/ninjonas/rules.mk @@ -1 +1,2 @@ OLED_DRIVER_ENABLE = yes +LINK_TIME_OPTIMIZATION_ENABLE = yes \ No newline at end of file diff --git a/keyboards/pinky/3/keymaps/ninjonas/config.h b/keyboards/pinky/3/keymaps/ninjonas/config.h index ff8cd8bb098..585bd8cb5d5 100644 --- a/keyboards/pinky/3/keymaps/ninjonas/config.h +++ b/keyboards/pinky/3/keymaps/ninjonas/config.h @@ -27,5 +27,5 @@ #define USE_SERIAL_PD2 #define TAPPING_FORCE_HOLD -#define TAPPING_TERM 300 +#define TAPPING_TERM 200 #define RETRO_TAPPPING \ No newline at end of file diff --git a/keyboards/pinky/3/keymaps/ninjonas/keymap.c b/keyboards/pinky/3/keymaps/ninjonas/keymap.c index 2b93c5aa8ed..8aac3541fe6 100644 --- a/keyboards/pinky/3/keymaps/ninjonas/keymap.c +++ b/keyboards/pinky/3/keymaps/ninjonas/keymap.c @@ -31,7 +31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| _____________________QWERTY_L3______________________, LT_RAI, LT_LOW, _____________________QWERTY_R3______________________, //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| - ________MOD_LEFT_________, K_LAPP, K_RAPP, ________MOD_RIGHT________ + ________MOD_LEFT_________, XXXXXXX, XXXXXXX, ________MOD_RIGHT________ //`---------------------------------------' `---------------------------------------' ), @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| _____________________DVORAK_L3______________________, LT_RAI, LT_LOW, _____________________DVORAK_R3______________________, //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| - ________MOD_LEFT_________, K_LAPP, K_RAPP, ________MOD_RIGHT________ + ________MOD_LEFT_________, XXXXXXX, XXXXXXX, ________MOD_RIGHT________ //`---------------------------------------' `---------------------------------------' ), @@ -55,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| _____________________COLEMAK_L3_____________________, LT_RAI, LT_LOW, _____________________COLEMAK_R3_____________________, //|---------+---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+---------| - ________MOD_LEFT_________, K_LAPP, K_RAPP, ________MOD_RIGHT________ + ________MOD_LEFT_________, XXXXXXX, XXXXXXX, ________MOD_RIGHT________ //`---------------------------------------' `---------------------------------------' ), diff --git a/users/ninjonas/README.md b/users/ninjonas/README.md index f537373bcf6..f6c2f323522 100644 --- a/users/ninjonas/README.md +++ b/users/ninjonas/README.md @@ -23,8 +23,6 @@ See: https://docs.qmk.fm/#/feature_userspace |K_LOCK | MacOS shortcut to execute lock command Cmd + CTRL + Q | |K_CSCN | MacOS shortcut to copy a portion of the screen to the clipboard | |K_MDSH | MacOS shortcut to get em-dash `–` | -|K_RAPP | MacOS shortcut to switch apps to the right | -|K_LAPP | MacOS shortcut to switch apps to the left | |K_CPRF | Cmd + Shift + M. Used for switching Google Chrome profiles | ### [Layers](ninjonas.h) @@ -32,17 +30,12 @@ See: https://docs.qmk.fm/#/feature_userspace |---|---| |LT_LOW | Tap for ENTER, hold for RAISE | |LT_RAI | Tap for SPACE, hold for LOWER | -|LT_LOW + LT_RAI | Hold for ADJUST | -|LM_LOW | Dedicated key to momentarily toggle to use LOWER layer | -|LM_RAI | Dedicated key to momentarily toggle to use RAISE layer | -|LG_LOW | Press to toggle LOWER layer | -|LG_RAI | Press to toggle RAISE layer | ### [Mod-Taps](ninjonas.h) |Code | Description | |---|---| -|MT_DEL | Tap for Delete, hold for Cmd + ALT + SHIFT | -|MT_EQL | Tap for =, hold for ALT + SHIFT | +|MT_DEL | Tap for Delete, hold for ALT + SHIFT | +|MT_EQL | Tap for =, SHIFT | ### [Layout Blocks](ninjonas.h) Predefined keyboard layout templates to speed up configuring split keyboards @@ -72,7 +65,6 @@ Predefined keyboard layout templates to speed up configuring split keyboards |M_SHFT | Sends Cmd + alt + shift to a keycode to activate [ShiftIt](https://github.com/fikovnik/ShiftIt) | |M_CODE | Opens [Visual Studio Code](https://code.visualstudio.com/) on current directory | |M_TERM | Launches Spotlight and calls Terminal | -|M_COPA | Single key copy/paste | |M_XXX1 to M_XXX5 | Reserved for secret macros see [Secrets](#secrets) | ### [Tap-Dance](tap_dances.h) @@ -84,11 +76,18 @@ Predefined keyboard layout templates to speed up configuring split keyboards |T_TAB | Tap once for TAB, double for CTRL + TAB | |T_GRV | Tap once for GRV, double for Cmd + GRV | |T_GUI | Tap once for Cmd, double to open spotlight | -|T_W | Tap for W, double tap for Cmd + W | -|T_Q | Tap for Q, double tap for Cmd + Q | -|T_CPNU | Tap for Cmd + V, hold for Cmd + C, double tap for NUMPAD layer | +|T_CPAP | Tap for Cmd + V, hold for Cmd + C, double tap to open [Line](https://line.me/en/) app, triple tap for itunes. | |T_Y | Tap for Y, double tap for NUMPAD layer | +### [Combos](combos.h) +|Code | Description | +|---|---| +|EQ_QUIT | Press E + Q will trigger Cmd + Q | +|RW_CLOSE | Press R + W will trigger Cmd + W| +|ET_TAB | Press E + T will trigger Cmd + T| +|ZC_COPY | Press Z + C will trigger Cmd + C| +|XV_PASTE | Press X + V will trigger Cmd + V| + ### Secrets There's times where you have macros you don't want to share like emails, an address you need but you always forget, passwords 😱, & and private strings. Based off [drashna's secret macros](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/readme_secrets.md), it's now possible to do this. All you need to do is create a `secrets.c` file. Below is an example of how this is used. diff --git a/users/ninjonas/combos.c b/users/ninjonas/combos.c new file mode 100644 index 00000000000..9453ba84dc2 --- /dev/null +++ b/users/ninjonas/combos.c @@ -0,0 +1,55 @@ +#include "ninjonas.h" + +#ifdef COMBO_ENABLE +enum combo_events { + EQ_QUIT, + RW_CLOSE, + QT_TAB, + ZC_COPY, + XV_PASTE +}; + +const uint16_t PROGMEM quit_combo[] = {KC_E, KC_Q, COMBO_END}; +const uint16_t PROGMEM close_combo[] = {KC_R, KC_W, COMBO_END}; +const uint16_t PROGMEM tab_combo[] = {KC_Q, KC_T, COMBO_END}; +const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; +const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [EQ_QUIT] = COMBO_ACTION(quit_combo), + [RW_CLOSE] = COMBO_ACTION(close_combo), + [QT_TAB] = COMBO_ACTION(tab_combo), + [ZC_COPY] = COMBO_ACTION(copy_combo), + [XV_PASTE] = COMBO_ACTION(paste_combo), +}; + +void process_combo_event(uint8_t combo_index, bool pressed) { + switch(combo_index) { + case EQ_QUIT: + if (pressed) { + tap_code16(LGUI(KC_Q)); + } + break; + case RW_CLOSE: + if (pressed) { + tap_code16(LGUI(KC_W)); + } + break; + case QT_TAB: + if (pressed) { + tap_code16(LGUI(KC_T)); + } + break; + case ZC_COPY: + if (pressed) { + tap_code16(LGUI(KC_C)); + } + break; + case XV_PASTE: + if (pressed) { + tap_code16(LGUI(KC_V)); + } + break; + } +} +#endif \ No newline at end of file diff --git a/users/ninjonas/config.h b/users/ninjonas/config.h index ae2370c5a16..025dbb541a1 100644 --- a/users/ninjonas/config.h +++ b/users/ninjonas/config.h @@ -1,6 +1,6 @@ #ifdef TAPPING_TERM #undef TAPPING_TERM - #define TAPPING_TERM 300 + #define TAPPING_TERM 200 #endif // Mouse Settings: Smoothing out mouse movement on keypress @@ -11,4 +11,11 @@ #define MOUSEKEY_DELAY 0 #define MOUSEKEY_TIME_TO_MAX 60 #define MOUSEKEY_MAX_SPEED 7 -#define MOUSEKEY_WHEEL_DELAY 0 \ No newline at end of file +#define MOUSEKEY_WHEEL_DELAY 0 + +#ifdef COMBO_ENABLE + #undef COMBO_COUNT + #undef COMBO_TERM + #define COMBO_COUNT 5 + #define COMBO_TERM 60 +#endif \ No newline at end of file diff --git a/users/ninjonas/encoder.c b/users/ninjonas/encoder.c new file mode 100644 index 00000000000..3d56ff89eed --- /dev/null +++ b/users/ninjonas/encoder.c @@ -0,0 +1,104 @@ +/* Copyright 2020 ninjonas + * + * 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 . + */ +#include "ninjonas.h" + +#ifdef ENCODER_ENABLE +void left_encoder_cw(void) { + switch (get_highest_layer(layer_state)) { + case _LOWER: + tap_code16(LGUI(KC_TAB)); + break; + case _RAISE: + tap_code(KC_PGDN); + break; + case _ADJUST: + rgblight_decrease_hue(); + break; + default: + tap_code(KC_BRID); + break; + } +} +void left_encoder_acw(void) { + switch (get_highest_layer(layer_state)) { + case _LOWER: + tap_code16(SGUI(KC_TAB)); + break; + case _RAISE: + tap_code(KC_PGUP); + break; + case _ADJUST: + rgblight_increase_hue(); + break; + default: + tap_code(KC_BRIU); + break; + } +} +void right_encoder_cw(void) { + switch (get_highest_layer(layer_state)) { + case _LOWER: + tap_code(KC_DOWN); + break; + case _RAISE: + tap_code16(LCTL(LSFT(KC_TAB))); + break; + case _ADJUST: + rgblight_decrease_val(); + break; + default: + tap_code(KC_VOLD); + break; + } +} +void right_encoder_acw(void) { + switch (get_highest_layer(layer_state)) { + case _LOWER: + tap_code(KC_UP); + break; + case _RAISE: + tap_code16(LCTL(KC_TAB)); + break; + case _ADJUST: + rgblight_increase_val(); + break; + default: + tap_code(KC_VOLU); + break; + } +} + +void encoder_update_user(uint8_t index, bool clockwise) { + encoder_rotated_timer = timer_read(); + if (index == 0) { + left_encoder_rotated = true; + if (clockwise) { + left_encoder_cw(); + } else { + left_encoder_acw(); + } + } + else if (index == 1) { + right_encoder_rotated = true; + if (clockwise) { + right_encoder_cw(); + } else { + right_encoder_acw(); + } + } +} + +#endif \ No newline at end of file diff --git a/users/ninjonas/ninjonas.h b/users/ninjonas/ninjonas.h index 6772957e270..94b4712a633 100644 --- a/users/ninjonas/ninjonas.h +++ b/users/ninjonas/ninjonas.h @@ -27,6 +27,12 @@ #include "split_util.h" #endif +#ifdef ENCODER_ENABLE +bool left_encoder_rotated; +bool right_encoder_rotated; +uint16_t encoder_rotated_timer; +#endif + #define _QWERTY 0 #define _DVORAK 1 #define _COLEMAK 2 @@ -40,24 +46,17 @@ #define K_CSCN LGUI(LCTL(LSFT(KC_4))) // Copy a portion of the screen to the clipboard #define K_CPRF LGUI(LSFT(KC_M)) // Cmd + Shift + M. Used for switching Google Chrome profiles #define K_MDSH LSFT(LALT(KC_MINS)) -#define K_LAPP SGUI(KC_TAB) // Cmd + Shift + Tab -#define K_RAPP LGUI(KC_TAB) // Cmd + Tab // Layer Keys -#define LM_LOW MO(_LOWER) -#define LM_RAI MO(_RAISE) -#define LG_LOW TG(_LOWER) -#define LG_RAI TG(_RAISE) -#define LG_NUM TG(_NUMPAD) #define LT_LOW LT(_LOWER, KC_ENT) #define LT_RAI LT(_RAISE, KC_SPC) // Mod-Tap Keys -#define MT_DEL MT(MOD_LGUI | MOD_LALT | MOD_LSFT, KC_DEL) -#define MT_EQL MT(MOD_LALT | MOD_LSFT, KC_EQL) +#define MT_DEL MT(MOD_LALT | MOD_LSFT, KC_DEL) +#define MT_EQL MT(MOD_RSFT, KC_EQL) // Layout blocks -#define _____________________QWERTY_L1______________________ T_TAB, T_Q, KC_W, KC_E, KC_R, KC_T +#define _____________________QWERTY_L1______________________ T_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T #define _____________________QWERTY_L2______________________ T_ESC, KC_A, KC_S, KC_D, KC_F, KC_G #define _____________________QWERTY_L3______________________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B @@ -130,7 +129,7 @@ #define __________________________________ _______, _______, _______, _______ #define _____________MOD_LEFT_____________ KC_LALT, T_GUI, KC_LCTL, LT_RAI -#define _____________MOD_RIGHT____________ LT_LOW, KC_BSPC, MT_DEL, T_CPNU +#define _____________MOD_RIGHT____________ LT_LOW, KC_BSPC, MT_DEL, T_CPAP #define _________MEDIA_1_________ KC_BRIU, KC_MPLY, KC_MUTE #define _________MEDIA_2_________ KC_BRID, KC_MFFD, KC__VOLUP @@ -141,7 +140,7 @@ #define ________MOD_RIGHT________ LT_LOW, KC_BSPC, MT_DEL #else #define ________MOD_LEFT_________ KC_LALT, T_GUI, KC_LCTL - #define ________MOD_RIGHT________ KC_BSPC, MT_DEL, T_CPNU + #define ________MOD_RIGHT________ KC_BSPC, MT_DEL, T_CPAP #endif // Layout wrappers diff --git a/users/ninjonas/process_records.c b/users/ninjonas/process_records.c index b4a5e35d137..a3b8417913a 100644 --- a/users/ninjonas/process_records.c +++ b/users/ninjonas/process_records.c @@ -1,7 +1,5 @@ #include "ninjonas.h" -uint16_t copy_paste_timer; - __attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } @@ -92,18 +90,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } break; - // Single key copy/paste - case M_COPA: - if (record->event.pressed) { - copy_paste_timer = timer_read(); - } else { - if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { - tap_code16(LGUI(KC_C)); // Hold Cmd + C - } else { - tap_code16(LGUI(KC_V)); // Tap Cmd + V - } - } - // BEGIN: Layer macros case QWERTY: if (record->event.pressed) { diff --git a/users/ninjonas/process_records.h b/users/ninjonas/process_records.h index 34886531a57..2e69ca21632 100644 --- a/users/ninjonas/process_records.h +++ b/users/ninjonas/process_records.h @@ -15,7 +15,6 @@ enum custom_keycodes { M_VRSN, M_CODE, M_TERM, - M_COPA, // Secret Macros M_XXX1, M_XXX2, diff --git a/users/ninjonas/rules.mk b/users/ninjonas/rules.mk index 7b77e153d31..a5cd0fdd9c3 100644 --- a/users/ninjonas/rules.mk +++ b/users/ninjonas/rules.mk @@ -2,11 +2,14 @@ BOOTMAGIC_ENABLE = no # Disable Boot Magic (https://beta.docs.qmk.fm/featu MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) TAP_DANCE_ENABLE = yes # Enable Tap Dance. +COMBO_ENABLE = yes # Enable Combos SRC += ninjonas.c \ process_records.c \ tap_dances.c \ - oled.c + oled.c \ + encoder.c \ + combos.c ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") SRC += secrets.c diff --git a/users/ninjonas/tap_dances.c b/users/ninjonas/tap_dances.c index ece95887a7f..63e4d3ba472 100644 --- a/users/ninjonas/tap_dances.c +++ b/users/ninjonas/tap_dances.c @@ -2,28 +2,41 @@ //// BEGIN: Advanced Tap Dances int cur_dance (qk_tap_dance_state_t *state) { - if (state->count == 1) { - if (!state->pressed) { - return SINGLE_TAP; - } else { - return SINGLE_HOLD; - } - } else if (state->count == 2) { - return DOUBLE_TAP; + if (state->count == 1) { + if (state->interrupted || !state->pressed) return SINGLE_TAP; + //key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'. + else return SINGLE_HOLD; } - else return 8; + else if (state->count == 2) { + /* + * DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap + * action when hitting 'pp'. Suggested use case for this return value is when you want to send two + * keystrokes of the key, and not the 'double tap' action/macro. + */ + if (state->interrupted) return DOUBLE_SINGLE_TAP; + else if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + //Assumes no one is trying to type the same letter three times (at least not quickly). + //If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add + //an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP' + if (state->count == 3) { + if (state->interrupted || !state->pressed) return TRIPLE_TAP; + else return TRIPLE_HOLD; + } + else return 8; //magic number. At some point this method will expand to work for more presses } -// BEGIN: Copy, Paste, NUMPAD +// BEGIN: Copy, Paste, Apps // https://beta.docs.qmk.fm/features/feature_tap_dance#example-6-using-tap-dance-for-momentary-layer-switch-and-layer-toggle-keys -static tap copy_paste_numpad_tap_state = { +static tap copy_paste_app_tap_state = { .is_press_action = true, .state = 0 }; -void copy_paste_numpad_finished (qk_tap_dance_state_t *state, void *user_data) { - copy_paste_numpad_tap_state.state = cur_dance(state); - switch (copy_paste_numpad_tap_state.state) { +void copy_paste_app_finished (qk_tap_dance_state_t *state, void *user_data) { + copy_paste_app_tap_state.state = cur_dance(state); + switch (copy_paste_app_tap_state.state) { case SINGLE_TAP: tap_code16(LGUI(KC_V)); // Tap Cmd + V break; @@ -31,19 +44,22 @@ void copy_paste_numpad_finished (qk_tap_dance_state_t *state, void *user_data) { tap_code16(LGUI(KC_C)); // Hold Cmd + C break; case DOUBLE_TAP: - if (layer_state_is(_NUMPAD)) { - layer_off(_NUMPAD); - } else { - layer_on(_NUMPAD); - } + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI)); + wait_ms(250); + SEND_STRING("line\n"); + break; + case TRIPLE_TAP: + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI)); + wait_ms(250); + SEND_STRING("itunes\n"); break; } } -void copy_paste_numpad_reset (qk_tap_dance_state_t *state, void *user_data) { - copy_paste_numpad_tap_state.state = 0; +void copy_paste_app_reset (qk_tap_dance_state_t *state, void *user_data) { + copy_paste_app_tap_state.state = 0; } -// END: Copy, Paste, NUMPAD +// END: Copy, Paste, Apps // BEGIN: Y, NUMPAD static tap y_numpad_tap_state = { @@ -89,10 +105,8 @@ qk_tap_dance_action_t tap_dance_actions[] = { [TD_TAB_CTRLTAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LCTL(KC_TAB)), [TD_GRV_CTRLGRV] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, LGUI(KC_GRV)), [TD_GUI_GUISPC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, LGUI(KC_SPC)), - [TD_W_CTRLW] = ACTION_TAP_DANCE_DOUBLE(KC_W, LGUI(KC_W)), - [TD_Q_GUIQ] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LGUI(KC_Q)), // Advanced Tap Dances - [TD_COPY_PASTE_NUMPAD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, copy_paste_numpad_finished, copy_paste_numpad_reset), - [TD_Y_NUMPAD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, y_numpad_finished, y_numpad_reset), + [TD_COPY_PASTE_APP] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, copy_paste_app_finished, copy_paste_app_reset, 300), + [TD_Y_NUMPAD] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, y_numpad_finished, y_numpad_reset, 300), }; \ No newline at end of file diff --git a/users/ninjonas/tap_dances.h b/users/ninjonas/tap_dances.h index f2f39108dc8..11f77e7171d 100644 --- a/users/ninjonas/tap_dances.h +++ b/users/ninjonas/tap_dances.h @@ -9,7 +9,11 @@ typedef struct { enum tapdance_types{ SINGLE_TAP = 1, SINGLE_HOLD = 2, - DOUBLE_TAP = 3 + DOUBLE_TAP = 3, + DOUBLE_HOLD = 4, + DOUBLE_SINGLE_TAP = 5, //send two single taps + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7 }; enum custom_tapdances{ @@ -19,9 +23,7 @@ enum custom_tapdances{ TD_TAB_CTRLTAB, TD_GRV_CTRLGRV, TD_GUI_GUISPC, - TD_W_CTRLW, - TD_Q_GUIQ, - TD_COPY_PASTE_NUMPAD, + TD_COPY_PASTE_APP, TD_Y_NUMPAD, }; @@ -31,7 +33,5 @@ enum custom_tapdances{ #define T_TAB TD(TD_TAB_CTRLTAB) // Tap for TAB, double tap for CTRL + TAB #define T_GRV TD(TD_GRV_CTRLGRV) // Tap for GRV, double tap for Cmd + GRV #define T_GUI TD(TD_GUI_GUISPC) // Tap for Cmd, double tap for Cmd + Space -#define T_W TD(TD_W_CTRLW) // Tap for W, double tap for Cmd + W -#define T_Q TD(TD_Q_GUIQ) // Tap for Q, double tap for Cmd + Q -#define T_CPNU TD(TD_COPY_PASTE_NUMPAD) // Tap for paste, hold for copy, double tap for NUMPAD +#define T_CPAP TD(TD_COPY_PASTE_APP) // Tap for paste, hold for copy, double tap for Line App #define T_Y TD(TD_Y_NUMPAD) // Tap for Y, double tap for NUMPAD \ No newline at end of file From e6a9f700de40213b3f758dff398d87142c43c389 Mon Sep 17 00:00:00 2001 From: Andy Jack Date: Fri, 13 Mar 2020 20:06:54 -0400 Subject: [PATCH 13/14] Update link for Learn Plover google site (#8410) --- docs/feature_stenography.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_stenography.md b/docs/feature_stenography.md index 0b2c82422b6..4d7374a03a9 100644 --- a/docs/feature_stenography.md +++ b/docs/feature_stenography.md @@ -51,7 +51,7 @@ On the display tab click 'Open stroke display'. With Plover disabled you should ## Learning Stenography -* [Learn Plover!](https://sites.google.com/site/ploverdoc/) +* [Learn Plover!](https://sites.google.com/site/learnplover/) * [QWERTY Steno](http://qwertysteno.com/Home/) * [Steno Jig](https://joshuagrams.github.io/steno-jig/) * More resources at the Plover [Learning Stenography](https://github.com/openstenoproject/plover/wiki/Learning-Stenography) wiki From dc79792ab463f614e3aba979dace7d9625b340bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Oliveira?= Date: Sat, 14 Mar 2020 00:21:00 +0000 Subject: [PATCH 14/14] Add Portuguese keymap and sendstring lookup tables (#8390) * Add Portuguese keymap and sendstring lookup tables * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan * Update quantum/keymap_extras/keymap_portuguese.h Co-Authored-By: Ryan Co-authored-by: Ryan --- quantum/keymap_extras/keymap_portuguese.h | 151 ++++++++++++++++++ quantum/keymap_extras/sendstring_portuguese.h | 100 ++++++++++++ 2 files changed, 251 insertions(+) create mode 100644 quantum/keymap_extras/keymap_portuguese.h create mode 100644 quantum/keymap_extras/sendstring_portuguese.h diff --git a/quantum/keymap_extras/keymap_portuguese.h b/quantum/keymap_extras/keymap_portuguese.h new file mode 100644 index 00000000000..19d7dcd8170 --- /dev/null +++ b/quantum/keymap_extras/keymap_portuguese.h @@ -0,0 +1,151 @@ +/* Copyright 2020 + * + * 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 . + */ + +#pragma once + +#include "keymap.h" + +// clang-format off + +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ \ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ « │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ + │ ´ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ + * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ç │ º │ ~ │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define PT_BSLS KC_GRV // (backslash) +#define PT_1 KC_1 // 1 +#define PT_2 KC_2 // 2 +#define PT_3 KC_3 // 3 +#define PT_4 KC_4 // 4 +#define PT_5 KC_5 // 5 +#define PT_6 KC_6 // 6 +#define PT_7 KC_7 // 7 +#define PT_8 KC_8 // 8 +#define PT_9 KC_9 // 9 +#define PT_0 KC_0 // 0 +#define PT_QUOT KC_MINS // ' +#define PT_LDAQ KC_EQL // « +// Row 2 +#define PT_Q KC_Q // Q +#define PT_W KC_W // W +#define PT_E KC_E // E +#define PT_R KC_R // R +#define PT_T KC_T // T +#define PT_Y KC_Y // Y +#define PT_U KC_U // U +#define PT_I KC_I // I +#define PT_O KC_O // O +#define PT_P KC_P // P +#define PT_PLUS KC_LBRC // + +#define PT_ACUT KC_RBRC // ´ (dead) +// Row 3 +#define PT_A KC_A // A +#define PT_S KC_S // S +#define PT_D KC_D // D +#define PT_F KC_F // F +#define PT_G KC_G // G +#define PT_H KC_H // H +#define PT_J KC_J // J +#define PT_K KC_K // K +#define PT_L KC_L // L +#define PT_CCED KC_SCLN // Ç +#define PT_MORD KC_QUOT // º +#define PT_TILD KC_NUHS // ~ (dead) +// Row 4 +#define PT_LABK KC_NUBS // < +#define PT_Z KC_Z // Z +#define PT_X KC_X // X +#define PT_C KC_C // C +#define PT_V KC_V // V +#define PT_B KC_B // B +#define PT_N KC_N // N +#define PT_M KC_M // M +#define PT_COMM KC_COMM // , +#define PT_DOT KC_DOT // . +#define PT_MINS KC_SLSH // - + +/* Shifted symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ | │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ » │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ │ │ │ │ │ │ │ │ │ │ * │ ` │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ + * │ │ │ │ │ │ │ │ │ │ │ │ ª │ ^ │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define PT_PIPE S(PT_BSLS) // | +#define PT_EXLM S(PT_1) // ! +#define PT_DQUO S(PT_2) // " +#define PT_HASH S(PT_3) // # +#define PT_DLR S(PT_4) // $ +#define PT_PERC S(PT_5) // % +#define PT_AMPR S(PT_6) // & +#define PT_SLSH S(PT_7) // / +#define PT_LPRN S(PT_8) // ( +#define PT_RPRN S(PT_9) // ) +#define PT_EQL S(PT_0) // = +#define PT_QUES S(PT_QUOT) // ? +#define PT_RDAQ S(PT_LDAQ) // » +// Row 2 +#define PT_ASTR S(PT_PLUS) // * +#define PT_GRV S(PT_ACUT) // ` (dead) +// Row 3 +#define PT_FORD S(PT_MORD) // ª +#define PT_CIRC S(PT_TILD) // ^ (dead) +// Row 4 +#define PT_RABK S(PT_LABK) // > +#define PT_SCLN S(PT_COMM) // ; +#define PT_COLN S(PT_DOT) // : +#define PT_UNDS S(PT_MINS) // _ + +/* AltGr symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ │ │ @ │ £ │ § │ │ │ { │ [ │ ] │ } │ │ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ │ │ € │ │ │ │ │ │ │ │ ¨ │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// Row 1 +#define PT_AT ALGR(PT_2) // @ +#define PT_PND ALGR(PT_3) // £ +#define PT_SECT ALGR(PT_4) // § +#define PT_LCBR ALGR(PT_7) // { +#define PT_LBRC ALGR(PT_8) // [ +#define PT_RBRC ALGR(PT_9) // ] +#define PT_RCBR ALGR(PT_0) // } +// Row 2 +#define PT_DIAE ALGR(PT_PLUS) // ¨ (dead) +#define PT_EURO ALGR(PT_E) // € diff --git a/quantum/keymap_extras/sendstring_portuguese.h b/quantum/keymap_extras/sendstring_portuguese.h new file mode 100644 index 00000000000..9b5d49313d0 --- /dev/null +++ b/quantum/keymap_extras/sendstring_portuguese.h @@ -0,0 +1,100 @@ +/* Copyright 2020 + * + * 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 . + */ + +// Sendstring lookup tables for Portuguese layouts + +#pragma once + +#include "keymap_portuguese.h" +#include "quantum.h" + +// clang-format off + +const uint8_t ascii_to_shift_lut[16] PROGMEM = { + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + + KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0), + KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1), + KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), + KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1), + KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0), +}; + +const uint8_t ascii_to_altgr_lut[16] PROGMEM = { + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), + KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0), +}; + +const uint8_t ascii_to_keycode_lut[128] PROGMEM = { + // NUL SOH STX ETX EOT ENQ ACK BEL + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // BS TAB LF VT FF CR SO SI + KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // DLE DC1 DC2 DC3 DC4 NAK SYN ETB + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + // CAN EM SUB ESC FS GS RS US + XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + // ! " # $ % & ' + KC_SPC, PT_1, PT_2, PT_3, PT_4, PT_5, PT_6, PT_QUOT, + // ( ) * + , - . / + PT_8, PT_9, PT_PLUS, PT_PLUS, PT_COMM, PT_MINS, PT_DOT, PT_7, + // 0 1 2 3 4 5 6 7 + PT_0, PT_1, PT_2, PT_3, PT_4, PT_5, PT_6, PT_7, + // 8 9 : ; < = > ? + PT_8, PT_9, PT_DOT, PT_COMM, PT_LABK, PT_0, PT_LABK, PT_QUOT, + // @ A B C D E F G + PT_2, PT_A, PT_B, PT_C, PT_D, PT_E, PT_F, PT_G, + // H I J K L M N O + PT_H, PT_I, PT_J, PT_K, PT_L, PT_M, PT_N, PT_O, + // P Q R S T U V W + PT_P, PT_Q, PT_R, PT_S, PT_T, PT_U, PT_V, PT_W, + // X Y Z [ \ ] ^ _ + PT_X, PT_Y, PT_Z, PT_8, PT_BSLS, PT_9, PT_TILD, PT_MINS, + // ` a b c d e f g + PT_ACUT, PT_A, PT_B, PT_C, PT_D, PT_E, PT_F, PT_G, + // h i j k l m n o + PT_H, PT_I, PT_J, PT_K, PT_L, PT_M, PT_N, PT_O, + // p q r s t u v w + PT_P, PT_Q, PT_R, PT_S, PT_T, PT_U, PT_V, PT_W, + // x y z { | } ~ DEL + PT_X, PT_Y, PT_Z, PT_7, PT_BSLS, PT_0, PT_TILD, KC_DEL +};