aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Vision/SensorFusion/Vision_SensorState.h
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/Vision/SensorFusion/Vision_SensorState.h')
-rwxr-xr-xLibOVR/Src/Vision/SensorFusion/Vision_SensorState.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/LibOVR/Src/Vision/SensorFusion/Vision_SensorState.h b/LibOVR/Src/Vision/SensorFusion/Vision_SensorState.h
new file mode 100755
index 0000000..13b0bb3
--- /dev/null
+++ b/LibOVR/Src/Vision/SensorFusion/Vision_SensorState.h
@@ -0,0 +1,161 @@
+/************************************************************************************
+
+Filename : Vision_SensorState.h
+Content : Sensor state information shared by tracking system with games
+Created : May 13, 2014
+Authors : Dov Katz, Chris Taylor
+
+Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.2
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*************************************************************************************/
+
+#ifndef OVR_Vision_SensorState_h
+#define OVR_Vision_SensorState_h
+
+#include "Vision/Vision_Common.h"
+#include "Kernel/OVR_SharedMemory.h"
+#include "Kernel/OVR_Lockless.h"
+#include "Kernel/OVR_String.h"
+#include "Util/Util_LatencyTest2State.h"
+#include "Sensors/OVR_DeviceConstants.h"
+
+
+namespace OVR { namespace Vision {
+
+
+// Bit flags describing the current status of sensor tracking.
+// These values must be the same as ovrStatusBits
+enum StatusBits
+{
+ // Tracked bits: Toggled by SensorFusion
+ Status_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use)
+ Status_PositionTracked = 0x0002, // Position is currently tracked (false if out of range)
+ Status_CameraPoseTracked = 0x0004, // Camera pose is currently tracked
+
+ // Connected bits: Toggled by TrackingManager
+ Status_PositionConnected = 0x0020, // Position tracking HW is connected
+ Status_BuiltinConnected = 0x0040, // Builtin tracking HW is connected
+ Status_HMDConnected = 0x0080, // HMD is available & connected
+
+ // Masks
+ Status_AllMask = 0xffff,
+ Status_TrackingMask = Status_PositionTracked | Status_OrientationTracked | Status_CameraPoseTracked,
+ Status_ConnectedMask = Status_PositionConnected | Status_HMDConnected,
+};
+
+#pragma pack(push, 8)
+
+// TrackedObject state stored in lockless updater "queue" and used for
+// prediction by SensorStateReader
+struct LocklessSensorState
+{
+ PoseState<double> WorldFromImu;
+ SensorDataType RawSensorData;
+
+ // DO NOT USE
+ // only preserved for backwards compatibility
+ Pose<double> WorldFromCamera_DEPRECATED;
+
+ uint32_t StatusFlags;
+ uint32_t _PAD_0_;
+
+ // ImuFromCpf for HMD pose tracking
+ Posed ImuFromCpf;
+
+ // Initialized to invalid state
+ LocklessSensorState() :
+ WorldFromImu()
+ , RawSensorData()
+ , WorldFromCamera_DEPRECATED()
+ , StatusFlags(0)
+ , _PAD_0_(0) // This assignment should be irrelevant, but it quells static/runtime analysis complaints.
+ , ImuFromCpf()
+ {
+ }
+};
+
+static_assert((sizeof(LocklessSensorState) == sizeof(PoseState<double>) + sizeof(SensorDataType) + sizeof(Pose<double>) + 2*sizeof(uint32_t) + sizeof(Posed)), "sizeof(LocklessSensorState) failure");
+
+struct LocklessCameraState
+{
+ Pose<double> WorldFromCamera;
+
+ uint32_t StatusFlags;
+ uint32_t _PAD_0_;
+
+ // Initialized to invalid state
+ LocklessCameraState() :
+ WorldFromCamera()
+ , StatusFlags(0)
+ , _PAD_0_(0) // This assignment should be irrelevant, but it quells static/runtime analysis complaints.
+ {
+ }
+};
+
+static_assert((sizeof(LocklessCameraState) == sizeof(Pose<double>) + 2 * sizeof(uint32_t)), "sizeof(LocklessCameraState) failure");
+
+
+// Padded out version stored in the updater slots
+// Designed to be a larger fixed size to allow the data to grow in the future
+// without breaking older compiled code.
+OVR_DISABLE_MSVC_WARNING(4351)
+template <class Payload, int PaddingSize>
+struct LocklessPadding
+{
+ uint8_t buffer[PaddingSize];
+
+ LocklessPadding() : buffer() { }
+
+ LocklessPadding& operator=(const Payload& rhs)
+ {
+ // if this fires off, then increase PaddingSize
+ // IMPORTANT: this WILL break backwards compatibility
+ static_assert(sizeof(buffer) >= sizeof(Payload), "PaddingSize is too small");
+
+ memcpy(buffer, &rhs, sizeof(Payload));
+ return *this;
+ }
+
+ operator Payload() const
+ {
+ Payload result;
+ memcpy(&result, buffer, sizeof(Payload));
+ return result;
+ }
+};
+OVR_RESTORE_MSVC_WARNING()
+
+#pragma pack(pop)
+
+//// Lockless updaters
+
+struct CombinedHmdUpdater
+{
+ // IMPORTANT: do not add more data to this struct
+ // new objects should have their own shared memory blocks
+ LocklessUpdater<LocklessSensorState, LocklessPadding<LocklessSensorState, 512> > SensorState;
+ LocklessUpdater<Util::FrameTimeRecordSet, Util::FrameTimeRecordSet> LatencyTest;
+};
+
+
+typedef LocklessUpdater<LocklessCameraState, LocklessPadding<LocklessCameraState, 512> > CameraStateUpdater;
+
+
+}} // namespace OVR::Vision
+
+#endif