diff options
| author | Amir Saeid <amir@glgdgt.com> | 2020-03-15 19:44:35 +0000 |
|---|---|---|
| committer | Amir Saeid <amir@glgdgt.com> | 2020-03-15 19:44:35 +0000 |
| commit | 822e7e4b523de92eb27fe2958ec7e2bd06b3bc07 (patch) | |
| tree | a41775332584dfa4669cb586f75c1b7c8f35b3c6 | |
Initial commit
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Cargo.lock | 116 | ||||
| -rw-r--r-- | Cargo.toml | 15 | ||||
| -rw-r--r-- | src/bin/main.rs | 78 | ||||
| -rw-r--r-- | src/lib.rs | 120 |
5 files changed, 330 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..15cd5c0 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,116 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", + "time", +] + +[[package]] +name = "libc" +version = "0.2.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "pkg-config" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" + +[[package]] +name = "redox_syscall" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" + +[[package]] +name = "sctd" +version = "0.1.0" +dependencies = [ + "chrono", + "spa", + "x11", +] + +[[package]] +name = "spa" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2cb0b73b1ea9c2b5bbb17576ff522c9a956b414e820e91e04fd86b32769e68a" +dependencies = [ + "chrono", +] + +[[package]] +name = "time" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +dependencies = [ + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "x11" +version = "2.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773" +dependencies = [ + "libc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..055639b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "sctd" +version = "0.1.0" +authors = ["Amir Saeid <amir@glgdgt.com>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = "0.4.11" +spa = "0.2.0" + +[dependencies.x11] +version = "2.18.2" +features = ["xlib", "xrandr"] diff --git a/src/bin/main.rs b/src/bin/main.rs new file mode 100644 index 0000000..7e69ae1 --- /dev/null +++ b/src/bin/main.rs @@ -0,0 +1,78 @@ +extern crate chrono; +extern crate spa; + +use chrono::prelude::*; +use spa::{SunriseAndSet, calc_sunrise_and_set}; +use std::os::raw::{c_ushort, c_void}; +use std::ptr; +use std::thread; +use std::time::Duration; +use x11::xlib::{XDefaultScreen, XFree, XOpenDisplay, XRootWindow}; +use x11::xrandr::{ + XRRAllocGamma, XRRCrtcGamma, XRRGetCrtcGammaSize, XRRGetScreenResourcesCurrent, XRRSetCrtcGamma, +}; + +fn set_temp(temp: u32) { + let ratio: f64 = (temp % 500) as f64 / 500f64; + unsafe { + let display = XOpenDisplay(ptr::null_mut()); + let screen = XDefaultScreen(display); + let root = XRootWindow(display, screen); + let resource = XRRGetScreenResourcesCurrent(display, root); + + for x in 0..(*resource).ncrtc { + let crtcxid = (*resource).crtcs.offset(x as isize); + let size = XRRGetCrtcGammaSize(display, *crtcxid); + let crtc_gamma: *mut XRRCrtcGamma = XRRAllocGamma(size); + let gamma = sctd::avg(temp, ratio); + + for i in 0..size { + let g = (65535f64 * i as f64) / size as f64; + *((*crtc_gamma).red as *mut c_ushort).offset(i as isize) = (g * gamma.red) as u16; + *((*crtc_gamma).green as *mut c_ushort).offset(i as isize) = + (g * gamma.green) as u16; + *((*crtc_gamma).blue as *mut c_ushort).offset(i as isize) = (g * gamma.blue) as u16; + } + XRRSetCrtcGamma(display, *crtcxid, crtc_gamma); + XFree(crtc_gamma as *mut c_void); + } + } +} + +fn get_temp(utc: DateTime<Utc>, ss: &SunriseAndSet) -> u32 { + let low_temp = 2500; + let high_temp = 5500; + + match *ss { + SunriseAndSet::Daylight(sunrise, sunset) => { + let since_sunrise = utc.signed_duration_since(sunrise); + let since_sunset = utc.signed_duration_since(sunset); + + // this is where gradual increase/decrease should happen + if since_sunrise.num_seconds() < 0 { + return low_temp; + } else if since_sunset.num_seconds() < 0 { + return high_temp; + } else { + return low_temp; + } + }, + SunriseAndSet::PolarDay => return high_temp, + SunriseAndSet::PolarNight => return low_temp, + } +} + +fn main() { + // Dublin + let lat: f64 = 53.3498; + let lon: f64 = 6.2603; + + loop { + let utc: DateTime<Utc> = Utc::now(); + match calc_sunrise_and_set(utc, lat, lon) { + Ok(ss) => set_temp(get_temp(utc, &ss)), + Err(e) => println!("Error calculating sunrise and sunset: {:?}", e), + } + thread::sleep(Duration::from_secs(300)); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..d3af757 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,120 @@ +#[derive(Debug)] +pub struct WhitePoint { + pub red: f64, + pub green: f64, + pub blue: f64, +} + +pub fn avg(temp: u32, ratio: f64) -> WhitePoint { + const WPS: [WhitePoint; 20] = [ + WhitePoint { + red: 1.00000000, + green: 0.18172716, + blue: 0.00000000, + }, + WhitePoint { + red: 1.00000000, + green: 0.42322816, + blue: 0.00000000, + }, + WhitePoint { + red: 1.00000000, + green: 0.54360078, + blue: 0.08679949, + }, + WhitePoint { + red: 1.00000000, + green: 0.64373109, + blue: 0.28819679, + }, + WhitePoint { + red: 1.00000000, + green: 0.71976951, + blue: 0.42860152, + }, + WhitePoint { + red: 1.00000000, + green: 0.77987699, + blue: 0.54642268, + }, + WhitePoint { + red: 1.00000000, + green: 0.82854786, + blue: 0.64816570, + }, + WhitePoint { + red: 1.00000000, + green: 0.86860704, + blue: 0.73688797, + }, + WhitePoint { + red: 1.00000000, + green: 0.90198230, + blue: 0.81465502, + }, + WhitePoint { + red: 1.00000000, + green: 0.93853986, + blue: 0.88130458, + }, + WhitePoint { + red: 1.00000000, + green: 0.97107439, + blue: 0.94305985, + }, + WhitePoint { + red: 1.00000000, + green: 1.00000000, + blue: 1.00000000, + }, + WhitePoint { + red: 0.95160805, + green: 0.96983355, + blue: 1.00000000, + }, + WhitePoint { + red: 0.91194747, + green: 0.94470005, + blue: 1.00000000, + }, + WhitePoint { + red: 0.87906581, + green: 0.92357340, + blue: 1.00000000, + }, + WhitePoint { + red: 0.85139976, + green: 0.90559011, + blue: 1.00000000, + }, + WhitePoint { + red: 0.82782969, + green: 0.89011714, + blue: 1.00000000, + }, + WhitePoint { + red: 0.80753191, + green: 0.87667891, + blue: 1.00000000, + }, + WhitePoint { + red: 0.78988728, + green: 0.86491137, + blue: 1.00000000, + }, + WhitePoint { + red: 0.77442176, + green: 0.85453121, + blue: 1.00000000, + }, + ]; + + WhitePoint { + red: WPS[(temp / 500) as usize].red * (1f64 - ratio) + + WPS[(temp / 500 + 1) as usize].red * ratio, + green: WPS[(temp / 500) as usize].green * (1f64 - ratio) + + WPS[(temp / 500 + 1) as usize].green * ratio, + blue: WPS[(temp / 500) as usize].blue * (1f64 - ratio) + + WPS[(temp / 500 + 1) as usize].blue * ratio, + } +} |
