488 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			488 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <time.h>
 | |
| #include "ridingqwerty.h"
 | |
| #include "dict.h"
 | |
| 
 | |
| __attribute__ ((weak))
 | |
| bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| __attribute__ ((weak))
 | |
| bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| /*
 | |
| typedef union {
 | |
|     struct {
 | |
|         uint8_t aesthetic : 1,
 | |
|                 spongebob : 1,
 | |
|                 uppercase : 1,
 | |
|                 australia : 1,
 | |
|                 unusued   : 4;
 | |
|     };
 | |
|     uint8_t all;
 | |
| } mode_config_t;
 | |
| */
 | |
| mode_config_t mode = {.all = 0U};
 | |
| 
 | |
| bool randword_seed  = false;
 | |
| uint8_t user_mod_state;
 | |
| uint16_t rand_key;
 | |
| uint16_t temp_keycode;
 | |
| uint32_t user_key_timer;
 | |
| 
 | |
| bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | |
| #ifdef CONSOLE_ENABLE
 | |
|   uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
 | |
| #endif
 | |
| 
 | |
|   temp_keycode = keycode;
 | |
|   if ((mode.all != 0U) && ((keycode != DB(TAB) || keycode != ED(ESC)) && ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)))) {
 | |
|       temp_keycode &= 0xFF;
 | |
|   }
 | |
| 
 | |
|   if (mode.spongebob) {
 | |
|     switch(temp_keycode) {
 | |
|       case KC_A ... KC_Z:
 | |
|         if (record->event.pressed) {
 | |
|           (mode.uppercase ^= 1) == 0 ? tap_code16(S(temp_keycode)) : tap_code(temp_keycode);
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (mode.aesthetic) {
 | |
|     switch(temp_keycode) {
 | |
| #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
 | |
|       case KC_A:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("039B");
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_E:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("039E");
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|         return false;
 | |
| #else
 | |
|       case A:
 | |
|       case E:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code16(S(temp_keycode));
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|       return false;
 | |
| #endif
 | |
|       case KC_B ... KC_D:
 | |
|       case KC_F ... KC_Z:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code16(S(temp_keycode));
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_1 ... KC_0:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(temp_keycode);
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|         return false;
 | |
| 
 | |
|       case KC_BSPC:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_BSPC);
 | |
|           tap_code(KC_BSPC);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_SPC:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_SPC);
 | |
|           tap_code(KC_SPC);
 | |
|           tap_code(KC_SPC);
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (mode.australia) {
 | |
|     switch(temp_keycode) {
 | |
|       // IDEMPOTENT
 | |
|       case KC_L:
 | |
|       case KC_O:
 | |
|       case KC_S:
 | |
|       case KC_Z:
 | |
|       case KC_8:
 | |
|       case KC_0:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(temp_keycode);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
| 
 | |
|       // INVERSE
 | |
|       case KC_B:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_Q);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_Q:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_B);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_D:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_P);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_P:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_D);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_N:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_U);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_U:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_N);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_6:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_9);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_9:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_6);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
| 
 | |
|       // TRANSLATE
 | |
|       case KC_A:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0250");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_C:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0254");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_E:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("01DD");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_F:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("025F");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_G:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0183");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_H:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0265");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_I:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("1D09");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_J:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("027E");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_K:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("029E");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_M:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("026F");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_R:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0279");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_T:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0287");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_V:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("028C");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_W:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("028D");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_X:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("2717");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_Y:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("028E");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_1:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0269");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_2:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("3139");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_3:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("0190");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_4:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("3123");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_5:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("03DB");
 | |
|           tap_code(KC_LEFT);
 | |
|           return false;
 | |
|         }
 | |
|         break;
 | |
|       case KC_7:
 | |
|         if (record->event.pressed) {
 | |
|           send_unicode_hex_string("3125");
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
| 
 | |
|       // CONTROLS
 | |
|       case KC_ENT:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_END);
 | |
|           tap_code(KC_ENTER);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_BSPC:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_DELT);
 | |
|         }
 | |
|         return false;
 | |
|       case KC_SPC:
 | |
|         if (record->event.pressed) {
 | |
|           tap_code(KC_SPC);
 | |
|           tap_code(KC_LEFT);
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   switch(keycode) {
 | |
| 
 | |
|     case VERSION:
 | |
|       if (!record->event.pressed) {
 | |
|         send_string_with_delay_P(PSTR(QMK_KEYBOARD ":" QMK_KEYMAP "\nVersion:" QMK_VERSION ", built: " QMK_BUILDDATE "\n"), MACRO_TIMER);
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case QWERTY ... COLEMAK:
 | |
| #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
 | |
|     case GREEK ... HIRAGAN:
 | |
| #endif
 | |
|       if (record->event.pressed) {
 | |
|         //set_single_persistent_default_layer(keycode - QWERTY);
 | |
|         default_layer_set(1U << (keycode - QWERTY));
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case MAKE:
 | |
|       if (record->event.pressed) {
 | |
|         user_mod_state = get_mods() & MOD_MASK_CTRL;
 | |
|         if (user_mod_state) {
 | |
|           clear_mods();
 | |
|           send_string_with_delay_P(PSTR("sleep 1 && "), MACRO_TIMER);
 | |
|         }
 | |
|         send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), MACRO_TIMER);
 | |
|         if (user_mod_state) {
 | |
|           send_string_with_delay_P(PSTR(":flash\n"), MACRO_TIMER);
 | |
|           reset_keyboard();
 | |
|         } else {
 | |
|           send_string_with_delay_P(PSTR("\n"), MACRO_TIMER);
 | |
|         }
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case RNGWORD:
 | |
|       if (randword_seed == false) {
 | |
|         randword_seed = true;
 | |
|         srand(timer_read32());
 | |
|       }
 | |
|       rand_key = rand() % NUMBER_OF_WORDS;
 | |
|       if (record->event.pressed) {
 | |
|         send_string(dict[rand_key]);
 | |
|         tap_code(KC_SPC);
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case RG_QUOT:
 | |
|       if (record->event.pressed) {
 | |
| #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
 | |
|         user_mod_state = get_mods() & MOD_MASK_ALT;
 | |
|         if (user_mod_state) {
 | |
|           unregister_mods(MOD_BIT(KC_RALT));
 | |
|           send_unicode_hex_string("00B0");
 | |
|           set_mods(user_mod_state);
 | |
|           return false;
 | |
|         }
 | |
| #endif
 | |
|         user_key_timer = timer_read32();
 | |
|         layer_on(_NUMBER);
 | |
|         register_mods(MOD_BIT(KC_RGUI));
 | |
|       } else {
 | |
|         unregister_mods(MOD_BIT(KC_RGUI));
 | |
|         layer_off(_NUMBER);
 | |
|         if (timer_elapsed32(user_key_timer) < TAPPING_TERM) {
 | |
|           tap_code(KC_QUOT);
 | |
|         }
 | |
|       }
 | |
|       return false; break;
 | |
| 
 | |
|     case TESTING:
 | |
|       /*
 | |
|       if (record->event.pressed) {
 | |
|         int length = snprintf( NULL, 0, "%lu", test_number );
 | |
|         char* str = malloc( length + 1 );
 | |
|         snprintf( str, length + 1, "%lu", test_number );
 | |
|         send_string(str);
 | |
|         free(str);
 | |
|         // make CFLAGS+="-lc -specs=nosys.specs" board:keymap
 | |
|       }
 | |
|       */
 | |
|       break;
 | |
| 
 | |
|     case CCCV:  // One key copy/paste
 | |
|       if (record->event.pressed) {
 | |
|         user_key_timer = timer_read32();
 | |
|       } else {
 | |
|         if (timer_elapsed32(user_key_timer) > TAPPING_TERM) {  // Hold, copy
 | |
|           register_code(KC_LCTL);
 | |
|           tap_code(KC_C);
 | |
|           unregister_code(KC_LCTL);
 | |
|         } else {  // Tap, paste
 | |
|           register_code(KC_LCTL);
 | |
|           tap_code(KC_V);
 | |
|           unregister_code(KC_LCTL);
 | |
|         }
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case SEED:
 | |
|       if (record->event.pressed) {
 | |
|         srand(timer_read32());
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case SARCASM:
 | |
|       if (record->event.pressed) {
 | |
|         if (!(mode.spongebob ^= 1)) { mode.all = 0U; };
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case VPRWAVE:
 | |
|       if (record->event.pressed) {
 | |
|         if (!(mode.aesthetic ^= 1)) { mode.all = 0U; };
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case STRAYA:
 | |
|       if (record->event.pressed) {
 | |
|         if (!(mode.australia ^= 1)) { mode.all = 0U; };
 | |
|       }
 | |
|       break;
 | |
|     default:
 | |
|       if (record->event.pressed && record->event.key.col == 4 && record->event.key.row == 1) {
 | |
|         if (get_mods() & MOD_BIT(KC_RALT)) {
 | |
|           unregister_mods(MOD_BIT(KC_RALT));
 | |
|           //send_unicode_hex_string("262D");
 | |
| 	  tap_code(KC_BSPC);
 | |
|           set_mods(MOD_BIT(KC_RALT));
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|   }
 | |
|   return process_record_keymap(keycode, record) &&
 | |
|     process_record_secrets(keycode, record);
 | |
| }
 | 
