aboutsummaryrefslogtreecommitdiff
path: root/keyboards/ergodox_ez/keymaps/algernon/keymap.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ergodox_ez/keymaps/algernon/keymap.c')
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/keymap.c165
1 files changed, 138 insertions, 27 deletions
diff --git a/keyboards/ergodox_ez/keymaps/algernon/keymap.c b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
index 09d8dffd5..c12087292 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
@@ -95,7 +95,9 @@ enum {
95/* Custom keycodes */ 95/* Custom keycodes */
96 96
97enum { 97enum {
98 CT_CLN = 0 98 CT_CLN = 0,
99 CT_MNS,
100 CT_TA,
99}; 101};
100 102
101/* States & timers */ 103/* States & timers */
@@ -115,7 +117,11 @@ uint16_t oh_left_blink_timer = 0;
115uint8_t oh_right_blink = 0; 117uint8_t oh_right_blink = 0;
116uint16_t oh_right_blink_timer = 0; 118uint16_t oh_right_blink_timer = 0;
117 119
120#if KEYLOGGER_ENABLE
118bool log_enable = false; 121bool log_enable = false;
122#endif
123
124bool time_travel = false;
119 125
120/* The Keymap */ 126/* The Keymap */
121 127
@@ -146,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
146// left hand 152// left hand
147 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 153 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
148,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC 154,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
149,LT(ARRW,KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I 155,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
150,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN 156,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
151,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) 157,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
152 158
@@ -155,11 +161,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
155 ,KC_BSPC,F(F_SFT),M(A_ESC) 161 ,KC_BSPC,F(F_SFT),M(A_ESC)
156 162
157 // right hand 163 // right hand
158 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 164 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
159 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS 165 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
160 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL) 166 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
161 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP 167 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
162 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO 168 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
163 169
164 ,OSL(NMDIA),M(OH_LEFT) 170 ,OSL(NMDIA),M(OH_LEFT)
165 ,KC_LEAD 171 ,KC_LEAD
@@ -191,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
191// left hand 197// left hand
192 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 198 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
193,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC 199,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
194,LT(ARRW, KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U 200,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
195,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN 201,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
196,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) 202,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
197 203
@@ -200,11 +206,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
200 ,KC_BSPC,F(F_SFT),M(A_ESC) 206 ,KC_BSPC,F(F_SFT),M(A_ESC)
201 207
202 // right hand 208 // right hand
203 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 209 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
204 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS 210 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
205 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL) 211 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
206 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP 212 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
207 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO 213 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
208 214
209 ,OSL(NMDIA),M(OH_LEFT) 215 ,OSL(NMDIA),M(OH_LEFT)
210 ,KC_LEAD 216 ,KC_LEAD
@@ -892,24 +898,92 @@ void ang_tap (uint16_t codes[]) {
892 register_code (code); \ 898 register_code (code); \
893 unregister_code (code) 899 unregister_code (code)
894 900
895void ang_tap_dance (qk_tap_dance_state_t *state) { 901void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
896 switch (state->keycode) { 902 if (state->count == 1) {
897 case TD(CT_CLN): 903 register_code (KC_RSFT);
898 if (state->count == 1) { 904 register_code (KC_SCLN);
899 register_code (KC_RSFT); 905 } else if (state->count == 2) {
900 register_code (KC_SCLN); 906 register_code (KC_SCLN);
901 unregister_code (KC_SCLN); 907 }
902 unregister_code (KC_RSFT); 908}
903 } else if (state->count == 2) { 909
904 register_code (KC_SCLN); 910void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
905 unregister_code (KC_SCLN); 911 if (state->count == 1) {
906 reset_tap_dance (state); 912 unregister_code (KC_SCLN);
907 } 913 unregister_code (KC_RSFT);
914 } else if (state->count == 2) {
915 unregister_code (KC_SCLN);
908 } 916 }
909} 917}
910 918
919void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
920 if (state->count == 1) {
921 register_code (KC_MINS);
922 } else if (state->count == 2) {
923 register_code (KC_RSFT);
924 register_code (KC_MINS);
925 }
926}
927
928void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
929 if (state->count == 1) {
930 unregister_code (KC_MINS);
931 } else if (state->count == 2) {
932 unregister_code (KC_RSFT);
933 unregister_code (KC_MINS);
934 }
935}
936
937typedef struct {
938 bool layer_toggle;
939 bool sticky;
940 bool finished_once;
941} td_ta_state_t;
942
943void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
944 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
945
946 if (td_ta->finished_once) {
947 return;
948 }
949
950 if (td_ta->sticky) {
951 td_ta->sticky = false;
952 td_ta->layer_toggle = false;
953 layer_off (ARRW);
954 return;
955 }
956
957 td_ta->finished_once = true;
958 if (state->count == 1 && !state->pressed) {
959 register_code (KC_TAB);
960 td_ta->sticky = false;
961 td_ta->layer_toggle = false;
962 } else {
963 td_ta->layer_toggle = true;
964 layer_on (ARRW);
965 td_ta->sticky = (state->count == 2);
966 }
967}
968
969void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
970 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
971
972 if (!td_ta->layer_toggle)
973 unregister_code (KC_TAB);
974 if (!td_ta->sticky)
975 layer_off (ARRW);
976
977 td_ta->finished_once = false;
978}
979
911const qk_tap_dance_action_t tap_dance_actions[] = { 980const qk_tap_dance_action_t tap_dance_actions[] = {
912 [CT_CLN] = ACTION_TAP_DANCE_FN (ang_tap_dance) 981 [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
982 ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
983 ,[CT_TA] = {
984 .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
985 .user_data = (void *)&((td_ta_state_t) { false, false, false })
986 }
913}; 987};
914 988
915// Runs constantly in the background, in a loop. 989// Runs constantly in the background, in a loop.
@@ -1002,9 +1076,18 @@ void matrix_scan_user(void) {
1002 leading = false; 1076 leading = false;
1003 leader_end (); 1077 leader_end ();
1004 1078
1079#if KEYLOGGER_ENABLE
1005 SEQ_ONE_KEY (KC_D) { 1080 SEQ_ONE_KEY (KC_D) {
1081 ergodox_led_all_on();
1082 _delay_ms(100);
1083 ergodox_led_all_off();
1006 log_enable = !log_enable; 1084 log_enable = !log_enable;
1007 } 1085 }
1086#endif
1087
1088 SEQ_ONE_KEY (KC_T) {
1089 time_travel = !time_travel;
1090 }
1008 1091
1009 SEQ_ONE_KEY (KC_U) { 1092 SEQ_ONE_KEY (KC_U) {
1010 ang_do_unicode (); 1093 ang_do_unicode ();
@@ -1093,13 +1176,41 @@ void matrix_scan_user(void) {
1093 } 1176 }
1094} 1177}
1095 1178
1179static uint16_t last4[4];
1180
1096bool process_record_user (uint16_t keycode, keyrecord_t *record) { 1181bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1182#if KEYLOGGER_ENABLE
1097 uint8_t layer = biton32(layer_state); 1183 uint8_t layer = biton32(layer_state);
1098 1184
1099 if (log_enable && layer == BASE) { 1185 if (log_enable && layer == BASE) {
1100 xprintf ("KL: col=%d, row=%d\n", record->event.key.col, 1186 xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1101 record->event.key.row); 1187 record->event.key.row);
1102 } 1188 }
1189#endif
1190
1191 if (time_travel && !record->event.pressed) {
1192 uint8_t p;
1193
1194 // shift cache one to the left
1195 for (p = 0; p < 3; p++) {
1196 last4[p] = last4[p + 1];
1197 }
1198 last4[3] = keycode;
1199
1200 if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
1201 uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
1202 ang_tap (codes);
1203 register_code (KC_RSFT);
1204 register_code (KC_EQL);
1205 unregister_code (KC_EQL);
1206 unregister_code (KC_RSFT);
1207
1208 uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
1209 ang_tap (codes2);
1210
1211 return false;
1212 }
1213 }
1103 1214
1104 return true; 1215 return true;
1105} 1216}