CEBL  2.1
TabDevice.cpp
Go to the documentation of this file.
1 
7 #include "TabDevice.hpp"
8 #include "DataSourceCombo.hpp"
9 #include "WidgetUtils.hpp"
10 #include "WidgetPanel.hpp"
11 #include "StatusBar.hpp"
12 //----------------------------------------------------------------------
13 // Constructors / Destructor
14 
16 {
17  delete mindset_panel;
18 }
19 
20 
21 //----------------------------------------------------------------------
22 // Create the GUI
23 
24 
26 {
27  //add title
28  GtkWidget *title = gtk_label_new("");
29  gtk_label_set_markup(GTK_LABEL(title),"<big>Data Source</big>");
30  TabAdd(title);
31  TabAdd(gtk_hseparator_new());
32 
33 
34  GtkWidget * box_data_selector = gtk_hbox_new(false, 0);
35  gtk_box_pack_start(GTK_BOX(box_data_selector),this->getView()->getDataSource()->getCombo(),false,false,0);
36  TabAdd(box_data_selector,false,false,0);
37 
38  //============================================================
39  // Mindset Configuration
40  mindset_device_box = gtk_vbox_new(false,0);
41 
42  //----------------------------------------
43 
44 
45  mindset_panel = new WidgetPanel;
46  mindset_panel->add("DeviceLocation","Where is the device located?",getView()->getModel()->deviceGetLocation());
47  g_signal_connect(G_OBJECT(mindset_panel->getWidget(0)),
48  "changed",
49  G_CALLBACK(CB_ChangeLocation),
50  (gpointer) this);
51 
52  gtk_box_pack_start(GTK_BOX(mindset_device_box),gtk_label_new("Mindset Configuration"),false,false,0);
53  gtk_box_pack_start(GTK_BOX(mindset_device_box),gtk_hseparator_new(),false,false,0);
54  gtk_box_pack_start(GTK_BOX(mindset_device_box),mindset_panel->getContainer(),false,false,0);
55 
56 
57 
58  //-------------------------
59  //search button
60  btn_search = gtk_button_new_with_label("Search For Amplifier");
61  g_signal_connect(G_OBJECT(btn_search),
62  "clicked",
63  G_CALLBACK(CB_DeviceSearch),
64  (gpointer) this);
65  GtkWidget *btn_box = gtk_hbutton_box_new();
66  gtk_button_box_set_layout(GTK_BUTTON_BOX(btn_box),GTK_BUTTONBOX_SPREAD);
67  gtk_box_pack_start(GTK_BOX(btn_box),btn_search, false, false, 0);
68 
69 
70  gtk_box_pack_start(GTK_BOX(mindset_device_box),btn_box,false,false,0);
71 
72  //-------------------------
73  //error frame
74  GdkColor color;
75  gdk_color_parse ("red", &color);
76 
77  GtkWidget *error_frame = gtk_frame_new("");
78  GtkWidget *error_label = gtk_label_new("Device Errors");
79  gtk_widget_modify_fg(error_label, GTK_STATE_NORMAL, &color);
80  gtk_frame_set_label_widget(GTK_FRAME(error_frame),error_label);
81 
82 
83  gtk_widget_set_size_request(error_frame,500,220);
84  error_text = gtk_label_new("Device Configuration Errors");
85  gtk_label_set_line_wrap(GTK_LABEL(error_text),true);
86 
87  //error box
88  gtk_container_add(GTK_CONTAINER(error_frame),error_text);
89  error_box = gtk_hbox_new(true, 0);
90  gtk_box_pack_start(GTK_BOX(error_box),error_frame,false, false, 40);
91 
92  gtk_box_pack_start(GTK_BOX(mindset_device_box),error_box,false,false,0);
93  //-------------------------
94  inquiry_box = gtk_hbox_new(false, 0);
95  inquiry_text = gtk_label_new("");
96  gtk_box_pack_start(GTK_BOX(inquiry_box),inquiry_text,true,true,25);
97 
98  gtk_box_pack_start(GTK_BOX(mindset_device_box),inquiry_box,false,false,0);
99 
100 
101  TabAdd(mindset_device_box);
102  //============================================================
103  // File Configuration
104  file_stream_box = gtk_vbox_new(false,0);
105  string loaded_file = "None";
106 
107  //button box for load file button
108  GtkWidget *file_btn_box = gtk_hbutton_box_new();
109  gtk_button_box_set_layout(GTK_BUTTON_BOX(btn_box),GTK_BUTTONBOX_START);
110 
111  file_btn_load = gtk_button_new_with_label("Load File");
112  g_signal_connect(G_OBJECT(file_btn_load),
113  "clicked",
114  G_CALLBACK(CB_LoadDataSourceFile),
115  (gpointer) this);
116  gtk_box_pack_start(GTK_BOX(file_btn_box),file_btn_load,false,false,2);
117 
118  //label to indicate name of loaded file
119  GtkWidget *label_file = gtk_label_new("");
120  gtk_label_set_markup(GTK_LABEL(label_file),"<b>Loaded File: </b>");
121  label_filename = gtk_label_new(loaded_file.c_str());
122  GtkWidget *hbox_filename = gtk_hbox_new(false,0);
123 
124  gtk_box_pack_start(GTK_BOX(file_stream_box),file_btn_box, false, false, 2);
125 
126  gtk_box_pack_start(GTK_BOX(hbox_filename),label_file,false,false,0);
127  gtk_box_pack_start(GTK_BOX(hbox_filename),label_filename,false,false,0);
128 
129 
130  gtk_box_pack_start(GTK_BOX(file_stream_box),hbox_filename, false, false, 2);
131 
132 
133  //data info labels
134  file_label_info_text = gtk_label_new("");
135  gtk_box_pack_start(GTK_BOX(file_stream_box),file_label_info_text, false, false, 2);
136 
137  //pack file stream configuration box into the tab
138  TabAdd(file_stream_box);
139 
140  this->updating_view = false;
141 }
142 
143 //update the view from the model
145 {
146  this->updating_view = true;
147 
148  string source_name = this->getView()->getDataSource()->getSelectedSource();
149  gtk_widget_hide(this->mindset_device_box);
150  gtk_widget_hide(this->file_stream_box);
151  if(source_name == "Mindset")
152  {
153  //set status message
154  StatusID status_id = this->getView()->getStatusBar()->push("Searching for NeuroPulse Mindset...");
155 
156  //get inquiry about device
157  string inquiry = this->getView()->getModel()->deviceGetInquiry();
158  string error = this->getView()->getModel()->deviceGetError();
159  string location = this->getView()->getModel()->deviceGetLocation();
160 
161 
162  //set device location
163  gtk_entry_set_text(GTK_ENTRY(mindset_panel->getWidget(0)),location.c_str());
164 
165  //show/hide error box
166  if(!this->getView()->getModel()->deviceIsReady())
167  {
168  gtk_widget_show(error_box);
169  gtk_label_set_text(GTK_LABEL(error_text),error.c_str());
170  }
171  else
172  {
173  gtk_widget_hide(error_box);
174  }
175 
176  //show/hide inquiry box
177  if(inquiry != "")
178  {
179  gtk_widget_show(inquiry_box);
180  gtk_label_set_text(GTK_LABEL(inquiry_text),inquiry.c_str());
181  }
182  else
183  {
184  gtk_widget_hide(inquiry_box);
185  }
186  gtk_widget_show(this->mindset_device_box);
187 
188  //remove status message
189  this->getView()->getStatusBar()->remove(status_id);
190  }
191  else if(source_name=="File")
192  {
193  string filename = this->getView()->getModel()->fileStreamGetFilename();
194  int num_samples = this->getView()->getModel()->fileStreamGetNumSamples();
195  int num_channels = this->getView()->getModel()->fileStreamGetNumChannels();
196  int sample_rate = this->getView()->getModel()->fileStreamGetSampleRate();
197  int num_classes = this->getView()->getModel()->fileStreamGetNumClasses();
198  int num_sequences = this->getView()->getModel()->fileStreamGetNumSequences();
199 
200  gtk_label_set_markup(GTK_LABEL(this->label_filename),filename.c_str());
201 
202  if(num_samples == 0 || num_channels < 2)
203  {
204  gtk_widget_hide(this->file_label_info_text);
205  }
206  else
207  {
208  string info_string = "Channels:\t " + TextUtils::IntToString(num_channels) + "\n"
209  + "Samples:\t " + TextUtils::IntToString(num_samples) + "\n"
210  + "Sample Rate: " + TextUtils::IntToString(sample_rate) + "\n";
211 
212  if(num_classes > 0)
213  {
214  info_string += "<b>Data is separated into</b>:\n "
215  + TextUtils::IntToString(num_classes) + " classes and "
216  + TextUtils::IntToString(num_sequences) + " sequences per class.\n";
217 
218  }
219 
220  gtk_label_set_markup(GTK_LABEL(this->file_label_info_text),info_string.c_str());
221  gtk_widget_show(this->file_label_info_text);
222  }
223 
224 
225  gtk_widget_show(this->file_stream_box);
226  }
227  this->updating_view = false;
228 }
229 
230 
231 //update the model from the widgets
233 {
234 
235 }
236 
237 //----------------------------------------------------------------------
238 // CALLBACKS
239 
240 void TabDevice::CB_DeviceSearch(GtkWidget *widget, gpointer data)
241 {
242  TabDevice * tab = (TabDevice *)data;
243  if(tab->updating_view)
244  return;
245  StatusID status_id = tab->getView()->getStatusBar()->push("Searching for NeuroPulse Mindset...");
246  tab->getView()->getModel()->deviceSearch();
247  tab->getView()->getStatusBar()->remove(status_id);
248  tab->updateView();
249 }
250 void TabDevice::CB_ChangeLocation(GtkWidget *widget, gpointer data)
251 {
252  TabDevice * tab = (TabDevice *)data;
253  if(tab->updating_view)
254  return;
255 
256  tab->getView()->getModel()->deviceSetDeviceLocation(gtk_entry_get_text(GTK_ENTRY(tab->mindset_panel->getWidget(0))));
257  tab->updateView();
258 }
259 void TabDevice::CB_ChangeBlockSize(GtkWidget *widget, gpointer data)
260 {
261  // TabDevice * tab = (TabDevice *)data;
262 
263 }
264 void TabDevice::CB_ChangeSampleRate(GtkWidget *widget, gpointer data)
265 {
266  //TabDevice * tab = (TabDevice *)data;
267 }
268 
269 
270 //-------------------------------------------------
271 // callbacks for file configuration
272 void TabDevice::CB_LoadDataSourceFile(GtkWidget *widget, gpointer data)
273 {
274  TabDevice * tab = (TabDevice *)data;
275 
276 
277  string filename = WidgetUtils::selectLoadFile();
278  if(filename == "")
279  return;
280 
281 
282  try
283  {
284  //send this file load to the controller
285  WidgetUtils::waitBoxShow("Loading data file...",false);
286  tab->getView()->getModel()->fileStreamOpenFile(filename);
288  }
289  catch(exception e)
290  {
292  string message = string("Failed to open file. ") + e.what();
293  WidgetUtils::AlertError("Error",message);
294  }
295 
296 
297  //update the channels widgets
298  tab->updateView();
299 
300 }
301