use esp_println::println; use fugit::ExtU64; use smart_leds::RGB8; use crate::animations::snake_animation::SnakeAnimation; use crate::commands::command_data::CommandData; use crate::commands::command_handler::{CommandHandleError, SpecificCommandHandler}; use crate::commands::command_handler::CommandHandleError::WrongArguments; use crate::constants; #[derive(Default)] pub struct SnakeCommand; impl SpecificCommandHandler for SnakeCommand { fn handle(&self, command: CommandData) -> Result<(), CommandHandleError> { let (cmd, animation) = command.deconstruct_animation(); if cmd.parsed_arguments().len() < 6 { println!("Less than 6 args."); return Err(WrongArguments); } let coeff = cmd.parsed_arguments()[1].try_to_integer(); let r = cmd.parsed_arguments()[2].try_to_integer(); let g = cmd.parsed_arguments()[3].try_to_integer(); let b = cmd.parsed_arguments()[4].try_to_integer(); let duration = cmd.parsed_arguments()[5].try_to_integer(); if r.is_none() || g.is_none() || b.is_none() || coeff.is_none() || duration.is_none() { println!("Cold not parse r, g, b, coeff or duration."); return Err(WrongArguments); } let coeff = coeff.unwrap(); let r = r.unwrap(); let g = g.unwrap(); let b = b.unwrap(); let duration = duration.unwrap(); if r > 255 || g > 255 || b > 255 || coeff > 255 { return Err(WrongArguments); } let coeff = coeff as f32 / 255.0; animation .set_animation(SnakeAnimation::<{ constants::LEDS_COUNT }>::new( [24, 19, 16, 10, 15, 9, 6, 8, 3, 0, 4, 1, 2, 5, 11, 7, 12, 18, 21, 29, 27, 34, 38, 31, 17, 25, 45, 30, 36, 35, 42, 44, 56, 48, 61, 57, 65, 68, 59, 49, 55, 63, 71, 69, 62, 47, 53, 46, 51, 64, 52, 67, 70, 66, 60, 58, 54, 50, 37, 40, 41, 23, 22, 14, 13, 20, 28, 33, 39, 43, 32, 26], coeff, RGB8 { r: r as u8, g: g as u8, b: b as u8 }, (duration as u64 * 1000u64).micros()) ); Ok(()) } fn help(&self) -> &'static str { " - Let snake run with the given base color and coefficient of light off" } }