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

//#define DEV "/dev/ttyS0"	// COM1
#define DEV "/dev/ttyS1"	// COM2
//#define DEV "/dev/ttyUSB0"	// Adaptador USB <-> serie

main(int argc,char **argv)
{
	unsigned char a,*dn=DEV,fn[256];
        const int baudtable[][2]={
            50,B50,
            75,B75,
            110,B110,
            150,B150,
            200,B200,
            300,B300,
            600,B600,
            1200,B1200,
            2400,B2400,
            4800,B2400,
            9600,B9600,
            19200,B19200,
            38400,B38400,
	    115200,B115200,
            0,0
        };
	int i,j,fd,fdin,fds,baud=9600,result;
	struct termios term;

        // Parse args
        for (i=1;i<argc;i++) {
            if (*argv[i]=='-') {
                switch(argv[i][1]) {
                case 'h':   printf("Uso: %s opciones\n",argv[0]);
                            printf("Opciones:\n");
                            printf("-h : Help\n");
                            printf("-d <dispositivo_serie> : puerto serie a usar\n");
                            printf("-s <velocidad> : Velocidad en baudios del puerto\n");
                            exit(0);
                case 'd':   dn=argv[++i]; break;
                case 's':   baud=atoi(argv[++i]); break;
                }
            }
        }

        for (i=0;baudtable[i][0];i++) {
            if (baud==baudtable[i][0]) break;
        }
        if (!baudtable[i][0]) {printf("Velocidad no soportada\n"); exit(0);}

        printf("Puerto serie: %s\n",dn);
        printf("Velocidad: %d baudios\n",baud);
        baud=baudtable[i][1];

	if ((fd=open(dn,O_RDWR))==-1) {perror("open"); exit(0);}

	/* ponemos las cosas del puerto en su sitio */
	tcgetattr(fd,&term);

	term.c_cflag&=~CBAUD;
	term.c_cflag|=baud;
	term.c_cflag&=~CSIZE;
/* Los cambios en estos bits dan problemas en los adaptadores serie<->USB PL2003
	term.c_cflag|=CS8;
	term.c_cflag|=CSTOPB;
	term.c_cflag&=~PARENB;
*/
	term.c_lflag&=~ICANON;
	term.c_lflag&=~ECHO;
	term.c_lflag&=~ISIG;
	term.c_iflag&=~ICRNL;
	term.c_iflag&=~IXOFF;
	term.c_iflag&=~IXON;
/*	term.c_cflag|=TIOCM_RI; */
	term.c_oflag&=~OPOST;


	if (tcsetattr(fd,TCSANOW,&term)) {
		fprintf(stderr,"Fallo en tcsetattr\n");
		exit(0);
	}



	/* ponemos las cosas de STDIN en su sitio */
	tcgetattr(0,&term);

	term.c_lflag&=~ICANON;
	term.c_lflag&=~ECHO;

	if (tcsetattr(0,TCSANOW,&term)) {
		fprintf(stderr,"Fallo en tcsetattr\n");
		exit(0);
	}


	result=0;
	result|=TIOCM_RTS;
	ioctl (fd, TIOCMBIC, &result);



	if (!fork()) {
		for (;;){
			read(fd,&a,1);
			write(1,&a,1);
			//write(fds,&a,1);
		}
	} else {
		for (;;) {
			read(0,&a,1);
			switch (a) {
		case 	'X'-64:	a=3;
				write(fd,&a,1);
				break;
		case	'F'-64:	printf("\nInclude File: ");
				fflush(stdout);
				tcgetattr(0,&term);
				term.c_lflag|=ECHO;
				tcsetattr(0,TCSANOW,&term);
				gets(fn);
				term.c_lflag&=~ECHO;
				tcsetattr(0,TCSANOW,&term);
				if ((fdin=open(fn,O_RDONLY))==-1) break;
				while ((i=read(fdin,fn,128))>0) {
					write(fd,fn,i);
				}
				putchar('\n'); fflush(stdout);
				close(fdin);
				break;

		default:	write(fd,&a,1);
			}
		}
	}
}

