/******************************************************************************* * keyboard-LED control application * Copyright © 2013 Lukasz Kazmierczak *******************************************************************************/ #include ... #define KBD_BUTTONS 5U #define LEDS 4U #define LED_UP 1U #define LED_DOWN 2U #define LED_LEFT 0U #define LED_RIGHT 3U #define KBD_SEL 0U #define KBD_UP 2U #define KBD_DOWN 1U #define KBD_LEFT 3U #define KBD_RIGHT 4U unsigned char _term=0; static void signal_handler(int signal) { if(signal == SIGTERM) { printf("Termination signal received\n"); _term = 1; } else { // unsupported signal } } int main(int argc, char ** argv) { int LED[LEDS]={0}, KBD[KBD_BUTTONS]={0}; int ret = -1, i = 0; int kbdChkMsDelay = 100; struct timespec req = { .tv_sec=0, .tv_nsec= kbdChkMsDelay * 1000000 }; char *LED_gpio[] = { "/dev/gpioF6", "/dev/gpioF7", "/dev/gpioF8", "/dev/gpioF9" }; char *KBD_gpio[] = { "/dev/gpioG7", "/dev/gpioG8", "/dev/gpioG11", "/dev/gpioG13", "/dev/gpioG14" }; if(argc != 1) { printf("%s.\n"\ "\tapplication sets LEDs depend of JOY buttons state\n"\ "\tsignal (\"kill -TERM \") kills the application\n", argv[0]); ret = 0; } else { signal(SIGTERM, signal_handler); for(i = 0; i < LEDS; i++) LED[i] = open(LED_gpio[i], O_WRONLY); for(i = 0; i < KBD_BUTTONS; i++) KBD[i] = open(KBD_gpio[i], O_RDONLY); if(LED[0]<0||LED[1]<0||LED[2]<0||LED[3]<0) { printf("can not open gpio port for writing.\n"); return ret; } if(KBD[0]<0||KBD[1]<0||KBD[2]<0||KBD[3]<0||KBD[4]<0) { printf("can not open gpio port for reading.\n"); return ret; } for(i = 0; i < LEDS; i++) write(LED[i], "0", 1); while(_term == 0) { for (i=0; i< KBD_BUTTONS; i++) { char buttonState = 0; read(KBD[i], &buttonState, 1); buttonState = '0' + (!(buttonState - '0')); // mapping buttons to LEDs switch(i) { case KBD_UP: write(LED[LED_UP], &buttonState, 1); break; case KBD_DOWN: write(LED[LED_DOWN], &buttonState, 1); break; case KBD_LEFT: write(LED[LED_LEFT], &buttonState, 1); break; case KBD_RIGHT: write(LED[LED_RIGHT], &buttonState, 1); break; case KBD_SEL: write(LED[LED_UP], &buttonState, 1); write(LED[LED_DOWN], &buttonState, 1); write(LED[LED_LEFT], &buttonState, 1); write(LED[LED_RIGHT], &buttonState, 1); break; default: { /* button not supported */ } } } nanosleep(&req, NULL); } for(i = 0; i < LEDS; i++) write(LED[i], "0", 1); for(i = 0; i < LEDS; i++) close(LED[i]); for(i = 0; i < KBD_BUTTONS; i++) close(KBD[i]); ret = 0; } return ret; }