//placeholder until the new keymaps tree is built //#include QMK_KEYBOARD_H #include "virtser.h" #include <print.h> #include "milestogo.h" #define LAYOUT_local LAYOUT_mobile_XUW #define LAYOUT LAYOUT_mobile_XUW #ifndef USERSPACE_ACTIVE enum layer_keycodes { QWR = SAFE_RANGE, CDH, SYM, MOV, NUM, TRAN }; enum layer_names { _QWR, _CDH, _SYM, _MOV, _TRAN }; #endif // Shorter spacing #define XXXX KC_NO #define ____ KC_TRNS // Custom macros /* Fn Keys */ #define TT_SYM MO(_SYM) #define TT_NUM MO(_NUM) #define SSFT ACTION_MODS_ONESHOT(MOD_LSFT) #define SSYM LT(_SYM, KC_SPC) #define MVTAB LT(_MOV,KC_TAB) #define BKMV TT(_MOV) #define MV2 LT(_MOV, KC_2) #define MV3 LT(_MOV, KC_3) #define MV4 LT(_MOV, KC_4) #define MV8 LT(_MOV, KC_8) #define MV9 LT(_MOV, KC_9) #define MV0 LT(_MOV, KC_0) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* QWERTY * * |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH| * -------------------------------------------------------------------------------' * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| * --------------------------------------------------------------------------- * | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | * -------------------------------------------------------------------------------' * |Bak/Mov| a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| * -------------------------------------------------------------------------------- * |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| * --------------------------------------------------------------------------------- * |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| * --------------------------------------------------------------------------------- */ [_QWERTY] = LAYOUT_local( \ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, TG(_CDH),\ KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,\ BKMV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, TT_SYM,KC_CDH, KC_LEFT, KC_DOWN, KC_RIGHT ), [_CDH] = LAYOUT_local(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_2,\ KC_LSFT, KC_Z, KC_X, KC_C, DHPASTE,KC_V, KC_K, KC_H, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, ____, KC_1,\ TG(_MOV), ____, ____ , ____, ____, ____, KC_QWERTY, ____, ____, ____ ), /* SYMBOL layer, several to chose from */ [_SYM] = LAYOUT_wrapper(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, _________________EXCEL_L1__________________, _________________EXCEL_R1__________________, ____, ____, ____,\ ____, _________________EXCEL_L2__________________, _________________EXCEL_R2__________________, KC_GRV, ____, ____,\ ____, _________________EXCEL_L3__________________, _________________EXCEL_R3__________________, B_SAVE, ____, ____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), #ifndef USE_BABLPASTE [_MOV] = LAYOUT_local(\ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, ____ , \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_UP, XXXX, XXXX, XXXX, XXXX, XXXX, \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_LEFT, KC_DOWN, KC_RIGHT,XXXX, XXXX, XXXX, XXXX, \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX ) #else /* MOVE babble version version * |ESC | MAC|Read|Linx| VI | | | | | | | | | | | | * -------------------------------------------------------------------------------' * | | | - | = |Bakspace| Del| * --------------------------------------------------------------------------- * | tab | | [ | ] | \ | | * -------------------------------------------------------------------------------' * |Bak/Mov| | ' |Launch App |PgUp| * --------------------------------------------------------------------------------- * |Lsft | | Rsft| Up| PgDn| * --------------------------------------------------------------------------------- * | |Lgui |Lalt | Exit Move Mode | GUI | Sym | Rctl |Left|Down|Rght| * --------------------------------------------------------------------------------- */ /* ,--------------------------------------------. ,--------------------------------------------. * 01 | ESC |FindPrev| Find |FindNext| \n cell| |ParStart|LineStrt| Up | EOL | ParEnd | * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| * 02 | SelA | Do_DEL | Shift | Undo |Hsplit+ | | WrdLft | Left | Down | Right | WrdRght| * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| * 03 |Vspli+ | Cut | Copy | Paste | Paste | | WinPrv | Tab-- | NewTab | Tab++ | WinNxt | * `--------------------------------------------' `--------------------------------------------' */ [_MOV] = LAYOUT_wrapper(\ ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, XXXX, ____, \ ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX,\ ____, ____________BABBLE_MOV_L1__________________, ____________BABBLE_MOV_R1__________________, XXXX, XXXX, XXXX, \ ____, ____________BABBLE_MOV_L2__________________, ____________BABBLE_MOV_R2__________________, XXXX, B_RUNAPP, XXXX,\ ____, ____________BABBLE_MOV_L3__________________, ____________BABBLE_MOV_R2__________________, XXXX, XXXX, XXXX, \ ____, ____, ____, TG(_MOV), XXXX, XXXX, XXXX, XXXX, XXXX, XXXX ), // Move in a direction, deleting as we go, or do opposite of Mov layer action */ /* ,--------------------------------------------. ,--------------------------------------------. * 01 | Esc | |Replace |MultiSel|PasteVal| | . |LineStrt| . | EOL | . | * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| * 02 | | Do_Mov | Shift | Redo |Hsplit- | | WrdLft | Left | . | Right | WrdRght| * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| * 03 |Vsplit- | Cut | Copy | Paste |Paste | | App-- | ZoomOut| NewWin | ZoomIn | App+ | * `--------------------------------------------' `--------------------------------------------' */ [_DMOV] = LAYOUT_wrapper(\ ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, ____, \ ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX, \ ____, _________BABBLE_DELMOV_L1__________________ , _________BABBLE_DELMOV_R1__________________ , XXXX, XXXX, XXXX, \ ____, _________BABBLE_DELMOV_L2__________________ , _________BABBLE_DELMOV_R2__________________ , XXXX, XXXX, XXXX,\ ____, _________BABBLE_DELMOV_L3__________________ , _________BABBLE_DELMOV_R3__________________ , XXXX, XXXX, XXXX, \ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX ), #endif // Bablepaste /* [_TRAN] = LAYOUT_local(\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ) */ }; #ifndef USERSPACE_ACTIVE bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWR: if (record->event.pressed) { layer_off(_CDH); } return false; break; case CDH: if (record->event.pressed) { layer_on(_CDH); } return false; break; case SYM: if (record->event.pressed) { layer_on(_SYM); } else { layer_off(_SYM); } return false; break; case SAVE: if (record->event.pressed) { SEND_STRING(SS_LCTL("s")); } return false; break; /* Colemak mod-dh moves the D key to the qwerty V position This hack makes apple-V_position do what I mean */ case DHPASTE: if(get_mods() & MOD_BIT(KC_LGUI) ) { if (record->event.pressed) { clear_keyboard_but_mods(); register_code(KC_V); } else { unregister_code(KC_V); } } else { if (record->event.pressed) { register_code(KC_D); } else { unregister_code(KC_D); } } return false; break; return false; break; } return true; } #endif void keyboard_post_init_user(void) { // Customise these values to desired behaviour // debug_enable=true; //debug_matrix=true; //debug_keyboard=true; //debug_mouse=true; } void matrix_init_user(void) { #ifdef RGBLIGHT_ENABLE #ifdef RGB_DI_PIN rgblight_setrgb(RGB_GREEN); #endif #endif //RGB_matrix } // Runs whenever there is a layer state change. layer_state_t layer_state_set_user(layer_state_t state) { uint8_t layer = get_highest_layer(state); switch (layer) { case 0: #ifdef RGBLIGHT_COLOR_LAYER_0 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0); #else #ifdef RGBLIGHT_ENABLE rgblight_init(); #endif #endif break; case 1: #ifdef RGBLIGHT_COLOR_LAYER_1 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1); #endif break; case 2: // symbol #ifdef RGBLIGHT_COLOR_LAYER_2 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2); #endif break; case 3: // move #ifdef RGBLIGHT_COLOR_LAYER_3 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3); #endif #ifdef USE_BABLPASTE babble_led_user(); // poke led to update #endif // bablepaste break; case 4: //delmove ideally we'd turn on a red pixel in addition to the layer indicator. #ifdef RGBLIGHT_COLOR_LAYER_4 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4); #endif break; case 5: #ifdef RGBLIGHT_COLOR_LAYER_5 rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5); #endif break; default: break; } #ifdef VIRTSER_ENABLE //virtser_send(layer + 48); // ascii 0 is 48 #endif return state; }; // custom tapping term lengths. uint16_t get_tapping_term(uint16_t keycode) { switch (keycode) { case LT(_MOV, KC_TAB): return TAPPING_TERM ; break; default: return TAPPING_TERM; } } #ifdef VIRTSER_ENABLE /* listen on serial for commands. Either a set of lower case letters mapped to colors, / or upper case letters that change RGB mode. / special command C takes 3 numbers as arguments, terminated with a newline or comma or excess digits. Command C takes 3-5octets of RGB settings. Numbers can be terminated with a comma or period. 3 octets = set all LED, 4th argument specfies specfic LED, 4+5 specify start and stop LEDs. */ uint8_t ser_rgbByte[18] ; //ascii string uint8_t ser_cmd_started =0 ; // are we in process uint8_t ser_got_RGBbytes =0 ; // how many bytes we've recived. uint8_t rgb_r[6]; // R, g, b, P1, p2 uint8_t bs=0; // how many bytes into our rgbBytestring. void virtser_recv(uint8_t serIn) { #ifdef RGBLIGHT_ENABLE if ((serIn == 10 ) || (serIn == 13) || ser_got_RGBbytes >=5) { //reached newline or max digits if (ser_cmd_started) { ser_cmd_started =0 ; // end loop at newline virtser_send('|'); if (ser_got_RGBbytes==3) { rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]); } if (ser_got_RGBbytes ==4) { if (( rgb_r[3] >=0) && (rgb_r[3] <= RGBLED_NUM) ) { // is pos1 plausible rgblight_setrgb_at ( rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3]); } else { rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]); } } if (ser_got_RGBbytes == 5) { // are start and end positions plausible? if ( (rgb_r[4] >0) && (rgb_r[4] <= RGBLED_NUM) && (rgb_r[4] > rgb_r[3]) && (rgb_r[3] >=0) && (rgb_r[3] <= (RGBLED_NUM -1)) ) { rgblight_setrgb_range(rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3], rgb_r[4]); } else { rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]); } } } else { // newline outside of command loop, or something that can be ignored. //virtser_send('.'); } } if (1 == ser_cmd_started) { // collecting bytes. if ( // it is time to compute a byte ( ( (serIn == ',') || (serIn == '.') ) && (bs > 0) ) || // signal done with the byte. (bs ==2 )){ //or we know this is last. if ( (serIn <= '9') && (serIn >='0') ) { //3rd asci digit ser_rgbByte[bs] = serIn; bs++; // virtser_send(serIn); } if (bs>3) { rgb_r[ser_got_RGBbytes]=255; ser_got_RGBbytes ++; } if (bs==3) { rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*100 + (ser_rgbByte[1] -'0')*10 + (ser_rgbByte[2] -'0' ); ser_got_RGBbytes ++; } if (bs ==2 ) { rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*10 + (ser_rgbByte[1] -'0' ); ser_got_RGBbytes ++; } if (bs ==1) { rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0'); ser_got_RGBbytes ++; } // {else wipe & start over} bs=0; // virtser_send(ser_got_RGBbytes+'0'); } else { // haven't got enough for our byte / no terminal marker if ( (serIn <= '9') && (serIn >='0') ) { //ascii only ser_rgbByte[bs] = serIn; bs++; // virtser_send(serIn); } } } else { //not in command loop - next is command w/o arguments, or start of one. switch (serIn) { case 'C': // color switch ser_cmd_started=1; ser_got_RGBbytes = bs =0; virtser_send('/'); break; case 'r': //red rgblight_setrgb(RGB_RED); break; case 'g': rgblight_setrgb(RGB_GREEN); break; case 'b': // color switch rgblight_setrgb(RGB_BLUE); break; case 'w': // color switch rgblight_setrgb(RGB_WHITE); break; case 'o': // color black/off rgblight_setrgb(0,0,0); break; case 'T': // toggle rgblight_toggle(); break; case 'P': // pulse led rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING); break; case 'S': // Static rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); break; case 'U': // Rainbow rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_MOOD); break; default: // virtser_send(serIn); break; } } #endif // RGBLIGHT_ENABLE } #endif // VirtSerial