bool MoveHandler::connectTracker() { std::stringstream string; logger->LogEvent("Initializeing tracker..."); tracker = psmove_tracker_new(); if(this->tracker == nullptr || this->tracker == NULL) { logger->LogEvent("Could not create tracker.\nAborting!"); return false; } logger->LogEvent("OK"); for(int i = 0; i < this->connections; i++) { this->timer.start(); while (*this->running && this->timer.secondsElapsed() < 60) { string.str(""); string << "Calibrating connection #" << i; logger->LogEvent(string.str()); if (psmove_tracker_enable(this->tracker, this->controllers[i]) == Tracker_CALIBRATED) { string.str(""); string << "Enable automatic LED update for connection #" << i; logger->LogEvent(string.str()); psmove_tracker_set_auto_update_leds(this->tracker, this->controllers[i], PSMove_True); break; } else { logger->LogEvent("Caibration failed. Retrying."); } } logger->LogEvent("Calibration finished."); this->bulbHandler->startTimer(); } logger->LogEvent("Enable tracker mirroring"); psmove_tracker_set_mirror(this->tracker, PSMove_True); logger->LogEvent("Controller initialization finished"); return true; }
bool FPSMoveWorker::UpdateControllerConnections( PSMoveTracker *Tracker, PSMove **PSMoves) { bool controllerCountChanged = false; uint32 currentTime = FPlatformTime::Cycles(); float millisecondsSinceCheck = FPlatformTime::ToMilliseconds(currentTime - this->LastMoveCountCheckTime); if (millisecondsSinceCheck >= CONTROLLER_COUNT_POLL_INTERVAL) { // Update the number int newcount = psmove_count_connected(); if (this->PSMoveCount != newcount) { UE_LOG(LogPSMove, Log, TEXT("PSMove Controllers count changed: %d -> %d."), this->PSMoveCount, newcount); this->PSMoveCount = newcount; controllerCountChanged = true; } // Refresh the connection and tracking state of every controller entry for (int psmove_id = 0; psmove_id < FPSMoveWorker::k_max_controllers; psmove_id++) { if (psmove_id < this->PSMoveCount) { if (PSMoves[psmove_id] == NULL) { // The controller should be connected PSMoves[psmove_id] = psmove_connect_by_id(psmove_id); if (PSMoves[psmove_id] != NULL) { psmove_enable_orientation(PSMoves[psmove_id], PSMove_True); assert(psmove_has_orientation(PSMoves[psmove_id])); this->WorkerControllerDataArray[psmove_id].IsConnected = true; } else { this->WorkerControllerDataArray[psmove_id].IsConnected = false; UE_LOG(LogPSMove, Error, TEXT("Failed to connect to PSMove controller %d"), psmove_id); } } if (PSMoves[psmove_id] != NULL && this->WorkerControllerDataArray[psmove_id].IsCalibrated == false) { PSMoveTracker_Status tracking_status = psmove_tracker_enable(Tracker, PSMoves[psmove_id]); psmove_tracker_set_auto_update_leds(Tracker, PSMoves[psmove_id], PSMove_True); if (tracking_status == Tracker_CALIBRATED) { this->WorkerControllerDataArray[psmove_id].IsCalibrated = true; } else { UE_LOG(LogPSMove, Error, TEXT("Failed to enable tracking for PSMove controller %d (result status: %d)"), psmove_id, (int32)tracking_status); } } } else { // The controller should no longer be tracked if (PSMoves[psmove_id] != NULL) { psmove_disconnect(PSMoves[psmove_id]); PSMoves[psmove_id] = NULL; this->WorkerControllerDataArray[psmove_id].IsTracked = false; this->WorkerControllerDataArray[psmove_id].IsCalibrated = false; this->WorkerControllerDataArray[psmove_id].IsConnected = false; } } } // Remember the last time we polled the move count this->LastMoveCountCheckTime = currentTime; } return controllerCountChanged; }