#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include "data_types.h"

#define BAUDRATE B2400
#define WINDOZE_BOX "/dev/ttyS1"
#define DATA_LOGGER "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FAKE_DATA "./curobs_inject"
#define FAKE 01111

#define MAX(a, b) (a > b ? a : b) 

/* ttyS1 = windoze */
/* ttyS0 = weather */

int open_serial_device (const char *);
void print_data (char *, int, char);

int main (void)
{
	int data_logger, windoze_box, size, max_fd, i, fake_fd, fake_size;
	char buffer[255], fake[255], type;
	fd_set read_fs;

	fake_fd = open(FAKE_DATA, O_RDONLY);
	if (fake_fd < 0)
	{
		perror(FAKE_DATA);
		exit(1);
	}

	data_logger = open_serial_device(DATA_LOGGER);
	windoze_box = open_serial_device(WINDOZE_BOX);

	max_fd = MAX(data_logger, windoze_box) + 1;
	
	while (1)
	{
		FD_SET(data_logger, &read_fs);
		FD_SET(windoze_box, &read_fs);

		select(max_fd, &read_fs, NULL, NULL, NULL);
		
		if (FD_ISSET(data_logger, &read_fs))
		{
			size = read(data_logger, buffer, 255);
			write(windoze_box, buffer, size);
			printf("got data (%d) of type (%.2hhx) from data logger = ", size, type);
			for (i = 0; i < size; i++)
				printf("%.2hhx ", buffer[i]);
			printf("\n");
		}
		if (FD_ISSET(windoze_box, &read_fs))
		{
			size = read(windoze_box, buffer, 255);
			type = buffer[0];
			if (buffer[0] != FAKE)
				write(data_logger, buffer, size);
			else
			{
				lseek(fake_fd, 0, SEEK_SET);
				fake_size = read(fake_fd, fake, 255);
				write(windoze_box, fake, fake_size);
				printf("injecting data (%d) = ", fake_size);
				for(i = 0; i < fake_size; i++)
					printf("%.2hhx ", fake[i]);
				printf("\n");
			}
			printf("got data (%d) from windoze box = ", size);
			for (i = 0; i < size; i++)
				printf("%.2hhx ", buffer[i]);
			printf("\n");
		}
	}

	return 0;
}

int
open_serial_device 
(const char * serial_device)
{
	struct termios term_settings;
	int fd;

	fd = open(serial_device, O_RDWR | O_NOCTTY);
	if (fd < 0)
	{
		perror(serial_device);
		exit(1);
	}
	
	memset(&term_settings, 0, sizeof(term_settings));
	
	term_settings.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
	term_settings.c_iflag = IGNPAR;
	term_settings.c_oflag = 0;
	term_settings.c_lflag = 0;
	term_settings.c_cc[VMIN] = 1;
	term_settings.c_cc[VTIME] = 0;

	tcflush(fd, TCIFLUSH);
	tcsetattr(fd, TCSANOW, &term_settings);

	return fd;
}


