Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
VideoSource_Controller.cpp
1 #ifdef WIN32
2 // workaround for wx 2.6.x redefiniton of _CRT_SECURE_NO_DEPRECATE
3 // fixed in wx 2.7.2
4 # pragma warning(disable: 4005)
5 #endif
6 
7 //include first, avoid macro collision
8 #include <Gui/StringConv.hh>
9 
10 #include "VideoSource_Controller.hh"
11 #include <Base/Common/getopt_W32.h>
12 
13 #if defined(WIN32) && defined(HAVE_TRIGGER_CLASSES)
14 # include "TriggerIOControl.h"
15 #endif
16 
17 #ifdef BIAS_HAVE_DCAM
18 # include <VideoSource/VideoSource_DCAM.hh>
19 #endif
20 
21 #include <iostream>
22 #include <Base/Image/ImageIO.hh>
23 #include <Image/Camera.hh>
24 
25 using namespace std;
26 using namespace BIAS;
27 
28 BEGIN_EVENT_TABLE(VideoSource_Controller, wxFrame)
29  EVT_KEY_UP(VideoSource_Controller::OnKeyUp)
30  EVT_CLOSE(VideoSource_Controller::OnClose)
31  EVT_BUTTON(ID_HIDE, VideoSource_Controller::OnHide)
32  EVT_COMMAND_SCROLL(ID_GAIN, VideoSource_Controller::OnGain)
33  EVT_COMMAND_SCROLL(ID_SHUTTER, VideoSource_Controller::OnShutter)
34  EVT_COMMAND_SCROLL(ID_WBMANUAL, VideoSource_Controller::OnWhiteBalanceManual)
35  EVT_COMMAND_SCROLL(ID_BRIGHTNESS, VideoSource_Controller::OnBrightness)
36  EVT_COMMAND_SCROLL(ID_CONTRAST, VideoSource_Controller::OnContrast)
37  EVT_BUTTON(ID_BUTTON_AUTO_SHUTTER, VideoSource_Controller::OnAuto_Shutter)
38  EVT_BUTTON(ID_BUTTON_AUTO_BRIGHTNESS, VideoSource_Controller::OnAuto_Brightness)
39  EVT_BUTTON(ID_BUTTON_WHITEBALANCE, VideoSource_Controller::OnWhiteBalance)
40  EVT_BUTTON(ID_BUTTON_AUTO_GAIN, VideoSource_Controller::OnAuto_Gain)
41  EVT_BUTTON(ID_BUTTON_UPDATE, VideoSource_Controller::OnUpdate)
42 END_EVENT_TABLE()
43 
44 
47  wxWindow *parent,
48  const string &title,
49  double minShutter, double maxShutter,
50  double minGain,double maxGain,
51  double minContrast,double maxContrast,
52  double minBrightness,double maxBrightness)
53 : VideoSource_Controller_Base(parent, wxID_ANY, (AsciiToWx(title.c_str())),
54  wxDefaultPosition, wxSize(400,500), wxSTAY_ON_TOP|wxCAPTION | wxRESIZE_BORDER)
55  {
56 
57  Cam_ = cam;
58 
59  minShutter_=minShutter;
60  maxShutter_=maxShutter;
61  minGain_= minGain;
62  maxGain_= maxGain;
63  minContrast_= minContrast;
64  maxContrast_= maxContrast;
65  minBrightness_= minBrightness;
66  maxBrightness_= maxBrightness;
67 
68  Initialize_();
69 
70 }
71 
72 
73 
74 VideoSource_Controller::
75 ~VideoSource_Controller()
76 {}
77 
78 void VideoSource_Controller::
79 Initialize_()
80 {
81  if(minShutter_ == -1 && maxShutter_ == -1)
82  Cam_->GetShutterRange(minShutter_, maxShutter_);
83 
84  if(minGain_ == -1 && maxGain_ == -1)
85  Cam_->GetGainRange(minGain_, maxGain_);
86 
87  if(minContrast_ == -1 && maxContrast_ == -1)
88  Cam_->GetContrastRange(minContrast_, maxContrast_);
89 
90  if(minBrightness_ == -1 && maxBrightness_ == -1)
91  Cam_->GetBrightnessRange(minBrightness_, maxBrightness_);
92 
93 
94  SliderGain = NULL;
95  SliderShutter= NULL;
96  SliderWbRed= NULL;
97  SliderWbBlue= NULL;
98  SliderBrightness= NULL;
99  SliderContrast= NULL;
100  showButton = NULL;
101  whiteBalanceButton = NULL;
102  auto_sh_Button = NULL;
103  auto_ga_Button = NULL;
104  auto_br_Button = NULL;
105  auto_co_Button = NULL;
106  update_Button = NULL;
107  sliderBox_ShGa = NULL;
108 
109  LetterAscii_ = WXK_F4;
110  Ctrl_ = false;
111  Shift_ = false;
112  Alt_ = true;
113  //Shut the Automode DOWN
114  auto_gain = false;
115  auto_shutter = false;
116  auto_brightness = false;
117  sliderBox_ShGa_Visible = true;
118  vBoxVisible = true;
119 
120  SetShutterRange((unsigned)minShutter_,(unsigned)maxShutter_);
121  SetGainRange((unsigned)minGain_,(unsigned)maxGain_);
122 
123  wxSize SlSize(200,35);
124  wxSize BtSize(60,30);
125 
126  // the sizer
127  wxFlexGridSizer* itemFlexGridSizer = new wxFlexGridSizer(11, 3, 0, 0);
128  this->SetSizer(itemFlexGridSizer);
129 
130  if (Cam_->HasControlWhiteBalance()){
131  ////////////// White Balance
132  whiteBalanceButton = new wxButton(this, ID_BUTTON_WHITEBALANCE,
133  wxT("Auto Software\nWhite Balance"),wxDefaultPosition,wxSize(120,60));
134 
135  wxStaticText *textWbr = new wxStaticText(this,ID_TEXT, wxT("red gain"));
136  SliderWbRed = new wxSlider(this, ID_WBMANUAL, 50, 0, 100,
137  wxDefaultPosition,SlSize,
138  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
139  wxDefaultValidator, wxT("RedGain"));
140 
141  SliderWbRed->Enable(true);
142  //small sizer
143  wxBoxSizer *slWbr = new wxBoxSizer(wxVERTICAL);
144  slWbr->Add(textWbr,0,wxALL,2);
145  slWbr->Add(SliderWbRed,0,wxALL, 2);
146 
147 
148  wxStaticText *textWbb = new wxStaticText(this,ID_TEXT, wxT("blue gain"));
149  SliderWbBlue = new wxSlider(this, ID_WBMANUAL, 50, 0, 100,
150  wxDefaultPosition,SlSize,
151  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
152  wxDefaultValidator, wxT("BlueGain"));
153 
154  SliderWbBlue->Enable(true);
155  //small sizers
156  wxBoxSizer *slWbb = new wxBoxSizer(wxVERTICAL);
157  slWbb->Add(textWbb,0,wxALL,2);
158  slWbb->Add(SliderWbBlue,0,wxALL, 2);
159 
160  //add to sizer
161  itemFlexGridSizer->Add(whiteBalanceButton,0,
162  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
163  itemFlexGridSizer->Add(slWbr,0,
164  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
165  itemFlexGridSizer->Add(slWbb,0,
166  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
167  }//end Cam_->HasControlWhiteBalance()
168  /////////////////////////// Brightness //////////////////////
169  if (Cam_->HasControlBrightness()){
170  wxStaticText *textBr = new wxStaticText(this,ID_TEXT, wxT("Brightness"));
171  SliderBrightness = new wxSlider(this, ID_BRIGHTNESS, 157, 0, 255,
172  wxDefaultPosition,SlSize,
173  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
174  wxDefaultValidator, wxT("Brightness"));
175 
176  auto_br_Button = new wxButton(this, ID_BUTTON_AUTO_BRIGHTNESS,
177  wxT("Manual"),wxDefaultPosition,BtSize);
178 
179  SliderBrightness->Enable(true);
180 
181  itemFlexGridSizer->Add(textBr,0,
182  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
183  itemFlexGridSizer->Add(SliderBrightness,0,
184  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
185  itemFlexGridSizer->Add(auto_br_Button,0,
186  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
187  }
188  ///////////////////////////// Gain /////////////////////
189  if (Cam_->HasControlGain()){
190  wxStaticText *textGa = new wxStaticText(this,ID_TEXT, wxT("Gain [dB]"));
191  SliderGain = new wxSlider(this, ID_GAIN, int((maxGain_-minGain_)/2.0), (int)minGain_, (int)maxGain_,
192  wxDefaultPosition,SlSize,
193  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
194  wxDefaultValidator, wxT("Gain"));
195 
196  auto_ga_Button = new wxButton(this, ID_BUTTON_AUTO_GAIN,
197  wxT("Manual"),wxDefaultPosition,BtSize);
198 
199  SliderGain->Enable(true);
200 
201  itemFlexGridSizer->Add(textGa,0,
202  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
203  itemFlexGridSizer->Add(SliderGain,0,
204  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
205  itemFlexGridSizer->Add(auto_ga_Button,0,
206  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
207 
208  }
209  ///////////////////////////// Contrast /////////////////////
210  if (Cam_->HasControlContrast()){
211  wxStaticText *textContrast = new wxStaticText(this,ID_TEXT, wxT("Contrast"));
212  SliderContrast = new wxSlider(this, ID_CONTRAST, int((maxContrast_ - minContrast_)/2.0),
213  (int)minContrast_, (int)maxContrast_,
214  wxDefaultPosition,SlSize,
215  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
216  wxDefaultValidator, wxT("Gain"));
217 
218  auto_co_Button = new wxButton(this, ID_BUTTON_AUTO_CONTRAST,
219  wxT("Manual"),wxDefaultPosition,BtSize);
220 
221  SliderContrast->Enable(true);
222 
223  itemFlexGridSizer->Add(textContrast,0,
224  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
225  itemFlexGridSizer->Add(SliderContrast,0,
226  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
227  itemFlexGridSizer->Add(auto_co_Button,0,
228  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
229 
230  }
231  /////////////////////////////// Shutter ///////////////////
232  if (Cam_->HasControlShutter()){
233  wxStaticText *textShutter = new wxStaticText(this,ID_TEXT, wxT("Shutter [ms]"));
234  SliderShutter = new wxSlider(this, ID_SHUTTER, int((maxShutter_-minShutter_)/2.0),
235  (int)minShutter_, (int)maxShutter_,
236  wxDefaultPosition,SlSize,
237  wxSL_HORIZONTAL | wxSL_LABELS | wxSL_TOP |wxSL_SELRANGE,
238  wxDefaultValidator, wxT("Shutter"));
239 
240  auto_sh_Button = new wxButton(this, ID_BUTTON_AUTO_SHUTTER,
241  wxT("Manual"),wxDefaultPosition,BtSize);
242 
243  SliderShutter->Enable(true);
244  itemFlexGridSizer->Add(textShutter,0,
245  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
246  itemFlexGridSizer->Add(SliderShutter,0,
247  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
248  itemFlexGridSizer->Add(auto_sh_Button,0,
249  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
250  }
251  //////////////////////////////////////////////////
252 
253 
254  showButton = new wxButton(this, ID_HIDE, wxT("Hide"),
255  wxDefaultPosition,BtSize);
256  update_Button = new wxButton(this, ID_BUTTON_UPDATE,
257  wxT("Update"),wxDefaultPosition,BtSize);
258 
259  vBox = new wxBoxSizer(wxHORIZONTAL);
260  vBox->Add(showButton,0,wxALIGN_LEFT | wxBOTTOM);
261  vBox->Add(update_Button, 0, wxALIGN_RIGHT | wxBOTTOM);
262 
263  itemFlexGridSizer->Add(vBox,0,
264  wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
265 
266  SetAutoLayout(true);
267  Layout();
268  Fit();
269  wxCommandEvent fakeEvent;
270  OnUpdate(fakeEvent);
271  Show(true);
272 }
273 
274 bool VideoSource_Controller::
275 Show(bool show)
276 {
277  bool res = wxWindow::Show(show);
278  if (show) {
279  /// wait a moment to let wx sort its key and focus events
280  wxMilliSleep(200);
281  //SliderGain->SetFocus();
282  Raise();
283  }
284  return res;
285 
286 }
287 
288 void VideoSource_Controller::
289 SetCloseShortcut(const int &asciiCode,
290  bool ctrl, bool shift, bool alt)
291 {
292  LetterAscii_ = asciiCode;
293  Ctrl_ = ctrl;
294  Shift_ = shift;
295  Alt_ = alt;
296 }
297 
298 bool VideoSource_Controller::
299 AreModifiersCorrect_(const wxKeyEvent &event)
300 {
301  return ( (event.ShiftDown() == Shift_)
302  && (event.ControlDown() == Ctrl_)
303  && (event.AltDown() == Alt_) );
304 }
305 
306 void VideoSource_Controller::
307 SetVideoSource(BIAS::VideoSource *cam)
308 {
309  Cam_ = cam;
310 }
311 
312 void VideoSource_Controller::
313 OnKeyUp(wxKeyEvent& event)
314 {
315  int keyCode = event.GetKeyCode();
316 
317  /// hide window on shortcut
318  if ( AreModifiersCorrect_(event) ) {
319  if ( keyCode == LetterAscii_ ) {
320  Close();
321  }
322  }
323  else {
324  event.Skip();
325  }
326 }
327 
328 void VideoSource_Controller::
329 OnHide(wxCommandEvent& event)
330 {
331  Close();
332 }
333 
334 void VideoSource_Controller::
335 OnClose(wxCloseEvent& event)
336 {
337  Show(false);
338  wxWindow* parent = GetParent();
339  if ( parent != NULL ) parent->Refresh();
340 }
341 
342 void VideoSource_Controller::
343 OnGain(wxScrollEvent& event)
344 {
345  float value = (float)SliderGain->GetValue();
346  if(Cam_ != NULL){
347  auto_off(1);
348  //cout<<"Set Gain:"<<value<<endl;
349  Cam_->SetGain(value);
350  //cout<<"Get Gain:"<<Cam_->GetGain()<<endl;
351  }
352 }
353 
354 void VideoSource_Controller::
355 OnShutter(wxScrollEvent& event)
356 {
357  if(Cam_ != NULL){
358  auto_off(0);
359  float value = (float)SliderShutter->GetValue();
360  // why /10000?
361  /*
362  cout<<"Set Shutter:"<<value/10000.0<<endl;
363  int ret = Cam_->SetShutter(value/10000.0f);
364  if(ret <0) BIASERR("Setting Shutter failed!");
365  cout<<"Get Shutter:"<<Cam_->GetShutter()*10000.0<<endl;
366  */
367  cout<<"Set Shutter:"<<value<<endl;
368  int ret = Cam_->SetShutter(value);
369  if(ret <0) BIASERR("Setting Shutter failed!");
370  cout<<"Get Shutter:"<<Cam_->GetShutter()<<endl;
371  }
372 }
373 
374 void VideoSource_Controller::
375 OnWhiteBalanceManual(wxScrollEvent& event)
376 {
377  float vred = (float)(SliderWbRed->GetValue() / 100.0 - 0.5);
378  float vblue = (float)(SliderWbBlue->GetValue() / 100.0 - 0.5);
379  if(Cam_ != NULL){
380  Cam_->SetWhiteBalance(vred,vblue);
381  }
382  std::cout << vred << std::endl;
383 }
384 
385 
386 void VideoSource_Controller::
387 OnWhiteBalance(wxCommandEvent& event)
388 {
389  if(Cam_!=NULL)
390  Cam_->SoftwareWhiteBalance();
391 }
392 
393 void VideoSource_Controller::
394 OnAuto_Shutter(wxCommandEvent& event)
395 {
396  if(!auto_shutter) {
397  auto_on(0);
398  }
399  else {
400  auto_off(0);
401  }
402 }
403 
404 void VideoSource_Controller::
405 OnAuto_Gain(wxCommandEvent& event)
406 {
407  if(!auto_gain) {
408  auto_on(1);
409  }
410  else {
411  auto_off(1);
412  }
413 }
414 
415 void VideoSource_Controller::
416 OnAuto_Brightness(wxCommandEvent& event)
417 {
418  if(!auto_brightness) {
419  auto_on(2);
420  }
421  else {
422  auto_off(2);
423  }
424 }
425 
426 
427 void VideoSource_Controller::
428 OnBrightness(wxScrollEvent& event)
429 {
430  if(Cam_ != NULL){
431  auto_off(2);
432  float value = (float)SliderBrightness->GetValue();
433  //cout<<"Brightness:"<<value<<endl;
434  Cam_->SetBrightness(value);
435  }
436 }
437 
438 void VideoSource_Controller::
439 OnContrast(wxScrollEvent& event)
440 {
441  if(Cam_ != NULL){
442  // auto_off(0);
443  cout<<"SetContrast:"<<SliderContrast->GetValue()<<endl;
444  Cam_->SetContrast((float)SliderContrast->GetValue());
445  cout<<"GetContrast:"<<Cam_->GetContrast()<<endl;
446  }
447 }
448 
449 void VideoSource_Controller::
450 Update()
451 {
452  if (Cam_!= NULL) {
453  float current =0.0;
454  if (Cam_->HasControlShutter()){
455  current= (float)(Cam_->GetShutter()*1000.0);
456  if(current >=0)
457  SliderShutter->SetValue(int(current));
458  bool autoon = Cam_->GetAutoShutter();
459  if (autoon) auto_sh_Button->SetLabel(wxT("Auto"));
460  else auto_sh_Button->SetLabel(wxT("Manual"));
461  }
462  if (Cam_->HasControlGain()){
463  current = Cam_->GetGain();
464  //cout<<"GetGain:"<<current<<endl;
465  if (current >=0)
466  SliderGain->SetValue(int(current));
467  bool autoon = Cam_->GetAutoGain();
468  if (autoon) auto_ga_Button->SetLabel(wxT("Auto"));
469  else auto_ga_Button->SetLabel(wxT("Manual"));
470  }
471  if (Cam_->HasControlContrast()){
472  current = Cam_->GetContrast();
473  if (current >=0)
474  SliderContrast->SetValue(int(current));
475  }
476  if (Cam_->HasControlBrightness()){
477  current = Cam_->GetBrightness();
478  if (current >=0)
479  SliderBrightness->SetValue(int(current));
480  bool autoon = Cam_->GetAutoBrightness();
481  if (autoon) auto_br_Button->SetLabel(wxT("Auto"));
482  else auto_br_Button->SetLabel(wxT("Manual"));
483  }
484  }
485 }
486 
487 void VideoSource_Controller::
488 OnUpdate(wxCommandEvent& event)
489 {
490  Update();
491 }
492 
493 void VideoSource_Controller::
494 auto_on(int param)
495 {
496  //SHUTTER
497  if(param == 0){
498  auto_shutter = true;
499  Cam_->SetAutoShutter(true);
500  auto_sh_Button->SetLabel(wxT("Auto"));
501  }
502  //GAIN
503  else if(param == 1){
504  auto_gain = true;
505  Cam_->SetAutoGain(true);
506  auto_ga_Button->SetLabel(wxT("Auto"));
507  }
508  //Brightness
509  else if(param == 2){
510  auto_brightness = true;
511  Cam_->SetAutoBrightness(true);
512  auto_br_Button->SetLabel(wxT("Auto"));
513  }
514 }
515 
516 void VideoSource_Controller::
517 auto_off(int param)
518 {
519  //SHUTTER
520  if(param == 0){
521  auto_shutter = false;
522  Cam_->SetAutoShutter(false);
523  auto_sh_Button->SetLabel(wxT("Manual"));
524  }
525  //GAIN
526  else if(param == 1){
527  auto_gain = false;
528  Cam_->SetAutoGain(false);
529  auto_ga_Button->SetLabel(wxT("Manual"));
530  }
531  //Brightness
532  else if(param == 2){
533  auto_brightness = false;
534  Cam_->SetAutoBrightness(false);
535  auto_br_Button->SetLabel(wxT("Manual"));
536  }
537 }
538 
539 void VideoSource_Controller::
540 SetShutterRange(unsigned int min,unsigned int max)
541 {
542  if (Cam_->HasControlShutter() && SliderShutter != NULL)
543  SliderShutter->SetRange(min,max);
544 }
545 
546 void VideoSource_Controller::
547 SetGainRange(unsigned int min,unsigned int max)
548 {
549  if (Cam_->HasControlGain() && SliderGain != NULL)
550  SliderGain->SetRange(min,max);
551 }
552 
553 void VideoSource_Controller::
554 SetBrightnessRange(unsigned int min,unsigned int max)
555 {
556  if (Cam_->HasControlBrightness()&& SliderShutter != NULL)
557  SliderBrightness->SetRange(min,max);
558 }
559 
560 void VideoSource_Controller::
561 SetContrastRange(unsigned int min,unsigned int max)
562 {
563  if (Cam_->HasControlContrast() && SliderContrast!= NULL)
564  SliderContrast->SetRange(min,max);
565 }
566 
Defines a common interface to different devices.