From dad7424becdb10d1dc3ad70a456fc40513255e71 Mon Sep 17 00:00:00 2001
From: Sendy Aditya Suryana <sendzation@gmail.com>
Date: Mon, 27 Dec 2021 17:06:35 +0700
Subject: [PATCH 1/2] [Keyboard][Update] Add RGB Backlight feature to Pix
 (#14057)

* Initiate RGB Support

* Add RGB Support for PIX

* Revert Encoder pin assignment

* Lower default RGB LED to 15

* Use Left shift for far left key

* Replicate via keymap to default keymap
---
 keyboards/sendyyeah/pix/config.h              | 26 ++++----
 .../sendyyeah/pix/keymaps/default/glcdfont.c  | 24 +++----
 .../sendyyeah/pix/keymaps/default/keymap.c    | 65 +++++++++++++++++--
 keyboards/sendyyeah/pix/keymaps/via/keymap.c  | 65 +++++++++++++++++--
 keyboards/sendyyeah/pix/rules.mk              |  2 +-
 5 files changed, 147 insertions(+), 35 deletions(-)

diff --git a/keyboards/sendyyeah/pix/config.h b/keyboards/sendyyeah/pix/config.h
index a9c3080d8c..86c6d26e16 100644
--- a/keyboards/sendyyeah/pix/config.h
+++ b/keyboards/sendyyeah/pix/config.h
@@ -49,15 +49,17 @@
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
 
-// #define RGB_DI_PIN B5
-// #ifdef RGB_DI_PIN
-// #define RGBLED_NUM 5
-// #define RGBLIGHT_HUE_STEP 8
-// #define RGBLIGHT_SAT_STEP 8
-// #define RGBLIGHT_VAL_STEP 8
-// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
-// #define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
-// #define RGBLIGHT_ANIMATIONS
-// #define RGBLIGHT_LAYERS
-// #define RGBLIGHT_LAYER_BLINK
-// #endif
+#define USB_MAX_POWER_CONSUMPTION 500
+
+#define RGB_DI_PIN B5
+#ifdef RGB_DI_PIN
+#define RGBLED_NUM 15
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+#define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_LAYERS
+#define RGBLIGHT_LAYER_BLINK
+#endif
diff --git a/keyboards/sendyyeah/pix/keymaps/default/glcdfont.c b/keyboards/sendyyeah/pix/keymaps/default/glcdfont.c
index 7af69f796c..53f25b92ed 100644
--- a/keyboards/sendyyeah/pix/keymaps/default/glcdfont.c
+++ b/keyboards/sendyyeah/pix/keymaps/default/glcdfont.c
@@ -165,11 +165,11 @@ const unsigned char font[] PROGMEM = {
   0xF1, 0xF9, 0xFD, 0x01, 0x01, 0xFE,
   0xFE, 0x01, 0x01, 0xFD, 0xF9, 0xF1,
   0x61, 0x01, 0xFD, 0x01, 0x01, 0xFE,
+  0xFE, 0x01, 0xF9, 0xF9, 0x31, 0xE1,
+  0xE1, 0x31, 0xF9, 0xF9, 0x01, 0xFE,
+  0xFE, 0x01, 0xF9, 0xF9, 0x61, 0x61,
+  0x61, 0x61, 0xF9, 0xF9, 0x01, 0xFE,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xF0, 0x08, 0x04, 0xC4, 0x24, 0x24,
-  0x24, 0xC4, 0x04, 0x08, 0xF0, 0x00,
-  0xF0, 0xF8, 0xFC, 0x3C, 0xDC, 0xDC,
-  0xDC, 0x3C, 0xFC, 0xF8, 0xF0, 0x00,
   0xFE, 0xC1, 0xC1, 0xC9, 0xC5, 0xDD,
   0xC5, 0xC9, 0xC1, 0xC1, 0xFE, 0x00,
   0xFC, 0xFE, 0xFE, 0xEE, 0xF6, 0xC6,
@@ -197,15 +197,15 @@ const unsigned char font[] PROGMEM = {
   0x08, 0x09, 0x0B, 0x08, 0x08, 0x07,
   0x07, 0x08, 0x08, 0x0B, 0x09, 0x08,
   0x08, 0x08, 0x0B, 0x08, 0x08, 0x07,
+  0x07, 0x08, 0x09, 0x09, 0x08, 0x08,
+  0x08, 0x08, 0x09, 0x09, 0x08, 0x07,
+  0x07, 0x08, 0x09, 0x09, 0x08, 0x08,
+  0x08, 0x08, 0x09, 0x09, 0x08, 0x07,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x07, 0x08, 0x10, 0x13, 0x11, 0x11,
-  0x11, 0x13, 0x10, 0x08, 0x07, 0x00,
-  0x07, 0x0F, 0x1F, 0x1C, 0x1E, 0x1E,
-  0x1E, 0x1C, 0x1F, 0x0F, 0x07, 0x00,
   0xFE, 0x01, 0xF1, 0xF9, 0xFD, 0xFD,
   0x05, 0x05, 0x09, 0xF1, 0x01, 0xFE,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xFE, 0x01, 0x39, 0x7D, 0x6D, 0x6D,
+  0x6D, 0x6D, 0xED, 0xC9, 0x01, 0xFE,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -236,8 +236,8 @@ const unsigned char font[] PROGMEM = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x07, 0x08, 0x08, 0x09, 0x0B, 0x0B,
   0x0A, 0x0A, 0x09, 0x08, 0x08, 0x07,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x07, 0x08, 0x09, 0x0B, 0x0B, 0x0B,
+  0x0B, 0x0B, 0x0B, 0x09, 0x08, 0x07,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/keyboards/sendyyeah/pix/keymaps/default/keymap.c b/keyboards/sendyyeah/pix/keymaps/default/keymap.c
index bcaf52d53b..951aadeae8 100644
--- a/keyboards/sendyyeah/pix/keymaps/default/keymap.c
+++ b/keyboards/sendyyeah/pix/keymaps/default/keymap.c
@@ -16,11 +16,12 @@
 
 #include QMK_KEYBOARD_H
 
-#define LAYERNUM 2
+#define LAYERNUM 3
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     [0] = LAYOUT(KC_MUTE, KC_MPLY, KC_MPRV, KC_MNXT, TO(1)),
-    [1] = LAYOUT(KC_TRNS, KC_MSTP, KC_MRWD, KC_MFFD, TO(0))
+    [1] = LAYOUT(KC_TRNS, KC_MSTP, KC_MRWD, KC_MFFD, TO(2)),
+    [2] = LAYOUT(KC_LSFT, RGB_MOD, RGB_HUI, RGB_SAI, TO(0))
 };
 
 int get_icon_start_position(int key_position) {
@@ -44,13 +45,12 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
                 oled_write_P(UP_ICON, false);
             } else {
                 tap_code(KC_VOLD);
-
                 oled_set_cursor(get_icon_start_position(7), 2);
                 oled_write_P(PSTR(" "), false);
                 oled_set_cursor(get_icon_start_position(7), 3);
                 oled_write_P(DOWN_ICON, false);
             }
-        } else {
+        } else if (layer_state_is(1)) {
             if (clockwise) {
                 tap_code(KC_BRIU);
                 oled_set_cursor(get_icon_start_position(7), 3);
@@ -64,6 +64,20 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
                 oled_set_cursor(get_icon_start_position(7), 3);
                 oled_write_P(DOWN_ICON, false);
             }
+        } else if (layer_state_is(2)) {
+            if (clockwise) {
+                rgblight_increase_val();
+                oled_set_cursor(get_icon_start_position(7), 3);
+                oled_write_P(PSTR(" "), false);
+                oled_set_cursor(get_icon_start_position(7), 2);
+                oled_write_P(UP_ICON, false);
+            } else {
+                rgblight_decrease_val();
+                oled_set_cursor(get_icon_start_position(7), 2);
+                oled_write_P(PSTR(" "), false);
+                oled_set_cursor(get_icon_start_position(7), 3);
+                oled_write_P(DOWN_ICON, false);
+            }
         }
     }
     return true;
@@ -174,7 +188,34 @@ void draw_brightness_icon(int key_position, int row) {
     oled_write_P(ICON_BRIGHTNESS_1, false);
 }
 
-bool oled_task_user(void) {
+void draw_mode_icon(int key_position, int row) {
+    static const char PROGMEM ICON_MODE_0[] = {0x94, 0x95, 0};
+    static const char PROGMEM ICON_MODE_1[] = {0xB4, 0xB5, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_MODE_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_MODE_1, false);
+}
+
+void draw_hue_icon(int key_position, int row) {
+    static const char PROGMEM ICON_HUE_0[] = {0x96, 0x97, 0};
+    static const char PROGMEM ICON_HUE_1[] = {0xB6, 0xB7, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_HUE_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_HUE_1, false);
+}
+
+void draw_sat_icon(int key_position, int row) {
+    static const char PROGMEM ICON_SAT_0[] = {0xBB, 0xBC, 0};
+    static const char PROGMEM ICON_SAT_1[] = {0xDB, 0xDC, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_SAT_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_SAT_1, false);
+}
+
+void oled_task_user(void) {
     // Host Keyboard Layer Status
     static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
     static const char PROGMEM ICON_ENCODER[] = {0x84, 0x85, 0x86, 0x87, 0};
@@ -189,6 +230,9 @@ bool oled_task_user(void) {
         case 1:
             oled_write_P(PSTR("2ND "), false);
             break;
+        case 2:
+            oled_write_P(PSTR("3RD "), false);
+            break;
         default:
             // Or use the write_ln shortcut over adding '\n' to the end of your string
             oled_write_P(PSTR("UNDF"), false);
@@ -204,6 +248,9 @@ bool oled_task_user(void) {
         case 1:
             oled_write_P(PSTR("BRGT"), false);
             break;
+        case 2:
+            oled_write_P(PSTR("RGB "), false);
+            break;
         default:
             // Or use the write_ln shortcut over adding '\n' to the end of your string
             oled_write_P(PSTR("UNDF"), false);
@@ -227,6 +274,14 @@ bool oled_task_user(void) {
             draw_lower_icon(5, 2);
             draw_brightness_icon(6, 2);
             break;
+        case 2:
+            draw_raise_icon(1, 2);
+            draw_mode_icon(2, 2);
+            draw_hue_icon(3, 2);
+            draw_sat_icon(4, 2);
+            draw_lower_icon(5, 2);
+            draw_brightness_icon(6, 2);
+            break;
     }
 
     return false;
diff --git a/keyboards/sendyyeah/pix/keymaps/via/keymap.c b/keyboards/sendyyeah/pix/keymaps/via/keymap.c
index bcaf52d53b..951aadeae8 100644
--- a/keyboards/sendyyeah/pix/keymaps/via/keymap.c
+++ b/keyboards/sendyyeah/pix/keymaps/via/keymap.c
@@ -16,11 +16,12 @@
 
 #include QMK_KEYBOARD_H
 
-#define LAYERNUM 2
+#define LAYERNUM 3
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     [0] = LAYOUT(KC_MUTE, KC_MPLY, KC_MPRV, KC_MNXT, TO(1)),
-    [1] = LAYOUT(KC_TRNS, KC_MSTP, KC_MRWD, KC_MFFD, TO(0))
+    [1] = LAYOUT(KC_TRNS, KC_MSTP, KC_MRWD, KC_MFFD, TO(2)),
+    [2] = LAYOUT(KC_LSFT, RGB_MOD, RGB_HUI, RGB_SAI, TO(0))
 };
 
 int get_icon_start_position(int key_position) {
@@ -44,13 +45,12 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
                 oled_write_P(UP_ICON, false);
             } else {
                 tap_code(KC_VOLD);
-
                 oled_set_cursor(get_icon_start_position(7), 2);
                 oled_write_P(PSTR(" "), false);
                 oled_set_cursor(get_icon_start_position(7), 3);
                 oled_write_P(DOWN_ICON, false);
             }
-        } else {
+        } else if (layer_state_is(1)) {
             if (clockwise) {
                 tap_code(KC_BRIU);
                 oled_set_cursor(get_icon_start_position(7), 3);
@@ -64,6 +64,20 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
                 oled_set_cursor(get_icon_start_position(7), 3);
                 oled_write_P(DOWN_ICON, false);
             }
+        } else if (layer_state_is(2)) {
+            if (clockwise) {
+                rgblight_increase_val();
+                oled_set_cursor(get_icon_start_position(7), 3);
+                oled_write_P(PSTR(" "), false);
+                oled_set_cursor(get_icon_start_position(7), 2);
+                oled_write_P(UP_ICON, false);
+            } else {
+                rgblight_decrease_val();
+                oled_set_cursor(get_icon_start_position(7), 2);
+                oled_write_P(PSTR(" "), false);
+                oled_set_cursor(get_icon_start_position(7), 3);
+                oled_write_P(DOWN_ICON, false);
+            }
         }
     }
     return true;
@@ -174,7 +188,34 @@ void draw_brightness_icon(int key_position, int row) {
     oled_write_P(ICON_BRIGHTNESS_1, false);
 }
 
-bool oled_task_user(void) {
+void draw_mode_icon(int key_position, int row) {
+    static const char PROGMEM ICON_MODE_0[] = {0x94, 0x95, 0};
+    static const char PROGMEM ICON_MODE_1[] = {0xB4, 0xB5, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_MODE_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_MODE_1, false);
+}
+
+void draw_hue_icon(int key_position, int row) {
+    static const char PROGMEM ICON_HUE_0[] = {0x96, 0x97, 0};
+    static const char PROGMEM ICON_HUE_1[] = {0xB6, 0xB7, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_HUE_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_HUE_1, false);
+}
+
+void draw_sat_icon(int key_position, int row) {
+    static const char PROGMEM ICON_SAT_0[] = {0xBB, 0xBC, 0};
+    static const char PROGMEM ICON_SAT_1[] = {0xDB, 0xDC, 0};
+    oled_set_cursor(get_icon_start_position(key_position), row);
+    oled_write_P(ICON_SAT_0, false);
+    oled_set_cursor(get_icon_start_position(key_position), row + 1);
+    oled_write_P(ICON_SAT_1, false);
+}
+
+void oled_task_user(void) {
     // Host Keyboard Layer Status
     static const char PROGMEM ICON_LAYER[] = {0x80, 0x81, 0x82, 0x83, 0};
     static const char PROGMEM ICON_ENCODER[] = {0x84, 0x85, 0x86, 0x87, 0};
@@ -189,6 +230,9 @@ bool oled_task_user(void) {
         case 1:
             oled_write_P(PSTR("2ND "), false);
             break;
+        case 2:
+            oled_write_P(PSTR("3RD "), false);
+            break;
         default:
             // Or use the write_ln shortcut over adding '\n' to the end of your string
             oled_write_P(PSTR("UNDF"), false);
@@ -204,6 +248,9 @@ bool oled_task_user(void) {
         case 1:
             oled_write_P(PSTR("BRGT"), false);
             break;
+        case 2:
+            oled_write_P(PSTR("RGB "), false);
+            break;
         default:
             // Or use the write_ln shortcut over adding '\n' to the end of your string
             oled_write_P(PSTR("UNDF"), false);
@@ -227,6 +274,14 @@ bool oled_task_user(void) {
             draw_lower_icon(5, 2);
             draw_brightness_icon(6, 2);
             break;
+        case 2:
+            draw_raise_icon(1, 2);
+            draw_mode_icon(2, 2);
+            draw_hue_icon(3, 2);
+            draw_sat_icon(4, 2);
+            draw_lower_icon(5, 2);
+            draw_brightness_icon(6, 2);
+            break;
     }
 
     return false;
diff --git a/keyboards/sendyyeah/pix/rules.mk b/keyboards/sendyyeah/pix/rules.mk
index 7f4a71aab8..c5eb6c7bcc 100644
--- a/keyboards/sendyyeah/pix/rules.mk
+++ b/keyboards/sendyyeah/pix/rules.mk
@@ -14,7 +14,7 @@ CONSOLE_ENABLE = no         # Console for debug
 COMMAND_ENABLE = no         # Commands for debug and configuration
 NKRO_ENABLE = no            # Enable N-Key Rollover
 BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no       # Enable keyboard RGB underglow
+RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
 AUDIO_ENABLE = no           # Audio output
 ENCODER_ENABLE = yes
 OLED_ENABLE = yes

From 067d94f0b6c957c4e1c0ae1d680b420651fb3766 Mon Sep 17 00:00:00 2001
From: Albert Y <76888457+filterpaper@users.noreply.github.com>
Date: Mon, 27 Dec 2021 18:16:19 +0800
Subject: [PATCH 2/2] Add layer condition example to encoder callback function
 (#15490)

Co-authored-by: filterpaper <filterpaper@localhost>
---
 docs/feature_encoders.md | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md
index 8e854c1e58..8ab5ca9c46 100644
--- a/docs/feature_encoders.md
+++ b/docs/feature_encoders.md
@@ -87,6 +87,43 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
 
 !> If you return `true`, this will allow the keyboard level code to run, as well.  Returning `false` will override the keyboard level code.  Depending on how the keyboard level function is set up. 
 
+Layer conditions can also be used with the callback function like the following:
+
+```c
+bool encoder_update_user(uint8_t index, bool clockwise) {
+    if (get_highest_layer(layer_state|default_layer_state) > 0) {
+        if (index == 0) {
+            if (clockwise) {
+                tap_code(KC_WH_D);
+            } else {
+                tap_code(KC_WH_U);
+            }
+        } else if (index == 1) {
+            if (clockwise) {
+                tap_code(KC_VOLU);
+            } else {
+                tap_code(KC_VOLD);
+            }
+        }
+    } else {  /* Layer 0 */
+        if (index == 0) {
+            if (clockwise) {
+                tap_code(KC_PGDN);
+            } else {
+                tap_code(KC_PGUP);
+            }
+        } else if (index == 1) {
+            if (clockwise) {
+                tap_code(KC_DOWN);
+            } else {
+                tap_code(KC_UP);
+            }
+        }
+    }
+    return false;
+}
+```
+
 ## Hardware
 
 The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground.