Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753760AbcKHLiH (ORCPT ); Tue, 8 Nov 2016 06:38:07 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:33486 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753284AbcKHLgx (ORCPT ); Tue, 8 Nov 2016 06:36:53 -0500 X-AuditID: cbfee61b-f796f6d000004092-a4-5821b8d29145 From: Jacek Anaszewski To: linux-leds@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jacek Anaszewski , Hans de Goede Subject: [PATCH/RFC v2] tools/leds: Add led_notify_mon program for monitoring brightness changes Date: Tue, 08 Nov 2016 12:36:34 +0100 Message-id: <1478604994-29854-1-git-send-email-j.anaszewski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrFLMWRmVeSWpSXmKPExsVy+t9jQd1LOxQjDI58ULZ4c3w6k0Xv1eeM Fpd3zWGz2PpmHaMDi8f7fVfZPPq2rGL0+LxJLoA5ys0mIzUxJbVIITUvOT8lMy/dVik0xE3X QkkhLzE31VYpQtc3JEhJoSwxpxTIMzJAAw7OAe7BSvp2CW4Zi85uZCrYK17x9tY1pgbGO0Jd jJwcEgImErNndzND2GISF+6tZwOxhQRmMUo86i7sYuQCsn8ySuyddpUdJMEmYCjx88Vrpi5G Dg4RATmJnWcqQcLMAiUS358sYgKxhQWSJDbfXgdmswioSmxctocFxOYV8JCYNuE5K8QuOYmT xyazTmDkXsDIsIpRIrUguaA4KT3XKC+1XK84Mbe4NC9dLzk/dxMjONyeSe9gPLzL/RCjAAej Eg+vw12FCCHWxLLiytxDjBIczEoivLnbFSOEeFMSK6tSi/Lji0pzUosPMZoCHTCRWUo0OR8Y C3kl8YYm5ibmxgYW5paWJkZK4ryNs5+FCwmkJ5akZqemFqQWwfQxcXBKNTCKnVjhJTtd6lXw lfvbN0SfnX//QFjkvaLSXc4z7mxXz+UVsft8LK886DHj8jdf761R9GsPdmAKlmJmyL+fnLDy 3uIDXlE+yh1vRLovMf0xCbnxfP+aZTYzTaJsuzZ+iUlq19k6yeFBXf6TZItTjR/vPeLZtu83 376eq6ulp67XC3tqs1+hbeoWJZbijERDLeai4kQAp1UnxE0CAAA= X-MTR: 20000000000000000@CPGS Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2880 Lines: 123 LED subsystem supports POLLPRI on "brightness" sysfs file of LED class devices. This tool demonstrates how to use the feature. Signed-off-by: Jacek Anaszewski Cc: Hans de Goede --- Changes since v1: - added lseek which fixes non-blocking poll() behaviour tools/leds/Makefile | 4 +-- tools/leds/led_notify_mon.c | 83 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 tools/leds/led_notify_mon.c diff --git a/tools/leds/Makefile b/tools/leds/Makefile index c03a79e..0fa948a 100644 --- a/tools/leds/Makefile +++ b/tools/leds/Makefile @@ -3,11 +3,11 @@ CC = $(CROSS_COMPILE)gcc CFLAGS = -Wall -Wextra -g -I../../include/uapi -all: uledmon +all: uledmon led_notify_mon %: %.c $(CC) $(CFLAGS) -o $@ $^ clean: - $(RM) uledmon + $(RM) uledmon led_notify_mon .PHONY: all clean diff --git a/tools/leds/led_notify_mon.c b/tools/leds/led_notify_mon.c new file mode 100644 index 0000000..8b6e6f9 --- /dev/null +++ b/tools/leds/led_notify_mon.c @@ -0,0 +1,83 @@ +/* + * led_notify_mon.c + * + * This program monitors LED brightness change notifications, + * either having its origin in the hardware or in the software. + * A timestamp and brightness value is printed each time the brightness changes. + * + * Usage: led_notify_mon + * + * is the name of the LED class device to be monitored. Pressing + * CTRL+C will exit. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +int main(int argc, char const *argv[]) +{ + int fd, ret; + char brightness_file_path[LEDS_MAX_NAME_SIZE + 11]; + struct pollfd pollfd; + struct timespec ts; + char buf[11]; + + if (argc != 2) { + fprintf(stderr, "Requires argument\n"); + return 1; + } + + snprintf(brightness_file_path, LEDS_MAX_NAME_SIZE, + "/sys/class/leds/%s/brightness", argv[1]); + + fd = open(brightness_file_path, O_RDONLY); + if (fd == -1) { + printf("Failed to open %s file\n", brightness_file_path); + return 1; + } + + ret = read(fd, buf, sizeof(buf)); + if (ret < 0) { + printf("Failed to read %s file\n", brightness_file_path); + goto err_read; + } + + pollfd.fd = fd; + pollfd.events = POLLPRI; + + while (1) { + ret = poll(&pollfd, 1, -1); + if (ret == -1) { + printf("Failed to poll %s file (%d)\n", + brightness_file_path, ret); + ret = 1; + break; + } + + clock_gettime(CLOCK_MONOTONIC, &ts); + + ret = read(fd, buf, sizeof(buf)); + if (ret < 0) + break; + + ret = lseek(pollfd.fd, 0, SEEK_SET); + if (ret < 0) { + printf("lseek failed (%d)\n", ret); + break; + } + + printf("[%ld.%09ld] %d\n", ts.tv_sec, ts.tv_nsec, atoi(buf)); + } + +err_read: + close(fd); + + return ret; +} -- 1.9.1