00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "Control2Data.hxx"
00023
00024 namespace CLAM {
00025
00026 void Control2DataConfig::DefaultInit(void)
00027 {
00028 AddNumControls();
00029 UpdateData();
00030 SetNumControls(0);
00031 }
00032
00033 Control2Data::Control2Data(const Control2DataConfig& c):mStop("stop",this)
00034 {
00035 Configure(c);
00036 }
00037
00038 Control2Data::Control2Data():mStop("stop",this)
00039 {
00040 Configure(Control2DataConfig());
00041 }
00042
00043 bool Control2Data::ConcreteConfigure(const ProcessingConfig& c)
00044 {
00045 CopyAsConcreteConfig(mConfig, c);
00046 int nControls=mConfig.GetNumControls();
00047
00048
00049 mpInArray=new InControlTmplArray<Control2Data>(nControls, "array_control", this,&Control2Data::ControlCallbackId);
00050
00051
00052 BufferQueueInit( nControls );
00053
00054 mStop.DoControl(0);
00055
00056 return true;
00057
00058 }
00059
00060 bool Control2Data::Do()
00061 {
00062 IdxList::iterator ListIt;
00063 Mutex::ScopedLock lock( mControl2DataDoMutex );
00064
00065 IdxList qs = GetQueues();
00066 if (!qs.empty())
00067 {
00068 for (ListIt=qs.begin();ListIt!=qs.end() ;ListIt++ )
00069 {
00070 TControlData val = PopControl( (*ListIt) );
00071 GenerateOutputData((*ListIt),val);
00072 }
00073 }
00074 return !mStop.GetLastValue();
00075 }
00076
00077 void Control2Data::BufferQueueInit( int ncontrols )
00078 {
00079 Mutex::ScopedLock lock( mDataMutex );
00080
00081 mDataQueues.resize(0);
00082 mDataQueues.reserve(ncontrols);
00083 for (int j = 0; j < ncontrols ;j ++ )
00084 {
00085 mDataQueues.push_back( TQueue() );
00086 }
00087
00088 }
00089
00090 const ProcessingConfig& Control2Data::GetConfig() const
00091 {
00092 return mConfig;
00093 }
00094
00095
00096 void Control2Data::EnqueueControl(unsigned id, TControlData data)
00097 {
00098 Mutex::ScopedLock lock( mDataMutex );
00099
00100 #ifdef HAVE_STANDARD_VECTOR_AT
00101 mDataQueues.at(id).push(data);
00102 #else
00103 mDataQueues[id].push(data);
00104 #endif
00105
00106 }
00107
00108 Control2Data::IdxList Control2Data::GetQueues()
00109 {
00110 IdxList modifiedQs;
00111 std::vector<TQueue>::iterator it;
00112
00113 int k = 0;
00114 for (it=mDataQueues.begin(); it != mDataQueues.end() ; it++ )
00115 {
00116 if (!(*it).empty())
00117 {
00118 modifiedQs.push_back(k);
00119 }
00120 k++;
00121 }
00122 return modifiedQs;
00123 }
00124
00125 bool Control2Data::Empty(unsigned id)
00126 {
00127 Mutex::ScopedLock lock( mDataMutex );
00128
00129 #ifdef HAVE_STANDARD_VECTOR_AT
00130 return mDataQueues.at(id).empty();
00131 #else
00132 return mDataQueues[id].empty();
00133 #endif
00134
00135 }
00136
00137 TControlData Control2Data::PopControl(unsigned id)
00138 {
00139 Mutex::ScopedLock lock( mDataMutex );
00140 #ifdef HAVE_STANDARD_VECTOR_AT
00141 TControlData ret=mDataQueues.at(id).front();
00142 #else
00143 TControlData ret=mDataQueues[id].front();
00144 #endif
00145 mDataQueues[id].pop();
00146 return ret;
00147 }
00148
00149 int Control2Data::ControlCallbackId(int id, TControlData val)
00150 {
00151 EnqueueControl(id,val);
00152 return 0;
00153 }
00154
00155 };
00156