
#include <iostream>
#include <ptime.h>
#include <pasync.h>
#include "XmlRpc.h"
#include "Client_Xmlrpc_Terra.h"
#include "Flying_Team_Terra.h"
#include "Interficie_Terra.h"

#define MILISEGONS_CLIENT_POSICIO_ROBOT 1000
#define MILISEGONS_CLIENT_MATERIAL 1000
#define MILISEGONS_CLIENT_TEMPERATURA 1000
#define MILISEGONS_CLIENT_FERRO 1000
#define MILISEGONS_CLIENT_LLUM 1000
#define MILISEGONS_CLIENT_BATERIA 1000
#define MILISEGONS_CLIENT_XRAY 1000
#define MILISEGONS_CLIENT_DADES_COMPLETES 3000


using namespace XmlRpc;

//extern Thread_Client_Terra **thread_client;
extern Control_Comandament_Terra *control_terra;
extern Comunicacio_Interficie_Grafica *comunicacio_interficie;

void Thread_Client_Terra::execute()
{
   XmlRpcClient client(ipMart,portMart);
   XmlRpcValue resultat, argument;
   bool ok = false;
   int tasca_activa = control_terra -> comprovar_Activat();

   while (tasca_activa) {
      std::cout << "EXECUTANT CLIENT " << tasca;
      if(tasca.compare("posicio_robot") == 0) {
         ok = client.execute("get_posicio_robot", argument, resultat);
         if (ok) {
            int x = int(resultat[0]);
            int y = int(resultat[1]);
            int z = int(resultat[2]);
            int angleOrientacio = resultat[3];
            int angleAltura = resultat[4];
            comunicacio_interficie -> set_Posicio_Robot(x,y,z,angleOrientacio,angleAltura);
            relax(MILISEGONS_CLIENT_POSICIO_ROBOT);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("posicio_robot");
         }   
      }
      else if(tasca.compare("material") == 0) {
         ok = client.execute("get_material", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Material(resultat);
            relax(MILISEGONS_CLIENT_MATERIAL);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("material");
         }
      }   
      else if(tasca.compare("nivell_ferro") == 0) {
         ok = client.execute("get_nivell_ferro", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Nivell_Ferro(double(resultat));
            relax(MILISEGONS_CLIENT_FERRO);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("ferro");
         }
      }
      else if(tasca.compare("nivell_llum") == 0) {
         ok = client.execute("get_nivell_llum", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Nivell_Llum(double(resultat));
            relax(MILISEGONS_CLIENT_LLUM);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("llum");
         }
      }
      else if(tasca.compare("temperatura") == 0) {
         ok = client.execute("get_temperatura", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Temperatura(resultat);
            relax(MILISEGONS_CLIENT_TEMPERATURA);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("temperatura");
         }         
      }
      else if(tasca.compare("nivell_bateria") == 0) {
         ok = client.execute("get_bateria", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Nivell_Bateria(resultat);
            relax(MILISEGONS_CLIENT_BATERIA);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("bateria");
         } 
      }
      else if(tasca.compare("nivell_xray") == 0) {
         ok = client.execute("get_xray", argument, resultat);
         if (ok) {
            comunicacio_interficie -> set_Nivell_XRay(double(resultat));
            relax(MILISEGONS_CLIENT_XRAY);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("xray");
         }          
      }
      else if(tasca.compare("dades_completes") == 0) {
         std::cout << "********* CLIENT DEMANA DADES COMPLETES *********"; 
         ok = client.execute("get_dades_completes", argument, resultat);
         if (ok) {
            float x = double(resultat[0]);
            float y = double(resultat[1]);
            float z = double(resultat[2]);
            int angleOrientacio = resultat[3];
            int angleAltura = resultat[4];
            comunicacio_interficie -> set_Posicio_Robot(x,y,z,angleOrientacio,angleAltura);
            comunicacio_interficie -> set_Material(int(resultat[5]));
            comunicacio_interficie -> set_Nivell_Ferro(double(resultat[6]));
            comunicacio_interficie -> set_Nivell_Llum(double(resultat[7]));
            comunicacio_interficie -> set_Temperatura(int(resultat[8]));
            comunicacio_interficie -> set_Nivell_Bateria(int(resultat[9]));
            comunicacio_interficie -> set_Nivell_XRay(double(resultat[10]));
            relax(MILISEGONS_CLIENT_DADES_COMPLETES);
            tasca_activa = control_terra -> comprovar_Activat();
         }
         else {
            tasca_activa = 0;
            comunicacio_interficie -> indicar_Operacio_Fallida("dades_completes");
         }   
      }      
   }     
}   

Thread_Client_Terra::Thread_Client_Terra(char *ipMarsRover, int portMarsRover, const std::string &feina)
   : thread(true), ipMart(ipMarsRover), portMart(portMarsRover), tasca(feina)
{
   // Constructor buit, que inicialitza les variables internes
}


