📄 gserial.c
字号:
break; case 2: tty_set_baud_rate(B1200); break; case 3: tty_set_baud_rate(B1800); break; case 4: tty_set_baud_rate(B2400); break; case 5: tty_set_baud_rate(B4800); break; case 6: tty_set_baud_rate(B9600); break; case 7: tty_set_baud_rate(B19200); break; case 8: tty_set_baud_rate(B38400); break; case 9: tty_set_baud_rate(B57600); break; case 10: tty_set_baud_rate(B115200); break; default: g_warning("should no come here\n"); break; } lastindex = index; }}void combo_select_bits_selectchild(GtkList *list,GtkWidget *child,gpointer data){ static gint lastindex=-1; gint index; g_assert( (index = gtk_list_child_position(list,child)) != -1); if( index != lastindex ) { switch(index) { case 0: tty_set_bit_size(5); break; case 1: tty_set_bit_size(6); break; case 2: tty_set_bit_size(7); break; case 3: tty_set_bit_size(8); break; default: g_warning("should no come here\n"); break; } lastindex = index; }}void combo_select_check_selectchild(GtkList *list,GtkWidget *child,gpointer data){ static gint lastindex=-1; gint index; g_assert( (index = gtk_list_child_position(list,child)) != -1); if( index != lastindex ) { tty_set_checkmod(index); lastindex = index; }}GtkWidget * MakeAppWindow(){ GtkWidget *window; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width(GTK_CONTAINER(window),10); gtk_window_set_title(GTK_WINDOW(window),"串口调试器"); gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(CloseTheApp),NULL); return window;}GtkWidget * MakeButton(GtkWidget *box,const gchar* caption,gpointer callbackfunc){ GtkWidget *button; button = gtk_button_new_with_label(caption); gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); if(callbackfunc != NULL) { gtk_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(callbackfunc),NULL); } return button;}GtkWidget * MakeCheckButton(GtkWidget *box,const gchar* caption,gpointer callbackfunc){ GtkWidget *button; button = gtk_check_button_new_with_label(caption); gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); if(callbackfunc != NULL) { gtk_signal_connect(GTK_OBJECT(button),"toggled",GTK_SIGNAL_FUNC(callbackfunc),NULL); } return button;}GtkWidget * MakeEntry(GtkWidget *box){ GtkWidget *entry; entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box),entry,FALSE,FALSE,0); return entry;}GtkWidget * MakeCombo(GtkWidget *box,GList *items,gpointer callbackfunc){ GtkWidget *combo; combo = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO (combo), items); //gtk_combo_set_value_in_list (GTK_COMBO(combo),TRUE,FALSE); gtk_box_pack_start(GTK_BOX(box),combo,FALSE,FALSE,0); if(callbackfunc != NULL) { gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->list),"select-child", GTK_SIGNAL_FUNC(callbackfunc),NULL); } gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo)->entry),FALSE); gtk_widget_set_size_request(combo,100,20); return combo; }GtkWidget * MakeComboWithLabel(GtkWidget *box,GList *items, gpointer callbackfunc,const gchar* labeltext){ GtkWidget *combo; GtkWidget *temphbox; GtkWidget *label; temphbox = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(box),temphbox,FALSE,FALSE,0); label = gtk_label_new(labeltext); gtk_box_pack_start(GTK_BOX(temphbox),label,FALSE,FALSE,0); combo = MakeCombo(temphbox,items,callbackfunc); return combo;}GtkWidget * MakeTextView(GtkWidget *box,guint width,guint height){ GtkWidget *view; GtkTextBuffer *buffer; GtkWidget *view_scroll_window; view_scroll_window = gtk_scrolled_window_new(NULL,NULL); gtk_container_set_border_width (GTK_CONTAINER (view_scroll_window),0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view_scroll_window), GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(box),view_scroll_window,FALSE,FALSE,0); view = gtk_text_view_new(); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(view)); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view),GTK_WRAP_CHAR); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view),10); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view),10); gtk_container_add(GTK_CONTAINER(view_scroll_window),view); gtk_widget_set_size_request(view,width,height); return view; }gint MakeAppView(GtkWidget *AppWindow){ GtkWidget *mainbox; GtkWidget *main_h1_vbox,*main_h2_vbox; GtkWidget *main_h2_v1_hbox; GtkWidget *main_h2_v2_hbox; GtkWidget *tempbox; GList *items_tty = NULL; GList *items_baud = NULL; GList *items_bits = NULL; GList *items_check = NULL; mainbox = gtk_hbox_new(FALSE,10); main_h1_vbox = gtk_vbox_new(FALSE,10); main_h2_vbox = gtk_vbox_new(FALSE,10); // ---------- add tty select combo box --------------- items_tty = g_list_append (items_tty, "/dev/ttyS0"); items_tty = g_list_append (items_tty, "/dev/ttyS1"); items_tty = g_list_append (items_tty, "/dev/ttyS2"); items_tty = g_list_append (items_tty, "/dev/ttyS3"); combo_select_tty = MakeComboWithLabel(main_h1_vbox,items_tty, combo_select_tty_selectchild,"端口: "); gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_tty)->list),0); //------------------------------------------------------ // ---------- add baud rate select combo box ---------- items_baud = g_list_append (items_baud, "300"); items_baud = g_list_append (items_baud, "600"); items_baud = g_list_append (items_baud, "1200"); items_baud = g_list_append (items_baud, "1800"); items_baud = g_list_append (items_baud, "2400"); items_baud = g_list_append (items_baud, "4800"); items_baud = g_list_append (items_baud, "9600"); items_baud = g_list_append (items_baud, "19200"); items_baud = g_list_append (items_baud, "38400"); items_baud = g_list_append (items_baud, "57600"); items_baud = g_list_append (items_baud, "115200"); combo_select_baud = MakeComboWithLabel(main_h1_vbox,items_baud, combo_select_baud_selectchild,"波特率:"); gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_baud)->list),10); //------------------------------------------------------ // --------- add bits per byte select combo box ---------- items_bits = g_list_append (items_bits, "5"); items_bits = g_list_append (items_bits, "6"); items_bits = g_list_append (items_bits, "7"); items_bits = g_list_append (items_bits, "8"); combo_select_bits = MakeComboWithLabel(main_h1_vbox,items_bits, combo_select_bits_selectchild,"比特: "); gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_bits)->list),3); //--------------------------------------------------------- //---------- add odd/even check select combo box ---------- items_check = g_list_append (items_check, "None"); items_check = g_list_append (items_check, "Odd"); items_check = g_list_append (items_check, "Even"); combo_select_check = MakeComboWithLabel(main_h1_vbox,items_check, combo_select_check_selectchild,"校验和:"); gtk_list_select_item(GTK_LIST(GTK_COMBO(combo_select_check)->list),0); //-------------------------------------------------------- //---------- add open/close serial button --------------------------------- button_open_close_tty = MakeButton(main_h1_vbox,"打开串口",button_open_close_tty_clicked); //--------------------------------------------------------------------------- //---------- add input count utility -------------------------------------- tempbox = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(main_h1_vbox),tempbox,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(tempbox),gtk_label_new("输入计数"),FALSE,FALSE,0); entry_read_count = MakeEntry(tempbox); gtk_widget_set_size_request(entry_read_count,60,20); gtk_entry_set_editable(GTK_ENTRY(entry_read_count),FALSE); update_read_count(ReadCount); MakeButton(tempbox,"清除计数",button_clear_read_count_clicked); //---------- add output count utility -------------------------------------- tempbox = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(main_h1_vbox),tempbox,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(tempbox),gtk_label_new("输出计数"),FALSE,FALSE,0); entry_write_count = MakeEntry(tempbox); gtk_widget_set_size_request(entry_write_count,60,20); gtk_entry_set_editable(GTK_ENTRY(entry_write_count),FALSE); update_write_count(WriteCount); MakeButton(tempbox,"清除计数",button_clear_write_count_clicked); //---------- add input view window --------------------------------------- //entry_input = MakeEntry(main_h2_vbox); TV_input = MakeTextView(main_h2_vbox,400,100); //---------- add hex input,send,clear input,read button ------------------- main_h2_v1_hbox = gtk_hbox_new(FALSE,15); gtk_box_pack_start(GTK_BOX(main_h2_vbox),main_h2_v1_hbox,FALSE,FALSE,0); MakeCheckButton(main_h2_v1_hbox,"16进制",button_input_hex_toggled); button_send = MakeButton(main_h2_v1_hbox,"发送数据",button_send_clicked); MakeButton(main_h2_v1_hbox,"清除输入区域",button_clear_input_clicked); MakeButton(main_h2_v1_hbox,"读取数据",button_read_clicked); //---------------------------------------------------------------------------- //------------ add output view window ---------------------------------------- TV_Info_Display = MakeTextView(main_h2_vbox,400,150); gtk_text_buffer_get_start_iter( gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display)),&TV_Info_Disp_Iter); gtk_text_view_set_editable(GTK_TEXT_VIEW(TV_Info_Display),FALSE); create_tags(gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display))); //--------------------------------------------------------------------------- //------------- add hex,clear,pause,save buttons ----------------------------- main_h2_v2_hbox = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(main_h2_vbox),main_h2_v2_hbox,FALSE,FALSE,0); MakeCheckButton(main_h2_v2_hbox,"16进制",button_output_hex_toggled); button_ignore_unprintable = MakeCheckButton(main_h2_v2_hbox,"忽略控制字符" ,button_ignore_unprintable_toggled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_ignore_unprintable),TRUE); gtk_widget_set_sensitive(button_ignore_unprintable,TRUE); MakeButton(main_h2_v2_hbox,"清除显示区域",button_clear_output_clicked); MakeButton(main_h2_v2_hbox,"暂停",button_pause_clicked); MakeButton(main_h2_v2_hbox,"保存数据",button_save_clicked); //----------------------------------------------------------------------------- gtk_box_pack_start(GTK_BOX(mainbox),main_h1_vbox,TRUE,FALSE,0); gtk_box_pack_start(GTK_BOX(mainbox),main_h2_vbox,TRUE,FALSE,0); gtk_container_add(GTK_CONTAINER(AppWindow),mainbox); return 0;}void readserial(gpointer data,gint fd,GdkInputCondition condition){ char line[MAX_LINE_LENGTH]; char dispdata[MAX_LINE_LENGTH*3+1]; char achar[3]; gint readsize; guint position; guint char_count; gint i; GtkTextBuffer *TV_Info_Display_buffer; GtkTextIter start,end; gboolean has_unprintable_char = FALSE; TV_Info_Display_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TV_Info_Display)); readsize = tty_read_data(fd,line,MAX_LINE_LENGTH); g_assert(readsize != -1); if( DispPaused ) return; ReadCount += readsize; update_read_count(ReadCount); if( OutputHex ) { for(i=0;i<readsize;i++) { sprintf(achar,"%02X",line[i]); dispdata[(i)*3] = achar[0]; dispdata[(i)*3+1] = achar[1]; dispdata[(i)*3+2] = ' '; } dispdata[readsize*3] = '\0'; gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1); gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,dispdata,-1); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(TV_Info_Display), &TV_Info_Disp_Iter,0.0,FALSE,0.0,1.0); } else { position = 0; if ( IgnoreUnprintable ) { for(i=0;i<readsize;i++) { // Judge if the char is printable or is the \r\n char if ( isprint(line[i]) || (line[i] == 0x0A) || (line[i] == 0x0D) ) { dispdata[position++] = line[i]; } } } else { for(i=0;i<readsize;i++) { // Judge if the char is printable or is the \r\n char if ( isprint(line[i]) || (line[i] == 0x0A) || (line[i] == 0x0D) ) { if (has_unprintable_char) { dispdata[position] = '\0'; gtk_text_buffer_insert_with_tags_by_name(TV_Info_Display_buffer, &TV_Info_Disp_Iter,dispdata,-1,"bold","red-foreground",NULL); position = 0; has_unprintable_char = FALSE; } dispdata[position++] = line[i]; } else { if (!has_unprintable_char) { dispdata[position] = '\0'; gtk_text_buffer_insert(TV_Info_Display_buffer, &TV_Info_Disp_Iter,dispdata,-1); position = 0; has_unprintable_char = TRUE; } sprintf(achar,"%02X",line[i]); dispdata[position++] = achar[0]; dispdata[position++] = achar[1]; } } } dispdata[position] = '\0'; gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1); gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,dispdata,-1); //----- test code -------- //gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&TV_Info_Disp_Iter,-1); //gtk_text_buffer_insert(TV_Info_Display_buffer,&TV_Info_Disp_Iter,"--------\r\n",-1); //------------------------ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(TV_Info_Display), &TV_Info_Disp_Iter,0.0,FALSE,0.0,1.0); } //------------ if char number in buffer great than the --------------------- //--------- MAX_DISP_BUFFER_SIZE then drop first 20% of them ---------------- char_count = gtk_text_buffer_get_char_count(TV_Info_Display_buffer); if (char_count > MAX_DISP_BUFFER_SIZE) { gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&start,0); gtk_text_buffer_get_iter_at_offset(TV_Info_Display_buffer,&end, (char_count - MAX_DISP_BUFFER_SIZE/5*4)); gtk_text_buffer_delete(TV_Info_Display_buffer,&start,&end); }} gint main(gint argc, gchar *argv[]){ gtk_init(&argc,&argv); AppWindow = MakeAppWindow(); MakeAppView(AppWindow); gtk_widget_show_all(AppWindow); gtk_main(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -