📄 app4.4.c
字号:
gtk_box_pack_start (GTK_BOX (hbox), button_apply, TRUE, TRUE, 5);
//cancel button
button_cancel = create_button (stock_item[1],"Cancel");
g_signal_connect (G_OBJECT (button_cancel), "clicked", G_CALLBACK (cancel_click), (gpointer) key);
gtk_box_pack_start (GTK_BOX (hbox), button_cancel, TRUE, TRUE, 5);
/*init button close and add signal*/
button_close = create_button (stock_item[2],"Close");
g_signal_connect_swapped (G_OBJECT (button_close), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (dialog_alarm));
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog_alarm)->action_area), button_close, TRUE, TRUE, 5);
/* show all dialog_alarm */
gtk_widget_show_all (dialog_alarm);
}
/**************************************************************************
* Create Date : 02/11/2009
* Creator Name : Tran Chi Nghia
* Decription : process for event button Channel was clicked in form control device.
* Parameter : 2
"button" (I) : object send signal to function
"data" (I) : data recive after event has been send
* Return : none
***************************************************************************/
void function_channel (GtkWidget* button, gint8 data)
{
/* variable for 4 channel button */
int key = data;
int i;
gchar* arr_string [5]= {"Channel 1","Channel 2","Channel 3","Channel 4","Cancel"};
gchar* arr_stock_icon [2]= { GTK_STOCK_MEDIA_PLAY , GTK_STOCK_CANCEL};
GtkWidget *arr_button[5];
GtkWidget *vbutton_box;
/* init form contain 4 channel buttons */
dialog_channel = gtk_dialog_new_with_buttons ("", NULL,
GTK_DIALOG_MODAL,
NULL);
/* modify form */
gtk_dialog_set_has_separator (GTK_DIALOG (dialog_channel), FALSE);
gtk_widget_set_size_request (dialog_channel,150,260);
/* init container contain all channel button and cancel button */
vbutton_box = gtk_vbutton_box_new ();
/*set properties of container*/
gtk_vbutton_box_set_spacing_default (5);
/*add container to dialog_channel*/
gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dialog_channel)->vbox), vbutton_box);
/* create button channels and assigned function process for event clicked */
for(i=0; i < 4; i++)
{
int key = i;
arr_button[i]= create_button (arr_stock_icon[0], arr_string[i]);
gtk_box_pack_start_defaults (GTK_BOX (vbutton_box), arr_button[i]);
/*connect signal to buttons*/
g_signal_connect (G_OBJECT (arr_button[i]), "clicked", G_CALLBACK (send_channel), (gpointer) key);
/*connect_swapped destroy dialog */
g_signal_connect_swapped (G_OBJECT (arr_button[i]), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (dialog_channel));
}
/* init cancel button in channel form*/
arr_button[4]= create_button (arr_stock_icon[1], arr_string[4]);
/*add button Cancel to vbutton box container*/
gtk_box_pack_start_defaults (GTK_BOX (vbutton_box), arr_button[4]);
/* add signal delete form channel to button Cancel*/
g_signal_connect_swapped (G_OBJECT (arr_button[i]), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (dialog_channel));
/* show all dialog channel */
gtk_widget_show_all (dialog_channel);
}
/**************************************************************************
* Create Date : 02/11/2009
* Creator Name : Tran Chi Nghia
* Decription : process for event channel button was clicked in channel dialog form.
* Parameter : 2
"button" (I) : object send signal to function
"data" (I) : data recive after event has been send
* Return : none
***************************************************************************/
void send_channel (GtkWidget* button, gint8 data)
{
/* depends on device, send data to server */
send_buffer [1] = 4;
switch (data)
{
case 0:
/*send data to server*/
send_buffer [0] = 3;
break;
case 1:
send_buffer [0] = 4;
break;
case 2:
send_buffer [0] = 5;
break;
case 3:
send_buffer [0] = 6;
break;
default:
break;
}
if ( write(sockfd,send_buffer,2) < 0 )
perror("ERROR writing to socket");
}
/**************************************************************************
* Create Date : 02/11/2009
* Creator Name : Tran Chi Nghia
* Decription : create socket to connect to server and send signal to server update data for MID .
* Parameter : none
* Return : none
***************************************************************************/
void create_socket ()
{
/* create socket*/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
/*set serv_addr to zero*/
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
inet_aton("192.168.3.22",&serv_addr.sin_addr.s_addr);
serv_addr.sin_port = htons(PORT);
/*connect to server*/
if ( connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr) ) <0)
{
message_form ("Disconnect to server!!");
exit (1);
}
/* send data to server for update database in MID*/
send_buffer [0] = 20;
send_buffer [1] = 0;
if ( write(sockfd,send_buffer,256) < 0 )
perror("ERROR writing to socket");
}
/**************************************************************************
* Create Date : 02/11/2009
* Creator Name : Tran Chi Nghia
* Decription : process for event channel button was clicked in channel dialog form.
* Parameter : 2
"data" (I) : data recive after event has been send
* Return : none
***************************************************************************/
void *do_thread_recive (void *data)
{
int i,k;
/* read recive buffer */
while ( read ( sockfd, recive_buffer, 256) > 0 )
{
if (recive_buffer != NULL)
{
/* check recive_buffer[0] for all case*/
gint8 rc = recive_buffer[0];
switch (rc)
{
/* device open */
case 0 :
/* change in array state device */
G_LOCK (state_arr);
state_arr[recive_buffer[1]] = 1;
G_UNLOCK (state_arr);
/* lcok thread */
gdk_threads_enter();
/*check recvie_buffer[1] for info about device*/
switch (recive_buffer[1])
{
/* change icon in main form window at tab Active_device and Unactive_device*/
case 0 :
gtk_widget_reparent (arr_active_unactive[0], arr_hbutton_box[1] );
break;
case 1 :
gtk_widget_reparent (arr_active_unactive[1], arr_hbutton_box[1] );
break;
case 2 :
gtk_widget_reparent (arr_active_unactive[2], arr_hbutton_box[1] );
break;
case 3 :
gtk_widget_reparent (arr_active_unactive[3], arr_hbutton_box[1] );
break;
case 4:
gtk_widget_reparent (arr_active_unactive[4], arr_hbutton_box[1] );
break;
default:
break;
}
/* update data*/
gdk_flush ();
/* unlock thread */
gdk_threads_leave();
break;
/*device close*/
case 1 :
/* change in array state device */
G_LOCK (state_arr);
state_arr[recive_buffer[1]] = 0;
G_UNLOCK (state_arr);
/* lock thread */
gdk_threads_enter();
switch (recive_buffer[1])
{
case 0 :
gtk_widget_reparent (arr_active_unactive[0], arr_hbutton_box[2] );
break;
case 1 :
gtk_widget_reparent (arr_active_unactive[1], arr_hbutton_box[2] );
break;
case 2 :
gtk_widget_reparent (arr_active_unactive[2], arr_hbutton_box[2] );
break;
case 3 :
gtk_widget_reparent (arr_active_unactive[3], arr_hbutton_box[2] );
break;
case 4:
gtk_widget_reparent (arr_active_unactive[4], arr_hbutton_box[2] );
break;
default:
break;
}
/* update data*/
gdk_flush ();
/* unlock thread */
gdk_threads_leave();
break;
case 2: //open all
i =0;
G_LOCK (state_arr);
for (i =0; i< NUMBER_DEVICE; i++)
{
state_arr[i] = 1;
}
G_UNLOCK (state_arr);
/*lock thread*/
gdk_threads_enter();
for (i =0; i < NUMBER_DEVICE; i++)
{
/*change object to Active_device tabs*/
gtk_widget_reparent (arr_active_unactive[i], arr_hbutton_box[1] );
}
/*update data*/
gdk_flush ();
/* unlock thread */
gdk_threads_leave();
break;
case 3: //close all
G_LOCK (state_arr);
i = 0;
for (i =0; i< NUMBER_DEVICE; i++)
{
state_arr[i] = 0;
}
G_UNLOCK (state_arr);
gdk_threads_enter();
for (i =0; i < NUMBER_DEVICE; i++)
{
gtk_widget_reparent (arr_active_unactive[i], arr_hbutton_box[2] );
}
gdk_flush ();
gdk_threads_leave();
break;
case 20 : // server start , update data
G_LOCK (state_arr);
i =0;
/*update state of all devices */
for (i =0; i <NUMBER_DEVICE; i++)
{
state_arr[i] = recive_buffer[i+1];
}
G_UNLOCK (state_arr);
gdk_threads_enter();
/* insert active device and unactive device to tab Actice and Unactive*/
for (i =0; i <NUMBER_DEVICE; i++)
{
if (state_arr[i] ==1 )
{
gtk_widget_reparent (arr_active_unactive[i], arr_hbutton_box[1] );
}
else
{
gtk_widget_reparent (arr_active_unactive[i], arr_hbutton_box[2] );
}
}
gdk_flush ();
gdk_threads_leave();
break;
case 5: // server die
gdk_threads_enter();
/*message and exit program*/
message_form ("Disconnect to server");
exit (1);
gdk_flush ();
gdk_threads_leave();
break;
case 9: //interrupt
// change state of device
G_LOCK (state_arr);
state_arr[recive_buffer[1]] = 0;
G_UNLOCK (state_arr);
/*change icon in main form*/
gdk_threads_enter();
switch (recive_buffer[1])
{
case 0 :
gtk_widget_reparent (arr_active_unactive[0], arr_hbutton_box[2] );
break;
case 1 :
gtk_widget_reparent (arr_active_unactive[1], arr_hbutton_box[2] );
break;
case 2 :
gtk_widget_reparent (arr_active_unactive[2], arr_hbutton_box[2] );
break;
case 3 :
gtk_widget_reparent (arr_active_unactive[3], arr_hbutton_box[2] );
break;
case 4:
gtk_widget_reparent (arr_active_unactive[4], arr_hbutton_box[2] );
break;
default:
break;
}
message_form ("Have a device break!!");
gdk_flush ();
gdk_threads_leave();
break;
case 90: //report
G_LOCK (data_buffer);
i =1;
/* read infomation about database from recive_buffer */
for ( k = 0; k < 10; k++)
{
data_buffer[k].id_device = recive_buffer[i];
data_buffer[k].id_user = recive_buffer[i+1];
data_buffer[k].id_event = recive_buffer[i+2];
data_buffer[k].minute = recive_buffer[i+3];
data_buffer[k].hour = recive_buffer[i+4];
data_buffer[k].day = recive_buffer[i+5];
data_buffer[k].month = recive_buffer[i+6];
data_buffer[k].year = recive_buffer[i+7];
i = i+8;
}
G_UNLOCK (data_buffer);
gdk_threads_enter();
/* copy database to list */
for ( k = 0; k < 10; k++)
{
list[k].device_name = all_device [data_buffer[k].id_device].name;
if (data_buffer[k].id_user == 9)
{
list[k].user_name = "Unknown";
}
else
{
list[k].user_name = all_user [data_buffer[k].id_user].usr;
}
if (data_buffer[k].id_event == 1)
{
list[k].event = "Close";
}
else if ( data_buffer[k].id_event == 0)
{
list[k].event = "Open";
}
else
{
list[k].event = "Interrupt";
}
list[k].minute = data_buffer[k].minut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -