aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Service
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/Service')
-rw-r--r--LibOVR/Src/Service/Service_NetClient.cpp257
-rw-r--r--LibOVR/Src/Service/Service_NetClient.h34
2 files changed, 226 insertions, 65 deletions
diff --git a/LibOVR/Src/Service/Service_NetClient.cpp b/LibOVR/Src/Service/Service_NetClient.cpp
index b0fa464..8c3e232 100644
--- a/LibOVR/Src/Service/Service_NetClient.cpp
+++ b/LibOVR/Src/Service/Service_NetClient.cpp
@@ -27,6 +27,9 @@ limitations under the License.
#include "Service_NetClient.h"
#include "../Net/OVR_MessageIDTypes.h"
+#ifdef OVR_OS_MAC
+#define GetCurrentProcessId getpid
+#endif
OVR_DEFINE_SINGLETON(OVR::Service::NetClient);
namespace OVR { namespace Service {
@@ -37,7 +40,9 @@ using namespace OVR::Net;
//// NetClient
NetClient::NetClient() :
- LatencyTesterAvailable(false)
+ LatencyTesterAvailable(false),
+ HMDCount(0),
+ EdgeTriggeredHMDCount(false)
{
GetSession()->AddSessionListener(this);
@@ -69,10 +74,14 @@ int NetClient::Run()
while (!Terminated)
{
- if (GetSession()->GetActiveSocketsCount()==0)
- Thread::MSleep(10);
+ // Note: There is no watchdog here because the watchdog is part of the private code
GetSession()->Poll(false);
+
+ if (GetSession()->GetActiveSocketsCount() == 0)
+ {
+ Thread::MSleep(10);
+ }
}
return 0;
@@ -82,7 +91,6 @@ void NetClient::OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOu
{
OVR_UNUSED(lrrOut);
OVR_UNUSED(pPayload);
-
}
void NetClient::OnDisconnected(Connection* conn)
@@ -90,13 +98,8 @@ void NetClient::OnDisconnected(Connection* conn)
OVR_UNUSED(conn);
OVR_DEBUG_LOG(("[NetClient] Disconnected"));
-}
-void NetClient::OnConnectionAttemptFailed(Net::Connection* conn)
-{
- OVR_UNUSED(conn);
-
- OVR_DEBUG_LOG(("[NetClient] OnConnectionAttemptFailed"));
+ EdgeTriggeredHMDCount = false;
}
void NetClient::OnConnected(Connection* conn)
@@ -106,9 +109,11 @@ void NetClient::OnConnected(Connection* conn)
OVR_DEBUG_LOG(("[NetClient] Connected to a server running version %d.%d.%d (my version=%d.%d.%d)",
conn->RemoteMajorVersion, conn->RemoteMinorVersion, conn->RemotePatchVersion,
RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch));
+
+ EdgeTriggeredHMDCount = false;
}
-bool NetClient::Connect()
+bool NetClient::Connect(bool blocking)
{
// Set up bind parameters
OVR::Net::BerkleyBindParameters bbp;
@@ -118,7 +123,12 @@ bool NetClient::Connect()
sa.Set("::1", VRServicePort, SOCK_STREAM);
// Attempt to connect
- return GetSession()->ConnectPTCP(&bbp, &sa, true) == Net::SessionResult_OK;
+ OVR::Net::SessionResult result = GetSession()->ConnectPTCP(&bbp, &sa, blocking);
+
+ // Already connected counts as success too
+ return result == Net::SessionResult_OK ||
+ result == Net::SessionResult_AlreadyConnected ||
+ result == Net::SessionResult_ConnectInProgress;
}
void NetClient::Disconnect()
@@ -126,7 +136,7 @@ void NetClient::Disconnect()
GetSession()->Shutdown();
}
-bool NetClient::IsConnected(bool attemptReconnect)
+bool NetClient::IsConnected(bool attemptReconnect, bool blockOnReconnect)
{
// If it was able to connect,
if (GetSession()->GetConnectionCount() > 0)
@@ -136,7 +146,7 @@ bool NetClient::IsConnected(bool attemptReconnect)
else if (attemptReconnect)
{
// Attempt to connect here
- Connect();
+ Connect(blockOnReconnect);
// If it connected,
if (GetSession()->GetConnectionCount() > 0)
@@ -176,8 +186,10 @@ bool NetClient::GetRemoteProtocolVersion(int& major, int& minor, int& patch)
const char* NetClient::GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
+ {
return "";
+ }
ProfileGetValue1_Str = default_val;
@@ -197,8 +209,10 @@ const char* NetClient::GetStringValue(VirtualHmdId hmd, const char* key, const c
}
bool NetClient::GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
+ {
return default_val;
+ }
OVR::Net::BitStream bsOut, returnData;
bsOut.Write(hmd);
@@ -217,8 +231,10 @@ bool NetClient::GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val
}
int NetClient::GetIntValue(VirtualHmdId hmd, const char* key, int default_val)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
+ {
return default_val;
+ }
OVR::Net::BitStream bsOut, returnData;
bsOut.Write(hmd);
@@ -237,8 +253,10 @@ int NetClient::GetIntValue(VirtualHmdId hmd, const char* key, int default_val)
}
double NetClient::GetNumberValue(VirtualHmdId hmd, const char* key, double default_val)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
+ {
return default_val;
+ }
OVR::Net::BitStream bsOut, returnData;
bsOut.Write(hmd);
@@ -254,8 +272,10 @@ double NetClient::GetNumberValue(VirtualHmdId hmd, const char* key, double defau
}
int NetClient::GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
+ {
return 0;
+ }
OVR::Net::BitStream bsOut, returnData;
bsOut.Write(hmd);
@@ -294,10 +314,13 @@ int NetClient::GetNumberValues(VirtualHmdId hmd, const char* key, double* values
return out;
}
-void NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* val)
+
+bool NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* val)
{
- if (!IsConnected(true))
- return;
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -308,12 +331,18 @@ void NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* va
if (!GetRPC1()->Signal("SetStringValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
-void NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)
+
+bool NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)
{
- if (!IsConnected(true))
- return;
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -325,12 +354,18 @@ void NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)
if (!GetRPC1()->Signal("SetBoolValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
-void NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)
+
+bool NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)
{
- if (!IsConnected(true))
- return;
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -342,12 +377,18 @@ void NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)
if (!GetRPC1()->Signal("SetIntValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
-void NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)
+
+bool NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)
{
- if (!IsConnected(true))
- return;
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -358,13 +399,17 @@ void NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)
if (!GetRPC1()->Signal("SetNumberValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
-void NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals)
+
+bool NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
{
- return;
+ return false;
}
OVR::Net::BitStream bsOut;
@@ -382,16 +427,28 @@ void NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double*
if (!GetRPC1()->Signal("SetNumberValues_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
int NetClient::Hmd_Detect()
{
- if (!IsConnected(true))
+ if (!IsConnected(true, false))
{
return 0;
}
+ // If using edge-triggered HMD counting,
+ if (EdgeTriggeredHMDCount)
+ {
+ // Return the last update from the server
+ return HMDCount;
+ }
+
+ // Otherwise: We need to ask the first time
+
OVR::Net::BitStream bsOut, returnData;
if (!GetRPC1()->CallBlocking("Hmd_Detect_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
@@ -405,12 +462,14 @@ int NetClient::Hmd_Detect()
{
OVR_ASSERT(false);
}
+ HMDCount = out;
+ EdgeTriggeredHMDCount = true;
return out;
}
bool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)
{
- if (!IsConnected(true))
+ if (!IsConnected(true, true))
{
return false;
}
@@ -420,9 +479,9 @@ bool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)
int32_t w = (int32_t)index;
bsOut.Write(w);
-#ifdef OVR_OS_WIN32
+#if defined(OVR_OS_WIN32) || defined(OVR_OS_MAC)
// Need the Pid for driver mode
- DWORD pid = GetCurrentProcessId();
+ pid_t pid = GetCurrentProcessId();
bsOut.Write(pid);
#endif
@@ -435,10 +494,78 @@ bool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)
return netInfo->Deserialize(&returnData);
}
-void NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)
+bool NetClient::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)
{
- if (!IsConnected())
- return;
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
+
+ OVR::Net::BitStream bsOut, returnData;
+
+ bsOut.Write(InvalidVirtualHmdId);
+
+ if (!GetRPC1()->CallBlocking("GetDriverMode_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
+ {
+ OVR_ASSERT(false);
+ return false;
+ }
+
+ int32_t w_driverInstalled = 0;
+ int32_t w_compatMode = 0;
+ int32_t w_hideDK1Mode = 0;
+ returnData.Read(w_driverInstalled);
+ returnData.Read(w_compatMode);
+ if (!returnData.Read(w_hideDK1Mode))
+ {
+ return false;
+ }
+
+ driverInstalled = w_driverInstalled != 0;
+ compatMode = w_compatMode != 0;
+ hideDK1Mode = w_hideDK1Mode != 0;
+ return true;
+}
+
+bool NetClient::SetDriverMode(bool compatMode, bool hideDK1Mode)
+{
+ if (!IsConnected(true, true))
+ {
+ return false;
+ }
+
+ OVR::Net::BitStream bsOut, returnData;
+
+ bsOut.Write(InvalidVirtualHmdId);
+
+ int32_t w_compatMode, w_hideDK1Mode;
+ w_compatMode = compatMode ? 1 : 0;
+ w_hideDK1Mode = hideDK1Mode ? 1 : 0;
+ bsOut.Write(w_compatMode);
+ bsOut.Write(w_hideDK1Mode);
+
+ if (!GetRPC1()->CallBlocking("SetDriverMode_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
+ {
+ OVR_ASSERT(false);
+ return false;
+ }
+
+ int32_t out = 0;
+ if (!returnData.Read(out))
+ {
+ OVR_ASSERT(false);
+ return false;
+ }
+
+ return out != 0;
+}
+
+bool NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)
+{
+ if (!IsConnected(false, false))
+ {
+ return false;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -449,13 +576,18 @@ void NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)
if (!GetRPC1()->CallBlocking("Hmd_AttachToWindow_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
{
OVR_ASSERT(false);
+ return false;
}
+
+ return true;
}
void NetClient::Hmd_Release(VirtualHmdId hmd)
{
- if (!IsConnected())
- return;
+ if (!IsConnected(false, false))
+ {
+ return;
+ }
OVR::Net::BitStream bsOut;
bsOut.Write(hmd);
@@ -465,10 +597,15 @@ void NetClient::Hmd_Release(VirtualHmdId hmd)
}
}
+void NetClient::SetLastError(String str)
+{
+ Hmd_GetLastError_Str = str;
+}
+
// Last string is cached locally.
const char* NetClient::Hmd_GetLastError(VirtualHmdId hmd)
{
- if (!IsConnected())
+ if (hmd == InvalidVirtualHmdId || !IsConnected(false, false))
{
return Hmd_GetLastError_Str.ToCStr();
}
@@ -492,7 +629,7 @@ const char* NetClient::Hmd_GetLastError(VirtualHmdId hmd)
// The actual descriptor is a par
bool NetClient::Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo)
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return false;
}
@@ -512,7 +649,7 @@ bool NetClient::Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo)
//-------------------------------------------------------------------------------------
unsigned int NetClient::Hmd_GetEnabledCaps(VirtualHmdId hmd)
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return 0;
}
@@ -536,7 +673,7 @@ unsigned int NetClient::Hmd_GetEnabledCaps(VirtualHmdId hmd)
// Returns new caps after modification
unsigned int NetClient::Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps)
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return 0;
}
@@ -567,7 +704,7 @@ unsigned int NetClient::Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCap
bool NetClient::Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps)
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return false;
}
@@ -598,7 +735,7 @@ bool NetClient::Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps,
void NetClient::Hmd_ResetTracking(VirtualHmdId hmd)
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return;
}
@@ -614,7 +751,7 @@ void NetClient::Hmd_ResetTracking(VirtualHmdId hmd)
bool NetClient::LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3])
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return false;
}
@@ -648,7 +785,7 @@ bool NetClient::LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char
const char* NetClient::LatencyUtil_GetResultsString()
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return NULL;
}
@@ -670,7 +807,7 @@ const char* NetClient::LatencyUtil_GetResultsString()
bool NetClient::ShutdownServer()
{
- if (!IsConnected())
+ if (!IsConnected(false, false))
{
return false;
}
@@ -692,7 +829,7 @@ void NetClient::registerRPC()
// Register RPC functions:
RPC_REGISTER_SLOT(InitialServerStateScope, InitialServerState_1);
RPC_REGISTER_SLOT(LatencyTesterAvailableScope, LatencyTesterAvailable_1);
-
+ RPC_REGISTER_SLOT(HMDCountUpdateScope, HMDCountUpdate_1);
}
void NetClient::InitialServerState_1(BitStream* userData, ReceivePayload* pPayload)
@@ -714,6 +851,20 @@ void NetClient::LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pP
LatencyTesterAvailable = (b != 0);
}
+void NetClient::HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload)
+{
+ OVR_UNUSED(pPayload);
+
+ int32_t hmdCount = 0;
+ if (!userData->Read(hmdCount))
+ {
+ OVR_ASSERT(false);
+ return;
+ }
+
+ HMDCount = hmdCount;
+ EdgeTriggeredHMDCount = true;
+}
}} // namespace OVR::Service
diff --git a/LibOVR/Src/Service/Service_NetClient.h b/LibOVR/Src/Service/Service_NetClient.h
index 6be6de8..96a8ad9 100644
--- a/LibOVR/Src/Service/Service_NetClient.h
+++ b/LibOVR/Src/Service/Service_NetClient.h
@@ -50,35 +50,42 @@ class NetClient : public NetSessionCommon,
// Status
bool LatencyTesterAvailable;
+ int HMDCount;
+ bool EdgeTriggeredHMDCount;
virtual void OnReceive(Net::ReceivePayload* pPayload, Net::ListenerReceiveResult* lrrOut);
virtual void OnDisconnected(Net::Connection* conn);
virtual void OnConnected(Net::Connection* conn);
- virtual void OnConnectionAttemptFailed(Net::Connection* conn);
virtual int Run();
public:
- bool Connect();
- bool IsConnected(bool attemptReconnect = false);
+ bool Connect(bool blocking);
+ bool IsConnected(bool attemptReconnect, bool blockOnReconnect);
void Disconnect();
void GetLocalProtocolVersion(int& major, int& minor, int& patch);
// This function may fail if it is not connected
bool GetRemoteProtocolVersion(int& major, int& minor, int& patch);
+ void SetLastError(String str);
+
public:
- // Key-value storage
+ // Persistent key-value storage
const char* GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val);
bool GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val);
int GetIntValue(VirtualHmdId hmd, const char* key, int default_val);
double GetNumberValue(VirtualHmdId hmd, const char* key, double default_val);
int GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals);
- void SetStringValue(VirtualHmdId hmd, const char* key, const char* val);
- void SetBoolValue(VirtualHmdId hmd, const char* key, bool val);
- void SetIntValue(VirtualHmdId hmd, const char* key, int val);
- void SetNumberValue(VirtualHmdId hmd, const char* key, double val);
- void SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals);
+
+ bool SetStringValue(VirtualHmdId hmd, const char* key, const char* val);
+ bool SetBoolValue(VirtualHmdId hmd, const char* key, bool val);
+ bool SetIntValue(VirtualHmdId hmd, const char* key, int val);
+ bool SetNumberValue(VirtualHmdId hmd, const char* key, double val);
+ bool SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals);
+
+ bool GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode);
+ bool SetDriverMode(bool compatMode, bool hideDK1Mode);
int Hmd_Detect();
bool Hmd_Create(int index, HMDNetworkInfo* netInfo);
@@ -99,7 +106,7 @@ public:
unsigned int Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps);
// Updates driver render target
- void Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow);
+ bool Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow);
//-------------------------------------------------------------------------------------
// *** Tracking Setup
@@ -123,11 +130,14 @@ protected:
void registerRPC();
- ObserverScope<OVR::Net::Plugins::RPCSlot> InitialServerStateScope;
+ ObserverScope<Net::Plugins::RPCSlot> InitialServerStateScope;
void InitialServerState_1(BitStream* userData, ReceivePayload* pPayload);
- ObserverScope<OVR::Net::Plugins::RPCSlot> LatencyTesterAvailableScope;
+ ObserverScope<Net::Plugins::RPCSlot> LatencyTesterAvailableScope;
void LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload);
+
+ ObserverScope<Net::Plugins::RPCSlot> HMDCountUpdateScope;
+ void HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload);
};