lj_rust/src/main.rs

118 lines
2.6 KiB
Rust
Raw Normal View History

2023-06-01 21:11:40 +00:00
///
/// Configure udev:
/// https://github.com/Grix/helios_dac/blob/master/docs/udev_rules_for_linux.md
///
2023-06-03 13:21:36 +00:00
mod redis_ctrl;
mod conf;
mod errors;
2023-06-04 19:31:32 +00:00
mod point;
2023-06-05 09:21:16 +00:00
mod transformer;
2023-06-05 19:03:55 +00:00
mod device;
use device::device_factory;
2023-06-03 13:21:36 +00:00
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
2023-06-05 19:03:55 +00:00
use redis_ctrl::{RedisCtrl, Order};
2023-06-04 10:08:44 +00:00
use conf::Conf;
2023-06-07 15:26:30 +00:00
use errors::LJResult;
2023-06-04 19:31:32 +00:00
use point::Point;
2023-06-07 16:25:33 +00:00
use transformer::Transformers;
use log::{LevelFilter, info, /* warn, */ error};
2023-06-05 11:07:43 +00:00
use env_logger::Builder;
2023-06-01 21:11:40 +00:00
2023-06-05 19:03:55 +00:00
const DEFAULT_CONF_FILE: &str = "settings.toml";
2023-06-01 21:11:40 +00:00
2023-06-05 19:03:55 +00:00
pub fn main() {
match run_all() {
Ok(()) => {}
Err(err) => {
error!("Error: {}", err);
}
2023-06-03 16:11:55 +00:00
}
}
2023-06-04 13:09:15 +00:00
fn run_all() -> LJResult<()> {
// Setup configuration file and set up logs
2023-06-05 19:03:55 +00:00
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?;
info!("*** Starting up ***");
2023-06-07 15:26:30 +00:00
info!("{:?}", config);
// Setup Redis Service
2023-06-12 17:23:59 +00:00
let mut rs = RedisCtrl::new(&config.redis_url, &config.laser_id)?;
2023-06-05 19:03:55 +00:00
// Setup handler for interrupt Signals
2023-06-05 19:03:55 +00:00
let running = Arc::new(AtomicBool::new(true));
let r = running.clone();
ctrlc::set_handler(move || {
r.store(false, Ordering::SeqCst);
})?;
// Setup Laser Device based on conf
let mut tracer = device_factory(&config)?;
// can't work, but we can add + Debug to Device to make it work...
//dbg!(tracer);
2023-06-03 14:20:35 +00:00
// Setup geometry transformers on points lists
2023-06-07 15:26:30 +00:00
let transformers = config.get_transformers();
2023-06-05 19:03:55 +00:00
// Dispatch based on redis requests
2023-06-05 19:03:55 +00:00
while running.load(Ordering::SeqCst) {
2023-06-12 17:23:59 +00:00
rs.set_status( tracer.status())?;
2023-06-05 19:03:55 +00:00
let order = rs.get_order(config.laser_id)?;
if order != Order::Draw {
info!("Order: {:?}", order);
}
let frame = get_next_frame(&config, &transformers,
2023-06-05 19:03:55 +00:00
&mut rs, order == Order::Black)?;
// For now, draw all the time
2023-06-10 16:47:04 +00:00
tracer.draw(frame, 2_000)?;
2023-06-01 21:11:40 +00:00
}
2023-06-03 13:21:36 +00:00
2023-06-05 19:03:55 +00:00
info!("Exiting, stoping device.");
tracer.stop()?;
2023-06-05 19:03:55 +00:00
Ok(())
2023-06-01 21:11:40 +00:00
}
2023-06-05 11:07:43 +00:00
fn init_logging(config: &LJResult<Conf>) {
2023-06-05 19:03:55 +00:00
if let Ok(ref config) = config {
if config.debug {
let mut builder = Builder::from_default_env();
builder
.filter(None, LevelFilter::Info)
.init();
info!("Debug mode enabled from configuration file");
return;
}
2023-06-05 11:07:43 +00:00
}
2023-06-05 19:03:55 +00:00
info!("Logging level inherited from env");
env_logger::init();
2023-06-05 11:07:43 +00:00
}
2023-06-01 21:11:40 +00:00
fn get_next_frame(
2023-06-05 19:03:55 +00:00
config: &Conf,
transformers: &[Box<dyn Transformers>],
rs: &mut RedisCtrl,
_black: bool,
) -> LJResult<Vec<Point>> {
2023-06-10 16:53:10 +00:00
let line = rs.get(&format!("/pl/{}/0", config.laser_id))?;
let mut line: Vec<Point> = line.into_iter()
.map(|tpl| tpl.into())
.collect();
2023-06-10 16:47:04 +00:00
2023-06-05 19:03:55 +00:00
for transformer in transformers {
line = transformer.apply(&line);
}
2023-06-08 19:06:33 +00:00
//info!("Line: {:?}", line);
Ok(line)
2023-06-01 21:11:40 +00:00
}