diff --git a/layout/my-layout/keymap.c b/layout/my-layout/keymap.c index b4354ef..4d6b591 100644 --- a/layout/my-layout/keymap.c +++ b/layout/my-layout/keymap.c @@ -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: