diff options
author | Brad Davis <[email protected]> | 2014-07-24 16:47:31 -0700 |
---|---|---|
committer | Brad Davis <[email protected]> | 2014-07-24 16:47:31 -0700 |
commit | 0f49ce8fc6aa54224e4c0d6fda8c4527ad39cce1 (patch) | |
tree | da07ebc6a7f75185bda857dd5f1c34710b416a93 /LibOVR/Src/OVR_LatencyTestImpl.cpp | |
parent | ca79271759ff7eecd22ec5c4db438370fe51d687 (diff) |
0.4 Win-Beta0.4.0
Diffstat (limited to 'LibOVR/Src/OVR_LatencyTestImpl.cpp')
-rw-r--r-- | LibOVR/Src/OVR_LatencyTestImpl.cpp | 773 |
1 files changed, 0 insertions, 773 deletions
diff --git a/LibOVR/Src/OVR_LatencyTestImpl.cpp b/LibOVR/Src/OVR_LatencyTestImpl.cpp deleted file mode 100644 index 015d9e4..0000000 --- a/LibOVR/Src/OVR_LatencyTestImpl.cpp +++ /dev/null @@ -1,773 +0,0 @@ -/************************************************************************************ - -Filename : OVR_LatencyTestImpl.cpp -Content : Oculus Latency Tester device implementation. -Created : March 7, 2013 -Authors : Lee Cooper - -Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved. - -Licensed under the Oculus VR Rift SDK License Version 3.1 (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.1 - -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. - -*************************************************************************************/ - -#include "OVR_LatencyTestImpl.h" -#include "Kernel/OVR_Alg.h" - -namespace OVR { - -using namespace Alg; - -//------------------------------------------------------------------------------------- -// ***** Oculus Latency Tester specific packet data structures - -enum { - LatencyTester_VendorId = Oculus_VendorId, - LatencyTester_ProductId = 0x0101, -}; - -static void UnpackSamples(const UByte* buffer, UByte* r, UByte* g, UByte* b) -{ - *r = buffer[0]; - *g = buffer[1]; - *b = buffer[2]; -} - -// Messages we handle. -enum LatencyTestMessageType -{ - LatencyTestMessage_None = 0, - LatencyTestMessage_Samples = 1, - LatencyTestMessage_ColorDetected = 2, - LatencyTestMessage_TestStarted = 3, - LatencyTestMessage_Button = 4, - LatencyTestMessage_Unknown = 0x100, - LatencyTestMessage_SizeError = 0x101, -}; - -struct LatencyTestSample -{ - UByte Value[3]; -}; - -struct LatencyTestSamples -{ - UByte SampleCount; - UInt16 Timestamp; - - LatencyTestSample Samples[20]; - - LatencyTestMessageType Decode(const UByte* buffer, int size) - { - if (size < 64) - { - return LatencyTestMessage_SizeError; - } - - SampleCount = buffer[1]; - Timestamp = DecodeUInt16(buffer + 2); - - for (UByte i = 0; i < SampleCount; i++) - { - UnpackSamples(buffer + 4 + (3 * i), &Samples[i].Value[0], &Samples[i].Value[1], &Samples[i].Value[2]); - } - - return LatencyTestMessage_Samples; - } -}; - -struct LatencyTestSamplesMessage -{ - LatencyTestMessageType Type; - LatencyTestSamples Samples; -}; - -bool DecodeLatencyTestSamplesMessage(LatencyTestSamplesMessage* message, UByte* buffer, int size) -{ - memset(message, 0, sizeof(LatencyTestSamplesMessage)); - - if (size < 64) - { - message->Type = LatencyTestMessage_SizeError; - return false; - } - - switch (buffer[0]) - { - case LatencyTestMessage_Samples: - message->Type = message->Samples.Decode(buffer, size); - break; - - default: - message->Type = LatencyTestMessage_Unknown; - break; - } - - return (message->Type < LatencyTestMessage_Unknown) && (message->Type != LatencyTestMessage_None); -} - -struct LatencyTestColorDetected -{ - UInt16 CommandID; - UInt16 Timestamp; - UInt16 Elapsed; - UByte TriggerValue[3]; - UByte TargetValue[3]; - - LatencyTestMessageType Decode(const UByte* buffer, int size) - { - if (size < 13) - return LatencyTestMessage_SizeError; - - CommandID = DecodeUInt16(buffer + 1); - Timestamp = DecodeUInt16(buffer + 3); - Elapsed = DecodeUInt16(buffer + 5); - memcpy(TriggerValue, buffer + 7, 3); - memcpy(TargetValue, buffer + 10, 3); - - return LatencyTestMessage_ColorDetected; - } -}; - -struct LatencyTestColorDetectedMessage -{ - LatencyTestMessageType Type; - LatencyTestColorDetected ColorDetected; -}; - -bool DecodeLatencyTestColorDetectedMessage(LatencyTestColorDetectedMessage* message, UByte* buffer, int size) -{ - memset(message, 0, sizeof(LatencyTestColorDetectedMessage)); - - if (size < 13) - { - message->Type = LatencyTestMessage_SizeError; - return false; - } - - switch (buffer[0]) - { - case LatencyTestMessage_ColorDetected: - message->Type = message->ColorDetected.Decode(buffer, size); - break; - - default: - message->Type = LatencyTestMessage_Unknown; - break; - } - - return (message->Type < LatencyTestMessage_Unknown) && (message->Type != LatencyTestMessage_None); -} - -struct LatencyTestStarted -{ - UInt16 CommandID; - UInt16 Timestamp; - UByte TargetValue[3]; - - LatencyTestMessageType Decode(const UByte* buffer, int size) - { - if (size < 8) - return LatencyTestMessage_SizeError; - - CommandID = DecodeUInt16(buffer + 1); - Timestamp = DecodeUInt16(buffer + 3); - memcpy(TargetValue, buffer + 5, 3); - - return LatencyTestMessage_TestStarted; - } -}; - -struct LatencyTestStartedMessage -{ - LatencyTestMessageType Type; - LatencyTestStarted TestStarted; -}; - -bool DecodeLatencyTestStartedMessage(LatencyTestStartedMessage* message, UByte* buffer, int size) -{ - memset(message, 0, sizeof(LatencyTestStartedMessage)); - - if (size < 8) - { - message->Type = LatencyTestMessage_SizeError; - return false; - } - - switch (buffer[0]) - { - case LatencyTestMessage_TestStarted: - message->Type = message->TestStarted.Decode(buffer, size); - break; - - default: - message->Type = LatencyTestMessage_Unknown; - break; - } - - return (message->Type < LatencyTestMessage_Unknown) && (message->Type != LatencyTestMessage_None); -} - -struct LatencyTestButton -{ - UInt16 CommandID; - UInt16 Timestamp; - - LatencyTestMessageType Decode(const UByte* buffer, int size) - { - if (size < 5) - return LatencyTestMessage_SizeError; - - CommandID = DecodeUInt16(buffer + 1); - Timestamp = DecodeUInt16(buffer + 3); - - return LatencyTestMessage_Button; - } -}; - -struct LatencyTestButtonMessage -{ - LatencyTestMessageType Type; - LatencyTestButton Button; -}; - -bool DecodeLatencyTestButtonMessage(LatencyTestButtonMessage* message, UByte* buffer, int size) -{ - memset(message, 0, sizeof(LatencyTestButtonMessage)); - - if (size < 5) - { - message->Type = LatencyTestMessage_SizeError; - return false; - } - - switch (buffer[0]) - { - case LatencyTestMessage_Button: - message->Type = message->Button.Decode(buffer, size); - break; - - default: - message->Type = LatencyTestMessage_Unknown; - break; - } - - return (message->Type < LatencyTestMessage_Unknown) && (message->Type != LatencyTestMessage_None); -} - -struct LatencyTestConfigurationImpl -{ - enum { PacketSize = 5 }; - UByte Buffer[PacketSize]; - - OVR::LatencyTestConfiguration Configuration; - - LatencyTestConfigurationImpl(const OVR::LatencyTestConfiguration& configuration) - : Configuration(configuration) - { - Pack(); - } - - void Pack() - { - Buffer[0] = 5; - Buffer[1] = UByte(Configuration.SendSamples); - Buffer[2] = Configuration.Threshold.R; - Buffer[3] = Configuration.Threshold.G; - Buffer[4] = Configuration.Threshold.B; - } - - void Unpack() - { - Configuration.SendSamples = Buffer[1] != 0 ? true : false; - Configuration.Threshold.R = Buffer[2]; - Configuration.Threshold.G = Buffer[3]; - Configuration.Threshold.B = Buffer[4]; - } -}; - -struct LatencyTestCalibrateImpl -{ - enum { PacketSize = 4 }; - UByte Buffer[PacketSize]; - - Color CalibrationColor; - - LatencyTestCalibrateImpl(const Color& calibrationColor) - : CalibrationColor(calibrationColor) - { - Pack(); - } - - void Pack() - { - Buffer[0] = 7; - Buffer[1] = CalibrationColor.R; - Buffer[2] = CalibrationColor.G; - Buffer[3] = CalibrationColor.B; - } - - void Unpack() - { - CalibrationColor.R = Buffer[1]; - CalibrationColor.G = Buffer[2]; - CalibrationColor.B = Buffer[3]; - } -}; - -struct LatencyTestStartTestImpl -{ - enum { PacketSize = 6 }; - UByte Buffer[PacketSize]; - - Color TargetColor; - - LatencyTestStartTestImpl(const Color& targetColor) - : TargetColor(targetColor) - { - Pack(); - } - - void Pack() - { - UInt16 commandID = 1; - - Buffer[0] = 8; - EncodeUInt16(Buffer+1, commandID); - Buffer[3] = TargetColor.R; - Buffer[4] = TargetColor.G; - Buffer[5] = TargetColor.B; - } - - void Unpack() - { -// UInt16 commandID = DecodeUInt16(Buffer+1); - TargetColor.R = Buffer[3]; - TargetColor.G = Buffer[4]; - TargetColor.B = Buffer[5]; - } -}; - -struct LatencyTestDisplayImpl -{ - enum { PacketSize = 6 }; - UByte Buffer[PacketSize]; - - OVR::LatencyTestDisplay Display; - - LatencyTestDisplayImpl(const OVR::LatencyTestDisplay& display) - : Display(display) - { - Pack(); - } - - void Pack() - { - Buffer[0] = 9; - Buffer[1] = Display.Mode; - EncodeUInt32(Buffer+2, Display.Value); - } - - void Unpack() - { - Display.Mode = Buffer[1]; - Display.Value = DecodeUInt32(Buffer+2); - } -}; - -//------------------------------------------------------------------------------------- -// ***** LatencyTestDeviceFactory - -LatencyTestDeviceFactory &LatencyTestDeviceFactory::GetInstance() -{ - static LatencyTestDeviceFactory instance; - return instance; -} - -void LatencyTestDeviceFactory::EnumerateDevices(EnumerateVisitor& visitor) -{ - - class LatencyTestEnumerator : public HIDEnumerateVisitor - { - // Assign not supported; suppress MSVC warning. - void operator = (const LatencyTestEnumerator&) { } - - DeviceFactory* pFactory; - EnumerateVisitor& ExternalVisitor; - public: - LatencyTestEnumerator(DeviceFactory* factory, EnumerateVisitor& externalVisitor) - : pFactory(factory), ExternalVisitor(externalVisitor) { } - - virtual bool MatchVendorProduct(UInt16 vendorId, UInt16 productId) - { - return pFactory->MatchVendorProduct(vendorId, productId); - } - - virtual void Visit(HIDDevice& device, const HIDDeviceDesc& desc) - { - OVR_UNUSED(device); - - LatencyTestDeviceCreateDesc createDesc(pFactory, desc); - ExternalVisitor.Visit(createDesc); - } - }; - - LatencyTestEnumerator latencyTestEnumerator(this, visitor); - GetManagerImpl()->GetHIDDeviceManager()->Enumerate(&latencyTestEnumerator); -} - -bool LatencyTestDeviceFactory::MatchVendorProduct(UInt16 vendorId, UInt16 productId) const -{ - return ((vendorId == LatencyTester_VendorId) && (productId == LatencyTester_ProductId)); -} - -bool LatencyTestDeviceFactory::DetectHIDDevice(DeviceManager* pdevMgr, - const HIDDeviceDesc& desc) -{ - if (MatchVendorProduct(desc.VendorId, desc.ProductId)) - { - LatencyTestDeviceCreateDesc createDesc(this, desc); - return pdevMgr->AddDevice_NeedsLock(createDesc).GetPtr() != NULL; - } - return false; -} - -//------------------------------------------------------------------------------------- -// ***** LatencyTestDeviceCreateDesc - -DeviceBase* LatencyTestDeviceCreateDesc::NewDeviceInstance() -{ - return new LatencyTestDeviceImpl(this); -} - -bool LatencyTestDeviceCreateDesc::GetDeviceInfo(DeviceInfo* info) const -{ - if ((info->InfoClassType != Device_LatencyTester) && - (info->InfoClassType != Device_None)) - return false; - - info->Type = Device_LatencyTester; - info->ProductName = HIDDesc.Product; - info->Manufacturer = HIDDesc.Manufacturer; - info->Version = HIDDesc.VersionNumber; - - if (info->InfoClassType == Device_LatencyTester) - { - SensorInfo* sinfo = (SensorInfo*)info; - sinfo->VendorId = HIDDesc.VendorId; - sinfo->ProductId = HIDDesc.ProductId; - sinfo->SerialNumber = HIDDesc.SerialNumber; - } - return true; -} - -//------------------------------------------------------------------------------------- -// ***** LatencyTestDevice - -LatencyTestDeviceImpl::LatencyTestDeviceImpl(LatencyTestDeviceCreateDesc* createDesc) - : OVR::HIDDeviceImpl<OVR::LatencyTestDevice>(createDesc, 0) -{ -} - -LatencyTestDeviceImpl::~LatencyTestDeviceImpl() -{ - // Check that Shutdown() was called. - OVR_ASSERT(!pCreateDesc->pDevice); -} - -// Internal creation APIs. -bool LatencyTestDeviceImpl::Initialize(DeviceBase* parent) -{ - if (HIDDeviceImpl<OVR::LatencyTestDevice>::Initialize(parent)) - { - LogText("OVR::LatencyTestDevice initialized.\n"); - return true; - } - - return false; -} - -void LatencyTestDeviceImpl::Shutdown() -{ - HIDDeviceImpl<OVR::LatencyTestDevice>::Shutdown(); - - LogText("OVR::LatencyTestDevice - Closed '%s'\n", getHIDDesc()->Path.ToCStr()); -} - -void LatencyTestDeviceImpl::OnInputReport(UByte* pData, UInt32 length) -{ - - bool processed = false; - if (!processed) - { - LatencyTestSamplesMessage message; - if (DecodeLatencyTestSamplesMessage(&message, pData, length)) - { - processed = true; - onLatencyTestSamplesMessage(&message); - } - } - - if (!processed) - { - LatencyTestColorDetectedMessage message; - if (DecodeLatencyTestColorDetectedMessage(&message, pData, length)) - { - processed = true; - onLatencyTestColorDetectedMessage(&message); - } - } - - if (!processed) - { - LatencyTestStartedMessage message; - if (DecodeLatencyTestStartedMessage(&message, pData, length)) - { - processed = true; - onLatencyTestStartedMessage(&message); - } - } - - if (!processed) - { - LatencyTestButtonMessage message; - if (DecodeLatencyTestButtonMessage(&message, pData, length)) - { - processed = true; - onLatencyTestButtonMessage(&message); - } - } -} - -bool LatencyTestDeviceImpl::SetConfiguration(const OVR::LatencyTestConfiguration& configuration, bool waitFlag) -{ - bool result = false; - ThreadCommandQueue* queue = GetManagerImpl()->GetThreadQueue(); - - if (GetManagerImpl()->GetThreadId() != OVR::GetCurrentThreadId()) - { - if (!waitFlag) - { - return queue->PushCall(this, &LatencyTestDeviceImpl::setConfiguration, configuration); - } - - if (!queue->PushCallAndWaitResult( this, - &LatencyTestDeviceImpl::setConfiguration, - &result, - configuration)) - { - return false; - } - } - else - return setConfiguration(configuration); - - return result; -} - -bool LatencyTestDeviceImpl::setConfiguration(const OVR::LatencyTestConfiguration& configuration) -{ - LatencyTestConfigurationImpl ltc(configuration); - return GetInternalDevice()->SetFeatureReport(ltc.Buffer, LatencyTestConfigurationImpl::PacketSize); -} - -bool LatencyTestDeviceImpl::GetConfiguration(OVR::LatencyTestConfiguration* configuration) -{ - bool result = false; - - ThreadCommandQueue* pQueue = this->GetManagerImpl()->GetThreadQueue(); - if (!pQueue->PushCallAndWaitResult(this, &LatencyTestDeviceImpl::getConfiguration, &result, configuration)) - return false; - - return result; -} - -bool LatencyTestDeviceImpl::getConfiguration(OVR::LatencyTestConfiguration* configuration) -{ - LatencyTestConfigurationImpl ltc(*configuration); - if (GetInternalDevice()->GetFeatureReport(ltc.Buffer, LatencyTestConfigurationImpl::PacketSize)) - { - ltc.Unpack(); - *configuration = ltc.Configuration; - return true; - } - - return false; -} - -bool LatencyTestDeviceImpl::SetCalibrate(const Color& calibrationColor, bool waitFlag) -{ - bool result = false; - ThreadCommandQueue* queue = GetManagerImpl()->GetThreadQueue(); - - if (!waitFlag) - { - return queue->PushCall(this, &LatencyTestDeviceImpl::setCalibrate, calibrationColor); - } - - if (!queue->PushCallAndWaitResult( this, - &LatencyTestDeviceImpl::setCalibrate, - &result, - calibrationColor)) - { - return false; - } - - return result; -} - -bool LatencyTestDeviceImpl::setCalibrate(const Color& calibrationColor) -{ - LatencyTestCalibrateImpl ltc(calibrationColor); - return GetInternalDevice()->SetFeatureReport(ltc.Buffer, LatencyTestCalibrateImpl::PacketSize); -} - -bool LatencyTestDeviceImpl::SetStartTest(const Color& targetColor, bool waitFlag) -{ - bool result = false; - ThreadCommandQueue* queue = GetManagerImpl()->GetThreadQueue(); - - if (!waitFlag) - { - return queue->PushCall(this, &LatencyTestDeviceImpl::setStartTest, targetColor); - } - - if (!queue->PushCallAndWaitResult( this, - &LatencyTestDeviceImpl::setStartTest, - &result, - targetColor)) - { - return false; - } - - return result; -} - -bool LatencyTestDeviceImpl::setStartTest(const Color& targetColor) -{ - LatencyTestStartTestImpl ltst(targetColor); - return GetInternalDevice()->SetFeatureReport(ltst.Buffer, LatencyTestStartTestImpl::PacketSize); -} - -bool LatencyTestDeviceImpl::SetDisplay(const OVR::LatencyTestDisplay& display, bool waitFlag) -{ - bool result = false; - ThreadCommandQueue * queue = GetManagerImpl()->GetThreadQueue(); - - if (!waitFlag) - { - return queue->PushCall(this, &LatencyTestDeviceImpl::setDisplay, display); - } - - if (!queue->PushCallAndWaitResult( this, - &LatencyTestDeviceImpl::setDisplay, - &result, - display)) - { - return false; - } - - return result; -} - -bool LatencyTestDeviceImpl::setDisplay(const OVR::LatencyTestDisplay& display) -{ - LatencyTestDisplayImpl ltd(display); - return GetInternalDevice()->SetFeatureReport(ltd.Buffer, LatencyTestDisplayImpl::PacketSize); -} - -void LatencyTestDeviceImpl::onLatencyTestSamplesMessage(LatencyTestSamplesMessage* message) -{ - - if (message->Type != LatencyTestMessage_Samples) - return; - - LatencyTestSamples& s = message->Samples; - - // Call OnMessage() within a lock to avoid conflicts with handlers. - Lock::Locker scopeLock(HandlerRef.GetLock()); - - if (HandlerRef.HasHandlers()) - { - MessageLatencyTestSamples samples(this); - for (UByte i = 0; i < s.SampleCount; i++) - { - samples.Samples.PushBack(Color(s.Samples[i].Value[0], s.Samples[i].Value[1], s.Samples[i].Value[2])); - } - - HandlerRef.Call(samples); - } -} - -void LatencyTestDeviceImpl::onLatencyTestColorDetectedMessage(LatencyTestColorDetectedMessage* message) -{ - if (message->Type != LatencyTestMessage_ColorDetected) - return; - - LatencyTestColorDetected& s = message->ColorDetected; - - // Call OnMessage() within a lock to avoid conflicts with handlers. - Lock::Locker scopeLock(HandlerRef.GetLock()); - - if (HandlerRef.HasHandlers()) - { - MessageLatencyTestColorDetected detected(this); - detected.Elapsed = s.Elapsed; - detected.DetectedValue = Color(s.TriggerValue[0], s.TriggerValue[1], s.TriggerValue[2]); - detected.TargetValue = Color(s.TargetValue[0], s.TargetValue[1], s.TargetValue[2]); - - HandlerRef.Call(detected); - } -} - -void LatencyTestDeviceImpl::onLatencyTestStartedMessage(LatencyTestStartedMessage* message) -{ - if (message->Type != LatencyTestMessage_TestStarted) - return; - - LatencyTestStarted& ts = message->TestStarted; - - // Call OnMessage() within a lock to avoid conflicts with handlers. - Lock::Locker scopeLock(HandlerRef.GetLock()); - - if (HandlerRef.HasHandlers()) - { - MessageLatencyTestStarted started(this); - started.TargetValue = Color(ts.TargetValue[0], ts.TargetValue[1], ts.TargetValue[2]); - - HandlerRef.Call(started); - } -} - -void LatencyTestDeviceImpl::onLatencyTestButtonMessage(LatencyTestButtonMessage* message) -{ - if (message->Type != LatencyTestMessage_Button) - return; - -// LatencyTestButton& s = message->Button; - - // Call OnMessage() within a lock to avoid conflicts with handlers. - Lock::Locker scopeLock(HandlerRef.GetLock()); - - if (HandlerRef.HasHandlers()) - { - MessageLatencyTestButton button(this); - - HandlerRef.Call(button); - } -} - -} // namespace OVR |