summaryrefslogtreecommitdiff
path: root/keyboards/40percentclub
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/40percentclub')
-rw-r--r--keyboards/40percentclub/mf68/keymaps/andyjack/keymap.c144
-rw-r--r--keyboards/40percentclub/mf68/keymaps/andyjack/readme.md22
-rw-r--r--keyboards/40percentclub/mf68/keymaps/andyjack/rules.mk2
-rw-r--r--keyboards/40percentclub/mf68/keymaps/delivrance/config.h42
-rw-r--r--keyboards/40percentclub/mf68/keymaps/delivrance/keymap.c232
-rw-r--r--keyboards/40percentclub/mf68/keymaps/delivrance/readme.md38
-rw-r--r--keyboards/40percentclub/mf68/keymaps/delivrance/rules.mk10
-rw-r--r--keyboards/40percentclub/nein/config.h4
-rw-r--r--keyboards/40percentclub/nein/info.json2
-rw-r--r--keyboards/40percentclub/nein/keymaps/via/keymap.c39
-rw-r--r--keyboards/40percentclub/nein/keymaps/via/rules.mk2
11 files changed, 534 insertions, 3 deletions
diff --git a/keyboards/40percentclub/mf68/keymaps/andyjack/keymap.c b/keyboards/40percentclub/mf68/keymaps/andyjack/keymap.c
new file mode 100644
index 0000000000..0dc41dd82e
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/andyjack/keymap.c
@@ -0,0 +1,144 @@
+/*
+Copyright 2020 Andy Jack
+
+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/>.
+*/
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _QWERTY,
+ _L1,
+ _L2
+};
+
+#define CTL_ESC LCTL_T(KC_ESC)
+
+/* these key combos are mapped to shell commands in my .keylaunchrc */
+#define MUT_IN LALT(KC_F10)
+#define MUT_OUT LALT(KC_F11)
+#define MUT_MIC LALT(KC_F12)
+#define SCN_LCK LCTL(KC_SLCK)
+
+extern keymap_config_t keymap_config;
+
+enum custom_keycodes {
+ AJ_FN = SAFE_RANGE,
+ AJ_RCTL,
+ AJ_MSWP,
+ AJ_MLCK,
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_68_ansi(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
+ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, AJ_FN, AJ_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_L1] = LAYOUT_68_ansi(
+ KC_ESC, 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_BSPC, KC_VOLU, KC_HOME,
+ _______, _______, KC_HOME, KC_UP, KC_END, _______, _______, MUT_IN , MUT_OUT, MUT_MIC, _______, _______, BL_STEP, _______, KC_VOLD, KC_END,
+ _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, SCN_LCK, _______, _______, _______,
+ _______, _______, _______, _______, KC_BTN3, _______, _______, KC_MUTE, _______, _______, _______, _______, KC_MUTE,
+ _______, AJ_MLCK, AJ_MSWP, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT
+ ),
+ [_L2] = LAYOUT_68_ansi(
+ KC_GRV, 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_BSPC, KC_VOLU, KC_HOME,
+ _______, _______, _______, KC_UP, _______, _______, _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, KC_VOLD, KC_END,
+ _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, _______, _______, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT
+ )
+};
+// clang-format on
+
+static bool aj_fn_down = false;
+static bool aj_rctl_down = false;
+static uint8_t keycode_for_aj_rctl;
+
+/* My version of:
+ https://www.reddit.com/r/olkb/comments/8eticz/how_to_activate_a_layer_with_a_combination/dxygw0f/
+* AJ_FN by itself turns on layer 1
+* AJ_RCTL by itself acts as a control key
+* pressing FN and RCTL together, in any order, turns on layer 2
+*/
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case AJ_FN:
+ if (record->event.pressed) {
+ if (aj_rctl_down) {
+ layer_on(_L2);
+ } else {
+ layer_on(_L1);
+ }
+ aj_fn_down = true;
+ } else {
+ layer_off(_L1);
+ layer_off(_L2);
+ aj_fn_down = false;
+ }
+ return false;
+ break;
+ case AJ_RCTL:
+ if (record->event.pressed) {
+ if (aj_fn_down) {
+ layer_on(_L2);
+ } else {
+ register_code(keycode_for_aj_rctl);
+ }
+ aj_rctl_down = true;
+ } else {
+ layer_off(_L2);
+ unregister_code(keycode_for_aj_rctl);
+ aj_rctl_down = false;
+ }
+ return false;
+ break;
+ case AJ_MSWP:
+ case AJ_MLCK:
+ if (record->event.pressed) {
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ keymap_config.raw = eeconfig_read_keymap();
+ switch (keycode) {
+ case AJ_MSWP:
+ keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
+ keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui;
+ keycode_for_aj_rctl = keymap_config.swap_lalt_lgui ? KC_RALT : KC_RCTL;
+ break;
+ case AJ_MLCK:
+ keymap_config.no_gui = !keymap_config.no_gui;
+ break;
+ }
+ eeconfig_update_keymap(keymap_config.raw);
+ clear_keyboard(); // clear to prevent stuck keys
+ }
+ return false;
+ break;
+ }
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ keymap_config.raw = eeconfig_read_keymap();
+ keycode_for_aj_rctl = keymap_config.swap_lalt_lgui ? KC_RALT : KC_RCTL;
+ eeconfig_update_keymap(keymap_config.raw);
+ clear_keyboard(); // clear to prevent stuck keys
+}
diff --git a/keyboards/40percentclub/mf68/keymaps/andyjack/readme.md b/keyboards/40percentclub/mf68/keymaps/andyjack/readme.md
new file mode 100644
index 0000000000..17a9d9e90f
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/andyjack/readme.md
@@ -0,0 +1,22 @@
+## Customizations from the `default` keymap
+
+* caps lock is left ctrl / press & release for escape
+* keyboard LED brightness control - Fn + ] (same as default)
+* bootmagic:
+ * ability to swap keys - for moving between mac and win/linux
+ * for win/linux - keys are as labeled in layer 0; AJ_RCTL is right ctl
+ * for mac:
+ * LALT and LGUI swapped
+ * RALT key sends RGUI code
+ * AJ_RCTL key sends RALT code
+ * layer 2 access via Fn + AJ_RCTL pressed in any order
+ * regardless of swapped state
+ * ability to disable left gui
+* Fn + v sends a middle mouse click - nice for pasting the mouse selection in
+ linux - I always mess up and scroll while clicking
+ * note: the mouse cursor has to be placed at the insert point
+* mapping some Fn + key combinations to program launch shortcuts
+
+<!--
+ vim:tw=78
+-->
diff --git a/keyboards/40percentclub/mf68/keymaps/andyjack/rules.mk b/keyboards/40percentclub/mf68/keymaps/andyjack/rules.mk
new file mode 100644
index 0000000000..617f5f6fc9
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/andyjack/rules.mk
@@ -0,0 +1,2 @@
+MOUSEKEY_ENABLE = yes
+BOOTMAGIC_ENABLE = full
diff --git a/keyboards/40percentclub/mf68/keymaps/delivrance/config.h b/keyboards/40percentclub/mf68/keymaps/delivrance/config.h
new file mode 100644
index 0000000000..7ae8805765
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/delivrance/config.h
@@ -0,0 +1,42 @@
+/*
+ * Dan's Magicforce 68 (MF68) QMK Keyboard
+ * Copyright (C) Dan <https://github.com/delivrance>
+ *
+ * This file is part of Dan's MF68 QMK Keyboard.
+ *
+ * Dan's MF68 QMK Keyboard 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Dan's MF68 QMK Keyboard 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 Dan's MF68 QMK Keyboard. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#undef MANUFACTURER
+#define MANUFACTURER Dan
+
+#undef PRODUCT
+#define PRODUCT Magicforce 68 QMK
+
+#undef BACKLIGHT_LEVELS
+#define BACKLIGHT_LEVELS 20
+
+// Disable backlight breathing
+#undef BACKLIGHT_BREATHING
+
+// Set USB polling rate to 1000 Hz
+#define USB_POLLING_INTERVAL_MS 1
+
+// Enable NKRO on boot
+#define FORCE_NKRO
+
+// Backlight idle timeout in seconds
+#define BACKLIGHT_IDLE_TIMEOUT 1200 \ No newline at end of file
diff --git a/keyboards/40percentclub/mf68/keymaps/delivrance/keymap.c b/keyboards/40percentclub/mf68/keymaps/delivrance/keymap.c
new file mode 100644
index 0000000000..6f9179926c
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/delivrance/keymap.c
@@ -0,0 +1,232 @@
+/*
+ * Dan's Magicforce 68 (MF68) QMK Keyboard
+ * Copyright (C) Dan <https://github.com/delivrance>
+ *
+ * This file is part of Dan's MF68 QMK Keyboard.
+ *
+ * Dan's MF68 QMK Keyboard 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Dan's MF68 QMK Keyboard 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 Dan's MF68 QMK Keyboard. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+#define KC_ KC_TRNS
+
+#define KC_FN1 MO(_FN)
+#define KC_FN2 LT(_FN, KC_CAPS)
+
+#define KC_BLUP BL_INC // Backlight increase
+#define KC_BLDN BL_DEC // Backlight decrease
+#define KC_BLTOG BL_TOGG // Backlight toggle
+#define KC_TERM TERM_ON // Terminal mode on
+#define KC_REC1 DM_REC1 // Record macro 1
+#define KC_PLY1 DM_PLY1 // Play macro 1
+#define KC_REC2 DM_REC2 // Record macro 2
+#define KC_PLY2 DM_PLY2 // Play macro 1
+#define KC_RSTP DM_RSTP // Stop macro recording
+
+enum {
+ _QWERTY,
+ _FN
+};
+
+/* ┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━━━━━┓ ┏━━━━┳━━━━┓
+ ┃Esc ┃ 1! ┃ 2@ ┃ 3# ┃ 4$ ┃ 5% ┃ 6^ ┃ 7& ┃ 8* ┃ 9( ┃ 0) ┃ -_ ┃ =+ ┃ ←─ ┃ ┃Ins ┃PgUp┃
+ ┣━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━━━━━┫ ┣━━━━╋━━━━┫
+ ┃ Tab ┃ Q ┃ W ┃ E ┃ R ┃ T ┃ Y ┃ U ┃ I ┃ O ┃ P ┃ [{ ┃ ]} ┃ \| ┃ ┃Del ┃PgDn┃
+ ┣━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━┫ ┗━━━━┻━━━━┛
+ ┃ Caps ┃ A ┃ S ┃ D ┃ F ┃ G ┃ H ┃ J ┃ K ┃ L ┃ ;: ┃ '" ┃ Enter ┃ Magicforce
+ ┣━━━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━━━━┫ ┏━━━━┓
+ ┃ Shift ┃ Z ┃ X ┃ C ┃ V ┃ B ┃ N ┃ M ┃ ,< ┃ .> ┃ /? ┃ Shift ┃ ┃ ↑ ┃ Dan
+ ┣━━━━━┳━━━━┻┳━━━┻━┳━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━┳┻━━━━╋━━━━┻┳━━━━━┳━━┳━━┻━╋━━━━╋━━━━┓
+ ┃Ctrl ┃ GUI ┃ Alt ┃ ━━━━━ ┃ Alt ┃ Fn ┃Ctrl ┃ ┃ ← ┃ ↓ ┃ → ┃
+ ┗━━━━━┻━━━━━┻━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━┻━━━━━┻━━━━━┛ ┗━━━━┻━━━━┻━━━━┛ */
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QWERTY] = LAYOUT_kc( /* Default layer
+ ┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━━━━━┓ ┏━━━━┳━━━━┓ */
+ GESC, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , BSPC , INS ,PGUP, /*
+ ┣━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━━━━━┫ ┣━━━━╋━━━━┫ */
+ TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, /*
+ ┣━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━┫ ┗━━━━┻━━━━┛ */
+ FN2 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , /*
+ ┣━━━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━━━━┫ ┏━━━━┓ */
+ LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , /*
+ ┣━━━━━┳━━━━┻┳━━━┻━┳━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━┳┻━━━━╋━━━━┻┳━━━━━┳━━┳━━┻━╋━━━━╋━━━━┓ */
+ LCTL ,LGUI ,LALT , SPACE ,RALT , FN1 ,RCTL , LEFT,DOWN,RGHT /*
+ ┗━━━━━┻━━━━━┻━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━┻━━━━━┻━━━━━┛ ┗━━━━┻━━━━┻━━━━┛ */),
+
+[_FN] = LAYOUT_kc( /* FN & CAPS layer
+ ┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━━━━━┓ ┏━━━━┳━━━━┓ */
+ GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 , F10, F11, F12, RSTP , PSCR,HOME, /*
+ ┣Esc ┻ 1! ┻ 2@ ┻ 3# ┻ 4$ ┻ 5% ┻ 6^ ┻ 7& ┻ 8* ┻ 9( ┻ 0) ┻ -_ ┻ =+ ┻━┳━ ←─ ━┫ ┣Ins ╋PgUp┫ */
+ ,PLY1,PLY2, , , , , , 7 , 8 , 9 ,BLDN,BLUP,BLTOG , ,END , /*
+ ┣ Tab ━┻ Q ━┻ W ━┻ E ━┻ R ━┻ T ━┻ Y ━┻ U ━┻ I ━┻ O ━┻ P ━┻ [{ ┻ ]} ┻━ \| ━┫ ┗Del ┻PgDn┛ */
+ , , , , , , , , 4 , 5 , 6 , , TERM , /*
+ ┣━ Caps ━┻ A ━┻ S ━┻ D ━┻ F ━┻ G ━┻ H ━┻ J ━┻ K ━┻ L ━┻ ;: ┻ '" ┻━ Enter ━┫ ┏━━━━┓ */
+ ,REC1,REC2, , ,MSTP, ,MUTE, 1 , 2 , 3 , , VOLU, /*
+ ┣━━ Shift ━┻ Z ━┻ X ━┻ C ━┻ V ━┻ B ━┻ N ━┻ M ━┻ ,< ┻ .> ╋ /? ┻┳━━ Shift ━━┻━╋ ↑ ━╋━━━━┓ */
+ , , , MPLY , 0 , , , MPRV,VOLD,MNXT /*
+ ┗Ctrl ┻ GUI ┻ Alt ┻━━━━━━━━━━━━ Space ━━━━━━━━━━━━┻ Alt ┻ Fn ━┻Ctrl ┛ ┗ ← ━┻ ↓ ━┻ → ━┛ */)
+};
+// clang-format on
+
+// Initialization code
+// -------------------
+
+void keyboard_post_init_user(void) {
+ backlight_level(2);
+}
+
+// Custom backlight driver
+// -----------------------
+
+// http://jared.geek.nz/2013/feb/linear-led-pwm
+float cie1931(float x) {
+ x *= 100.0 / BACKLIGHT_LEVELS;
+ float y;
+
+ if (x < 8) {
+ y = x / 902.3;
+ } else {
+ y = (x + 16.0) / 116.0;
+ y = y * y * y;
+ }
+
+ return round(y * 255);
+}
+
+void backlight_init_ports(void) {
+ setPinOutput(BACKLIGHT_PIN);
+ writePinLow(BACKLIGHT_PIN);
+
+ TCCR1A = _BV(COM1A1) | _BV(WGM11);
+ TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);
+
+ ICR1 = 0xFFU; // Set PWM levels to 255 (enables high-frequency PWM)
+}
+
+void backlight_set(uint8_t level) {
+ if (level > BACKLIGHT_LEVELS) {
+ level = BACKLIGHT_LEVELS;
+ }
+
+ if (level == 0) {
+ TCCR1A &= ~(_BV(COM1A1)); // Disable PWM
+ } else {
+ TCCR1A |= _BV(COM1A1); // Enable PWM
+ }
+
+ OCR1A = cie1931(level);
+}
+
+// Custom macro hooks
+// ------------------
+
+// Redefine with lower delay
+void led_blink(void) {
+ backlight_toggle();
+ wait_ms(25);
+ backlight_toggle();
+}
+
+void dynamic_macro_record_start_user(void) {
+ led_blink();
+}
+
+void dynamic_macro_play_user(int8_t direction) {
+ led_blink();
+}
+
+void dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record) {
+ led_blink();
+}
+
+void dynamic_macro_record_end_user(int8_t direction) {
+ led_blink();
+}
+
+// Custom Caps Lock backlight behaviour
+// ------------------------------------
+
+void led_set_user(uint8_t usb_led) {
+ // This exists because I don't like the backlight to turn OFF when the Caps Lock is ON.
+ // That is, this will turn the backlight ON (at half the brightness) when the Caps Lock is ON as well.
+ static bool prev_is_caps_on;
+ bool is_caps_on = IS_LED_ON(usb_led, USB_LED_CAPS_LOCK);
+
+ if (prev_is_caps_on != is_caps_on) {
+ prev_is_caps_on = is_caps_on;
+
+ if (is_caps_on) {
+ backlight_set(BACKLIGHT_LEVELS / 2);
+ } else {
+ if (is_backlight_enabled()) {
+ backlight_set(get_backlight_level());
+ } else {
+ backlight_set(0);
+ }
+ }
+ }
+
+ // Turn on the Pro Micro's on-board LEDs for Caps Lock
+ if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
+ // Set to low
+ setPinOutput(B0);
+ writePinLow(B0);
+ setPinOutput(D5);
+ writePinLow(D5);
+ } else {
+ // Set to Hi-Z
+ setPinInput(B0);
+ setPinInput(D5);
+ }
+}
+
+// Backlight idle timeout feature
+// ------------------------------
+
+static uint32_t timer;
+static bool is_idle;
+
+void matrix_scan_user() {
+ // Check the timer only if the keyboard is not idle
+ if (!is_idle) {
+ if (timer_elapsed32(timer) >= (uint32_t) BACKLIGHT_IDLE_TIMEOUT * 1000) {
+ is_idle = true;
+
+ // Both backlight_level and backlight_level_noeeprom modify the global backlight config (not useful)
+ // Instead, use backlight_set in order to restore the current backlight level later on
+ backlight_set(0);
+ }
+ }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ // Reset timer on each keypress
+ timer = timer_read32();
+
+ // Enable backlight back only when keyboard is idling (which implies the backlight was turned off previously)
+ if (is_idle) {
+ is_idle = false;
+
+ // Set back the original backlight level only if it is actually enabled globally
+ if (is_backlight_enabled()) {
+ // The current backlight level can be obtained with get_backlight_level
+ backlight_set(get_backlight_level());
+ }
+ }
+
+ return true;
+}
diff --git a/keyboards/40percentclub/mf68/keymaps/delivrance/readme.md b/keyboards/40percentclub/mf68/keymaps/delivrance/readme.md
new file mode 100644
index 0000000000..158235b5ef
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/delivrance/readme.md
@@ -0,0 +1,38 @@
+# Dan's Magicforce 68 (MF68) QMK Keyboard
+
+> https://github.com/delivrance
+
+```
+┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━━━━━┓ ┏━━━━┳━━━━┓
+┃Esc ┃ 1! ┃ 2@ ┃ 3# ┃ 4$ ┃ 5% ┃ 6^ ┃ 7& ┃ 8* ┃ 9( ┃ 0) ┃ -_ ┃ =+ ┃ ←─ ┃ ┃Ins ┃PgUp┃
+┣━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━━━━━┫ ┣━━━━╋━━━━┫
+┃ Tab ┃ Q ┃ W ┃ E ┃ R ┃ T ┃ Y ┃ U ┃ I ┃ O ┃ P ┃ [{ ┃ ]} ┃ \| ┃ ┃Del ┃PgDn┃
+┣━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━┫ ┗━━━━┻━━━━┛
+┃ Caps ┃ A ┃ S ┃ D ┃ F ┃ G ┃ H ┃ J ┃ K ┃ L ┃ ;: ┃ '" ┃ Enter ┃ Magicforce
+┣━━━━━━━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━┳━━┻━━━━━━━━━┫ ┏━━━━┓
+┃ Shift ┃ Z ┃ X ┃ C ┃ V ┃ B ┃ N ┃ M ┃ ,< ┃ .> ┃ /? ┃ Shift ┃ ┃ ↑ ┃ Dan
+┣━━━━━┳━━━━┻┳━━━┻━┳━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━┳┻━━━━╋━━━━┻┳━━━━━┳━━┳━━┻━╋━━━━╋━━━━┓
+┃Ctrl ┃ GUI ┃ Alt ┃ ━━━━━ ┃ Alt ┃ Fn ┃Ctrl ┃ ┃ ← ┃ ↓ ┃ → ┃
+┗━━━━━┻━━━━━┻━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━┻━━━━━┻━━━━━┛ ┗━━━━┻━━━━┻━━━━┛
+```
+
+## Features
+
+- Right ALT and FN keys swapped.
+- USB Polling rate set to 1000 Hz (1 ms).
+- Dynamic macros enabled (2 macros).
+- Transient EEPROM to avoid wearing (r/w from/to RAM).
+- NKRO enabled on boot (up to 248 keys at once).
+- CAPS LOCK key used as alias to the FN key.
+- Pro Micro's on-board LEDs used for CAPS LOCK status.
+- Backlight also used as CAPS LOCK status indicator.
+- Both Grave and Tilde characters embedded in ESC.
+- Media control keys and extra number keys (numpad).
+- Flicker-free backlight thanks to high-frequency PWM mode.
+- Linear backlight brightness intensity (better for human eyes).
+- Backlight turns off automatically after 20 minutes idle.
+- Backlight brightness levels set to 20 (5% steps) + 1 (off).
+- Backlight breathing completely disabled.
+- Link Time Optimizations to reduce compiled size.
+- QMK Terminal enabled for fun (pretty useless in practice).
+- Performing ~1550 matrix scans per second.
diff --git a/keyboards/40percentclub/mf68/keymaps/delivrance/rules.mk b/keyboards/40percentclub/mf68/keymaps/delivrance/rules.mk
new file mode 100644
index 0000000000..5ac2ce5ccb
--- /dev/null
+++ b/keyboards/40percentclub/mf68/keymaps/delivrance/rules.mk
@@ -0,0 +1,10 @@
+BACKLIGHT_DRIVER = custom
+NKRO_ENABLE = yes
+TERMINAL_ENABLE = yes
+DYNAMIC_MACRO_ENABLE = yes
+
+# Use RAM (fake EEPROM, transient) instead of real EEPROM
+EEPROM_DRIVER = transient
+
+# LTO: Link Time Optimizations. Reduce compiled size
+LTO_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/40percentclub/nein/config.h b/keyboards/40percentclub/nein/config.h
index e053b487fd..b96f5fbe5d 100644
--- a/keyboards/40percentclub/nein/config.h
+++ b/keyboards/40percentclub/nein/config.h
@@ -19,8 +19,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0A0C
+#define VENDOR_ID 0x3430 // "40"
+#define PRODUCT_ID 0x9999
#define DEVICE_VER 0x9999
#define MANUFACTURER di0ib
#define PRODUCT The nein Keyboard
diff --git a/keyboards/40percentclub/nein/info.json b/keyboards/40percentclub/nein/info.json
index aaadc71861..2a28ffc008 100644
--- a/keyboards/40percentclub/nein/info.json
+++ b/keyboards/40percentclub/nein/info.json
@@ -1,6 +1,6 @@
{
"keyboard_name": "nein",
- "url": "",
+ "url": "http://www.40percent.club/2019/04/nein.html",
"maintainer": "qmk",
"width": 3,
"height": 3,
diff --git a/keyboards/40percentclub/nein/keymaps/via/keymap.c b/keyboards/40percentclub/nein/keymaps/via/keymap.c
new file mode 100644
index 0000000000..528de8246d
--- /dev/null
+++ b/keyboards/40percentclub/nein/keymaps/via/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2019
+ *
+ * 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/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_3x3(
+ KC_MUTE, KC_HOME, KC_MPLY,
+ MO(1), KC_UP, KC_END,
+ KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_ortho_3x3(
+ RESET, _______, KC_STOP,
+ _______, _______, RGB_MOD,
+ KC_MPRV, _______, KC_MNXT
+ ),
+ [2] = LAYOUT_ortho_3x3(
+ _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+ ),
+ [3] = LAYOUT_ortho_3x3(
+ _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+ ),
+};
diff --git a/keyboards/40percentclub/nein/keymaps/via/rules.mk b/keyboards/40percentclub/nein/keymaps/via/rules.mk
new file mode 100644
index 0000000000..36b7ba9cbc
--- /dev/null
+++ b/keyboards/40percentclub/nein/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes