diff --git a/Cargo.toml b/Cargo.toml index 5b851c9..9fe9511 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,4 @@ tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } font-loader = "0.11.0" clru = "0.6.1" +once_cell = "1.19.0" \ No newline at end of file diff --git a/src/device.rs b/src/device.rs index d5aaf24..a41a72f 100644 --- a/src/device.rs +++ b/src/device.rs @@ -1,6 +1,6 @@ use crate::{ config::{Button, ConfigError, DeviceConfig, Space}, - modules::{retrieve_module_from_name, start_module, HostEvent}, + modules::{start_module, HostEvent, MODULE_REGISTRY}, unwrap_or_error, }; use clru::CLruCache; @@ -141,7 +141,7 @@ impl Device { .as_ref() .expect("Runtime has to be created before module can be spawned"); let (module_sender, module_receiver) = mpsc::channel(4); - if let Some(module) = retrieve_module_from_name(&btn.module) { + if let Some(module) = MODULE_REGISTRY.get_module(&btn.module) { { // initialize the module let ser = self.serial.clone(); @@ -150,7 +150,7 @@ impl Device { let image_cache = self.image_cache.clone(); runtime.spawn(async move { - start_module(ser, b, module, dev, module_receiver, image_cache).await + start_module(ser, b, *module, dev, module_receiver, image_cache).await }); } // if the receiver already dropped the listener then just directly insert none. diff --git a/src/main.rs b/src/main.rs index 4b2d43f..a34adc7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,6 @@ use std::{ collections::HashMap, process::exit, sync::{Arc, Mutex, OnceLock}, - thread, time::Duration, }; use tracing::{debug, error, info, trace, warn}; diff --git a/src/modules.rs b/src/modules.rs index 834df30..938a0cf 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -17,6 +17,8 @@ use ::image::DynamicImage; use async_trait::async_trait; pub use deck_driver as streamdeck; use futures_util::Future; +use once_cell::sync::Lazy; +use std::collections::HashMap; use std::{error::Error, pin::Pin, sync::Arc}; use streamdeck::info::ImageFormat; use streamdeck::info::Kind; @@ -25,6 +27,8 @@ use streamdeck::StreamDeckError; use tokio::sync::{mpsc, Mutex}; use tracing::{debug, error, trace}; +pub static MODULE_REGISTRY: Lazy = Lazy::new(|| ModuleRegistry::default()); + /// Events that are coming from the host #[derive(Clone, Copy, Debug)] pub enum HostEvent { @@ -39,12 +43,34 @@ pub type ModuleFuture = Pin> + Send>>; pub type ModuleInitFunction = fn(Arc