[Keyboard] Added DMOTE (#6087)
	
		
	
				
					
				
			* Added DMOTE as a variant of the Dactyl-ManuForm, with slight changes to prior code organization to reflect differences.pull/6091/head
							parent
							
								
									29c7fa6efc
								
							
						
					
					
						commit
						983613c88d
					
				| @ -0,0 +1,5 @@ | |||||||
|  | #include "62key.h" | ||||||
|  | 
 | ||||||
|  | void matrix_init_kb(void) { | ||||||
|  | 	matrix_init_user(); | ||||||
|  | }; | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "dactyl_manuform.h" | ||||||
|  | #include "quantum.h" | ||||||
|  | 
 | ||||||
|  | #ifdef USE_I2C | ||||||
|  | #include <stddef.h> | ||||||
|  | #ifdef __AVR__ | ||||||
|  |   #include <avr/io.h> | ||||||
|  |   #include <avr/interrupt.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // This uses the same coordinate system as the program that defines
 | ||||||
|  | // the case model, but not the same coordinates.
 | ||||||
|  | // Numbers increase going to the right and away from the user on the
 | ||||||
|  | // right-hand side of the keyboard. This is mirrored for the
 | ||||||
|  | // left-hand side.
 | ||||||
|  | // The matrix is constructed for ease of soldering, with the columns
 | ||||||
|  | // of the thumb cluster extending along the sides of the finger
 | ||||||
|  | // cluster so that everything can be contained in a 6x6 pattern.
 | ||||||
|  | 
 | ||||||
|  | #define LAYOUT_62key( \ | ||||||
|  |     LA_20, LA_10, LF_35, LF_25, LF_15, LF_05,            \ | ||||||
|  |     LF_55, LF_45, LF_34, LF_24, LF_14, LF_04,            \ | ||||||
|  |     LF_54, LF_44, LF_33, LF_23, LF_13, LF_03,            \ | ||||||
|  |     LF_53, LF_43, LF_32, LF_22, LF_12,                   \ | ||||||
|  |                          LF_21,        LT_21, LT_22,     \ | ||||||
|  |                                     LT_10, LT_11, LT_12, \ | ||||||
|  |                                        LT_01, LT_02,     \ | ||||||
|  |                                                          \ | ||||||
|  |            RF_05, RF_15, RF_25, RF_35, RA_10, RA_20,     \ | ||||||
|  |            RF_04, RF_14, RF_24, RF_34, RF_45, RF_55,     \ | ||||||
|  |            RF_03, RF_13, RF_23, RF_33, RF_44, RF_54,     \ | ||||||
|  |                   RF_12, RF_22, RF_32, RF_43, RF_53,     \ | ||||||
|  |        RT_22, RT_21,     RF_21,                          \ | ||||||
|  |     RT_12, RT_11, RT_10,                                 \ | ||||||
|  |        RT_02, RT_01                                      \ | ||||||
|  |   ) \ | ||||||
|  |   { \ | ||||||
|  |     { LA_20, LA_10, LF_35, LF_25, LF_15, LF_05 }, \ | ||||||
|  |     { LF_55, LF_45, LF_34, LF_24, LF_14, LF_04 }, \ | ||||||
|  |     { LF_54, LF_44, LF_33, LF_23, LF_13, LF_03 }, \ | ||||||
|  |     { LF_53, LF_43, LF_32, LF_22, LF_12, LT_22 }, \ | ||||||
|  |     { KC_NO, KC_NO, LT_21, LF_21, LT_11, LT_12 }, \ | ||||||
|  |     { KC_NO, KC_NO, LT_10, KC_NO, LT_01, LT_02 }, \ | ||||||
|  |                                                   \ | ||||||
|  |     { RA_20, RA_10, RF_35, RF_25, RF_15, RF_05 }, \ | ||||||
|  |     { RF_55, RF_45, RF_34, RF_24, RF_14, RF_04 }, \ | ||||||
|  |     { RF_54, RF_44, RF_33, RF_23, RF_13, RF_03 }, \ | ||||||
|  |     { RF_53, RF_43, RF_32, RF_22, RF_12, RT_22 }, \ | ||||||
|  |     { KC_NO, KC_NO, RT_21, RF_21, RT_11, RT_12 }, \ | ||||||
|  |     { KC_NO, KC_NO, RT_10, KC_NO, RT_01, RT_02 }, \ | ||||||
|  |   } | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "config_common.h" | ||||||
|  | 
 | ||||||
|  | #define PRODUCT  DMOTE (62-key) | ||||||
|  | #define MATRIX_ROWS 12 | ||||||
|  | #define MATRIX_COLS 6 | ||||||
|  | 
 | ||||||
|  | // MCUs are flipped on each side, relative to the shape of the case,
 | ||||||
|  | // but for ease of mounting, the pinout is not flipped with the controller.
 | ||||||
|  | // The same finger on each hand uses a column connected to the pin with the
 | ||||||
|  | // same silk-screen label on each Pro Micro.
 | ||||||
|  | 
 | ||||||
|  | // Pin use:
 | ||||||
|  | //
 | ||||||
|  | //  MCU | Silk | DMOTE
 | ||||||
|  | // -----+------+----------
 | ||||||
|  | //   D3 | TX0  |
 | ||||||
|  | //   D2 | RX1  |
 | ||||||
|  | //   D1 | 2    | LED strip input (dominant half only)
 | ||||||
|  | //   D0 | 3    | Serial interface between halves
 | ||||||
|  | //   D4 | 4    | Outermost pinky-finger column
 | ||||||
|  | //   C6 | 5    | Column
 | ||||||
|  | //   D7 | 6    | Column
 | ||||||
|  | //   E6 | 7    | Column
 | ||||||
|  | //   B4 | 8    | Column
 | ||||||
|  | //   B5 | 9    | Outermost index-finger column
 | ||||||
|  | // -----+------+----------
 | ||||||
|  | //   F4 | A3   |
 | ||||||
|  | //   F5 | A2   |
 | ||||||
|  | //   F6 | A1   | Top row (furthest from user)
 | ||||||
|  | //   F7 | A0   | Row
 | ||||||
|  | //   B1 | 15   | Row
 | ||||||
|  | //   B3 | 14   | Row
 | ||||||
|  | //   B2 | 16   | Row
 | ||||||
|  | //   B6 | 10   | Bottom row (closest to user)
 | ||||||
|  | #define MATRIX_ROW_PINS { F6, F7, B1, B3, B2, B6 } | ||||||
|  | #define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 } | ||||||
|  | 
 | ||||||
|  | // WS2812 RGB LED, normally used to indicate keyboard state:
 | ||||||
|  | #define RGBLIGHT_EFFECT_KNIGHT | ||||||
|  | #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 | ||||||
|  | #define RGBLIGHT_EFFECT_CHRISTMAS | ||||||
|  | #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 | ||||||
|  | #define RGB_DI_PIN D1 | ||||||
|  | #define RGBLED_NUM 6           // Used when chaining strips
 | ||||||
|  | #define RGBLED_SPLIT { 3, 3 }  // Used when not chaining strips
 | ||||||
|  | #define ws2812_PORTREG  PORTD | ||||||
|  | #define ws2812_DDRREG   DDRD | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #define USE_SERIAL | ||||||
|  | 
 | ||||||
|  | #define EE_HANDS | ||||||
| @ -0,0 +1,146 @@ | |||||||
|  | #include "62key.h" | ||||||
|  | #include "rgblight.h" | ||||||
|  | #include <keymap_colemak.h> | ||||||
|  | #include <sendstring_colemak.h> | ||||||
|  | 
 | ||||||
|  | extern keymap_config_t keymap_config; | ||||||
|  | 
 | ||||||
|  | // Automatic Layer ID:
 | ||||||
|  | enum layer_names { | ||||||
|  |     _QWERTY,   // OS-side Colemak. Default.
 | ||||||
|  |     _COLEMAK,  // Keyboard-side Colemak. Portability, emergency.
 | ||||||
|  |     _NUMERIC | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // Shorthand:
 | ||||||
|  | #define LAYER_N MO(_NUMERIC) | ||||||
|  | #define LAYER_C TG(_COLEMAK) | ||||||
|  | #define PASTE LSFT(KC_INS)  // Terminal-compatible paste.
 | ||||||
|  | #define SLQ RALT(KC_9)  // Single left-side quotation mark (in Colemak).
 | ||||||
|  | #define SRQ RALT(KC_0) | ||||||
|  | #define EMDASH RALT(LSFT(KC_MINUS))  // Em dash character (in Colemak).
 | ||||||
|  | #define BK_LCTL CTL_T(KC_LBRACKET) | ||||||
|  | #define BK_RCTL RCTL_T(KC_RBRACKET) | ||||||
|  | // TODO: Mod-tap ALT with a curvilinear brace.
 | ||||||
|  | // https://github.com/qmk/qmk_firmware/pull/2055
 | ||||||
|  | 
 | ||||||
|  | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||||
|  | 
 | ||||||
|  | [_QWERTY] = LAYOUT_62key( | ||||||
|  |     KC_VOLD, KC_VOLU, CM_W,    CM_F,    CM_P,    CM_G, | ||||||
|  |     KC_TAB,  CM_Q,    CM_R,    CM_S,    CM_T,    CM_D, | ||||||
|  |     KC_BSPC, CM_A,    CM_X,    CM_C,    CM_V,    CM_B, | ||||||
|  |     SLQ,     CM_Z,    KC_HOME, KC_PGUP, KC_END, | ||||||
|  |                                KC_PGDN,          KC_ENT,  KC_SPC, | ||||||
|  |                                              KC_LSPO, KC_LGUI, KC_MINS, | ||||||
|  |                                                  BK_LCTL, KC_LALT, | ||||||
|  | 
 | ||||||
|  |                  CM_J,    CM_L,    CM_U,    CM_Y,    KC_MPLY, KC_MUTE, | ||||||
|  |                  CM_H,    CM_N,    CM_E,    CM_I,    CM_SCLN, KC_BSLS, | ||||||
|  |                  CM_K,    CM_M,    KC_COMM, KC_DOT,  CM_O,    KC_QUOT, | ||||||
|  |                           KC_LEFT, KC_UP,   KC_RGHT, KC_SLSH, SRQ, | ||||||
|  |         KC_DEL,  KC_ESC,           KC_DOWN, | ||||||
|  |     KC_EQL,  LAYER_N, KC_RSPC, | ||||||
|  |         KC_RALT, BK_RCTL | ||||||
|  | ), | ||||||
|  | 
 | ||||||
|  | [_COLEMAK] = LAYOUT_62key( | ||||||
|  |     _______, _______, KC_W,    KC_F,    KC_P,    KC_G, | ||||||
|  |     _______, KC_Q,    KC_R,    KC_S,    KC_T,    KC_D, | ||||||
|  |     _______, KC_A,    KC_X,    KC_C,    KC_V,    KC_B, | ||||||
|  |     _______, KC_Z,    _______, _______, _______, | ||||||
|  |                                _______,          _______, _______, | ||||||
|  |                                              _______, _______, _______, | ||||||
|  |                                                  _______, _______, | ||||||
|  | 
 | ||||||
|  |                  KC_J,    KC_L,    KC_U,    KC_Y,    _______, _______, | ||||||
|  |                  KC_H,    KC_N,    KC_E,    KC_I,    KC_SCLN, _______, | ||||||
|  |                  KC_K,    KC_M,    _______, _______, KC_O,    _______, | ||||||
|  |                           _______, _______, _______, _______, _______, | ||||||
|  |         _______, _______,          _______, | ||||||
|  |     _______, _______, _______, | ||||||
|  |         _______, _______ | ||||||
|  | ), | ||||||
|  | 
 | ||||||
|  | [_NUMERIC] = LAYOUT_62key( | ||||||
|  |     LAYER_C, KC_INS,  KC_F2,   KC_F3,   KC_F4,   KC_F5, | ||||||
|  |     KC_F12,  KC_F1,   KC_2,    KC_3,    KC_4,    KC_5, | ||||||
|  |     _______, KC_1,    KC_AT,   KC_HASH, KC_DLR,  KC_PERC, | ||||||
|  |     KC_GRV,  KC_EXLM, KC_BTN1, KC_WH_U, KC_BTN2, | ||||||
|  |                                KC_WH_D,          RGB_MOD, _______, | ||||||
|  |                                              _______, _______, EMDASH, | ||||||
|  |                                                  _______, _______, | ||||||
|  | 
 | ||||||
|  |                  KC_F6,   KC_F7,   KC_F8,   KC_F9,   RESET,   KC_WAKE, // *
 | ||||||
|  |                  KC_6,    KC_7,    KC_8,    KC_9,    KC_F10,  KC_F11, | ||||||
|  |                  KC_CIRC, KC_AMPR, KC_ASTR, KC_APP,  KC_0,    PASTE, | ||||||
|  |                           KC_MS_L, KC_MS_U, KC_MS_R, KC_PSCR, RGB_TOG, | ||||||
|  |         KC_ACL1, KC_ACL2,          KC_MS_D, | ||||||
|  |     KC_ACL0, _______, _______, | ||||||
|  |         _______, _______ | ||||||
|  | ) | ||||||
|  | }; | ||||||
|  | // *KC_WAKE: Used in place of KC_SLEP because X11 with i3 on prerelease
 | ||||||
|  | //  Debian 10 was seeing duplicate keypress and release events for sleep
 | ||||||
|  | //  (regardless of i3 binding), which ruined the function.
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | The rest is all about lighting control. | ||||||
|  | The logic here represents a pretty poor compromise solution between the | ||||||
|  | following concerns: | ||||||
|  | 
 | ||||||
|  | - Feedback on active modifiers. | ||||||
|  | - Flexibility: Both sides of the keyboard are interchangeable. | ||||||
|  | - Regular QMK RBG lighting modes. Specifically, Knight and Xmas. | ||||||
|  | 
 | ||||||
|  | Currently, the last item suffers, because the first two seem to require | ||||||
|  | calling a function that implements the RGBLIGHT_SPLIT_SET_CHANGE_HSVS macro, | ||||||
|  | which most of the rgblight.c functions do not. In particular, functions that | ||||||
|  | target an individual LED do not do so correctly across the wire, so instead | ||||||
|  | we let HSV vary without ever targeting LEDs. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | // How long to wait between animation steps for "Knight" animation:
 | ||||||
|  | const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {255, 200, 100}; | ||||||
|  | 
 | ||||||
|  | bool _initialized = false; | ||||||
|  | bool _leds_dirty = false; | ||||||
|  | 
 | ||||||
|  | void modal_leds(void) { | ||||||
|  |     uint8_t mods = get_mods(); | ||||||
|  |     uint16_t hue = 355;  // Rough match to printed case.
 | ||||||
|  |     uint8_t saturation = 255; | ||||||
|  |     uint8_t value = 0; | ||||||
|  |     if (layer_state_is(_COLEMAK)) { hue -= 50; saturation -= 20; value += 20; }; | ||||||
|  |     if (layer_state_is(_NUMERIC)) { value += 30; }; | ||||||
|  |     if (mods & MOD_MASK_SHIFT) { saturation -= 20; value += 30; }; | ||||||
|  |     if (mods & MOD_MASK_ALT) { hue -= 100; saturation -= 20; value += 30; }; | ||||||
|  |     if (mods & MOD_MASK_CTRL) { hue -= 200; saturation -= 20; value += 30; }; | ||||||
|  |     // rgblight_sethsv_eeprom_helper is not a great API function but it does
 | ||||||
|  |     // affect both halves of a split keyboard.
 | ||||||
|  |     rgblight_sethsv_eeprom_helper(hue, saturation, value, false); | ||||||
|  |     _leds_dirty = false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void matrix_init_user(void) { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void matrix_scan_user(void) { | ||||||
|  |     if (_leds_dirty) { modal_leds(); }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||||
|  |     if (!_initialized) { | ||||||
|  |         // Static lighting is amenable to customization.
 | ||||||
|  |         rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); | ||||||
|  |         _initialized = true; | ||||||
|  |     }; | ||||||
|  |     if (keycode == KC_WAKE) { | ||||||
|  |         // Turn the lights off before going to sleep.
 | ||||||
|  |         rgblight_sethsv_eeprom_helper(0, 0, 0, false); | ||||||
|  |     } else { | ||||||
|  |         _leds_dirty = true; | ||||||
|  |     }; | ||||||
|  |     return true; | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | # Build-process overrides for the DMOTE.
 | ||||||
|  | MOUSEKEY_ENABLE = yes       # Mouse keys(+4700) | ||||||
|  | EXTRAKEY_ENABLE = yes       # Audio control and System control(+450) | ||||||
|  | RGBLIGHT_ENABLE = yes       # Needed for the C linker with lighting control. | ||||||
|  | COMMAND_ENABLE = no         # Not a good combo with Space Cadet shift. | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "config_common.h" | ||||||
					Loading…
					
					
				
		Reference in new issue
	
	 Viktor Eikman
						Viktor Eikman