gled 2.1.0

gled is an application for creating animations and effects on artnet or wled light installations
//! Parameters as set in a SVG file.

use super::Led;
use crate::pipeline::{constants::LAMPS_PER_UNIVERSE, group::Group};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(default)]
pub struct Parameter {
    pub start: Option<usize>,
    pub universe: u16,
    #[serde(alias = "render_groups")]
    pub groups: Vec<Group>,
    pub count: usize,

    #[serde(skip)]
    pub leds: Vec<Led>,
}

impl Parameter {
    pub fn leds(&self) -> Vec<Led> {
        let Some(start) = self.start else {
            return vec![];
        };

        { 0..self.count }
            .map(|led| {
                let mut num = start + led;
                let mut universe = self.universe;
                while num >= LAMPS_PER_UNIVERSE as usize {
                    universe += 1;
                    num -= LAMPS_PER_UNIVERSE as usize;
                }

                Led { universe, num }
            })
            .collect()
    }
}

impl Default for Parameter {
    fn default() -> Self {
        Self {
            groups: vec![],
            start: None,
            universe: 0,
            count: 1,
            leds: vec![],
        }
    }
}