diff --git a/src/conf.rs b/src/conf.rs index 7cbf585..051cd58 100644 --- a/src/conf.rs +++ b/src/conf.rs @@ -1,32 +1,28 @@ - use config::Config; use serde::Deserialize; - -#[derive(Deserialize,Debug)] +#[derive(Deserialize, Debug)] pub enum DacFamily { Helios, - Etherdream - } - -#[derive(Deserialize,Debug)] -pub struct Conf { - laser_id : u8, - debug : bool, - redis_url : String, - dac_family: DacFamily, - dac_id : Option, - dac_url : Option + Etherdream, } +#[derive(Deserialize, Debug)] +pub struct Conf { + laser_id: u8, + debug: bool, + redis_url: String, + dac_family: DacFamily, + dac_id: Option, + dac_url: Option, +} -pub fn load_config( path : &str )-> Result> { +pub fn load_config(path: &str) -> Result> { let settings = Config::builder() .add_source(config::File::with_name(path)) - .build()?; - - let conf = settings - .try_deserialize::()?; - + .build()?; + + let conf = settings.try_deserialize::()?; + Ok(conf) } diff --git a/src/lib.rs b/src/lib.rs index 167b21e..524f793 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,2 @@ pub mod conf; -pub mod redis_ctrl; \ No newline at end of file +pub mod redis_ctrl; diff --git a/src/main.rs b/src/main.rs index e1a22a5..374e9a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,81 +1,77 @@ +mod conf; /// /// Configure udev: /// https://github.com/Grix/helios_dac/blob/master/docs/udev_rules_for_linux.md /// - mod redis_ctrl; -mod conf; -use helios_dac::{Frame, - Point, - DeviceStatus, - // Coordinate, - Color}; use helios_dac::NativeHeliosDacController; +use helios_dac::{ + // Coordinate, + Color, + DeviceStatus, + Frame, + Point, +}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use redis_ctrl::{RedisCtrl,Order}; -use conf::{load_config,Conf}; +use conf::{load_config, Conf}; +use redis_ctrl::{Order, RedisCtrl}; - -const CENTER : (u16,u16) = (2000, 2000); +const CENTER: (u16, u16) = (2000, 2000); pub fn main() { - let config = match load_config("Settings") { - Ok(c) => c, - Err(err) => { - panic!("Unable to load config file: {:?}", err) - } + Ok(c) => c, + Err(err) => { + panic!("Unable to load config file: {:?}", err) + } }; - + let rs = match RedisCtrl::new() { - Ok(rs) => rs, - Err(err) => { - panic!("Unable to connect to redis: {:?}", err); - } + Ok(rs) => rs, + Err(err) => { + panic!("Unable to connect to redis: {:?}", err); + } }; match run_dac(config, rs) { - Ok(()) => {}, - Err(err) => { - panic!("Error: {:?}", err) - } + Ok(()) => {} + Err(err) => { + panic!("Error: {:?}", err) + } } } -fn run_dac( - config: Conf, - mut rs: RedisCtrl -) -> Result<(), Box> { +fn run_dac(config: Conf, mut rs: RedisCtrl) -> Result<(), Box> { let running = Arc::new(AtomicBool::new(true)); let r = running.clone(); ctrlc::set_handler(move || { r.store(false, Ordering::SeqCst); - }).expect("Error setting Ctrl-C handler"); + }) + .expect("Error setting Ctrl-C handler"); let controller = NativeHeliosDacController::new()?; let devices = controller.list_devices()?; - + let Some(device) = devices.into_iter().next() else { println!("Unable to find an helios device"); return Ok(()); }; - - let mut device = device.open()?; - - while running.load(Ordering::SeqCst) { - let order = rs.get_order(0)?; - if order != Order::Draw { - println!("{:?}", order); - } - let frame = get_next_frame(1000, &mut rs)?; - - while let Ok(DeviceStatus::NotReady) = device.status() { - } + let mut device = device.open()?; + + while running.load(Ordering::SeqCst) { + let order = rs.get_order(0)?; + if order != Order::Draw { + println!("{:?}", order); + } + + let frame = get_next_frame(1000, &mut rs)?; + + while let Ok(DeviceStatus::NotReady) = device.status() {} device.write_frame(frame)?; } @@ -84,45 +80,39 @@ fn run_dac( Ok(()) } -fn get_next_frame( - speed: u32, - rs: &mut RedisCtrl -) -> Result> { - +fn get_next_frame(speed: u32, rs: &mut RedisCtrl) -> Result> { let line = rs.get("/pl/0/0")?; - let line : Vec = line.iter() - .map(tuple_to_point) - .collect(); - + let line: Vec = line.iter().map(tuple_to_point).collect(); + let mut line2 = vec![]; while line2.len() < 48 { - for p in &line { - line2.push(*p); - } + for p in &line { + line2.push(*p); + } } - + Ok(Frame::new(speed, line2)) } -fn tuple_to_point(tpl: &(f32,f32,u32)) -> Point { +fn tuple_to_point(tpl: &(f32, f32, u32)) -> Point { let (x, y, col) = tpl; - - let r = (col >> 16) as u8 ; - let g = ((col >> 8) & 255) as u8 ; - let b = (col & 255) as u8 ; - + + let r = (col >> 16) as u8; + let g = ((col >> 8) & 255) as u8; + let b = (col & 255) as u8; + let x = CENTER.0 + *x as u16; let y = CENTER.1 + *y as u16; if x >= 4096 || y >= 4096 { - println!("WARN: coordinate out of range: {} {}", x, y); + println!("WARN: coordinate out of range: {} {}", x, y); } let x = x.clamp(0, 4095); let y = y.clamp(0, 4095); - + Point { coordinate: (x, y).into(), color: Color::new(r, g, b), - intensity: 0xFF + intensity: 0xFF, } } diff --git a/src/redis_ctrl.rs b/src/redis_ctrl.rs index ff60f80..238bd8a 100644 --- a/src/redis_ctrl.rs +++ b/src/redis_ctrl.rs @@ -1,12 +1,8 @@ -use redis::{ - Client, - Connection, - Commands -}; +use redis::{Client, Commands, Connection}; use ron::de::from_str; #[repr(u8)] -#[derive(Debug,PartialEq)] +#[derive(Debug, PartialEq)] pub enum Order { Draw = 0, Edh, //homography @@ -16,71 +12,62 @@ pub enum Order { ClientKey, Intensity, Kpps, - ColorBalance + ColorBalance, } impl TryFrom for Order { type Error = String; - + fn try_from(value: u8) -> Result { - use Order::*; + use Order::*; - if value > 8 { - return Err("order out of range".to_string()); - } - - Ok(match value { - 0 => Draw, - 1 => Edh, - 2 => Black, - 3 => Grid, - 4 => Resampler, - 5 => ClientKey, - 6 => Intensity, - 7 => Kpps, - 8 => ColorBalance, - _ => panic!("Can't be there") - }) + if value > 8 { + return Err("order out of range".to_string()); + } + + Ok(match value { + 0 => Draw, + 1 => Edh, + 2 => Black, + 3 => Grid, + 4 => Resampler, + 5 => ClientKey, + 6 => Intensity, + 7 => Kpps, + 8 => ColorBalance, + _ => panic!("Can't be there"), + }) } -} +} -pub type Line = Vec<(f32,f32,u32)>; +pub type Line = Vec<(f32, f32, u32)>; pub struct RedisCtrl { pub client: Client, - pub connection: Connection + pub connection: Connection, } impl RedisCtrl { - pub fn new() -> Result> { - let client = Client::open("redis://127.0.0.1/")?; - let connection = client.get_connection()?; - Ok(RedisCtrl { client, connection }) + let client = Client::open("redis://127.0.0.1/")?; + let connection = client.get_connection()?; + Ok(RedisCtrl { client, connection }) } - pub fn get( - &mut self, - key: &str - ) -> Result> { - let val : String = self.connection.get(key)?; - let line : Line = from_str(&val)?; - Ok(line) - } - - pub fn get_order( - &mut self, - id: u8 - ) -> Result> { - let path = format!("/order/{id}"); - let val : u8 = self.connection.get(path.clone())?; - - if val == 1 || val >= 4 { - self.connection.set(path, 0)?; - } - - Ok(val.try_into()?) + pub fn get(&mut self, key: &str) -> Result> { + let val: String = self.connection.get(key)?; + let line: Line = from_str(&val)?; + Ok(line) } + pub fn get_order(&mut self, id: u8) -> Result> { + let path = format!("/order/{id}"); + let val: u8 = self.connection.get(path.clone())?; + + if val == 1 || val >= 4 { + self.connection.set(path, 0)?; + } + + Ok(val.try_into()?) + } } -