openigtlinkclient.h 7.17 KB
Newer Older
CAMP C++ Builder's avatar
CAMP C++ Builder 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
// ================================================================================================
// 
// 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__

28
29
//#define IGTL_CLIENT_DEBUGGING

CAMP C++ Builder's avatar
CAMP C++ Builder committed
30
#include <string>
31
#include <map>
CAMP C++ Builder's avatar
CAMP C++ Builder committed
32
33
34
35
36
37
38
39

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

#include <tgt/matrix.h>

40
#include <ext/threading.h>
CAMP C++ Builder's avatar
CAMP C++ Builder committed
41
42
43
44
45
46
47
48
49
50
51
52
53
#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/datastructures/imagedata.h"


namespace campvis {
    /**
54
55
56
57
     * OpenIGTLink Client processor. Connects to a specified server and receives all OpenIGTLink messages.
     * Processes the messages according to the currently set properties p_receiveTransform, p_receivePositions
     * and p_receiveImage and puts them into the received data into the respective data containers.
     * This Class contains modified code from the OpenIGTLink ReceiveClient example.
CAMP C++ Builder's avatar
CAMP C++ Builder committed
58
     */
59
    class OpenIGTLinkClient : public AbstractProcessor {
CAMP C++ Builder's avatar
CAMP C++ Builder committed
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
    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
89
        ButtonProperty p_disconnect;        ///< Disconnect button
CAMP C++ Builder's avatar
CAMP C++ Builder committed
90
91
92


        BoolProperty p_receiveImages;       ///< toggle receiving IMAGE messages
93
        StringProperty p_targetImagePrefix;   ///< image ID prefix for read image
CAMP C++ Builder's avatar
CAMP C++ Builder committed
94
95

        BoolProperty p_receiveTransforms;   ///< toggle receiving TRANSFORM messages
96
        StringProperty p_targetTransformPrefix; ///< data ID prefix for read transformation
CAMP C++ Builder's avatar
CAMP C++ Builder committed
97
98
99
100
        
        Vec3Property p_imageOffset;         ///< Image Offset in mm
        Vec3Property p_voxelSize;           ///< Voxel Size in mm

CAMP C++ Builder's avatar
CAMP C++ Builder committed
101
        BoolProperty p_receivePositions;       ///< toggle receiving IMAGE messages
102
        StringProperty p_targetPositionPrefix;   ///< image ID prefix for read images
CAMP C++ Builder's avatar
CAMP C++ Builder committed
103
104

        /**
105
         * Updates the data container with the latest received transformation/position/image data
CAMP C++ Builder's avatar
CAMP C++ Builder committed
106
107
108
109
110
111
112
         * \param   dataContainer    DataContainer to work on
         */
        virtual void updateResult(DataContainer& dataContainer);

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

113
        /// Callback slot for connect button. can also be called from outside.
114
        void connect();
115
116
        /// Callback slot for disconnect button. can also be called from outside.
        void disconnect();
CAMP C++ Builder's avatar
CAMP C++ Builder committed
117
118
        
    protected:
119
120
121
122
123
124
        /// Stores received data from a POSITION Message
        struct PositionMessageData {
            tgt::vec3 _position;
            tgt::vec4 _quaternion;
        };

125
        /// Main method for the receiver thread. The new thread will
126
        /// go into a receive loop to receive the OpenIGTLink messages asynchronously
127
        virtual void runReceiverThread();
CAMP C++ Builder's avatar
CAMP C++ Builder committed
128

129
        /// Receive a TRANSFORM message from the OpenIGTLink socket and put the data into the local buffers
130
        int ReceiveTransform(igtl::Socket* socket, igtl::MessageHeader::Pointer& header);
131
132

        /// Receive a POSITION message from the OpenIGTLink socket and put the data into the local buffers
133
        int ReceivePosition(igtl::Socket* socket, igtl::MessageHeader::Pointer& header);
134
135

        /// Receive a IMAGE message from the OpenIGTLink socket and put into the local buffers
136
        int ReceiveImage(igtl::Socket* socket, igtl::MessageHeader::Pointer& header);
137

138
        //igtl connection
CAMP C++ Builder's avatar
CAMP C++ Builder committed
139
140
141
        igtl::ClientSocket::Pointer _socket;
        
        //data
142
143
144
        std::map<std::string, tgt::mat4> _receivedTransforms;        ///< the transforms that has been received by the igtl worker thread, mapped by device name
        std::map<std::string, igtl::ImageMessage::Pointer> _receivedImages;  ///< the image messages received by the igtl worker thread, mapped by device name
        std::map<std::string, PositionMessageData> _receivedPositions; ///< position message data received by the igtl worker thread, mapped by device name        
CAMP C++ Builder's avatar
CAMP C++ Builder committed
145

146
147
        tbb::mutex _transformMutex;                             ///< mutex to control access to _receivedTransforms
        tbb::mutex _imageMutex;                                 ///< mutex to control access to _receivedImages
148
        tbb::mutex _positionMutex;                              ///< mutex to control access to _receivedPositions
CAMP C++ Builder's avatar
CAMP C++ Builder committed
149

150
        static const std::string loggerCat_;
151
152
153
154
155
156
157
158
159
160
161
162

        // this is thread management stuff
        // very similar to the Runnable base class
    private:
        /// Start the receiver thread
        void startReceiver();
        /// stop the receiver thread
        void stopReceiver();

        tbb::atomic<bool> _stopExecution;       ///< Flag whether the thread should stop
        std::thread* _receiverThread;                    ///< Thread of the Runnable
        tbb::atomic<bool> _receiverRunning;
CAMP C++ Builder's avatar
CAMP C++ Builder committed
163
164
165
166
167
168
    };

}

#endif // OPENIGTLINKCLIENT_H__