lj_templates_rust/src/main.rs

67 lines
1.6 KiB
Rust

///
/// 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<dyn std::error::Error>> {
// 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<Point> = 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(())
}