Add Mshroom machine implementation
[temp2RGB.git] / src / main_loop.rs
index c787250..8e88ecf 100644 (file)
@@ -1,11 +1,13 @@
 use std::{
     sync::{
-        atomic::{AtomicBool, Ordering},
         Arc,
+        atomic::{AtomicBool, Ordering},
     },
     time::{self, Duration},
 };
 
+use log::warn;
+
 use crate::{consts, machine, rgb, settings, timer, winring0};
 
 pub fn main_loop(completed: Arc<AtomicBool>) {
@@ -20,12 +22,38 @@ pub fn main_loop(completed: Arc<AtomicBool>) {
     winring0::init();
 
     let sleep = timer::Sleep::new();
-    let settings = settings::Settings::read(consts::FILE_CONF).expect("Cannot load settings");
-    println!("Settings: {settings:?}");
+
+    let file_conf_path = if cfg!(debug_assertions) {
+        String::from(consts::FILE_CONF)
+    } else {
+        String::from(
+            dirs::config_dir()
+                .unwrap()
+                .join(consts::SERVICE_NAME)
+                .join(consts::FILE_CONF)
+                .to_str()
+                .unwrap(),
+        )
+    };
+
+    let settings = settings::Settings::read(&file_conf_path).expect("Cannot load settings");
+    println!("Settings: {settings:?} from {file_conf_path}");
 
     let mut machine: Box<dyn machine::Machine> = match settings.machine_name {
-        settings::MachineName::Jiji => Box::new(machine::MachineJiji::new()),
-        settings::MachineName::LyssMetal => Box::new(machine::MachineLyssMetal::new()),
+        settings::MachineName::Jiji => {
+            Box::new(machine::jiji::MachineJiji::new().expect("Unable to create MachineJiji"))
+        }
+        settings::MachineName::LyssMetal => Box::new(
+            machine::lyss_metal::MachineLyssMetal::new()
+                .expect("Unable to create MachineLyssMetal"),
+        ),
+        settings::MachineName::LyssMetal2 => Box::new(
+            machine::lyss_metal2::MachineLyssMetal2::new()
+                .expect("Unable to create MachineLyssMetal2"),
+        ),
+        settings::MachineName::Mshroom => {
+            Box::new(machine::mshroom::Mshroom::new().expect("Unable to create Mshroom"))
+        }
     };
 
     let mut kernel = [0f32; consts::KERNEL_SIZE_SAMPLES];
@@ -59,14 +87,31 @@ pub fn main_loop(completed: Arc<AtomicBool>) {
             1f32,
         ); // Between 0 (cold) and 1 (hot).
 
-        let color =
-            rgb::linear_interpolation(settings.cold_color, settings.hot_color, normalized_temp);
+        let color_1 =
+            rgb::linear_interpolation(settings.cold_color_1, settings.hot_color_1, normalized_temp);
+
+        let color_2 = match (settings.cold_color_2, settings.hot_color_2) {
+            (Some(cold_color), Some(hot_color)) => Some(rgb::linear_interpolation(
+                cold_color,
+                hot_color,
+                normalized_temp,
+            )),
+            _ => None,
+        };
 
         // println!("normalized_temp: {normalized_temp}");
 
         if tick % (consts::FREQ_TEMP_POLLING / consts::FREQ_REFRESHING_RGB) as i64 == 0 {
-            println!("Update RGB: {color:?}, temp: {mean_temp}");
-            machine.set_color(&color);
+            println!("Update RGB: {color_1:?}/{color_2:?}, temp: {mean_temp}");
+            if let Err(error) = machine.set_color_1(&color_1) {
+                warn!("Unable to set color 1: {}", error);
+            };
+
+            if let Err(error) =
+                machine.set_color_2(&if let Some(c) = color_2 { c } else { color_1 })
+            {
+                warn!("Unable to set color 2: {}", error);
+            };
         }
 
         let elapsed = time::Instant::now() - time_beginning_loop;