From 073b44924cdfd28d64ad2ee1dbe88b00f92d2c72 Mon Sep 17 00:00:00 2001 From: skullY Date: Sun, 27 Mar 2016 16:17:40 -0700 Subject: [PATCH 01/67] Adding clueboard/cluepad support to qmk --- .gitignore | 4 +- keyboard/clueboard1/Makefile | 137 +++++++++++++++ keyboard/clueboard1/clueboard1.c | 27 +++ keyboard/clueboard1/clueboard1.h | 52 ++++++ keyboard/clueboard1/config.h | 86 ++++++++++ keyboard/clueboard1/keymaps/keymap_default.c | 108 ++++++++++++ keyboard/clueboard1/led.c | 34 ++++ keyboard/clueboard2/Makefile | 140 +++++++++++++++ keyboard/clueboard2/backlight.c | 41 +++++ keyboard/clueboard2/clueboard2.c | 44 +++++ keyboard/clueboard2/clueboard2.h | 57 +++++++ keyboard/clueboard2/config.h | 100 +++++++++++ keyboard/clueboard2/keymaps/keymap_default.c | 170 +++++++++++++++++++ keyboard/clueboard2/keymaps/keymap_max.c | 147 ++++++++++++++++ keyboard/clueboard2/keymaps/keymap_skully.c | 108 ++++++++++++ keyboard/clueboard2/led.c | 36 ++++ keyboard/cluepad/Makefile | 136 +++++++++++++++ keyboard/cluepad/backlight.c | 54 ++++++ keyboard/cluepad/cluepad.c | 39 +++++ keyboard/cluepad/cluepad.h | 41 +++++ keyboard/cluepad/config.h | 102 +++++++++++ keyboard/cluepad/keymaps/keymap_default.c | 122 +++++++++++++ 22 files changed, 1783 insertions(+), 2 deletions(-) create mode 100644 keyboard/clueboard1/Makefile create mode 100644 keyboard/clueboard1/clueboard1.c create mode 100644 keyboard/clueboard1/clueboard1.h create mode 100644 keyboard/clueboard1/config.h create mode 100644 keyboard/clueboard1/keymaps/keymap_default.c create mode 100644 keyboard/clueboard1/led.c create mode 100644 keyboard/clueboard2/Makefile create mode 100644 keyboard/clueboard2/backlight.c create mode 100644 keyboard/clueboard2/clueboard2.c create mode 100644 keyboard/clueboard2/clueboard2.h create mode 100644 keyboard/clueboard2/config.h create mode 100644 keyboard/clueboard2/keymaps/keymap_default.c create mode 100644 keyboard/clueboard2/keymaps/keymap_max.c create mode 100644 keyboard/clueboard2/keymaps/keymap_skully.c create mode 100644 keyboard/clueboard2/led.c create mode 100644 keyboard/cluepad/Makefile create mode 100644 keyboard/cluepad/backlight.c create mode 100644 keyboard/cluepad/cluepad.c create mode 100644 keyboard/cluepad/cluepad.h create mode 100644 keyboard/cluepad/config.h create mode 100644 keyboard/cluepad/keymaps/keymap_default.c diff --git a/.gitignore b/.gitignore index 8b8c45169d..a082ea22e4 100644 --- a/.gitignore +++ b/.gitignore @@ -16,8 +16,8 @@ build/ .vagrant/ .DS_STORE -# Eclipse Settings +# Eclipse/PyCharm/Other IDE Settings .cproject .project .settings/ - +.idea diff --git a/keyboard/clueboard1/Makefile b/keyboard/clueboard1/Makefile new file mode 100644 index 0000000000..767fc95efb --- /dev/null +++ b/keyboard/clueboard1/Makefile @@ -0,0 +1,137 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = clueboard1 + + +# Directory common source filess exist +TOP_DIR = ../.. +TMK_DIR = ../../tmk_core + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# # project specific files +SRC = clueboard1.c \ + led.c \ + +ifdef KEYMAP + SRC := keymaps/keymap_$(KEYMAP).c $(SRC) +else + SRC := keymaps/keymap_default.c $(SRC) +endif + +CONFIG_H = config.h + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +# MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +# MIDI_ENABLE = YES # MIDI controls +# UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID + + +# Optimize size but this may cause error "relocation truncated to fit" +#EXTRALDFLAGS = -Wl,--relax + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) +VPATH += $(TMK_DIR) + +include $(TOP_DIR)/quantum/quantum.mk diff --git a/keyboard/clueboard1/clueboard1.c b/keyboard/clueboard1/clueboard1.c new file mode 100644 index 0000000000..252c65fcc2 --- /dev/null +++ b/keyboard/clueboard1/clueboard1.c @@ -0,0 +1,27 @@ +#include "clueboard1.h" + +__attribute__ ((weak)) +void * matrix_init_user(void) { + // leave these blank +}; + +__attribute__ ((weak)) +void * matrix_scan_user(void) { + // leave these blank +}; + +void * matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + if (matrix_init_user) { + (*matrix_init_user)(); + } +}; + +void * matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + if (matrix_scan_user) { + (*matrix_scan_user)(); + } +}; diff --git a/keyboard/clueboard1/clueboard1.h b/keyboard/clueboard1/clueboard1.h new file mode 100644 index 0000000000..1572ea2fdc --- /dev/null +++ b/keyboard/clueboard1/clueboard1.h @@ -0,0 +1,52 @@ +#ifndef CLUEBOARD1_H +#define CLUEBOARD1_H + +#include "matrix.h" +#include "keymap_common.h" +#include + + +/* Clueboard matrix layout + * ,-----------------------------------------------------------. ,---. + * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 0F| + * |-----------------------------------------------------------| |---| + * | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D| | 1F| + * |-----------------------------------------------------------| `---' + * | 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D| + * |------------------------------------------------------------. + * | 30| 31| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D|3E| + * |------------------------------------------------------------------. + * | 40| 41| 42| 43| 45| 46| 49| 4A| 4B| 4C| 4D| 4E| 4F| + * `------------------------------------------------------------------' + * ,-----------------------------------------------------------. ,---. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins| + * |-----------------------------------------------------------| |---| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del| + * |-----------------------------------------------------------| `---' + * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent| + * |--------------------------------------------------------------. + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up| + * |------------------------------------------------------------------. + * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt| + * `------------------------------------------------------------------' + */ +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \ + k40, k41, k42, k43, k45, k46, k49, k4A, k4B, k4C, k4D, k4E, k4F \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \ + { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \ +} + +void * matrix_init_user(void); +void * matrix_scan_user(void); + +#endif diff --git a/keyboard/clueboard1/config.h b/keyboard/clueboard1/config.h new file mode 100644 index 0000000000..01212078f1 --- /dev/null +++ b/keyboard/clueboard1/config.h @@ -0,0 +1,86 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xC1ED +#define PRODUCT_ID 0x2301 +#define DEVICE_VER 0x0003 +#define MANUFACTURER Clueboard +#define PRODUCT Clueboard +#define DESCRIPTION QMK keyboard firmware for Clueboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +// COLS: Left to right, ROWS: Top to bottom + +/* Column pin configuration + * col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + * pin: B3 F1 F4 F5 F6 C7 C6 B6 B5 B4 D7 D6 D4 F7 B0 B1 + */ +#define COLS (int []){ B3, F1, F4, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, F7, B0, B1 } + + /* Row pin configuration + * row: 0 1 2 3 4 + * pin: D1 D0 D2 D5 D3 + */ +#define ROWS (int []){ D1, D0, D2, D5, D3 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboard/clueboard1/keymaps/keymap_default.c b/keyboard/clueboard1/keymaps/keymap_default.c new file mode 100644 index 0000000000..bee7e35a07 --- /dev/null +++ b/keyboard/clueboard1/keymaps/keymap_default.c @@ -0,0 +1,108 @@ +#include "clueboard1.h" + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,--------------------------------------------------------------------------. ,----. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| + * |--------------------------------------------------------------------------| |----| + * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| + * |--------------------------------------------------------------------------| `----' + * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |-----------------------------------------------------------------------------. + * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| + * |------------------------------------------------------------------------|----|----. + * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| + * `----------------------------------------------------------------------------------' + */ +[_BL] = KEYMAP( + F(0), 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_BSLS, KC_BSPC, 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_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,--------------------------------------------------------------------------. ,----. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| + * |--------------------------------------------------------------------------| |----| + * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | |PGUP| + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL|HOME|PGDN| END| + * `----------------------------------------------------------------------------------' + */ +[_FL] = KEYMAP( + 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_TRNS, KC_DEL, BL_INC, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _RS: Reset layer + * ,--------------------------------------------------------------------------. ,----. + * | | | | | | | | | | | | | | | | | | + * |--------------------------------------------------------------------------| |----| + * | | | | |RESET| | | | | | | | | | | | + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL| | | | + * `----------------------------------------------------------------------------------' + */ +[_RS] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS), +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboard/clueboard1/led.c b/keyboard/clueboard1/led.c new file mode 100644 index 0000000000..deb7143eec --- /dev/null +++ b/keyboard/clueboard1/led.c @@ -0,0 +1,34 @@ + /* +Copyright 2012 Jun Wako + +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 . +*/ + +#include +#include "stdint.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ + if (usb_led & (1< +#include "backlight.h" +#include "print.h" + +/* Clueboard 2.0 LED locations: + * + * Capslock: B4, pull high to turn on + * LCtrl: Shared with Capslock, DO NOT INSTALL LED'S IN BOTH + * Page Up: B7, pull high to turn on + * Escape: D6, pull high to turn on + * Arrows: D4, pull high to turn on + */ + +void init_backlight_pin(void) { + print("init_backlight_pin()\n"); + // Set our LED pins as output + DDRD |= (1<<6); // Esc + DDRB |= (1<<7); // Page Up + DDRD |= (1<<4); // Arrows + + // Set our LED pins low + PORTD &= ~(1<<6); // Esc + PORTB &= ~(1<<7); // Page Up + PORTD &= ~(1<<4); // Arrows +} + +void backlight_set(uint8_t level) { + if ( level == 0 ) { + // Turn off light + PORTD |= (1<<6); // Esc + PORTB |= (1<<7); // Page Up + PORTD |= (1<<4); // Arrows + } else { + // Turn on light + PORTD &= ~(1<<6); // Esc + PORTB &= ~(1<<7); // Page Up + PORTD &= ~(1<<4); // Arrows + } +} + diff --git a/keyboard/clueboard2/clueboard2.c b/keyboard/clueboard2/clueboard2.c new file mode 100644 index 0000000000..97d393d18d --- /dev/null +++ b/keyboard/clueboard2/clueboard2.c @@ -0,0 +1,44 @@ +#include "clueboard2.h" + +#ifdef BACKLIGHT_ENABLE +#include "backlight.h" +#endif + +__attribute__ ((weak)) +void * matrix_init_user(void) { + // leave these blank +}; + +__attribute__ ((weak)) +void * matrix_scan_user(void) { + // leave these blank +}; + +void * matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + if (matrix_init_user) { + (*matrix_init_user)(); + } + led_init_ports(); + + #ifdef BACKLIGHT_ENABLE + init_backlight_pin(); + #endif + + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + #endif + + // JTAG disable for PORT F. write JTD bit twice within four cycles. + MCUCR |= (1< + + +/* Clueboard matrix layout + * ,-----------------------------------------------------------. ,---. + * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57| + * |-----------------------------------------------------------| |---| + * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67| + * |-----------------------------------------------------------| `---' + * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75| + * |------------------------------------------------------------. + * | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86| + * |------------------------------------------------------------------. + * | 40| 41| 42| 43| 45| 46| 90| 91| 92| 93| 94| 95| 96| + * `------------------------------------------------------------------' + * ,-----------------------------------------------------------. ,---. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins| + * |-----------------------------------------------------------| |---| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del| + * |-----------------------------------------------------------| `---' + * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent| + * |--------------------------------------------------------------. + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up| + * |------------------------------------------------------------------. + * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt| + * `------------------------------------------------------------------' + */ +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \ + k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \ + k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \ + k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \ + k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27 }, \ + { k30, k31, k32, k33, k34, k35, k36, k37 }, \ + { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \ + { k50, k51, k52, k53, k54, k55, k56, k57 }, \ + { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \ + { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \ + { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \ + { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \ +} + +void * matrix_init_user(void); +void * matrix_scan_user(void); + +#endif diff --git a/keyboard/clueboard2/config.h b/keyboard/clueboard2/config.h new file mode 100644 index 0000000000..04166c20f6 --- /dev/null +++ b/keyboard/clueboard2/config.h @@ -0,0 +1,100 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xC1ED +#define PRODUCT_ID 0x2320 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Clueboard +#define PRODUCT Clueboard with RGB Underlighting +#define DESCRIPTION QMK keyboard firmware for Clueboard + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 8 + +// COLS: Left to right, ROWS: Top to bottom + +/* Column pin configuration + * col: 0 1 2 3 4 5 6 7 + * pin: F0 F1 F4 F5 F6 F7 E6 B1 + */ +#define COLS (int []){ F0, F1, F4, F5, F6, F7, E6, B1 } + + /* Row pin configuration + * row: 0 1 2 3 4 5 6 7 8 9 + * pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2 + */ +#define ROWS (int []){ B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Backlight configuration + */ +#define BACKLIGHT_LEVELS 1 + +/* Underlight configuration + */ + #define ws2812_PORTREG PORTD + #define ws2812_DDRREG DDRD + #define ws2812_pin 7 + #define RGBLED_NUM 14 // Number of LEDs + #define RGBLIGHT_HUE_STEP 10 + #define RGBLIGHT_SAT_STEP 17 + #define RGBLIGHT_VAL_STEP 17 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboard/clueboard2/keymaps/keymap_default.c b/keyboard/clueboard2/keymaps/keymap_default.c new file mode 100644 index 0000000000..5d52f27a72 --- /dev/null +++ b/keyboard/clueboard2/keymaps/keymap_default.c @@ -0,0 +1,170 @@ +#include "clueboard2.h" + +#ifdef ENABLE_RGBLIGHT +#include "rgblight.h" +#endif + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,--------------------------------------------------------------------------. ,----. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| + * |--------------------------------------------------------------------------| |----| + * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| + * |--------------------------------------------------------------------------| `----' + * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |-----------------------------------------------------------------------------. + * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| + * |------------------------------------------------------------------------|----|----. + * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| + * `----------------------------------------------------------------------------------' + */ +[_BL] = KEYMAP( + F(0), 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_GRV, KC_BSPC, 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_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,--------------------------------------------------------------------------. ,----. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| + * |--------------------------------------------------------------------------| |----| + * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | |PGUP| + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL|HOME|PGDN| END| + * `----------------------------------------------------------------------------------' + */ +[_FL] = KEYMAP( + 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_TRNS, KC_DEL, BL_STEP, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _RS: Reset layer + * ,--------------------------------------------------------------------------. ,----. + * | | | | | | | | | | | | | | | | | | + * |--------------------------------------------------------------------------| |----| + * | | | | |RESET| | | | | | | | | | | | + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL| | | | + * `----------------------------------------------------------------------------------' + */ +[_RS] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(0), F(6), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(7), \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(4), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(1), F(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(3), F(5), F(2)), +}; + +enum function_id { + SHIFT_ESC, + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), + [1] = ACTION_FUNCTION(RGBLED_TOGGLE), + [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + //led operations + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} diff --git a/keyboard/clueboard2/keymaps/keymap_max.c b/keyboard/clueboard2/keymaps/keymap_max.c new file mode 100644 index 0000000000..714d6390d9 --- /dev/null +++ b/keyboard/clueboard2/keymaps/keymap_max.c @@ -0,0 +1,147 @@ +#include "clueboard2.h" + +#ifdef ENABLE_RGBLIGHT +#include "rgblight.h" +#endif + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,--------------------------------------------------------------------------. ,----. + * | Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| ~| BS| |PgUp| + * |--------------------------------------------------------------------------| |----| + * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PgDn| + * |--------------------------------------------------------------------------| `----' + * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |-----------------------------------------------------------------------------. + * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| Up| + * |------------------------------------------------------------------------|----|----. + * | Ctrl| Alt| Gui| MHen| Space| Space| Hen| Gui| Alt| Ctrl|Left|Down|Rght| + * `----------------------------------------------------------------------------------' + */ +[_BL] = KEYMAP( + KC_ESC, 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_GRV, KC_BSPC, 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_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \ + KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,--------------------------------------------------------------------------. ,----. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| + * |--------------------------------------------------------------------------| |----| + * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | |PGUP| + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL|HOME|PGDN| END| + * `----------------------------------------------------------------------------------' + */ +[_FL] = KEYMAP( + 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_TRNS, KC_DEL, BL_STEP, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_PGUP, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END), + + /* Keymap _RS: Reset/Underlight layer + * ,--------------------------------------------------------------------------. ,----. + * | | | | | | | | | | | | | | | | | | + * |--------------------------------------------------------------------------| |----| + * | | | | |RESET| | | | | | | | | | | | + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL| | | | + * `----------------------------------------------------------------------------------' + */ +[_RS] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(0), F(6), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(7), \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(4), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(1), F(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(3), F(5), F(2)), +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(RGBLED_TOGGLE), + [1] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + //led operations + if (record->event.pressed) { + rgblight_toggle(); + } + + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} diff --git a/keyboard/clueboard2/keymaps/keymap_skully.c b/keyboard/clueboard2/keymaps/keymap_skully.c new file mode 100644 index 0000000000..74a03f2f30 --- /dev/null +++ b/keyboard/clueboard2/keymaps/keymap_skully.c @@ -0,0 +1,108 @@ +#include "clueboard2.h" + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,--------------------------------------------------------------------------. ,----. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| + * |--------------------------------------------------------------------------| |----| + * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| + * |--------------------------------------------------------------------------| `----' + * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |-----------------------------------------------------------------------------. + * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| + * |------------------------------------------------------------------------|----|----. + * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| + * `----------------------------------------------------------------------------------' + */ +[_BL] = KEYMAP( + F(0), 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_GRV, KC_BSPC, 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_PGDN, \ + KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL,KC_LALT,KC_LGUI,MO(_FL), KC_SPC, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,--------------------------------------------------------------------------. ,----. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| + * |--------------------------------------------------------------------------| |----| + * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | |PGUP| + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL|HOME|PGDN| END| + * `----------------------------------------------------------------------------------' + */ +[_FL] = KEYMAP( + 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_TRNS,KC_DEL, BL_STEP, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP, \ + KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL), KC_TRNS,KC_TRNS, MO(_FL),KC_TRNS,KC_TRNS,MO(_FL),KC_HOME,KC_PGDN,KC_END), + + /* Keymap _RS: Reset layer + * ,--------------------------------------------------------------------------. ,----. + * | | | | | | | | | | | | | | | | | | + * |--------------------------------------------------------------------------| |----| + * | | | | |RESET| | | | | | | | | | | | + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL| | | | + * `----------------------------------------------------------------------------------' + */ +[_RS] = KEYMAP( + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL),KC_TRNS, KC_TRNS, KC_TRNS), +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboard/clueboard2/led.c b/keyboard/clueboard2/led.c new file mode 100644 index 0000000000..5788fc7b1f --- /dev/null +++ b/keyboard/clueboard2/led.c @@ -0,0 +1,36 @@ + /* +Copyright 2012 Jun Wako + +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 . +*/ + +#include +#include "stdint.h" +#include "led.h" + + +void led_init_ports() { + // * Set our LED pins as output + DDRB |= (1<<4); +} + +void led_set(uint8_t usb_led) { + if (usb_led & (1< +#include "backlight.h" +#include "led.h" + +#include "print.h" + +int pwm_level; + +void led_set(uint8_t usb_led) +{ + print("led_set\n"); +} + +void init_backlight_pin(void) +{ + // Set C7 to output + DDRC |= (1<<7); + + // Initialize the timer + TC4H = 0x03; + OCR4C = 0xFF; + TCCR4A = 0b10000010; + TCCR4B = 0b00000001; +} + +void backlight_set(uint8_t level) +{ + // Determine the PWM level + switch (level) + { + case 0: + // 33% + pwm_level = 0x54; + break; + case 1: + // 66% + pwm_level = 0xA8; + break; + case 2: + // 100% + pwm_level = 0xFF; + break; + case 3: + // 0% + pwm_level = 0x00; + break; + default: + xprintf("Unknown level: %d\n", level); + } + + // Write the PWM level to the timer + TC4H = pwm_level >> 8; + OCR4A = 0xFF & pwm_level; +} diff --git a/keyboard/cluepad/cluepad.c b/keyboard/cluepad/cluepad.c new file mode 100644 index 0000000000..ff3be5b9b5 --- /dev/null +++ b/keyboard/cluepad/cluepad.c @@ -0,0 +1,39 @@ +#include "cluepad.h" + +__attribute__ ((weak)) +void * matrix_init_user(void) { + // leave these blank +}; + +__attribute__ ((weak)) +void * matrix_scan_user(void) { + // leave these blank +}; + +void * matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + if (matrix_init_user) { + (*matrix_init_user)(); + } + + #ifdef BACKLIGHT_ENABLE + init_backlight_pin(); + #endif + + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + #endif + + // JTAG disable for PORT F. write JTD bit twice within four cycles. + MCUCR |= (1< + + +/* Cluepad matrix layout + * .-------------------. + * |NLCK| /| *| -| + * |-------------------| + * | 7| 8| 9| | + * |--------------| | + * | 4| 5| 6| +| + * |-------------------| + * | 1| 2| 3| | + * |--------------| | + * | 0| .| Ent| + * '-------------------' + */ +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13, \ + k20, k21, k22, \ + k30, k31, k32, k33, \ + k40, k42 \ +) { \ + { k00, k01, k02, k03, }, \ + { k10, k11, k12, k13, }, \ + { k20, k21, k22, KC_NO, }, \ + { k30, k31, k32, k33, }, \ + { k40, KC_NO, k42, KC_NO } \ +} + +void * matrix_init_user(void); +void * matrix_scan_user(void); + +#endif diff --git a/keyboard/cluepad/config.h b/keyboard/cluepad/config.h new file mode 100644 index 0000000000..5ed421a6e0 --- /dev/null +++ b/keyboard/cluepad/config.h @@ -0,0 +1,102 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xC1ED +#define PRODUCT_ID 0x2312 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Clueboard +#define PRODUCT Cluepad with RGB Underlighting +#define DESCRIPTION QMK keyboard firmware for Cluepad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 4 + +// COLS: Left to right, ROWS: Top to bottom + +/* Column pin configuration + * col: 0 1 2 3 + * pin: F4 E6 B1 D2 + */ +#define COLS (int []){ F4, E6, B1, D2 } + + /* Row pin configuration + * row: 0 1 2 3 4 + * pin: + */ +#define ROWS (int []){ B0, D3, D5, D4, D6 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* Number of backlighting levels */ +#define BACKLIGHT_LEVELS 3 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Underlight configuration + */ + #define ws2812_PORTREG PORTF + #define ws2812_DDRREG DDRF + #define ws2812_pin 6 + #define RGBLED_NUM 4 // Number of LEDs + #define RGBLIGHT_HUE_STEP 10 + #define RGBLIGHT_SAT_STEP 17 + #define RGBLIGHT_VAL_STEP 17 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* Debug forcibly enabled */ +#define ALWAYS_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboard/cluepad/keymaps/keymap_default.c b/keyboard/cluepad/keymaps/keymap_default.c new file mode 100644 index 0000000000..32cb43c745 --- /dev/null +++ b/keyboard/cluepad/keymaps/keymap_default.c @@ -0,0 +1,122 @@ +#include "cluepad.h" + +#include "backlight.h" +#include "rgblight.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * .-------------------. + * |NL F| /| *| -| + * |-------------------| + * | 7| 8| 9| | + * |--------------| | + * | 4| 5| 6| +| + * |-------------------| + * | 1| 2| 3| | + * |--------------| | + * | 0| .| Ent| + * '-------------------' + */ +[_BL] = KEYMAP( + LT(_FL, KC_NLCK), KC_PSLS, KC_PAST, KC_PMNS, \ + KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_P4, KC_P5, KC_P6, \ + KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_P0, KC_PDOT), + + /* Keymap _FL: Function Layer + * .-------------------. + * |NL F| | | Fn0| + * |-------------------| + * | Fn2| | Fn4| | + * |--------------| | + * | Fn3|BL_S| Fn5| Fn6| + * |-------------------| + * | | | | | + * |--------------| | + * | Fn1| | Fn7| + * '-------------------' + */ +[_FL] = KEYMAP( + LT(_FL, KC_NLCK), KC_TRNS, KC_TRNS, F(0), \ + F(2), KC_TRNS, F(4), F(6), \ + F(3), BL_STEP, F(5), \ + KC_TRNS, KC_TRNS, KC_TRNS, F(7), \ + F(1), KC_TRNS) +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(RGBLED_TOGGLE), + [1] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} + From 5e822417d7aaebbb58154092ad2a7b5fd2469fbb Mon Sep 17 00:00:00 2001 From: skullY Date: Mon, 28 Mar 2016 22:49:24 -0700 Subject: [PATCH 02/67] Fixup clueboard support and add rgb to clueboard1 --- keyboard/clueboard1/Makefile | 4 +- keyboard/clueboard1/clueboard1.c | 32 ++++---- keyboard/clueboard1/clueboard1.h | 4 +- keyboard/clueboard1/config.h | 10 +++ keyboard/clueboard1/keymaps/keymap_default.c | 82 +++++++++++++++++++- keyboard/clueboard1/led.c | 14 ++-- keyboard/clueboard2/clueboard2.c | 8 +- keyboard/clueboard2/clueboard2.h | 4 +- keyboard/clueboard2/keymaps/keymap_default.c | 22 +++++- 9 files changed, 137 insertions(+), 43 deletions(-) diff --git a/keyboard/clueboard1/Makefile b/keyboard/clueboard1/Makefile index 767fc95efb..429ea6088b 100644 --- a/keyboard/clueboard1/Makefile +++ b/keyboard/clueboard1/Makefile @@ -51,7 +51,7 @@ TARGET_DIR = . # # project specific files SRC = clueboard1.c \ - led.c \ + led.c ifdef KEYMAP SRC := keymaps/keymap_$(KEYMAP).c $(SRC) @@ -62,7 +62,6 @@ endif CONFIG_H = config.h # MCU name -#MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. @@ -121,6 +120,7 @@ CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work # BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality # MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboard/clueboard1/clueboard1.c b/keyboard/clueboard1/clueboard1.c index 252c65fcc2..289e4644d3 100644 --- a/keyboard/clueboard1/clueboard1.c +++ b/keyboard/clueboard1/clueboard1.c @@ -1,27 +1,23 @@ #include "clueboard1.h" __attribute__ ((weak)) -void * matrix_init_user(void) { +void matrix_init_user(void) { // leave these blank -}; +} __attribute__ ((weak)) -void * matrix_scan_user(void) { +void matrix_scan_user(void) { // leave these blank -}; +} -void * matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - if (matrix_init_user) { - (*matrix_init_user)(); - } -}; +void matrix_init_kb(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + #endif -void * matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - if (matrix_scan_user) { - (*matrix_scan_user)(); - } -}; + matrix_init_user(); +} + +void matrix_scan_kb(void) { + matrix_scan_user(); +} diff --git a/keyboard/clueboard1/clueboard1.h b/keyboard/clueboard1/clueboard1.h index 1572ea2fdc..839a81a150 100644 --- a/keyboard/clueboard1/clueboard1.h +++ b/keyboard/clueboard1/clueboard1.h @@ -46,7 +46,7 @@ { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \ } -void * matrix_init_user(void); -void * matrix_scan_user(void); +void matrix_init_user(void); +void matrix_scan_user(void); #endif diff --git a/keyboard/clueboard1/config.h b/keyboard/clueboard1/config.h index 01212078f1..1801e3d2cc 100644 --- a/keyboard/clueboard1/config.h +++ b/keyboard/clueboard1/config.h @@ -65,6 +65,16 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* Underlight configuration + */ + #define ws2812_PORTREG PORTF + #define ws2812_DDRREG DDRF + #define ws2812_pin 6 + #define RGBLED_NUM 14 // Number of LEDs + #define RGBLIGHT_HUE_STEP 10 + #define RGBLIGHT_SAT_STEP 17 + #define RGBLIGHT_VAL_STEP 17 + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboard/clueboard1/keymaps/keymap_default.c b/keyboard/clueboard1/keymaps/keymap_default.c index bee7e35a07..33443f5825 100644 --- a/keyboard/clueboard1/keymaps/keymap_default.c +++ b/keyboard/clueboard1/keymaps/keymap_default.c @@ -1,5 +1,9 @@ #include "clueboard1.h" +#ifdef ENABLE_RGBLIGHT +#include "rgblight.h" +#endif + // Used for SHIFT_ESC #define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) @@ -26,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_BL] = KEYMAP( - F(0), 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_BSLS, KC_BSPC, KC_PGUP, \ + F(0), 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_GRV, KC_BSPC, 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_PGDN, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ @@ -46,8 +50,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_FL] = KEYMAP( - 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_TRNS, KC_DEL, BL_INC, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, \ + 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_TRNS, KC_DEL, BL_STEP, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), @@ -66,19 +70,47 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_RS] = KEYMAP( + #ifdef ENABLE_RGBLIGHT + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), F(5), \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, F(2), F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(4), F(6), F(3)), + #else KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS), + #endif }; enum function_id { SHIFT_ESC, + #ifdef ENABLE_RGBLIGHT + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL + #endif }; const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(SHIFT_ESC), + #ifdef ENABLE_RGBLIGHT + [1] = ACTION_FUNCTION(RGBLED_TOGGLE), + [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), + #endif }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { @@ -104,5 +136,49 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } } break; + //led operations + #ifdef ENABLE_RGBLIGHT + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + #endif } } diff --git a/keyboard/clueboard1/led.c b/keyboard/clueboard1/led.c index deb7143eec..f0dd5662d5 100644 --- a/keyboard/clueboard1/led.c +++ b/keyboard/clueboard1/led.c @@ -20,15 +20,13 @@ along with this program. If not, see . #include "led.h" -void led_set(uint8_t usb_led) -{ +void led_set_kb(uint8_t usb_led) { + DDRF |= (1<<0); if (usb_led & (1<event.pressed) { rgblight_toggle(); @@ -166,5 +179,6 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { rgblight_step(); } break; + #endif } } From 34dd96187c5ea2fe6e806f662e6ab0c320d0df1b Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 5 Apr 2016 20:27:24 -0700 Subject: [PATCH 03/67] Fix the clueboard2 led code --- keyboard/clueboard2/led.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboard/clueboard2/led.c b/keyboard/clueboard2/led.c index 5788fc7b1f..3d074e5d20 100644 --- a/keyboard/clueboard2/led.c +++ b/keyboard/clueboard2/led.c @@ -25,7 +25,7 @@ void led_init_ports() { DDRB |= (1<<4); } -void led_set(uint8_t usb_led) { +void led_set_kb(uint8_t usb_led) { if (usb_led & (1< Date: Tue, 5 Apr 2016 20:27:40 -0700 Subject: [PATCH 04/67] Fixup the cluepad code --- keyboard/cluepad/backlight.c | 2 +- keyboard/cluepad/cluepad.c | 8 ++++---- keyboard/cluepad/cluepad.h | 4 ++-- keyboard/cluepad/keymaps/keymap_default.c | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/keyboard/cluepad/backlight.c b/keyboard/cluepad/backlight.c index c0f8539494..a9caed1df8 100644 --- a/keyboard/cluepad/backlight.c +++ b/keyboard/cluepad/backlight.c @@ -6,7 +6,7 @@ int pwm_level; -void led_set(uint8_t usb_led) +void led_set_kb(uint8_t usb_led) { print("led_set\n"); } diff --git a/keyboard/cluepad/cluepad.c b/keyboard/cluepad/cluepad.c index ff3be5b9b5..d55b999605 100644 --- a/keyboard/cluepad/cluepad.c +++ b/keyboard/cluepad/cluepad.c @@ -1,16 +1,16 @@ #include "cluepad.h" __attribute__ ((weak)) -void * matrix_init_user(void) { +void matrix_init_user(void) { // leave these blank }; __attribute__ ((weak)) -void * matrix_scan_user(void) { +void matrix_scan_user(void) { // leave these blank }; -void * matrix_init_kb(void) { +void matrix_init_kb(void) { // put your keyboard start-up code here // runs once when the firmware starts up if (matrix_init_user) { @@ -30,7 +30,7 @@ void * matrix_init_kb(void) { MCUCR |= (1< Date: Thu, 7 Apr 2016 15:09:53 -0700 Subject: [PATCH 05/67] Add a help message to new_project.sh --- new_project.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/new_project.sh b/new_project.sh index 28de9c2f9f..5ac935d782 100755 --- a/new_project.sh +++ b/new_project.sh @@ -2,6 +2,11 @@ # Script to make a new quantum project # Jack Humbert 2015 +if [ -z "$1" ]; then + echo "Usege: $0 " + exit 1 +fi + KEYBOARD=$1 KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}') From 97f8f378761506914b69d4fd2d5661bfcae28295 Mon Sep 17 00:00:00 2001 From: skullY Date: Sun, 10 Apr 2016 21:16:49 -0700 Subject: [PATCH 06/67] Fixup RGBLIGHT support for clueboard2 --- keyboard/clueboard2/keymaps/keymap_default.c | 11 +++++------ quantum/rgblight.c | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/keyboard/clueboard2/keymaps/keymap_default.c b/keyboard/clueboard2/keymaps/keymap_default.c index 10fff7b9ac..73179f94cd 100644 --- a/keyboard/clueboard2/keymaps/keymap_default.c +++ b/keyboard/clueboard2/keymaps/keymap_default.c @@ -1,6 +1,6 @@ #include "clueboard2.h" -#ifdef ENABLE_RGBLIGHT +#ifdef RGBLIGHT_ENABLE #include "rgblight.h" #endif @@ -70,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_RS] = KEYMAP( - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \ KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { enum function_id { SHIFT_ESC, - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, @@ -101,7 +101,7 @@ enum function_id { const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(SHIFT_ESC), - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE [1] = ACTION_FUNCTION(RGBLED_TOGGLE), [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), @@ -137,12 +137,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } break; //led operations - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE case RGBLED_TOGGLE: if (record->event.pressed) { rgblight_toggle(); } - break; case RGBLED_INCREASE_HUE: if (record->event.pressed) { diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 2215cf5cdf..6adc9e2784 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -190,7 +190,7 @@ void rgblight_mode(uint8_t mode) { rgblight_config.mode = mode; } eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight mode: %u\n", rgblight_config.mode); + xprintf("rgblight mode: %u\n", rgblight_config.mode); if (rgblight_config.mode == 1) { rgblight_timer_disable(); } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { @@ -207,7 +207,7 @@ void rgblight_mode(uint8_t mode) { void rgblight_toggle(void) { rgblight_config.enable ^= 1; eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); + xprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); if (rgblight_config.enable) { rgblight_mode(rgblight_config.mode); } else { @@ -300,7 +300,7 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){ rgblight_config.sat = sat; rgblight_config.val = val; eeconfig_write_rgblight(rgblight_config.raw); - dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); + xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } } From 21d4cafb8c2894a71c4022e248b0dbcc1d9ce57d Mon Sep 17 00:00:00 2001 From: skullY Date: Wed, 13 Apr 2016 14:20:08 -0700 Subject: [PATCH 07/67] Fixup rgb underlight for clueboard1 --- keyboard/clueboard1/Makefile | 3 +-- keyboard/clueboard1/config.h | 6 +++--- keyboard/clueboard1/keymaps/keymap_default.c | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/keyboard/clueboard1/Makefile b/keyboard/clueboard1/Makefile index 429ea6088b..50cde1517b 100644 --- a/keyboard/clueboard1/Makefile +++ b/keyboard/clueboard1/Makefile @@ -119,8 +119,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality +# RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality # MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboard/clueboard1/config.h b/keyboard/clueboard1/config.h index 1801e3d2cc..2b20c3873d 100644 --- a/keyboard/clueboard1/config.h +++ b/keyboard/clueboard1/config.h @@ -67,9 +67,9 @@ along with this program. If not, see . /* Underlight configuration */ - #define ws2812_PORTREG PORTF - #define ws2812_DDRREG DDRF - #define ws2812_pin 6 + #define ws2812_PORTREG PORTB + #define ws2812_DDRREG DDRB + #define ws2812_pin 2 #define RGBLED_NUM 14 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboard/clueboard1/keymaps/keymap_default.c b/keyboard/clueboard1/keymaps/keymap_default.c index 33443f5825..3f4f3c4149 100644 --- a/keyboard/clueboard1/keymaps/keymap_default.c +++ b/keyboard/clueboard1/keymaps/keymap_default.c @@ -1,6 +1,6 @@ #include "clueboard1.h" -#ifdef ENABLE_RGBLIGHT +#ifdef RGBLIGHT_ENABLE #include "rgblight.h" #endif @@ -70,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_RS] = KEYMAP( - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), F(7), \ KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(8), \ KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { enum function_id { SHIFT_ESC, - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, @@ -101,7 +101,7 @@ enum function_id { const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(SHIFT_ESC), - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE [1] = ACTION_FUNCTION(RGBLED_TOGGLE), [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), @@ -137,7 +137,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } break; //led operations - #ifdef ENABLE_RGBLIGHT + #ifdef RGBLIGHT_ENABLE case RGBLED_TOGGLE: if (record->event.pressed) { rgblight_toggle(); From fa2eedb7bd906634b8c500ba0d91638e63eaafed Mon Sep 17 00:00:00 2001 From: Roman Zolotarev Date: Sat, 16 Apr 2016 16:57:58 +0800 Subject: [PATCH 08/67] Add Roman's single layer layout based on Norman --- .../romanzolotarev-norman-osx/keymap.c | 45 ++++++++++++++++++ .../romanzolotarev-norman-osx/readme.md | 28 +++++++++++ .../romanzolotarev-norman-osx.hex | Bin 0 -> 49068 bytes .../romanzolotarev-norman-osx.png | Bin 0 -> 96954 bytes 4 files changed, 73 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c new file mode 100644 index 0000000000..e23c5a1d6a --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c @@ -0,0 +1,45 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [BASE] = KEYMAP( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5, + KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_E, KC_T, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, + KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT, + // + /*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + /*-*/ KC_NO, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS, + /*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT, + /*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + /*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + KC_MPLY, KC_MNXT, + KC_MPRV, + KC_RALT, KC_QUOT, KC_SPC + ) +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md new file mode 100644 index 0000000000..80475ab21e --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md @@ -0,0 +1,28 @@ +# Roman's Layout + +There is only one layer based on [Norman layout](https://normanlayout.info/). + +Looking for multiple-layer layouts? + +- [Symbols, arrows, plover, HJKL arrows](../romanzolotarev-norman-plover-osx-hjkl/) +- [Same with IJKL arrows](../romanzolotarev-norman-plover-osx/) + +[![keyboard-layout](romanzolotarev-norman-osx.png)](http://www.keyboard-layout-editor.com/#/gists/9e89d54f1ea6eeeb7dab1b2d19d28195) + +## Functional Keys + +- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/). +- Tap `F2` to copy screenshot to the clipboard. +- Hold `SHIFT` and tap `F2` to save screenshot as a file. +- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). + +## CTRL/ESC + +CTRL and ESC are frequently used in Vim. + +- Tap `CTRL/ESC` to send `ESC`. +- Hold `CTRL/ESC` to use as `CTRL`. + +## Activate N-rollover + +- Hold left `SHIFT` and right `SHIRT` and then tap `N`. diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex new file mode 100644 index 0000000000000000000000000000000000000000..1be94c43d103a1a1daba5e3c555d33137d9b6fef GIT binary patch literal 49068 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

%@?%SIcDx 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 literal 0 HcmV?d00001 From 6274a216f87bad7d6fe9c9a1a4328dbf444fc364 Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Tue, 26 Apr 2016 05:25:31 +0300 Subject: [PATCH 09/67] [Erez & Jack] Examples for advanced macro stuff --- README.md | 99 +++++++++++++++++- .../erez_experimental/erez_experimental.hex | Bin 50365 -> 52095 bytes .../keymaps/erez_experimental/keymap.c | 45 ++++++-- 3 files changed, 133 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f5c271f165..749c97c8f1 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,23 @@ This will clear all keys besides the mods currently pressed. If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0). +#### Naming your macros + +If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so: + +``` +#define AUD_OFF M(6) +#define AUD_ON M(7) +#define MUS_OFF M(8) +#define MUS_ON M(9) +#define VC_IN M(10) +#define VC_DE M(11) +#define PLOVER M(12) +#define EXT_PLV M(13) +``` + +As was done on the [Planck default keymap](/keyboard/planck/keymaps/default/keymap.c#L33-L40) + #### Timer functionality It's possible to start timers and read values for time-specific events - here's an example: @@ -227,11 +244,91 @@ if (timer_elapsed(key_timer) < 100) { It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc). +#### Example 1: Single-key copy/paste (hold to copy, tap to paste) + +With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held? + +Here's what you do: + + +``` +static uint16_t key_timer; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + } + else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + return MACRO( D(LCTL), T(C), U(LCTL), END ); + } + else { + return MACRO( D(LCTL), T(V), U(LCTL), END ); + } + } + break; + } + } + return MACRO_NONE; +}; +``` + +And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste. + +#### Example 2: Space Cadet Shift (making it easy to send opening and closing parentheses) + +In the [Modern Space Cadet Keyboard](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses), one of cooler features is the Shift Parentheses. To quote Steve Losh: + + > When held while pressing other keys, act like Shift. + > When pressed and released on their own, type an opening or closing parenthesis (left and right shift respectively). + +``` +static uint16_t key_timer; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSFT); // we're now holding down Shift. + } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) < 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren + unregister_code(KC_9); // now let's let go of that key + } + unregister_code(KC_LSFT); // let's release the Shift key now. + } + break; + } + case 1: { + if (record->event.pressed) { + key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key + register_code(KC_RSFT); + } else { + if (timer_elapsed(key_timer) < 150) { + register_code(KC_0); + unregister_code(KC_0); + } + unregister_code(KC_RSFT); + } + break; + } + } + return MACRO_NONE; +}; +``` + +And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for left shift/opening parens, and `M(1)` for right shift/closing parens. + ## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: - #include + #include If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to: diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/erez_experimental.hex b/keyboard/ergodox_ez/keymaps/erez_experimental/erez_experimental.hex index aa088456584c85a0efa1e31ad48f6227ee6eff57..3af7ddbb8ee0aad0667f02f1827e632bcbf4868b 100644 GIT binary patch literal 52095 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 diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c b/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c index 24ff1c6884..18bace4ebc 100644 --- a/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c +++ b/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c @@ -7,6 +7,9 @@ #define SYMB 1 // symbols #define MDIA 2 // media keys +#define LSFTO M(0) // Left shift, open parens when tapped +#define RSFTC M(1) // Right shift, close parens when tapped + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * @@ -17,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' | * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * |LShift/(|Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl|RShift/)| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | * `----------------------------------' `----------------------------------' @@ -36,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LSFTO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, @@ -45,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS, TG(SYMB), KC_Y,KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_H,ALT_T(KC_J),KC_K, KC_L, LT(MDIA,KC_SCLN),GUI_T(KC_QUOT), - MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), RSFTC, KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, KC_LALT, CTL_T(KC_ESC), KC_PGUP, @@ -140,17 +143,37 @@ const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) }; +static uint16_t key_timer; + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSFT); // we're now holding down Shift. + } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) < 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren + unregister_code(KC_9); // now let's let go of that key + } + unregister_code(KC_LSFT); // let's release the Shift key now. + } + break; + } + case 1: { + if (record->event.pressed) { + key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key + register_code(KC_RSFT); + } else { + if (timer_elapsed(key_timer) < 150) { + register_code(KC_0); + unregister_code(KC_0); + } + unregister_code(KC_RSFT); + } + break; } - break; } return MACRO_NONE; }; @@ -183,3 +206,5 @@ void matrix_scan_user(void) { } }; + + From 140b97a1cd226432a8ec647004943698e3d87f0b Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 26 Apr 2016 01:16:47 -0400 Subject: [PATCH 10/67] adds delayed vibrato --- quantum/audio/voices.c | 31 +++++++++++++++++++++++++++++++ quantum/audio/voices.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index de9f8ae544..0921bd5931 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,5 +1,6 @@ #include "voices.h" #include "stdlib.h" +#include "vibrato_lut.h" // these are imported from audio.c extern uint16_t envelope_index; @@ -99,6 +100,36 @@ float voice_envelope(float frequency) { if ((envelope_index % 8) == 0) note_timbre = 0; break; + case delayed_vibrato: + polyphony_rate = 0; + note_timbre = TIMBRE_50; + #define VOICE_VIBRATO_DELAY 150 + #define VOICE_VIBRATO_SPEED 50 + switch (compensated_index) { + case 0 ... VOICE_VIBRATO_DELAY: + break; + default: + frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + break; + } + break; + // case delayed_vibrato_octave: + // polyphony_rate = 0; + // if ((envelope_index % 2) == 1) { + // note_timbre = 0.55; + // } else { + // note_timbre = 0.45; + // } + // #define VOICE_VIBRATO_DELAY 150 + // #define VOICE_VIBRATO_SPEED 50 + // switch (compensated_index) { + // case 0 ... VOICE_VIBRATO_DELAY: + // break; + // default: + // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + // break; + // } + // break; // case duty_fifth_down: // note_timbre = 0.5; // if ((envelope_index % 3) == 0) diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 4b894f28d4..74c873f42f 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -16,6 +16,8 @@ typedef enum { octave_crunch, duty_osc, duty_octave_down, + delayed_vibrato, + // delayed_vibrato_octave, // duty_fifth_down, // duty_fourth_down, // duty_third_down, From bf56838fe99aafd37559d560e47b707a83c87588 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 26 Apr 2016 01:17:00 -0400 Subject: [PATCH 11/67] adds freq LUT for future use --- quantum/audio/frequency_lut.h | 357 ++++++++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 quantum/audio/frequency_lut.h diff --git a/quantum/audio/frequency_lut.h b/quantum/audio/frequency_lut.h new file mode 100644 index 0000000000..e62da5be4e --- /dev/null +++ b/quantum/audio/frequency_lut.h @@ -0,0 +1,357 @@ +#include +#include +#include + +#define FREQUENCY_LUT_LENGTH 349 + +const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = { +0x8E0B, +0x8C02, +0x8A00, +0x8805, +0x8612, +0x8426, +0x8241, +0x8063, +0x7E8C, +0x7CBB, +0x7AF2, +0x792E, +0x7772, +0x75BB, +0x740B, +0x7261, +0x70BD, +0x6F20, +0x6D88, +0x6BF6, +0x6A69, +0x68E3, +0x6762, +0x65E6, +0x6470, +0x6300, +0x6194, +0x602E, +0x5ECD, +0x5D71, +0x5C1A, +0x5AC8, +0x597B, +0x5833, +0x56EF, +0x55B0, +0x5475, +0x533F, +0x520E, +0x50E1, +0x4FB8, +0x4E93, +0x4D73, +0x4C57, +0x4B3E, +0x4A2A, +0x491A, +0x480E, +0x4705, +0x4601, +0x4500, +0x4402, +0x4309, +0x4213, +0x4120, +0x4031, +0x3F46, +0x3E5D, +0x3D79, +0x3C97, +0x3BB9, +0x3ADD, +0x3A05, +0x3930, +0x385E, +0x3790, +0x36C4, +0x35FB, +0x3534, +0x3471, +0x33B1, +0x32F3, +0x3238, +0x3180, +0x30CA, +0x3017, +0x2F66, +0x2EB8, +0x2E0D, +0x2D64, +0x2CBD, +0x2C19, +0x2B77, +0x2AD8, +0x2A3A, +0x299F, +0x2907, +0x2870, +0x27DC, +0x2749, +0x26B9, +0x262B, +0x259F, +0x2515, +0x248D, +0x2407, +0x2382, +0x2300, +0x2280, +0x2201, +0x2184, +0x2109, +0x2090, +0x2018, +0x1FA3, +0x1F2E, +0x1EBC, +0x1E4B, +0x1DDC, +0x1D6E, +0x1D02, +0x1C98, +0x1C2F, +0x1BC8, +0x1B62, +0x1AFD, +0x1A9A, +0x1A38, +0x19D8, +0x1979, +0x191C, +0x18C0, +0x1865, +0x180B, +0x17B3, +0x175C, +0x1706, +0x16B2, +0x165E, +0x160C, +0x15BB, +0x156C, +0x151D, +0x14CF, +0x1483, +0x1438, +0x13EE, +0x13A4, +0x135C, +0x1315, +0x12CF, +0x128A, +0x1246, +0x1203, +0x11C1, +0x1180, +0x1140, +0x1100, +0x10C2, +0x1084, +0x1048, +0x100C, +0xFD1, +0xF97, +0xF5E, +0xF25, +0xEEE, +0xEB7, +0xE81, +0xE4C, +0xE17, +0xDE4, +0xDB1, +0xD7E, +0xD4D, +0xD1C, +0xCEC, +0xCBC, +0xC8E, +0xC60, +0xC32, +0xC05, +0xBD9, +0xBAE, +0xB83, +0xB59, +0xB2F, +0xB06, +0xADD, +0xAB6, +0xA8E, +0xA67, +0xA41, +0xA1C, +0x9F7, +0x9D2, +0x9AE, +0x98A, +0x967, +0x945, +0x923, +0x901, +0x8E0, +0x8C0, +0x8A0, +0x880, +0x861, +0x842, +0x824, +0x806, +0x7E8, +0x7CB, +0x7AF, +0x792, +0x777, +0x75B, +0x740, +0x726, +0x70B, +0x6F2, +0x6D8, +0x6BF, +0x6A6, +0x68E, +0x676, +0x65E, +0x647, +0x630, +0x619, +0x602, +0x5EC, +0x5D7, +0x5C1, +0x5AC, +0x597, +0x583, +0x56E, +0x55B, +0x547, +0x533, +0x520, +0x50E, +0x4FB, +0x4E9, +0x4D7, +0x4C5, +0x4B3, +0x4A2, +0x491, +0x480, +0x470, +0x460, +0x450, +0x440, +0x430, +0x421, +0x412, +0x403, +0x3F4, +0x3E5, +0x3D7, +0x3C9, +0x3BB, +0x3AD, +0x3A0, +0x393, +0x385, +0x379, +0x36C, +0x35F, +0x353, +0x347, +0x33B, +0x32F, +0x323, +0x318, +0x30C, +0x301, +0x2F6, +0x2EB, +0x2E0, +0x2D6, +0x2CB, +0x2C1, +0x2B7, +0x2AD, +0x2A3, +0x299, +0x290, +0x287, +0x27D, +0x274, +0x26B, +0x262, +0x259, +0x251, +0x248, +0x240, +0x238, +0x230, +0x228, +0x220, +0x218, +0x210, +0x209, +0x201, +0x1FA, +0x1F2, +0x1EB, +0x1E4, +0x1DD, +0x1D6, +0x1D0, +0x1C9, +0x1C2, +0x1BC, +0x1B6, +0x1AF, +0x1A9, +0x1A3, +0x19D, +0x197, +0x191, +0x18C, +0x186, +0x180, +0x17B, +0x175, +0x170, +0x16B, +0x165, +0x160, +0x15B, +0x156, +0x151, +0x14C, +0x148, +0x143, +0x13E, +0x13A, +0x135, +0x131, +0x12C, +0x128, +0x124, +0x120, +0x11C, +0x118, +0x114, +0x110, +0x10C, +0x108, +0x104, +0x100, +0xFD, +0xF9, +0xF5, +0xF2, +0xEE +}; \ No newline at end of file From bf925fb71cf03d520f66baefa6af5c94ff5b7952 Mon Sep 17 00:00:00 2001 From: Roman Zolotarev Date: Tue, 26 Apr 2016 16:46:43 +0800 Subject: [PATCH 12/67] Add Roman's layout with QWERTY --- .../romanzolotarev-norman-qwerty-osx/keymap.c | 73 ++++++++++++++++++ .../readme.md | 34 ++++++++ .../romanzolotarev-norman-qwerty-osx.hex | Bin 0 -> 51175 bytes .../romanzolotarev-norman-qwerty-osx.png | Bin 0 -> 100627 bytes 4 files changed, 107 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex create mode 100644 keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c new file mode 100644 index 0000000000..dd946c1823 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c @@ -0,0 +1,73 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 +#define QWRT 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [BASE] = KEYMAP( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5, + KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_E, KC_T, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, + KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT, + // + /*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + /*-*/ TG(QWRT), KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS, + /*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT, + /*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + /*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + KC_MPLY, KC_MNXT, + KC_MPRV, + KC_RALT, KC_QUOT, KC_SPC + ), + [QWRT] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_E, KC_R, KC_T, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_D, KC_F, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + // + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS, + /*-*/ /*-*/ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_TRNS, + /*-*/ KC_TRNS, KC_N, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case QWRT: + ergodox_right_led_1_on(); + break; + default: + break; + } +}; diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md new file mode 100644 index 0000000000..0e78c130b3 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md @@ -0,0 +1,34 @@ +# Roman's Layout + +There are two layers: + +- **BASE** is [Norman layout](https://normanlayout.info/). +- **QWRT** is QWERTY. + +[![keyboard-layout](romanzolotarev-norman-qwerty-osx.png)](http://www.keyboard-layout-editor.com/#/gists/3b236f450da474dc506a5a80390c3cc7) + +## Switching + +- Tap `QWRT` to toggle **QWRT**. + +## LEDs + +- Red: QWRT is on. + +## Functional Keys + +- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/). +- Tap `F2` to copy screenshot to the clipboard. +- Hold `SHIFT` and tap `F2` to save screenshot as a file. +- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). + +## CTRL/ESC + +Both CTRL and ESC are frequently used in Vim. + +- Tap `CTRL/ESC` to send `ESC`. +- Hold `CTRL/ESC` to use as `CTRL`. + +## Activate N-rollover + +- Hold left `SHIFT` and right `SHIRT` and then tap `N`. diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex new file mode 100644 index 0000000000000000000000000000000000000000..80ae0751b187e689985a20291b5fe133ded2d942 GIT binary patch literal 51175 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%0D|~$M{ZiknaQc_RgU?@u2cPr(UECniQ#He9v>wZn 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