aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs55
1 files changed, 18 insertions, 37 deletions
diff --git a/src/lib.rs b/src/lib.rs
index dfe872a..05f8d9e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,14 +3,16 @@ extern crate log;
extern crate spa;
+mod platform;
+
use chrono::prelude::*;
-use spa::{calc_solar_position, SunriseAndSet};
-use std::os::raw::{c_ushort, c_void};
-use std::ptr;
-use x11::xlib::{XCloseDisplay, XDefaultScreen, XFree, XOpenDisplay, XRootWindow};
-use x11::xrandr::{
- XRRAllocGamma, XRRCrtcGamma, XRRGetCrtcGammaSize, XRRGetScreenResourcesCurrent, XRRSetCrtcGamma,
-};
+use spa::{solar_position, StdFloatOps, SunriseAndSet};
+
+#[cfg(target_os = "linux")]
+use platform::linux as os;
+
+#[cfg(target_os = "macos")]
+use platform::macos as os;
const LOW_TEMP: f64 = 3500f64;
const HIGH_TEMP: f64 = 5500f64;
@@ -26,52 +28,31 @@ pub struct WhitePoint {
}
pub 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 = 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);
- }
- XCloseDisplay(display);
- }
+ os::set_temp(temp);
}
pub fn reset_temp() {
- set_temp(HIGH_TEMP as u32);
+ os::set_temp(HIGH_TEMP as u32);
}
fn get_transition_progress_from_elevation(elevation: f64) -> f64 {
if elevation < TRANSITION_LOW {
- return 0.0;
+ 0.0
} else if elevation < TRANSITION_HIGH {
(TRANSITION_LOW - elevation) / (TRANSITION_LOW - TRANSITION_HIGH)
} else {
- return 1.0;
+ 1.0
}
}
pub fn get_temp(utc: DateTime<Utc>, ss: &SunriseAndSet, lat: f64, lon: f64) -> f64 {
match *ss {
SunriseAndSet::Daylight(_, _) => {
- let elevation = 90f64 - calc_solar_position(utc, lat, lon).unwrap().zenith_angle;
- debug!("elevation: {}", elevation);
+ let elevation = 90f64
+ - solar_position::<StdFloatOps>(utc, lat, lon)
+ .unwrap()
+ .zenith_angle;
+ debug!("elevation: {elevation}");
let progress = get_transition_progress_from_elevation(elevation);
LOW_TEMP + (progress * (HIGH_TEMP - LOW_TEMP))
}