#include #include #include #include #include #include #include #include #include "calc.h" #include "main.h" #include "dataconv.h" #include "widget.h" #include "draw.h" extern GtkTextBuffer *txtcircbuff; extern int Zcirc, Ycirc, RHOcirc, Qcirc, tsidx; extern GtkWidget *scarea, *toptable, *menubar, *topwindow; extern SMCDATA smcdata; extern float tunestep; extern const float tunesteptab[6]; extern gint scdim; extern GtkWidget *statarr[20]; extern const char statlabelname[20][15]; GtkItemFactory *item_factory; GtkWidget *filew, *about; GtkWidget *evb, *etb1, *etb2, *etb3; gchar *entry_text, entry_text_type; GtkWidget *entryval; static GtkItemFactoryEntry menu_items[] = { { "/_File", NULL, NULL, 0, "", NULL }, { "/File/New", "N", restart, 0, NULL, NULL }, { "/File/Write", "W", write_activate, 0, NULL, NULL }, { "/File/sep1", NULL, NULL, 0, "", NULL }, { "/File/Quit", "Q", main_quit, 0, NULL, NULL }, { "/_Set", NULL, NULL, 0, "", NULL }, { "/Set/Start Point","S", sp_activate, 0, NULL, NULL }, { "/Set/Frequency","F", f0_activate, 0, NULL, NULL }, { "/Set/Characteristic Impedance","0",z0_activate, 0, NULL, NULL }, { "/_Add", NULL, NULL, 0, "", NULL }, { "/Add/[add] Resistance", "R", add_resistance_activate, 0, NULL, NULL }, { "/Add/[add] Inductance", "L", add_inductance_activate, 0, NULL, NULL }, { "/Add/[add] Capacitance", "C", add_capacitance_activate, 0, NULL, NULL }, { "/Add/[add] Transmission Line","T", add_tline_activate, 0, NULL, NULL }, { "/Add/sep2", NULL, NULL, 0, "", NULL }, { "/Add/[ins] Resistance", "R", ins_resistance_activate, 0, NULL, NULL }, { "/Add/[ins] Inductance", "L", ins_inductance_activate, 0, NULL, NULL }, { "/Add/[ins] Capacitance", "C", ins_capacitance_activate, 0, NULL, NULL }, { "/Add/[ins] Transmission Line","T", ins_tline_activate, 0, NULL, NULL }, { "/_Edit", NULL, NULL, 0, "", NULL}, { "/Edit/Delete component", "D", delete_component_activate, 0, NULL, NULL }, { "/Edit/sep3", NULL, NULL, 0, "" , NULL}, { "/Edit/Decrease first value", "Left", decrease_first_activate, 0, NULL, NULL }, { "/Edit/Increase first value", "Right", increase_first_activate, 0, NULL, NULL }, { "/Edit/Decrease second value", "Left", decrease_second_activate, 0, NULL, NULL }, { "/Edit/Increase second value", "Right", increase_second_activate, 0, NULL, NULL }, { "/Edit/Select previous element", "Up", select_previous, 0, NULL, NULL }, { "/Edit/Select next element", "Down", select_next, 0, NULL , NULL}, { "/Edit/Increase tuning step", "Up", increase_tunestep, 0, NULL, NULL }, { "/Edit/Decrease tuning step", "Down", decrease_tunestep, 0, NULL, NULL }, { "/Edit/Set first value", "equal", set_first_val, 0, NULL, NULL }, { "/Edit/Set second value", "equal", set_second_val, 0, NULL, NULL }, { "/_View", NULL, NULL, 0, "", NULL}, { "/View/Impedance", "1", on_imped_activate, 0, "", NULL}, { "/View/Admittaance", "2", on_admit_activate, 0, "", NULL}, { "/View/Coefficient of Reflection", "3", on_cor_activate, 0, "", NULL}, { "/View/Quality Factor (Q)", "4", on_qfac_activate, 0, "", NULL}, { "/_Help", NULL, NULL, 0, "", NULL }, { "/Help/Keystrokes", NULL, help_keystrokes, 0, NULL, NULL }, { "/Help/About", NULL, help_about, 0, NULL, NULL}, }; void help_about(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { GtkWidget *label, *button; about=gtk_dialog_new(); label = gtk_label_new ("\n GSMC - A Smith Chart Calculator\n" \ "Version 1.0 - Sept. 2003\n\n\n" \ "(c) 2003 by Lapo Pieri\n" \ " ik5nax@amsat.org\n"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 0); button=gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->action_area), button, TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc)help_about_destroy, NULL); gtk_widget_show(button); gtk_widget_show(label); gtk_widget_show(about); } void help_about_destroy(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { gtk_widget_destroy(about); } void help_keystrokes(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { GtkWidget *label, *button, *label2; about=gtk_dialog_new(); label=gtk_label_new("GSMC Keystrokes"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label, TRUE, TRUE, 0); label2=gtk_label_new("\ Ctrl+q\t\t Quit the program\n\ Ctrl+1\t\t Toggle visualization of impedance (Z) circle\n\ Ctrl+2\t\t Toggle visualization of admittance (Y) circle\n\ Ctrl+3\t\t Toggle visualization of reflection coefficient (RHO) circle\n\ Ctrl+4\t\t Toggle visualization of constant Q circle\n\ s\t\t\t Set start point\n\ Ctrl+0\t\t (zero) Set characteristic impedance z0\n\ f\t\t\t Set frequency (f0)\n\ r\t\t\t Add a resistor\n\ l\t\t\t Add an inductor\n\ c\t\t\t Add a capacitor\n\ t\t\t\t Add a transmission line or stub\n\ Shift+r\t\t Insert a resistor before the highlighted element\n\ Shift+l\t\t Insert an inductor before the highlighted element\n\ Shift+c\t\t Insert a capacitor before the highlighted element\n\ Shift+t\t\t Insert a transmission line or stub before the highlighted element\n\ d\t\t\t Delete the currently highligthed element\n\ Shift+Curs\t Up Highlight previous element\n\ Shift+Curs\t Down Highlight next element\n\ Shift+Curs\t Left Decrease the first field of currently highlighted element\n\ Shift+Curs\t Rigth Increase the first field of currently highlighted element\n\ Mod+Curs\t Left Decrease the second field of currently highlighted element\n\ Mod+Curs\t Rigth Increase the second field of currently highlighted element\n\ Mod+Curs\t Up Increase the tuning step\n\ Mod+Curs\t Down Decrease the tuning step\n\ Ctrl+w\t\t Write network file in spice format\n\ Ctrl+n\t\t Restart for a new calculation with a clean chart\n\ =\t\t\t Change first field of currently highlighted element\n\ Mod+=\t\t Change second field of currently highlighted element\n\ "); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->vbox), label2, TRUE, TRUE, 0); button=gtk_button_new_from_stock(GTK_STOCK_CLOSE); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(about)->action_area), button, TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc)help_about_destroy, NULL); gtk_widget_show(button); gtk_widget_show(label); gtk_widget_show(label2); gtk_widget_show(about); } void help_keystrokes_destroy(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { gtk_widget_destroy(about); } void main_quit(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { gtk_main_quit(); } void on_imped_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { Zcirc^=1; drawchart(); gtk_widget_draw(scarea, NULL); } void on_admit_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { Ycirc^=1; drawchart(); gtk_widget_draw(scarea, NULL); } void on_cor_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { RHOcirc^=1; drawchart(); gtk_widget_draw(scarea, NULL); } void on_qfac_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { Qcirc^=1; drawchart(); gtk_widget_draw(scarea, NULL); } void sp_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { GtkWidget *lb, *hbb, *b1, *b2, *b3, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Start point"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Z"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Y"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b2)), "_RHO"); gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE); gtk_widget_show(b3); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); switch(smcdata.SPtype){ /* Start with previous button toggled */ case SPTYPE_Z: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); break; case SPTYPE_Y: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b2), TRUE); break; case SPTYPE_RHO: gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b3), TRUE); break; } /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_spZ), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_spY), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b3), "toggled", GTK_SIGNAL_FUNC(set_spRHO), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTSP; } void f0_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { GtkWidget *lb, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Center frequency"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTF0; } void z0_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { GtkWidget *lb, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Caracteristic Impedance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTZ0; } void add_resistance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Add Resistance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); entry_text_type=ETTAR; } void add_inductance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Add Inductance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTAL; } void add_capacitance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Add Capacitance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTAC; } void add_tline_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *vbb, *hbb, *b1, *b2, *b3, *b4, *b5, *bok, *label; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Add Transmission line"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ vbb=gtk_vbox_new(TRUE, 0); hbb=gtk_hbox_new(TRUE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "Open series stub (_a)"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "Short series stub (_l)"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0); b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b2)), "Open parallel stub (_o)"); gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE); gtk_widget_show(b3); b4=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b3)), "Short parallel stub (_c)"); gtk_box_pack_start(GTK_BOX(hbb), b4, TRUE, FALSE, FALSE); gtk_widget_show(b4); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0); b5=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b4)), "Transmissive (_t)"); gtk_box_pack_start(GTK_BOX(hbb), b5, TRUE, FALSE, FALSE); gtk_widget_show(b5); bok=gtk_button_new_with_label("OK"); gtk_widget_show(bok); gtk_signal_connect(GTK_OBJECT(bok), "clicked", GTK_SIGNAL_FUNC(etbt_callback), GTK_OBJECT(bok)); gtk_box_pack_start(GTK_BOX(hbb), bok, TRUE, FALSE, FALSE); gtk_widget_show(hbb); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), vbb, FALSE, FALSE, FALSE); gtk_widget_show(vbb); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_open_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_short_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b3), "toggled", GTK_SIGNAL_FUNC(set_open_parallel), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b4), "toggled", GTK_SIGNAL_FUNC(set_short_parallel), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b5), "toggled", GTK_SIGNAL_FUNC(set_transmissive), GTK_OBJECT(evb)); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b5), TRUE); set_transmissive(); /* entry box */ hbb=gtk_hbox_new(FALSE, 0); etb1=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb1), TRUE); label=gtk_label_new(" Len [deg] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb1, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb1); gtk_widget_show(hbb); hbb=gtk_hbox_new(FALSE, 0); etb2=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb2), TRUE); label=gtk_label_new(" Z [ohm] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb2, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb2); gtk_widget_show(hbb); /* hbb=gtk_hbox_new(FALSE, 0); etb3=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb3), TRUE); label=gtk_label_new(" Att [dB/m] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb3, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb3); gtk_widget_show(hbb); */ /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb1); entry_text_type=ETTAT; } void ins_resistance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Ins Resistance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTIR; } void ins_inductance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Ins Inductance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTIL; } void ins_capacitance_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *hbb, *b1, *b2, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Add Capacitance"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ hbb=gtk_hbox_new(FALSE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "_Series"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "_Parallel"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(hbb); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b1), TRUE); set_series(); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_parallel), GTK_OBJECT(evb)); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etb_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTIC; } void ins_tline_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *vbb, *hbb, *b1, *b2, *b3, *b4, *b5, *bok, *label; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Ins Transmission line"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* Button for various type of entry format */ vbb=gtk_vbox_new(TRUE, 0); hbb=gtk_hbox_new(TRUE, 0); b1=gtk_radio_button_new_with_mnemonic(NULL, "Open series stub (_a)"); gtk_box_pack_start(GTK_BOX(hbb), b1, TRUE, FALSE, FALSE); gtk_widget_show(b1); b2=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b1)), "Short series stub (_l)"); gtk_box_pack_start(GTK_BOX(hbb), b2, TRUE, FALSE, FALSE); gtk_widget_show(b2); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0); b3=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b2)), "Open parallel stub (_o)"); gtk_box_pack_start(GTK_BOX(hbb), b3, TRUE, FALSE, FALSE); gtk_widget_show(b3); b4=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b3)), "Short parallel stub (_c)"); gtk_box_pack_start(GTK_BOX(hbb), b4, TRUE, FALSE, FALSE); gtk_widget_show(b4); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_widget_show(hbb); hbb=gtk_hbox_new(TRUE, 0); b5=gtk_radio_button_new_with_mnemonic(gtk_radio_button_group( GTK_RADIO_BUTTON(b4)), "Transmissive (_t)"); gtk_box_pack_start(GTK_BOX(hbb), b5, TRUE, FALSE, FALSE); gtk_widget_show(b5); bok=gtk_button_new_with_label("OK"); gtk_widget_show(bok); gtk_signal_connect(GTK_OBJECT(bok), "clicked", GTK_SIGNAL_FUNC(etbt_callback), GTK_OBJECT(bok)); gtk_box_pack_start(GTK_BOX(hbb), bok, TRUE, FALSE, FALSE); gtk_widget_show(hbb); gtk_box_pack_start(GTK_BOX(vbb), hbb, TRUE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), vbb, FALSE, FALSE, FALSE); gtk_widget_show(vbb); /* connecting radio button the signal */ gtk_signal_connect(GTK_OBJECT(b1), "toggled", GTK_SIGNAL_FUNC(set_open_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b2), "toggled", GTK_SIGNAL_FUNC(set_short_series), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b3), "toggled", GTK_SIGNAL_FUNC(set_open_parallel), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b4), "toggled", GTK_SIGNAL_FUNC(set_short_parallel), GTK_OBJECT(evb)); gtk_signal_connect(GTK_OBJECT(b5), "toggled", GTK_SIGNAL_FUNC(set_transmissive), GTK_OBJECT(evb)); /* Rivedere */ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(b5), TRUE); set_transmissive(); /* entry box */ hbb=gtk_hbox_new(FALSE, 0); etb1=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb1), TRUE); label=gtk_label_new(" Len [deg] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb1, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb1); gtk_widget_show(hbb); hbb=gtk_hbox_new(FALSE, 0); etb2=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb2), TRUE); label=gtk_label_new(" Z [ohm] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb2, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb2); gtk_widget_show(hbb); /* hbb=gtk_hbox_new(FALSE, 0); etb3=gtk_entry_new_with_max_length(16); gtk_entry_set_editable(GTK_ENTRY(etb3), TRUE); label=gtk_label_new(" Att [dB/m] "); gtk_box_pack_start(GTK_BOX(hbb), label, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(hbb), etb3, FALSE, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(evb), hbb, FALSE, FALSE, FALSE); gtk_widget_show(label); gtk_widget_show(etb3); gtk_widget_show(hbb); */ /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb1); entry_text_type=ETTIT; } gint etb_callback(GtkWidget *widget __attribute__((unused)), GtkWidget *entry) { float re, im, val0, val1, val2; char c, temp; int i; entry_text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry)); if(strlen(entry_text)!=0){ switch(entry_text_type) { case ETTSP: entrystringdecode(entry_text, &smcdata.reentrySP, &smcdata.imentrySP); break; case ETTZ0: if(entrystringdecode(entry_text, &re, &im)==0) { if(re<=0.) fprintf(stderr, "Invalid characteristic impedance value\n"); else smcdata.z0=re; } else fprintf(stderr, "Invalid characteristic impedance\n"); break; case ETTF0: smcdata.f0=psdec(entry_text); break; case ETTAR: c='r'; if(smcdata.ne=smcdata.neidx; i--) { smcdata.ELtype[i+1]=smcdata.ELtype[i]; smcdata.ELval0[i+1]=smcdata.ELval0[i]; smcdata.ELval1[i+1]=smcdata.ELval1[i]; smcdata.ELval2[i+1]=smcdata.ELval2[i]; temp=smcdata.ELplace[i+1]; smcdata.ELplace[i+1]=smcdata.ELplace[i]; smcdata.ELplace[i]=temp; smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i]; smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i]; } smcdata.ne++; /* and then add the network element in the place just freed */ c='r'; smcdata.ELtype[smcdata.neidx]=c; if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){ smcdata.ELval0[smcdata.neidx]=val0; smcdata.ELval1[smcdata.neidx]=val1; smcdata.ELval2[smcdata.neidx]=val2; } else removene(); } else fprintf(stderr, "No more space left for component\n"); recalc(); drawchart(); gtk_widget_draw(scarea, NULL); break; case ETTIL: /* Insert a component in the location specified by index */ if(smcdata.ne=smcdata.neidx; i--) { smcdata.ELtype[i+1]=smcdata.ELtype[i]; smcdata.ELval0[i+1]=smcdata.ELval0[i]; smcdata.ELval1[i+1]=smcdata.ELval1[i]; smcdata.ELval2[i+1]=smcdata.ELval2[i]; temp=smcdata.ELplace[i+1]; smcdata.ELplace[i+1]=smcdata.ELplace[i]; smcdata.ELplace[i]=temp; smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i]; smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i]; } smcdata.ne++; /* and then add the network element in the place just freed */ c='l'; smcdata.ELtype[smcdata.neidx]=c; if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){ smcdata.ELval0[smcdata.neidx]=val0; smcdata.ELval1[smcdata.neidx]=val1; smcdata.ELval2[smcdata.neidx]=val2; } else removene(); } else fprintf(stderr, "No more space left for component\n"); recalc(); drawchart(); gtk_widget_draw(scarea, NULL); break; case ETTIC: /* Insert a component in the location specified by index */ if(smcdata.ne=smcdata.neidx; i--) { smcdata.ELtype[i+1]=smcdata.ELtype[i]; smcdata.ELval0[i+1]=smcdata.ELval0[i]; smcdata.ELval1[i+1]=smcdata.ELval1[i]; smcdata.ELval2[i+1]=smcdata.ELval2[i]; temp=smcdata.ELplace[i+1]; smcdata.ELplace[i+1]=smcdata.ELplace[i]; smcdata.ELplace[i]=temp; smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i]; smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i]; } smcdata.ne++; /* and then add the network element in the place just freed */ c='c'; smcdata.ELtype[smcdata.neidx]=c; if(componentvaluestringdecode(entry_text, &val0, &val1, &val2, &c)==0){ smcdata.ELval0[smcdata.neidx]=val0; smcdata.ELval1[smcdata.neidx]=val1; smcdata.ELval2[smcdata.neidx]=val2; } else removene(); } else fprintf(stderr, "No more space left for component\n"); recalc(); drawchart(); gtk_widget_draw(scarea, NULL); break; case ETTNULL: default: printf("%s\n", entry_text); } recalc(); showtextstat(); showcircdesc(); entry_text_type=ETTNULL; drawchart(); gtk_widget_draw(scarea, NULL); } gtk_widget_destroy(entryval); return TRUE; } gint etbt_callback(GtkWidget *widget __attribute__((unused)), GtkWidget *entry __attribute__((unused))) { gchar *entry_text1, *entry_text2, *entry_text3; char c, temp; float val0, val1, val2; int i; entry_text1=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb1)); entry_text2=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb2)); // entry_text3=(gchar*)gtk_entry_get_text(GTK_ENTRY(etb3)); if((strlen(entry_text1)!=0) && (strlen(entry_text2)!=0)){ switch(entry_text_type){ case ETTAT: c='t'; if(smcdata.ne=smcdata.neidx; i--) { smcdata.ELtype[i+1]=smcdata.ELtype[i]; smcdata.ELval0[i+1]=smcdata.ELval0[i]; smcdata.ELval1[i+1]=smcdata.ELval1[i]; smcdata.ELval2[i+1]=smcdata.ELval2[i]; temp=smcdata.ELplace[i+1]; smcdata.ELplace[i+1]=smcdata.ELplace[i]; smcdata.ELplace[i]=temp; smcdata.rerhoIP[i+1]=smcdata.rerhoIP[i]; smcdata.imrhoIP[i+1]=smcdata.imrhoIP[i]; } smcdata.ne++; /* and then add the network element in the place just freed */ c='t'; smcdata.ELtype[smcdata.neidx]=c; if(componentvaluestringdecode(entry_text1, &val0, &val1, &val2, &c)==0){ smcdata.ELval0[smcdata.neidx]=val0; } else removene(); if(componentvaluestringdecode(entry_text2, &val0, &val1, &val2, &c)==0){ smcdata.ELval1[smcdata.neidx]=val0; } else removene(); /* if(componentvaluestringdecode(entry_text3, &val0, &val1, &val2, &c)==0){ smcdata.ELval2[smcdata.neidx]=val0; } else removene(); */ } else fprintf(stderr, "No more space left for component\n"); recalc(); drawchart(); gtk_widget_draw(scarea, NULL); break; case ETTNULL: default: printf("%s\t%s\t%s\n", entry_text1, entry_text2, entry_text3); } recalc(); showtextstat(); showcircdesc(); entry_text_type=ETTNULL; drawchart(); gtk_widget_draw(scarea, NULL); } gtk_widget_destroy(entryval); return TRUE; } gint set_spZ(void) { smcdata.SPtype=SPTYPE_Z; return TRUE; } gint set_spY(void) { smcdata.SPtype=SPTYPE_Y; return TRUE; } gint set_spRHO(void) { smcdata.SPtype=SPTYPE_RHO; return TRUE; } gint set_series(void) { smcdata.ELplace[smcdata.ne+1]='s'; return TRUE; } gint set_parallel(void) { smcdata.ELplace[smcdata.ne+1]='p'; return TRUE; } gint set_open_series(void) { smcdata.ELplace[smcdata.ne+1]='a'; return TRUE; } gint set_short_series(void) { smcdata.ELplace[smcdata.ne+1]='l'; return TRUE; } gint set_open_parallel(void) { smcdata.ELplace[smcdata.ne+1]='o'; return TRUE; } gint set_short_parallel(void) { smcdata.ELplace[smcdata.ne+1]='c'; return TRUE; } gint set_transmissive(void) { smcdata.ELplace[smcdata.ne+1]='t'; return TRUE; } void menu_create(GtkWidget *window, GtkWidget **menu_bar) { GtkAccelGroup *accel_group; gint nmenu_items=sizeof(menu_items)/sizeof(menu_items[0]); accel_group=gtk_accel_group_new(); item_factory=gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", accel_group); gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL); gtk_window_add_accel_group(GTK_WINDOW (window), accel_group); if(menu_bar) *menu_bar=gtk_item_factory_get_widget(item_factory, "
"); } void delete_component_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ removene(); recalc(); drawchart(); gtk_widget_draw(scarea, NULL); showtextstat(); showcircdesc(); } void select_previous(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ if(smcdata.neidx>1) { smcdata.neidx--; showcircdesc(); } } void select_next(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ if(smcdata.neidx0) tsidx--; tunestep=tunesteptab[tsidx]; showtextstat(); } void increase_tunestep(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ if(tsidx<5) tsidx++; tunestep=tunesteptab[tsidx]; showtextstat(); } void decrease_first_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ smcdata.ELval0[smcdata.neidx]/=tunestep; recalc(); drawchart(); gtk_widget_draw(scarea, NULL); showtextstat(); showcircdesc(); } void increase_first_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ smcdata.ELval0[smcdata.neidx]*=tunestep; recalc(); drawchart(); gtk_widget_draw(scarea, NULL); showtextstat(); showcircdesc(); } void decrease_second_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ smcdata.ELval1[smcdata.neidx]/=tunestep; recalc(); drawchart(); gtk_widget_draw(scarea, NULL); showtextstat(); showcircdesc(); } void increase_second_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ smcdata.ELval1[smcdata.neidx]*=tunestep; recalc(); drawchart(); gtk_widget_draw(scarea, NULL); showtextstat(); showcircdesc(); } void write_activate(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { filew = gtk_file_selection_new ("Write SPICE file"); gtk_signal_connect (GTK_OBJECT (filew), "destroy", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT(filew)); gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", (GtkSignalFunc) file_ok_sel, filew ); gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (filew)); gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), "prova.cir"); gtk_widget_show(filew); } void file_ok_sel(GtkWidget *w __attribute__((unused)), GtkFileSelection *fs ){ writespice((char*)gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs))); gtk_widget_hide(filew); } void restart(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))) { smcdata.SPtype=SPTYPE_Z; smcdata.reentrySP=50.; smcdata.imentrySP=0.; smcdata.z0=50.; smcdata.f0=1e6; tsidx=3; tunestep=tunesteptab[tsidx]; smcdata.ne=0; smcdata.neidx=0; recalc(); showtextstat(); drawchart(); showcircdesc(); gtk_widget_draw(topwindow, NULL); } gint cursor_motion_in_sc(GtkWidget *widget __attribute__((unused)), GdkEventMotion *event){ int x, y; GdkModifierType state; char b[80], b2[80]; float r, j; if (event->is_hint) gdk_window_get_pointer (event->window, &x, &y, &state); else { x = event->x; y = event->y; state = event->state; } smcdata.rerhoCU=((float)x/(float)scdim-0.5)*2.; smcdata.imrhoCU=(0.5-(float)y/(float)scdim)*2.; /* More efficient rather than calling showtextstat() */ rho2z(smcdata.rerhoCU, smcdata.imrhoCU, &r, &j); r*=smcdata.z0; j*=smcdata.z0; float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2); float2prefs(fabs(j), b2, 0); strcat(b, b2); strcpy(b2, b); sprintf(b, statlabelname[labelzCU], b2); gtk_label_set_text(GTK_LABEL(statarr[labelzCU]), b); rho2y(smcdata.rerhoCU, smcdata.imrhoCU, &r, &j); r/=smcdata.z0; j/=smcdata.z0; float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2); float2prefs(fabs(j), b2, 0); strcat(b, b2); strcpy(b2, b); sprintf(b, statlabelname[labelyCU], b2); gtk_label_set_text(GTK_LABEL(statarr[labelyCU]), b); r=smcdata.rerhoCU; j=smcdata.imrhoCU; float2prefs(r, b, 0); sprintf(b2, "%cj", j>0. ? '+' : '-'); strcat(b, b2); float2prefs(fabs(j), b2, 0); strcat(b, b2); strcpy(b2, b); sprintf(b, statlabelname[labelrhoCU], b2); gtk_label_set_text(GTK_LABEL(statarr[labelrhoCU]), b); r=sqrt((smcdata.rerhoCU*smcdata.rerhoCU)+ (smcdata.imrhoCU*smcdata.imrhoCU)); sprintf(b, "%5.2f", (1.+r)/(1.-r)); strcpy(b2, b); sprintf(b, statlabelname[labelSWRCU], b2); gtk_label_set_text(GTK_LABEL(statarr[labelSWRCU]), b); return TRUE; } void set_first_val(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Set new value"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etbn_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTN1; } void set_second_val(GtkWidget *widget __attribute__((unused)), gpointer user_data __attribute__((unused))){ GtkWidget *lb, *etb; /* New widget for value entry */ entryval=gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(entryval), GTK_WINDOW(topwindow)); /* Entry vbox */ evb=gtk_vbox_new(FALSE, 0); /* Label */ lb=gtk_label_new("Set new value"); gtk_box_pack_start(GTK_BOX(evb), lb, FALSE, FALSE, FALSE); gtk_widget_show(lb); /* entry box */ etb=gtk_entry_new_with_max_length(20); gtk_entry_set_editable(GTK_ENTRY(etb), TRUE); gtk_signal_connect(GTK_OBJECT(etb), "activate", GTK_SIGNAL_FUNC(etbn_callback), GTK_OBJECT(etb)); gtk_box_pack_start(GTK_BOX(evb), etb, FALSE, FALSE, FALSE); gtk_widget_show(etb); /* realize in entryval separate widget */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(entryval)->vbox), evb); gtk_widget_show(entryval); gtk_widget_show(evb); gtk_widget_grab_focus(etb); entry_text_type=ETTN2; } gint etbn_callback(GtkWidget *widget __attribute__((unused)), GtkWidget *entry) { float val1, val2; char p; entry_text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry)); if(strlen(entry_text)!=0){ switch(entry_text_type) { case ETTN1: componentvaluestringdecode(entry_text, &smcdata.ELval0[smcdata.neidx], &val1, &val2, &p); break; case ETTN2: componentvaluestringdecode(entry_text, &smcdata.ELval1[smcdata.neidx], &val1, &val2, &p); break; default: printf("%s\n", entry_text); } recalc(); showtextstat(); showcircdesc(); entry_text_type=ETTNULL; drawchart(); gtk_widget_draw(scarea, NULL); } gtk_widget_destroy(entryval); return TRUE; }