cadmus_core/frontlight/
premixed.rs1use super::{Frontlight, LightLevel, LightLevels};
2use crate::device::CURRENT_DEVICE;
3use anyhow::Error;
4use std::fs::File;
5use std::fs::OpenOptions;
6use std::io::Write;
7use std::path::Path;
8
9const FRONTLIGHT_WHITE: &str = "/sys/class/backlight/mxc_msp430.0/brightness";
10
11const FRONTLIGHT_ORANGE_A: &str = "/sys/class/backlight/tlc5947_bl/color";
13const FRONTLIGHT_ORANGE_B: &str = "/sys/class/backlight/lm3630a_led/color";
15const FRONTLIGHT_ORANGE_C: &str = "/sys/class/leds/aw99703-bl_FL1/color";
17
18pub struct PremixedFrontlight {
19 intensity: LightLevel,
20 warmth: LightLevel,
21 white: File,
22 orange: File,
23}
24
25impl PremixedFrontlight {
26 pub fn new(intensity: LightLevel, warmth: LightLevel) -> Result<PremixedFrontlight, Error> {
27 let white = OpenOptions::new().write(true).open(FRONTLIGHT_WHITE)?;
28 let orange_path = if Path::new(FRONTLIGHT_ORANGE_C).exists() {
29 FRONTLIGHT_ORANGE_C
30 } else if Path::new(FRONTLIGHT_ORANGE_B).exists() {
31 FRONTLIGHT_ORANGE_B
32 } else {
33 FRONTLIGHT_ORANGE_A
34 };
35 let orange = OpenOptions::new().write(true).open(orange_path)?;
36 Ok(PremixedFrontlight {
37 intensity,
38 warmth,
39 white,
40 orange,
41 })
42 }
43}
44
45impl Frontlight for PremixedFrontlight {
46 fn set_intensity(&mut self, intensity: LightLevel) -> Result<(), Error> {
47 write!(self.white, "{}", i16::from(intensity))?;
48 self.intensity = intensity;
49 Ok(())
50 }
51
52 fn set_warmth(&mut self, warmth: LightLevel) -> Result<(), Error> {
53 if CURRENT_DEVICE.mark() != 8 {
54 write!(self.orange, "{}", warmth.as_10_base_inverted())?;
55 } else {
56 write!(self.orange, "{}", warmth.as_10_base())?;
57 }
58 self.warmth = warmth;
59 Ok(())
60 }
61
62 fn levels(&self) -> LightLevels {
63 LightLevels {
64 intensity: self.intensity,
65 warmth: self.warmth,
66 }
67 }
68}