pinetime-rs/src/backlight.rs
2020-06-21 08:46:39 +02:00

86 lines
2.2 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use embedded_hal::digital::v2::OutputPin;
use nrf52832_hal::gpio::{Output, Pin, PushPull};
/// Control the backlight.
///
/// There are three active-low backlight pins, each connected to a FET that
/// toggles backlight power through a resistor.
///
/// - Low: 2.2 kΩ
/// - Mid: 100 Ω
/// - High: 30 Ω
///
/// Through combinations of these pins, 7 brightness levels (+ off) can be
/// configured.
pub struct Backlight {
low: Pin<Output<PushPull>>,
mid: Pin<Output<PushPull>>,
high: Pin<Output<PushPull>>,
/// The current brightness level (value between 0 and 7).
brightness: u8,
}
impl Backlight {
/// Initialize the backlight with the specified level (07).
pub fn init(
low: Pin<Output<PushPull>>,
mid: Pin<Output<PushPull>>,
high: Pin<Output<PushPull>>,
brightness: u8,
) -> Self {
let mut backlight = Self {
low,
mid,
high,
brightness,
};
backlight.set(brightness);
backlight
}
/// Set the brightness level. Must be a value between 0 (off) and 7 (max
/// brightness). Higher values are clamped to 7.
pub fn set(&mut self, mut brightness: u8) {
if brightness > 7 {
brightness = 7;
}
if brightness & 0x01 > 0 {
self.low.set_low().unwrap();
} else {
self.low.set_high().unwrap();
}
if brightness & 0x02 > 0 {
self.mid.set_low().unwrap();
} else {
self.mid.set_high().unwrap();
}
if brightness & 0x04 > 0 {
self.high.set_low().unwrap();
} else {
self.high.set_high().unwrap();
}
self.brightness = brightness;
}
/// Turn off the backlight.
pub fn off(&mut self) {
self.set(0);
}
/// Increase backlight brightness.
pub fn brighter(&mut self) {
self.set(self.brightness + 1);
}
/// Decrease backlight brightness.
pub fn darker(&mut self) {
self.set(self.brightness - 1);
}
/// Return the current brightness level (value between 0 and 7).
pub fn get_brightness(&self) -> u8 {
self.brightness
}
}