summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJumail Mundekkat <mundekkat@hotmail.com>2020-01-27 09:06:56 +1100
committerridingqwerty <george.g.koenig@gmail.com>2020-01-26 17:06:56 -0500
commit645c5fabf24411fe65d2172a3509c26e053651a2 (patch)
treebbba022ea3e1a9605f80fc4ca97c991dc941d4ed
parent7f7b6b08e8afdd09f83b180e4c03b04f9a531035 (diff)
Add VIA support to MxSS, plus minor tweaks (#7809)
* Add VIA support to mxss and general cleanup * Add support for RGB test for FLEDs * Add LAYOUT_all to allow for more configuration * Remove blank layers * Updated readme * Improve use of EEPROM * Credit where its due * Use the latest iteration of rgblight code * Keep the RGB timer running if the front LED is in RGB mode * Fix RGB breathing animation * Better supported RGB animation Only thing not working is alternating, but that's not too important * Abstract front LED handlers from main kb code * Add support for indicator LED color changing * Remove debug statement * Persist indicator LED colors * Mark custom sections in rgblight.c * Light commenting * Fix up keymaps * Add/update comments * Remove bloat from default hex * Tidy a stray tab * Out with the old, in with the new * Out with the old, in with the new * Add LAYER_STATE_8BIT for VIA keymap
-rw-r--r--keyboards/mxss/config.h13
-rw-r--r--keyboards/mxss/keymaps/default/keymap.c19
-rw-r--r--keyboards/mxss/keymaps/via/config.h19
-rw-r--r--keyboards/mxss/keymaps/via/keymap.c33
-rw-r--r--keyboards/mxss/keymaps/via/rules.mk1
-rw-r--r--keyboards/mxss/mxss.c205
-rw-r--r--keyboards/mxss/mxss.h19
-rw-r--r--keyboards/mxss/mxss_frontled.c264
-rw-r--r--keyboards/mxss/mxss_frontled.h57
-rw-r--r--keyboards/mxss/readme.md7
-rw-r--r--keyboards/mxss/rgblight.c1628
-rw-r--r--keyboards/mxss/rgblight.h362
-rw-r--r--keyboards/mxss/rules.mk6
-rw-r--r--keyboards/mxss/templates/keymap.c19
14 files changed, 1687 insertions, 965 deletions
diff --git a/keyboards/mxss/config.h b/keyboards/mxss/config.h
index 812f301d6f..264caec970 100644
--- a/keyboards/mxss/config.h
+++ b/keyboards/mxss/config.h
@@ -21,12 +21,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x4D78 // "Mx" -> MxBlue
+#define PRODUCT_ID 0x5353 // "SS" -> MxSS
#define DEVICE_VER 0x0001
#define MANUFACTURER MxBlue
#define PRODUCT MxSS
-#define DESCRIPTION Custom Polycarb Keyboard
+#define DESCRIPTION MxSS Polycarb Keyboard
/* key matrix size */
#define MATRIX_ROWS 5
@@ -56,6 +56,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
+// Just for posterity, define bootlite matrix pos
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+
+// FLED config takes up 1 byte, stored color count takes 1, stored colors take up to 8
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 10
+
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
diff --git a/keyboards/mxss/keymaps/default/keymap.c b/keyboards/mxss/keymaps/default/keymap.c
index 17cebe0c8f..b69d91df9d 100644
--- a/keyboards/mxss/keymaps/default/keymap.c
+++ b/keyboards/mxss/keymaps/default/keymap.c
@@ -15,31 +15,32 @@
*/
#include QMK_KEYBOARD_H
+hs_set caps_color = { .hue = 0, .sat = 255 };
+
// Colors for layers
// Format: {hue, saturation}
// {0, 0} to turn off the LED
// Add additional rows to handle more layers
-const hs_set layer_colors[] = {
- [0] = {0, 0}, // Color for Layer 0
- [1] = {86, 255}, // Color for Layer 1
- [2] = {36, 255}, // Color for Layer 2
- [3] = {185, 255}, // Color for Layer 3
+hs_set layer_colors[4] = {
+ [0] = {.hue = 0, .sat = 0}, // Color for Layer 0
+ [1] = {.hue = 86, .sat = 255}, // Color for Layer 1
+ [2] = {.hue = 36, .sat = 255}, // Color for Layer 2
+ [3] = {.hue = 185, .sat = 255}, // Color for Layer 3
};
-const size_t lc_size = sizeof(layer_colors) / sizeof(uint16_t);
+size_t lc_size = sizeof(layer_colors) / sizeof(uint16_t);
// Use NEW_SAFE_RANGE to define new custom keycodes in order to not overwrite the ones used for front LED control
enum custom_keycodes {
- MY_KEYCODE = NEW_SAFE_RANGE,
+ MY_KEYCODE = NEW_SAFE_RANGE,
};
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT( /* Base */
KC_GESC, 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_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, KC_DEL,
KC_CAPSLOCK, 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_SPACE, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
LAYOUT( /* L1 */
diff --git a/keyboards/mxss/keymaps/via/config.h b/keyboards/mxss/keymaps/via/config.h
new file mode 100644
index 0000000000..7451a7be4f
--- /dev/null
+++ b/keyboards/mxss/keymaps/via/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#define LAYER_STATE_8BIT
diff --git a/keyboards/mxss/keymaps/via/keymap.c b/keyboards/mxss/keymaps/via/keymap.c
new file mode 100644
index 0000000000..34e40592a6
--- /dev/null
+++ b/keyboards/mxss/keymaps/via/keymap.c
@@ -0,0 +1,33 @@
+/* Copyright 2018 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT_all( /* L0 */
+ KC_GESC, 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_NO, KC_BSPC,
+ 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, KC_DEL,
+ KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NO, 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_SPACE, KC_SPACE, KC_SPACE, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ LAYOUT_all( /* L1 */
+ KC_GRV, 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_TRNS, KC_TRNS,
+ KC_TRNS, KC_MPLY, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PSCR, FLED_VAD, FLED_VAI, FLED_MOD, RGB_VAI,
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RGB_MOD, RGB_SAI, RGB_TOG,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI
+ )
+};
diff --git a/keyboards/mxss/keymaps/via/rules.mk b/keyboards/mxss/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/mxss/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/mxss/mxss.c b/keyboards/mxss/mxss.c
index 42ecdbc469..48ea466419 100644
--- a/keyboards/mxss/mxss.c
+++ b/keyboards/mxss/mxss.c
@@ -1,4 +1,4 @@
-/* Copyright 2018 Jumail Mundekkat / MxBlue
+/* Copyright 2020 Jumail Mundekkat / MxBlue
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -12,63 +12,29 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * EEPROM management code from ../cannonkeys/stm32f072/keyboard.c
*/
-
+
#include QMK_KEYBOARD_H
#include "tmk_core/common/eeprom.h"
#include "tmk_core/common/action_layer.h"
#include "rgblight.h"
+#include "via.h"
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
-// Variables for controlling front LED application
-uint8_t fled_mode; // Mode for front LEDs
-uint8_t fled_val; // Brightness for front leds (0 - 255)
-LED_TYPE fleds[2]; // Front LED rgb values for indicator mode use
-
-// Predefined colors for layers
-// Format: {hue, saturation}
-// {0, 0} to turn off the LED
-// Add additional rows to handle more layers
-__attribute__ ((weak))
-const hs_set layer_colors[] = {
- [0] = {0, 0}, // Color for Layer 0
- [1] = {86, 255}, // Color for Layer 1
- [2] = {36, 255}, // Color for Layer 2
- [3] = {185, 255}, // Color for Layer 3
-};
-
-__attribute__ ((weak))
-const size_t lc_size = sizeof(layer_colors) / sizeof(uint16_t);
+void via_init_kb(void) {
+ fled_init();
+}
void matrix_init_kb(void) {
- // If EEPROM config exists, load it
- if (eeprom_is_valid()) {
- fled_config fled_conf;
- fled_conf.raw = eeprom_read_byte(EEPROM_FRONTLED_ADDR);
- fled_mode = fled_conf.mode;
- fled_val = fled_conf.val * FLED_VAL_STEP;
- // Else, default config
- } else {
- fled_mode = FLED_RGB;
- fled_val = 10 * FLED_VAL_STEP;
- eeprom_update_conf(); // Store default config to EEPROM
- }
-
- // Set default values for leds
- setrgb(0, 0, 0, &fleds[0]);
- setrgb(0, 0, 0, &fleds[1]);
-
- // Handle lighting for indicator mode
- if (fled_mode == FLED_INDI) {
- // Enable capslock led if enabled on host
- if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))
- sethsv(FLED_CAPS_H, FLED_CAPS_S, fled_val, &fleds[0]);
-
- // Determine and set colour of layer LED according to current layer
- // if hue = sat = 0, leave LED off
- uint8_t layer = biton32(layer_state);
- if (layer < lc_size && !(layer_colors[layer].hue == 0 && layer_colors[layer].hue == 0))
- sethsv(layer_colors[layer].hue, layer_colors[layer].sat, fled_val, &fleds[1]);
- }
+ // If VIA is disabled, we still need to load settings
+ // Call via_init_kb() the same way as via_init(), with setting
+ // EEPROM valid afterwards.
+#ifndef VIA_ENABLE
+ fled_init();
+ via_eeprom_set_valid(true);
+#endif // VIA_ENABLE
matrix_init_user();
}
@@ -82,132 +48,35 @@ void matrix_scan_kb(void) {
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
// Handle custom keycodes for front LED operation
- switch (keycode) {
- case FLED_MOD: // Change between front LED operation modes (off, indicator, RGB)
- if (record->event.pressed)
- fled_mode_cycle();
- break;
-
- case FLED_VAI: // Increase the brightness of the front LEDs by FLED_VAL_STEP
- if (record->event.pressed)
- fled_val_increase();
- break;
-
- case FLED_VAD: // Decrease the brightness of the front LEDs by FLED_VAL_STEP
- if (record->event.pressed)
- fled_val_decrease();
- break;
-
- default:
- break; // Process all other keycodes normally
- }
-
+ process_record_fled(keycode, record);
return process_record_user(keycode, record);
}
-void led_set_kb(uint8_t usb_led) {
- // Set indicator LED appropriately, whether it is used or not
- if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
- sethsv(FLED_CAPS_H, FLED_CAPS_S, fled_val, &fleds[0]);
- } else {
- setrgb(0, 0, 0, &fleds[0]);
- }
-
- rgblight_set();
- led_set_user(usb_led);
-}
-
-uint32_t layer_state_set_kb(uint32_t state) {
- // Determine and set colour of layer LED according to current layer
- // if hue = sat = 0, leave LED off
- uint8_t layer = biton32(state);
-
- if (layer < lc_size && !(layer_colors[layer].hue == 0 && layer_colors[layer].hue == 0))
- sethsv(layer_colors[layer].hue, layer_colors[layer].sat, fled_val, &fleds[1]);
- else
- setrgb(0, 0, 0, &fleds[1]);
-
- return state;
-}
-
-// EEPROM Management
-
-// Test if magic value is present at expected location
-bool eeprom_is_valid(void)
-{
- return (eeprom_read_word(EEPROM_MAGIC_ADDR) == EEPROM_MAGIC);
-}
-
-// Set magic value at expected location
-void eeprom_set_valid(bool valid)
-{
- eeprom_update_word(EEPROM_MAGIC_ADDR, valid ? EEPROM_MAGIC : 0xFFFF);
+bool led_update_kb(led_t led_state) {
+ fled_lock_update(led_state);
+ return led_update_user(led_state);
}
-// Store current front led config in EEPROM
-void eeprom_update_conf(void)
-{
- // Create storage struct and set values
- fled_config conf;
- conf.mode = fled_mode;
-
- // Small hack to ensure max value is stored correctly
- if (fled_val == 255)
- conf.val = 256 / FLED_VAL_STEP;
- else
- conf.val = fled_val / FLED_VAL_STEP;
-
- // Set magic value and store config
- eeprom_set_valid(true);
- eeprom_update_byte(EEPROM_FRONTLED_ADDR, conf.raw);
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ fled_layer_update(state);
+ return layer_state_set_user(state);
}
-// Custom keycode functions
+// Fallback eeprom functions if VIA is not enabled
+#ifndef VIA_ENABLE
-void fled_mode_cycle(void)
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid)
{
- // FLED -> FLED_RGB -> FLED_INDI
- switch (fled_mode) {
- case FLED_OFF:
- fled_mode = FLED_RGB;
- break;
-
- case FLED_RGB:
- fled_mode = FLED_INDI;
- break;
-
- case FLED_INDI:
- fled_mode = FLED_OFF;
- break;
- }
-
- // Update stored config
- eeprom_update_conf();
- rgblight_set();
+ char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+ uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
+ uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
+ uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
+
+ eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
+ eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
+ eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
}
-void fled_val_increase(void)
-{
- // Increase val by FLED_VAL_STEP, handling the upper edge case
- if (fled_val + FLED_VAL_STEP > 255)
- fled_val = 255;
- else
- fled_val += FLED_VAL_STEP;
-
- // Update stored config
- eeprom_update_conf();
- rgblight_set();
-}
-
-void fled_val_decrease(void)
-{
- // Decrease val by FLED_VAL_STEP, handling the lower edge case
- if (fled_val - FLED_VAL_STEP > 255)
- fled_val = 255;
- else
- fled_val -= FLED_VAL_STEP;
-
- // Update stored config
- eeprom_update_conf();
- rgblight_set();
-}
+#endif
diff --git a/keyboards/mxss/mxss.h b/keyboards/mxss/mxss.h
index 3572a19cdb..4074d411cc 100644
--- a/keyboards/mxss/mxss.h
+++ b/keyboards/mxss/mxss.h
@@ -13,8 +13,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef MXSS_H
-#define MXSS_H
+#pragma once
#include "quantum.h"
#include "mxss_frontled.h"
@@ -204,4 +203,18 @@
{ k40, k41, k42, k43, KC_NO, KC_NO, k46, KC_NO, k48, KC_NO, k4A, k4B, k4C, k4D, k4E }, \
}
-#endif
+// All the gubs
+#define LAYOUT_all( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \
+ k40, k41, k42, k43, k46, k48, k4A, k4B, k4C, k4D, k4E \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
+ { k40, k41, k42, k43, KC_NO, KC_NO, k46, KC_NO, k48, KC_NO, k4A, k4B, k4C, k4D, k4E }, \
+}
diff --git a/keyboards/mxss/mxss_frontled.c b/keyboards/mxss/mxss_frontled.c
new file mode 100644
index 0000000000..3f19747d28
--- /dev/null
+++ b/keyboards/mxss/mxss_frontled.c
@@ -0,0 +1,264 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Extended from the work done by fcoury: https://github.com/qmk/qmk_firmware/pull/4915
+ */
+
+#include "mxss_frontled.h"
+#include "tmk_core/common/eeprom.h"
+#include "rgblight.h"
+#include "via.h"
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
+
+// Variables for controlling front LED application
+uint8_t fled_mode; // Mode for front LEDs
+uint8_t fled_val; // Brightness for front leds (0 - 255)
+LED_TYPE fleds[2]; // Front LED rgb values for indicator mode use
+
+// Layer indicator colors
+__attribute__ ((weak))
+hs_set layer_colors[FRONTLED_COLOR_MAXCNT];
+
+// Caps lock indicator color
+__attribute__ ((weak))
+hs_set caps_color;
+
+__attribute__ ((weak))
+size_t lc_size = sizeof(layer_colors) / sizeof(hs_set);
+
+void fled_init(void) {
+ // If EEPROM config exists, load it
+ // If VIA EEPROM exists, FLED config should too
+ if (via_eeprom_is_valid()) {
+ fled_load_conf();
+ // Else, default config
+ } else {
+ // Default mode/brightness
+ fled_mode = FLED_RGB;
+ fled_val = 10 * FLED_VAL_STEP;
+
+ // Default colors
+ caps_color.hue = 0;
+ caps_color.sat = 255;
+ layer_colors[0].hue = 0;
+ layer_colors[0].sat = 0;
+ layer_colors[1].hue = 86;
+ layer_colors[1].sat = 255;
+ layer_colors[2].hue = 36;
+ layer_colors[2].sat = 255;
+ layer_colors[3].hue = 185;
+ layer_colors[3].sat = 255;
+
+ fled_update_conf(); // Store default config to EEPROM
+ }
+
+ // Set default values for leds
+ setrgb(0, 0, 0, &fleds[0]);
+ setrgb(0, 0, 0, &fleds[1]);
+
+ // Handle lighting for indicator mode
+ if (fled_mode == FLED_INDI) {
+ fled_lock_update(host_keyboard_led_state());
+ fled_layer_update(layer_state);
+ }
+}
+
+void process_record_fled(uint16_t keycode, keyrecord_t *record) {
+ // Handle custom keycodes for front LED operation
+ switch (keycode) {
+ case FLED_MOD: // Change between front LED operation modes (off, indicator, RGB)
+ if (record->event.pressed)
+ fled_mode_cycle();
+ break;
+
+ case FLED_VAI: // Increase the brightness of the front LEDs by FLED_VAL_STEP
+ if (record->event.pressed)
+ fled_val_increase();
+ break;
+
+ case FLED_VAD: // Decrease the brightness of the front LEDs by FLED_VAL_STEP
+ if (record->event.pressed)
+ fled_val_decrease();
+ break;
+
+ default:
+ break; // Process all other keycodes normally
+ }
+
+ return;
+}
+
+void fled_load_conf(void) {
+ // Load config
+ fled_config fled_conf;
+ fled_conf.raw = eeprom_read_byte(FRONTLED_CONF_ADDR);
+ fled_mode = fled_conf.mode;
+ fled_val = fled_conf.val * FLED_VAL_STEP;
+
+ // Load color data
+ uint8_t stored_cnt = eeprom_read_byte(FRONTLED_COLOR_CNT_ADDR);
+ uint16_t *color_ptr = FRONTLED_COLOR_ADDR;
+ caps_color.raw = eeprom_read_word(color_ptr); // Should always store at least 1 color
+ for (uint8_t i = 1; i < stored_cnt; i++) {
+ if (i == lc_size) // Can't load more layers than we have available
+ break;
+ layer_colors[i].raw = eeprom_read_word(&color_ptr[i]);
+ }
+ layer_colors[0].raw = 0; // hue = sat = 0 for layer 0
+}
+
+// Store current front led config in EEPROM
+void fled_update_conf(void)
+{
+ // Create storage struct and set values
+ fled_config conf;
+ conf.mode = fled_mode;
+
+ // Small hack to ensure max value is stored correctly
+ if (fled_val == 255)
+ conf.val = 256 / FLED_VAL_STEP;
+ else
+ conf.val = fled_val / FLED_VAL_STEP;
+
+ // Store config
+ eeprom_update_byte(FRONTLED_CONF_ADDR, conf.raw);
+
+ // Store color data
+ uint16_t *color_ptr = FRONTLED_COLOR_ADDR;
+ eeprom_update_word(color_ptr, caps_color.raw);
+ // Start from 1, layer 0 is not modifiable and therefore not persisted
+ uint8_t i = 1;
+ for (; i < lc_size; i++) {
+ if (i == FRONTLED_COLOR_MAXCNT) // Can't store more than the EEPROM we have available
+ break;
+ eeprom_update_word(&color_ptr[i], layer_colors[i].raw);
+ }
+ eeprom_update_byte(FRONTLED_COLOR_CNT_ADDR, i); // For safety, store the count of colors stored
+}
+
+// Custom keycode functions
+
+void fled_mode_cycle(void)
+{
+ // FLED -> FLED_RGB -> FLED_INDI
+ switch (fled_mode) {
+ case FLED_OFF:
+ fled_mode = FLED_RGB;
+ rgblight_timer_enable();
+ break;
+
+ case FLED_RGB:
+ fled_mode = FLED_INDI;
+ break;
+
+ case FLED_INDI:
+ fled_mode = FLED_OFF;
+ break;
+ }
+
+ // Update stored config
+ fled_update_conf();
+ rgblight_set();
+}
+
+void fled_val_increase(void)
+{
+ // Increase val by FLED_VAL_STEP, handling the upper edge case
+ if (fled_val + FLED_VAL_STEP > 255)
+ fled_val = 255;
+ else
+ fled_val += FLED_VAL_STEP;
+
+ // Update stored config
+ fled_update_conf();
+ rgblight_set();
+}
+
+void fled_val_decrease(void)
+{
+ // Decrease val by FLED_VAL_STEP, handling the lower edge case
+ if (fled_val - FLED_VAL_STEP > 255)
+ fled_val = 255;
+ else
+ fled_val -= FLED_VAL_STEP;
+
+ // Update stored config
+ fled_update_conf();
+ rgblight_set();
+}
+
+void fled_layer_update(layer_state_t state) {
+ // Determine and set colour of layer LED according to current layer
+ // if hue = sat = 0, leave LED off
+ uint8_t layer = get_highest_layer(state);
+
+ if (layer < lc_size && !(layer_colors[layer].hue == 0 && layer_colors[layer].sat == 0)) {
+ sethsv(layer_colors[layer].hue, layer_colors[layer].sat, fled_val, &fleds[1]);
+ } else {
+ setrgb(0, 0, 0, &fleds[1]);
+ }
+}
+
+void fled_lock_update(led_t led_state) {
+ // Set indicator LED appropriately, whether it is used or not
+ if (led_state.caps_lock) {
+ sethsv(caps_color.hue, caps_color.sat, fled_val, &fleds[0]);
+ } else {
+ setrgb(0, 0, 0, &fleds[0]);
+ }
+
+ rgblight_set();
+}
+
+void set_fled_layer_color(uint8_t layer, hs_set hs) {
+ // Update layer colors and refresh LEDs
+ layer_colors[layer] = hs;
+ fled_layer_update(layer_state);
+ fled_update_conf();
+}
+
+hs_set get_fled_layer_color(uint8_t layer) {
+ return layer_colors[layer];
+}
+
+void set_fled_caps_color(hs_set hs) {
+ // Update caplock color and refresh LEDs
+ caps_color = hs;
+ fled_lock_update(host_keyboard_led_state());
+ fled_update_conf();
+}
+
+hs_set get_fled_caps_color(void) {
+ return caps_color;
+}
+
+// Fallback eeprom functions if VIA is not enabled
+#ifndef VIA_ENABLE
+
+// Can be called in an overriding via_init_kb() to test if keyboard level code usage of
+// EEPROM is invalid and use/save defaults.
+bool via_eeprom_is_valid(void)
+{
+ char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+ uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
+ uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
+ uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
+
+ return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
+ eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
+ eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
+}
+
+#endif
diff --git a/keyboards/mxss/mxss_frontled.h b/keyboards/mxss/mxss_frontled.h
index 1350266ba9..3660668655 100644
--- a/keyboards/mxss/mxss_frontled.h
+++ b/keyboards/mxss/mxss_frontled.h
@@ -1,4 +1,4 @@
-/* Copyright 2018 Jumail Mundekkat / MxBlue
+/* Copyright 2020 Jumail Mundekkat / MxBlue
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,11 +16,12 @@
// EEPROM management code taken from Wilba6582
// https://github.com/Wilba6582/qmk_firmware/blob/zeal60/keyboards/zeal60/zeal_eeprom.h
-
-#ifndef MXSS_FRONTLED_H
-#define MXSS_FRONTLED_H
+#pragma once
+
+#include "quantum.h"
#include "quantum_keycodes.h"
+#include "via.h"
// RGBLED index for front LEDs
#define RGBLIGHT_FLED1 14
@@ -29,13 +30,13 @@
// Brightness increase step for front LEDs
#define FLED_VAL_STEP 8
-// QMK never uses more then 32bytes of EEPROM, so our region starts there
-// Magic value to verify the state of the EEPROM
-#define EEPROM_MAGIC 0xC3E7
-#define EEPROM_MAGIC_ADDR ((void*)32)
-
// Front LED settings
-#define EEPROM_FRONTLED_ADDR ((void*)34)
+#define FRONTLED_CONF_ADDR ((uint8_t*) VIA_EEPROM_CUSTOM_CONFIG_ADDR)
+#define FRONTLED_COLOR_CNT_ADDR (FRONTLED_CONF_ADDR + 1)
+#define FRONTLED_COLOR_ADDR ((uint16_t*)(FRONTLED_COLOR_CNT_ADDR + 1))
+
+// No point persisting more 4, VIA only allows editing of 3 + 1 for caps
+#define FRONTLED_COLOR_MAXCNT 4
// Modes for front LEDs
#define FLED_OFF 0b00
@@ -43,10 +44,6 @@
#define FLED_RGB 0b10
#define FLED_UNDEF 0b11
-// Hard-coded color for capslock indicator in FLED_INDI mode, H:0% S:100% = Red
-#define FLED_CAPS_H 0
-#define FLED_CAPS_S 255
-
// Config storage format for EEPROM
typedef union {
uint8_t raw;
@@ -57,25 +54,35 @@ typedef union {
} fled_config;
// Structure to store hue and saturation values
-typedef struct _hs_set {
- uint16_t hue;
- uint8_t sat;
+typedef union {
+ uint16_t raw;
+ struct {
+ uint8_t hue;
+ uint8_t sat;
+ };
} hs_set;
// Custom keycodes for front LED control
enum fled_keycodes {
- FLED_MOD = SAFE_RANGE,
- FLED_VAI,
- FLED_VAD,
- NEW_SAFE_RANGE // define a new safe range
+ FLED_MOD = USER00, // USER00 = VIA custom keycode start
+ FLED_VAI,
+ FLED_VAD,
+ NEW_SAFE_RANGE // define a new safe range
};
-bool eeprom_is_valid(void); // Check if EEPROM has been set up
-void eeprom_set_valid(bool valid); // Change validity state of EEPROM
-void eeprom_update_conf(void); // Store current front LED config to EEPROM
+void fled_init(void); // Run init functions for front LEDs
+void process_record_fled(uint16_t keycode, keyrecord_t* record); // Process keycodes for front LEDs
+void fled_load_conf(void); // Load front LED config from EEPROM
+void fled_update_conf(void); // Store current front LED config to EEPROM
void fled_mode_cycle(void); // Cycle between the 3 modes for the front LEDs
void fled_val_increase(void); // Increase the brightness of the front LEDs
void fled_val_decrease(void); // Decrease the brightness of the front LEDs
-#endif //MXSS_FRONTLED_H \ No newline at end of file
+void fled_layer_update(layer_state_t state); // Process layer update for front LEDs
+void fled_lock_update(led_t led_state); // Process lock update for front LEDs
+
+void set_fled_layer_color(uint8_t layer, hs_set hs); // Set color for a given layer
+void set_fled_caps_color(hs_set hs); // Set color for the capslock indicator
+hs_set get_fled_caps_color(void); // Get color for the capslock indicator
+hs_set get_fled_layer_color(uint8_t layer); // Get color for a given layer
diff --git a/keyboards/mxss/readme.md b/keyboards/mxss/readme.md
index 181b6366a0..f35709adee 100644
--- a/keyboards/mxss/readme.md
+++ b/keyboards/mxss/readme.md
@@ -2,6 +2,11 @@
![MxSS - Polycarb 65% Kit for MX/SMK](https://i.imgur.com/WDTWcmU.jpg)
+### Important Note:
+**This PCB supports the VIA configurator, and this is the recommended way to configure the keymap on this keyboard. Building the firmware should only be necessary if you would like to change the colours of the front LEDs in indicator mode.**
+
+**For more information about the VIA configurator, [see here](https://caniusevia.com/).**
+
### Information:
- Case: Frosted Polycarbonate, CNC milled
@@ -51,4 +56,4 @@ Colors for FLED_INDI mode are hardcoded as hue/saturation values, the caps lock
# Further Notes
- As SAFE_RANGE is used for defining the custom keycodes seen above, please use NEW_SAFE_RANGE as the starting value for any custom keycodes in keymap.c, as per the example. \ No newline at end of file
+ As SAFE_RANGE is used for defining the custom keycodes seen above, please use NEW_SAFE_RANGE as the starting value for any custom keycodes in keymap.c, as per the example.
diff --git a/keyboards/mxss/rgblight.c b/keyboards/mxss/rgblight.c
index 73f94f3ab0..9e17510b59 100644
--- a/keyboards/mxss/rgblight.c
+++ b/keyboards/mxss/rgblight.c
@@ -14,814 +14,1166 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <math.h>
-#include <avr/eeprom.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
+#include <string.h>
+#ifdef __AVR__
+# include <avr/eeprom.h>
+# include <avr/interrupt.h>
+#endif
+#ifdef STM32_EEPROM_ENABLE
+# include "hal.h"
+# include "eeprom.h"
+# include "eeprom_stm32.h"
+#endif
+#include "wait.h"
#include "progmem.h"
#include "timer.h"
#include "rgblight.h"
+#include "color.h"
#include "debug.h"
#include "led_tables.h"
+#include "lib/lib8tion/lib8tion.h"
+#ifdef VELOCIKEY_ENABLE
+# include "velocikey.h"
+#endif
+// MxSS custom
#include "mxss_frontled.h"
-#ifndef RGBLIGHT_LIMIT_VAL
-#define RGBLIGHT_LIMIT_VAL 255
+#ifdef RGBLIGHT_SPLIT
+/* for split keyboard */
+# define RGBLIGHT_SPLIT_SET_CHANGE_MODE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_MODE
+# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_HSVS
+# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS rgblight_status.change_flags |= (RGBLIGHT_STATUS_CHANGE_MODE | RGBLIGHT_STATUS_CHANGE_HSVS)
+# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_TIMER
+# define RGBLIGHT_SPLIT_ANIMATION_TICK rgblight_status.change_flags |= RGBLIGHT_STATUS_ANIMATION_TICK
+#else
+# define RGBLIGHT_SPLIT_SET_CHANGE_MODE
+# define RGBLIGHT_SPLIT_SET_CHANGE_HSVS
+# define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS
+# define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE
+# define RGBLIGHT_SPLIT_ANIMATION_TICK
#endif
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#define MAX(a,b) (((a)>(b))?(a):(b))
-
-#define LED_PTRTOIND(ptr) ((uint32_t) (ptr - led)/sizeof(LED_TYPE))
-
-void copyrgb(LED_TYPE *src, LED_TYPE *dst);
+#define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_SINGLE_DYNAMIC(sym)
+#define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_MULTI_DYNAMIC(sym)
+#define _RGBM_TMP_STATIC(sym, msym) RGBLIGHT_MODE_##sym,
+#define _RGBM_TMP_DYNAMIC(sym, msym)
+static uint8_t static_effect_table[] = {
+#include "rgblight_modes.h"
+};
+
+#define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_MULTI_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
+#define _RGBM_TMP_STATIC(sym, msym) RGBLIGHT_MODE_##msym,
+#define _RGBM_TMP_DYNAMIC(sym, msym) RGBLIGHT_MODE_##msym,
+static uint8_t mode_base_table[] = {
+ 0, // RGBLIGHT_MODE_zero
+#include "rgblight_modes.h"
+};
+
+static inline int is_static_effect(uint8_t mode) { return memchr(static_effect