diff options
Diffstat (limited to 'quantum/via.c')
| -rw-r--r-- | quantum/via.c | 108 | 
1 files changed, 105 insertions, 3 deletions
| diff --git a/quantum/via.c b/quantum/via.c index 05ab799cbb..320bd5546d 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -38,6 +38,10 @@  #    define VIA_QMK_RGBLIGHT_ENABLE  #endif +#if defined(RGB_MATRIX_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) +#    define VIA_QMK_RGB_MATRIX_ENABLE +#endif +  #include "quantum.h"  #include "via.h" @@ -59,6 +63,12 @@ void via_qmk_rgblight_set_value(uint8_t *data);  void via_qmk_rgblight_get_value(uint8_t *data);  #endif +#if defined(VIA_QMK_RGB_MATRIX_ENABLE) +void via_qmk_rgb_matrix_set_value(uint8_t *data); +void via_qmk_rgb_matrix_get_value(uint8_t *data); +void eeconfig_update_rgb_matrix(void); +#endif +  // 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) { @@ -287,10 +297,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {  #if defined(VIA_QMK_RGBLIGHT_ENABLE)              via_qmk_rgblight_set_value(command_data);  #endif +#if defined(VIA_QMK_RGB_MATRIX_ENABLE) +            via_qmk_rgb_matrix_set_value(command_data); +#endif  #if defined(VIA_CUSTOM_LIGHTING_ENABLE)              raw_hid_receive_kb(data, length);  #endif -#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) +#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) && !defined(VIA_QMK_RGB_MATRIX_ENABLE)              // Return the unhandled state              *command_id = id_unhandled;  #endif @@ -303,10 +316,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {  #if defined(VIA_QMK_RGBLIGHT_ENABLE)              via_qmk_rgblight_get_value(command_data);  #endif +#if defined(VIA_QMK_RGB_MATRIX_ENABLE) +            via_qmk_rgb_matrix_get_value(command_data); +#endif  #if defined(VIA_CUSTOM_LIGHTING_ENABLE)              raw_hid_receive_kb(data, length);  #endif -#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) +#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) && !defined(VIA_QMK_RGB_MATRIX_ENABLE)              // Return the unhandled state              *command_id = id_unhandled;  #endif @@ -319,10 +335,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {  #if defined(VIA_QMK_RGBLIGHT_ENABLE)              eeconfig_update_rgblight_current();  #endif +#if defined(VIA_QMK_RGB_MATRIX_ENABLE) +            eeconfig_update_rgb_matrix(); +#endif  #if defined(VIA_CUSTOM_LIGHTING_ENABLE)              raw_hid_receive_kb(data, length);  #endif -#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) +#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE) && !defined(VIA_QMK_RGB_MATRIX_ENABLE)              // Return the unhandled state              *command_id = id_unhandled;  #endif @@ -495,3 +514,86 @@ void via_qmk_rgblight_set_value(uint8_t *data) {  }  #endif // #if defined(VIA_QMK_RGBLIGHT_ENABLE) + +#if defined(VIA_QMK_RGB_MATRIX_ENABLE) + +// VIA supports only 4 discrete values for effect speed; map these to some +// useful speed values for RGB Matrix. +enum speed_values { +    RGBLIGHT_SPEED_0 = UINT8_MAX / 16, // not 0 to avoid really slow effects +    RGBLIGHT_SPEED_1 = UINT8_MAX / 4, +    RGBLIGHT_SPEED_2 = UINT8_MAX / 2,     // matches the default value +    RGBLIGHT_SPEED_3 = UINT8_MAX / 4 * 3, // UINT8_MAX is really fast +}; + +static uint8_t speed_from_rgblight(uint8_t rgblight_speed) { +    switch (rgblight_speed) { +        case 0: +            return RGBLIGHT_SPEED_0; +        case 1: +            return RGBLIGHT_SPEED_1; +        case 2: +        default: +            return RGBLIGHT_SPEED_2; +        case 3: +            return RGBLIGHT_SPEED_3; +    } +} + +static uint8_t speed_to_rgblight(uint8_t rgb_matrix_speed) { +    if (rgb_matrix_speed < ((RGBLIGHT_SPEED_0 + RGBLIGHT_SPEED_1) / 2)) { +        return 0; +    } else if (rgb_matrix_speed < ((RGBLIGHT_SPEED_1 + RGBLIGHT_SPEED_2) / 2)) { +        return 1; +    } else if (rgb_matrix_speed < ((RGBLIGHT_SPEED_2 + RGBLIGHT_SPEED_3) / 2)) { +        return 2; +    } else { +        return 3; +    } +} + +void via_qmk_rgb_matrix_get_value(uint8_t *data) { +    uint8_t *value_id   = &(data[0]); +    uint8_t *value_data = &(data[1]); +    switch (*value_id) { +        case id_qmk_rgblight_brightness: +            value_data[0] = rgb_matrix_get_val(); +            break; +        case id_qmk_rgblight_effect: +            value_data[0] = rgb_matrix_get_mode(); +            break; +        case id_qmk_rgblight_effect_speed: +            value_data[0] = speed_to_rgblight(rgb_matrix_get_speed()); +            break; +        case id_qmk_rgblight_color: +            value_data[0] = rgb_matrix_get_hue(); +            value_data[1] = rgb_matrix_get_sat(); +            break; +    } +} + +void via_qmk_rgb_matrix_set_value(uint8_t *data) { +    uint8_t *value_id   = &(data[0]); +    uint8_t *value_data = &(data[1]); +    switch (*value_id) { +        case id_qmk_rgblight_brightness: +            rgb_matrix_sethsv_noeeprom(rgb_matrix_get_hue(), rgb_matrix_get_sat(), value_data[0]); +            break; +        case id_qmk_rgblight_effect: +            rgb_matrix_mode_noeeprom(value_data[0]); +            if (value_data[0] == 0) { +                rgb_matrix_disable_noeeprom(); +            } else { +                rgb_matrix_enable_noeeprom(); +            } +            break; +        case id_qmk_rgblight_effect_speed: +            rgb_matrix_set_speed_noeeprom(speed_from_rgblight(value_data[0])); +            break; +        case id_qmk_rgblight_color: +            rgb_matrix_sethsv_noeeprom(value_data[0], value_data[1], rgb_matrix_get_val()); +            break; +    } +} + +#endif // #if defined(VIA_QMK_RGB_MATRIX_ENABLE) | 
