feedbackd: Support visual feedback via LEDs

Currently all LED feedbacks are infinite we can improve that
later on by using the 'repeat' attribute of the LED pattern
trigger.
This commit is contained in:
Guido Günther
2020-07-05 19:25:44 +00:00
committed by Sebastian Krzyszkowiak
parent 2f083ea5ae
commit a5b4f99412
12 changed files with 623 additions and 0 deletions
+86
View File
@@ -0,0 +1,86 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*
*/
#define G_LOG_DOMAIN "fbd-udev"
#include "fbd-udev.h"
#include <gio/gio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
gboolean
fbd_udev_set_sysfs_path_attr_as_string (GUdevDevice *dev, const gchar *attr,
const gchar *s, GError **err)
{
gint fd;
int len;
g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
attr, NULL);
fd = open (path, O_WRONLY|O_TRUNC, 0666);
if (fd < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
path, strerror (errno));
return FALSE;
}
len = strlen (s);
if (write (fd, s, len) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s to %s: %s",
s, path, strerror (errno));
close (fd);
return FALSE;
}
if (close (fd) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
path, strerror (errno));
return FALSE;
}
return TRUE;
}
gboolean
fbd_udev_set_sysfs_path_attr_as_int (GUdevDevice *dev, const gchar *attr,
gint val, GError **err)
{
gint fd;
int len;
g_autofree gchar *s = NULL;
g_autofree gchar *path = g_strjoin ("/", g_udev_device_get_sysfs_path (dev),
attr, NULL);
fd = open (path, O_WRONLY|O_TRUNC, 0666);
if (fd < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to open %s: %s",
path, strerror (errno));
return FALSE;
}
s = g_strdup_printf ("%d", val);
len = strlen (s);
if (write (fd, s, len) < len) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to write %s: %s",
path, strerror (errno));
close (fd);
return FALSE;
}
if (close (fd) < 0) {
g_set_error (err, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to close %s: %s",
path, strerror (errno));
return FALSE;
}
return TRUE;
}