
/**
* ===================================================================================================
 *
 *       \file  callbacks.c 
 *      \brief  Ficheiro que contém todas as callbacks da interface gráfica e funções de alteração da interface.
 *
 * ===================================================================================================
 */


#include "interface.h"
#include "header.h"

/**
 * @brief  Função para iniciar a comunicação
 * @param  Widget and user data
 * @return void
 */
void Init_comunication(GtkWidget * widget, gpointer user_data)
{
	printf("Connect RS232 !!\n");
			
	GtkWidget* connect=GTK_WIDGET(gtk_builder_get_object (builderG, "menuitem3"));
	gtk_widget_set_sensitive(connect, FALSE);			
	GtkWidget* disconnect=GTK_WIDGET(gtk_builder_get_object (builderG, "separatormenuitem1"));
	gtk_widget_set_sensitive(disconnect, TRUE);		
	
	GtkWidget* Port0=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port0"));
	gtk_widget_set_sensitive(Port0, FALSE);		
	GtkWidget* Port1=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port1"));
	gtk_widget_set_sensitive(Port1, FALSE);		
	GtkWidget* Port2=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port2"));
	gtk_widget_set_sensitive(Port2, FALSE);		
	GtkWidget* Alterar_button=GTK_WIDGET(gtk_builder_get_object (builderG, "Alterar_button"));
	gtk_widget_set_sensitive(Alterar_button, FALSE);		
	

	shm_env->type = 20;
	
}

/**
 * @brief  Função para terminar a comunicação
 *
 * @param  Widget and user data
 * @return void
 */
void End_comunication(GtkWidget * widget, gpointer user_data)
{
	printf("Disconnect RS232 !!\n");
	GtkWidget* connect=GTK_WIDGET(gtk_builder_get_object (builderG, "menuitem3"));
	gtk_widget_set_sensitive(connect, TRUE);				
	GtkWidget* disconnect=GTK_WIDGET(gtk_builder_get_object (builderG, "separatormenuitem1"));
	gtk_widget_set_sensitive(disconnect, FALSE);		

	GtkWidget* Port0=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port0"));
	gtk_widget_set_sensitive(Port0, TRUE);		
	GtkWidget* Port1=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port1"));
	gtk_widget_set_sensitive(Port1, TRUE);		
	GtkWidget* Port2=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port2"));
	gtk_widget_set_sensitive(Port2, TRUE);		

	shm_env->type = 22;
	shm_env->param1 = 22;
	shm_env->param2 = 22;
	
}

/**
 * @brief  Funções para escolher a porta série
 *
 * @param  Widget and user data
 * @return void
 */

void USB_Port0_button(GtkWidget * widget, gpointer user_data)
{
	printf("Escolheu a porta 0 !!\n");
	GtkWidget* Port1=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port1"));
	gtk_widget_set_sensitive(Port1, FALSE);		
	GtkWidget* Port2=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port2"));
	gtk_widget_set_sensitive(Port2, FALSE);		
	GtkWidget* Alterar_button=GTK_WIDGET(gtk_builder_get_object (builderG, "Alterar_button"));
	gtk_widget_set_sensitive(Alterar_button, TRUE);		
	
	shm_env->type = 39;
	shm_env->param1 = 39;
	shm_env->param2 = 39;	
}

void USB_Port1_button(GtkWidget * widget, gpointer user_data)
{
	printf("Escolheu a porta 1 !!\n");
	GtkWidget* Port0=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port0"));
	gtk_widget_set_sensitive(Port0, FALSE);		
	GtkWidget* Port2=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port2"));
	gtk_widget_set_sensitive(Port2, FALSE);		
	GtkWidget* Alterar_button=GTK_WIDGET(gtk_builder_get_object (builderG, "Alterar_button"));
	gtk_widget_set_sensitive(Alterar_button, TRUE);		
	
	shm_env->type = 40;
	shm_env->param1 = 40;
	shm_env->param2 = 40;	
}

void USB_Port2_button(GtkWidget * widget, gpointer user_data)
{
	printf("Escolheu a porta 2 !!\n");
	GtkWidget* Port0=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port0"));
	gtk_widget_set_sensitive(Port0, FALSE);		
	GtkWidget* Port1=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port1"));
	gtk_widget_set_sensitive(Port1, FALSE);		
	GtkWidget* Alterar_button=GTK_WIDGET(gtk_builder_get_object (builderG, "Alterar_button"));
	gtk_widget_set_sensitive(Alterar_button, TRUE);		
	
	shm_env->type = 41;
	shm_env->param1 = 41;
	shm_env->param2 = 41;	
}

void Alterar_button(GtkWidget * widget, gpointer user_data)
{
	GtkWidget* Port0=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port0"));
	gtk_widget_set_sensitive(Port0, TRUE);		
	GtkWidget* Port1=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port1"));
	gtk_widget_set_sensitive(Port1, TRUE);			
	GtkWidget* Port2=GTK_WIDGET(gtk_builder_get_object (builderG, "USB_Port2"));
	gtk_widget_set_sensitive(Port2, TRUE);			
	
}


/**
 * @brief   Função para processar o sinal do botão da janela de alerta na abertura da porta serie
 *
 * @param  Widget and user data
 * @return void
 */
void on_button_hide(GtkWidget * widget, gpointer user_data)
{
	if(shm_env->type == 50)
	{
// 		printf("Esconde janela\n");
		GtkWidget *window = GTK_WIDGET(gtk_builder_get_object (builderG, "window2"));
		gtk_widget_hide (window);
	}
}


/**
 * @brief  Função para actualizar a comunicação
 *
 * @param  Widget and user data
 * @return void
 */
void button_actualizar(GtkWidget * widget, gpointer user_data)
{
// 	printf("Fez pedido de actualização !!\n");
	shm_env->type = 0;
	shm_env->param1 = 0;
	shm_env->param2 = 0;
	
}


void Signal_rc( int x)
{	
/*	printf("Pai:Recebi o teu sinal filho\n");
	printf("Tipo: %d\n",shm_rec->type);	
	printf("Numero: %x\n",shm_rec->param1);	
	printf("Mensg recebida: %x\n",shm_rec->param2);	*/

	if(shm_env->command == RS232)
	{
		GtkWidget*img6=GTK_WIDGET(gtk_builder_get_object (builderG, "image6"));
	// 	printf("cheguei aqui\n");
		printf("Tipo: %d\n",shm_env->type);	
		if(shm_env->type == 25)
		{
			gtk_image_set_from_stock(GTK_IMAGE(img6),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);	
		}
		else if(shm_env->type == 27)
		{
			gtk_image_set_from_stock(GTK_IMAGE(img6),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);		
		}
		else if(shm_env->type == 50)
		{
			printf("Mostra janela\n");
			GtkWidget *window = GTK_WIDGET(gtk_builder_get_object (builderG, "window2"));
			gtk_widget_show (window);
		}
	}

	GtkWidget* img1=GTK_WIDGET(gtk_builder_get_object (builderG, "image1"));
	GtkWidget* img2=GTK_WIDGET(gtk_builder_get_object (builderG, "image2"));
	GtkWidget* img3=GTK_WIDGET(gtk_builder_get_object (builderG, "image3"));
	GtkWidget* img4=GTK_WIDGET(gtk_builder_get_object (builderG, "image4"));
	GtkWidget* img5=GTK_WIDGET(gtk_builder_get_object (builderG, "image5"));
	GtkWidget* img7=GTK_WIDGET(gtk_builder_get_object (builderG, "image7"));
	
  	GtkAdjustment* adj_dist=GTK_ADJUSTMENT(gtk_builder_get_object (builderG, "adjustment3"));	
	GtkAdjustment* adj_servo=GTK_ADJUSTMENT(gtk_builder_get_object (builderG, "adjustment4"));	
	GtkAdjustment* adj_temp=GTK_ADJUSTMENT(gtk_builder_get_object (builderG, "adjustment2"));	
	
	if (shm_rec->type==ESTADO)
    {
			if (shm_rec->param1==LEDS)
			{
				if(shm_rec->param2==0x01)
					gtk_image_set_from_stock(GTK_IMAGE(img1),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
				else if(shm_rec->param2==0x00)
					gtk_image_set_from_stock(GTK_IMAGE(img1),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);					  
			}		
			else if (shm_rec->param1==ILUMINACAO)
			{
				if(shm_rec->param2==0x01)
					gtk_image_set_from_stock(GTK_IMAGE(img4),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
				else if(shm_rec->param2==0x00)
					gtk_image_set_from_stock(GTK_IMAGE(img4),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);					  
			}		
			else if (shm_rec->param1==VALVO)
			{
				if(shm_rec->param2==0x01)
					gtk_image_set_from_stock(GTK_IMAGE(img3),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
			}		
			else if (shm_rec->param1==VALVC)
			{
				if(shm_rec->param2==0x00)
					gtk_image_set_from_stock(GTK_IMAGE(img3),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);
			}
			else if (shm_rec->param1==PONTEIRO)
			{
				if(shm_rec->param2==0x01)
					gtk_image_set_from_stock(GTK_IMAGE(img2),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
				else if(shm_rec->param2==0x00)
					gtk_image_set_from_stock(GTK_IMAGE(img2),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);					  
			}
	}
	else if (shm_rec->type==MOTORES)
	{
/*			printf("motores - calback\n");	
			printf("Type motor: %d\n",MOTORES);
			printf("Type motor: %d\n",shm_rec->type);
			printf("Num do motor: %x\n",shm_rec->param1);*/
			if (shm_rec->param1==SERVO)
			{				
// 				printf("Bara do servo actualizada !!\n");
				gdouble serv_double;
				unsigned int serv_int;
				serv_int=shm_rec->param2;
				serv_double=(double)serv_int;
				gtk_adjustment_set_value (adj_servo, serv_double);
			}
			else if (shm_rec->param1==VENTOINHA)
			{
// 				printf("liga ventoínha !!\n");
				if(shm_rec->param2==0x01)
					gtk_image_set_from_stock(GTK_IMAGE(img5),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
				else if(shm_rec->param2==0x00)
					gtk_image_set_from_stock(GTK_IMAGE(img5),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);					  
			}
				
	}
	else if (shm_rec->type==DISTANCIA)		
	{
			
// 			printf("Bara de distancia actualizada !!\n");
            if (shm_rec->param1==SENS2)
            {                               

                gdouble dist_double;

                unsigned int dist_int=shm_rec->param2;
                double exp=-1.047;
                dist_double=(double)dist_int;
                double dist_mm =16291 * pow( dist_int, exp );
//                 printf("O valor e: %f\n",dist_mm);
                gtk_adjustment_set_value (adj_dist, dist_mm);
            }

	}
	else if (shm_rec->type==TEMPERATURA)				
	{
// 			printf("Bara da temperatura actualizada !!\n");
			gdouble temp_double;
			unsigned int temp_int;
			temp_int=shm_rec->param2;
			temp_double=(double)temp_int;
			gtk_adjustment_set_value (adj_temp, temp_double);
	}		
	else if (shm_rec->type==GARRA)						
	{		
// 			printf("Ligação da garra !!\n");
			if(shm_rec->param2==0x01)
				gtk_image_set_from_stock(GTK_IMAGE(img7),GTK_STOCK_APPLY,GTK_ICON_SIZE_BUTTON);
			else if(shm_rec->param2==0x00)
				gtk_image_set_from_stock(GTK_IMAGE(img7),GTK_STOCK_STOP,GTK_ICON_SIZE_BUTTON);					  		
	}  
	
}



/**
 * @brief  Funçao para se controlar a posição do servomotor
 *
 * @param  Widget and user data
 * @return void
 */
void on_adjustment_changed(GtkWidget * widget, gpointer user_data)  	/*O primeiro valor é o que deu origem a chamada da função*/
{
	gdouble  value;
	int value_int;
	value = gtk_adjustment_get_value(GTK_ADJUSTMENT(widget));
// 	printf("Valor da vertical scale: %lf\n",value);
	value_int=(int)value;
	shm_env->type = MOTORES;
    shm_env->param1 = SERVO;
    shm_env->param2 = value_int;

}


/**
 * @brief  Funçao para centrar a posição do servomotor
 *
 * @param  Widget and user data
 * @return void
 */
void button_centrar_servo(GtkWidget * widget, gpointer user_data) 
{
	int value_servo=15;
	
	shm_env->type = MOTORES;
    shm_env->param1 = SERVO;
    shm_env->param2 = value_servo;
	printf("Centrar servo !!");

}


/**
 * @brief  Funçoes para processar os sinais dos botoes dos leds de diagonóstico
 *
 * @param  Widget and user data
 * @return void
 */
void on_button_leds(GtkWidget * widget, gpointer user_data)
{
	printf("Liga leds !!\n");
	GtkWidget* bt_1=GTK_WIDGET(gtk_builder_get_object (builderG, "button1_on"));
	gtk_widget_set_sensitive(bt_1, FALSE);
	GtkWidget* bt_2=GTK_WIDGET(gtk_builder_get_object (builderG, "button2"));
	gtk_widget_set_sensitive(bt_2, TRUE);

    shm_env->type = ESTADO;
    shm_env->param1 = LEDS;
    shm_env->param2 = 1;
	
}


void off_button_led(GtkWidget * widget, gpointer user_data)
{
// 	printf("Desliga leds !!\n");
	GtkWidget* bt_2=GTK_WIDGET(gtk_builder_get_object (builderG, "button2"));
	gtk_widget_set_sensitive(bt_2, FALSE);	
	GtkWidget* bt_1=GTK_WIDGET(gtk_builder_get_object (builderG, "button1_on"));
	gtk_widget_set_sensitive(bt_1, TRUE);	
	shm_env->type = ESTADO;
    shm_env->param1 = LEDS;
    shm_env->param2 = 0;
	
}

/**
 * @brief  Funçoes para processar os sinais dos botoes do laser 
 *
 * @param  Widget and user data
 * @return void
 */

void on_button_laser(GtkWidget * widget, gpointer user_data)
{
// 	printf("Liga laser !!\n");
	GtkWidget* bt_3=GTK_WIDGET(gtk_builder_get_object (builderG, "button3"));	
	gtk_widget_set_sensitive(bt_3, FALSE);	
	GtkWidget* bt_4=GTK_WIDGET(gtk_builder_get_object (builderG, "button4"));	
	gtk_widget_set_sensitive(bt_4, TRUE);	
	shm_env->type = ESTADO;
    shm_env->param1 = PONTEIRO;
    shm_env->param2 = 1;
	
}


void off_button_laser(GtkWidget * widget, gpointer user_data)
{
// 	printf("Desliga laser !!\n");
	GtkWidget* bt_4=GTK_WIDGET(gtk_builder_get_object (builderG, "button4"));	
	gtk_widget_set_sensitive(bt_4, FALSE);	
	GtkWidget* bt_3=GTK_WIDGET(gtk_builder_get_object (builderG, "button3"));	
	gtk_widget_set_sensitive(bt_3, TRUE);		
	shm_env->type = ESTADO;
    shm_env->param1 = PONTEIRO;
    shm_env->param2 = 0;
	
}


/**
 * @brief  Funçoes para processar os sinais dos botoes da garra 
 *
 * @param  Widget and user data
 * @return void
 */

void on_button_garra(GtkWidget * widget, gpointer user_data)
{
// 	printf("Abre garra !!\n");
	GtkWidget* bt_5=GTK_WIDGET(gtk_builder_get_object (builderG, "button5"));	
	gtk_widget_set_sensitive(bt_5, FALSE);	
	GtkWidget* bt_6=GTK_WIDGET(gtk_builder_get_object (builderG, "button6"));	
	gtk_widget_set_sensitive(bt_6, TRUE);	    
    
    int i;        
    shm_env->type = ESTADO;
    shm_env->param1 = VALVO;
    shm_env->param2 = 1;
    for(i=0;i<=50000000;i++){}
    shm_env->type = ESTADO;
    shm_env->param1 = VALVC;
    shm_env->param2 = 0;
	
}

void off_button_garra(GtkWidget * widget, gpointer user_data)
{
// 	printf("Fecha garra !!\n");
	GtkWidget* bt_6=GTK_WIDGET(gtk_builder_get_object (builderG, "button6"));	
	gtk_widget_set_sensitive(bt_6, FALSE);	
	GtkWidget* bt_5=GTK_WIDGET(gtk_builder_get_object (builderG, "button5"));	
	gtk_widget_set_sensitive(bt_5, TRUE);		
    
    int i;    
    shm_env->type = ESTADO;
    shm_env->param1 = VALVC;
    shm_env->param2 = 1;
    for(i=0;i<=50000000;i++){}
    shm_env->type = ESTADO;
    shm_env->param1 = VALVO;
    shm_env->param2 = 0;
}


/**
 * @brief  Funçoes para processar os sinais dos botoes da ilumicação localizada 
 *
 * @param  Widget and user data
 * @return void
 */


void on_button_ilum(GtkWidget * widget, gpointer user_data)
{
// 	printf("Liga ilumicação !!\n");
	GtkWidget* bt_7=GTK_WIDGET(gtk_builder_get_object (builderG, "button7"));
	gtk_widget_set_sensitive(bt_7, FALSE);	
	GtkWidget* bt_8=GTK_WIDGET(gtk_builder_get_object (builderG, "button8"));
	gtk_widget_set_sensitive(bt_8, TRUE);		
	shm_env->type = ESTADO;
    shm_env->param1 = ILUMINACAO;
    shm_env->param2 = 1;
	
}

void off_button_ilum(GtkWidget * widget, gpointer user_data)
{
// 	printf("Desliga ilumicação !!\n");
	GtkWidget* bt_8=GTK_WIDGET(gtk_builder_get_object (builderG, "button8"));
	gtk_widget_set_sensitive(bt_8, FALSE);	
	GtkWidget* bt_7=GTK_WIDGET(gtk_builder_get_object (builderG, "button7"));
	gtk_widget_set_sensitive(bt_7, TRUE);		
	shm_env->type = ESTADO;
    shm_env->param1 = ILUMINACAO;
    shm_env->param2 = 0;
}


/**
 * @brief  Funçoes para processar os sinais da ventoínha 
 *
 * @param  Widget and user data
 * @return void
 */

void on_button_Ventoinha(GtkWidget * widget, gpointer user_data)
{
// 	printf("Liga ventoínha !!\n");
	GtkWidget* bt_9=GTK_WIDGET(gtk_builder_get_object (builderG, "button9"));
	gtk_widget_set_sensitive(bt_9, FALSE);	
	GtkWidget* bt_10=GTK_WIDGET(gtk_builder_get_object (builderG, "button10"));
	gtk_widget_set_sensitive(bt_10, TRUE);	
	
    shm_env->type = MOTORES;
    shm_env->param1 = VENTOINHA;
    shm_env->param2 = 1;
	
}

void off_button_Ventoinha(GtkWidget * widget, gpointer user_data)
{
// 	printf("Desliga ventoínha !!\n");
	GtkWidget* bt_10=GTK_WIDGET(gtk_builder_get_object (builderG, "button10"));
	gtk_widget_set_sensitive(bt_10, FALSE);	
	GtkWidget* bt_9=GTK_WIDGET(gtk_builder_get_object (builderG, "button9"));
	gtk_widget_set_sensitive(bt_9, TRUE);		
	shm_env->type = MOTORES;
    shm_env->param1 = VENTOINHA;
    shm_env->param2 = 0;
}


/**
 * @brief  Função para fechar o programa com o Ctrl C
 *
 * @param  Widget and user data
 * @return void
 */
void Kill_Interfe(int x)
{
    if(kill(0 , SIGUSR1)==-1)
            perror("Pai\n");    
    
    shmdt (shm_rec);
    shmdt (shm_env);
    /*Eliminar as Sharememory*/
    if(shmctl(shm_id_rec, IPC_RMID, NULL)==0) 
        printf("Foi limpa a sharememory de recepção !\n");
    if(shmctl(shm_id_env, IPC_RMID, NULL)==0) 
        printf("Foi limpa a sharememory de envio !\n");

    printf("Vai fechar a interface !!\n");  
    gtk_main_quit();
}


/**
 * @brief  Função para detectar o fecho forçado da janela principal
 *
 * @param  Widget and user data
 * @return gboolean
 */
gboolean delete_event(GtkWidget*widget,GdkEvent *event,gpointer data)
{
	if(kill(0 , SIGUSR1)==-1)
			perror("Pai\n");	
	
	shmdt (shm_rec);
	shmdt (shm_env);
 	/*Eliminar as Sharememory*/
	if(shmctl(shm_id_rec, IPC_RMID, NULL)==0) 
		printf("Foi limpa a sharememory de recepção !\n");
	if(shmctl(shm_id_env, IPC_RMID, NULL)==0) 
		printf("Foi limpa a sharememory de envio !\n");

	printf("Vai fechar a interface !!\n");	
	gtk_main_quit();
	return 0;
}


/**
 * @brief  Função para sair da interface
 *
 * @param  Widget and user data
 * @return void
 */
void Signal_quit(GtkWidget * widget, gpointer user_data)
{			
	if(kill(0 , SIGUSR1)==-1)
			perror("Pai\n");	
	
	shmdt (shm_rec);
	shmdt (shm_env);
 	/*Eliminar as Sharememory*/
	if(shmctl(shm_id_rec, IPC_RMID, NULL)==0) 
		printf("Foi limpa a sharememory de recepção !\n");
	if(shmctl(shm_id_env, IPC_RMID, NULL)==0) 
		printf("Foi limpa a sharememory de envio !\n");

	printf("Pai: Vai fechar a interface !!\n");	
	gtk_main_quit();
}