[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