80 FiffStreamThread::FiffStreamThread(qint32
id,
int socketDescriptor, QObject *parent)
83 , m_sDataClientAlias(QString(
""))
84 , m_iSocketDescriptor(socketDescriptor)
85 , m_bIsSendingRawBuffer(false)
93 FiffStreamThread::~FiffStreamThread()
97 if(t_pFiffStreamServer)
98 t_pFiffStreamServer->m_qClientList.remove(m_iDataClientId);
100 m_bIsRunning =
false;
107 void FiffStreamThread::startMeas(qint32 ID)
109 if(ID == m_iDataClientId)
111 qDebug() <<
"Activate raw buffer sending.";
115 FiffStream t_FiffStreamOut(&m_qSendBlock, QIODevice::WriteOnly);
116 t_FiffStreamOut.start_block(FIFFB_RAW_DATA);
117 m_bIsSendingRawBuffer =
true;
125 void FiffStreamThread::stopMeas(qint32 ID)
127 qDebug() <<
"void FiffStreamThread::stopMeas(qint32 ID)";
128 if(ID == m_iDataClientId || ID == -1)
130 qDebug() <<
"stop raw buffer sending.";
133 FiffStream t_FiffStreamOut(&m_qSendBlock, QIODevice::WriteOnly);
134 t_FiffStreamOut.end_block(FIFFB_RAW_DATA);
135 m_bIsSendingRawBuffer =
false;
145 if(p_pTag->size() >= 4)
147 qint32* t_pInt = (qint32*)p_pTag->data();
148 IOUtils::swap_intp(t_pInt);
149 qint32 t_iCmd = t_pInt[0];
156 m_sDataClientAlias = QString(p_pTag->mid(4, p_pTag->size()-4));
157 printf(
"FiffStreamClient (ID %d): new alias = '%s'\r\n\n", m_iDataClientId, m_sDataClientAlias.toUtf8().constData());
164 printf(
"FiffStreamClient (ID %d): send client ID %d\r\n\n", m_iDataClientId, m_iDataClientId);
169 printf(
"FiffStreamClient (ID %d): unknown command\r\n\n", m_iDataClientId);
174 printf(
"FiffStreamClient (ID %d): unknown command\r\n\n", m_iDataClientId);
181 void FiffStreamThread::sendRawBuffer(QSharedPointer<Eigen::MatrixXf> m_pMatRawData)
183 if(m_bIsSendingRawBuffer)
189 FiffStream t_FiffStreamOut(&m_qSendBlock, QIODevice::WriteOnly);
190 t_FiffStreamOut.write_float(
FIFF_DATA_BUFFER,m_pMatRawData->data(),m_pMatRawData->rows()*m_pMatRawData->cols());
224 void FiffStreamThread::sendMeasurementInfo(qint32 ID,
FiffInfo p_fiffInfo)
226 if(ID == m_iDataClientId)
230 FiffStream t_FiffStreamOut(&m_qSendBlock, QIODevice::WriteOnly);
250 void FiffStreamThread::writeClientId()
252 FiffStream t_FiffStreamOut(&m_qSendBlock, QIODevice::WriteOnly);
297 void FiffStreamThread::run()
303 connect(t_pParentServer, &FiffStreamServer::remitMeasInfo,
304 this, &FiffStreamThread::sendMeasurementInfo);
305 connect(t_pParentServer, &FiffStreamServer::remitRawBuffer,
306 this, &FiffStreamThread::sendRawBuffer);
307 connect(t_pParentServer, &FiffStreamServer::startMeasFiffStreamClient,
308 this, &FiffStreamThread::startMeas);
309 connect(t_pParentServer, &FiffStreamServer::stopMeasFiffStreamClient,
310 this, &FiffStreamThread::stopMeas);
312 QTcpSocket t_qTcpSocket;
313 if (!t_qTcpSocket.setSocketDescriptor(m_iSocketDescriptor)) {
314 emit error(t_qTcpSocket.error());
319 printf(
"FiffStreamClient (assigned ID %d) accepted from\n\tIP:\t%s\n\tPort:\t%d\n\n",
321 QHostAddress(t_qTcpSocket.peerAddress()).toString().toUtf8().constData(),
322 t_qTcpSocket.peerPort());
328 while(t_qTcpSocket.state() != QAbstractSocket::UnconnectedState && m_bIsRunning)
334 qint32 t_iBlockSize = m_qSendBlock.size();
338 qint32 t_iBytesWritten = t_qTcpSocket.write(m_qSendBlock);
340 t_qTcpSocket.waitForBytesWritten();
341 if(t_iBytesWritten == t_iBlockSize)
343 m_qSendBlock.clear();
349 m_qSendBlock.remove(0,t_iBytesWritten);
357 t_qTcpSocket.waitForReadyRead(10);
359 if (t_qTcpSocket.bytesAvailable() >= (int)
sizeof(qint32)*4)
368 while (t_qTcpSocket.bytesAvailable() < t_pTag->size())
370 t_qTcpSocket.waitForReadyRead(10);
379 parseCommand(t_pTag);
384 t_qTcpSocket.disconnectFromHost();
385 if(t_qTcpSocket.state() != QAbstractSocket::UnconnectedState)
386 t_qTcpSocket.waitForDisconnected();
#define FIFF_MNE_RT_CLIENT_ID
FIFF measurement file information.
static bool read_tag_data(FiffStream *p_pStream, FiffTag::SPtr &p_pTag, qint64 pos=-1)
static bool read_tag_info(FiffStream *p_pStream, FiffTag::SPtr &p_pTag, bool p_bDoSkip=true)
The FiffStreamServer class provides.
QSharedPointer< FiffTag > SPtr
void writeToStream(FiffStream *p_pStream)
Contains mne rt constants.
implementation of the FiffStreamServer Class.
#define MNE_RT_GET_CLIENT_ID
implementation of the FiffStreamThread Class.
#define FIFF_MNE_RT_COMMAND
FiffTag class declaration, which provides fiff tag I/O and processing methods.
#define MNE_RT_SET_CLIENT_ALIAS
IOUtils class declaration.