JNIEXPORT void JNICALL Java_de_fruitfly_ovr_OculusRift_destroySubsystem(JNIEnv *env, jobject jobj) { printf("Destroying Oculus Rift device interface.\n"); pSensor.Clear(); pManager.Clear(); System::Destroy(); }
extern "C" RIFTAPI_API int CloseRiftApi(void) { pSensor.Clear(); pManager.Clear(); OVR::System::Destroy(); return 1; }
void Clear() { pSensor.Clear(); pHMD.Clear(); pManager.Clear(); System::Destroy(); }
extern "C" void clearRift() { pSensor.Clear(); pHMD.Clear(); pManager.Clear(); delete pFusion; System::Destroy(); }
void Clear() { pSensor.Clear(); pHMD.Clear(); pManager.Clear(); delete pFusionResult; System::Destroy(); }
JNIEXPORT void JNICALL Java_de_fruitfly_ovr_OculusRift_destroySubsystem(JNIEnv *env, jobject jobj) { if (Initialized) { printf("Destroying Oculus Rift device interface.\n"); pSensor.Clear(); pManager.Clear(); pHMD.Clear(); // Ensure HMDDevice is also cleared System::Destroy(); Initialized = false; } }
void IN_MotionSensor_Init(void) { //Carl: Don't initialize has* here to false, because they can also be set by command line parameters // *** Oculus Sensor Initialization OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All)); // Create DeviceManager and first available HMDDevice from it. // Sensor object is created from the HMD, to ensure that it is on the // correct device. pManager = *DeviceManager::Create(); // We'll handle it's messages in this case. //pManager->SetMessageHandler(this); // Release Sensor/HMD in case this is a retry. pSensor.Clear(); pHMD.Clear(); pHMD = *pManager->EnumerateDevices<HMDDevice>().CreateDevice(); if (pHMD) { pSensor = *pHMD->GetSensor(); } else { // If we didn't detect an HMD, try to create the sensor directly. // This is useful for debugging sensor interaction; it is not needed in // a shipping app. pSensor = *pManager->EnumerateDevices<SensorDevice>().CreateDevice(); } if (!pHMD && !pSensor) common->Warning("Oculus Rift not detected.\n"); else if (!pHMD) common->Warning("Oculus Sensor detected; HMD Display not detected.\n"); else if (!pSensor) common->Warning("Oculus HMD Display detected; Sensor not detected.\n"); //else if (HMDInfo.DisplayDeviceName[0] == '\0') // common->Printf("Oculus Sensor detected; HMD display EDID not detected.\n"); if (pSensor) { SFusion.AttachToSensor(pSensor); SFusion.SetPredictionEnabled(true); hasOculusRift = true; hasHMD = true; } if (!pSensor) LoadVR920(); hasHMD = hasHMD || hasVR920Tracker; //Hillcrest libfreespace stuff LPDWORD dwThreadId=0; struct freespace_message message; int numIds; int rc; int i; // Initialize the freespace library rc = freespace_init(); if (rc != FREESPACE_SUCCESS) { common->Warning("Hillcrest Initialization error. rc=%d\n", rc); return; } /** --- START EXAMPLE INITIALIZATION OF DEVICE -- **/ rc = freespace_getDeviceList(&device, 1, &numIds); if (numIds == 0) { common->Warning("MotionSensor: Didn't find any devices.\n"); return; } rc = freespace_openDevice(device); if (rc != FREESPACE_SUCCESS) { common->Warning("MotionSensor: Error opening device: %d\n", rc); return; } rc = freespace_flush(device); if (rc != FREESPACE_SUCCESS) { common->Warning("MotionSensor: Error flushing device: %d\n", rc); return; } memset(&message, 0, sizeof(message)); message.messageType = FREESPACE_MESSAGE_DATAMODECONTROLV2REQUEST; message.dataModeControlV2Request.packetSelect = 2; message.dataModeControlV2Request.modeAndStatus |= 0 << 1; rc = freespace_sendMessage(device, &message); if (rc != FREESPACE_SUCCESS) { common->Warning("freespaceInputThread: Could not send message: %d.\n", rc); } CreateThread(NULL, //Choose default security 0, //Default stack size (LPTHREAD_START_ROUTINE)&IN_MotionSensor_Thread, //Routine to execute (LPVOID) &i, //Thread parameter 0, //Immediately run the thread dwThreadId //Thread Id ); hasHillcrest = true; hasHMD = true; }
// Serializes the profiles to disk. void ProfileManager::SaveCache() { String path = GetProfilePath(true); Lock::Locker lockScope(&ProfileLock); Ptr<JSON> oldroot = *JSON::Load(path); if (oldroot) { if (oldroot->GetItemCount() >= 3) { JSON* item0 = oldroot->GetFirstItem(); JSON* item1 = oldroot->GetNextItem(item0); oldroot->GetNextItem(item1); if (item0->Name == "Oculus Profile Version") { int major = atoi(item0->Value.ToCStr()); if (major > MAX_PROFILE_MAJOR_VERSION) oldroot.Clear(); // don't use the file on unsupported major version number } else { oldroot.Clear(); } } else { oldroot.Clear(); } } // Create a new json root Ptr<JSON> root = *JSON::CreateObject(); root->AddNumberItem("Oculus Profile Version", PROFILE_VERSION); root->AddStringItem("CurrentProfile", DefaultProfile); root->AddNumberItem("ProfileCount", (double) ProfileCache.GetSize()); // Generate a JSON subtree for each profile for (unsigned int i=0; i<ProfileCache.GetSize(); i++) { Profile* profile = ProfileCache[i]; // Write the base profile information JSON* json_profile = JSON::CreateObject(); json_profile->Name = "Profile"; json_profile->AddStringItem("Name", profile->Name); const char* gender; switch (profile->GetGender()) { case Profile::Gender_Male: gender = "Male"; break; case Profile::Gender_Female: gender = "Female"; break; default: gender = "Unspecified"; } json_profile->AddStringItem("Gender", gender); json_profile->AddNumberItem("PlayerHeight", profile->PlayerHeight); json_profile->AddNumberItem("IPD", profile->IPD); const char* device_name = NULL; // Create a device-specific subtree for the cached device if (profile->Type == Profile_RiftDK1) { device_name = "RiftDK1"; RiftDK1Profile* rift = (RiftDK1Profile*)profile; JSON* json_rift = JSON::CreateObject(); json_profile->AddItem(device_name, json_rift); const char* eyecup = "A"; switch (rift->EyeCups) { case EyeCup_A: eyecup = "A"; break; case EyeCup_B: eyecup = "B"; break; case EyeCup_C: eyecup = "C"; break; } json_rift->AddStringItem("EyeCup", eyecup); json_rift->AddNumberItem("LL", rift->LL); json_rift->AddNumberItem("LR", rift->LR); json_rift->AddNumberItem("RL", rift->RL); json_rift->AddNumberItem("RR", rift->RR); } else if (profile->Type == Profile_RiftDKHD) { device_name = "RiftDKHD"; RiftDKHDProfile* rift = (RiftDKHDProfile*)profile; JSON* json_rift = JSON::CreateObject(); json_profile->AddItem(device_name, json_rift); const char* eyecup = "A"; switch (rift->EyeCups) { case EyeCup_A: eyecup = "A"; break; case EyeCup_B: eyecup = "B"; break; case EyeCup_C: eyecup = "C"; break; } json_rift->AddStringItem("EyeCup", eyecup); //json_rift->AddNumberItem("LL", rift->LL); //json_rift->AddNumberItem("LR", rift->LR); //json_rift->AddNumberItem("RL", rift->RL); //json_rift->AddNumberItem("RR", rift->RR); } // There may be multiple devices stored per user, but only a single // device is represented by this root. We don't want to overwrite // the other devices so we need to examine the older root // and merge previous devices into new json root if (oldroot) { JSON* old_profile = oldroot->GetFirstItem(); while (old_profile) { if (old_profile->Name == "Profile") { JSON* profile_name = old_profile->GetItemByName("Name"); if (profile_name && OVR_strcmp(profile->Name, profile_name->Value) == 0) { // Now that we found the user in the older root, add all the // object children to the new root - except for the one for the // current device JSON* old_item = old_profile->GetFirstItem(); while (old_item) { if (old_item->Type == JSON_Object && (device_name == NULL || OVR_strcmp(old_item->Name, device_name) != 0)) { JSON* old_device = old_item; old_item = old_profile->GetNextItem(old_item); // remove the node from the older root to avoid multiple reference old_device->RemoveNode(); // add the node pointer to the new root json_profile->AddItem(old_device->Name, old_device); } else { old_item = old_profile->GetNextItem(old_item); } } break; } } old_profile = oldroot->GetNextItem(old_profile); } } // Add the completed user profile to the new root root->AddItem("Profile", json_profile); } // Save the profile to disk root->Save(path); }
void TestEmbeddedObjectKill(void) { char szClusterMissileState[64]; char szMissile1State[64]; ObjectsInit(); Ptr<CRoot> pRoot = ORoot(); Ptr<CGameWorld> pWorld = OMalloc(CGameWorld)->Init(); pRoot->Add(pWorld); Ptr<CClusterMissile> pClusterMissile = ONMalloc(CClusterMissile, "Anna")->Init(pWorld); pWorld = NULL; Ptr<CPointerContainer> pPointerPointer = OMalloc(CPointerContainer); pRoot->Add(pPointerPointer); pPointerPointer->Init(&pClusterMissile->mcMissile1); Ptr<CPointerContainer> pPointerPointer2 = OMalloc(CPointerContainer); pRoot->Add(pPointerPointer2); pPointerPointer2->Init(&pClusterMissile); //The number of allocated object shouldn't change until all the froms are removed //both from the embedded object and the 'normal' object. AssertLongLongInt(7, gcObjects.GetMemory()->NumIndexed()); AssertLongLongInt(7, gcUnknowns.NumElements()); pClusterMissile->SetKillString(szClusterMissileState); pClusterMissile->mcMissile1.SetKillString(szMissile1State); AssertInt(2, pClusterMissile->NumHeapFroms()); AssertInt(1, pClusterMissile->CEmbeddedObject::NumHeapFroms()); AssertInt(1, pClusterMissile->mcMissile1.NumHeapFroms()); strcpy(szClusterMissileState, "Alive"); strcpy(szMissile1State, "Alive"); pPointerPointer->Clear(); AssertInt(1, pClusterMissile->NumHeapFroms()); AssertInt(1, pClusterMissile->CEmbeddedObject::NumHeapFroms()); AssertInt(0, pClusterMissile->mcMissile1.NumHeapFroms()); AssertString("Alive", szClusterMissileState); AssertString("Alive", szMissile1State); pPointerPointer->mp = &pClusterMissile->mcMissile1; AssertInt(2, pClusterMissile->NumHeapFroms()); AssertInt(1, pClusterMissile->CEmbeddedObject::NumHeapFroms()); AssertInt(1, pClusterMissile->mcMissile1.NumHeapFroms()); pPointerPointer2->Clear(); AssertInt(1, pClusterMissile->NumHeapFroms()); AssertInt(0, pClusterMissile->CEmbeddedObject::NumHeapFroms()); AssertInt(1, pClusterMissile->mcMissile1.NumHeapFroms()); AssertString("Alive", szClusterMissileState); AssertString("Alive", szMissile1State); pClusterMissile = NULL; //Make sure nothing has been de-allocated. AssertLongLongInt(7, gcObjects.GetMemory()->NumIndexed()); AssertLongLongInt(7, gcUnknowns.NumElements()); pPointerPointer->Clear(); AssertString("Killed", szClusterMissileState); AssertString("Killed", szMissile1State); AssertLongLongInt(6, gcObjects.GetMemory()->NumIndexed()); AssertLongLongInt(6, gcUnknowns.NumElements()); gcObjects.Flush(TRUE, FALSE); AssertLongLongInt(0, gcObjects.GetMemory()->NumIndexed()); AssertLongLongInt(0, gcUnknowns.NumElements()); ObjectsKill(); }