<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.na-mic.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AlexanderSchaal</id>
	<title>NAMIC Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.na-mic.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AlexanderSchaal"/>
	<link rel="alternate" type="text/html" href="https://www.na-mic.org/wiki/Special:Contributions/AlexanderSchaal"/>
	<updated>2026-07-25T05:32:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=53200</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=53200"/>
		<updated>2010-06-02T14:26:06Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: Reverted last change...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16 19:RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can be 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D instrument (tip and handle are defined, but not the normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=53199</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=53199"/>
		<updated>2010-06-02T14:06:13Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Image data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16 19:RGB color 20:RGBA color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can be 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D instrument (tip and handle are defined, but not the normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | --&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Reserved&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51553</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51553"/>
		<updated>2010-04-20T08:42:34Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Point or fiducal data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can be 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D instrument (tip and handle are defined, but not the normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51552</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51552"/>
		<updated>2010-04-20T08:42:15Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Point or fiducal data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D instrument (tip and handle are defined, but not the normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51531</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51531"/>
		<updated>2010-04-16T14:10:30Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Tracking data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D instrument (tip and handle are defined, but not the normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51530</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51530"/>
		<updated>2010-04-16T14:09:42Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Tracking data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: 6D instrument (regular instrument), 3: 3D instrument (only tip of the instrument defined), 4: 5D (instrument with tip and handle, but without normal vector)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51529</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51529"/>
		<updated>2010-04-16T13:38:08Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Label map / Voxel objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_LBMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''LBMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color is defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: regular instrument with tip and handle, 3: instrument only with tip defined, 4: instrument with tip and handle, but without normal vector&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51523</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51523"/>
		<updated>2010-04-16T12:38:43Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Tracking data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_STRCMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_STRCMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color id defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: regular instrument with tip and handle, 3: instrument only with tip defined, 4: instrument with tip and handle, but without normal vector&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51522</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51522"/>
		<updated>2010-04-16T09:36:52Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_STRCMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_STRCMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color id defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Minimum time between two frames. Use 0 for as fast as possible. If e.g. 50 ms is specified, the maximum update rate will be 20 Hz.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51521</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51521"/>
		<updated>2010-04-16T07:27:57Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Label map / Voxel objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_STRCMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_STRCMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color id defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51520</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51520"/>
		<updated>2010-04-16T07:11:27Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Label map / Voxel objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_STRUMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_STRUMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color id defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE), bounding box of the structure(s)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51519</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51519"/>
		<updated>2010-04-16T07:08:55Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Voxel objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Label map / Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects or a label map, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available structures. I suggest a GET_STRUMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_STRUMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Label of structure (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA (0 0 0 0 if no color id defined)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused. Can be empty if n/a.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51463</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51463"/>
		<updated>2010-04-15T07:44:27Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Voxel objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available voxelobjects. I suggest a GET_VOXMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_VOXMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51462</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51462"/>
		<updated>2010-04-15T07:31:29Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available voxelobjects. I suggest a GET_VOXMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_VOXMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTS_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTS_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTS_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51461</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51461"/>
		<updated>2010-04-15T07:30:30Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available voxelobjects. I suggest a GET_VOXMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_VOXMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RTG_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RTG_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RTG_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51460</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51460"/>
		<updated>2010-04-15T07:23:59Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Voxel objects =&lt;br /&gt;
&lt;br /&gt;
Voxel objects can be tumors, segmented structures likes eyes, etc. They are typically much smaller than the owning slicesets and can be overlayed on the sliceset data.&lt;br /&gt;
&lt;br /&gt;
To retreive voxel objects, GET_IMAGE / IMAGE can be used. But the client should be able to get a list of available voxelobjects. I suggest a GET_VOXMETA message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_VOXMETA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Voxel objects from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RET_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RET_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RET_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51438</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51438"/>
		<updated>2010-04-14T07:47:08Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RET_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RET_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RET_TDATA. The real data, which is pushed is called TDATA now, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51437</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51437"/>
		<updated>2010-04-14T07:44:22Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
*This is a log page for the discussion about new OpenIGTLink messages introduced in protocol version 2.&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I totally agree. The STATUS message was originally designed for hardware e.g. biopsy robot and may not fit to other applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STT_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STP_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr STT_TDATA and STP_TDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''RET_TDATA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* Sounds good idea to specify what happens if empty device name is specified.&lt;br /&gt;
* Yes, I think we need to address how to return status.&lt;br /&gt;
** It's a nice idea to define status messages.&lt;br /&gt;
** I would suggest more consistent naming convention&lt;br /&gt;
***For starting data push START_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For stopping data push STOP_&amp;lt;device name&amp;gt;&lt;br /&gt;
***For status STATUS_&amp;lt;device name&amp;gt;&lt;br /&gt;
** By the way, 'START_' 'STOP_' and 'STATUS_' seem too long, because we only have 12 bytes for device name. Would be nice to have 3-letter codes ex. 'STT_', 'STP_', 'RET_'. (this improves the consistency with 'GET_')&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* I totally agree. I have changed the messages above to STT_TDATA, STP_TDATA and the returning status to RET_TDATA. The real data, which is pushed is still called TDATA, see below.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51407</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51407"/>
		<updated>2010-04-13T09:16:16Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Image data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
* To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
&lt;br /&gt;
To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. The following is copied from [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]]. I have removed the version and reserved fields - or why do we need a version in the header and in the body?&lt;br /&gt;
* GET_COLORT has no parameter except the device name field in the header.&lt;br /&gt;
* See below the COLORTABLE message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | I&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Index Type  (3:uint8  5:uint16)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | M&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Map Type (3:uint8 5:uint16  19: RGB color)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | TABLE&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Array of 8-bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color index table&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
''Alexander'': I have added the COLORTABLE message above.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr START_TDPUSH and STOP_TDPUSH (means same type string except START and STOP):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51406</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51406"/>
		<updated>2010-04-13T08:58:34Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-op landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr START_TDPUSH and STOP_TDPUSH (means same type string except START and STOP):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51405</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51405"/>
		<updated>2010-04-13T08:55:02Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; messages:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message can be sent.&lt;br /&gt;
** After stopping the push, it might be possible that some TDATA messages are still in the pipeline. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about a typical answer message forr START_TDPUSH and STOP_TDPUSH (means same type string except START and STOP):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDPUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the query-answer-mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE/IMAGE, etc.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51404</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51404"/>
		<updated>2010-04-13T08:36:25Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; message (only one to make it easier):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Action&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: start push 2: stop push&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system. (not included if action = 2)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message will be sent.&lt;br /&gt;
** After STOP_TDATA it might be possible to receive the last TDATA message until the sever really stops. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about an additional message, which shall be sent as answer after GET_TDATAPSH:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the &amp;quot;GET_&amp;lt;device name&amp;gt; -- Answer&amp;quot; mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE -- IMAGE.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51403</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51403"/>
		<updated>2010-04-13T08:35:33Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We should dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** type and device name must be specified,&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;,&lt;br /&gt;
** we need a data specific body.&lt;br /&gt;
See below the &amp;quot;new&amp;quot; message (only one to make it easier):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Action&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: start push 2: stop push&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message will be sent.&lt;br /&gt;
** After STOP_TDATA it might be possible to receive the last TDATA message until the sever really stops. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about an additional message, which shall be sent as answer after GET_TDATAPSH:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the &amp;quot;GET_&amp;lt;device name&amp;gt; -- Answer&amp;quot; mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE -- IMAGE.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51402</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51402"/>
		<updated>2010-04-13T08:33:50Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We can dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** device type and name must be specified&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;&lt;br /&gt;
** we need a data specific body&lt;br /&gt;
See below the &amp;quot;new&amp;quot; message (only one to make it easier):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Action&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: start push 2: stop push&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message will be sent.&lt;br /&gt;
** After STOP_TDATA it might be possible to receive the last TDATA message until the sever really stops. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about an additional message, which shall be sent as answer after GET_TDATAPSH:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the &amp;quot;GET_&amp;lt;device name&amp;gt; -- Answer&amp;quot; mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE -- IMAGE.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51401</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51401"/>
		<updated>2010-04-13T08:33:14Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I think about using '''always''' the original answer message type with appropriate body data on success and body size 0 if an error has occurred, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We can dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** device type and name must be specified&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;&lt;br /&gt;
** we need a data specific body&lt;br /&gt;
See below the &amp;quot;new&amp;quot; message (only one to make it easier):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Action&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: start push 2: stop push&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message will be sent.&lt;br /&gt;
** After STOP_TDATA it might be possible to receive the last TDATA message until the sever really stops. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about an additional message, which shall be sent as answer after GET_TDATAPSH:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the &amp;quot;GET_&amp;lt;device name&amp;gt; -- Answer&amp;quot; mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE -- IMAGE.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51400</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51400"/>
		<updated>2010-04-13T08:29:08Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include device type and name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the device type. Maybe the interface needs a STATUS 2.0 message? However, I can live with returning an answer with body size 0, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;. --&amp;gt; I think about using '''always''' the original answer message type with appropriate body data on success and body size 0 if an error has occurred.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Agreed. We can dismiss START_PUSH and STOP_PUSH due to&lt;br /&gt;
** device type and name must be specified&lt;br /&gt;
** inconsistencies with GET_&amp;lt;device type&amp;gt;&lt;br /&gt;
** we need a data specific body&lt;br /&gt;
See below the &amp;quot;new&amp;quot; message (only one to make it easier):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''GET_TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Action&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: start push 2: stop push&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system name (not included if action = 2)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate system to use. Can be empty for default coordinate system.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* After thinking about the device name, the following can be specified:&lt;br /&gt;
** If device name is empty, all visible trackers/instruments will be pushed.&lt;br /&gt;
** If device name is not empty, only the appropriate tracker/instrument will be pushed.&lt;br /&gt;
* We need something to indicate, that pushing is started or stopped. Examples:&lt;br /&gt;
** An error could occur, e.g. the device name = instrument name is not valid, no TDATA message will be sent.&lt;br /&gt;
** After STOP_TDATA it might be possible to receive the last TDATA message until the sever really stops. The stop should be acknowledged so the client can rely on not getting TDATA messages anymore.&lt;br /&gt;
* This could be done by a STATUS message, but as already wrote, the STATUS message does not have enough fields. I think about an additional message, which shall be sent as answer after GET_TDATAPSH:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TDATAPSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned &lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 0: Success 1: Error&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Using the &amp;quot;GET_&amp;lt;device name&amp;gt; -- Answer&amp;quot; mechanism makes starting/stopping the push consistent to e.g. GET_IMAGE -- IMAGE.&lt;br /&gt;
&lt;br /&gt;
What do you think about that?&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
* I think we don't need the status type. But maybe we define a TDATA in v3 after collecting some feedback from different users. I could think about other fields like diameter of instruments, etc. But for now I would like to keep TDATA as simple as possible.&lt;br /&gt;
* Ok, starting another trackingdata push with the same device name will implictly stop the first one. But if another device name is used, a second push will be started.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51399</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51399"/>
		<updated>2010-04-13T07:33:19Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Objective=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=What's new in OpenIGTLink Protocol version 2 and Library Version 2=&lt;br /&gt;
*Better support for IGS Systems&lt;br /&gt;
**New IGS specific message types&lt;br /&gt;
*Matlab interface support&lt;br /&gt;
**Remote Matlab command execution&lt;br /&gt;
**Matlab interface library&lt;br /&gt;
**IGS support in Matlab&lt;br /&gt;
*Other new messages&lt;br /&gt;
**Associative Array message&lt;br /&gt;
**NIfTI support ?&lt;br /&gt;
&lt;br /&gt;
= Timeline for V.2 Protocol Release=&lt;br /&gt;
*Events:&lt;br /&gt;
*June 20 - June 26: [http://www.na-mic.org/Wiki/index.php/2010_Summer_Project_Week NA-MIC Summer Project Week in Boston]&lt;br /&gt;
**June 22, 10:30 - : OpenIGTLink Update Presentation by Junichi Tokuda&lt;br /&gt;
**June 22, 16:00 - : OpenIGTLink User Group Meeting&lt;br /&gt;
**Release v.2.0!!&lt;br /&gt;
*Notes:&lt;br /&gt;
**Because of the software release schedule, we will develop protocol for IGS and protocol for others separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#e0e0e0;&amp;quot; | Week&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/11 - 4/17&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/18 - 4/24&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 4/25 - 5/1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/2 - 5/8&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/9 - 5/15&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/16 - 5/22&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/23 - 5/29&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 5/30 - 6/5&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/6 - 6/12&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/13 - 6/19&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#eeeeee;&amp;quot; | 6/20 - 6/26&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Events&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |NA-MIC Project Week&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [IGS]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Review, Freeze&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Protocol Draft [other]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Draft&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Review, Freeze&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | IGS System (Alexander)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;|Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Library (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (IGS)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |  &lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test (other)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matlab IF (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (OIGTL IF) (Junichi)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 3D Slicer (IGS Module) (Haiying)&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | &lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Dev&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; style=&amp;quot;background:#a0a0a0;&amp;quot;| Test&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
''Junichi:'' It makes sense to leave the error name as it is. Putting device type into the device name is a bit confusing,if there is a device with a name same as device type. I'm start thinking that your initial idea (message with body size 0) makes sense.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Ok, let's define if item(s) is/are not available, an answer with body size 0 shall be returned. In this way it's easy to include type and device name.&lt;br /&gt;
* If something went wrong during processing the query, a STATUS message could be returned, but as you already wrote, a field is missing for specifying the type name. Maybe the interface needs a STATUS 2.0 message? However, I can live with returning an answer with body size 0, because in almost every case the important information is &amp;quot;data not available&amp;quot; and not &amp;quot;reason abc&amp;quot;. --&amp;gt; I think about using '''always''' the original answer message type with appropriate body data on success and body size 0 if an error has occurred.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Junichi'': Sounds good.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
''Junichi:''&lt;br /&gt;
* I would add device type field in the START_PUSH and STOP_PUSH. The device name field cannot be used for specifying device type, because data source should be specified by a pair of device name and device type in OpenIGTLink.&lt;br /&gt;
* But I, at the same time, start thinking that your original idea makes sense. A device type can be START_&amp;lt;device type&amp;gt; / STOP_&amp;lt;device type&amp;gt; instead of START_PUSH / STOP_PULL, because this is consistent with what we do with GET_&amp;lt;device type&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;br /&gt;
&lt;br /&gt;
''Junichi'':&lt;br /&gt;
* I haven't defined status types... it can be a bit array like: bit 0: registered or not; bit 1: line-of-site error; ....&lt;br /&gt;
** Do you think it is useful? if not, we can omit it.&lt;br /&gt;
* I agree that we need a way to specify coordinate system. It's good idea to have data specific field in the START_PUSH.&lt;br /&gt;
* I agree with the last comment. I would say one TRACKINGDATA push for each device name, because multiple data sources may exist. The coordinate system can be overwritten by another START_PUSH message with the same device name and type.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51253</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51253"/>
		<updated>2010-04-09T11:42:41Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be answered by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51252</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51252"/>
		<updated>2010-04-09T11:38:41Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be returned by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''START_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Max Resolution&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Maximum update time in ms. Use 0 for as fast as possible. E.g. if data changes with 20 Hz, 20 messages per second will be sent.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''STOP_PUSH'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Data specific arguments&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[bodysize - 4]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be everything, depends on the specific data type.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
* Yes, the device name field of the header could be e.g. TRACKINGDATA.&lt;br /&gt;
* Good idea about the maximum resolution!&lt;br /&gt;
I have added two tables above.&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*What status types can be specified?&lt;br /&gt;
*In the case the coordinate system is not valid, a STATUS message should be returned.&lt;br /&gt;
*Well, I understand that you would like to keep it as simple as possible. We really like to specifiy the coordinate system like &amp;quot;Camera&amp;quot; or &amp;quot;Patient&amp;quot;. We could also specifiy a SET_COORD message, but I think this would be overkill. I still vote for a data specific argument field in START_PUSH. Maybe other future data types can also use this field?&lt;br /&gt;
*Due to consistency, I think we should add this field to STOP_PUSH, too.&lt;br /&gt;
*We would like to allow only one TRACKINGDATA push for each client at a time, so a second START_PUSH will stop the first and start the second. A STOP_PUSH will stop the push regardless of the arguments in the body. What do you think about that?&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51251</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51251"/>
		<updated>2010-04-09T11:20:18Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be returned by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name/Description&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Timestamp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 64 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan time, see [[OpenIGTLink/Timestamp]]&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi'':&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
''Alexander'':&lt;br /&gt;
*Agree to your first point. I have adapted the table above.&lt;br /&gt;
*Agree to your second point.&lt;br /&gt;
*Regarding your third point: let's call it &amp;quot;Name or description&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT and GET_TRAJ are used to get the point data. They have no parameters. The answer is a POINT or TRAJECTORY message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''POINT'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X,Y,Z&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Radius of the point, can be 0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''TRAJECTORY'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name or description of the trajectory.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: trajectory with only entry point, 2: trajectory with only target point, 3: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Entry point of the trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter of trajectory, can b 0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Trajectories  from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted if device name field is empty. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:''&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
''Alexander:''&lt;br /&gt;
*Yes, points can have a diameter/radius.&lt;br /&gt;
*Group name: Yes, I think so. With the group name it is possible to distinguish e.g. between pre-op and intra-on landmarks, etc.&lt;br /&gt;
*If you really think it would be better to have two queries, I'll accept that. In the past we already had two messages. I was not sure if it is better to combine these messages or not. However, I have apapted the table above. If anyone else likes to have one message, please comment!&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51250</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51250"/>
		<updated>2010-04-09T10:55:24Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' I agree that generalized GET_LIST message is not necessary in many case. I would suggest to design GET_IMGMETA to allow requesting either list of metadata or metadata for a specific image. If there is a way to request meta data for a specific image, we can provide two-step approach (GET_LIST-&amp;gt;GET_IMGMETA) in the future.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Sure, the Id can be entered in device name field. If device name field is empty, all image meta data is returned. If Id is entered, only one image meta data is returned.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
''Junichi:'' The STATUS message defines status code 4 &amp;quot;Not found (file, configuration, device etc)&amp;quot;, which can be used to tell 0 items are available. The problem is that it is not possible to specify the device type in the STATUS message. The requesting host (the host that issues GET_* message) may not be able to identify which GET_* message is associated with the received STATUS message, because the OpenIGTLink message allows having different devices with the same device name. One possible solution is to use &amp;quot;Status name&amp;quot; field in STATUS message for specifying device name. For example:&lt;br /&gt;
*Host A requests image (device type: &amp;quot;IMAGE&amp;quot;, device name: &amp;quot;diffusion 1&amp;quot;) to host B by sending GET_IMAGE message.&lt;br /&gt;
*Host B receives the GET_IMAGE message, but it does not have such image.&lt;br /&gt;
*Host B sends STATUS message with device type &amp;quot;STATUS&amp;quot;, device name &amp;quot;diffusion 1&amp;quot;, status code 4, and status message &amp;quot;NO IMAGE&amp;quot;.&lt;br /&gt;
Fortunately, maximum length of the status name field is 20, longer than the maximum length of device name.&lt;br /&gt;
&lt;br /&gt;
''Alexander:'' Well ok, if 0 items are available, a STATUS msg can be returned, but I would leave the error name as it is already defined - as error name. Imagine you have a GET message with type, device name and some other parameters. You send several of these messages with equal type and device name, but other parameters. You have to associate the STATUS messages... We can avoid this by defining the following:&lt;br /&gt;
*A GET message shall be returned by exactly one answer message.&lt;br /&gt;
*The answer messages shall be returned in the same sequence as the GET messages were sent.&lt;br /&gt;
However, the STATUS message has a device name field. I would write into that field the type name of the GET message, e.g. IMAGE, because this is the &amp;quot;toplevel&amp;quot; information. What do you think?&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*I would define time stamp as 64 bit unsigned int so that we can also specify time. (this is also used in the OpenIGTLink header. see [[OpenIGTLink/Timestamp]].)&lt;br /&gt;
*If a device name is specified in GET_IMGMETA, only one set of meta data for the image with specified device name is returned. (This allows two-step approach (GET_LIST-&amp;gt;GET_IMGMETA), while supporting multiple sets of meta data in a single IMGMETA message.)&lt;br /&gt;
*I would call the first field &amp;quot;Image description&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINT message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*For diameter, I think It's OK to allow value greater than 0 for single point. &lt;br /&gt;
*Do we really need group name?&lt;br /&gt;
*Is it possible to have TRAJECTORY type independently? I know POINTS and TRAJECTORY are very similar, but a bit confusing for those who new to the protocol.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*possible fields in START_PUSH message:&lt;br /&gt;
**device type (TRACKINGDATA, TRANSFORM, IMAGE)&lt;br /&gt;
**maximum time resolution (Hz)&lt;br /&gt;
&lt;br /&gt;
= Tracking data =&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;br /&gt;
&lt;br /&gt;
==Comments==&lt;br /&gt;
*How about adding 8- or 16-bit status field in TRACKINGDATA? This will allow us to indicate that coordinate system is not registered. I would like to keep START_PUSH message simple....&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51197</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51197"/>
		<updated>2010-04-07T14:14:32Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Tracking data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINT message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data below.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done by 0-matrix)&lt;br /&gt;
* Specifing which data is taken at the same time / part of the same camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51196</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51196"/>
		<updated>2010-04-07T14:12:53Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Start / stop push */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINT message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of START_PUSH and STOP_PUSH can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data below.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINT, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51195</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51195"/>
		<updated>2010-04-07T14:11:29Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Point or fiducal data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINT message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51194</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51194"/>
		<updated>2010-04-07T14:09:32Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* GET messages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer is 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51193</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51193"/>
		<updated>2010-04-07T14:08:30Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Common GET_LIST message ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which Id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51192</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51192"/>
		<updated>2010-04-07T14:07:27Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Common GET_LIST message ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application wants to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51191</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51191"/>
		<updated>2010-04-07T14:06:44Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Common GET_LIST message ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so they can be used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51190</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51190"/>
		<updated>2010-04-07T14:04:03Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
Currently there is no way to start or stop a pushing request. The message START_PUSH and STOP_PUSH shall be used for that purpose. The device name field shall contain the data type to be pushed. Everytime this data changes, new messages shall be sent until the pushing is stopped. The body of these message can contain data specific arguments.&lt;br /&gt;
&lt;br /&gt;
An example is tracking data.&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
In version 1 of the protocol, transformation matrices can be transmitted. But there are some additional requirements.&lt;br /&gt;
* Specifing that something is not valid/visible anymore (could be done 0-matrix)&lt;br /&gt;
* Specifing which data comes from the same time / camera frame (can be done with the timestamp field of the header)&lt;br /&gt;
* Specifing the type of data, e.g. instrument, instrument without a direction, tracker, ... (could be done by a meta-data query)&lt;br /&gt;
* Sending all tracking data each frame, e.g. 5 instruments/trackers at 60 Hz result in 300 message per second, which is very much. This should be reduced.&lt;br /&gt;
&lt;br /&gt;
All the points above can be handles with a new message, let's call it TRACKINGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name (=Id) of the instrument/tracker&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: tracker, 2: instrument with tip and handle, 3: instrument only with tip defined&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Matrix&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 12 values like in TRANSFORM message&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * All tracking data from one frame is included.&lt;br /&gt;
 * Invisible/unavailable trackers/instruments are not included.&lt;br /&gt;
 * Easy to develop. Sample pseudo code: '''while(true) { recv(trackingdata); updateView(trackingdata); }'''&lt;br /&gt;
&lt;br /&gt;
This message cannot be queried with a regular GET message, but with START_PUSH and STOP_PUSH messages. The device name field consists of the string &amp;quot;TRACKINGDATA&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Usually the tracking data will be sent using the standard coordinate system, which is also used for POINTS, IMAGE, ... But this does only work after patient registration. Therefore the body&lt;br /&gt;
of START_PUSH has an optional field for specifing the coordinate system &amp;quot;CAMERA&amp;quot;. To switch back to the standard coordinate system, one has to send STOP_PUSH and afterwards START_PUSH without&lt;br /&gt;
explicitly specifing the camera coordinate system.&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51189</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51189"/>
		<updated>2010-04-07T11:20:20Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common GET_LIST message ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51188</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51188"/>
		<updated>2010-04-07T11:19:54Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= GET messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51187</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51187"/>
		<updated>2010-04-07T11:19:31Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Errors in GET-messages =&lt;br /&gt;
&lt;br /&gt;
Get messages are not well defined yet. The following things should be fixed:&lt;br /&gt;
 * If 0 items are available, the bodysize of the answer might be 0.&lt;br /&gt;
 * If an error occurs while processing the request, a STATUS message shall be returned.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51186</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51186"/>
		<updated>2010-04-07T11:16:22Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2|Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
Currently only transformations can be sent with OpenIGTLink, but especially points like fiducals or trajectories consist of more than a transformation.&lt;br /&gt;
&lt;br /&gt;
GET_POINT is used to get all the point data. It has no parameters. The answer is a POINTS message:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the point data like &amp;quot;Fiducal behind left ear&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Group name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Can be &amp;quot;Labeled Point&amp;quot;, &amp;quot;Landmark&amp;quot;, &amp;quot;Fiducal&amp;quot;, &amp;quot;Trajectory&amp;quot;, ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 1: single point, 2: trajectory with only entry point, 4: trajectory with only target point, 6: trajectory with entry and target point&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | R,G,B,A&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Color in RGBA&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X1,Y1,Z1&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Coordinate of the single point or entry point of the trajectory (which consists of an entry and a target point)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | X2,Y2,Z2&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Target point of a trajectory. If the trajectory has length 0, it is equal to the entry point. For single points the coordinates are 0,0,0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Diameter&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 32 bit float&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Always 0 for single points, can be 0 for trajectories.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Owner image&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the owner image/sliceset. Points from different slicesets can be sent if slicesets are fused.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51185</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51185"/>
		<updated>2010-04-07T11:00:31Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGMETA message. This get-message has no parameters. The answer is IMGMETA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2 | Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
POINTS&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51184</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51184"/>
		<updated>2010-04-07T09:40:52Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* Common get list ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help much in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGDATA message. This get-message has no parameters. The answer is IMGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2 | Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
POINTS&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51183</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51183"/>
		<updated>2010-04-07T09:40:15Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
I would like to introduce a GET_IMGDATA message. This get-message has no parameters. The answer is IMGDATA:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Data&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Type&lt;br /&gt;
| align=&amp;quot;left style=&amp;quot;background:#e0e0e0;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Pretty name of the image&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[20]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id to query the IMAGE and COLORT&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Modality&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[32]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | String which specifies the modality&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient name&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Name of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Patient id&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | char[64]&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Id of the patient&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Day&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan day&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Month&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan month&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Year&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scan year&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | RI, RJ, RK&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 16 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Number of pixels in each direction (same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | S&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | 8 bit unsigned int&lt;br /&gt;
| align=&amp;quot;left&amp;quot; | Scalar type (e.g. 3:uint8, 5:uint16, same as in IMAGE)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 * More than one item can be transmitted. The number is bodySize/itemSize.&lt;br /&gt;
 * To get the IMAGE, GET_IMAGE is used with the Id in the device name field.&lt;br /&gt;
 * To get the COLORTABLE, GET_COLORT is used with the Id in the device name field. See [[OpenIGTLink/ProtocolV2 | Standard OpenIGTLink Protocol description -- Version 2 draft]] for details.&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
POINTS&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51182</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51182"/>
		<updated>2010-04-07T09:01:45Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common get list ? =&lt;br /&gt;
&lt;br /&gt;
A common GET_LIST message could be defined with the data type, like IMAGE, in the device name field. The answer could be a LIST message with ids (each 20 bytes, so it can they used as device names) of available data. Afterwards a GET_xy message with the id could be used to query the details.&lt;br /&gt;
&lt;br /&gt;
'''Well, I don't think this will help in practice.'''&lt;br /&gt;
&lt;br /&gt;
''Example:'' an application would like to show a list of available images before querying them from the server. Ids are not very specific, so an additional meta data message must be defined. So we have a) GET_LIST and b) for each id: GET_IMGMETA.&lt;br /&gt;
It would be easier to get all the meta data at once, which returns a list of meta data.&lt;br /&gt;
&lt;br /&gt;
''Next example:'' all ficucial points shall be queried. A two-step mechanism would result in 1+n queries, whereas getting all points at once would end in only 1 query. Even if the user would like to get only 1 specific point, how could he know which id to use?&lt;br /&gt;
&lt;br /&gt;
Another reason is that sending all the data at once is much more efficient.&lt;br /&gt;
&lt;br /&gt;
However, there might be use cases, where single items are useful. If the item size is constant, it makes no difference if only one or several items are transmitted. '''The number is bodySize/itemSize.''' Using this definion, single items can still be pushed over the network as it's currently done in most OpenIGTLink applications.&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
IMAGE + COLORTABLE + METADATA&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
POINTS&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion&amp;diff=51154</id>
		<title>OpenIGTLink/Discussion</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion&amp;diff=51154"/>
		<updated>2010-04-06T15:08:42Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* New commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Requests, TODOs=&lt;br /&gt;
*[IGTL]Broadcasting (The Open IGT Link Library)&lt;br /&gt;
*[Slicer]Fix problem in transform matrix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Week 2008 @ MIT=&lt;br /&gt;
*The main page for this project is [[2008_Summer_Project_Week]]&lt;br /&gt;
&lt;br /&gt;
==Attendee==&lt;br /&gt;
*Junichi Tokuda&lt;br /&gt;
*Haiying Liu&lt;br /&gt;
&lt;br /&gt;
==Agenda==&lt;br /&gt;
&lt;br /&gt;
===Open IGT Link -- new requirements===&lt;br /&gt;
*requirements for new software&lt;br /&gt;
**BrainLab VVLink&lt;br /&gt;
**Prostate&lt;br /&gt;
**Neuro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slicer 3 Open IGT Link Module -- What is next?===&lt;br /&gt;
*Outgoing data via MRML&lt;br /&gt;
*GUI Interface Design&lt;br /&gt;
*API Design to use OpenIGTLink module from other modules&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= New commands =&lt;br /&gt;
&lt;br /&gt;
Discussion page about [[OpenIGTLink/Discussion/NewCommands| new commands]] based on version 1 of OpenIGTLink. It is not decided yet, if (parts of) these commands are integrated to one of the next official&lt;br /&gt;
interface versions.&lt;br /&gt;
&lt;br /&gt;
= Open questions =&lt;br /&gt;
# What if the application receives hundreds of &amp;quot;position&amp;quot; packets? &amp;lt;br&amp;gt; Should we have packet types?&amp;lt;br&amp;gt;-keep only the last (position)&amp;lt;br&amp;gt;- all important (command)&amp;lt;br&amp;gt;- high priority (emergency)&amp;lt;br&amp;gt;&lt;br /&gt;
# Priority&lt;br /&gt;
# Authentication (other than Unique Name) -- SSL&lt;br /&gt;
# Compression?&lt;br /&gt;
# Duplicate messages&lt;br /&gt;
# What about the check of the header ?? -- by Dr. Gregory Fischer @ WPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other Resources =&lt;br /&gt;
* [http://www.bioimagesuite.org/public/VVLink.html BioImage Suite VVLink Tool] (uses TCL/TK object streaming)&lt;br /&gt;
* [[OpenIGTLink/Meetings | Meetings concerning Open IGT Link ]]&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51145</id>
		<title>OpenIGTLink/Discussion/NewCommands</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion/NewCommands&amp;diff=51145"/>
		<updated>2010-04-06T09:20:39Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page will be edited soon. The topics will be:&lt;br /&gt;
&lt;br /&gt;
= Push or pull? =&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
= Image data =&lt;br /&gt;
&lt;br /&gt;
IMAGE + COLORTABLE + METADATA&lt;br /&gt;
&lt;br /&gt;
= Point or fiducal data =&lt;br /&gt;
&lt;br /&gt;
POINTS&lt;br /&gt;
&lt;br /&gt;
= Start / stop push =&lt;br /&gt;
&lt;br /&gt;
START_PUSH + STOP_PUSH&lt;br /&gt;
&lt;br /&gt;
== Tracking data ==&lt;br /&gt;
&lt;br /&gt;
TRACKINGDATA&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
	<entry>
		<id>https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion&amp;diff=51144</id>
		<title>OpenIGTLink/Discussion</title>
		<link rel="alternate" type="text/html" href="https://www.na-mic.org/w/index.php?title=OpenIGTLink/Discussion&amp;diff=51144"/>
		<updated>2010-04-06T09:17:42Z</updated>

		<summary type="html">&lt;p&gt;AlexanderSchaal: /* New commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[OpenIGTLink | &amp;amp;lt;&amp;amp;lt; OpenIGTLink]]&lt;br /&gt;
&lt;br /&gt;
=Requests, TODOs=&lt;br /&gt;
*[IGTL]Broadcasting (The Open IGT Link Library)&lt;br /&gt;
*[Slicer]Fix problem in transform matrix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Week 2008 @ MIT=&lt;br /&gt;
*The main page for this project is [[2008_Summer_Project_Week]]&lt;br /&gt;
&lt;br /&gt;
==Attendee==&lt;br /&gt;
*Junichi Tokuda&lt;br /&gt;
*Haiying Liu&lt;br /&gt;
&lt;br /&gt;
==Agenda==&lt;br /&gt;
&lt;br /&gt;
===Open IGT Link -- new requirements===&lt;br /&gt;
*requirements for new software&lt;br /&gt;
**BrainLab VVLink&lt;br /&gt;
**Prostate&lt;br /&gt;
**Neuro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slicer 3 Open IGT Link Module -- What is next?===&lt;br /&gt;
*Outgoing data via MRML&lt;br /&gt;
*GUI Interface Design&lt;br /&gt;
*API Design to use OpenIGTLink module from other modules&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= New commands =&lt;br /&gt;
&lt;br /&gt;
Discussion page about [[OpenIGTLink/Discussion/NewCommands| new commands]] based on version 1 of OpenIGTLink. It is not clear yet, if (parts of) these commands are integrated to a the next official&lt;br /&gt;
interface version.&lt;br /&gt;
&lt;br /&gt;
= Open questions =&lt;br /&gt;
# What if the application receives hundreds of &amp;quot;position&amp;quot; packets? &amp;lt;br&amp;gt; Should we have packet types?&amp;lt;br&amp;gt;-keep only the last (position)&amp;lt;br&amp;gt;- all important (command)&amp;lt;br&amp;gt;- high priority (emergency)&amp;lt;br&amp;gt;&lt;br /&gt;
# Priority&lt;br /&gt;
# Authentication (other than Unique Name) -- SSL&lt;br /&gt;
# Compression?&lt;br /&gt;
# Duplicate messages&lt;br /&gt;
# What about the check of the header ?? -- by Dr. Gregory Fischer @ WPI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other Resources =&lt;br /&gt;
* [http://www.bioimagesuite.org/public/VVLink.html BioImage Suite VVLink Tool] (uses TCL/TK object streaming)&lt;br /&gt;
* [[OpenIGTLink/Meetings | Meetings concerning Open IGT Link ]]&lt;/div&gt;</summary>
		<author><name>AlexanderSchaal</name></author>
		
	</entry>
</feed>