35 #include "igtlOSUtil.h"
36 #include "igtlMessageHeader.h"
37 #include "igtlTransformMessage.h"
38 #include "igtlPositionMessage.h"
39 #include "igtlImageMessage.h"
40 #include "igtlClientSocket.h"
41 #include "igtlStatusMessage.h"
54 mHeadingReceived(false),
81 mSocket.reset(
new QTcpSocket());
82 connect(mSocket.get(), SIGNAL(readyRead()),
this, SLOT(readyReadSlot()), Qt::DirectConnection);
83 connect(mSocket.get(), SIGNAL(hostFound()),
this, SLOT(hostFoundSlot()), Qt::DirectConnection);
84 connect(mSocket.get(), SIGNAL(connected()),
this, SLOT(connectedSlot()), Qt::DirectConnection);
85 connect(mSocket.get(), SIGNAL(disconnected()),
this, SLOT(disconnectedSlot()), Qt::DirectConnection);
86 connect(mSocket.get(), SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(errorSlot(QAbstractSocket::SocketError)),
87 Qt::DirectConnection);
89 if (!this->multipleTryConnectToHost())
96 mHeaderMsg = igtl::MessageHeader::New();
102 bool IGTLinkClientStreamer::multipleTryConnectToHost()
105 int numberOfConnectionAttempts = 5;
107 for (
int i=0; i<numberOfConnectionAttempts; ++i)
110 report(QString(
"[%2] Attempt %1 to connect to host").arg(i+1).arg(this->hostDescription()));
111 if (this->tryConnectToHost())
115 reportError(QString(
"[%1] Timeout connecting to host").arg(this->hostDescription()));
119 bool IGTLinkClientStreamer::tryConnectToHost()
121 mSocket->connectToHost(mAddress, mPort);
124 if (!mSocket->waitForConnected(timeout))
126 mSocket->disconnectFromHost();
136 mSocket->disconnectFromHost();
144 return "IGTLinkClient";
147 QString IGTLinkClientStreamer::hostDescription()
const
152 void IGTLinkClientStreamer::hostFoundSlot()
154 report(QString(
"[%1] Found host").arg(this->hostDescription()));
157 void IGTLinkClientStreamer::connectedSlot()
159 reportSuccess(QString(
"[%1] Connected to host").arg(this->hostDescription()));
161 void IGTLinkClientStreamer::disconnectedSlot()
163 report(QString(
"[%1] Disconnected from host").arg(this->hostDescription()));
166 void IGTLinkClientStreamer::errorSlot(QAbstractSocket::SocketError socketError)
168 report(QString(
"[%1] Socket error [code=%2]: %3")
169 .arg(this->hostDescription())
170 .arg(QString::number(socketError))
171 .arg(mSocket->errorString()));
174 void IGTLinkClientStreamer::readyReadSlot()
177 while (this->readOneMessage());
184 bool IGTLinkClientStreamer::readOneMessage()
189 if (!mHeadingReceived)
193 mHeaderMsg->InitPack();
196 if (mSocket->bytesAvailable() < mHeaderMsg->GetPackSize())
204 mSocket->read(reinterpret_cast<char*>(mHeaderMsg->GetPackPointer()), mHeaderMsg->GetPackSize());
205 mHeadingReceived =
true;
208 mHeaderMsg->Unpack();
211 if (mHeadingReceived)
214 bool success =
false;
224 if (QString(mHeaderMsg->GetDeviceType()) ==
"IMAGE")
226 success = this->ReceiveImage(mSocket.get(), mHeaderMsg);
228 else if (QString(mHeaderMsg->GetDeviceType()) ==
"CX_US_ST")
230 success = this->ReceiveSonixStatus(mSocket.get(), mHeaderMsg);
238 std::cerr <<
"Receiving : " << mHeaderMsg->GetDeviceType() << std::endl;
239 mSocket->read(mHeaderMsg->GetBodySizeToRead());
243 mHeadingReceived =
false;
251 bool IGTLinkClientStreamer::ReceiveSonixStatus(QTcpSocket* socket, igtl::MessageHeader::Pointer& header)
254 msg = IGTLinkUSStatusMessage::New();
255 msg->SetMessageHeader(header);
258 if (socket->bytesAvailable() < msg->GetPackBodySize())
263 socket->read(reinterpret_cast<char*>(msg->GetPackBodyPointer()), msg->GetPackBodySize());
267 int c = msg->Unpack();
268 if (c & (igtl::MessageHeader::UNPACK_BODY | igtl::MessageHeader::UNPACK_UNDEF))
270 this->addToQueue(msg);
275 std::cout <<
"body crc failed!" << std::endl;
279 bool IGTLinkClientStreamer::ReceiveImage(QTcpSocket* socket, igtl::MessageHeader::Pointer& header)
283 imgMsg = IGTLinkImageMessage::New();
284 imgMsg->SetMessageHeader(header);
285 imgMsg->AllocatePack();
289 if (socket->bytesAvailable() < imgMsg->GetPackBodySize())
295 socket->read(reinterpret_cast<char*>(imgMsg->GetPackBodyPointer()), imgMsg->GetPackBodySize());
299 int c = imgMsg->Unpack();
301 if (c & (igtl::MessageHeader::UNPACK_BODY | igtl::MessageHeader::UNPACK_UNDEF))
303 this->addToQueue(imgMsg);
307 std::cout <<
"body crc failed!" << std::endl;
314 mUnsentUSStatusMessage = msg;
319 IGTLinkConversion converter;
322 package->mIgtLinkImageMessage = msg;
325 if (mUnsentUSStatusMessage)
327 package->mIgtLinkUSStatusMessage = mUnsentUSStatusMessage;
331 mSender->send(package);
QString qstring_cast(const T &val)
virtual ~IGTLinkClientStreamer()
void reportError(QString msg)
void setAddress(QString address, int port)
virtual bool startStreaming(SenderPtr sender)
virtual QString getType()
virtual void stopStreaming()
igtl::SmartPointer< Self > Pointer
void reportSuccess(QString msg)
boost::shared_ptr< struct Package > PackagePtr
igtl::SmartPointer< Self > Pointer
boost::shared_ptr< Sender > SenderPtr