diff --git a/src/main.rs b/src/main.rs index 3e81384..9a33a20 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod redis_ctrl; mod conf; mod errors; mod point; +mod modifier; use helios_dac::{ self, @@ -20,8 +21,9 @@ use redis_ctrl::{RedisCtrl,Order}; use conf::Conf; use errors::{LJError,LJResult}; use point::Point; +use modifier::{Transformers,Translate}; -const CENTER : (u16,u16) = (2000, 2000); +const CENTER : (f32,f32) = (2000.0, 2000.0); pub fn main() { match run_all() { @@ -84,8 +86,9 @@ fn get_next_frame( ) -> LJResult { let line = rs.get(&format!("/pl/{}/0", config.laser_id))?; - let line: Vec = line.iter().map(tuple_to_point).collect(); - + let line: Vec = line.into_iter().map(| tpl | tpl.into()).collect(); + let line = Translate::new(CENTER.0, CENTER.1).apply(&line); + let mut line2 = vec![]; while line2.len() < 48 { for p in &line { @@ -94,19 +97,7 @@ fn get_next_frame( } println!("{:?}", line2); - + + let line2 : Vec = line2.into_iter().map(| p | p.into()).collect(); Ok(Frame::new(speed, line2)) } - -fn tuple_to_point(tpl: &(f32, f32, u32)) -> helios_dac::Point { - let mut point : Point = (*tpl).into(); - - point.x = (CENTER.0 + point.x as u16 * 2).into(); - point.y = (CENTER.1 + point.y as u16 * 2).into(); - - if point.x >= 4096.0 || point.y >= 4096.0 { - println!("WARN: coordinate out of range: {:?}", point); - } - - point.into() -} diff --git a/src/modifier.rs b/src/modifier.rs new file mode 100644 index 0000000..56395ed --- /dev/null +++ b/src/modifier.rs @@ -0,0 +1,29 @@ +use crate::point::Point; + +pub trait Transformers { + fn apply(&self, point_list: &Vec) -> Vec; +} + +#[derive(Debug,Clone,Copy)] +pub struct Translate { + x: f32, + y: f32 +} + +impl Translate { + pub fn new(x: f32, y: f32) -> Self { + Self { x, y } + } +} + +impl Transformers for Translate { + fn apply(&self, point_list: &Vec) -> Vec { + point_list.iter() + .map(| pt | { + Point { x: pt.x + self.x, + y: pt.y + self.y, + ..*pt + } + }).collect() + } +}