From 803610a284ac886eaeb319b4a8d25ffbd2861152 Mon Sep 17 00:00:00 2001
From: milestogo <milestogo@users.noreply.github.com>
Date: Fri, 8 May 2020 23:15:26 -0700
Subject: [Keymap] initial user directory for milestogo + babblepaste  (#7698)

* initial user directory

* fix missing endif in vi mode

* fix includes per drashna and a few typos. I have not tested the userspace keymap, it is just there to help keep the user space and keymap in sync

* move babblepaste docs to md format

* clean up block quotes

* TIL clang-format - miles2go userspace
---
 .../keymaps/handwired/ms_sculpt_mobile/config.h    |  41 ++
 .../keymaps/handwired/ms_sculpt_mobile/keymap.c    | 463 +++++++++++++++++++++
 .../keymaps/handwired/ms_sculpt_mobile/readme.md   |  10 +
 .../keymaps/handwired/ms_sculpt_mobile/rules.mk    |  24 ++
 4 files changed, 538 insertions(+)
 create mode 100644 users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h
 create mode 100644 users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c
 create mode 100644 users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md
 create mode 100644 users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk

(limited to 'users/miles2go/keymaps/handwired/ms_sculpt_mobile')

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
-- 
cgit v1.2.3