ovr_sdk

annotate LibOVR/Src/Service/Service_NetSessionCommon.cpp @ 0:1b39a1b46319

initial 0.4.4
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 14 Jan 2015 06:51:16 +0200
parents
children
rev   line source
nuclear@0 1 /************************************************************************************
nuclear@0 2
nuclear@0 3 Filename : Service_NetSessionCommon.cpp
nuclear@0 4 Content : Server for service interface
nuclear@0 5 Created : June 12, 2014
nuclear@0 6 Authors : 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_NetSessionCommon.h"
nuclear@0 28 #include "../OVR_Stereo.h"
nuclear@0 29
nuclear@0 30 namespace OVR { namespace Service {
nuclear@0 31
nuclear@0 32
nuclear@0 33 //// NetSessionCommon
nuclear@0 34
nuclear@0 35 NetSessionCommon::NetSessionCommon() :
nuclear@0 36 Terminated(false)
nuclear@0 37 {
nuclear@0 38 pSession = new Net::Session;
nuclear@0 39 OVR_ASSERT(pSession != NULL);
nuclear@0 40
nuclear@0 41 pRPC = new Net::Plugins::RPC1;
nuclear@0 42 OVR_ASSERT(pRPC != NULL);
nuclear@0 43
nuclear@0 44 pSession->AddSessionListener(pRPC);
nuclear@0 45 }
nuclear@0 46
nuclear@0 47 NetSessionCommon::~NetSessionCommon()
nuclear@0 48 {
nuclear@0 49 if (pSession)
nuclear@0 50 {
nuclear@0 51 delete pSession;
nuclear@0 52 pSession = NULL;
nuclear@0 53 }
nuclear@0 54 if (pRPC)
nuclear@0 55 {
nuclear@0 56 delete pRPC;
nuclear@0 57 pRPC = NULL;
nuclear@0 58 }
nuclear@0 59
nuclear@0 60 Terminated = true;
nuclear@0 61
nuclear@0 62 OVR_ASSERT(IsFinished());
nuclear@0 63 }
nuclear@0 64
nuclear@0 65 void NetSessionCommon::onSystemDestroy()
nuclear@0 66 {
nuclear@0 67 Terminated = true;
nuclear@0 68
nuclear@0 69 Join();
nuclear@0 70
nuclear@0 71 Release();
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 void NetSessionCommon::onThreadDestroy()
nuclear@0 75 {
nuclear@0 76 Terminated = true;
nuclear@0 77 if (pSession)
nuclear@0 78 {
nuclear@0 79 pSession->Shutdown();
nuclear@0 80 }
nuclear@0 81 }
nuclear@0 82
nuclear@0 83 void NetSessionCommon::SerializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo)
nuclear@0 84 {
nuclear@0 85 bitStream->Write(hmdInfo->ProductName);
nuclear@0 86 bitStream->Write(hmdInfo->Manufacturer);
nuclear@0 87
nuclear@0 88 int32_t w = hmdInfo->Version;
nuclear@0 89 bitStream->Write(w);
nuclear@0 90
nuclear@0 91 w = hmdInfo->HmdType;
nuclear@0 92 bitStream->Write(w);
nuclear@0 93
nuclear@0 94 w = hmdInfo->ResolutionInPixels.w;
nuclear@0 95 bitStream->Write(w);
nuclear@0 96
nuclear@0 97 w = hmdInfo->ResolutionInPixels.h;
nuclear@0 98 bitStream->Write(w);
nuclear@0 99
nuclear@0 100 w = hmdInfo->ShimInfo.DeviceNumber;
nuclear@0 101 bitStream->Write(w);
nuclear@0 102
nuclear@0 103 w = hmdInfo->ShimInfo.NativeWidth;
nuclear@0 104 bitStream->Write(w);
nuclear@0 105
nuclear@0 106 w = hmdInfo->ShimInfo.NativeHeight;
nuclear@0 107 bitStream->Write(w);
nuclear@0 108
nuclear@0 109 w = hmdInfo->ShimInfo.Rotation;
nuclear@0 110 bitStream->Write(w);
nuclear@0 111
nuclear@0 112 bitStream->Write(hmdInfo->ScreenSizeInMeters.w);
nuclear@0 113 bitStream->Write(hmdInfo->ScreenSizeInMeters.h);
nuclear@0 114 bitStream->Write(hmdInfo->ScreenGapSizeInMeters);
nuclear@0 115 bitStream->Write(hmdInfo->CenterFromTopInMeters);
nuclear@0 116 bitStream->Write(hmdInfo->LensSeparationInMeters);
nuclear@0 117
nuclear@0 118 w = hmdInfo->DesktopX;
nuclear@0 119 bitStream->Write(w);
nuclear@0 120
nuclear@0 121 w = hmdInfo->DesktopY;
nuclear@0 122 bitStream->Write(w);
nuclear@0 123
nuclear@0 124 w = hmdInfo->Shutter.Type;
nuclear@0 125 bitStream->Write(w);
nuclear@0 126
nuclear@0 127 bitStream->Write(hmdInfo->Shutter.VsyncToNextVsync);
nuclear@0 128 bitStream->Write(hmdInfo->Shutter.VsyncToFirstScanline);
nuclear@0 129 bitStream->Write(hmdInfo->Shutter.FirstScanlineToLastScanline);
nuclear@0 130 bitStream->Write(hmdInfo->Shutter.PixelSettleTime);
nuclear@0 131 bitStream->Write(hmdInfo->Shutter.PixelPersistence);
nuclear@0 132 bitStream->Write(hmdInfo->DisplayDeviceName);
nuclear@0 133
nuclear@0 134 w = hmdInfo->DisplayId;
nuclear@0 135 bitStream->Write(w);
nuclear@0 136
nuclear@0 137 bitStream->Write(hmdInfo->PrintedSerial);
nuclear@0 138
nuclear@0 139 uint8_t b = hmdInfo->InCompatibilityMode ? 1 : 0;
nuclear@0 140 bitStream->Write(b);
nuclear@0 141
nuclear@0 142 w = hmdInfo->VendorId;
nuclear@0 143 bitStream->Write(w);
nuclear@0 144
nuclear@0 145 w = hmdInfo->ProductId;
nuclear@0 146 bitStream->Write(w);
nuclear@0 147
nuclear@0 148 bitStream->Write(hmdInfo->CameraFrustumFarZInMeters);
nuclear@0 149 bitStream->Write(hmdInfo->CameraFrustumHFovInRadians);
nuclear@0 150 bitStream->Write(hmdInfo->CameraFrustumNearZInMeters);
nuclear@0 151 bitStream->Write(hmdInfo->CameraFrustumVFovInRadians);
nuclear@0 152
nuclear@0 153 w = hmdInfo->FirmwareMajor;
nuclear@0 154 bitStream->Write(w);
nuclear@0 155
nuclear@0 156 w = hmdInfo->FirmwareMinor;
nuclear@0 157 bitStream->Write(w);
nuclear@0 158
nuclear@0 159 bitStream->Write(hmdInfo->PelOffsetR.x);
nuclear@0 160 bitStream->Write(hmdInfo->PelOffsetR.y);
nuclear@0 161 bitStream->Write(hmdInfo->PelOffsetB.x);
nuclear@0 162 bitStream->Write(hmdInfo->PelOffsetB.y);
nuclear@0 163
nuclear@0 164 // Important please read before modifying!
nuclear@0 165 // ----------------------------------------------------
nuclear@0 166 // Please add new serialized data to the end, here.
nuclear@0 167 // Otherwise we will break backwards compatibility
nuclear@0 168 // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK.
nuclear@0 169
nuclear@0 170 // Please also update the DeserializeHMDInfo() function
nuclear@0 171 // below also and make sure that the members you added
nuclear@0 172 // are initialized properly in the HMDInfo constructor.
nuclear@0 173
nuclear@0 174 // Note that whenever new fields are added here you
nuclear@0 175 // should also update the minor version of the RPC
nuclear@0 176 // protocol in OVR_Session.h so that clients fail at
nuclear@0 177 // a version check instead of when this data is
nuclear@0 178 // found to be truncated from the server.
nuclear@0 179 }
nuclear@0 180
nuclear@0 181 bool NetSessionCommon::DeserializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo)
nuclear@0 182 {
nuclear@0 183 bitStream->Read(hmdInfo->ProductName);
nuclear@0 184 bitStream->Read(hmdInfo->Manufacturer);
nuclear@0 185
nuclear@0 186 int32_t w = 0;
nuclear@0 187 if (!bitStream->Read(w))
nuclear@0 188 {
nuclear@0 189 // This indicates that no HMD could be found
nuclear@0 190 return false;
nuclear@0 191 }
nuclear@0 192 hmdInfo->Version = w;
nuclear@0 193
nuclear@0 194 bitStream->Read(w);
nuclear@0 195 hmdInfo->HmdType = (HmdTypeEnum)w;
nuclear@0 196
nuclear@0 197 bitStream->Read(w);
nuclear@0 198 hmdInfo->ResolutionInPixels.w = w;
nuclear@0 199
nuclear@0 200 bitStream->Read(w);
nuclear@0 201 hmdInfo->ResolutionInPixels.h = w;
nuclear@0 202
nuclear@0 203 bitStream->Read(w);
nuclear@0 204 hmdInfo->ShimInfo.DeviceNumber = w;
nuclear@0 205
nuclear@0 206 bitStream->Read(w);
nuclear@0 207 hmdInfo->ShimInfo.NativeWidth = w;
nuclear@0 208
nuclear@0 209 bitStream->Read(w);
nuclear@0 210 hmdInfo->ShimInfo.NativeHeight = w;
nuclear@0 211
nuclear@0 212 bitStream->Read(w);
nuclear@0 213 hmdInfo->ShimInfo.Rotation = w;
nuclear@0 214
nuclear@0 215 bitStream->Read(hmdInfo->ScreenSizeInMeters.w);
nuclear@0 216 bitStream->Read(hmdInfo->ScreenSizeInMeters.h);
nuclear@0 217 bitStream->Read(hmdInfo->ScreenGapSizeInMeters);
nuclear@0 218 bitStream->Read(hmdInfo->CenterFromTopInMeters);
nuclear@0 219 bitStream->Read(hmdInfo->LensSeparationInMeters);
nuclear@0 220
nuclear@0 221 bitStream->Read(w);
nuclear@0 222 hmdInfo->DesktopX = w;
nuclear@0 223
nuclear@0 224 bitStream->Read(w);
nuclear@0 225 hmdInfo->DesktopY = w;
nuclear@0 226
nuclear@0 227 bitStream->Read(w);
nuclear@0 228 hmdInfo->Shutter.Type = (HmdShutterTypeEnum)w;
nuclear@0 229
nuclear@0 230 bitStream->Read(hmdInfo->Shutter.VsyncToNextVsync);
nuclear@0 231 bitStream->Read(hmdInfo->Shutter.VsyncToFirstScanline);
nuclear@0 232 bitStream->Read(hmdInfo->Shutter.FirstScanlineToLastScanline);
nuclear@0 233 bitStream->Read(hmdInfo->Shutter.PixelSettleTime);
nuclear@0 234 bitStream->Read(hmdInfo->Shutter.PixelPersistence);
nuclear@0 235 bitStream->Read(hmdInfo->DisplayDeviceName);
nuclear@0 236
nuclear@0 237 bitStream->Read(w);
nuclear@0 238 hmdInfo->DisplayId = w;
nuclear@0 239
nuclear@0 240 bitStream->Read(hmdInfo->PrintedSerial);
nuclear@0 241
nuclear@0 242 uint8_t b = 0;
nuclear@0 243 bitStream->Read(b);
nuclear@0 244 hmdInfo->InCompatibilityMode = (b != 0);
nuclear@0 245
nuclear@0 246 bitStream->Read(w);
nuclear@0 247 hmdInfo->VendorId = w;
nuclear@0 248
nuclear@0 249 bitStream->Read(w);
nuclear@0 250 hmdInfo->ProductId = w;
nuclear@0 251
nuclear@0 252 bitStream->Read(hmdInfo->CameraFrustumFarZInMeters);
nuclear@0 253 bitStream->Read(hmdInfo->CameraFrustumHFovInRadians);
nuclear@0 254 bitStream->Read(hmdInfo->CameraFrustumNearZInMeters);
nuclear@0 255 bitStream->Read(hmdInfo->CameraFrustumVFovInRadians);
nuclear@0 256
nuclear@0 257 bitStream->Read(w);
nuclear@0 258 hmdInfo->FirmwareMajor = w;
nuclear@0 259
nuclear@0 260 if (!bitStream->Read(w))
nuclear@0 261 {
nuclear@0 262 OVR_ASSERT(false);
nuclear@0 263 return false;
nuclear@0 264 }
nuclear@0 265 hmdInfo->FirmwareMinor = w;
nuclear@0 266
nuclear@0 267 bitStream->Read(hmdInfo->PelOffsetR.x);
nuclear@0 268 bitStream->Read(hmdInfo->PelOffsetR.y);
nuclear@0 269 bitStream->Read(hmdInfo->PelOffsetB.x);
nuclear@0 270 if (!bitStream->Read(hmdInfo->PelOffsetB.y))
nuclear@0 271 {
nuclear@0 272 OVR_ASSERT(false);
nuclear@0 273 return false;
nuclear@0 274 }
nuclear@0 275
nuclear@0 276 // Important please read before modifying!
nuclear@0 277 // ----------------------------------------------------
nuclear@0 278 // Please add new serialized data to the end, here.
nuclear@0 279 // Otherwise we will break backwards compatibility
nuclear@0 280 // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK.
nuclear@0 281
nuclear@0 282 // Be sure to check that the very last one read properly
nuclear@0 283 // since HMD Info truncation should be caught here.
nuclear@0 284
nuclear@0 285 return true;
nuclear@0 286 }
nuclear@0 287
nuclear@0 288 // Prefix key names with this to pass through to server
nuclear@0 289 static const char* BypassPrefix = "server:";
nuclear@0 290
nuclear@0 291 static const char* KeyNames[][NetSessionCommon::ENumTypes] = {
nuclear@0 292 /* EGetStringValue */ { "CameraSerial", "CameraUUID", 0 },
nuclear@0 293 /* EGetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 },
nuclear@0 294 /* EGetIntValue */ { 0 },
nuclear@0 295 /* EGetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 },
nuclear@0 296 /* EGetNumberValues */{ "NeckModelVector3f", 0 },
nuclear@0 297 /* ESetStringValue */ { 0 },
nuclear@0 298 /* ESetBoolValue */ { "ReleaseDK2Sensors", "ReleaseLegacySensors", 0 },
nuclear@0 299 /* ESetIntValue */ { 0 },
nuclear@0 300 /* ESetNumberValue */{ "CenterPupilDepth", "LoggingMask", 0 },
nuclear@0 301 /* ESetNumberValues */{ "NeckModelVector3f", 0 },
nuclear@0 302 };
nuclear@0 303
nuclear@0 304 bool IsInStringArray(const char* a[], const char* key)
nuclear@0 305 {
nuclear@0 306 for (int i = 0; a[i]; ++i)
nuclear@0 307 {
nuclear@0 308 if (OVR_strcmp(a[i], key) == 0)
nuclear@0 309 return true;
nuclear@0 310 }
nuclear@0 311
nuclear@0 312 return false;
nuclear@0 313 }
nuclear@0 314
nuclear@0 315 const char *NetSessionCommon::FilterKeyPrefix(const char* key)
nuclear@0 316 {
nuclear@0 317 // If key starts with BypassPrefix,
nuclear@0 318 if (strstr(key, BypassPrefix) == key)
nuclear@0 319 {
nuclear@0 320 key += strlen(BypassPrefix);
nuclear@0 321 }
nuclear@0 322
nuclear@0 323 return key;
nuclear@0 324 }
nuclear@0 325
nuclear@0 326 bool NetSessionCommon::IsServiceProperty(EGetterSetters e, const char* key)
nuclear@0 327 {
nuclear@0 328 if ((e >= 0 && e < ENumTypes) && IsInStringArray(KeyNames[e], key))
nuclear@0 329 {
nuclear@0 330 return true;
nuclear@0 331 }
nuclear@0 332
nuclear@0 333 // If key starts with BypassPrefix,
nuclear@0 334 if (strstr(key, BypassPrefix) == key)
nuclear@0 335 {
nuclear@0 336 return true;
nuclear@0 337 }
nuclear@0 338
nuclear@0 339 return false;
nuclear@0 340 }
nuclear@0 341
nuclear@0 342
nuclear@0 343 }} // namespace OVR::Service