/// /// Configure udev: /// https://github.com/Grix/helios_dac/blob/master/docs/udev_rules_for_linux.md /// mod conf; mod point; mod draw; mod logs; mod framerate; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use conf::Conf; use point::{Point, Color}; use log::{info, /* warn, */ error}; use redis::{Client, Commands, Connection}; use logs::init_logging; const DEFAULT_CONF_FILE: &str = "settings.toml"; pub fn main() { match run_all() { Ok(()) => {} Err(err) => { error!("Error: {}", err); } } } fn run_all() -> Result<(), Box> { // Setup handler for interrupt Signals let running = Arc::new(AtomicBool::new(true)); let r = running.clone(); ctrlc::set_handler(move || { r.store(false, Ordering::SeqCst); })?; // Setup configuration file and set up logs let filename = std::env::args().nth(1).unwrap_or_else(|| { DEFAULT_CONF_FILE.to_string() }); let config = Conf::new(&filename); init_logging(&config); let config = config?; let client = Client::open(config.redis_url.clone())?; let mut con: Connection = client.get_connection()?; let mut framerate_handler = framerate::Framerate::new( config.framerate )?; info!("*** Starting up ***"); info!("{:?}", config); // Dispatch based on redis requests while running.load(Ordering::SeqCst) { let _ = framerate_handler.handle_time(); let points_list: Vec = draw::draw()?; let v: Vec<(f32, f32, u32)> = points_list.iter().map(|pt| { (pt.x, pt.y, u32::from(pt.color)) } ).collect(); // println!("{:?}", v); let _ = con.set(format!("/pl/{}/{}", config.client_id, config.laser_id), format!("{:?}", v))?; } Ok(()) }