From 97079c7b10a73cfd97621315a75d5b46b50e96e3 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Tue, 7 Oct 2025 18:38:53 +0100 Subject: [PATCH] dimming --- src/display.rs | 4 ++++ src/main.rs | 30 +++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/display.rs b/src/display.rs index 8278b98..c293ca5 100644 --- a/src/display.rs +++ b/src/display.rs @@ -97,6 +97,10 @@ impl Brightness { self.0 } + pub fn dimm(self, scale: u8) -> Brightness { + Brightness(self.0 >> scale) + } + // Scales brightness (0-255) to range between IO_SEGMENT_ON_MIN_US and IO_SEGMENT_ON_MAX_US pub fn scale_brightness(self) -> u32 { // Using >> to avoid 32bit division which take ~576 cycles diff --git a/src/main.rs b/src/main.rs index 49ed50f..5a2c9d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,6 +50,11 @@ pub const IO_SEGMENT_RATE_US: u32 = 1000; // Time in μs between segment updates pub const IO_SEGMENT_ON_MIN_US: u32 = 80; // How long in μs to hold segment LEDs on (dark) pub const IO_SEGMENT_ON_MAX_US: u32 = 700; // How long in μs to hold segment LEDs on (bright) +// Dimming +pub const DISPLAY_FPS: u16 = (1_000_000 / (IO_SEGMENT_RATE_US * DISPLAY_SEGMENTS as u32)) as u16; +pub const DISPLAY_DIMM_FRAMES: u16 = DISPLAY_FPS * 10; // How many frames of inactivity before dimming +pub const DISPLAY_DIMM_SCALE: u8 = 4; // Number of bit shifts of brighness to dim + // Calculator setup pub const STACK_DEPTH: usize = 7; type Calc = StackCalc; @@ -115,6 +120,7 @@ pub struct IOLoop { keyboard: Keyboard, readount: Option, debounce: Debounce, + sleep_timer: u16, } impl IOLoop { @@ -128,6 +134,7 @@ impl IOLoop { keyboard, readount: None, debounce: Default::default(), + sleep_timer: 0, } } @@ -151,19 +158,36 @@ impl IOLoop { // Start from first segment self.index = 0; - // Full keyboard scan complete, debounce and return result - self.debounce.input(self.readount.take()) + // Full keyboard scan complete, debounce + let key = self.debounce.input(self.readount.take()); + + // Reset or advance sleep timer + if key.is_some() { + self.sleep_timer = 0; + } else { + self.sleep_timer = self.sleep_timer.saturating_add(1); + } + + key } else { None } } + pub fn is_sleep(&self) -> bool { + self.sleep_timer >= DISPLAY_DIMM_FRAMES + } + pub fn display_on(&mut self) -> Brightness { self.select_off(); let segment = self.dispaly[self.index]; let brighness = segment.apply(&mut self.segment_pins); self.select_on(); - brighness + if self.is_sleep() { + brighness.dimm(DISPLAY_DIMM_SCALE) + } else { + brighness + } } pub fn display_off(&mut self) {