diff --git a/README.md b/README.md deleted file mode 100644 index f9ebc29..0000000 --- a/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# LJ rust - -## Crashcourse - -```shell - -# Copy and edit the settings file -$ cp copyme.settings.toml settings.toml - -# Populate the redis database -$ cargo run --example populate_redis - -# Run -$ cargo run --release - -``` \ No newline at end of file diff --git a/copyme.settings.toml b/copyme.settings.toml index ea131ff..fa9d255 100644 --- a/copyme.settings.toml +++ b/copyme.settings.toml @@ -1,4 +1,4 @@ -# file: settings.toml +# file: Settings.toml # Rename me ! # The main key of your laser in LJ @@ -12,11 +12,11 @@ redis_url = "redis://127.0.0.1:6379/" # Either Helios or Etherdream # For Helios. USB Device Id of the DAC -#[dac.helios] -#id = 0 +[dac.helios] +id = 0 # For dummy dac: - [dac.dummy] +# [dac.dummy] # For Etherdream. IP of the DAC # [dac.etherdream] @@ -26,7 +26,6 @@ redis_url = "redis://127.0.0.1:6379/" [transformers.translate] x = 2000 y = 2000 - [[transformers]] [transformers.replicate] Until = 48 diff --git a/examples/populate_redis.rs b/examples/populate_redis.rs deleted file mode 100644 index cd95e77..0000000 --- a/examples/populate_redis.rs +++ /dev/null @@ -1,24 +0,0 @@ -/// -/// $ cargo run --example populate_redis -/// - -use redis::{ - //RedisResult, - Client, - Commands, - Connection, -}; - -fn do_something() -> redis::RedisResult<()> { - let client = Client::open("redis://127.0.0.1/")?; - let mut con: Connection = client.get_connection()?; - - let _ = con.set("/clientkey", "/pl/0/")?; - let _ = con.set("/EDH/0", "[[1.0, 0.0, 0.0],\n [ 0.0, 1.0, 0.0],\n [ 0.0, 0.0, 1.0]]")?; - let _ = con.set("/kpps/0", "5000")?; - let _ = con.set("/intensity/0", "255")?; - Ok(()) -} -fn main() { - _ = do_something(); -} diff --git a/src/device/etherdream.rs b/src/device/etherdream.rs index d1aaac6..e620f61 100644 --- a/src/device/etherdream.rs +++ b/src/device/etherdream.rs @@ -8,7 +8,7 @@ use crate::device::{Device, Status, PlaybackState}; use crate::errors::{LJError, LJResult}; use crate::point::{Color, Point}; use ether_dream::protocol::{DacBroadcast, DacStatus}; -use log::{info, warn}; +use log::info; #[warn(dead_code)] pub struct EtherdreamDevice { @@ -38,26 +38,20 @@ impl EtherdreamDevice { pub fn get_dac(conf: &EtherDreamConf) -> LJResult<(DacBroadcast, SocketAddr, Stream)> { let ip = &conf.ip; let dac_broadcast = ether_dream::recv_dac_broadcasts()?; - dac_broadcast.set_timeout(Some(time::Duration::new(10, 0)))?; - info!("Attempting to get DAC broadcast..."); + dac_broadcast.set_nonblocking(true)?; + dac_broadcast.set_timeout(Some(time::Duration::new(60, 30)))?; let broadcast = dac_broadcast .filter_map(|result| { - match result { - Err(err) => { - warn!( "Failed to find a valid DAC via broadcast. Error: {:?}", err); - info!( "Retrying..."); - None - }, - Ok((dac, source_addr)) => { - if source_addr.is_ipv6() { return None; } - if &source_addr.ip().to_string() != ip { return None; } - info!("Valid broadcast"); - Some(Ok((dac, source_addr))) - } - } + info!("Received new broadcast {:?}", result); + if result.is_err() { return None; } + let (dac, source_addr) = result.unwrap(); + if source_addr.is_ipv6() { return None; } + if source_addr.ip().to_string() != ip.clone() { return None; } + info!("Valid broadcast"); + Some(Ok((dac, source_addr))) }) .next() - .expect("Failed to receive broadcast."); + .ok_or(LJError::EtherdreamError("Failed to receive broadcast".to_string()))?; match broadcast { Err(err) => { Err(Box::new(LJError::EtherdreamConnectError(err))) diff --git a/src/errors.rs b/src/errors.rs index 9640b11..16237d5 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -11,6 +11,7 @@ pub enum LJError { RedisConnect(RedisError), HeliosDeviceMissing, BadEDH, + EtherdreamError(String), EtherdreamConnectError(io::Error), } @@ -31,6 +32,9 @@ impl fmt::Display for LJError { BadEDH => { write!(f, "EDH matrix is not a 3x3 matrix") } + EtherdreamError(msg) => { + write!(f, "Unexpected Etherdream device error: {msg}") + } EtherdreamConnectError(err) => { write!(f, "Failed to retrieve Etherdream device: {err}") } diff --git a/src/main.rs b/src/main.rs index 501d8cd..8e88018 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,7 @@ fn run_all() -> LJResult<()> { // Setup Redis Service let mut rs = RedisCtrl::new(&config.redis_url, &config.laser_id)?; - let mut world_state = rs.init_world_state().unwrap(); + let mut world_state = rs.init_world_state()?; info!("WorldState: {:?}", world_state); // Setup handler for interrupt Signals diff --git a/src/redis_ctrl.rs b/src/redis_ctrl.rs index 74ac5a0..9c245f5 100644 --- a/src/redis_ctrl.rs +++ b/src/redis_ctrl.rs @@ -101,10 +101,10 @@ impl RedisCtrl { pub fn init_world_state( &mut self) -> LJResult{ Ok(WorldState { - client_key: self.get_client_key().unwrap(), - edh: self.get_edh().unwrap(), - kpps: self.get_int("kpps").unwrap().try_into().unwrap(), - intensity: self.get_int("intensity").unwrap().try_into().unwrap(), + client_key: self.get_client_key()?, + edh: self.get_edh()?, + kpps: self.get_int("kpps")?.try_into()?, + intensity: self.get_int("intensity")?.try_into()?, ..WorldState::default() }) }