18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * uledmon.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * This program creates a new userspace LED class device and monitors it. A
68c2ecf20Sopenharmony_ci * timestamp and brightness value is printed each time the brightness changes.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Usage: uledmon <device-name>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * <device-name> is the name of the LED class device to be created. Pressing
118c2ecf20Sopenharmony_ci * CTRL+C will exit.
128c2ecf20Sopenharmony_ci */
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <fcntl.h>
158c2ecf20Sopenharmony_ci#include <stdio.h>
168c2ecf20Sopenharmony_ci#include <string.h>
178c2ecf20Sopenharmony_ci#include <time.h>
188c2ecf20Sopenharmony_ci#include <unistd.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include <linux/uleds.h>
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciint main(int argc, char const *argv[])
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	struct uleds_user_dev uleds_dev;
258c2ecf20Sopenharmony_ci	int fd, ret;
268c2ecf20Sopenharmony_ci	int brightness;
278c2ecf20Sopenharmony_ci	struct timespec ts;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	if (argc != 2) {
308c2ecf20Sopenharmony_ci		fprintf(stderr, "Requires <device-name> argument\n");
318c2ecf20Sopenharmony_ci		return 1;
328c2ecf20Sopenharmony_ci	}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	strncpy(uleds_dev.name, argv[1], LED_MAX_NAME_SIZE);
358c2ecf20Sopenharmony_ci	uleds_dev.max_brightness = 100;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	fd = open("/dev/uleds", O_RDWR);
388c2ecf20Sopenharmony_ci	if (fd == -1) {
398c2ecf20Sopenharmony_ci		perror("Failed to open /dev/uleds");
408c2ecf20Sopenharmony_ci		return 1;
418c2ecf20Sopenharmony_ci	}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	ret = write(fd, &uleds_dev, sizeof(uleds_dev));
448c2ecf20Sopenharmony_ci	if (ret == -1) {
458c2ecf20Sopenharmony_ci		perror("Failed to write to /dev/uleds");
468c2ecf20Sopenharmony_ci		close(fd);
478c2ecf20Sopenharmony_ci		return 1;
488c2ecf20Sopenharmony_ci	}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	while (1) {
518c2ecf20Sopenharmony_ci		ret = read(fd, &brightness, sizeof(brightness));
528c2ecf20Sopenharmony_ci		if (ret == -1) {
538c2ecf20Sopenharmony_ci			perror("Failed to read from /dev/uleds");
548c2ecf20Sopenharmony_ci			close(fd);
558c2ecf20Sopenharmony_ci			return 1;
568c2ecf20Sopenharmony_ci		}
578c2ecf20Sopenharmony_ci		clock_gettime(CLOCK_MONOTONIC, &ts);
588c2ecf20Sopenharmony_ci		printf("[%ld.%09ld] %u\n", ts.tv_sec, ts.tv_nsec, brightness);
598c2ecf20Sopenharmony_ci	}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	close(fd);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	return 0;
648c2ecf20Sopenharmony_ci}
65