CLAM-Development  1.4.0
ControlSelector.cxx
Go to the documentation of this file.
1 #include "ControlSelector.hxx"
2 #include <iostream>
3 #include <sstream>
4 #include "ProcessingFactory.hxx"
5 
6 
7 namespace CLAM
8 {
9 namespace Hidden
10 {
11  static const char * metadata[] = {
12  "key", "ControlSelector",
13  "category", "Controls",
14  "description", "ControlSelector",
15  0
16  };
17  static FactoryRegistrator<ProcessingFactory, ControlSelector> reg = metadata;
18 }
19 
20  void ControlSelectorConfig::DefaultInit()
21  {
22  AddAll();
23  UpdateData();
24  SetNumberOfInputs(2);
25  SetDefaultIndex(1);
26  }
27 
29  : _indexControl(0,"In Control Index to send",this,&ControlSelector::InControlCallback)
30  , _outputControl("Output value",this)
31  {
32  Configure( _config );
33  }
34 
36  : _indexControl(0,"In Control Index to send",this,&ControlSelector::InControlCallback)
37  , _outputControl("Output value",this)
38  {
39  Configure( cfg );
40  }
42  {
44  }
45 
47  {
49 
50  CopyAsConcreteConfig( _config, cfg );
51 
52  _config.AddAll();
53  _config.UpdateData();
54 
55 
56  _indexControl.DoControl(_config.GetDefaultIndex());
57 
58  int nInputs = int(_config.GetNumberOfInputs());
59  if (nInputs == 0)
60  return AddConfigErrorMessage("Cannot work without any control input");
61  CreateInControls(nInputs);
62  return true;
63  }
64 
65 
66  void ControlSelector::CreateInControls(unsigned numberOfControls)
67  {
68  for (unsigned i=1; i<=numberOfControls; i++)
69  {
70  std::ostringstream controlName;
71  controlName<<"In Control Value"<<i;
72  _inControls.push_back(new FloatInControl(i,controlName.str(),this,&ControlSelector::InControlCallback));
73  std::cout<<"created control "<<i<<std::endl;
74  }
75 
76  }
78  {
79  for (unsigned i=0; i<_inControls.size();i++)
80  {
81  delete _inControls[i];
82  }
83  _inControls.clear();
84  }
85 
86  void ControlSelector::InControlCallback(unsigned controlId, const TControlData & value)
87  {
88  if (not IsConfigured()) return;
89  const unsigned index=_indexControl.GetLastValue();
90  if (controlId==0 or controlId==index+1) // index change or proper input
91  {
92  if (index>=_inControls.size())
93  {
94  std::cout<<"WARNING: control selector receiving an index number greater than the number of input controls, ignoring it"<<std::endl;
95  return;
96  }
97  _outputControl.SendControl(_inControls[index]->GetLastValue());
98  }
99  }
100 
102  {
103  return true;
104  }
105 
106 }
107