Skip to content

Commit 52c604f

Browse files
committed
Use high resolution timer if possible
1 parent 8f4193e commit 52c604f

3 files changed

Lines changed: 77 additions & 43 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
Public Class ClassHighPrecisionTimer
2+
Private Shared ReadOnly m_Clock As Stopwatch = Stopwatch.StartNew()
3+
Private Shared ReadOnly m_Frequency As Double = Stopwatch.Frequency
4+
5+
Public Shared Function GetTicks() As Long
6+
If (Not Stopwatch.IsHighResolution) Then
7+
Debug.WriteLine("IsHighResolution = false")
8+
End If
9+
10+
Return Stopwatch.GetTimestamp()
11+
End Function
12+
13+
Public Shared Function TicksToSeconds(iTicks As Long) As Double
14+
Return iTicks / m_Frequency
15+
End Function
16+
17+
Public Shared Function TicksToMilliseconds(iTicks As Long) As Double
18+
Return iTicks * 1000.0 / m_Frequency
19+
End Function
20+
21+
Public Shared Function ElapsedSeconds(iTicks As Long, iLastTicks As Long) As Double
22+
Return (iTicks - iLastTicks) / m_Frequency
23+
End Function
24+
25+
Public Shared Function ElapsedMilliseconds(iTicks As Long, iLastTicks As Long) As Double
26+
Return (iTicks - iLastTicks) * 1000.0 / m_Frequency
27+
End Function
28+
29+
Public Shared Function ElapsedTimeSpan(iTicks As Long, iLastTicks As Long) As TimeSpan
30+
Return TimeSpan.FromSeconds(ElapsedSeconds(iTicks, iLastTicks))
31+
End Function
32+
End Class

PSMSVirtualDeviceManager/PSMSVirtualDeviceManager.vbproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
<Compile Include="Classes\ClassCameraFirmwareWatchdog.vb" />
178178
<Compile Include="Classes\ClassControllerHook.vb" />
179179
<Compile Include="Classes\ClassDevicesNotify.vb" />
180+
<Compile Include="Classes\ClassHighPrecisionTimer.vb" />
180181
<Compile Include="Classes\ClassKeyboardHook.vb" />
181182
<Compile Include="Classes\ClassMonitor.vb" />
182183
<Compile Include="Classes\ClassSteamVRRenderWatchdog.vb" />

PSMSVirtualDeviceManager/UCVirtualMotionTracker/UCVirtualMotionTrackerItem.vb

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,10 +1874,10 @@ Public Class UCVirtualMotionTrackerItem
18741874
iLastOutputSeqNumFailures = 0
18751875
iLastOutputSeqNum = iOutputSeqNum
18761876

1877-
Dim iBatteryValue As Single = m_ControllerData.m_BatteryLevel
1878-
Dim bIsVirtualCOntroller As Boolean = m_ControllerData.m_Serial.StartsWith("VirtualController")
1879-
18801877
SyncLock g_mThreadLock
1878+
Dim iBatteryValue As Single = m_ControllerData.m_BatteryLevel
1879+
Dim bIsVirtualCOntroller As Boolean = m_ControllerData.m_Serial.StartsWith("VirtualController")
1880+
18811881
Dim mRawPosition = m_ControllerData.m_Position
18821882
Dim mRawOrientation = m_ControllerData.m_Orientation
18831883
Dim mRawPositionVelocity = m_ControllerData.m_PositionVelocity
@@ -2408,8 +2408,8 @@ Public Class UCVirtualMotionTrackerItem
24082408
Public mLastOrientation As Quaternion
24092409
Public mLastVelocityPosition As Vector3
24102410
Public mLastVelocityOrientation As Vector3
2411-
Public mLastPositionTime As Date
2412-
Public mLastOrientationTime As Date
2411+
Public mLastPositionTicks As Long
2412+
Public mLastOrientationTicks As Long
24132413
Public mNormalizedPositionDelta As Queue(Of Double)
24142414
Public mNormalizedOrientationDelta As Queue(Of Double)
24152415
Public iVelocityPositionDelta As Double
@@ -2420,8 +2420,8 @@ Public Class UCVirtualMotionTrackerItem
24202420
mLastOrientation = Quaternion.Identity
24212421
mLastVelocityPosition = Vector3.Zero
24222422
mLastVelocityOrientation = Vector3.Zero
2423-
mLastPositionTime = Now
2424-
mLastOrientationTime = Now
2423+
mLastPositionTicks = ClassHighPrecisionTimer.GetTicks()
2424+
mLastOrientationTicks = ClassHighPrecisionTimer.GetTicks()
24252425
mNormalizedPositionDelta = New Queue(Of Double)
24262426
mNormalizedOrientationDelta = New Queue(Of Double)
24272427
iVelocityPositionDelta = 0.0
@@ -2438,21 +2438,20 @@ Public Class UCVirtualMotionTrackerItem
24382438
Const VELOCITY_POSITION_SMOOTHING = 0.4
24392439
Const VELOCITY_ORIENTATION_SMOOTHING = 0.2
24402440

2441-
Dim mNow As Date = Now
2441+
Dim iNowTicks As Long = ClassHighPrecisionTimer.GetTicks()
24422442

24432443
' Linear Velocity
24442444
If (True) Then
2445-
Dim mDelta As TimeSpan = (mNow - mData.mLastPositionTime)
2446-
Dim iDeltaTime As Double = mDelta.TotalSeconds
2445+
Dim iDeltaTime As Double = ClassHighPrecisionTimer.ElapsedSeconds(iNowTicks, mData.mLastPositionTicks)
24472446

24482447
If (mPosition <> mData.mLastPosition) Then
2449-
mData.mLastPositionTime = mNow
2448+
mData.mLastPositionTicks = iNowTicks
24502449

24512450
mData.mNormalizedPositionDelta.Enqueue(iDeltaTime)
24522451
If (mData.mNormalizedPositionDelta.Count > 30) Then
24532452
mData.mNormalizedPositionDelta.Dequeue()
24542453
End If
2455-
Dim iAvgiDeltaTime = mData.mNormalizedPositionDelta.Average()
2454+
Dim iAvgDeltaTime = mData.mNormalizedPositionDelta.Average()
24562455

24572456
Dim mNewVelocity = New Vector3(
24582457
mPosition.X - mData.mLastPosition.X,
@@ -2462,7 +2461,7 @@ Public Class UCVirtualMotionTrackerItem
24622461
mData.mLastVelocityPosition = ClassMathUtils.ExponentialLowpassFilter(VELOCITY_POSITION_SMOOTHING, mNewVelocity, mData.mLastVelocityPosition)
24632462

24642463
mData.mLastPosition = mPosition
2465-
mData.iVelocityPositionDelta = iAvgiDeltaTime
2464+
mData.iVelocityPositionDelta = iAvgDeltaTime
24662465
End If
24672466

24682467
If (mData.iVelocityPositionDelta > Double.Epsilon AndAlso mData.iVelocityPositionDelta <= MIN_VELOCITY_FREQ AndAlso iDeltaTime <= MIN_VELOCITY_FREQ) Then
@@ -2481,11 +2480,10 @@ Public Class UCVirtualMotionTrackerItem
24812480

24822481
' Angular Velocity
24832482
If (True) Then
2484-
Dim mDelta As TimeSpan = (mNow - mData.mLastOrientationTime)
2485-
Dim iDeltaTime As Double = mDelta.TotalSeconds
2483+
Dim iDeltaTime As Double = ClassHighPrecisionTimer.ElapsedSeconds(iNowTicks, mData.mLastOrientationTicks)
24862484

24872485
If (mOrientation <> mData.mLastOrientation) Then
2488-
mData.mLastOrientationTime = mNow
2486+
mData.mLastOrientationTicks = iNowTicks
24892487

24902488
mData.mNormalizedOrientationDelta.Enqueue(iDeltaTime)
24912489
If (mData.mNormalizedOrientationDelta.Count > 30) Then
@@ -2518,8 +2516,8 @@ Public Class UCVirtualMotionTrackerItem
25182516
Public mLastRawOrientation As Quaternion
25192517
Public mLastVelocityPosition As Vector3
25202518
Public mLastVelocityOrientation As Vector3
2521-
Public mLastPositionTime As Date
2522-
Public mLastOrientationTime As Date
2519+
Public mLastPositionTicks As Long
2520+
Public mLastOrientationTicks As Long
25232521
Public mNormalizedPositionDelta As Queue(Of Double)
25242522
Public mNormalizedOrientationDelta As Queue(Of Double)
25252523
Public iVelocityPositionDelta As Double
@@ -2530,32 +2528,33 @@ Public Class UCVirtualMotionTrackerItem
25302528
mLastRawOrientation = Quaternion.Identity
25312529
mLastVelocityPosition = Vector3.Zero
25322530
mLastVelocityOrientation = Vector3.Zero
2533-
mLastPositionTime = Now
2534-
mLastOrientationTime = Now
2531+
mLastPositionTicks = ClassHighPrecisionTimer.GetTicks()
2532+
mLastOrientationTicks = ClassHighPrecisionTimer.GetTicks()
25352533
mNormalizedPositionDelta = New Queue(Of Double)
25362534
mNormalizedOrientationDelta = New Queue(Of Double)
25372535
iVelocityPositionDelta = 0.0
25382536
iVelocityOrientationDelta = 0.0
25392537
End Sub
25402538
End Class
25412539

2542-
Private Sub InternalCalculateVelocity(ByRef mRawPosition As Vector3, ByRef mRawOrientation As Quaternion,
2543-
ByRef mPosition As Vector3, ByRef mOrientation As Quaternion,
2544-
ByRef mVelocityPosition As Vector3, ByRef mVelocityOrientation As Vector3,
2545-
ByRef iVelocityTimeOffset As Single,
2546-
ByRef mData As STRUC_CALCULATE_VELOCITY_DATA)
2547-
Const MIN_VELOCITY_FREQ = (1.0 / 10.0)
2548-
Const MAX_VELOCITY_FREQ = (1.0 / 2500.0)
2540+
Private Sub InternalCalculateVelocity(
2541+
ByRef mRawPosition As Vector3, ByRef mRawOrientation As Quaternion,
2542+
ByRef mPosition As Vector3, ByRef mOrientation As Quaternion,
2543+
ByRef mVelocityPosition As Vector3, ByRef mVelocityOrientation As Vector3,
2544+
ByRef iVelocityTimeOffset As Single,
2545+
ByRef mData As STRUC_CALCULATE_VELOCITY_DATA)
2546+
2547+
Const MIN_VELOCITY_FREQ As Double = (1.0 / 10.0)
2548+
Const MAX_VELOCITY_FREQ As Double = (1.0 / 2500.0)
25492549

2550-
Dim mNow As Date = Now
2550+
Dim iNowTicks As Long = ClassHighPrecisionTimer.GetTicks()
25512551

25522552
' Linear Velocity
25532553
If (True) Then
2554-
Dim mDelta As TimeSpan = (mNow - mData.mLastPositionTime)
2555-
Dim iDeltaTime As Double = mDelta.TotalSeconds
2554+
Dim iDeltaTime As Double = ClassHighPrecisionTimer.ElapsedSeconds(iNowTicks, mData.mLastPositionTicks)
25562555

25572556
If (mData.mLastRawPosition <> mRawPosition) Then
2558-
mData.mLastPositionTime = mNow
2557+
mData.mLastPositionTicks = iNowTicks
25592558

25602559
mData.mNormalizedPositionDelta.Enqueue(iDeltaTime)
25612560
If (mData.mNormalizedPositionDelta.Count > 30) Then
@@ -2569,22 +2568,21 @@ Public Class UCVirtualMotionTrackerItem
25692568

25702569
If (mData.iVelocityPositionDelta > Double.Epsilon AndAlso mData.iVelocityPositionDelta <= MIN_VELOCITY_FREQ AndAlso iDeltaTime <= MIN_VELOCITY_FREQ) Then
25712570
mPosition = New Vector3(
2572-
CSng(mPosition.X - (mVelocityPosition.X * mData.iVelocityPositionDelta)),
2573-
CSng(mPosition.Y - (mVelocityPosition.Y * mData.iVelocityPositionDelta)),
2574-
CSng(mPosition.Z - (mVelocityPosition.Z * mData.iVelocityPositionDelta))
2575-
)
2571+
CSng(mPosition.X - (mVelocityPosition.X * mData.iVelocityPositionDelta)),
2572+
CSng(mPosition.Y - (mVelocityPosition.Y * mData.iVelocityPositionDelta)),
2573+
CSng(mPosition.Z - (mVelocityPosition.Z * mData.iVelocityPositionDelta))
2574+
)
25762575
Else
25772576
mVelocityPosition = Vector3.Zero
25782577
End If
25792578
End If
25802579

25812580
' Angular Velocity
25822581
If (True) Then
2583-
Dim mDelta As TimeSpan = (mNow - mData.mLastOrientationTime)
2584-
Dim iDeltaTime As Double = mDelta.TotalSeconds
2582+
Dim iDeltaTime As Double = ClassHighPrecisionTimer.ElapsedSeconds(iNowTicks, mData.mLastOrientationTicks)
25852583

25862584
If (mData.mLastRawOrientation <> mRawOrientation) Then
2587-
mData.mLastOrientationTime = mNow
2585+
mData.mLastOrientationTicks = iNowTicks
25882586

25892587
mData.mNormalizedOrientationDelta.Enqueue(iDeltaTime)
25902588
If (mData.mNormalizedOrientationDelta.Count > 30) Then
@@ -2606,17 +2604,20 @@ Public Class UCVirtualMotionTrackerItem
26062604

26072605
Class STRUC_HEPTIC_FEEDBACK_DATA
26082606
Public mRumbleLastTimeSendValid As Boolean
2609-
Public mRumbleLastTimeSend As Date
2607+
Public mRumbleLastTimeSendTicks As Long
26102608

26112609
Public Sub New()
26122610
mRumbleLastTimeSendValid = False
2613-
mRumbleLastTimeSend = Now
2611+
mRumbleLastTimeSendTicks = ClassHighPrecisionTimer.GetTicks()
26142612
End Sub
26152613
End Class
26162614

26172615
Private Sub InternalHepticFeedbackLogic(ByRef bEnableHepticFeedback As Boolean,
26182616
ByRef mServiceClient As ClassServiceClient,
26192617
ByRef mData As STRUC_HEPTIC_FEEDBACK_DATA)
2618+
2619+
Dim iNowTicks As Long = ClassHighPrecisionTimer.GetTicks()
2620+
26202621
If (bEnableHepticFeedback) Then
26212622
Const MAX_RUMBLE_UPODATE_RATE As Single = 33.0F
26222623
Const MAX_PULSE_MICROSECONDS As Single = 5000.0F
@@ -2634,9 +2635,9 @@ Public Class UCVirtualMotionTrackerItem
26342635
Dim bTimoutElapsed As Boolean = True
26352636

26362637
If (mData.mRumbleLastTimeSendValid) Then
2637-
Dim mLastSend As TimeSpan = (Now - mData.mRumbleLastTimeSend)
2638+
Dim iElapsedMs = ClassHighPrecisionTimer.ElapsedMilliseconds(iNowTicks, mData.mRumbleLastTimeSendTicks)
26382639

2639-
bTimoutElapsed = (mLastSend.TotalMilliseconds > MAX_RUMBLE_UPODATE_RATE)
2640+
bTimoutElapsed = (iElapsedMs > MAX_RUMBLE_UPODATE_RATE)
26402641
End If
26412642

26422643
If (bTimoutElapsed) Then
@@ -2658,7 +2659,7 @@ Public Class UCVirtualMotionTrackerItem
26582659

26592660
mServiceClient.SetControllerRumble(g_iIndex, fRumble)
26602661

2661-
mData.mRumbleLastTimeSend = Now
2662+
mData.mRumbleLastTimeSendTicks = iNowTicks
26622663
mData.mRumbleLastTimeSendValid = True
26632664

26642665
SyncLock g_mThreadLock

0 commit comments

Comments
 (0)