diff --git a/Cargo.lock b/Cargo.lock index 0a10801..d62d9d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -23,6 +38,21 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "battery" version = "0.7.8" @@ -46,12 +76,24 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "bumpalo" version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bytes" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca2be1d5c43812bae364ee3f30b3afcb7877cf59f4aeb94c66f313a41d2fac9" + [[package]] name = "cc" version = "1.1.7" @@ -131,6 +173,18 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -175,6 +229,16 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" @@ -190,13 +254,40 @@ dependencies = [ "libc", ] +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys", +] + [[package]] name = "nix" version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cc", "cfg-if", "libc", @@ -220,12 +311,50 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + [[package]] name = "proc-macro2" version = "1.0.86" @@ -264,6 +393,52 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "syn" version = "2.0.72" @@ -290,6 +465,35 @@ dependencies = [ "windows", ] +[[package]] +name = "tokio" +version = "1.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "turnip" version = "0.1.0" @@ -297,6 +501,7 @@ dependencies = [ "battery", "chrono", "sysinfo", + "tokio", ] [[package]] @@ -321,6 +526,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -416,6 +627,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-targets" version = "0.52.6" diff --git a/Cargo.toml b/Cargo.toml index 8d46983..7d3e0dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,5 @@ edition = "2021" [dependencies] chrono = "0.4" battery = "0.7.8" -sysinfo = "0.30.13" \ No newline at end of file +sysinfo = "0.30.13" +tokio = { version = "1.39.2", features = ["full"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 5304740..176490d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ use std::process::Command; -use std::thread::sleep; -use std::time::Duration; +use tokio::time::{sleep, Duration}; use chrono::Local; use sysinfo::System; use chrono::Timelike; @@ -9,6 +8,9 @@ use std::fs; use std::io::{self, BufRead}; use std::path::Path; use sysinfo::Networks; +use std::sync::Arc; +use battery::Manager; +use tokio::sync::{Notify}; const BATTERY_STATE : [&str; 5] = ["", "", "", "", ""]; const CPU_STATE : [&str; 5] = ["", "", "", "", ""]; @@ -20,17 +22,49 @@ enum Connection { None, } -fn main() { - let manager = battery::Manager::new().expect("could not create battery manager"); +#[tokio::main] +async fn main() { + let manager = Manager::new().expect("could not create battery manager"); let mut sys = System::new(); + let mut networks = Networks::new(); let mut battery = manager.batteries().expect("could not fetch battery").next().expect("there should be a battery").expect("the battery should be okay"); + + let mut networks_2 = Networks::new(); + let mut battery_2 = manager.batteries().expect("could not fetch battery").next().expect("there should be a battery").expect("the battery should be okay"); + + + let notify = Arc::new(Notify::new()); + let notify_cloned: Arc = Arc::clone(¬ify); + + tokio::spawn(async move { + loop { + sleep(Duration::from_secs(3)).await; + + let battery_charging = battery_2.time_to_empty().is_none(); + battery_2.refresh().expect("could not refresh battery"); + + if battery_2.time_to_empty().is_none() != battery_charging && battery_2.state_of_charge().value != 1.0 { + notify_cloned.notify_one(); + println!("battery notif"); + continue + } + + let connection_type = get_connection(&networks_2); + + networks_2.refresh_list(); + if connection_type != get_connection(&networks_2) { + notify_cloned.notify_one(); + println!("network notif"); + } + } + }); + loop { let time_str = time_display(); - + battery.refresh().expect("could not refresh battery"); - let battery_charging = battery.time_to_empty().is_none(); let battery_str = battery_display(&battery); sys.refresh_cpu(); @@ -40,23 +74,17 @@ fn main() { let mem_str = mem_display(sys.used_memory()); networks.refresh_list(); - let (internet_str, connection_type) = internet_display(&networks); + let internet_str = internet_display(&networks); display(format!("| {} | {} | {} | {} | {} ", internet_str, mem_str, cpu_str, battery_str, time_str)); - - let mut event = false; - sleep(Duration::from_secs(1)); - - while Local::now().second() != 0 && !event { - sleep(Duration::from_secs(1)); - - battery.refresh().expect("could not refresh battery"); - if battery.time_to_empty().is_none() != battery_charging && battery.state_of_charge().value != 1.0 { - event = true; + + let sleep_or_notify = sleep(Duration::from_secs((60 - Local::now().second()).into())); + tokio::select! { + _ = sleep_or_notify => { + println!("60 seconds elapsed"); } - networks.refresh_list(); - if connection_type != get_connection(&networks) { - event = true; + _ = notify.notified() => { + println!("waking up early"); } } } @@ -154,15 +182,15 @@ fn get_wifi_strength() -> Option { None } -fn internet_display(networks: &Networks) -> (String, Connection) { +fn internet_display(networks: &Networks) -> String { let connection_type = get_connection(networks); match connection_type { - Connection::Wired => (" ".to_string(), Connection::Wired), - Connection::None => (" ".to_string(), Connection::None), + Connection::Wired => " ".to_string(), + Connection::None => " ".to_string(), Connection::Wifi => { let strength = get_wifi_strength().unwrap_or(0.0); - (format!(" {:.0}%", strength), Connection::Wifi) + format!(" {:.0}%", strength) } } } diff --git a/turnip_v1.0.tar.gz b/turnip_v1.0.tar.gz deleted file mode 100644 index daa6499..0000000 Binary files a/turnip_v1.0.tar.gz and /dev/null differ