3 (c) 2003-2004 Jelmer Vernooij <jelmer@samba.org>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <sys/types.h>
26 #include <gdk/gdkkeysyms.h>
38 GtkWidget* create_aboutwin (void);
39 GtkWidget* create_settingswin (void);
40 HexDocument *data = NULL;
42 void update_hex_field()
47 void load_hex_file(const char *file)
49 FILE *fd = fopen(file, "r");
50 if(buffer)g_free(buffer);
51 bufferlen = 0; buffer = NULL;
57 void save_hex_file(const char *file)
59 FILE *fd = fopen(file, "w+");
65 void on_new_activate (GtkMenuItem *menuitem, gpointer user_data)
67 if(buffer)g_free(buffer);
68 bufferlen = 0; buffer = NULL;
72 void on_open_activate (GtkMenuItem *menuitem, gpointer user_data)
75 GtkWidget *cancel_button;
76 GtkWidget *openfilewin = gtk_file_selection_new ("Select File");
78 gtk_container_set_border_width (GTK_CONTAINER (openfilewin), 10);
80 ok_button = GTK_FILE_SELECTION (openfilewin)->ok_button;
81 gtk_widget_show (ok_button);
82 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
84 cancel_button = GTK_FILE_SELECTION (openfilewin)->cancel_button;
85 gtk_widget_show (cancel_button);
86 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
88 result = gtk_dialog_run(GTK_DIALOG(openfilewin));
91 load_hex_file(gtk_file_selection_get_filename(GTK_FILE_SELECTION(openfilewin)));
97 gtk_widget_destroy(openfilewin);
101 void on_save_as_activate (GtkMenuItem *menuitem, gpointer user_data)
103 GtkWidget *ok_button;
104 GtkWidget *cancel_button;
105 GtkWidget *savefilewin = gtk_file_selection_new ("Select File");
107 gtk_container_set_border_width (GTK_CONTAINER (savefilewin), 10);
109 ok_button = GTK_FILE_SELECTION (savefilewin)->ok_button;
110 gtk_widget_show (ok_button);
111 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
113 cancel_button = GTK_FILE_SELECTION (savefilewin)->cancel_button;
114 gtk_widget_show (cancel_button);
115 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
117 result = gtk_dialog_run(GTK_DIALOG(savefilewin));
119 case GTK_RESPONSE_OK:
120 save_hex_file(gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin)));
126 gtk_widget_destroy(savefilewin);
130 void on_quit_activate (GtkMenuItem *menuitem, gpointer user_data)
136 void on_settings_activate (GtkMenuItem *menuitem, gpointer user_data)
139 GtkWidget *settingswin = create_settingswin();
140 gtk_widget_show_all(settingswin);
141 result = gtk_dialog_run(GTK_DIALOG(settingswin));
143 case GTK_RESPONSE_OK:
150 gtk_widget_destroy(settingswin);
154 void on_reset_activate (GtkMenuItem *menuitem, gpointer user_data)
159 void on_erase_activate (GtkMenuItem *menuitem, gpointer user_data)
167 void on_download_data_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
173 void on_download_code_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
179 void on_upload_data_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
185 void on_upload_code_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
191 void on_about_activate (GtkMenuItem *menuitem, gpointer user_data)
193 GtkWidget *aboutwin = create_aboutwin();
194 gtk_dialog_run(GTK_DIALOG(aboutwin));
195 gtk_widget_destroy(aboutwin);
199 hex_cell_data_func (GtkTreeViewColumn *col,
200 GtkCellRenderer *renderer,
205 int num = GPOINTER_TO_INT(user_data);
209 gtk_tree_model_get(model, iter, num, &hexnum, -1);
211 g_snprintf(buf, sizeof(buf), "%02x", hexnum);
213 g_object_set(renderer, "text", buf, NULL);
217 GtkWidget* create_mainwin (void)
222 GtkWidget *menuitem4;
223 GtkWidget *menuitem4_menu;
226 GtkWidget *scrolledwindow1;
228 GtkWidget *separatormenuitem1;
231 GtkWidget *device_menu;
236 GtkWidget *download1;
237 GtkWidget *download1_menu;
238 GtkWidget *download_data_memory;
239 GtkWidget *download_code_memory;
241 GtkWidget *upload3_menu;
242 GtkWidget *upload_data_memory;
243 GtkWidget *upload_code_memory;
244 GtkWidget *menuitem7;
245 GtkWidget *menuitem7_menu;
247 GtkWidget *statusbar;
249 GtkCellRenderer *hexrenderer;
250 GtkListStore *hexstore;
251 GtkAccelGroup *accel_group;
252 GtkTreeViewColumn *curcol;
254 accel_group = gtk_accel_group_new ();
256 mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
257 gtk_window_set_title (GTK_WINDOW (mainwin), "AT89Prog");
259 vbox1 = gtk_vbox_new (FALSE, 0);
260 gtk_container_add (GTK_CONTAINER (mainwin), vbox1);
262 menubar = gtk_menu_bar_new ();
263 gtk_box_pack_start (GTK_BOX (vbox1), menubar, FALSE, FALSE, 0);
265 menuitem4 = gtk_menu_item_new_with_mnemonic ("_File");
266 gtk_container_add (GTK_CONTAINER (menubar), menuitem4);
268 menuitem4_menu = gtk_menu_new ();
269 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
271 new = gtk_image_menu_item_new_from_stock ("gtk-new", accel_group);
272 gtk_container_add (GTK_CONTAINER (menuitem4_menu), new);
274 open = gtk_image_menu_item_new_from_stock ("gtk-open", accel_group);
275 gtk_container_add (GTK_CONTAINER (menuitem4_menu), open);
277 save_as = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group);
278 gtk_container_add (GTK_CONTAINER (menuitem4_menu), save_as);
280 separatormenuitem1 = gtk_menu_item_new ();
281 gtk_container_add (GTK_CONTAINER (menuitem4_menu), separatormenuitem1);
282 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
284 quit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
285 gtk_container_add (GTK_CONTAINER (menuitem4_menu), quit);
287 device = gtk_menu_item_new_with_mnemonic ("_Device");
288 gtk_container_add (GTK_CONTAINER (menubar), device);
290 device_menu = gtk_menu_new ();
291 gtk_menu_item_set_submenu (GTK_MENU_ITEM (device), device_menu);
293 settings = gtk_menu_item_new_with_mnemonic ("_Settings");
294 gtk_container_add (GTK_CONTAINER (device_menu), settings);
296 separatormenuitem1 = gtk_menu_item_new ();
297 gtk_container_add (GTK_CONTAINER (device_menu), separatormenuitem1);
298 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
300 reset = gtk_menu_item_new_with_mnemonic ("_Reset");
301 gtk_container_add (GTK_CONTAINER (device_menu), reset);
303 erase = gtk_menu_item_new_with_mnemonic ("_Erase");
304 gtk_container_add (GTK_CONTAINER (device_menu), erase);
306 lock = gtk_menu_item_new_with_mnemonic ("_Lock");
307 gtk_container_add (GTK_CONTAINER (device_menu), lock);
309 separatormenuitem1 = gtk_menu_item_new ();
310 gtk_container_add (GTK_CONTAINER (device_menu), separatormenuitem1);
311 gtk_widget_set_sensitive (separatormenuitem1, FALSE);
313 download1 = gtk_menu_item_new_with_mnemonic ("_Download");
314 gtk_container_add (GTK_CONTAINER (device_menu), download1);
316 download1_menu = gtk_menu_new ();
317 gtk_menu_item_set_submenu (GTK_MENU_ITEM (download1), download1_menu);
319 download_data_memory = gtk_menu_item_new_with_mnemonic ("_Data memory");
320 gtk_container_add (GTK_CONTAINER (download1_menu), download_data_memory);
322 download_code_memory = gtk_menu_item_new_with_mnemonic ("_Code memory");
323 gtk_container_add (GTK_CONTAINER (download1_menu), download_code_memory);
325 upload3 = gtk_menu_item_new_with_mnemonic ("_Upload");
326 gtk_container_add (GTK_CONTAINER (device_menu), upload3);
328 upload3_menu = gtk_menu_new ();
329 gtk_menu_item_set_submenu (GTK_MENU_ITEM (upload3), upload3_menu);
331 upload_data_memory = gtk_menu_item_new_with_mnemonic ("_Data memory");
332 gtk_container_add (GTK_CONTAINER (upload3_menu), upload_data_memory);
334 upload_code_memory = gtk_menu_item_new_with_mnemonic ("_Code memory");
335 gtk_container_add (GTK_CONTAINER (upload3_menu), upload_code_memory);
337 menuitem7 = gtk_menu_item_new_with_mnemonic ("_Help");
338 gtk_container_add (GTK_CONTAINER (menubar), menuitem7);
340 menuitem7_menu = gtk_menu_new ();
341 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem7), menuitem7_menu);
343 about = gtk_menu_item_new_with_mnemonic ("_About");
344 gtk_container_add (GTK_CONTAINER (menuitem7_menu), about);
346 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
347 gtk_widget_show (scrolledwindow1);
348 gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
350 hexview = gtk_hex_new(data);
352 statusbar = gtk_statusbar_new ();
353 gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
355 g_signal_connect ((gpointer) new, "activate",
356 G_CALLBACK (on_new_activate),
358 g_signal_connect ((gpointer) open, "activate",
359 G_CALLBACK (on_open_activate),
361 g_signal_connect ((gpointer) save_as, "activate",
362 G_CALLBACK (on_save_as_activate),
364 g_signal_connect ((gpointer) quit, "activate",
365 G_CALLBACK (on_quit_activate),
367 g_signal_connect ((gpointer) settings, "activate",
368 G_CALLBACK (on_settings_activate),
370 g_signal_connect ((gpointer) reset, "activate",
371 G_CALLBACK (on_reset_activate),
373 g_signal_connect ((gpointer) erase, "activate",
374 G_CALLBACK (on_erase_activate),
376 g_signal_connect ((gpointer) download_data_memory, "activate",
377 G_CALLBACK (on_download_data_memory_activate),
379 g_signal_connect ((gpointer) download_code_memory, "activate",
380 G_CALLBACK (on_download_code_memory_activate),
382 g_signal_connect ((gpointer) upload_data_memory, "activate",
383 G_CALLBACK (on_upload_data_memory_activate),
385 g_signal_connect ((gpointer) upload_code_memory, "activate",
386 G_CALLBACK (on_upload_code_memory_activate),
388 g_signal_connect ((gpointer) about, "activate",
389 G_CALLBACK (on_about_activate),
392 gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
398 GtkWidget* create_settingswin (void)
400 GtkWidget *settingswin;
401 GtkWidget *dialog_vbox1;
407 GtkWidget *settings_combo_port_type;
408 GtkWidget *settings_combo_port_type_entry;
409 GtkWidget *settings_combo_port_location;
410 GtkWidget *settings_combo_port_location_entry;
419 GtkWidget *settings_combo_mosi;
420 GtkWidget *settings_combo_mosi_entry;
421 GtkWidget *settings_combo_miso;
422 GtkWidget *settings_combo_miso_entry;
423 GtkWidget *settings_combo_rst;
424 GtkWidget *settings_combo_rst_entry;
425 GtkWidget *settings_combo_chk;
426 GtkWidget *settings_combo_chk_entry;
427 GtkWidget *settings_combo_sck;
428 GtkWidget *settings_combo_sck_entry;
430 GtkWidget *dialog_action_area1;
431 GtkWidget *cancelbutton1;
432 GtkWidget *applybutton1;
433 GtkWidget *okbutton1;
435 settingswin = gtk_dialog_new ();
436 gtk_window_set_title (GTK_WINDOW (settingswin), "Device Settings");
438 dialog_vbox1 = GTK_DIALOG (settingswin)->vbox;
440 vbox1 = gtk_vbox_new (FALSE, 0);
441 gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
443 frame1 = gtk_frame_new (NULL);
444 gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 0);
446 table1 = gtk_table_new (2, 2, FALSE);
447 gtk_container_add (GTK_CONTAINER (frame1), table1);
449 label2 = gtk_label_new ("Type:");
450 gtk_table_attach (GTK_TABLE (table1), label2, 0, 1, 0, 1,
451 (GtkAttachOptions) (GTK_FILL),
452 (GtkAttachOptions) (0), 0, 0);
453 gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
455 label3 = gtk_label_new ("Location:");
456 gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 1, 2,
457 (GtkAttachOptions) (GTK_FILL),
458 (GtkAttachOptions) (0), 0, 0);
459 gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
461 settings_combo_port_type = gtk_combo_new ();
462 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_port_type)->popwin),
463 "GladeParentKey", settings_combo_port_type);
464 gtk_table_attach (GTK_TABLE (table1), settings_combo_port_type, 1, 2, 0, 1,
465 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
466 (GtkAttachOptions) (0), 0, 0);
468 settings_combo_port_type_entry = GTK_COMBO (settings_combo_port_type)->entry;
470 settings_combo_port_location = gtk_combo_new ();
471 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_port_location)->popwin),
472 "GladeParentKey", settings_combo_port_location);
473 gtk_table_attach (GTK_TABLE (table1), settings_combo_port_location, 1, 2, 1, 2,
474 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
475 (GtkAttachOptions) (0), 0, 0);
477 settings_combo_port_location_entry = GTK_COMBO (settings_combo_port_location)->entry;
479 label1 = gtk_label_new ("Port");
480 gtk_frame_set_label_widget (GTK_FRAME (frame1), label1);
482 frame2 = gtk_frame_new (NULL);
483 gtk_box_pack_start (GTK_BOX (vbox1), frame2, TRUE, TRUE, 0);
485 table2 = gtk_table_new (5, 2, FALSE);
486 gtk_container_add (GTK_CONTAINER (frame2), table2);
488 label5 = gtk_label_new ("MOSI");
489 gtk_table_attach (GTK_TABLE (table2), label5, 0, 1, 0, 1,
490 (GtkAttachOptions) (GTK_FILL),
491 (GtkAttachOptions) (0), 0, 0);
492 gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
494 label6 = gtk_label_new ("MISO");
495 gtk_table_attach (GTK_TABLE (table2), label6, 0, 1, 1, 2,
496 (GtkAttachOptions) (GTK_FILL),
497 (GtkAttachOptions) (0), 0, 0);
498 gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
500 label7 = gtk_label_new ("RST");
501 gtk_table_attach (GTK_TABLE (table2), label7, 0, 1, 2, 3,
502 (GtkAttachOptions) (GTK_FILL),
503 (GtkAttachOptions) (0), 0, 0);
504 gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
506 label8 = gtk_label_new ("CHK");
507 gtk_table_attach (GTK_TABLE (table2), label8, 0, 1, 3, 4,
508 (GtkAttachOptions) (GTK_FILL),
509 (GtkAttachOptions) (0), 0, 0);
510 gtk_misc_set_alignment (GTK_MISC (label8), 0, 0.5);
512 label9 = gtk_label_new ("SCK");
513 gtk_table_attach (GTK_TABLE (table2), label9, 0, 1, 4, 5,
514 (GtkAttachOptions) (GTK_FILL),
515 (GtkAttachOptions) (0), 0, 0);
516 gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
518 settings_combo_mosi = gtk_combo_new ();
519 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_mosi)->popwin),
520 "GladeParentKey", settings_combo_mosi);
521 gtk_table_attach (GTK_TABLE (table2), settings_combo_mosi, 1, 2, 0, 1,
522 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
523 (GtkAttachOptions) (0), 0, 0);
525 settings_combo_mosi_entry = GTK_COMBO (settings_combo_mosi)->entry;
527 settings_combo_miso = gtk_combo_new ();
528 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_miso)->popwin),
529 "GladeParentKey", settings_combo_miso);
530 gtk_table_attach (GTK_TABLE (table2), settings_combo_miso, 1, 2, 1, 2,
531 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
532 (GtkAttachOptions) (0), 0, 0);
534 settings_combo_miso_entry = GTK_COMBO (settings_combo_miso)->entry;
536 settings_combo_rst = gtk_combo_new ();
537 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_rst)->popwin),
538 "GladeParentKey", settings_combo_rst);
539 gtk_table_attach (GTK_TABLE (table2), settings_combo_rst, 1, 2, 2, 3,
540 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
541 (GtkAttachOptions) (0), 0, 0);
543 settings_combo_rst_entry = GTK_COMBO (settings_combo_rst)->entry;
545 settings_combo_chk = gtk_combo_new ();
546 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_chk)->popwin),
547 "GladeParentKey", settings_combo_chk);
548 gtk_table_attach (GTK_TABLE (table2), settings_combo_chk, 1, 2, 3, 4,
549 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
550 (GtkAttachOptions) (0), 0, 0);
552 settings_combo_chk_entry = GTK_COMBO (settings_combo_chk)->entry;
554 settings_combo_sck = gtk_combo_new ();
555 g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_sck)->popwin),
556 "GladeParentKey", settings_combo_sck);
557 gtk_table_attach (GTK_TABLE (table2), settings_combo_sck, 1, 2, 4, 5,
558 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
559 (GtkAttachOptions) (0), 0, 0);
561 settings_combo_sck_entry = GTK_COMBO (settings_combo_sck)->entry;
563 label4 = gtk_label_new ("Pins:");
564 gtk_frame_set_label_widget (GTK_FRAME (frame2), label4);
566 dialog_action_area1 = GTK_DIALOG (settingswin)->action_area;
567 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
569 cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
570 gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), cancelbutton1, GTK_RESPONSE_CANCEL);
571 GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
573 applybutton1 = gtk_button_new_from_stock ("gtk-apply");
574 gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), applybutton1, GTK_RESPONSE_APPLY);
575 GTK_WIDGET_SET_FLAGS (applybutton1, GTK_CAN_DEFAULT);
577 okbutton1 = gtk_button_new_from_stock ("gtk-ok");
578 gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), okbutton1, GTK_RESPONSE_OK);
579 GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
584 GtkWidget* create_aboutwin (void)
587 GtkWidget *dialog_vbox2;
591 GtkWidget *dialog_action_area2;
592 GtkWidget *closebutton1;
594 aboutwin = gtk_dialog_new ();
595 gtk_window_set_title (GTK_WINDOW (aboutwin), "About AT89Prog");
596 gtk_window_set_resizable (GTK_WINDOW (aboutwin), FALSE);
598 dialog_vbox2 = GTK_DIALOG (aboutwin)->vbox;
599 gtk_widget_show (dialog_vbox2);
601 vbox2 = gtk_vbox_new (FALSE, 0);
602 gtk_widget_show (vbox2);
603 gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox2, TRUE, TRUE, 0);
605 label10 = gtk_label_new ("<b>AT89Prog</b>");
606 gtk_widget_show (label10);
607 gtk_box_pack_start (GTK_BOX (vbox2), label10, FALSE, FALSE, 0);
608 gtk_label_set_use_markup (GTK_LABEL (label10), TRUE);
610 label11 = gtk_label_new ("(C) 2003-2004 Jelmer Vernooij <jelmer@samba.org>\n\nFor more information, see:\n\nhttp://jelmer.vernstok.nl/oss/at89prog/\n");
611 gtk_widget_show (label11);
612 gtk_box_pack_start (GTK_BOX (vbox2), label11, FALSE, FALSE, 0);
613 gtk_label_set_use_markup (GTK_LABEL (label11), TRUE);
615 dialog_action_area2 = GTK_DIALOG (aboutwin)->action_area;
616 gtk_widget_show (dialog_action_area2);
617 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
619 closebutton1 = gtk_button_new_from_stock ("gtk-close");
620 gtk_widget_show (closebutton1);
621 gtk_dialog_add_action_widget (GTK_DIALOG (aboutwin), closebutton1, GTK_RESPONSE_CLOSE);
622 GTK_WIDGET_SET_FLAGS (closebutton1, GTK_CAN_DEFAULT);
627 int main (int argc, char *argv[])
631 gtk_init (&argc, &argv);
633 rcfile = g_strdup_printf("%s/.at89progrc", g_get_home_dir());
634 pins_read_config_file(rcfile);
636 mainwin = create_mainwin ();
637 gtk_widget_show_all(mainwin);