From 6280adbb6e077d9c73807788929158bf4a8ca493 Mon Sep 17 00:00:00 2001 From: Lucas Hecht Date: Wed, 24 Feb 2016 22:54:39 +0100 Subject: Added keymap "lucas.c" --- keyboard/planck/dfu-programmer.exe | Bin 0 -> 242280 bytes keyboard/planck/keymaps/dfu-programmer.exe | Bin 0 -> 242280 bytes keyboard/planck/keymaps/keymap_eigen.c | 184 +++++++++++++++++++++++++++ keyboard/planck/keymaps/lucas.c | 198 +++++++++++++++++++++++++++++ 4 files changed, 382 insertions(+) create mode 100644 keyboard/planck/dfu-programmer.exe create mode 100644 keyboard/planck/keymaps/dfu-programmer.exe create mode 100644 keyboard/planck/keymaps/keymap_eigen.c create mode 100644 keyboard/planck/keymaps/lucas.c diff --git a/keyboard/planck/dfu-programmer.exe b/keyboard/planck/dfu-programmer.exe new file mode 100644 index 0000000000..a7d2ecbfc5 Binary files /dev/null and b/keyboard/planck/dfu-programmer.exe differ diff --git a/keyboard/planck/keymaps/dfu-programmer.exe b/keyboard/planck/keymaps/dfu-programmer.exe new file mode 100644 index 0000000000..a7d2ecbfc5 Binary files /dev/null and b/keyboard/planck/keymaps/dfu-programmer.exe differ diff --git a/keyboard/planck/keymaps/keymap_eigen.c b/keyboard/planck/keymaps/keymap_eigen.c new file mode 100644 index 0000000000..51b7720593 --- /dev/null +++ b/keyboard/planck/keymaps/keymap_eigen.c @@ -0,0 +1,184 @@ +#include "keymap_common.h" +#include "backlight.h" +#include "debug.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* QWERTY + * 0:Qwerty + * ,-----------------------------------------------------------------------. + * |Esc | q | w | f | p | g | j | l | u | y | ; | BS | + * |-----------------------------------------------------------------------| + * |BS | a | r | s | t | d | h | n | e | i | o | ' | + * |-----------------------------------------------------------------------| + * |Shift| z | x | c | v | b | k | m |, | . | / | Enter| + * |-----------------------------------------------------------------------| + * |FN4 | LCTL| LGUI| LALT|Lower| Space |Raise|Left |Down | Up |Right| + * `-----------------------------------------------------------------------' + */ + {KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {FUNC(8), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_LCTL, KC_LCTL, FUNC(5), KC_LALT, FUNC(2), FUNC(3), FUNC(3), FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + // Space is repeated to accommadate for both spacebar wiring positions +}, +[1] = { /* Gaming + * 1: Gaming Layer + * ,-----------------------------------------------------------------------. + * | ESC | | 1 | 2 | 3 | 4 | | | | /RC | | | + * |-----------------------------------------------------------------------| + * | | 5 | 6 | 7 | W | 8 | 9 | | | | | | + * |-----------------------------------------------------------------------| + * | | 0 | - | A | S | D | = | | | | | | + * |-----------------------------------------------------------------------| + * |QWERT| |LCTRL| LSFT| LALT| Space | TAB | | |Raise| | + * `-----------------------------------------------------------------------' + */ + {KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, KC_NO, KC_NO, KC_NO, M(1), KC_NO, KC_NO}, + {KC_NO, KC_5, KC_6, KC_7, KC_W, KC_8, KC_9, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_NO, KC_0, KC_MINS, KC_A, KC_S, KC_D, KC_EQL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {FUNC(9), KC_NO, KC_LCTL, KC_LSFT, KC_LALT, KC_SPC, KC_SPC, KC_TAB, KC_NO, KC_NO, FUNC(1), KC_NO} +}, +[2] = { /* Raise + * 2: fn Right/Raise layer + * The top row are standard numbers, 1-9, and minus and equals. + * Middle 2 rows add symbols back. + * Bottom row changes arrow to Home, Page Up, Page Down, and End. + * ,-----------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BS | + * |-----------------------------------------------------------------------| + * | | Game|QWERT| | | | | - | = | [ | ] | \ | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | Space | |Home |PgDn |PgUp | End | + * `-----------------------------------------------------------------------' + */ + { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, FUNC(7), FUNC(6), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +}, +[3] = { /* Lower + * 3: Symbols Left/Lower layer + * Top row is number symbols. + * Adds alt symbbols for brackets, etc. + * Bottom row is media control. + * ,-----------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | BS | + * |-----------------------------------------------------------------------| + * | | | | | | | | _ | + | { | } | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | |PrevT|NextT| | | | | |Mute |Vol- |Vol+ | P/P | + * `-----------------------------------------------------------------------' + */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {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, KC_MPRV, KC_MNXT, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[4] = { /* TENKEY + * 4: Numpad layer + * ,-----------------------------------------------------------------------. + * | | Num7| Num8| Num9| | |CALC | | | | | | + * |-----------------------------------------------------------------------| + * | | Num4| Num5| Num6| | | | | | | | | + * |-----------------------------------------------------------------------| + * | | Num1| Num2| Num3| | | | | | | | | + * |-----------------------------------------------------------------------| + * | | Num0| Num0| Num.| | | | | | | | | + * `-----------------------------------------------------------------------' + */ + {KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_TRNS, KC_TRNS,KC_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, + {KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, + {KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, + {KC_TRNS, KC_KP_0, KC_KP_0, KC_KP_DOT, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, +}, +[5] = { /* Funtion Keys + * 5: Function + * Backlight control at Arrows + * ,-----------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 |F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | |Light|BL DN|BL UP| + * `-----------------------------------------------------------------------' + */ + {KC_FN1, KC_FN2, KC_FN3, KC_FN4, KC_FN5, KC_FN6, KC_FN7, KC_FN8, KC_FN9, KC_FN10, KC_FN11, KC_FN12}, + {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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC}, +}, +[6] = { /* In-Game QWERTY + * 0:Qwerty + * ,-----------------------------------------------------------------------. + * | | q | w | e | r | t | y | u | i | o | p | BS | + * |-----------------------------------------------------------------------| + * | | a | s | d | f | g | h | j | k | l | | " | + * |-----------------------------------------------------------------------| + * |Shift| z | x | c | v | b | n | m | , | . | / |Enter| + * |-----------------------------------------------------------------------| + * | | | | | | Space | | | | | | + * `-----------------------------------------------------------------------' + */ + {KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_TRNS, S(KC_QUOT)}, + {FUNC(8), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} + // Space is repeated to accommadate for both spacebar wiring positions +}, +[7] = { /* More Functions + * 7: Function + * More Space Later + * ,-----------------------------------------------------------------------. + * | F13 | F14 | F15 | F16 |F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ + {KC_FN13, KC_FN14, KC_FN15, KC_FN16, KC_FN17, KC_FN18, KC_FN19, KC_FN20, KC_FN21, KC_FN22, KC_FN23, KC_FN24}, + {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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, +}, +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + [3] = ACTION_LAYER_TAP_KEY(4,KC_SPC), // to TENKEY + [4] = ACTION_LAYER_MOMENTARY(5), // to Function + [5] = ACTION_LAYER_TAP_KEY(7,KC_LGUI), // to More Functions + + [6] = ACTION_DEFAULT_LAYER_SET(0), // QWERTY + [7] = ACTION_DEFAULT_LAYER_SET(1), // Gaming + [8] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_CAPS), //Shift on press, Caps on tap + [9] = ACTION_LAYER_TAP_TOGGLE(6), //QWERTY in game +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + case 1: + return MACRODOWN(TYPE(KC_SLSH), TYPE(KC_R), TYPE(KC_C), TYPE(KC_ENT) , END); + break; + } + return MACRO_NONE; +}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/lucas.c b/keyboard/planck/keymaps/lucas.c new file mode 100644 index 0000000000..d8516302c7 --- /dev/null +++ b/keyboard/planck/keymaps/lucas.c @@ -0,0 +1,198 @@ +/* +This is the keymap of /u/deepshitgoeshere! +Layer 1 exists so I can have the symbol positions of QWERTY while having my system in german. +The second layer has all the german umlauts I need and with capital and small letters on the +same layer there is no need to press shift+lower. +This keymap is made to work with software implemented QWERTZ. +The "Gaming" layer is mainly customized for CS:GO. +If you have any question about this keymap feel free to shoot me a message on reddit! +*/ + +#include "keymap_common.h" +#include "keymap_extras/keymap_german.h" +#include "backlight.h" +#include "debug.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Colemak + * ,-----------------------------------------------------------------------. + * | Esc | q | w | f | p | g | j | l | u | y | ; | - | + * |-----------------------------------------------------------------------| + * | BS | a | r | s | t | d | h | n | e | i | o | ' | + * |-----------------------------------------------------------------------| + * | SFT | z | x | c | v | b | k | m | , | . | / | Ent | + * |-----------------------------------------------------------------------| + * | CTL | GUI | Tab | ALT |Lower| Space |Raise|Left |Down | Up |Right| + * `-----------------------------------------------------------------------' + */ + {KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Z, DE_SCLN, DE_MINS}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, DE_QUOT}, + {M(0), KC_Y, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, DE_COMM, DE_DOT, DE_SLSH, KC_ENT}, + {KC_LCTL, KC_LGUI, KC_TAB, KC_LALT, F(2), F(3), F(3), F(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[1] = { /* Symbols + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | : | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | " | + * |-----------------------------------------------------------------------| + * | | | | | | | | | < | > | ? | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DOT, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DQOT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(5), DE_MORE, DE_QST, 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} +}, +[2] = { /* Raise + * ,-----------------------------------------------------------------------. + * | | Ä | | | | | | | Ü | Ö | |Game | + * |-----------------------------------------------------------------------| + * | Del | ä | | ß | | | | | ü | ö | |FVol+| + * |-----------------------------------------------------------------------| + * | | | | | | | | |Stop | Prv | Nxt |FVol-| + * |-----------------------------------------------------------------------| + * |LCTL |LGUI | Tab |LALT |Lower| Space | |Mute |Vol- |Vol+ | P/P | + * `-----------------------------------------------------------------------' + */ + {KC_NO, S(DE_AE), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, S(DE_UE), S(DE_OE), KC_NO, F(4)}, + {KC_DEL, DE_AE, KC_NO, DE_SS, KC_NO, KC_NO, KC_NO, KC_NO, DE_UE, DE_OE, KC_NO, RALT(KC_F12)}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MSTP, KC_MPRV, KC_MNXT, RALT(KC_F11)}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* Lower + * ,-----------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | + | + * |-----------------------------------------------------------------------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = | + * |-----------------------------------------------------------------------| + * | | | | | | [ | ] | { | } | € | | \ | Ent | + * |-----------------------------------------------------------------------| + * |LCTL |LGUI | Tab |LALT | | Space |Raise|Home |PgDn |PgUp | End | + * `-----------------------------------------------------------------------' + */ + {DE_TILD, DE_EXLM, DE_AT, DE_HASH, DE_DLR, DE_PERC, DE_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, DE_PLUS}, + {DE_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, DE_EQL}, + {KC_NO, KC_NO, KC_NO, DE_PIPE, DE_LBRC, DE_RBRC, DE_LCBR, DE_RCBR, DE_EURO, KC_NO, DE_BSLS, KC_ENT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +}, +[4] = { /* Function + * ,-----------------------------------------------------------------------. + * | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | + * |-----------------------------------------------------------------------| + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |-----------------------------------------------------------------------| + * | | | | | | KP- | KP+ | | | | |Reset| + * |-----------------------------------------------------------------------| + * | |Light|BL DN|BL UP| | | | |Mute |Vol- |Vol+ | P/P | + * `-----------------------------------------------------------------------' + */ + {KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24}, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PMNS, KC_PPLS, KC_NO, KC_NO, KC_NO, RESET, KC_NO}, + {KC_NO, BL_TOGG, BL_DEC, BL_INC, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[5] = { /* Gaming + * ,-----------------------------------------------------------------------. + * | Buy | ESC | q | w | e | r | t | y | u | i | o | p | + * |-----------------------------------------------------------------------| + * | ENT | BS | a | s | d | f | g | h | j | k | l | ; | + * |-----------------------------------------------------------------------| + * | CTL | SFT | z | x | c | v | b | n | m | , | Up | / | + * |-----------------------------------------------------------------------| + * | | | Tab | ALT | | Space |CrJmp| GUI |Left |Down |Right| + * `-----------------------------------------------------------------------' + */ + {MO(6), KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, F(4)}, + {KC_ENT, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, DE_SCLN}, + {KC_LCTL, KC_LSFT, KC_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, DE_DOT, KC_UP, DE_SLSH}, + {KC_NO, KC_NO, KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_LGUI, KC_LEFT, KC_DOWN, KC_RGHT} +}, +[6] = { /* Gaming + /* CS:GO buy binds + * ,-----------------------------------------------------------------------. + * | | | | | | | | | 7 | 8 | 9 | | + * |-----------------------------------------------------------------------| + * | BS | | | | | | | | 6 | 5 | 4 | End | + * |-----------------------------------------------------------------------| + * | CTL | SFT | | | | | | | 1 | 2 | 3 |Pgdn | + * |-----------------------------------------------------------------------| + * | | | Tab | ALT | | Space |CrJmp| | 0 | KP+ |PEnt | + * `-----------------------------------------------------------------------' + */ + {KC_TRNS, KC_NO, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_P7, KC_P8, KC_P9, KC_NO}, + {KC_BSPC, KC_NO, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_P4, KC_P5, KC_P6, KC_END}, + {KC_LCTL, KC_LSFT, KC_Y, KC_X, KC_C, KC_V, KC_B, KC_K, KC_P1, KC_P2, KC_P3, KC_PGDN}, + {KC_NO, KC_NO, KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_NO, KC_P0, KC_PDOT, KC_PENT} +}, +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + [3] = ACTION_LAYER_TAP_KEY(4,KC_SPC), // to Function + [4] = ACTION_LAYER_TOGGLE(5), // toggle Gaming + [5] = ACTION_MODS_TAP_KEY(KC_LSFT, KC_CAPS), //Shift on press, Caps on tap +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: // M(0) + if (record->event.pressed) { + register_code(KC_LSFT); + layer_on(1); + } else { + layer_off(1); + unregister_code(KC_LSFT); + } + break; + case 1: // M(1) + if (record->event.pressed) { + register_code(LSFT(DE_SCLN)); + } else { + unregister_code(LSFT(DE_SCLN)); + } + break; + case 2: // M(2) + if (record->event.pressed) { + register_code(DE_MINS); + } else { + unregister_code(DE_MINS); + } + break; + case 3: // M(3) + if (record->event.pressed) { + register_code(DE_COMM); + } else { + unregister_code(DE_COMM); + } + break; + case 4: // M(4) + if (record->event.pressed) { + register_code(DE_DOT); + } else { + unregister_code(DE_DOT); + } + break; + case 5: // M(5) + if (record->event.pressed) { + unregister_code(KC_LSFT); + register_code(DE_MORE); + } else { + unregister_code(DE_MORE); + } + break; + case 6: // M(6) + if (record->event.pressed) { + register_code(DE_LESS); + } else { + unregister_code(DE_LESS); + } + break; + } + return MACRO_NONE; + +}; \ No newline at end of file -- cgit v1.2.3 From bbfdfdcc5f5f610371434c7f4d072c71f1526696 Mon Sep 17 00:00:00 2001 From: Lucas Hecht Date: Thu, 25 Feb 2016 21:39:32 +0100 Subject: delete old keymap (keymap_eigen.c) --- keyboard/planck/keymaps/lucas.c | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/keyboard/planck/keymaps/lucas.c b/keyboard/planck/keymaps/lucas.c index d8516302c7..27672e1bbc 100644 --- a/keyboard/planck/keymaps/lucas.c +++ b/keyboard/planck/keymaps/lucas.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DOT, KC_TRNS}, {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_DQOT}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(5), DE_MORE, DE_QST, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(1), DE_MORE, DE_QST, 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} }, [2] = { /* Raise @@ -148,36 +148,8 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) layer_off(1); unregister_code(KC_LSFT); } - break; + break; case 1: // M(1) - if (record->event.pressed) { - register_code(LSFT(DE_SCLN)); - } else { - unregister_code(LSFT(DE_SCLN)); - } - break; - case 2: // M(2) - if (record->event.pressed) { - register_code(DE_MINS); - } else { - unregister_code(DE_MINS); - } - break; - case 3: // M(3) - if (record->event.pressed) { - register_code(DE_COMM); - } else { - unregister_code(DE_COMM); - } - break; - case 4: // M(4) - if (record->event.pressed) { - register_code(DE_DOT); - } else { - unregister_code(DE_DOT); - } - break; - case 5: // M(5) if (record->event.pressed) { unregister_code(KC_LSFT); register_code(DE_MORE); @@ -185,13 +157,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(DE_MORE); } break; - case 6: // M(6) - if (record->event.pressed) { - register_code(DE_LESS); - } else { - unregister_code(DE_LESS); - } - break; } return MACRO_NONE; -- cgit v1.2.3 From e8f17e51368fabdc9eb226212c7cfcec76f037e1 Mon Sep 17 00:00:00 2001 From: deepshitgoeshere Date: Thu, 25 Feb 2016 22:26:44 +0100 Subject: Delete dfu-programmer.exe --- keyboard/planck/keymaps/dfu-programmer.exe | Bin 242280 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 keyboard/planck/keymaps/dfu-programmer.exe diff --git a/keyboard/planck/keymaps/dfu-programmer.exe b/keyboard/planck/keymaps/dfu-programmer.exe deleted file mode 100644 index a7d2ecbfc5..0000000000 Binary files a/keyboard/planck/keymaps/dfu-programmer.exe and /dev/null differ -- cgit v1.2.3 From 8def502eee61cd137789c15842fad6ea881a929f Mon Sep 17 00:00:00 2001 From: deepshitgoeshere Date: Thu, 25 Feb 2016 22:27:17 +0100 Subject: Delete dfu-programmer.exe --- keyboard/planck/dfu-programmer.exe | Bin 242280 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 keyboard/planck/dfu-programmer.exe diff --git a/keyboard/planck/dfu-programmer.exe b/keyboard/planck/dfu-programmer.exe deleted file mode 100644 index a7d2ecbfc5..0000000000 Binary files a/keyboard/planck/dfu-programmer.exe and /dev/null differ -- cgit v1.2.3 From 92adbe416c81e6ec24e21cd531eb7e478218803f Mon Sep 17 00:00:00 2001 From: deepshitgoeshere Date: Thu, 25 Feb 2016 22:27:59 +0100 Subject: Delete keymap_eigen.c --- keyboard/planck/keymaps/keymap_eigen.c | 184 --------------------------------- 1 file changed, 184 deletions(-) delete mode 100644 keyboard/planck/keymaps/keymap_eigen.c diff --git a/keyboard/planck/keymaps/keymap_eigen.c b/keyboard/planck/keymaps/keymap_eigen.c deleted file mode 100644 index 51b7720593..0000000000 --- a/keyboard/planck/keymaps/keymap_eigen.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "keymap_common.h" -#include "backlight.h" -#include "debug.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* QWERTY - * 0:Qwerty - * ,-----------------------------------------------------------------------. - * |Esc | q | w | f | p | g | j | l | u | y | ; | BS | - * |-----------------------------------------------------------------------| - * |BS | a | r | s | t | d | h | n | e | i | o | ' | - * |-----------------------------------------------------------------------| - * |Shift| z | x | c | v | b | k | m |, | . | / | Enter| - * |-----------------------------------------------------------------------| - * |FN4 | LCTL| LGUI| LALT|Lower| Space |Raise|Left |Down | Up |Right| - * `-----------------------------------------------------------------------' - */ - {KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {FUNC(8), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_LCTL, KC_LCTL, FUNC(5), KC_LALT, FUNC(2), FUNC(3), FUNC(3), FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[1] = { /* Gaming - * 1: Gaming Layer - * ,-----------------------------------------------------------------------. - * | ESC | | 1 | 2 | 3 | 4 | | | | /RC | | | - * |-----------------------------------------------------------------------| - * | | 5 | 6 | 7 | W | 8 | 9 | | | | | | - * |-----------------------------------------------------------------------| - * | | 0 | - | A | S | D | = | | | | | | - * |-----------------------------------------------------------------------| - * |QWERT| |LCTRL| LSFT| LALT| Space | TAB | | |Raise| | - * `-----------------------------------------------------------------------' - */ - {KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, KC_NO, KC_NO, KC_NO, M(1), KC_NO, KC_NO}, - {KC_NO, KC_5, KC_6, KC_7, KC_W, KC_8, KC_9, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, - {KC_NO, KC_0, KC_MINS, KC_A, KC_S, KC_D, KC_EQL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, - {FUNC(9), KC_NO, KC_LCTL, KC_LSFT, KC_LALT, KC_SPC, KC_SPC, KC_TAB, KC_NO, KC_NO, FUNC(1), KC_NO} -}, -[2] = { /* Raise - * 2: fn Right/Raise layer - * The top row are standard numbers, 1-9, and minus and equals. - * Middle 2 rows add symbols back. - * Bottom row changes arrow to Home, Page Up, Page Down, and End. - * ,-----------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BS | - * |-----------------------------------------------------------------------| - * | | Game|QWERT| | | | | - | = | [ | ] | \ | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | Space | |Home |PgDn |PgUp | End | - * `-----------------------------------------------------------------------' - */ - { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(7), FUNC(6), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} -}, -[3] = { /* Lower - * 3: Symbols Left/Lower layer - * Top row is number symbols. - * Adds alt symbbols for brackets, etc. - * Bottom row is media control. - * ,-----------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | BS | - * |-----------------------------------------------------------------------| - * | | | | | | | | _ | + | { | } | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | |PrevT|NextT| | | | | |Mute |Vol- |Vol+ | P/P | - * `-----------------------------------------------------------------------' - */ - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {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, KC_MPRV, KC_MNXT, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[4] = { /* TENKEY - * 4: Numpad layer - * ,-----------------------------------------------------------------------. - * | | Num7| Num8| Num9| | |CALC | | | | | | - * |-----------------------------------------------------------------------| - * | | Num4| Num5| Num6| | | | | | | | | - * |-----------------------------------------------------------------------| - * | | Num1| Num2| Num3| | | | | | | | | - * |-----------------------------------------------------------------------| - * | | Num0| Num0| Num.| | | | | | | | | - * `-----------------------------------------------------------------------' - */ - {KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_TRNS, KC_TRNS,KC_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, - {KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, - {KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, - {KC_TRNS, KC_KP_0, KC_KP_0, KC_KP_DOT, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS}, -}, -[5] = { /* Funtion Keys - * 5: Function - * Backlight control at Arrows - * ,-----------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 |F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | |Light|BL DN|BL UP| - * `-----------------------------------------------------------------------' - */ - {KC_FN1, KC_FN2, KC_FN3, KC_FN4, KC_FN5, KC_FN6, KC_FN7, KC_FN8, KC_FN9, KC_FN10, KC_FN11, KC_FN12}, - {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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC}, -}, -[6] = { /* In-Game QWERTY - * 0:Qwerty - * ,-----------------------------------------------------------------------. - * | | q | w | e | r | t | y | u | i | o | p | BS | - * |-----------------------------------------------------------------------| - * | | a | s | d | f | g | h | j | k | l | | " | - * |-----------------------------------------------------------------------| - * |Shift| z | x | c | v | b | n | m | , | . | / |Enter| - * |-----------------------------------------------------------------------| - * | | | | | | Space | | | | | | - * `-----------------------------------------------------------------------' - */ - {KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_TRNS, S(KC_QUOT)}, - {FUNC(8), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[7] = { /* More Functions - * 7: Function - * More Space Later - * ,-----------------------------------------------------------------------. - * | F13 | F14 | F15 | F16 |F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------' - */ - {KC_FN13, KC_FN14, KC_FN15, KC_FN16, KC_FN17, KC_FN18, KC_FN19, KC_FN20, KC_FN21, KC_FN22, KC_FN23, KC_FN24}, - {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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, -}, -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - [3] = ACTION_LAYER_TAP_KEY(4,KC_SPC), // to TENKEY - [4] = ACTION_LAYER_MOMENTARY(5), // to Function - [5] = ACTION_LAYER_TAP_KEY(7,KC_LGUI), // to More Functions - - [6] = ACTION_DEFAULT_LAYER_SET(0), // QWERTY - [7] = ACTION_DEFAULT_LAYER_SET(1), // Gaming - [8] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_CAPS), //Shift on press, Caps on tap - [9] = ACTION_LAYER_TAP_TOGGLE(6), //QWERTY in game -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - case 1: - return MACRODOWN(TYPE(KC_SLSH), TYPE(KC_R), TYPE(KC_C), TYPE(KC_ENT) , END); - break; - } - return MACRO_NONE; -}; \ No newline at end of file -- cgit v1.2.3 From 4ad96c60abc4d9e0de983d38b8126bc902178782 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Thu, 25 Feb 2016 23:53:44 -0500 Subject: Add script to setup the PATH variable on Windows --- setup-path-win.bat | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 setup-path-win.bat diff --git a/setup-path-win.bat b/setup-path-win.bat new file mode 100644 index 0000000000..4fbf9a870e --- /dev/null +++ b/setup-path-win.bat @@ -0,0 +1,9 @@ +@echo off +setx /M path "%PATH%;C:\MinGW\bin" > nul 2>&1 +if NOT ["%errorlevel%"]==["0"] ( + echo FAILED. Rerun with administrator privileges. + pause +) else ( + echo Success! + pause +) -- cgit v1.2.3 From 37c8a232764d8c614d6e1183e80bab89d901cbee Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 26 Feb 2016 00:29:55 -0500 Subject: Include MSYS directory in Windows path --- setup-path-win.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup-path-win.bat b/setup-path-win.bat index 4fbf9a870e..49fb00e149 100644 --- a/setup-path-win.bat +++ b/setup-path-win.bat @@ -1,5 +1,5 @@ @echo off -setx /M path "%PATH%;C:\MinGW\bin" > nul 2>&1 +setx /M path "%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin" > nul 2>&1 if NOT ["%errorlevel%"]==["0"] ( echo FAILED. Rerun with administrator privileges. pause -- cgit v1.2.3 From b7a94a1f0094649779559cc65fd2fe7b91061d0a Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 26 Feb 2016 01:53:18 -0500 Subject: Added Windows environment setup script --- setup-environment-win.bat | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 setup-environment-win.bat diff --git a/setup-environment-win.bat b/setup-environment-win.bat new file mode 100644 index 0000000000..ae803da6f8 --- /dev/null +++ b/setup-environment-win.bat @@ -0,0 +1,28 @@ +@echo off +setx /M test test > nul 2>&1 +if NOT ["%errorlevel%"]==["0"] ( + echo FAILED. Rerun with administrator privileges. + pause + exit +) + +mingw-get install mingw32-make-bin mingw32-gcc-bin msys-wget-bin msys-unzip-bin +cd \MinGW\bin + +REM It would be somewhat better to use symlinks, but then it wouldn't work in XP or Vista. +copy mingw32-make.exe make.exe + +mkdir temp +cd temp +wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip +unzip dfu-programmer-win-0.7.2.zip +copy dfu-programmer.exe .. + +wget http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip +unzip libusb-win32-bin-1.2.6.0.zip +cp libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll + +pnputil -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf + +cd .. +rm -rf temp \ No newline at end of file -- cgit v1.2.3 From 74761626f56476036246768f490a1389d4cc2fca Mon Sep 17 00:00:00 2001 From: Lucas Hecht Date: Fri, 26 Feb 2016 20:03:19 +0100 Subject: ignore dfu-programme.exe in commits --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ae342167df..8b8c45169d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +keyboard/planck/dfu-programmer.exe .dep *.o *.eep @@ -18,4 +19,5 @@ build/ # Eclipse Settings .cproject .project -.settings/ \ No newline at end of file +.settings/ + -- cgit v1.2.3 From bcf847e58a10b66cff3161dd3503bc839c9745f0 Mon Sep 17 00:00:00 2001 From: Lucas Hecht Date: Sat, 27 Feb 2016 01:26:54 +0100 Subject: added "Troubleshooting" section to PCB guide --- keyboard/planck/PCB_GUIDE.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/keyboard/planck/PCB_GUIDE.md b/keyboard/planck/PCB_GUIDE.md index 3daf0e0092..e676c44286 100644 --- a/keyboard/planck/PCB_GUIDE.md +++ b/keyboard/planck/PCB_GUIDE.md @@ -8,6 +8,7 @@ 2. Install [DFU-Programmer][dfu-prog] (the -win one). 3. Start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you will need to update its driver on 'Device Manager' to the `dfu-programmer` driver. + ### Mac If you're using homebrew, you can use the following commands: @@ -52,6 +53,27 @@ Generally, the instructions to flash the PCB are as follows: 4. Press the reset button on the PCB/press the key with the `RESET` keycode 5. `make dfu` - use the necessary `KEYMAP=` and/or `COMMON=true` arguments here. +### Troubleshooting +If you see something like this + + 0 [main] sh 13384 sync_with_child: child 9716(0x178) died before initialization with status code 0xC0000142 + 440 [main] sh 13384 sync_with_child: *** child state waiting for longjmp + /usr/bin/sh: fork: Resource temporarily unavailable + +after running 'make' on Windows than you are encountering a very popular issue with WinAVR on Windows 8.1 and 10. +You can easily fix this problem by replacing msys-1.0.dll in WinAVR/utils/bin with [this one](http://www.madwizard.org/download/electronics/msys-1.0-vista64.zip). +Restart your system and everything should work fine! + +If you see this + + dfu-programmer atmega32u4 erase + process_begin: CreateProcess(NULL, dfu-programmer atmega32u4 erase, ...) failed. + make (e=2): The system cannot find the file specified. + make: *** [dfu] Error 2 + +when trying to 'make dfu' on Windows you need to copy the dfu-programmer.exe to qmk_firmware/keyboard/planck. + + ## Quantum MK Firmware ### Keymap -- cgit v1.2.3 From 52b3ddb521ebe510a0674a69ce4f5ef208ea871f Mon Sep 17 00:00:00 2001 From: Lucas Hecht Date: Sat, 27 Feb 2016 02:56:05 +0100 Subject: Update PCB_GUIDE.md --- keyboard/planck/PCB_GUIDE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboard/planck/PCB_GUIDE.md b/keyboard/planck/PCB_GUIDE.md index e676c44286..28e8a4b084 100644 --- a/keyboard/planck/PCB_GUIDE.md +++ b/keyboard/planck/PCB_GUIDE.md @@ -53,7 +53,7 @@ Generally, the instructions to flash the PCB are as follows: 4. Press the reset button on the PCB/press the key with the `RESET` keycode 5. `make dfu` - use the necessary `KEYMAP=` and/or `COMMON=true` arguments here. -### Troubleshooting +## Troubleshooting If you see something like this 0 [main] sh 13384 sync_with_child: child 9716(0x178) died before initialization with status code 0xC0000142 @@ -64,6 +64,7 @@ after running 'make' on Windows than you are encountering a very popular issue w You can easily fix this problem by replacing msys-1.0.dll in WinAVR/utils/bin with [this one](http://www.madwizard.org/download/electronics/msys-1.0-vista64.zip). Restart your system and everything should work fine! + If you see this dfu-programmer atmega32u4 erase -- cgit v1.2.3 From 06de9628be3ba17e1d6753b9af21c7072d4badd9 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 12:25:21 -0500 Subject: Removed unneeded lines from setup script --- keyboard/planck/PCB_GUIDE.md | 17 +++++++++++++++-- setup-environment-win.bat | 5 +---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/keyboard/planck/PCB_GUIDE.md b/keyboard/planck/PCB_GUIDE.md index 3daf0e0092..d2ff703352 100644 --- a/keyboard/planck/PCB_GUIDE.md +++ b/keyboard/planck/PCB_GUIDE.md @@ -4,8 +4,21 @@ ### Windows -1. Install [WinAVR Tools](http://sourceforge.net/projects/winavr/) for AVR GCC compiler. -2. Install [DFU-Programmer][dfu-prog] (the -win one). +Options +1. Vagrant (overkill, lack of trust, no driver concerns) +2. Chocolatey / dfu-programmer (more dev work required) +3. Chocolatey / flip +4. Write a batch script that installs dfu-programmer on the path, installs make with MinGW, and uses pnputil to install the proper driver https://technet.microsoft.com/en-us/library/cc732377%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396#BKMK_Anchor2 +4. Look up altenatives ( + +* Install [MHV AVR Tools](https://github.com/jackhumbert/qmk_firmware). Disable smatch, but be sure to leave the option to add the tools to the PATH checked. +* Install the latest version of [the Atmel AVR **8-bit** toolchain](http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx) +* Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The script depends on the default location. +* Right-click on the setup-path-win batch script at the root of the project and select "Run as administrator". Press the spacebar to dismiss the success message. +* + +1. Install [Chocolatey](https://chocolatey.org/). It's a package manager for Windows that will make it easy to set up the complete build environment. To install Chocolatey, run the following command in a command line window with administrator privileges (search for command prompt, right-click on it, and select "Run as administrator"). `@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin` +2. Install DFU-Programmer by running (the -win one). 3. Start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you will need to update its driver on 'Device Manager' to the `dfu-programmer` driver. ### Mac diff --git a/setup-environment-win.bat b/setup-environment-win.bat index ae803da6f8..1fbd35a69a 100644 --- a/setup-environment-win.bat +++ b/setup-environment-win.bat @@ -6,12 +6,9 @@ if NOT ["%errorlevel%"]==["0"] ( exit ) -mingw-get install mingw32-make-bin mingw32-gcc-bin msys-wget-bin msys-unzip-bin +mingw-get install msys-wget-bin msys-unzip-bin cd \MinGW\bin -REM It would be somewhat better to use symlinks, but then it wouldn't work in XP or Vista. -copy mingw32-make.exe make.exe - mkdir temp cd temp wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip -- cgit v1.2.3 From c03d10d676ebbeabf838d4cf111567fd122214c5 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 12:48:10 -0500 Subject: Added logging to setup script --- setup-environment-win.bat | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/setup-environment-win.bat b/setup-environment-win.bat index 1fbd35a69a..91b6c91e39 100644 --- a/setup-environment-win.bat +++ b/setup-environment-win.bat @@ -6,20 +6,36 @@ if NOT ["%errorlevel%"]==["0"] ( exit ) +echo ------------------------------------------ +echo Installing wget and unzip +echo ------------------------------------------ mingw-get install msys-wget-bin msys-unzip-bin cd \MinGW\bin mkdir temp -cd temp +cd temp +echo ------------------------------------------ +echo Installing dfu-programmer. +echo ------------------------------------------ wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip unzip dfu-programmer-win-0.7.2.zip copy dfu-programmer.exe .. +echo ------------------------------------------ +echo Downloading driver +echo ------------------------------------------ wget http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip unzip libusb-win32-bin-1.2.6.0.zip cp libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll +echo ------------------------------------------ +echo Installing driver. Accept prompt. +echo ------------------------------------------ pnputil -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf cd .. -rm -rf temp \ No newline at end of file +rm -rf temp + +echo ------------------------------------------ +echo Finished! +pause \ No newline at end of file -- cgit v1.2.3 From 240f8d9fe0a6dbd7f51b1bd4cb93d884b6870ce1 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 12:54:53 -0500 Subject: Renamed scripts to show order --- 1-setup-path-win.bat | 9 +++++++++ 2-setup-environment-win.bat | 41 +++++++++++++++++++++++++++++++++++++++++ setup-environment-win.bat | 41 ----------------------------------------- setup-path-win.bat | 9 --------- 4 files changed, 50 insertions(+), 50 deletions(-) create mode 100644 1-setup-path-win.bat create mode 100644 2-setup-environment-win.bat delete mode 100644 setup-environment-win.bat delete mode 100644 setup-path-win.bat diff --git a/1-setup-path-win.bat b/1-setup-path-win.bat new file mode 100644 index 0000000000..49fb00e149 --- /dev/null +++ b/1-setup-path-win.bat @@ -0,0 +1,9 @@ +@echo off +setx /M path "%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin" > nul 2>&1 +if NOT ["%errorlevel%"]==["0"] ( + echo FAILED. Rerun with administrator privileges. + pause +) else ( + echo Success! + pause +) diff --git a/2-setup-environment-win.bat b/2-setup-environment-win.bat new file mode 100644 index 0000000000..91b6c91e39 --- /dev/null +++ b/2-setup-environment-win.bat @@ -0,0 +1,41 @@ +@echo off +setx /M test test > nul 2>&1 +if NOT ["%errorlevel%"]==["0"] ( + echo FAILED. Rerun with administrator privileges. + pause + exit +) + +echo ------------------------------------------ +echo Installing wget and unzip +echo ------------------------------------------ +mingw-get install msys-wget-bin msys-unzip-bin +cd \MinGW\bin + +mkdir temp +cd temp +echo ------------------------------------------ +echo Installing dfu-programmer. +echo ------------------------------------------ +wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip +unzip dfu-programmer-win-0.7.2.zip +copy dfu-programmer.exe .. + +echo ------------------------------------------ +echo Downloading driver +echo ------------------------------------------ +wget http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip +unzip libusb-win32-bin-1.2.6.0.zip +cp libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll + +echo ------------------------------------------ +echo Installing driver. Accept prompt. +echo ------------------------------------------ +pnputil -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf + +cd .. +rm -rf temp + +echo ------------------------------------------ +echo Finished! +pause \ No newline at end of file diff --git a/setup-environment-win.bat b/setup-environment-win.bat deleted file mode 100644 index 91b6c91e39..0000000000 --- a/setup-environment-win.bat +++ /dev/null @@ -1,41 +0,0 @@ -@echo off -setx /M test test > nul 2>&1 -if NOT ["%errorlevel%"]==["0"] ( - echo FAILED. Rerun with administrator privileges. - pause - exit -) - -echo ------------------------------------------ -echo Installing wget and unzip -echo ------------------------------------------ -mingw-get install msys-wget-bin msys-unzip-bin -cd \MinGW\bin - -mkdir temp -cd temp -echo ------------------------------------------ -echo Installing dfu-programmer. -echo ------------------------------------------ -wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip -unzip dfu-programmer-win-0.7.2.zip -copy dfu-programmer.exe .. - -echo ------------------------------------------ -echo Downloading driver -echo ------------------------------------------ -wget http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip -unzip libusb-win32-bin-1.2.6.0.zip -cp libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll - -echo ------------------------------------------ -echo Installing driver. Accept prompt. -echo ------------------------------------------ -pnputil -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf - -cd .. -rm -rf temp - -echo ------------------------------------------ -echo Finished! -pause \ No newline at end of file diff --git a/setup-path-win.bat b/setup-path-win.bat deleted file mode 100644 index 49fb00e149..0000000000 --- a/setup-path-win.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -setx /M path "%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin" > nul 2>&1 -if NOT ["%errorlevel%"]==["0"] ( - echo FAILED. Rerun with administrator privileges. - pause -) else ( - echo Success! - pause -) -- cgit v1.2.3 From 45933e84f178ae92506f4c1bfdc5a8dc30e587d2 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 13:02:13 -0500 Subject: Added documentation for new Windows scripts --- keyboard/planck/PCB_GUIDE.md | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/keyboard/planck/PCB_GUIDE.md b/keyboard/planck/PCB_GUIDE.md index d2ff703352..e396747dff 100644 --- a/keyboard/planck/PCB_GUIDE.md +++ b/keyboard/planck/PCB_GUIDE.md @@ -3,23 +3,11 @@ ## Setting up the environment ### Windows - -Options -1. Vagrant (overkill, lack of trust, no driver concerns) -2. Chocolatey / dfu-programmer (more dev work required) -3. Chocolatey / flip -4. Write a batch script that installs dfu-programmer on the path, installs make with MinGW, and uses pnputil to install the proper driver https://technet.microsoft.com/en-us/library/cc732377%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396#BKMK_Anchor2 -4. Look up altenatives ( - -* Install [MHV AVR Tools](https://github.com/jackhumbert/qmk_firmware). Disable smatch, but be sure to leave the option to add the tools to the PATH checked. -* Install the latest version of [the Atmel AVR **8-bit** toolchain](http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx) -* Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The script depends on the default location. -* Right-click on the setup-path-win batch script at the root of the project and select "Run as administrator". Press the spacebar to dismiss the success message. -* - -1. Install [Chocolatey](https://chocolatey.org/). It's a package manager for Windows that will make it easy to set up the complete build environment. To install Chocolatey, run the following command in a command line window with administrator privileges (search for command prompt, right-click on it, and select "Run as administrator"). `@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin` -2. Install DFU-Programmer by running (the -win one). -3. Start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you will need to update its driver on 'Device Manager' to the `dfu-programmer` driver. +1. Install [MHV AVR Tools](https://github.com/jackhumbert/qmk_firmware). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. +2. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. +3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. +4. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. +5. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete! ### Mac -- cgit v1.2.3 From 140a311e652829cb8c774d3d3bb4acdb7c9f9954 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 13:06:33 -0500 Subject: Fix link to MHV AVR Tools --- keyboard/planck/PCB_GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboard/planck/PCB_GUIDE.md b/keyboard/planck/PCB_GUIDE.md index e396747dff..797cee2e1b 100644 --- a/keyboard/planck/PCB_GUIDE.md +++ b/keyboard/planck/PCB_GUIDE.md @@ -3,7 +3,7 @@ ## Setting up the environment ### Windows -1. Install [MHV AVR Tools](https://github.com/jackhumbert/qmk_firmware). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. +1. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. 2. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. 3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. 4. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. -- cgit v1.2.3 From d47cac9bb3027a453c702a0dbb575de6e8668a37 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 21:27:45 -0500 Subject: Renamed QUICK_START.md to VAGRANT_GUIDE.md --- QUICK_START.md | 25 ------------------------- VAGRANT_GUIDE.md | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 QUICK_START.md create mode 100644 VAGRANT_GUIDE.md diff --git a/QUICK_START.md b/QUICK_START.md deleted file mode 100644 index 948308ca11..0000000000 --- a/QUICK_START.md +++ /dev/null @@ -1,25 +0,0 @@ -# Quick Start Directions - -This project includes a Vagrantfile that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter. - -## Requirements - -Using the Vagrantfile in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion). - -*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. - -Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below. - -Build Firmware and Program Controller -------------------------------------- -See [doc/build.md](tmk_core/doc/build.md), or the README in the particular keyboard/* folder. - -Change your keymap ------------------- -See [doc/keymap.md](tmk_core/doc/keymap.md). - -## Flashing the firmware - -The "easy" way to flash the firmware is using a tool from your host OS like the Teensy programming app. [ErgoDox EZ](keyboard/ergodox_ez/readme.md) gives a great example. - -If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version. diff --git a/VAGRANT_GUIDE.md b/VAGRANT_GUIDE.md new file mode 100644 index 0000000000..948308ca11 --- /dev/null +++ b/VAGRANT_GUIDE.md @@ -0,0 +1,25 @@ +# Quick Start Directions + +This project includes a Vagrantfile that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter. + +## Requirements + +Using the Vagrantfile in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion). + +*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. + +Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below. + +Build Firmware and Program Controller +------------------------------------- +See [doc/build.md](tmk_core/doc/build.md), or the README in the particular keyboard/* folder. + +Change your keymap +------------------ +See [doc/keymap.md](tmk_core/doc/keymap.md). + +## Flashing the firmware + +The "easy" way to flash the firmware is using a tool from your host OS like the Teensy programming app. [ErgoDox EZ](keyboard/ergodox_ez/readme.md) gives a great example. + +If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version. -- cgit v1.2.3 From a399823b936e6b0eabd144c5a513dedf5f8450d2 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 21:53:55 -0500 Subject: Added stub BUILD_GUIDE.md --- BUILD_GUIDE.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 BUILD_GUIDE.md diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md new file mode 100644 index 0000000000..2a1eaa555d --- /dev/null +++ b/BUILD_GUIDE.md @@ -0,0 +1 @@ +# Build Guide \ No newline at end of file -- cgit v1.2.3 From 3871ced15c880cb6d4975e1f1c4fb009f0b37adf Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:03:25 -0500 Subject: Added Vagrant explanation --- BUILD_GUIDE.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 2a1eaa555d..272df46c81 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -1 +1,14 @@ -# Build Guide \ No newline at end of file +# Build Guide + +## Platform-specific setup + +### Windows + + +### Mac + + +### Linux + +### Vagrant +If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). \ No newline at end of file -- cgit v1.2.3 From 92c3397ffc9cff22dee5a893023050492d31c4e3 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:07:26 -0500 Subject: Added placeholder for windows section of build guide --- BUILD_GUIDE.md | 4 ++-- VAGRANT_GUIDE.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 272df46c81..d7106d9183 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -1,9 +1,9 @@ # Build Guide -## Platform-specific setup +## Build Environment Setup ### Windows - +What these instructions look like depends on whether NoahAndrews's setup scripts get merged ### Mac diff --git a/VAGRANT_GUIDE.md b/VAGRANT_GUIDE.md index 948308ca11..922848fd75 100644 --- a/VAGRANT_GUIDE.md +++ b/VAGRANT_GUIDE.md @@ -23,3 +23,4 @@ See [doc/keymap.md](tmk_core/doc/keymap.md). The "easy" way to flash the firmware is using a tool from your host OS like the Teensy programming app. [ErgoDox EZ](keyboard/ergodox_ez/readme.md) gives a great example. If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version. + \ No newline at end of file -- cgit v1.2.3 From 04b47cb2eb862451d2b98243d0560abbe4b47699 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:10:10 -0500 Subject: Renamed handwriting guide to fit repository convention --- HAND-WIRE.md | 323 ----------------------------------------------------------- HAND_WIRE.md | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 323 insertions(+), 323 deletions(-) delete mode 100644 HAND-WIRE.md create mode 100644 HAND_WIRE.md diff --git a/HAND-WIRE.md b/HAND-WIRE.md deleted file mode 100644 index 3f4d75b272..0000000000 --- a/HAND-WIRE.md +++ /dev/null @@ -1,323 +0,0 @@ -# Quantum Hand-wiring Guide - -Parts list: -* *x* keyswitches (MX, Matias, Gateron, etc) -* *x* diodes -* Keyboard plate (metal, plastic, cardboard, etc) -* Wire (strained for wiring to the Teensy, anything for the rows/columns) -* Soldering iron set at 600ºF or 315ºC (if temperature-controlled) -* Resin-cored solder (leaded or lead-free) -* Adequate ventilation/a fan -* Tweezers (optional) -* Wire cutters/snippers - -## How the matrix works (why we need diodes) - -The microcontroller (in this case, the Teensy 2.0) will be setup up via the firmware to send a logical 1 to the columns, one at a time, and read from the rows, all at once - this process is called matrix scanning. The matrix is a bunch of open switches that, by default, don't allow any current to pass through - the firmware will read this as no keys being pressed. As soon as you press one key down, the logical 1 that was coming from the column the keyswitch is attached to gets passed through the switch and to the corresponding row - check out the following 2x2 example: - - Column 0 being scanned Column 1 being scanned - x x - col0 col1 col0 col1 - | | | | - row0 ---(key0)---(key1) row0 ---(key0)---(key1) - | | | | - row1 ---(key2)---(key3) row1 ---(key2)---(key3) - -The `x` represents that the column/row associated has a value of 1, or is HIGH. Here, we see that no keys are being pressed, so no rows get an `x`. For one keyswitch, keep in mind that one side of the contacts is connected to its row, and the other, its column. - -When we press `key0`, `col0` gets connected to `row0`, so the values that the firmware receives for that row is `0b01` (the `0b` here means that this is a bit value, meaning all of the following digits are bits - 0 or 1 - and represent the keys in that column). We'll use this notation to show when a keyswitch has been pressed, to show that the column and row are being connected: - - Column 0 being scanned Column 1 being scanned - x x - col0 col1 col0 col1 - | | | | - x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1) - | | | | - row1 ---(key2)---(key3) row1 ---(key2)---(key3) - -We can now see that `row0` has an `x`, so has the value of 1. As a whole, the data the firmware receives when `key0` is pressed is - - col0: 0b01 - col1: 0b00 - │└row0 - └row1 - -A problem arises when you start pressing more than one key at a time. Looking at our matrix again, it should become pretty obvious: - - Column 0 being scanned Column 1 being scanned - x x - col0 col1 col0 col1 - | | | | - x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1) - | | | | - x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3) - - Remember that this ^ is still connected to row1 - -The data we get from that is: - - col0: 0b11 - col1: 0b11 - │└row0 - └row1 - -Which isn't accurate, since we only have 3 keys pressed down, not all 4. This behavior is called ghosting, and only happens in odd scenarios like this, but can be much more common on a bigger keyboard. The way we can get around this is by placing a diode after the keyswitch, but before it connects to its row. A diode only allows current to pass through one way, which will protect our other columns/rows from being activated in the previous example. We'll represent a dioded matrix like this; - - Column 0 being scanned Column 1 being scanned - x x - col0 col1 col0 col1 - │ │ | │ - (key0) (key1) (key0) (key1) - ! │ ! │ ! | ! │ - row0 ─────┴────────┘ │ row0 ─────┴────────┘ │ - │ │ | │ - (key2) (key3) (key2) (key3) - ! ! ! ! - row1 ─────┴────────┘ row1 ─────┴────────┘ - -In practical applications, the black line of the diode will be placed facing the row, and away from the keyswitch - the `!` in this case is the diode, where the gap represents the black line. A good way to remember this is to think of this symbol: `>|` - -Now when we press the three keys, invoking what would be a ghosting scenario: - - Column 0 being scanned Column 1 being scanned - x x - col0 col1 col0 col1 - │ │ │ │ - (┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1) - ! │ ! │ ! │ ! │ - x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │ - │ │ │ │ - (key2) (┌─┘3) (key2) (┌─┘3) - ! ! ! ! - row1 ─────┴────────┘ x row1 ─────┴────────┘ - -Things act as they should! Which will get us the following data: - - col0: 0b01 - col1: 0b11 - │└row0 - └row1 - -The firmware can then use this correct data to detect what it should do, and eventually, what signals it needs to send to the OS. - -## The actual hand-wiring - -### Getting things in place - -When starting this, you should have all of your stabilisers and keyswitches already installed (and optionally keycaps). If you're using a Cherry-type stabiliser (plate-mounted only, obviously), you'll need to install that before your keyswitches. If you're using Costar ones, you can installed them afterwards. - -To make things easier on yourself, make sure all of the keyswitches are oriented the same way (if they can be - not all layouts support this). Despite this, it's important to remember that the contacts on the keyswitches are completely symmetrical. We'll be using the keyswitch's left side contact for wiring the rows, and the right side one for wiring the columns. - -Get your soldering iron heated-up and collect the rest of the materials from the part list at the beginning of the guide. Place your keyboard so that the bottoms of the keyswitches are accessible - it may be a good idea to place it on a cloth to protect your keyswitches/keycaps. - -Before continuing, plan out where you're going to place your Teensy. If you're working with a board that has a large (6.25u) spacebar, it may be a good idea to place it in-between switches against the plate. Otherwise, you may want to trim some of the leads on the keyswitches where you plan on putting it - this will make it a little harder to solder the wire/diodes, but give you more room to place the Teensy. - -### Preparing the diodes - -It's a little easier to solder the diodes in place if you bend them at a 90º angle immediately after the black line - this will help to make sure you put them on the right way (direction matters), and in the correct position. The diodes will look like this when bent (with longer leads): - - ┌─────┬─┐ - ───┤ │ ├─┐ - └─────┴─┘ │ - │ - -We'll be using the long lead at the bent end to connect it to the elbow (bent part) of the next diode, creating the row. - -### Soldering the diodes - -Starting at the top-left switch, place the diode (with tweezers if you have them) on the switch so that the diode itself is vertically aligned, and the black line is facing toward you. The straight end of the diode should be touching the left contact on the switch, and the bent end should be facing to the right and resting on the switch there, like this: - - │o - ┌┴┐ o - │ │ O - ├─┤ - └┬┘ - └───────────── - -Letting the diode rest, grab your solder, and touch both it and the soldering iron to the left contact at the same time - the rosin in the solder should make it easy for the solder to flow over both the diode and the keyswitch contact. The diode may move a little, and if it does, carefully position it back it place by grabbing the bent end of the diode - the other end will become hot very quickly. If you find that it's moving too much, using needle-nose pliers of some sort may help to keep the diode still when soldering. - -The smoke that the rosin releases is harmful, so be careful not to breath it or get it in your eyes/face. - -After soldering things in place, it may be helpful to blow on the joint to push the smoke away from your face, and cool the solder quicker. You should see the solder develop a matte (not shiney) surface as it solidifies. Keep in mind that it will still be very hot afterwards, and will take a couple minutes to be cool to touch. Blow on it will accelerate this process. - -When the first diode is complete, the next one will need to be soldered to both the keyswitch, and the previous diode at the new elbow. That will look something like this: - - │o │o - ┌┴┐ o ┌┴┐ o - │ │ O │ │ O - ├─┤ ├─┤ - └┬┘ └┬┘ - └────────────────┴───────────── - -After completing a row, use the wire cutters to trim the excess wire from the tops of the diodes, and from the right side on the final switch. This process will need to completed for each row you have. - -When all of the diodes are completely soldered, it's a good idea to quickly inspect each one to ensure that your solder joints are solid and sturdy - repairing things after this is possible, but more difficult. - -### Soldering the columns - -You'll have some options in the next process - it's a good idea to insulate the column wires (since the diodes aren't), but if you're careful enough, you can use exposed wires for the columns - it's not recommended, though. If you're using single-cored wire, stripping the plastic off of the whole wire and feeding it back on is probably the best option, but can be difficult depending on the size and materials. You'll want to leave parts of the wire exposed where you're going to be solder it onto the keyswitch. - -If you're using stranded wire, it's probably easiest to just use a lot of small wires to connect each keyswitch along the column. It's possible to use one and melt through the insulation, but this isn't recommended, will produce even more harmful fumes, and can ruin your soldering iron. - -Before beginning to solder, it helps to have your wire pre-bent (if using single-cored), or at least have an idea of how you're going to route the column (especially if you're making a staggered board). Where you go in particular doesn't matter too much, as we'll be basing our keymap definitions on how it was wired - just make sure every key in a particular row is in a unique column, and that they're in order from left to right. - -If you're not using any insulation, you can try to keep the column wires elevated, and solder them near the tips of the keyswitch contacts - if the wires are sturdy enough, they won't short out to the row wiring an diodes. - -### Wiring things to the Teensy - -Now that the matrix itself is complete, it's time to connect what you've done to the Teensy. You'll be needing the number of pins equal to your number of columns + your number of rows. There are some pins on the Teensy that are special, like D6 (the LED on the chip), or some of the UART, SPI, I2C, or PWM channels, but only avoid those if you're planning something in addition to a keyboard. If you're unsure about wanting to add something later, you should have enough pins in total to avoid a couple. - -The pins you'll absolutely have to avoid are: GND, VCC, AREF, and RST - all the others are usable and accessible in the firmware. - -Place the Teensy where you plan to put it - you'll have to cut wires to length in the next step, and you'll want to make sure they reach. - -Starting with the first column on the right side, measure out how much wire you'll need to connect it to the first pin on the Teensy - it helps to pick a side that you'll be able to work down, to keep the wires from overlapping too much. It may help to leave a little bit of slack so things aren't too tight. Cut the piece of wire, and solder it to the Teensy, and then the column - you can solder it anywhere along the column, but it may be easiest at the keyswitch. Just be sure the wire doesn't separate from the keyswitch when soldering. - -As you move from column to column, it'll be helpful to write the locations of the pins down. We'll use this data to setup the matrix in the future. - -When you're done with the columns, start with the rows in the same process, from top to bottom, and write them all down. Again, you can solder anywhere along the row, as long as it's after the diode - soldering before the diode (on the keyswitch side) will cause that row not to work. - -As you move along, be sure that the Teensy is staying in place - recutting and soldering the wires is a pain! - -### Getting some basic firmware set-up - -From here, you should have a working keyboard with the correct firmware. Before we attach the Teensy permanently to the keyboard, let's quickly get some firmware loaded onto the Teensy so we can test each keyswitch. - -To start out, download [the firmware](https://github.com/jackhumbert/qmk_firmware/) - we'll be using my (Jack's) fork of TMK called QMK/Quantum. We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/). - -The first thing we're going to do is create a new project using the script in the root directory of the firmware. In your terminal, run this command with `` replaced by the name of your project - it'll need to be different from any other project in the `keyboard/` folder: - - ./new_project.sh - -You'll want to navigate to the `keyboard//` folder by typing, like the print-out from the script specifies: - - cd keyboard/ - -#### config.h - -The first thing we're going to want to modify is the `config.h` file. On line 32 and 33, you'll see `MATRIX_ROWS` and `MATRIX_COLS` - set both these variables to however many rows and columns you have on your keyboard. - -On line 38 and 39 you'll see the `COLS` and `ROWS` definitions - this is where you'll enter the pins you used, in order (left-to-right when looking at the top of the keyboard, but right-to-left when looking at the bottom). - -There are some other variables that you'll be able to modify (lines 23-29), but it's not necessary to do that now (or ever, really). - -#### \.h - -The next file you'll want to look at is `.h`. You're going to want to rewrite the `KEYMAP` definition - the format and syntax here is extremely important, so pay attention to how things are setup. The first half of the definition are considered the arguments - this is the format that you'll be following in your keymap later on, so you'll want to have as many k*xy* variables here as you do keys. The second half is the part that the firmware actually looks at, and will contain gaps depending on how you wired your matrix. - -We'll dive into how this will work with the following example. Say we have a keyboard like this: - - ┌───┬───┬───┐ - │ │ │ │ - ├───┴─┬─┴───┤ - │ │ │ - └─────┴─────┘ - -This can be described by saying the top row is 3 1u keys, and the bottom row is 2 1.5u keys. The difference between the two rows is important, because the bottom row has an unused column spot (3 v 2). Let's say that this is how we wired the columns: - - ┌───┬───┬───┐ - │ ┋ │ ┋ │ ┋ │ - ├─┋─┴─┬─┴─┋─┤ - │ ┋ │ ┋ │ - └─────┴─────┘ - -The middle column is unused on the bottom row in this example. Our `KEYMAP` definition would look like this: - - #define KEYMAP( \ - k00, k01, k02, \ - k10, k11, \ - ) \ - { \ - { k00, k01, k02 }, \ - { k10, KC_NO, k11 }, \ - } - -Notice how the top half is spaced to resemble our physical layout - this helps us understand which keys are associated with which columns. The bottom half uses the keycode `KC_NO` where there is no keyswitch wired in. It's easiest to keep the bottom half aligned in a grid to help us make sense of how the firmware actually sees the wiring. - -Let's say that instead, we wired our keyboard like this (a fair thing to do): - - ┌───┬───┬───┐ - │ ┋ │ ┋│ ┋ │ - ├─┋─┴─┬┋┴───┤ - │ ┋ │┋ │ - └─────┴─────┘ - -This would require our `KEYMAP` definition to look like this: - - #define KEYMAP( \ - k00, k01, k02, \ - k10, k11, \ - ) \ - { \ - { k00, k01, k02 }, \ - { k10, k11, KC_NO }, \ - } - -Notice how the `k11` and `KC_NO` switched places to represent the wiring, and the unused final column on the bottom row. Sometimes it'll make more sense to put a keyswitch on a particular column, but in the end, it won't matter, as long as all of them are accounted for. You can use this process to write out the `KEYMAP` for your entire keyboard - be sure to remember that your keyboard is actually backwards when looking at the underside of it. - -#### keymaps/default.c - -This is the actual keymap for your keyboard, and the main place you'll make changes as you perfect your layout. `default.c` is the file that gets pull by default when typing `make`, but you can make other files as well, and specify them by typing `make KEYMAP=`, which will pull `keymaps/.c`. - -The basis of a keymap is its layers - by default, layer 0 is active. You can activate other layers, the highest of which will be referenced first. Let's start with our base layer. - -Using our previous example, let's say we want to create the following layout: - - ┌───┬───┬───┐ - │ A │ 1 │ H │ - ├───┴─┬─┴───┤ - │ TAB │ SPC │ - └─────┴─────┘ - -This can be accomplished by using the following `keymaps` definition: - - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( /* Base */ - KC_A, KC_1, KC_H, \ - KC_TAB, KC_SPC \ - ), - }; - -Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [tmk_code/doc/keycode.txt](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keycode.txt) - there are also a lot of aliases to condense your keymap file. - -It's also important to use the `KEYMAP` function we defined earlier - this is what allows the firmware to associate our intended readable keymap with the actual wiring. - -#### Compiling your firmware - -After you've written out your entire keymap, you're ready to get the firmware compiled and onto your Teensy. Before compiling, you'll need to get your [development environment set-up](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboard/planck/PCB_GUIDE.md#setting-up-the-environment) - you can skip the dfu-programmer instructions, but you'll need to download and install the [Teensy Loader](https://www.pjrc.com/teensy/loader.html) to get the firmware on your Teensy. - -Once everything is installed, running `make` in the terminal should get you some output, and eventually a `.hex` file in that folder. If you're having trouble with this step, see the end of the guide for the trouble-shooting section. - -Once you have your `.hex` file, open up the Teensy loader application, and click the file icon. From here, navigate to your `QMK/keyboard//` folder, and select the `.hex` file. Plug in your keyboard and press the button on the Teensy - you should see the LED on the device turn off once you do. The Teensy Loader app will change a little, and the buttons should be clickable - click the download button (down arrow), and then the reset button (right arrow), and your keyboard should be ready to go! - -#### Testing your firmware - -Carefully flip your keyboard over, open up a new text document, and try typing - you should get the characters that you put into your keymap. Test each key, and note the ones that aren't working. Here's a quick trouble-shooting guide for non-working keys: - -0. Flip the keyboard back over and short the keyswitch's contacts with a piece wire - this will eliminate the possibility of the keyswitch being bad and needing to be replaced. -1. Check the solder points on the keyswitch - these need to be plump and whole. If you touch it with a moderate amount of force and it comes apart, it's not strong enough. -2. Check the solder joints on the diode - if the diode is loose, part of your row may register, while the other may not. -3. Check the solder joints on the columns - if your column wiring is loose, part or all of the column may not work. -4. Check the solder joints on both sides of the wires going to/from the Teensy - the wires need to be fully soldered and connect to both sides. -5. Check the .h file for errors and incorrectly placed `KC_NO`s - if you're unsure where they should be, instead duplicate a k*xy* variable. -6. Check to make sure you actually compiled the firmware and flashed the Teensy correctly. Unless you got error messages in the terminal, or a pop-up during flashing, you probably did everything correctly. - -If you've done all of these things, keep in mind that sometimes you might have had multiple things affecting the keyswitch, so it doesn't hurt to test the keyswitch by shorting it out at the end. - -#### Securing the Teensy, finishing your hardware, getting fancier firmware - -Now that you have a working board, it's time to get things in their permanent positions. I've often used liberal amounts of hot glue to secure and insulate things, so if that's your style, start spreading that stuff like butter. Otherwise, double-sided tape is always an elegant solution, and electrical tape is a distant second. Due to the nature of these builds, a lot of this part is up to you and how you planned (or didn't plan) things out. - -There are a lot of possibilities inside the firmware - check out the [README](https://github.com/jackhumbert/qmk_firmware/blob/master/README.md) for a full feature list, and dive into the different project (Planck, Ergodox EZ, etc) to see how people use all of them. You can always stop by [the OLKB subreddit for help!](http://reddit.com/r/olkb) - -## Trouble-shooting compiling - -### Windows - -#### fork: Resource temporarily unavailable - -http://www.avrfreaks.net/forum/windows-81-compilation-error - -### Mac - -### Linux diff --git a/HAND_WIRE.md b/HAND_WIRE.md new file mode 100644 index 0000000000..3f4d75b272 --- /dev/null +++ b/HAND_WIRE.md @@ -0,0 +1,323 @@ +# Quantum Hand-wiring Guide + +Parts list: +* *x* keyswitches (MX, Matias, Gateron, etc) +* *x* diodes +* Keyboard plate (metal, plastic, cardboard, etc) +* Wire (strained for wiring to the Teensy, anything for the rows/columns) +* Soldering iron set at 600ºF or 315ºC (if temperature-controlled) +* Resin-cored solder (leaded or lead-free) +* Adequate ventilation/a fan +* Tweezers (optional) +* Wire cutters/snippers + +## How the matrix works (why we need diodes) + +The microcontroller (in this case, the Teensy 2.0) will be setup up via the firmware to send a logical 1 to the columns, one at a time, and read from the rows, all at once - this process is called matrix scanning. The matrix is a bunch of open switches that, by default, don't allow any current to pass through - the firmware will read this as no keys being pressed. As soon as you press one key down, the logical 1 that was coming from the column the keyswitch is attached to gets passed through the switch and to the corresponding row - check out the following 2x2 example: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + row0 ---(key0)---(key1) row0 ---(key0)---(key1) + | | | | + row1 ---(key2)---(key3) row1 ---(key2)---(key3) + +The `x` represents that the column/row associated has a value of 1, or is HIGH. Here, we see that no keys are being pressed, so no rows get an `x`. For one keyswitch, keep in mind that one side of the contacts is connected to its row, and the other, its column. + +When we press `key0`, `col0` gets connected to `row0`, so the values that the firmware receives for that row is `0b01` (the `0b` here means that this is a bit value, meaning all of the following digits are bits - 0 or 1 - and represent the keys in that column). We'll use this notation to show when a keyswitch has been pressed, to show that the column and row are being connected: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1) + | | | | + row1 ---(key2)---(key3) row1 ---(key2)---(key3) + +We can now see that `row0` has an `x`, so has the value of 1. As a whole, the data the firmware receives when `key0` is pressed is + + col0: 0b01 + col1: 0b00 + │└row0 + └row1 + +A problem arises when you start pressing more than one key at a time. Looking at our matrix again, it should become pretty obvious: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1) + | | | | + x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3) + + Remember that this ^ is still connected to row1 + +The data we get from that is: + + col0: 0b11 + col1: 0b11 + │└row0 + └row1 + +Which isn't accurate, since we only have 3 keys pressed down, not all 4. This behavior is called ghosting, and only happens in odd scenarios like this, but can be much more common on a bigger keyboard. The way we can get around this is by placing a diode after the keyswitch, but before it connects to its row. A diode only allows current to pass through one way, which will protect our other columns/rows from being activated in the previous example. We'll represent a dioded matrix like this; + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + │ │ | │ + (key0) (key1) (key0) (key1) + ! │ ! │ ! | ! │ + row0 ─────┴────────┘ │ row0 ─────┴────────┘ │ + │ │ | │ + (key2) (key3) (key2) (key3) + ! ! ! ! + row1 ─────┴────────┘ row1 ─────┴────────┘ + +In practical applications, the black line of the diode will be placed facing the row, and away from the keyswitch - the `!` in this case is the diode, where the gap represents the black line. A good way to remember this is to think of this symbol: `>|` + +Now when we press the three keys, invoking what would be a ghosting scenario: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + │ │ │ │ + (┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1) + ! │ ! │ ! │ ! │ + x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │ + │ │ │ │ + (key2) (┌─┘3) (key2) (┌─┘3) + ! ! ! ! + row1 ─────┴────────┘ x row1 ─────┴────────┘ + +Things act as they should! Which will get us the following data: + + col0: 0b01 + col1: 0b11 + │└row0 + └row1 + +The firmware can then use this correct data to detect what it should do, and eventually, what signals it needs to send to the OS. + +## The actual hand-wiring + +### Getting things in place + +When starting this, you should have all of your stabilisers and keyswitches already installed (and optionally keycaps). If you're using a Cherry-type stabiliser (plate-mounted only, obviously), you'll need to install that before your keyswitches. If you're using Costar ones, you can installed them afterwards. + +To make things easier on yourself, make sure all of the keyswitches are oriented the same way (if they can be - not all layouts support this). Despite this, it's important to remember that the contacts on the keyswitches are completely symmetrical. We'll be using the keyswitch's left side contact for wiring the rows, and the right side one for wiring the columns. + +Get your soldering iron heated-up and collect the rest of the materials from the part list at the beginning of the guide. Place your keyboard so that the bottoms of the keyswitches are accessible - it may be a good idea to place it on a cloth to protect your keyswitches/keycaps. + +Before continuing, plan out where you're going to place your Teensy. If you're working with a board that has a large (6.25u) spacebar, it may be a good idea to place it in-between switches against the plate. Otherwise, you may want to trim some of the leads on the keyswitches where you plan on putting it - this will make it a little harder to solder the wire/diodes, but give you more room to place the Teensy. + +### Preparing the diodes + +It's a little easier to solder the diodes in place if you bend them at a 90º angle immediately after the black line - this will help to make sure you put them on the right way (direction matters), and in the correct position. The diodes will look like this when bent (with longer leads): + + ┌─────┬─┐ + ───┤ │ ├─┐ + └─────┴─┘ │ + │ + +We'll be using the long lead at the bent end to connect it to the elbow (bent part) of the next diode, creating the row. + +### Soldering the diodes + +Starting at the top-left switch, place the diode (with tweezers if you have them) on the switch so that the diode itself is vertically aligned, and the black line is facing toward you. The straight end of the diode should be touching the left contact on the switch, and the bent end should be facing to the right and resting on the switch there, like this: + + │o + ┌┴┐ o + │ │ O + ├─┤ + └┬┘ + └───────────── + +Letting the diode rest, grab your solder, and touch both it and the soldering iron to the left contact at the same time - the rosin in the solder should make it easy for the solder to flow over both the diode and the keyswitch contact. The diode may move a little, and if it does, carefully position it back it place by grabbing the bent end of the diode - the other end will become hot very quickly. If you find that it's moving too much, using needle-nose pliers of some sort may help to keep the diode still when soldering. + +The smoke that the rosin releases is harmful, so be careful not to breath it or get it in your eyes/face. + +After soldering things in place, it may be helpful to blow on the joint to push the smoke away from your face, and cool the solder quicker. You should see the solder develop a matte (not shiney) surface as it solidifies. Keep in mind that it will still be very hot afterwards, and will take a couple minutes to be cool to touch. Blow on it will accelerate this process. + +When the first diode is complete, the next one will need to be soldered to both the keyswitch, and the previous diode at the new elbow. That will look something like this: + + │o │o + ┌┴┐ o ┌┴┐ o + │ │ O │ │ O + ├─┤ ├─┤ + └┬┘ └┬┘ + └────────────────┴───────────── + +After completing a row, use the wire cutters to trim the excess wire from the tops of the diodes, and from the right side on the final switch. This process will need to completed for each row you have. + +When all of the diodes are completely soldered, it's a good idea to quickly inspect each one to ensure that your solder joints are solid and sturdy - repairing things after this is possible, but more difficult. + +### Soldering the columns + +You'll have some options in the next process - it's a good idea to insulate the column wires (since the diodes aren't), but if you're careful enough, you can use exposed wires for the columns - it's not recommended, though. If you're using single-cored wire, stripping the plastic off of the whole wire and feeding it back on is probably the best option, but can be difficult depending on the size and materials. You'll want to leave parts of the wire exposed where you're going to be solder it onto the keyswitch. + +If you're using stranded wire, it's probably easiest to just use a lot of small wires to connect each keyswitch along the column. It's possible to use one and melt through the insulation, but this isn't recommended, will produce even more harmful fumes, and can ruin your soldering iron. + +Before beginning to solder, it helps to have your wire pre-bent (if using single-cored), or at least have an idea of how you're going to route the column (especially if you're making a staggered board). Where you go in particular doesn't matter too much, as we'll be basing our keymap definitions on how it was wired - just make sure every key in a particular row is in a unique column, and that they're in order from left to right. + +If you're not using any insulation, you can try to keep the column wires elevated, and solder them near the tips of the keyswitch contacts - if the wires are sturdy enough, they won't short out to the row wiring an diodes. + +### Wiring things to the Teensy + +Now that the matrix itself is complete, it's time to connect what you've done to the Teensy. You'll be needing the number of pins equal to your number of columns + your number of rows. There are some pins on the Teensy that are special, like D6 (the LED on the chip), or some of the UART, SPI, I2C, or PWM channels, but only avoid those if you're planning something in addition to a keyboard. If you're unsure about wanting to add something later, you should have enough pins in total to avoid a couple. + +The pins you'll absolutely have to avoid are: GND, VCC, AREF, and RST - all the others are usable and accessible in the firmware. + +Place the Teensy where you plan to put it - you'll have to cut wires to length in the next step, and you'll want to make sure they reach. + +Starting with the first column on the right side, measure out how much wire you'll need to connect it to the first pin on the Teensy - it helps to pick a side that you'll be able to work down, to keep the wires from overlapping too much. It may help to leave a little bit of slack so things aren't too tight. Cut the piece of wire, and solder it to the Teensy, and then the column - you can solder it anywhere along the column, but it may be easiest at the keyswitch. Just be sure the wire doesn't separate from the keyswitch when soldering. + +As you move from column to column, it'll be helpful to write the locations of the pins down. We'll use this data to setup the matrix in the future. + +When you're done with the columns, start with the rows in the same process, from top to bottom, and write them all down. Again, you can solder anywhere along the row, as long as it's after the diode - soldering before the diode (on the keyswitch side) will cause that row not to work. + +As you move along, be sure that the Teensy is staying in place - recutting and soldering the wires is a pain! + +### Getting some basic firmware set-up + +From here, you should have a working keyboard with the correct firmware. Before we attach the Teensy permanently to the keyboard, let's quickly get some firmware loaded onto the Teensy so we can test each keyswitch. + +To start out, download [the firmware](https://github.com/jackhumbert/qmk_firmware/) - we'll be using my (Jack's) fork of TMK called QMK/Quantum. We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/). + +The first thing we're going to do is create a new project using the script in the root directory of the firmware. In your terminal, run this command with `` replaced by the name of your project - it'll need to be different from any other project in the `keyboard/` folder: + + ./new_project.sh + +You'll want to navigate to the `keyboard//` folder by typing, like the print-out from the script specifies: + + cd keyboard/ + +#### config.h + +The first thing we're going to want to modify is the `config.h` file. On line 32 and 33, you'll see `MATRIX_ROWS` and `MATRIX_COLS` - set both these variables to however many rows and columns you have on your keyboard. + +On line 38 and 39 you'll see the `COLS` and `ROWS` definitions - this is where you'll enter the pins you used, in order (left-to-right when looking at the top of the keyboard, but right-to-left when looking at the bottom). + +There are some other variables that you'll be able to modify (lines 23-29), but it's not necessary to do that now (or ever, really). + +#### \.h + +The next file you'll want to look at is `.h`. You're going to want to rewrite the `KEYMAP` definition - the format and syntax here is extremely important, so pay attention to how things are setup. The first half of the definition are considered the arguments - this is the format that you'll be following in your keymap later on, so you'll want to have as many k*xy* variables here as you do keys. The second half is the part that the firmware actually looks at, and will contain gaps depending on how you wired your matrix. + +We'll dive into how this will work with the following example. Say we have a keyboard like this: + + ┌───┬───┬───┐ + │ │ │ │ + ├───┴─┬─┴───┤ + │ │ │ + └─────┴─────┘ + +This can be described by saying the top row is 3 1u keys, and the bottom row is 2 1.5u keys. The difference between the two rows is important, because the bottom row has an unused column spot (3 v 2). Let's say that this is how we wired the columns: + + ┌───┬───┬───┐ + │ ┋ │ ┋ │ ┋ │ + ├─┋─┴─┬─┴─┋─┤ + │ ┋ │ ┋ │ + └─────┴─────┘ + +The middle column is unused on the bottom row in this example. Our `KEYMAP` definition would look like this: + + #define KEYMAP( \ + k00, k01, k02, \ + k10, k11, \ + ) \ + { \ + { k00, k01, k02 }, \ + { k10, KC_NO, k11 }, \ + } + +Notice how the top half is spaced to resemble our physical layout - this helps us understand which keys are associated with which columns. The bottom half uses the keycode `KC_NO` where there is no keyswitch wired in. It's easiest to keep the bottom half aligned in a grid to help us make sense of how the firmware actually sees the wiring. + +Let's say that instead, we wired our keyboard like this (a fair thing to do): + + ┌───┬───┬───┐ + │ ┋ │ ┋│ ┋ │ + ├─┋─┴─┬┋┴───┤ + │ ┋ │┋ │ + └─────┴─────┘ + +This would require our `KEYMAP` definition to look like this: + + #define KEYMAP( \ + k00, k01, k02, \ + k10, k11, \ + ) \ + { \ + { k00, k01, k02 }, \ + { k10, k11, KC_NO }, \ + } + +Notice how the `k11` and `KC_NO` switched places to represent the wiring, and the unused final column on the bottom row. Sometimes it'll make more sense to put a keyswitch on a particular column, but in the end, it won't matter, as long as all of them are accounted for. You can use this process to write out the `KEYMAP` for your entire keyboard - be sure to remember that your keyboard is actually backwards when looking at the underside of it. + +#### keymaps/default.c + +This is the actual keymap for your keyboard, and the main place you'll make changes as you perfect your layout. `default.c` is the file that gets pull by default when typing `make`, but you can make other files as well, and specify them by typing `make KEYMAP=`, which will pull `keymaps/.c`. + +The basis of a keymap is its layers - by default, layer 0 is active. You can activate other layers, the highest of which will be referenced first. Let's start with our base layer. + +Using our previous example, let's say we want to create the following layout: + + ┌───┬───┬───┐ + │ A │ 1 │ H │ + ├───┴─┬─┴───┤ + │ TAB │ SPC │ + └─────┴─────┘ + +This can be accomplished by using the following `keymaps` definition: + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ + ), + }; + +Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [tmk_code/doc/keycode.txt](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keycode.txt) - there are also a lot of aliases to condense your keymap file. + +It's also important to use the `KEYMAP` function we defined earlier - this is what allows the firmware to associate our intended readable keymap with the actual wiring. + +#### Compiling your firmware + +After you've written out your entire keymap, you're ready to get the firmware compiled and onto your Teensy. Before compiling, you'll need to get your [development environment set-up](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboard/planck/PCB_GUIDE.md#setting-up-the-environment) - you can skip the dfu-programmer instructions, but you'll need to download and install the [Teensy Loader](https://www.pjrc.com/teensy/loader.html) to get the firmware on your Teensy. + +Once everything is installed, running `make` in the terminal should get you some output, and eventually a `.hex` file in that folder. If you're having trouble with this step, see the end of the guide for the trouble-shooting section. + +Once you have your `.hex` file, open up the Teensy loader application, and click the file icon. From here, navigate to your `QMK/keyboard//` folder, and select the `.hex` file. Plug in your keyboard and press the button on the Teensy - you should see the LED on the device turn off once you do. The Teensy Loader app will change a little, and the buttons should be clickable - click the download button (down arrow), and then the reset button (right arrow), and your keyboard should be ready to go! + +#### Testing your firmware + +Carefully flip your keyboard over, open up a new text document, and try typing - you should get the characters that you put into your keymap. Test each key, and note the ones that aren't working. Here's a quick trouble-shooting guide for non-working keys: + +0. Flip the keyboard back over and short the keyswitch's contacts with a piece wire - this will eliminate the possibility of the keyswitch being bad and needing to be replaced. +1. Check the solder points on the keyswitch - these need to be plump and whole. If you touch it with a moderate amount of force and it comes apart, it's not strong enough. +2. Check the solder joints on the diode - if the diode is loose, part of your row may register, while the other may not. +3. Check the solder joints on the columns - if your column wiring is loose, part or all of the column may not work. +4. Check the solder joints on both sides of the wires going to/from the Teensy - the wires need to be fully soldered and connect to both sides. +5. Check the .h file for errors and incorrectly placed `KC_NO`s - if you're unsure where they should be, instead duplicate a k*xy* variable. +6. Check to make sure you actually compiled the firmware and flashed the Teensy correctly. Unless you got error messages in the terminal, or a pop-up during flashing, you probably did everything correctly. + +If you've done all of these things, keep in mind that sometimes you might have had multiple things affecting the keyswitch, so it doesn't hurt to test the keyswitch by shorting it out at the end. + +#### Securing the Teensy, finishing your hardware, getting fancier firmware + +Now that you have a working board, it's time to get things in their permanent positions. I've often used liberal amounts of hot glue to secure and insulate things, so if that's your style, start spreading that stuff like butter. Otherwise, double-sided tape is always an elegant solution, and electrical tape is a distant second. Due to the nature of these builds, a lot of this part is up to you and how you planned (or didn't plan) things out. + +There are a lot of possibilities inside the firmware - check out the [README](https://github.com/jackhumbert/qmk_firmware/blob/master/README.md) for a full feature list, and dive into the different project (Planck, Ergodox EZ, etc) to see how people use all of them. You can always stop by [the OLKB subreddit for help!](http://reddit.com/r/olkb) + +## Trouble-shooting compiling + +### Windows + +#### fork: Resource temporarily unavailable + +http://www.avrfreaks.net/forum/windows-81-compilation-error + +### Mac + +### Linux -- cgit v1.2.3 From 0eb252eb61b1ec21131f8b3bd4048ff5c434f921 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:16:43 -0500 Subject: Added Mac section (copy/pasted from PCB_GUIDE.md) --- BUILD_GUIDE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index d7106d9183..07ed0e98d7 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -6,7 +6,17 @@ What these instructions look like depends on whether NoahAndrews's setup scripts get merged ### Mac +If you're using homebrew, you can use the following commands: + brew tap osx-cross/avr + brew install avr-libc + brew install dfu-programmer + +Otherwise, these instructions will work: + +1. Install Xcode from the App Store. +2. Install the Command Line Tools from `Xcode->Preferences->Downloads`. +3. Install [DFU-Programmer][dfu-prog]. ### Linux -- cgit v1.2.3 From 492e88b24b5c95b028e5e1d97873558280f14ada Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:33:38 -0500 Subject: Updated README to point to new build guide --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6cb73f1804..6a6bbed40b 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ The documentation below explains QMK customizations and elaborates on some of th ## Getting started -* **If you're looking to customize a keyboard that currently runs QMK or TMK** , find your keyboard's directory under `/keyboard/` and read the README file. This will get you all set up. -* Read the [QUICK_START.md](QUICK_START.md) if you want to hit the ground running with minimal fuss or you aren't a technical person and you just want to build the firmware with the least amount of hassle possible. +* [BUILD_GUIDE.md](BUILD_GUIDE.md) contains instructions to set up a build environment, build the firmware, and deploy it to a keyboard. Once your build environment has been set up, all `make` commands to actually build the firmware must be run from a folder in `keyboard/`. +* If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there. * If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh `, which will create `/keyboard/` with all the necessary components for a Quantum project. You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you. @@ -309,3 +309,4 @@ what things are (and likely aren't) too risky. - EEPROM has around a 100000 write cycle. You shouldn't rewrite the firmware repeatedly and continually; that'll burn the EEPROM eventually. + \ No newline at end of file -- cgit v1.2.3 From b9c22ff8fc0e27b1bcc4f62785289ca2c7e695d9 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Wed, 2 Mar 2016 22:38:22 -0500 Subject: Clarified recommended Mac setup method --- BUILD_GUIDE.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 07ed0e98d7..783d00e8d1 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -6,13 +6,15 @@ What these instructions look like depends on whether NoahAndrews's setup scripts get merged ### Mac -If you're using homebrew, you can use the following commands: +If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew tap osx-cross/avr brew install avr-libc brew install dfu-programmer -Otherwise, these instructions will work: +This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. + +You can also try these instructions: 1. Install Xcode from the App Store. 2. Install the Command Line Tools from `Xcode->Preferences->Downloads`. -- cgit v1.2.3 From 4ca43225011ac94bd0a7976baf7f84059274dfbf Mon Sep 17 00:00:00 2001 From: plgruener Date: Fri, 19 Feb 2016 21:04:30 +0100 Subject: update neo keymap --- quantum/keymap_extras/keymap_neo2.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index 055d7d0d1e..a35ba55a55 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -35,6 +35,25 @@ #define NEO_UE DE_Y #define NEO_SS DE_UE +#define NEO_DOT DE_DOT +#define NEO_COMM DE_COMM + +#define NEO_1 DE_1 +#define NEO_2 DE_2 +#define NEO_3 DE_3 +#define NEO_4 DE_4 +#define NEO_5 DE_5 +#define NEO_6 DE_6 +#define NEO_7 DE_7 +#define NEO_8 DE_8 +#define NEO_9 DE_9 +#define NEO_0 DE_0 +#define NEO_MINS DE_SS + +#define NEO_ACUT DE_PLUS +#define NEO_GRV DE_ACUT +#define NEO_CIRC DE_CIRC + #define NEO_L1_L KC_CAPS #define NEO_L1_R DE_HASH -- cgit v1.2.3 From de1e200021dc55facd84a210ff0b22d366cfc290 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 4 Mar 2016 10:15:21 -0500 Subject: Fix #174 --- new_project.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/new_project.sh b/new_project.sh index 199ced4113..28de9c2f9f 100755 --- a/new_project.sh +++ b/new_project.sh @@ -13,10 +13,9 @@ sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/config.h > keyboard/$KEYBOARD sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/README.md > keyboard/$KEYBOARD/README.md sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/Makefile > keyboard/$KEYBOARD/Makefile sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/default.c > keyboard/$KEYBOARD/keymaps/default.c -cp quantum/template/bootloader.hex keyboard/$KEYBOARD/bootloader.hex echo "######################################################" echo "# keyboard/$KEYBOARD project created. To start" echo "# working on things, use the following command:" echo "# cd keyboard/$KEYBOARD" -echo "######################################################" \ No newline at end of file +echo "######################################################" -- cgit v1.2.3 From ee1b94045e5bebda517119cb1853b0ab3fd0f499 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 4 Mar 2016 10:53:58 -0500 Subject: Remove extraneous comma --- quantum/template/template.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/template/template.h b/quantum/template/template.h index d4d78e4c91..a15061b267 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -12,7 +12,7 @@ // The second converts the arguments into a two-dimensional array #define KEYMAP( \ k00, k01, k02, \ - k10, k11, \ + k10, k11 \ ) \ { \ { k00, k01, k02 }, \ -- cgit v1.2.3 From c9c763e0007fa7fcebe8dde64f270258468ca757 Mon Sep 17 00:00:00 2001 From: yoyoerx Date: Fri, 4 Mar 2016 14:38:38 -0500 Subject: Cygwin Based Users Guide v0.1 --- keyboard/planck/CYGWIN_GUIDE.md | 237 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100755 keyboard/planck/CYGWIN_GUIDE.md diff --git a/keyboard/planck/CYGWIN_GUIDE.md b/keyboard/planck/CYGWIN_GUIDE.md new file mode 100755 index 0000000000..896a42c764 --- /dev/null +++ b/keyboard/planck/CYGWIN_GUIDE.md @@ -0,0 +1,237 @@ +#Planck Advanced (but not too advanced) Cygwin Users Guide +If you are a user of the [Cygwin environment](https://cygwin.com) in Windows and want the freedom to use the latest tools available, then this is the guide for you. If compiling your own copy of the latest and greatest Gnu C compiler makes you super happy, then this is the guide for you. If the command line make you smile, then this is the guide for you. + + +This guide was written step by step as I went through the process on a Windows10 x86_64 based system. This should be generally applicable to to any Windows Environment with Cygwin. + + +#####Do not skip steps. Do not move past a step until the previous step finishes successfully. + + + +based on [avr-libc installation guide](http://www.nongnu.org/avr-libc/user-manual/install_tools.html) + + +###get the required packages +Download the Cygwin Installer ([x86_64](https://cygwin.com/setup-x86_64.exe) or [x86_32](https://cygwin.com/setup-x86.exe)) and install the default system plus the following if they are not already selected: +-devel/gcc-core +-devel/gcc-g++ +-devel/flex +-devel/git +-libs/libglib2.0_0 +-libs/libgcc1 +-interpreters/m4 +-web/wget + +The following sources will be required: +-get [gmp](https://gmplib.org/) (6.1.0) +-get [mpfr](http://www.mpfr.org/) (3.1.3) +-get [mpc](http://www.multiprecision.org/) (1.0.3) +-get [binutils](https://www.sourceware.org/binutils/) (2.26) +-get [gcc](https://gcc.gnu.org/) (5.3.0) +-get [avr-libc](http://www.nongnu.org/avr-libc/) (2.0.0) + +The `dfu-programmer` will be required to flash the new firmware +-get [dfu-programmer](https://dfu-programmer.github.io/) (0.7.2) + + +The set of commands below will create a directory (`~/local/avr`) for the sources you compile to be installed on the machine and a directory (`~/src`) for these source files to be stored. The commands then download the sources of the needed packages and unpack them. note: the expand commands are different depending on if the packages are offered as a bz2 or gz archive + +``` +$ mkdir ~/local/avr +$ mkdir ~/src +$ cd ~/src +$ wget https://gmplib.org/download/gmp/gmp-6.1.0.tar.bz2 +$ wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2 +$ wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz +$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.gz +$ wget http://mirror0.babylon.network/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.gz +$ wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-2.0.0.tar.bz2 +$ tar -xjf gmp-6.1.0.tar.bz2 +$ tar -xjf mpfr-3.1.3.tar.bz2 +$ tar -zxf mpc-1.0.3.tar.gz +$ tar -zxf binutils-2.26.tar.gz +$ tar -zxf gcc-5.3.0.tar.gz +$ tar -xjf avr-libc-2.0.0.tar.bz2 +``` + +###setup build environment +These commands will set up the install directory and the PATH variable, which will allow you to access your installed packages. note: if you close the cygwin terminal window, you will need to rerun these commands, they are not permanent +``` +$ PREFIX=$HOME/local/avr +$ export PREFIX +$ PATH=/usr/local/bin:/usr/local/lib:/usr/local/include:/bin:/lib:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS +$ PATH=$PATH:$PREFIX/bin +$ export PATH +``` + +##The gcc required math library packages +The following packages are required to be complied and installed in order to compile gcc. They are not available through the cygwin package system, so we have to make them ourselves. They must be complied in this order because each one depends on the previous. + +###build and install gmp +``` +$ cd ~/src/gmp-6.1.0 +$ ./configure --enable-static --disable-shared +$ make +$ make check +$ make install +``` + +###build and install mpfr +``` +$ cd ~/src/mpfr-3.1.3 +$ ./configure --with-gmp-build=../gmp-6.1.0 --enable-static --disable-shared +$ make +$ make check +$ make install +``` + +###build and install mpc +``` +$ cd ~/src/mpc-1.0.3 +$ ./configure --with-gmp=/usr/local --with-mpfr=/usr/local --enable-static --disable-shared +$ make +$ make check +$ make install +``` + +##OPTIONAL Part +You can build and install a brand new gcc or you can use the one supplied by cygwin. This will take about 4-5 hours to compile (It is a "native build", so it does the entire build **3 times**. This takes a long while). I would skip it. +###build and install gcc on your machine +``` +$ cd ~/src/gcc-5.3.0 +$ mkdir obj-local +$ cd obj-local +$ ../configure --enable-languages=c,c++ --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --enable-static --disable-shared +$ make +$ make install +``` + +###build and install binutils on your machine +``` +$ cd ~/src/binutils-2.26 +$ mkdir obj-local +$ cd obj-local +$ ../configure +$ make +$ make install +``` +##End OPTIONAL Part + +##Buliding binutils, gcc and avr-libc for the AVR system +Now we can make the critical stuff for compiling our firmware, binutils, gcc, and avr-libc for the AVR architectures. These allow us to build and manipulate the firmware for the Keyboard. + +###build binutils for avr +``` +$ cd ~/src/binutils-2.26 +$ mkdir obj-avr +$ cd obj-avr +$ ../configure --prefix=$PREFIX --target=avr --disable-nls +$ make +$ make install +``` + +###build gcc for avr +``` +$ cd ~/src/gcc-5.3.0 +$ mkdir obj-avr +$ cd obj-avr +$ ../configure --prefix=$PREFIX --target=avr --enable-languages=c,c++ --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --enable-static --disable-shared --disable-nls --disable-libssp --with-dwarf2 +$ make +$ make install +``` + +For building the avr-libc, we have to specify the host build system. in my case it is `x86_64-unknown-cygwin`. You can look for build system type in the gcc configure notes for the proper `--build` specification to pass when you configure avr-libc + +###build avr-libc for avr +``` +$ cd ~/src/avr-libc-2.0.0 +$ ./configure --prefix=$PREFIX --build=x86_64-unknown-cygwin --host=avr +$ make +$ make install +``` + +##Install dfu-programmer +To install the dfu-programmer, we must get if from [their website](https://dfu-programmer.github.io/) (no fancy command line tricks here, but [this](http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip) might work). +Copy this file into your cygwin home directory. (For me, it is `C:\cygwin64\home\Kevin`), extract the files, move `dfu-programmer.exe` to `~/local/avr/bin`. Most obnoxiously, the `libusb0_x86.dll` and `libusb0.sys` need to be moved from `dfu/dfu-prog-usb-1.2.2/x86/` to a directory in the Windows PATH and the Cygwin PATH. I achieved this by moving the files in Windows Explorer to `C:\cygwin64\home\Kevin\local\avr\bin` Then, in a WINDOWS command prompt running: +``` +C:\> set PATH=%PATH%;C:\cygwin64\home\Kevin\local\avr\bin +``` +Adjust your path (for username) as needed. Also, `libusb0_x86.dll` needs to be renamed to `libusb0.dll`. Why must this be so hard? You can tell that you were successful this way: +``` +$ which dfu-programmer +/home/Kevin/local/avr/bin/dfu-programmer + +$ dfu-programmer +dfu-programmer 0.7.2 +https://github.com/dfu-programmer/dfu-programmer +Type 'dfu-programmer --help' for a list of commands + 'dfu-programmer --targets' to list supported target devices +``` +If you are not getting the above result, you will not be able to flash the firmware! +-Try making sure your PATH variables are set correctly for both windows and cygwin. +-Do not try to extract it with cygwin's `unzip` as it does not set the executable permissions correctly. + +####Install the USB drivers +These drivers are included in the `dfu-programmer` 0.7.2 (but you can get newer ones [here](http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip)) and allow the dfu to program the firmware. From an administrator-privileged Windows terminal, run the following command (adjust the path as necessary) and accept the prompt that pops up: +``` +C:\> pnputil -i -a C:\cygwin64\home\Kevin\dfu-prog-usb-1.2.2\atmel_usb_dfu.inf +``` +This should be the result: +``` +Microsoft PnP Utility + +Processing inf : atmel_usb_dfu.inf +Successfully installed the driver on a device on the system. +Driver package added successfully. +Published name : oem104.inf + + +Total attempted: 1 +Number successfully imported: 1 +``` + +##Building and Flashing the Planck firmware! + +If you did everything else right. This part should be a snap! Grab the latest sources from github, make the Plank firmware, then flash it. + +###build Planck and load the firmware +``` +$ cd ~/src +$ git clone https://github.com/jackhumbert/qmk_firmware.git +$ cd qmk_firmware/keyboard/planck +$ make +``` +Make sure there are no errors. You should end up with this or something similar: + +``` +Creating load file for Flash: planck.hex +avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature planck.elf planck.hex + +Creating load file for EEPROM: planck.eep +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ +--change-section-lma .eeprom=0 --no-change-warnings -O ihex planck.elf planck.eep || exit 0 + +Creating Extended Listing: planck.lss +avr-objdump -h -S -z planck.elf > planck.lss + +Creating Symbol Table: planck.sym +avr-nm -n planck.elf > planck.sym + +Size after: + text data bss dec hex filename + 18602 82 155 18839 4997 planck.elf + +-------- end -------- +``` + +If you don't, you did not build the firmware, and you will have nothing to flash. If you have the fresh clone from github, it was probably something in the install process, go check and see what didn't work and threw errors or what steps you might have missed. + +But if everything went OK, you are ready to flash! Press the reset button on the bottom of the Planck, wait two seconds, then: +``` +$ make dfu +``` +. +. +. +profit!!! -- cgit v1.2.3 From 2f6f45aa3ee6cdeaa8e3904926a662d7a0a681c5 Mon Sep 17 00:00:00 2001 From: yoyoerx Date: Fri, 4 Mar 2016 15:04:42 -0500 Subject: Cygwin Based Users Guidev0.2 -formatting revisions --- keyboard/planck/CYGWIN_GUIDE.md | 94 ++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/keyboard/planck/CYGWIN_GUIDE.md b/keyboard/planck/CYGWIN_GUIDE.md index 896a42c764..2fa4452f1c 100755 --- a/keyboard/planck/CYGWIN_GUIDE.md +++ b/keyboard/planck/CYGWIN_GUIDE.md @@ -1,41 +1,41 @@ -#Planck Advanced (but not too advanced) Cygwin Users Guide -If you are a user of the [Cygwin environment](https://cygwin.com) in Windows and want the freedom to use the latest tools available, then this is the guide for you. If compiling your own copy of the latest and greatest Gnu C compiler makes you super happy, then this is the guide for you. If the command line make you smile, then this is the guide for you. +#Planck Advanced (but not too advanced) `cygwin` Users Guide +If you are a user of the [cygwin environment](https://cygwin.com) in Windows and want the freedom to use the latest tools available, then this is the guide for you. If compiling your own copy of the latest and greatest Gnu C Compiler makes you super happy, then this is the guide for you. If the command line make you smile, then this is the guide for you. -This guide was written step by step as I went through the process on a Windows10 x86_64 based system. This should be generally applicable to to any Windows Environment with Cygwin. +This guide was written step by step as I went through the process on a `Windows 10` `x86_64` based system. This should be generally applicable to to any `Windows` environment with `cygwin`. #####Do not skip steps. Do not move past a step until the previous step finishes successfully. -based on [avr-libc installation guide](http://www.nongnu.org/avr-libc/user-manual/install_tools.html) +Based on [avr-libc installation guide](http://www.nongnu.org/avr-libc/user-manual/install_tools.html) -###get the required packages -Download the Cygwin Installer ([x86_64](https://cygwin.com/setup-x86_64.exe) or [x86_32](https://cygwin.com/setup-x86.exe)) and install the default system plus the following if they are not already selected: --devel/gcc-core --devel/gcc-g++ --devel/flex --devel/git --libs/libglib2.0_0 --libs/libgcc1 --interpreters/m4 --web/wget +##Get the Required Packages +Download the `cygwin` setup ([x86_64](https://cygwin.com/setup-x86_64.exe)) and install the default system plus the following if they are not already selected: +- devel/gcc-core +- devel/gcc-g++ +- devel/flex +- devel/git +- libs/libglib2.0_0 +- libs/libgcc1 +- interpreters/m4 +- web/wget The following sources will be required: --get [gmp](https://gmplib.org/) (6.1.0) --get [mpfr](http://www.mpfr.org/) (3.1.3) --get [mpc](http://www.multiprecision.org/) (1.0.3) --get [binutils](https://www.sourceware.org/binutils/) (2.26) --get [gcc](https://gcc.gnu.org/) (5.3.0) --get [avr-libc](http://www.nongnu.org/avr-libc/) (2.0.0) +- [gmp](https://gmplib.org/) (6.1.0) +- [mpfr](http://www.mpfr.org/) (3.1.3) +- [mpc](http://www.multiprecision.org/) (1.0.3) +- [binutils](https://www.sourceware.org/binutils/) (2.26) +- [gcc](https://gcc.gnu.org/) (5.3.0) +- [avr-libc](http://www.nongnu.org/avr-libc/) (2.0.0) The `dfu-programmer` will be required to flash the new firmware --get [dfu-programmer](https://dfu-programmer.github.io/) (0.7.2) +- [dfu-programmer](https://dfu-programmer.github.io/) (0.7.2) -The set of commands below will create a directory (`~/local/avr`) for the sources you compile to be installed on the machine and a directory (`~/src`) for these source files to be stored. The commands then download the sources of the needed packages and unpack them. note: the expand commands are different depending on if the packages are offered as a bz2 or gz archive +The set of commands below will create a directory (`~/local/avr`) for the sources you compile to be installed on the machine and a directory (`~/src`) for these source files to be stored. The commands then download the sources of the needed packages and unpack them. Note: the expand commands are different depending on if the packages are offered as a `bz2` or `gz` archive ``` $ mkdir ~/local/avr @@ -55,8 +55,8 @@ $ tar -zxf gcc-5.3.0.tar.gz $ tar -xjf avr-libc-2.0.0.tar.bz2 ``` -###setup build environment -These commands will set up the install directory and the PATH variable, which will allow you to access your installed packages. note: if you close the cygwin terminal window, you will need to rerun these commands, they are not permanent +##Setup the Build Environment +These commands will set up the install directory and the `PATH` variable, which will allow you to access your installed packages. Note: if you close the `cygwin` terminal window, you will need to rerun these commands, they are not permanent. ``` $ PREFIX=$HOME/local/avr $ export PREFIX @@ -65,10 +65,10 @@ $ PATH=$PATH:$PREFIX/bin $ export PATH ``` -##The gcc required math library packages -The following packages are required to be complied and installed in order to compile gcc. They are not available through the cygwin package system, so we have to make them ourselves. They must be complied in this order because each one depends on the previous. +##The `gcc` Required Math Library Packages +The following packages are required to be complied and installed in order to compile `gcc`. They are not available through the `cygwin` package system, so we have to make them ourselves. They must be complied in this order because each one depends on the previous. -###build and install gmp +###Build and Install `gmp` ``` $ cd ~/src/gmp-6.1.0 $ ./configure --enable-static --disable-shared @@ -77,7 +77,7 @@ $ make check $ make install ``` -###build and install mpfr +###Build and Install `mpfr` ``` $ cd ~/src/mpfr-3.1.3 $ ./configure --with-gmp-build=../gmp-6.1.0 --enable-static --disable-shared @@ -86,7 +86,7 @@ $ make check $ make install ``` -###build and install mpc +###Build and Install `mpc` ``` $ cd ~/src/mpc-1.0.3 $ ./configure --with-gmp=/usr/local --with-mpfr=/usr/local --enable-static --disable-shared @@ -96,8 +96,8 @@ $ make install ``` ##OPTIONAL Part -You can build and install a brand new gcc or you can use the one supplied by cygwin. This will take about 4-5 hours to compile (It is a "native build", so it does the entire build **3 times**. This takes a long while). I would skip it. -###build and install gcc on your machine +You can build and install a brand new `gcc` or you can use the one supplied by `cygwin`. This will take about 4-5 hours to compile (It is a "native build", so it does the entire build **3 times**. This takes a long while). I would skip it. +###Build and Install `gcc` on your Machine ``` $ cd ~/src/gcc-5.3.0 $ mkdir obj-local @@ -107,7 +107,7 @@ $ make $ make install ``` -###build and install binutils on your machine +###Build and Install `binutils` on your Machine ``` $ cd ~/src/binutils-2.26 $ mkdir obj-local @@ -118,10 +118,10 @@ $ make install ``` ##End OPTIONAL Part -##Buliding binutils, gcc and avr-libc for the AVR system -Now we can make the critical stuff for compiling our firmware, binutils, gcc, and avr-libc for the AVR architectures. These allow us to build and manipulate the firmware for the Keyboard. +##Buliding `binutils`, `gcc`, and `avr-libc` for the AVR system +Now we can make the critical stuff for compiling our firmware: `binutils`, `gcc`, and `avr-libc` for the AVR architecture. These allow us to build and manipulate the firmware for the keyboard. -###build binutils for avr +###Build `binutils` for AVR ``` $ cd ~/src/binutils-2.26 $ mkdir obj-avr @@ -131,7 +131,7 @@ $ make $ make install ``` -###build gcc for avr +###Build `gcc` for AVR ``` $ cd ~/src/gcc-5.3.0 $ mkdir obj-avr @@ -141,9 +141,9 @@ $ make $ make install ``` -For building the avr-libc, we have to specify the host build system. in my case it is `x86_64-unknown-cygwin`. You can look for build system type in the gcc configure notes for the proper `--build` specification to pass when you configure avr-libc +For building the `avr-libc`, we have to specify the host build system. in my case it is `x86_64-unknown-cygwin`. You can look for build system type in the `gcc` configure notes for the proper `--build` specification to pass when you configure `avr-libc`. -###build avr-libc for avr +###Build `avr-libc` for AVR ``` $ cd ~/src/avr-libc-2.0.0 $ ./configure --prefix=$PREFIX --build=x86_64-unknown-cygwin --host=avr @@ -151,9 +151,9 @@ $ make $ make install ``` -##Install dfu-programmer -To install the dfu-programmer, we must get if from [their website](https://dfu-programmer.github.io/) (no fancy command line tricks here, but [this](http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip) might work). -Copy this file into your cygwin home directory. (For me, it is `C:\cygwin64\home\Kevin`), extract the files, move `dfu-programmer.exe` to `~/local/avr/bin`. Most obnoxiously, the `libusb0_x86.dll` and `libusb0.sys` need to be moved from `dfu/dfu-prog-usb-1.2.2/x86/` to a directory in the Windows PATH and the Cygwin PATH. I achieved this by moving the files in Windows Explorer to `C:\cygwin64\home\Kevin\local\avr\bin` Then, in a WINDOWS command prompt running: +##Install `dfu-programmer` +To install the `dfu-programmer`, we must get if from [their website](https://dfu-programmer.github.io/) (no fancy command line tricks here, but [this](http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip) might work). +Copy this file into your `cygwin` home directory. (For me, it is `C:\cygwin64\home\Kevin`), extract the files, move `dfu-programmer.exe` to `~/local/avr/bin`. Most obnoxiously, the `libusb0_x86.dll` and `libusb0.sys` need to be moved from `dfu/dfu-prog-usb-1.2.2/x86/` to a directory in the `Windows` `PATH` and the `cygwin` `PATH`. I achieved this by moving the files with Windows Explorer (you know, click and drag...) to `C:\cygwin64\home\Kevin\local\avr\bin` Then, in a `WINDOWS` command prompt running: ``` C:\> set PATH=%PATH%;C:\cygwin64\home\Kevin\local\avr\bin ``` @@ -169,11 +169,11 @@ Type 'dfu-programmer --help' for a list of commands 'dfu-programmer --targets' to list supported target devices ``` If you are not getting the above result, you will not be able to flash the firmware! --Try making sure your PATH variables are set correctly for both windows and cygwin. --Do not try to extract it with cygwin's `unzip` as it does not set the executable permissions correctly. +- Try making sure your `PATH` variables are set correctly for both `Windows` and `cygwin`. +- Do not extract it with `cygwin`'s `unzip` as it does not set the executable permissions correctly. If you did it anyway, do `chmod 755 dfu-programmer.exe` ####Install the USB drivers -These drivers are included in the `dfu-programmer` 0.7.2 (but you can get newer ones [here](http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip)) and allow the dfu to program the firmware. From an administrator-privileged Windows terminal, run the following command (adjust the path as necessary) and accept the prompt that pops up: +These drivers are included in the `dfu-programmer` 0.7.2 (but you can get newer ones [here](http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip)) and allow the `dfu-programmer` to program the firmware. From an **administrator-privileged** `Windows` terminal, run the following command (adjust the path as necessary) and accept the prompt that pops up: ``` C:\> pnputil -i -a C:\cygwin64\home\Kevin\dfu-prog-usb-1.2.2\atmel_usb_dfu.inf ``` @@ -193,9 +193,9 @@ Number successfully imported: 1 ##Building and Flashing the Planck firmware! -If you did everything else right. This part should be a snap! Grab the latest sources from github, make the Plank firmware, then flash it. +If you did everything else right. This part should be a snap! Grab the latest sources from `github`, make the Plank firmware, then flash it. -###build Planck and load the firmware +###Build Planck and Load the Firmware ``` $ cd ~/src $ git clone https://github.com/jackhumbert/qmk_firmware.git @@ -225,7 +225,7 @@ Size after: -------- end -------- ``` -If you don't, you did not build the firmware, and you will have nothing to flash. If you have the fresh clone from github, it was probably something in the install process, go check and see what didn't work and threw errors or what steps you might have missed. +If you do not get the above, you **did not** build the firmware, and you will have nothing to flash. If you have the fresh clone from github, it was probably something gone wrong in this install process, go check and see what didn't work and threw errors or what steps you might have missed. But if everything went OK, you are ready to flash! Press the reset button on the bottom of the Planck, wait two seconds, then: ``` -- cgit v1.2.3 From fe7738f2df82db2995857b0fd9e3a965dc3b0d6a Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 4 Mar 2016 21:51:09 -0500 Subject: Added Windows and Linux instructions to BUILD_GUIDE.md --- BUILD_GUIDE.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 783d00e8d1..4ff25479dd 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -3,7 +3,11 @@ ## Build Environment Setup ### Windows -What these instructions look like depends on whether NoahAndrews's setup scripts get merged +1. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. +2. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. +3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. +4. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. +5. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete! ### Mac If you're using [homebrew,](http://brew.sh/) you can use the following commands: @@ -21,6 +25,12 @@ You can also try these instructions: 3. Install [DFU-Programmer][dfu-prog]. ### Linux +Install AVR GCC and dfu-progammer with your favorite package manager. + +Debian/Ubuntu example: + + sudo apt-get update + sudo apt-get install gcc-avr dfu-programmer ### Vagrant If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). \ No newline at end of file -- cgit v1.2.3 From 553668550b6d3790639b2671e89ef0e34869dbbf Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 4 Mar 2016 23:21:29 -0500 Subject: Added build instructions to BUILD_GUIDE.md --- BUILD_GUIDE.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md index 4ff25479dd..81c3ec44f2 100644 --- a/BUILD_GUIDE.md +++ b/BUILD_GUIDE.md @@ -33,4 +33,23 @@ Debian/Ubuntu example: sudo apt-get install gcc-avr dfu-programmer ### Vagrant -If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). \ No newline at end of file +If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). + +## Verify Your Installation +1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application. +2. Open up a terminal or command prompt and navigate to the qmk_firmware folder using the `cd` command. The command prompt will typically open to your home directory. If, for example, you cloned the repository to your Documents folder, then you would type `cd Documents/qmk_firmware`. If you extracted the file from a zip, then it may be named `qmk_firmware-master` instead. +3. To confirm that you're in the correct location, you can display the contents of your current folder using the `dir` command on Windows, or the `ls` command on Linux or Mac. You should see several files, including `README.md` and a `quantum` folder. From here, you need to navigate to the appropriate folder under `keyboard/`. For example, if you're building for a Planck, run `cd keyboard/planck`. +4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. + +## Customizing, Building, and Deploying Your Firmware +1. Running the `make` command from your keyboard's folder will generate a .hex file based on the default keymap. All keymaps for a particular keyboard live in the `keymaps` folder in that keyboard's folder. To create your own keymap, copy `keymaps/default/keymap.c` to the `keymaps` folder, and rename it with your name, for example jack.c. Or, if you don't care about the ability to share your keymap with the community via GitHub, you can just modify the default keymap itself. Details on how to program keymap files can be found in other guides. +2. To build a keymap other than the default, type `KEYMAP=` after `make`. So if I've named my keymap jack.c, the full command would be `make KEYMAP=jack`. +3. How you deploy the firmware will depend on whether you are using a PCB or a Teensy. In both cases, you'll need to put the keyboard in bootloader mode, either by pressing a button on the PCB/Teensy or pressing the key with the `RESET` keycode. Then, if you're using a PCB, just run `make KEYMAP= dfu` to both build and deploy the firmware. If you're using a Teensy, you'll probably need to take the .hex file that make produces in the keyboard's folder, and deploy it using the [Teensy Loader.](https://www.pjrc.com/teensy/loader.html) + +## Helpful Tips +1. On Linux or OS X, you can run `sleep 5; make KEYMAP= dfu` to delay building/deploying the firmware until for 5 seconds, giving you a chance to put the firmware into bootloader mode. You can change the 5 to any number of seconds. + +## Troubleshooting +1. Try running `make clean` if the make command fails. + + WIP \ No newline at end of file -- cgit v1.2.3 From 9d06063a2348285e4ffc104be40fc0b24956dd9b Mon Sep 17 00:00:00 2001 From: Nicholas Keene Date: Sun, 6 Mar 2016 23:12:29 -0600 Subject: The Ordinary Layout, designed to be similar to traditional keyboards, by Nicholas Keene, released to the public domain, no rights reserved --- .../keymaps/ordinary/keyboard-layout.png | Bin 0 -> 93556 bytes keyboard/ergodox_ez/keymaps/ordinary/keymap.c | 190 ++++ keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex | 1122 ++++++++++++++++++++ 3 files changed, 1312 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png create mode 100644 keyboard/ergodox_ez/keymaps/ordinary/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex diff --git a/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png b/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png new file mode 100644 index 0000000000..c83f972cfe Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png differ diff --git a/keyboard/ergodox_ez/keymaps/ordinary/keymap.c b/keyboard/ergodox_ez/keymaps/ordinary/keymap.c new file mode 100644 index 0000000000..d44962b0dc --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/ordinary/keymap.c @@ -0,0 +1,190 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +/* + * Ordinary Ergodox EZ keyboard layout, v1 + * modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com + * Details: http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Grv | 1 | 2 | 3 | 4 | 5 | ESC | | = | 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | \ | | / | Y | U | I | O | P | ~L2 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ~L1 | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ~L1 | + * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |'/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh |RCtrl | + * `----------------------------------' `----------------------------------' + * ,---------------. ,---------------. + * | Home | End | | Left | Right | + * ,------|--------|------| |------+--------+------. + * | | | PgUp | | Up | | | + * |Backsp| Del |------| |------| Enter | Space| + * | | | PgDn | | Down | | |; + * `----------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSLS, + KC_FN1, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT,CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LBRC, + KC_LCTL,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI, + KC_HOME, KC_END, + KC_PGUP, + KC_BSPC, KC_DEL, KC_PGDN, + // right hand + KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_SLSH, KC_Y, KC_U, KC_I, KC_O, KC_P, LT(MDIA, KC_SLSH), + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_FN1, + KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_QUOT),KC_RSFT, + KC_RGUI, KC_RALT, ALL_T(KC_NO),MEH_T(KC_NO), KC_RCTL, + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_ENT, KC_SPC + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | CAPS | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | CAPS | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_CAPS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_CAPS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | Sleep| | | | | |MyComp| Mail | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp |ScrlUp| |ScrlUp| |ScrlUp| | | | | Mute | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | |MsDown|ScrlDn| |ScrlDn| |ScrlDn| | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Stop |Refrsh| | Prev | Next | + * ,------|------|------| |------+------+------. + * |Brwser|Brwser| Home | |VolUp | | | + * |Back | Fwd |------| |------| Stop | Play | + * | | |Search| |VolDn | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLEP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_WH_U, KC_TRNS, KC_WH_U, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_D, KC_TRNS, KC_TRNS, KC_WH_D, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_WH_D, + KC_WSTP, KC_WREF, + KC_WHOM, + KC_WBAK, KC_TRNS, KC_WSCH, + // right hand + KC_WSCH, KC_TRNS, KC_TRNS, KC_TRNS, KC_MYCM, KC_MAIL, KC_TRNS, + KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_MPRV, KC_MNXT, + KC_VOLU, + KC_VOLD, KC_MSTP, KC_MPLY +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void * matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void * matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex b/keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex new file mode 100644 index 0000000000..c7782d1c25 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/ordinary/ordinary.hex @@ -0,0 +1,1122 @@ +:100000000C9465020C94A9020C94A9020C94A90208 +:100010000C94A9020C94A9020C94A9020C94A902B4 +:100020000C94A9020C94A9020C94C50B0C94970C87 +:100030000C94A9020C94A9020C94A9020C94A90294 +:100040000C94A9020C9420210C94A9020C94A902EE +:100050000C94A9020C94C21A0C94A9020C94A90243 +:100060000C94A9020C94A9020C94A9020C94A90264 +:100070000C94A9020C94A9020C94A9020C94A90254 +:100080000C94A9020C94A9020C94A9020C94A90244 +:100090000C94A9020C94A9020C94A9020C94A90234 +:1000A0000C94A9020C94A9020C94A902FC0C1E0D3C +:1000B000090E1E0D090E600D830D090ED80DEB0DF6 +:1000C000D810D81006110611481184118413841316 +:1000D0009C118413931293125E138413841372136E +:1000E0000000F0A135002B00C100E100E00000009D +:1000F0001E00140004001D7100774E001F001A003E +:1001000016001B00007F4C002000080007000600BE +:10011000E2002A002100150009001900E3004B004D +:10012000220017000A00050000004A0029003100E3 +:1001300000002F0000004D002E00380000003000AD +:100140000000500023001C000B00110000004F00B5 +:10015000240018000D001000E700520025000C00DC +:100160000E003600E6002C00260012000F003700BB +:10017000007F2800270013003300347100775100FE +:100180002D003882C100E500E400000001000100FC +:1001900001003900010000003A001E022002220284 +:1001A000010001003B001F022102230201000100A7 +:1001B0003C002F0226022F00010001003D0030020A +:1001C00027023000010001003E00310235003502F7 +:1001D000000001000100010000000100000001001A +:1001E0000100010000000100000001003F0052007A +:1001F00051002402000001004000240021001E00E4 +:10020000010001004100250022001F00370001000D +:1002100042002600230020002700010043002502A1 +:100220002E0231002E00010044004500010039007B +:1002300001000000010001000100010001000000B8 +:1002400001000100010001000100B40001000100F3 +:10025000F2000100010001000100F000F100F100D6 +:10026000F400B6000100F900F3000100FA00B50047 +:1002700001000100010001000000B800A600F90023 +:100280000000FA000000B900B400F9000000FA0014 +:100290000000AC0001000100010001000000AB0003 +:1002A00001000100010001000100A900010001009E +:1002B000010001000100AE00B300010001000100D7 +:1002C0000100AD00B100A800010001000100AA007A +:1002D00001000100010001000100000016034500BB +:1002E000720067006F0044006F0078002000450036 +:1002F0005A00000016034500720067006F004400BA +:100300006F007800200045005A0000000403090433 +:1003100009026D00040100A0FA09040000010301B4 +:100320000100092111010001223F00070581030896 +:10033000000A090401000103010200092111010062 +:1003400001224D000705820308000A09040200018A +:100350000300000009211101000122360007058376 +:100360000308000A09040300010300000009211129 +:100370000100012239000705840310000112011059 +:100380000100000008EDFE07130100010200010555 +:10039000010906A101050719E029E71500250195C6 +:1003A0000875018102050819012905950575019156 +:1003B000029501750391010507190029771500259C +:1003C00001957875018102C005010980A1018502AE +:1003D00016010026B7001A01002AB7007510950112 +:1003E0008100C0050C0901A1018503160100269CAE +:1003F000021A01002A9C02751095018100C00501B6 +:100400000902A1010901A100050919012905150029 +:10041000250195057501810295017503810105018D +:10042000093009311581257F950275088106093843 +:100430001581257F950175088106050C0A3802157E +:1004400081257F950175088106C0C005010906A1B7 +:1004500001050719E029E7150025019508750181B7 +:100460000295017508810105081901290595057591 +:100470000191029501750391010507190029FF15E6 +:100480000025FF950675088100C0000000000000EF +:100490000000000000010204060A0F17202C3A4A4F +:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2 +:1004B000B39D87715D4A3A2C20170F0A060402018A +:1004C0000000000000000000000011241FBECFEF5C +:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A +:1004E0009091EF01A091F001B091F1018730904B14 +:1004F000A740B04BB9F41092EE011092EF011092A8 +:10050000F0011092F10114BE84B7877F84BF88E1A7 +:100510000FB6F89480936000109260000FBEE0E088 +:10052000FFE3099511E0A0E0B1E0E4ECF5E402C0DE +:1005300005900D92A433B107D9F721E0A4E3B1E00F +:1005400001C01D92AE3EB207E1F70E940B090C9468 +:10055000E0220C94000061110BC0FC018281882311 +:1005600021F085EE0E946C0F03C085EE0E943410CE +:1005700080E090E0089508956091B1017091B2011A +:100580008091B3019091B4010E94EE1956985E9843 +:1005900025982D9826982E9827982F98813019F015 +:1005A000823021F00895259A2D9A0895269A2E9A40 +:1005B00008958CEB92E0892B11F00E94BC0280E040 +:1005C00090E0089556985E9825982D9826982E9834 +:1005D00027982F988FEF90E0909389008093880060 +:1005E00090938B0080938A0090938D0080938C0071 +:1005F000259A2D9A2FEF80E792E02150804090407D +:10060000E1F700C00000269A2E9A2FEF80E792E0D3 +:10061000215080409040E1F700C00000279A2F9AB7 +:100620002FEF80E792E0215080409040E1F700C03A +:10063000000025982D982FEF80E792E02150804010 +:100640009040E1F700C0000026982E982FEF80E739 +:1006500092E0215080409040E1F700C000002798D0 +:100660002F9856985E9825982D9826982E9827981A +:100670002F98089589EA8093800089E08093810013 +:1006800024982C983F988AB18F748AB96E98479AAB +:100690008BB1806B8BB9769A0E94E2028BEB92E071 +:1006A000892B11F00E94BB0280E090E0089580E267 +:1006B000809300018091340181110EC00E94A60335 +:1006C00081E0809334012FEF83ED90E3215080404F +:1006D0009040E1F700C0000080E40E94AC038093EA +:1006E000000181112EC00E94D60380930001811168 +:1006F00028C00E94D60380930001811122C08FE39D +:100700000E94D6038093000181111BC00E94CE037A +:1007100080E40E94AC0380930001811112C08CE040 +:100720000E94D6038093000181110BC00E94D60362 +:1007300080930001811105C08FE30E94D60380934E +:1007400000010E94CE038091000108951092B9002B +:100750008AE08093B800089594EA9093BC00909149 +:10076000BC0097FFFCCF9091B900987F983021F0A2 +:10077000903111F081E008958093BB0084E880936C +:10078000BC008091BC0087FFFCCF8091B900887FBE +:10079000883111F0803471F780E0089584E9809306 +:1007A000BC008091BC0084FDFCCF08958093BB0009 +:1007B00084E88093BC008091BC0087FFFCCF9091BF +:1007C000B900987F81E0983209F480E0089584E8C8 +:1007D0008093BC008091BC0087FFFCCF8091BB0060 +:1007E000089580910001811115C080E40E94AC033E +:1007F0008093000181110CC082E10E94D603809396 +:100800000001811105C08FEF0E94D6038093000183 +:100810000E94CE0384B1807F84B985B1807F85B981 +:100820008AB1837F8AB98BB1837F8BB93E98469812 +:1008300008950E945703809300010E94F10380B342 +:100840008C7080BB81B3836F81BBE4E4F1E0A6E3ED +:10085000B1E011921D9281E0E235F807D1F78AE309 +:1008600093E0892B11F00C943A030895BF92CF9234 +:10087000DF92EF92FF920F931F93CF93DF938091BC +:100880000001882379F0809135018F5F80933501D5 +:10089000811108C00E94570380930001811102C09A +:1008A0000E94E20206E311E0C0E0D0E0DD24D39430 +:1008B00082E0C82EEE24E394F12CC73000F580913D +:1008C0000001811162C080E40E94AC0380930001AA +:1008D000811112C082E10E94D60380930001811130 +:1008E0000BC0C7010C2E01C0880F0A94EAF780954F +:1008F0000E94D603809300010E94CE0346C0CA30F6 +:10090000A1F028F4C83059F0C93061F005C0CC30EE +:1009100089F070F0CD3089F0209A289810C0219A83 +:1009200029980DC0229A2A980AC0239A2B9807C0AA +:10093000529A01C0539A5B9802C03E9A4698E0EAE8 +:10094000EA95F1F78FB1799960C092E081708D25B9 +:10095000892B7C9B02C090E001C094E0892B7D9B99 +:1009600002C090E001C098E0892B7E9B02C090E01D +:1009700001C090E1892B9FB19095991F9927991FEC +:100980009295990F907E892B0FC080910001811163 +:1009900051C080E40E94AC03809300018823B9F128 +:1009A000B12C0E94CE038B2DF8019081981719F07D +:1009B0008083C09201010E94F10321960F5F1F4FB7 +:1009C000CE30D10509F079CF809101018823B1F0B3 +:1009D000815080930101882339F08FE99FE00197CE +:1009E000F1F700C000000AC0A4E4B1E0E6E3F1E0E2 +:1009F00081918D9391E0E434F907D1F789ED92E08C +:100A0000892BD1F00E94D90217C090E09FCF83E1DB +:100A10000E94D603809300018111C2CF81E40E941D +:100A2000AC03809300018111BBCF0E94E703B82E75 +:100A3000B094B7CF80E0B8CF81E0DF91CF911F9124 +:100A40000F91FF90EF90DF90CF90BF900895E82F27 +:100A5000F0E0EC5BFE4F8081089508958B3B91059B +:100A600078F4883A910540F5853A9105D0F48430C0 +:100A7000910508F0B1C08130910509F4ADC06BC09B +:100A8000803E910508F467C0883E910508F4A4C033 +:100A90009C01205F31092031310508F05CC0906570 +:100AA0000895853A910509F459C0863A910509F4EB +:100AB00058C083E890E40895883A910509F454C039 +:100AC000893A910509F453C08A3A910509F452C054 +:100AD0008B3A910509F451C08C3A910509F450C044 +:100AE0008D3A910509F44FC0803B910509F44EC041 +:100AF0008E3A910509F44DC08F3A910509F44CC026 +:100B0000813B910509F44BC0823B910509F44AC031 +:100B1000833B910509F449C0843B910509F448C021 +:100B2000853B910509F447C0863B910509F446C011 +:100B3000873B910509F445C0883B910509F444C001 +:100B4000893B910509F443C08A3B910509F042C0F5 +:100B50008AE296E4089580E090E0089581E890E4C8 +:100B6000089582E890E4089582EE94E4089589EE71 +:100B700094E408958AEE94E4089585EB94E408954E +:100B800086EB94E4089587EB94E408958CEC94E468 +:100B900008958DEC94E4089583E895E408958AE837 +:100BA00095E4089582E995E4089584E995E408952B +:100BB00081E296E4089583E296E4089584E296E45F +:100BC000089585E296E4089586E296E4089587E222 +:100BD00096E4089580E094E40895089596E0799F5E +:100BE000F001112494E5899FE00DF11D1124E60F19 +:100BF000F11DEE0FFF1FEC51FF4F85919491089569 +:100C0000880F991F805A9040FC0185919491089516 +:100C1000880F991F80529F4FFC01859194910895F0 +:100C200026E0729FF001112444E5849FE00DF11D40 +:100C30001124E60FF11DEE0FFF1FEC51FF4F259120 +:100C40003491C9019A9581159F4110F4C901089505 +:100C5000C90190528115904128F4C9019F700E94EA +:100C600008060895C90190538115904120F4C901E7 +:100C70009927906C0895211580E5380769F40E9442 +:100C8000A5139FEF24E34CE0915020404040E1F752 +:100C900000C000000C94E71A213080E5380731F4D9 +:100CA0008091CC0181608093CC010895C901905559 +:100CB0008115904108F050C0832F99278F70992794 +:100CC00081309105D9F4A9014370552702C0880FDE +:100CD000991F4A95E2F79C68A90164E0440F551FEB +:100CE0006A95E1F744275370842B952B73E0220F0C +:100CF000331F7A95E1F7207633271DC082309105A6 +:100D000029F4922F8827816F906A08958330910586 +:100D1000A9F4A9014370552781E090E002C0880F33 +:100D2000991F4A95E2F79C6843E0220F331F4A95CA +:100D3000E1F7207E3770822B932B08950497F1F40E +:100D4000A9014370552781E090E002C0880F991FE8 +:100D50004A95E2F79A68E8CFC9019057811590410A +:100D600020F4C9019F7090620895C90190588115BF +:100D7000904120F4C9019F70906A0895203E31058A +:100D8000E0F4203C310558F52133310509F470C0F9 +:100D900048F42932310509F464C02A32310509F4D6 +:100DA0006EC074C029333105F1F022383105D9F015 +:100DB0002533310509F44EC069C0233E310589F160 +:100DC00038F4203E3105C1F0223E3105E1F05EC02D +:100DD000263E310569F1273E3105A9F157C0C90109 +:100DE0000E94000608958091DF0180FD02C081FF0E +:100DF0004DC080EE90E04BC08091DF0180FFF9CFC5 +:100E000089E390E044C08091DF0182FF0EC08091B1 +:100E1000DF0184FF03C080E090E039C083EE90E002 +:100E200036C08091DF0182FFF2CF82EE90E02FC0CA +:100E30008091DF0183FF0BC08091DF0184FDEBCF48 +:100E400087EE90E024C08091DF0183FFF5CF86EE2E +:100E500090E01DC08091DF0185FF07C089E290E02E +:100E600016C08091DF0185FFF9CF85E390E00FC0C8 +:100E70008091DF0186FF07C08AE290E008C0809180 +:100E8000DF0186FFF9CF81E390E001C0C9010E9434 +:100E90002E0508950895809162010895CF93DF9300 +:100EA00000D01F92CDB7DEB72091E501243019F5AF +:100EB00023E029839B838A832093E9008FEF90911D +:100EC000E800815095FD06C095ED9A95F1F7000078 +:100ED0008111F5CF8091E80085FF0DC040E050E022 +:100EE00063E070E0CE0101960E94B8098091E800AD +:100EF0008E778093E8000F900F900F90DF91CF9145 +:100F00000895CF93DF9300D01F92CDB7DEB7209125 +:100F1000E501243021F522E029839B838A8383E045 +:100F20008093E9008FEF9091E800815095FD06C015 +:100F300095ED9A95F1F700008111F5CF8091E800C9 +:100F400085FF0DC040E050E063E070E0CE01019607 +:100F50000E94B8098091E8008E778093E8000F9096 +:100F60000F900F90DF91CF9108952091E5012430EB +:100F7000F1F422E02093E9002FEF3091E8002150B6 +:100F800035FD06C035ED3A95F1F700002111F5CF9A +:100F90002091E80025FF0BC040E050E065E070E0E4 +:100FA0000E94B8098091E8008E778093E800089548 +:100FB000CF93DF93EC018091E501843009F046C0C6 +:100FC00090910C019923D9F090910D019923B9F0DA +:100FD0008093E9008FEF9091E800815095FD06C065 +:100FE00095E19A95F1F700008111F5CF8091E80025 +:100FF00085FF2CC040E050E060E170E017C081E068 +:101000008093E9008FEF9091E800815095FD06C034 +:1010100095ED9A95F1F700008111F5CF8091E800E8 +:1010200085FF14C040E050E068E070E0CE010E940F +:10103000B8098091E8008E778093E80080E1FE0196 +:10104000A2E5B1E001900D928A95E1F7DF91CF9191 +:1010500008958091E401811109C00E944A0B0E9409 +:10106000A70B8091E20084608093E20008951092C3 +:10107000E401089508950C940D210E947E1A0E94A7 +:1010800013210E94440E0C944A0742E061EC81E077 +:101090000E94C40A42E061EC82E00E94C40A42E07D +:1010A00061EC83E00E94C40A42E161EC84E00C94AC +:1010B000C40A8091E701833009F455C030F48130CF +:1010C00071F0823009F48EC008958A3009F47AC034 +:1010D0008B3009F460C0893009F09CC020C0809139 +:1010E000E601813A09F096C08091E800877F8093FD +:1010F000E8008091EA019091EB01892B21F060E0FA +:1011000080E090E003C060E182E591E070E00E9441 +:10111000010A8091E8008B778093E8000895809120 +:10112000E601813209F076C08091EA019091EB01ED +:10113000009719F0039709F06DC08091E800877F50 +:101140008093E8008091E80082FD05C08091E50170 +:101150008111F8CF5FC08091F1008093620180918E +:10116000E8008B7753C08091E601813A09F052C0C4 +:101170008091EA019091EB01892B09F04BC080919D +:10118000E800877F8093E8008091E80080FFFCCF33 +:1011900080910C0136C08091E6018132D9F58091B1 +:1011A000EA019091EB01892BA9F58091E800877FF6 +:1011B0008093E8000E94F90A8091E80180930C0175 +:1011C0000C94A5138091E601813221F58091E8000D +:1011D000877F8093E8000E94F90A8091E90180935B +:1011E000630108958091E601813AA1F48091E800BD +:1011F000877F8093E8008091E80080FFFCCF80919A +:1012000063018093F1008091E8008E778093E8007D +:101210000C94F90A089584B7877F84BF88E10FB6DC +:10122000F89480936000109260000FBE90E080E818 +:101230000FB6F89480936100909361000FBE0E94F6 +:10124000930E0E944A0B0E94A70B8091E2008460DB +:101250008093E20078940E94220E0E94950E82E014 +:1012600091E00E943F0E0E94FB208091E5018530B5 +:1012700069F40E94411A8091E3018823B1F30E942E +:10128000691A882391F30E94A209EFCF0E949B0E56 +:10129000ECCF292F332723303105A9F06CF421300E +:1012A000310509F442C02230310509F043C08DE612 +:1012B00090E020E133E042C021323105C9F0223212 +:1012C000310519F137C099278130910541F08230FD +:1012D000910541F0892B71F5ECE0F3E005C0E4EFF6 +:1012E000F2E002C0ECEDF2E0849190E09F0126C0B4 +:1012F000643000F5E62FF0E0EE0FFF1FEE5DFE4FCD +:101300002081318189E090E019C0643098F4E62FA3 +:10131000F0E0DF01AA0FBB1FA65EBE4F2D913C91EE +:10132000EA5EFE4F808190E009C082E190E02DE707 +:1013300033E004C080E090E020E030E0FA01318347 +:101340002083089580E189BD82E189BD09B400FE52 +:10135000FDCF8091D8008F7D8093D8008091E000F0 +:1013600082608093E0008091E00081FDFCCF0895D1 +:10137000CF92DF92EF92FF920F931F93CF93DF9361 +:101380007C018B01EA010E941A0B811131C0209768 +:1013900031F088819981081B190BE80EF91EC12CC8 +:1013A000D12C0115110519F18091E80085FD14C0BB +:1013B0008091E8008E778093E800209741F0888143 +:1013C00099818C0D9D1D9983888385E011C00E94B1 +:1013D0001A0B882331F30CC0F70181917F018093B0 +:1013E000F10001501109FFEFCF1ADF0ADACF80E0D8 +:1013F000DF91CF911F910F91FF90EF90DF90CF90F1 +:1014000008952091EC013091ED012617370748F03F +:101410006115710539F42091E8002E772093E800DA +:1014200001C0B901FC0120E061157105B9F180919D +:10143000E501882309F440C0853009F43FC080915C +:10144000E80083FD3DC08091E80082FF06C08091E6 +:10145000E80082FF26C080E008958091E80080FFC8 +:10146000E3CF2091F3008091F20090E0922B611580 +:10147000710551F08830910538F421912093F100E5 +:10148000615071090196F3CF21E0089709F020E03F +:101490008091E8008E778093E800C6CF2111C7CFF6 +:1014A000D6CF8091E501882339F0853039F08091DD +:1014B000E80083FFCCCF04C082E0089583E0089564 +:1014C00081E008952091EC013091ED012617370756 +:1014D00048F06115710539F42091E8002E772093CA +:1014E000E80001C0B901FC0120E061157105C1F1FE +:1014F0008091E501882309F441C0853009F440C09A +:101500008091E80083FD3EC08091E80082FF06C024 +:101510008091E80082FF27C080E008958091E80074 +:1015200080FFE3CF2091F3008091F20090E0922BB6 +:101530006115710559F08830910540F4249120938C +:10154000F1003196615071090196F2CF21E00897C0 +:1015500009F020E08091E8008E778093E800C5CF05 +:101560002111C6CFD5CF8091E501882339F0853090 +:1015700039F08091E80083FFCBCF04C082E008956A +:1015800083E0089581E00895982F973058F590935F +:10159000E900981739F07091EC002091ED0050911E +:1015A000F00003C0242F762F50E021FF19C03091A6 +:1015B000EB003E7F3093EB003091ED003D7F3093A8 +:1015C000ED003091EB0031603093EB007093EC0054 +:1015D0002093ED005093F0002091EE0027FF07C00C +:1015E0009F5FD3CF8F708093E90081E0089580E002 +:1015F00008958091E60187FD05C08091E80080FF95 +:101600000EC012C08091E80082FD05C08091E50106 +:101610008111F8CF08958091E8008B7708C0809100 +:10162000E5018111EACF08958091E8008E778093DB +:10163000E80008958091E4009091E50045E620914E +:10164000EC0020FF21C02091E80020FD21C0209166 +:10165000E501222389F0253089F02091EB0025FD5A +:101660000FC02091E4003091E5002817390739F3C5 +:10167000415041F0C901E3CF82E0089583E008952D +:1016800081E0089584E008952091E80022FFDFCFF3 +:1016900080E008950E94B80B0E94C00BE0EEF0E0DD +:1016A000808181608083E8EDF0E080818F778083A6 +:1016B00019BCA7EDB0E08C918E7F8C9380818F7EDA +:1016C00080831092E40108950F931F93CF93DF93CB +:1016D0000E94B80B0E94C00BC8EDD0E088818F77C4 +:1016E000888388818068888388818F7D888319BCFE +:1016F0001092E5011092E1011092E3011092E201D3 +:1017000000EE10E0F80180818B7F8083888181600A +:10171000888342E060E080E00E94C40AE1EEF0E0ED +:1017200080818E7F8083E2EEF0E080818160808323 +:10173000808188608083F80180818E7F80838881AA +:1017400080618883DF91CF911F910F910895E8ED1B +:10175000F0E080818F7E8083E7EDF0E08081816022 +:10176000808384E082BF81E08093E4010C94640B69 +:10177000E8EDF0E080818E7F80831092E200089592 +:101780001092DA001092E10008951F920F920FB6A6 +:101790000F9211242F933F934F935F936F937F93F7 +:1017A0008F939F93AF93BF93EF93FF938091E1004B +:1017B00082FF0BC08091E20082FF07C08091E100B0 +:1017C0008B7F8093E1000E94210E8091DA0080FFE0 +:1017D0001FC08091D80080FF1BC08091DA008E7FEF +:1017E0008093DA008091D90080FF0DC080E189BD2F +:1017F00082E189BD09B400FEFDCF81E08093E5015F +:101800000E94290805C019BC1092E5010E94370802 +:101810008091E10080FF19C08091E20080FF15C037 +:101820008091E2008E7F8093E2008091E2008061EF +:101830008093E2008091D80080628093D80019BC28 +:1018400085E08093E5010E943B088091E10084FFE0 +:1018500030C08091E20084FF2CC080E189BD82E12C +:1018600089BD09B400FEFDCF8091D8008F7D8093A3 +:10187000D8008091E1008F7E8093E1008091E200AA +:101880008F7E8093E2008091E20081608093E2008D +:101890008091E101882311F084E007C08091E3008A +:1018A00087FF02C083E001C081E08093E5010E94D0 +:1018B0003D088091E10083FF29C08091E20083FF11 +:1018C00025C08091E100877F8093E10082E08093D2 +:1018D000E5011092E1018091E1008E7F8093E100AB +:1018E0008091E2008E7F8093E2008091E20080612F +:1018F0008093E20042E060E080E00E94C40A8091B0 +:10190000F00088608093F0000E943A08FF91EF9108 +:10191000BF91AF919F918F917F916F915F914F9107 +:101920003F912F910F900FBE0F901F9018951F920F +:101930000F920FB60F9211242F933F934F935F9303 +:101940006F937F938F939F93AF93BF93CF93EF93B7 +:10195000FF93C091E900CF708091EC001092E900F4 +:101960008091F000877F8093F00078940E94D30CE0 +:101970001092E9008091F00088608093F000C0939D +:10198000E900FF91EF91CF91BF91AF919F918F911E +:101990007F916F915F914F913F912F910F900FBE6B +:1019A0000F901F9018951F93CF93DF93CDB7DEB79D +:1019B000AA970FB6F894DEBF0FBECDBFE6EEF1E0FA +:1019C0008091F100819321E0EE3EF207C9F70E9479 +:1019D00059088091E80083FF1CC12091E6013091F5 +:1019E000E701832F90E08A30910508F012C1FC01D5 +:1019F000EA5AFF4F0C949522203881F0223809F0E2 +:101A000008C18091EA018F708093E9008091EB001A +:101A100085FB882780F91092E90006C08091E201D9 +:101A20009091E301911182609091E800977F9093EB +:101A3000E8008093F1001092F100C5C0822F8D7FE5 +:101A400009F0E7C0222319F0223061F0E2C0809152 +:101A5000E801813009F0DDC0333009F080E0809387 +:101A6000E30128C08091E801811124C02091EA019E +:101A70002F7009F4CEC02093E9008091EB0080FF25 +:101A800019C08091EB00333011F4806211C0806185 +:101A90008093EB0081E090E0022E01C0880F0A9451 +:101AA000EAF78093EA001092EA008091EB008860E8 +:101AB0008093EB001092E9008091E800877F86C058 +:101AC0002111A7C01091E8011F778091E300807871 +:101AD000812B8093E3008091E800877F8093E8006A +:101AE0000E94F90A8091E80080FFFCCF8091E3001A +:101AF00080688093E300112311F083E001C082E04D +:101B00008093E50186C02058223008F082C0809181 +:101B1000E8019091E9018C3D23E0920779F583E09B +:101B20008A838AE289834FB7F894DE01139620E016 +:101B30003EE051E2E32FF0E050935700E49120FFA4 +:101B400003C0E295EF703F5FEF708E2F90E0EA30B8 +:101B500010F0C79601C0C0968D939D932F5F2431DE +:101B600049F74FBF8091E800877F8093E8006AE2E1 +:101B700070E0CE0101960E94010A14C0AE014F5FD1 +:101B80005F4F6091EA010E944909009709F441C042 +:101B90002091E800277F2093E800BC0189819A8189 +:101BA0000E94620A8091E8008B778093E80031C040 +:101BB000203879F58091E800877F8093E800809154 +:101BC000E1018093F1008091E8008E778093E80036 +:101BD0000E94F90A1EC021111CC09091E8019230A8 +:101BE000C0F48091E800877F8093E8009093E10142 +:101BF0000E94F90A8091E101811104C08091E30003 +:101C000087FF02C084E001C081E08093E5010E946B +:101C100045088091E80083FF0AC08091E800877F33 +:101C20008093E8008091EB0080628093EB00AA969D +:101C30000FB6F894DEBF0FBECDBFDF91CF911F91DD +:101C400008950895CF938091E5018823B1F08091A4 +:101C5000E9008F709091EC0090FF02C090E801C005 +:101C600090E0C92FC82B1092E9008091E80083FD15 +:101C70000E94D30CCF70C093E900CF910895909348 +:101C80006901809368010895E0916801F09169010C +:101C9000309721F00190F081E02D099480E00895C3 +:101CA000E0916801F0916901309721F00280F381A1 +:101CB000E02D09940895E0916801F0916901309751 +:101CC00021F00480F581E02D0994089520916601AA +:101CD000309167018217930771F0909367018093A9 +:101CE0006601E0916801F0916901309721F006806A +:101CF000F781E02D099408952091640130916501E8 +:101D00008217930771F09093650180936401E091CD +:101D10006801F0916901309721F00084F185E02D90 +:101D20000994089508950C94920E0E94841A0E94BA +:101D300019040C944A1BCF92DF92EF92FF920F93FB +:101D40001F93CF93DF93CDB7DEB72B970FB6F894E1 +:101D5000DEBF0FBECDBF0E9436043BE6E32E31E06E +:101D6000F32E00E010E0C02E802F0E942705F7011F +:101D7000D1907F01D826B1F40F5F1F4F0E301105AF +:101D800091F78FEF89838A831B820E948D1A81606D +:101D9000782F9D838C8349815A816B818D810E942C +:101DA0003E0F41C09091CC0191FF04C08B870E94EF +:101DB0002D058B8520E030E04D2D50E0922FBA01AB +:101DC000022E02C0759567950A94E2F760FF25C060 +:101DD0002E83CF82EE24E394F12C02C0EE0CFF1C84 +:101DE0009A95E2F790E08E219F2121E0892B09F45A +:101DF00020E028870E948D1A8160782F9A87898732 +:101E00004E815F8168858A850E943E0FF801E55901 +:101E1000FE4F80818E25808306C02F5F3F4F263086 +:101E2000310561F6A9CF0E942E1E10916A010E9411 +:101E3000440E1817A1F00E94440E80936A012B965D +:101E40000FB6F894DEBF0FBECDBFDF91CF911F91CB +:101E50000F91FF90EF90DF90CF900C944A072B9654 +:101E60000FB6F894DEBF0FBECDBFDF91CF911F91AB +:101E70000F91FF90EF90DF90CF900895CF93DF9375 +:101E8000CDB7DEB72B970FB6F894DEBF0FBECDBF30 +:101E90004F83588769877A878B87DE01119686E0A2 +:101EA000FD0111928A95E9F785E0FE0137960190D0 +:101EB0000D928A95E1F749815A816B817C818D81F0 +:101EC0009E810E9471162B960FB6F894DEBF0FBE4E +:101ED000CDBFDF91CF910895CF93C82F882309F408 +:101EE000C1C0823859F40E94440E81FDBBC089E311 +:101EF0000E940E190E94C81989E30CC0833879F436 +:101F00000E94440E80FDAEC083E50E940E190E941F +:101F1000C81983E50E944E19CF910C94C8198438D2 +:101F200059F40E94440E82FD9DC087E40E940E1960 +:101F30000E94C81987E4EECF8CEF8C0F813A48F4E9 +:101F40008C2F0E94632081118DC08C2F0E940E194E +:101F5000E3CF80E28C0F883048F4C77081E001C085 +:101F6000880FCA95EAF70E948F19D6CF8BE58C0FA0 +:101F7000833078F4C53A29F0C63A31F482E890E02B +:101F800005C081E890E002C083E890E0CF910C9416 +:101F9000660E88E58C0F833108F064C0C83A39F1C9 +:101FA000C93A41F1CA3A49F1CB3A51F1CC3A59F127 +:101FB000CD3A61F1C03B69F1CE3A71F1CF3A79F196 +:101FC000C13B81F1C23B89F1C33B91F1C43B99F123 +:101FD000C53BA1F1C63BA9F1C73BB1F1C83BB9F183 +:101FE000C93BC1F1CA3BC9F58AE292E038C082EE32 +:101FF00090E035C089EE90E032C08AEE90E02FC0CC +:1020000085EB90E02CC086EB90E029C087EB90E058 +:1020100026C08CEC90E023C08DEC90E020C083E8DB +:1020200091E01DC08AE891E01AC082E991E017C0F2 +:1020300084E991E014C081E292E011C083E292E071 +:102040000EC084E292E00BC085E292E008C086E216 +:1020500092E005C087E292E002C080E090E0CF917C +:102060000C947C0ECF910895882309F44BC08238DC +:1020700059F40E94440E81FF45C089E30E940E1965 +:102080000E94C81989E30CC0833871F40E94440E81 +:1020900080FF38C083E50E940E190E94C81983E5AD +:1020A0000E944E190C94C819843859F40E94440EA9 +:1020B00082FF28C087E40E940E190E94C81987E495 +:1020C000EFCF9CEF980F913A58F390E2980F983029 +:1020D00050F4877091E001C0990F8A95EAF7892F33 +:1020E0000E949519DFCF9BE5980F933020F480E094 +:1020F00090E00C94660E885A833120F480E090E0E2 +:102100000C947C0E0895882321F00E948F190C9462 +:10211000C8190895882321F00E9495190C94C819B4 +:102120000895CF92DF92EF92FF920F931F93CF9378 +:10213000DF93CDB7DEB728970FB6F894DEBF0FBE9A +:10214000CDBF8C0185E0F801DE01119601900D9262 +:102150008A95E1F7F80140813181F280258122954D +:102160002F7083819481892B31F03F3F31F481E0DE +:102170004F3F19F403C081E001C080E080FDC4C27C +:1021800049833A8389819A812F830E94CC189E8348 +:1021900088870E94CB180E949E174E81E42FE295FB +:1021A000EF70F0E0E05AFF4F2F8168850C94952284 +:1021B000842F807F142F1F70882311F01295107FB9 +:1021C000FF2059F0112309F454C2812F68870E941F +:1021D0009F190E94C81968854CC2862F0E9434102E +:1021E000112309F491C2812F0E94A51928960FB6D8 +:1021F000F894DEBF0FBECDBFDF91CF911F910F913D +:10220000FF90EF90DF90CF900C94C819342F307F5F +:10221000842F8F70303211F08295807F662319F001 +:10222000613019F12BC0FF20B1F0222309F493C1D2 +:10223000213009F090C128960FB6F894DEBF0FBE8A +:10224000CDBFDF91CF911F910F91FF90EF90DF9065 +:10225000CF900C94AF19222319F0213009F454C205 +:102260008E830E94B2198E8189C1FF2021F0223015 +:1022700008F04AC270C1211147C280C1FF2021F07D +:10228000222309F468C1F5C1222309F477C105C2EC +:10229000242F26952695237030E02115310521F055 +:1022A00021303105C9F030C2FF2021F0862F942F54 +:1022B000937002C080E090E028960FB6F894DEBFDD +:1022C0000FBECDBFDF91CF911F910F91FF90EF9087 +:1022D000DF90CF900C94660EFF2021F0862F942F74 +:1022E000937002C080E090E028960FB6F894DEBFAD +:1022F0000FBECDBFDF91CF911F910F91FF90EF9057 +:10230000DF90CF900C947C0E862FFF2019F00E9456 +:10231000361D02C00E949E1D28960FB6F894DEBF9F +:102320000FBECDBFDF91CF911F910F91FF90EF9026 +:10233000DF90CF900C94231E842F837009F076C019 +:10234000F110E2C1262F229526952770220F220F29 +:10235000862F8F70C82ED12CE12CF12C022E04C0B8 +:10236000CC0CDD1CEE1CFF1C0A94D2F764FF10C0DD +:102370006FE070E080E090E004C0660F771F881F78 +:10238000991F2A95D2F7609570958095909503C016 +:1023900060E070E0CB01242F269526952370422F14 +:1023A00050E042305105D1F04330510559F16C29CC +:1023B0007D298E299F294130510541F128960FB67C +:1023C000F894DEBF0FBECDBFDF91CF911F910F916B +:1023D000FF90EF90DF90CF900C94C3176C297D296C +:1023E0008E299F2928960FB6F894DEBF0FBECDBF69 +:1023F000DF91CF911F910F91FF90EF90DF90CF90E1 +:102400000C94DD170E94C317C701B60128960FB6BA +:10241000F894DEBF0FBECDBFDF91CF911F910F911A +:10242000FF90EF90DF90CF900C94A917FF2019F048 +:10243000842F817001C08695882309F465C1262FF9 +:10244000229526952770220F220F862F8F70C82E77 +:10245000D12CE12CF12C022E04C0CC0CDD1CEE1C86 +:10246000FF1C0A94D2F764FF10C06FE070E080E0B8 +:1024700090E004C0660F771F881F991F2A95D2F736 +:10248000609570958095909503C060E070E0CB01F9 +:10249000242F269526952370422F50E04230510577 +:1024A000D1F04330510559F16C297D298E299F299E +:1024B0004130510541F128960FB6F894DEBF0FBEAA +:1024C000CDBFDF91CF911F910F91FF90EF90DF90E3 +:1024D000CF900C9497186C297D298E299F292896D6 +:1024E0000FB6F894DEBF0FBECDBFDF91CF911F9125 +:1024F0000F91FF90EF90DF90CF900C94B1180E9455 +:102500009718C701B60128960FB6F894DEBF0FBE24 +:10251000CDBFDF91CF911F910F91FF90EF90DF9092 +:10252000CF900C947D18603FC9F118F4603E50F4D0 +:102530009BC0623F09F460C008F44AC0633F09F4DD +:102540006FC092C0162F1F70842F8F71FF2099F0DB +:102550000E941618812F28960FB6F894DEBF0FBE82 +:10256000CDBFDF91CF911F910F91FF90EF90DF9042 +:10257000CF900C9483100E943718812F28960FB6A5 +:10258000F894DEBF0FBECDBFDF91CF911F910F91A9 +:10259000FF90EF90DF90CF900C948A10FF20A1F075 +:1025A0002111B2C0842F8F7128960FB6F894DEBF28 +:1025B0000FBECDBFDF91CF911F910F91FF90EF9094 +:1025C000DF90CF900C945C18223008F09DC0EACFC9 +:1025D000FF20A1F0842F8F7128960FB6F894DEBFEC +:1025E0000FBECDBFDF91CF911F910F91FF90EF9064 +:1025F000DF90CF900C941618FF2061F3842F8F7119 +:1026000028960FB6F894DEBF0FBECDBFDF91CF91F5 +:102610001F910F91FF90EF90DF90CF900C9437189F +:10262000FF2091F0842F8F7128960FB6F894DEBFAB +:102630000FBECDBFDF91CF911F910F91FF90EF9013 +:10264000DF90CF900C94011828960FB6F894DEBF57 +:102650000FBECDBFDF91CF911F910F91FF90EF90F3 +:10266000DF90CF900C94F717FF20A1F0222309F4FC +:10267000B1CF862F28960FB6F894DEBF0FBECDBF20 +:10268000DF91CF911F910F91FF90EF90DF90CF904E +:102690000C946C0F222309F4B1CF862F28960FB625 +:1026A000F894DEBF0FBECDBFDF91CF911F910F9188 +:1026B000FF90EF90DF90CF900C9434104F70C801D2 +:1026C0000E94AB0228960FB6F894DEBF0FBECDBFB6 +:1026D000DF91CF911F910F91FF90EF90DF90CF90FE +:1026E0000C941E174F70C80128960FB6F894DEBFE1 +:1026F0000FBECDBFDF91CF911F910F91FF90EF9053 +:10270000DF90CF900C94ED0528960FB6F894DEBFBD +:102710000FBECDBFDF91CF911F910F91FF90EF9032 +:10272000DF90CF9008950E94AC190E9481190E94F9 +:10273000C8190E94CF1E0E94231E80E090E00E94D4 +:10274000660E80E090E00C947C0E0E949C190C9424 +:1027500093130E94CC18292F22952F7030E02C3033 +:1027600031054CF42A3031056CF422503109223005 +:10277000310590F407C02C30310551F02F30310570 +:1027800039F00AC0803E10F0803F31F481E00895B6 +:1027900093FB882780F9089580E00895CF93DF9315 +:1027A00000D000D01F92CDB7DEB70F900F900F90E2 +:1027B0000F900F90DF91CF910895CF93DF9300D0CA +:1027C00000D000D0CDB7DEB726960FB6F894DEBFA6 +:1027D0000FBECDBFDF91CF9108951F93CF93DF93AD +:1027E000C091790116E080917A01C81799F0D0E084 +:1027F0001C9FF0011D9FF00D1124E558FE4F4081F4 +:10280000518162817381848195810E94DD132196BB +:10281000C770E9CFDF91CF911F9108954091AB012F +:102820005091AC016091AD017091AE018091AF010A +:102830009091B0010C94DD13CF938091B0018295FB +:102840008F7009F05FC08091AD01882309F45AC0F0 +:1028500020917901A0917A016091AB017091AC0156 +:102860008091AE019091AF0131E06F3F09F030E00F +:10287000B32FC6E02A1709F445C0009721F07F3F27 +:1028800021F44B2F03C041E001C040E030E040FDA7 +:1028900035C0C29FF001C39FF00D1124E558FE4FD3 +:1028A000418174132BC04081641328C042814111BF +:1028B00025C0438154814817590710F441505109EC +:1028C000481B590B483C5105C8F48091B0018F70EA +:1028D00080618093B00186E0829FF001839FF00DBC +:1028E0001124E058FE4F80818F70806180838BEAD5 +:1028F00091E00E949110CF910C94ED132F5F3F4F08 +:102900002770B8CFCF910895CF92DF92EF92FF92C8 +:102910000F931F93CF93DF93CDB7DEB762970FB6B8 +:10292000F894DEBF0FBECDBF8C0185E0F801DE015B +:102930001D9601900D928A95E1F7D8014C91119660 +:102940005C91119712966C9112971396ED90FC90F2 +:1029500014977091AB01E091AC012091AE013091E0 +:10296000AF012115310531F0EF3F31F481E07F3FB8 +:1029700019F403C081E001C080E0B82FB170CB2E04 +:1029800080FD6CC1D090AD01DD2009F4F5C0F0915F +:10299000B001E216F30638F0C701821B930B883CA6 +:1029A000910548F09BC0209530952E0D3F1D283C89 +:1029B000310508F093C08F2F807F09F052C0E513D6 +:1029C00014C0741312C0D62E61110FC0FF70F061D5 +:1029D000F093B0010E940E148BEA91E00E949110D6 +:1029E0008091B001F80185836CC1EF2831F05F3F21 +:1029F00031F481E04F3F19F403C081E001C080E071 +:102A000080FD03C081E0862701C080E0F82FF170CF +:102A1000FF2E80FF1CC08091790120917A0136E061 +:102A2000821709F428C190E0389FF001399FF00D1A +:102A30001124E558FE4F7181571306C0708147136A +:102A400003C07281671303C001968770E9CFD62E49 +:102A5000662309F436C18091B00181608093B00192 +:102A600053C0E51308C0741306C0611104C0D80137 +:102A70001596FC93AEC04D875E878D859E856A8BCB +:102A80000E94A9136A89882329F1D62E662311F1A1 +:102A90002091B001822F82958F7090E002970CF404 +:102AA00060C08091AB019091AC0198878F831986AB +:102AB000FB86EA862C87CE01079651C0E51731F1D7 +:102AC0004D875E878D859E856A8B0E94A9136A89D2 +:102AD00081112EC0C8010E949110A4C08F2F807F49 +:102AE00069F77E2DF98AE88A89890E94CE138BEADC +:102AF00091E00E949110EBEAF1E086E0DF011D9287 +:102B00008A95E9F70E940E14D12CDBC07413D8CF3C +:102B10006111D6CFD8011596FC93C8010E9491107F +:102B2000EBEAF1E086E0DF011D928A95E9F7C9C082 +:102B3000D62E662379F22091B001822F82958F7074 +:102B400090E0029774F08091AB019091AC019A8370 +:102B500089831B82FD82EC822E83CE0101960E9426 +:102B6000911086E0F801ABEAB1E001900D928A95F0 +:102B7000E1F70E941C146FC0E216F30628F0C701AB +:102B8000821B930B9C0104C0209530952E0D3F1D98 +:102B9000283C310508F052C0D62E662309F49ACF9E +:102BA000E5132CC074132AC08091B00180FD1DC0B4 +:102BB000982F92959F70C9F0D80115968C93159710 +:102BC0009F3039F09F5F9295907F8F70892B15967B +:102BD0008C93C8010E94911086E0F801ABEAB1E045 +:102BE00001900D928A95E1F736C086E0F801ABEAD4 +:102BF000B1E001900D928A95E1F763C04D875E8741 +:102C00008D859E850E94A913882379F086E0F801BE +:102C1000ABEAB1E001900D928A95E1F70E941C1495 +:102C20000E940E14DD24D3944CC08091B0018160C9 +:102C30008093B001C8010E94911043C07E2DF98A93 +:102C4000E88A89890E94CE13EBEAF1E086E0DF0191 +:102C50001D928A95E9F70E940E1433C0662309F489 +:102C600039CF4D875E878D859E850E94A913882365 +:102C700009F430CFCBCF4D875E878D859E850E942E +:102C8000CC18292F22952F7030E0223031052CF4FA +:102C90009F7041F0811106C00CC0243031052CF426 +:102CA0009F7049F4805E883020F0C8010E94911026 +:102CB000CF2CDC2C06C0D80115969C91907F91F703 +:102CC000F8CF8D2D62960FB6F894DEBF0FBECDBF44 +:102CD000DF91CF911F910F91FF90EF90DF90CF90F8 +:102CE00008951F93CF93DF93CDB7DEB72C970FB620 +:102CF000F894DEBF0FBECDBF4F83588769877A87B0 +:102D00008B879C87CE0107960E9484148823C1F08C +:102D10002F8138858A859B85892B31F03F3F11F0C3 +:102D200080E003C02F3FE1F781E0811147C04F8170 +:102D3000588569857A858B859C850E94DD133EC008 +:102D400086E0FE013796DE01119601900D928A957C +:102D5000E1F7FF81E8854A855B854115510531F032 +:102D6000EF3F31F481E0FF3F19F403C081E001C07F +:102D700080E080FD23C020917A0130E0C9010196F6 +:102D8000877099276091790170E086179707F1F1B4 +:102D9000F983EA835D834C8396E0929FD001939FF1 +:102DA000B00D1124A558BE4FFE01319601900D9231 +:102DB0009A95E1F780937A010E94ED1316E08091D5 +:102DC000790190917A01891779F1189FC001112436 +:102DD00085589E4F0E948414882331F1E091790137 +:102DE0001E9FF0011124E558FE4F40815181628100 +:102DF0007381848195810E94DD138091790190E037 +:102E000001968770992780937901D9CF0E94A513E5 +:102E100010927A0110927901EBEAF1E086E0DF018D +:102E20001D928A95E9F7CACF2C960FB6F894DEBFAB +:102E30000FBECDBFDF91CF911F910895EF92FF920A +:102E40000F931F93CF93DF93FC01009709F46FC09A +:102E5000F12CEE24E394EF0121968491843740F421 +:102E6000843008F055C0813081F0823021F15FC09C +:102E7000853709F447C0C0F19CE7980F903708F0F8 +:102E800056C08F770E94341045C08F010E5F1F4FD0 +:102E9000FE01849190E2980F983050F48770FE2DD7 +:102EA00001C0FF0F8A95EAF78F2F0E949F1915C066 +:102EB0000E946C0F14C08F010E5F1F4FFE018491A2 +:102EC00090E2980F983068F48770FE2D01C0FF0FD4 +:102ED0008A95EAF78F2F0E94A5190E94C819E80168 +:102EE00019C00E943410FBCFCF010296FE01C4919D +:102EF000CC2361F0EFE9FFE03197F1F700C000006B +:102F0000C150F6CFCF010296FE01F490EC0102C051 +:102F10000E946C0F8F2D882341F0EFE9FFE031977D +:102F2000F1F700C000008150F6CFFE0194CFDF9191 +:102F3000CF911F910F91FF90EF90089508956093A6 +:102F4000B5017093B6018093B7019093B8010C94CA +:102F500093130F931F930091B5011091B601209127 +:102F6000B7013091B801062B172B282B392B009372 +:102F7000B5011093B6012093B7013093B8011F91AA +:102F80000F910C9493130F931F930091B50110911F +:102F9000B6012091B7013091B801062317232823E9 +:102FA00039230093B5011093B6012093B7013093F4 +:102FB000B8011F910F910C9493130F931F930091DD +:102FC000B5011091B6012091B7013091B8010627E3 +:102FD0001727282739270093B5011093B6012093AE +:102FE000B7013093B8011F910F910C949313109275 +:102FF000B1011092B2011092B3011092B4010C947D +:10300000931341E050E060E070E004C0440F551FAE +:10301000661F771F8A95D2F74093B1015093B20192 +:103020006093B3017093B4010C94931341E050E0AA +:1030300060E070E004C0440F551F661F771F8A953B +:10304000D2F78091B1019091B201A091B301B091FA +:10305000B401842B952BA62BB72B8093B1019093B1 +:10306000B201A093B301B093B4010C94931341E067 +:1030700050E060E070E004C0440F551F661F771FEA +:103080008A95D2F740955095609570958091B101E1 +:103090009091B201A091B301B091B4018423952322 +:1030A000A623B7238093B1019093B201A093B301FB +:1030B000B093B4010C94931341E050E060E070E0F1 +:1030C00004C0440F551F661F771F8A95D2F7809161 +:1030D000B1019091B201A091B301B091B4018427E4 +:1030E0009527A627B7278093B1019093B201A093AB +:1030F000B301B093B4010C9493130F931F930091F9 +:10310000B1011091B2012091B3013091B401062BAD +:10311000172B282B392B0093B1011093B201209368 +:10312000B3013093B4011F910F910C9493130F933B +:103130001F930091B1011091B2012091B301309120 +:10314000B40106231723282339230093B1011093D8 +:10315000B2012093B3013093B4011F910F910C94ED +:1031600093130F931F930091B1011091B20120911D +:10317000B3013091B4010627172728273927009378 +:10318000B1011093B2012093B3013093B4011F91A8 +:103190000F910C9493130895CF92DF92EF92FF92C8 +:1031A0000F931F93CF93DF93EC01C090B501D090A4 +:1031B000B601E090B701F090B8018091B101909113 +:1031C000B201A091B301B091B401C82AD92AEA2A68 +:1031D000FB2A0FE110E0B701A601002E04C076958E +:1031E0006795579547950A94D2F740FF07C0BE01EF +:1031F000802F0E9410068130910539F40150110989 +:1032000050F7BE0180E00E941006DF91CF911F9120 +:103210000F91FF90EF90DF90CF90089590910C0167 +:103220009923D9F090910D019923B9F0982F969593 +:10323000969596959F3088F5E0910E01F0910F01DB +:10324000E90FF11D877021E030E001C0220F8A955F +:10325000EAF78181822B8183089540910E0150917C +:103260000F0120E030E09FEFFA01E20FF31F6281CF +:10327000681799F09F3F19F4611101C0922F2F5FD9 +:103280003F4F2E30310581F79F3F39F0FA01E90FAA +:10329000F11D97FDFA9582830895089590910C0190 +:1032A0009923E1F090910D019923C1F0982F969503 +:1032B000969596959F3020F5E0910E01F0910F01C3 +:1032C000E90FF11D877021E030E001C0220F8A95DF +:1032D000EAF72095818128232183089540910E01EA +:1032E00050910F0120E030E0FA01E20FF31F9281CC +:1032F000981301C012822F5F3F4F2E303105A1F786 +:10330000089581E090E0E0910E01F0910F01E80F47 +:10331000F91F1082019680319105A9F708959091C7 +:10332000CB01982B9093CB01089580959091CB0180 +:1033300098239093CB0108951092CB01089590911A +:10334000CA01982B9093CA01089580959091CA0163 +:1033500098239093CA0108951092CA01089580930A +:10336000B90108951092B901089540910E0150914C +:103370000F0120E030E080E0FA01E20FF31F9181BD +:1033800091118F5F2F5F3F4F2F303105A9F70895BF +:10339000E0910E01F0910F018091CB018083E091CB +:1033A0000E01F0910F0180819091CA01892B8083D9 +:1033B0009091B901992361F0E0910E01F0910F0114 +:1033C0008081892B80830E94B51981111092B901E7 +:1033D00080910E0190910F010C94500ECF92DF92CC +:1033E000EF92FF920F931F936C01EE24FF24C11400 +:1033F000D104E104F10421F46B017C0180E001C0FF +:1034000080E133272F2D1E2D0D2D011511052105CE +:10341000310519F0885F6801790197018601A4E000 +:103420003695279517950795AA95D1F7011511059A +:103430002105310519F08C5F68017901970186013A +:10344000F2E03695279517950795FA95D1F701156E +:1034500011052105310519F08E5F68017901B70169 +:10346000A6017695679557954795452B462B472B93 +:1034700009F08F5F1F910F91FF90EF90DF90CF9039 +:1034800008958091E501843009F11092CD0120E486 +:1034900088E190E00FB6F894A895809360000FBE85 +:1034A0002093600083B7817F846083BF83B781608E +:1034B00083BF7894889583B78E7F83BF88E10FB6EA +:1034C000F89480936000109260000FBE08950895F4 +:1034D0000895CF930E94671A0E9436040E94681ACA +:1034E000C0E08C2F0E942705811105C0CF5FCE3030 +:1034F000C1F780E001C081E0CF9108950E94A5133B +:103500000E94440E0C944A0782E084BD93E095BD6E +:103510009AEF97BD80936E0008952FB7F89480912D +:10352000CE019091CF01A091D001B091D1012FBFD8 +:103530000895CF92DF92EF92FF920F931F932FB7D0 +:10354000F8944091CE015091CF016091D0017091DB +:10355000D1012FBF6A017B01EE24FF248C0120E002 +:1035600030E0C016D106E206F30610F441505109CE +:10357000481B590BCA011F910F91FF90EF90DF90EC +:10358000CF9008951F920F920FB60F9211248F9330 +:103590009F93AF93BF938091CE019091CF01A09163 +:1035A000D001B091D1010196A11DB11D8093CE0132 +:1035B0009093CF01A093D001B093D101BF91AF916F +:1035C0009F918F910F900FBE0F901F9018950E94A2 +:1035D0004A0BF8942FEF87EA91E621508040904003 +:1035E000E1F700C0000087E090EBDC018093EE0182 +:1035F0009093EF01A093F001B093F1012CE088E1EA +:1036000090E00FB6F894A895809360000FBE2093C9 +:103610006000FFCFEF92FF920F931F93CF93DF9342 +:10362000E82EF12C8F2D0E942705C0E0D0E0082F56 +:1036300010E098010C2E02C0359527950A94E2F708 +:1036400020FD05C02196C630D10599F709C06C2F21 +:103650007F2D80E00E94EE05E812F4CF81E005C0E6 +:10366000F3948EE0F812DECF80E0DF91CF911F91CE +:103670000F91FF90EF900895CF93C82F8CE20E9496 +:103680000A1B882321F08C2FCF910C940A1B80E019 +:10369000CF910895CF930E948F1C811102C00E9488 +:1036A000751CC5E6C15049F00E9436048FE39CE9C1 +:1036B0000197F1F700C00000F5CF89E20E943C1BA2 +:1036C000811111C18AE20E943C1B81110E94751C6C +:1036D00085E00E943C1B81110E94E71A0E949A1CFF +:1036E0008093CC0187E00E943C1B882399F18BE1F9 +:1036F0000E943C1B882351F09091CC0191FB8827BC +:1037000080F921E0822780FB91F922C08EE00E949F +:103710003C1B882351F09091CC0192FB882780F9C3 +:1037200021E0822780FB92F913C080E10E943C1BBC +:103730009091CC01882341F093FB882780F921E008 +:10374000822780FB93F904C0892F809580FB90F934 +:103750009093CC018091CC010E949E1C0E94AC1CD5 +:103760008093DF0180EE0E943C1B882341F0809112 +:10377000DF01982F909590FB80F98093DF0189E31A +:103780000E943C1B882359F09091DF0191FB882710 +:1037900080F921E0822780FB91F99093DF0182EE8E +:1037A0000E943C1B882359F09091DF0192FB8827EF +:1037B00080F921E0822780FB92F99093DF0186EE69 +:1037C0000E943C1B882359F09091DF0193FB8827CE +:1037D00080F921E0822780FB93F99093DF0183EE4B +:1037E0000E943C1B882359F09091DF0194FB8827AD +:1037F00080F921E0822780FB94F99093DF0185E333 +:103800000E943C1B882359F09091DF0195FB88278B +:1038100080F921E0822780FB95F99093DF0181E315 +:103820000E943C1B882359F09091DF0196FB88276A +:1038300080F921E0822780FB96F99093DF0181E1F6 +:103840000E943C1B882359F09091DF0197FB882749 +:1038500080F921E0822780FB97F99093DF01809126 +:10386000DF010E94B01C8091DF0187FB882780F96F +:1038700080930D0187E20E943C1BC82F8EE10E94BD +:103880003C1B8111C2608FE10E943C1B8111C4600E +:1038900080E20E943C1B8111C86081E20E943C1BB7 +:1038A0008111C06182E20E943C1B8111C06283E2EF +:1038B0000E943C1B8111C06484E20E943C1B88234F +:1038C00011F0C06802C0CC2329F08C2F0E94A71CE5 +:1038D0006C2F03C00E94A31C682F70E080E090E072 +:1038E000CF910C949F17CF9108956DEE7EEF80E0FD +:1038F00090E00E94CB2260E082E090E00E94BD2236 +:1039000060E083E090E00E94BD2260E084E090E00F +:103910000E94BD2260E085E090E00C94BD2280E032 +:1039200090E00E94B72221E08D3E9E4F09F020E0FA +:10393000822F089582E090E00C94AF22682F82E0FD +:1039400090E00C94BD2283E090E00C94AF22682FAD +:1039500083E090E00C94BD2284E090E00C94AF22D0 +:10396000682F84E090E00C94BD228091D40180FF08 +:103970000BC06091130185E0689FB001112475951B +:103980006795759567952AC081FF09C060911301FD +:1039900085E0689FB0011124759567951FC082FF6F +:1039A00007C06091130185E0689FB001112416C023 +:1039B0004091D5014423C9F060911201461788F760 +:1039C0002091130185E0289F90011124429FC0019E +:1039D000439F900D112470E00E9481226038710590 +:1039E00040F46115710539F002C065E070E0862F82 +:1039F00008958FE7089581E008958091D40180FFB4 +:103A000008C06091110170E075956795759567958F +:103A100021C081FF06C06091110170E07595679526 +:103A200019C082FF04C06091110170E010C0809144 +:103A3000D5018823C1F0609110018617A0F79091FD +:103A40001101989FC001112470E00E94812260380A +:103A5000710528F46115710521F0862F08958FE70F +:103A6000089581E0089561E070E0F4CF803F21F493 +:103A70000E94B51C819504C0813F29F40E94B51CA9 +:103A80008093D8010895823F21F40E94B51C81954E +:103A900004C0833F29F40E94B51C8093D701089588 +:103AA000893F19F40E94FD1C05C08A3F31F40E9431 +:103AB000FD1C81958093D90108958B3F21F40E94CC +:103AC000FD1C819504C08C3F29F40E94FD1C80934D +:103AD000DA010895843F21F48091D601816017C0F6 +:103AE000853F21F48091D601826011C0863F21F488 +:103AF0008091D60184600BC0873F21F48091D6016C +:103B0000886005C0883F31F48091D6018061809340 +:103B1000D60108958D3F21F48091D40181600BC0BE +:103B20008E3F21F48091D401826005C08F3F29F43B +:103B30008091D40184608093D4010895803F39F44A +:103B40008091D80187FF6CC01092D80169C0813F75 +:103B500029F48091D8011816BCF362C09091D70166 +:103B6000823F29F497FF5CC01092D70159C0833F70 +:103B700019F41916CCF354C0893F41F48091D9014E +:103B800018160CF04DC01092D9014AC08A3F29F492 +:103B90008091D90187FF44C0F6CF8B3F39F48091E3 +:103BA000DA0187FF3DC01092DA013AC08C3F29F458 +:103BB0008091DA011816BCF333C0843F21F4809160 +:103BC000D6018E7F17C0853F21F48091D6018D7F6D +:103BD00011C0863F21F48091D6018B7F0BC0873FB7 +:103BE00021F48091D601877F05C0883F31F4809110 +:103BF000D6018F7E8093D60113C08D3F21F4809132 +:103C0000D4018E7F0BC08E3F21F48091D4018D7F33 +:103C100005C08F3F29F48091D4018B7F8093D4011C +:103C20008091D70181110EC08091D80181110AC005 +:103C30008091D901811106C08091DA01811102C001 +:103C40001092D501089586ED91E00E945B0E0E94CE +:103C50008D1A9093D3018093D20108951F93CF932F +:103C6000DF938091D2019091D3010E94991A4091E3 +:103C7000D501442321F02091140130E006C02091A9 +:103C800015015AE0259F900111248217930708F42B +:103C900082C08091D7011091D801D091D901C091F3 +:103CA000DA01811107C0111105C0D11103C0CC2365 +:103CB00009F471C04F3F19F04F5F4093D5011816BA +:103CC00024F40E94B51C8093D7018091D70187FF0F +:103CD00005C00E94B51C81958093D701111624F46C +:103CE0000E94B51C8093D8018091D80187FF05C040 +:103CF0000E94B51C81958093D8016091D7016623FD +:103D000039F11091D801112319F1772767FD7095CA +:103D1000872F972F0E94922123E333E343E35FE34E +:103D20000E94F6210E945F216093D701612F7727BF +:103D300067FD7095872F972F0E94922123E333E32D +:103D400043E35FE30E94F6210E945F216093D80164 +:103D50001D1624F40E94FD1C8093D9018091D90185 +:103D600087FF05C00E94FD1C81958093D9011C1618 +:103D700024F40E94FD1C8093DA018091DA0187FF10 +:103D800005C00E94FD1C81958093DA01DF91CF91DF +:103D90001F910C94231EDF91CF911F910895E6EDA2 +:103DA000F1E085E0DF011D928A95E9F71092D501D7 +:103DB0001092D4010895833081F128F4813059F0B4 +:103DC0008230D1F00895853009F449C0B8F18630C9 +:103DD00009F456C0089520911501862F90E0820FB6 +:103DE000911D8F3F910520F4620F60931501089596 +:103DF0008FEF80931501089520911401862F90E094 +:103E0000820F911D8F3F910520F4620F6093140182 +:103E100008958FEF80931401089520911301862F48 +:103E200090E0820F911D8F3F910520F4620F609307 +:103E3000130108958FEF80931301089520911201CB +:103E4000862F90E0820F911D8F3F910520F4620F25 +:103E50006093120108958FEF8093120108952091CD +:103E60001101862F90E0820F911D8F3F910520F464 +:103E7000620F6093110108958FEF809311010895EF +:103E800020911001862F90E0820F911D8F3F9105A8 +:103E900020F4620F6093100108958FEF809310015A +:103EA0000895833011F128F4813049F0823091F087 +:103EB0000895853081F120F18630C1F10895809117 +:103EC0001501681720F4861B809315010895109240 +:103ED0001501089580911401681720F4861B8093C2 +:103EE0001401089510921401089580911301681728 +:103EF00020F4861B809313010895109213010895F6 +:103F000080911201681720F4861B80931201089596 +:103F100010921201089580911101681720F4861BF8 +:103F2000809311010895109211010895809110015C +:103F3000681720F4861B80931001089510921001D9 +:103F400008958D3109F442C020F58E3009F479C00E +:103F500070F4873009F45EC020F4863009F442C062 +:103F600033C08830D1F18B3009F4A7C02DC0863121 +:103F700009F4A3C038F4803109F46DC0813109F42B +:103F80007BC022C0893109F498C08B3109F44FC03D +:103F90001BC0853309F479C048F4873209F475C031 +:103FA00008F478C0893209F470C00EC0833438F444 +:103FB0008A3308F071C0883309F47FC005C08334A8 +:103FC00009F463C08834C1F080E008950E9419218B +:103FD0000E94440E0E944A0770C00E949A1C0E94D0 +:103FE000AC1C6BC08091CC01817F8E7F8093CC0113 +:103FF00081E08093DC0108950E94A5132FEF83EDEB +:1040000090E3215080409040E1F700C000000E9402 +:10401000E71A53C09091CC01892F817090FF03C0A3 +:10402000917F9E7F26C091609093CC0146C0909175 +:10403000CC0191FB882780F921E0822780FB91F950 +:1040400013C09091CC0192FB882780F921E0822750 +:1040500080FB92F909C09091CC0193FB882780F9ED +:1040600021E0822780FB93F99093CC01882329F1EA +:1040700091609093CC0108950E94A51380910D0149 +:1040800091E0892780930D0118C061E070E080E025 +:1040900090E00FC023EE01C027EC280F61E070E034 +:1040A00080E090E004C0660F771F881F991F2A9553 +:1040B000D2F70E949F170E94A51381E0089580E027 +:1040C000089580E00895CF93C82F8091DC0181305E +:1040D00079F018F08230D1F184C0A0910E01B09136 +:1040E0000F018C91813169F0823209F07CC009C0E6 +:1040F000A0910E01B0910F018C91813111F08232AB +:1041000049F48C2F0E945F2081111DC08C2F0E94CA +:10411000A11F1AC08C2F0E946120811114C0C431CC +:1041200079F048F4CB3079F0C03109F060C082E01A +:104130008093DC0108C0C93219F0C83321F057C0A0 +:104140001092DC0154C081E0817053C0C93289F102 +:1041500018F5C43171F1A8F4C73009F046C08AE0FF +:104160008093150194E19093140193E090931301CF +:104170008093120188E08093110188E280931001FE +:1041800034C0CE51C63088F5EC2FF0E0E65DFE4F2E +:1041900080818093DB0129C0CE34E9F020F4CB3458 +:1041A00021F56AE013C0C13579F0C235F1F461E060 +:1041B0000DC08091DB01882319F01092DB0115C03E +:1041C00081E08093DC0115C061E006C08091DB01D5 +:1041D0000E94DB1E0AC06AE08091DB010E94511F31 +:1041E00004C01092DC0180E004C081E002C080E0E5 +:1041F000ABCFCF910895E1E8F0E0808188608083C3 +:104200008081816080838FB7F89493E090938900D8 +:1042100090ED909388008FBF0895EFE6F0E08081E5 +:10422000826080830895EFE6F0E080818D7F808357 +:104230000895EFE6F0E0808192E089278083089579 +:104240001F920F920FB60F9211242F933F934F930B +:104250005F936F937F938F939F93AF93BF93EF93EE +:10426000FF938091DD019091DE0101969093DE0134 +:104270008093DD01811103C082E00E944A07E09132 +:10428000DE01E695E695F0E0E657FB4FE49180917C +:10429000DD018E1303C080E00E944A07FF91EF9179 +:1042A000BF91AF919F918F917F916F915F914F914E +:1042B0003F912F910F900FBE0F901F90189504D033 +:1042C0006894B1118DC0089570D088F09F5790F018 +:1042D000B92F9927B751A0F0D1F0660F771F881F2B +:1042E000991F1AF0BA95C9F712C0B13081F077D092 +:1042F000B1E0089574C0672F782F8827B85F39F030 +:10430000B93FCCF3869577956795B395D9F73EF489 +:1043100090958095709561957F4F8F4F9F4F089531 +:10432000E89409C097FB3EF490958095709561954F +:104330007F4F8F4F9F4F9923A9F0F92F96E9BB2705 +:104340009395F695879577956795B795F111F8CF81 +:10435000FAF4BB0F11F460FF1BC06F5F7F4F8F4FEC +:104360009F4F16C0882311F096E911C0772321F0E2 +:104370009EE8872F762F05C0662371F096E8862F7A +:1043800070E060E02AF09A95660F771F881FDAF7D1 +:10439000880F9695879597F9089557FD9058440F83 +:1043A000551F59F05F3F71F04795880F97FB991F94 +:1043B00061F09F3F79F08795089512161306140651 +:1043C000551FF2CF4695F1DF08C0161617061806DE +:1043D000991FF1CF86957105610508940895E894B9 +:1043E000BB2766277727CB0197F908950BD078C0B4 +:1043F00069D028F06ED018F0952309F05AC05FC03C +:104400001124EECFCADFA0F3959FD1F3950F50E0B2 +:10441000551F629FF001729FBB27F00DB11D639F76 +:10442000AA27F00DB11DAA1F649F6627B00DA11D1C +:10443000661F829F2227B00DA11D621F739FB00DC2 +:10444000A11D621F839FA00D611D221F749F332732 +:10445000A00D611D231F849F600D211D822F762FCB +:104460006A2F11249F5750408AF0E1F088234AF0C8 +:10447000EE0FFF1FBB1F661F771F881F9150504014 +:10448000A9F79E3F510570F014C0AACF5F3FECF32F +:10449000983EDCF3869577956795B795F795E79500 +:1044A0009F5FC1F7FE2B880F911D9695879597F911 +:1044B000089597F99F6780E870E060E008959FEFA6 +:1044C00080EC089500240A941616170618060906AB +:1044D000089500240A94121613061406050608957A +:1044E000092E0394000C11F4882352F0BB0F40F402 +:1044F000BF2B11F460FF04C06F5F7F4F8F4F9F4F42 +:10450000089597FB072E16F4009407D077FD09D085 +:104510000E949B2207FC05D03EF4909581959F4F09 +:104520000895709561957F4F0895EE0FFF1F0590D8 +:10453000F491E02D0994AA1BBB1B51E107C0AA1FEF +:10454000BB1FA617B70710F0A61BB70B881F991F34 +:104550005A95A9F780959095BC01CD010895F999D8 +:10456000FECF92BD81BDF89A992780B50895A8E144 +:10457000B0E042E050E00C94D222262FF999FECF11 +:104580001FBA92BD81BD20BD0FB6F894FA9AF99A70 +:104590000FBE019608950E94BD22272F0C94BE22C3 +:1045A000DC01CB01FC01F999FECF06C0F2BDE1BDF3 +:1045B000F89A319600B40D9241505040B8F70895E2 +:0445C000F894FFCF9D +:1045C40020024B07D807B50781074E070101BA013E +:1045D40028080A03140A3F4D36394B04FE03C80366 +:1045E4008F0322033B0354036D03010203040506F6 +:0445F40007080900AB +:00000001FF -- cgit v1.2.3 From 7d3ebd7b40b96f576fe4608b33f47329c334925b Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Tue, 8 Mar 2016 03:50:57 +0200 Subject: Adds a readme with a link to the blog post --- .../ergodox_ez/keymaps/ordinary/keyboard-layout.png | Bin 93556 -> 0 bytes keyboard/ergodox_ez/keymaps/ordinary/ordinary.png | Bin 0 -> 93556 bytes keyboard/ergodox_ez/keymaps/ordinary/readme.md | 5 +++++ 3 files changed, 5 insertions(+) delete mode 100644 keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png create mode 100644 keyboard/ergodox_ez/keymaps/ordinary/ordinary.png create mode 100644 keyboard/ergodox_ez/keymaps/ordinary/readme.md diff --git a/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png b/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png deleted file mode 100644 index c83f972cfe..0000000000 Binary files a/keyboard/ergodox_ez/keymaps/ordinary/keyboard-layout.png and /dev/null differ diff --git a/keyboard/ergodox_ez/keymaps/ordinary/ordinary.png b/keyboard/ergodox_ez/keymaps/ordinary/ordinary.png new file mode 100644 index 0000000000..c83f972cfe Binary files /dev/null and b/keyboard/ergodox_ez/keymaps/ordinary/ordinary.png differ diff --git a/keyboard/ergodox_ez/keymaps/ordinary/readme.md b/keyboard/ergodox_ez/keymaps/ordinary/readme.md new file mode 100644 index 0000000000..033e8ef4d5 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/ordinary/readme.md @@ -0,0 +1,5 @@ +# The Ordinary Layout. for users of common keyboards + +You can read more about the reasoning behind this layout over at [Nicholas's blog](http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html). The idea is to make a layout that's as familiar as possible for users of "regular" keyboards. + +![Ordinary layout](ordinary.png) -- cgit v1.2.3