MNE-CPP  beta 1.0
stcdataworker.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //*************************************************************************************************************
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "stcdataworker.h"
42 
43 
44 //*************************************************************************************************************
45 //=============================================================================================================
46 // Qt INCLUDES
47 //=============================================================================================================
48 
49 #include <QDebug>
50 
51 
52 //*************************************************************************************************************
53 //=============================================================================================================
54 // USED NAMESPACES
55 //=============================================================================================================
56 
57 using namespace DISP3DNEWLIB;
58 
59 
60 //*************************************************************************************************************
61 //=============================================================================================================
62 // DEFINE MEMBER METHODS
63 //=============================================================================================================
64 
65 StcDataWorker::StcDataWorker(QObject *parent)
66 : QThread(parent)
67 , m_bIsRunning(false)
68 , m_bIsLooping(true)
69 , m_iAverageSamples(1)
70 , m_iCurrentSample(0)
71 , m_iUSecIntervall(1000)
72 {
73  m_data.clear();
74 }
75 
76 
77 //*************************************************************************************************************
78 
79 StcDataWorker::~StcDataWorker()
80 {
81  if(this->isRunning())
82  stop();
83 }
84 
85 
86 //*************************************************************************************************************
87 
88 void StcDataWorker::addData(QList<VectorXd> &data)
89 {
90  //std::cout<<"START::StcDataWorker::addData"<<std::endl;
91 
92  QMutexLocker locker(&m_qMutex);
93  if(data.size() == 0)
94  return;
95 
96  m_data.append(data);
97 
98  //std::cout<<"END::StcDataWorker::addData"<<std::endl;
99 }
100 
101 
102 //*************************************************************************************************************
103 
104 void StcDataWorker::clear()
105 {
106  QMutexLocker locker(&m_qMutex);
107  m_data.clear();
108 }
109 
110 
111 //*************************************************************************************************************
112 
113 void StcDataWorker::run()
114 {
115  VectorXd t_vecAverage(0,0);
116 
117  m_bIsRunning = true;
118 
119  while(true)
120  {
121  //std::cout<<"StcDataWorker Running ... "<<std::endl;
122  {
123  QMutexLocker locker(&m_qMutex);
124  if(!m_bIsRunning)
125  break;
126  }
127 
128  bool doProcessing = false;
129  {
130  QMutexLocker locker(&m_qMutex);
131  if(!m_data.isEmpty() && m_data.size() > 0)
132  doProcessing = true;
133  }
134 
135  if(doProcessing)
136  {
137  if(m_bIsLooping)
138  {
139  m_qMutex.lock();
140  //Down sampling in loop mode
141 // std::cout<<"StcDataWorker::run() - m_data.size(): "<<m_data.size()<<std::endl;
142 // std::cout<<"StcDataWorker::run() - m_iCurrentSample: "<<m_iCurrentSample<<std::endl;
143 
144  if(t_vecAverage.rows() != m_data[0].rows())
145  t_vecAverage = m_data[m_iCurrentSample%m_data.size()];
146  else
147  t_vecAverage += m_data[m_iCurrentSample%m_data.size()];
148  m_qMutex.unlock();
149  }
150  else
151  {
152  m_qMutex.lock();
153  //Down sampling in stream mode
154  if(t_vecAverage.rows() != m_data[0].rows())
155  t_vecAverage = m_data.front();
156  else
157  t_vecAverage += m_data.front();
158 
159  m_data.pop_front();
160  m_qMutex.unlock();
161  }
162 
163  m_qMutex.lock();
164  m_iCurrentSample+=1;
165 
166  if((m_iCurrentSample/1)%m_iAverageSamples == 0)
167  {
168  t_vecAverage /= (double)m_iAverageSamples;
169 
170  emit stcSample(t_vecAverage);
171  t_vecAverage = VectorXd::Zero(t_vecAverage.rows());
172  }
173  m_qMutex.unlock();
174  }
175 
176  QThread::msleep(m_iUSecIntervall);
177  }
178 }
179 
180 
181 //*************************************************************************************************************
182 
183 void StcDataWorker::setAverage(qint32 samples)
184 {
185  QMutexLocker locker(&m_qMutex);
186  m_iAverageSamples = samples;
187 }
188 
189 
190 //*************************************************************************************************************
191 
192 void StcDataWorker::setInterval(int usec)
193 {
194  QMutexLocker locker(&m_qMutex);
195  m_iUSecIntervall = usec;
196 }
197 
198 
199 //*************************************************************************************************************
200 
201 void StcDataWorker::setLoop(bool looping)
202 {
203  QMutexLocker locker(&m_qMutex);
204  m_bIsLooping = looping;
205 }
206 
207 
208 //*************************************************************************************************************
209 
210 void StcDataWorker::stop()
211 {
212  m_qMutex.lock();
213  m_bIsRunning = false;
214  m_qMutex.unlock();
215 
216  QThread::wait();
217 }
StcDataWorker class declaration.