#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/ioctl.h>
#include <sys/stat.h>
#include <sys/poll.h>
#include <fcntl.h>
#include "rs_timer.h"
void blad(char * fmt,...)
{
  va_list ap;
  va_start(ap,fmt);
  vfprintf(stderr,fmt,ap);
  va_end(ap);
  exit(1);
}


int f=-1; //Deskryptor pliku urządzenia

void cleanup()
{
  if(f>=0) {
    ioctl(f,IOCTL_STOP,0);
    close(f);
  }
}

void main(int argc, char * argv[])
{
  int div=0;
  if(argc < 2)  blad("Prawidłowe wywołanie: rs_test plik_specjalny dzielnik\n");
  f = open(argv[1],O_RDONLY);
  div=atoi(argv[2]);
  if(f<0) blad("Nie mogę otworzyć pliku: %s\n",argv[1]);
  atexit(cleanup);
  div=atoi(argv[2]);
  if(ioctl(f,IOCTL_SET_DIV,(long) div)<0) {
    perror("Błąd IOCTL:");
    exit(1);
  }
  while(1) {
    unsigned char c;
    struct pollfd pfd[2]={{0,POLLIN,0},{f,POLLIN,0}};
    int res;
    //Czekamy albo na dane z urządzenia sygnalizującego przerwanie,
    //albo na naciśnięcie klawisza
    res=poll(pfd,2,-1);
    if(res<0) {
      perror("Błąd w wywołaniu poll:");
      exit(1);
    }
    if( pfd[0].revents & POLLIN ) {
      /* Wciśnięto klawisz ENTER (z uwagi na buforowanie terminala
	 pojedyncze znaki bez ENTER nie spowodują wyjścia z programu)
      */
      printf("Naciśnięto klawisz ENTER - koniec programu\n");
      //Czyścimy bufor wejściowy, żeby wprowadzone kody nie zostały
      //zinterpretowane przez powłokę
      do read(0,&c,1); while (c != '\n');
      exit(0);
    }
    if( pfd[1].revents & POLLIN ) {
      read(f,&c,1);
      printf("Odebrałem: %d przerwań\n",(int) c);
    }
  }
}
