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

#define DEV "/dev/serial0"


main(int argc,char **argv)
{
	unsigned char a,fn[256];
	int i,j,fd,fdin,fds,baud=0,result;
	struct termios term;
        const struct {
        	int baud;
        	int entry;
        }baudtb[]={
        	50,B50,
        	75,B75,
        	150,B150,
        	300,B300,
        	600,B600,
        	1200,B1200,
        	2400,B2400,
        	4800,B4800,
        	9600,B9600,
        	19200,B19200,
        	57600,B57600,
        	115200,B115200,
        	0,0
        };
		
	if ((fd=open(DEV,O_RDWR))==-1) exit(0);
//	if ((fds=creat("session.log",0666))==-1) exit(0);
	
	baud=B115200;
	
	if (argc>1) {
		baud=atoi(argv[1]);
		for (i=0;baud!=baudtb[i].baud && baudtb[i].baud;i++);
		if (baud==baudtb[i].baud) baud=baudtb[i].entry;
	}
	
	/* ponemos las cosas del puerto en su sitio */
	tcgetattr(fd,&term);

	term.c_cflag&=~CBAUD;
	term.c_cflag|=baud;
	term.c_cflag&=~CSIZE;
	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);
			//printf("<0x%02x>",a); fflush(stdout);
			//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('.'); fflush(stdout);
					//usleep(10000);
				}
				putchar('\n'); fflush(stdout);
				close(fdin);
				break;
				
		default:	write(fd,&a,1);
			}
		}
	}
}

