summary refs log tree commit diff
path: root/users/csc027
diff options
context:
space:
mode:
authorcsc027 <csc_dev@protonmail.com>2020-01-03 14:12:53 -0800
committerJames Young <18669334+noroadsleft@users.noreply.github.com>2020-01-03 14:12:53 -0800
commit2c1417246789383829145bdfc51b3b3921a99341 (patch)
tree8f82242bea0b93e193fab936399aea5409b8a882 /users/csc027
parent320822d75b785401809f45007320e6fb6885b3fd (diff)
[Keymap] Added csc027 keymaps for keebio/iris and planck (#7472)
* Added csc027 user folder and keymaps for both keebio/iris and planck

* Moved the git_macros variable out of the process_record_user function.

* Updated the usb_led code to use the new led_update_user instead of the led_set_user function.

* Update users/csc027/defines.h

Removed the "_______" macro definition in defines.h, since it has already been defined in QMK.

* Update users/csc027/defines.h

Removed the "XXXXXXX" macro definition in defines.h, since it has already been defined in QMK.

* Update users/csc027/csc027.c

Simplified several keyboard macro definitions in the csc027.c file by switching from SS_LCTRL to SS_LCTL in their definitions.

* Condensed both the planck and iris rules files to the minimal set of declarations.
Diffstat (limited to 'users/csc027')
-rw-r--r--users/csc027/csc027.c63
-rw-r--r--users/csc027/csc027.h49
-rw-r--r--users/csc027/custom_audio.c17
-rw-r--r--users/csc027/custom_audio.h8
-rw-r--r--users/csc027/custom_rgb.c25
-rw-r--r--users/csc027/custom_rgb.h9
-rw-r--r--users/csc027/defines.h217
-rw-r--r--users/csc027/rules.mk11
-rw-r--r--users/csc027/usb_led.c32
-rw-r--r--users/csc027/usb_led.h3
10 files changed, 434 insertions, 0 deletions
diff --git a/users/csc027/csc027.c b/users/csc027/csc027.c
new file mode 100644
index 0000000000..106be9b690
--- /dev/null
+++ b/users/csc027/csc027.c
@@ -0,0 +1,63 @@
+#include "csc027.h"
+
+static const char* git_macros[] = {
+    // Make sure that the macro strings match the order they are declared
+    // in the custom_keycodes enum.
+    "git add ",
+    "git branch ",
+    "git checkout ",
+    "git cherry-pick ",
+    "git commit -m \"\""SS_TAP(X_LEFT),
+    "git diff ",
+    "git fetch ",
+    "git grep ",
+    "git log --decorate --oneline --graph ",
+    "git init ",
+    "git mv ",
+    "git merge ",
+    "git push ",
+    "git pull ",
+    "git rebase ",
+    "git remote ",
+    "git reset ",
+    "git show ",
+    "git stash ",
+    "git status ",
+    "git tag ",
+    SS_LCTL(SS_LALT(SS_TAP(X_HOME)))"\t ",
+    SS_LCTL(SS_LALT(SS_TAP(X_HOME)))"\t\t\t ",
+    SS_LCTL(SS_LALT(SS_TAP(X_HOME)))SS_LALT("\t")
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    switch(keycode) {
+        case LOWER:
+            if(record->event.pressed) {
+                layer_on(_LW);
+                update_tri_layer(_LW, _RS, _MS);
+            } else {
+                layer_off(_LW);
+                update_tri_layer(_LW, _RS, _MS);
+            }
+            return false;
+        case RAISE:
+            if(record->event.pressed) {
+                layer_on(_RS);
+                update_tri_layer(_LW, _RS, _MS);
+            } else {
+                layer_off(_RS);
+                update_tri_layer(_LW, _RS, _MS);
+            }
+            return false;
+        case GIT_ADD...MC_ATRD:
+            if(record->event.pressed) {
+                // The calculation here is to make sure that the custom keycode
+                // aligns with the git_macros array.
+                send_string(git_macros[keycode - GIT_ADD]);
+                return true;
+            }
+            return false;
+        default:
+            return true;
+    }
+}
diff --git a/users/csc027/csc027.h b/users/csc027/csc027.h
new file mode 100644
index 0000000000..2a4c8a8a6e
--- /dev/null
+++ b/users/csc027/csc027.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "quantum.h"
+#include "defines.h"
+
+enum custom_keycodes {
+    // Layer Keycodes
+    LOWER = SAFE_RANGE,
+    RAISE,
+
+    // Git Keycodes
+    GIT_ADD, // Add
+    GIT_BRC, // Branch
+    GIT_CHK, // Checkout
+    GIT_CHR, // Cherry-Pick
+    GIT_CMT, // Commit
+    GIT_DIF, // Diff
+    GIT_FTC, // Fetch
+    GIT_GRP, // Grep
+    GIT_LOG, // Log
+    GIT_INT, // Init
+    GIT_MRG, // Merge
+    GIT_MOV, // Move (mv)
+    GIT_PSH, // Push
+    GIT_PUL, // Pull
+    GIT_RBS, // Rebase
+    GIT_RMT, // Remote
+    GIT_RST, // Reset
+    GIT_SHW, // Show
+    GIT_STH, // Stash
+    GIT_STS, // Status
+    GIT_TAG, // Tag
+
+    // Remote Desktop
+    MC_MRD7, // Minimize Remote Desktop on Windows 7
+    MC_MRD8, // Minimize Remote Desktop on Windows 8+
+    MC_ATRD  // Switch windows on local machine from Remote Desktop on Windows
+};
+
+enum custom_layers {
+    _QW = 0, // Qwerty
+    _RS,     // Raise
+    _LW,     // Lower
+    _MS,     // Mouse
+    _GT,     // Git
+    _CN,     // Convenience
+    _GW,     // Guild Wars 2
+    _CS      // Counter-Strike: Global Offensive
+};
diff --git a/users/csc027/custom_audio.c b/users/csc027/custom_audio.c
new file mode 100644
index 0000000000..96e0e66029
--- /dev/null
+++ b/users/csc027/custom_audio.c
@@ -0,0 +1,17 @@
+#include "csc027.h"
+#include "custom_audio.h"
+
+#if defined(AUDIO_ENABLE)
+
+float tone_on[][2] = SONG(E__NOTE(_G6));
+float tone_off[][2] = SONG(E__NOTE(_D5));
+
+void on_usb_led_off(void) {
+    PLAY_SONG(tone_off);
+}
+
+void on_usb_led_on(void) {
+    PLAY_SONG(tone_on);
+}
+
+#endif
diff --git a/users/csc027/custom_audio.h b/users/csc027/custom_audio.h
new file mode 100644
index 0000000000..daea1e652e
--- /dev/null
+++ b/users/csc027/custom_audio.h
@@ -0,0 +1,8 @@
+#pragma once
+
+#if defined(AUDIO_ENABLE)
+
+void on_usb_led_off(void);
+void on_usb_led_on(void);
+
+#endif
diff --git a/users/csc027/custom_rgb.c b/users/csc027/custom_rgb.c
new file mode 100644
index 0000000000..000483b2ae
--- /dev/null
+++ b/users/csc027/custom_rgb.c
@@ -0,0 +1,25 @@
+#include "csc027.h"
+#include "custom_rgb.h"
+
+#if defined(RGBLIGHT_ENABLE)
+
+void keyboard_post_init_user(void) {
+    rgblight_enable_noeeprom();
+    rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+    uint16_t user_hue = rgblight_get_hue();
+    for (uint16_t i = 0; i < 256; ++i) {
+        rgblight_sethsv_noeeprom((i + user_hue) % 256, 255, 255);
+        wait_ms(5);
+    }
+    rgblight_sethsv_noeeprom(0, 0, 0);
+}
+
+void on_usb_led_off(void) {
+    rgblight_sethsv_noeeprom(0, 0, rgblight_get_val() - 85);
+}
+
+void on_usb_led_on(void) {
+    rgblight_sethsv_noeeprom(0, 0, rgblight_get_val() + 85);
+}
+
+#endif
diff --git a/users/csc027/custom_rgb.h b/users/csc027/custom_rgb.h
new file mode 100644
index 0000000000..47fdeb7b26
--- /dev/null
+++ b/users/csc027/custom_rgb.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#if defined(RGBLIGHT_ENABLE)
+
+void keyboard_post_init_user(void);
+void on_usb_led_off(void);
+void on_usb_led_on(void);
+
+#endif
diff --git a/users/csc027/defines.h b/users/csc027/defines.h
new file mode 100644
index 0000000000..3eaa95d83b
--- /dev/null
+++ b/users/csc027/defines.h
@@ -0,0 +1,217 @@
+#pragma once
+#include "csc027.h"
+
+#define MC_LCAD LCA(KC_DEL)     // Control-Alt-Delete
+#define MC_RSFE RSFT_T(KC_ENT)  // Right Shift on hold, Enter on tap
+#define MC_LSEC LSFT_T(KC_ESC)  // Left Shift on hold, Escape on tap
+
+#define ________________ KC_TRNS
+
+/* QWERTY Layer
+ *
+ *  The basic layer of this keymap is a QWERTY layer.
+ *
+ *  - Modifier keys more closely resemble a standard keyboard's layout.
+ *  - There is a "Nxt L" function that cycles through the QWERTY and
+ *    game layers.  This has been implemented by hard coding the jump to the
+ *    next layer in each of the layers using the TO() macro.  Currently, the
+ *    "Nxt L" function skips over the momentary layers (i.e., Mouse, Git,
+ *    Lower, Raise, and Convenience layers).
+ *  - There is a "Rst L" function that resets the current layer to the
+ *    QWERTY layer.
+ *  - The "Git" one shot function goes to the macro layer which has Git
+ *    commands implemented.
+ *  - The "Convc" momentary function goes to the Convenience layer which has a
+ *    tenkey.  Note: The tenkey will operate using the secondary functions if
+ *    the Number Lock is not enabled (e.g., Left and Right instead of 4 and
+ *    6).
+ *  - The Right Shift key also doubles as an Enter key if it is tapped rather
+ *    than held.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * | Tab |  Q  |  W  |  E  |  R  |  T  |  |  Y  |  U  |  I  |  O  |  P  |BkSpc|
+ * |-----------------------------------|  |-----------------------------------|
+ * | Esc |  A  |  S  |  D  |  F  |  G  |  |  H  |  J  |  K  |  L  |  ;  |  '  |
+ * |-----------------------------------|  |-----------------------------------|
+ * |Shift|  Z  |  X  |  C  |  V  |  B  |  |  N  |  M  |  ,  |  .  |  /  |Sf/En|
+ * |-----------------------------------|  |-----------------------------------|
+ * |Cntrl|Super| Alt |Convc|Lower|Space|  |Space|Raise|  \  | Git |Nxt L|Rst L|
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define _____________________QWERTY_L1_____________________  KC_TAB,   KC_Q,     KC_W,     KC_E,      KC_R,     KC_T
+#define _____________________QWERTY_L2_____________________  KC_ESC,   KC_A,     KC_S,     KC_D,      KC_F,     KC_G
+#define _____________________QWERTY_L3_____________________  KC_LSFT,  KC_Z,     KC_X,     KC_C,      KC_V,     KC_B
+#define _____________________QWERTY_L4_____________________  KC_LCTL,  KC_LGUI,  KC_LALT,  MO(_CN),   LOWER,    KC_SPC
+
+#define _____________________QWERTY_R1_____________________  KC_Y,     KC_U,     KC_I,     KC_O,      KC_P,     KC_BSPC
+#define _____________________QWERTY_R2_____________________  KC_H,     KC_J,     KC_K,     KC_L,      KC_SCLN,  KC_QUOT
+#define _____________________QWERTY_R3_____________________  KC_N,     KC_M,     KC_COMM,  KC_DOT,    KC_SLSH,  MC_RSFE
+#define _____________________QWERTY_R4_____________________  KC_SPC,   RAISE,    KC_BSLS,  OSL(_GT),  TO(_GW),  XXXXXXX
+
+/* Raise Layer
+ *
+ *  The Raise layer accommodates the Home, End, Page Up, and Page Down keys
+ *  in what would be the Vim arrow keys positions.  This is done as opposed
+ *  to using C-D, C-U, 0, $, and ^, because it would require a separate layer.
+ *
+ *  - The top row has the shifted versions of the number row, rather than the
+ *    numbers themselves.  This is a change to have a mnemonic where shifted
+ *    elements are on the Raise layer.  This also makes it easy to use some of
+ *    Vim style movement controls (e.g. $, %), but makes it harder for others
+ *    (e.g. ^, (, )). Consider swapping the number row with the shifted number
+ *    row if you do not care about the mnemonic.
+ *  - The Left Brace, Right Brace, Underscore, and Plus keys have been moved
+ *    from the right side to the left side.  This will take some getting used
+ *    to, as these keys are normally on the right side of the keyboard.  An
+ *    alternative would be to keep the keys on the right hand side just under
+ *    the Parentheses.  This would prevent the use of Vim arrow keys however.
+ *  - The F keys have been laid across the bottom in the Raise layer, rather
+ *    than the Lower layer to allow easy access to the Alt-F4 chord for
+ *    Windows.  When the F keys were put in the Lower layer, it made it hard
+ *    to use this chord, as the Lower key, the Alt key, and the F4 key were
+ *    all right next to each other.
+ *  - A Delete key has been added in this layer to allow easy access to the
+ *    Control-Alt-Delete login chord for Windows.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * |  ~  |  !  |  @  |  #  |  $  |  %  |  |  ^  |  &  |  *  |  (  |  )  | Del |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |  _  |  +  |  {  |  }  | Caps|  | Home| PgDn| PgUp| End |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |  F1 |  F2 |  F3 |  F4 |  F5 |  |  F6 |  F7 |  F8 |  F9 | F10 |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define ______________________RAISE_L1_____________________  KC_TILD,  KC_EXLM,  KC_AT,    KC_HASH,   KC_DLR,   KC_PERC
+#define ______________________RAISE_L2_____________________  _______,  KC_UNDS,  KC_PLUS,  KC_LCBR,   KC_RCBR,  KC_CAPS
+#define ______________________RAISE_L3_____________________  _______,  KC_F1,    KC_F2,    KC_F3,     KC_F4,    KC_F5
+#define ______________________RAISE_L4_____________________  _______,  _______,  _______,  _______,   _______,  _______
+
+#define ______________________RAISE_R1_____________________  KC_CIRC,  KC_AMPR,  KC_ASTR,  KC_LPRN,   KC_RPRN,  KC_DELT
+#define ______________________RAISE_R2_____________________  KC_HOME,  KC_PGDN,  KC_PGUP,  KC_END,    XXXXXXX,  XXXXXXX
+#define ______________________RAISE_R3_____________________  KC_F6,    KC_F7,    KC_F8,    KC_F9,     KC_F10,   _______
+#define ______________________RAISE_R4_____________________  _______,  _______,  _______,  _______,   XXXXXXX,  XXXXXXX
+
+/* Lower Layer
+ *
+ *  The lower layout scheme accommodates the Vim style arrow keys.
+ *
+ *  - The arrow keys are in the normal Vim positions.
+ *  - The Left Square Bracket, Right Square Bracket, Minus, and Equal keys
+ *    have been moved from the right side to the left side.  This will take
+ *    some getting used to, as it is on the left rather than the right.
+ *  - A Delete key has been added in this layer to allow easy access to the
+ *    Control-Alt-Delete login chord for Windows.
+ *  - The remaining F keys are in this layer.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * |  `  |  1  |  2  |  3  |  4  |  5  |  |  6  |  7  |  8  |  9  |  0  | Del |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |  -  |  =  |  [  |  ]  |     |  | Left| Down|  Up |Right|     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     | F11 | F12 |     |     |     |  |     |     |     |     |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define ______________________LOWER_L1_____________________  KC_GRV,   KC_1,     KC_2,     KC_3,      KC_4,     KC_5
+#define ______________________LOWER_L2_____________________  _______,  KC_MINS,  KC_EQL,   KC_LBRC,   KC_RBRC,  XXXXXXX
+#define ______________________LOWER_L3_____________________  _______,  KC_F11,   KC_F12,   XXXXXXX,   XXXXXXX,  XXXXXXX
+#define ______________________LOWER_L4_____________________  _______,  _______,  _______,  _______,   _______,  _______
+
+#define ______________________LOWER_R1_____________________  KC_6,     KC_7,     KC_8,     KC_9,      KC_0,     KC_DELT
+#define ______________________LOWER_R2_____________________  KC_LEFT,  KC_DOWN,  KC_UP,    KC_RGHT,   XXXXXXX,  XXXXXXX
+#define ______________________LOWER_R3_____________________  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  _______
+#define ______________________LOWER_R4_____________________  _______,  _______,  _______,  _______,   XXXXXXX,  XXXXXXX
+
+
+/* MIT Layout (Mouse)
+ *
+ *  The mouse layer adds keys to use the keyboard like a mouse.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |Ms-Lc|Ms-Rc|     |  | Ms-L| Ms-D| Ms-U| Ms-R|     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define ______________________MOUSE_L1_____________________  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX
+#define ______________________MOUSE_L2_____________________  _______,  XXXXXXX,  XXXXXXX,  KC_BTN1,   KC_BTN2,  XXXXXXX
+#define ______________________MOUSE_L3_____________________  _______,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX
+#define ______________________MOUSE_L4_____________________  _______,  _______,  _______,  _______,   _______,  _______
+
+#define ______________________MOUSE_R1_____________________  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX
+#define ______________________MOUSE_R2_____________________  KC_MS_L,  KC_MS_D,  KC_MS_U,  KC_MS_R,   XXXXXXX,  XXXXXXX
+#define ______________________MOUSE_R3_____________________  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  _______
+#define ______________________MOUSE_R4_____________________  _______,  _______,  _______,  _______,   XXXXXXX,  XXXXXXX
+
+/* MIT Layout (Git)
+ *
+ *  The macro layer that has common git commands.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * |     |Chery| Show|Rebas|Reset| Tag |  |     | Pull| Init|Rmote| Push|     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     | Add |Sttus| Diff|Fetch| Grep|  |Stash|     |ChkOt| Log |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |Comit| Move|Brnch|  |     |Merge|     |     |     |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |     |     |     |     |     |
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define _______________________GIT_L1______________________  XXXXXXX,  GIT_CHR,  GIT_SHW,  GIT_RBS,   GIT_RST,  GIT_TAG
+#define _______________________GIT_L2______________________  _______,  GIT_ADD,  GIT_STS,  GIT_DIF,   GIT_FTC,  GIT_GRP
+#define _______________________GIT_L3______________________  _______,  XXXXXXX,  XXXXXXX,  GIT_CMT,   GIT_MOV,  GIT_BRC
+#define _______________________GIT_L4______________________  _______,  _______,  _______,  _______,   _______,  _______
+
+#define _______________________GIT_R1______________________  XXXXXXX,  GIT_PUL,  GIT_INT,  GIT_RMT,   GIT_PSH,  XXXXXXX
+#define _______________________GIT_R2______________________  GIT_STH,  XXXXXXX,  GIT_CHK,  GIT_LOG,   XXXXXXX,  XXXXXXX
+#define _______________________GIT_R3______________________  XXXXXXX,  GIT_MRG,  XXXXXXX,  XXXXXXX,   XXXXXXX,  _______
+#define _______________________GIT_R4______________________  _______,  _______,  _______,  _______,   XXXXXXX,  XXXXXXX
+
+
+/* MIT Layout (Convenience)
+ *
+ *  The Convenience layer adds a tenkey and miscellaneous chords to the keyboard.
+ *  The lack of a fifth row means that some of the tenkey's functions need to be
+ *  moved to the left of tenkey from the top.
+ *
+ *  - The Number Lock key is physically in the same spot as the Caps Lock key
+ *    in the raise layer.
+ *  - There is also a Backspace Key for convenience.
+ *  - There is a convenience macro to type the Control-Alt-Delete login chord for Windows.
+ *  - There is a convenience macro to Minimize Remote Desktop within Remote Desktop
+ *    in Windows.
+ *  - There is a convenience macro to cycle through programs in Windows.
+ *  - There is a convenience macro to go to the previous program in Windows.
+ *
+ * ,-----------------------------------.  ,-----------------------------------.
+ * |     |     |Insrt|ScrLk|PrtSc|     |  |  *  |  7  |  8  |  9  |  -  |BkSpc|
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     | App | LCAD|MRDP7|NmLck|  |  /  |  4  |  5  |  6  |  +  |     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     | ATRD|MRDP8|     |  |     |  1  |  2  |  3  |Enter|     |
+ * |-----------------------------------|  |-----------------------------------|
+ * |     |     |     |     |     |     |  |     |  0  |  0  |  .  |     |     |
+ * `-----------------------------------'  `-----------------------------------'
+ */
+
+#define ___________________CONVENIENCE_L1__________________  XXXXXXX,  XXXXXXX,  KC_INS,   KC_SLCK,   KC_PSCR,  XXXXXXX
+#define ___________________CONVENIENCE_L2__________________  _______,  XXXXXXX,  KC_APP,   MC_LCAD,   MC_MRD7,  KC_NLCK
+#define ___________________CONVENIENCE_L3__________________  _______,  XXXXXXX,  XXXXXXX,  MC_ATRD,   MC_MRD8,  XXXXXXX
+#define ___________________CONVENIENCE_L4__________________  _______,  _______,  _______,  _______,   _______,  _______
+
+#define ___________________CONVENIENCE_R1__________________  KC_PAST,  KC_P7,    KC_P8,    KC_P9,     KC_PMNS,  KC_BSPC
+#define ___________________CONVENIENCE_R2__________________  KC_PSLS,  KC_P4,    KC_P5,    KC_P6,     KC_PPLS,  XXXXXXX
+#define ___________________CONVENIENCE_R3__________________  XXXXXXX,  KC_P1,    KC_P2,    KC_P3,     KC_PENT,  _______
+#define ___________________CONVENIENCE_R4__________________  _______,  KC_P0,    KC_P0,    KC_PDOT,   XXXXXXX,  XXXXXXX
diff --git a/users/csc027/rules.mk b/users/csc027/rules.mk
new file mode 100644
index 0000000000..7e5d44e1c8
--- /dev/null
+++ b/users/csc027/rules.mk
@@ -0,0 +1,11 @@
+SRC += csc027.c
+
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
+    SRC += custom_rgb.c
+    SRC += usb_led.c
+endif
+
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
+    SRC += custom_audio.c
+    SRC += usb_led.c
+endif
diff --git a/users/csc027/usb_led.c b/users/csc027/usb_led.c
new file mode 100644
index 0000000000..1418e32cad
--- /dev/null
+++ b/users/csc027/usb_led.c
@@ -0,0 +1,32 @@
+#include "csc027.h"
+#include "usb_led.h"
+#include "led.h"
+
+#if defined(RGBLIGHT_ENABLE)
+#    include "custom_rgb.h"
+#elif defined(AUDIO_ENABLE)
+#    include "custom_audio.h"
+#endif
+
+#if defined(AUDIO_ENABLE) || defined(RGBLIGHT_ENABLE)
+
+bool led_update_user(led_t usb_led) {
+    static led_t old_usb_led = {
+        .num_lock = false,
+        .caps_lock = false,
+        .scroll_lock = false
+    };
+
+    if(old_usb_led.caps_lock != usb_led.caps_lock) {
+        usb_led.caps_lock ? on_usb_led_on() : on_usb_led_off();
+    } else if(old_usb_led.num_lock != usb_led.num_lock) {
+        usb_led.num_lock ? on_usb_led_on() : on_usb_led_off();
+    } else if(old_usb_led.scroll_lock != usb_led.scroll_lock) {
+        usb_led.scroll_lock ? on_usb_led_on() : on_usb_led_off();
+    }
+    old_usb_led = usb_led;
+
+    return true;
+}
+
+#endif
diff --git a/users/csc027/usb_led.h b/users/csc027/usb_led.h
new file mode 100644
index 0000000000..7451b46950
--- /dev/null
+++ b/users/csc027/usb_led.h
@@ -0,0 +1,3 @@
+#pragma once
+
+bool led_update_user(led_t usb_led);