]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
layout(infinity ergodox): dudeofawesome's layout (#1932)
authorLouis Orleans <louis@orleans.io>
Tue, 31 Oct 2017 15:14:43 +0000 (08:14 -0700)
committerJack Humbert <jack.humb@gmail.com>
Tue, 31 Oct 2017 15:14:43 +0000 (11:14 -0400)
* 🎉 Building simple flasher

* 🎉 Flashing works

* 🎨 Cleaning up

* 🐛 Being more specific with board identity

* 🐛 Flashing correct keymap

* 🎉 Adding keymap

* ✨ Updating keymap

* 🚨 RGB

* ⏪ Revert "🚨 RGB"

This reverts commit 9ceabfb267f8daedaad929231229c703abc12ec4.

* ✨ Improvements to flasher

* ✨ Layout tweaks

* 💄 Messing around with LCD

* 💄 Enabling LCD backlight matching

* 🔧 Updating layout

* 🐛 Fixing console logging

* 🎨 Cleaning up indentation

* 🔧 Adding editorconfig

* ✨ Adding game layer

* 💄 Changing numpad layout

* ✨🔥 redoing entire layout

It's now more similar to the Planck default layout

* ✨ add workman and dvorak layouts

* 🐛 fix numpad

* 🐛 fix layer orders

* 🐛 fix layer toggling

* 🐛 fix tri-layer switching

* 🐛 fix LCD colors for adjustment layers

* 🔥 remove old flasher project

* 🔥 remove simple_visualizer

* 💄 update LCD colors

* 📝 fix layout comments

* 💄  swapping 2u buttons

* 🔥🔧 removing editorconfig

* 🚨 using 2 spaces

* 📝 add README

* ⏪ Revert "💄 Enabling LCD backlight matching"

This reverts commit 51577903dfdc9fea5d33e9ab8cfa9b854e7ae19e.

* ⏪ Revert "💄 Messing around with LCD"

This reverts commit fdd9acdae514a3e0e4a7153225053680744980e5.

keyboards/ergodox_infinity/keymaps/dudeofawesome/README.md [new file with mode: 0644]
keyboards/ergodox_infinity/keymaps/dudeofawesome/keymap.c [new file with mode: 0644]
keyboards/ergodox_infinity/keymaps/dudeofawesome/visualizer.c [new file with mode: 0644]

diff --git a/keyboards/ergodox_infinity/keymaps/dudeofawesome/README.md b/keyboards/ergodox_infinity/keymaps/dudeofawesome/README.md
new file mode 100644 (file)
index 0000000..98eb7ab
--- /dev/null
@@ -0,0 +1,25 @@
+# DudeOfAwesome's ErgoDox Infinity Layout
+
+A basic ErgoDox layout with Planck-like tri-layer support.
+
+![ErgoDox Layout](https://i.imgur.com/9zfKPV7.png)
+
+## Features
+
+- Planck-like tri-layer
+- Workman layout
+- In-progress gaming layer
+- Numpad
+- LCD colors are linked together, like the default KLL firmware
+
+## Building and flashing
+
+1. Put your board in DFU mode with either the button on the bottom, or with a software key in your current firmware
+1. Flash left half:
+    ```bash
+    $ make ergodox_infinity:dudeofawesome:dfu-util
+    ```
+1. Flash right half:
+    ```bash
+    $ make ergodox_infinity:dudeofawesome:dfu-util MASTER=right
+    ```
diff --git a/keyboards/ergodox_infinity/keymaps/dudeofawesome/keymap.c b/keyboards/ergodox_infinity/keymaps/dudeofawesome/keymap.c
new file mode 100644 (file)
index 0000000..7d76b25
--- /dev/null
@@ -0,0 +1,568 @@
+#include QMK_KEYBOARD_H
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+
+enum custom_layers {
+    _QWERTY,
+    _DVORAK,
+    _WORKMAN,
+    _GAME,
+    _MOUSE,
+    _NUM,
+    _LOWER,
+    _RAISE,
+    _ADJUST,
+};
+
+enum custom_keycodes {
+    QWERTY = SAFE_RANGE,
+    DVORAK,
+    WORKMAN,
+    LOWER,
+    RAISE,
+    GAME,
+    MOUSE,
+    NUM,
+    EPRM,
+    VRSN,
+    RGB_SLD
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic QWERTY layer
+ *
+ * ,---------------------------------------------.           ,---------------------------------------------.
+ * |   -    |  1  |  2  |  3  |  4  |  5  | Esc  |           | Esc  |  6  |  7  |  8  |  9  |  0  |   =    |
+ * |--------+-----+-----+-----+-----+------------|           |------+-----+-----+-----+-----+-----+--------|
+ * |  Tab   |  Q  |  W  |  E  |  R  |  T  |  [{  |           |  ]}  |  Y  |  U  |  I  |  O  |  P  |  BSPC  |
+ * |--------+-----+-----+-----+-----+-----|      |           |      |-----+-----+-----+-----+-----+--------|
+ * |  ESC   |  A  |  S  |  D  |  F  |  G  |------|           |------|  H  |  J  |  K  |  L  |  ;  |   '"   |
+ * |--------+-----+-----+-----+-----+-----|  L1  |           |  L1  |-----+-----+-----+-----+-----+--------|
+ * | LShift |  Z  |  X  |  C  |  V  |  B  |      |           |      |  N  |  M  |  ,  |  .  |  /  | Enter  |
+ * `--------+-----+-----+-----+-----+------------'           `------------+-----+-----+-----+-----+--------'
+ *   | Num  |Ctrl | Alt |LGUI |Lower|                                     |Raise|Left |Down | Up  |Right |
+ *   `------------------------------'                                     `------------------------------'
+ *                                   ,------------.          ,------------.
+ *                                   |Play |Mouse |          | Num  |Mouse|
+ *                              ,----|-----|------|          |------+-----+-----.
+ *                              |    |     | Alt  |          | Alt  |     |     |
+ *                              |BSPC|LOWER|------|          |------|RAISE|Space|
+ *                              |    |     | LGUI |          | LGUI |     |     |
+ *                              `-----------------'          `------------------'
+ */
+[_QWERTY] = LAYOUT_ergodox(
+  // left hand
+  KC_MINUS, 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_LBRACKET,
+  KC_ESC,   KC_A,    KC_S,    KC_D,    KC_F,  KC_G,
+  KC_LSPO,  KC_Z,    KC_X,    KC_C,    KC_V,  KC_B, KC_FN1,
+  TG(_NUM), KC_LCTL, KC_LALT, KC_LGUI, LOWER,
+
+                                                  KC_MPLY,   TG(_MOUSE),
+                                                             KC_LALT,
+                                          LOWER,  KC_BSPACE, KC_LGUI,
+
+  // right hand
+  KC_ESC,      KC_6, KC_7,  KC_8,    KC_9,    KC_0,                KC_EQUAL,
+  KC_RBRACKET, KC_Y, KC_U,  KC_I,    KC_O,    KC_P,                KC_BSPACE,
+               KC_H, KC_J,  KC_K,    KC_L,    KC_SCOLON,           KC_QUOTE,
+  KC_FN1,      KC_N, KC_M,  KC_COMM, KC_DOT,  LT(_MOUSE, KC_SLSH), KC_ENTER,
+                     RAISE, KC_LEFT, KC_DOWN, KC_UP,               KC_RIGHT,
+
+  TG(_NUM), TG(_MOUSE),
+  KC_LALT,
+  KC_LGUI,  KC_SPACE,   RAISE
+),
+
+/* Keymap 0: Basic Dvorak layer
+ *
+ * ,---------------------------------------------.           ,--------------------------------------------.
+ * |   -    |  1  |  2  |  3  |  4  |  5  | Esc  |           | Esc  |  6  |  7  |  8  |  9  |  0  |   =    |
+ * |--------+-----+-----+-----+-----+------------|           |------+-----+-----+-----+-----+-----+--------|
+ * |  Tab   |  '  |  ,  |  .  |  P  |  Y  |  [{  |           |  ]}  |  F  |  G  |  C  |  R  |  L  |  BSPC  |
+ * |--------+-----+-----+-----+-----+-----|      |           |      |-----+-----+-----+-----+-----+--------|
+ * |  ESC   |  A  |  O  |  E  |  U  |  I  |------|           |------|  D  |  H  |  T  |  N  |  S  |   /    |
+ * |--------+-----+-----+-----+-----+-----|  L1  |           |  L1  |-----+-----+-----+-----+-----+--------|
+ * | LShift |  ;  |  Q  |  J  |  K  |  X  |      |           |      |  B  |  M  |  W  |  V  |  Z  | Enter  |
+ * `--------+-----+-----+-----+-----+------------'           `------------+-----+-----+-----+-----+--------'
+ *   | Num  |Ctrl | Alt |LGUI |Lower|                                     |Raise|Left |Down | Up  |Right |
+ *   `------------------------------'                                     `------------------------------'
+ *                                   ,------------.          ,------------.
+ *                                   |Play |Mouse |          | Num  |Mouse|
+ *                              ,----|-----|------|          |------+-----+-----.
+ *                              |    |     | Alt  |          | Alt  |     |     |
+ *                              |BSPC|LOWER|------|          |------|RAISE|Space|
+ *                              |    |     | LGUI |          | LGUI |     |     |
+ *                              `-----------------'          `------------------'
+ */
+[_DVORAK] = LAYOUT_ergodox(
+  // left hand
+  KC_MINUS, KC_1,      KC_2,    KC_3,    KC_4,  KC_5, KC_ESC,
+  KC_TAB,   KC_QUOT,   KC_COMM, KC_DOT,  KC_P,  KC_Y, KC_LBRACKET,
+  KC_ESC,   KC_A,      KC_O,    KC_E,    KC_U,  KC_I,
+  KC_LSPO,  KC_SCOLON, KC_Q,    KC_J,    KC_K,  KC_X, KC_FN1,
+  TG(_NUM), KC_LCTL,   KC_LALT, KC_LGUI, LOWER,
+
+                                                  KC_MPLY, TG(_MOUSE),
+                                                           KC_LALT,
+                                      KC_BSPACE,  LOWER,   KC_LGUI,
+
+  // right hand
+  KC_ESC,      KC_6, KC_7,  KC_8,    KC_9,    KC_0,  KC_EQUAL,
+  KC_RBRACKET, KC_F, KC_G,  KC_C,    KC_R,    KC_L,  KC_BSPACE,
+               KC_D, KC_H,  KC_T,    KC_N,    KC_S,  LT(MOUSE, KC_SLSH),
+  KC_FN1,      KC_B, KC_M,  KC_W,    KC_V,    KC_Z,  KC_ENTER,
+                     RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
+
+  TG(_NUM), TG(_MOUSE),
+  KC_LALT,
+  KC_LGUI,  RAISE,      KC_SPACE
+),
+
+/* Keymap 0: Basic Workman layer
+ *
+ * ,---------------------------------------------.           ,--------------------------------------------.
+ * |   -    |  1  |  2  |  3  |  4  |  5  | Esc  |           | Esc  |  6  |  7  |  8  |  9  |  0  |   =    |
+ * |--------+-----+-----+-----+-----+------------|           |------+-----+-----+-----+-----+-----+--------|
+ * |  Tab   |  Q  |  D  |  R  |  W  |  B  |  [{  |           |  ]}  |  J  |  F  |  U  |  P  |  ;  |  BSPC  |
+ * |--------+-----+-----+-----+-----+-----|      |           |      |-----+-----+-----+-----+-----+--------|
+ * |  ESC   |  A  |  S  |  H  |  T  |  G  |------|           |------|  Y  |  N  |  E  |  O  |  I  |   '"   |
+ * |--------+-----+-----+-----+-----+-----|  L1  |           |  L1  |-----+-----+-----+-----+-----+--------|
+ * | LShift |  Z  |  X  |  M  |  C  |  V  |      |           |      |  K  |  L  |  ,  |  .  |  /  | Enter  |
+ * `--------+-----+-----+-----+-----+------------'           `------------+-----+-----+-----+-----+--------'
+ *   | Num  |Ctrl | Alt |LGUI |Lower|                                     |Raise|Left |Down | Up  |Right |
+ *   `------------------------------'                                     `------------------------------'
+ *                                   ,------------.          ,------------.
+ *                                   |Play |Mouse |          | Num  |Mouse|
+ *                              ,----|-----|------|          |------+-----+-----.
+ *                              |    |     | Alt  |          | Alt  |     |     |
+ *                              |BSPC|LOWER|------|          |------|RAISE|Space|
+ *                              |    |     | LGUI |          | LGUI |     |     |
+ *                              `-----------------'          `------------------'
+ */
+[_WORKMAN] = LAYOUT_ergodox(
+  // left hand
+  KC_MINUS, KC_1,    KC_2,    KC_3,    KC_4,    KC_5, KC_ESC,
+  KC_TAB,   KC_Q,    KC_D,    KC_R,    KC_W,    KC_B, KC_LBRACKET,
+  KC_ESC,   KC_A,    KC_S,    KC_H,    KC_T,    KC_G,
+  KC_LSPO,  KC_Z,    KC_X,    KC_M,    KC_C,    KC_V, KC_FN1,
+  TG(_NUM), KC_LCTL, KC_LALT, KC_LGUI, LOWER,
+
+                                                  KC_MPLY, TG(_MOUSE),
+                                                            KC_LALT,
+                                      KC_BSPACE,  LOWER,   KC_LGUI,
+
+  // right hand
+  KC_ESC,      KC_6, KC_7,  KC_8,    KC_9,    KC_0,                KC_EQUAL,
+  KC_RBRACKET, KC_J, KC_F,  KC_U,    KC_P,    KC_SCOLON,           KC_BSPACE,
+               KC_Y, KC_N,  KC_E,    KC_O,    KC_I,                KC_QUOTE,
+  KC_FN1,      KC_K, KC_L,  KC_COMM, KC_DOT,  LT(_MOUSE, KC_SLSH), KC_ENTER,
+                     RAISE, KC_LEFT, KC_DOWN, KC_UP,               KC_RIGHT,
+
+  NUM,     TG(_MOUSE),
+  KC_LALT,
+  KC_LGUI, RAISE,      KC_SPACE
+),
+
+/* Lower
+ *
+ * ,---------------------------------------------------.           ,--------------------------------------------------.
+ * | Version |  F1  |  F2  |  F3  |  F4  |  F5  | F11  |           | F12  |  F6  |  F7  |  F8  |  F9  | F10  |        |
+ * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
+ * |    ~    |  !   |  @   |  #   |  $   |  %   |      |           |      |  ^   |  &   |  *   |  (   |  )   |        |
+ * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   Del   |  F1  |  F2  |  F3  |  F4  |  F5  |------|           |------|  F6  |  _   |  +   |  {   |  }   |   |    |
+ * |---------+------+------+------+------+------|  L2  |           |  L2  |------+------+------+------+------+--------|
+ * |         |  F7  |  F8  |  F9  | F10  | F11  |      |           |      | F12  |ISO ~ |ISO | | Home | End  |        |
+ * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |       |      |      |      |      |                                       |      | Next | Vol- | Vol+ | Play |
+ *   `-----------------------------------'                                       `----------------------------------'
+ *                                       ,-------------.           ,-------------.
+ *                                       |Animat|      |           |Toggle|Solid |
+ *                                ,------|------|------|           |------+------+------.
+ *                                |Bright|Bright|      |           |      |Hue-  |Hue+  |
+ *                                |ness- |ness+ |------|           |------|      |      |
+ *                                |      |      |      |           |      |      |      |
+ *                                `--------------------'           `--------------------'
+ */
+[_LOWER] = LAYOUT_ergodox(
+  // left hand
+  VRSN,    KC_F1,   KC_F2,   KC_F3,   KC_F4,    KC_F5,   KC_F11,
+  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,   KC_PERC, _______,
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,    KC_F5,
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,  _______,
+  _______, _______, _______, _______, _______,
+
+                                       _______, _______,
+                                                _______,
+                              _______, _______, _______,
+
+  // right hand
+  KC_F12,  KC_F6,   KC_F7,      KC_F8,      KC_F9,   KC_F10,  KC_F11,
+  _______, KC_CIRC, KC_AMPR,    KC_ASTR,    KC_LPRN, KC_RPRN, _______,
+           KC_F6,   KC_UNDS,    KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE,
+  _______, KC_F12,  S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END,  _______,
+                    _______,    KC_MNXT,    KC_VOLD, KC_VOLU, KC_MPLY,
+
+  _______, _______,
+  _______,
+  _______, _______, _______
+),
+
+/* Raise
+ *
+ * ,---------------------------------------------------.           ,--------------------------------------------------.
+ * | Version |  F1  |  F2  |  F3  |  F4  |  F5  | F11  |           | F12  |  F6  |  F7  |  F8  |  F9  | F10  |  F11   |
+ * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
+ * |    `    |  1   |  2   |  3   |  4   |  5   |      |           |      |  6   |  7   |  8   |  9   |  0   |        |
+ * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   Del   |  F1  |  F2  |  F3  |  F4  |  F5  |------|           |------|  F6  |  -   |  =   |  [   |  ]   |   \    |
+ * |---------+------+------+------+------+------|  L2  |           |  L2  |------+------+------+------+------+--------|
+ * |         |  F7  |  F8  |  F9  | F10  | F11  |      |           |      | F12  |ISO # |ISO / |Pg Up |Pg Dn |        |
+ * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |       |      |      |      |      |                                       |      | Next | Vol- | Vol+ | Play |
+ *   `-----------------------------------'                                       `----------------------------------'
+ *                                       ,-------------.           ,-------------.
+ *                                       |Animat|      |           |Toggle|Solid |
+ *                                ,------|------|------|           |------+------+------.
+ *                                |Bright|Bright|      |           |      |Hue-  |Hue+  |
+ *                                |ness- |ness+ |------|           |------|      |      |
+ *                                |      |      |      |           |      |      |      |
+ *                                `--------------------'           `--------------------'
+ */
+[_RAISE] = LAYOUT_ergodox(
+  // left hand
+  VRSN,    KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F11,
+  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    _______,
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  _______,
+  _______, _______, _______, _______, _______,
+
+                                               _______, _______,
+                                                        _______,
+                                      _______, _______, _______,
+
+  // right hand
+  KC_F12,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,
+  _______, KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    _______,
+           KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS,
+  _______, KC_F12,  KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+                    _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY,
+
+  _______, _______,
+  _______,
+  _______, _______,  _______
+),
+
+/* Adjust
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |Version |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |Reset |Debug |      |      |      |      |           |      |      |TRM on|TRMoff|      |      |  Del   |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |AG Nrm|------|           |------|AG Swp|QWERTY|Wrkman|Dvorak|      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                      ,-------------.           ,-------------.
+ *                                      |      |      |           |      |      |
+ *                               ,------|------|------|           |------+------+------.
+ *                               |      |      |      |           |      |      |      |
+ *                               |      |      |------|           |------|      |      |
+ *                               |      |      |      |           |      |      |      |
+ *                               `--------------------'           `--------------------'
+ */
+[_ADJUST] = LAYOUT_ergodox(
+  // left hand
+  VRSN,    _______, _______, _______, _______, _______, _______,
+  _______, RESET,   DEBUG,   _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, AG_NORM,
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______,
+
+                                               _______, _______,
+                                                        _______,
+                                      _______, _______, _______,
+
+  // right hand
+  _______, _______, _______, _______,  _______, _______, _______,
+  _______, _______, TERM_ON, TERM_OFF, _______, _______, KC_DEL,
+           AG_SWAP, QWERTY,  WORKMAN,  DVORAK,  _______, _______,
+  _______, _______, _______, _______,  _______, _______, _______,
+                    _______, _______,  _______, _______, _______,
+
+  _______, _______,
+  _______,
+  _______, _______,  _______
+),
+
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      | Lclk | MsUp | Rclk |Wh Up |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|Wh Dn |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                      ,-------------.           ,-------------.
+ *                                      |      |      |           |      |      |
+ *                               ,------|------|------|           |------+------+------.
+ *                               |      |      |      |           |      |Brwser|Brwser|
+ *                               | Lclk | Rclk |------|           |------|Back  |Fwd   |
+ *                               |      |      |      |           |      |      |      |
+ *                               `--------------------'           `--------------------'
+ */
+// MOUSE
+[_MOUSE] = LAYOUT_ergodox(
+  // left hand
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_D, _______,
+  _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U,
+  _______, _______, KC_WH_L, KC_BTN3, KC_WH_R, _______, TO(_GAME),
+  _______, _______, _______, _______, _______,
+
+                                       _______, _______,
+                                                KC_WH_D,
+                              KC_BTN1, KC_BTN2, KC_WH_U,
+
+  // right hand
+  _______,   _______, _______, _______, _______, _______, _______,
+  _______,   _______, _______, _______, _______, _______, _______,
+             _______, _______, _______, _______, _______, KC_MPLY,
+  TO(_GAME), _______, _______, KC_MPRV, KC_MNXT, _______, _______,
+                      KC_VOLU, KC_VOLD, KC_MUTE, _______, _______,
+
+  _______, _______,
+  _______,
+  _______, KC_WBAK, KC_WFWD
+),
+
+/* Keymap 2: GAME
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      | Lclk | MsUp | Rclk |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                      ,-------------.           ,-------------.
+ *                                      |      |      |           |      |      |
+ *                               ,------|------|------|           |------+------+------.
+ *                               |      |      |      |           |      |Brwser|Brwser|
+ *                               | Lclk | Rclk |------|           |------|Back  |Fwd   |
+ *                               |      |      |      |           |      |      |      |
+ *                               `--------------------'           `--------------------'
+ */
+[_GAME] = LAYOUT_ergodox(
+  // left hand
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______,
+
+                                                  _______, _______,
+                                                           _______,
+                                        KC_SPACE, KC_LGUI, KC_LALT,
+
+  // right hand
+  _______, _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______,
+           _______, _______, _______, _______, _______, _______,
+  _______, _______, _______, _______, _______, _______, _______,
+                    _______, _______, _______, _______, _______,
+
+  TG(_MOUSE), TG(_NUM),
+  _______,
+  _______,    _______,  _______
+),
+
+
+/* Keymap 2: NUMPAD
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  | F11  |           | F12  |  F6  |  F7  |  F8  |  F9  |  F10 |        |
+ * |--------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
+ * |        |  !   |  @   |  {   |  }   |  |   |      |           |      |      |  7   |  8   |  9   |  *   |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  #   |  $   |  (   |  )   |  `   |------|           |------|      |  4   |  5   |  6   |  +   |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  %   |  ^   |  [   |  ]   |  ~   |      |           |      |      |  1   |  2   |  3   |  \   |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |  .   |  0   |  0   |  =   |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                      ,-------------.           ,-------------.
+ *                                      |      |      |           |      |      |
+ *                               ,------|------|------|           |------+------+------.
+ *                               |      |      |      |           |      |      |      |
+ *                               |      |      |------|           |------|      |      |
+ *                               |      |      |      |           |      |      |      |
+ *                               `--------------------'           `--------------------'
+ */
+[_NUM] = LAYOUT_ergodox(
+  // left hand
+  _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F11,
+  _______, KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, _______,
+  _______, KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,
+  _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, _______,
+  _______, _______, _______, _______, _______,
+
+                                               _______, _______,
+                                                        _______,
+                                      _______, _______, _______,
+
+  // right hand
+  KC_F12,  KC_F6,   KC_F7,     KC_F8,   KC_F9,   KC_F10,         KC_F11,
+  _______, _______, KC_KP_7,   KC_KP_8, KC_KP_9, KC_KP_ASTERISK, _______,
+           _______, KC_KP_4,   KC_KP_5, KC_KP_6, KC_KP_PLUS,     _______,
+  _______, _______, KC_KP_1,   KC_KP_2, KC_KP_3, KC_KP_SLASH,    _______,
+                    KC_KP_DOT, KC_KP_0, KC_KP_0, KC_KP_EQUAL,    _______,
+
+  _______, _______,
+  _______,
+  _______, _______,  _______
+),
+
+};
+
+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) {
+      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+    }
+    break;
+    case 1:
+    if (record->event.pressed) { // For resetting EEPROM
+      eeconfig_init();
+    }
+    break;
+  }
+  return MACRO_NONE;
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        print("mode just switched to qwerty and this is a huge string\n");
+        set_single_persistent_default_layer(_QWERTY);
+      }
+      return false;
+      break;
+    case WORKMAN:
+      if (record->event.pressed) {
+        set_single_persistent_default_layer(_WORKMAN);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        set_single_persistent_default_layer(_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+        if (IS_LAYER_ON(_ADJUST)) {
+          layer_off(_LOWER);
+          layer_off(_RAISE);
+        }
+      } else {
+        layer_off(_LOWER);
+        if (IS_LAYER_ON(_ADJUST)) {
+          layer_off(_ADJUST);
+          layer_on(_RAISE);
+        }
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+        if (IS_LAYER_ON(_ADJUST)) {
+          layer_off(_RAISE);
+          layer_off(_LOWER);
+        }
+      } else {
+        layer_off(_RAISE);
+        if (IS_LAYER_ON(_ADJUST)) {
+          layer_off(_ADJUST);
+          layer_on(_LOWER);
+        }
+      }
+      return false;
+      break;
+    case EPRM:
+      if (record->event.pressed) {
+        eeconfig_init();
+      }
+      return false;
+      break;
+    case VRSN:
+      if (record->event.pressed) {
+        SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+      }
+      return false;
+      break;
+    case RGB_SLD:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+        rgblight_mode(1);
+        #endif
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+/**
+ * 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) {
+    case _LOWER:
+      ergodox_right_led_1_on();
+      break;
+    case _RAISE:
+      ergodox_right_led_2_on();
+      break;
+    case _ADJUST:
+      ergodox_right_led_3_on();
+      break;
+  }
+};
diff --git a/keyboards/ergodox_infinity/keymaps/dudeofawesome/visualizer.c b/keyboards/ergodox_infinity/keymaps/dudeofawesome/visualizer.c
new file mode 100644 (file)
index 0000000..034f152
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * Currently we are assuming that both the backlight and LCD are enabled
+ * But it's entirely possible to write a custom visualizer that use only
+ * one of them
+ */
+#ifndef LCD_BACKLIGHT_ENABLE
+#error This visualizer needs that LCD backlight is enabled
+#endif
+
+#ifndef LCD_ENABLE
+#error This visualizer needs that LCD is enabled
+#endif
+
+#include "visualizer.h"
+#include "visualizer_keyframes.h"
+#include "lcd_keyframes.h"
+#include "lcd_backlight_keyframes.h"
+#include "system/serial_link.h"
+#include "default_animations.h"
+
+static const uint32_t logo_background_color = LCD_COLOR(0, 0, 255);
+static const uint32_t initial_color = LCD_COLOR(84, 255, 255);
+
+static const uint32_t led_emulation_colors[4] = {
+  LCD_COLOR(0, 0, 255),
+  LCD_COLOR(141, 255, 255),
+  LCD_COLOR(18, 255, 255),
+  LCD_COLOR(194, 255, 255),
+};
+
+static uint32_t next_led_target_color = 0;
+
+typedef enum {
+  LCD_STATE_INITIAL,
+  LCD_STATE_LAYER_BITMAP,
+  LCD_STATE_BITMAP_AND_LEDS,
+} lcd_state_t;
+
+static lcd_state_t lcd_state = LCD_STATE_INITIAL;
+
+typedef struct {
+  uint8_t led_on;
+  uint8_t led1;
+  uint8_t led2;
+  uint8_t led3;
+} visualizer_user_data_t;
+
+/**
+ * Don't access from visualization function, use the visualizer state instead
+ */
+static visualizer_user_data_t user_data_keyboard = {
+  .led_on = 0,
+  .led1 = LED_BRIGHTNESS_HI,
+  .led2 = LED_BRIGHTNESS_HI,
+  .led3 = LED_BRIGHTNESS_HI,
+};
+
+_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE,
+  "Please increase the VISUALIZER_USER_DATA_SIZE");
+
+// Feel free to modify the animations below, or even add new ones if needed
+
+// The color animation animates the LCD color when you change layers
+static keyframe_animation_t one_led_color = {
+  .num_frames = 1,
+  .loop = false,
+  .frame_lengths = {gfxMillisecondsToTicks(0)},
+  .frame_functions = {lcd_backlight_keyframe_set_color},
+};
+
+bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) {
+  uint32_t temp = next_led_target_color;
+  next_led_target_color = state->target_lcd_color;
+  state->target_lcd_color = temp;
+  return false;
+}
+
+// The color animation animates the LCD color when you change layers
+static keyframe_animation_t two_led_colors = {
+  .num_frames = 2,
+  .loop = true,
+  .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)},
+  .frame_functions = {lcd_backlight_keyframe_set_color, swap_led_target_color},
+};
+
+/**
+ * The LCD animation alternates between the layer name display and a
+ * bitmap that displays all active layers
+ */
+static keyframe_animation_t lcd_bitmap_animation = {
+  .num_frames = 1,
+  .loop = false,
+  .frame_lengths = {gfxMillisecondsToTicks(0)},
+  .frame_functions = {lcd_keyframe_display_layer_bitmap},
+};
+
+static keyframe_animation_t lcd_bitmap_leds_animation = {
+  .num_frames = 2,
+  .loop = true,
+  .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)},
+  .frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states},
+};
+
+void initialize_user_visualizer(visualizer_state_t* state) {
+  /**
+   * The brightness will be dynamically adjustable in the future
+   * But for now, change it here.
+   */
+  lcd_backlight_brightness(180);
+  state->current_lcd_color = initial_color;
+  state->target_lcd_color = logo_background_color;
+  lcd_state = LCD_STATE_INITIAL;
+  start_keyframe_animation(&default_startup_animation);
+}
+
+static inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) {
+  return user_data->led_on & (1u << num);
+}
+
+static uint8_t get_led_index_master(visualizer_user_data_t* user_data) {
+  for (int i=0; i < 4; i++) {
+    if (is_led_on(user_data, i)) {
+      return i + 1;
+    }
+  }
+  return 0;
+}
+
+static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) {
+  uint8_t master_index = get_led_index_master(user_data);
+  if (master_index!=0) {
+    for (int i=master_index; i < 4; i++) {
+      if (is_led_on(user_data, i)) {
+        return i + 1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) {
+  if (
+    is_led_on(user_data, 0) &&
+    is_led_on(user_data, 1) &&
+    is_led_on(user_data, 2)
+  ) {
+    return 3;
+  }
+  return 0;
+}
+
+static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) {
+  switch (index) {
+    case 1:
+      return user_data->led1;
+    case 2:
+      return user_data->led2;
+    case 3:
+      return user_data->led3;
+  }
+  return 0;
+}
+
+static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
+  visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data;
+  visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data;
+
+  uint8_t new_index;
+  uint8_t old_index;
+
+  if (true || is_serial_link_master()) {
+    new_index = get_led_index_master(user_data_new);
+    old_index = get_led_index_master(user_data_old);
+  } else {
+    new_index = get_led_index_slave(user_data_new);
+    old_index = get_led_index_slave(user_data_old);
+  }
+
+  uint8_t new_secondary_index = get_secondary_led_index(user_data_new);
+  uint8_t old_secondary_index = get_secondary_led_index(user_data_old);
+
+  uint8_t new_brightness = get_brightness(user_data_new, new_index);
+  uint8_t old_brightness = get_brightness(user_data_old, old_index);
+
+  uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index);
+  uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index);
+
+  if (
+    lcd_state == LCD_STATE_INITIAL ||
+    new_index != old_index ||
+    new_secondary_index != old_secondary_index ||
+    new_brightness != old_brightness ||
+    new_secondary_brightness != old_secondary_brightness
+  ) {
+    if (new_secondary_index != 0) {
+      state->target_lcd_color = change_lcd_color_intensity(
+        led_emulation_colors[new_index], new_brightness);
+      next_led_target_color = change_lcd_color_intensity(
+        led_emulation_colors[new_secondary_index], new_secondary_brightness);
+
+      stop_keyframe_animation(&one_led_color);
+      start_keyframe_animation(&two_led_colors);
+    } else {
+      state->target_lcd_color = change_lcd_color_intensity(
+        led_emulation_colors[new_index], new_brightness);
+
+      stop_keyframe_animation(&two_led_colors);
+      start_keyframe_animation(&one_led_color);
+    }
+  }
+}
+
+static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
+  if (state->status.leds) {
+    if (
+      lcd_state != LCD_STATE_BITMAP_AND_LEDS ||
+      state->status.leds != prev_status->leds ||
+      state->status.layer != prev_status->layer ||
+      state->status.default_layer != prev_status->default_layer
+    ) {
+      // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case
+      stop_keyframe_animation(&lcd_bitmap_animation);
+
+      lcd_state = LCD_STATE_BITMAP_AND_LEDS;
+      /**
+       * For information:
+       * The logic in this function makes sure that this doesn't happen, but if you call start on an
+       * animation that is already playing it will be restarted.
+       */
+      start_keyframe_animation(&lcd_bitmap_leds_animation);
+    }
+  } else {
+    if (
+      lcd_state != LCD_STATE_LAYER_BITMAP ||
+      state->status.layer != prev_status->layer ||
+      state->status.default_layer != prev_status->default_layer
+    ) {
+      stop_keyframe_animation(&lcd_bitmap_leds_animation);
+
+      lcd_state = LCD_STATE_LAYER_BITMAP;
+      start_keyframe_animation(&lcd_bitmap_animation);
+    }
+  }
+}
+
+void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
+  /**
+   * Check the status here to start and stop animations
+   * You might have to save some state, like the current animation here so that you can start the right
+   * This function is called every time the status changes
+   *
+   * NOTE that this is called from the visualizer thread, so don't access anything else outside the status
+   * This is also important because the slave won't have access to the active layer for example outside the
+   * status.
+   */
+
+  update_emulated_leds(state, prev_status);
+  update_lcd_text(state, prev_status);
+}
+
+void user_visualizer_suspend(visualizer_state_t* state) {
+  state->layer_text = "Suspending...";
+  uint8_t hue = LCD_HUE(state->current_lcd_color);
+  uint8_t sat = LCD_SAT(state->current_lcd_color);
+  state->target_lcd_color = LCD_COLOR(hue, sat, 0);
+  start_keyframe_animation(&default_suspend_animation);
+}
+
+void user_visualizer_resume(visualizer_state_t* state) {
+  state->current_lcd_color = initial_color;
+  state->target_lcd_color = logo_background_color;
+  lcd_state = LCD_STATE_INITIAL;
+  start_keyframe_animation(&default_startup_animation);
+}
+
+void ergodox_board_led_on(void){
+  // No board led support
+}
+
+void ergodox_right_led_1_on(void){
+  user_data_keyboard.led_on |= (1u << 0);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_2_on(void){
+  user_data_keyboard.led_on |= (1u << 1);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_3_on(void){
+  user_data_keyboard.led_on |= (1u << 2);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_board_led_off(void){
+  // No board led support
+}
+
+void ergodox_right_led_1_off(void){
+  user_data_keyboard.led_on &= ~(1u << 0);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_2_off(void){
+  user_data_keyboard.led_on &= ~(1u << 1);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_3_off(void){
+  user_data_keyboard.led_on &= ~(1u << 2);
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_1_set(uint8_t n) {
+  user_data_keyboard.led1 = n;
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_2_set(uint8_t n) {
+  user_data_keyboard.led2 = n;
+  visualizer_set_user_data(&user_data_keyboard);
+}
+
+void ergodox_right_led_3_set(uint8_t n) {
+  user_data_keyboard.led3 = n;
+  visualizer_set_user_data(&user_data_keyboard);
+}