aboutsummaryrefslogtreecommitdiffstats
path: root/radharc.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-02-06 20:08:50 +0100
committerMattias Andrée <m@maandree.se>2025-02-06 20:08:50 +0100
commit42a2a579628d4aa8153775cdcd894b8b5c80e7da (patch)
tree992dd3b057a7a18d2258b131c83ff56fd84587a8 /radharc.c
parentm (diff)
downloadradharc-42a2a579628d4aa8153775cdcd894b8b5c80e7da.tar.gz
radharc-42a2a579628d4aa8153775cdcd894b8b5c80e7da.tar.bz2
radharc-42a2a579628d4aa8153775cdcd894b8b5c80e7da.tar.xz
m + libradharc for client-side protocol implementation
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
-rw-r--r--radharc.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/radharc.c b/radharc.c
index e48dc6f..08ccc2f 100644
--- a/radharc.c
+++ b/radharc.c
@@ -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)