1
0
Fork 0

Add VIA support for QMK backlight, QMK RGBLight (#7911)

* Add VIA support for QMK backlight, QMK RGBLight

* clang-format changes
This commit is contained in:
Wilba 2020-01-21 05:18:25 +11:00 committed by MechMerlin
parent ce81c4f89b
commit 484a9b12bc
37 changed files with 500 additions and 35 deletions

View file

@ -62,6 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
// Let VIA handle the QMK RGBLIGHT
#define VIA_QMK_RGBLIGHT_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -62,6 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
// Let VIA handle the QMK RGBLIGHT
#define VIA_QMK_RGBLIGHT_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -54,6 +54,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -73,6 +73,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// 6 for 3x custom encoder settings, left, right, and press (18 bytes) // 6 for 3x custom encoder settings, left, right, and press (18 bytes)
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 21 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 21
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -3,3 +3,5 @@
void backlight_task(void); void backlight_task(void);
void breathing_interrupt_disable(void); void breathing_interrupt_disable(void);
void breathing_interrupt_enable(void); void breathing_interrupt_enable(void);
void breathing_enable(void);
void breathing_disable(void);

View file

@ -55,6 +55,54 @@ backlight_config_t kb_backlight_config = {
}; };
#ifdef VIA_ENABLE #ifdef VIA_ENABLE
void backlight_get_value( uint8_t *data )
{
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id)
{
case id_qmk_backlight_brightness:
{
// level / BACKLIGHT_LEVELS * 255
value_data[0] = ((uint16_t)kb_backlight_config.level) * 255 / BACKLIGHT_LEVELS;
break;
}
case id_qmk_backlight_effect:
{
value_data[0] = kb_backlight_config.breathing ? 1 : 0;
break;
}
}
}
void backlight_set_value( uint8_t *data )
{
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id)
{
case id_qmk_backlight_brightness:
{
// level / 255 * BACKLIGHT_LEVELS
kb_backlight_config.level = ((uint16_t)value_data[0]) * BACKLIGHT_LEVELS / 255;
backlight_set(kb_backlight_config.level);
break;
}
case id_qmk_backlight_effect:
{
if ( value_data[0] == 0 ) {
kb_backlight_config.breathing = false;
breathing_disable();
} else {
kb_backlight_config.breathing = true;
breathing_enable();
}
break;
}
}
}
void raw_hid_receive_kb( uint8_t *data, uint8_t length ) void raw_hid_receive_kb( uint8_t *data, uint8_t length )
{ {
uint8_t *command_id = &(data[0]); uint8_t *command_id = &(data[0]);
@ -139,6 +187,21 @@ void raw_hid_receive_kb( uint8_t *data, uint8_t length )
} }
break; break;
} }
case id_lighting_set_value:
{
backlight_set_value(command_data);
break;
}
case id_lighting_get_value:
{
backlight_get_value(command_data);
break;
}
case id_lighting_save:
{
backlight_config_save();
break;
}
default: default:
{ {
// Unhandled message. // Unhandled message.

View file

@ -62,6 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
// Let VIA handle the QMK RGBLIGHT
#define VIA_QMK_RGBLIGHT_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -126,8 +126,86 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return process_record_user(keycode, record);; return process_record_user(keycode, record);;
} }
#ifdef VIA_ENABLE
void backlight_get_value( uint8_t *data )
{
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id)
{
case id_qmk_backlight_brightness:
{
// level / BACKLIGHT_LEVELS * 255
value_data[0] = ((uint16_t)kb_backlight_config.level) * 255 / BACKLIGHT_LEVELS;
break;
}
case id_qmk_backlight_effect:
{
value_data[0] = kb_backlight_config.breathing ? 1 : 0;
break;
}
}
}
void backlight_set_value( uint8_t *data )
{
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id)
{
case id_qmk_backlight_brightness:
{
// level / 255 * BACKLIGHT_LEVELS
kb_backlight_config.level = ((uint16_t)value_data[0]) * BACKLIGHT_LEVELS / 255;
backlight_set(kb_backlight_config.level);
break;
}
case id_qmk_backlight_effect:
{
if ( value_data[0] == 0 ) {
kb_backlight_config.breathing = false;
breathing_disable();
} else {
kb_backlight_config.breathing = true;
breathing_enable();
}
break;
}
}
}
void raw_hid_receive_kb( uint8_t *data, uint8_t length )
{
uint8_t *command_id = &(data[0]);
uint8_t *command_data = &(data[1]);
switch ( *command_id )
{
case id_lighting_set_value:
{
backlight_set_value(command_data);
break;
}
case id_lighting_get_value:
{
backlight_get_value(command_data);
break;
}
case id_lighting_save:
{
backlight_config_save();
break;
}
default:
{
// Unhandled message.
*command_id = id_unhandled;
break;
}
}
// DO NOT call raw_hid_send(data,length) here, let caller do this
}
#endif
// //
// In the case of VIA being disabled, we still need to check if // In the case of VIA being disabled, we still need to check if

View file

@ -4,3 +4,5 @@ void backlight_task(void);
void breathing_interrupt_disable(void); void breathing_interrupt_disable(void);
void breathing_interrupt_enable(void); void breathing_interrupt_enable(void);
void breathing_toggle(void); void breathing_toggle(void);
void breathing_enable(void);
void breathing_disable(void);

View file

@ -62,6 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
// Let VIA handle the QMK RGBLIGHT
#define VIA_QMK_RGBLIGHT_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -138,3 +138,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -141,3 +141,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -62,6 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
// Let VIA handle the QMK RGBLIGHT
#define VIA_QMK_RGBLIGHT_ENABLE
/* /*
* Feature disable options * Feature disable options
* These options are also useful to firmware size reduction. * These options are also useful to firmware size reduction.

View file

@ -122,3 +122,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -119,3 +119,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -109,3 +109,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -152,3 +152,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -235,3 +235,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -204,3 +204,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -201,3 +201,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -201,3 +201,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -204,3 +204,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -204,3 +204,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -204,3 +204,5 @@
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -200,3 +200,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -123,17 +123,17 @@ void raw_hid_receive_kb(uint8_t *data, uint8_t length) {
switch ( *command_id ) switch ( *command_id )
{ {
#if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
case id_backlight_config_set_value: case id_lighting_set_value:
{ {
backlight_config_set_value(command_data); backlight_config_set_value(command_data);
break; break;
} }
case id_backlight_config_get_value: case id_lighting_get_value:
{ {
backlight_config_get_value(command_data); backlight_config_get_value(command_data);
break; break;
} }
case id_backlight_config_save: case id_lighting_save:
{ {
backlight_config_save(); backlight_config_save();
break; break;

View file

@ -26,9 +26,13 @@
#include "quantum/color.h" #include "quantum/color.h"
#include "tmk_core/common/eeprom.h" #include "tmk_core/common/eeprom.h"
#include "via.h" // uses only the EEPROM address #include "via.h" // uses EEPROM address, lighting value IDs
#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR) #define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
#if VIA_EEPROM_CUSTOM_CONFIG_SIZE == 0
#error VIA_EEPROM_CUSTOM_CONFIG_SIZE was not defined to store backlight_config struct
#endif
#include "drivers/issi/is31fl3736.h" #include "drivers/issi/is31fl3736.h"
#define ISSI_ADDR_DEFAULT 0x50 #define ISSI_ADDR_DEFAULT 0x50

View file

@ -50,9 +50,13 @@ LED_TYPE g_ws2812_leds[WS2812_LED_TOTAL];
#include "quantum/color.h" #include "quantum/color.h"
#include "tmk_core/common/eeprom.h" #include "tmk_core/common/eeprom.h"
#include "via.h" // uses only the EEPROM address #include "via.h" // uses EEPROM address, lighting value IDs
#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR) #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
#if VIA_EEPROM_CUSTOM_CONFIG_SIZE == 0
#error VIA_EEPROM_CUSTOM_CONFIG_SIZE was not defined to store backlight_config struct
#endif
#if defined(RGB_BACKLIGHT_M6_B) #if defined(RGB_BACKLIGHT_M6_B)
#include "drivers/issi/is31fl3218.h" #include "drivers/issi/is31fl3218.h"
#define BACKLIGHT_LED_COUNT 6 #define BACKLIGHT_LED_COUNT 6

View file

@ -118,3 +118,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -118,3 +118,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -140,3 +140,6 @@
// Backlight config starts after VIA's EEPROM usage, // Backlight config starts after VIA's EEPROM usage,
// dynamic keymaps start after this. // dynamic keymaps start after this.
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31 #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE

View file

@ -130,18 +130,30 @@ void backlight_step(void) {
backlight_set(backlight_config.level); backlight_set(backlight_config.level);
} }
/** \brief Backlight set level without EEPROM update
*
*/
void backlight_level_noeeprom(uint8_t level) {
if (level > BACKLIGHT_LEVELS) level = BACKLIGHT_LEVELS;
backlight_config.level = level;
backlight_config.enable = !!backlight_config.level;
backlight_set(backlight_config.level);
}
/** \brief Backlight set level /** \brief Backlight set level
* *
* FIXME: needs doc * FIXME: needs doc
*/ */
void backlight_level(uint8_t level) { void backlight_level(uint8_t level) {
if (level > BACKLIGHT_LEVELS) level = BACKLIGHT_LEVELS; backlight_level_noeeprom(level);
backlight_config.level = level;
backlight_config.enable = !!backlight_config.level;
eeconfig_update_backlight(backlight_config.raw); eeconfig_update_backlight(backlight_config.raw);
backlight_set(backlight_config.level);
} }
/** \brief Update current backlight state to EEPROM
*
*/
void eeconfig_update_backlight_current(void) { eeconfig_update_backlight(backlight_config.raw); }
/** \brief Get backlight level /** \brief Get backlight level
* *
* FIXME: needs doc * FIXME: needs doc

View file

@ -48,8 +48,10 @@ bool is_backlight_enabled(void);
void backlight_step(void); void backlight_step(void);
void backlight_increase(void); void backlight_increase(void);
void backlight_decrease(void); void backlight_decrease(void);
void backlight_level_noeeprom(uint8_t level);
void backlight_level(uint8_t level); void backlight_level(uint8_t level);
uint8_t get_backlight_level(void); uint8_t get_backlight_level(void);
void eeconfig_update_backlight_current(void);
// implementation specific // implementation specific
void backlight_init_ports(void); void backlight_init_ports(void);

View file

@ -160,6 +160,10 @@ void eeconfig_update_rgblight(uint32_t val) {
#endif #endif
} }
void eeconfig_update_rgblight_current(void) {
eeconfig_update_rgblight(rgblight_config.raw);
}
void eeconfig_update_rgblight_default(void) { void eeconfig_update_rgblight_default(void) {
rgblight_config.enable = 1; rgblight_config.enable = 1;
rgblight_config.mode = RGBLIGHT_MODE_STATIC_LIGHT; rgblight_config.mode = RGBLIGHT_MODE_STATIC_LIGHT;
@ -501,6 +505,22 @@ void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_ee
void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_eeprom_helper(hue, sat, val, false); } void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_eeprom_helper(hue, sat, val, false); }
uint8_t rgblight_get_speed(void) { return rgblight_config.speed; }
void rgblight_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) {
rgblight_config.speed = speed;
if (write_to_eeprom) {
eeconfig_update_rgblight(rgblight_config.raw); // EECONFIG needs to be increased to support this
dprintf("rgblight set speed [EEPROM]: %u\n", rgblight_config.speed);
} else {
dprintf("rgblight set speed [NOEEPROM]: %u\n", rgblight_config.speed);
}
}
void rgblight_set_speed(uint8_t speed) { rgblight_set_speed_eeprom_helper(speed, true); }
void rgblight_set_speed_noeeprom(uint8_t speed) { rgblight_set_speed_eeprom_helper(speed, false); }
uint8_t rgblight_get_hue(void) { return rgblight_config.hue; } uint8_t rgblight_get_hue(void) { return rgblight_config.hue; }
uint8_t rgblight_get_sat(void) { return rgblight_config.sat; } uint8_t rgblight_get_sat(void) { return rgblight_config.sat; }

View file

@ -233,6 +233,11 @@ void rgblight_decrease_speed(void);
void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val); void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val);
void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val); void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val);
/* effect speed */
uint8_t rgblight_get_speed(void);
void rgblight_set_speed(uint8_t speed);
void rgblight_set_speed_noeeprom(uint8_t speed);
/* query */ /* query */
uint8_t rgblight_get_mode(void); uint8_t rgblight_get_mode(void);
uint8_t rgblight_get_hue(void); uint8_t rgblight_get_hue(void);
@ -245,6 +250,7 @@ uint32_t rgblight_read_dword(void);
void rgblight_update_dword(uint32_t dword); void rgblight_update_dword(uint32_t dword);
uint32_t eeconfig_read_rgblight(void); uint32_t eeconfig_read_rgblight(void);
void eeconfig_update_rgblight(uint32_t val); void eeconfig_update_rgblight(uint32_t val);
void eeconfig_update_rgblight_current(void);
void eeconfig_update_rgblight_default(void); void eeconfig_update_rgblight_default(void);
void eeconfig_debug_rgblight(void); void eeconfig_debug_rgblight(void);

View file

@ -22,14 +22,42 @@
# error "DYNAMIC_KEYMAP_ENABLE is not enabled" # error "DYNAMIC_KEYMAP_ENABLE is not enabled"
#endif #endif
// If VIA_CUSTOM_LIGHTING_ENABLE is not defined, then VIA_QMK_BACKLIGHT_ENABLE is set
// if BACKLIGHT_ENABLE is set, so handling of QMK Backlight values happens here by default.
// if VIA_CUSTOM_LIGHTING_ENABLE is defined, then VIA_QMK_BACKLIGHT_ENABLE must be explicitly
// set in keyboard-level config.h, so handling of QMK Backlight values happens here
#if defined(BACKLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE)
# define VIA_QMK_BACKLIGHT_ENABLE
#endif
// If VIA_CUSTOM_LIGHTING_ENABLE is not defined, then VIA_QMK_RGBLIGHT_ENABLE is set
// if RGBLIGHT_ENABLE is set, so handling of QMK RGBLIGHT values happens here by default.
// If VIA_CUSTOM_LIGHTING_ENABLE is defined, then VIA_QMK_RGBLIGHT_ENABLE must be explicitly
// set in keyboard-level config.h, so handling of QMK RGBLIGHT values happens here
#if defined(RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE)
# define VIA_QMK_RGBLIGHT_ENABLE
#endif
#include "quantum.h" #include "quantum.h"
#include "via.h" #include "via.h"
#include "raw_hid.h" #include "raw_hid.h"
#include "dynamic_keymap.h" #include "dynamic_keymap.h"
#include "tmk_core/common/eeprom.h" #include "tmk_core/common/eeprom.h"
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic #include "version.h" // for QMK_BUILDDATE used in EEPROM magic
// Forward declare some helpers.
#if defined(VIA_QMK_BACKLIGHT_ENABLE)
void via_qmk_backlight_set_value(uint8_t *data);
void via_qmk_backlight_get_value(uint8_t *data);
#endif
#if defined(VIA_QMK_RGBLIGHT_ENABLE)
void via_qmk_rgblight_set_value(uint8_t *data);
void via_qmk_rgblight_get_value(uint8_t *data);
#endif
// Can be called in an overriding via_init_kb() to test if keyboard level code usage of // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
// EEPROM is invalid and use/save defaults. // EEPROM is invalid and use/save defaults.
bool via_eeprom_is_valid(void) { bool via_eeprom_is_valid(void) {
@ -282,10 +310,52 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
dynamic_keymap_reset(); dynamic_keymap_reset();
break; break;
} }
case id_backlight_config_set_value: case id_lighting_set_value: {
case id_backlight_config_get_value: #if defined(VIA_QMK_BACKLIGHT_ENABLE)
case id_backlight_config_save: { via_qmk_backlight_set_value(command_data);
#endif
#if defined(VIA_QMK_RGBLIGHT_ENABLE)
via_qmk_rgblight_set_value(command_data);
#endif
#if defined(VIA_CUSTOM_LIGHTING_ENABLE)
raw_hid_receive_kb(data, length); raw_hid_receive_kb(data, length);
#endif
#if !defined(VIA_QMK_BACKLIGHT_ENABLE) && !defined(VIA_QMK_RGBLIGHT_ENABLE) && !defined(VIA_CUSTOM_LIGHTING_ENABLE)
// Return the unhandled state
*command_id = id_unhandled;
#endif
break;
}
case id_lighting_get_value: {
#if defined(VIA_QMK_BACKLIGHT_ENABLE)
via_qmk_backlight_get_value(command_data);
#endif
#if defined(VIA_QMK_RGBLIGHT_ENABLE)
via_qmk_rgblight_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)
// Return the unhandled state
*command_id = id_unhandled;
#endif
break;
}
case id_lighting_save: {
#if defined(VIA_QMK_BACKLIGHT_ENABLE)
eeconfig_update_backlight_current();
#endif
#if defined(VIA_QMK_RGBLIGHT_ENABLE)
eeconfig_update_rgblight_current();
#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)
// Return the unhandled state
*command_id = id_unhandled;
#endif
break; break;
} }
case id_dynamic_keymap_macro_get_count: { case id_dynamic_keymap_macro_get_count: {
@ -355,3 +425,109 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
// (i.e. returning state to the host, or the unhandled state). // (i.e. returning state to the host, or the unhandled state).
raw_hid_send(data, length); raw_hid_send(data, length);
} }
#if defined(VIA_QMK_BACKLIGHT_ENABLE)
# if BACKLIGHT_LEVELS == 0
# error BACKLIGHT_LEVELS == 0
# endif
void via_qmk_backlight_get_value(uint8_t *data) {
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_qmk_backlight_brightness: {
// level / BACKLIGHT_LEVELS * 255
value_data[0] = ((uint16_t)get_backlight_level()) * 255 / BACKLIGHT_LEVELS;
break;
}
case id_qmk_backlight_effect: {
# ifdef BACKLIGHT_BREATHING
value_data[0] = is_backlight_breathing() ? 1 : 0;
# else
value_data[0] = 0;
# endif
break;
}
}
}
void via_qmk_backlight_set_value(uint8_t *data) {
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
switch (*value_id) {
case id_qmk_backlight_brightness: {
// level / 255 * BACKLIGHT_LEVELS
backlight_level_noeeprom(((uint16_t)value_data[0]) * BACKLIGHT_LEVELS / 255);
break;
}
case id_qmk_backlight_effect: {
# ifdef BACKLIGHT_BREATHING
if (value_data[0] == 0) {
backlight_disable_breathing();
} else {
backlight_enable_breathing();
}
# endif
break;
}
}
}
#endif // #if defined(VIA_QMK_BACKLIGHT_ENABLE)
#if defined(VIA_QMK_RGBLIGHT_ENABLE)
void via_qmk_rgblight_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] = rgblight_get_val();
break;
}
case id_qmk_rgblight_effect: {
value_data[0] = rgblight_get_mode();
break;
}
case id_qmk_rgblight_effect_speed: {
value_data[0] = rgblight_get_speed();
break;
}
case id_qmk_rgblight_color: {
value_data[0] = rgblight_get_hue();
value_data[1] = rgblight_get_sat();
break;
}
}
}
void via_qmk_rgblight_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: {
rgblight_sethsv_noeeprom(rgblight_get_hue(), rgblight_get_sat(), value_data[0]);
break;
}
case id_qmk_rgblight_effect: {
rgblight_mode_noeeprom(value_data[0]);
if (value_data[0] == 0) {
rgblight_disable_noeeprom();
} else {
rgblight_enable_noeeprom();
}
break;
}
case id_qmk_rgblight_effect_speed: {
rgblight_set_speed_noeeprom(value_data[0]);
break;
}
case id_qmk_rgblight_color: {
rgblight_sethsv_noeeprom(value_data[0], value_data[1], rgblight_get_val());
break;
}
}
}
#endif // #if defined(VIA_QMK_RGBLIGHT_ENABLE)

View file

@ -52,28 +52,44 @@
enum via_command_id { enum via_command_id {
id_get_protocol_version = 0x01, // always 0x01 id_get_protocol_version = 0x01, // always 0x01
id_get_keyboard_value, id_get_keyboard_value = 0x02,
id_set_keyboard_value, id_set_keyboard_value = 0x03,
id_dynamic_keymap_get_keycode, id_dynamic_keymap_get_keycode = 0x04,
id_dynamic_keymap_set_keycode, id_dynamic_keymap_set_keycode = 0x05,
id_dynamic_keymap_reset, id_dynamic_keymap_reset = 0x06,
id_backlight_config_set_value, id_lighting_set_value = 0x07,
id_backlight_config_get_value, id_lighting_get_value = 0x08,
id_backlight_config_save, id_lighting_save = 0x09,
id_eeprom_reset, id_eeprom_reset = 0x0A,
id_bootloader_jump, id_bootloader_jump = 0x0B,
id_dynamic_keymap_macro_get_count, id_dynamic_keymap_macro_get_count = 0x0C,
id_dynamic_keymap_macro_get_buffer_size, id_dynamic_keymap_macro_get_buffer_size = 0x0D,
id_dynamic_keymap_macro_get_buffer, id_dynamic_keymap_macro_get_buffer = 0x0E,
id_dynamic_keymap_macro_set_buffer, id_dynamic_keymap_macro_set_buffer = 0x0F,
id_dynamic_keymap_macro_reset, id_dynamic_keymap_macro_reset = 0x10,
id_dynamic_keymap_get_layer_count, id_dynamic_keymap_get_layer_count = 0x11,
id_dynamic_keymap_get_buffer, id_dynamic_keymap_get_buffer = 0x12,
id_dynamic_keymap_set_buffer, id_dynamic_keymap_set_buffer = 0x13,
id_unhandled = 0xFF, id_unhandled = 0xFF,
}; };
enum via_keyboard_value_id { id_uptime = 0x01, id_layout_options, id_switch_matrix_state }; enum via_keyboard_value_id {
id_uptime = 0x01, //
id_layout_options = 0x02,
id_switch_matrix_state = 0x03
};
enum via_lighting_value {
// QMK BACKLIGHT
id_qmk_backlight_brightness = 0x09,
id_qmk_backlight_effect = 0x0A,
// QMK RGBLIGHT
id_qmk_rgblight_brightness = 0x80,
id_qmk_rgblight_effect = 0x81,
id_qmk_rgblight_effect_speed = 0x82,
id_qmk_rgblight_color = 0x83,
};
// Can't use SAFE_RANGE here, it might change if someone adds // Can't use SAFE_RANGE here, it might change if someone adds
// new values to enum quantum_keycodes. // new values to enum quantum_keycodes.