00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkNDIProtocol.h"
00019 #include "mitkNDITrackingDevice.h"
00020 #include <string>
00021 #include <algorithm>
00022 #include <sstream>
00023 #include <itksys/SystemTools.hxx>
00024 #include <stdio.h>
00025
00026
00027 mitk::NDIProtocol::NDIProtocol()
00028 : itk::Object(), m_TrackingDevice(NULL), m_UseCRC(true)
00029 {
00030 }
00031
00032
00033 mitk::NDIProtocol::~NDIProtocol()
00034 {
00035 }
00036
00037
00038 mitk::NDIErrorCode mitk::NDIProtocol::COMM(mitk::SerialCommunication::BaudRate baudRate , mitk::SerialCommunication::DataBits dataBits, mitk::SerialCommunication::Parity parity, mitk::SerialCommunication::StopBits stopBits, mitk::SerialCommunication::HardwareHandshake hardwareHandshake)
00039 {
00040
00041 std::string param;
00042 switch (baudRate)
00043 {
00044 case mitk::SerialCommunication::BaudRate14400:
00045 param += "1";
00046 break;
00047 case mitk::SerialCommunication::BaudRate19200:
00048 param += "2";
00049 break;
00050 case mitk::SerialCommunication::BaudRate38400:
00051 param += "3";
00052 break;
00053 case mitk::SerialCommunication::BaudRate57600:
00054 param += "4";
00055 break;
00056 case mitk::SerialCommunication::BaudRate115200:
00057 param += "5";
00058 break;
00059 case mitk::SerialCommunication::BaudRate9600:
00060 default:
00061 param += "0";
00062 break;
00063 }
00064 switch (dataBits)
00065 {
00066 case mitk::SerialCommunication::DataBits7:
00067 param += "1";
00068 break;
00069 case mitk::SerialCommunication::DataBits8:
00070 default:
00071 param += "0";
00072 break;
00073 }
00074 switch (parity)
00075 {
00076 case mitk::SerialCommunication::Odd:
00077 param += "1";
00078 break;
00079 case mitk::SerialCommunication::Even:
00080 param += "2";
00081 break;
00082 case mitk::SerialCommunication::None:
00083 default:
00084 param += "0";
00085 break;
00086 }
00087 switch (stopBits)
00088 {
00089 case mitk::SerialCommunication::StopBits2:
00090 param += "1";
00091 break;
00092 case mitk::SerialCommunication::StopBits1:
00093 default:
00094 param += "0";
00095 break;
00096 }
00097 switch (hardwareHandshake)
00098 {
00099 case mitk::SerialCommunication::HardwareHandshakeOn:
00100 param += "1";
00101 break;
00102 case mitk::SerialCommunication::HardwareHandshakeOff:
00103 default:
00104 param += "0";
00105 break;
00106 }
00107 return GenericCommand("COMM", ¶m);
00108 }
00109
00110
00111 mitk::NDIErrorCode mitk::NDIProtocol::INIT()
00112 {
00113 return GenericCommand("INIT");
00114 }
00115
00116
00117 mitk::NDIErrorCode mitk::NDIProtocol::DSTART()
00118 {
00119 return GenericCommand("DSTART");
00120 }
00121
00122
00123 mitk::NDIErrorCode mitk::NDIProtocol::DSTOP()
00124 {
00125 return GenericCommand("DSTOP");
00126 }
00127
00128
00129 mitk::NDIErrorCode mitk::NDIProtocol::IRINIT()
00130 {
00131 return GenericCommand("IRINIT");
00132 }
00133
00134
00135 mitk::NDIErrorCode mitk::NDIProtocol::IRCHK(bool* IRdetected)
00136 {
00137 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00138
00139 if (m_TrackingDevice == NULL)
00140 return TRACKINGDEVICENOTSET;
00141
00142
00143 std::string fullcommand;
00144 if (m_UseCRC == true)
00145 fullcommand = "IRCHK:0001";
00146 else
00147 fullcommand = "IRCHK 0001";
00148
00149 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00150
00151 if (returnValue != NDIOKAY)
00152 {
00153 m_TrackingDevice->ClearReceiveBuffer();
00154 return returnValue;
00155 }
00156
00157 itksys::SystemTools::Delay(100);
00158
00159
00160
00161
00162
00163 std::string reply;
00164 char b;
00165 m_TrackingDevice->ReceiveByte(&b);
00166 reply = b;
00167 if ((b == '0') || (b == '1'))
00168 {
00169
00170 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00171 std::string readCRC;
00172 m_TrackingDevice->Receive(&readCRC, 4);
00173 if (expectedCRC == readCRC)
00174 {
00175 if ( b == '0')
00176 *IRdetected = false;
00177 else
00178 *IRdetected = true;
00179 returnValue = NDIOKAY;
00180 }
00181 else
00182 {
00183 returnValue = NDICRCERROR;
00184 *IRdetected = false;
00185 }
00186 }
00187 else if (b =='E')
00188 {
00189 std::string errorstring;
00190 m_TrackingDevice->Receive(&errorstring, 4);
00191 reply += errorstring;
00192 static const std::string error("ERROR");
00193 if (error.compare(0, 5, reply) == 0)
00194 {
00195 std::string errorcode;
00196 m_TrackingDevice->Receive(&errorcode, 2);
00197
00198 reply += errorcode;
00199 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00200 std::string readCRC;
00201 m_TrackingDevice->Receive(&readCRC, 4);
00202 if (expectedCRC == readCRC)
00203 returnValue = this->GetErrorCode(&errorcode);
00204 else
00205 returnValue = NDICRCERROR;
00206 }
00207 } else
00208 returnValue = NDIUNEXPECTEDREPLY;
00209
00210
00211 m_TrackingDevice->ClearReceiveBuffer();
00212 return returnValue;
00213 }
00214
00215
00216 mitk::NDIErrorCode mitk::NDIProtocol::PHSR(PHSRQueryType queryType, std::string* portHandles)
00217 {
00218 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00219
00220 if (m_TrackingDevice == NULL)
00221 return TRACKINGDEVICENOTSET;
00222
00223
00224 std::string command;
00225 char stringQueryType[3];
00226 sprintf(stringQueryType, "%02X", queryType);
00227
00228 if (m_UseCRC == true)
00229 command = std::string("PHSR:") + std::string(stringQueryType);
00230 else
00231 command = std::string("PHSR ") + std::string(stringQueryType);
00232
00233 returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
00234
00235 if (returnValue != NDIOKAY)
00236 {
00237 m_TrackingDevice->ClearReceiveBuffer();
00238 return returnValue;
00239 }
00240
00241 itksys::SystemTools::Delay(100);
00242
00243 std::string reply;
00244 m_TrackingDevice->Receive(&reply, 2);
00245 static const std::string error("ERROR");
00246 if (error.compare(0, 2, reply) == 0)
00247 {
00248 std::string ror;
00249 m_TrackingDevice->Receive(&ror, 3);
00250 reply += ror;
00251 std::string errorcode;
00252 m_TrackingDevice->Receive(&errorcode, 2);
00253 reply += errorcode;
00254
00255 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00256 std::string readCRC;
00257 m_TrackingDevice->Receive(&readCRC, 4);
00258 if (expectedCRC == readCRC)
00259 returnValue = this->GetErrorCode(&errorcode);
00260 else
00261 returnValue = NDICRCERROR;
00262 }
00263 else
00264 {
00265 unsigned int numberOfHandles = 0;
00266
00267 std::stringstream s;
00268 s << reply;
00269 s >> numberOfHandles;
00270 if (numberOfHandles > 16)
00271 {
00272 returnValue = NDIUNKNOWNERROR;
00273 }
00274 else
00275 {
00276 std::string handleInformation;
00277 portHandles->clear();
00278 for (unsigned int i = 0; i < numberOfHandles; i++)
00279 {
00280 m_TrackingDevice->Receive(&handleInformation, 5);
00281 *portHandles += handleInformation.substr(0, 2);
00282 reply += handleInformation;
00283 }
00284
00285 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00286 std::string readCRC;
00287 m_TrackingDevice->Receive(&readCRC, 4);
00288 if (expectedCRC == readCRC)
00289 returnValue = NDIOKAY;
00290 else
00291 returnValue = NDICRCERROR;
00292 }
00293 }
00294
00295 m_TrackingDevice->ClearReceiveBuffer();
00296 return returnValue;
00297 }
00298
00299
00300 mitk::NDIErrorCode mitk::NDIProtocol::PHRQ(std::string* portHandle)
00301 {
00302 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00303
00304 if (m_TrackingDevice == NULL)
00305 return TRACKINGDEVICENOTSET;
00306
00307
00308 std::string command;
00309 if (m_UseCRC == true)
00310 command = "PHRQ:*********1****";
00311 else
00312 command = "PHRQ *********1****";
00313
00314 returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
00315
00316 if (returnValue != NDIOKAY)
00317 {
00318 m_TrackingDevice->ClearReceiveBuffer();
00319 return returnValue;
00320 }
00321
00322 itksys::SystemTools::Delay(100);
00323
00324 std::string reply;
00325 m_TrackingDevice->Receive(&reply, 2);
00326 static const std::string error("ERROR");
00327 if (error.compare(0, 2, reply) == 0)
00328 {
00329 std::string ror;
00330 m_TrackingDevice->Receive(&ror, 3);
00331 reply += ror;
00332 std::string errorcode;
00333 m_TrackingDevice->Receive(&errorcode, 2);
00334 reply += errorcode;
00335
00336 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00337 std::string readCRC;
00338 m_TrackingDevice->Receive(&readCRC, 4);
00339 if (expectedCRC == readCRC)
00340 returnValue = this->GetErrorCode(&errorcode);
00341 else
00342 returnValue = NDICRCERROR;
00343 }
00344 else
00345 {
00346 *portHandle = reply;
00347
00348 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00349 std::string readCRC;
00350 m_TrackingDevice->Receive(&readCRC, 4);
00351 if (expectedCRC == readCRC)
00352 returnValue = NDIOKAY;
00353 else
00354 returnValue = NDICRCERROR;
00355 }
00356
00357 m_TrackingDevice->ClearReceiveBuffer();
00358 return returnValue;
00359 }
00360
00361
00362 mitk::NDIErrorCode mitk::NDIProtocol::PVWR(std::string* portHandle, const unsigned char* sromData, unsigned int sromDataLength)
00363 {
00364 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00365
00366 if (m_TrackingDevice == NULL)
00367 return TRACKINGDEVICENOTSET;
00368
00369 if (sromDataLength > 1024)
00370 return SROMFILETOOLARGE;
00371
00372 if (sromDataLength == 0)
00373 return SROMFILETOOSMALL;
00374
00375
00376 std::string basecommand;
00377 if (m_UseCRC == true)
00378 basecommand = "PVWR:";
00379 else
00380 basecommand = "PVWR ";
00381
00382 std::string hexSROMData;
00383 hexSROMData.reserve(2 * sromDataLength);
00384 char hexcharacter[20];
00385 for (unsigned int i = 0; i < sromDataLength; i++)
00386 {
00387 sprintf(hexcharacter, "%02X", sromData[i]);
00388
00389 hexSROMData += hexcharacter;
00390 }
00391
00392 unsigned int zerosToPad = 128 - (hexSROMData.size() % 128);
00393 if (zerosToPad > 0)
00394 hexSROMData.append(zerosToPad, '0');
00395
00396 std::string fullcommand;
00397 for (unsigned int j = 0; j < hexSROMData.size(); j += 128)
00398 {
00399 sprintf(hexcharacter, "%s%04X", portHandle->c_str(), j/2);
00400 fullcommand = basecommand + hexcharacter + hexSROMData.substr(j, 128);
00401 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00402 itksys::SystemTools::Delay(50);
00403 if (returnValue != NDIOKAY)
00404 break;
00405 returnValue = this->ParseOkayError();
00406 if (returnValue != NDIOKAY)
00407 break;
00408 }
00409
00410 m_TrackingDevice->ClearReceiveBuffer();
00411 return returnValue;
00412 }
00413
00414
00415 mitk::NDIErrorCode mitk::NDIProtocol::PINIT(std::string* portHandle)
00416 {
00417 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00418
00419 if (m_TrackingDevice == NULL)
00420 return TRACKINGDEVICENOTSET;
00421
00422
00423 std::string fullcommand;
00424 if (m_UseCRC == true)
00425 fullcommand = std::string("PINIT:") + *portHandle;
00426 else
00427 fullcommand = std::string("PINIT ") + *portHandle;
00428
00429 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00430
00431 if (returnValue != NDIOKAY)
00432 {
00433 m_TrackingDevice->ClearReceiveBuffer();
00434 return returnValue;
00435 }
00436
00437
00438 itksys::SystemTools::Delay(100);
00439 std::string reply;
00440 m_TrackingDevice->Receive(&reply, 4);
00441
00442
00443 static const std::string okay("OKAYA896");
00444 static const std::string error("ERROR");
00445 static const std::string warning("WARNING7423");
00446
00447 if (okay.compare(0, 4, reply) == 0)
00448 {
00449
00450 m_TrackingDevice->Receive(&reply, 4);
00451 if (okay.compare(4, 4, reply, 0, 4) == 0)
00452 returnValue = NDIOKAY;
00453 else
00454 returnValue = NDICRCERROR;
00455 }
00456 else if (warning.compare(0, 4, reply) == 0)
00457 {
00458
00459 m_TrackingDevice->Receive(&reply, 4);
00460 if (warning.compare(4, 7, reply, 0, 7) == 0)
00461 returnValue = NDIWARNING;
00462 else
00463 returnValue = NDICRCERROR;
00464 }
00465 else if (error.compare(0, 4, reply) == 0)
00466 {
00467 char b;
00468 m_TrackingDevice->ReceiveByte(&b);
00469 reply += b;
00470 std::string errorcode;
00471 m_TrackingDevice->Receive(&errorcode, 2);
00472 reply += errorcode;
00473
00474 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00475 std::string readCRC;
00476 m_TrackingDevice->Receive(&readCRC, 4);
00477 if (expectedCRC == readCRC)
00478 returnValue = this->GetErrorCode(&errorcode);
00479 else
00480 returnValue = NDICRCERROR;
00481 } else
00482 returnValue = NDIUNEXPECTEDREPLY;
00483
00484
00485
00486 char b;
00487 m_TrackingDevice->ReceiveByte(&b);
00488
00489
00490 m_TrackingDevice->ClearReceiveBuffer();
00491 return returnValue;
00492 }
00493
00494
00495 mitk::NDIErrorCode mitk::NDIProtocol::PENA(std::string* portHandle, TrackingPriority prio)
00496 {
00497 std::string param;
00498 if (portHandle != NULL)
00499 param = *portHandle + (char) prio;
00500 else
00501 param = "";
00502 return this->GenericCommand("PENA", ¶m);
00503 }
00504
00505
00506 mitk::NDIErrorCode mitk::NDIProtocol::PHINF(std::string portHandle, std::string* portInfo)
00507 {
00508 std::string command;
00509 if (m_UseCRC) command = "PHINF:" + portHandle;
00510 else command = "PHINF " + portHandle;
00511 mitk::NDIErrorCode returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
00512 if (returnValue==NDIOKAY)
00513 {
00514 m_TrackingDevice->Receive(portInfo, 33);
00515 m_TrackingDevice->ClearReceiveBuffer();
00516 }
00517 else m_TrackingDevice->ClearReceiveBuffer();
00518 return returnValue;
00519 }
00520
00521
00522 mitk::NDIErrorCode mitk::NDIProtocol::PDIS(std::string* portHandle)
00523 {
00524 return this->GenericCommand("PDIS", portHandle);
00525 }
00526
00527
00528 mitk::NDIErrorCode mitk::NDIProtocol::PHF(std::string* portHandle)
00529 {
00530 return this->GenericCommand("PHF", portHandle);
00531 }
00532
00533
00534 mitk::NDIErrorCode mitk::NDIProtocol::IRATE(IlluminationActivationRate rate)
00535 {
00536 std::string param;
00537 switch (rate)
00538 {
00539 case Hz60:
00540 param = "2";
00541 break;
00542 case Hz30:
00543 param = "1";
00544 break;
00545 case Hz20:
00546 default:
00547 param = "0";
00548 break;
00549 }
00550 return this->GenericCommand("IRATE", ¶m);
00551 }
00552
00553
00554 mitk::NDIErrorCode mitk::NDIProtocol::BEEP(unsigned char count)
00555 {
00556 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00557
00558 if (m_TrackingDevice == NULL)
00559 return TRACKINGDEVICENOTSET;
00560
00561 std::string p;
00562 if ((count >= 1) && (count <= 9))
00563 p = (count + '0');
00564 else
00565 return NDICOMMANDPARAMETEROUTOFRANGE;
00566
00567
00568 std::string fullcommand;
00569 if (m_UseCRC == true)
00570 fullcommand = "BEEP:" + p;
00571 else
00572 fullcommand = "BEEP " + p;
00573
00574 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00575
00576 if (returnValue != NDIOKAY)
00577 {
00578 m_TrackingDevice->ClearReceiveBuffer();
00579 return returnValue;
00580 }
00581
00582
00583 itksys::SystemTools::Delay(100);
00584
00585 std::string reply;
00586 char b;
00587 m_TrackingDevice->ReceiveByte(&b);
00588 reply = b;
00589 if ((b == '0') || (b == '1'))
00590 {
00591
00592 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00593 std::string readCRC;
00594 m_TrackingDevice->Receive(&readCRC, 4);
00595 if (expectedCRC == readCRC)
00596 returnValue = NDIOKAY;
00597 else
00598 returnValue = NDICRCERROR;
00599 }
00600 else if (b =='E')
00601 {
00602 std::string errorstring;
00603 m_TrackingDevice->Receive(&errorstring, 4);
00604 reply += errorstring;
00605 static const std::string error("ERROR");
00606 if (error.compare(0, 5, reply) == 0)
00607 {
00608 std::string errorcode;
00609 m_TrackingDevice->Receive(&errorcode, 2);
00610
00611 reply += errorcode;
00612 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00613 std::string readCRC;
00614 m_TrackingDevice->Receive(&readCRC, 4);
00615 if (expectedCRC == readCRC)
00616 returnValue = this->GetErrorCode(&errorcode);
00617 else
00618 returnValue = NDICRCERROR;
00619 }
00620 } else
00621 returnValue = NDIUNEXPECTEDREPLY;
00622
00623
00624 m_TrackingDevice->ClearReceiveBuffer();
00625 return returnValue;
00626
00627 }
00628
00629
00630 mitk::NDIErrorCode mitk::NDIProtocol::TSTART(bool resetFrameCounter)
00631 {
00632 std::string param = "80";
00633 if (resetFrameCounter == true)
00634 return this->GenericCommand("TSTART", ¶m);
00635 else
00636 return this->GenericCommand("TSTART");
00637 }
00638
00639
00640 mitk::NDIErrorCode mitk::NDIProtocol::TSTOP()
00641 {
00642 return this->GenericCommand("TSTOP");
00643 }
00644
00645
00646 mitk::NDIErrorCode mitk::NDIProtocol::PSOUT(std::string portHandle, std::string state)
00647 {
00648 std::string param = portHandle + state;
00649 return this->GenericCommand("PSOUT", ¶m);
00650 }
00651
00652
00653 mitk::NDIErrorCode mitk::NDIProtocol::TX(bool trackIndividualMarkers, MarkerPointContainerType* markerPositions)
00654 {
00655 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00656
00657 if(trackIndividualMarkers)
00658 markerPositions->clear();
00659
00660 if (m_TrackingDevice == NULL)
00661 return TRACKINGDEVICENOTSET;
00662
00663
00664 std::string fullcommand;
00665 if (trackIndividualMarkers)
00666 {
00667 if (m_UseCRC == true)
00668 fullcommand = "TX:1001";
00669 else
00670 fullcommand = "TX 1001";
00671 } else
00672 {
00673 if (m_UseCRC == true)
00674 fullcommand = "TX:";
00675 else
00676 fullcommand = "TX ";
00677 }
00678
00679 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00680 if (returnValue != NDIOKAY)
00681 {
00682
00683 m_TrackingDevice->ClearReceiveBuffer();
00684 return returnValue;
00685 }
00686
00687 std::string reply;
00688 std::string s;
00689 m_TrackingDevice->Receive(&reply, 2);
00690
00691 static const std::string error("ERROR");
00692 if (error.compare(0, 2, reply) == 0)
00693 {
00694 m_TrackingDevice->Receive(&s, 3);
00695 reply += s;
00696 std::string errorcode;
00697 m_TrackingDevice->Receive(&errorcode, 2);
00698 reply += errorcode;
00699
00700 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00701 std::string readCRC;
00702 m_TrackingDevice->Receive(&readCRC, 4);
00703 if (expectedCRC == readCRC)
00704 {
00705 returnValue = this->GetErrorCode(&errorcode);
00706 }
00707 else
00708 {
00709 returnValue = NDICRCERROR;
00710 }
00711 }
00712 else
00713 {
00714
00715 std::stringstream converter;
00716 unsigned int numberOfHandles = 0;
00717 converter << std::hex << reply;
00718 converter >> numberOfHandles;
00719 converter.clear();
00720 converter.str("");
00721
00722
00723 for (unsigned int i = 0; i < numberOfHandles; i++)
00724 {
00725
00726 m_TrackingDevice->Receive(&s, 2);
00727 reply += s;
00728 NDIPassiveTool::Pointer tool = m_TrackingDevice->GetInternalTool(s);
00729 if (tool.IsNull())
00730 {
00731 returnValue = UNKNOWNHANDLERETURNED;
00732 break;
00733 }
00734
00735 static const std::string missing("MISSING");
00736 static const std::string disabled("DISABLED");
00737 static const std::string unoccupied("UNOCCUPIED");
00738
00739 m_TrackingDevice->Receive(&s, 6);
00740 reply += s;
00741 if (missing.compare(0, 6, s) == 0)
00742 {
00743 tool->SetErrorMessage("Tool is reported as 'missing'.");
00744 tool->SetDataValid(false);
00745 m_TrackingDevice->Receive(&s, 18);
00746 reply += s;
00747 }
00748 else if (disabled.compare(0, 6, s) == 0)
00749 {
00750 tool->SetErrorMessage("Tool is reported as 'disabled'.");
00751 tool->SetDataValid(false);
00752 m_TrackingDevice->Receive(&s, 3);
00753 reply += s;
00754 }
00755 else if (unoccupied.compare(0, 6, s) == 0)
00756 {
00757 tool->SetErrorMessage("Tool is reported as 'unoccupied'.");
00758 tool->SetDataValid(false);
00759 m_TrackingDevice->Receive(&s, 21);
00760 reply += s;
00761 }
00762 else
00763 {
00764
00765 signed int number = 0;
00766 float localPos[3] = {0.0, 0.0, 0.0};
00767 float localQuat[4] = {0.0, 0.0, 0.0, 0.0};
00768 float localError = 0.0;
00769 unsigned long localPortStatus = 0;
00770 unsigned int localFrameNumber = 0;
00771
00772
00773 converter << std::dec << s;
00774 converter >> number;
00775 converter.clear();
00776 converter.str("");
00777
00778 localQuat[0] = number / 10000.0;
00779 for (unsigned int i = 1; i < 4; i++)
00780 {
00781 m_TrackingDevice->Receive(&s, 6);
00782 reply += s;
00783 converter << std::dec << s;
00784 converter >> number;
00785 converter.clear();
00786 converter.str("");
00787 localQuat[i] = number / 10000.0;
00788 }
00789
00790 for (unsigned int i = 0; i < 3; i++)
00791 {
00792 m_TrackingDevice->Receive(&s, 7);
00793 reply += s;
00794 converter << std::dec << s;
00795 converter >> number;
00796 converter.clear();
00797 converter.str("");
00798 localPos[i] = number / 100.0;
00799 }
00800
00801 m_TrackingDevice->Receive(&s, 6);
00802 reply += s;
00803 converter << std::dec << s;
00804 converter >> number;
00805 converter.clear();
00806 converter.str("");
00807 localError = number / 10000.0;
00808
00809 m_TrackingDevice->Receive(&s, 8);
00810 reply += s;
00811 converter << std::hex << s;
00812 converter >> localPortStatus;
00813 converter.clear();
00814 converter.str("");
00815
00816 m_TrackingDevice->Receive(&s, 8);
00817 reply += s;
00818 converter << std::hex << s;
00819 converter >> localFrameNumber;
00820 converter.clear();
00821 converter.str("");
00822
00823
00824 mitk::Quaternion orientation(localQuat[1], localQuat[2], localQuat[3], localQuat[0]);
00825 tool->SetOrientation(orientation);
00826 mitk::Point3D position;
00827 position[0] = localPos[0];
00828 position[1] = localPos[1];
00829 position[2] = localPos[2];
00830 tool->SetPosition(position);
00831 tool->SetTrackingError(localError);
00832 tool->SetErrorMessage("");
00833 tool->SetDataValid(true);
00834 m_TrackingDevice->Receive(&s, 1);
00835 reply += s;
00836 }
00837 }
00838
00839
00840
00841 if(trackIndividualMarkers)
00842 {
00843
00844
00845 m_TrackingDevice->Receive(&s, 2);
00846 reply += s;
00847 unsigned int numberOfMarkers = 0;
00848 converter << std::hex << s;
00849 converter >> numberOfMarkers;
00850 converter.clear();
00851 converter.str("");
00852
00853 unsigned int oovReplySize = (unsigned int)ceil((double)numberOfMarkers/4.0);
00854 unsigned int nbMarkersInVolume = 0;
00855 char c;
00856
00857 for (unsigned int i = 0; i < oovReplySize; i++)
00858 {
00859 m_TrackingDevice->ReceiveByte(&c);
00860 reply += c;
00861 nbMarkersInVolume += ByteToNbBitsOn(c);
00862 }
00863
00864 nbMarkersInVolume = numberOfMarkers-nbMarkersInVolume;
00865
00866
00867 for (unsigned int i = 0; i < nbMarkersInVolume; i++)
00868 {
00869
00870 signed int number = 0;
00871 MarkerPointType markerPosition;
00872
00873 for (unsigned int i = 0; i < 3; i++)
00874 {
00875 m_TrackingDevice->Receive(&s, 7);
00876 reply += s;
00877 converter << std::dec << s;
00878 converter >> number;
00879 converter.clear();
00880 converter.str("");
00881 markerPosition[i] = number / 100.0;
00882 }
00883 markerPositions->push_back(markerPosition);
00884
00885 }
00886 }
00887
00888
00889
00890
00891 m_TrackingDevice->Receive(&s, 4);
00892 reply += s;
00893
00894 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00895 std::string readCRC;
00896 m_TrackingDevice->Receive(&readCRC, 4);
00897 if (expectedCRC == readCRC)
00898 {
00899 returnValue = NDIOKAY;
00900 }
00901 else
00902 {
00903 returnValue = NDICRCERROR;
00904
00905 m_TrackingDevice->InvalidateAll();
00906 if(trackIndividualMarkers)
00907 markerPositions->clear();
00908 }
00909 }
00910
00911
00912 m_TrackingDevice->Receive(&s, 1);
00913 m_TrackingDevice->ClearReceiveBuffer();
00914 return returnValue;
00915 }
00916
00917
00918 mitk::NDIErrorCode mitk::NDIProtocol::TX1000(MarkerPointContainerType* markerPositions)
00919 {
00920
00921 NDIErrorCode returnValue = NDIUNKNOWNERROR;
00922
00923 markerPositions->clear();
00924
00925 if (m_TrackingDevice == NULL)
00926 return TRACKINGDEVICENOTSET;
00927
00928
00929 std::string fullcommand;
00930 if (m_UseCRC == true)
00931 fullcommand = "TX:1001";
00932 else
00933 fullcommand = "TX 1001";
00934
00935 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
00936
00937
00938 std::string reply;
00939 std::string s;
00940 m_TrackingDevice->Receive(&reply, 2);
00941
00942 static const std::string error("ERROR");
00943 if (error.compare(0, 2, reply) == 0)
00944 {
00945 m_TrackingDevice->Receive(&s, 3);
00946 reply += s;
00947 std::string errorcode;
00948 m_TrackingDevice->Receive(&errorcode, 2);
00949 reply += errorcode;
00950
00951 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
00952 std::string readCRC;
00953 m_TrackingDevice->Receive(&readCRC, 4);
00954 if (expectedCRC == readCRC)
00955 {
00956 returnValue = this->GetErrorCode(&errorcode);
00957 }
00958 else
00959 {
00960 returnValue = NDICRCERROR;
00961 }
00962 }
00963 else
00964 {
00965
00966 std::stringstream converter;
00967 unsigned int numberOfHandles = 0;
00968 converter << std::hex << reply;
00969 converter >> numberOfHandles;
00970 converter.clear();
00971 converter.str("");
00972
00973
00974 for (unsigned int i = 0; i < numberOfHandles; i++)
00975 {
00976
00977 m_TrackingDevice->Receive(&s, 2);
00978 reply += s;
00979 NDIPassiveTool::Pointer tool = m_TrackingDevice->GetInternalTool(s);
00980 if (tool.IsNull())
00981 {
00982 returnValue = UNKNOWNHANDLERETURNED;
00983 break;
00984 }
00985
00986 static const std::string missing("MISSING");
00987 static const std::string disabled("DISABLED");
00988 static const std::string unoccupied("UNOCCUPIED");
00989
00990 m_TrackingDevice->Receive(&s, 6);
00991 reply += s;
00992 if (missing.compare(0, 6, s) == 0)
00993 {
00994 tool->SetErrorMessage("Tool is reported as 'missing'.");
00995 tool->SetDataValid(false);
00996 m_TrackingDevice->Receive(&s, 18);
00997 reply += s;
00998 }
00999 else if (disabled.compare(0, 6, s) == 0)
01000 {
01001 tool->SetErrorMessage("Tool is reported as 'disabled'.");
01002 tool->SetDataValid(false);
01003 m_TrackingDevice->Receive(&s, 19);
01004 reply += s;
01005 }
01006 else if (unoccupied.compare(0, 6, s) == 0)
01007 {
01008 tool->SetErrorMessage("Tool is reported as 'unoccupied'.");
01009 tool->SetDataValid(false);
01010 m_TrackingDevice->Receive(&s, 21);
01011 reply += s;
01012 }
01013 else
01014 {
01015
01016 signed int number = 0;
01017 float localPos[3] = {0.0, 0.0, 0.0};
01018 float localQuat[4] = {0.0, 0.0, 0.0, 0.0};
01019 float localError = 0.0;
01020 unsigned long localPortStatus = 0;
01021 unsigned int localFrameNumber = 0;
01022
01023
01024 converter << std::dec << s;
01025 converter >> number;
01026 converter.clear();
01027 converter.str("");
01028
01029 localQuat[0] = number / 10000.0;
01030 for (unsigned int i = 1; i < 4; i++)
01031 {
01032 m_TrackingDevice->Receive(&s, 6);
01033 reply += s;
01034 converter << std::dec << s;
01035 converter >> number;
01036 converter.clear();
01037 converter.str("");
01038 localQuat[i] = number / 10000.0;
01039 }
01040
01041 for (unsigned int i = 0; i < 3; i++)
01042 {
01043 m_TrackingDevice->Receive(&s, 7);
01044 reply += s;
01045 converter << std::dec << s;
01046 converter >> number;
01047 converter.clear();
01048 converter.str("");
01049 localPos[i] = number / 100.0;
01050 }
01051
01052 m_TrackingDevice->Receive(&s, 6);
01053 reply += s;
01054 converter << std::dec << s;
01055 converter >> number;
01056 converter.clear();
01057 converter.str("");
01058 localError = number / 10000.0;
01059
01060 m_TrackingDevice->Receive(&s, 8);
01061 reply += s;
01062 converter << std::hex << s;
01063 converter >> localPortStatus;
01064 converter.clear();
01065 converter.str("");
01066
01067 m_TrackingDevice->Receive(&s, 8);
01068 reply += s;
01069 converter << std::hex << s;
01070 converter >> localFrameNumber;
01071 converter.clear();
01072 converter.str("");
01073
01074
01075 mitk::Quaternion orientation(localQuat[1], localQuat[2], localQuat[3], localQuat[0]);
01076 tool->SetOrientation(orientation);
01077 mitk::Point3D position;
01078 position[0] = localPos[0];
01079 position[1] = localPos[1];
01080 position[2] = localPos[2];
01081 tool->SetPosition(position);
01082 tool->SetTrackingError(localError);
01083 tool->SetErrorMessage("");
01084 tool->SetDataValid(true);
01085 m_TrackingDevice->Receive(&s, 1);
01086 reply += s;
01087 }
01088 }
01089
01090
01091
01092 m_TrackingDevice->Receive(&s, 2);
01093 reply += s;
01094 unsigned int numberOfMarkers = 0;
01095 converter << std::hex << s;
01096 converter >> numberOfMarkers;
01097 converter.clear();
01098 converter.str("");
01099
01100 unsigned int oovReplySize = (unsigned int)ceil((double)numberOfMarkers/4.0);
01101 unsigned int nbMarkersInVolume = 0;
01102 char c;
01103
01104 for (unsigned int i = 0; i < oovReplySize; i++)
01105 {
01106 m_TrackingDevice->ReceiveByte(&c);
01107 reply += c;
01108 nbMarkersInVolume += ByteToNbBitsOn(c);
01109 }
01110
01111 nbMarkersInVolume = numberOfMarkers-nbMarkersInVolume;
01112
01113
01114 for (unsigned int i = 0; i < nbMarkersInVolume; i++)
01115 {
01116
01117 signed int number = 0;
01118 MarkerPointType markerPosition;
01119
01120 for (unsigned int i = 0; i < 3; i++)
01121 {
01122 m_TrackingDevice->Receive(&s, 7);
01123 reply += s;
01124 converter << std::dec << s;
01125 converter >> number;
01126 converter.clear();
01127 converter.str("");
01128 markerPosition[i] = number / 100.0;
01129 }
01130 markerPositions->push_back(markerPosition);
01131
01132 }
01133
01134
01135
01136
01137
01138
01139
01140 m_TrackingDevice->Receive(&s, 4);
01141 reply += s;
01142
01143 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01144 std::string readCRC;
01145 m_TrackingDevice->Receive(&readCRC, 4);
01146 if (expectedCRC == readCRC)
01147 {
01148 returnValue = NDIOKAY;
01149 }
01150 else
01151 {
01152 returnValue = NDICRCERROR;
01153
01154 markerPositions->clear();
01155 m_TrackingDevice->InvalidateAll();
01156 }
01157 }
01158
01159
01160 m_TrackingDevice->Receive(&s, 1);
01161 m_TrackingDevice->ClearReceiveBuffer();
01162 return returnValue;
01163 }
01164
01165
01166 mitk::NDIErrorCode mitk::NDIProtocol::BX()
01167 {
01168 std::cout << "BX() not implemented yet, using TX() instead." << std::endl;
01169 return this->TX();
01170 }
01171
01172
01173 mitk::NDIErrorCode mitk::NDIProtocol::VER(mitk::TrackingDeviceType& t)
01174 {
01175 if (m_TrackingDevice == NULL)
01176 return TRACKINGDEVICENOTSET;
01177
01178 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01179
01180 std::string fullcommand;
01181 if (m_UseCRC == true)
01182 fullcommand = "VER:4";
01183 else
01184 fullcommand = "VER 4";
01185
01186 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
01187 if (returnValue != NDIOKAY)
01188 {
01189
01190 m_TrackingDevice->ClearReceiveBuffer();
01191 return returnValue;
01192 }
01193
01194 std::string reply;
01195 m_TrackingDevice->Receive(&reply, 5);
01196 static const std::string error("ERROR");
01197 if (error.compare(0, 6, reply) == 0)
01198 {
01199 std::string errorcode;
01200 m_TrackingDevice->Receive(&errorcode, 2);
01201 reply += errorcode;
01202
01203 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01204 std::string readCRC;
01205 m_TrackingDevice->Receive(&readCRC, 4);
01206 if (expectedCRC == readCRC)
01207 returnValue = this->GetErrorCode(&errorcode);
01208 else
01209 returnValue = NDICRCERROR;
01210 }
01211 else
01212 {
01213 std::string s;
01214 m_TrackingDevice->ReceiveLine(&s);
01215 reply += s;
01216 std::string upperCaseReply;
01217 upperCaseReply.resize(reply.size());
01218 std::transform (reply.begin(), reply.end(), upperCaseReply.begin(), toupper);
01219 if (upperCaseReply.find("POLARIS") != std::string::npos)
01220 t = mitk::NDIPolaris;
01221 else if (upperCaseReply.find("AURORA") != std::string::npos)
01222 t = mitk::NDIAurora;
01223 else
01224 t = mitk::TrackingSystemNotSpecified;
01225
01226
01227 itksys::SystemTools::Delay(500);
01228 m_TrackingDevice->ClearReceiveBuffer();
01229 returnValue = NDIOKAY;
01230 }
01231 return returnValue;
01232 }
01233
01234
01235 mitk::NDIErrorCode mitk::NDIProtocol::POS3D(MarkerPointContainerType* markerPositions)
01236 {
01237 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01238
01239 if (m_TrackingDevice == NULL)
01240 {
01241 return TRACKINGDEVICENOTSET;
01242 }
01243 if (markerPositions == NULL)
01244 {
01245 std::cout << "ERROR: markerPositions==NULL" << std::endl;
01246 return NDIUNKNOWNERROR;
01247 }
01248
01249 markerPositions->clear();
01250
01251 if (m_TrackingDevice->GetToolCount() == 0)
01252 {
01253 std::cout << "ERROR: no tools present" << std::endl;
01254 return NDIUNKNOWNERROR;
01255 }
01256 const TrackingTool* t = m_TrackingDevice->GetTool(static_cast<unsigned int>(0));
01257 const NDIPassiveTool* t2 = dynamic_cast<const NDIPassiveTool*>(t);
01258 if (t2 == NULL)
01259 {
01260 std::cout << "ERROR: no tool present" << std::endl;
01261 return NDIUNKNOWNERROR;
01262 }
01263 std::string portHandle = t2->GetPortHandle();
01264 if (portHandle.size() == 0)
01265 {
01266 std::cout << "ERROR: no port handle" << std::endl;
01267 return NDIUNKNOWNERROR;
01268 }
01269
01270
01271 std::string fullcommand;
01272 if (m_UseCRC == true)
01273 fullcommand = "3D:" + portHandle + "5";
01274 else
01275 fullcommand = "3D " + portHandle + "5";
01276
01277 m_TrackingDevice->ClearReceiveBuffer();
01278 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
01279
01280
01281 std::string reply;
01282 std::string s;
01283
01284 mitk::NDIErrorCode receivevalue = m_TrackingDevice->Receive(&reply, 3);
01285 if(receivevalue != NDIOKAY)
01286 {
01287 std::cout << "ERROR: receive_value != NDIOKAY" << std::endl;
01288 return receivevalue;
01289 }
01290
01291 static const std::string error("ERROR");
01292 if (error.compare(0, 3, reply) == 0)
01293 {
01294 m_TrackingDevice->Receive(&s, 2);
01295 reply += s;
01296 std::string errorcode;
01297 m_TrackingDevice->Receive(&errorcode, 2);
01298 reply += errorcode;
01299
01300 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01301 std::string readCRC;
01302 m_TrackingDevice->Receive(&readCRC, 4);
01303 if (expectedCRC == readCRC)
01304 {
01305 returnValue = this->GetErrorCode(&errorcode);
01306 }
01307 else
01308 {
01309 returnValue = NDICRCERROR;
01310 }
01311 }
01312 else
01313 {
01314 signed int number = 0;
01315
01316 MarkerPointType p;
01317 float lineSeparation = 0.0;
01318
01319
01320 std::stringstream converter;
01321 unsigned int numberOfMarkers = 0;
01322 converter << std::dec << reply;
01323 converter >> numberOfMarkers;
01324 converter.clear();
01325 converter.str("");
01326
01327 for (unsigned int markerID = 0; markerID < numberOfMarkers; markerID++)
01328 {
01329 m_TrackingDevice->Receive(&s, 1);
01330 reply += s;
01331
01332 for (unsigned int i = 0; i < 3; i++)
01333 {
01334 receivevalue = m_TrackingDevice->Receive(&s, 9);
01335 if(receivevalue != NDIOKAY)
01336 {
01337 markerPositions->clear();
01338 std::cout << "ERROR: receive_value != NDIOKAY" << std::endl;
01339 return receivevalue;
01340 }
01341 reply += s;
01342 converter << std::dec << s;
01343 converter >> number;
01344 converter.clear();
01345 converter.str("");
01346 p[i] = number / 10000.0;
01347 }
01348
01349 receivevalue = m_TrackingDevice->Receive(&s, 4);
01350 if(receivevalue != NDIOKAY)
01351 {
01352 markerPositions->clear();
01353 std::cout << "ERROR: receive_value != NDIOKAY" << std::endl;
01354 return receivevalue;
01355 }
01356 reply += s;
01357 converter << std::dec << s;
01358 converter >> number;
01359 converter.clear();
01360 converter.str("");
01361 lineSeparation = number / 100.0;
01362
01363 receivevalue = m_TrackingDevice->Receive(&s, 1);
01364 if(receivevalue != NDIOKAY)
01365 {
01366 markerPositions->clear();
01367 std::cout << std::endl << std::endl << std::endl << "ERROR: POS3D != NDIOKAY" << std::endl;
01368 return receivevalue;
01369 }
01370 reply += s;
01371
01372 markerPositions->push_back(p);
01373 }
01374
01375
01376
01377 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01378 std::string readCRC;
01379 m_TrackingDevice->Receive(&readCRC, 4);
01380 if (expectedCRC == readCRC)
01381 {
01382 returnValue = NDIOKAY;
01383 }
01384 else
01385 {
01386 returnValue = NDICRCERROR;
01387 std::cout << "ERROR: receive_value != NDIOKAY" << std::endl;
01388
01389 markerPositions->clear();
01390 }
01391 }
01392
01393
01394 m_TrackingDevice->Receive(&s, 1);
01395 m_TrackingDevice->ClearReceiveBuffer();
01396
01397 return returnValue;
01398 }
01399
01400
01401 mitk::NDIErrorCode mitk::NDIProtocol::GenericCommand(const std::string command, const std::string* parameter)
01402 {
01403 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01404
01405 if (m_TrackingDevice == NULL)
01406 return TRACKINGDEVICENOTSET;
01407
01408 std::string p;
01409 if (parameter != NULL)
01410 p = *parameter;
01411 else
01412 p = "";
01413
01414
01415 std::string fullcommand;
01416 if (m_UseCRC == true)
01417 fullcommand = command + ":" + p;
01418 else
01419 fullcommand = command + " " + p;
01420
01421 returnValue = m_TrackingDevice->Send(&fullcommand, m_UseCRC);
01422
01423 if (returnValue != NDIOKAY)
01424 {
01425 m_TrackingDevice->ClearReceiveBuffer();
01426 return returnValue;
01427 }
01428
01429 itksys::SystemTools::Delay(100);
01430
01431
01432
01433
01434 this->ParseOkayError();
01435 return returnValue;
01436 }
01437
01438
01439 unsigned int mitk::NDIProtocol::ByteToNbBitsOn(char& c) const
01440 {
01441 if(c == '0')
01442 return 0;
01443 else if (c == '1' || c == '2' || c == '4' || c == '8')
01444 return 1;
01445 else if (c == '3' || c == '5' || c == '9' || c == '6' || c == 'A' || c == 'C')
01446 return 2;
01447 else if (c == '7' || c == 'B' || c == 'D' || c == 'E')
01448 return 3;
01449 else if (c == 'F')
01450 return 4;
01451 else
01452 return 0;
01453 }
01454
01455
01456 mitk::NDIErrorCode mitk::NDIProtocol::ParseOkayError()
01457 {
01458 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01459
01460
01461
01462 std::string reply;
01463 m_TrackingDevice->Receive(&reply, 4);
01464
01465
01466 static const std::string okay("OKAYA896");
01467 static const std::string error("ERROR");
01468
01469 if (okay.compare(0, 4, reply) == 0)
01470 {
01471
01472 m_TrackingDevice->Receive(&reply, 4);
01473 if (okay.compare(4, 4, reply, 0, 4) == 0)
01474 returnValue = NDIOKAY;
01475 else
01476 returnValue = NDICRCERROR;
01477 }
01478 else if (error.compare(0, 4, reply) == 0)
01479 {
01480 char b;
01481 m_TrackingDevice->ReceiveByte(&b);
01482 reply += b;
01483 std::string errorcode;
01484 m_TrackingDevice->Receive(&errorcode, 2);
01485 reply += errorcode;
01486
01487 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01488 std::string readCRC;
01489 m_TrackingDevice->Receive(&readCRC, 4);
01490 if (expectedCRC == readCRC)
01491 returnValue = this->GetErrorCode(&errorcode);
01492 else
01493 returnValue = NDICRCERROR;
01494 }
01495 else
01496 returnValue = NDIUNEXPECTEDREPLY;
01497
01498
01499 char b;
01500 m_TrackingDevice->ReceiveByte(&b);
01501 m_TrackingDevice->ClearReceiveBuffer();
01502 return returnValue;
01503 }
01504
01505
01506 mitk::NDIErrorCode mitk::NDIProtocol::GetErrorCode(const std::string* input)
01507 {
01508 if (input->compare("01") == 0)
01509 return NDIINVALIDCOMMAND;
01510 else if (input->compare("02") == 0)
01511 return NDICOMMANDTOOLONG;
01512 else if (input->compare("03") == 0)
01513 return NDICOMMANDTOOSHORT;
01514 else if (input->compare("04") == 0)
01515 return NDICRCDOESNOTMATCH;
01516 else if (input->compare("05") == 0)
01517 return NDITIMEOUT;
01518 else if (input->compare("06") == 0)
01519 return NDIUNABLETOSETNEWCOMMPARAMETERS;
01520 else if (input->compare("07") == 0)
01521 return NDIINCORRECTNUMBEROFPARAMETERS;
01522 else if (input->compare("08") == 0)
01523 return NDIINVALIDPORTHANDLE;
01524 else if (input->compare("09") == 0)
01525 return NDIINVALIDTRACKINGPRIORITY;
01526 else if (input->compare("0A") == 0)
01527 return NDIINVALIDLED;
01528 else if (input->compare("0B") == 0)
01529 return NDIINVALIDLEDSTATE;
01530 else if (input->compare("0C") == 0)
01531 return NDICOMMANDINVALIDINCURRENTMODE;
01532 else if (input->compare("0D") == 0)
01533 return NDINOTOOLFORPORT;
01534 else if (input->compare("0E") == 0)
01535 return NDIPORTNOTINITIALIZED;
01536
01537
01538 else if (input->compare("10") == 0)
01539 return NDISYSTEMNOTINITIALIZED;
01540 else if (input->compare("11") == 0)
01541 return NDIUNABLETOSTOPTRACKING;
01542 else if (input->compare("12") == 0)
01543 return NDIUNABLETOSTARTTRACKING;
01544 else if (input->compare("13") == 0)
01545 return NDIINITIALIZATIONFAILED;
01546 else if (input->compare("14") == 0)
01547 return NDIINVALIDVOLUMEPARAMETERS;
01548 else if (input->compare("16") == 0)
01549 return NDICANTSTARTDIAGNOSTICMODE;
01550 else if (input->compare("1B") == 0)
01551 return NDICANTINITIRDIAGNOSTICS;
01552 else if (input->compare("1F") == 0)
01553 return NDIFAILURETOWRITESROM;
01554 else if (input->compare("22") == 0)
01555 return NDIENABLEDTOOLSNOTSUPPORTED;
01556 else if (input->compare("23") == 0)
01557 return NDICOMMANDPARAMETEROUTOFRANGE;
01558 else if (input->compare("2A") == 0)
01559 return NDINOMEMORYAVAILABLE;
01560 else if (input->compare("2B") == 0)
01561 return NDIPORTHANDLENOTALLOCATED;
01562 else if (input->compare("2C") == 0)
01563 return NDIPORTHASBECOMEUNOCCUPIED;
01564 else if (input->compare("2D") == 0)
01565 return NDIOUTOFHANDLES;
01566 else if (input->compare("2E") == 0)
01567 return NDIINCOMPATIBLEFIRMWAREVERSIONS;
01568 else if (input->compare("2F") == 0)
01569 return NDIINVALIDPORTDESCRIPTION;
01570 else if (input->compare("32") == 0)
01571 return NDIINVALIDOPERATIONFORDEVICE;
01572
01573 else
01574 return NDIUNKNOWNERROR;
01575 }
01576
01577 mitk::NDIErrorCode mitk::NDIProtocol::APIREV(std::string* revision)
01578 {
01579 if (m_TrackingDevice == NULL)
01580 return TRACKINGDEVICENOTSET;
01581
01582 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01583
01584
01585 std::string command;
01586 if (m_UseCRC)
01587 command = "APIREV:";
01588 else
01589 command = "APIREV ";
01590
01591 returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
01592 if (returnValue != NDIOKAY)
01593 {
01594
01595 m_TrackingDevice->ClearReceiveBuffer();
01596 return returnValue;
01597 }
01598
01599
01600
01601
01602
01603 std::string reply;
01604 m_TrackingDevice->Receive(&reply, 5);
01605
01606
01607 static const std::string error("ERROR");
01608 if (error.compare(0, 6, reply) == 0)
01609 {
01610 std::string errorcode;
01611 m_TrackingDevice->Receive(&errorcode, 2);
01612 reply += errorcode;
01613
01614
01615 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01616 std::string readCRC;
01617 m_TrackingDevice->Receive(&readCRC, 4);
01618
01619 if (expectedCRC == readCRC)
01620 returnValue = this->GetErrorCode(&errorcode);
01621 else
01622 returnValue = NDICRCERROR;
01623 }
01624 else
01625 {
01626 std::string s;
01627
01628 m_TrackingDevice->Receive(&s, 4);
01629 reply += s;
01630
01631
01632 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01633 std::string readCRC;
01634 m_TrackingDevice->Receive(&readCRC, 4);
01635
01636 if (expectedCRC == readCRC)
01637 returnValue = NDIOKAY;
01638 else
01639 returnValue = NDICRCERROR;
01640 }
01641
01642 *revision = reply;
01643 m_TrackingDevice->ClearReceiveBuffer();
01644 return returnValue;
01645 }
01646
01647
01648 mitk::NDIErrorCode mitk::NDIProtocol::SFLIST(std::string* info)
01649 {
01650 if (m_TrackingDevice == NULL)
01651 return TRACKINGDEVICENOTSET;
01652
01653 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01654
01655
01656 std::string command;
01657 if (m_UseCRC)
01658 command = "SFLIST:03";
01659 else
01660 command = "SFLIST 03";
01661
01662 returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
01663 if (returnValue != NDIOKAY)
01664 {
01665
01666 m_TrackingDevice->ClearReceiveBuffer();
01667 return returnValue;
01668 }
01669
01670
01671 std::string reply;
01672 m_TrackingDevice->Receive(&reply, 5);
01673
01674 static const std::string error("ERROR");
01675 if (error.compare(0,6,reply) == 0)
01676 {
01677 std::string errorcode;
01678 m_TrackingDevice->Receive(&errorcode, 2);
01679 reply += errorcode;
01680
01681
01682 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01683 std::string readCRC;
01684 m_TrackingDevice->Receive(&readCRC, 4);
01685
01686 if (expectedCRC == readCRC)
01687 returnValue = this->GetErrorCode(&errorcode);
01688 else
01689 returnValue = NDICRCERROR;
01690 }
01691
01692 else
01693 {
01694
01695 std::stringstream converter;
01696 unsigned int numberOfVolumes = 0;
01697 converter << std::hex << reply[0];
01698 converter >> numberOfVolumes;
01699 converter.clear();
01700 converter.str("");
01701
01702
01703 if (numberOfVolumes>0)
01704 {
01705
01706 for (unsigned int i = 0; i<numberOfVolumes; i++)
01707 {
01708 std::string currentVolume;
01709 if (i==0)
01710 {
01711
01712 currentVolume.append(reply,1,4);
01713 std::string s;
01714 m_TrackingDevice->Receive(&s, 69);
01715 reply += s;
01716 currentVolume += s;
01717 }
01718 else
01719 {
01720
01721
01722
01723 std::string l;
01724 m_TrackingDevice->ReceiveLine(&l);
01725 reply += l;
01726
01727 std::string s;
01728 m_TrackingDevice->Receive(&s, 73);
01729 reply += s;
01730 currentVolume += s;
01731 }
01732
01733
01734 static const std::string standard = "0";
01735 static const std::string pyramid = "4";
01736 static const std::string spectraPyramid = "5";
01737 static const std::string vicraVolume = "7";
01738 static const std::string cube = "9";
01739 static const std::string dome = "A";
01740 if (currentVolume.compare(0,1,standard)==0)
01741 MITK_INFO<<"Standard volume supported \n";
01742 else if (currentVolume.compare(0,1,pyramid)==0)
01743 MITK_INFO<<"Pyramid volume supported \n";
01744 else if (currentVolume.compare(0,1,spectraPyramid)==0)
01745 MITK_INFO<<"Spectra pyramid volume supported \n";
01746 else if (currentVolume.compare(0,1,vicraVolume)==0)
01747 MITK_INFO<<"Vicra volume supported \n";
01748 else if (currentVolume.compare(0,1,cube)==0)
01749 MITK_INFO<<"Cube volume supported \n";
01750 else if (currentVolume.compare(0,1,dome)==0)
01751 MITK_INFO<<"Dome volume supported \n";
01752 else
01753 MITK_INFO<<"Message not understood!\n";
01754 }
01755 }
01756
01757
01758 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01759 std::string readCRC;
01760 m_TrackingDevice->Receive(&readCRC, 4);
01761
01762 if (expectedCRC == readCRC)
01763 returnValue = NDIOKAY;
01764 else
01765 returnValue = NDICRCERROR;
01766 }
01767
01768 *info = reply;
01769 m_TrackingDevice->ClearReceiveBuffer();
01770 return returnValue;
01771 }
01772
01773 mitk::NDIErrorCode mitk::NDIProtocol::VSEL(mitk::NDITrackingVolume volume)
01774 {
01775 if (m_TrackingDevice == NULL)
01776 return TRACKINGDEVICENOTSET;
01777
01778 NDIErrorCode returnValue = NDIUNKNOWNERROR;
01779
01780
01781
01782 unsigned int numberOfVolumes;
01783 mitk::NDITrackingDevice::NDITrackingVolumeContainerType volumes;
01784 mitk::NDITrackingDevice::TrackingVolumeDimensionType volumesDimensions;
01785 if (!m_TrackingDevice->GetSupportedVolumes(&numberOfVolumes, &volumes, &volumesDimensions))
01786 return returnValue;
01787
01788
01789 if (volumes.empty())
01790 return returnValue;
01791
01792
01793
01794 unsigned int index = 1;
01795 mitk::NDITrackingDevice::NDITrackingVolumeContainerType::iterator it = volumes.begin();
01796 while (it != volumes.end())
01797 {
01798 if ((*it) == volume)
01799 break;
01800 it++, index++;
01801 }
01802 if (it == volumes.end() || index > numberOfVolumes)
01803 return NDIINVALIDOPERATIONFORDEVICE;
01804
01805
01806
01807
01808 std::string command;
01809 if (m_UseCRC)
01810 command = "VSEL:";
01811 else
01812 command = "VSEL ";
01813
01814
01815 std::stringstream s;
01816 s << index;
01817 command += s.str();
01818
01819 returnValue = m_TrackingDevice->Send(&command, m_UseCRC);
01820 if (returnValue != NDIOKAY)
01821 {
01822
01823 m_TrackingDevice->ClearReceiveBuffer();
01824 return returnValue;
01825 }
01826
01827
01828 std::string reply;
01829 m_TrackingDevice->Receive(&reply, 4);
01830
01831 static const std::string error("ERRO");
01832 if (error.compare(reply) == 0)
01833 {
01834 std::string s;
01835 m_TrackingDevice->Receive(&s, 1);
01836 reply += s;
01837
01838 std::string errorcode;
01839 m_TrackingDevice->Receive(&errorcode, 2);
01840 reply += errorcode;
01841
01842
01843 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01844 std::string readCRC;
01845 m_TrackingDevice->Receive(&readCRC, 4);
01846
01847 if (expectedCRC == readCRC)
01848 returnValue = this->GetErrorCode(&errorcode);
01849 else
01850 returnValue = NDICRCERROR;
01851 }
01852 else
01853 {
01854
01855 std::string expectedCRC = m_TrackingDevice->CalcCRC(&reply);
01856 std::string readCRC;
01857 m_TrackingDevice->Receive(&readCRC, 4);
01858
01859 if (expectedCRC == readCRC)
01860 returnValue = NDIOKAY;
01861 else
01862 returnValue = NDICRCERROR;
01863 }
01864
01865 m_TrackingDevice->ClearReceiveBuffer();
01866 return returnValue;
01867 }