/*
 Include file che definisce le funzioni per I/O canonico (ovvero una
 linea completa alla volta) su di una porta seriale.
 In realtà l'I/O viene effettuato in modo non canonico, ma le funzioni
 di lettura e scrittura operano a linee (terminate dal carattere '\n').
 Per compatibilità, caratteri di carriage return in ingresso vengono 
 mappati in '\n'.
 */
#ifndef __SERIAL_H__ 
#define __SERIAL_H__

#define __USE_GNU
#include <stdio.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* flow rate  della linea (B9600 è definito in termios.h */
#define BAUDRATE  B9600 
/* massima lunghezza di una linea */
#define MAXBUFFERSIZE 100000 
/* Numero di secondi in cui ReadSerial rimane in attesa di input
   prima di fallire */
#define SERIAL_TIMEOUT 10

typedef struct { 
  int fd;           /* file descriptor */
  char* deviceName;  /* nome della porta seriale */
  struct termios oldSettings;
  struct termios currentSettings;
} serialport;
  
/* 
    Apre e configura una porta seriale.
    deviceName e' una stringa contenente il nome della porta seriale
    ad esempio "/dev/ttyS0", corrispondente alla "COM1" del DOS o 
    "/dev/ttyS1", corrispondente alla "COM2".
    Il valore di ritorno e' un puntatore alla struttura "serialport"
    creata da OpenSerial. Vale 0 se non si riesce ad aprire la porta.
 */
serialport* OpenSerial(const char* deviceName );

/*
    Chiude correttamente una porta seriale aperta da OpenSerial. 
 */
void CloseSerial(serialport* port);

/*
    Invia la stringa buffer sulla porta seriale. Il valore
    di ritorno e' il numero di caratteri effettivamente scritti, incluso
    il carattere di fine riga che viene aggiunto automaticamente nel 
    caso mancasse.
    Se la linea e' troppo lunga, la scrittura non viene effettuata e la 
    funzione ritorna un -1. 
 */
int WriteSerial(serialport* port, const char* buffer);

/*
    Legge una linea di al massimo MAXBUFFERSIZE-1 caratteri dalla porta 
    seriale e li inserisce nella stringa buffer, aggiungendo automaticamente 
    il  terminatore di stringa \0. Se la stringa e' maggiore della dimensione
    massima il valore di ritorno e' -1, altrimenti e' la lunghezza della
    stringa (escludendo il terminatore \0).
    La stringa buffer deve essere dimensionata almeno a MAXBUFFERSIZE.     
 */
int ReadSerial(serialport* port, char* buffer);

#endif
