openigtlinkclient.h 5.56 KB
Newer Older
Jakob Weiss's avatar
Jakob Weiss committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
// 
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 
// except in compliance with the License. You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software distributed under the 
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
// either express or implied. See the License for the specific language governing permissions 
// and limitations under the License.
// 
// ================================================================================================

#ifndef OPENIGTLINKCLIENT_H__
#define OPENIGTLINKCLIENT_H__

#include <string>

#include <igtlOSUtil.h>
#include <igtlClientSocket.h>
#include <igtlMessageHeader.h>
#include <igtlImageMessage.h>

#include <tgt/matrix.h>

#include <tbb/atomic.h>
#include <tbb/mutex.h>

#include "core/pipeline/abstractprocessor.h"
#include "core/properties/buttonproperty.h"
#include "core/properties/datanameproperty.h"
#include "core/properties/floatingpointproperty.h"

#include "core/tools/runnable.h"
#include "core/datastructures/imagedata.h"


namespace campvis {
    /**
     * Experimental demo implementation how to receive MHD files via CAMPCom, convert it to
     * CAMPVis ImageData and store it into the DataContainer.
     */
    class OpenIGTLinkClient : public AbstractProcessor, public Runnable {
    public:
        /**
         * Constructs a new CampcomMhdReceiver Processor
         **/
        OpenIGTLinkClient();

        /**
         * Destructor
         **/
        virtual ~OpenIGTLinkClient();

        /// \see AbstractProcessor::init()
        virtual void init();
        /// \see AbstractProcessor::deinit()
        virtual void deinit();

        /// \see AbstractProcessor::getName()
        virtual const std::string getName() const { return "OpenIGTLinkClient"; };
        /// \see AbstractProcessor::getDescription()
        virtual const std::string getDescription() const { return "OpenIGTLink Client that can receive IMAGE and TRANSFORM messages"; };
        /// \see AbstractProcessor::getAuthor()
        virtual const std::string getAuthor() const { return "Jakob Weiss <weissj@in.tum.de>"; };
        /// \see AbstractProcessor::getProcessorState()
        virtual ProcessorState getProcessorState() const { return AbstractProcessor::EXPERIMENTAL; };

        StringProperty p_address;           ///< server address to connect to
        NumericProperty<int> p_port;        ///< server port to connect to
        StringProperty p_deviceName;        ///< IGTL device name (leave empty to accept all)
        ButtonProperty p_connect;           ///< Connect button


        BoolProperty p_receiveImages;       ///< toggle receiving IMAGE messages
        DataNameProperty p_targetImageID;   ///< image ID for read image

        BoolProperty p_receiveTransforms;   ///< toggle receiving TRANSFORM messages
        DataNameProperty p_targetTransformID; ///< data ID for read transformation
        
        Vec3Property p_imageOffset;         ///< Image Offset in mm
        Vec3Property p_voxelSize;           ///< Voxel Size in mm

Jakob Weiss's avatar
Jakob Weiss committed
95
96
        BoolProperty p_receivePositions;       ///< toggle receiving IMAGE messages
        DataNameProperty p_targetPositionID;   ///< image ID for read image        
Jakob Weiss's avatar
Jakob Weiss committed
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

        /**
         * Updates the data container with the latest received frame/transformation
         * \param   dataContainer    DataContainer to work on
         */
        virtual void updateResult(DataContainer& dataContainer);

        /// \see AbstractProcessor::updateProperties
        virtual void updateProperties(DataContainer& dataContainer);

        /// Callback slot for connect button
        void onBtnConnectClicked();
        
        static const std::string loggerCat_;

    protected:
        int OpenIGTLinkClient::ReceiveTransform(igtl::Socket * socket, igtl::MessageHeader::Pointer& header);
        int OpenIGTLinkClient::ReceivePosition(igtl::Socket * socket, igtl::MessageHeader::Pointer& header);
        int ReceiveImage(igtl::Socket * socket, igtl::MessageHeader::Pointer& header);

        virtual void run();

        //connection
        igtl::ClientSocket::Pointer _socket;
        
        //data
        tbb::atomic<tgt::mat4 *> _lastReceivedTransform;        ///< the last transform that has been received by the igtl worker thread
        igtl::ImageMessage::Pointer _lastReceivedImageMessage;  ///< last received igtl image message
        tbb::mutex _lastReceivedImageMessageMutex;              ///< mutex to control access to the _lastReceivedImageMessage pointer

Jakob Weiss's avatar
Jakob Weiss committed
127
128
129
130
        tbb::mutex _lastReceivedPositionMutex;                  ///< mutex to control access to _lastReceivedPosition and _lastReceivedQuaternion
        tgt::vec3 _lastReceivedPosition;                        ///< last received position in the position message
        tgt::vec4 _lastReceivedQuaternion;                      ///< last received quaternion/orientation in the position message

Jakob Weiss's avatar
Jakob Weiss committed
131
132
133
134
135
136
    };

}

#endif // OPENIGTLINKCLIENT_H__