diff --git a/keyboards/themadnoodle/udon13/config.h b/keyboards/themadnoodle/udon13/config.h new file mode 100644 index 00000000000..fbb498c4081 --- /dev/null +++ b/keyboards/themadnoodle/udon13/config.h @@ -0,0 +1,6 @@ +// Copyright 2023 Jesse Leventhal (@The=Mad-Noodle) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 5 diff --git a/keyboards/themadnoodle/udon13/info.json b/keyboards/themadnoodle/udon13/info.json new file mode 100644 index 00000000000..b0ece11612f --- /dev/null +++ b/keyboards/themadnoodle/udon13/info.json @@ -0,0 +1,75 @@ +{ + "manufacturer": "The Mad Noodle", + "keyboard_name": "Udon13", + "maintainer": "The-Mad-Noodle", + "url": "https://www.madnoodleprototypes.com/", + "bootloader": "atmel-dfu", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "encoder": true, + "mousekey": true, + "nkro": true, + "rgblight": true, + "oled": true + }, + "rgblight": { + "hue_steps": 10, + "led_count": 6, + "sleep": true, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "knight": true, + "christmas": true, + "static_gradient": true, + "rgb_test": true, + "alternating": true, + "twinkle": true + } + }, + "ws2812": { + "pin": "B7" + }, + "matrix_pins": { + "cols": ["F0", "F5", "F4", "F6"], + "rows": ["F7", "F1", "D6", "D7"] + }, + "processor": "atmega32u4", + "usb": { + "device_version": "1.0.0", + "pid": "0x0012", + "vid": "0x6A6C" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Encoder", "x":3, "y":0, "matrix": [0,3]}, + {"x":0, "y":1, "matrix": [1,0]}, + {"x":1, "y":1, "matrix": [1,1]}, + {"x":2, "y":1, "matrix": [1,2]}, + {"x":3, "y":1, "matrix": [1,3]}, + {"x":0, "y":2, "matrix": [2,0]}, + {"x":1, "y":2, "matrix": [2,1]}, + {"x":2, "y":2, "matrix": [2,2]}, + {"x":3, "y":2, "matrix": [2,3]}, + {"x":0, "y":3, "matrix": [3,0]}, + {"x":1, "y":3, "matrix": [3,1]}, + {"x":2, "y":3, "matrix": [3,2]}, + {"x":3, "y":3, "matrix": [3,3]} + ] + } + }, + + "encoder": { + "rotary": [ + { "pin_a": "B6", "pin_b": "B5" } + ] + + } +} \ No newline at end of file diff --git a/keyboards/themadnoodle/udon13/keymaps/default/keymap.c b/keyboards/themadnoodle/udon13/keymaps/default/keymap.c new file mode 100644 index 00000000000..d9e4ddc51ef --- /dev/null +++ b/keyboards/themadnoodle/udon13/keymaps/default/keymap.c @@ -0,0 +1,52 @@ +// Copyright 2023 The Mad Noodle(@the_mad_noodle) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/*Layer 0*/ + [0] = LAYOUT( + KC_MUTE, + KC_MPLY, KC_MPRV, KC_MNXT, KC_MSEL, + KC_UNDO, KC_CALC, KC_MAIL, KC_MYCM, + KC_COPY, KC_CUT, KC_PSTE, TO(3) + ), + +/*Layer 1*/ + [1] = LAYOUT( + RGB_TOG, + RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, + RGB_MOD, RGB_RMOD, RGB_M_P, RGB_M_B, + RGB_M_SW, RGB_SPD, RGB_SPI, TO(0) + ), + +/*Layer 2*/ + [2] = LAYOUT( + KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, TO(0) + ), + +/*Layer 3*/ + [3] = LAYOUT( + KC_NO, + TO(1), TO(2), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, TO(0) + ), + +}; + +/*Encoder Mapping*/ +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [2] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT)}, + [3] = { ENCODER_CCW_CW(KC_DOWN, KC_UP)}, + +}; +#endif diff --git a/keyboards/themadnoodle/udon13/keymaps/default/rules.mk b/keyboards/themadnoodle/udon13/keymaps/default/rules.mk new file mode 100644 index 00000000000..217da48272e --- /dev/null +++ b/keyboards/themadnoodle/udon13/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +ENCODER_MAP_ENABLE = yes +LTO_ENABLE = yes \ No newline at end of file diff --git a/keyboards/themadnoodle/udon13/keymaps/via/keymap.c b/keyboards/themadnoodle/udon13/keymaps/via/keymap.c new file mode 100644 index 00000000000..6f6fcc60590 --- /dev/null +++ b/keyboards/themadnoodle/udon13/keymaps/via/keymap.c @@ -0,0 +1,52 @@ +// Copyright 2023 The Mad Noodle(@the_mad_noodle) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/*Layer 0*/ + [0] = LAYOUT( + KC_MUTE, + KC_MPLY, KC_MPRV, KC_MNXT, KC_MSEL, + KC_UNDO, KC_CALC, KC_MAIL, KC_MYCM, + KC_COPY, KC_CUT, KC_PSTE, TO(3) + ), + +/*Layer 1*/ + [1] = LAYOUT( + RGB_TOG, + RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, + RGB_MOD, RGB_RMOD, RGB_M_P, RGB_M_B, + RGB_M_SW, RGB_SPD, RGB_SPI, TO(0) + ), + +/*Layer 2*/ + [2] = LAYOUT( + KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, TO(0) + ), + +/*Layer 3*/ + [3] = LAYOUT( + KC_NO, + TO(1), TO(2), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, TO(0) + ), + +}; + +/*Encoder Mapping*/ +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)}, + [2] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT)}, + [3] = { ENCODER_CCW_CW(KC_DOWN, KC_UP)}, + +}; +#endif diff --git a/keyboards/themadnoodle/udon13/keymaps/via/rules.mk b/keyboards/themadnoodle/udon13/keymaps/via/rules.mk new file mode 100644 index 00000000000..e81bb711d50 --- /dev/null +++ b/keyboards/themadnoodle/udon13/keymaps/via/rules.mk @@ -0,0 +1,3 @@ +ENCODER_MAP_ENABLE = yes +LTO_ENABLE = yes +VIA_ENABLE = yes \ No newline at end of file diff --git a/keyboards/themadnoodle/udon13/readme.md b/keyboards/themadnoodle/udon13/readme.md new file mode 100644 index 00000000000..a55dc2c7cb3 --- /dev/null +++ b/keyboards/themadnoodle/udon13/readme.md @@ -0,0 +1,27 @@ +# Udon:13 + +![Udon13](https://i.imgur.com/DppYeTCh.jpg) + +*The Udon:13 is a 12 hotswap key macro keypad with a push button encoder knob and 128x32 OLED display* + +* Keyboard Maintainer: [The Mad Noodle](https://github.com/The-Mad-Noodle) +* Hardware Supported: Udon:13 PCB +* Hardware Availability: https://www.madnoodleprototypes.com/shop + + +Compile example for this keyboard (after setting up your build environment): + + qmk compile -kb themadnoodle/udon13 -km default + +Flashing example for this keyboard: + + qmk flash -kb themadnoodle/udon13 -km default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader & Flashing + + +**Physical reset button**: + +* Press the physical button located on the top left of the back of the PCB (Labeled RST) to enter Bootloader Mode diff --git a/keyboards/themadnoodle/udon13/rules.mk b/keyboards/themadnoodle/udon13/rules.mk new file mode 100644 index 00000000000..6e7633bfe01 --- /dev/null +++ b/keyboards/themadnoodle/udon13/rules.mk @@ -0,0 +1 @@ +# This file intentionally left blank diff --git a/keyboards/themadnoodle/udon13/udon13.c b/keyboards/themadnoodle/udon13/udon13.c new file mode 100644 index 00000000000..bda0ae7e7bc --- /dev/null +++ b/keyboards/themadnoodle/udon13/udon13.c @@ -0,0 +1,76 @@ +// Copyright 2023 The Mad Noodle(@the_mad_noodle) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE + +/* OLED Settings */ +//------------------------------------------------------------------------------------------------ + +static void render_logo(void) { // Render Mad Noodle logo + static const char PROGMEM logo_1[] = {0x00, 0x00, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x04, 0x06, 0x82, 0xc3, 0x43, 0x61, 0xa1, 0xa1, 0xa1, 0xa1, 0x61, 0x43, 0xc3, 0x82, 0x06, 0x04, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00}; + static const char PROGMEM logo_2[] = {0xf8, 0x1e, 0xc3, 0xf8, 0x5c, 0x76, 0x7b, 0x6d, 0x75, 0x55, 0x55, 0x75, 0x6d, 0x7b, 0x76, 0x5e, 0x7e, 0x77, 0x5b, 0x6d, 0x75, 0x55, 0x55, 0x75, 0x4d, 0x7b, 0x66, 0x5c, 0xf0, 0xc3, 0x3e, 0xf0}; + static const char PROGMEM logo_3[] = {0x1f, 0x78, 0xc1, 0x0f, 0x38, 0xe0, 0xc0, 0x00, 0x00, 0x02, 0x0e, 0x0e, 0x8e, 0xc6, 0xc0, 0x40, 0x40, 0xc0, 0xc6, 0x8e, 0x0e, 0x0e, 0x02, 0x00, 0x80, 0xc0, 0x60, 0x38, 0x0f, 0xc0, 0x7c, 0x0f}; + static const char PROGMEM logo_4[] = {0x00, 0x00, 0x01, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x23, 0x66, 0x44, 0x44, 0xc4, 0xc4, 0x84, 0x84, 0x84, 0x84, 0xc4, 0xc4, 0x44, 0x46, 0x66, 0x23, 0x11, 0x18, 0x0c, 0x06, 0x03, 0x00, 0x00, 0x00}; + oled_set_cursor(0, 0); + oled_write_raw_P(logo_1, sizeof(logo_1)); + oled_set_cursor(0, 1); + oled_write_raw_P(logo_2, sizeof(logo_2)); + oled_set_cursor(0, 2); + oled_write_raw_P(logo_3, sizeof(logo_3)); + oled_set_cursor(0, 3); + oled_write_raw_P(logo_4, sizeof(logo_4)); +} +//----------- + +bool oled_task_kb(void) { + if (!oled_task_user()) { return false; } + render_logo(); + oled_set_cursor(7, 0); + oled_write_P(PSTR("The Mad Noodle"), false); + + oled_set_cursor(7, 1); + oled_write_P(PSTR("Layer: "), false); + + /* + To change LAYER NAMES displayed on the OLED ensure they are a total of 6 characters, including spaces. + Example: + --------------------------------------------------- + case 0: + oled_write_P(PSTR("Base "), false); + break; + --------------------------------------------------- + "B A S E *SPACE* *SPACE*" = 6 characters + This would change layer 0 to Base on the OLED + */ + + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_P(PSTR("Zero "), false); + break; + case 1: + oled_write_P(PSTR("One "), false); + break; + case 2: + oled_write_P(PSTR("Two "), false); + break; + case 3: + oled_write_P(PSTR("Three "), false); + break; + + default: + oled_write_P(PSTR("N/A "), false); + } + oled_set_cursor(7, 2); + oled_write_P(PSTR("Status: "), false); + oled_set_cursor(7, 3); + led_t led_state = host_keyboard_led_state(); + oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); + oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); + oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); + + return false; +} + +#endif \ No newline at end of file