Skip to content
Snippets Groups Projects
Commit 852b419a authored by Stephen D's avatar Stephen D
Browse files

improve keyboard backlight logic

parent ff1757a5
No related branches found
No related tags found
No related merge requests found
...@@ -29,7 +29,7 @@ mod app { ...@@ -29,7 +29,7 @@ mod app {
use display_interface_spi::SPIInterface; use display_interface_spi::SPIInterface;
use embedded_graphics::{pixelcolor::Rgb565, prelude::RgbColor}; use embedded_graphics::{pixelcolor::Rgb565, prelude::RgbColor};
use embedded_hal::{digital::v2::OutputPin, PwmPin}; use embedded_hal::{digital::v2::OutputPin, PwmPin};
use fugit::RateExtU32; use fugit::{Duration, RateExtU32};
use hal::{ use hal::{
gpio::{ gpio::{
bank0::{ bank0::{
...@@ -42,7 +42,7 @@ mod app { ...@@ -42,7 +42,7 @@ mod app {
pac::{I2C1, SPI1}, pac::{I2C1, SPI1},
pwm::{self, Channel, FreeRunning, Pwm4, Pwm5, Slice}, pwm::{self, Channel, FreeRunning, Pwm4, Pwm5, Slice},
spi, spi,
timer::{monotonic::Monotonic, Timer}, timer::{monotonic::Monotonic, Instant, Timer},
Adc, Clock, I2C, Adc, Clock, I2C,
}; };
use mipidsi::{models::ST7789, Builder, Orientation}; use mipidsi::{models::ST7789, Builder, Orientation};
...@@ -52,6 +52,8 @@ mod app { ...@@ -52,6 +52,8 @@ mod app {
const XTAL_FREQ_HZ: u32 = 12_000_000u32; const XTAL_FREQ_HZ: u32 = 12_000_000u32;
const WIDTH: usize = 320; const WIDTH: usize = 320;
const HEIGHT: usize = 240; const HEIGHT: usize = 240;
const BACKLIGHT_DELAY_TIME_SECS: u64 = 5;
const BACKLIGHT_FADE_TIME_SECS: u64 = 2;
type KeyboardBl = Channel<Slice<Pwm4, FreeRunning>, pwm::B>; type KeyboardBl = Channel<Slice<Pwm4, FreeRunning>, pwm::B>;
...@@ -76,24 +78,6 @@ mod app { ...@@ -76,24 +78,6 @@ mod app {
Pin<Gpio7, FunctionSio<SioOutput>, PullDown>, Pin<Gpio7, FunctionSio<SioOutput>, PullDown>,
>; >;
type Lcd = mipidsi::Display<
SPIInterface<
spi::Spi<
spi::Enabled,
SPI1,
(
Pin<Gpio15, FunctionSpi, PullDown>,
Pin<Gpio12, FunctionSpi, PullDown>,
Pin<Gpio14, FunctionSpi, PullDown>,
),
>,
Pin<Gpio16, FunctionSio<SioOutput>, PullDown>,
Pin<Gpio13, FunctionSio<SioOutput>, PullDown>,
>,
ST7789,
Pin<Gpio4, FunctionSio<SioOutput>, PullDown>,
>;
type MyBufferedDisplay = BufferedDisplay< type MyBufferedDisplay = BufferedDisplay<
{ WIDTH * HEIGHT }, { WIDTH * HEIGHT },
SPIInterface< SPIInterface<
...@@ -130,6 +114,7 @@ mod app { ...@@ -130,6 +114,7 @@ mod app {
keyboard_bl: KeyboardBl, keyboard_bl: KeyboardBl,
display: MyBufferedDisplay, display: MyBufferedDisplay,
display_bl: DisplayBl, display_bl: DisplayBl,
last_key_press: Instant,
} }
#[init] #[init]
...@@ -278,7 +263,7 @@ mod app { ...@@ -278,7 +263,7 @@ mod app {
display_update::spawn().unwrap(); display_update::spawn().unwrap();
keyboard_update::spawn().unwrap(); keyboard_update::spawn().unwrap();
let mono = Monotonic::new(timer, timer.alarm_0().unwrap()); let mut mono = Monotonic::new(timer, timer.alarm_0().unwrap());
( (
Shared { gui }, Shared { gui },
...@@ -288,12 +273,13 @@ mod app { ...@@ -288,12 +273,13 @@ mod app {
keyboard, keyboard,
display, display,
display_bl, display_bl,
last_key_press: mono.now(),
}, },
init::Monotonics(mono), init::Monotonics(mono),
) )
} }
#[task(priority = 2, local = [display_bl, keyboard_bl, touchpad, keyboard], shared = [gui])] #[task(priority = 2, local = [display_bl, keyboard_bl, touchpad, keyboard, last_key_press], shared = [gui])]
fn keyboard_update(mut ctx: keyboard_update::Context) { fn keyboard_update(mut ctx: keyboard_update::Context) {
//while usb_dev.poll(&mut [&mut serial]) {} //while usb_dev.poll(&mut [&mut serial]) {}
...@@ -302,6 +288,7 @@ mod app { ...@@ -302,6 +288,7 @@ mod app {
keyboard_bl, keyboard_bl,
touchpad, touchpad,
keyboard, keyboard,
last_key_press,
} = ctx.local; } = ctx.local;
let max_duty = keyboard_bl.get_max_duty(); let max_duty = keyboard_bl.get_max_duty();
...@@ -309,13 +296,11 @@ mod app { ...@@ -309,13 +296,11 @@ mod app {
let state = keyboard.read_state(); let state = keyboard.read_state();
if state > 0 { if state > 0 {
keyboard_bl.set_duty(max_duty); *last_key_press = monotonics::now();
if let Some(k) = keyboard.pushed_key() { if let Some(k) = keyboard.pushed_key() {
ctx.shared.gui.lock(|g| g.key_push(k)); ctx.shared.gui.lock(|g| g.key_push(k));
} }
} else {
keyboard_bl.set_duty(0);
} }
let (x, y) = touchpad.get_delta_motion().unwrap(); let (x, y) = touchpad.get_delta_motion().unwrap();
...@@ -332,6 +317,20 @@ mod app { ...@@ -332,6 +317,20 @@ mod app {
display_bl.set_duty(cur_duty.min(display_bl.get_max_duty())); display_bl.set_duty(cur_duty.min(display_bl.get_max_duty()));
// keyboard backlight logic
let delta = monotonics::now() - *last_key_press;
if let Some(fade_delta) = delta.checked_sub(BACKLIGHT_DELAY_TIME_SECS.secs::<1, 1>()) {
let fade_delta = fade_delta.to_millis();
let fade_time_ms = BACKLIGHT_FADE_TIME_SECS * 1000;
let frac = u64::from(keyboard_bl.get_max_duty())
* (fade_time_ms.saturating_sub(fade_delta))
/ fade_time_ms;
keyboard_bl.set_duty(frac.try_into().unwrap());
} else {
keyboard_bl.set_duty(keyboard_bl.get_max_duty());
}
// re-enqueue ourselves
keyboard_update::spawn_after(5.millis()).unwrap(); keyboard_update::spawn_after(5.millis()).unwrap();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment