diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 4a6808c69..f67a34bba 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -785,6 +785,13 @@ public String toString() { protected boolean mPastGSRFirstTime=true; // this is to fix a bug with SDLog v0.9 // ---------- GSR end ------------------ + + protected int mCorruptedTimestampSampleCount = 0; + + public int getCorruptedTimestampSampleCount() { + return mCorruptedTimestampSampleCount; + } + public ObjectCluster setLSLTimeIfAvailable(ObjectCluster ojc) { return ojc; @@ -3828,21 +3835,24 @@ protected void retrieveBiophysicalCalibrationParametersFromPacket(byte[] bufferC * @return */ protected double unwrapTimeStamp(double timeStampTicks){ - //first convert to continuous time stamp - double timestampUnwrappedTicks = calculateTimeStampUnwrapped(timeStampTicks); - - //Check if there was a roll-over - if (getLastReceivedTimeStampTicksUnwrapped()>timestampUnwrappedTicks){ - mCurrentTimeStampCycle += 1; - //Recalculate timestamp - timestampUnwrappedTicks = calculateTimeStampUnwrapped(timeStampTicks); - } - - setLastReceivedTimeStampTicksUnwrapped(timestampUnwrappedTicks); - - return timestampUnwrappedTicks; + double expectedTicksPerSample = getRtcClockFreq() / getSamplingRateShimmer(); + double candidateUnwrapped = calculateTimeStampUnwrapped(timeStampTicks); + double delta = candidateUnwrapped - getLastReceivedTimeStampTicksUnwrapped(); + + if (delta < 0) { + boolean looksLikeGenuineWrap = -delta > (mTimeStampTicksMaxValue - (10 * expectedTicksPerSample)); + if (looksLikeGenuineWrap) { + mCurrentTimeStampCycle += 1; + candidateUnwrapped = calculateTimeStampUnwrapped(timeStampTicks); + } else { + candidateUnwrapped = getLastReceivedTimeStampTicksUnwrapped() + expectedTicksPerSample; + mCorruptedTimestampSampleCount++; + } + } + setLastReceivedTimeStampTicksUnwrapped(candidateUnwrapped); + return candidateUnwrapped; } - + private double calculateTimeStampUnwrapped(double timeStampTicks) { return timeStampTicks+(mTimeStampTicksMaxValue*mCurrentTimeStampCycle); } diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/SensorShimmerClock.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/SensorShimmerClock.java index 604703d60..f651565a6 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/SensorShimmerClock.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/SensorShimmerClock.java @@ -716,19 +716,28 @@ public void parseConfigMap( * @return */ protected double unwrapTimeStamp(double timeStampTicks){ - //first convert to continuous time stamp - double timestampUnwrappedTicks = calculateTimeStampUnwrapped(timeStampTicks); - - //Check if there was a roll-over - if (getLastReceivedTimeStampTicksUnwrapped()>timestampUnwrappedTicks){ - mCurrentTimeStampCycle += 1; - //Recalculate timestamp - timestampUnwrappedTicks = calculateTimeStampUnwrapped(timeStampTicks); - } - - setLastReceivedTimeStampTicksUnwrapped(timestampUnwrappedTicks); + double expectedTicksPerSample = mShimmerDevice.getRtcClockFreq() / mShimmerDevice.getSamplingRateShimmer(); + double candidateUnwrapped = calculateTimeStampUnwrapped(timeStampTicks); + double delta = candidateUnwrapped - getLastReceivedTimeStampTicksUnwrapped(); + + if (delta < 0) { + boolean looksLikeGenuineWrap = -delta > (mTimeStampTicksMaxValue - (10 * expectedTicksPerSample)); + if (looksLikeGenuineWrap) { + mCurrentTimeStampCycle += 1; + candidateUnwrapped = calculateTimeStampUnwrapped(timeStampTicks); + } else { + candidateUnwrapped = getLastReceivedTimeStampTicksUnwrapped() + expectedTicksPerSample; + mCorruptedTimestampSampleCount++; + } + } + setLastReceivedTimeStampTicksUnwrapped(candidateUnwrapped); + return candidateUnwrapped; + } + + protected int mCorruptedTimestampSampleCount = 0; - return timestampUnwrappedTicks; + public int getCorruptedTimestampSampleCount() { + return mCorruptedTimestampSampleCount; } private double calculateTimeStampUnwrapped(double timeStampTicks) {