#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <math.h>
#include <sched.h> 

#define FRQ 2048
//http://www.easysw.com/~mike/serial/serial.html#2_2_1
/*
#define TIOCM_LE        0x001                                                   
#define TIOCM_DTR       0x002                                                   
#define TIOCM_RTS       0x004                                                   
#define TIOCM_ST        0x008                                                   
#define TIOCM_SR        0x010                                                   
#define TIOCM_CTS       0x020                                                   
#define TIOCM_CAR       0x040                                                   
#define TIOCM_RNG       0x080                                                   
#define TIOCM_DSR       0x100                                                   
#define TIOCM_CD        TIOCM_CAR                                               
#define TIOCM_RI        TIOCM_RNG                                               
#define TIOCM_OUT1      0x2000                                                  
#define TIOCM_OUT2      0x4000                                                  
#define TIOCM_LOOP      0x8000              
*/

int main(void) {

int i, fd,fdc, retval;
unsigned long tmp, data;
//struct rtc_time rtc_tm;
int dtr_bit = TIOCM_DTR;
int dtr_bit_0 = 0;
int flags;
long delta;
float cas;
struct sched_param p;

//struct timeval timex,timey;    
//struct sched_param p;

//     printf("Start\n");

	fprintf(stderr, "Start ");
	fflush(stderr);

fd = open ("/dev/rtc", O_RDWR);

if (fd ==  -1) {
	perror("/dev/rtc");
	exit(errno);
}

  if ((fdc = open("/dev/ttyS1", O_RDWR)) < 0) {
        
  if ((fdc = open("/dev/tts/1", O_RDWR)) < 0) {
        exit(1);
  }

  }
//     printf("Start 2\n");

//  ioctl(fdc, TIOCMGET, &flags);
 // printf("Flags: ... %x\n",flags);


sched_getparam(0,&p);
//
p.sched_priority = 10;
sched_setscheduler(0, SCHED_RR, &p);

while (1) {
	fprintf(stderr, " Discharge ");
	fflush(stderr);

//    printf("Discharge...");


    ioctl(fdc, TIOCMSET, &dtr_bit_0);
    sleep(3);    
//     printf("Done\n");
	fprintf(stderr, "Done\n");
	fflush(stderr);


//  ioctl(fdc, TIOCMGET, &flags);
 // printf("Flags: ... %x\n",flags);

        retval = ioctl(fd, RTC_PIE_OFF, 0); 
	        if (retval == -1) { 
		perror("ioctl"); 
		exit(errno); 
						        } 
							
	tmp  = FRQ;
	retval = ioctl(fd, RTC_IRQP_SET, tmp);
//     printf("Start 3\n");
	
	
	if (retval == -1) {
		perror("ioctl");
		exit(errno);
	}

	fprintf(stderr, "...\n");
	fflush(stderr);


	retval = ioctl(fd, RTC_PIE_ON, 0);
	
	if (retval == -1) {
		perror("Xioctl");
		exit(errno);
	}


	ioctl(fdc, TIOCMSET, &dtr_bit);


//  ioctl(fdc, TIOCMGET, &flags);
 // printf("Flags: ... %x\n",flags);


    for (i=1; ; i++) {
      flags =0;
	ioctl(fdc, TIOCMGET, &flags);
//	fprintf(stderr, " %x ",flags);
//	ioctl(fdc, TIOCMGET, &flags);
//	fprintf(stderr, " %x ",flags);
    
	/* This read will block for 1/1024*/
	retval = read(fd, &data, sizeof(unsigned long));
	if (retval == -1) {
		perror("read");
		exit(errno);
	}
	if (flags&TIOCM_DSR) { 
	fprintf(stderr, "\n GOT: %d\n",i);
		fflush(stderr);
	break;
	}
    
}		

	
	
	fprintf(stderr, "Pocet: %d %x\n",i,flags);
	cas = (float) (i*( 1.0/FRQ))*1000;
	fprintf(stderr, "Cas: %f [ms]\n", cas);
	fprintf(stderr, "teplota: %f [t]\n", (float) -28.804*log(cas)+183.65);
	fprintf(stderr, "teplota: %f [t]\n", (float) 81.87*exp(-0.0047*cas));
	
	fflush(stderr);
	
	
	

/* Turn off update interrupts */
retval = ioctl(fd, RTC_UIE_OFF, 0);
if (retval == -1) {
	perror("ioctl");
	exit(errno);
}

}

return 0;

} /* end main */

