21 #include "AxisVelocityCalculator.h"
22 #include <QtCore/QElapsedTimer>
26 AxisVelocityCalculator::AxisVelocityCalculator(QObject *parent)
27 : AxisVelocityCalculator(SharedTimeSource(new RealTimeSource), parent)
31 AxisVelocityCalculator::AxisVelocityCalculator(
const SharedTimeSource &timeSource,
34 , m_timeSource(timeSource)
35 , m_trackedPosition(0.0)
40 AxisVelocityCalculator::~AxisVelocityCalculator()
44 qreal AxisVelocityCalculator::trackedPosition()
const
46 return m_trackedPosition;
49 void AxisVelocityCalculator::setTrackedPosition(qreal newPosition)
51 processMovement(newPosition - m_trackedPosition);
53 if (newPosition != m_trackedPosition) {
54 m_trackedPosition = newPosition;
55 Q_EMIT trackedPositionChanged(newPosition);
59 void AxisVelocityCalculator::updateIdleTime()
64 void AxisVelocityCalculator::processMovement(qreal movement)
66 if (m_samplesRead == -1) {
67 m_samplesRead = m_samplesWrite;
68 }
else if (m_samplesRead == m_samplesWrite) {
71 m_samplesRead = (m_samplesRead + 1) % MAX_SAMPLES;
74 m_samples[m_samplesWrite].mov = movement;
75 m_samples[m_samplesWrite].time = m_timeSource->msecsSinceReference();
76 m_samplesWrite = (m_samplesWrite + 1) % MAX_SAMPLES;
79 qreal AxisVelocityCalculator::calculate()
81 if (numSamples() < MIN_SAMPLES_NEEDED) {
87 if (m_samplesWrite == 0) {
88 lastIndex = MAX_SAMPLES - 1;
90 lastIndex = m_samplesWrite - 1;
93 qint64 currTime = m_samples[lastIndex].time;
96 qreal totalDistance = 0;
98 int sampleIndex = (m_samplesRead + 1) % MAX_SAMPLES;
99 qint64 previousTime = m_samples[m_samplesRead].time;
100 while (sampleIndex != m_samplesWrite) {
102 if (currTime - m_samples[sampleIndex].time <= AGE_OLDEST_SAMPLE) {
103 int deltaTime = m_samples[sampleIndex].time - previousTime;
104 totalDistance += m_samples[sampleIndex].mov;
105 totalTime += deltaTime;
108 previousTime = m_samples[sampleIndex].time;
109 sampleIndex = (sampleIndex + 1) % MAX_SAMPLES;
112 return totalDistance / totalTime;
115 void AxisVelocityCalculator::reset()
121 int AxisVelocityCalculator::numSamples()
const
123 if (m_samplesRead == -1) {
126 if (m_samplesWrite == 0) {
128 return MAX_SAMPLES - m_samplesRead;
129 }
else if (m_samplesWrite == m_samplesRead) {
131 }
else if (m_samplesWrite < m_samplesRead) {
132 return (MAX_SAMPLES - m_samplesRead) + m_samplesWrite;
134 return m_samplesWrite - m_samplesRead;
139 void AxisVelocityCalculator::setTimeSource(
const SharedTimeSource &timeSource)
141 m_timeSource = timeSource;
143 if (numSamples() > 0) {
144 qWarning(
"AxisVelocityCalculator: changing time source while there are samples present.");