My userspace and lets_split keymap (#2842)
* copied lets_slit to splinter
* initial splinter layout
* remove unused keymaps
* implemented second half of the keyboard
* initial definition of tap dance
* the tap dance is working now
tap dance for right hand 4c 2r
hold - shift
single tap - n
double tap - ñ
triple tap - Ñ
* clear the keymap.c
* put the tap state on to array
* the n tilde tap dance should produce right shift if hold
* add esc grv tap dance
* remove the defined SS_LSFT on tap_dance.h
because it was added on the quantum.h
* minor cleanup for the keymap
* use the X_* on tap dance
* added super alt tap dance
* use the NO_TAP on tap dance reset
* allow track what rows and cols pressed
* added the RGUI_ALT
* keymap arrangement
* use i2c
* initial rgb
* layer colors
* initial rgb pressed key
* set the layers led
* SUCCESS!!!
* cleaning
* improve shifted layer
* led brightness
* initial caps rainbow
* rename SET_LED_RGB to SET_LED_RGB_HEX
* clean the SET_LED_RGB_HEX and added SET_LED_RGB
* clean format
* caps lock rainbow
* rename key_led to set_key_led
* caps lock rainbow enhanced
* make varibiables static
* change back the loop max value to 360 for the rainbow
* add scroll lock to the rainbow led
* fix pos calculation of right hand board
* add ative keys and make rainbow color can override by key press
* remove the TOTAL_MATRIX_POINTS
* some improvments for the rgb
* call the rgblight_set on the process_record_user
* some enhancement for the leds
* pass the dim value to set_layer_led and limit the brightness on _VL
set the brightness to 2 if the dim value is less than 2 because
their is not enought power for the leds.
* remove the rgb steps on the config
* use the non rev config
* remove all the revisions
* favor i2c instead of serial and remove all the ref for the serial
* clang formatting
* allow to save to eeprom the brightness value
* add bootloader caterina this will enable soft reset key
* initial commit for the userspace
* added my own keymap for splinter
* first working userspace
* move splinter to handwired keyboards
* handwired splinter default keymap
* move some config to my keymap
* cleanup some headers on the keymap
* move the EECONFIG_RGB_DIM to the user space
* I fix remove the GUI on SPC and ENT
* remove the default include on tap_dance.c
* add lights.c and refactoring
* fix wrong source for led index
* seperate the variable on set_layer_led for readabilty.
* set the usb max power consumption to 50
* fix led lighting
* add new enums for tap dance
* use romeve path avr on eeprom.h
* fix wrong spelling on TP names
* changed the tap dance
* allow to set rainbow on some pressed key
* add reset key
* fix error on matrix.c if ROW2COL is used
* add extraflags -flto
* See e2352d4
* Got no love from i2c, serial to the rescue
* Fix the led will lit up to color red after boot
* Trial if the power can handle yellow color at full
* Add comment
* Use EE_HANDS
* add config.h in the use space
* KC_N on BL should wrap in SFT_T
* See d13567d, put it back but increase 1 level
* Fix led soldering mistake
* set the tapping_term to 100
* Use TT for the changing the layer
* Remove the changing space to enter and vice version on BL and UL
* Increate the tapping term
* Use tap dance on changing layer
* Add assorted layer
* propery way to tapdance
* Remove DA_EGRV
This also fix the wrong placement of the reset and dance lspr should register
the KC_LGUI on finished not unregistered.
* Remove the media control to the up and down layer
* Remove the interrupted state of the tap dance
* swapt the space and enter on to th caps
* Shorthand
* Keymap update
* My keymap for lets_split
* cleaning
			
			
This commit is contained in:
		
							parent
							
								
									3b7b1994cd
								
							
						
					
					
						commit
						7216fd0f47
					
				
					 12 changed files with 746 additions and 0 deletions
				
			
		
							
								
								
									
										32
									
								
								users/zer09/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								users/zer09/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
#ifndef USERSPACE_CONFIG_H
 | 
			
		||||
#define USERSPACE_CONFIG_H
 | 
			
		||||
 | 
			
		||||
#ifndef QMK_KEYS_PER_SCAN
 | 
			
		||||
#define QMK_KEYS_PER_SCAN 4
 | 
			
		||||
#endif // !QMK_KEYS_PER_SCAN
 | 
			
		||||
 | 
			
		||||
// this makes it possible to do rolling combos (zx) with keys that
 | 
			
		||||
// convert to other keys on hold (z becomes ctrl when you hold it,
 | 
			
		||||
// and when this option isn't enabled, z rapidly followed by x
 | 
			
		||||
// actually sends Ctrl-x. That's bad.)
 | 
			
		||||
#define IGNORE_MOD_TAP_INTERRUPT
 | 
			
		||||
#undef PERMISSIVE_HOLD
 | 
			
		||||
#undef PREVENT_STUCK_MODIFIERS
 | 
			
		||||
 | 
			
		||||
#define FORCE_NKRO
 | 
			
		||||
 | 
			
		||||
#ifndef TAPPING_TOGGLE
 | 
			
		||||
#define TAPPING_TOGGLE  1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TAPPING_TERM
 | 
			
		||||
#undef TAPPING_TERM
 | 
			
		||||
#endif
 | 
			
		||||
#define TAPPING_TERM 120
 | 
			
		||||
 | 
			
		||||
// Disable action_get_macro and fn_actions, since we don't use these
 | 
			
		||||
// and it saves on space in the firmware.
 | 
			
		||||
#define NO_ACTION_MACRO
 | 
			
		||||
#define NO_ACTION_FUNCTION
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										189
									
								
								users/zer09/lights.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								users/zer09/lights.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,189 @@
 | 
			
		|||
#include "lights.h"
 | 
			
		||||
 | 
			
		||||
static bool active_key_pos[50] = {};
 | 
			
		||||
static uint8_t led_dim = 0;
 | 
			
		||||
 | 
			
		||||
volatile led_key rbw_led_keys[RBW] = {
 | 
			
		||||
    [RBW_LCTL] = {DEFAULT, 21, true},  [RBW_LCAP] = {DEFAULT, 24, false},
 | 
			
		||||
    [RBW_LSPR] = {DEFAULT, 23, true},  [RBW_RCTL] = {DEFAULT, 48, true},
 | 
			
		||||
    [RBW_RCAP] = {DEFAULT, 45, false}, [RBW_RALT] = {DEFAULT, 46, true},
 | 
			
		||||
    [RBW_SCRL] = {DEFAULT, 42, true}};
 | 
			
		||||
 | 
			
		||||
/* Pressed led color. */
 | 
			
		||||
const uint32_t _PC[3] = {0xFF, 0x00, 0x00};
 | 
			
		||||
 | 
			
		||||
/* Layer color. */
 | 
			
		||||
const uint8_t _LC[5][3] = {[_BL] = {0x00, 0x00, 0x00},
 | 
			
		||||
                           [_UL] = {0x00, 0x00, 0xFF},
 | 
			
		||||
                           [_VL] = {0xFF, 0xFF, 0x00},
 | 
			
		||||
                           [_DL] = {0x00, 0xFF, 0x00},
 | 
			
		||||
                           [_AL] = {0xFF, 0x00, 0x00}};
 | 
			
		||||
 | 
			
		||||
/* Color table by sine wave */
 | 
			
		||||
const uint8_t _LIGHTS[360] = {
 | 
			
		||||
    0,   0,   0,   0,   0,   1,   1,   2,   2,   3,   4,   5,   6,   7,   8,
 | 
			
		||||
    11,  12,  9,   13,  15,  17,  18,  20,  22,  24,  26,  28,  30,  32,  35,
 | 
			
		||||
    37,  39,  42,  44,  47,  49,  52,  55,  58,  60,  63,  66,  69,  72,  75,
 | 
			
		||||
    78,  81,  85,  88,  91,  94,  97,  101, 104, 107, 111, 114, 117, 121, 124,
 | 
			
		||||
    127, 131, 134, 137, 141, 144, 147, 150, 154, 157, 160, 163, 167, 170, 173,
 | 
			
		||||
    176, 179, 182, 185, 188, 191, 194, 197, 200, 202, 205, 208, 210, 213, 215,
 | 
			
		||||
    217, 220, 222, 224, 226, 229, 231, 232, 234, 236, 238, 239, 241, 242, 244,
 | 
			
		||||
    245, 246, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255, 255, 255,
 | 
			
		||||
    255, 255, 255, 255, 254, 254, 253, 253, 252, 251, 251, 250, 249, 248, 246,
 | 
			
		||||
    245, 244, 242, 241, 239, 238, 236, 234, 232, 231, 229, 226, 224, 222, 220,
 | 
			
		||||
    217, 215, 213, 210, 208, 205, 202, 200, 197, 194, 191, 188, 185, 182, 179,
 | 
			
		||||
    176, 173, 170, 167, 163, 160, 157, 154, 150, 147, 144, 141, 137, 134, 131,
 | 
			
		||||
    127, 124, 121, 117, 114, 111, 107, 104, 101, 97,  94,  91,  88,  85,  81,
 | 
			
		||||
    78,  75,  72,  69,  66,  63,  60,  58,  55,  52,  49,  47,  44,  42,  39,
 | 
			
		||||
    37,  35,  32,  30,  28,  26,  24,  22,  20,  18,  17,  15,  13,  12,  11,
 | 
			
		||||
    9,   8,   7,   6,   5,   4,   3,   2,   2,   1,   1,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 | 
			
		||||
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0};
 | 
			
		||||
 | 
			
		||||
void set_key_led(keyrecord_t *record, uint8_t lyr) {
 | 
			
		||||
  static uint8_t base = 5;
 | 
			
		||||
 | 
			
		||||
  uint8_t r = record->event.key.row;
 | 
			
		||||
  uint8_t c = record->event.key.col;
 | 
			
		||||
  uint8_t pos;
 | 
			
		||||
 | 
			
		||||
  // This was the result of my soldering.
 | 
			
		||||
  // Lesson of the day: always check.
 | 
			
		||||
  if (r < 5) {
 | 
			
		||||
    pos = r % 2 == 0 ? r * base + c : r * base + (base - (c + 1));
 | 
			
		||||
  } else {
 | 
			
		||||
    pos = r % 2 == 0 ? r * base + (base - (c + 1)) : r * base + c;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (record->event.pressed) {
 | 
			
		||||
    active_key_pos[pos] = true;
 | 
			
		||||
    SET_LED_RGB(_PC[0], _PC[1], _PC[2], led_dim, pos);
 | 
			
		||||
  } else {
 | 
			
		||||
    active_key_pos[pos] = false;
 | 
			
		||||
    SET_LED_RGB(_LC[lyr][0], _LC[lyr][1], _LC[lyr][2], led_dim, pos);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Fix for unknown reason after testin flash the eeprom handedness,
 | 
			
		||||
   the leds will ligth up after boot.
 | 
			
		||||
   This should be call in the set layer led.*/
 | 
			
		||||
bool is_first_run(void) {
 | 
			
		||||
  static uint8_t run = 0;
 | 
			
		||||
 | 
			
		||||
  if (run == 0) {
 | 
			
		||||
    run++;
 | 
			
		||||
    return true;
 | 
			
		||||
  } else {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool set_layer_led(uint8_t lyr) {
 | 
			
		||||
  static uint8_t p_lyr = 0; // Previous layer.
 | 
			
		||||
  static uint8_t p_dim = 0; // Previous dim.
 | 
			
		||||
 | 
			
		||||
  if (p_lyr == lyr && p_dim == led_dim && !is_first_run()) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  p_lyr = lyr;
 | 
			
		||||
  p_dim = led_dim;
 | 
			
		||||
  const uint8_t r = _LC[lyr][0];
 | 
			
		||||
  const uint8_t g = _LC[lyr][1];
 | 
			
		||||
  const uint8_t b = _LC[lyr][2];
 | 
			
		||||
  const uint8_t d = (p_lyr == _VL && p_dim < 1) ? 1 : p_dim;
 | 
			
		||||
 | 
			
		||||
  for (uint8_t i = 0; i < RGBLED_NUM; i++) {
 | 
			
		||||
    SET_LED_RGB(r, g, b, d, i);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool rainbow_loop(uint8_t lyr) {
 | 
			
		||||
  static uint16_t last_timer = 0;
 | 
			
		||||
  static uint16_t i = 0;
 | 
			
		||||
  static uint8_t r, g, b, pos;
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < 8) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (i >= 360) {
 | 
			
		||||
    i = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
  r = _LIGHTS[(i + 120) % 360];
 | 
			
		||||
  g = _LIGHTS[i];
 | 
			
		||||
  b = _LIGHTS[(i + 240) % 360];
 | 
			
		||||
 | 
			
		||||
  i++;
 | 
			
		||||
 | 
			
		||||
  bool set_rbw = false;
 | 
			
		||||
 | 
			
		||||
  for (uint8_t j = 0; j < RBW; j++) {
 | 
			
		||||
    pos = rbw_led_keys[j].pos;
 | 
			
		||||
 | 
			
		||||
    switch (rbw_led_keys[j].status) {
 | 
			
		||||
    case ENABLED:
 | 
			
		||||
      if (!active_key_pos[pos] || rbw_led_keys[j].forced) {
 | 
			
		||||
        SET_LED_RGB(r, g, b, led_dim, pos);
 | 
			
		||||
        set_rbw = true;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      break;
 | 
			
		||||
    case DISABLED:
 | 
			
		||||
      if (!active_key_pos[pos] || rbw_led_keys[j].forced) {
 | 
			
		||||
        SET_LED_RGB(_LC[lyr][0], _LC[lyr][1], _LC[lyr][2], led_dim, pos);
 | 
			
		||||
        set_rbw = true;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      rbw_led_keys[j].status = DEFAULT;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return set_rbw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool led_brightness(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
  switch (keycode) {
 | 
			
		||||
  case RGUP:
 | 
			
		||||
    if (record->event.pressed && led_dim > 0) {
 | 
			
		||||
      led_dim--;
 | 
			
		||||
      eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
    break;
 | 
			
		||||
  case RGDWN:
 | 
			
		||||
    if (record->event.pressed && led_dim < 8) {
 | 
			
		||||
      led_dim++;
 | 
			
		||||
      eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    return false;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eeprom_read_led_dim_lvl(void) {
 | 
			
		||||
  led_dim = eeprom_read_byte(EECONFIG_LED_DIM_LVL);
 | 
			
		||||
 | 
			
		||||
  if (led_dim > 8 || led_dim < 0) {
 | 
			
		||||
    led_dim = 0;
 | 
			
		||||
    eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								users/zer09/lights.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								users/zer09/lights.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,45 @@
 | 
			
		|||
#ifndef LIGHTS_H
 | 
			
		||||
#define LIGHTS_H
 | 
			
		||||
 | 
			
		||||
#include "eeprom.h"
 | 
			
		||||
#include "tap_dance.h"
 | 
			
		||||
#include "zer09.h"
 | 
			
		||||
 | 
			
		||||
/* Will hold the RGB brightness level */
 | 
			
		||||
#define EECONFIG_LED_DIM_LVL (uint8_t *)15
 | 
			
		||||
 | 
			
		||||
#define SET_LED_RGB(r, g, b, led_dim, pos)                                     \
 | 
			
		||||
  setrgb(r >> led_dim, g >> led_dim, b >> led_dim, (LED_TYPE *)&led[pos])
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  DEFAULT,
 | 
			
		||||
  ENABLED,
 | 
			
		||||
  DISABLED,
 | 
			
		||||
} led_status;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  led_status status;
 | 
			
		||||
  uint8_t pos;
 | 
			
		||||
  bool forced;
 | 
			
		||||
} led_key;
 | 
			
		||||
 | 
			
		||||
enum rbw_keys {
 | 
			
		||||
  RBW_LCTL,
 | 
			
		||||
  RBW_LCAP,
 | 
			
		||||
  RBW_LSPR,
 | 
			
		||||
  RBW_RCTL,
 | 
			
		||||
  RBW_RCAP,
 | 
			
		||||
  RBW_RALT,
 | 
			
		||||
  RBW_SCRL,
 | 
			
		||||
  RBW
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern volatile led_key rbw_led_keys[RBW];
 | 
			
		||||
 | 
			
		||||
void set_key_led(keyrecord_t *record, uint8_t lyr);
 | 
			
		||||
bool set_layer_led(uint8_t lyr);
 | 
			
		||||
bool rainbow_loop(uint8_t lyr);
 | 
			
		||||
bool led_brightness(uint16_t keycode, keyrecord_t *record);
 | 
			
		||||
void eeprom_read_led_dim_lvl(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										2
									
								
								users/zer09/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								users/zer09/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
SRC += zer09.c tap_dance.c lights.c
 | 
			
		||||
EXTRAFLAGS += -flto
 | 
			
		||||
							
								
								
									
										182
									
								
								users/zer09/tap_dance.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								users/zer09/tap_dance.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,182 @@
 | 
			
		|||
#include "tap_dance.h"
 | 
			
		||||
#include "lights.h"
 | 
			
		||||
 | 
			
		||||
qk_tap_dance_action_t tap_dance_actions[] = {
 | 
			
		||||
    [DA_LCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lctl_finished,
 | 
			
		||||
                                             dance_lctl_reset),
 | 
			
		||||
    [DA_LSPR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lspr_finished,
 | 
			
		||||
                                             dance_lspr_reset),
 | 
			
		||||
    [DA_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_rctl_finished,
 | 
			
		||||
                                             dance_rctl_reset),
 | 
			
		||||
    [DA_RALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ralt_finished,
 | 
			
		||||
                                             dance_ralt_reset),
 | 
			
		||||
    [DA_UPLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_uply_finished,
 | 
			
		||||
                                             dance_uply_reset),
 | 
			
		||||
    [DA_DWLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_dwly_finished,
 | 
			
		||||
                                             dance_dwly_reset),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
volatile uint8_t active_layer = _BL;
 | 
			
		||||
static tap upltap_state = {.state = 0};
 | 
			
		||||
static tap dwltap_state = {.state = 0};
 | 
			
		||||
static tap lsprtap_state = {.state = 0};
 | 
			
		||||
static tap ralttap_state = {.state = 0};
 | 
			
		||||
 | 
			
		||||
void layer_switcher_tap(uint8_t new_layer) {
 | 
			
		||||
  layer_off(active_layer);
 | 
			
		||||
  layer_on(new_layer);
 | 
			
		||||
  active_layer = new_layer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cur_dance(qk_tap_dance_state_t *state) {
 | 
			
		||||
  switch (state->count) {
 | 
			
		||||
  case 1:
 | 
			
		||||
    return state->pressed == 0 ? SINGLE_TAP : SINGLE_HOLD;
 | 
			
		||||
  case 2:
 | 
			
		||||
    return state->pressed == 0 ? DOUBLE_TAP : DOUBLE_HOLD;
 | 
			
		||||
  case 3:
 | 
			
		||||
    return state->pressed == 0 ? TRIPLE_TAP : TRIPLE_HOLD;
 | 
			
		||||
  default:
 | 
			
		||||
    return state->pressed == 0 ? DEFAULT_TAP : DEFAULT_HOLD;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dance_lctl_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  rbw_led_keys[RBW_LCTL].status = ENABLED;
 | 
			
		||||
  register_code(KC_LCTRL);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_lctl_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  unregister_code(KC_LCTRL);
 | 
			
		||||
  rbw_led_keys[RBW_LCTL].status = DISABLED;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_lspr_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  lsprtap_state.state = cur_dance(state);
 | 
			
		||||
 | 
			
		||||
  switch (lsprtap_state.state) {
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
    rbw_led_keys[RBW_LSPR].status = ENABLED;
 | 
			
		||||
    register_code(KC_LALT);
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    register_code(KC_LGUI);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_lspr_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  switch (lsprtap_state.state) {
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
    unregister_code(KC_LALT);
 | 
			
		||||
    rbw_led_keys[RBW_LSPR].status = DISABLED;
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    unregister_code(KC_LGUI);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  rbw_led_keys[RBW_RCTL].status = ENABLED;
 | 
			
		||||
  register_code(KC_RCTRL);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  unregister_code(KC_RCTRL);
 | 
			
		||||
  rbw_led_keys[RBW_RCTL].status = DISABLED;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_ralt_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  ralttap_state.state = cur_dance(state);
 | 
			
		||||
 | 
			
		||||
  switch (ralttap_state.state) {
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
    rbw_led_keys[RBW_RALT].status = ENABLED;
 | 
			
		||||
    unregister_code(KC_LGUI);
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    register_code(KC_RALT);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_ralt_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  switch (ralttap_state.state) {
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
    unregister_code(KC_RGUI);
 | 
			
		||||
    rbw_led_keys[RBW_RALT].status = DISABLED;
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    unregister_code(KC_RALT);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void dance_uply_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  upltap_state.state = cur_dance(state);
 | 
			
		||||
 | 
			
		||||
  switch (upltap_state.state) {
 | 
			
		||||
  case SINGLE_TAP:
 | 
			
		||||
    if (active_layer == _UL) {
 | 
			
		||||
      layer_switcher_tap(_BL);
 | 
			
		||||
    } else {
 | 
			
		||||
      layer_switcher_tap(_UL);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case SINGLE_HOLD:
 | 
			
		||||
    layer_switcher_tap(_UL);
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    layer_switcher_tap(_BL);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dance_uply_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  switch (upltap_state.state) {
 | 
			
		||||
  case SINGLE_TAP:
 | 
			
		||||
    break;
 | 
			
		||||
  case SINGLE_HOLD:
 | 
			
		||||
  default:
 | 
			
		||||
    layer_switcher_tap(_BL);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  upltap_state.state = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  dwltap_state.state = cur_dance(state);
 | 
			
		||||
 | 
			
		||||
  switch (dwltap_state.state) {
 | 
			
		||||
  case SINGLE_TAP:
 | 
			
		||||
    if (active_layer == _DL) {
 | 
			
		||||
      layer_switcher_tap(_BL);
 | 
			
		||||
    } else {
 | 
			
		||||
      layer_switcher_tap(_DL);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case SINGLE_HOLD:
 | 
			
		||||
    layer_switcher_tap(_DL);
 | 
			
		||||
    break;
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
    layer_switcher_tap(_AL);
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    layer_switcher_tap(_BL);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) {
 | 
			
		||||
  switch (dwltap_state.state) {
 | 
			
		||||
  case SINGLE_TAP:
 | 
			
		||||
    break;
 | 
			
		||||
  case SINGLE_HOLD:
 | 
			
		||||
  case DOUBLE_HOLD:
 | 
			
		||||
  default:
 | 
			
		||||
    layer_switcher_tap(_BL);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  dwltap_state.state = 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								users/zer09/tap_dance.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								users/zer09/tap_dance.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
#ifndef TAP_DANCE_H
 | 
			
		||||
#define TAP_DANCE_H
 | 
			
		||||
 | 
			
		||||
#include "zer09.h"
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int state;
 | 
			
		||||
} tap;
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  DEFAULT_TAP,
 | 
			
		||||
  DEFAULT_HOLD,
 | 
			
		||||
  SINGLE_TAP,
 | 
			
		||||
  SINGLE_HOLD,
 | 
			
		||||
  DOUBLE_TAP,
 | 
			
		||||
  DOUBLE_HOLD,
 | 
			
		||||
  TRIPLE_TAP,
 | 
			
		||||
  TRIPLE_HOLD
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  DA_SAFE_START,
 | 
			
		||||
  DA_LCTL,
 | 
			
		||||
  DA_LSPR,
 | 
			
		||||
  DA_RCTL,
 | 
			
		||||
  DA_RALT,
 | 
			
		||||
  DA_UPLY,
 | 
			
		||||
  DA_DWLY,
 | 
			
		||||
  DA_SAFE_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern volatile uint8_t active_layer;
 | 
			
		||||
 | 
			
		||||
void layer_switcher_tap(uint8_t);
 | 
			
		||||
int cur_dance(qk_tap_dance_state_t *);
 | 
			
		||||
 | 
			
		||||
void dance_lctl_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_lctl_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
void dance_lspr_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_lspr_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
void dance_rctl_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_rctl_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
void dance_ralt_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_ralt_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
void dance_uply_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_uply_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
void dance_dwly_finished(qk_tap_dance_state_t *, void *);
 | 
			
		||||
void dance_dwly_reset(qk_tap_dance_state_t *, void *);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										88
									
								
								users/zer09/zer09.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								users/zer09/zer09.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
#include "zer09.h"
 | 
			
		||||
#include "lights.h"
 | 
			
		||||
#include "tap_dance.h"
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void matrix_init_keymap(void) {}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void matrix_scan_keymap(void) {}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) bool process_record_keymap(uint16_t keycode,
 | 
			
		||||
                                                 keyrecord_t *record) {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__((weak)) void led_set_keymap(uint8_t usb_led) {}
 | 
			
		||||
 | 
			
		||||
static uint8_t c_lyr = 0; // current layer.
 | 
			
		||||
 | 
			
		||||
bool shifted_layer(void) {
 | 
			
		||||
  static bool is_shifted = false;
 | 
			
		||||
 | 
			
		||||
  if (c_lyr == _VL) {
 | 
			
		||||
    if (!is_shifted) {
 | 
			
		||||
      register_code(KC_LSFT);
 | 
			
		||||
      is_shifted = true;
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if (is_shifted) {
 | 
			
		||||
      unregister_code(KC_LSFT);
 | 
			
		||||
      is_shifted = false;
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_init_user(void) {
 | 
			
		||||
  eeprom_read_led_dim_lvl();
 | 
			
		||||
 | 
			
		||||
  matrix_init_keymap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_scan_user(void) {
 | 
			
		||||
  static uint8_t is_leds_changes = 1;
 | 
			
		||||
  c_lyr = biton32(layer_state);
 | 
			
		||||
 | 
			
		||||
  is_leds_changes = is_leds_changes << set_layer_led(c_lyr);
 | 
			
		||||
  is_leds_changes = is_leds_changes << shifted_layer();
 | 
			
		||||
  is_leds_changes = is_leds_changes << rainbow_loop(c_lyr);
 | 
			
		||||
 | 
			
		||||
  if (is_leds_changes > 1) {
 | 
			
		||||
    rgblight_set();
 | 
			
		||||
    is_leds_changes = 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  matrix_scan_keymap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
  set_key_led(record, c_lyr);
 | 
			
		||||
 | 
			
		||||
  if (led_brightness(keycode, record)) {
 | 
			
		||||
    rgblight_set();
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  rgblight_set();
 | 
			
		||||
  return process_record_keymap(keycode, record);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void led_set_user(uint8_t usb_led) {
 | 
			
		||||
  if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
 | 
			
		||||
    rbw_led_keys[RBW_LCAP].status = ENABLED;
 | 
			
		||||
    rbw_led_keys[RBW_RCAP].status = ENABLED;
 | 
			
		||||
  } else {
 | 
			
		||||
    rbw_led_keys[RBW_LCAP].status = DISABLED;
 | 
			
		||||
    rbw_led_keys[RBW_RCAP].status = DISABLED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
 | 
			
		||||
    rbw_led_keys[RBW_SCRL].status = ENABLED;
 | 
			
		||||
  } else {
 | 
			
		||||
    rbw_led_keys[RBW_SCRL].status = DISABLED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  led_set_keymap(usb_led);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								users/zer09/zer09.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								users/zer09/zer09.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
#ifndef USERSPACE
 | 
			
		||||
#define USERSPACE
 | 
			
		||||
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
 | 
			
		||||
enum custom_keycodes { CK_SAFE = SAFE_RANGE, RGUP, RGDWN, NEWPLACEHOLDER };
 | 
			
		||||
 | 
			
		||||
#define _______ KC_TRNS
 | 
			
		||||
#define KC_RGUP RGUP
 | 
			
		||||
#define KC_RGDWN RGDWN
 | 
			
		||||
 | 
			
		||||
#define _BL 0 // The base layer
 | 
			
		||||
#define _UL 1 // The up layer
 | 
			
		||||
#define _DL 2 // The down layer
 | 
			
		||||
#define _VL 3 // The shifted up layer
 | 
			
		||||
#define _AL 4 // The assorted layer
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue