v2.0.0
Loading...
Searching...
No Matches
rt_client.cpp
Go to the documentation of this file.
1//=============================================================================================================
20
21//=============================================================================================================
22// INCLUDES
23//=============================================================================================================
24
25#include "rt_client.h"
26#include "rt_cmd_client.h"
27#include "rt_data_client.h"
28
29//=============================================================================================================
30// USED NAMESPACES
31//=============================================================================================================
32
33using namespace COMLIB;
34using namespace FIFFLIB;
35using namespace Eigen;
36
37//=============================================================================================================
38// DEFINE MEMBER METHODS
39//=============================================================================================================
40
41RtClient::RtClient(QString p_sRtServerHostname, QString p_sClientAlias, QObject *parent)
42: QThread(parent)
43, m_bIsConnected(false)
44, m_bIsMeasuring(false)
45, m_bIsRunning(false)
46, m_sClientAlias(p_sClientAlias)
47, m_sRtServerHostName(p_sRtServerHostname)
48, m_iDefaultPort(4217)
49{
50}
51
52//=============================================================================================================
53
55{
56 stop();
57}
58
59//=============================================================================================================
60
62{
63 return m_bIsConnected;
64}
65
66//=============================================================================================================
67
69{
70 m_bIsRunning = false;
71 //QThread::wait();
72
73 return true;
74}
75
76//=============================================================================================================
77
79{
80 m_bIsRunning = true;
81
82 //
83 // Connect Clients
84 //
85 RtCmdClient t_cmdClient;
86 t_cmdClient.connectToHost(m_sRtServerHostName,m_iDefaultPort);
87 t_cmdClient.waitForConnected(1000);
88
89 while(t_cmdClient.state() != QTcpSocket::ConnectedState)
90 {
91 msleep(100);
92 t_cmdClient.connectToHost(m_sRtServerHostName,m_iDefaultPort);
93 t_cmdClient.waitForConnected(1000);
94 }
95
96 RtDataClient t_dataClient;
97 t_dataClient.connectToHost(m_sRtServerHostName,m_iDefaultPort);
98 t_dataClient.waitForConnected();
99
100 mutex.lock();
101 m_bIsConnected = true;
102 mutex.unlock();
103
104 emit connectionChanged(m_bIsConnected);
105
106 msleep(1000);
107
108 //
109 // get client ID
110 //
111 qint32 clientId = t_dataClient.getClientId();
112
113 //
114 // request available commands
115 //
116 t_cmdClient.requestCommands();
117
118 //
119 // Inits
120 //
121 MatrixXf matData;
122
123 fiff_int_t kind;
124
125 qint32 from = 0;
126 qint32 to = -1;
127
128 // set data client alias -> for convinience (optional)
129 t_dataClient.setClientAlias(m_sClientAlias); // used in option 2 later on
130
131// // example commands
132// t_cmdClient["help"].send();
133// t_cmdClient.waitForDataAvailable(1000);
134// qDebug() << t_cmdClient.readAvailableData();
135// t_cmdClient["clist"].send();
136// t_cmdClient.waitForDataAvailable(1000);
137// qDebug() << t_cmdClient.readAvailableData();
138// t_cmdClient["conlist"].send();
139// t_cmdClient.waitForDataAvailable(1000);
140// qDebug() << t_cmdClient.readAvailableData();
141
142 // read meas info
143 t_cmdClient["measinfo"].pValues()[0].setValue(clientId);
144 t_cmdClient["measinfo"].send();
145
146 m_pFiffInfo = t_dataClient.readInfo();
147
148 // start measurement
149 t_cmdClient["start"].pValues()[0].setValue(clientId);
150 t_cmdClient["start"].send();
151
152 while(m_bIsRunning)
153 {
154
155// while(m_bIsMeasuring)
156
157 t_dataClient.readRawBuffer(m_pFiffInfo->nchan, matData, kind);
158
159 if(kind == FIFF_DATA_BUFFER)
160 {
161 to += matData.cols();
162 qInfo("Reading %d ... %d = %9.3f ... %9.3f secs...", from, to,
163 static_cast<float>(from)/m_pFiffInfo->sfreq,
164 static_cast<float>(to)/m_pFiffInfo->sfreq);
165 from += matData.cols();
166
167 emit rawBufferReceived(matData);
168 }
170 m_bIsRunning = false;
171
172 qInfo("[done]");
173 }
174
175 //
176 // Disconnect Stuff
177 //
178 t_cmdClient.disconnectFromHost();
179 t_dataClient.disconnectFromHost();
180
181 mutex.lock();
182 m_bIsConnected = false;
183 mutex.unlock();
184
185 emit connectionChanged(m_bIsConnected);
186}
Self-contained worker thread that owns the command and data sockets to a running mne_rt_server.
TCP client for the mne_rt_server command port (4217): negotiates session state via line- or JSON-enco...
TCP client for the mne_rt_server raw-data port (4218): pulls FiffInfo, digitizer points and streamed ...
#define FIFF_DATA_BUFFER
Definition fiff_file.h:549
#define FIFF_BLOCK_END
Definition fiff_file.h:321
Real-time client/server communication primitives for talking to mne_rt_server.
FIFF file I/O, in-memory data structures and high-level readers/writers.
bool getConnectionStatus()
Definition rt_client.cpp:61
void connectionChanged(bool p_bStatus)
virtual void run()
Definition rt_client.cpp:78
RtClient(QString p_sRtServerHostname, QString p_sClientAlias="rtclient", QObject *parent=0)
Definition rt_client.cpp:41
virtual bool stop()
Definition rt_client.cpp:68
void rawBufferReceived(Eigen::MatrixXf p_rawBuffer)
QTcpSocket subclass driving the mne_rt_server control channel (default port 4217).
QTcpSocket subclass that talks the FIFF wire dialect of the mne_rt_server data port (default 4218).
void setClientAlias(const QString &p_sAlias)
void readRawBuffer(qint32 p_nChannels, Eigen::MatrixXf &data, FIFFLIB::fiff_int_t &kind)
FIFFLIB::FiffInfo::SPtr readInfo()
virtual void disconnectFromHost()