/*************************************************************/
/*                                                           */
/*   PROGRAMM:           SERTHERM.C                          */
/*                                                           */
/*   PROJEKT:            Serieller Thermometer fuer Linux    */
/*                                                           */
/*   KURZBESCHREIBUNG:   Liest Temperaturtelegramm von       */
/*                       CONRAD-Thermometer-Modul            */
/*                       CGI fuer Apache-Webserver           */
/*                                                           */
/*************************************************************/

#include <stdio.h>
#include <sys/termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/time.h>

#define ERROR -1
#define TIMEOUT -2

int get_pulse( int serial)
{ 
 char buffer[2];
 fd_set rfds;
 struct timeval tv;
 int retval;                                                                    

 FD_ZERO( &rfds);
 FD_SET( serial, &rfds);
 
 /* Warte maximal 0,5 Sekunden. */
 tv.tv_sec = 0;
 tv.tv_usec = 500000L;
 
 retval = select( serial + 1, &rfds, NULL, NULL, &tv);

 /* Mit Timeout auf neues zeichen warten */
 if( retval) {
   read( serial, buffer, 1);
   switch( buffer[0] & 255) {
     case 254: return(0);
     case 240: return(1);
     default:  return( ERROR);
   }
 } 
 else /* Innerhalb 0,5 sec kein zeichen --> neues Telegramm folgtt */
   return( TIMEOUT); 
}

main()
{
 struct termios term;
 int serial, zeichen, ziffer;

 /* Serielle Schnittstelle oeffnen und initialisieren */
 serial = open( "/dev/ttyS1", O_RDWR);
 // tcgetattr( serial, &term);
 term.c_iflag = IGNBRK | INPCK;   
 term.c_oflag = 0;
 term.c_cflag = CS8 | CREAD | CLOCAL;
 term.c_lflag = 0;
 cfsetospeed( &term, B57600);
 cfsetispeed( &term, B57600);
 if( tcsetattr( serial, TCSANOW, &term))
   exit( -1);

 do {
   zeichen = get_pulse( serial);
   if( zeichen == ERROR) {
     printf( "ERROR\n");
     exit( -1);
   }
 } while( zeichen != TIMEOUT);

 printf( "Content-Type: text/plain\n\n");
 fflush(stdout);
 printf( "Temperatur: ");

 if( get_pulse(serial) == 1) printf( "-");

 ziffer = 0;
 if( get_pulse( serial) == 1) ziffer += 8;
 if( get_pulse( serial) == 1) ziffer += 4;
 if( get_pulse( serial) == 1) ziffer += 2;
 if( get_pulse( serial) == 1) ziffer += 1;
 printf( "%d", ziffer);

 ziffer = 0;
 if( get_pulse( serial) == 1) ziffer += 8;
 if( get_pulse( serial) == 1) ziffer += 4;
 if( get_pulse( serial) == 1) ziffer += 2;
 if( get_pulse( serial) == 1) ziffer += 1;
 printf( "%d,", ziffer);

 ziffer = 0;
 if( get_pulse( serial) == 1) ziffer += 8;
 if( get_pulse( serial) == 1) ziffer += 4;
 if( get_pulse( serial) == 1) ziffer += 2;
 if( get_pulse( serial) == 1) ziffer += 1;
 printf( "%d", ziffer);

 printf( " &deg;C\n");
 fflush( stdout);
}

