qmk_firmware/users/zer09/tap_dance.c
zer09 7216fd0f47 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
2018-04-29 13:02:37 -07:00

183 lines
4.6 KiB
C

#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;
}