📄 callbacks.cc
字号:
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <string.h>#include <gdk/gdkkeysyms.h>#include <gtk/gtk.h>#include <glib.h>#include <sim.h>#include <param.h>#include <geom.h>#include "support.h"#include "callbacks.h"sem_t simAreaUpdate_S;sem_t simArea_S;sem_t simAreaBB_S;sem_t simRobotsBB_S;int gui_stepping=0;guint contextId;guint lastMsg=0;guint currMsg=0;#define gui_print(msg) { currMsg = gtk_statusbar_push(GTK_STATUSBAR(statusbar1),contextId,msg); gtk_statusbar_remove(GTK_STATUSBAR(statusbar1),contextId,lastMsg); lastMsg=currMsg;} gushort pal[6][3]={{0xffff,0xffff,0xffff}, {0x0,0x0,0x0}, {0x0,0x0,0xffff}, {0xffff,0x0,0x0}, {0x0,0xffff,0x0}, {0xffff,0xffff,0x0}};/* Window */GtkWidget *window;GtkWidget *vbox_window;GtkWidget *menubar_window;GtkWidget *file_menubar;GtkWidget *file_menu;GtkAccelGroup *file_menu_accels;GtkWidget *quit_menu_item;GtkWidget *table_vbox;GtkWidget *sim_frame_table;GtkWidget *vbox_sim_frame;GtkWidget *toolbar_vbox_sim_frame;GtkWidget *tmp_toolbar_icon;GtkWidget *run_btn;GtkWidget *paus_btn;GtkWidget *step_btn;GtkWidget *evolution_tgl;GtkWidget *simulatorArea;GtkWidget *draw_frame_table;GtkWidget *vbox_draw_frame;GtkWidget *robot_frame_vbox;GtkWidget *vbox_robot_frame;GtkWidget *toolbar8;GtkWidget *wheel_rbtn;GtkWidget *arrow_rbtn;GtkWidget *toolbar10;GtkWidget *body_tgl;GtkWidget *trace_tgl;GtkWidget *Robots_frm;GtkWidget *draw_tgl;GtkWidget *generation_progress_bar;GtkWidget *statusbar1;GtkAdjustment *adj;/* end window */GtkWidget **simRobots;GtkWidget *window1;GtkWidget *simArea; /* simArea widget */GdkPixmap *bb_simArea; /* simArea backbuffer */GdkPixmap *bg_simArea; /* simArea background */GdkPixmap **bb_simRobots;GdkColormap *cm_simArea; /* simArea colormap */GdkColor **pal_simArea; /* simArea colors */const gchar defaultFontName[]="-*-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-1";GdkFont *defaultFont;GdkGC *pen_simArea;GdkGC *blit_simArea;GdkGC *internal_blit_simArea;gint colors = 256;gint definedColors = 6;guint simAreaTimer;/* Simulator area size, robotbody and robottype*/int sim_area_x_size=200;int sim_area_y_size=200;BOOL_T robotBody = BFALSE;BOT_T robotType = WHEEL;int sensorAreaVisible=0;/* Prototypes */gint init_pal(gpointer *data);gint on_progress_update(gpointer *);gint on_gui_update(gpointer*);void on_expose_event(GtkWidget *w, gpointer user_data);GtkWidget * create_main_window();void gui_setWorldSize(int x, int y){ sim_area_x_size = x; sim_area_y_size = y;}void gui_init(){ GtkWidget *rob_frm; GtkWidget *tmp; GtkWidget *v1,*v2; GtkWidget **distribute; gchar str[6]; sem_init(&simAreaUpdate_S,0,0); sem_init(&simArea_S,0,0); sem_init(&simAreaBB_S,0,1); sem_init(&simRobotsBB_S,0,1); notTrajactoryRobot = 1; /* init simulator area */ window1 = create_main_window(); gtk_widget_show(window1); contextId = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar1),"User messages"); lastMsg = gtk_statusbar_push(GTK_STATUSBAR(statusbar1),contextId,"User Interface Started"); simArea = lookup_widget(window1,"simulatorArea"); gtk_signal_connect(GTK_OBJECT(simArea),"expose_event", GTK_SIGNAL_FUNC(on_expose_event), NULL); bb_simArea = gdk_pixmap_new(simArea->window, sim_area_x_size, sim_area_y_size, -1); bb_simArea = gdk_pixmap_ref(bb_simArea); bg_simArea = gdk_pixmap_new(simArea->window, sim_area_x_size, sim_area_y_size, -1); bg_simArea = gdk_pixmap_ref(bg_simArea); /* Font */ defaultFont = gdk_font_load(defaultFontName); defaultFont = gdk_font_ref(defaultFont); /* Robot windows */ rob_frm = lookup_widget(window1,"Robots_frm"); tmp = gtk_hbox_new (FALSE, 0); gtk_widget_ref (tmp); gtk_object_set_data_full (GTK_OBJECT (window1), "rob_hbox", tmp, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (tmp); gtk_container_add (GTK_CONTAINER (rob_frm), tmp); v1 = gtk_toolbar_new(GTK_ORIENTATION_VERTICAL,GTK_TOOLBAR_ICONS); gtk_widget_ref(v1); gtk_object_set_data_full(GTK_OBJECT (window1), "v1", v1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (v1); gtk_box_pack_start (GTK_BOX (tmp), v1, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (v1), 1); v2 = gtk_toolbar_new(GTK_ORIENTATION_VERTICAL,GTK_TOOLBAR_ICONS); gtk_widget_ref(v2); gtk_object_set_data_full (GTK_OBJECT (window1), "v2", v2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (v2); gtk_box_pack_start (GTK_BOX (tmp), v2, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (v2), 1); simRobots = (GtkWidget**) malloc(sizeof(GtkWidget*)*paramNrOfRobots); distribute = (GtkWidget**) malloc(sizeof(GtkWidget*)*2); distribute[0] = v1; distribute[1] = v2; bb_simRobots = (GdkPixmap**) malloc(sizeof(GdkPixmap*)*paramNrOfRobots); printf("Nur of robots %d \n",paramNrOfRobots); for(int i=0; i < paramNrOfRobots; i++){ bb_simRobots[i] = gdk_pixmap_new(NULL,51,90,gdk_visual_get_best_depth()); bb_simRobots[i] = gdk_pixmap_ref(bb_simRobots[i]); simRobots[i] = gtk_drawing_area_new(); gtk_widget_ref(simRobots[i]); gtk_drawing_area_size(GTK_DRAWING_AREA(simRobots[i]),51,90); sprintf(str,"rob%d",i); gtk_object_set_data_full(GTK_OBJECT(window1),str,simRobots[i], (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(simRobots[i]); gtk_toolbar_append_element(GTK_TOOLBAR(distribute[i%2]), GTK_TOOLBAR_CHILD_WIDGET, simRobots[i], str, NULL,NULL,NULL,NULL,NULL); } free(distribute); colors = 256; cm_simArea = gdk_window_get_colormap(simArea->window); pal_simArea = (GdkColor**) malloc(sizeof(GdkColor*)*colors); for(int i=0; i < colors; i++){ pal_simArea[i] = (GdkColor*)malloc(sizeof(GdkColor)); if(i < 6){ pal_simArea[i]->red = pal[i][0]; pal_simArea[i]->green = pal[i][1]; pal_simArea[i]->blue = pal[i][2]; } else{ pal_simArea[i]->red = int(65536.0 * cos(i/double(63)*M_PI/3)); pal_simArea[i]->green = int(65536.0 * sin(i/double(63)*M_PI/3)); pal_simArea[i]->blue = 0; } gdk_colormap_alloc_color(cm_simArea, pal_simArea[i], 1, /* writeable -> private */ 1);/* bestmatch */ } pen_simArea = gdk_gc_new((GdkWindow *)bb_simArea); pen_simArea = gdk_gc_ref(pen_simArea); blit_simArea = gdk_gc_new((GdkWindow*)bb_simArea); blit_simArea = gdk_gc_ref(blit_simArea); internal_blit_simArea = gdk_gc_new((GdkWindow*)bb_simArea); internal_blit_simArea = gdk_gc_ref(internal_blit_simArea); gtk_timeout_add(500, on_progress_update, NULL); gtk_timeout_add(100, on_gui_update, NULL); sem_post(&gui_ready); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); sim_shutdown(); pthread_exit(0);}gint init_pal(gpointer *data){ return (FALSE);}gint on_progress_update(gpointer *data){ gfloat val; static GtkWidget *pbar=0; if(!pbar) pbar = lookup_widget(window1,"generation_progress_bar"); if(startGeneration==-1) val = (gfloat)(100.0*((gfloat)(gen)/ (gfloat)(nrOfGenerations))); else val = (gfloat)(100.0*((gfloat)(gen-startGeneration)/ (gfloat)(nrOfGenerations-startGeneration))); if(val < 1) val = 1; if(val > 100) val = 100; gdk_threads_enter(); gtk_progress_set_value(GTK_PROGRESS(pbar),val); gdk_threads_leave(); return TRUE;}void on_expose_event(GtkWidget *w, gpointer user_data){ for(int i=0; i < paramNrOfRobots; i++){ gdk_draw_pixmap(simRobots[i]->window, internal_blit_simArea, bb_simRobots[i], 0,0,0,0, -1,-1); } gdk_draw_pixmap(simArea->window, internal_blit_simArea, bb_simArea, 0,0,0,0, -1,-1); sem_post(&simAreaUpdate_S);}gint on_gui_update(gpointer *data){ if(sem_trywait(&simArea_S) == 0){ gdk_threads_enter(); gtk_widget_draw(simArea,NULL); gdk_threads_leave(); } return TRUE;}voidon_button_clicked (GtkButton *button, gpointer user_data){ printf("Klicked button\n");}voidon_run_btn_clicked (GtkButton *button, gpointer user_data){ gui_stepping=0; sem_post(&gui_run); sem_post(&gui_step); gui_print("Running simulation");#ifdef DEBUG_GUI printf("run\n");#endif}voidon_paus_btn_clicked (GtkButton *button, gpointer user_data){ gui_stepping=1; gui_print("Paus...");#ifdef DEBUG_GUI printf("paus\n");#endif}voidon_step_btn_clicked (GtkButton *button, gpointer user_data){ sem_post(&gui_step); gui_print("Stepping 100 ms");#ifdef DEBUG_GUI printf("step\n");#endif}voidon_evolution_tgl_toggled (GtkToggleButton *togglebutton, gpointer user_data){}voidon_wheel_rbtn_toggled (GtkToggleButton *togglebutton, gpointer user_data){ robotType = WHEEL; gui_print("Drawing wheel axis robot");#ifdef DEBUG_GUI printf("wheel robot\n");#endif}voidon_arrow_rbtn_toggled (GtkToggleButton *togglebutton, gpointer user_data){ robotType = ARROW; gui_print("Drawing arrow robot");#ifdef DEBUG_GUI printf("arrow robot\n");#endif}voidon_body_tgl_toggled (GtkToggleButton *togglebutton, gpointer user_data){ switch(robotBody){ case BFALSE: robotBody = BTRUE; gui_print("Robot body on"); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -