Add support to persist MD LED framework settings (#14980)
* Add support to persist MD LED framework settings * avoid out-of-bounds errors when SmartEEPROM is not enabled * Update brightness defaults * clang
This commit is contained in:
parent
f4ea262c17
commit
7ae0f371cf
6 changed files with 106 additions and 31 deletions
|
@ -43,6 +43,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
/* Temporary solution for matrix delay */
|
/* Temporary solution for matrix delay */
|
||||||
#define IGNORE_ATOMIC_BLOCK
|
#define IGNORE_ATOMIC_BLOCK
|
||||||
|
|
||||||
|
/* Avoid out-of-bounds errors when SmartEEPROM is not enabled */
|
||||||
|
#define EEPROM_SIZE 1024
|
||||||
|
|
||||||
/* MCU Port name definitions */
|
/* MCU Port name definitions */
|
||||||
#define PA 0
|
#define PA 0
|
||||||
#define PB 1
|
#define PB 1
|
||||||
|
|
|
@ -61,6 +61,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
static uint32_t key_timer;
|
static uint32_t key_timer;
|
||||||
static uint8_t scroll_effect = 0;
|
static uint8_t scroll_effect = 0;
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case L_BRI ... U_T_AGCR:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
md_led_changed();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case L_BRI:
|
case L_BRI:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
|
|
|
@ -42,6 +42,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
/* Temporary solution for matrix delay */
|
/* Temporary solution for matrix delay */
|
||||||
#define IGNORE_ATOMIC_BLOCK
|
#define IGNORE_ATOMIC_BLOCK
|
||||||
|
|
||||||
|
/* Avoid out-of-bounds errors when SmartEEPROM is not enabled */
|
||||||
|
#define EEPROM_SIZE 1024
|
||||||
|
|
||||||
/* MCU Port name definitions */
|
/* MCU Port name definitions */
|
||||||
#define PA 0
|
#define PA 0
|
||||||
#define PB 1
|
#define PB 1
|
||||||
|
|
|
@ -64,6 +64,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
static uint32_t key_timer;
|
static uint32_t key_timer;
|
||||||
static uint8_t scroll_effect = 0;
|
static uint8_t scroll_effect = 0;
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case L_BRI ... U_T_AGCR:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
md_led_changed();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case L_BRI:
|
case L_BRI:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
|
|
|
@ -15,6 +15,10 @@ You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define FLUSH_TIMEOUT 5000
|
||||||
|
#define EECONFIG_MD_LED ((uint8_t*)(EECONFIG_SIZE + 64))
|
||||||
|
#define MD_LED_CONFIG_VERSION 1
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
# include "arm_atsam_protocol.h"
|
# include "arm_atsam_protocol.h"
|
||||||
# include "led.h"
|
# include "led.h"
|
||||||
|
@ -23,8 +27,41 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# include <math.h>
|
# include <math.h>
|
||||||
|
|
||||||
# ifdef USE_MASSDROP_CONFIGURATOR
|
# ifdef USE_MASSDROP_CONFIGURATOR
|
||||||
|
// TODO?: wire these up to keymap.c
|
||||||
|
md_led_config_t md_led_config = {0};
|
||||||
|
|
||||||
|
EECONFIG_DEBOUNCE_HELPER(md_led, EECONFIG_MD_LED, md_led_config);
|
||||||
|
|
||||||
|
void eeconfig_update_md_led_default(void) {
|
||||||
|
md_led_config.ver = MD_LED_CONFIG_VERSION;
|
||||||
|
|
||||||
|
gcr_desired = LED_GCR_MAX;
|
||||||
|
led_animation_orientation = 0;
|
||||||
|
led_animation_direction = 0;
|
||||||
|
led_animation_breathing = 0;
|
||||||
|
led_animation_id = 0;
|
||||||
|
led_animation_speed = 4.0f;
|
||||||
|
led_lighting_mode = LED_MODE_NORMAL;
|
||||||
|
led_enabled = 1;
|
||||||
|
led_animation_breathe_cur = BREATHE_MIN_STEP;
|
||||||
|
breathe_dir = 1;
|
||||||
|
led_animation_circular = 0;
|
||||||
|
led_edge_brightness = 1.0f;
|
||||||
|
led_ratio_brightness = 1.0f;
|
||||||
|
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||||
|
|
||||||
|
eeconfig_flush_md_led(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_led_changed(void) { eeconfig_flag_md_led(true); }
|
||||||
|
|
||||||
|
// todo: use real task rather than this bodge
|
||||||
|
void housekeeping_task_kb(void) { eeconfig_flush_md_led_task(FLUSH_TIMEOUT); }
|
||||||
|
|
||||||
__attribute__((weak)) led_instruction_t led_instructions[] = {{.end = 1}};
|
__attribute__((weak)) led_instruction_t led_instructions[] = {{.end = 1}};
|
||||||
static void md_rgb_matrix_config_override(int i);
|
static void md_rgb_matrix_config_override(int i);
|
||||||
|
# else
|
||||||
|
uint8_t gcr_desired;
|
||||||
# endif // USE_MASSDROP_CONFIGURATOR
|
# endif // USE_MASSDROP_CONFIGURATOR
|
||||||
|
|
||||||
void SERCOM1_0_Handler(void) {
|
void SERCOM1_0_Handler(void) {
|
||||||
|
@ -56,7 +93,6 @@ issi3733_driver_t issidrv[ISSI3733_DRIVER_COUNT];
|
||||||
issi3733_led_t led_map[ISSI3733_LED_COUNT] = ISSI3733_LED_MAP;
|
issi3733_led_t led_map[ISSI3733_LED_COUNT] = ISSI3733_LED_MAP;
|
||||||
RGB led_buffer[ISSI3733_LED_COUNT];
|
RGB led_buffer[ISSI3733_LED_COUNT];
|
||||||
|
|
||||||
uint8_t gcr_desired;
|
|
||||||
uint8_t gcr_actual;
|
uint8_t gcr_actual;
|
||||||
uint8_t gcr_actual_last;
|
uint8_t gcr_actual_last;
|
||||||
# ifdef USE_MASSDROP_CONFIGURATOR
|
# ifdef USE_MASSDROP_CONFIGURATOR
|
||||||
|
@ -218,6 +254,13 @@ static void led_set_all(uint8_t r, uint8_t g, uint8_t b) {
|
||||||
static void init(void) {
|
static void init(void) {
|
||||||
DBGC(DC_LED_MATRIX_INIT_BEGIN);
|
DBGC(DC_LED_MATRIX_INIT_BEGIN);
|
||||||
|
|
||||||
|
# ifdef USE_MASSDROP_CONFIGURATOR
|
||||||
|
eeconfig_init_md_led();
|
||||||
|
if (md_led_config.ver != MD_LED_CONFIG_VERSION) {
|
||||||
|
eeconfig_update_md_led_default();
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
issi3733_prepare_arrays();
|
issi3733_prepare_arrays();
|
||||||
|
|
||||||
md_rgb_matrix_prepare();
|
md_rgb_matrix_prepare();
|
||||||
|
@ -331,21 +374,6 @@ const rgb_matrix_driver_t rgb_matrix_driver = {.init = init, .flush = flush, .se
|
||||||
# ifdef USE_MASSDROP_CONFIGURATOR
|
# ifdef USE_MASSDROP_CONFIGURATOR
|
||||||
// Ported from Massdrop QMK GitHub Repo
|
// Ported from Massdrop QMK GitHub Repo
|
||||||
|
|
||||||
// TODO?: wire these up to keymap.c
|
|
||||||
uint8_t led_animation_orientation = 0;
|
|
||||||
uint8_t led_animation_direction = 0;
|
|
||||||
uint8_t led_animation_breathing = 0;
|
|
||||||
uint8_t led_animation_id = 0;
|
|
||||||
float led_animation_speed = 4.0f;
|
|
||||||
uint8_t led_lighting_mode = LED_MODE_NORMAL;
|
|
||||||
uint8_t led_enabled = 1;
|
|
||||||
uint8_t led_animation_breathe_cur = BREATHE_MIN_STEP;
|
|
||||||
uint8_t breathe_dir = 1;
|
|
||||||
uint8_t led_animation_circular = 0;
|
|
||||||
float led_edge_brightness = 1.0f;
|
|
||||||
float led_ratio_brightness = 1.0f;
|
|
||||||
uint8_t led_edge_mode = LED_EDGE_MODE_ALL;
|
|
||||||
|
|
||||||
static void led_run_pattern(led_setup_t* f, float* ro, float* go, float* bo, float pos) {
|
static void led_run_pattern(led_setup_t* f, float* ro, float* go, float* bo, float pos) {
|
||||||
float po;
|
float po;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define _LED_MATRIX_H_
|
#define _LED_MATRIX_H_
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
|
||||||
// From keyboard
|
// From keyboard
|
||||||
#include "config_led.h"
|
#include "config_led.h"
|
||||||
|
@ -79,7 +80,6 @@ typedef struct issi3733_led_s {
|
||||||
|
|
||||||
extern issi3733_driver_t issidrv[ISSI3733_DRIVER_COUNT];
|
extern issi3733_driver_t issidrv[ISSI3733_DRIVER_COUNT];
|
||||||
|
|
||||||
extern uint8_t gcr_desired;
|
|
||||||
extern uint8_t gcr_breathe;
|
extern uint8_t gcr_breathe;
|
||||||
extern uint8_t gcr_actual;
|
extern uint8_t gcr_actual;
|
||||||
extern uint8_t gcr_actual_last;
|
extern uint8_t gcr_actual_last;
|
||||||
|
@ -140,19 +140,43 @@ typedef struct led_instruction_s {
|
||||||
|
|
||||||
extern led_instruction_t led_instructions[];
|
extern led_instruction_t led_instructions[];
|
||||||
|
|
||||||
extern uint8_t led_animation_breathing;
|
typedef struct led_config_s {
|
||||||
extern uint8_t led_animation_id;
|
uint8_t ver; // assumed to be zero on eeprom reset
|
||||||
extern float led_animation_speed;
|
|
||||||
extern uint8_t led_lighting_mode;
|
uint8_t desired_gcr;
|
||||||
extern uint8_t led_enabled;
|
uint8_t animation_breathing;
|
||||||
extern uint8_t led_animation_breathe_cur;
|
uint8_t animation_id;
|
||||||
extern uint8_t led_animation_direction;
|
float animation_speed;
|
||||||
extern uint8_t breathe_dir;
|
uint8_t lighting_mode;
|
||||||
extern uint8_t led_animation_orientation;
|
uint8_t enabled;
|
||||||
extern uint8_t led_animation_circular;
|
uint8_t animation_breathe_cur;
|
||||||
extern float led_edge_brightness;
|
uint8_t animation_direction;
|
||||||
extern float led_ratio_brightness;
|
uint8_t animation_breathe_dir;
|
||||||
extern uint8_t led_edge_mode;
|
uint8_t animation_orientation;
|
||||||
|
uint8_t animation_circular;
|
||||||
|
float edge_brightness;
|
||||||
|
float ratio_brightness;
|
||||||
|
uint8_t edge_mode;
|
||||||
|
} md_led_config_t;
|
||||||
|
|
||||||
|
extern md_led_config_t md_led_config;
|
||||||
|
|
||||||
|
void md_led_changed(void);
|
||||||
|
|
||||||
|
# define gcr_desired md_led_config.desired_gcr
|
||||||
|
# define led_animation_breathing md_led_config.animation_breathing
|
||||||
|
# define led_animation_id md_led_config.animation_id
|
||||||
|
# define led_animation_speed md_led_config.animation_speed
|
||||||
|
# define led_lighting_mode md_led_config.lighting_mode
|
||||||
|
# define led_enabled md_led_config.enabled
|
||||||
|
# define led_animation_breathe_cur md_led_config.animation_breathe_cur
|
||||||
|
# define led_animation_direction md_led_config.animation_direction
|
||||||
|
# define breathe_dir md_led_config.animation_breathe_dir
|
||||||
|
# define led_animation_orientation md_led_config.animation_orientation
|
||||||
|
# define led_animation_circular md_led_config.animation_circular
|
||||||
|
# define led_edge_brightness md_led_config.edge_brightness
|
||||||
|
# define led_ratio_brightness md_led_config.ratio_brightness
|
||||||
|
# define led_edge_mode md_led_config.edge_mode
|
||||||
|
|
||||||
# define LED_MODE_NORMAL 0 // Must be 0
|
# define LED_MODE_NORMAL 0 // Must be 0
|
||||||
# define LED_MODE_KEYS_ONLY 1
|
# define LED_MODE_KEYS_ONLY 1
|
||||||
|
@ -173,7 +197,8 @@ extern uint8_t led_edge_mode;
|
||||||
# define LED_IS_EDGE(scan) (scan >= LED_EDGE_MIN_SCAN) // Return true if an LED's scan value indicates an edge LED
|
# define LED_IS_EDGE(scan) (scan >= LED_EDGE_MIN_SCAN) // Return true if an LED's scan value indicates an edge LED
|
||||||
# define LED_IS_EDGE_ALT(scan) (scan == LED_EDGE_ALT_MODE) // Return true if an LED's scan value indicates an alternate edge mode LED
|
# define LED_IS_EDGE_ALT(scan) (scan == LED_EDGE_ALT_MODE) // Return true if an LED's scan value indicates an alternate edge mode LED
|
||||||
# define LED_IS_INDICATOR(scan) (scan == LED_INDICATOR_SCAN) // Return true if an LED's scan value indicates it is a dedicated Indicator
|
# define LED_IS_INDICATOR(scan) (scan == LED_INDICATOR_SCAN) // Return true if an LED's scan value indicates it is a dedicated Indicator
|
||||||
|
#else
|
||||||
|
extern uint8_t gcr_desired;
|
||||||
#endif // USE_MASSDROP_CONFIGURATOR
|
#endif // USE_MASSDROP_CONFIGURATOR
|
||||||
|
|
||||||
#endif //_LED_MATRIX_H_
|
#endif //_LED_MATRIX_H_
|
||||||
|
|
Loading…
Reference in a new issue