* 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
		
			
				
	
	
		
			464 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			464 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
//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
 |