diff options
Diffstat (limited to 'radharc.c')
-rw-r--r-- | radharc.c | 38 |
1 files changed, 36 insertions, 2 deletions
@@ -1,5 +1,6 @@ /* See LICENSE file for copyright and license details. */ #include "cg-base.h" +#include "libradharc.h" #include <sys/socket.h> #include <sys/timerfd.h> @@ -20,6 +21,20 @@ /** + * Possible states of the program + */ +enum state { + INITIALISING, + INITIAL_FADE_IN, + TERMINAL_FADE_OUT, + ENABLE_FADE_IN, + DISABLE_FADE_OUT, + ENABLED_NORMAL, + DISABLED +}; + + +/** * The default filter priority for the program */ const int64_t default_priority = (int64_t)7 << 61; @@ -133,6 +148,11 @@ static const char *sockname = NULL; */ static int no_temperature_change = 0; +/** + * The state the program is in + */ +static enum state current_state = INITIALISING; + /** * If 0, SIGINT has not been received, @@ -694,12 +714,15 @@ read_socket(int sock) { char buffer[64]; ssize_t r; + struct sockaddr_un addr; + socklen_t addrlen; if (sock < 0) return; for (;;) { - r = recv(sock, buffer, sizeof(buffer), MSG_DONTWAIT | MSG_TRUNC); + addrlen = SOCKLEN(addr); + r = recvfrom(sock, buffer, sizeof(buffer), MSG_DONTWAIT | MSG_TRUNC, &addr, &addrlen); if (r < 0) { if (errno == EAGAIN) break; @@ -710,11 +733,17 @@ read_socket(int sock) } if (!r || (size_t)r > sizeof(buffer)) { - fprintf(stderr, "%s: invalid length of received message: %zi\n", argv0, r); + if (addrlen) { + /* TODO send LIBRADHARC_RESPONSE_INVALID_REQUEST */ + } continue; } /* TODO parse message */ + + if (addrlen) { + /* TODO send response */ + } } } @@ -877,11 +906,13 @@ fade_in: fade_cs = (size_t)fade_in_cs; if (initial_fade_in) { + current_state = INITIAL_FADE_IN; initial_fade_in = 0; if ((r = get_temperature(&target_temperature)) < 0) return r; } else { fade_in_have_timer: + current_state = ENABLE_FADE_IN; original_temperature = 6500; } for (i = 0; i < fade_cs;) { @@ -923,6 +954,7 @@ skip_fade_in: faded_in: + current_state = ENABLED_NORMAL; for (;;) { read_socket(sock); if (sigint_received) { @@ -975,6 +1007,7 @@ fade_out: fade_cs = (size_t)fade_out_cs; fade_out_have_timer: + current_state = (sigint_received || sighup_received) ? TERMINAL_FADE_OUT : DISABLE_FADE_OUT; original_temperature = current_temperature; for (i = 0; i < fade_cs;) { read_socket(sock); @@ -1010,6 +1043,7 @@ skip_fade_out: faded_out: + current_state = DISABLED; for (i = 0; i < filters_n; i++) crtc_updates[i].filter.lifespan = LIBCOOPGAMMA_REMOVE; if ((r = set_ramps(red, green, blue)) < 0) |