diff options
| author | Andreas Grois <andi@grois.info> | 2021-04-19 23:53:40 +0200 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2021-04-19 23:53:40 +0200 |
| commit | e1a78dd03e4e60d667254fcaaeb4f7f1f7459ae6 (patch) | |
| tree | e59485fafb73193b3b51d622ccba5feee388416d /clock | |
| parent | e7a0ff0c1fb5f92cceb5e2abfe4848cf98492fde (diff) | |
Clock now does something (but isn't done yet).
Diffstat (limited to 'clock')
| -rw-r--r-- | clock/Cargo.toml | 2 | ||||
| -rw-r--r-- | clock/src/lib.rs | 41 |
2 files changed, 38 insertions, 5 deletions
diff --git a/clock/Cargo.toml b/clock/Cargo.toml index 2215005..1bbbc94 100644 --- a/clock/Cargo.toml +++ b/clock/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" swaystatus-plugin = { path = '../swaystatus-plugin', version = '*'} serde = { version = "1.0", features = ["derive"] } erased-serde = "0.3" -chrono = { version = "0.4", features = ["serde"] } +chrono = { version = "0.4" } [lib] crate-type = ["dylib"] diff --git a/clock/src/lib.rs b/clock/src/lib.rs index b3ad0e8..21f2079 100644 --- a/clock/src/lib.rs +++ b/clock/src/lib.rs @@ -9,12 +9,45 @@ pub struct ClockRunnable<'c> { to_main : Box<dyn MsgModuleToMain +'c> } +impl<'c> ClockRunnable<'c> { + fn print_current_time_with_format(&self) -> String { + let now = chrono::offset::Local::now(); + now.format(&self.config.format).to_string() + } + fn simple_loop(&self) { + loop { + self.to_main.send_update(Ok(self.print_current_time_with_format())).expect("Clock plugin tried to send the current time to the main program, but the main program doesn't listen any more."); + match self.from_main.recv_timeout(std::time::Duration::from_secs_f32(self.config.refresh_rate)) { + Ok(MessagesFromMain::Refresh) | Err(RecvTimeoutError::Timeout) => {}, + Ok(MessagesFromMain::Quit) | Err(RecvTimeoutError::Disconnected) => { break; }, + } + } + } + + fn synchronized_loop(&self, second_fraction : u32) { + //TODO: implement... + self.simple_loop(); + } +} + impl<'c> SwayStatusModuleRunnable for ClockRunnable<'c> { fn run(&self) { - for i in 0..4 { - println!("Sending Error {}",i); - self.to_main.send_update(Err(PluginError::PrintToStdErr(format!("Hello {}", i)))).unwrap(); - std::thread::sleep(std::time::Duration::from_secs(2)); + //there are two modes of operation for this module. + //Which one is used depends entirely on the interval + //If the interval or its inverse is a full multiple of + //a second, we use the "synchronized" variant, which + //aims at ticking approximately at the full second. + //Otherwise we just loop. + let frac_part = self.config.refresh_rate.fract(); + let inverse_frac_part = self.config.refresh_rate.recip().fract(); + if frac_part.abs() > 1e-3 && inverse_frac_part.abs() > 1e-3 { + self.simple_loop(); + } + else if frac_part.abs() <= 1e-3 { + self.synchronized_loop(1); + } + else { + self.synchronized_loop(self.config.refresh_rate.recip().trunc().abs() as u32); } } } |
