]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboard/planck/keymaps/cbbrowne/keymap.c
Comment things more
[qmk_firmware.git] / keyboard / planck / keymaps / cbbrowne / keymap.c
1 #include "planck.h"
2 #ifdef BACKLIGHT_ENABLE
3   #include "backlight.h"
4 #endif
5
6 /* Each layer is given a name to aid in readability, which is then
7    used in the keymap matrix below.  The underscores do not denote 
8    anything - you can have a layer called STUFF or any other name.
9
10    Layer names don't all need to be of the same length, obviously, and
11    you could also skip them entirely and just use numbers, though that
12    means needing to manage the numbers.
13
14    It is preferable to keep the symbols short so that a line worth of
15    key mappings fits compactly onto a line of code. */
16
17 /* This was originally based on planck/keymaps/default/default.c, and
18    then cbbrowne has revised things */
19
20 /* Things I did not like about the default mapping 
21
22    - I find control too hard to get to.  I think I'll want it on a
23      left finger.  Gonna need to lose something to do that...
24    - Almost certainly, KC_LCTL should be on [2][1]
25    - having dash on [lower-j] is a bit nonintuitive, but may be OK
26    - I'll bet I should switch ESC/TAB
27    - I'm suspicious that I want to shift M(0) from [4][1] to [4][2],
28      and shift ESC off the first column so KC_LCTL and KC_LALT can
29      be on the first column.
30    - I think I wanna swap ' and ENTER
31
32    - All of the above are done :-)
33
34    - I'm keeping Colemak and Dvorak around for reference, and added
35      Workman just for fun.  They're useless to me, though.
36 */
37
38
39 /* Some interesting things implemented
40
41    - There is a macro that writes out "cbbrowne" just because I could
42    - There is a (somewhat cruddy) linear congruential random number
43      generator.
44      - I would like to be seeding it with clock info to make it look
45        more random
46    - There are two macros that use the random number generators
47      - one, M_RANDDIGIT, generates a random digit based on state
48        of the random number generator
49      - the other, M_RANDLETTER, generates a random letter based on state
50        of the random number generator
51      - in both, note the use of register_code()/unregister_code()
52        to indicate the desired key
53 */
54
55 /* Other things to do...
56
57    - Need to think about what zsh and readline actions I use lots
58    - Wanna figure out macros, so I can put in a "cbbrowne" macro
59    - Ought to ensure that Control-Alt-Delete is convenient enough
60    - How about Alt-F1 thru Alt-F8?
61    - What's the keystroke to get from X to console these days?
62    - I do indeed want a sweet number pad!
63    - A layer for doing console switching would not be a bad idea
64    - Random data generator
65      - A key that generates values in the range 0-9 at random
66      - A key that generates values in the range a-z at random
67      - A key that generates values in the range a-z,A-Z,0-9 at random
68
69    - Figure out the MACRO example in https://github.com/tmk/tmk_keyboard/blob/master/tmk_core/doc/keymap.md
70      - section 2.3.2
71      - where does the HELLO come from???
72      - What are the types of the T() calls? 
73 */
74
75 enum layers {
76   _QW = 0,  /* Qwerty mapping */
77   _LW, /* Lower layer, where top line has symbols !@#$%^&*() */
78   _RS, /* Raised layer, where top line has digits 1234567890 */
79   _KP, /* Key pad */
80 };
81
82 enum macro_id {
83   M_LED = 0,
84   M_USERNAME,
85   M_RANDDIGIT,
86   M_RANDLETTER
87 };
88
89 /* Note that Planck has dimensions 4 rows x 12 columns */
90
91 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
92 [_QW] = { /* Qwerty */
93   {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
94   {KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_ENT},
95   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT },
96   {KC_TAB,  M(M_LED), KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
97 },
98 [_RS] = { /* RAISE */
99   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
100   {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
101   {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_KP), DF(_KP), RESET,   KC_TRNS},
102   {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
103 },
104 [_LW] = { /* LOWER */
105   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
106   {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
107   {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_KP), DF(_KP), RESET,   KC_TRNS},
108   {KC_TRNS, DF(_KP), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
109 },
110 [_KP] = { /* Key Pad */
111   {KC_ESC,  M(M_USERNAME),    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_KP_ENTER, KC_KP_PLUS, KC_KP_PLUS, KC_KP_ENTER, KC_BSPC},
112   {KC_LCTL, M(M_RANDDIGIT),    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_KP_MINUS, KC_7, KC_8,    KC_9,  KC_ENT},
113   {KC_LSFT, M(M_RANDLETTER),    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_KP_PLUS,    KC_4, KC_5,  KC_6, KC_DOT},
114   {BL_STEP, M(M_LED), KC_LALT, KC_LGUI, KC_NO, KC_SPC,  KC_SPC,  DF(_QW),   KC_1, KC_2, KC_3,  KC_0}
115 }
116 };
117
118 const uint16_t PROGMEM fn_actions[] = {
119 };
120
121 /* This bit of logic seeds a wee linear congruential random number generator */
122
123 static uint16_t random_value = 157;
124 #define randadd 53
125 #define randmul 181
126 #define randmod 167
127
128 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
129 {
130   // MACRODOWN only works in this function
131   switch(id) {
132   case M_LED:
133     if (record->event.pressed) {
134       register_code(KC_RSFT);
135 #ifdef BACKLIGHT_ENABLE
136       backlight_step();
137 #endif
138     } else {
139       unregister_code(KC_RSFT);
140     }
141     break;          
142   case M_USERNAME:
143     if (record->event.pressed) {
144       return MACRO( I(1), T(C), T(B), T(B), T(R), T(O), T(W), T(N), T(E));
145     } else {
146       return MACRO_NONE ;
147     }
148     break;
149   case M_RANDDIGIT:
150     /* Generate, based on random number generator, a keystroke for
151        a numeric digit chosen at random */
152     random_value = ((random_value + randadd) * randmul) % randmod;
153     if (record->event.pressed) 
154     switch(random_value % 10) {
155     case 0:
156       register_code (KC_0);
157       unregister_code (KC_0);
158       break;
159     case 1:
160       register_code (KC_1);
161       unregister_code (KC_1);
162       break;
163     case 2:
164       register_code (KC_2);
165       unregister_code (KC_2);
166       break;
167     case 3:
168       register_code (KC_3);
169       unregister_code (KC_3);
170       break;
171     case 4:
172       register_code (KC_4);
173       unregister_code (KC_4);
174       break;
175     case 5:
176       register_code (KC_5);
177       unregister_code (KC_5);
178       break;
179     case 6:
180       register_code (KC_6);
181       unregister_code (KC_6);
182       break;
183     case 7:
184       register_code (KC_7);
185       unregister_code (KC_7);
186       break;
187     case 8:
188       register_code (KC_8);
189       unregister_code (KC_8);
190       break;
191     case 9:
192       register_code (KC_9);
193       unregister_code (KC_9);
194       break;
195     }
196     break;
197   case M_RANDLETTER:
198     /* Generate, based on random number generator, a keystroke for
199        a letter chosen at random */
200     random_value = ((random_value + randadd) * randmul) % randmod;
201     if (record->event.pressed) 
202     switch(random_value % 26) {
203     case 0:
204       register_code(KC_A);
205       unregister_code(KC_A);
206       break;
207     case 1:
208       register_code(KC_B);
209       unregister_code(KC_B);
210       break;
211     case 2:
212       register_code(KC_C);
213       unregister_code(KC_C);
214       break;
215     case 3:
216       register_code(KC_D);
217       unregister_code(KC_D);
218       break;
219     case 4:
220       register_code(KC_E);
221       unregister_code(KC_E);
222       break;
223     case 5:
224       register_code(KC_F);
225       unregister_code(KC_F);
226       break;
227     case 6:
228       register_code(KC_G);
229       unregister_code(KC_G);
230       break;
231     case 7:
232       register_code(KC_H);
233       unregister_code(KC_H);
234       break;
235     case 8:
236       register_code(KC_I);
237       unregister_code(KC_I);
238       break;
239     case 9:
240       register_code(KC_J);
241       unregister_code(KC_J);
242       break;
243     case 10:
244       register_code(KC_K);
245       unregister_code(KC_K);
246       break;
247     case 11:
248       register_code(KC_L);
249       unregister_code(KC_L);
250       break;
251     case 12:
252       register_code(KC_M); 
253       unregister_code(KC_M); 
254       break;
255     case 13:
256       register_code(KC_N);
257       unregister_code(KC_N);
258       break;
259     case 14:
260       register_code(KC_O);
261       unregister_code(KC_O);
262       break;
263     case 15:
264       register_code(KC_P);
265       unregister_code(KC_P);
266       break;
267     case 16:
268       register_code(KC_Q);
269       unregister_code(KC_Q);
270       break;
271     case 17:
272       register_code(KC_R);
273       unregister_code(KC_R);
274       break;
275     case 18:
276       register_code(KC_S);
277       unregister_code(KC_S);
278       break;
279     case 19:
280       register_code(KC_T);
281       unregister_code(KC_T);
282       break;
283     case 20:
284       register_code(KC_U);
285       unregister_code(KC_U);
286       break;
287     case 21:
288       register_code(KC_V);
289       unregister_code(KC_V);
290       break;
291     case 22:
292       register_code(KC_W);
293       unregister_code(KC_W);
294       break;
295     case 23:
296       register_code(KC_X);
297       unregister_code(KC_X);
298       break;
299     case 24:
300       register_code(KC_Y);
301       unregister_code(KC_Y);
302       break;
303     case 25:
304       register_code(KC_Z);
305       unregister_code(KC_Z);
306       break;
307     }
308     break;
309   }
310   return MACRO_NONE;
311 };