📄 bionet-interface.c
字号:
#include <errno.h>#include <unistd.h>#include <sys/time.h>#include "cortex.h"#include "bionet-interface.h"#include "gui_gtk.h"#include "model_gtk.h"#include "bionet.h"extern GtkWidget *system_status_label;extern GCond *widget_cond;extern GMutex *widget_mutex;int nag_fd;void new_node_callback(bionet_node_t *node);void lost_node_callback(const char *hab_type, const char *hab_id, const char *node_id);void resource_value_callback(bionet_resource_t *resource);void bionet_update_hab_list();void register_callbacks(){ bionet_register_callback_new_node(new_node_callback); bionet_register_callback_lost_node(lost_node_callback); bionet_register_callback_resource_value(resource_value_callback);}void new_node_callback(bionet_node_t *node){ gdk_threads_enter(); model_add_node(node); gdk_threads_leave(); bionet_node_free(node);}void lost_node_callback(const char *hab_type, const char *hab_id, const char *node_id){ //make a fake node to pass to the model bionet_node_t fake_node; fake_node.hab_id = (char *)hab_id; fake_node.hab_type = (char *)hab_type; fake_node.id = (char *)node_id; gdk_threads_enter(); model_remove_node(&fake_node); gdk_threads_leave(); }void resource_value_callback(bionet_resource_t *resource){ gdk_threads_enter(); model_update_resource(resource); gdk_threads_leave(); bionet_resource_free(resource);}bool connect_to_nag(gchar *host){ bionet_set_nag_hostname(host); nag_fd = bionet_connect_to_nag(); if (nag_fd < 0) { debug("nag connection failed!"); gdk_threads_enter(); gtk_label_set_text(GTK_LABEL(system_status_label), "Connection Failed!"); gdk_threads_leave(); return false; } else if (bionet_is_connected()) { if(bionet_subscribe_node_list_by_name_pattern("*.*.*")) { debug("node subscription failed!\n"); gdk_threads_enter(); gtk_label_set_text(GTK_LABEL(system_status_label), "Node subscription Failed!"); gdk_threads_leave(); return false; } if(bionet_subscribe_resource_by_name_pattern("*.*.*:*")) { debug("resource subscription failed!\n"); gdk_threads_enter(); gtk_label_set_text(GTK_LABEL(system_status_label), "Resource subscription Failed!"); gdk_threads_leave(); return false; } } else { debug("Problem connecting to nag"); } gdk_threads_enter(); gtk_label_set_text(GTK_LABEL(system_status_label), "Connected!"); gdk_threads_leave(); return true;}gpointer bionet_interface_main(gpointer p){ while(1) { register_callbacks(); g_mutex_lock(widget_mutex); g_cond_wait(widget_cond, widget_mutex); g_mutex_unlock(widget_mutex); while(!connect_to_nag("bionet-base.colorado.edu")) { debug("Retrying NAG connection"); sleep(1); } gdk_threads_enter(); bionet_update_hab_list(); gdk_threads_leave(); while(bionet_iterate()) ; } return NULL;}void bionet_update_hab_list(){ GSList*hab_list = NULL; bionet_list_all_habs(&hab_list); for(; hab_list != NULL; hab_list = hab_list->next) { bionet_hab_t *hab = hab_list->data; model_add_hab(hab); } g_slist_free(hab_list);}void bionet_update_node_list(gchar *pattern, gint to_lock){ GSList *node_list = NULL; bionet_list_nodes_by_name_pattern(&node_list, pattern); debug("FIXME: Need to implement a gui_update_nodes()"); if(to_lock) gdk_threads_enter(); for(; node_list != NULL; node_list = node_list -> next) { bionet_node_t *node = node_list->data; gui_add_node(node); } if(to_lock) gdk_threads_leave(); g_slist_free(node_list); debug("returning");}bool bionet_iterate(){ int r; fd_set readers; FD_ZERO(&readers); FD_SET(nag_fd, &readers); r = select(nag_fd + 1, &readers, NULL, NULL, NULL); if (r < 0) { debug("Error selecting..."); perror("select(): "); return false; } else if (r == 0) { debug("Shouldn't happen"); } else { bionet_read_from_nag(); bionet_handle_queued_nag_messages(); } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -