diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2009-11-04 20:18:31 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2009-11-04 20:18:31 +0100 |
commit | 4818f331cedeba94bb769fb15fd972dc759fd31f (patch) | |
tree | a42f22851e0d0df649a324043fec5b936e3b9d8b /redshift.c | |
download | redshift-ng-4818f331cedeba94bb769fb15fd972dc759fd31f.tar.gz redshift-ng-4818f331cedeba94bb769fb15fd972dc759fd31f.tar.bz2 redshift-ng-4818f331cedeba94bb769fb15fd972dc759fd31f.tar.xz |
Initial import.
Diffstat (limited to 'redshift.c')
-rw-r--r-- | redshift.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/redshift.c b/redshift.c new file mode 100644 index 0000000..ef71609 --- /dev/null +++ b/redshift.c @@ -0,0 +1,123 @@ +/* redshift.c */ +/* Copyright (c) 2009, Jon Lund Steffensen <jonlst@gmail.com> */ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <locale.h> + +#include "solar.h" +#include "colortemp.h" + +#define MIN_LAT -90.0 +#define MAX_LAT 90.0 +#define MIN_LON -180.0 +#define MAX_LON 180.0 +#define MIN_TEMP 1000 +#define MAX_TEMP 10000 + + +#define USAGE \ + "Usage: %s LAT LON DAY-TEMP NIGHT-TEMP [GAMMA]\n" + +#define DEG_CHAR 0xb0 + + +static void +printtime(time_t time) +{ + char s[64]; + strftime(s, 64, "%a, %d %b %Y %H:%M:%S %z", localtime(&time)); + printf("%s\n", s); +} + +int +main(int argc, char *argv[]) +{ + /* Check extensions needed for color temperature adjustment. */ + int r = colortemp_check_extension(); + if (r < 0) { + fprintf(stderr, "Unable to set color temperature.\n"); + exit(EXIT_FAILURE); + } + + /* Init locale for special symbols */ + char *loc = setlocale(LC_CTYPE, ""); + if (loc == NULL) { + fprintf(stderr, "Unable to set locale.\n"); + exit(EXIT_FAILURE); + } + + /* Load arguments */ + if (argc < 5) { + printf(USAGE, argv[0]); + exit(EXIT_FAILURE); + } + + /* Latitude */ + float lat = atof(argv[1]); + if (lat < MIN_LAT || lat > MAX_LAT) { + fprintf(stderr, + "Latitude must be between %.1f%lc and %.1f%lc\n", + MIN_LAT, DEG_CHAR, MAX_LAT, DEG_CHAR); + exit(EXIT_FAILURE); + } + + /* Longitude */ + float lon = atof(argv[2]); + if (lon < MIN_LON || lon > MAX_LON) { + fprintf(stderr, + "Longitude must be between %.1f%lc and %.1f%lc\n", + MIN_LON, DEG_CHAR, MAX_LON, DEG_CHAR); + exit(EXIT_FAILURE); + } + + /* Color temperature at daytime */ + int temp_day = atoi(argv[3]); + if (temp_day < MIN_TEMP || temp_day >= MAX_TEMP) { + fprintf(stderr, "Temperature must be between %uK and %uK\n", + MIN_TEMP, MAX_TEMP); + exit(EXIT_FAILURE); + } + + /* Color temperature at night */ + int temp_night = atoi(argv[4]); + if (temp_night < MIN_TEMP || temp_night >= MAX_TEMP) { + fprintf(stderr, "Temperature must be between %uK and %uK\n", + MIN_TEMP, MAX_TEMP); + exit(EXIT_FAILURE); + } + + /* Gamma value */ + float gamma = 1.0; + if (argc > 5) gamma = atof(argv[5]); + + /* Current angular elevation of the sun */ + time_t now = time(NULL); + double elevation = solar_elevation(now, lat, lon); + printf("Solar elevation is %f\n", elevation); + + /* Use elevation of sun to set color temperature */ + int temp = 0; + if (elevation < SOLAR_CIVIL_TWILIGHT_ELEV) { + temp = temp_night; + printf("Set color temperature to %uK\n", temp_night); + } else if (elevation < SOLAR_DAYTIME_ELEV) { + float a = (SOLAR_DAYTIME_ELEV - elevation) / + (SOLAR_DAYTIME_ELEV - SOLAR_CIVIL_TWILIGHT_ELEV); + temp = (1.0-a)*temp_day + a*temp_night; + printf("Interpolated (%f) temperature is %uK\n", a, temp); + } else { + temp = temp_day; + printf("Set color temperature to %uK\n", temp_day); + } + + /* Set color temperature */ + r = colortemp_set_temperature(temp, gamma); + if (r < 0) { + fprintf(stderr, "Unable to set color temperature.\n"); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} |