commit
						ec67d32bd4
					
				| @ -0,0 +1,89 @@ | |||||||
|  | // This is the personal keymap of Ian Sterling (@xyverz). It is based on the keymap by
 | ||||||
|  | // Chris Gerber (@gerbercj), with the addition of persistent layers like the Planck and
 | ||||||
|  | // Preonic keyboards by Jack Humbert.
 | ||||||
|  | 
 | ||||||
|  | #include "atreus.h" | ||||||
|  | #include "action_layer.h" | ||||||
|  | #include "eeconfig.h" | ||||||
|  | 
 | ||||||
|  | extern keymap_config_t keymap_config; | ||||||
|  | 
 | ||||||
|  | // 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 _DV 0 | ||||||
|  | #define _QW 1 | ||||||
|  | #define _CM 2 | ||||||
|  | #define _L1 3 | ||||||
|  | #define _L2 4 | ||||||
|  | 
 | ||||||
|  | // Macro name shortcuts
 | ||||||
|  | #define DVORAK M(_DV) | ||||||
|  | #define QWERTY M(_QW) | ||||||
|  | #define COLEMAK M(_CM) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|  |   [_DV] = { /* Dvorak */ | ||||||
|  |     {KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_NO,   KC_F,    KC_G,    KC_C,    KC_R,    KC_L   }, | ||||||
|  |     {KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_NO,   KC_D,    KC_H,    KC_T,    KC_N,    KC_S   }, | ||||||
|  |     {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_DEL),  KC_B,  KC_M,  KC_W,  KC_V,   SFT_T(KC_Z) }, | ||||||
|  |     {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_EQL} | ||||||
|  |   }, | ||||||
|  |   [_QW] = { /* Qwerty */ | ||||||
|  |     {KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_NO,   KC_Y,    KC_U,    KC_I,    KC_O,    KC_P   }, | ||||||
|  |     {KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_NO,   KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN}, | ||||||
|  |     {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)  }, | ||||||
|  |     {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} | ||||||
|  |   }, | ||||||
|  |   [_CM] = { /* Colemak */ | ||||||
|  |     {KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_NO,   KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN}, | ||||||
|  |     {KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_NO,   KC_H,    KC_N,    KC_E,    KC_I,    KC_O   }, | ||||||
|  |     {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)  }, | ||||||
|  |     {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} | ||||||
|  |   }, | ||||||
|  |   [_L1] = { /* LAYER 1 */ | ||||||
|  |     {KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_NO,   KC_6,    KC_7,    KC_8,    KC_9,    KC_0   }, | ||||||
|  |     {KC_TAB,  KC_INS,  KC_UP,   KC_DEL,  KC_HOME, KC_NO,   KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_EQL }, | ||||||
|  |     {KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, | ||||||
|  |     {KC_TRNS, KC_GRV,  KC_LGUI, KC_TRNS, KC_DEL,  KC_LALT, KC_SPC,  KC_TRNS, KC_LBRC, KC_RBRC, KC_ENT } | ||||||
|  |   }, | ||||||
|  |   [_L2] = { /* LAYER 2 */ | ||||||
|  |     {KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_NO,   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN}, | ||||||
|  |     {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_NO,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10 }, | ||||||
|  |     {KC_TRNS, KC_TRNS, DVORAK,  QWERTY,  COLEMAK, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11,  KC_F12 }, | ||||||
|  |     {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC,  KC_TRNS, KC_TRNS, KC_TRNS, RESET  } | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM fn_actions[] = { | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void persistant_default_layer_set(uint16_t default_layer) { | ||||||
|  |   eeconfig_update_default_layer(default_layer); | ||||||
|  |   default_layer_set(default_layer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||||
|  | { | ||||||
|  |       switch(id) { | ||||||
|  |         case _DV: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             persistant_default_layer_set(1UL<<_DV); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _QW: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             persistant_default_layer_set(1UL<<_QW); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _CM: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             persistant_default_layer_set(1UL<<_CM); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |       } | ||||||
|  |     return MACRO_NONE; | ||||||
|  | }; | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | # skullY's Clueboard Layout | ||||||
|  | 
 | ||||||
|  | This layout is what I (@skullydazed) use on my personal Clueboards. I mostly use it for programming, CAD, and general typing. | ||||||
|  | 
 | ||||||
|  | The most notable change from the default layout is putting Ctrl on the Capslock key. I also swap Alt and Cmd because I mostly use a Mac day to day. | ||||||
| @ -1,4 +1,97 @@ | |||||||
| Clueboard keyboard firmware | Clueboard keyboard firmware | ||||||
| ====================== | ====================== | ||||||
| 
 | 
 | ||||||
| TODO: to be updated. | DIY/Assembled compact 66% keyboard by [Clueboard](http://clueboard.co). | ||||||
|  | 
 | ||||||
|  | For the full Quantum Mechanical Keyboard feature list, see [the parent readme.md](/readme.md). | ||||||
|  | 
 | ||||||
|  | ## First Time Setup | ||||||
|  | 
 | ||||||
|  | Download or clone the whole firmware and navigate to the keyboards/clueboard directory. Once your dev env is setup, you'll be able to generate the default .hex: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You will see a lot of output and if everything worked correctly you will see something similar to this: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | Size after: | ||||||
|  |    text	   data	    bss	    dec	    hex	filename | ||||||
|  |       0	  19992	      0	  19992	   4e18	clueboard_rev2_default.hex | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | At this point you can press RESET on your Clueboard and flash your keyboard with this command: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make dfu | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | If you would like to use one of the alternative keymaps, or create your own, see below. | ||||||
|  | 
 | ||||||
|  | ## Clueboard 1.0 | ||||||
|  | 
 | ||||||
|  | If you have a first generation Clueboard (one with a black PCB) you will need to use the revision 1 code. To do so add `SUBPROJECT=rev1` to your make command, like this: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make SUBPROJECT=rev1 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And when flashing your keyboard: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make SUBPROJECT=rev1 dfu | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | If you are flashing an alternative layout to your rev1, include both `SUBPROJECT=rev1` and `KEYMAP=<keymap>` in your command, for example when flashing max: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make SUBPROJECT=rev1 KEYMAP=max dfu | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Alternate Keymaps | ||||||
|  | 
 | ||||||
|  | There are many alternative and user-contributed layouts available in the [keymaps/](keymaps/) directory. To compile and flash an alternative you will want to add `KEYMAP=<keymap>` to your command: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make KEYMAP=skully | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And when flashing your keyboard, put `KEYMAP=<keymap>` between "make" and "dfu": | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make KEYMAP=skully dfu | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Notable Layouts | ||||||
|  | 
 | ||||||
|  | These layouts are notable for one reason or another. If you are looking for ideas or inspiration you should look at these first: | ||||||
|  | 
 | ||||||
|  | * [keymaps/default](keymaps/default) - The default Clueboard layout | ||||||
|  | * [keymaps/max](keymaps/max) - A maximised layout that makes use of every key and feature of the Clueboard 2.0 PCB. | ||||||
|  | * [keymaps/skully](keymaps/skully) - The layout that @skullydazed uses on his own Clueboards. | ||||||
|  | 
 | ||||||
|  | ## Create Your Own Keymap | ||||||
|  | 
 | ||||||
|  | There are a lot of possibilities when creating your own keymap, and the primary documentation for doing that is [Customizing Your Keymap](/readme.md##customizing-your-keymap) in the main readme.md. As a way to get started, here is the procedure I recommend: | ||||||
|  | 
 | ||||||
|  | * Copy `[keymaps/default](keymaps/default/)` to `keymaps/<your_layout>`. | ||||||
|  | * Compile the firmware (`$ make KEYMAP=<your_layout>`) | ||||||
|  | * Flash the firmware (`$ make KEYMAP=<your_layout> dfu`) | ||||||
|  | * Make sure everything works like the default keyboard | ||||||
|  | * Modify `keymaps/<your_layout>/readme.md` to tell others about your layout. | ||||||
|  | * Modify `keymaps/<your_layout>/keymap.c` to reflect your desired layout. | ||||||
|  | * Compile your new custom firmware (`$ make KEYMAP=<your_layout>`) | ||||||
|  | ** If you have warnings you may flash without fixing them, but something may not work right. | ||||||
|  | ** If you have any errors you must fix them before continuing. | ||||||
|  | * Flash the firmware (`$ make KEYMAP=<your_layout> dfu`) | ||||||
|  | 
 | ||||||
|  | ## Share Your Keymap | ||||||
|  | 
 | ||||||
|  | Got your layout dialed in? Please share it with the world so we can benefit from your work! Simply submit a pull request with your layout and we'll include it in the official repository. Please use the following guidelines when putting together your pull request: | ||||||
|  | 
 | ||||||
|  | * Include a readme.md that states what your primary keyboard use is, how your layout differs from the default, and highlights anything you think makes your layout particularly great. | ||||||
|  | * If your layout requires certain features (EG, RGB underlight or backlighting) ensure you have a Makefile and config.h that reflects that | ||||||
|  | * If your layout requires special hardware to be added, please describe that in the readme.md | ||||||
|  | 
 | ||||||
|  | TODO: Write up or link quick how-to on creating and submitting a PR. (Pull requests accepted. :) | ||||||
|  | |||||||
| @ -1,63 +0,0 @@ | |||||||
| #include "clueboard2.h" |  | ||||||
| 
 |  | ||||||
| void matrix_init_kb(void) { |  | ||||||
| 	// put your keyboard start-up code here
 |  | ||||||
| 	// runs once when the firmware starts up
 |  | ||||||
| 	matrix_init_user(); |  | ||||||
| 	led_init_ports(); |  | ||||||
| 
 |  | ||||||
|     // JTAG disable for PORT F. write JTD bit twice within four cycles.
 |  | ||||||
|     MCUCR |= (1<<JTD); |  | ||||||
|     MCUCR |= (1<<JTD); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| void led_init_ports() { |  | ||||||
|     // * Set our LED pins as output
 |  | ||||||
|     DDRB |= (1<<4); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void led_set_kb(uint8_t usb_led) { |  | ||||||
|     if (usb_led & (1<<USB_LED_CAPS_LOCK)) { |  | ||||||
|         // Turn capslock on
 |  | ||||||
|         PORTB |= (1<<4); |  | ||||||
|     } else { |  | ||||||
|         // Turn capslock off
 |  | ||||||
|         PORTB &= ~(1<<4); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* 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 backlight_init_ports(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
 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -0,0 +1,98 @@ | |||||||
|  | #include "cluecard.h" | ||||||
|  | #define BL_RED OCR1B | ||||||
|  | #define BL_GREEN OCR1A | ||||||
|  | #define BL_BLUE OCR1C | ||||||
|  | 
 | ||||||
|  | void matrix_init_kb(void) { | ||||||
|  | 	// put your keyboard start-up code here
 | ||||||
|  | 	// runs once when the firmware starts up
 | ||||||
|  | 
 | ||||||
|  | 	matrix_init_user(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void matrix_scan_kb(void) { | ||||||
|  | 	// put your looping keyboard code here
 | ||||||
|  | 	// runs every cycle (a lot)
 | ||||||
|  | 
 | ||||||
|  | 	matrix_scan_user(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | ||||||
|  | 	// put your per-action keyboard code here
 | ||||||
|  | 	// runs for every action, just before processing by the firmware
 | ||||||
|  | 
 | ||||||
|  | 	return process_record_user(keycode, record); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void led_set_kb(uint8_t usb_led) { | ||||||
|  | 	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
 | ||||||
|  | 
 | ||||||
|  | 	led_set_user(usb_led); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void backlight_init_ports(void) | ||||||
|  | { | ||||||
|  | 	// Set B5, B6, and B7 as output
 | ||||||
|  | 	DDRB |= (1<<7)|(1<<6)|(1<<5); | ||||||
|  | 
 | ||||||
|  | 	// Setup PWM
 | ||||||
|  | 	ICR1 = 0xFFFF; | ||||||
|  | 	TCCR1A = 0b10101010; | ||||||
|  | 	TCCR1B = 0b00011001; | ||||||
|  | 
 | ||||||
|  | 	BL_RED = 0xFFFF; | ||||||
|  | 	BL_GREEN = 0xFFFF; | ||||||
|  | 	BL_BLUE = 0xFFFF; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void backlight_set(uint8_t level) | ||||||
|  | { | ||||||
|  | 	// Set the RGB color
 | ||||||
|  | 	switch (level) | ||||||
|  | 	{ | ||||||
|  | 	case 0: | ||||||
|  | 		// Off
 | ||||||
|  | 		BL_RED = 0xFFFF; | ||||||
|  | 		BL_GREEN = 0xFFFF; | ||||||
|  | 		BL_BLUE = 0xFFFF; | ||||||
|  | 		break; | ||||||
|  | 	case 1: | ||||||
|  | 		// Red
 | ||||||
|  | 		BL_RED = 0x0000; | ||||||
|  | 		BL_GREEN = 0xFFFF; | ||||||
|  | 		BL_BLUE = 0xFFFF; | ||||||
|  | 		break; | ||||||
|  | 	case 2: | ||||||
|  | 		// Green
 | ||||||
|  | 		BL_RED = 0xFFFF; | ||||||
|  | 		BL_GREEN = 0x0000; | ||||||
|  | 		BL_BLUE = 0xFFFF; | ||||||
|  | 		break; | ||||||
|  | 	case 3: | ||||||
|  | 		// Blue
 | ||||||
|  | 		BL_RED = 0xFFFF; | ||||||
|  | 		BL_GREEN = 0xFFFF; | ||||||
|  | 		BL_BLUE = 0x0000; | ||||||
|  | 		break; | ||||||
|  | 	case 4: | ||||||
|  | 		// Magenta
 | ||||||
|  | 		BL_RED = 0x4000; | ||||||
|  | 		BL_GREEN = 0x4000; | ||||||
|  | 		BL_BLUE = 0x4000; | ||||||
|  | 		break; | ||||||
|  | 	case 5: | ||||||
|  | 		// Purple
 | ||||||
|  | 		BL_RED = 0x0000; | ||||||
|  | 		BL_GREEN = 0xFFFF; | ||||||
|  | 		BL_BLUE = 0x0000; | ||||||
|  | 		break; | ||||||
|  | 	case 6: | ||||||
|  | 		// Yellow
 | ||||||
|  | 		BL_RED = 0x0000; | ||||||
|  | 		BL_GREEN = 0x0000; | ||||||
|  | 		BL_BLUE = 0xFFFF; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		xprintf("Unknown level: %d\n", level); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | #ifndef CLUECARD_H | ||||||
|  | #define CLUECARD_H | ||||||
|  | 
 | ||||||
|  | #include "quantum.h" | ||||||
|  | 
 | ||||||
|  | // This a shortcut to help you visually see your layout.
 | ||||||
|  | // The first section contains all of the arguements
 | ||||||
|  | // The second converts the arguments into a two-dimensional array
 | ||||||
|  | #define KEYMAP( \ | ||||||
|  | 	k00, k01, k02, \ | ||||||
|  | 	k10, k12, \ | ||||||
|  | 	k20, k21, k22, \ | ||||||
|  | 	k11, \ | ||||||
|  | 	k30, k31, k32 \ | ||||||
|  | ) { \ | ||||||
|  | 	{ k00, k01, k02, }, \ | ||||||
|  | 	{ k10, k11, k12, }, \ | ||||||
|  | 	{ k20, k21, k22, }, \ | ||||||
|  | 	{ k30, k31, k32, } \ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,167 @@ | |||||||
|  | /*
 | ||||||
|  | Copyright 2012 Jun Wako <wakojun@gmail.com> | ||||||
|  | 
 | ||||||
|  | This program is free software: you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation, either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  | 
 | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  | 
 | ||||||
|  | You should have received a copy of the GNU General Public License | ||||||
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #ifndef CONFIG_H | ||||||
|  | #define CONFIG_H | ||||||
|  | 
 | ||||||
|  | #include "config_common.h" | ||||||
|  | 
 | ||||||
|  | /* USB Device descriptor parameter */ | ||||||
|  | #define VENDOR_ID       0xC1ED | ||||||
|  | #define PRODUCT_ID      0x2330 | ||||||
|  | #define DEVICE_VER      0x0001 | ||||||
|  | #define MANUFACTURER    Clueboard | ||||||
|  | #define PRODUCT         ATMEGA32U4 Firmware Dev Kit | ||||||
|  | #define DESCRIPTION     A small board to help you hack on QMK. | ||||||
|  | 
 | ||||||
|  | /* key matrix size */ | ||||||
|  | #define MATRIX_ROWS 4 | ||||||
|  | #define MATRIX_COLS 3 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Keyboard Matrix Assignments | ||||||
|  |  * | ||||||
|  |  * Change this to how you wired your keyboard | ||||||
|  |  * COLS: AVR pins used for columns, left to right | ||||||
|  |  * ROWS: AVR pins used for rows, top to bottom | ||||||
|  |  * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) | ||||||
|  |  *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) | ||||||
|  |  * | ||||||
|  | */ | ||||||
|  | #define MATRIX_ROW_PINS { F0, F5, F4, B4 } | ||||||
|  | #define MATRIX_COL_PINS { F1, F7, F6 } | ||||||
|  | #define UNUSED_PINS | ||||||
|  | 
 | ||||||
|  | /* COL2ROW or ROW2COL */ | ||||||
|  | #define DIODE_DIRECTION ROW2COL | ||||||
|  |   | ||||||
|  | /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ | ||||||
|  | #define DEBOUNCING_DELAY 20 | ||||||
|  | 
 | ||||||
|  | /* define if matrix has ghost (lacks anti-ghosting diodes) */ | ||||||
|  | //#define MATRIX_HAS_GHOST
 | ||||||
|  | 
 | ||||||
|  | /* number of backlight levels */ | ||||||
|  | #define BACKLIGHT_LEVELS 6 | ||||||
|  | 
 | ||||||
|  | /* 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
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Force NKRO | ||||||
|  |  * | ||||||
|  |  * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved | ||||||
|  |  * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the | ||||||
|  |  * makefile for this to work.) | ||||||
|  |  * | ||||||
|  |  * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) | ||||||
|  |  * until the next keyboard reset. | ||||||
|  |  * | ||||||
|  |  * NKRO may prevent your keystrokes from being detected in the BIOS, but it is | ||||||
|  |  * fully operational during normal computer usage. | ||||||
|  |  * | ||||||
|  |  * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) | ||||||
|  |  * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by | ||||||
|  |  * bootmagic, NKRO mode will always be enabled until it is toggled again during a | ||||||
|  |  * power-up. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | //#define FORCE_NKRO
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Magic Key Options | ||||||
|  |  * | ||||||
|  |  * Magic keys are hotkey commands that allow control over firmware functions of | ||||||
|  |  * the keyboard. They are best used in combination with the HID Listen program, | ||||||
|  |  * found here: https://www.pjrc.com/teensy/hid_listen.html
 | ||||||
|  |  * | ||||||
|  |  * The options below allow the magic key functionality to be changed. This is | ||||||
|  |  * useful if your keyboard/keypad is missing keys and you want magic key support. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* key combination for magic key command */ | ||||||
|  | #define IS_COMMAND() ( \ | ||||||
|  | 	keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | /* control how magic key switches layers */ | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS  true
 | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS  true
 | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
 | ||||||
|  | 
 | ||||||
|  | /* override magic key keymap */ | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
 | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
 | ||||||
|  | //#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
 | ||||||
|  | //#define MAGIC_KEY_HELP1          H
 | ||||||
|  | //#define MAGIC_KEY_HELP2          SLASH
 | ||||||
|  | //#define MAGIC_KEY_DEBUG          D
 | ||||||
|  | //#define MAGIC_KEY_DEBUG_MATRIX   X
 | ||||||
|  | //#define MAGIC_KEY_DEBUG_KBD      K
 | ||||||
|  | //#define MAGIC_KEY_DEBUG_MOUSE    M
 | ||||||
|  | //#define MAGIC_KEY_VERSION        V
 | ||||||
|  | //#define MAGIC_KEY_STATUS         S
 | ||||||
|  | //#define MAGIC_KEY_CONSOLE        C
 | ||||||
|  | //#define MAGIC_KEY_LAYER0_ALT1    ESC
 | ||||||
|  | //#define MAGIC_KEY_LAYER0_ALT2    GRAVE
 | ||||||
|  | //#define MAGIC_KEY_LAYER0         0
 | ||||||
|  | //#define MAGIC_KEY_LAYER1         1
 | ||||||
|  | //#define MAGIC_KEY_LAYER2         2
 | ||||||
|  | //#define MAGIC_KEY_LAYER3         3
 | ||||||
|  | //#define MAGIC_KEY_LAYER4         4
 | ||||||
|  | //#define MAGIC_KEY_LAYER5         5
 | ||||||
|  | //#define MAGIC_KEY_LAYER6         6
 | ||||||
|  | //#define MAGIC_KEY_LAYER7         7
 | ||||||
|  | //#define MAGIC_KEY_LAYER8         8
 | ||||||
|  | //#define MAGIC_KEY_LAYER9         9
 | ||||||
|  | //#define MAGIC_KEY_BOOTLOADER     PAUSE
 | ||||||
|  | //#define MAGIC_KEY_LOCK           CAPS
 | ||||||
|  | //#define MAGIC_KEY_EEPROM         E
 | ||||||
|  | //#define MAGIC_KEY_NKRO           N
 | ||||||
|  | //#define MAGIC_KEY_SLEEP_LED      Z
 | ||||||
|  | 
 | ||||||
|  | /* Underlight configuration
 | ||||||
|  |  */ | ||||||
|  | #define RGB_DI_PIN E6 | ||||||
|  | //#define RGBLIGHT_TIMER
 | ||||||
|  | #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
 | ||||||
|  | 
 | ||||||
|  | /* 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 | ||||||
| @ -0,0 +1,21 @@ | |||||||
|  | # Build Options
 | ||||||
|  | #   change to "no" to disable the options, or define them in the Makefile in
 | ||||||
|  | #   the appropriate keymap folder that will get included automatically
 | ||||||
|  | #
 | ||||||
|  | BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000) | ||||||
|  | MOUSEKEY_ENABLE = no       # Mouse keys(+4700) | ||||||
|  | EXTRAKEY_ENABLE = no       # Audio control and System control(+450) | ||||||
|  | CONSOLE_ENABLE = yes         # Console for debug(+400) | ||||||
|  | COMMAND_ENABLE = yes        # Commands for debug and configuration | ||||||
|  | NKRO_ENABLE = yes           # 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 = no            # MIDI controls | ||||||
|  | AUDIO_ENABLE = yes           # Audio output on port C6 | ||||||
|  | UNICODE_ENABLE = no         # Unicode | ||||||
|  | BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID | ||||||
|  | RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight. | ||||||
|  | SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend | ||||||
|  | 
 | ||||||
|  | ifndef QUANTUM_DIR | ||||||
|  | 	include ../../../../Makefile | ||||||
|  | endif | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | #ifndef CONFIG_USER_H | ||||||
|  | #define CONFIG_USER_H | ||||||
|  | 
 | ||||||
|  | #include "../../config.h" | ||||||
|  | 
 | ||||||
|  | // place overrides here
 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,63 @@ | |||||||
|  | #include "cluecard.h" | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | 	#include "audio.h" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|  | 	[0] = KEYMAP( | ||||||
|  | 		RGB_TOG,        RGB_SAI,        RGB_VAI, \ | ||||||
|  | 		        RGB_HUD,        RGB_HUI,         \ | ||||||
|  | 		RGB_MOD,        RGB_SAD,        RGB_VAD, \ | ||||||
|  | 		BL_STEP,                                 \ | ||||||
|  | 		F(0),   F(1),   F(2)                     \ | ||||||
|  | 	) | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | 
 | ||||||
|  | float tone_startup[][2] = SONG(STARTUP_SOUND); | ||||||
|  | float tone_qwerty[][2] = SONG(QWERTY_SOUND); | ||||||
|  | float tone_dvorak[][2] = SONG(DVORAK_SOUND); | ||||||
|  | float tone_colemak[][2] = SONG(COLEMAK_SOUND); | ||||||
|  | float tone_plover[][2] = SONG(PLOVER_SOUND); | ||||||
|  | float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); | ||||||
|  | float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); | ||||||
|  | 
 | ||||||
|  | float tone_goodbye[][2] = SONG(GOODBYE_SOUND); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM fn_actions[] = { | ||||||
|  | 	[0] = ACTION_FUNCTION(0), | ||||||
|  | 	[1] = ACTION_FUNCTION(1), | ||||||
|  | 	[2] = ACTION_FUNCTION(2) | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { | ||||||
|  | 	if (record->event.pressed) { | ||||||
|  | 		switch (id) { | ||||||
|  | 			case 0: | ||||||
|  | 				PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||||||
|  | 				break; | ||||||
|  | 			case 1: | ||||||
|  | 				PLAY_NOTE_ARRAY(music_scale, false, 0); | ||||||
|  | 				break; | ||||||
|  | 			case 2: | ||||||
|  | 				PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void matrix_init_user(void) { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void matrix_scan_user(void) { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void led_set_user(uint8_t usb_led) { | ||||||
|  | } | ||||||
| @ -0,0 +1 @@ | |||||||
|  | # The default keymap for cluecard | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | cluecard keyboard firmware | ||||||
|  | ====================== | ||||||
|  | 
 | ||||||
|  | ## Quantum MK Firmware | ||||||
|  | 
 | ||||||
|  | For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). | ||||||
|  | 
 | ||||||
|  | ## Building | ||||||
|  | 
 | ||||||
|  | Download or clone the whole firmware and navigate to the keyboards/cluecard folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. | ||||||
|  | 
 | ||||||
|  | Depending on which keymap you would like to use, you will have to compile slightly differently. | ||||||
|  | 
 | ||||||
|  | ### Default | ||||||
|  | 
 | ||||||
|  | To build with the default keymap, simply run `make`. | ||||||
|  | 
 | ||||||
|  | ### Other Keymaps | ||||||
|  | 
 | ||||||
|  | Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. | ||||||
|  | 
 | ||||||
|  | To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ make keymap=[default|jack|<name>] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` | ||||||
| @ -0,0 +1,314 @@ | |||||||
|  | // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
 | ||||||
|  | // this is the style you want to emulate.
 | ||||||
|  | 
 | ||||||
|  | #include "planck.h" | ||||||
|  | #include "action_layer.h" | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  |   #include "audio.h" | ||||||
|  | #endif | ||||||
|  | #include "eeconfig.h" | ||||||
|  | 
 | ||||||
|  | extern keymap_config_t keymap_config; | ||||||
|  | 
 | ||||||
|  | // 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 _QWERTY 0 | ||||||
|  | #define _COLEMAK 1 | ||||||
|  | #define _DVORAK 2 | ||||||
|  | #define _LOWER 3 | ||||||
|  | #define _RAISE 4 | ||||||
|  | #define _PLOVER 5 | ||||||
|  | #define _ADJUST 16 | ||||||
|  | 
 | ||||||
|  | enum planck_keycodes { | ||||||
|  |   QWERTY = SAFE_RANGE, | ||||||
|  |   COLEMAK, | ||||||
|  |   DVORAK, | ||||||
|  |   PLOVER, | ||||||
|  |   LOWER, | ||||||
|  |   RAISE, | ||||||
|  |   BACKLIT, | ||||||
|  |   EXT_PLV | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // Fillers to make layering more clear
 | ||||||
|  | #define _______ KC_TRNS | ||||||
|  | #define XXXXXXX KC_NO | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|  | 
 | ||||||
|  | /* Qwerty
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_QWERTY] = { | ||||||
|  |   {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC}, | ||||||
|  |   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, | ||||||
|  |   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, | ||||||
|  |   {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Colemak
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_COLEMAK] = { | ||||||
|  |   {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC}, | ||||||
|  |   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT}, | ||||||
|  |   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, | ||||||
|  |   {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Dvorak
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  |  /   | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  -   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  | Shift| | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Ctrl | Alt  | Left |Right |Lower | Bksp |Space |Raise |  Up  | Down |  GUI |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_DVORAK] = { | ||||||
|  |   {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_SLSH}, | ||||||
|  |   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_MINS}, | ||||||
|  |   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    SFT_T(KC_ENT)}, | ||||||
|  |   {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER,   KC_BSPC, KC_SPC,  RAISE,   KC_UP,   KC_DOWN, KC_RGUI, KC_ENT } | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Lower
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |      | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Caps |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      | Mute | Vol- | Vol+ |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite|      | Home |  End |      |  Del |  Ins |      | PgUp | PgDN |      |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_LOWER] = { | ||||||
|  |   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______}, | ||||||
|  |   {KC_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, | ||||||
|  |   {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_MUTE, KC_VOLD, KC_VOLU, _______, _______}, | ||||||
|  |   {BACKLIT, _______, KC_HOME, KC_END,  _______, KC_DEL,  KC_INS,  _______, KC_PGUP, KC_PGDN, _______, _______} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Raise
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |      | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Caps |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      | Prev | Play | Next |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite|      | Home |  End |      |  Del |  Ins |      | PgUp | PgDN |      |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_RAISE] = { | ||||||
|  |   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    _______}, | ||||||
|  |   {KC_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS}, | ||||||
|  |   {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_MPRV, KC_MPLY, KC_MNXT, _______, _______}, | ||||||
|  |   {BACKLIT, _______, KC_HOME, KC_END,  _______, KC_DEL,  KC_INS,  _______, KC_PGUP, KC_PGDN, _______, _______} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Plover layer (http://opensteno.org)
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | [_PLOVER] = { | ||||||
|  |   {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   }, | ||||||
|  |   {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC}, | ||||||
|  |   {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, | ||||||
|  |   {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Adjust (Lower + Raise)
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |      | Reset|      |      |      |      |      |      |      |      |      |  Del | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * |      |      |      |      |      |             |      |      |      |      |      | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_ADJUST] = { | ||||||
|  |   {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, | ||||||
|  |   {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______}, | ||||||
|  |   {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______}, | ||||||
|  |   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | 
 | ||||||
|  | float tone_startup[][2]    = SONG(STARTUP_SOUND); | ||||||
|  | float tone_qwerty[][2]     = SONG(QWERTY_SOUND); | ||||||
|  | float tone_dvorak[][2]     = SONG(DVORAK_SOUND); | ||||||
|  | float tone_colemak[][2]    = SONG(COLEMAK_SOUND); | ||||||
|  | float tone_plover[][2]     = SONG(PLOVER_SOUND); | ||||||
|  | float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND); | ||||||
|  | float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND); | ||||||
|  | 
 | ||||||
|  | float tone_goodbye[][2] = SONG(GOODBYE_SOUND); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void persistant_default_layer_set(uint16_t default_layer) { | ||||||
|  |   eeconfig_update_default_layer(default_layer); | ||||||
|  |   default_layer_set(default_layer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||||
|  |   switch (keycode) { | ||||||
|  |     case QWERTY: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         #ifdef AUDIO_ENABLE | ||||||
|  |           PLAY_NOTE_ARRAY(tone_qwerty, false, 0); | ||||||
|  |         #endif | ||||||
|  |         persistant_default_layer_set(1UL<<_QWERTY); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case COLEMAK: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         #ifdef AUDIO_ENABLE | ||||||
|  |           PLAY_NOTE_ARRAY(tone_colemak, false, 0); | ||||||
|  |         #endif | ||||||
|  |         persistant_default_layer_set(1UL<<_COLEMAK); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case DVORAK: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         #ifdef AUDIO_ENABLE | ||||||
|  |           PLAY_NOTE_ARRAY(tone_dvorak, false, 0); | ||||||
|  |         #endif | ||||||
|  |         persistant_default_layer_set(1UL<<_DVORAK); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case LOWER: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         layer_on(_LOWER); | ||||||
|  |         update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |       } else { | ||||||
|  |         layer_off(_LOWER); | ||||||
|  |         update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case RAISE: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         layer_on(_RAISE); | ||||||
|  |         update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |       } else { | ||||||
|  |         layer_off(_RAISE); | ||||||
|  |         update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case BACKLIT: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         register_code(KC_RSFT); | ||||||
|  |         #ifdef BACKLIGHT_ENABLE | ||||||
|  |           backlight_step(); | ||||||
|  |         #endif | ||||||
|  |       } else { | ||||||
|  |         unregister_code(KC_RSFT); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case PLOVER: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         #ifdef AUDIO_ENABLE | ||||||
|  |           stop_all_notes(); | ||||||
|  |           PLAY_NOTE_ARRAY(tone_plover, false, 0); | ||||||
|  |         #endif | ||||||
|  |         layer_off(_RAISE); | ||||||
|  |         layer_off(_LOWER); | ||||||
|  |         layer_off(_ADJUST); | ||||||
|  |         layer_on(_PLOVER); | ||||||
|  |         if (!eeconfig_is_enabled()) { | ||||||
|  |             eeconfig_init(); | ||||||
|  |         } | ||||||
|  |         keymap_config.raw = eeconfig_read_keymap(); | ||||||
|  |         keymap_config.nkro = 1; | ||||||
|  |         eeconfig_update_keymap(keymap_config.raw); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |     case EXT_PLV: | ||||||
|  |       if (record->event.pressed) { | ||||||
|  |         #ifdef AUDIO_ENABLE | ||||||
|  |           PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); | ||||||
|  |         #endif | ||||||
|  |         layer_off(_PLOVER); | ||||||
|  |       } | ||||||
|  |       return false; | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void matrix_init_user(void) { | ||||||
|  |     #ifdef AUDIO_ENABLE | ||||||
|  |         startup_user(); | ||||||
|  |     #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | 
 | ||||||
|  | void startup_user() | ||||||
|  | { | ||||||
|  |     _delay_ms(20); // gets rid of tick
 | ||||||
|  |     PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void shutdown_user() | ||||||
|  | { | ||||||
|  |     PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||||||
|  |     _delay_ms(150); | ||||||
|  |     stop_all_notes(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void music_on_user(void) | ||||||
|  | { | ||||||
|  |     music_scale_user(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void music_scale_user(void) | ||||||
|  | { | ||||||
|  |     PLAY_NOTE_ARRAY(music_scale, false, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Build Options
 | ||||||
|  | #   change to "no" to disable the options, or define them in the Makefile in 
 | ||||||
|  | #   the appropriate keymap folder that will get included automatically
 | ||||||
|  | #
 | ||||||
|  | BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000) | ||||||
|  | MOUSEKEY_ENABLE = yes       # Mouse keys(+4700) | ||||||
|  | EXTRAKEY_ENABLE = yes       # Audio control and System control(+450) | ||||||
|  | CONSOLE_ENABLE = no         # Console for debug(+400) | ||||||
|  | COMMAND_ENABLE = yes        # Commands for debug and configuration | ||||||
|  | NKRO_ENABLE = yes            # 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 = no            # MIDI controls | ||||||
|  | AUDIO_ENABLE = yes           # Audio output on port C6 | ||||||
|  | UNICODE_ENABLE = no         # Unicode | ||||||
|  | BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID | ||||||
|  | RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time. | ||||||
|  | 
 | ||||||
|  | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | ||||||
|  | SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend | ||||||
|  | 
 | ||||||
|  | ifndef QUANTUM_DIR | ||||||
|  | 	include ../../../../Makefile | ||||||
|  | endif | ||||||
| @ -0,0 +1,342 @@ | |||||||
|  | #include "preonic.h" | ||||||
|  | #include "action_layer.h" | ||||||
|  | #include "eeconfig.h" | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  |   #include "audio.h" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // 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 _QWERTY 0 | ||||||
|  | #define _COLEMAK 1 | ||||||
|  | #define _DVORAK 2 | ||||||
|  | #define _LOWER 3 | ||||||
|  | #define _RAISE 4 | ||||||
|  | #define _MUSIC 5 | ||||||
|  | #define _ADJUST 16 | ||||||
|  | 
 | ||||||
|  | // Macro name shortcuts
 | ||||||
|  | #define QWERTY M(_QWERTY) | ||||||
|  | #define COLEMAK M(_COLEMAK) | ||||||
|  | #define DVORAK M(_DVORAK) | ||||||
|  | #define LOWER M(_LOWER) | ||||||
|  | #define RAISE M(_RAISE) | ||||||
|  | #define M_BL 5 | ||||||
|  | #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) | ||||||
|  | 
 | ||||||
|  | // Fillers to make layering more clear
 | ||||||
|  | #define _______ KC_TRNS | ||||||
|  | #define XXXXXXX KC_NO | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|  | 
 | ||||||
|  | /* Qwerty
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * | Esc  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Del  | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * |  -   |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | Shift| | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Ctrl |  Alt | Left |Right |Lower |    Space    |Raise |  Up  | Down |  GUI |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_QWERTY] = { | ||||||
|  |   {KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, | ||||||
|  |   {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL}, | ||||||
|  |   {KC_MINS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT}, | ||||||
|  |   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT}, | ||||||
|  |   {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_UP,   KC_DOWN, KC_RGUI, KC_ENT } | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Colemak
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Del  | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_COLEMAK] = { | ||||||
|  |   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, | ||||||
|  |   {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_DEL}, | ||||||
|  |   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT}, | ||||||
|  |   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT }, | ||||||
|  |   {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Dvorak
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * | Esc  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  |  /   | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  -   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  | Shift| | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Ctrl | Alt  | Left |Right |Lower |    Space    |Raise |  Up  | Down |  GUI |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_DVORAK] = { | ||||||
|  |   {KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, | ||||||
|  |   {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_SLSH}, | ||||||
|  |   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_MINS}, | ||||||
|  |   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_RSFT}, | ||||||
|  |   {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_UP,   KC_DOWN, KC_RGUI, KC_ENT } | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Lower
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Caps |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      | Mute | Vol- | Vol+ |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite|      | Home |  End |      |     Ins     |      | PgUp | PgDN |      |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_LOWER] = { | ||||||
|  |   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, | ||||||
|  |   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, | ||||||
|  |   {KC_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, | ||||||
|  |   {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_MUTE, KC_VOLD, KC_VOLU, _______, _______}, | ||||||
|  |   {M(M_BL), _______, KC_HOME, KC_END,  _______, KC_INS,  KC_INS,  _______, KC_PGUP, KC_PGDN, _______, _______} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Raise
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * | Caps |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      | Prev | Play | Next |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * | Brite|      | Home |  End |      |     Ins     |      | PgUp | PgDN |      |Enter | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_RAISE] = { | ||||||
|  |   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC}, | ||||||
|  |   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, | ||||||
|  |   {KC_CAPS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS}, | ||||||
|  |   {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_MPRV, KC_MPLY, KC_MNXT, _______, _______}, | ||||||
|  |   {M(M_BL), _______, KC_HOME, KC_END,  _______, KC_INS,  KC_INS,  _______, KC_PGUP, KC_PGDN, _______, _______} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Music (reserved for process_action_user)
 | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | [_MUSIC] = { | ||||||
|  |   {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, | ||||||
|  |   {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, | ||||||
|  |   {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, | ||||||
|  |   {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, | ||||||
|  |   {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER,   XXXXXXX, XXXXXXX, RAISE,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} | ||||||
|  | }, | ||||||
|  | 
 | ||||||
|  | /* Adjust (Lower + Raise)
 | ||||||
|  |  * ,-----------------------------------------------------------------------------------. | ||||||
|  |  * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * |      | Reset|      |      |      |      |      |      |      |      |      |  Del | | ||||||
|  |  * |------+------+------+------+------+-------------+------+------+------+------+------| | ||||||
|  |  * |      |      |      |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      | | ||||||
|  |  * |------+------+------+------+------+------|------+------+------+------+------+------| | ||||||
|  |  * |      |Voice-|Voice+|Musoff|Mus on|      |      |      |      |      |      |      | | ||||||
|  |  * |------+------+------+------+------+------+------+------+------+------+------+------| | ||||||
|  |  * |      |      |      |      |      |             |      |      |      |      |      | | ||||||
|  |  * `-----------------------------------------------------------------------------------' | ||||||
|  |  */ | ||||||
|  | [_ADJUST] = { | ||||||
|  |   {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12}, | ||||||
|  |   {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, | ||||||
|  |   {_______, _______, _______, AUD_ON,  AUD_OFF, AG_NORM, AG_SWAP,  QWERTY, COLEMAK, DVORAK,  _______, _______}, | ||||||
|  |   {_______, VC_DE,   VC_IN,   MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, | ||||||
|  |   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM fn_actions[] = { | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | float start_up[][2] = { | ||||||
|  |   {440.0*pow(2.0,(14)/12.0), 20}, | ||||||
|  |   {440.0*pow(2.0,(26)/12.0), 8}, | ||||||
|  |   {440.0*pow(2.0,(18)/12.0), 20}, | ||||||
|  |   {440.0*pow(2.0,(26)/12.0), 8} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | float tone_qwerty[][2]     = SONG(QWERTY_SOUND); | ||||||
|  | float tone_dvorak[][2]     = SONG(DVORAK_SOUND); | ||||||
|  | float tone_colemak[][2]    = SONG(COLEMAK_SOUND); | ||||||
|  | 
 | ||||||
|  | float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); | ||||||
|  | float goodbye[][2] = SONG(GOODBYE_SOUND); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | void persistant_default_layer_set(uint16_t default_layer) { | ||||||
|  |   eeconfig_update_default_layer(default_layer); | ||||||
|  |   default_layer_set(default_layer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||||
|  | { | ||||||
|  |       switch(id) { | ||||||
|  |         case _QWERTY: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               PLAY_NOTE_ARRAY(tone_qwerty, false, 0); | ||||||
|  |             #endif | ||||||
|  |             persistant_default_layer_set(1UL<<_QWERTY); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _COLEMAK: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               PLAY_NOTE_ARRAY(tone_colemak, false, 0); | ||||||
|  |             #endif | ||||||
|  |             persistant_default_layer_set(1UL<<_COLEMAK); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _DVORAK: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               PLAY_NOTE_ARRAY(tone_dvorak, false, 0); | ||||||
|  |             #endif | ||||||
|  |             persistant_default_layer_set(1UL<<_DVORAK); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _LOWER: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             layer_on(_LOWER); | ||||||
|  |             update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |           } else { | ||||||
|  |             layer_off(_LOWER); | ||||||
|  |             update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case _RAISE: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             layer_on(_RAISE); | ||||||
|  |             update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |           } else { | ||||||
|  |             layer_off(_RAISE); | ||||||
|  |             update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case M_BL: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             register_code(KC_RSFT); | ||||||
|  |             #ifdef BACKLIGHT_ENABLE | ||||||
|  |               backlight_step(); | ||||||
|  |             #endif | ||||||
|  |           } else { | ||||||
|  |             unregister_code(KC_RSFT); | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 6: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               audio_off(); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 7: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               audio_on(); | ||||||
|  |               PLAY_NOTE_ARRAY(start_up, false, 0); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 8: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               layer_off(_MUSIC); | ||||||
|  |               stop_all_notes(); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 9: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               PLAY_NOTE_ARRAY(music_scale, false, 0); | ||||||
|  |               layer_on(_MUSIC); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 10: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               voice_iterate(); | ||||||
|  |               PLAY_NOTE_ARRAY(music_scale, false, 0); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |         case 11: | ||||||
|  |           if (record->event.pressed) { | ||||||
|  |             #ifdef AUDIO_ENABLE | ||||||
|  |               voice_deiterate(); | ||||||
|  |               PLAY_NOTE_ARRAY(music_scale, false, 0); | ||||||
|  |             #endif | ||||||
|  |           } | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     return MACRO_NONE; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void matrix_init_user(void) { | ||||||
|  |   #ifdef AUDIO_ENABLE | ||||||
|  |     _delay_ms(20); // gets rid of tick
 | ||||||
|  |     PLAY_NOTE_ARRAY(start_up, false, 0); | ||||||
|  |   #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef AUDIO_ENABLE | ||||||
|  | 
 | ||||||
|  | uint8_t starting_note = 0x0C; | ||||||
|  | int offset = 7; | ||||||
|  | 
 | ||||||
|  | void process_action_user(keyrecord_t *record) { | ||||||
|  | 
 | ||||||
|  |   if (IS_LAYER_ON(_MUSIC)) { | ||||||
|  |     if (record->event.pressed) { | ||||||
|  |         play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); | ||||||
|  |     } else { | ||||||
|  |         stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void play_goodbye_tone() | ||||||
|  | { | ||||||
|  |   PLAY_NOTE_ARRAY(goodbye, false, 0); | ||||||
|  |   _delay_ms(150); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1 @@ | |||||||
|  | AUDIO_ENABLE = yes | ||||||
					Loading…
					
					
				
		Reference in new issue
	
	 Joshua T
						Joshua T