From 9f23d9048e080eb736ae05f12e459ade77fc85c7 Mon Sep 17 00:00:00 2001 From: Sadek Baroudi Date: Tue, 30 Nov 2021 16:53:25 -0800 Subject: [PATCH] initial commit of ffkb support for KMK using the KB2040 from adafruit --- boards/ffkb/README.md | 10 ++++ boards/ffkb/kb.py | 37 ++++++++++++ boards/ffkb/main.py | 134 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 boards/ffkb/README.md create mode 100644 boards/ffkb/kb.py create mode 100644 boards/ffkb/main.py diff --git a/boards/ffkb/README.md b/boards/ffkb/README.md new file mode 100644 index 0000000..ec1bac9 --- /dev/null +++ b/boards/ffkb/README.md @@ -0,0 +1,10 @@ +# Faux Fox Keyboard (ffkb) + +![ffkb](https://github.com/sadekbaroudi/ffkb) + +A 36 or 42 key keyboard with support for per key leds, 2 rotary encoders (EC11 or evqwgd001), and a feature in the center (EC11, OLED (128x64), or pimoroni trackball) + +kb.py is designed to work with a pro micro or kb2040 + +- [Layers](https://github.com/KMKfw/kmk_firmware/tree/master/docs/layers.md) Need more keys than switches? Use layers. +- [RGB](https://github.com/KMKfw/kmk_firmware/tree/master/docs/rgb.md) Light it up diff --git a/boards/ffkb/kb.py b/boards/ffkb/kb.py new file mode 100644 index 0000000..6f8581f --- /dev/null +++ b/boards/ffkb/kb.py @@ -0,0 +1,37 @@ +import board + +from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard +from kmk.matrix import DiodeOrientation +from kmk.matrix import intify_coordinate as ic + + +class KMKKeyboard(_KMKKeyboard): + col_pins = ( + board.D9, + board.D8, + board.D7, + board.D6, + board.D5, + board.D4, + board.MOSI, + board.MISO, + ) + row_pins = ( + board.D1, + board.A3, + board.A2, + board.A1, + board.A0, + board.SCK, + ) + diode_orientation = DiodeOrientation.COLUMNS + rgb_pixel_pin = board.D0 + rgb_num_pixels = 42 + i2c = board.I2C + + coord_mapping = [ + (0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (4,3), (3,4), (4,5), (3,7), + (1,0), (1,1), (1,2), (1,3), (1,4), (1,5), (4,1), (1,6), (1,7), (3,2), (4,4), (3,5), (4,7), + (2,0), (2,1), (2,2), (2,3), (2,4), (2,5), (2,6), (2,7), (4,2), (3,3), (3,6), (4,6), + (5,1), (5,3), (5,4), (5,5), (5,6), (5,7), (5,2), (5,0) + ] diff --git a/boards/ffkb/main.py b/boards/ffkb/main.py new file mode 100644 index 0000000..96cd330 --- /dev/null +++ b/boards/ffkb/main.py @@ -0,0 +1,134 @@ +from kb import KMKKeyboard +from kmk.extensions.RGB import RGB +from kmk.keys import KC +from kmk.modules.layers import Layers +from kmk.modules.modtap import ModTap +from kmk.modules.encoder import EncoderHandler +from kmk.extensions.media_keys import MediaKeys + +keyboard = KMKKeyboard() +keyboard.tap_time = 175 +keyboard.debug_enabled = False + +# Cleaner key names +_______ = KC.TRNS +XXXXXXX = KC.NO + +# Adding extensions +rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=keyboard.rgb_num_pixels, val_limit=50, hue_default=190, sat_default=100, val_default=5) + +modtap = ModTap() +layers = Layers() +media_keys = MediaKeys() + +encoder_handler = EncoderHandler() +encoder_handler.pins = ((board.D3, board.D2, board.D10, False)) + +keyboard.modules = [layers, modtap, encoder_handler] +keyboard.extensions = [rgb, media_keys] + +ZOOM_IN = KC.LCTRL(KC.EQUAL) +ZOOM_OUT = KC.LCTRL(KC.MINUS) + +LYR_BASE, LYR_NAV, LYR_SYM, LYR_SNAV, LYR_MEDIA, LYR_MOUSE = 0, 1, 2, 3, 4, 5 + +NAV_ENT = KC.LT(LYR_NAV, KC.ENT) +SYM_SPC = KC.LT(LYR_SYM, KC.SPC) +SNAV_TAB = KC.LT(LYR_SNAV, KC.TAB) +MEDIA_BSPC = KC.LT(LYR_MEDIA, KC.BSPC) +MOUSE_M = KC.LT(LYR_MOUSE, KC.M) + +# HOMEROW MODS +LCTL_A = KC.MT(KC.A, KC.LCTRL) +LGUI_R = KC.MT(KC.R, KC.LGUI) +LALT_S = KC.MT(KC.S, KC.LALT) +LSFT_T = KC.MT(KC.T, KC.LSFT) +RCTL_N = KC.MT(KC.N, KC.RCTRL) +RGUI_E = KC.MT(KC.E, KC.RGUI) +RALT_I = KC.MT(KC.I, KC.RALT) +RSFT_O = KC.MT(KC.O, KC.RSFT) + +# OTHER SHORTCUTS +BRWSR_LFT = KC.LCTRL(KC.LSFT(KC.TAB)) +BRWSR_RGHT = KC.LCTRL(KC.TAB) +DESK_LEFT = KC.LCTRL(KC.LGUI(KC.LEFT)) +DESK_RIGHT = KC.LCTRL(KC.LGUI(KC.RIGHT)) +CAPSWORD = _______ # TODO: IMPLEMENT THIS + +#SHIFT NAV +SFT_PGUP = KC.LSFT(KC.PGUP) +SFT_PGDN = KC.LSFT(KC.PGDN) +SFT_HOME = KC.LSFT(KC.HOME) +SFT_END = KC.LSFT(KC.END) +SFT_UP = KC.LSFT(KC.UP) +SFT_DOWN = KC.LSFT(KC.DOWN) +SFT_LEFT = KC.LSFT(KC.LEFT) +SFT_RGHT = KC.LSFT(KC.RIGHT) + +RGB_TOG = KC.RGB_TOG +RGB_HUI = KC.RGB_HUI +RGB_HUD = KC.RGB_HUI +RGB_SAI = KC.RGB_SAI +RGB_SAD = KC.RGB_SAD +RGB_VAI = KC.RGB_VAI +RGB_VAD = KC.RGB_VAD +RGB_ANI = KC.RGB_ANI +RGB_AND = KC.RGB_AND +RGB_M_P = KC.RGB_MODE_PLAIN +RGB_M_B = KC.RGB_MODE_BREATHE +RGB_M_R = KC.RGB_MODE_RAINBOW +RGB_M_BR = KC.RGB_MODE_BREATHE_RAINBOW +RGB_M_K = KC.RGB_MODE_KNIGHT +RGB_M_S = KC.RGB_MODE_SWIRL + +keyboard.keymap = [ + [ #COLEMAK-DH + KC.ESC, KC.Q, KC.W, KC.F, KC.P, KC.B, KC.J, KC.L, KC.U, KC.Y, KC.SCLN, KC.BSPC, + KC.CAPS, LCTL_A, LGUI_R, LALT_S, LSFT_T, KC.G, KC.MUTE, MOUSE_M, RSFT_O, RALT_I, RGUI_E, RCTL_N, KC.QUOT, + KC.SPC, KC.Z, KC.X, KC.C, KC.D, KC.V, KC.K, KC.H, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT, + KC.MUTE, KC.DEL, NAV_ENT, SNAV_TAB, MEDIA_BSPC, SYM_SPC, KC.QUOT, KC.LCTRL(KC.BSPC) + ], + [ #NAVIGATION + _______, KC.ESC, KC.PGUP, KC.UP, KC.PGDN, _______, KC.ASTR, KC.N7, KC.N7, KC.N7, KC.PLUS, _______, + _______, KC.HOME, KC.LEFT, KC.DOWN, KC.RIGHT, KC.END, _______, KC.SLSH, KC.N7, KC.N7, KC.N7, KC.MINS, _______, + _______, _______, _______, _______, _______, _______, KC.EQL, KC.N7, KC.N7, KC.N7, KC.N0, _______, + _______, _______, _______, _______, KC.BKSP, KC.SPC, KC.DOT, _______, + ], + [ #SYMBOLS + _______, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.UNDS, KC.EQL, _______, + _______, KC.MINS, KC.LBRC, KC.LCBR, KC.LPRN, KC.LABK, _______, KC.RABK, KC.RPRN, KC.RCBR, KC.RBRC, KC.PLUS, _______, + _______, KC.CAPS, KC.GRV, BRWSR_LFT, DESK_LEFT, CAPSWORD, _______, DESK_RIGHT, BRWSR_RGHT, _______, KC.BSLS, _______, + _______, _______, KC.ENT, KC.TAB, _______, _______, _______, _______, + ], + [ #SHIFT NAVIGATION + _______, _______, SFT_PGUP, SFT_UP, SFT_PGDN, _______, _______, _______, _______, _______, _______, _______, + _______, SFT_HOME, SFT_LEFT, SFT_DOWN, SFT_RGHT, SFT_END, _______, KC.VOLU, KC.MPLY, KC.MSTP, _______, _______, _______, + _______, _______, _______, _______, _______, KC.MUTE, KC.VOLD, KC.MPRV, KC.MNXT, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, + ], + [ #MEDIA + _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_ANI, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_BR, RGB_M_K, _______, + _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_AND, RGB_M_S, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, + ], + [ #MOUSE + _______, KC.RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, + ], +] + + +# +encoder_handler.map = [(( KC.VOLD, KC.VOLU, KC.MUTE)), # Layer 1 + ((ZOOM_OUT, ZOOM_IN, _______)), # Layer 2 + ((_______, _______, _______)), # Layer 3 + ((_______, _______, _______)), # Layer 4 + ((_______, _______, _______)), # Layer 5 + ((_______, _______, _______)), # Layer 6 + ] + +if __name__ == '__main__': + keyboard.go()