mod power; mod lib8; mod render; mod task; mod time; mod geometry; mod platform; mod animations; mod mappings; mod buffers; mod events; mod scenes; use events::Event; use rgb::Rgb; use scenes::Sequencer; use crate::events::EventBus; use crate::platform::{DefaultBoard, Board}; use crate::task::{FixedSizeScheduler, Scheduler}; use crate::render::{Surfaces, Renderer}; use crate::geometry::Rectangle; fn main() { let mut board: DefaultBoard = Board::take(); log::info!("🐛 Booting Renderbug!"); log::info!("📡 Board {}", core::any::type_name_of_val(&board)); log::info!("⚙️ Creating tasks"); let mut system = board.system_tasks(); log::info!("⏰ System scheduler: {}", core::any::type_name_of_val(&system)); log::info!("💡 Creating output"); let output = board.output(); log::info!("Output: {}", core::any::type_name_of_val(&output)); log::info!("🎨 Preparing surfaces"); let mut surfaces = board.surfaces(); log::info!("Surface implementation: {}", core::any::type_name_of_val(&output)); log::info!("🌌 Creating animations"); let mut animations = FixedSizeScheduler::new([ Box::new(animations::IdleTask::new(&mut surfaces)), Box::new(animations::TestPattern::new(surfaces.new_surface(Rectangle::everything()).unwrap())), ]); let mut inputs = FixedSizeScheduler::new([ Box::new(Sequencer::new()), ]); let mut renderer = FixedSizeScheduler::new([Box::new(Renderer::new(output, surfaces))]); log::info!("🚌 Starting event bus"); let mut bus = EventBus::new(); bus.push(Event::new_property_change("colors.primary", Rgb::new(255, 128, 128))); bus.push(Event::new_property_change("system.board.chip_id", DefaultBoard::chip_id())); bus.push(Event::new_property_change("system.network.online", false)); log::info!("Priming events..."); let initial_tasks = [ "Renderer", "renderbug::scenes::Sequencer", "renderbug::buffers::BufferedSurfacePool", "renderbug::platform::esp32::WifiTask", "renderbug::platform::esp32::MqttTask", "renderbug::platform::esp32::CircadianRhythm" ]; for task_name in initial_tasks { bus.push(Event::new_start_thing(task_name)); log::info!("+ {}", task_name); } bus.push(Event::new_ready_to_rock()); log::info!("🚀 Launching..."); loop { let next_event = bus.next(); match next_event { events::Event::Tick => (), Event::ReadyToRock => { log::info!("🚀 Ready to rock and roll"); } _ => log::info!("⚡ Event: {:?}", next_event) } inputs.tick(&next_event, &mut bus); animations.tick(&next_event, &mut bus); system.tick(&next_event, &mut bus); renderer.tick(&next_event, &mut bus); } }