aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Bernhardt <jeremythegeek@gmail.com>2019-04-14 12:01:52 -0600
committerDrashna Jaelre <drashna@live.com>2019-04-14 11:01:52 -0700
commit61a7aebd1630b35e177dcd4e49694756593428a1 (patch)
tree17b5d0c901d52d06fc1a882019dde8ddf8194af5
parenta6857d18e14322fb75bb168ab13fbea0ff631324 (diff)
downloadqmk_firmware-61a7aebd1630b35e177dcd4e49694756593428a1.tar.gz
qmk_firmware-61a7aebd1630b35e177dcd4e49694756593428a1.zip
[Keyboard] Georgi FW updates (#5609)
* Working on chording * Working on chording * Got layouts in order * Initial Georgi support * forgot to add keymaps * Updated readme * Update keyboards/georgi/keymaps/template/readme.md Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/georgi.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/rules.mk Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/default/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/keymaps/template/keymap.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/matrix.c Co-Authored-By: germ <jeremythegeek@gmail.com> * Disabled features, updated info * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Update keyboards/georgi/config.h Co-Authored-By: germ <jeremythegeek@gmail.com> * Fixed info.json * Split the number button and fixed gaming mode. * started work on history feature * Working history/multikeyfuckery * type * inital code reduction refactor * Got multikey patched up, optimizing for size * Forgot to remove stuff * fixed key repeat * Key repeat added. * Symshift locking * Midchord Sym shenanigans. * Added only QWERTY mode * Split out header * Added stickybits, minimal layour * Fixing user layout * Whitespace fixing * Fixing Version name
-rw-r--r--keyboards/georgi/config.h6
-rw-r--r--keyboards/georgi/keymaps/default/keymap.c391
-rw-r--r--keyboards/georgi/keymaps/default/rules.mk32
-rw-r--r--keyboards/georgi/keymaps/minimal/keymap.c223
-rw-r--r--keyboards/georgi/keymaps/minimal/readme.md11
-rw-r--r--keyboards/georgi/keymaps/minimal/rules.mk41
-rw-r--r--keyboards/georgi/keymaps/norman/keymap.c267
-rw-r--r--keyboards/georgi/keymaps/norman/readme.md11
-rw-r--r--keyboards/georgi/keymaps/norman/rules.mk (renamed from keyboards/georgi/keymaps/template/rules.mk)26
-rw-r--r--keyboards/georgi/keymaps/template/keymap.c216
-rw-r--r--keyboards/georgi/keymaps/template/readme.md6
-rw-r--r--keyboards/georgi/readme.md5
-rw-r--r--keyboards/georgi/rules.mk5
-rw-r--r--keyboards/georgi/sten.c406
-rw-r--r--keyboards/georgi/sten.h277
-rw-r--r--keyboards/gergo/keymaps/default/rules.mk2
-rw-r--r--keyboards/gergo/keymaps/germ/keymap.c151
-rw-r--r--keyboards/gergo/keymaps/germ/readme.md10
-rw-r--r--keyboards/gergo/keymaps/germ/rules.mk36
19 files changed, 1437 insertions, 685 deletions
diff --git a/keyboards/georgi/config.h b/keyboards/georgi/config.h
index b35762fbc..30f07667e 100644
--- a/keyboards/georgi/config.h
+++ b/keyboards/georgi/config.h
@@ -23,15 +23,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
23 23
24/* Defaults */ 24/* Defaults */
25 25
26#define VERSION "Alpha 01: Ted " 26#define VERSION "v1.0: Stenoknight"
27#define VERBOSE 27#define VERBOSE
28 28
29#define FORCE_NKRO 29#define FORCE_NKRO
30#define NO_ACTION_MACRO
31#define NO_ACTION_FUNCTION 30#define NO_ACTION_FUNCTION
32#define NO_DEBUG
33#define NO_ACTION_ONESHOT 31#define NO_ACTION_ONESHOT
34#define NO_ACTION_FUNCTION 32#define NO_ACTION_MACRO
35 33
36/* USB Device descriptor parameter */ 34/* USB Device descriptor parameter */
37#define VENDOR_ID 0xFEED 35#define VENDOR_ID 0xFEED
diff --git a/keyboards/georgi/keymaps/default/keymap.c b/keyboards/georgi/keymaps/default/keymap.c
index c3d69eb8a..3a0edb892 100644
--- a/keyboards/georgi/keymaps/default/keymap.c
+++ b/keyboards/georgi/keymaps/default/keymap.c
@@ -1,4 +1,4 @@
1/* 1/*
2 * Good on you for modifying your layout, this is the most nonQMK layout you will come across 2 * Good on you for modifying your layout, this is the most nonQMK layout you will come across
3 * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer 3 * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer
4 * 4 *
@@ -15,215 +15,224 @@
15#include "keymap_steno.h" 15#include "keymap_steno.h"
16#define IGNORE_MOD_TAP_INTERRUPT 16#define IGNORE_MOD_TAP_INTERRUPT
17 17
18int getKeymapCount(void);
19
20// Proper Layers 18// Proper Layers
21#define FUNCT (LSD | LK | LP | LH) 19#define FUNCT (LSD | LK | LP | LH)
22#define MEDIA (LSD | LK | LW | LR) 20#define MEDIA (LSD | LK | LW | LR)
23#define MOVE (ST1 | ST2) 21#define MOVE (ST1 | ST2)
24 22
23// QMK Layers
24#define STENO_LAYER 0
25#define GAMING 1
26#define GAMING_2 2
27
25/* Keyboard Layout 28/* Keyboard Layout
26 * ,---------------------------------. ,------------------------------. 29 * ,---------------------------------. ,------------------------------.
27 * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD | 30 * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD |
28 * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----| 31 * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----|
29 * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | RG | RB | RS | RZ | 32 * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | BB | RG | RS | RZ |
30 * `---------------------------------' `------------------------------' 33 * `---------------------------------' `------------------------------'
31 * ,---------------, .---------------. 34 * ,---------------, .---------------.
32 * | NUM | LA | LO | | RE | RU | NUM | 35 * | LNO | LA | LO | | RE | RU | RNO |
33 * `---------------' `---------------' 36 * `---------------' `---------------'
34 */ 37 */
35 38
36// YOU MUST ORDER THIS! 39// Note: You can only use basic keycodes here!
37// P Will return from processing on the first match it finds. Therefore 40// P() is just a wrapper to make your life easier.
38// PJ Will run the requested action, remove the matched chord and continue
39//
40// First any chords that would conflict with PJs need to be checked, then PJs, lastly Ps.
41// For all chords should be ordered by length in their section!
42// 41//
43// http://docs.gboards.ca 42// http://docs.gboards.ca
44bool processQwerty(void) { 43uint32_t processQwerty(bool lookup) {
45 // Place P's that would be trashed by PJ's here 44 // Specials
46 P( RT | RS | RD | RZ | NUM, SEND_STRING(VERSION); SEND_STRING(__DATE__)); 45 P( RT | RS | RD | RZ | LNO, SEND_STRING(VERSION); SEND_STRING(__DATE__));
47 P( NUM | LA | LO | RE | RU, SEND(KC_MPLY)); 46 P( LNO | RNO | LA | LO | RE | RU, SEND(KC_MPLY));
48 P( ST1 | ST2 | ST3 | ST4, SEND(KC_BSPC)); 47 P( LFT | LK | LP | LW, REPEAT());
49 48 P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC));
50 // Thumb Chords 49
51 P( LA | LO | RE | RU, SEND(KC_CAPS)); 50 // Mouse Keys
52 P( LA | RU, SEND(KC_ESC)); 51 P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2));
53 PJ( LO | RE, SEND(KC_LCTL)); 52 P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1));
54 PJ( NUM | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT)); 53
55 PJ( NUM | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT)); 54 // Thumb Chords
56 55 P( LA | LO | RE | RU, SEND(KC_CAPS));
57 // Mods 56 P( LA | RU, SEND(KC_ESC));
58 PJ( RT | RD | RS | RZ, SEND(KC_LGUI)); 57 P( LO | RE, SEND(KC_LCTL));
59 PJ( RT | RD, SEND(KC_LCTL)); 58 P( LNO | RNO | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT));
60 PJ( RS | RZ, SEND(KC_LALT)); 59 P( LNO | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT));
61 PJ( LA | NUM, SEND(KC_LCTL)); 60
62 PJ( LA | LO, SEND(KC_LALT)); 61 // Mods
63 PJ( LO, SEND(KC_LSFT)); 62 P( RT | RD | RS | RZ, SEND(KC_LGUI));
64 63 P( RT | RD, SEND(KC_LCTL));
65 // Function Layer 64 P( RS | RZ, SEND(KC_LALT));
66 P( FUNCT | RF | RR, SEND(KC_F5)); 65 P( LA | LNO, SEND(KC_LCTL));
67 P( FUNCT | RP | RB, SEND(KC_F6)); 66 P( LA | LO, SEND(KC_LALT));
68 P( FUNCT | RL | RG, SEND(KC_F7)); 67 P( LO, SEND(KC_LSFT));
69 P( FUNCT | RT | RS, SEND(KC_F8)); 68
70 P( FUNCT | RF, SEND(KC_F1)); 69 // Function Layer
71 P( FUNCT | RP, SEND(KC_F2)); 70 P( FUNCT | RF | RR, SEND(KC_F5));
72 P( FUNCT | RL, SEND(KC_F3)); 71 P( FUNCT | RP | RB, SEND(KC_F6));
73 P( FUNCT | RT, SEND(KC_F4)); 72 P( FUNCT | RL | RG, SEND(KC_F7));
74 P( FUNCT | RR, SEND(KC_F9)); 73 P( FUNCT | RT | RS, SEND(KC_F8));
75 P( FUNCT | RG, SEND(KC_F10)); 74 P( FUNCT | RF, SEND(KC_F1));
76 P( FUNCT | RB, SEND(KC_F11)); 75 P( FUNCT | RP, SEND(KC_F2));
77 P( FUNCT | RS, SEND(KC_F12)); 76 P( FUNCT | RL, SEND(KC_F3));
78 77 P( FUNCT | RT, SEND(KC_F4));
79 // Movement Layer 78 P( FUNCT | RR, SEND(KC_F9));
80 P( MOVE | RF, SEND(KC_LEFT)); 79 P( FUNCT | RG, SEND(KC_F10));
81 P( MOVE | RP, SEND(KC_DOWN)); 80 P( FUNCT | RB, SEND(KC_F11));
82 P( MOVE | RL, SEND(KC_UP)); 81 P( FUNCT | RS, SEND(KC_F12));
83 P( MOVE | RT, SEND(KC_RIGHT)); 82
84 P( MOVE | ST3, SEND(KC_PGUP)); 83 // Movement Layer
85 P( MOVE | ST4, SEND(KC_PGDN)); 84 P( MOVE | RF, SEND(KC_LEFT));
86 85 P( MOVE | RP, SEND(KC_DOWN));
87 // Media Layer 86 P( MOVE | RL, SEND(KC_UP));
88 P( MEDIA | RF, SEND(KC_MPRV)); 87 P( MOVE | RT, SEND(KC_RIGHT));
89 P( MEDIA | RP, SEND(KC_MPLY)); 88 P( MOVE | ST3, SEND(KC_PGUP));
90 P( MEDIA | RL, SEND(KC_MPLY)); 89 P( MOVE | ST4, SEND(KC_PGDN));
91 P( MEDIA | RT, SEND(KC_MNXT)); 90
92 P( MEDIA | RD, SEND(KC_VOLU)); 91 // Media Layer
93 P( MEDIA | RZ, SEND(KC_VOLD)); 92 P( MEDIA | RF, SEND(KC_MPRV));
94 P( MEDIA | RS, SEND(KC_MUTE)); 93 P( MEDIA | RP, SEND(KC_MPLY));
95 94 P( MEDIA | RL, SEND(KC_MPLY));
96 // Mouse Keys 95 P( MEDIA | RT, SEND(KC_MNXT));
97 P( LP | LH, clickMouse(KC_MS_BTN1)); 96 P( MEDIA | RD, SEND(KC_VOLU));
98 P( LW | LR, clickMouse(KC_MS_BTN2)); 97 P( MEDIA | RZ, SEND(KC_VOLD));
99 98 P( MEDIA | RS, SEND(KC_MUTE));
100 // Number Row 99
101 P( NUM | LSU, SEND(KC_1)); 100 // Number Row, Left
102 P( NUM | LFT, SEND(KC_2)); 101 P( LNO | LSU, SEND(KC_1));
103 P( NUM | LP, SEND(KC_3)); 102 P( LNO | LFT, SEND(KC_2));
104 P( NUM | LH, SEND(KC_4)); 103 P( LNO | LP, SEND(KC_3));
105 P( NUM | ST1, SEND(KC_5)); 104 P( LNO | LH, SEND(KC_4));
106 P( NUM | ST3, SEND(KC_6)); 105 P( LNO | ST1, SEND(KC_5));
107 P( NUM | RF, SEND(KC_7)); 106 P( LNO | ST3, SEND(KC_6));
108 P( NUM | RP, SEND(KC_8)); 107 P( LNO | RF, SEND(KC_7));
109 P( NUM | RL, SEND(KC_9)); 108 P( LNO | RP, SEND(KC_8));
110 P( NUM | RT, SEND(KC_0)); 109 P( LNO | RL, SEND(KC_9));
111 P( NUM | LA, SEND(KC_5)); 110 P( LNO | RT, SEND(KC_0));
112 P( NUM | RT, SEND(KC_0)); 111
113 112 // Number Row, Right
114 // Specials 113 P( RNO | LSU, SEND(KC_1));
115 P( LA | NUM, SEND(KC_ESC)); 114 P( RNO | LFT, SEND(KC_2));
116 P( RU | NUM, SEND(KC_TAB)); 115 P( RNO | LP, SEND(KC_3));
117 P( RE | RU, SEND(KC_BSPC)); 116 P( RNO | LH, SEND(KC_4));
118 P( RD | RZ, SEND(KC_ENT)); 117 P( RNO | ST1, SEND(KC_5));
119 P( RE, SEND(KC_ENT)); 118 P( RNO | ST3, SEND(KC_6));
120 P( RD, SEND(KC_BSPC)); 119 P( RNO | RF, SEND(KC_7));
121 P( NUM, SEND(KC_BSPC)); 120 P( RNO | RP, SEND(KC_8));
122 P( LA, SEND(KC_SPC)); 121 P( RNO | RL, SEND(KC_9));
123 P( RU, SEND(KC_SPC)); 122 P( RNO | RT, SEND(KC_0));
124 P( RZ, SEND(KC_ESC)); 123 P( RNO | LA, SEND(KC_5));
125 124
126 // Letters 125 // Specials
127 P( LSU | LSD, SEND(KC_A)); 126 P( RU | RNO, SEND(KC_TAB));
128 P( LFT | LK, SEND(KC_S)); 127 P( RE | RU, SEND(KC_BSPC));
129 P( LP | LW, SEND(KC_D)); 128 P( RD | RZ, SEND(KC_ENT));
130 P( LH | LR, SEND(KC_F)); 129 P( RE, SEND(KC_ENT));
131 P( ST1 | ST2, SEND(KC_G)); 130 P( RD, SEND(KC_BSPC));
132 P( ST3 | ST4, SEND(KC_H)); 131 P( LNO, SEND(KC_BSPC));
133 P( RF | RR, SEND(KC_J)); 132 P( RNO, SEND(KC_BSPC));
134 P( RT | RS, SEND(KC_SCLN)) 133 P( LA, SEND(KC_SPC));
135 P( RG | RL, SEND(KC_L)); 134 P( RU, SEND(KC_SPC));
136 P( RP | RB, SEND(KC_K)); 135 P( RZ, SEND(KC_ESC));
137 P( LSU, SEND(KC_Q)); 136
138 P( LSD, SEND(KC_Z)); 137 // Symbols and Numbers
139 P( LFT, SEND(KC_W)); 138 P( PWR | RE | RU, SEND(KC_ENT));
140 P( LK, SEND(KC_X)); 139 P( PWR | LA | LO, SEND(KC_SPC));
141 P( LP, SEND(KC_E)); 140 P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // (
142 P( LW, SEND(KC_C)); 141 P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // )
143 P( LH, SEND(KC_R)); 142 P( PWR | ST1 | ST2, SEND(KC_GRV)); // `
144 P( LR, SEND(KC_V)); 143 P( PWR | RD | RZ, SEND(KC_ESC));
145 P( ST1, SEND(KC_T)); 144 P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // #
146 P( ST2, SEND(KC_B)); 145 P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $
147 P( ST3, SEND(KC_Y)); 146 P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // !
148 P( ST4, SEND(KC_N)); 147 P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // %
149 P( RF, SEND(KC_U)); 148 P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @
150 P( RR, SEND(KC_M)); 149 P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^
151 P( RP, SEND(KC_I)); 150 P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // {
152 P( RB, SEND(KC_COMM)); 151 P( PWR | LW, SEND(KC_LBRC));
153 P( RL, SEND(KC_O)); 152 P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // }
154 P( RG, SEND(KC_DOT)); 153 P( PWR | LR, SEND(KC_RBRC));
155 P( RT, SEND(KC_P)); 154 P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // |
156 P( RS, SEND(KC_SLSH)); 155 P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~
157 156 P( PWR | ST3, SEND(KC_QUOT));
158 // Symbols and Numbers 157 P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // "
159 P( PWR | RE | RU, SEND(KC_ENT)); 158 P( PWR | RF, SEND(KC_KP_PLUS));
160 P( PWR | LA | LO, SEND(KC_SPC)); 159 P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // &
161 P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // ( 160 P( PWR | RP, SEND(KC_MINS));
162 P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // ) 161 P( PWR | RB, SEND(KC_EQL));
163 P( PWR | ST1 | ST2, SEND(KC_GRV)); // ` 162 P( PWR | RL, SEND(KC_SLSH));
164 P( PWR | RD | RZ, SEND(KC_ESC)); 163 P( PWR | RG, SEND(KC_COMM));
165 P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // # 164 P( PWR | RT, SEND(KC_PAST));
166 P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $ 165 P( PWR | RS, SEND(KC_DOT));
167 P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // ! 166 P( PWR | RD, SEND(KC_TAB));
168 P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // % 167 P( PWR | LA, SEND(KC_LSFT));
169 P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @ 168 P( PWR | LO, SEND(KC_SLSH));
170 P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^ 169 P( PWR | RE, SEND(KC_SCLN));
171 P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // { 170 P( PWR | RU, SEND(KC_BSLS));
172 P( PWR | LW, SEND(KC_LBRC)); 171 P( PWR | LNO, SEND(KC_BSLS));
173 P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // } 172
174 P( PWR | LR, SEND(KC_RBRC)); 173 // Letters
175 P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // | 174 P( LSU | LSD, SEND(KC_A));
176 P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~ 175 P( LFT | LK, SEND(KC_S));
177 P( PWR | ST3, SEND(KC_QUOT)); 176 P( LP | LW, SEND(KC_D));
178 P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // " 177 P( LH | LR, SEND(KC_F));
179 P( PWR | RF, SEND(KC_KP_PLUS)); 178 P( ST1 | ST2, SEND(KC_G));
180 P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // & 179 P( ST3 | ST4, SEND(KC_H));
181 P( PWR | RP, SEND(KC_MINS)); 180 P( RF | RR, SEND(KC_J));
182 P( PWR | RB, SEND(KC_EQL)); 181 P( RT | RS, SEND(KC_SCLN));
183 P( PWR | RL, SEND(KC_SLSH)); 182 P( RG | RL, SEND(KC_L));
184 P( PWR | RG, SEND(KC_COMM)); 183 P( RP | RB, SEND(KC_K));
185 P( PWR | RT, SEND(KC_PAST)); 184 P( LSU, SEND(KC_Q));
186 P( PWR | RS, SEND(KC_DOT)); 185 P( LSD, SEND(KC_Z));
187 P( PWR | RD, SEND(KC_TAB)); 186 P( LFT, SEND(KC_W));
188 P( PWR | LA, SEND(KC_SCLN)); 187 P( LK, SEND(KC_X));
189 P( PWR | LO, SEND(KC_SLSH)); 188 P( LP, SEND(KC_E));
190 P( PWR | RE, SEND(KC_SCLN)); 189 P( LW, SEND(KC_C));
191 P( PWR | RU, SEND(KC_SLSH)); 190 P( LH, SEND(KC_R));
192 191 P( LR, SEND(KC_V));
193 192 P( ST1, SEND(KC_T));
194 // If we make here, send as a steno chord 193 P( ST2, SEND(KC_B));
195 // If plover is running we can hook that host side 194 P( ST3, SEND(KC_Y));
196 return false; 195 P( ST4, SEND(KC_N));
196 P( RF, SEND(KC_U));
197 P( RR, SEND(KC_M));
198 P( RP, SEND(KC_I));
199 P( RB, SEND(KC_COMM));
200 P( RL, SEND(KC_O));
201 P( RG, SEND(KC_DOT));
202 P( RT, SEND(KC_P));
203 P( RS, SEND(KC_SLSH));
204 P( RNO, SEND(KC_BSPC));
205 P( LNO, SEND(KC_BSPC));
206
207 return 0;
197} 208}
198 209
199#define STENO_LAYER 0
200#define GAMING 1
201#define GAMING_2 2
202
203// "Layers" 210// "Layers"
204// Steno layer should be first in your map. 211// Steno layer should be first in your map.
205// When PWR | FN | RR | RG | RB | RS is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end. 212// When PWR | FN | ST3 | ST4 is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end.
206// If you have only a single layer, you must set SINGLELAYER = yes in your rules.mk, otherwise you may experince undefined behaviour 213// If you need more space for chords, remove the two gaming layers.
214// Note: If using NO_ACTION_TAPPING, LT will not work!
207 215
208const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 216const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
209// Main layer, everything goes through here 217 // Main layer, everything goes through here
210[STENO_LAYER] = LAYOUT_georgi( 218 [STENO_LAYER] = LAYOUT_georgi(
211STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, 219 STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
212STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, 220 STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
213 STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N1) 221 STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N7
214, 222 ),
215// Gaming layer with Numpad, Very limited 223 // Gaming layer with Numpad, Very limited
216[GAMING] = LAYOUT_georgi( 224 [GAMING] = LAYOUT_georgi(
217KC_LSFT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, 225 KC_LSFT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT,
218KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_DQUO, 226 KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_DQUO,
219KC_LALT, KC_SPC, LT(GAMING_2, KC_ENT), KC_DEL, KC_ASTR, TO(STENO_LAYER)), 227 KC_LALT, KC_SPC, LT(GAMING_2, KC_ENT), KC_DEL, KC_ASTR, TO(STENO_LAYER)
220 228 ),
221[GAMING_2] = LAYOUT_georgi( 229
222KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, 230 [GAMING_2] = LAYOUT_georgi(
223KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT, 231 KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
224 KC_LALT, KC_SPC, KC_ENT, KC_DEL, KC_ASTR, TO(STENO_LAYER)) 232 KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT,
225}; 233 KC_LALT, KC_SPC, KC_ENT, KC_DEL, KC_ASTR, TO(STENO_LAYER)
226 234 )
227int getKeymapCount(void) { 235};
228 return sizeof(keymaps)/sizeof(keymaps[0]); 236
229} 237// Don't fuck with this, thanks.
238size_t keymapsCount = sizeof(keymaps)/sizeof(keymaps[0]);
diff --git a/keyboards/georgi/keymaps/default/rules.mk b/keyboards/georgi/keymaps/default/rules.mk
index 2973c4591..90d8057c3 100644
--- a/keyboards/georgi/keymaps/default/rules.mk
+++ b/keyboards/georgi/keymaps/default/rules.mk
@@ -1,18 +1,23 @@
1#---------------------------------------------------------------------------- 1#----------------------------------------------------------------------------
2# make georgi:extrakey:dfu 2# make georgi:default:dfu
3# Make sure you have dfu-programmer installed! 3# Make sure you have dfu-programmer installed!
4#---------------------------------------------------------------------------- 4#----------------------------------------------------------------------------
5 5
6#Debug options 6NO_REPEAT = no
7VERBOSE = yes 7VERBOSE = yes
8CONSOLE_ENABLE = yes
9DEBUG_MATRIX_SCAN_RATE = no
10DEBUG_MATRIX = no
11KEYBOARD_SHARED_EP = yes 8KEYBOARD_SHARED_EP = yes
12CUSTOM_MATRIX = yes 9CUSTOM_MATRIX = yes
13MOUSEKEY_ENABLE = yes
14SINGLE_LAYER = no
15 10
11#Firmware reduction options
12MOUSEKEY_ENABLE = yes # 1500 bytes
13NO_TAPPING = no # 2000 bytes
14NO_PRINT = yes
15
16#Debug options
17CONSOLE_ENABLE = no
18DEBUG_MATRIX_SCAN_RATE = no
19DEBUG_MATRIX = no
20ONLY_QWERTY = no
16 21
17# A bunch of stuff that you shouldn't touch unless you 22# A bunch of stuff that you shouldn't touch unless you
18# know what you're doing. 23# know what you're doing.
@@ -22,6 +27,15 @@ SRC += matrix.c i2c_master.c
22ifeq ($(strip $(DEBUG_MATRIX)), yes) 27ifeq ($(strip $(DEBUG_MATRIX)), yes)
23 OPT_DEFS += -DDEBUG_MATRIX 28 OPT_DEFS += -DDEBUG_MATRIX
24endif 29endif
25ifeq ($(strip $(SINGLE_LAYER)), yes) 30ifeq ($(strip $(NO_REPEAT)), yes)
26 OPT_DEFS += -DSINGLE_LAYER 31 OPT_DEFS += -DNO_REPEAT
32endif
33ifeq ($(strip $(NO_PRINT)), yes)
34 OPT_DEFS += -DNO_PRINT -DNO_DEBUG
35endif
36ifeq ($(strip $(ONLY_QWERTY)), yes)
37 OPT_DEFS += -DONLYQWERTY
38endif
39ifeq ($(strip $(NO_TAPPING)), yes)
40 OPT_DEFS += -DNO_ACTION_TAPPING
27endif 41endif
diff --git a/keyboards/georgi/keymaps/minimal/keymap.c b/keyboards/georgi/keymaps/minimal/keymap.c
new file mode 100644
index 000000000..1d9b57e9a
--- /dev/null
+++ b/keyboards/georgi/keymaps/minimal/keymap.c
@@ -0,0 +1,223 @@
1/*
2 * Good on you for modifying your layout, this is the most nonQMK layout you will come across
3 * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer
4 *
5 * Don't modify the steno layer directly, instead add chords using the keycodes and macros
6 * from sten.h to the layout you want to modify.
7 *
8 * Observe the comment above processQWERTY!
9 *
10 * http://docs.gboards.ca
11 */
12
13#include QMK_KEYBOARD_H
14#include "sten.h"
15#include "keymap_steno.h"
16#define IGNORE_MOD_TAP_INTERRUPT
17
18// Proper Layers
19#define FUNCT (LSD | LK | LP | LH)
20#define MEDIA (LSD | LK | LW | LR)
21#define MOVE (ST1 | ST2)
22
23// QMK Layers
24#define STENO_LAYER 0
25
26/* Keyboard Layout
27 * ,---------------------------------. ,------------------------------.
28 * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD |
29 * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----|
30 * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | BB | RG | RS | RZ |
31 * `---------------------------------' `------------------------------'
32 * ,---------------, .---------------.
33 * | LNO | LA | LO | | RE | RU | RNO |
34 * `---------------' `---------------'
35 */
36
37// Note: You can only use basic keycodes here!
38// P() is just a wrapper to make your life easier.
39//
40// http://docs.gboards.ca
41uint32_t processQwerty(bool lookup) {
42 // Specials
43 P( RT | RS | RD | RZ | LNO, SEND_STRING(VERSION); SEND_STRING(__DATE__));
44 P( LNO | RNO | LA | LO | RE | RU, SEND(KC_MPLY));
45 P( LFT | LK | LP | LW, REPEAT());
46 P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC));
47
48 // Mouse Keys
49 P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2));
50 P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1));
51
52 // Thumb Chords
53 P( LA | LO | RE | RU, SEND(KC_CAPS));
54 P( LA | RU, SEND(KC_ESC));
55 P( LO | RE, SEND(KC_LCTL));
56 P( LNO | RNO | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT));
57 P( LNO | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT));
58
59 // Mods
60 P( RT | RD | RS | RZ, SEND(KC_LGUI));
61 P( RT | RD, SEND(KC_LCTL));
62 P( RS | RZ, SEND(KC_LALT));
63 P( LA | LNO, SEND(KC_LCTL));
64 P( LA | LO, SEND(KC_LALT));
65 P( LO, SEND(KC_LSFT));
66
67 // Function Layer
68 P( FUNCT | RF | RR, SEND(KC_F5));
69 P( FUNCT | RP | RB, SEND(KC_F6));
70 P( FUNCT | RL | RG, SEND(KC_F7));
71 P( FUNCT | RT | RS, SEND(KC_F8));
72 P( FUNCT | RF, SEND(KC_F1));
73 P( FUNCT | RP, SEND(KC_F2));
74 P( FUNCT | RL, SEND(KC_F3));
75 P( FUNCT | RT, SEND(KC_F4));
76 P( FUNCT | RR, SEND(KC_F9));
77 P( FUNCT | RG, SEND(KC_F10));
78 P( FUNCT | RB, SEND(KC_F11));
79 P( FUNCT | RS, SEND(KC_F12));
80
81 // Movement Layer
82 P( MOVE | RF, SEND(KC_LEFT));
83 P( MOVE | RP, SEND(KC_DOWN));
84 P( MOVE | RL, SEND(KC_UP));
85 P( MOVE | RT, SEND(KC_RIGHT));
86 P( MOVE | ST3, SEND(KC_PGUP));
87 P( MOVE | ST4, SEND(KC_PGDN));
88
89 // Media Layer
90 P( MEDIA | RF, SEND(KC_MPRV));
91 P( MEDIA | RP, SEND(KC_MPLY));
92 P( MEDIA | RL, SEND(KC_MPLY));
93 P( MEDIA | RT, SEND(KC_MNXT));
94 P( MEDIA | RD, SEND(KC_VOLU));
95 P( MEDIA | RZ, SEND(KC_VOLD));
96 P( MEDIA | RS, SEND(KC_MUTE));
97
98 // Number Row, Left
99 P( LNO | LSU, SEND(KC_1));
100 P( LNO | LFT, SEND(KC_2));
101 P( LNO | LP, SEND(KC_3));
102 P( LNO | LH, SEND(KC_4));
103 P( LNO | ST1, SEND(KC_5));
104 P( LNO | ST3, SEND(KC_6));
105 P( LNO | RF, SEND(KC_7));
106 P( LNO | RP, SEND(KC_8));
107 P( LNO | RL, SEND(KC_9));
108 P( LNO | RT, SEND(KC_0));
109
110 // Number Row, Right
111 P( RNO | LSU, SEND(KC_1));
112 P( RNO | LFT, SEND(KC_2));
113 P( RNO | LP, SEND(KC_3));
114 P( RNO | LH, SEND(KC_4));
115 P( RNO | ST1, SEND(KC_5));
116 P( RNO | ST3, SEND(KC_6));
117 P( RNO | RF, SEND(KC_7));
118 P( RNO | RP, SEND(KC_8));
119 P( RNO | RL, SEND(KC_9));
120 P( RNO | RT, SEND(KC_0));
121 P( RNO | LA, SEND(KC_5));
122
123 // Specials
124 P( RU | RNO, SEND(KC_TAB));
125 P( RE | RU, SEND(KC_BSPC));
126 P( RD | RZ, SEND(KC_ENT));
127 P( RE, SEND(KC_ENT));
128 P( RD, SEND(KC_BSPC));
129 P( LNO, SEND(KC_BSPC));
130 P( RNO, SEND(KC_BSPC));
131 P( LA, SEND(KC_SPC));
132 P( RU, SEND(KC_SPC));
133 P( RZ, SEND(KC_ESC));
134
135 // Symbols and Numbers
136 P( PWR | RE | RU, SEND(KC_ENT));
137 P( PWR | LA | LO, SEND(KC_SPC));
138 P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // (
139 P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // )
140 P( PWR | ST1 | ST2, SEND(KC_GRV)); // `
141 P( PWR | RD | RZ, SEND(KC_ESC));
142 P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // #
143 P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $
144 P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // !
145 P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // %
146 P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @
147 P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^
148 P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // {
149 P( PWR | LW, SEND(KC_LBRC));
150 P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // }
151 P( PWR | LR, SEND(KC_RBRC));
152 P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // |
153 P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~
154 P( PWR | ST3, SEND(KC_QUOT));
155 P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // "
156 P( PWR | RF, SEND(KC_KP_PLUS));
157 P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // &
158 P( PWR | RP, SEND(KC_MINS));
159 P( PWR | RB, SEND(KC_EQL));
160 P( PWR | RL, SEND(KC_SLSH));
161 P( PWR | RG, SEND(KC_COMM));
162 P( PWR | RT, SEND(KC_PAST));
163 P( PWR | RS, SEND(KC_DOT));
164 P( PWR | RD, SEND(KC_TAB));
165 P( PWR | LA, SEND(KC_LSFT));
166 P( PWR | LO, SEND(KC_SLSH));
167 P( PWR | RE, SEND(KC_SCLN));
168 P( PWR | RU, SEND(KC_BSLS));
169 P( PWR | LNO, SEND(KC_BSLS));
170
171 // Letters
172 P( LSU | LSD, SEND(KC_A));
173 P( LFT | LK, SEND(KC_S));
174 P( LP | LW, SEND(KC_D));
175 P( LH | LR, SEND(KC_F));
176 P( ST1 | ST2, SEND(KC_G));
177 P( ST3 | ST4, SEND(KC_H));
178 P( RF | RR, SEND(KC_J));
179 P( RT | RS, SEND(KC_SCLN));
180 P( RG | RL, SEND(KC_L));
181 P( RP | RB, SEND(KC_K));
182 P( LSU, SEND(KC_Q));
183 P( LSD, SEND(KC_Z));
184 P( LFT, SEND(KC_W));
185 P( LK, SEND(KC_X));
186 P( LP, SEND(KC_E));
187 P( LW, SEND(KC_C));
188 P( LH, SEND(KC_R));
189 P( LR, SEND(KC_V));
190 P( ST1, SEND(KC_T));
191 P( ST2, SEND(KC_B));
192 P( ST3, SEND(KC_Y));
193 P( ST4, SEND(KC_N));
194 P( RF, SEND(KC_U));
195 P( RR, SEND(KC_M));
196 P( RP, SEND(KC_I));
197 P( RB, SEND(KC_COMM));
198 P( RL, SEND(KC_O));
199 P( RG, SEND(KC_DOT));
200 P( RT, SEND(KC_P));
201 P( RS, SEND(KC_SLSH));
202 P( RNO, SEND(KC_BSPC));
203 P( LNO, SEND(KC_BSPC));
204
205 return 0;
206}
207
208// "Layers"
209// Steno layer should be first in your map.
210// When PWR | FN | ST3 | ST4 is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end.
211// If you need more space for chords, remove the two gaming layers.
212// Note: If using NO_ACTION_TAPPING, LT will not work!
213
214const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
215 // Main layer, everything goes through here
216 [STENO_LAYER] = LAYOUT_georgi(
217 STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
218 STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
219 STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N7
220 )
221};
222// Don't fuck with this, thanks.
223size_t keymapsCount = sizeof(keymaps)/sizeof(keymaps[0]);
diff --git a/keyboards/georgi/keymaps/minimal/readme.md b/keyboards/georgi/keymaps/minimal/readme.md
new file mode 100644
index 000000000..f9da34b02
--- /dev/null
+++ b/keyboards/georgi/keymaps/minimal/readme.md
@@ -0,0 +1,11 @@
1# Georgi QWERTY/Steno firmware
2
3This is the default keymap for Georgi, it's based heavily off of the naps62 ErgoDox and the Gergo layout.
4It is both a ergonomic and programmer friendly keymap.
5
6Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
7
8## Space issues
9If you find yourself running out of space for dictionary entries, disabling mousekeys in rules.mk will save
10you about 4k for entries!
11Get a free 1k by deleting the Gaming layers from the keymap!
diff --git a/keyboards/georgi/keymaps/minimal/rules.mk b/keyboards/georgi/keymaps/minimal/rules.mk
new file mode 100644
index 000000000..cdbbbc280
--- /dev/null
+++ b/keyboards/georgi/keymaps/minimal/rules.mk
@@ -0,0 +1,41 @@
1#----------------------------------------------------------------------------
2# make georgi:default:dfu
3# Make sure you have dfu-programmer installed!
4#----------------------------------------------------------------------------
5
6NO_REPEAT = no
7VERBOSE = yes
8KEYBOARD_SHARED_EP = yes
9CUSTOM_MATRIX = yes
10
11#Firmware reduction options
12MOUSEKEY_ENABLE = no # 1500 bytes
13NO_TAPPING = yes # 2000 bytes
14NO_PRINT = yes
15
16#Debug options
17CONSOLE_ENABLE = no
18DEBUG_MATRIX_SCAN_RATE = no
19DEBUG_MATRIX = no
20ONLY_QWERTY = no
21
22# A bunch of stuff that you shouldn't touch unless you
23# know what you're doing.
24#
25# No touchy, capiche?
26SRC += matrix.c i2c_master.c
27ifeq ($(strip $(DEBUG_MATRIX)), yes)
28 OPT_DEFS += -DDEBUG_MATRIX
29endif
30ifeq ($(strip $(NO_REPEAT)), yes)
31 OPT_DEFS += -DNO_REPEAT
32endif
33ifeq ($(strip $(NO_PRINT)), yes)
34 OPT_DEFS += -DNO_PRINT -DNO_DEBUG
35endif
36ifeq ($(strip $(ONLY_QWERTY)), yes)
37 OPT_DEFS += -DONLYQWERTY
38endif
39ifeq ($(strip $(NO_TAPPING)), yes)
40 OPT_DEFS += -DNO_ACTION_TAPPING
41endif
diff --git a/keyboards/georgi/keymaps/norman/keymap.c b/keyboards/georgi/keymaps/norman/keymap.c
new file mode 100644
index 000000000..58c42c852
--- /dev/null
+++ b/keyboards/georgi/keymaps/norman/keymap.c
@@ -0,0 +1,267 @@
1/*
2 * Good on you for modifying your layout, this is the most nonQMK layout you will come across
3 * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer
4 *
5 * Don't modify the steno layer directly, instead add chords using the keycodes and macros
6 * from sten.h to the layout you want to modify.
7 *
8 * Observe the comment above processQWERTY!
9 *
10 * http://docs.gboards.ca
11 */
12
13#include QMK_KEYBOARD_H
14#include "sten.h"
15#include "keymap_steno.h"
16#define IGNORE_MOD_TAP_INTERRUPT
17
18// Proper Layers
19#define FUNCT (LSD | LK | LP | LH)
20#define MEDIA (LSD | LK | LW | LR)
21#define MOVE (LH | ST2)
22
23/* Keyboard Layout
24 * ,---------------------------------. ,------------------------------.
25 * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD |
26 * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----|
27 * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | RB | RG | RS | RZ |
28 * `---------------------------------' `------------------------------'
29 * ,---------------, .---------------.
30 * | LNO | LA | LO | | RE | RU | RNO |
31 * `---------------' `---------------'
32 */
33
34// YOU MUST ORDER THIS!
35// Order your chords from longest to shortest!
36// You can only use basic keycodes here!
37//
38// P() is just a wrapper to make your life easier.
39//
40// http://docs.gboards.ca
41uint32_t processQwerty(bool lookup) {
42 // Specials
43 P( RT | RS | RD | RZ | LNO, SEND_STRING(VERSION); SEND_STRING(__DATE__));
44 P( LNO | LA | LO | RE | RU, SEND(KC_MPLY));
45 P( ST1 | ST2 | ST3 | ST4, SEND(KC_BSPC));
46
47 // Thumb Chords
48 P( LA | LO | RE | RU, SEND(KC_CAPS));
49 P( LA | RU, SEND(KC_ESC));
50 P( LO | RE, SEND(KC_LCTL));
51 P( LNO | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT));
52 P( LNO | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT));
53
54 // Mods
55 P( RT | RD | RS | RZ, SEND(KC_LGUI));
56 P( RT | RD, SEND(KC_LCTL));
57 P( RS | RZ, SEND(KC_LALT));
58 P( LA | LNO, SEND(KC_LCTL));
59 P( LA | LO, SEND(KC_LALT));
60 P( LO, SEND(KC_LSFT));
61
62 // Function Layer
63 P( FUNCT | RF | RR, SEND(KC_F6));
64 P( FUNCT | RP | RB, SEND(KC_F7));
65 P( FUNCT | RL | RG, SEND(KC_F8));
66 P( FUNCT | ST3 | ST4, SEND(KC_F5));
67 P( FUNCT| ST3, SEND(KC_F1));
68 P( FUNCT| ST4, SEND(KC_F9));
69 P( FUNCT | RF, SEND(KC_F2));
70 P( FUNCT | RP, SEND(KC_F3));
71 P( FUNCT | RL, SEND(KC_F4));
72 P( FUNCT | RR, SEND(KC_F10));
73 P( FUNCT | RG, SEND(KC_F12));
74 P( FUNCT | RB, SEND(KC_F11));
75 P( FUNCT | RD, SEND(KC_RALT); SEND(KC_T); SEND(KC_H); SEND(KC_U); SEND(KC_P));
76 P( FUNCT | RZ, SEND(KC_RALT); SEND(KC_T); SEND(KC_H); SEND(KC_D); SEND(KC_N));
77 P( FUNCT | RT, SEND(KC_RALT); SEND(KC_S); SEND(KC_F));
78 P( FUNCT | RS, SEND(KC_LALT); SEND(KC_SPC));
79 P( FUNCT | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_ESC));
80 P( FUNCT | RU, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_0));
81
82 // Movement Layer
83 P( MOVE | RF, SEND(KC_LGUI); SEND(KC_LSFT); SEND(KC_LEFT));
84 P( MOVE | RP, SEND(KC_UP));
85 P( MOVE | RL, SEND(KC_LGUI); SEND(KC_LSFT); SEND(KC_RGHT));
86 P( MOVE | RT, SEND(KC_LALT); SEND(KC_LCTL); SEND(KC_LGUI); SEND(KC_C));
87 P( MOVE | ST3, SEND(KC_PGUP));
88 P( MOVE | ST4, SEND(KC_PGDN));
89 P( MOVE | RD, SEND(KC_HOME));
90 P( MOVE | RZ, SEND(KC_END));
91 P( MOVE | RG, SEND(KC_RIGHT));
92 P( MOVE | RB, SEND(KC_DOWN));
93 P( MOVE | RR, SEND(KC_LEFT));
94 P( MOVE | RS, SEND(KC_LSFT); SEND(KC_LCTL); SEND(KC_LGUI); SEND(KC_T));
95 P( MOVE | RE, SEND(KC_LSFT); SEND(KC_LALT); SEND(KC_LGUI); SEND(KC_S));
96 P( MOVE | RU, SEND(KC_LSFT); SEND(KC_LCTL); SEND(KC_1));
97
98
99 // Media Layer
100 P( MEDIA | RF, SEND(KC_MEDIA_PREV_TRACK));
101 P( MEDIA | RP, SEND(KC_MPLY));
102 P( MEDIA | RL, SEND(KC_MPLY));
103 P( MEDIA | RT, SEND(KC_MEDIA_NEXT_TRACK));
104 P( MEDIA | RD, SEND(KC_VOLU));
105 P( MEDIA | RZ, SEND(KC_VOLD));
106 P( MEDIA | RS, SEND(KC_MUTE));
107 P( MEDIA | ST3, SEND(KC_LALT); SEND(KC_LCTL); SEND(KC_LGUI); SEND(KC_4));
108 P( MEDIA | ST4, SEND(KC_LALT); SEND(KC_LCTL); SEND(KC_LGUI); SEND(KC_2));
109 P( MEDIA | RR, SEND(KC_LALT); SEND(KC_LCTL); SEND(KC_LGUI); SEND(KC_3));
110 P( MEDIA | RB, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_GRV));
111 P( MEDIA | RG, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_8));
112 P( MEDIA | RE, SEND(KC_RALT); SEND(KC_F); SEND(KC_I); SEND(KC_R); SEND(KC_E));
113 P( MEDIA | RU, SEND(KC_RALT); SEND(KC_T); SEND(KC_A); SEND(KC_D));
114
115 // Mouse Keys and Printscreen
116 P( LFT | LH, CLICK_MOUSE(KC_MS_BTN1));
117 P( LK | LR, CLICK_MOUSE(KC_MS_BTN2));
118 P( RF | RT, SEND(KC_PSCR););
119
120 // Number Row Left
121 P( LNO | LSU, SEND(KC_1));
122 P( LNO | LFT, SEND(KC_2));
123 P( LNO | LP, SEND(KC_3));
124 P( LNO | LH, SEND(KC_4));
125 P( LNO | ST1, SEND(KC_5));
126 P( LNO | ST3, SEND(KC_6));
127 P( LNO | RF, SEND(KC_7));
128 P( LNO | RP, SEND(KC_8));
129 P( LNO | RL, SEND(KC_9));
130 P( LNO | RT, SEND(KC_0));
131 P( LNO | LA, SEND(KC_5));
132 P( LNO | RT, SEND(KC_0));
133
134 // Number Row Right
135 P( RNO | LSU, SEND(KC_1));
136 P( RNO | LFT, SEND(KC_2));
137 P( RNO | LP, SEND(KC_3));
138 P( RNO | LH, SEND(KC_4));
139 P( RNO | ST1, SEND(KC_5));
140 P( RNO | ST3, SEND(KC_6));
141 P( RNO | RF, SEND(KC_7));
142 P( RNO | RP, SEND(KC_8));
143 P( RNO | RL, SEND(KC_9));
144 P( RNO | RT, SEND(KC_0));
145 P( RNO | LA, SEND(KC_5));
146 P( RNO | RT, SEND(KC_0));
147
148 // Specials
149 P( LA | LNO, SEND(KC_ESC));
150 P( RU | RNO, SEND(KC_TAB));
151 P( RE | RU, SEND(KC_LSFT); SEND(KC_SLSH));
152 P( RD | RZ, SEND(KC_ENT));
153 P( RE, SEND(KC_ENT));
154 //P( RD, SEND(KC_BSPC));
155 P( LNO, SEND(KC_BSPC));
156 P( RD, SEND(KC_DEL));
157 P( LA, SEND(KC_SPC));
158 P( RU, SEND(KC_SPC));
159 P( RZ, SEND(KC_ESC));
160 //P( RNO, REPEAT());
161
162 // Letters
163 P( LSU | LSD, SEND(KC_A));
164 P( LFT | LK, SEND(KC_S));
165 P( LP | LW, SEND(KC_E));
166 P( LH | LR, SEND(KC_T));
167 P( ST1 | ST2, SEND(KC_G));
168 P( ST3 | ST4, SEND(KC_Y));
169 P( RF | RR, SEND(KC_N));
170 P( RT | RS, SEND(KC_H))
171 P( RG | RL, SEND(KC_O));
172 P( RP | RB, SEND(KC_I));
173 P( LSU, SEND(KC_Q));
174 P( LSD, SEND(KC_Z));
175 P( LFT, SEND(KC_W));
176 P( LK, SEND(KC_X));
177 P( LP, SEND(KC_D));
178 P( LW, SEND(KC_C));
179 P( LH, SEND(KC_F));
180 P( LR, SEND(KC_V));
181 P( ST1, SEND(KC_K));
182 P( ST2, SEND(KC_B));
183 P( ST3, SEND(KC_J));
184 P( ST4, SEND(KC_P));
185 P( RF, SEND(KC_U));
186 P( RR, SEND(KC_M));
187 P( RP, SEND(KC_R));
188 P( RB, SEND(KC_COMM));
189 P( RL, SEND(KC_L));
190 P( RG, SEND(KC_DOT));
191 P( RT, SEND(KC_SCLN));
192 P( RS, SEND(KC_SLSH));
193
194 // Symbols and Numbers
195 P( PWR | RE | RU, SEND(KC_ENT));
196 P( PWR | LA | LO, SEND(KC_SPC));
197 P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // (
198 P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // )
199 P( PWR | ST1 | ST2, SEND(KC_GRV)); // `
200 P( PWR | RD | RZ, SEND(KC_ESC));
201 P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // #
202 P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $
203 P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // !
204 P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // %
205 P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @
206 P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^
207 P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // {
208 P( PWR | LW, SEND(KC_LBRC));
209 P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // }
210 P( PWR | LR, SEND(KC_RBRC));
211 P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // |
212 P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~
213 P( PWR | ST3, SEND(KC_QUOT));
214 P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // "
215 P( PWR | RF, SEND(KC_KP_PLUS));
216 P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // &
217 P( PWR | RP, SEND(KC_MINS));
218 P( PWR | RB, SEND(KC_EQL));
219 P( PWR | RL, SEND(KC_SLSH));
220 P( PWR | RG, SEND(KC_LSFT); SEND(KC_MINS));
221 P( PWR | RT, SEND(KC_PAST));
222 P( PWR | RS, SEND(KC_DOT));
223 P( PWR | RD, SEND(KC_TAB));
224 P( PWR | LA, SEND(KC_LSFT); SEND(KC_SCLN));
225 P( PWR | LO, SEND(KC_BSLS));
226 P( PWR | RE, SEND(KC_SCLN));
227 P( PWR | RU, SEND(KC_BSLS));
228 P( PWR | RZ, SEND(KC_LSFT));
229
230 return 0;
231}
232
233#define STENO_LAYER 0
234#define GAMING 1
235#define GAMING_2 2
236#define MOVEMENT 3
237
238// "Layers"
239// Steno layer should be first in your map.
240// When PWR | FN | ST3 | ST4 is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end.
241// If you need more space for chords, remove the two gaming layers.
242
243const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
244// Main layer, everything goes through here
245[STENO_LAYER] = LAYOUT_georgi(
246STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
247STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
248 STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N7)
249,
250// Gaming layer with Numpad, Very limited
251[GAMING] = LAYOUT_georgi(
252KC_LSFT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT,
253KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_DQUO,
254KC_LALT, KC_SPC, LT(GAMING_2, KC_ENT), KC_DEL, KC_ASTR, TO(STENO_LAYER)),
255
256[GAMING_2] = LAYOUT_georgi(
257KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
258KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_LT, KC_GT, KC_QUES, KC_RSFT,
259 KC_LALT, KC_SPC, KC_NO, KC_DEL, KC_ASTR, TO(STENO_LAYER)),
260
261[MOVEMENT] = LAYOUT_georgi(
262KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_PGUP, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_HOME,
263KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_END,
264 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
265};
266// Don't fuck with this, thanks.
267size_t keymapsCount = sizeof(keymaps)/sizeof(keymaps[0]);
diff --git a/keyboards/georgi/keymaps/norman/readme.md b/keyboards/georgi/keymaps/norman/readme.md
new file mode 100644
index 000000000..f9da34b02
--- /dev/null
+++ b/keyboards/georgi/keymaps/norman/readme.md
@@ -0,0 +1,11 @@
1# Georgi QWERTY/Steno firmware
2
3This is the default keymap for Georgi, it's based heavily off of the naps62 ErgoDox and the Gergo layout.
4It is both a ergonomic and programmer friendly keymap.
5
6Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
7
8## Space issues
9If you find yourself running out of space for dictionary entries, disabling mousekeys in rules.mk will save
10you about 4k for entries!
11Get a free 1k by deleting the Gaming layers from the keymap!
diff --git a/keyboards/georgi/keymaps/template/rules.mk b/keyboards/georgi/keymaps/norman/rules.mk
index 1178fd80d..bb97bef28 100644
--- a/keyboards/georgi/keymaps/template/rules.mk
+++ b/keyboards/georgi/keymaps/norman/rules.mk
@@ -1,18 +1,20 @@
1#---------------------------------------------------------------------------- 1#----------------------------------------------------------------------------
2# make georgi:extrakey:dfu 2# make georgi:default:dfu
3# Make sure you have dfu-programmer installed! 3# Make sure you have dfu-programmer installed!
4#---------------------------------------------------------------------------- 4#----------------------------------------------------------------------------
5 5
6#Debug options 6NO_REPEAT = yes
7VERBOSE = yes 7VERBOSE = yes
8CONSOLE_ENABLE = yes
9DEBUG_MATRIX_SCAN_RATE = no
10DEBUG_MATRIX = no
11KEYBOARD_SHARED_EP = yes 8KEYBOARD_SHARED_EP = yes
12CUSTOM_MATRIX = yes 9CUSTOM_MATRIX = yes
13MOUSEKEY_ENABLE = no 10MOUSEKEY_ENABLE = yes
14SINGLE_LAYER = no
15 11
12#Debug options
13CONSOLE_ENABLE = no
14DEBUG_MATRIX_SCAN_RATE = no
15DEBUG_MATRIX = no
16NO_PRINT = yes
17ONLY_QWERTY = no
16 18
17# A bunch of stuff that you shouldn't touch unless you 19# A bunch of stuff that you shouldn't touch unless you
18# know what you're doing. 20# know what you're doing.
@@ -22,6 +24,12 @@ SRC += matrix.c i2c_master.c
22ifeq ($(strip $(DEBUG_MATRIX)), yes) 24ifeq ($(strip $(DEBUG_MATRIX)), yes)
23 OPT_DEFS += -DDEBUG_MATRIX 25 OPT_DEFS += -DDEBUG_MATRIX
24endif 26endif
25ifeq ($(strip $(SINGLE_LAYER)), yes) 27ifeq ($(strip $(NO_REPEAT)), yes)
26 OPT_DEFS += -DSINGLE_LAYER 28 OPT_DEFS += -DNO_REPEAT
29endif
30ifeq ($(strip $(NO_PRINT)), yes)
31 OPT_DEFS += -DNO_PRINT -DNO_DEBUG
32endif
33ifeq ($(strip $(ONLY_QWERTY)), yes)
34 OPT_DEFS += -DONLYQWERTY
27endif 35endif
diff --git a/keyboards/georgi/keymaps/template/keymap.c b/keyboards/georgi/keymaps/template/keymap.c
deleted file mode 100644
index b17d7ed9f..000000000
--- a/keyboards/georgi/keymaps/template/keymap.c
+++ /dev/null
@@ -1,216 +0,0 @@
1/*
2 * Good on you for modifying your layout, this is the most nonQMK layout you will come across
3 * There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer
4 *
5 * Don't modify the steno layer directly, instead add chords using the keycodes and macros
6 * from sten.h to the layout you want to modify.
7 *
8 * Observe the comment above processQWERTY!
9 *
10 * http://docs.gboards.ca
11 */
12
13#include QMK_KEYBOARD_H
14#include "sten.h"
15#include "keymap_steno.h"
16#define IGNORE_MOD_TAP_INTERRUPT
17
18int getKeymapCount(void);
19
20// Proper Layers
21#define FUNCT (LSD | LK | LP | LH)
22#define MEDIA (LSD | LK | LW | LR)
23#define MOVE (ST1 | ST2)
24
25/* Keyboard Layout
26 * ,---------------------------------. ,------------------------------.
27 * | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD |
28 * |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----|
29 * | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | RG | RB | RS | RZ |
30 * `---------------------------------' `------------------------------'
31 * ,---------------, .---------------.
32 * | NUM | LA | LO | | RE | RU | NUM |
33 * `---------------' `---------------'
34 */
35
36// YOU MUST ORDER THIS!
37// P Will return from processing on the first match it finds. Therefore
38// PJ Will run the requested action, remove the matched chord and continue
39//
40// First any chords that would conflict with PJs need to be checked, then PJs, lastly Ps.
41// For all chords should be ordered by length in their section!
42//
43// http://docs.gboards.ca
44bool processQwerty(void) {
45 // Place P's that would be trashed by PJ's here
46 P( RT | RS | RD | RZ | NUM, SEND_STRING(VERSION); SEND_STRING(__DATE__));
47 P( NUM | LA | LO | RE | RU, SEND(KC_MPLY));
48 P( ST1 | ST2 | ST3 | ST4, SEND(KC_BSPC));
49
50 // Thumb Chords
51 P( LA | LO | RE | RU, SEND(KC_CAPS));
52 P( LA | RU, SEND(KC_ESC));
53 PJ( LO | RE, SEND(KC_LCTL));
54 PJ( NUM | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT));
55 PJ( NUM | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT));
56
57 // Mods
58 PJ( RT | RD | RS | RZ, SEND(KC_LGUI));
59 PJ( RT | RD, SEND(KC_LCTL));
60 PJ( RS | RZ, SEND(KC_LALT));
61 PJ( LA | NUM, SEND(KC_LCTL));
62 PJ( LA | LO, SEND(KC_LALT));
63 PJ( LO, SEND(KC_LSFT));
64
65 // Function Layer
66 P( FUNCT | RF | RR, SEND(KC_F5));
67 P( FUNCT | RP | RB, SEND(KC_F6));
68 P( FUNCT | RL | RG, SEND(KC_F7));
69 P( FUNCT | RT | RS, SEND(KC_F8));
70 P( FUNCT | RF, SEND(KC_F1));
71 P( FUNCT | RP, SEND(KC_F2));
72 P( FUNCT | RL, SEND(KC_F3));
73 P( FUNCT | RT, SEND(KC_F4));
74 P( FUNCT | RR, SEND(KC_F9));
75 P( FUNCT | RG, SEND(KC_F10));
76 P( FUNCT | RB, SEND(KC_F11));
77 P( FUNCT | RS, SEND(KC_F12));
78
79 // Movement Layer
80 P( MOVE | RF, SEND(KC_LEFT));
81 P( MOVE | RP, SEND(KC_DOWN));
82 P( MOVE | RL, SEND(KC_UP));
83 P( MOVE | RT, SEND(KC_RIGHT));
84 P( MOVE | ST3, SEND(KC_PGUP));
85 P( MOVE | ST4, SEND(KC_PGDN));
86
87 // Media Layer
88 P( MEDIA | RF, SEND(KC_MPRV));
89 P( MEDIA | RP, SEND(KC_MPLY));
90 P( MEDIA | RL, SEND(KC_MPLY));
91 P( MEDIA | RT, SEND(KC_MNXT));
92 P( MEDIA | RD, SEND(KC_VOLU));
93 P( MEDIA | RZ, SEND(KC_VOLD));
94 P( MEDIA | RS, SEND(KC_MUTE));
95
96 // Mouse Keys
97 P( LP | LH, clickMouse(KC_MS_BTN1));
98 P( LW | LR, clickMouse(KC_MS_BTN2));
99
100 // Number Row
101 P( NUM | LSU, SEND(KC_1));
102 P( NUM | LFT, SEND(KC_2));
103 P( NUM | LP, SEND(KC_3));
104 P( NUM | LH, SEND(KC_4));
105 P( NUM | ST1, SEND(KC_5));
106 P( NUM | ST3, SEND(KC_6));
107 P( NUM | RF, SEND(KC_7));
108 P( NUM | RP, SEND(KC_8));
109 P( NUM | RL, SEND(KC_9));
110 P( NUM | RT, SEND(KC_0));
111 P( NUM | LA, SEND(KC_5));
112 P( NUM | RT, SEND(KC_0));
113
114 // Specials
115 P( LA | NUM, SEND(KC_ESC));
116 P( RU | NUM, SEND(KC_TAB));
117 P( RE | RU, SEND(KC_BSPC));
118 P( RD | RZ, SEND(KC_ENT));
119 P( RE, SEND(KC_ENT));
120 P( RD, SEND(KC_BSPC));
121 P( NUM, SEND(KC_BSPC));
122 P( LA, SEND(KC_SPC));
123 P( RU, SEND(KC_SPC));
124 P( RZ, SEND(KC_ESC));
125
126 // Letters
127 P( LSU | LSD, SEND(KC_A));
128 P( LFT | LK, SEND(KC_S));
129 P( LP | LW, SEND(KC_D));
130 P( LH | LR, SEND(KC_F));
131 P( ST1 | ST2, SEND(KC_G));
132 P( ST3 | ST4, SEND(KC_H));
133 P( RF | RR, SEND(KC_J));
134 P( RT | RS, SEND(KC_SCLN))
135 P( RG | RL, SEND(KC_L));
136 P( RP | RB, SEND(KC_K));
137 P( LSU, SEND(KC_Q));
138 P( LSD, SEND(KC_Z));
139 P( LFT, SEND(KC_W));
140 P( LK, SEND(KC_X));
141 P( LP, SEND(KC_E));
142 P( LW, SEND(KC_C));
143 P( LH, SEND(KC_R));
144 P( LR, SEND(KC_V));
145 P( ST1, SEND(KC_T));
146 P( ST2, SEND(KC_B));
147 P( ST3, SEND(KC_Y));
148 P( ST4, SEND(KC_N));
149 P( RF, SEND(KC_U));
150 P( RR, SEND(KC_M));
151 P( RP, SEND(KC_I));
152 P( RB, SEND(KC_COMM));
153 P( RL, SEND(KC_O));
154 P( RG, SEND(KC_DOT));
155 P( RT, SEND(KC_P));
156 P( RS, SEND(KC_SLSH));
157
158 // Symbols and Numbers
159 P( PWR | RE | RU, SEND(KC_ENT));
160 P( PWR | LA | LO, SEND(KC_SPC));
161 P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // (
162 P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // )
163 P( PWR | ST1 | ST2, SEND(KC_GRV)); // `
164 P( PWR | RD | RZ, SEND(KC_ESC));
165 P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // #
166 P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $
167 P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // !
168 P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // %
169 P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @
170 P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^
171 P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // {
172 P( PWR | LW, SEND(KC_LBRC));
173 P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // }
174 P( PWR | LR, SEND(KC_RBRC));
175 P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // |
176 P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~
177 P( PWR | ST3, SEND(KC_QUOT));
178 P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // "
179 P( PWR | RF, SEND(KC_KP_PLUS));
180 P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // &
181 P( PWR | RP, SEND(KC_MINS));
182 P( PWR | RB, SEND(KC_EQL));
183 P( PWR | RL, SEND(KC_SLSH));
184 P( PWR | RG, SEND(KC_COMM));
185 P( PWR | RT, SEND(KC_PAST));
186 P( PWR | RS, SEND(KC_DOT));
187 P( PWR | RD, SEND(KC_TAB));
188 P( PWR | LA, SEND(KC_SCLN));
189 P( PWR | LO, SEND(KC_SLSH));
190 P( PWR | RE, SEND(KC_SCLN));
191 P( PWR | RU, SEND(KC_SLSH));
192
193
194 // If we make here, send as a steno chord
195 // If plover is running we can hook that host side
196 return false;
197}
198
199#define STENO_LAYER 0
200
201// "Layers"
202// Steno layer should be first in your map.
203// When PWR | FN | RR | RG | RB | RS is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end.
204// If you have only a single layer, you must set SINGLELAYER = yes in your rules.mk, otherwise you may experince undefined behaviour
205
206const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
207// Main layer, everything goes through here
208[STENO_LAYER] = LAYOUT_georgi(
209STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
210STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
211 STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N1)
212};
213
214int getKeymapCount(void) {
215 return sizeof(keymaps)/sizeof(keymaps[0]);
216}
diff --git a/keyboards/georgi/keymaps/template/readme.md b/keyboards/georgi/keymaps/template/readme.md
deleted file mode 100644
index 7c6fc3512..000000000
--- a/keyboards/georgi/keymaps/template/readme.md
+++ /dev/null
@@ -1,6 +0,0 @@
1# Georgi QWERTY/Steno firmware
2
3This is a blank template configured with 5K of free space for your onboard dictionary!
4Read the docs over at [gBoards](http://docs.gboards.ca)
5
6Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
diff --git a/keyboards/georgi/readme.md b/keyboards/georgi/readme.md
index 03e2e3d83..d86994883 100644
--- a/keyboards/georgi/readme.md
+++ b/keyboards/georgi/readme.md
@@ -21,8 +21,11 @@ To just test your build with the default keymap
21 21
22Build options can be enabled/disabled in keyboards/georgi/keymaps/default/rules.mk . Copy the default directory and make any changes to your layout, if you think they're worth sharing submit a PR! 22Build options can be enabled/disabled in keyboards/georgi/keymaps/default/rules.mk . Copy the default directory and make any changes to your layout, if you think they're worth sharing submit a PR!
23 23
24## Documentation
25Is hosted over on [docs.gboards.ca](http://docs.gboards.ca/). Please take a look at the docs for customizing your firmware!
26
24# Space 27# Space
25The stock firmware uses nearly all of the flash avalible. For custom dictionary modifications, disable mousekeys in your keymaps rules.mk (4K of space) and remove the Gaming layers. I've done this already in the provided keymap 'template'. 28The stock firmware leaves 7K free for custom entries. For extra space disable mousekeys in your keymaps rules.mk (3K of space) and remove the Gaming layers (1k).
26 29
27See 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). 30See 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).
28 31
diff --git a/keyboards/georgi/rules.mk b/keyboards/georgi/rules.mk
index 0f730f3b7..a87b448e3 100644
--- a/keyboards/georgi/rules.mk
+++ b/keyboards/georgi/rules.mk
@@ -4,7 +4,7 @@
4# Do not edit this file! Make a copy of keymaps/default and modify that! 4# Do not edit this file! Make a copy of keymaps/default and modify that!
5#---------------------------------------------------------------------------- 5#----------------------------------------------------------------------------
6# Source includes 6# Source includes
7SRC += matrix.c i2c_master.c 7SRC += matrix.c i2c_master.c sten.c
8 8
9# Hardware info 9# Hardware info
10MCU = atmega32u4 10MCU = atmega32u4
@@ -15,8 +15,9 @@ F_USB = $(F_CPU)
15EXTRAFLAGS += -flto 15EXTRAFLAGS += -flto
16 16
17CUSTOM_MATRIX = yes 17CUSTOM_MATRIX = yes
18MOUSEKEY_ENABLE = no
18STENO_ENABLE = yes 19STENO_ENABLE = yes
19EXTRAKEY_ENABLE = yes 20EXTRAKEY_ENABLE = yes
20CONSOLE_ENABLE = no 21CONSOLE_ENABLE = yes
21COMMAND_ENABLE = no 22COMMAND_ENABLE = no
22NKRO_ENABLE = yes 23NKRO_ENABLE = yes
diff --git a/keyboards/georgi/sten.c b/keyboards/georgi/sten.c
index 3b33b11d6..1a84c7893 100644
--- a/keyboards/georgi/sten.c
+++ b/keyboards/georgi/sten.c
@@ -1,2 +1,406 @@
1#include "sten.h" 1#include "sten.h"
2 2
3// Chord state
4uint32_t cChord = 0; // Current Chord
5int chordIndex = 0; // Keys in previousachord
6int32_t chordState[32]; // Full Chord history
7#define QWERBUF 24 // Size of chords to buffer for output
8
9bool repeatFlag = false; // Should we repeat?
10uint32_t pChord = 0; // Previous Chord
11int pChordIndex = 0; // Keys in previousachord
12uint32_t pChordState[32]; // Previous chord sate
13uint32_t stickyBits = 0; // Or'd with every incoming press
14
15// Mode state
16enum MODE { STENO = 0, QWERTY, COMMAND };
17enum MODE pMode;
18bool QWERSTENO = false;
19#ifdef ONLYQWERTY
20enum MODE cMode = QWERTY;
21#else
22enum MODE cMode = STENO;
23#endif
24
25// Command State
26#define MAX_CMD_BUF 20
27uint8_t CMDLEN = 0;
28uint8_t CMDBUF[MAX_CMD_BUF];
29
30// Key Repeat state
31bool inChord = false;
32bool repEngaged = false;
33uint16_t repTimer = 0;
34#define REP_INIT_DELAY 750
35#define REP_DELAY 25
36
37// Mousekeys state
38bool inMouse = false;
39int8_t mousePress;
40
41// All processing done at chordUp goes through here
42bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]) {
43 // Check for mousekeys, this is release
44#ifdef MOUSEKEY_ENABLE
45 if (inMouse) {
46 inMouse = false;
47 mousekey_off(mousePress);
48 mousekey_send();
49 }
50#endif
51
52 // Toggle Serial/QWERTY steno
53 if (cChord == (PWR | FN | ST1 | ST2)) {
54#ifndef NO_DEBUG
55 uprintf("Fallback Toggle\n");
56#endif
57 QWERSTENO = !QWERSTENO;
58
59 goto out;
60 }
61
62 // handle command mode
63 if (cChord == (PWR | FN | RD | RZ)) {
64#ifndef NO_DEBUG
65 uprintf("COMMAND Toggle\n");
66#endif
67 if (cMode != COMMAND) { // Entering Command Mode
68 CMDLEN = 0;
69 pMode = cMode;
70 cMode = COMMAND;
71 } else { // Exiting Command Mode
72 cMode = pMode;
73
74 // Press all and release all
75 for (int i = 0; i < CMDLEN; i++) {
76 register_code(CMDBUF[i]);
77 }
78 clear_keyboard();
79 }
80
81 goto out;
82 }
83
84 // Handle Gaming Toggle,
85 if (cChord == (PWR | FN | ST4 | ST3) && keymapsCount > 1) {
86#ifndef NO_DEBUG
87 uprintf("Switching to QMK\n");
88#endif
89 layer_on(1);
90 goto out;
91 }
92
93 // Lone FN press, toggle QWERTY
94#ifndef ONLYQWERTY
95 if (cChord == FN) {
96 (cMode == STENO) ? (cMode = QWERTY) : (cMode = STENO);
97 goto out;
98 }
99#endif
100
101 // Check for Plover momentary
102 if (cMode == QWERTY && (cChord & FN)) {
103 cChord ^= FN;
104 goto steno;
105 }
106
107 // Do QWERTY and Momentary QWERTY
108 if (cMode == QWERTY || (cMode == COMMAND) || (cChord & (FN | PWR))) {
109 processChord(false);
110 goto out;
111 }
112
113 // Fallback NKRO Steno
114 if (cMode == STENO && QWERSTENO) {
115 processChord(true);
116 goto out;
117 }
118
119steno:
120 // Hey that's a steno chord!
121 inChord = false;
122 chordIndex = 0;
123 cChord = 0;
124 return true;
125
126out:
127 cChord = 0;
128 inChord = false;
129 chordIndex = 0;
130 clear_keyboard();
131 repEngaged = false;
132 for (int i = 0; i < 32; i++)
133 chordState[i] = 0xFFFF;
134
135 return false;
136}
137
138// Update Chord State
139bool process_steno_user(uint16_t keycode, keyrecord_t *record) {
140 // Everything happens in here when steno keys come in.
141 // Bail on keyup
142 if (!record->event.pressed) return true;
143
144 // Update key repeat timers
145 repTimer = timer_read();
146 inChord = true;
147
148 // Switch on the press adding to chord
149 bool pr = record->event.pressed;
150 switch (keycode) {
151 // Mods and stuff
152 case STN_ST1: pr ? (cChord |= (ST1)): (cChord &= ~(ST1)); break;
153 case STN_ST2: pr ? (cChord |= (ST2)): (cChord &= ~(ST2)); break;
154 case STN_ST3: pr ? (cChord |= (ST3)): (cChord &= ~(ST3)); break;
155 case STN_ST4: pr ? (cChord |= (ST4)): (cChord &= ~(ST4)); break;
156 case STN_FN: pr ? (cChord |= (FN)) : (cChord &= ~(FN)); break;
157 case STN_PWR: pr ? (cChord |= (PWR)): (cChord &= ~(PWR)); break;
158 case STN_N1...STN_N6: pr ? (cChord |= (LNO)): (cChord &= ~(LNO)); break;
159 case STN_N7...STN_NC: pr ? (cChord |= (RNO)): (cChord &= ~(RNO)); break;
160
161 // All the letter keys
162 case STN_S1: pr ? (cChord |= (LSU)) : (cChord &= ~(LSU)); break;
163 case STN_S2: pr ? (cChord |= (LSD)) : (cChord &= ~(LSD)); break;
164 case STN_TL: pr ? (cChord |= (LFT)) : (cChord &= ~(LFT)); break;
165 case STN_KL: pr ? (cChord |= (LK)) : (cChord &= ~(LK)); break;
166 case STN_PL: pr ? (cChord |= (LP)) : (cChord &= ~(LP)); break;
167 case STN_WL: pr ? (cChord |= (LW)) : (cChord &= ~(LW)); break;
168 case STN_HL: pr ? (cChord |= (LH)) : (cChord &= ~(LH)); break;
169 case STN_RL: pr ? (cChord |= (LR)) : (cChord &= ~(LR)); break;
170 case STN_A: pr ? (cChord |= (LA)) : (cChord &= ~(LA)); break;
171 case STN_O: pr ? (cChord |= (LO)) : (cChord &= ~(LO)); break;
172 case STN_E: pr ? (cChord |= (RE)) : (cChord &= ~(RE)); break;
173 case STN_U: pr ? (cChord |= (RU)) : (cChord &= ~(RU)); break;
174 case STN_FR: pr ? (cChord |= (RF)) : (cChord &= ~(RF)); break;
175 case STN_RR: pr ? (cChord |= (RR)) : (cChord &= ~(RR)); break;
176 case STN_PR: pr ? (cChord |= (RP)) : (cChord &= ~(RP)); break;
177 case STN_BR: pr ? (cChord |= (RB)) : (cChord &= ~(RB)); break;
178 case STN_LR: pr ? (cChord |= (RL)) : (cChord &= ~(RL)); break;
179 case STN_GR: pr ? (cChord |= (RG)) : (cChord &= ~(RG)); break;
180 case STN_TR: pr ? (cChord |= (RT)) : (cChord &= ~(RT)); break;
181 case STN_SR: pr ? (cChord |= (RS)) : (cChord &= ~(RS)); break;
182 case STN_DR: pr ? (cChord |= (RD)) : (cChord &= ~(RD)); break;
183 case STN_ZR: pr ? (cChord |= (RZ)) : (cChord &= ~(RZ)); break;
184 }
185
186 // Store previous state for fastQWER
187 if (pr) {
188 chordState[chordIndex] = cChord;
189 chordIndex++;
190 }
191
192 return true;
193}
194void matrix_scan_user(void) {
195 // We abuse this for early sending of key
196 // Key repeat only on QWER/SYMB layers
197 if (cMode != QWERTY || !inChord) return;
198
199 // Check timers
200#ifndef NO_REPEAT
201 if (repEngaged && timer_elapsed(repTimer) > REP_DELAY) {
202 // Process Key for report
203 processChord(false);
204
205 // Send report to host
206 send_keyboard_report();
207 clear_keyboard();
208 repTimer = timer_read();
209 }
210
211 if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) {
212 repEngaged = true;
213 }
214#endif
215};
216
217// For Plover NKRO
218uint32_t processFakeSteno(bool lookup) {
219 P( LSU, SEND(KC_Q););
220 P( LSD, SEND(KC_A););
221 P( LFT, SEND(KC_W););
222 P( LP, SEND(KC_E););
223 P( LH, SEND(KC_R););
224 P( LK, SEND(KC_S););
225 P( LW, SEND(KC_D););
226 P( LR, SEND(KC_F););
227 P( ST1, SEND(KC_T););
228 P( ST2, SEND(KC_G););
229 P( LA, SEND(KC_C););
230 P( LO, SEND(KC_V););
231 P( RE, SEND(KC_N););
232 P( RU, SEND(KC_M););
233 P( ST3, SEND(KC_Y););
234 P( ST4, SEND(KC_H););
235 P( RF, SEND(KC_U););
236 P( RP, SEND(KC_I););
237 P( RL, SEND(KC_O););
238 P( RT, SEND(KC_P););
239 P( RD, SEND(KC_LBRC););
240 P( RR, SEND(KC_J););
241 P( RB, SEND(KC_K););
242 P( RG, SEND(KC_L););
243 P( RS, SEND(KC_SCLN););
244 P( RZ, SEND(KC_COMM););
245 P( LNO, SEND(KC_1););
246 P( RNO, SEND(KC_1););
247
248 return 0;
249}
250
251// Traverse the chord history to a given point
252// Returns the mask to use
253void processChord(bool useFakeSteno) {
254 // Save the clean chord state
255 uint32_t savedChord = cChord;
256
257 // Apply Stick Bits if needed
258 if (stickyBits != 0) {
259 cChord |= stickyBits;
260 for (int i = 0; i <= chordIndex; i++)
261 chordState[i] |= stickyBits;
262 }
263
264 // Strip FN
265 if (cChord & FN) cChord ^= FN;
266
267 // First we test if a whole chord was passsed
268 // If so we just run it handling repeat logic
269 if (useFakeSteno && processFakeSteno(true) == cChord) {
270 processFakeSteno(false);
271 return;
272 } else if (processQwerty(true) == cChord) {
273 processQwerty(false);
274 // Repeat logic
275 if (repeatFlag) {
276 restoreState();
277 repeatFlag = false;
278 processChord(false);
279 } else {
280 saveState(cChord);
281 }
282 return;
283 }
284
285 // Iterate through chord picking out the individual
286 // and longest chords
287 uint32_t bufChords[QWERBUF];
288 int bufLen = 0;
289 uint32_t mask = 0;
290
291 // We iterate over it multiple times to catch the longest
292 // chord. Then that gets addded to the mask and re run.
293 while (savedChord != mask) {
294 uint32_t test = 0;
295 uint32_t longestChord = 0;
296
297 for (int i = 0; i <= chordIndex; i++) {
298 cChord = chordState[i] & ~mask;
299 if (cChord == 0)
300 continue;
301
302 // Assume mid parse Sym is new chord
303 if (i != 0 && test != 0 && (cChord ^ test) == PWR) {
304 longestChord = test;
305 break;
306 }
307
308 // Lock SYM layer in once detected
309 if (mask & PWR)
310 cChord |= PWR;
311
312
313 // Testing for keycodes
314 if (useFakeSteno) {
315 test = processFakeSteno(true);
316 } else {
317 test = processQwerty(true);
318 }
319
320 if (test != 0) {
321 longestChord = test;
322 }
323 }
324
325 mask |= longestChord;
326 bufChords[bufLen] = longestChord;
327 bufLen++;
328
329 // That's a loop of sorts, halt processing
330 if (bufLen >= QWERBUF) {
331 return;
332 }
333 }
334
335 // Now that the buffer is populated, we run it
336 for (int i = 0; i < bufLen ; i++) {
337 cChord = bufChords[i];
338 if (useFakeSteno) {
339 processFakeSteno(false);
340 } else {
341 processQwerty(false);
342 }
343 }
344
345 // Save state in case of repeat
346 if (!repeatFlag) {
347 saveState(savedChord);
348 }
349
350 // Restore cChord for held repeat
351 cChord = savedChord;
352
353 return;
354}
355void saveState(uint32_t cleanChord) {
356 pChord = cleanChord;
357 pChordIndex = chordIndex;
358 for (int i = 0; i < 32; i++)
359 pChordState[i] = chordState[i];
360}
361void restoreState() {
362 cChord = pChord;
363 chordIndex = pChordIndex;
364 for (int i = 0; i < 32; i++)
365 chordState[i] = pChordState[i];
366}
367
368// Macros for calling from keymap.c
369void SEND(uint8_t kc) {
370 // Send Keycode, Does not work for Quantum Codes
371 if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) {
372#ifndef NO_DEBUG
373 uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF);
374#endif
375 CMDBUF[CMDLEN] = kc;
376 CMDLEN++;
377 }
378
379 if (cMode != COMMAND) register_code(kc);
380 return;
381}
382void REPEAT(void) {
383 if (cMode != QWERTY)
384 return;
385
386 repeatFlag = true;
387 return;
388}
389void SET_STICKY(uint32_t stick) {
390 stickyBits = stick;
391 return;
392}
393void SWITCH_LAYER(int layer) {
394 if (keymapsCount >= layer)
395 layer_on(layer);
396}
397void CLICK_MOUSE(uint8_t kc) {
398#ifdef MOUSEKEY_ENABLE
399 mousekey_on(kc);
400 mousekey_send();
401
402 // Store state for later use
403 inMouse = true;
404 mousePress = kc;
405#endif
406}
diff --git a/keyboards/georgi/sten.h b/keyboards/georgi/sten.h
index fee05deca..5a9771d9a 100644
--- a/keyboards/georgi/sten.h
+++ b/keyboards/georgi/sten.h
@@ -1,28 +1,43 @@
1// 2019, g Heavy Industries 1// 2019, g Heavy Industries
2// Blessed mother of Christ, please keep this readable
3// and protect us from segfaults. For thine is the clock,
4// the slave and the master. Until we return from main.
5//
6// Amen.
2 7
3#include QMK_KEYBOARD_H 8#include QMK_KEYBOARD_H
4#include "mousekey.h" 9#include "mousekey.h"
5#include "keymap.h" 10#include "keymap.h"
6#include "keymap_steno.h" 11#include "keymap_steno.h"
12#include "wait.h"
7 13
8// Bitfield representing the current chord 14extern size_t keymapsCount; // Total keymaps
9uint32_t cChord = 0; 15extern uint32_t cChord; // Current Chord
10 16
11// See if a given chord is pressed. 17// Function defs
12// P will return 18void processChord(bool useFakeSteno);
13// PJ will continue processing, removing the found chord 19uint32_t processQwerty(bool lookup);
14#define P(chord, act) if (cChord == (chord)) { act; return true; } 20uint32_t processFakeSteno(bool lookup);
15#define PJ(chord, act) if ((cChord & (chord)) == (chord)) { cChord ^= chord; act; } 21void saveState(uint32_t cChord);
22void restoreState(void);
23
24// Macros for use in keymap.c
25void SEND(uint8_t kc);
26void REPEAT(void);
27void SET_STICKY(uint32_t);
28void SWITCH_LAYER(int);
29void CLICK_MOUSE(uint8_t);
30
31// Keymap helper
32#define P(chord, act) if (cChord == (chord)) { if (!lookup) {act;} return chord;}
16 33
17// All Steno Codes
18// Shift to internal representation 34// Shift to internal representation
35// i.e) S(teno)R(ight)F
19#define STN(n) (1L<<n) 36#define STN(n) (1L<<n)
20
21//i.e) S(teno)R(ight)F
22enum ORDER { 37enum ORDER {
23 SFN = 0, SPWR, SST1, SST2, SST3, SST4, SNUM, 38 SFN = 0, SPWR, SST1, SST2, SST3, SST4, SNUML, SNUMR,
24 SLSU, SLSD, SLT, SLK, SLP, SLW, SLH, SLR, SLA, SLO, 39 SLSU, SLSD, SLT, SLK, SLP, SLW, SLH, SLR, SLA, SLO,
25 SRE, SRU, SRF, SRR, SRP, SRB, SRL, SRG, SRT, SRS, SRD, SRZ 40 SRE, SRU, SRF, SRR, SRP, SRB, SRL, SRG, SRT, SRS, SRD, SRZ, SRES1, SRES2
26}; 41};
27 42
28// Break it all out 43// Break it all out
@@ -32,11 +47,14 @@ enum ORDER {
32#define ST2 STN(SST2) 47#define ST2 STN(SST2)
33#define ST3 STN(SST3) 48#define ST3 STN(SST3)
34#define ST4 STN(SST4) 49#define ST4 STN(SST4)
35#define NUM STN(SNUM) // No distinction between left and right 50#define LNO STN(SNUML) // STN1-6
51#define RNO STN(SNUMR) // STN7-C
52#define RES1 STN(SRES1) // Use reserved for sticky state
53#define RES2 STN(SRES2)
36 54
37#define LSU STN(SLSU) 55#define LSU STN(SLSU)
38#define LSD STN(SLSD) 56#define LSD STN(SLSD)
39#define LFT STN(SLT) // (L)e(F)t (T), preprocessor conflict 57#define LFT STN(SLT) // (L)e(F)t (T), preprocessor conflict
40#define LK STN(SLK) 58#define LK STN(SLK)
41#define LP STN(SLP) 59#define LP STN(SLP)
42#define LW STN(SLW) 60#define LW STN(SLW)
@@ -57,234 +75,3 @@ enum ORDER {
57#define RS STN(SRS) 75#define RS STN(SRS)
58#define RD STN(SRD) 76#define RD STN(SRD)
59#define RZ STN(SRZ) 77#define RZ STN(SRZ)
60
61bool processQwerty(void);
62bool processFakeSteno(void);
63void clickMouse(uint8_t kc);
64void SEND(uint8_t kc);
65extern int getKeymapCount(void);
66
67// Mode state
68enum MODE { STENO = 0, QWERTY, COMMAND };
69enum MODE cMode = STENO;
70enum MODE pMode;
71bool QWERSTENO = false;
72
73// Command State
74#define MAX_CMD_BUF 20
75uint8_t CMDBUF[MAX_CMD_BUF];
76uint8_t CMDLEN = 0;
77
78// Key Repeat state
79bool inChord = false;
80uint16_t repTimer = 0;
81#define REP_DELAY 300
82
83// Mousekeys state
84bool inMouse = false;
85int8_t mousePress;
86
87// All processing done at chordUp goes through here
88bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]) {
89 // Check for mousekeys, this is release
90#ifdef MOUSEKEY_ENABLE
91 if (inMouse) {
92 inMouse = false;
93 mousekey_off(mousePress);
94 mousekey_send();
95 }
96#endif
97
98 // Toggle Serial/QWERTY steno
99 if (cChord == (PWR | FN | ST1 | ST2)) {
100 uprintf("Fallback Toggle\n");
101 QWERSTENO = !QWERSTENO;
102
103 goto out;
104 }
105
106 // handle command mode
107 if (cChord == (PWR | FN | RD | RZ)) {
108 uprintf("COMMAND Toggle\n");
109 if (cMode != COMMAND) { // Entering Command Mode
110 CMDLEN = 0;
111 pMode = cMode;
112 cMode = COMMAND;
113 } else { // Exiting Command Mode
114 cMode = pMode;
115
116 // Press all and release all
117 for (int i = 0; i < CMDLEN; i++) {
118 register_code(CMDBUF[i]);
119 }
120 clear_keyboard();
121 }
122
123 goto out;
124 }
125
126 // Handle Gaming Toggle,
127 if (cChord == (PWR | FN | ST2 | ST3) && getKeymapCount() > 1) {
128 uprintf("Switching to QMK\n");
129 layer_on(1);
130 goto out;
131 }
132
133 // Lone FN press, toggle QWERTY
134 if (cChord == FN) {
135 (cMode == STENO) ? (cMode = QWERTY) : (cMode = STENO);
136 goto out;
137 }
138
139 // Check for Plover momentary
140 if (cMode == QWERTY && (cChord & FN)) {
141 cChord ^= FN;
142 goto steno;
143 }
144
145 // Do QWERTY and Momentary QWERTY
146 if (cMode == QWERTY || (cMode == COMMAND) || (cChord & (FN | PWR))) {
147 if (cChord & FN) cChord ^= FN;
148 processQwerty();
149 goto out;
150 }
151
152 // Fallback NKRO Steno
153 if (cMode == STENO && QWERSTENO) {
154 processFakeSteno();
155 goto out;
156 }
157
158steno:
159 // Hey that's a steno chord!
160 inChord = false;
161 cChord = 0;
162 return true;
163
164out:
165 inChord = false;
166 clear_keyboard();
167 cChord = 0;
168 return false;
169}
170
171// Update Chord State
172bool process_steno_user(uint16_t keycode, keyrecord_t *record) {
173 // Everything happens in here when steno keys come in.
174 // Bail on keyup
175 if (!record->event.pressed) return true;
176
177 // Update key repeat timers
178 repTimer = timer_read();
179 inChord = true;
180
181 // Switch on the press adding to chord
182 bool pr = record->event.pressed;
183 switch (keycode) {
184 // Mods and stuff
185 case STN_ST1: pr ? (cChord |= (ST1)): (cChord &= ~(ST1)); break;
186 case STN_ST2: pr ? (cChord |= (ST2)): (cChord &= ~(ST2)); break;
187 case STN_ST3: pr ? (cChord |= (ST3)): (cChord &= ~(ST3)); break;
188 case STN_ST4: pr ? (cChord |= (ST4)): (cChord &= ~(ST4)); break;
189 case STN_FN: pr ? (cChord |= (FN)) : (cChord &= ~(FN)); break;
190 case STN_PWR: pr ? (cChord |= (PWR)): (cChord &= ~(PWR)); break;
191 case STN_N1...STN_N6:
192 case STN_N7...STN_NC: pr ? (cChord |= (NUM)): (cChord &= ~(NUM)); break;
193
194 // All the letter keys
195 case STN_S1: pr ? (cChord |= (LSU)) : (cChord &= ~(LSU)); break;
196 case STN_S2: pr ? (cChord |= (LSD)) : (cChord &= ~(LSD)); break;
197 case STN_TL: pr ? (cChord |= (LFT)) : (cChord &= ~(LFT)); break;
198 case STN_KL: pr ? (cChord |= (LK)) : (cChord &= ~(LK)); break;
199 case STN_PL: pr ? (cChord |= (LP)) : (cChord &= ~(LP)); break;
200 case STN_WL: pr ? (cChord |= (LW)) : (cChord &= ~(LW)); break;
201 case STN_HL: pr ? (cChord |= (LH)) : (cChord &= ~(LH)); break;
202 case STN_RL: pr ? (cChord |= (LR)) : (cChord &= ~(LR)); break;
203 case STN_A: pr ? (cChord |= (LA)) : (cChord &= ~(LA)); break;
204 case STN_O: pr ? (cChord |= (LO)) : (cChord &= ~(LO)); break;
205 case STN_E: pr ? (cChord |= (RE)) : (cChord &= ~(RE)); break;
206 case STN_U: pr ? (cChord |= (RU)) : (cChord &= ~(RU)); break;
207 case STN_FR: pr ? (cChord |= (RF)) : (cChord &= ~(RF)); break;
208 case STN_RR: pr ? (cChord |= (RR)) : (cChord &= ~(RR)); break;
209 case STN_PR: pr ? (cChord |= (RP)) : (cChord &= ~(RP)); break;
210 case STN_BR: pr ? (cChord |= (RB)) : (cChord &= ~(RB)); break;
211 case STN_LR: pr ? (cChord |= (RL)) : (cChord &= ~(RL)); break;
212 case STN_GR: pr ? (cChord |= (RG)) : (cChord &= ~(RG)); break;
213 case STN_TR: pr ? (cChord |= (RT)) : (cChord &= ~(RT)); break;
214 case STN_SR: pr ? (cChord |= (RS)) : (cChord &= ~(RS)); break;
215 case STN_DR: pr ? (cChord |= (RD)) : (cChord &= ~(RD)); break;
216 case STN_ZR: pr ? (cChord |= (RZ)) : (cChord &= ~(RZ)); break;
217 }
218
219 // Check for key repeat in QWERTY mode
220 return true;
221}
222void matrix_scan_user(void) {
223 // We abuse this for early sending of key
224 // Key repeat only on QWER/SYMB layers
225 if (cMode != QWERTY) return;
226
227 // Check timers
228 if (timer_elapsed(repTimer) > REP_DELAY) {
229 // Process Key for report
230 processQwerty();
231
232 // Send report to host
233 send_keyboard_report();
234 repTimer = timer_read();
235 }
236};
237
238// Helpers
239bool processFakeSteno(void) {
240 PJ( LSU, SEND(KC_Q););
241 PJ( LSD, SEND(KC_A););
242 PJ( LFT, SEND(KC_W););
243 PJ( LP, SEND(KC_E););
244 PJ( LH, SEND(KC_R););
245 PJ( LK, SEND(KC_S););
246 PJ( LW, SEND(KC_D););
247 PJ( LR, SEND(KC_F););
248 PJ( ST1, SEND(KC_T););
249 PJ( ST2, SEND(KC_G););
250 PJ( LA, SEND(KC_C););
251 PJ( LO, SEND(KC_V););
252 PJ( RE, SEND(KC_N););
253 PJ( RU, SEND(KC_M););
254 PJ( ST3, SEND(KC_Y););
255 PJ( ST4, SEND(KC_H););
256 PJ( RF, SEND(KC_U););
257 PJ( RP, SEND(KC_I););
258 PJ( RL, SEND(KC_O););
259 PJ( RT, SEND(KC_P););
260 PJ( RD, SEND(KC_LBRC););
261 PJ( RR, SEND(KC_J););
262 PJ( RB, SEND(KC_K););
263 PJ( RG, SEND(KC_L););
264 PJ( RS, SEND(KC_SCLN););
265 PJ( RZ, SEND(KC_COMM););
266 PJ( NUM, SEND(KC_1););
267
268 return false;
269}
270void clickMouse(uint8_t kc) {
271#ifdef MOUSEKEY_ENABLE
272 mousekey_on(kc);
273 mousekey_send();
274
275 // Store state for later use
276 inMouse = true;
277 mousePress = kc;
278#endif
279}
280void SEND(uint8_t kc) {
281 // Send Keycode, Does not work for Quantum Codes
282 if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) {
283 uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF);
284 CMDBUF[CMDLEN] = kc;
285 CMDLEN++;
286 }
287
288 if (cMode != COMMAND) register_code(kc);
289 return;
290}
diff --git a/keyboards/gergo/keymaps/default/rules.mk b/keyboards/gergo/keymaps/default/rules.mk
index 2f825a766..507cc97b7 100644
--- a/keyboards/gergo/keymaps/default/rules.mk
+++ b/keyboards/gergo/keymaps/default/rules.mk
@@ -12,7 +12,7 @@ MOUSEKEY_ENABLE = yes # Mouse keys(+4700), needed for baller
12VERBOSE = yes 12VERBOSE = yes
13DEBUG_MATRIX_SCAN_RATE = no 13DEBUG_MATRIX_SCAN_RATE = no
14DEBUG_BALLER = no 14DEBUG_BALLER = no
15DEBUG_MATRIX = no 15DEBUG_MATRIX = yes
16 16
17# A bunch of stuff that you shouldn't touch unless you 17# A bunch of stuff that you shouldn't touch unless you
18# know what you're doing. 18# know what you're doing.
diff --git a/keyboards/gergo/keymaps/germ/keymap.c b/keyboards/gergo/keymaps/germ/keymap.c
new file mode 100644
index 000000000..fabd945fe
--- /dev/null
+++ b/keyboards/gergo/keymaps/germ/keymap.c
@@ -0,0 +1,151 @@
1/* Good on you for modifying your layout! if you don't have
2 * time to read the QMK docs, a list of keycodes can be found at
3 *
4 * https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md
5 *
6 * There's also a template for adding new layers at the bottom of this file!
7 */
8
9#include QMK_KEYBOARD_H
10
11#define IGNORE_MOD_TAP_INTERRUPT
12#define BASE 0 // default layer
13#define SYMB 1 // symbols
14#define NUMB 2 // numbers/motion
15
16// Blank template at the bottom
17
18enum customKeycodes {
19 URL = 1
20};
21
22
23const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
24/* Keymap 0: Basic layer
25 *
26 * ,-------------------------------------------. ,-------------------------------------------.
27 * | L1/ESC | Q | W | E | R | T | | Y | U | I | O | P | | \ |
28 * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
29 * |Ctrl/BS | A | S | D | F | G | RMB | | | H | J | K | L | ; : | ' " |
30 * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
31 * | LShift | Z | X | C | V | B | LMB | | | N | M | , < | . > | / ? | - _ |
32 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
33 * .----------. .-------. .------. .-----.
34 * | Super/Del| |Ent/ALT| | Tab | |BKSP |
35 * '----------' '-------' `------. '-----'
36 * ,-------. ,-------.
37 * | MMB | | PgDn |
38 * ,------|-------| |-------|------.
39 * | SYMB | NUMB | | SYMB | NUMB |
40 * | Space| Escape| | Mod |Space |
41 * | | | | | |
42 * `--------------' `--------------'
43 */
44[BASE] = LAYOUT_GERGO(
45LT(NUMB, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PIPE,
46MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
47KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BTN1, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
48
49 MT(MOD_LGUI, KC_DEL), MT(MOD_LALT, KC_ENT), KC_TAB, KC_BSPC,
50
51 KC_BTN3, KC_PGDN,
52 LT(SYMB, KC_SPC), LT(NUMB, KC_ESC), LT(SYMB, KC_ENT), LT(NUMB, KC_SPC)),
53/* Keymap 1: Symbols layer
54 *
55 * ,-------------------------------------------. ,-------------------------------------------.
56 * | | ! | @ | { | } | | | | | | | | | \ | |
57 * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
58 * | | # | $ | ( | ) | ` | | | | + | - | / | * | % | ' " |
59 * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
60 * | | % | ^ | [ | ] | ~ | | | | & | = | , | . | / ? | - _ |
61 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
62 * .------. .------. .------. .-----.
63 * | | | | | | | DEL |
64 * '------' '------' `------. '-----'
65 * ,-------. ,-------.
66 * | | | PgUp |
67 * ,------|-------| |-------|------.
68 * | | | | | |
69 * | ; | = | | = | ; |
70 * | | | | | |
71 * `--------------' `--------------'
72 */
73[SYMB] = LAYOUT_GERGO(
74KC_TRNS, KC_EXLM, KC_AT, KC_LCBR,KC_RCBR, KC_PIPE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
75KC_TRNS, KC_HASH, KC_DLR, KC_LPRN,KC_RPRN, KC_GRV, KC_TRNS, KC_TRNS, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_PERC, KC_QUOT,
76KC_TRNS, KC_PERC, KC_CIRC,KC_LBRC,KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
77
78 KC_TRNS, KC_TRNS, KC_PGUP, KC_DEL,
79 KC_TRNS, KC_TRNS,
80 KC_SCLN, KC_EQL, KC_EQL, KC_SCLN),
81/* Keymap 2: Pad/Function layer
82 *
83 * ,-------------------------------------------. ,-------------------------------------------.
84 * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
85 * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
86 * | F1 | F2 | F3 | F4 | F5 | F6 | BTN1 | | | LEFT | DOWN | UP | RIGHT|VolDn | VolUp |
87 * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
88 * | F7 | F8 | F9 | F10 | F11 | F12 | BTN2 | | | MLFT | MDWN | MUP | MRGHT|Ply/Pa| Skip |
89 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
90 * .------. .------. .------. .-----.
91 * | | | | | | | |
92 * '------' '------' `------. '-----'
93 * ,-------. ,-------.
94 * | | | PgUp |
95 * ,------|-------| |-------|------.
96 * | | | | | |
97 * | | | | | |
98 * | | | | | |
99 * `--------------' `--------------'
100 */
101[NUMB] = LAYOUT_GERGO(
102KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
103KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLD, KC_VOLU,
104KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_MPLY, KC_MNXT,
105
106 KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS,
107 KC_TRNS, KC_TRNS,
108 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
109};
110
111/* Keymap template
112 *
113 * ,-------------------------------------------. ,-------------------------------------------.
114 * | | | | | | | | | | | | | |
115 * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
116 * | | | | | | | | | | | | | | | |
117 * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
118 * | | | | | | | | | | | | | | | |
119 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
120 * .------. .------. .------. .-----.
121 * | | | | | | | |
122 * '------' '------' `------. '-----'
123 * ,-------. ,-------.
124 * | | | |
125 * ,------|-------| |-------|------.
126 * | | | | | |
127 * | | | | | |
128 * | | | | | |
129 * `--------------' `--------------'
130[SYMB] = LAYOUT_GERGO(
131KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
132KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
133KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
134
135 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
136 KC_TRNS, KC_TRNS,
137 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
138 */
139
140// Runs just one time when the keyboard initializes.
141void matrix_init_user(void) {
142
143};
144
145// Runs constantly in the background, in a loop.
146void matrix_scan_user(void) {
147 //uint8_t layer = biton32(layer_state);
148 biton32(layer_state);
149};
150
151
diff --git a/keyboards/gergo/keymaps/germ/readme.md b/keyboards/gergo/keymaps/germ/readme.md
new file mode 100644
index 000000000..471a20fbd
--- /dev/null
+++ b/keyboards/gergo/keymaps/germ/readme.md
@@ -0,0 +1,10 @@
1# [Gergo! By g Heavy Industries](http://gboards.ca)
2
3![Gergo image](https://4.bp.blogspot.com/-889nMXxgSM0/XCNxwnO5kUI/AAAAAAAA6mI/tZbWgZVCBW0dyZOCGJDkjN06DVax7j8XwCLcBGAs/s1600/48422820_967732713413298_485744639215665152_n.jpg)
4
5This is the default keymap for Gergo, it's based heavily off of the naps62 ErgoDox layout and is aimed at a programmer friendly keymap.
6
7## Settings
8To edit various settings, enable the 1u trackball and whatnot please modify /keyboards/gergo/keymaps/default/rules.mk
9
10Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
diff --git a/keyboards/gergo/keymaps/germ/rules.mk b/keyboards/gergo/keymaps/germ/rules.mk
new file mode 100644
index 000000000..2f825a766
--- /dev/null
+++ b/keyboards/gergo/keymaps/germ/rules.mk
@@ -0,0 +1,36 @@
1#----------------------------------------------------------------------------
2# make gergo:germ:dfu
3# Make sure you have dfu-programmer installed!
4#----------------------------------------------------------------------------
5# Firmware options
6BALLER = yes # Enable to ball out
7BALLSTEP = 20 # Multiple in px to move, multiplied by layer number
8SCROLLSTEP = 1 # Lines to scroll with ball
9MOUSEKEY_ENABLE = yes # Mouse keys(+4700), needed for baller
10
11#Debug options
12VERBOSE = yes
13DEBUG_MATRIX_SCAN_RATE = no
14DEBUG_BALLER = no
15DEBUG_MATRIX = no
16
17# A bunch of stuff that you shouldn't touch unless you
18# know what you're doing.
19#
20# No touchy, capiche?
21SRC += matrix.c i2c_master.c
22ifneq ($(strip $(BALLSTEP)),)
23 OPT_DEFS += -DTRKSTEP=$(strip $(BALLSTEP))
24endif
25ifneq ($(strip $(SCROLLSTEP)),)
26 OPT_DEFS += -DSCROLLSTEP=$(strip $(SCROLLSTEP))
27endif
28ifeq ($(strip $(BALLER)), yes)
29 OPT_DEFS += -DBALLER
30endif
31ifeq ($(strip $(DEBUG_BALLER)), yes)
32 OPT_DEFS += -DDEBUG_BALLER
33endif
34ifeq ($(strip $(DEBUG_MATRIX)), yes)
35 OPT_DEFS += -DDEBUG_MATRIX
36endif