
/**
* ===================================================================================================
 *
 *       @file  header.h 
 *      @brief  Cabeçalho principal 
 *
 * ===================================================================================================
 */

#ifndef HEADER_H

#define HEADER_H

#include <fcntl.h> 
#include <termios.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <gtk/gtk.h>
#include <math.h>
#include <sys/time.h>

#define SHM_SIZE 200		/* 128 bytes for shared memory */
#define UBS_device0 "/dev/ttyUSB0"
#define UBS_device1 "/dev/ttyUSB1"
#define UBS_device2 "/dev/ttyUSB2"

/** \enum Tipo
 * \brief Enumeração dos tipos mensagens de comunicação entre processos.
 */
typedef enum
{
	ESTADO,			
	MOTORES,	
	ULTRASONS,		
	DISTANCIA,
	TEMPERATURA,
	GARRA
}Tipo;


/** \enum Estado
 * \brief Enumeração dos vários tipos de estado.
 */
typedef enum
{
	ACTUALIZAR,
	LEDS,
	ILUMINACAO,
	PONTEIRO,
	VALVO,
	VALVC
}Estado;


/** \enum Motores
 * \brief Enumeração dos diferentes tipos de motores.
 */
typedef enum
{
	SERVO,
	VENTOINHA
}Motores;

/** \enum Sensores
 * \brief Enumeração dos diferentes tipos de sensores.
 */
typedef enum
{
	SENS1,
	SENS2,
	SENS3,
	SENS4
}Sensores;


/** \enum Ficheiro
* \brief Enumeração dos vários tipos de utilizaçao do SIGUSR1.
*/
typedef enum
{
    RS232,
    OTHER
}sig_user1;


/** \enum Ficheiro
* \brief Enumeração dos vários tipos de estado.
*/
typedef enum
{
    WAIT,
    INI_TICTOC_X,    
    INI_TICTOC_Y,    
    CLOSE_TICTOC_X,    
    CLOSE_TICTOC_Y,
    OPEN_PNEU_OK,
    CLOSE_PNEU_OK,
    APPEND_DATA,    
}CommRS232_Rob;


/** \enum Eixo
* \brief Enumeração dos 3 eixos (x, y, Z)
*/
typedef enum
{
    EIXO_X,
    EIXO_X_LINEAR,    
    EIXO_Y,
    EIXO_Y_LINEAR,
    EIXO_Z,    
    EIXO_Z_LINEAR,
}MovimentoRefGarra;


/** \struct ShmMsg
 * \brief Definição da estrutura de dados para a comunicação entre processos através da memória partilhada
 */
typedef struct
{
    Tipo type;
    unsigned int param1;
    unsigned int param2;
    int command;
    int RobotComm;        
    int data_int[1024];		/*Coordenadas X, Y, Z*/
    int CentroObj[5];
    int DistSensorObj[5];    
    int MinDistSensorObj;
    int MinRelativosFunc_ok;
    int limiteZ;
    int veloc_robot;
} ShmMsg;


/*Declaracao de variaveis externas:*/
#ifdef MAIN_C
	#define EXTERN
#else
	#define EXTERN extern
#endif

EXTERN int Comunic_ON, fd;
EXTERN int shm_id_rec, shm_id_env, shm_id_robEnv;
EXTERN ShmMsg *shm_rec, *shm_env, *shm_robEnv;

//Prototipos
int ProgInterface(int argc, char *argv[]);
int RobotComunication(void);
int RS232Comunication(void);

void Signal_rc( int x);
void Signal_env(int x);

ShmMsg* GetSharedMem(char* NameKey,int* shm_id_out);
int AbsValue(int valor_in);
double round(double);

#endif