On 08/05/2014 23:23, Matthew Fatheree wrote: > From 74c7dc364c89a470a63e0ce8efa70ca3e3f36e0c Mon Sep 17 00:00:00 > 2001 From: Matthew Fatheree <matthew.fathe...@belkin.com> Date: > Sun, 4 May 2014 20:53:54 +0700 Subject: [PATCH 24/30] mamba mvebu: > add led monitor package which support led activity when the > RESET/WPS button are pressed > > - Pressed RESET button 1..10s -> Blink Power LED 700ms - Pressed > RESET button > 10s -> Blink Power LED 500ms > > Signed-off-by: Matthew Fatheree <matthew.fathe...@belkin.com> ---
Hi, nack, this can be handled via hotplug scripts/handlers additionally the code uses pthread which is the wrong choice. use uloop instead please John > package/leds-monitor/Makefile | 43 +++ > package/leds-monitor/src/leds_monitor.c | 290 > ++++++++++++++++++++ > .../linksys-base-files/files/etc/init.d/mamba_apps | 9 + 3 files > changed, 342 insertions(+) create mode 100644 > package/leds-monitor/Makefile create mode 100644 > package/leds-monitor/src/leds_monitor.c create mode 100755 > package/linksys-base-files/files/etc/init.d/mamba_apps > > diff --git a/package/leds-monitor/Makefile > b/package/leds-monitor/Makefile new file mode 100644 index > 0000000..91792bb --- /dev/null +++ b/package/leds-monitor/Makefile > @@ -0,0 +1,43 @@ +# +# Copyright (C) 2011-2012 OpenWrt.org +# +# > This is free software, licensed under the GNU General Public > License v2. +# See /LICENSE for more information. +# + +include > $(TOPDIR)/rules.mk + +PKG_NAME:=leds-monitor +PKG_RELEASE:=2 + > +include $(INCLUDE_DIR)/package.mk + +define Package/leds-monitor + > SECTION:=utils + CATEGORY:=Utilities + TITLE:=Mamba board > utilities + MAINTAINER:=Belkin Inc. + DEPENDS:=+libpthread > +endef + +define Package/leds-monitor/description + This package > contains some small utility apps which use to monitor the + leds > events, status... +endef + +define Build/Prepare + > $(INSTALL_DIR) $(PKG_BUILD_DIR) + $(INSTALL_DATA) > ./src/leds_monitor.c $(PKG_BUILD_DIR)/ +endef + +define > Build/Compile + $(TARGET_CC) $(TARGET_CFLAGS) -Wall \ + > -o $(PKG_BUILD_DIR)/leds_monitor $(PKG_BUILD_DIR)/leds_monitor.c > -lpthread -v +endef + +define Package/leds-monitor/install + > $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) > $(PKG_BUILD_DIR)/leds_monitor $(1)/usr/sbin/ +endef + +$(eval > $(call BuildPackage,leds-monitor)) diff --git > a/package/leds-monitor/src/leds_monitor.c > b/package/leds-monitor/src/leds_monitor.c new file mode 100644 > index 0000000..f31203b --- /dev/null +++ > b/package/leds-monitor/src/leds_monitor.c @@ -0,0 +1,290 @@ +/* + * > Copyright 2014 Belkin Inc. + * + * Author: Belkin Inc. + * + * This > file is subject to the terms and conditions of version 2 of + * the > GNU General Public License. See the file COPYING in the main + * > directory of this archive for more details. + * + */ + +#define > _GNU_SOURCE /* for asprintf */ +#include <stdio.h> +#include > <stdint.h> + +#if HAVE_CONFIG_H +#include <config.h> +#endif + > +#include <linux/version.h> +#include <linux/input.h> + +#include > <string.h> +#include <fcntl.h> +#include <unistd.h> +#include > <stdio.h> +#include <stdlib.h> +#include <dirent.h> +#include > <errno.h> +#include <getopt.h> +#include <ctype.h> +#include > <pthread.h> + +#define DEV_INPUT_EVENT "/dev/input" +#define > EVENT_DEV_NAME "event" + +#ifndef EV_SYN +#define EV_SYN 0 +#endif > + +//#define DEBUG +#ifdef DEBUG +#define leds_dbg(fmt, arg...) > printf ("%s " fmt "\n", __func__ , ## arg) +#else +#define > leds_dbg(fmt, arg...) +#endif + +/* + * Variables + * */ +static > int key = 0; +static int is_start = 0; +static int is_power_blink = > 0, is_wps_blink = 0; +static pthread_t pid; + +/* + * + * */ > +static int is_event_device(const struct dirent *dir) { + > return strncmp(EVENT_DEV_NAME, dir->d_name, 5) == 0; +} + +static > char* scan_devices(void) +{ + struct dirent **namelist; + > int i, ndev, devnum; + char *filename; + + ndev = > scandir(DEV_INPUT_EVENT, &namelist, is_event_device, versionsort); > + if (ndev <= 0) + return NULL; + + > fprintf(stderr, "Available devices:\n"); + + for (i = 0; i < > ndev; i++) + { + char fname[64]; + > int fd = -1; + char name[256] = "???"; + + > snprintf(fname, sizeof(fname), + "%s/%s", > DEV_INPUT_EVENT, namelist[i]->d_name); + fd = > open(fname, O_RDONLY); + if (fd < 0) + > continue; + ioctl(fd, EVIOCGNAME(sizeof(name)), > name); + + fprintf(stderr, "%s: %s\n", fname, > name); + close(fd); + > free(namelist[i]); + } + + fprintf(stderr, "Select the > device event number [0-%d]: ", ndev - 1); + scanf("%d", > &devnum); + + if (devnum >= ndev || devnum < 0) + > return NULL; + + asprintf(&filename, "%s/%s%d", + > DEV_INPUT_EVENT, EVENT_DEV_NAME, + devnum); + + > return filename; +} + +static int usage(void) +{ + > printf("USAGE:\n"); + printf(" %s /dev/input/eventX\n", > program_invocation_short_name); + printf("\n"); + + > return EXIT_FAILURE; +} + +void *thread_handler_led(void *arg) +{ + > struct timeval start, end; + long mtime, secs, usecs; + + > while (1) { + if (key != 0) { + > if (is_start) { + is_start = 0; + > gettimeofday(&start, NULL); + if (key > == KEY_WPS_BUTTON) + > is_wps_blink = 0; + else if (key == > KEY_RESTART) + is_power_blink > = 0; + } + > gettimeofday(&end, NULL); + secs = > end.tv_sec - start.tv_sec; + usecs = > end.tv_usec - start.tv_usec; + mtime = > ((secs) * 1000 + usecs/1000.0) + 0.5; + mtime > = mtime / 1000; + + if (key == > KEY_WPS_BUTTON) { + if (mtime >= 2) > { + /* + > - Start slow blink WPS_WHITE, is_wps_blink = 1. + > 1. If successful pairing -> WPS_WHITE -> ON, is_wps_blink = 2 + > - Successuful pairing indicator timer expires -> IDLE state > is_wps_blink = 0 + OF > WPS_WHITE, WPS_AMBER. + 2. > Else if session overlap no response or other + > WPS-related error within walk time of 2min -> Begin blink > WPS_AMBER + is_wps_blink = 3 > + - Pairing failure blink > timer expires -> IDLE state is_wps_blink = 0 + > OFF WPS_WHITE, WPS_AMBER. + > NOTE: Successful/Failure pairing timer expires is 1 min (!!?????) + > */ + } + } + > else if (key == KEY_RESTART) { /* key RESET is pressed */ + > if (mtime >= 1 && is_power_blink == 0) { /* time >= 1s */ + > is_power_blink = 1; + > system("ledctrl power 255 700 700"); + > }else if (mtime >= 10 && is_power_blink == 1) { /* time >= 10s */ > + is_power_blink = 2; + > system("ledctrl power 255 500 500"); + > } + } + } else { + > if (is_power_blink != 0) { + > system("ledctrl power off"); + > is_power_blink = 0; + } + } /* > End if */ + //sleep(1); + > usleep(1000); + + } /* End while */ +} + +static int > print_events(int fd) +{ + struct input_event ev[64]; + > int i, rd; + struct timeval start, end; + long mtime, > secs, usecs; + + while (1) { + rd = read(fd, > ev, sizeof(struct input_event) * 64); + + if (rd < > (int) sizeof(struct input_event)) { + > printf("expected %d bytes, got %d\n", (int) sizeof(struct > input_event), rd); + perror("\nevtest: error > reading"); + return 1; + } + + > for (i = 0; i < rd / sizeof(struct input_event); i++) { + > if (ev[i].type != EV_SYN) { + > leds_dbg ("Event: time %ld.%06ld, ", ev[i].time.tv_sec, > ev[i].time.tv_usec); + leds_dbg > ("code = %d (0x%x)\n", ev[i].code, ev[i].code); + + > if (ev[i].value == 1){ + > start.tv_sec = ev[i].time.tv_sec; + > start.tv_usec = ev[i].time.tv_usec; + > key = ev[i].code; + is_start > = 1; + }else { + > secs = ev[1].time.tv_sec - start.tv_sec; + > usecs = ev[1].time.tv_usec - start.tv_usec; + > mtime = ((secs) * 1000 + usecs/1000.0) + 0.5; + > leds_dbg ("mtime = %d (%d), secs = %d\n", mtime, mtime / 1000, > secs); + key = 0; + > is_start = 0; + } + > } + } /* End for */ + + } /* End while */ +} + > +static int test_grab(int fd) +{ + int rc; + + rc = > ioctl(fd, EVIOCGRAB, (void*)1); + + if (!rc) + > ioctl(fd, EVIOCGRAB, (void*)0); + + return rc; +} + +static > int do_capture(const char *device) +{ + int fd; + char > *filename; + + if (!device) { + fprintf(stderr, > "No device specified, trying to scan all of %s/%s*\n", + > DEV_INPUT_EVENT, EVENT_DEV_NAME); + + if (getuid() != > 0) + fprintf(stderr, "Not running as root, no > devices may be available.\n"); + + filename = > scan_devices(); + if (!filename) + > return usage(); + } else + filename = > strdup(device); + + if (!filename) + return > EXIT_FAILURE; + + if ((fd = open(filename, O_RDONLY)) < 0) { > + perror("evtest"); + if (errno == > EACCES && getuid() != 0) + fprintf(stderr, > "You do not have access to %s. Try " + > "running as root instead.\n", + > filename); + return EXIT_FAILURE; + } + + > free(filename); + + if (!isatty(fileno(stdout))) + > setbuf(stdout, NULL); + + if (test_grab(fd)) + { + > return 0; + } + + return print_events(fd); +} + +int > main (int argc, char **argv) +{ + const char *device = NULL; > + int err; + + if (argc < 2) { + return > usage(); + } + device = argv[1]; + + err = > pthread_create(&pid, NULL, &thread_handler_led, NULL); + if > (err != 0) { + leds_dbg ("\nCan't create thread > :[%s]", strerror(err)); + return 0; + } + > else + leds_dbg ("\nThread created successfully\n"); > + + return do_capture(device); +} +/* + * END + * */ diff > --git a/package/linksys-base-files/files/etc/init.d/mamba_apps > b/package/linksys-base-files/files/etc/init.d/mamba_apps new file > mode 100755 index 0000000..4ac0731 --- /dev/null +++ > b/package/linksys-base-files/files/etc/init.d/mamba_apps @@ -0,0 > +1,9 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 > OpenWrt.org + +START=99 +start() { + /usr/sbin/ledctrl power > off + # Run leds_monitor + /usr/sbin/leds_monitor > /dev/input/event0& +} -- 1.7.9.5 > > > > __________________________________________________________________ > Confidential This e-mail and any files transmitted with it are the > property of Belkin International, Inc. and/or its affiliates, are > confidential, and are intended solely for the use of the individual > or entity to whom this e-mail is addressed. If you are not one of > the named recipients or otherwise have reason to believe that you > have received this e-mail in error, please notify the sender and > delete this message immediately from your computer. Any other use, > retention, dissemination, forwarding, printing or copying of this > e-mail is strictly prohibited. Pour la version française: > http://www.belkin.com/email-notice/French.html Für die deutsche > Übersetzung: http://www.belkin.com/email-notice/German.html > __________________________________________________________________ > _______________________________________________ openwrt-devel > mailing list openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel > _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel