Make a short transition back to 6500K on program exit.

This commit is contained in:
Jon Lund Steffensen
2010-01-01 21:00:08 +01:00
parent 4560aae206
commit 0c8cb0e28c
+76 -17
View File
@@ -32,6 +32,11 @@
#include "solar.h"
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#if !(defined(ENABLE_RANDR) || defined(ENABLE_VIDMODE))
# error "At least one of RANDR or VidMode must be enabled."
#endif
@@ -199,7 +204,7 @@ main(int argc, char *argv[])
float gamma[3] = { DEFAULT_GAMMA, DEFAULT_GAMMA, DEFAULT_GAMMA };
int use_randr = -1;
int screen_num = -1;
int init_trans = 1;
int transition = 1;
int one_shot = 0;
int verbose = 0;
char *s;
@@ -273,7 +278,7 @@ main(int argc, char *argv[])
one_shot = 1;
break;
case 'r':
init_trans = 0;
transition = 0;
break;
case 's':
screen_num = atoi(optarg);
@@ -419,17 +424,15 @@ main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
} else {
/* Make a 10 second initial transition */
struct timespec short_trans_end;
r = clock_gettime(CLOCK_REALTIME, &short_trans_end);
if (r < 0) {
perror("clock_gettime");
gamma_state_free(&state, use_randr);
exit(EXIT_FAILURE);
}
int short_trans = 0;
/* Make an initial transition from 6500K */
int short_trans_create = 1;
int short_trans_begin = 1;
int short_trans_len = 10;
short_trans_end.tv_sec += short_trans_len;
float adjustment_alpha = 0.0;
/* Install signal handler for SIGINT */
struct sigaction sigact;
@@ -442,8 +445,28 @@ main(int argc, char *argv[])
sigaction(SIGINT, &sigact, NULL);
/* Continously adjust color temperature */
while (!exiting) {
/* Current angular elevation of the sun */
int done = 0;
while (1) {
/* Check to see if exit signal was caught */
if (exiting) {
if (done) {
/* On second signal stop the
ongoing transition */
short_trans = 0;
}
/* Make a short transition back to
6500K */
short_trans_create = 1;
short_trans_begin = 0;
short_trans_len = 2;
adjustment_alpha = 1.0;
exiting = 0;
done = 1;
}
/* Read timestamp */
struct timespec now;
r = clock_gettime(CLOCK_REALTIME, &now);
if (r < 0) {
@@ -452,24 +475,57 @@ main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
/* Set up a new transition */
if (transition && short_trans_create) {
memcpy(&short_trans_end, &now,
sizeof(struct timespec));
short_trans_end.tv_sec += short_trans_len;
short_trans = 1;
short_trans_create = 0;
}
/* Current angular elevation of the sun */
double elevation = solar_elevation(now, lat, lon);
/* Use elevation of sun to set color temperature */
int temp = calculate_temp(elevation, temp_day,
temp_night, verbose);
if (init_trans) {
/* Ongoing short transition */
if (short_trans) {
double start = now.tv_sec +
now.tv_nsec / 1000000000.0;
double end = short_trans_end.tv_sec +
short_trans_end.tv_nsec /
1000000000.0;
double alpha = (end - start) /
if (start > end) {
/* Transisiton done */
short_trans = 0;
}
/* Calculate alpha */
adjustment_alpha = (end - start) /
(float)short_trans_len;
if (alpha < 0) init_trans = 0; /* Done */
else temp = alpha*6500 + (1.0-alpha)*temp;
if (!short_trans_begin) {
adjustment_alpha =
1.0 - adjustment_alpha;
}
/* Clamp alpha value */
adjustment_alpha =
MAX(0.0, MIN(adjustment_alpha, 1.0));
}
/* Interpolate between 6500K and calculated
temperature */
temp = adjustment_alpha*6500 +
(1.0-adjustment_alpha)*temp;
/* Quit loop when done */
if (done && !short_trans) break;
if (verbose) {
printf("Temperature: %iK\n", temp);
}
@@ -484,13 +540,16 @@ main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
if (init_trans) usleep(100000);
/* Sleep for a while */
if (short_trans) usleep(100000);
else usleep(5000000);
}
/* Restore saved gamma ramps */
gamma_state_restore(&state, use_randr);
}
/* Clean up gamma adjustment state */
gamma_state_free(&state, use_randr);
return EXIT_SUCCESS;