MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkIGTLMessageFactory.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
14
15// IGT message types
16#include "igtlImageMessage.h"
17#include "igtlTransformMessage.h"
18#include "igtlPositionMessage.h"
19#include "igtlStatusMessage.h"
20#include "igtlImageMetaMessage.h"
21#include "igtlPointMessage.h"
22#include "igtlTrajectoryMessage.h"
23#include "igtlStringMessage.h"
24#include "igtlSensorMessage.h"
25#include "igtlBindMessage.h"
26#include "igtlPolyDataMessage.h"
27#include "igtlQuaternionTrackingDataMessage.h"
28#include "igtlCapabilityMessage.h"
29#include "igtlNDArrayMessage.h"
30#include "igtlTrackingDataMessage.h"
31#include "igtlColorTableMessage.h"
32#include "igtlLabelMetaMessage.h"
33
34//own types
36
38
39#include "itksys/SystemTools.hxx"
40
41//------------------------------------------------------------
42// Define message clone classes
43// igtlMessageHandlerClassMacro() defines a child class of
44// igtl::MessageHandler to handle OpenIGTLink messages for
45// the message type specified as the first argument. The
46// second argument will be used for the name of this
47// message handler class, while the third argument specifies
48// a type of data that will be shared with the message functions
49// of this handler class.
50
51mitkIGTMessageCloneClassMacro(igtl::TransformMessage, TransformMsgCloneHandler)
52
53
59igtl::MessageBase::Pointer TransformMsgCloneHandler::Clone(igtl::MessageBase* original_)
60{
61 bool copySuccess = false;
62 igtl::TransformMessage::Pointer clone_ = igtl::TransformMessage::New();
63
64 //initialize the clone
65 // clone = igtl::MessageBase::New();
66
67 igtl::TransformMessage* original = (igtl::TransformMessage*)original_;
68
69 //copy all meta data
70 copySuccess = clone_->Copy(original);
71
72 if (!copySuccess)
73 return nullptr;
74
75 //copy all data that is important for this class
76 //copy the matrix
77 igtl::Matrix4x4 mat;
78 original->GetMatrix(mat);
79 clone_->SetMatrix(mat);
80
81 //copy the normals
82 float normals[3][3];
83 original->GetNormals(normals);
84 clone_->SetNormals(normals);
85
86 //copy the position
87 float position[3];
88 original->GetPosition(position);
89 clone_->SetPosition(position);
90
91 return igtl::MessageBase::Pointer(clone_.GetPointer());
92}
93
95{
96 //create clone handlers
97 // mitk::IGTLMessageCloneHandler::Pointer tmch = ;
98
99 this->AddMessageNewMethod("NONE", nullptr);
100
101 // OpenIGTLink Types V1
102 this->AddMessageNewMethod("IMAGE", (PointerToMessageBaseNew)&igtl::ImageMessage::New);
103 this->AddMessageNewMethod("TRANSFORM", (PointerToMessageBaseNew)&igtl::TransformMessage::New);
104 this->AddMessageNewMethod("POSITION", (PointerToMessageBaseNew)&igtl::PositionMessage::New);
105 this->AddMessageNewMethod("STATUS", (PointerToMessageBaseNew)&igtl::StatusMessage::New);
106 this->AddMessageNewMethod("CAPABILITY", (PointerToMessageBaseNew)&igtl::CapabilityMessage::New);
107
108 this->AddMessageNewMethod("GET_IMAGE", (PointerToMessageBaseNew)&igtl::GetImageMessage::New);
109 this->AddMessageNewMethod("GET_TRANS", (PointerToMessageBaseNew)&igtl::GetTransformMessage::New);
110 //this->AddMessageNewMethod("GET_POS", (PointerToMessageBaseNew)&igtl::GetPositionMessage::New); //not available???
111 this->AddMessageNewMethod("GET_STATUS", (PointerToMessageBaseNew)&igtl::GetStatusMessage::New);
112
113 // OpenIGTLink Types V2
114 this->AddMessageNewMethod("IMGMETA", (PointerToMessageBaseNew)&igtl::ImageMetaMessage::New);
115 this->AddMessageNewMethod("LBMETA", (PointerToMessageBaseNew)&igtl::LabelMetaMessage::New);
116 this->AddMessageNewMethod("COLORT", (PointerToMessageBaseNew)&igtl::ColorTableMessage::New);
117 this->AddMessageNewMethod("POINT", (PointerToMessageBaseNew)&igtl::PointMessage::New);
118 this->AddMessageNewMethod("TRAJ", (PointerToMessageBaseNew)&igtl::TrajectoryMessage::New);
119 this->AddMessageNewMethod("TDATA", (PointerToMessageBaseNew)&igtl::TrackingDataMessage::New);
120 this->AddMessageNewMethod("QTDATA", (PointerToMessageBaseNew)&igtl::QuaternionTrackingDataMessage::New);
121 this->AddMessageNewMethod("SENSOR", (PointerToMessageBaseNew)&igtl::SensorMessage::New);
122 this->AddMessageNewMethod("STRING", (PointerToMessageBaseNew)&igtl::StringMessage::New);
123 this->AddMessageNewMethod("NDARRAY", (PointerToMessageBaseNew)&igtl::NDArrayMessage::New);
124 this->AddMessageNewMethod("BIND", (PointerToMessageBaseNew)&igtl::BindMessage::New);
125 this->AddMessageNewMethod("POLYDATA", (PointerToMessageBaseNew)&igtl::PolyDataMessage::New);
126
127 this->AddMessageNewMethod("GET_IMGMETA", (PointerToMessageBaseNew)&igtl::GetImageMetaMessage::New);
128 this->AddMessageNewMethod("GET_LBMETA", (PointerToMessageBaseNew)&igtl::GetLabelMetaMessage::New);
129 this->AddMessageNewMethod("GET_COLORT", (PointerToMessageBaseNew)&igtl::GetColorTableMessage::New);
130 this->AddMessageNewMethod("GET_POINT", (PointerToMessageBaseNew)&igtl::GetPointMessage::New);
131 this->AddMessageNewMethod("GET_TRAJ", (PointerToMessageBaseNew)&igtl::GetTrajectoryMessage::New);
132 // this->AddMessageNewMethod("GET_TDATA", (PointerToMessageBaseNew)&igtl::GetTrackingDataMessage::New); //not available???
133 // this->AddMessageNewMethod("GET_QTDATA", (PointerToMessageBaseNew)&igtl::GetQuaternionTrackingDataMessage::New); //not available???
134 // this->AddMessageNewMethod("GET_SENSOR", (PointerToMessageBaseNew)&igtl::GetSensorMessage::New); //not available???
135 // this->AddMessageNewMethod("GET_STRING", (PointerToMessageBaseNew)&igtl::GetStringMessage::New); //not available???
136 // this->AddMessageNewMethod("GET_NDARRAY", (PointerToMessageBaseNew)&igtl::GetNDArrayMessage::New); //not available???
137 this->AddMessageNewMethod("GET_BIND", (PointerToMessageBaseNew)&igtl::GetBindMessage::New);
138 this->AddMessageNewMethod("GET_POLYDATA", (PointerToMessageBaseNew)&igtl::GetPolyDataMessage::New);
139
140 this->AddMessageNewMethod("RTS_BIND", (PointerToMessageBaseNew)&igtl::RTSBindMessage::New);
141 this->AddMessageNewMethod("RTS_QTDATA", (PointerToMessageBaseNew)&igtl::RTSQuaternionTrackingDataMessage::New);
142 this->AddMessageNewMethod("RTS_TDATA", (PointerToMessageBaseNew)&igtl::RTSTrackingDataMessage::New);
143 //todo: check if there are more RTS messages
144
145 this->AddMessageNewMethod("STT_BIND", (PointerToMessageBaseNew)&igtl::StartBindMessage::New);
146 this->AddMessageNewMethod("STT_TDATA", (PointerToMessageBaseNew)&igtl::StartTrackingDataMessage::New);
147 this->AddMessageNewMethod("STT_QTDATA", (PointerToMessageBaseNew)&igtl::StartQuaternionTrackingDataMessage::New);
148 //todo: check if there are more STT messages
149
150 this->AddMessageNewMethod("STP_BIND", (PointerToMessageBaseNew)&igtl::StopBindMessage::New);
151 this->AddMessageNewMethod("STP_TDATA", (PointerToMessageBaseNew)&igtl::StopTrackingDataMessage::New);
152 this->AddMessageNewMethod("STP_QTDATA", (PointerToMessageBaseNew)&igtl::StopQuaternionTrackingDataMessage::New);
153 //todo: check if there are more STP messages
154
155 //Own Types
156 this->AddMessageNewMethod("DUMMY", (PointerToMessageBaseNew)&mitk::IGTLDummyMessage::New);
157}
158
162
163void mitk::IGTLMessageFactory::AddMessageType(std::string messageTypeName,
165 mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
166{
167 this->AddMessageNewMethod(messageTypeName, messageTypeNewPointer);
168 this->AddMessageCloneHandler(messageTypeName, cloneHandler);
169}
170
171void mitk::IGTLMessageFactory::AddMessageNewMethod(std::string messageTypeName,
173{
174 this->m_NewMethods[messageTypeName] = messageTypeNewPointer;
175}
176
178 mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
179{
180 this->m_CloneHandlers[msgTypeName] = cloneHandler;
181}
182
183mitk::IGTLMessageCloneHandler::Pointer
185{
186 if (this->m_CloneHandlers.find(messageTypeName) !=
187 this->m_CloneHandlers.end())
188 {
189 return m_CloneHandlers[messageTypeName];
190 }
191
192 MITK_ERROR("IGTLMessageFactory") << messageTypeName <<
193 " message type is not registered to factory!";
194
195 mitkThrow() << messageTypeName << " message type is not registered to factory!";
196
197 return nullptr;
198}
199
200igtl::MessageBase::Pointer
201mitk::IGTLMessageFactory::Clone(igtl::MessageBase::Pointer msg)
202{
203 return this->GetCloneHandler(msg->GetDeviceType())->Clone(msg);
204}
205
208{
209 if (this->m_NewMethods.find(messageTypeName) != this->m_NewMethods.end())
210 {
211 return m_NewMethods[messageTypeName];
212 }
213
214 MITK_ERROR("IGTLMessageFactory") << messageTypeName <<
215 " message type is not registered to factory!";
216 return nullptr;
217}
218
219igtl::MessageBase::Pointer
221{
223 this->GetMessageTypeNewPointer(messageTypeName);
224 if (newPointer != nullptr)
225 {
226 return newPointer();
227 }
228 else
229 {
230 return nullptr;
231 }
232}
233
234std::list<std::string>
236{
237 std::list<std::string> allGetMessages;
238 for (std::map<std::string, PointerToMessageBaseNew>::const_iterator it =
239 this->m_NewMethods.begin();
240 it != this->m_NewMethods.end(); ++it)
241 {
242 if (it->first.find("GET_") != std::string::npos ||
243 it->first.find("STT_") != std::string::npos ||
244 it->first.find("STP_") != std::string::npos ||
245 it->first.find("RTS_") != std::string::npos)
246 {
247 allGetMessages.push_back(it->first);
248 }
249 }
250
251 return allGetMessages;
252}
253
254igtl::MessageBase::Pointer
255mitk::IGTLMessageFactory::CreateInstance(igtl::MessageHeader::Pointer msgHeader)
256{
257 std::string messageType;
258
259 //check the header
260 if (msgHeader.IsNull())
261 {
262 messageType = "NONE";
263 }
264 else
265 {
266 messageType = msgHeader->GetDeviceType();
267 }
268
269 //make message type uppercase
270 messageType = itksys::SystemTools::UpperCase(messageType);
271
272 //find the according new method
273 if (this->m_NewMethods.find(messageType)
274 != this->m_NewMethods.end())
275 {
276 if (this->m_NewMethods[messageType] != nullptr)
277 {
278 // Call tracker New() function if tracker not nullptr
279 return (*this->m_NewMethods[messageType])();
280 }
281 else
282 return nullptr;
283 }
284 else
285 {
286 MITK_ERROR("IGTLMessageFactory") << "Unknown IGT message type: "
287 << messageType;
288 return nullptr;
289 }
290}
igtl::MessageBase::Pointer Clone(igtl::MessageBase::Pointer msg)
Clones the given message according to the available clone methods.
virtual IGTLMessageFactory::PointerToMessageBaseNew GetMessageTypeNewPointer(std::string messageTypeName)
Get pointer to message type new function, or nullptr if the message type not registered Usage: igtl::...
virtual void AddMessageNewMethod(std::string messageTypeName, IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer)
Add message type name and pointer to IGTL message new function Usage: AddMessageType("IMAGE",...
virtual mitk::IGTLMessageCloneHandler::Pointer GetCloneHandler(std::string messageTypeName)
Get pointer to message type clone function, or nullptr if the message type is not registered Usage: i...
igtl::MessageBase::Pointer CreateInstance(std::string messageTypeName)
Creates a new message instance fitting to the given type.
void AddMessageType(std::string messageTypeName, IGTLMessageFactory::PointerToMessageBaseNew messageTypeNewPointer, mitk::IGTLMessageCloneHandler::Pointer cloneHandler)
Add message type name and pointer to IGTL message new function and the clone handler.
igtl::MessageBase::Pointer(*) PointerToMessageBaseNew()
Function pointer for storing New() static methods of igtl::MessageBase classes.
virtual void AddMessageCloneHandler(std::string msgTypeName, mitk::IGTLMessageCloneHandler::Pointer msgCloneHandler)
Adds a clone function for the specified message type.
std::list< std::string > GetAvailableMessageRequestTypes()
Returns available get messages.
#define mitkIGTMessageCloneClassMacro(messagetype, classname)