diff options
author | Jon Lund Steffensen <jonlst@gmail.com> | 2009-11-04 21:43:10 +0100 |
---|---|---|
committer | Jon Lund Steffensen <jonlst@gmail.com> | 2009-11-04 21:43:10 +0100 |
commit | 060642e637d92f342fcfc6adaabbce9408263e4e (patch) | |
tree | 45e7026ec35c07f22446b531306c119de5f9d016 /redshift.c | |
parent | Use getopt() to parse arguments. (diff) | |
download | redshift-ng-060642e637d92f342fcfc6adaabbce9408263e4e.tar.gz redshift-ng-060642e637d92f342fcfc6adaabbce9408263e4e.tar.bz2 redshift-ng-060642e637d92f342fcfc6adaabbce9408263e4e.tar.xz |
Have color temperature transition period be DEFINEd at the top.
Print current period (day, night, transition) when verbose.
Call setlocale() with LC_CTYPE instead of LC_ALL otherwise parameter parsing
is locale dependant which is confusing.
Diffstat (limited to 'redshift.c')
-rw-r--r-- | redshift.c | 50 |
1 files changed, 38 insertions, 12 deletions
@@ -12,15 +12,27 @@ #include "solar.h" #include "colortemp.h" + +/* Bounds for parameters. */ #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 MIN_GAMMA 0.1 +#define MAX_GAMMA 10.0 +/* Default values for parameters. */ #define DEFAULT_DAY_TEMP 5500 #define DEFAULT_NIGHT_TEMP 3700 +#define DEFAULT_GAMMA 1.0 + +/* Angular elevation of the sun at which the color temperature + transition period starts and ends. */ +#define TRANSITION_LOW SOLAR_CIVIL_TWILIGHT_ELEV +#define TRANSITION_HIGH 6.0 + #define USAGE \ "Usage: %s -l LAT:LON -t DAY:NIGHT [OPTIONS...]\n" @@ -33,6 +45,7 @@ " -t DAY:NIGHT\tColor temperature to set at night/day\n" \ " -v\t\tVerbose output\n" +/* DEGREE SIGN is Unicode U+00b0 */ #define DEG_CHAR 0xb0 @@ -47,21 +60,22 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); } - /* Init locale for special (degree) symbol */ - char *loc = setlocale(LC_ALL, ""); + /* Init locale for degree symbol. */ + char *loc = setlocale(LC_CTYPE, ""); if (loc == NULL) { fprintf(stderr, "Unable to set locale.\n"); exit(EXIT_FAILURE); } + /* Parse arguments. */ float lat = NAN; float lon = NAN; int temp_day = DEFAULT_DAY_TEMP; int temp_night = DEFAULT_NIGHT_TEMP; - float gamma = 1.0; + float gamma = DEFAULT_GAMMA; int verbose = 0; char *s; - + int opt; while ((opt = getopt(argc, argv, "g:hl:t:v")) != -1) { switch (opt) { @@ -143,29 +157,41 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); } + /* Gamma */ + if (gamma < MIN_GAMMA || gamma > MAX_GAMMA) { + fprintf(stderr, "Gamma value must be between %.1f and %.1f.\n", + MIN_GAMMA, MAX_GAMMA); + exit(EXIT_FAILURE); + } + /* Current angular elevation of the sun */ time_t now = time(NULL); double elevation = solar_elevation(now, lat, lon); if (verbose) { - printf("Solar elevation is %f%lc.\n", elevation, DEG_CHAR); + printf("Solar elevation: %f%lc\n", elevation, DEG_CHAR); } /* Use elevation of sun to set color temperature */ int temp = 0; - if (elevation < SOLAR_CIVIL_TWILIGHT_ELEV) { + if (elevation < TRANSITION_LOW) { temp = temp_night; - } else if (elevation < SOLAR_DAYTIME_ELEV) { - /* Interpolate */ - float a = (SOLAR_DAYTIME_ELEV - elevation) / - (SOLAR_DAYTIME_ELEV - SOLAR_CIVIL_TWILIGHT_ELEV); - temp = (1.0-a)*temp_day + a*temp_night; + if (verbose) printf("Period: Night\n"); + } else if (elevation < TRANSITION_HIGH) { + /* Transition period: interpolate */ + float a = (TRANSITION_LOW - elevation) / + (TRANSITION_LOW - TRANSITION_HIGH); + temp = (1.0-a)*temp_night + a*temp_day; + if (verbose) { + printf("Period: Transition (%.2f%% day)\n", a*100); + } } else { temp = temp_day; + if (verbose) printf("Period: Daytime\n"); } if (verbose) { - printf("Set color temperature to %uK.\n", temp_day); + printf("Color temperature: %uK\n", temp); } /* Set color temperature */ |