Rework inactivity dimming system to be more flexible

This commit is contained in:
Daniel_I_Am 2022-05-05 23:12:16 +02:00
parent e65405c238
commit 51bc9237e7

View File

@ -81,15 +81,149 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
};
// Timer for activity tracking
#define INACTIVITY_TIMER 300000 // milliseconds until considered inactive
bool current_activation_state = 1;
// Declarations for inactivity tracking
#define INACTIVITY_STEPS {0, 100, 60000, 20, 300000, 0}
#define TIME_TO_CHANGE_BETWEEN_STEPS 10000
uint32_t activity_timer;
bool is_led_dimmed = 0;
float led_edge_brightness_pre_dim;
float led_gcr_desired_pre_dim;
void handle_activity(void);
void handle_inactivity(void);
void reset_after_inactivity(void);
void update_during_inactivity(void);
float get_desired_percentage(void);
float get_desired_gcr_desired(void);
float get_desired_led_edge_brightness(void);
void update_activity_timer(void);
uint32_t get_inactive_time(void);
void set_lighting_after_inactivity(void);
void reset_lighting_after_activity(void);
uint32_t activity_timer;
uint8_t old_led_lighting_mode;
void led_increase_key_brightness(void);
void led_increase_edge_brightness(void);
void led_decrease_key_brightness(void);
void led_decrease_edge_brightness(void);
// Inactivity tracking
void handle_activity(void) {
update_activity_timer();
if (is_led_dimmed) {
reset_after_inactivity();
}
}
void handle_inactivity(void) {
if (!is_led_dimmed) {
led_edge_brightness_pre_dim = led_edge_brightness;
led_gcr_desired_pre_dim = gcr_desired;
}
update_during_inactivity();
}
void reset_after_inactivity(void) {
gcr_desired = led_gcr_desired_pre_dim;
led_edge_brightness = led_edge_brightness_pre_dim;
is_led_dimmed = 0;
}
void update_during_inactivity(void) {
float desired_gcr_desired = get_desired_gcr_desired();
float desired_led_edge_brightness = get_desired_led_edge_brightness();
if (!is_led_dimmed && (desired_gcr_desired < led_gcr_desired_pre_dim || desired_led_edge_brightness < led_edge_brightness_pre_dim)) {
is_led_dimmed = 1;
}
if (desired_led_edge_brightness < led_edge_brightness) {
led_decrease_edge_brightness();
}
if (desired_gcr_desired < gcr_desired) {
led_decrease_key_brightness();
}
}
float get_desired_percentage(void) {
static int steps[] = INACTIVITY_STEPS;
static int size = sizeof steps / sizeof steps[0];
uint32_t inactive_time = get_inactive_time();
int last_target = steps[1];
int time_offset = steps[0];
int target = steps[1];
for (int i = 2; i < size; i += 2) {
if (steps[i] > inactive_time) {
break;
}
last_target = target;
time_offset = steps[i];
target = steps[i+1];
}
uint32_t time_into_current_target = inactive_time - time_offset;
time_into_current_target = time_into_current_target > TIME_TO_CHANGE_BETWEEN_STEPS ? TIME_TO_CHANGE_BETWEEN_STEPS : time_into_current_target;
time_into_current_target = time_into_current_target < 0 ? 0 : time_into_current_target;
return (float)last_target + ((float)time_into_current_target / (float)TIME_TO_CHANGE_BETWEEN_STEPS) * (float)(target - last_target);
}
float get_desired_gcr_desired(void) {
float pct = get_desired_percentage();
return pct * LED_GCR_MAX / 100;
}
float get_desired_led_edge_brightness(void) {
float pct = get_desired_percentage();
return pct / 100;
}
void update_activity_timer(void) {
activity_timer = timer_read32();
}
uint32_t get_inactive_time(void) {
return timer_read32() - activity_timer;
}
// Lighting stuff for inactivity tracking
// Increase
void led_increase_key_brightness(void) {
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
else gcr_desired += LED_GCR_STEP;
if (led_animation_breathing) gcr_breathe = gcr_desired;
}
void led_increase_edge_brightness(void) {
led_edge_brightness += 0.1;
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
}
// Decrease
void led_decrease_key_brightness(void) {
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
else gcr_desired -= LED_GCR_STEP;
if (led_animation_breathing) gcr_breathe = gcr_desired;
}
void led_decrease_edge_brightness(void) {
led_edge_brightness -= 0.1;
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
@ -97,17 +231,12 @@ void matrix_init_user(void) {
led_animation_orientation = 1;
led_animation_circular = 0;
update_activity_timer();
handle_activity();
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint32_t inactive_time = get_inactive_time();
if (inactive_time > INACTIVITY_TIMER && current_activation_state) {
set_lighting_after_inactivity();
} else if (inactive_time < 500 && !current_activation_state) {
reset_lighting_after_activity();
}
handle_inactivity();
};
// Function to test double shift caps toggle
@ -117,25 +246,6 @@ void test_caps_toggle(void) {
}
};
void update_activity_timer(void) {
activity_timer = timer_read32();
}
void set_lighting_after_inactivity(void) {
current_activation_state = 0;
old_led_lighting_mode = led_lighting_mode;
led_lighting_mode = LED_MODE_INDICATORS_ONLY;
}
void reset_lighting_after_activity(void) {
current_activation_state = 1;
led_lighting_mode = old_led_lighting_mode;
}
uint32_t get_inactive_time(void) {
return timer_read32() - activity_timer;
}
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
@ -144,7 +254,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint32_t key_timer;
static uint8_t scroll_effect = 0;
update_activity_timer();
handle_activity();
switch (keycode) {
// Keyhandlers for double shift caps toggle
@ -156,16 +266,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// Massdrop built-ins
case L_BRI:
if (record->event.pressed) {
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
else gcr_desired += LED_GCR_STEP;
if (led_animation_breathing) gcr_breathe = gcr_desired;
led_increase_key_brightness();
}
return false;
case L_BRD:
if (record->event.pressed) {
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
else gcr_desired -= LED_GCR_STEP;
if (led_animation_breathing) gcr_breathe = gcr_desired;
led_decrease_key_brightness();
}
return false;
case L_EDG_M:
@ -178,14 +284,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return false;
case L_EDG_I:
if (record->event.pressed) {
led_edge_brightness += 0.1;
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
led_increase_edge_brightness();
}
return false;
case L_EDG_D:
if (record->event.pressed) {
led_edge_brightness -= 0.1;
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
led_decrease_edge_brightness();
}
return false;
case L_RATIOI: