#define __KERNEL_STRICT_NAMES
#define _GNU_SOURCE
#include <linux/input.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define VOLUME_UP       KEY_KPDOT
#define VOLUME_DOWN     KEY_VOLUMEDOWN
#define WIFI_KEY        KEY_W
#define UP_LEFT         KEY_ENTER
#define UP_RIGHT        KEY_ESC
#define DOWN_LEFT       KEY_C
#define DOWN_RIGHT      KEY_POWER
#define UP              KEY_UP
#define DOWN            KEY_DOWN
#define LEFT            KEY_LEFT
#define RIGHT           KEY_RIGHT
#define OK              KEY_SPACE

//Numbers are KEY_KBX
#define KP0             KEY_KP0
#define KP1             KEY_KP1
#define KP2             KEY_KP2
#define KP3             KEY_KP3
#define KP4             KEY_KP4
#define KP5             KEY_KP5
#define KP6             KEY_KP6
#define KP7             KEY_KP7
#define KP8             KEY_KP8
#define KP9             KEY_KP9

#define DIESE           KEY_KPDOT
#define STAR            KEY_KPASTERISK

void
exec_cmd (int cmd)
{
  //Code it yourself
}

int
main ()
{
  int pidstate = 0commande = 0;
  struct input_event evenement;
  int fd = open ("/dev/input/event7"O_RDONLY);
  if (fd < 0)
    {
      perror ("Open input device");
      return -1;
    }
  char *buf = malloc (512);
  ioctl (fdEVIOCGNAME (512), buf);    //Should be omap-keypad or something like
  printf("%s\n"buf);
  free (buf);
  ioctl(fdEVIOCGRAB0);
  while (1)
    {
      read (fd, &evenementsizeof (evenement));
      switch (evenement.code)
        {
        case STAR:
          if (state == 4)
            {
              exec_cmd (commande);
            }
          state = 0;
          commande = 0;
          break;
        case DIESE:
          if (evenement.value == 1)
            {
              if (state == 0 || state == 1)
                state++;
            }
          else
            {
              state = 0;
              commande = 0;
            }
          break;
        case KEY_KP0:
        case KEY_KP1:
        case KEY_KP2:
        case KEY_KP3:
        case KEY_KP4:
        case KEY_KP5:
        case KEY_KP6:
        case KEY_KP7:
        case KEY_KP8:
        case KEY_KP9:
          if (state >= 2 && state < 5)
            {
              int chiffre;
              if (evenement.code == KP0)
                chiffre = 0;
              else if (evenement.code == KP1)
                chiffre = 1;
              else if (evenement.code == KP2)
                chiffre = 2;
              else if (evenement.code == KP3)
                chiffre = 3;
              else if (evenement.code == KP4)
                chiffre = 4;
              else if (evenement.code == KP5)
                chiffre = 5;
              else if (evenement.code == KP6)
                chiffre = 6;
              else if (evenement.code == KP7)
                chiffre = 7;
              else if (evenement.code == KP8)
                chiffre = 8;
              else if (evenement.code == KP9)
                chiffre = 9;

              int y = (4 - state);      //4-state = 2-(state-2)

              commande += pow (10y) * chiffre;
              state++;
            }
          else
            {
              state = 0;
              commande = 0;
            }
          break;
        default:
          printf ("time (s): %d\ntype: %d\ncode: %d\nvalue: %d\n",
                  evenement.time.tv_secevenement.typeevenement.code,
                  evenement.value);
          state = 0;
          commande = 0;
          break;
        }
    }
  return 0;
}