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 msleep(100);
91 t_cmdClient.connectToHost(m_sRtServerHostName, m_iDefaultPort);
92 t_cmdClient.waitForConnected(1000);
93 }
94
95 RtDataClient t_dataClient;
96 t_dataClient.connectToHost(m_sRtServerHostName, m_iDefaultPort);
97 t_dataClient.waitForConnected();
98
99 mutex.lock();
100 m_bIsConnected = true;
101 mutex.unlock();
102
103 emit connectionChanged(m_bIsConnected);
104
105 msleep(1000);
106
107 //
108 // get client ID
109 //
110 qint32 clientId = t_dataClient.getClientId();
111
112 //
113 // request available commands
114 //
115 t_cmdClient.requestCommands();
116
117 //
118 // Inits
119 //
120 MatrixXf matData;
121
122 fiff_int_t kind;
123
124 qint32 from = 0;
125 qint32 to = -1;
126
127 // set data client alias -> for convinience (optional)
128 t_dataClient.setClientAlias(m_sClientAlias); // used in option 2 later on
129
130 // // example commands
131 // t_cmdClient["help"].send();
132 // t_cmdClient.waitForDataAvailable(1000);
133 // qDebug() << t_cmdClient.readAvailableData();
134 // t_cmdClient["clist"].send();
135 // t_cmdClient.waitForDataAvailable(1000);
136 // qDebug() << t_cmdClient.readAvailableData();
137 // t_cmdClient["conlist"].send();
138 // t_cmdClient.waitForDataAvailable(1000);
139 // qDebug() << t_cmdClient.readAvailableData();
140
141 // read meas info
142 t_cmdClient["measinfo"].pValues()[0].setValue(clientId);
143 t_cmdClient["measinfo"].send();
144
145 m_pFiffInfo = t_dataClient.readInfo();
146
147 // start measurement
148 t_cmdClient["start"].pValues()[0].setValue(clientId);
149 t_cmdClient["start"].send();
150
151 while (m_bIsRunning) {
152 // while(m_bIsMeasuring)
153
154 t_dataClient.readRawBuffer(m_pFiffInfo->nchan, matData, kind);
155
156 if (kind == FIFF_DATA_BUFFER) {
157 to += matData.cols();
158 qInfo("Reading %d ... %d = %9.3f ... %9.3f secs...", from, to,
159 static_cast<float>(from) / m_pFiffInfo->sfreq,
160 static_cast<float>(to) / m_pFiffInfo->sfreq);
161 from += matData.cols();
162
163 emit rawBufferReceived(matData);
164 } else if (FIFF_DATA_BUFFER == FIFF_BLOCK_END)
165 m_bIsRunning = false;
166
167 qInfo("[done]");
168 }
169
170 //
171 // Disconnect Stuff
172 //
173 t_cmdClient.disconnectFromHost();
174 t_dataClient.disconnectFromHost();
175
176 mutex.lock();
177 m_bIsConnected = false;
178 mutex.unlock();
179
180 emit connectionChanged(m_bIsConnected);
181}
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.
qint32 fiff_int_t
Definition fiff_types.h:86
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()