/**
* ===================================================================================================
*
*       \file  RobCommClient.c 
*      \brief  Cabeçalho do programa RobCommClient.c que comunica com o robot
*
* ===================================================================================================
*/

#ifndef ROBCOMMCLIENT_H_

#define ROBCOMMCLIENT_H_

#include "header.h"

#include <stdbool.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

 /** \struct ShmMsg
 * \brief Definição da estrutura de dados utilizada no programa do RobComm
 */
typedef struct
{
    int SizeArrayFile;
    int SizeArrayTemp;
    int TrackingState;
    int AproxObj;
    
    int NObjTrab;
    int ObjTrabX;
    int ObjTrabY;
    double ElipAxisRatio;
    double ElipAxisRatioBruto;
    double Roundness;    
    double Angle;
    int NTotObj;
    int ObjGlobX;
    int ObjGlobY;
    int ObjGlobLarguraX;
    int ObjGlobLarguraY;
    int CombinacaoPropriedades;
    
    int SentidoRotGarra;
    int LostObjectCount;
    int LostState;
    int MovimentoAproxInicial;
    
    int VelocTrab;
    int VelocVarrimento;
    int VelocMedia;
    int VelocRapida;
    
    int RefTrabX;
    int RefTrabY;
    int RefTrabZ;
    
    int CalibValue_mm;
    int CalibValue_pixeis;
    
    int DistObjRefGarra;
    int NovaTentativa;
    int N_PneusApanhados;
    
} RobValues;

//Prototipos de RoCommFunc.c
int ConfigureComm(char servIP[20],in_port_t servPort);
void GetDataSherlock(double** ArrayRob, RobValues* DataRob);
void TrackingObjects(double** ArrayRob, double** ArrayTemp, RobValues* DataRob);
void Aproximacao_Inicial_Objecto(int sock, RobValues* DataRob, int X_Value, int Y_Value);
void Aproximacao_ao_Objecto(int ObjTrabX, int ObjTrabY,int* x_move, int* y_move);
void InicializeRobotProgram(double** ArrayRob, double** ArrayTemp, RobValues* DataRob, int* sock);
void DerrubaObjectoSegundoYY(int sock, RobValues* DataRob, int largura_x, int largura_y);
void DerrubaObjectoSegundoXX(int sock, RobValues* DataRob, int largura_x, int largura_y);
void ApanhaObjectoHoriz( int sock, RobValues* DataRob, int ObjDetectX, int ObjDetectY);
void Apanha_Obj_Inclinado(int sock, RobValues* DataRob, double** ArrayRob, double** ArrayTemp, double** MatrizTransf);
void GripperClose();
void GripperOpen();
void ExitWithUserMessage(const char *msg, const char *detail);    /* Handle error with user msg*/
void ExitWithSystemMessage(const char *msg);                      /* Handle error with sys msg*/
void Kill_RobotComm(int sock);

//Prototipos de RoCommMove.c
void SetSpeedRobot(int sock, int SpeedInput);
void SetLinearSpeedRobot(int sock, int SpeedInput);
void GetPosition(int sock,double* x,double* y,double* z,double* rx,double* ry,double* rz,char* r1,char* r2,char* r3,int* r4,int* r5,int* r6);
void WaitRobotComm(int sock);
void MovimentoRelativo(int sock,int x_coord,int y_coord,int z_coord,int x_rot,int y_rot,int z_rot);
void MovimentoRelativoLinear(int sock, char* var, int x_coord, int y_coord, int z_coord, int x_rot, int y_rot, int z_rot);       

void MovimentoAbsoluto(int sock, int x_coord,int y_coord,int z_coord,int x_rot,int y_rot,int z_rot);

void SetToolCenterPointer(int sock, int NumberTool, int x, int y, int z, int rx, int ry, int rz);
void SetUserFrame(int sock, int x, int y, int z, int rx, int ry, int rz);
void SetOrientacaoGarra( int sock, double**MatrizTransf, int Xp, int Yp, int Zp, double rotX, double rotY, double rotZ);
void DeslocamentoRefGarra(int sock, double** MatrizTransf, RobValues* DataRob, int EixoMovimento, int ValorDeslocamento, char* TypeVarrimento);
void Ajuste_Orientacao_GarraObj(int sock, RobValues* DataRob, double** ArrayRob, double** ArrayTemp, double** MatrizTransf);
void Condicao_Seguranca_Coordenadas( double x, double y, double z, double rx, double ry, double rz);
enum sizeConstants
{
    BUFSIZE = 512,
};

#endif 