@@ -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