Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge from upstream #380

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ quantum/version.h
.dep
.history/
build/
bin/
cmake-build-debug
CMakeLists.txt

Expand All @@ -61,7 +62,7 @@ tags
# Ignore image files
*.gif
*.jpg
*.png


# Things Travis sees
/.vs
Expand Down
4 changes: 4 additions & 0 deletions 50-zsa.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Wally Flashing rules for the Moonlander and Planck EZ
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", \
MODE:="0666", \
SYMLINK+="stm32_dfu"
71 changes: 71 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
This is a fork of ZSA's official repository: '[`zsa/qmk_firmware`](https://github.com/zsa/qmk_firmware/)'

# WDR45
WDR45 is a custom keyboard layout, loosely inspired by the [Workman](https://workmanlayout.org/) layout, but adapted to fit my personal preferences.
It is particularly intended for split ortholinear/columnar keyboards. Specifically these keyboards:
- [Kinesis Advantage360 Pro](https://kinesis-ergo.com/shop/adv360pro/) - WDR45 Repo: [d00astro/Adv360-Pro-ZMK](https://github.com/d00astro/Adv360-Pro-ZMK)
- [Kinesis Advantage2](https://kinesis-ergo.com/keyboards/advantage2-keyboard/) - WDR45 Repo: TBD
- [ZSA Moonlander](https://www.zsa.io/moonlander/) - You can find WDR45 for the Moonlander on [ZSA Oryx](https://configure.zsa.io/moonlander/layouts/z9Bbj/latest/0) or you can use this Repo to build it using QMK.

## Layout

![WDR45 Moonlander layout](WDR45_Layout.png "WDR Layout on ZSA Moonlander MK I")


# Tooling installation
Two tools are needed to customize the keyboard layout:
- QMK compiler - To compile the keyboard layout binary
- Wally - To flash the binary to the keypboart

## QMK compiler
```bash
virtualenv -p python3 .venv
source .venv/bin/activate
pip install qmk
qmk setup zsa/qmk_firmware -b firmware21
```

## Wally
[Official site](https://www.zsa.io/wally/)

### Debian / Ubuntu
```console
sudo apt install libusb-1.0-0-dev
sudo cp 50-zsa.rules /etc/udev/rules.d/
sudo groupadd plugdev
sudo usermod -aG plugdev $USER
mkdir -p bin
wget -O bin/wally "https://configure.ergodox-ez.com/wally/linux"
chmod +x bin/wally
```

Note that the udev rules in `50-zsa.rules` is only for the Moonlander keyboard. Refer to the official documentation for rules for other keyboards.

# Customize the Keymap
Optionally edit the Keymap file [`wdr45/keymap.c`]("keyboards/moonlander/keymaps/wdr45/keymap.c") to your hearts content.


# Compile the keyboard layout
```bash
qmk compile -kb moonlander -km wdr45
```

For good measure, create a backup of the keymap:
```bash
mv moonlander_wdr45.bin moonlander_wdr45_$(date +%Y%m%d).bin
```

# Flash the keymap to the Moonlander keyboard
Ensure that the keyboard is connected.

Run the flasher tool, Wally :
```bash
.\bin/wally
```
Follow the onscreen instructions:
1. Select the compiled `bin` file.
2. Press the 'reset' button on the keyboard, using a paperclip or other pokey thing.

# Reference Documentation

* [See the official documentation on docs.qmk.fm](https://docs.qmk.fm)
Binary file added WDR45_Layout.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions keyboards/moonlander/keymaps/wdr45/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/*
Set any config.h overrides for your specific keymap here.
See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
*/
#define ORYX_CONFIGURATOR
#define USB_SUSPEND_WAKEUP_DELAY 0
#define RGB_MATRIX_STARTUP_SPD 60

// Use Linux Unicode Input mode (Ctrl+Shift+u simultaneously, then the unicode code sequentially)
#define UNICODE_SELECTED_MODES UC_LNX
185 changes: 185 additions & 0 deletions keyboards/moonlander/keymaps/wdr45/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#include QMK_KEYBOARD_H
#include "version.h"
#include "keymap_german.h"
#include "keymap_nordic.h"
#include "keymap_french.h"
#include "keymap_spanish.h"
#include "keymap_hungarian.h"
#include "keymap_swedish.h"
#include "keymap_br_abnt2.h"
#include "keymap_canadian_multilingual.h"
#include "keymap_german_ch.h"
#include "keymap_jp.h"
#include "keymap_korean.h"
#include "keymap_bepo.h"
#include "keymap_italian.h"
#include "keymap_slovenian.h"
#include "keymap_lithuanian_azerty.h"
#include "keymap_danish.h"
#include "keymap_norwegian.h"
#include "keymap_portuguese.h"
#include "keymap_contributions.h"
#include "keymap_czech.h"
#include "keymap_romanian.h"
#include "keymap_russian.h"
#include "keymap_uk.h"
#include "keymap_estonian.h"
#include "keymap_belgian.h"
#include "keymap_us_international.h"
#include "keymap_croatian.h"
#include "keymap_turkish_q.h"
#include "keymap_slovak.h"

#define KC_MAC_UNDO LGUI(KC_Z)
#define KC_MAC_CUT LGUI(KC_X)
#define KC_MAC_COPY LGUI(KC_C)
#define KC_MAC_PASTE LGUI(KC_V)
#define KC_PC_UNDO LCTL(KC_Z)
#define KC_PC_CUT LCTL(KC_X)
#define KC_PC_COPY LCTL(KC_C)
#define KC_PC_PASTE LCTL(KC_V)
#define ES_LESS_MAC KC_GRAVE
#define ES_GRTR_MAC LSFT(KC_GRAVE)
#define ES_BSLS_MAC ALGR(KC_6)
#define NO_PIPE_ALT KC_GRAVE
#define NO_BSLS_ALT KC_EQUAL
#define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc)
#define BP_NDSH_MAC ALGR(KC_8)
#define SE_SECT_MAC ALGR(KC_6)
#define MOON_LED_LEVEL LED_LEVEL

#define LAYER_BASE 0
#define LAYER_MOD 1
#define LAYER_GAME 2
#define LAYER_DUMMY 3

enum custom_keycodes {
RGB_SLD = ML_SAFE_RANGE,
MACRO_KVM_1,
MACRO_KVM_2,
MACRO_KVM_3,
MACRO_KVM_4,
};

enum unicode_names {
AA_L,
AA_U,
AE_L,
AE_U,
OE_L,
OE_U,
};

const uint32_t PROGMEM unicode_map[] = {
[AA_L] = 0x00E5, // å
[AA_U] = 0x00C5, // Å
[AE_L] = 0x00E4, // ä
[AE_U] = 0x00C5, // Ä
[OE_L] = 0x00F6, // ö
[OE_U] = 0x00D6, // Ö
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_BASE] = LAYOUT_moonlander(KC_ESCAPE, KC_TRANSPARENT, KC_1, KC_2, KC_3, KC_DELETE, KC_DELETE, TG(LAYER_GAME), KC_ESCAPE, KC_8, KC_9, KC_0, KC_TRANSPARENT, KC_APPLICATION, KC_LALT, KC_W, KC_D, KC_R, KC_4, KC_5, KC_TRANSPARENT, KC_TRANSPARENT, KC_6, KC_7, KC_U, KC_M, KC_P, KC_BSPACE, KC_LSHIFT, KC_A, KC_S, KC_H, KC_T, KC_TAB, KC_TRANSPARENT, KC_TRANSPARENT, KC_ENTER, KC_N, KC_E, KC_O, KC_I, KC_QUOTE, KC_LGUI, KC_K, KC_Y, KC_F, KC_C, KC_TRANSPARENT, KC_TRANSPARENT, KC_COMMA, KC_DOT, KC_L, KC_G, KC_RSHIFT, KC_TRANSPARENT, KC_Q, KC_Z, KC_X, KC_V, KC_LALT, KC_RCTRL, KC_LBRACKET, KC_RBRACKET, KC_B, KC_J, KC_TRANSPARENT, MO(LAYER_MOD), KC_LCTRL, KC_SPACE, KC_RGUI, KC_LSHIFT, KC_SPACE),
[LAYER_MOD] = LAYOUT_moonlander(KC_TRANSPARENT, KC_TRANSPARENT, KC_0, KC_9, KC_8, KC_BSPACE, KC_BSPACE, KC_TRANSPARENT, KC_TRANSPARENT, MACRO_KVM_1, MACRO_KVM_2, MACRO_KVM_3, MACRO_KVM_4, KC_TRANSPARENT, KC_TRANSPARENT, XP(AA_L, AA_U), KC_TRANSPARENT, KC_UP, KC_7, KC_6, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_SCOLON, KC_PGUP, KC_MINUS, KC_EQUAL, KC_DELETE, KC_TRANSPARENT, KC_TRANSPARENT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_ENTER, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_HOME, KC_PGDOWN, KC_END, KC_GRAVE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_DOT, KC_COMMA, KC_TRANSPARENT, KC_SCOLON, KC_SLASH, KC_BSLASH, XP(OE_L, OE_U), XP(AE_L, AE_U), KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_PSCREEN, KC_RBRACKET, KC_LBRACKET, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT),
[LAYER_GAME] = LAYOUT_moonlander(KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_TRANSPARENT, KC_LGUI, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_ENTER, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_F5, KC_LSHIFT, KC_A, KC_S, KC_D, KC_F, KC_Y, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F9, KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN3, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_9, KC_8, KC_7, KC_6, KC_5, KC_I, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_SPACE, KC_LALT, KC_M, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT),
[LAYER_DUMMY] = LAYOUT_moonlander(KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT),
};

// extern bool g_suspend_state;
extern rgb_config_t rgb_matrix_config;

void keyboard_post_init_user(void) {
rgb_matrix_enable();
}

const uint8_t PROGMEM ledmap[][DRIVER_LED_TOTAL][3] = {

[0] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {151, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {152, 254, 254}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},

[1] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {1, 254, 254}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},

[2] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {90, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {91, 254, 254}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},

};

void set_layer_color(int layer) {
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
HSV hsv = {
.h = pgm_read_byte(&ledmap[layer][i][0]),
.s = pgm_read_byte(&ledmap[layer][i][1]),
.v = pgm_read_byte(&ledmap[layer][i][2]),
};
if (!hsv.h && !hsv.s && !hsv.v) {
rgb_matrix_set_color(i, 0, 0, 0);
} else {
RGB rgb = hsv_to_rgb(hsv);
float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b);
}
}
}

void rgb_matrix_indicators_user(void) {
// if (g_suspend_state || keyboard_config.disable_layer_led) {
if (keyboard_config.disable_layer_led) {
return;
}
switch (biton32(layer_state)) {
case 0:
set_layer_color(0);
break;
case 1:
set_layer_color(1);
break;
case 2:
set_layer_color(2);
break;
default:
if (rgb_matrix_get_flags() == LED_FLAG_NONE) rgb_matrix_set_color_all(0, 0, 0);
break;
}
}

uint8_t mod_state;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
mod_state = get_mods();

switch (keycode) {
// MACRO_KVM_1
case MACRO_KVM_1:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_SCROLLLOCK) SS_TAP(X_SCROLLLOCK) SS_TAP(X_1));
}
break;

// MACRO_KVM_2
case MACRO_KVM_2:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_SCROLLLOCK) SS_TAP(X_SCROLLLOCK) SS_TAP(X_2));
}
break;

// MACRO_KVM_3
case MACRO_KVM_3:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_SCROLLLOCK) SS_TAP(X_SCROLLLOCK) SS_TAP(X_3));
}
break;

// MACRO_KVM_4
case MACRO_KVM_4:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_SCROLLLOCK) SS_TAP(X_SCROLLLOCK) SS_TAP(X_4));
}
break;

case RGB_SLD:
if (record->event.pressed) {
rgblight_mode(1);
}
return false;
}
return true;
}
Loading
Loading