/tags/rel-0-1-2/FreeSpeech/vflow/src/Probe.cc

# · C++ · 341 lines · 246 code · 64 blank · 31 comment · 21 complexity · ef5bfed28a9bb23602e70626c33398d9 MD5 · raw file

  1. // Copyright (C) 1999 Jean-Marc Valin
  2. //
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2, or (at your option)
  6. // any later version.
  7. //
  8. // This program is distributed in the hope that it will be useful, but
  9. // WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. // General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with this file. If not, write to the Free Software Foundation,
  15. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #include "Probe.h"
  17. #include "net_types.h"
  18. #include "Object.h"
  19. #include <gnome.h>
  20. //DECLARE_NODE(Probe)
  21. NODE_INFO(Probe, "Probe", "INPUT", "OUTPUT", "BREAK_AT:SHOW:SKIP")
  22. static void rename_button(GtkWidget *button, char *str)
  23. {
  24. gtk_label_set_text(GTK_LABEL(g_list_last(gtk_container_children(GTK_CONTAINER(GTK_BIN(button)->child)))->data), str);
  25. }
  26. static void next_click (GtkButton *button, Probe *pr)
  27. {
  28. pr->next();
  29. }
  30. static void cont_click (GtkButton *button, Probe *pr)
  31. {
  32. pr->cont();
  33. }
  34. static void break_click (GtkButton *button, Probe *pr)
  35. {
  36. pr->setBreak();
  37. }
  38. static void show_hide_click (GtkButton *button, Probe *pr)
  39. {
  40. pr->show_hide();
  41. }
  42. Probe::Probe(string nodeName, ParameterSet params)
  43. : Node(nodeName, params)
  44. {
  45. outputID = addOutput("OUTPUT");
  46. inputID = addInput("INPUT");
  47. sem_init(&sem, 0, 0);
  48. traceEnable=true;
  49. displayEnable=true;
  50. skip = 1;
  51. breakAt=0;
  52. if (parameters.exist("BREAK_AT"))
  53. {
  54. breakAt = dereference_cast<int> (parameters.get("BREAK_AT"));
  55. if (breakAt == -1)
  56. traceEnable=false;
  57. }
  58. if (parameters.exist("SHOW"))
  59. {
  60. displayEnable = dereference_cast<bool> (parameters.get("SHOW"));
  61. }
  62. if (parameters.exist("SKIP"))
  63. {
  64. skip = dereference_cast<int> (parameters.get("SKIP"));
  65. }
  66. }
  67. Probe::~Probe()
  68. {
  69. //cerr << "Probe destructor\n";
  70. gdk_threads_enter();
  71. gtk_widget_destroy (window1);
  72. gdk_threads_leave();
  73. sem_destroy(&sem);
  74. }
  75. void Probe::specificInitialize()
  76. {
  77. this->Node::specificInitialize();
  78. gdk_threads_enter();
  79. try {
  80. //GtkWidget *window1;
  81. //GtkWidget *vbox2;
  82. GtkWidget *handlebox2;
  83. GtkWidget *toolbar2;
  84. GtkWidget *tmp_toolbar_icon;
  85. //GtkWidget *button16;
  86. //GtkWidget *button17;
  87. GtkWidget *scrolledwindow2;
  88. GtkWidget *canvas2;
  89. window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  90. gtk_object_set_data (GTK_OBJECT (window1), "window1", window1);
  91. gtk_window_set_title (GTK_WINDOW (window1), _("window2"));
  92. vbox2 = gtk_vbox_new (FALSE, 0);
  93. gtk_widget_ref (vbox2);
  94. gtk_object_set_data_full (GTK_OBJECT (window1), "vbox2", vbox2,
  95. (GtkDestroyNotify) gtk_widget_unref);
  96. gtk_widget_show (vbox2);
  97. gtk_container_add (GTK_CONTAINER (window1), vbox2);
  98. handlebox2 = gtk_handle_box_new ();
  99. gtk_widget_ref (handlebox2);
  100. gtk_object_set_data_full (GTK_OBJECT (window1), "handlebox2", handlebox2,
  101. (GtkDestroyNotify) gtk_widget_unref);
  102. gtk_widget_show (handlebox2);
  103. gtk_box_pack_start (GTK_BOX (vbox2), handlebox2, FALSE, FALSE, 0);
  104. gtk_handle_box_set_snap_edge (GTK_HANDLE_BOX (handlebox2), GTK_POS_LEFT);
  105. toolbar2 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);
  106. gtk_widget_ref (toolbar2);
  107. gtk_object_set_data_full (GTK_OBJECT (window1), "toolbar2", toolbar2,
  108. (GtkDestroyNotify) gtk_widget_unref);
  109. gtk_widget_show (toolbar2);
  110. gtk_container_add (GTK_CONTAINER (handlebox2), toolbar2);
  111. tmp_toolbar_icon = gnome_stock_pixmap_widget (window1, GNOME_STOCK_PIXMAP_REDO);
  112. button16 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
  113. GTK_TOOLBAR_CHILD_BUTTON,
  114. NULL,
  115. _("Next"),
  116. NULL, NULL,
  117. tmp_toolbar_icon, NULL, NULL);
  118. gtk_widget_ref (button16);
  119. gtk_object_set_data_full (GTK_OBJECT (window1), "button16", button16,
  120. (GtkDestroyNotify) gtk_widget_unref);
  121. gtk_button_set_relief(GTK_BUTTON(button16), GTK_RELIEF_NONE);
  122. gtk_widget_show (button16);
  123. gtk_signal_connect (GTK_OBJECT (button16), "clicked",
  124. GTK_SIGNAL_FUNC (next_click),
  125. this);
  126. gtk_widget_set_sensitive(button16, false);
  127. //cerr << "registered " << this << endl;
  128. tmp_toolbar_icon = gnome_stock_pixmap_widget (window1, GNOME_STOCK_PIXMAP_STOP);
  129. button17 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
  130. GTK_TOOLBAR_CHILD_BUTTON,
  131. NULL,
  132. _("Break"),
  133. NULL, NULL,
  134. tmp_toolbar_icon, NULL, NULL);
  135. gtk_widget_ref (button17);
  136. gtk_object_set_data_full (GTK_OBJECT (window1), "button17", button17,
  137. (GtkDestroyNotify) gtk_widget_unref);
  138. gtk_button_set_relief(GTK_BUTTON(button17), GTK_RELIEF_NONE);
  139. gtk_widget_show (button17);
  140. if (traceEnable)
  141. gtk_widget_set_sensitive(button17, false);
  142. gtk_signal_connect (GTK_OBJECT (button17), "clicked",
  143. GTK_SIGNAL_FUNC (break_click),
  144. this);
  145. tmp_toolbar_icon = gnome_stock_pixmap_widget (window1, GNOME_STOCK_PIXMAP_EXEC);
  146. button18 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
  147. GTK_TOOLBAR_CHILD_BUTTON,
  148. NULL,
  149. _("Continue"),
  150. NULL, NULL,
  151. tmp_toolbar_icon, NULL, NULL);
  152. gtk_widget_ref (button18);
  153. gtk_object_set_data_full (GTK_OBJECT (window1), "button18", button18,
  154. (GtkDestroyNotify) gtk_widget_unref);
  155. gtk_button_set_relief(GTK_BUTTON(button18), GTK_RELIEF_NONE);
  156. gtk_widget_show (button18);
  157. gtk_signal_connect (GTK_OBJECT (button18), "clicked",
  158. GTK_SIGNAL_FUNC (cont_click),
  159. this);
  160. if (!traceEnable)
  161. gtk_widget_set_sensitive(button18, false);
  162. const char *hide_name;
  163. if (displayEnable)
  164. hide_name=_("Hide");
  165. else
  166. hide_name=_("Show");
  167. tmp_toolbar_icon = gnome_stock_pixmap_widget (window1, GNOME_STOCK_PIXMAP_CLOSE);
  168. button19 = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar2),
  169. GTK_TOOLBAR_CHILD_BUTTON,
  170. NULL,
  171. hide_name,
  172. NULL, NULL,
  173. tmp_toolbar_icon, NULL, NULL);
  174. gtk_widget_ref (button19);
  175. gtk_object_set_data_full (GTK_OBJECT (window1), "button19", button19,
  176. (GtkDestroyNotify) gtk_widget_unref);
  177. gtk_button_set_relief(GTK_BUTTON(button19), GTK_RELIEF_NONE);
  178. gtk_widget_show (button19);
  179. gtk_signal_connect (GTK_OBJECT (button19), "clicked",
  180. GTK_SIGNAL_FUNC (show_hide_click),
  181. this);
  182. entry1 = gtk_entry_new_with_max_length (11);
  183. gtk_entry_set_editable(GTK_ENTRY(entry1),false);
  184. gtk_widget_ref (entry1);
  185. gtk_object_set_data_full (GTK_OBJECT (window1), "entry1", entry1,
  186. (GtkDestroyNotify) gtk_widget_unref);
  187. gtk_widget_show (entry1);
  188. gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar2), entry1, NULL, NULL);
  189. gtk_widget_show(window1);
  190. } catch (BaseException *e)
  191. {
  192. throw e->add(new NodeException(this, "Exception caught in Probe::specifigInitialize", __FILE__, __LINE__));
  193. }
  194. gdk_threads_leave();
  195. }
  196. void Probe::reset()
  197. {
  198. this->Node::reset();
  199. }
  200. void Probe::next()
  201. {
  202. //cerr << "In Probe::next\n";
  203. sem_post(&sem);
  204. }
  205. void Probe::cont()
  206. {
  207. traceEnable = false;
  208. //gdk_threads_enter();
  209. gtk_widget_set_sensitive(button18, false);
  210. gtk_widget_set_sensitive(button17, true);
  211. //gdk_threads_leave();
  212. next();
  213. }
  214. void Probe::setBreak()
  215. {
  216. traceEnable = true;
  217. //gdk_threads_enter();
  218. gtk_widget_set_sensitive(button17, false);
  219. gtk_widget_set_sensitive(button18, true);
  220. //gtk_label_set_text(GTK_LABEL(GTK_BIN(button18)->child), "tata");
  221. //gtk_label_set_text(GTK_LABEL(g_list_last(gtk_container_children(GTK_CONTAINER(GTK_BIN(button18)->child)))->data), "tata");
  222. //gdk_threads_leave();
  223. }
  224. void Probe::show_hide()
  225. {
  226. displayEnable = !displayEnable;
  227. if (displayEnable)
  228. {
  229. rename_button(button19, "Hide");
  230. }
  231. else
  232. {
  233. rename_button(button19, "Show");
  234. }
  235. }
  236. void Probe::display()
  237. {
  238. }
  239. void Probe::trace()
  240. {
  241. gdk_threads_enter();
  242. gtk_widget_set_sensitive(button16, true);
  243. //gtk_widget_set_sensitive(button17, false);
  244. gtk_widget_set_sensitive(button18, true);
  245. gdk_threads_leave();
  246. sem_wait(&sem);
  247. gdk_threads_enter();
  248. //gtk_widget_set_sensitive(button17, true);
  249. gtk_widget_set_sensitive(button16, false);
  250. gtk_widget_set_sensitive(button18, false);
  251. gdk_threads_leave();
  252. }
  253. ObjectRef Probe::getOutput(int output_id, int count)
  254. {
  255. if (output_id==outputID)
  256. {
  257. NodeInput input = inputs[inputID];
  258. inputValue = input.node->getOutput(input.outputID,count);
  259. if (count % skip == 0)
  260. {
  261. gdk_threads_enter();
  262. char tmp[16];
  263. sprintf (tmp,"%d",count);
  264. gtk_entry_set_text(GTK_ENTRY(entry1),tmp);
  265. gdk_threads_leave();
  266. }
  267. if (displayEnable && (count % skip == 0))
  268. display();
  269. if (count==breakAt)
  270. traceEnable = true;
  271. if (traceEnable && (count % skip == 0))
  272. trace();
  273. return inputValue;
  274. }
  275. else
  276. throw NodeException (this, "Probe: Unknown output id", __FILE__, __LINE__);
  277. }