~ruther/qmk_firmware

b057194568270ce379d1900b2567052d565ce1dd — rookiebwoy 4 years ago 83be6ba
[Keyboard] Add Neopad macropad (#12614)

A keyboards/neopad/config.h => keyboards/neopad/config.h +34 -0
@@ 0,0 1,34 @@
/*
Copyright 2021 rookiebwoy

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/>.
*/
#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0913
#define MANUFACTURER    rookiebwoy
#define PRODUCT         neopad

/* Column/Row IO definitions */
#define DIODE_DIRECTION COL2ROW

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

/* Reduce tapdance required taps from 5 to 2 */
#define TAPPING_TOGGLE 2

A keyboards/neopad/readme.md => keyboards/neopad/readme.md +25 -0
@@ 0,0 1,25 @@
# Neopad

Neopad is a little macropad with four switches and two rotary encoders, made by through hole components only.
_Actually the number of switches is six, because even the encoder are allowed to click._

![Neopad](https://i.imgur.com/TgOkj2Fh.jpg "Neopad first proto")

The Neopad in the photo above is the first prototype. See the project repository for revision 1 update and KiCad files.

* Keyboard maintainer: [rookiebwoy](https://github.com/rookiebwoy)
* Hardware supported: ProMicro, _Elite-C (not tested)_
* Project repository: [Neopad on github](https://github.com/rookiebwoy/neopad)

Make example for this keyboard (after setting up your build environment):

    make neopad/rev1:default

Flashing example for this keyboard:

    make neopad/rev1:default:flash

When asked by the terminal, press the dedicated `RESET` button (the one above the 2 LEDs) to enter the bootloader and let the OS detects the device.

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 [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).


A keyboards/neopad/rev1/config.h => keyboards/neopad/rev1/config.h +41 -0
@@ 0,0 1,41 @@
/*
Copyright 2021 rookiebwoy

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/>.
*/
#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define DEVICE_VER      0x0010

/* Column/Row IO definitions */
#define MATRIX_ROWS 2
#define MATRIX_COLS 3
#define MATRIX_ROW_PINS { F4, F5 }
#define MATRIX_COL_PINS { B3, B2, B6 }
#define UNUSED_PINS

/* Dual rotary encoders */
#define ENCODERS_PAD_A { D1, D4 }
#define ENCODERS_PAD_B { D0, C6 }

/* Onboard LEDs */
#define LED_00 F6
#define LED_01 F7

/* Bootmagic - hold down rotary encoder pushbutton while plugging in to enter bootloader */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0

A keyboards/neopad/rev1/info.json => keyboards/neopad/rev1/info.json +16 -0
@@ 0,0 1,16 @@
{
    "keyboard_name": "neopad",
    "keyboard_folder": "neopad/rev1",
    "url": "https://github.com/rookiebwoy/neopad)",
    "maintainer": "rookiebwoy",
    "width": 3,
    "height": 2,
    "layouts": {
        "LAYOUT": {
            "layout": [
                                {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0},
                                {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}
            ]
        }
    }
}

A keyboards/neopad/rev1/keymaps/default/keymap.c => keyboards/neopad/rev1/keymaps/default/keymap.c +153 -0
@@ 0,0 1,153 @@
/* Copyright 2021 rookiebwoy
 *
 * 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] = {
    /*
            LAYER 0 - MUSIC
    /-----------------------------`
    |  TO(1)  |  stop   |   mute  |	L ENC: prev/next song
    |---------|---------|---------|
    |   prev  |  play   |   next  |	R ENC: vol up/down
    \-----------------------------'
    */
    [0] = LAYOUT(
                TO(1),     KC_MSTP,  KC_MUTE,
    		    KC_MPRV,   KC_MPLY,  KC_MNXT
    ),

    /*
            LAYER 1 - MOVEMENT IN WINDOWS
    /---------------------------------------`
    |    TO(2)    | maximize | show desktop | L ENC: change desktop
    |-------------|----------|--------------|
    | move window | minimize | move window  | R ENC: change browser tab + change explorer window
    \---------------------------------------'
    */
    [1] = LAYOUT(
				TO(2),     		LGUI(KC_UP),    LGUI(KC_D),
				LGUI(KC_LEFT),	LGUI(KC_DOWN),  LGUI(KC_RIGHT)
    ),

    /*
            LAYER 2 - SHORTCUT
    /------------------------------`
    |  TO(3)  |   esc   | task man | L ENC: redo/undo
    |---------|---------|----------|
    |   cut   |   copy  |   paste  | R ENC: mouse wheel up/down
    \------------------------------'
    */
    [2] = LAYOUT(
                TO(3),     		KC_ESC,    		LCTL(LSFT(KC_ESC)),
    		    LCTL(KC_X),		LCTL(KC_C),     LCTL(KC_V)
    ),

    /*
            LAYER 3 - AUDACITY
    /-----------------------------`
    |  TO(0)  |   REC   |   canc  |	L ENC: pan right/left
    |---------|---------|---------|
    |   ctrl  |   play  |  pause  |	R ENC: mouse wheel up/down
    \-----------------------------'
    */
    [3] = LAYOUT(
                TO(0),     	LSFT(KC_R),    	KC_DEL,
    		    KC_LCTL,	KC_SPC,         KC_P
    ),

};


void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) {											/* LEFT ENCODER */
        switch (get_highest_layer(layer_state)) {
            case 0:
                // layer 0 - next song (CW) and previous (CCW)
                if (clockwise) {
                    tap_code(KC_MNXT);
                } else {
                    tap_code(KC_MPRV);
                }
                break;

            case 1:
                // layer 1 - change desktop right (CW) and left (CCW)
                if (clockwise) {
                    tap_code16(LCTL(LGUI(KC_RIGHT)));
                } else {
                    tap_code16(LCTL(LGUI(KC_LEFT)));
                }
                break;

            case 2:
                // layer 2 - redo (CW) and undo (CCW)
                if (clockwise) {
                    tap_code16(LCTL(KC_Y));
                } else {
                    tap_code16(LCTL(KC_Z));
                }
                break;

	    case 3:
                // layer 3 - pan right (CW) and left (CCW)
                if (clockwise) {
                    tap_code(KC_WH_R);
                } else {
                    tap_code(KC_WH_L);
                }
                break;
        }

    } else if (index == 1) {									/* RIGHT ENCODER */
        switch (get_highest_layer(layer_state)) {
            case 0:
                // layer 0 - volume up (CW) and down (CCW)
                if (clockwise) {
                    tap_code(KC_VOLU);
                } else {
                    tap_code(KC_VOLD);
                }
                break;

            case 1:
                // layer 1 - change browser tab (CW) and change explorer window (CCW)
                if (clockwise) {
                    tap_code16(LCTL(KC_TAB));
                } else {
                    tap_code16(LALT(LSFT(KC_TAB)));
                }
                break;

            case 2:
                // layer 2 - wheel up (CW) and down (CCW)
                if (clockwise) {
                    tap_code(KC_WH_U);
                } else {
                    tap_code(KC_WH_D);
                }
                break;

            case 3:
                // layer 3 - wheel up (CW) and down (CCW)
                if (clockwise) {
                    tap_code(KC_WH_U);
                } else {
                    tap_code(KC_WH_D);
                }
                break;
        }
    }
}

A keyboards/neopad/rev1/readme.md => keyboards/neopad/rev1/readme.md +5 -0
@@ 0,0 1,5 @@
# Neopad rev1

Final revision of the Neopad macropad. For in depth look please go to [project repository](https://github.com/rookiebwoy/neopad).



A keyboards/neopad/rev1/rev1.c => keyboards/neopad/rev1/rev1.c +61 -0
@@ 0,0 1,61 @@
/* Copyright 2021 rookiebwoy
 *
 * 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 "rev1.h"

void keyboard_pre_init_kb(void) {
    // Set LED IO as outputs
    setPinOutput(LED_00);
    setPinOutput(LED_01);
    keyboard_pre_init_user();
}

void shutdown_user() {
    // Shutdown LEDs
    writePinLow(LED_00);
    writePinLow(LED_01);
}

layer_state_t layer_state_set_kb(layer_state_t state) {
    state = layer_state_set_user(state);

    // Layer LEDs act as binary indication of current layer
    uint8_t layer = get_highest_layer(state);
    writePin(LED_00, layer & 0b1);
    writePin(LED_01, (layer >> 1) & 0b1);
    return state;
}

// Optional override functions below.
// You can leave any or all of these undefined.
// These are only required if you want to perform custom actions.

void matrix_init_kb(void) {
    // put your keyboard start-up code here
    // runs once when the firmware starts up
    uint8_t led_delay_ms = 80;
    for (int i = 0; i < 2; i++) {
        writePinHigh(LED_00);
        writePinHigh(LED_01);
        wait_ms(led_delay_ms);
        writePinLow(LED_00);
        writePinLow(LED_01);
        if (i < 1) {
            wait_ms(led_delay_ms);
        }
    }

    matrix_init_user();
}

A keyboards/neopad/rev1/rev1.h => keyboards/neopad/rev1/rev1.h +26 -0
@@ 0,0 1,26 @@
/* Copyright 2021 rookiebwoy
 *
 * 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/>.
 */
#pragma once
#include "quantum.h"

#define LAYOUT( \
	       k00, k01, k02, \
	       k10, k11, k12  \
) \
{ \
    { k00, k01, k02 }, \
    { k10, k11, k12 }  \
}

A keyboards/neopad/rev1/rules.mk => keyboards/neopad/rev1/rules.mk +25 -0
@@ 0,0 1,25 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = caterina

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = yes        # Console for debug
COMMAND_ENABLE = no         # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no       # Enable Bluetooth
AUDIO_ENABLE = no           # Audio output

ENCODER_ENABLE = yes
KEY_LOCK_ENABLE = yes

A keyboards/neopad/rules.mk => keyboards/neopad/rules.mk +1 -0
@@ 0,0 1,1 @@
DEFAULT_FOLDER = neopad/rev1