rev |
line source |
nuclear@0
|
1 /************************************************************************************
|
nuclear@0
|
2
|
nuclear@0
|
3 Filename : Service_NetClient.cpp
|
nuclear@0
|
4 Content : Client for service interface
|
nuclear@0
|
5 Created : June 12, 2014
|
nuclear@0
|
6 Authors : Michael Antonov, Kevin Jenkins, Chris Taylor
|
nuclear@0
|
7
|
nuclear@0
|
8 Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved.
|
nuclear@0
|
9
|
nuclear@0
|
10 Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
|
nuclear@0
|
11 you may not use the Oculus VR Rift SDK except in compliance with the License,
|
nuclear@0
|
12 which is provided at the time of installation or download, or which
|
nuclear@0
|
13 otherwise accompanies this software in either electronic or hard copy form.
|
nuclear@0
|
14
|
nuclear@0
|
15 You may obtain a copy of the License at
|
nuclear@0
|
16
|
nuclear@0
|
17 http://www.oculusvr.com/licenses/LICENSE-3.2
|
nuclear@0
|
18
|
nuclear@0
|
19 Unless required by applicable law or agreed to in writing, the Oculus VR SDK
|
nuclear@0
|
20 distributed under the License is distributed on an "AS IS" BASIS,
|
nuclear@0
|
21 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
nuclear@0
|
22 See the License for the specific language governing permissions and
|
nuclear@0
|
23 limitations under the License.
|
nuclear@0
|
24
|
nuclear@0
|
25 ************************************************************************************/
|
nuclear@0
|
26
|
nuclear@0
|
27 #include "Service_NetClient.h"
|
nuclear@0
|
28 #include "../Net/OVR_MessageIDTypes.h"
|
nuclear@0
|
29
|
nuclear@0
|
30 #if defined (OVR_OS_MAC) || defined(OVR_OS_LINUX)
|
nuclear@0
|
31 #define GetCurrentProcessId getpid
|
nuclear@0
|
32 #endif
|
nuclear@0
|
33 OVR_DEFINE_SINGLETON(OVR::Service::NetClient);
|
nuclear@0
|
34
|
nuclear@0
|
35 namespace OVR { namespace Service {
|
nuclear@0
|
36
|
nuclear@0
|
37 using namespace OVR::Net;
|
nuclear@0
|
38
|
nuclear@0
|
39
|
nuclear@0
|
40 //// NetClient
|
nuclear@0
|
41
|
nuclear@0
|
42 NetClient::NetClient() :
|
nuclear@0
|
43 LatencyTesterAvailable(false),
|
nuclear@0
|
44 HMDCount(0),
|
nuclear@0
|
45 EdgeTriggeredHMDCount(false)
|
nuclear@0
|
46 {
|
nuclear@0
|
47 GetSession()->AddSessionListener(this);
|
nuclear@0
|
48
|
nuclear@0
|
49 // Register RPC functions
|
nuclear@0
|
50 registerRPC();
|
nuclear@0
|
51
|
nuclear@0
|
52 Start();
|
nuclear@0
|
53
|
nuclear@0
|
54 // Must be at end of function
|
nuclear@0
|
55 PushDestroyCallbacks();
|
nuclear@0
|
56 }
|
nuclear@0
|
57
|
nuclear@0
|
58 NetClient::~NetClient()
|
nuclear@0
|
59 {
|
nuclear@0
|
60 }
|
nuclear@0
|
61
|
nuclear@0
|
62 void NetClient::OnSystemDestroy()
|
nuclear@0
|
63 {
|
nuclear@0
|
64 onSystemDestroy();
|
nuclear@0
|
65 }
|
nuclear@0
|
66
|
nuclear@0
|
67 void NetClient::OnThreadDestroy()
|
nuclear@0
|
68 {
|
nuclear@0
|
69 onThreadDestroy();
|
nuclear@0
|
70 }
|
nuclear@0
|
71
|
nuclear@0
|
72 int NetClient::Run()
|
nuclear@0
|
73 {
|
nuclear@0
|
74 SetThreadName("NetClient");
|
nuclear@0
|
75
|
nuclear@0
|
76 while (!Terminated)
|
nuclear@0
|
77 {
|
nuclear@0
|
78 // Note: There is no watchdog here because the watchdog is part of the private code
|
nuclear@0
|
79
|
nuclear@0
|
80 GetSession()->Poll(false);
|
nuclear@0
|
81
|
nuclear@0
|
82 if (GetSession()->GetActiveSocketsCount() == 0)
|
nuclear@0
|
83 {
|
nuclear@0
|
84 Thread::MSleep(10);
|
nuclear@0
|
85 }
|
nuclear@0
|
86 }
|
nuclear@0
|
87
|
nuclear@0
|
88 return 0;
|
nuclear@0
|
89 }
|
nuclear@0
|
90
|
nuclear@0
|
91 void NetClient::OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOut)
|
nuclear@0
|
92 {
|
nuclear@0
|
93 OVR_UNUSED(lrrOut);
|
nuclear@0
|
94 OVR_UNUSED(pPayload);
|
nuclear@0
|
95 }
|
nuclear@0
|
96
|
nuclear@0
|
97 void NetClient::OnDisconnected(Connection* conn)
|
nuclear@0
|
98 {
|
nuclear@0
|
99 OVR_UNUSED(conn);
|
nuclear@0
|
100
|
nuclear@0
|
101 OVR_DEBUG_LOG(("[NetClient] Disconnected"));
|
nuclear@0
|
102
|
nuclear@0
|
103 EdgeTriggeredHMDCount = false;
|
nuclear@0
|
104 }
|
nuclear@0
|
105
|
nuclear@0
|
106 void NetClient::OnConnected(Connection* conn)
|
nuclear@0
|
107 {
|
nuclear@0
|
108 OVR_UNUSED(conn);
|
nuclear@0
|
109
|
nuclear@0
|
110 OVR_DEBUG_LOG(("[NetClient] Connected to a server running version %d.%d.%d (my version=%d.%d.%d)",
|
nuclear@0
|
111 conn->RemoteMajorVersion, conn->RemoteMinorVersion, conn->RemotePatchVersion,
|
nuclear@0
|
112 RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch));
|
nuclear@0
|
113
|
nuclear@0
|
114 EdgeTriggeredHMDCount = false;
|
nuclear@0
|
115 }
|
nuclear@0
|
116
|
nuclear@0
|
117 bool NetClient::Connect(bool blocking)
|
nuclear@0
|
118 {
|
nuclear@0
|
119 // Set up bind parameters
|
nuclear@0
|
120 OVR::Net::BerkleyBindParameters bbp;
|
nuclear@0
|
121 bbp.Address = "::1"; // Bind to localhost only!
|
nuclear@0
|
122 bbp.blockingTimeout = 5000;
|
nuclear@0
|
123 OVR::Net::SockAddr sa;
|
nuclear@0
|
124 sa.Set("::1", VRServicePort, SOCK_STREAM);
|
nuclear@0
|
125
|
nuclear@0
|
126 // Attempt to connect
|
nuclear@0
|
127 OVR::Net::SessionResult result = GetSession()->ConnectPTCP(&bbp, &sa, blocking);
|
nuclear@0
|
128
|
nuclear@0
|
129 // Already connected counts as success too
|
nuclear@0
|
130 return result == Net::SessionResult_OK ||
|
nuclear@0
|
131 result == Net::SessionResult_AlreadyConnected ||
|
nuclear@0
|
132 result == Net::SessionResult_ConnectInProgress;
|
nuclear@0
|
133 }
|
nuclear@0
|
134
|
nuclear@0
|
135 void NetClient::Disconnect()
|
nuclear@0
|
136 {
|
nuclear@0
|
137 GetSession()->Shutdown();
|
nuclear@0
|
138 }
|
nuclear@0
|
139
|
nuclear@0
|
140 bool NetClient::IsConnected(bool attemptReconnect, bool blockOnReconnect)
|
nuclear@0
|
141 {
|
nuclear@0
|
142 // If it was able to connect,
|
nuclear@0
|
143 if (GetSession()->GetConnectionCount() > 0)
|
nuclear@0
|
144 {
|
nuclear@0
|
145 return true;
|
nuclear@0
|
146 }
|
nuclear@0
|
147 else if (attemptReconnect)
|
nuclear@0
|
148 {
|
nuclear@0
|
149 // Attempt to connect here
|
nuclear@0
|
150 Connect(blockOnReconnect);
|
nuclear@0
|
151
|
nuclear@0
|
152 // If it connected,
|
nuclear@0
|
153 if (GetSession()->GetConnectionCount() > 0)
|
nuclear@0
|
154 {
|
nuclear@0
|
155 return true;
|
nuclear@0
|
156 }
|
nuclear@0
|
157 }
|
nuclear@0
|
158
|
nuclear@0
|
159 // No connections
|
nuclear@0
|
160 return false;
|
nuclear@0
|
161 }
|
nuclear@0
|
162
|
nuclear@0
|
163 void NetClient::GetLocalProtocolVersion(int& major, int& minor, int& patch)
|
nuclear@0
|
164 {
|
nuclear@0
|
165 major = RPCVersion_Major;
|
nuclear@0
|
166 minor = RPCVersion_Minor;
|
nuclear@0
|
167 patch = RPCVersion_Patch;
|
nuclear@0
|
168 }
|
nuclear@0
|
169
|
nuclear@0
|
170 bool NetClient::GetRemoteProtocolVersion(int& major, int& minor, int& patch)
|
nuclear@0
|
171 {
|
nuclear@0
|
172 Ptr<Connection> conn = GetSession()->GetConnectionAtIndex(0);
|
nuclear@0
|
173
|
nuclear@0
|
174 if (conn)
|
nuclear@0
|
175 {
|
nuclear@0
|
176 major = conn->RemoteMajorVersion;
|
nuclear@0
|
177 minor = conn->RemoteMinorVersion;
|
nuclear@0
|
178 patch = conn->RemotePatchVersion;
|
nuclear@0
|
179 return true;
|
nuclear@0
|
180 }
|
nuclear@0
|
181
|
nuclear@0
|
182 return false;
|
nuclear@0
|
183 }
|
nuclear@0
|
184
|
nuclear@0
|
185
|
nuclear@0
|
186 //// NetClient API
|
nuclear@0
|
187
|
nuclear@0
|
188 const char* NetClient::GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val)
|
nuclear@0
|
189 {
|
nuclear@0
|
190 if (!IsConnected(true, true))
|
nuclear@0
|
191 {
|
nuclear@0
|
192 return "";
|
nuclear@0
|
193 }
|
nuclear@0
|
194
|
nuclear@0
|
195 // If a null value is provided,
|
nuclear@0
|
196 if (!default_val)
|
nuclear@0
|
197 {
|
nuclear@0
|
198 default_val = "";
|
nuclear@0
|
199 }
|
nuclear@0
|
200
|
nuclear@0
|
201 ProfileGetValue1_Str = default_val;
|
nuclear@0
|
202
|
nuclear@0
|
203 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
204 bsOut.Write(hmd);
|
nuclear@0
|
205 bsOut.Write(key);
|
nuclear@0
|
206 bsOut.Write(default_val);
|
nuclear@0
|
207 if (!GetRPC1()->CallBlocking("GetStringValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
208 {
|
nuclear@0
|
209 return "";
|
nuclear@0
|
210 }
|
nuclear@0
|
211 if (!returnData.Read(ProfileGetValue1_Str))
|
nuclear@0
|
212 {
|
nuclear@0
|
213 OVR_ASSERT(false);
|
nuclear@0
|
214 }
|
nuclear@0
|
215 return ProfileGetValue1_Str.ToCStr();
|
nuclear@0
|
216 }
|
nuclear@0
|
217 bool NetClient::GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val)
|
nuclear@0
|
218 {
|
nuclear@0
|
219 if (!IsConnected(true, true))
|
nuclear@0
|
220 {
|
nuclear@0
|
221 return default_val;
|
nuclear@0
|
222 }
|
nuclear@0
|
223
|
nuclear@0
|
224 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
225 bsOut.Write(hmd);
|
nuclear@0
|
226 bsOut.Write(key);
|
nuclear@0
|
227 bsOut.Write(default_val);
|
nuclear@0
|
228 if (!GetRPC1()->CallBlocking("GetBoolValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
229 {
|
nuclear@0
|
230 return default_val;
|
nuclear@0
|
231 }
|
nuclear@0
|
232 uint8_t out = 0;
|
nuclear@0
|
233 if (!returnData.Read(out))
|
nuclear@0
|
234 {
|
nuclear@0
|
235 OVR_ASSERT(false);
|
nuclear@0
|
236 }
|
nuclear@0
|
237 return out != 0;
|
nuclear@0
|
238 }
|
nuclear@0
|
239 int NetClient::GetIntValue(VirtualHmdId hmd, const char* key, int default_val)
|
nuclear@0
|
240 {
|
nuclear@0
|
241 if (!IsConnected(true, true))
|
nuclear@0
|
242 {
|
nuclear@0
|
243 return default_val;
|
nuclear@0
|
244 }
|
nuclear@0
|
245
|
nuclear@0
|
246 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
247 bsOut.Write(hmd);
|
nuclear@0
|
248 bsOut.Write(key);
|
nuclear@0
|
249 bsOut.Write(default_val);
|
nuclear@0
|
250 if (!GetRPC1()->CallBlocking("GetIntValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
251 {
|
nuclear@0
|
252 return default_val;
|
nuclear@0
|
253 }
|
nuclear@0
|
254 int32_t out = (int32_t)default_val;
|
nuclear@0
|
255 if (!returnData.Read(out))
|
nuclear@0
|
256 {
|
nuclear@0
|
257 OVR_ASSERT(false);
|
nuclear@0
|
258 }
|
nuclear@0
|
259 return out;
|
nuclear@0
|
260 }
|
nuclear@0
|
261 double NetClient::GetNumberValue(VirtualHmdId hmd, const char* key, double default_val)
|
nuclear@0
|
262 {
|
nuclear@0
|
263 if (!IsConnected(true, true))
|
nuclear@0
|
264 {
|
nuclear@0
|
265 return default_val;
|
nuclear@0
|
266 }
|
nuclear@0
|
267
|
nuclear@0
|
268 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
269 bsOut.Write(hmd);
|
nuclear@0
|
270 bsOut.Write(key);
|
nuclear@0
|
271 bsOut.Write(default_val);
|
nuclear@0
|
272 if (!GetRPC1()->CallBlocking("GetNumberValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
273 {
|
nuclear@0
|
274 return default_val;
|
nuclear@0
|
275 }
|
nuclear@0
|
276 double out = 0.;
|
nuclear@0
|
277 returnData.Read(out);
|
nuclear@0
|
278 return out;
|
nuclear@0
|
279 }
|
nuclear@0
|
280 int NetClient::GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals)
|
nuclear@0
|
281 {
|
nuclear@0
|
282 if (!IsConnected(true, true))
|
nuclear@0
|
283 {
|
nuclear@0
|
284 return 0;
|
nuclear@0
|
285 }
|
nuclear@0
|
286
|
nuclear@0
|
287 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
288 bsOut.Write(hmd);
|
nuclear@0
|
289 bsOut.Write(key);
|
nuclear@0
|
290
|
nuclear@0
|
291 int32_t w = (int32_t)num_vals;
|
nuclear@0
|
292 bsOut.Write(w);
|
nuclear@0
|
293
|
nuclear@0
|
294 if (!GetRPC1()->CallBlocking("GetNumberValues_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
295 {
|
nuclear@0
|
296 return 0;
|
nuclear@0
|
297 }
|
nuclear@0
|
298
|
nuclear@0
|
299 int32_t out = 0;
|
nuclear@0
|
300 if (!returnData.Read(out))
|
nuclear@0
|
301 {
|
nuclear@0
|
302 OVR_ASSERT(false);
|
nuclear@0
|
303 }
|
nuclear@0
|
304 OVR_ASSERT(out >= 0 && out <= num_vals);
|
nuclear@0
|
305 if (out < 0)
|
nuclear@0
|
306 {
|
nuclear@0
|
307 out = 0;
|
nuclear@0
|
308 }
|
nuclear@0
|
309 else if (out > num_vals)
|
nuclear@0
|
310 {
|
nuclear@0
|
311 out = num_vals;
|
nuclear@0
|
312 }
|
nuclear@0
|
313
|
nuclear@0
|
314 for (int i = 0; i < out && i < num_vals; i++)
|
nuclear@0
|
315 {
|
nuclear@0
|
316 if (!returnData.Read(values[i]))
|
nuclear@0
|
317 {
|
nuclear@0
|
318 return i;
|
nuclear@0
|
319 }
|
nuclear@0
|
320 }
|
nuclear@0
|
321
|
nuclear@0
|
322 return out;
|
nuclear@0
|
323 }
|
nuclear@0
|
324
|
nuclear@0
|
325 bool NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* val)
|
nuclear@0
|
326 {
|
nuclear@0
|
327 if (!IsConnected(true, true))
|
nuclear@0
|
328 {
|
nuclear@0
|
329 return false;
|
nuclear@0
|
330 }
|
nuclear@0
|
331
|
nuclear@0
|
332 OVR::Net::BitStream bsOut;
|
nuclear@0
|
333 bsOut.Write(hmd);
|
nuclear@0
|
334 bsOut.Write(key);
|
nuclear@0
|
335
|
nuclear@0
|
336 bsOut.Write(val);
|
nuclear@0
|
337
|
nuclear@0
|
338 if (!GetRPC1()->Signal("SetStringValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
339 {
|
nuclear@0
|
340 return false;
|
nuclear@0
|
341 }
|
nuclear@0
|
342
|
nuclear@0
|
343 return true;
|
nuclear@0
|
344 }
|
nuclear@0
|
345
|
nuclear@0
|
346 bool NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)
|
nuclear@0
|
347 {
|
nuclear@0
|
348 if (!IsConnected(true, true))
|
nuclear@0
|
349 {
|
nuclear@0
|
350 return false;
|
nuclear@0
|
351 }
|
nuclear@0
|
352
|
nuclear@0
|
353 OVR::Net::BitStream bsOut;
|
nuclear@0
|
354 bsOut.Write(hmd);
|
nuclear@0
|
355 bsOut.Write(key);
|
nuclear@0
|
356
|
nuclear@0
|
357 uint8_t b = val ? 1 : 0;
|
nuclear@0
|
358 bsOut.Write(b);
|
nuclear@0
|
359
|
nuclear@0
|
360 if (!GetRPC1()->Signal("SetBoolValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
361 {
|
nuclear@0
|
362 return false;
|
nuclear@0
|
363 }
|
nuclear@0
|
364
|
nuclear@0
|
365 return true;
|
nuclear@0
|
366 }
|
nuclear@0
|
367
|
nuclear@0
|
368 bool NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)
|
nuclear@0
|
369 {
|
nuclear@0
|
370 if (!IsConnected(true, true))
|
nuclear@0
|
371 {
|
nuclear@0
|
372 return false;
|
nuclear@0
|
373 }
|
nuclear@0
|
374
|
nuclear@0
|
375 OVR::Net::BitStream bsOut;
|
nuclear@0
|
376 bsOut.Write(hmd);
|
nuclear@0
|
377 bsOut.Write(key);
|
nuclear@0
|
378
|
nuclear@0
|
379 int32_t w = (int32_t)val;
|
nuclear@0
|
380 bsOut.Write(w);
|
nuclear@0
|
381
|
nuclear@0
|
382 if (!GetRPC1()->Signal("SetIntValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
383 {
|
nuclear@0
|
384 return false;
|
nuclear@0
|
385 }
|
nuclear@0
|
386
|
nuclear@0
|
387 return true;
|
nuclear@0
|
388 }
|
nuclear@0
|
389
|
nuclear@0
|
390 bool NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)
|
nuclear@0
|
391 {
|
nuclear@0
|
392 if (!IsConnected(true, true))
|
nuclear@0
|
393 {
|
nuclear@0
|
394 return false;
|
nuclear@0
|
395 }
|
nuclear@0
|
396
|
nuclear@0
|
397 OVR::Net::BitStream bsOut;
|
nuclear@0
|
398 bsOut.Write(hmd);
|
nuclear@0
|
399 bsOut.Write(key);
|
nuclear@0
|
400
|
nuclear@0
|
401 bsOut.Write(val);
|
nuclear@0
|
402
|
nuclear@0
|
403 if (!GetRPC1()->Signal("SetNumberValue_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
404 {
|
nuclear@0
|
405 return false;
|
nuclear@0
|
406 }
|
nuclear@0
|
407
|
nuclear@0
|
408 return true;
|
nuclear@0
|
409 }
|
nuclear@0
|
410
|
nuclear@0
|
411 bool NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals)
|
nuclear@0
|
412 {
|
nuclear@0
|
413 if (!IsConnected(true, true))
|
nuclear@0
|
414 {
|
nuclear@0
|
415 return false;
|
nuclear@0
|
416 }
|
nuclear@0
|
417
|
nuclear@0
|
418 OVR::Net::BitStream bsOut;
|
nuclear@0
|
419 bsOut.Write(hmd);
|
nuclear@0
|
420 bsOut.Write(key);
|
nuclear@0
|
421
|
nuclear@0
|
422 int32_t w_count = (int32_t)num_vals;
|
nuclear@0
|
423 bsOut.Write(w_count);
|
nuclear@0
|
424
|
nuclear@0
|
425 for (int i = 0; i < num_vals; i++)
|
nuclear@0
|
426 {
|
nuclear@0
|
427 bsOut.Write(vals[i]);
|
nuclear@0
|
428 }
|
nuclear@0
|
429
|
nuclear@0
|
430 if (!GetRPC1()->Signal("SetNumberValues_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
431 {
|
nuclear@0
|
432 return false;
|
nuclear@0
|
433 }
|
nuclear@0
|
434
|
nuclear@0
|
435 return true;
|
nuclear@0
|
436 }
|
nuclear@0
|
437
|
nuclear@0
|
438 int NetClient::Hmd_Detect()
|
nuclear@0
|
439 {
|
nuclear@0
|
440 if (!IsConnected(true, false))
|
nuclear@0
|
441 {
|
nuclear@0
|
442 return 0;
|
nuclear@0
|
443 }
|
nuclear@0
|
444
|
nuclear@0
|
445 // If using edge-triggered HMD counting,
|
nuclear@0
|
446 if (EdgeTriggeredHMDCount)
|
nuclear@0
|
447 {
|
nuclear@0
|
448 // Return the last update from the server
|
nuclear@0
|
449 return HMDCount;
|
nuclear@0
|
450 }
|
nuclear@0
|
451
|
nuclear@0
|
452 // Otherwise: We need to ask the first time
|
nuclear@0
|
453
|
nuclear@0
|
454 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
455
|
nuclear@0
|
456 if (!GetRPC1()->CallBlocking("Hmd_Detect_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
457 {
|
nuclear@0
|
458 return 0;
|
nuclear@0
|
459 }
|
nuclear@0
|
460
|
nuclear@0
|
461 int32_t out = 0;
|
nuclear@0
|
462 if (!returnData.Read(out))
|
nuclear@0
|
463 {
|
nuclear@0
|
464 OVR_ASSERT(false);
|
nuclear@0
|
465 }
|
nuclear@0
|
466 HMDCount = out;
|
nuclear@0
|
467 EdgeTriggeredHMDCount = true;
|
nuclear@0
|
468 return out;
|
nuclear@0
|
469 }
|
nuclear@0
|
470
|
nuclear@0
|
471 bool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)
|
nuclear@0
|
472 {
|
nuclear@0
|
473 if (!IsConnected(true, true))
|
nuclear@0
|
474 {
|
nuclear@0
|
475 return false;
|
nuclear@0
|
476 }
|
nuclear@0
|
477
|
nuclear@0
|
478 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
479
|
nuclear@0
|
480 int32_t w = (int32_t)index;
|
nuclear@0
|
481 bsOut.Write(w);
|
nuclear@0
|
482
|
nuclear@0
|
483 // Need the Pid for driver mode
|
nuclear@0
|
484 pid_t pid = GetCurrentProcessId();
|
nuclear@0
|
485 bsOut.Write(pid);
|
nuclear@0
|
486
|
nuclear@0
|
487 if (!GetRPC1()->CallBlocking("Hmd_Create_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
488 {
|
nuclear@0
|
489 return false;
|
nuclear@0
|
490 }
|
nuclear@0
|
491
|
nuclear@0
|
492 return netInfo->Deserialize(&returnData);
|
nuclear@0
|
493 }
|
nuclear@0
|
494
|
nuclear@0
|
495 bool NetClient::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)
|
nuclear@0
|
496 {
|
nuclear@0
|
497 if (!IsConnected(true, true))
|
nuclear@0
|
498 {
|
nuclear@0
|
499 return false;
|
nuclear@0
|
500 }
|
nuclear@0
|
501
|
nuclear@0
|
502 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
503
|
nuclear@0
|
504 bsOut.Write(InvalidVirtualHmdId);
|
nuclear@0
|
505
|
nuclear@0
|
506 if (!GetRPC1()->CallBlocking("GetDriverMode_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
507 {
|
nuclear@0
|
508 return false;
|
nuclear@0
|
509 }
|
nuclear@0
|
510
|
nuclear@0
|
511 int32_t w_driverInstalled = 0;
|
nuclear@0
|
512 int32_t w_compatMode = 0;
|
nuclear@0
|
513 int32_t w_hideDK1Mode = 0;
|
nuclear@0
|
514 returnData.Read(w_driverInstalled);
|
nuclear@0
|
515 returnData.Read(w_compatMode);
|
nuclear@0
|
516 if (!returnData.Read(w_hideDK1Mode))
|
nuclear@0
|
517 {
|
nuclear@0
|
518 return false;
|
nuclear@0
|
519 }
|
nuclear@0
|
520
|
nuclear@0
|
521 driverInstalled = w_driverInstalled != 0;
|
nuclear@0
|
522 compatMode = w_compatMode != 0;
|
nuclear@0
|
523 hideDK1Mode = w_hideDK1Mode != 0;
|
nuclear@0
|
524 return true;
|
nuclear@0
|
525 }
|
nuclear@0
|
526
|
nuclear@0
|
527 bool NetClient::SetDriverMode(bool compatMode, bool hideDK1Mode)
|
nuclear@0
|
528 {
|
nuclear@0
|
529 if (!IsConnected(true, true))
|
nuclear@0
|
530 {
|
nuclear@0
|
531 return false;
|
nuclear@0
|
532 }
|
nuclear@0
|
533
|
nuclear@0
|
534 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
535
|
nuclear@0
|
536 bsOut.Write(InvalidVirtualHmdId);
|
nuclear@0
|
537
|
nuclear@0
|
538 int32_t w_compatMode, w_hideDK1Mode;
|
nuclear@0
|
539 w_compatMode = compatMode ? 1 : 0;
|
nuclear@0
|
540 w_hideDK1Mode = hideDK1Mode ? 1 : 0;
|
nuclear@0
|
541 bsOut.Write(w_compatMode);
|
nuclear@0
|
542 bsOut.Write(w_hideDK1Mode);
|
nuclear@0
|
543
|
nuclear@0
|
544 if (!GetRPC1()->CallBlocking("SetDriverMode_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
545 {
|
nuclear@0
|
546 return false;
|
nuclear@0
|
547 }
|
nuclear@0
|
548
|
nuclear@0
|
549 int32_t out = 0;
|
nuclear@0
|
550 if (!returnData.Read(out))
|
nuclear@0
|
551 {
|
nuclear@0
|
552 OVR_ASSERT(false);
|
nuclear@0
|
553 return false;
|
nuclear@0
|
554 }
|
nuclear@0
|
555
|
nuclear@0
|
556 return out != 0;
|
nuclear@0
|
557 }
|
nuclear@0
|
558
|
nuclear@0
|
559 bool NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)
|
nuclear@0
|
560 {
|
nuclear@0
|
561 if (!IsConnected(false, false))
|
nuclear@0
|
562 {
|
nuclear@0
|
563 return false;
|
nuclear@0
|
564 }
|
nuclear@0
|
565
|
nuclear@0
|
566 OVR::Net::BitStream bsOut;
|
nuclear@0
|
567 bsOut.Write(hmd);
|
nuclear@0
|
568
|
nuclear@0
|
569 #ifdef OVR_OS_LINUX
|
nuclear@0
|
570 if (hWindow == NULL)
|
nuclear@0
|
571 {
|
nuclear@0
|
572 return false;
|
nuclear@0
|
573 }
|
nuclear@0
|
574 unsigned long hWinWord = *(unsigned long *)hWindow;
|
nuclear@0
|
575 #else
|
nuclear@0
|
576 UInt64 hWinWord = (UPInt)hWindow;
|
nuclear@0
|
577 #endif
|
nuclear@0
|
578 bsOut.Write(hWinWord);
|
nuclear@0
|
579
|
nuclear@0
|
580 if (!GetRPC1()->CallBlocking("Hmd_AttachToWindow_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
581 {
|
nuclear@0
|
582 return false;
|
nuclear@0
|
583 }
|
nuclear@0
|
584
|
nuclear@0
|
585 return true;
|
nuclear@0
|
586 }
|
nuclear@0
|
587
|
nuclear@0
|
588 void NetClient::Hmd_Release(VirtualHmdId hmd)
|
nuclear@0
|
589 {
|
nuclear@0
|
590 if (!IsConnected(false, false))
|
nuclear@0
|
591 {
|
nuclear@0
|
592 return;
|
nuclear@0
|
593 }
|
nuclear@0
|
594
|
nuclear@0
|
595 OVR::Net::BitStream bsOut;
|
nuclear@0
|
596 bsOut.Write(hmd);
|
nuclear@0
|
597 bool result = GetRPC1()->CallBlocking("Hmd_Release_1", &bsOut, GetSession()->GetConnectionAtIndex(0));
|
nuclear@0
|
598 OVR_ASSERT_AND_UNUSED(result, result);
|
nuclear@0
|
599 }
|
nuclear@0
|
600
|
nuclear@0
|
601 void NetClient::SetLastError(String str)
|
nuclear@0
|
602 {
|
nuclear@0
|
603 Hmd_GetLastError_Str = str;
|
nuclear@0
|
604 }
|
nuclear@0
|
605
|
nuclear@0
|
606 // Last string is cached locally.
|
nuclear@0
|
607 const char* NetClient::Hmd_GetLastError(VirtualHmdId hmd)
|
nuclear@0
|
608 {
|
nuclear@0
|
609 if (hmd == InvalidVirtualHmdId || !IsConnected(false, false))
|
nuclear@0
|
610 {
|
nuclear@0
|
611 return Hmd_GetLastError_Str.ToCStr();
|
nuclear@0
|
612 }
|
nuclear@0
|
613
|
nuclear@0
|
614 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
615 bsOut.Write(hmd);
|
nuclear@0
|
616 if (!GetRPC1()->CallBlocking("Hmd_GetLastError_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
617 {
|
nuclear@0
|
618 return Hmd_GetLastError_Str.ToCStr();
|
nuclear@0
|
619 }
|
nuclear@0
|
620 if (!returnData.Read(Hmd_GetLastError_Str))
|
nuclear@0
|
621 {
|
nuclear@0
|
622 OVR_ASSERT(false);
|
nuclear@0
|
623 }
|
nuclear@0
|
624 return Hmd_GetLastError_Str.ToCStr();
|
nuclear@0
|
625 }
|
nuclear@0
|
626
|
nuclear@0
|
627
|
nuclear@0
|
628 // Fills in description about HMD; this is the same as filled in by ovrHmd_Create.
|
nuclear@0
|
629 // The actual descriptor is a par
|
nuclear@0
|
630 bool NetClient::Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo)
|
nuclear@0
|
631 {
|
nuclear@0
|
632 if (!IsConnected(false, false))
|
nuclear@0
|
633 {
|
nuclear@0
|
634 return false;
|
nuclear@0
|
635 }
|
nuclear@0
|
636
|
nuclear@0
|
637 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
638 bsOut.Write(hmd);
|
nuclear@0
|
639 if (!GetRPC1()->CallBlocking("Hmd_GetHmdInfo_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
640 {
|
nuclear@0
|
641 return false;
|
nuclear@0
|
642 }
|
nuclear@0
|
643
|
nuclear@0
|
644 return NetSessionCommon::DeserializeHMDInfo(&returnData, hmdInfo);
|
nuclear@0
|
645 }
|
nuclear@0
|
646
|
nuclear@0
|
647
|
nuclear@0
|
648 //-------------------------------------------------------------------------------------
|
nuclear@0
|
649 unsigned int NetClient::Hmd_GetEnabledCaps(VirtualHmdId hmd)
|
nuclear@0
|
650 {
|
nuclear@0
|
651 if (!IsConnected(false, false))
|
nuclear@0
|
652 {
|
nuclear@0
|
653 return 0;
|
nuclear@0
|
654 }
|
nuclear@0
|
655
|
nuclear@0
|
656 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
657 bsOut.Write(hmd);
|
nuclear@0
|
658 if (!GetRPC1()->CallBlocking("Hmd_GetEnabledCaps_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
659 {
|
nuclear@0
|
660 return 0;
|
nuclear@0
|
661 }
|
nuclear@0
|
662
|
nuclear@0
|
663 uint32_t c = 0;
|
nuclear@0
|
664 if (!returnData.Read(c))
|
nuclear@0
|
665 {
|
nuclear@0
|
666 OVR_ASSERT(false);
|
nuclear@0
|
667 }
|
nuclear@0
|
668 return c;
|
nuclear@0
|
669 }
|
nuclear@0
|
670
|
nuclear@0
|
671 // Returns new caps after modification
|
nuclear@0
|
672 unsigned int NetClient::Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps)
|
nuclear@0
|
673 {
|
nuclear@0
|
674 if (!IsConnected(false, false))
|
nuclear@0
|
675 {
|
nuclear@0
|
676 return 0;
|
nuclear@0
|
677 }
|
nuclear@0
|
678
|
nuclear@0
|
679 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
680 bsOut.Write(hmd);
|
nuclear@0
|
681
|
nuclear@0
|
682 uint32_t c = (uint32_t)hmdCaps;
|
nuclear@0
|
683 bsOut.Write(c);
|
nuclear@0
|
684
|
nuclear@0
|
685 if (!GetRPC1()->CallBlocking("Hmd_SetEnabledCaps_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
686 {
|
nuclear@0
|
687 return 0;
|
nuclear@0
|
688 }
|
nuclear@0
|
689
|
nuclear@0
|
690 c = 0;
|
nuclear@0
|
691 if (!returnData.Read(c))
|
nuclear@0
|
692 {
|
nuclear@0
|
693 OVR_ASSERT(false);
|
nuclear@0
|
694 }
|
nuclear@0
|
695 return c;
|
nuclear@0
|
696 }
|
nuclear@0
|
697
|
nuclear@0
|
698
|
nuclear@0
|
699 //-------------------------------------------------------------------------------------
|
nuclear@0
|
700 // *** Tracking Setup
|
nuclear@0
|
701
|
nuclear@0
|
702 bool NetClient::Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps)
|
nuclear@0
|
703 {
|
nuclear@0
|
704 if (!IsConnected(false, false))
|
nuclear@0
|
705 {
|
nuclear@0
|
706 return false;
|
nuclear@0
|
707 }
|
nuclear@0
|
708
|
nuclear@0
|
709 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
710 bsOut.Write(hmd);
|
nuclear@0
|
711
|
nuclear@0
|
712 uint32_t w_sc = supportedCaps;
|
nuclear@0
|
713 bsOut.Write(w_sc);
|
nuclear@0
|
714 uint32_t w_rc = requiredCaps;
|
nuclear@0
|
715 bsOut.Write(w_rc);
|
nuclear@0
|
716
|
nuclear@0
|
717 if (!GetRPC1()->CallBlocking("Hmd_ConfigureTracking_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
718 {
|
nuclear@0
|
719 return false;
|
nuclear@0
|
720 }
|
nuclear@0
|
721
|
nuclear@0
|
722 uint8_t b;
|
nuclear@0
|
723 if (!returnData.Read(b))
|
nuclear@0
|
724 {
|
nuclear@0
|
725 OVR_ASSERT(false);
|
nuclear@0
|
726 }
|
nuclear@0
|
727
|
nuclear@0
|
728 return b != 0;
|
nuclear@0
|
729 }
|
nuclear@0
|
730
|
nuclear@0
|
731
|
nuclear@0
|
732 void NetClient::Hmd_ResetTracking(VirtualHmdId hmd)
|
nuclear@0
|
733 {
|
nuclear@0
|
734 if (!IsConnected(false, false))
|
nuclear@0
|
735 {
|
nuclear@0
|
736 return;
|
nuclear@0
|
737 }
|
nuclear@0
|
738
|
nuclear@0
|
739 OVR::Net::BitStream bsOut;
|
nuclear@0
|
740 bsOut.Write(hmd);
|
nuclear@0
|
741 if (!GetRPC1()->CallBlocking("Hmd_ResetTracking_1", &bsOut, GetSession()->GetConnectionAtIndex(0)))
|
nuclear@0
|
742 {
|
nuclear@0
|
743 return;
|
nuclear@0
|
744 }
|
nuclear@0
|
745 }
|
nuclear@0
|
746
|
nuclear@0
|
747 bool NetClient::LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3])
|
nuclear@0
|
748 {
|
nuclear@0
|
749 if (!IsConnected(false, false))
|
nuclear@0
|
750 {
|
nuclear@0
|
751 return false;
|
nuclear@0
|
752 }
|
nuclear@0
|
753
|
nuclear@0
|
754 if (!LatencyTesterAvailable)
|
nuclear@0
|
755 {
|
nuclear@0
|
756 return false;
|
nuclear@0
|
757 }
|
nuclear@0
|
758
|
nuclear@0
|
759 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
760 bsOut.Write(startTestSeconds);
|
nuclear@0
|
761 if (!GetRPC1()->CallBlocking("LatencyUtil_ProcessInputs_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
762 {
|
nuclear@0
|
763 return false;
|
nuclear@0
|
764 }
|
nuclear@0
|
765
|
nuclear@0
|
766 uint8_t u;
|
nuclear@0
|
767 returnData.Read(u);
|
nuclear@0
|
768 rgbColorOut[0] = u;
|
nuclear@0
|
769 returnData.Read(u);
|
nuclear@0
|
770 rgbColorOut[1] = u;
|
nuclear@0
|
771 if (!returnData.Read(u))
|
nuclear@0
|
772 {
|
nuclear@0
|
773 return false;
|
nuclear@0
|
774 }
|
nuclear@0
|
775 rgbColorOut[2] = u;
|
nuclear@0
|
776
|
nuclear@0
|
777 return true;
|
nuclear@0
|
778 }
|
nuclear@0
|
779
|
nuclear@0
|
780 const char* NetClient::LatencyUtil_GetResultsString()
|
nuclear@0
|
781 {
|
nuclear@0
|
782 if (!IsConnected(false, false))
|
nuclear@0
|
783 {
|
nuclear@0
|
784 return NULL;
|
nuclear@0
|
785 }
|
nuclear@0
|
786
|
nuclear@0
|
787 OVR::Net::BitStream bsOut, returnData;
|
nuclear@0
|
788 if (!GetRPC1()->CallBlocking("LatencyUtil_GetResultsString_1", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))
|
nuclear@0
|
789 {
|
nuclear@0
|
790 return NULL;
|
nuclear@0
|
791 }
|
nuclear@0
|
792
|
nuclear@0
|
793 if (!returnData.Read(LatencyUtil_GetResultsString_Str))
|
nuclear@0
|
794 {
|
nuclear@0
|
795 OVR_ASSERT(false);
|
nuclear@0
|
796 }
|
nuclear@0
|
797
|
nuclear@0
|
798 return LatencyUtil_GetResultsString_Str.ToCStr();
|
nuclear@0
|
799 }
|
nuclear@0
|
800
|
nuclear@0
|
801 bool NetClient::ShutdownServer()
|
nuclear@0
|
802 {
|
nuclear@0
|
803 if (!IsConnected(false, false))
|
nuclear@0
|
804 {
|
nuclear@0
|
805 return false;
|
nuclear@0
|
806 }
|
nuclear@0
|
807
|
nuclear@0
|
808 OVR::Net::BitStream bsOut;
|
nuclear@0
|
809 GetRPC1()->BroadcastSignal("Shutdown_1", &bsOut);
|
nuclear@0
|
810
|
nuclear@0
|
811 return true;
|
nuclear@0
|
812 }
|
nuclear@0
|
813
|
nuclear@0
|
814
|
nuclear@0
|
815 //// Push Notifications:
|
nuclear@0
|
816
|
nuclear@0
|
817 void NetClient::registerRPC()
|
nuclear@0
|
818 {
|
nuclear@0
|
819 #define RPC_REGISTER_SLOT(observerScope, functionName) \
|
nuclear@0
|
820 observerScope.SetHandler(OVR::Net::Plugins::RPCSlot::FromMember<NetClient, &NetClient::functionName>(this)); pRPC->RegisterSlot(OVR_STRINGIZE(functionName), observerScope);
|
nuclear@0
|
821
|
nuclear@0
|
822 // Register RPC functions:
|
nuclear@0
|
823 RPC_REGISTER_SLOT(InitialServerStateScope, InitialServerState_1);
|
nuclear@0
|
824 RPC_REGISTER_SLOT(LatencyTesterAvailableScope, LatencyTesterAvailable_1);
|
nuclear@0
|
825 RPC_REGISTER_SLOT(DefaultLogOutputScope, DefaultLogOutput_1);
|
nuclear@0
|
826 RPC_REGISTER_SLOT(HMDCountUpdateScope, HMDCountUpdate_1);
|
nuclear@0
|
827 }
|
nuclear@0
|
828
|
nuclear@0
|
829 void NetClient::InitialServerState_1(BitStream* userData, ReceivePayload* pPayload)
|
nuclear@0
|
830 {
|
nuclear@0
|
831 LatencyTesterAvailable_1(userData, pPayload);
|
nuclear@0
|
832 }
|
nuclear@0
|
833
|
nuclear@0
|
834 void NetClient::LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload)
|
nuclear@0
|
835 {
|
nuclear@0
|
836 OVR_UNUSED(pPayload);
|
nuclear@0
|
837
|
nuclear@0
|
838 uint8_t b = 0;
|
nuclear@0
|
839 if (!userData->Read(b))
|
nuclear@0
|
840 {
|
nuclear@0
|
841 OVR_ASSERT(false);
|
nuclear@0
|
842 return;
|
nuclear@0
|
843 }
|
nuclear@0
|
844
|
nuclear@0
|
845 LatencyTesterAvailable = (b != 0);
|
nuclear@0
|
846 }
|
nuclear@0
|
847
|
nuclear@0
|
848 void NetClient::DefaultLogOutput_1(BitStream* userData, ReceivePayload* pPayload)
|
nuclear@0
|
849 {
|
nuclear@0
|
850 OVR_UNUSED(pPayload);
|
nuclear@0
|
851
|
nuclear@0
|
852 String formattedText;
|
nuclear@0
|
853 LogMessageType messageType = Log_Text; // Will normally be overwritten below.
|
nuclear@0
|
854 userData->Read(messageType);
|
nuclear@0
|
855 if (userData->Read(formattedText))
|
nuclear@0
|
856 {
|
nuclear@0
|
857 if (OVR::Log::GetGlobalLog())
|
nuclear@0
|
858 {
|
nuclear@0
|
859 OVR::String logStr = "[From Service] ";
|
nuclear@0
|
860 logStr.AppendString(formattedText);
|
nuclear@0
|
861 OVR::Log::GetGlobalLog()->LogMessage(messageType, "%s", logStr.ToCStr());
|
nuclear@0
|
862 }
|
nuclear@0
|
863 }
|
nuclear@0
|
864 }
|
nuclear@0
|
865
|
nuclear@0
|
866 void NetClient::HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload)
|
nuclear@0
|
867 {
|
nuclear@0
|
868 OVR_UNUSED(pPayload);
|
nuclear@0
|
869
|
nuclear@0
|
870 int32_t hmdCount = 0;
|
nuclear@0
|
871 if (!userData->Read(hmdCount))
|
nuclear@0
|
872 {
|
nuclear@0
|
873 OVR_ASSERT(false);
|
nuclear@0
|
874 return;
|
nuclear@0
|
875 }
|
nuclear@0
|
876
|
nuclear@0
|
877 HMDCount = hmdCount;
|
nuclear@0
|
878 EdgeTriggeredHMDCount = true;
|
nuclear@0
|
879 }
|
nuclear@0
|
880
|
nuclear@0
|
881
|
nuclear@0
|
882 }} // namespace OVR::Service
|