summaryrefslogtreecommitdiff
path: root/users/miles2go/keymaps
diff options
context:
space:
mode:
Diffstat (limited to 'users/miles2go/keymaps')
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h41
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c463
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md10
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk24
4 files changed, 538 insertions, 0 deletions
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h
new file mode 100644
index 0000000000..bedc08fc02
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h
@@ -0,0 +1,41 @@
+#pragma once
+
+// Expect to get errors if you comment a feature out and leave it in your keymap.
+#define USE_BABLPASTE
+
+#ifdef USE_BABLPASTE
+
+#ifdef RGBLIGHT_ENABLE
+#define BABL_LED_INDEX 0 // set to 0 to set all LEDs , or set to # of LED to be used as BABL updaters
+#define RGBLIGHT_COLOR_MS 0x00,0x27,0x88 // blue screen?
+#define RGBLIGHT_COLOR_MAC 0xF0,0xF0,0xF0 // grey
+#define RGBLIGHT_COLOR_LINUX 0xF4,0xAA,0x90 // ubuntu orange?
+#define RGBLIGHT_COLOR_EMACS 0x00,0x00,0x00
+#define RGBLIGHT_COLOR_VI 0x00,0x90,0x00
+#define RGBLIGHT_COLOR_READMUX 0x33,0xFF,0x33 // green screen
+#define RGBLIGHT_COLOR_CHROMEOS 0xf4,0xc2,0xd // google yellows
+#endif
+
+#endif // bablpaste
+
+
+
+// place overrides here
+#define RGBLED_NUM 2
+#define RGBLIGHT_LIMIT_VAL 200
+#ifdef RGBLIGHT_ENABLE
+#define RGBLIGHT_COLOR_LAYER_0 0x00, 0xFF, 0x00 // qwerty
+#define RGBLIGHT_COLOR_LAYER_1 0x00, 0x99, 0x99 // cdh
+#define RGBLIGHT_COLOR_LAYER_2 0xFF, 0x00, 0x00 // symbol
+#define RGBLIGHT_COLOR_LAYER_3 0x00, 0xFF, 0xFF // move
+#define RGBLIGHT_COLOR_LAYER_4 0xFF, 0x00, 0xFF // delmove
+#define RGBLIGHT_COLOR_LAYER_5 0x00, 0xFF, 0xFF
+#define RGBLIGHT_ANIMATIONS
+#define RGB_LIGHT_EFFECT_BREATHE_MAX 200
+#define RGBLIGHT_RAINBOW_SWIRL_RANGE 127
+#endif // rgblight
+
+#define TAPPING_TERM 200
+#define TAPPING_TERM_PER_KEY
+#define RETRO_TAPPING
+//#define PERMISSIVE_HOLD
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c
new file mode 100644
index 0000000000..d36bf25b2c
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c
@@ -0,0 +1,463 @@
+//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
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md
new file mode 100644
index 0000000000..a720d81c18
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md
@@ -0,0 +1,10 @@
+# keymap taking advantage of the STM32 storage & CPU.
+RGB LED is used to show layers
+default bluepill LED is capslock.
+there's a simple serial protocol for the keyboard to listen for color change commands from the PC.
+Useful for "do stuff && cat "green">/dev/ttyACM0"
+
+lower case letters set pre-programmed colors
+Upper case letters change RGB mode
+Command C takes 3-5 octets 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.
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk
new file mode 100644
index 0000000000..7eb39e1082
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk
@@ -0,0 +1,24 @@
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+ifeq ($(strip $(KEYBOARD)), handwired/ms_sculpt_mobile/8x18_arm)
+ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+endif
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+#enable RAW in keymap config, since it can hang machines
+RAW_ENABLE = no
+# virtual serial port
+VIRTSER_ENABLE = yes