#include #include #include #include #include #include #include #include #include #include "leds.h" static int leds; static int reset; static int verbose = 0; enum { off=0, on=1, blink, unknown, transition=unknown }; void init_leds(void) { int i; if ((leds = open("/dev/leds", O_RDWR)) < 0) { int e1 = errno; if (e1 != ENOENT) { fprintf(stderr,"Error: Could not open LEDS device file '/dev/leds' : %s\n", strerror(e1)); if(e1 == EACCES) fprintf(stderr,"Run as root\n"); exit(1); } } if (verbose) printf("leds: initialized.\n"); } void led_ioctl( int cmd, int num ) { int i, st; if (ioctl(leds, cmd, num) < 0) { int e1 = errno; fprintf(stderr, "leds: ioctl(%d,%d): failed to set leds: %s\n", cmd, num, strerror(e1)); exit(1); } } void led_set( int led, int state ) { switch (state) { case off: if (!reset) led_ioctl(N2_LM_OFF, led); break; case on: led_ioctl(N2_LM_ON, led); break; case blink: /* Ensure any previous timer gets deleted first and that * the LED is in a well known state. */ if (!reset) led_ioctl(N2_LM_OFF, led); led_ioctl(N2_LM_BLINK, led); break; } } int led( int ch ) { switch (ch) { case 'r': return LED_RS_RED; case 'g': return LED_RS_GRN; case '1': return LED_DISK1; case '2': return LED_DISK2; case 'A': reset = 1; return LED_ALL; default: fprintf(stderr, "leds: %c: unknown LED (use r,g,0,1 or A)\n", ch); exit(1); } } int main( int argc, char **argv ) { /* Default: switch green on, red off (-A +g). */ if (argc == 1) { verbose = 1; init_leds(); led_ioctl(N2_LM_ALL_OFF, 0); led_ioctl(N2_LM_ON, LED_RS_GRN); } else { int i, alt=0, state[PHYS_LEDS]; for(i=0; i 0) { char *arg = *++argv; int st; if (strcmp(arg, "-v") == 0) { ++verbose; continue; } switch (*arg) { case '+': st = on; break; case '-': st = off; break; case '!': st = blink; break; case '/': st = transition; break; default: fprintf(stderr, "leds: %c: unknown option\n", *arg); exit(1); } if (st != transition) { while (*++arg) { i = led(*arg); if (i == LED_ALL) for (i=0; i