//process/threads de communication avec arduino
/*
thread de lecture de arduino et remplissage fifo ffromard
thread ecriture de arduino et vidage ftoard
thread sauvegarde des fifo en local
thread named pipe TOARD en lecture
thread named pipe FROMARD en écriture
*/

// #include <select.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/time.h>
#include <pthread.h>

#include "ardcom.h"
#include "mkfifo.h"

char ardtty[SLEN]=DEFAULTTTY;
char toardfifo[SLEN]=DEFAULTTOARDFIFO;
char fromardfifo[SLEN]=DEFAULTFROMARDFIFO;
char toardpipe[SLEN]=DEFAULTTOARD;
char fromardpipe[SLEN]=DEFAULTFROMARD;

pthread_t t_readard,t_writeard,t_savefifo,t_sockaccess;

int fdard=0;

int fdfromard;
int fdtoard;
void syserrorf(char *code, char *reason) {
	fprintf(stderr,"\n?? %s\t%s\t%s (%d)",code,reason,strerror(errno),errno);
	}

void errorf(char *code, char *reason) {
	fprintf(stderr,"\n?? %s\t%s",code,reason);
	}

void sysexitf(char *code,char *reason) {
	syserrorf(code,reason);
	fprintf(stderr,"\n");
	exit(1);
	}

mkf ftoard,ffromard;
	
void* readard(void *arg) {
	printf("\nREADARD\n");
	char message[MAXMESSAGESIZE+1];
	char rb;
	int cursor=0;
	while(read(fdard,&rb,1)) {
//		printf(" -%c (%d)- ",rb,(int)rb);
		message[cursor++]=rb;
		if(rb==(char)10) {
			//fin message
			message[cursor]=0;
			errorf("MESSAGE",message);
			mkfwrite(&ffromard,message);
			cursor=0;
			}
		if(cursor>=MAXMESSAGESIZE) {
			errorf("BUFOVF","Buffer overflow");
			cursor=0;
			};
		};
	printf("\nLECTURE FOIREUSE SUR ARDUINO\n");
	pthread_exit(NULL);
	}

void* writeard(void *arg) {
	printf("\nWRITEARD\n");
	pthread_exit(NULL);
	}

void* savefifo(void *arg) {
	printf("\nSAVEFIFO\n");
	for(;;) {
		printf(stderr,"\n!! SAVING");
		mkfsave(&ffromard);
		mkfsave(&ftoard);
		usleep(FIFOSAVEINTERVAL);
		}
	pthread_exit(NULL);
	}

void* sockaccess(void *arg) {
	printf("\nSOCKACCESS\n");
	pthread_exit(NULL);
	}
//====================================
main(int argc,char **argv) {
	fdard=open(ardtty,O_RDWR|O_NOCTTY);
	if(ardtty<=0) sysexitf("PBTTY","Can't open TTY");

	usleep(ARDWAITBOOT);

	mkfinit(&ftoard,toardfifo);
	mkfinit(&ffromard,fromardfifo);
	mkfload(&ffromard);

	if(pthread_create(&t_readard,NULL,readard,0)) sysexitf("THREADPB","Can't run thread");
	if(pthread_create(&t_writeard,NULL,writeard,0)) sysexitf("THREADPB","Can't run thread");
	if(pthread_create(&t_savefifo,NULL,savefifo,0)) sysexitf("THREADPB","Can't run thread");
	if(pthread_create(&t_sockaccess,NULL,sockaccess,0)) sysexitf("THREADPB","Can't run thread");

	pthread_exit(NULL);

	exit(0);	

	// if(mkfifo(fromardpipe,FIFOMOD))sysexitf("PBFROMARD","Can't create FROMARD");
	mkfifo(fromardpipe,FIFOMOD);
	int fdfromard=open(fromardpipe,O_WRONLY);
	if(fdfromard<=0) sysexitf("PBFROMARD","Can't open FROMARD");
	//on arrive ici uniquement si connexion en lecture
	
	char msg[512];
	int msglen=0;
	while(mkfread(&ffromard,msg,sizeof(msg))) {
		msglen=strlen(msg);
		msg[msglen]=(char)10;
		write(fdfromard,msg,msglen+1);
		};


	exit(0);		





/*
	//int fromard=open(fromardfile,O_WRONLY|O_APPEND|O_CREAT,S_IRWXU|S_IRGRP|S_IROTH);
	char *fromardfile="pippzeirpzeoripzoeri";
	if(mkfifo(fromardfile,FIFOMOD))sysexitf("PBFROMARD","Can't create FROMARD");
	int fromard=open(fromardfile,O_WRONLY|O_NONBLOCK);
	printf("fromad=%s= (%d)",fromardfile,fromard);
	if(fromard<=0) sysexitf("PBFROMARD","Can't open FROMARD");

	fd_set set;
	struct timeval timeout;

	char message[MAXMESSAGESIZE+1];
	int cursor=0;

	for(;;) {
//	printf("loop\n");
		int sres=0;

	//initialisatiuon set et timeout 
	FD_ZERO(&set);
	FD_SET(fd,&set);
       timeout.tv_sec = TIMEOUT;
       timeout.tv_usec = 0;


 		sres=select(FD_SETSIZE,&set,NULL,NULL,&timeout);
		if(FD_ISSET(fd,&set)) {
			char rb;
			int rres=0;
			while(read(fd,&rb,1)) {
//				printf(" -%c (%d)- ",rb,(int)rb);
				message[cursor++]=rb;
				if(rb==(char)10) {
					//fin message
					message[cursor]=0;
					errorf("MESSAGE",message);
					write(fromard,message,strlen(message));
					cursor=0;
					}
				if(cursor>=MAXMESSAGESIZE) {
					errorf("BUFOVF","Buffer overflow");
					cursor=0;
					};
				};
			}
		else
			printf("\nTimeout");
	};
*/

}

