diff options
Diffstat (limited to 'firmware/main.cpp')
-rw-r--r-- | firmware/main.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/firmware/main.cpp b/firmware/main.cpp new file mode 100644 index 0000000..8975077 --- /dev/null +++ b/firmware/main.cpp @@ -0,0 +1,142 @@ +#include "WProgram.h" +#include "keys.h" + +// [esc] [ ~ ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 0 ] [ - ] [ + ] +// [ \ ] [ / ] [ q ] [ w ] [ f ] [ p ] [ g ] [ j ] [ l ] [ u ] [ y ] [ ; ] [ [ ] [ ] ] +// [ shift ] [ a ] [ r ] [ s ] [ t ] [ d ] [ tab ] [ h ] [ n ] [ e ] [ i ] [ o ] [ shift ] +// [control] [ z ] [ x ] [ c ] [ v ] [ b ] [ bkspc ] [ k ] [ m ] [ , ] [ . ] [ ' ] [control] +// [ meta ] [ ] [ layout] [ alt ] [ ret ] [ space ] [layout ] [ altgr ] [ meta ] + +uint8_t keymap[3][7][15] = { + { // qwerty + {K_ESC, K_TILDE, K_1, K_2, K_3, K_4, K_5, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUAL}, + {K_BSLASH, K_SLASH, K_Q, K_W, K_E, K_R, K_T, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, K_Y, K_U, K_I, K_O, K_P, K_LBRACE, K_RBRACE}, + {0, 0, K_A, K_S, K_D, K_F, K_G, K_TAB, K_H, K_J, K_K, K_L, K_SCOL, 0, 0}, + {0, 0, K_Z, K_X, K_C, K_V, K_B, K_BSPC, K_N, K_M, K_COMMA, K_DOT, K_QUOTE, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, K_RET, K_SPC, 0, 0, 0, 0, 0, 0} + }, + { // mostly functional keys + // ESC, DEL, and F* + {K_ESC, K_DEL, K_F1, K_F2, K_F3, K_F4, K_F5, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12}, + // nothing for now + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + // hjkl-style navigation keys + {0, 0, 0, K_HOME, K_PGUP, K_PGDN, K_END, K_TAB, K_LEFT, K_DOWN, K_UP, K_RIGHT, 0, 0, 0}, + // nothing for now + {0, 0, 0, 0, 0, 0, 0, K_BSPC,0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, K_RET, K_SPC, 0, 0, 0, 0, 0, 0} + }, + { // colemak + {K_ESC, K_TILDE, K_1, K_2, K_3, K_4, K_5, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUAL}, + {K_BSLASH, K_SLASH, K_Q, K_W, K_F, K_P, K_G, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, K_J, K_L, K_U, K_Y, K_SCOL, K_LBRACE, K_RBRACE}, + {0, 0, K_A, K_R, K_S, K_T, K_D, K_TAB, K_H, K_N, K_E, K_I, K_O, 0, 0}, + {0, 0, K_Z, K_X, K_C, K_V, K_B, K_BSPC, K_K, K_M, K_COMMA, K_DOT, K_QUOTE, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, K_RET, K_SPC, 0, 0, 0, 0, 0, 0} + } +}; + +uint8_t p[7][15]; // pressed keys +uint8_t prev_keys[6] = {0,0,0,0,0,0}, prev_modifiers = 0; +uint8_t layout = 0; +uint8_t layout_state = 0; + +int type () { + uint8_t i, j, ret = 0, k = 0, send = 0, cur_layout = layout; + + // Set modifiers + keyboard_modifier_keys = + p[5][1] // left ctrl + | (p[4][1] << 1) // left shift + | (p[6][6] << 2) // left alt + | (p[6][1] << 3) // left "gui" + | (p[5][14] << 4) // right ctrl + | (p[4][14] << 5) // right shift + | (p[6][12] << 6) // right alt + | (p[6][14] << 7) // right "gui" + ; + + // Handle layout keys + if (p[6][5] && p[6][10]) { + if (layout_state == 0) { + // Cycle through layouts. Perhaps should track the order in + // which Fn keys are pressed, to determine the direction. + layout = (layout + 1) % 3; + cur_layout = layout; + layout_state = 1; + } + } else if (p[6][5] || p[6][10]) { + // Set the functional layout temporary + cur_layout = 1; + } else { + layout_state = 0; + } + + // Fill keyboard_keys + for (i = 0; i < 7; i++){ + for (j = 0; j < 15; j++){ + if (p[i][j] && k < 6) { + if (keymap[layout][i][j]) { + keyboard_keys[k] = keymap[cur_layout][i][j]; + k++; + } + } + } + } + while (k < 6) { + keyboard_keys[k] = 0; + k++; + } + + // Compare it to the previously sent keys, send if they differ + for (k = 0; k < 6; k++) + if (prev_keys[k] != keyboard_keys[k]) + send = 1; + if (prev_modifiers != keyboard_modifier_keys) + send = 1; + + if (send) + ret = usb_keyboard_send(); + + prev_modifiers = keyboard_modifier_keys; + for (k = 0; k < 6; k++) + prev_keys[k] = keyboard_keys[k]; + + return ret; +} + + +extern "C" int main(void) { + uint8_t i = 0, j = 0, s = 0; + uint8_t row_pins[7] = {2, 23, 9, 17, 13, 12, 11}; + uint8_t col_pins[15] = {10, 8, 7, 3, 4, 5, 6, 14, 20, 21, 22, 19, 18, 16, 15}; + + for (i=0; i < 7; i ++) { + pinMode(row_pins[i], OUTPUT); + digitalWriteFast(row_pins[i], LOW); + } + for (i=0; i < 15; i ++) { + pinMode(col_pins[i], INPUT_PULLDOWN); + } + + while (1) { + for (i = 0; i < 7; i++) { + digitalWriteFast(row_pins[i], HIGH); + for (j = ((i == 1 || i == 3) ? 8 : 0); + j < ((i == 0 || i == 2) ? 7 : 15); + j++) + { + s = digitalReadFast(col_pins[j]); + p[i][j] = s; + } + digitalWriteFast(row_pins[i], LOW); + } + type(); + delay(5); + } +} |