From a44220fed17903abea4df37c916f3bf3dd3501d8 Mon Sep 17 00:00:00 2001 From: 4yn Date: Sat, 29 Jan 2022 04:23:16 +0800 Subject: [PATCH] persistency --- src-tauri/Cargo.lock | 21 +++++++++ src-tauri/Cargo.toml | 1 + src-tauri/src/bin/test_usb.rs | 5 +- src-tauri/src/main.rs | 40 +++++++++++++--- src-tauri/src/slider_io/config.rs | 76 ++++++++++++++++++++++++++----- src-tauri/src/slider_io/mod.rs | 7 ++- src/App.svelte | 15 ++++-- 7 files changed, 139 insertions(+), 26 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index fa4da26..ad9ff5a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -682,6 +682,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs" version = "1.0.5" @@ -703,6 +712,17 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users 0.4.0", + "winapi", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -2743,6 +2763,7 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" name = "slidershim" version = "0.1.0" dependencies = [ + "directories", "palette", "rusb", "serde", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e739546..867e4ae 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -21,6 +21,7 @@ tauri = { version = "1.0.0-beta.8", features = ["api-all", "system-tray"] } rusb = "0.9.0" palette = "0.6.0" winapi = "0.3.9" +directories = "4.0.1" [features] default = [ "custom-protocol" ] diff --git a/src-tauri/src/bin/test_usb.rs b/src-tauri/src/bin/test_usb.rs index 51ebe7f..5ee29bc 100644 --- a/src-tauri/src/bin/test_usb.rs +++ b/src-tauri/src/bin/test_usb.rs @@ -2,7 +2,7 @@ extern crate slidershim; use std::io; -use slidershim::slider_io::{config::Config, manager::Manager}; +use slidershim::slider_io::{Config, Manager}; fn main() { let config = Config::from_str( @@ -12,7 +12,8 @@ fn main() { "ledMode": "reactive-8", "keyboardSensitivity": 50 }"#, - ); + ) + .unwrap(); let manager = Manager::new(config); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 8d15dce..91902e7 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,6 +7,8 @@ mod slider_io; +use std::sync::{Arc, Mutex}; + use tauri::{ AppHandle, CustomMenuItem, Event, Manager, Runtime, SystemTray, SystemTrayEvent, SystemTrayMenu, }; @@ -24,6 +26,12 @@ fn quit_app() { } fn main() { + let config = Arc::new(Mutex::new(Some(slider_io::Config::default()))); + { + println!("Saving"); + config.lock().unwrap().as_ref().unwrap().save(); + } + tauri::Builder::default() .system_tray( SystemTray::new().with_menu( @@ -54,16 +62,34 @@ fn main() { }, _ => {} }) - .setup(|app| { - app.listen_global("setConfig", |event| { - let payload = event.payload().unwrap(); - println!("Setting config to {}", payload); - + .setup(move |app| { + let app_handle = app.handle(); + let config_clone = Arc::clone(&config); + app.listen_global("heartbeat", move |e| { + let config_handle = config_clone.lock().unwrap(); + println!("Heartbeat {}", config_handle.as_ref().unwrap().raw.as_str()); + app_handle + .emit_all( + "showConfig", + Some(config_handle.as_ref().unwrap().raw.as_str().to_string()), + ) + .unwrap(); }); - let handle = app.handle(); + let config_clone = Arc::clone(&config); + app.listen_global("setConfig", move |event| { + let payload = event.payload().unwrap(); + println!("Setting config to {}", payload); + if let Some(new_config) = slider_io::Config::from_str(payload) { + let mut config_handle = config_clone.lock().unwrap(); + config_handle.replace(new_config); + config_handle.as_ref().unwrap().save(); + } + }); + + let app_handle = app.handle(); app.listen_global("hide", move |_| { - hide_window(&handle); + hide_window(&app_handle); }); app.listen_global("quit", |_| { diff --git a/src-tauri/src/slider_io/config.rs b/src-tauri/src/slider_io/config.rs index 1e41a1a..109207c 100644 --- a/src-tauri/src/slider_io/config.rs +++ b/src-tauri/src/slider_io/config.rs @@ -1,5 +1,7 @@ +use directories::ProjectDirs; +use std::{convert::TryFrom, fs, path::PathBuf}; + use serde_json::Value; -use std::convert::TryFrom; #[derive(Debug, Clone)] pub enum DeviceMode { @@ -59,12 +61,12 @@ pub struct Config { } impl Config { - pub fn from_str(s: &str) -> Config { - let v: Value = serde_json::from_str(s).unwrap(); + pub fn from_str(s: &str) -> Option { + let v: Value = serde_json::from_str(s).ok()?; - Config { + Some(Config { raw: s.to_string(), - device_mode: match v["deviceMode"].as_str().unwrap() { + device_mode: match v["deviceMode"].as_str()? { "none" => DeviceMode::None, "tasoller-one" => DeviceMode::TasollerOne, "tasoller-two" => DeviceMode::TasollerTwo, @@ -77,34 +79,34 @@ impl Config { "none" => OutputMode::None, "kb-32-tasoller" => OutputMode::Keyboard { layout: KeyboardLayout::Tasoller, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, }, "kb-32-yuancon" => OutputMode::Keyboard { layout: KeyboardLayout::Yuancon, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, }, "kb-6-deemo" => OutputMode::Keyboard { layout: KeyboardLayout::Deemo, - sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, }, "websocket" => OutputMode::Websocket { url: v["outputWebsocketUrl"].to_string(), }, _ => panic!("Invalid output mode"), }, - led_mode: match v["ledMode"].as_str().unwrap() { + led_mode: match v["ledMode"].as_str()? { "none" => LedMode::None, "reactive-4" => LedMode::Reactive { layout: ReactiveLayout::Four, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, }, "reactive-8" => LedMode::Reactive { layout: ReactiveLayout::Eight, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, }, "reactive-16" => LedMode::Reactive { layout: ReactiveLayout::Sixteen, - sensitivity: u8::try_from(v["ledSensitivity"].as_i64().unwrap()).unwrap(), + sensitivity: u8::try_from(v["ledSensitivity"].as_i64()?).ok()?, }, "attract" => LedMode::Attract, "test" => LedMode::Test, @@ -113,6 +115,56 @@ impl Config { }, _ => panic!("Invalid led mode"), }, + }) + } + + fn factory() -> Self { + Self::from_str( + r#"{ + "deviceMode": "none", + "outputMode": "none", + "ledMode": "none", + "keyboardSensitivity": 20, + "outputWebsocketUrl": "localhost:3000", + "ledSensitivity": 20, + "ledWebsocketUrl": "localhost:3001" + }"#, + ) + .unwrap() + } + + fn get_saved_path() -> Option> { + let project_dir = ProjectDirs::from("me", "imp.ress", "slidershim").unwrap(); + let config_dir = project_dir.config_dir(); + fs::create_dir_all(config_dir); + + let config_path = config_dir.join("config.json"); + + return Some(Box::new(config_path)); + } + + fn load_saved() -> Option { + let config_path = Self::get_saved_path()?; + if !config_path.exists() { + return None; } + println!("Found saved"); + let mut saved_data = fs::read_to_string(config_path.as_path()).ok()?; + println!("Loaded saved {}", saved_data); + return Self::from_str(saved_data.as_str()); + } + + pub fn default() -> Self { + Self::load_saved() + .or_else(|| Some(Self::factory())) + .unwrap() + } + + pub fn save(&self) -> Option<()> { + let config_path = Self::get_saved_path()?; + println!("Saving to {:?}", config_path); + fs::write(config_path.as_path(), self.raw.as_str()).unwrap(); + + Some(()) } } diff --git a/src-tauri/src/slider_io/mod.rs b/src-tauri/src/slider_io/mod.rs index 96433d1..3a27273 100644 --- a/src-tauri/src/slider_io/mod.rs +++ b/src-tauri/src/slider_io/mod.rs @@ -1,4 +1,4 @@ -pub mod config; +mod config; mod controller_state; mod worker; @@ -9,4 +9,7 @@ mod device; mod led; mod output; -pub mod manager; +mod manager; + +pub use config::Config; +pub use manager::Manager; diff --git a/src/App.svelte b/src/App.svelte index 3c74aed..144703d 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -13,9 +13,14 @@ let ledSensitivity = 20; let ledWebsocketUrl = "http://localhost:3001"; + let debugstr = ""; + onMount(async () => { + // console.log(emit, listen); await listen("showConfig", (event) => { - const payload: any = event.payload; + console.log("heartbeat", event); + debugstr = event.payload; + const payload: any = JSON.parse(event.payload as any); deviceMode = payload.deviceMode; outputMode = payload.outputMode; ledMode = payload.ledMode; @@ -24,6 +29,7 @@ ledSensitivity = payload.ledSensitivity; ledWebsocketUrl = payload.ledWebsocketUrl; }); + await emit("heartbeat", ""); }); async function setConfig() { @@ -59,6 +65,9 @@ slidershim +
@@ -145,7 +154,7 @@ min="1" max="255" step="1" - bind:value={keyboardSensitivity} + bind:value={ledSensitivity} /> @@ -157,7 +166,7 @@ min="1" max="255" step="1" - bind:value={keyboardSensitivity} + bind:value={ledSensitivity} />