hyperion/instance/device/
dummy.rs

1use async_trait::async_trait;
2
3use crate::{color::AnsiDisplayExt, models};
4
5use super::{common::*, DeviceError};
6
7pub type DummyDevice = Rewriter<DummyDeviceImpl>;
8
9pub struct DummyDeviceImpl {
10    leds: Vec<models::Color>,
11    mode: models::DummyDeviceMode,
12    ansi_buf: String,
13}
14
15#[async_trait]
16impl WritingDevice for DummyDeviceImpl {
17    type Config = models::Dummy;
18
19    fn new(config: &Self::Config) -> Result<Self, DeviceError> {
20        Ok(Self {
21            leds: vec![Default::default(); config.hardware_led_count as _],
22            mode: config.mode,
23            ansi_buf: String::new(),
24        })
25    }
26
27    async fn set_let_data(
28        &mut self,
29        _config: &Self::Config,
30        led_data: &[models::Color],
31    ) -> Result<(), DeviceError> {
32        self.leds.copy_from_slice(led_data);
33        Ok(())
34    }
35
36    async fn write(&mut self) -> Result<(), DeviceError> {
37        // Write to log when we get new data
38        match self.mode {
39            models::DummyDeviceMode::Text => {
40                for (i, led) in self.leds.iter().enumerate() {
41                    info!(
42                        led = %format_args!("{:3}", i),
43                        red = %format_args!("{:3}", led.red),
44                        green = %format_args!("{:3}", led.green),
45                        blue = %format_args!("{:3}", led.blue),
46                    );
47                }
48            }
49
50            models::DummyDeviceMode::Ansi => {
51                // Build a truecolor ANSI sequence for all LEDs
52                self.ansi_buf.clear();
53
54                self.leds
55                    .iter()
56                    .copied()
57                    .to_ansi_truecolor(&mut self.ansi_buf);
58
59                // Output
60                info!("{}", &self.ansi_buf);
61            }
62        }
63
64        Ok(())
65    }
66}