57 #include <QDataStream>
75 , m_pCollectorSock(NULL)
78 , m_bMeasInfoRequest(true)
79 , m_bMeasRequest(true)
80 , m_bMeasStopRequest(false)
81 , m_bSetBuffersizeRequest(false)
82 , m_pNeuromag(p_pNeuromag)
92 delete m_pCollectorSock;
100 bool DacqServer::getMeasInfo(
FiffInfo& p_fiffInfo)
107 #ifdef DACQ_AUTOSTART
113 bool t_bReadHeader =
true;
122 if( t_pTag->kind == FIFF_BLOCK_START && *(t_pTag->toInt()) == FIFFB_PROJ_ITEM )
124 printf(
"\tProjector... ");
128 QStringList defaultList;
137 while(!(t_pTag->kind == FIFF_BLOCK_END && *(t_pTag->toInt()) == FIFFB_PROJ_ITEM))
144 nchan = *(t_pTag->toInt());
146 case FIFF_PROJ_ITEM_CH_NAME_LIST:
150 desc = t_pTag->toString();
151 printf(
"%s... ", desc.toUtf8().constData());
153 case FIFF_PROJ_ITEM_KIND:
154 kind = *(t_pTag->toInt());
159 case FIFF_PROJ_ITEM_NVEC:
160 nvec == *(t_pTag->toInt());
163 active == *(t_pTag->toInt());
165 case FIFF_PROJ_ITEM_VECTORS:
166 data = t_pTag->toFloatMatrix().cast<
double>();
167 data.transposeInPlace();
172 FiffNamedMatrix t_fiffNamedMatrix(nvec, nchan, defaultList, names, data);
174 FiffProj one(kind, active, desc, t_fiffNamedMatrix);
176 p_fiffInfo.
projs.append(one);
178 printf(
"[done]\r\n");
184 case FIFF_BLOCK_START:
185 if(*(t_pTag->toInt()) == FIFFB_MEAS_INFO)
186 printf(
"Reading measurement info... \r\n");
188 case FIFFB_PROCESSED_DATA:
189 printf(
"Measurement ID... ");
190 p_fiffInfo.
meas_id = t_pTag->toFiffID();
191 printf(
"[done]\r\n");
194 printf(
"\tMeasurement date... ");
195 p_fiffInfo.
meas_date[0] = t_pTag->toInt()[0];
196 p_fiffInfo.
meas_date[1] = t_pTag->toInt()[1];
197 printf(
"[done]\r\n");
200 printf(
"\tNumber of channels... ");
201 p_fiffInfo.
nchan = *(t_pTag->toInt());
202 printf(
"%d... [done]\r\n", p_fiffInfo.
nchan);
205 printf(
"\tSampling frequency... ");
206 p_fiffInfo.
sfreq = *(t_pTag->toFloat());
207 printf(
"%f... [done]\r\n", p_fiffInfo.
sfreq);
210 printf(
"\tLowpass frequency... ");
211 p_fiffInfo.
lowpass = *(t_pTag->toFloat());
212 printf(
"%f Hz... [done]\r\n", p_fiffInfo.
lowpass);
215 printf(
"\tHighpass frequency... ");
216 p_fiffInfo.
highpass = *(t_pTag->toFloat());
217 printf(
"%f Hz... [done]\r\n", p_fiffInfo.
highpass);
227 p_fiffInfo.
chs.append( t_pTag->toChInfo() );
230 switch(*(t_pTag->toInt()))
232 case FIFFB_MEAS_INFO:
233 t_bReadHeader =
false;
248 printf(
"\tProcessing channels... ");
249 for(qint32 i = 0; i < p_fiffInfo.
chs.size(); ++i)
250 p_fiffInfo.
ch_names.append(p_fiffInfo.
chs[i].ch_name);
252 printf(
"[done]\r\n %d", p_fiffInfo.
chs.size());
254 printf(
"measurement info read.\r\n");
256 #ifdef DACQ_AUTOSTART
280 connect(
this, &DacqServer::measInfoAvailable,
281 m_pNeuromag, &Neuromag::releaseMeasInfo);
285 delete m_pCollectorSock;
291 if(m_pNeuromag->m_uiBufferSampleSize <
MIN_BUFLEN)
292 m_pNeuromag->m_uiBufferSampleSize =
MIN_BUFLEN;
294 int t_iOriginalMaxBuflen = 1500;
302 Q_UNUSED(t_iOriginalMaxBuflen);
304 if (m_pNeuromag->m_uiBufferSampleSize <
MIN_BUFLEN) {
305 fprintf(stderr,
"%ui: Too small Neuromag buffer length requested, should be at least %d\n", m_pNeuromag->m_uiBufferSampleSize,
MIN_BUFLEN);
310 if (!m_pCollectorSock->
open()) {
311 printf(
"Cannot change the Neuromag buffer length: Could not open collector connection\n");
314 printf(
"Changing the Neuromag buffer length to %d... ", m_pNeuromag->m_uiBufferSampleSize);
315 if (m_pCollectorSock->
setMaxBuflen(m_pNeuromag->m_uiBufferSampleSize)) {
316 printf(
"Setting a new Neuromag buffer length failed\r\n");
317 m_pCollectorSock->close();
320 printf(
"[done]\r\n");
331 m_pShmemSock->set_data_filter (NULL, 0);
335 printf(
"Could not connect!\r\n");
343 printf(
"Waiting for the measurement to start...\n");
353 qint32 t_nSamples = 0;
354 qint32 t_nSamplesNew = 0;
360 if(m_pNeuromag->m_info.
isEmpty() || m_bMeasInfoRequest)
362 m_pNeuromag->mutex.lock();
363 if(getMeasInfo(m_pNeuromag->m_info))
365 if(m_bMeasInfoRequest)
367 emit measInfoAvailable();
368 m_bMeasInfoRequest =
false;
372 if(m_pNeuromag->m_pRawMatrixBuffer)
373 delete m_pNeuromag->m_pRawMatrixBuffer;
374 m_pNeuromag->m_pRawMatrixBuffer = NULL;
376 if(!m_pNeuromag->m_info.
isEmpty())
377 m_pNeuromag->m_pRawMatrixBuffer =
new RawMatrixBuffer(RAW_BUFFFER_SIZE, m_pNeuromag->m_info.
nchan, m_pNeuromag->m_uiBufferSampleSize);
380 m_bIsRunning =
false;
381 m_pNeuromag->mutex.unlock();
384 if(!m_pNeuromag->m_bIsRunning)
391 #ifdef DACQ_AUTOSTART
409 if (nchan < 0 && !m_pNeuromag->m_info.isEmpty())
411 nchan = m_pNeuromag->m_info.
nchan;
412 sfreq = m_pNeuromag->m_info.
sfreq;
421 t_nSamplesNew = t_nSamples + m_pNeuromag->m_uiBufferSampleSize - 1;
422 printf(
"Reading %d ... %d = %9.3f ... %9.3f secs...", t_nSamples, t_nSamplesNew, ((
float)t_nSamples) / sfreq, ((
float)t_nSamplesNew) / sfreq );
423 t_nSamples += m_pNeuromag->m_uiBufferSampleSize;
426 float meg_mag_multiplier = 1.0;
427 float meg_grad_multiplier = 1.0;
428 float eeg_multiplier = 1.0;
430 MatrixXf* t_pMatrix =
new MatrixXf(nchan, m_pNeuromag->m_uiBufferSampleSize);
432 fiff_int_t *data32 = (fiff_int_t *)t_pTag->data();
433 for (qint32 ch = 0; ch < nchan; ch++) {
434 switch(m_pNeuromag->m_info.
chs[ch].kind) {
437 a = meg_grad_multiplier;
439 a = meg_mag_multiplier;
447 for (qint32 ns = 0; ns < m_pNeuromag->m_uiBufferSampleSize; ns++)
448 (*t_pMatrix)(ch,ns) = a * m_pNeuromag->m_info.
chs[ch].cal * m_pNeuromag->m_info.
chs[ch].range * data32[nchan*ns+ch];
451 m_pNeuromag->m_pRawMatrixBuffer->push(t_pMatrix);
460 printf(
" [done]\r\n");
463 case FIFF_BLOCK_START:
465 switch(*(t_pTag->toInt()))
468 printf(
"Processing raw data...\r\n");
474 case FIFF_ERROR_MESSAGE:
475 printf(
"Error: %s\r\n", t_pTag->data());
476 m_bIsRunning =
false;
478 case FIFF_CLOSE_FILE:
479 printf(
"Measurement stopped.\r\n");
482 printf(
"Unknow tag; Kind: %d, Type: %d, Size: %d \r\n", t_pTag->kind, t_pTag->type, t_pTag->size());
489 #ifdef DACQ_AUTOSTART
494 m_pCollectorSock->close();
496 delete m_pCollectorSock;
497 m_pCollectorSock = NULL;
FIFF measurement file information.
The Neuromag class provides an Elekta Neuromag connector.
static QStringList split_name_list(QString p_sNameList)
int setMaxBuflen(int maxbuflen)
declaration of the DacqServer Class.
QSharedPointer< FiffTag > SPtr
DacqServer(Neuromag *p_pNeuromag, QObject *parent=0)
#define FIFF_MNE_PROJ_ITEM_ACTIVE
The CollectorSocket class provides ....
int receive_tag(FiffTag::SPtr &p_pTag)
FiffStream class declaration.
The ShmemSocket class provides...
implementation of the CollectorSocket Class.
implementation of the ShmemSocket Class.