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

Reply via email to