18 #include "ftkErrors.h" 20 #include "ftkOptions.h" 21 #include "ftkInterface.h" 22 #include "ftkPlatform.h" 25 #include <igsioCommon.h> 27 #define ATRACSYS_BUFFER_SIZE 1024 28 #define RESET_DROPPED_FRAME_COUNT 1 35 size_t pos =
data.find(toSearch);
38 while (pos != std::string::npos)
41 data.replace(pos, toSearch.size(), replaceStr);
43 pos =
data.find(toSearch, pos + replaceStr.size());
50 bool noexception =
false;
53 var = std::atoi(str.c_str());
56 catch (std::invalid_argument& e)
58 LOG_WARNING(std::string(
"Cannot convert ") + str + std::string(
" to int32"));
60 catch (std::out_of_range& e)
62 LOG_WARNING(str + std::string(
" is out of range for int32"));
70 bool noexception =
false;
73 var = std::atof(str.c_str());
76 catch (std::invalid_argument& e)
78 LOG_WARNING(std::string(
"Cannot convert ") + str + std::string(
" to float"));
80 catch (std::out_of_range& e)
82 LOG_WARNING(str + std::string(
" is out of range for float"));
94 long findEOL(
char& c,
char* addr,
size_t size)
96 for (
long u = 0; u < (long)size; u++)
99 if (c == 0 || c ==
'\n')
108 bool parseLine(std::string&
line)
110 size_t first_bracket =
line.find_first_of(
"["),
111 last_bracket =
line.find_last_of(
"]"),
112 equal =
line.find_first_of(
"=");
114 if (first_bracket != std::string::npos &&
115 last_bracket != std::string::npos)
118 _currentSection =
line.substr(first_bracket + 1,
119 last_bracket - first_bracket - 1);
120 sections[_currentSection] = KeyValues();
122 else if (equal != std::string::npos && _currentSection !=
"")
125 std::string
key =
line.substr(0, equal),
126 val =
line.substr(equal + 1);
127 sections[_currentSection][
key] = val;
136 if (!
line.empty() &&
line.substr(0, 1) !=
";")
143 std::string _currentSection;
146 typedef std::map< std::string, std::string > KeyValues;
147 typedef std::map< std::string, KeyValues > Sections;
152 bool parse(
char* addr,
size_t size)
155 _currentSection =
"";
162 long lineSize = findEOL(c, addr, size);
166 strLine = (lineSize > 0) ? std::string(addr, lineSize) : std::string(addr);
167 strLine.erase(remove(strLine.begin(), strLine.end(),
'\r'), strLine.end());
168 if (!parseLine(strLine))
178 if (c == 0 || size ==
size_t(lineSize))
182 addr += lineSize + 1;
183 size -= lineSize + 1;
190 bool save(std::string str)
192 FILE* file = fopen(str.c_str(),
"wb");
198 Sections::iterator iterS = sections.begin();
200 while (iterS != sections.end())
202 fprintf(file,
"[%s]\n", iterS->first.c_str());
204 KeyValues& kw = iterS->second;
205 KeyValues::iterator iterK = kw.begin();
207 while (iterK != kw.end())
209 fprintf(file,
"%s=%s\n",
210 iterK->first.c_str(), iterK->second.c_str());
220 bool toBuffer(
char** out,
size_t& outSize)
230 Sections::iterator iterS = sections.begin();
232 while (iterS != sections.end())
234 sprintf(temp,
"[%s]\n", iterS->first.c_str());
237 KeyValues& kw = iterS->second;
238 KeyValues::iterator iterK = kw.begin();
240 while (iterK != kw.end())
242 sprintf(temp,
"%s=%s\n",
243 iterK->first.c_str(), iterK->second.c_str());
250 outSize = buffer.length() + 1;
251 char* str =
new (std::nothrow)
char[outSize];
258 strncpy(str, buffer.c_str(), outSize - 1);
259 str[outSize - 1] = 0;
269 if (
p.sections.find(section) ==
p.sections.end())
277 bool checkKey(IniFile&
p,
const std::string& section,
const std::string&
key)
279 if (
p.sections[section].find(
key) ==
p.sections[section].end())
297 std::string val(
p.sections[section][
key]);
299 *variable = uint32(strtol(val.c_str(), &pEnd, 10));
316 floatXX(strtod(
p.sections[section][
key].c_str(), &pEnd));
325 class Tracker::Internal
345 ResultToStringMap[
ERROR_ENABLE_LASER] =
"Failed to enable laser, this is a spryTrack only option.";
361 CalibrationDate =
"";
366 bool isVirtual =
false;
369 bool isPaused =
true;
372 ftkLibrary FtkLib =
nullptr;
375 std::string LibVersion;
378 std::string CalibrationDate;
381 uint64 TrackerSN = 0;
384 ftkFrameQuery* Frame =
nullptr;
387 std::map<RESULT, std::string> ResultToStringMap;
390 RESULT LoadFtkGeometryFromFile(
const std::string& filename, ftkGeometry& geom);
393 RESULT LoadFtkGeometryFromString(
const std::string& geomString, ftkGeometry& geom);
395 std::map<int, std::vector<std::array<float, 3>>> Geometries;
399 std::map<std::string, ftkOptionsInfo> DeviceOptionMap{};
403 static void DeviceOptionEnumerator(uint64_t serialNumber,
void* userData, ftkOptionsInfo* option)
405 Tracker::Internal* ptr =
406 reinterpret_cast<Tracker::Internal*>(userData);
411 ptr->DeviceOptionMap.emplace(option->name, *option);
415 bool LoadIniFile(std::ifstream& is, ftkGeometry& geometry)
417 std::string
line, fileContent(
"");
422 fileContent +=
line +
"\n";
425 return ParseIniFile(fileContent, geometry);
429 bool ParseIniFile(std::string fileContent, ftkGeometry& geometry)
433 Geometry::IniFile parser;
435 if (!parser.parse(const_cast<char*>(fileContent.c_str()),
452 geometry.version = 0u;
453 geometry.pointsCount = tmp;
454 if (!
assignUint32(parser,
"geometry",
"id", &geometry.geometryId))
459 char sectionName[10u];
461 for (uint32
i(0u);
i < geometry.pointsCount; ++
i)
463 sprintf(sectionName,
"fiducial%u",
i);
471 &geometry.positions[
i].x))
476 &geometry.positions[
i].y))
481 &geometry.positions[
i].z))
487 std::vector<std::array<float, 3>> pts;
488 for (uint32
i(0u);
i < geometry.pointsCount; ++
i)
490 std::array<float, 3> pt = { geometry.positions[
i].x, geometry.positions[
i].y, geometry.positions[
i].z };
493 this->Geometries[geometry.geometryId] = pts;
511 DeviceData* ptr = reinterpret_cast<DeviceData*>(user);
512 ptr->SerialNumber = sn;
518 Tracker::RESULT Tracker::Internal::LoadFtkGeometryFromFile(
const std::string& filename, ftkGeometry& geom)
521 input.open(filename.c_str());
523 if (!input.fail() && this->LoadIniFile(input, geom))
525 return ERROR_FAILURE_TO_LOAD_INI;
531 if (ftkGetData(this->FtkLib, this->TrackerSN, this->DeviceOptionMap[
"Data Directory"].
id, &buffer) != ftkError::FTK_OK || buffer.size < 1u)
533 return ERROR_FAILURE_TO_LOAD_INI;
536 std::string fullFile(reinterpret_cast<char*>(buffer.data));
537 fullFile +=
"\\" + filename;
539 input.open(fullFile.c_str());
541 if (!input.fail() && this->LoadIniFile(input, geom))
547 return ERROR_FAILURE_TO_LOAD_INI;
551 Tracker::RESULT Tracker::Internal::LoadFtkGeometryFromString(
const std::string& geomString, ftkGeometry& geom)
553 if (this->ParseIniFile(geomString, geom))
557 return ERROR_FAILURE_TO_LOAD_INI;
566 std::map<std::string, ftkOptionsInfo>::const_iterator it = this->InternalObj->DeviceOptionMap.find(optionName);
567 if (it == this->InternalObj->DeviceOptionMap.cend())
573 info = &(it->second);
582 if (this->InternalObj->isVirtual)
587 std::string optionStr{ optionName };
589 if (isOnboardProcessing && this->InternalObj->DeviceOptionMap.find(
"Embedded " + optionName) != this->InternalObj->DeviceOptionMap.end())
591 optionStr =
"Embedded " + optionStr;
594 const ftkOptionsInfo* info;
598 LOG_WARNING(std::string(
"Info for option \"") + optionStr + std::string(
"\" not found."));
602 if (info->type == ftkOptionType::FTK_INT32)
610 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, val) != ftkError::FTK_OK)
613 if (ftkGetLastErrorString(this->InternalObj->FtkLib,
sizeof(buffer.data), buffer.data) == ftkError::FTK_OK)
615 LOG_WARNING(std::string(buffer.data));
619 LOG_WARNING(std::string(
"Unknown error setting option ") + optionStr);
623 else if (info->type == ftkOptionType::FTK_FLOAT32)
631 if (ftkSetFloat32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, val) != ftkError::FTK_OK)
634 if (ftkGetLastErrorString(this->InternalObj->FtkLib,
sizeof(buffer.data), buffer.data) == ftkError::FTK_OK)
636 LOG_WARNING(std::string(buffer.data));
640 LOG_WARNING(std::string(
"Unknown error setting option ") + optionStr);
644 else if (info->type == ftkOptionType::FTK_DATA)
646 LOG_WARNING(std::string(
"Option of type \"data\" not supported yet"));
648 LOG_INFO(std::string(
"Option \"") + optionStr + std::string(
"\" successfully set at value ") + attributeValue);
658 : InternalObj(new Internal()) {}
663 InternalObj =
nullptr;
669 this->InternalObj->isPaused = tof;
675 return isOnboardProcessing;
681 return this->InternalObj->isVirtual;
687 if (this->InternalObj->FtkLib !=
nullptr && this->InternalObj->TrackerSN != 0)
694 this->InternalObj->FtkLib = ftkInit();
696 if (this->InternalObj->FtkLib == NULL)
702 device.SerialNumber = 0uLL;
706 if (err != ftkError::FTK_OK && err != ftkError::FTK_WAR_USB_TOO_SLOW)
708 ftkClose(&this->InternalObj->FtkLib);
709 this->InternalObj->FtkLib =
nullptr;
713 if (device.SerialNumber == 0uLL)
715 ftkClose(&this->InternalObj->FtkLib);
716 this->InternalObj->FtkLib =
nullptr;
720 this->InternalObj->TrackerSN = device.SerialNumber;
722 ftkBuffer sdkVersion;
723 ftkVersion(&sdkVersion);
724 this->InternalObj->LibVersion = sdkVersion.data;
728 case ftkDeviceType::DEV_SPRYTRACK_180:
731 case ftkDeviceType::DEV_SPRYTRACK_300:
734 case ftkDeviceType::DEV_FUSIONTRACK_500:
737 case ftkDeviceType::DEV_FUSIONTRACK_250:
745 this->InternalObj->Frame = ftkCreateFrame();
747 if (this->InternalObj->Frame ==
nullptr)
749 ftkDeleteFrame(this->InternalObj->Frame);
750 this->InternalObj->Frame =
nullptr;
754 if (ftkSetFrameOptions(
false, this->MaxAdditionalEventsNumber,
755 this->Max2dFiducialsNumber, this->Max2dFiducialsNumber,
756 this->Max3dFiducialsNumber, this->MaxMarkersNumber,
757 this->InternalObj->Frame) != ftkError::FTK_OK)
759 ftkDeleteFrame(this->InternalObj->Frame);
760 this->InternalObj->Frame =
nullptr;
764 if (ftkEnumerateOptions(this->InternalObj->FtkLib, this->InternalObj->TrackerSN,
765 &Tracker::Internal::DeviceOptionEnumerator, this->InternalObj) != ftkError::FTK_OK
766 || this->InternalObj->DeviceOptionMap.find(
"Data Directory") == this->InternalObj->DeviceOptionMap.cend())
772 const ftkOptionsInfo* info;
773 if (!this->
GetOptionInfo(
"Calibration processing datetime", info))
775 LOG_ERROR(
"Option unknown: \"Calibration processing datetime\"");
779 ftkGetData(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, &buff);
780 this->InternalObj->CalibrationDate = std::string(buff.data);
785 if (!this->
GetOptionInfo(
"Enable embedded processing", info))
787 LOG_WARNING(std::string(
"Embedded processing not part of the option list."));
793 ftkGetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, &val, ftkOptionGetter::FTK_VALUE);
794 isOnboardProcessing = (val == 1) ?
true :
false;
795 LOG_INFO(
"Embedded processing is initially " << (isOnboardProcessing ?
"enabled" :
"disabled"));
805 if (this->InternalObj->isVirtual)
810 if (this->InternalObj->FtkLib ==
nullptr && this->InternalObj->TrackerSN == 0)
816 ftkDeleteFrame(this->InternalObj->Frame);
817 this->InternalObj->Frame =
nullptr;
819 ftkError err = ftkClose(&this->InternalObj->FtkLib);
820 if (err != ftkError::FTK_OK)
830 version = this->InternalObj->LibVersion;
837 date = this->InternalObj->CalibrationDate;
844 deviceType = this->DeviceType;
850 std::array<float, 10>& leftIntrinsic, std::array<float, 10>& rightIntrinsic,
851 std::array<float, 3>& rightPosition, std::array<float, 3>& rightOrientation)
853 if (!this->InternalObj->isVirtual || this->SetOption(
"Calibration export",
"1") !=
SUCCESS)
855 LOG_ERROR(
"Could not export calibration.");
860 if (ftkGetLastFrame(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, this->InternalObj->Frame, 20) != ftkError::FTK_OK)
866 ftkFrameInfoData info;
867 info.WantedInformation = ftkInformationType::CalibrationParameters;
868 if (ftkExtractFrameInfo(this->InternalObj->Frame, &info) != ftkError::FTK_OK)
874 ftkStereoParameters sps = info.Calibration;
875 leftIntrinsic = { sps.LeftCamera.FocalLength[0], sps.LeftCamera.FocalLength[1],
876 sps.LeftCamera.OpticalCentre[0], sps.LeftCamera.OpticalCentre[1],
877 sps.LeftCamera.Distorsions[0], sps.LeftCamera.Distorsions[1], sps.LeftCamera.Distorsions[2],
878 sps.LeftCamera.Distorsions[3], sps.LeftCamera.Distorsions[4], sps.LeftCamera.Skew };
879 rightIntrinsic = { sps.RightCamera.FocalLength[0], sps.RightCamera.FocalLength[1],
880 sps.RightCamera.OpticalCentre[0], sps.RightCamera.OpticalCentre[1],
881 sps.RightCamera.Distorsions[0], sps.RightCamera.Distorsions[1], sps.RightCamera.Distorsions[2],
882 sps.RightCamera.Distorsions[3], sps.RightCamera.Distorsions[4], sps.RightCamera.Skew };
883 rightPosition = { sps.Translation[0], sps.Translation[1], sps.Translation[2] };
884 rightOrientation = { sps.Rotation[0], sps.Rotation[1], sps.Rotation[2] };
894 id = this->InternalObj->TrackerSN;
902 this->InternalObj->LoadFtkGeometryFromFile(filePath, geom);
903 if (!this->InternalObj->isVirtual &&
904 ftkSetGeometry(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, &geom) != ftkError::FTK_OK)
908 geometryId = geom.geometryId;
916 this->InternalObj->LoadFtkGeometryFromString(geomString, geom);
917 if (!this->InternalObj->isVirtual &&
918 ftkSetGeometry(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, &geom) != ftkError::FTK_OK)
922 geometryId = geom.geometryId;
929 if (this->InternalObj->isVirtual)
935 const ftkOptionsInfo* info;
936 if (!this->
GetOptionInfo(
"Active Wireless Markers info", info))
942 if (ftkGetData(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, &buffer) != ftkError::FTK_OK)
946 markerInfo = std::string(buffer.data, buffer.data + buffer.size);
953 geometries = this->InternalObj->Geometries;
960 std::map<Tracker::RESULT, std::string>::iterator it;
961 it = this->InternalObj->ResultToStringMap.find(result);
962 if (it != std::end(this->InternalObj->ResultToStringMap))
966 return std::string(
"Unknown error has occured. Result value: " + result);
971 std::map<std::string, std::string>& events, uint64_t& sdkTimestamp)
973 ftkError err = ftkGetLastFrame(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, this->InternalObj->Frame, 20);
974 if (err != ftkError::FTK_OK)
979 switch (this->InternalObj->Frame->markersStat)
981 case ftkQueryStatus::QS_WAR_SKIPPED:
983 case ftkQueryStatus::QS_ERR_INVALID_RESERVED_SIZE:
985 case ftkQueryStatus::QS_OK:
991 if (this->InternalObj->Frame->markersStat == ftkQueryStatus::QS_ERR_OVERFLOW)
999 for (uint32 f = 0; f < this->InternalObj->Frame->threeDFiducialsCount; f++)
1003 const ftk3DFiducial& ftkFid3d = this->InternalObj->Frame->threeDFiducials[f];
1005 fid.
xMm = ftkFid3d.positionMM.x;
1006 fid.
yMm = ftkFid3d.positionMM.y;
1007 fid.
zMm = ftkFid3d.positionMM.z;
1012 const ftkRawData& leftRaw = this->InternalObj->Frame->rawDataLeft[ftkFid3d.leftIndex];
1014 fid.
xLeftPx = leftRaw.centerXPixels;
1015 fid.
yLeftPx = leftRaw.centerYPixels;
1020 const ftkRawData& rightRaw = this->InternalObj->Frame->rawDataRight[ftkFid3d.rightIndex];
1022 fid.
xRightPx = rightRaw.centerXPixels;
1023 fid.
yRightPx = rightRaw.centerYPixels;
1028 fiducials.push_back(fid);
1035 for (
size_t e = 0; e < this->InternalObj->Frame->eventsCount; e++)
1037 const ftkEvent&
event = *this->InternalObj->Frame->events[e];
1039 if (event.Type == FtkEventType::fetTempV4)
1041 std::stringstream ss;
1042 const EvtTemperatureV4Payload* ptr = reinterpret_cast<EvtTemperatureV4Payload*>(event.Data);
1043 for (
unsigned int i = 0;
i <
event.Payload /
sizeof(EvtTemperatureV4Payload) - 1;
i++, ++ptr)
1045 ss << ptr->SensorId <<
" " << ptr->SensorValue <<
" ";
1047 ss << ptr->SensorId <<
" " << ptr->SensorValue;
1048 events.emplace(
"tempv4", ss.str());
1053 sdkTimestamp = this->InternalObj->Frame->imageHeader->timestampUS;
1060 std::map<std::string, std::string>& events, uint64_t& sdkTimestamp)
1062 ftkError err = ftkGetLastFrame(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, this->InternalObj->Frame, 20);
1063 if (err != ftkError::FTK_OK)
1068 switch (this->InternalObj->Frame->markersStat)
1070 case ftkQueryStatus::QS_WAR_SKIPPED:
1072 case ftkQueryStatus::QS_ERR_INVALID_RESERVED_SIZE:
1074 case ftkQueryStatus::QS_OK:
1080 if (this->InternalObj->Frame->markersStat == ftkQueryStatus::QS_ERR_OVERFLOW)
1088 for (
size_t m = 0; m < this->InternalObj->Frame->markersCount; m++)
1090 const ftkMarker& marker = this->InternalObj->Frame->markers[m];
1093 vtkNew<vtkMatrix4x4> toolToTracker;
1094 for (
int row = 0; row < 3; row++)
1096 toolToTracker->SetElement(row, 3, marker.translationMM[row]);
1097 for (
int column = 0; column < 3; column++)
1099 toolToTracker->SetElement(row, column, marker.rotation[row][column]);
1103 Marker atracsysMarker(marker.status, marker.id, marker.geometryId,
1104 toolToTracker.GetPointer(), marker.geometryPresenceMask, marker.registrationErrorMM);
1107 for (
size_t f3 = 0; f3 < FTK_MAX_FIDUCIALS; f3++)
1109 const uint32 f = marker.fiducialCorresp[f3];
1110 if (f == INVALID_ID)
1118 const ftk3DFiducial& ftkFid3d = this->InternalObj->Frame->threeDFiducials[f];
1120 fid.
xMm = ftkFid3d.positionMM.x;
1121 fid.
yMm = ftkFid3d.positionMM.y;
1122 fid.
zMm = ftkFid3d.positionMM.z;
1127 const ftkRawData& leftRaw = this->InternalObj->Frame->rawDataLeft[ftkFid3d.leftIndex];
1129 fid.
xLeftPx = leftRaw.centerXPixels;
1130 fid.
yLeftPx = leftRaw.centerYPixels;
1135 const ftkRawData& rightRaw = this->InternalObj->Frame->rawDataRight[ftkFid3d.rightIndex];
1137 fid.
xRightPx = rightRaw.centerXPixels;
1138 fid.
yRightPx = rightRaw.centerYPixels;
1143 if (!atracsysMarker.AddFiducial(fid))
1149 markers.push_back(atracsysMarker);
1156 for (
size_t e = 0; e < this->InternalObj->Frame->eventsCount; e++)
1158 const ftkEvent&
event = *this->InternalObj->Frame->events[e];
1160 if (event.Type == FtkEventType::fetTempV4)
1162 std::stringstream ss;
1163 const EvtTemperatureV4Payload* ptr = reinterpret_cast<EvtTemperatureV4Payload*>(event.Data);
1164 for (
unsigned int i = 0;
i <
event.Payload /
sizeof(EvtTemperatureV4Payload) - 1;
i++, ++ptr)
1166 ss << ptr->SensorId <<
" " << ptr->SensorValue <<
" ";
1168 ss << ptr->SensorId <<
" " << ptr->SensorValue;
1169 events.emplace(
"tempv4", ss.str());
1174 sdkTimestamp = this->InternalObj->Frame->imageHeader->timestampUS;
1182 if (this->InternalObj->isVirtual)
1188 const ftkOptionsInfo* info;
1193 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
frequency) != ftkError::FTK_OK)
1201 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, red) != ftkError::FTK_OK)
1209 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, green) != ftkError::FTK_OK)
1217 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, blue) != ftkError::FTK_OK)
1228 if (this->InternalObj->isVirtual)
1234 const ftkOptionsInfo* info;
1239 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1249 if (this->InternalObj->isVirtual)
1255 const ftkOptionsInfo* info;
1261 int laserEnabledValue =
enabled ? 3 : 0;
1263 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, laserEnabledValue) != ftkError::FTK_OK)
1273 if (this->InternalObj->isVirtual)
1279 const ftkOptionsInfo* info;
1280 if (!this->
GetOptionInfo(
"Active Wireless Pairing Enable", info))
1285 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1295 if (this->InternalObj->isVirtual)
1301 const ftkOptionsInfo* info;
1302 if (!this->
GetOptionInfo(
"Active Wireless button statuses streaming", info))
1307 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1317 if (this->InternalObj->isVirtual)
1323 const ftkOptionsInfo* info;
1324 if (!this->
GetOptionInfo(
"Active Wireless battery state streaming", info))
1329 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1343 this->MaxAdditionalEventsNumber = n;
1354 this->Max2dFiducialsNumber = n;
1365 this->Max3dFiducialsNumber = n;
1376 this->MaxMarkersNumber = n;
1386 if (this->InternalObj->isVirtual)
1392 const ftkOptionsInfo* info;
1393 if (!this->
GetOptionInfo(
"Enable embedded processing", info))
1398 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1402 LOG_INFO(
"Embedded processing successfully " << (
enabled ?
"enabled" :
"disabled"));
1409 if (this->InternalObj->isVirtual)
1415 const ftkOptionsInfo* info;
1421 if (ftkSetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id,
enabled) != ftkError::FTK_OK)
1425 LOG_INFO(
"Image streaming successfully " << (
enabled ?
"enabled" :
"disabled"));
1434 LOG_WARNING(
"Embedded processing is available only on spryTracks.");
1437 bool succeeded =
true;
1442 isOnboardProcessing =
true;
1448 isOnboardProcessing =
false;
1464 if (this->InternalObj->isVirtual)
1466 droppedFrameCount = 0;
1472 int32 lost = 0, corrupted = 0;
1474 const ftkOptionsInfo* info;
1479 ftkGetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, &lost, ftkOptionGetter::FTK_VALUE);
1480 if (!this->
GetOptionInfo(
"Counter of corrupted frames", info))
1484 ftkGetInt32(this->InternalObj->FtkLib, this->InternalObj->TrackerSN, info->id, &corrupted, ftkOptionGetter::FTK_VALUE);
1486 droppedFrameCount = lost + corrupted;
1495 if (this->InternalObj->isVirtual)
1503 const ftkOptionsInfo* info;
1531 float distF1 = sqrt(this->
xMm * this->
xMm + this->
yMm * this->
yMm + this->
zMm * this->
zMm);
1533 return distF1 < distF2;
1542 this->MarkerStatus = 0;
1543 this->TrackingId = -1;
1544 this->GeometryId = -1;
1545 this->GeometryPresenceMask = -1;
1546 this->RegistrationErrorMm = 0.0;
1549 vtkMatrix4x4* toolToTracker,
int geometryPresenceMask,
float registrationErrorMM)
1551 this->MarkerStatus = status;
1552 this->TrackingId = trackingId;
1553 this->GeometryId = geometryId;
1554 this->ToolToTracker->DeepCopy(toolToTracker);
1555 this->GeometryPresenceMask = geometryPresenceMask;
1556 this->RegistrationErrorMm = registrationErrorMM;
1561 this->MarkerStatus = obj.MarkerStatus;
1562 this->TrackingId = obj.TrackingId;
1563 this->GeometryId = obj.GeometryId;
1564 this->ToolToTracker->DeepCopy(obj.ToolToTracker.GetPointer());
1565 this->GeometryPresenceMask = obj.GeometryPresenceMask;
1566 this->RegistrationErrorMm = obj.RegistrationErrorMm;
1567 this->fiducials = obj.fiducials;
1572 if (fiducials.size() < FTK_MAX_FIDUCIALS)
1574 fiducials.push_back(fid);
#define ATRACSYS_BUFFER_SIZE
#define RESET_DROPPED_FRAME_COUNT
bool operator<(const Fiducial &f) const
RESULT SetUserLEDState(int red, int green, int blue, int frequency, bool enabled=true)
SPRYTRACK_IMAGE_PROCESSING_TYPE
bool operator==(const Fiducial &f) const
RESULT EnableOnboardProcessing(bool enabled)
RESULT EnableUserLED(bool enabled)
RESULT GetLoadedGeometries(std::map< int, std::vector< std::array< float, 3 >>> &geometries)
void stringFindAndReplaceAll(std::string &data, std::string toSearch, std::string replaceStr)
RESULT SetMaxAdditionalEventsNumber(int n)
RESULT SetMaxMarkersNumber(int n)
RESULT EnableWirelessMarkerStatusStreaming(bool enabled)
RESULT SetSpryTrackProcessingType(SPRYTRACK_IMAGE_PROCESSING_TYPE processingType)
RESULT LoadMarkerGeometryFromString(std::string filePath, int &geometryId)
uint32_t Fid2dRightStatus
RESULT EnableWirelessMarkerBatteryStreaming(bool enabled)
RESULT SetMax2dFiducialsNumber(int n)
bool checkKey(IniFile &p, const std::string §ion, const std::string &key)
bool strToFloat32(const std::string &str, float &var)
RESULT GetCamerasCalibration(std::array< float, 10 > &leftIntrinsic, std::array< float, 10 > &rightIntrinsic, std::array< float, 3 > &rightPosition, std::array< float, 3 > &rightOrientation)
bool assignUint32(IniFile &p, const std::string §ion, const std::string &key, uint32 *variable)
RESULT GetMarkerInfo(std::string &markerInfo)
RESULT SetMax3dFiducialsNumber(int n)
RESULT LoadMarkerGeometryFromFile(std::string filePath, int &geometryId)
bool strToInt32(const std::string &str, int &var)
RESULT SetLaserEnabled(bool enabled)
RESULT GetSDKversion(std::string &version)
RESULT EnableImageStreaming(bool enabled)
RESULT GetDeviceType(DEVICE_TYPE &deviceType)
RESULT EnableWirelessMarkerPairing(bool enabled)
bool IsOnboardProcessing()
RESULT ResetLostFrameCount()
RESULT SetOption(const std::string &, const std::string &)
bool AddFiducial(Fiducial fid)
bool assignFloatXX(IniFile &p, const std::string §ion, const std::string &key, floatXX *variable)
void FusionTrackEnumerator(uint64 sn, void *user, ftkDeviceType devType)
RESULT GetFiducialsInFrame(std::vector< Fiducial > &fiducials, std::map< std::string, std::string > &events, uint64_t &sdkTimestamp)
RESULT GetMarkersInFrame(std::vector< Marker > &markers, std::map< std::string, std::string > &events, uint64_t &sdkTimestamp)
RESULT GetDroppedFrameCount(int &droppedFrameCount)
const float EQUALITY_DISTANCE_MM
bool GetOptionInfo(const std::string &, const ftkOptionsInfo *&)
RESULT GetCalibrationDate(std::string &date)
RESULT GetDeviceId(uint64_t &id)
std::string ResultToString(RESULT result)
bool checkSection(IniFile &p, const std::string §ion)