annotate include/VirtualClock.h @ 150:ebbfb154351a ClockSync

Now leveraging BBB's lock between xenomai clock and audio clock for ultra-accurate, low-latency clocking. CAVEAT: fractions of samples drifts will occurr every time the clock is changed
author Giulio Moro <giuliomoro@yahoo.it>
date Tue, 22 Sep 2015 04:09:13 +0100
parents 134bff10e561
children
rev   line source
giuliomoro@135 1 #ifndef VIRTUAL_CLOCK_H_INCLUDED
giuliomoro@135 2 #define VIRTUAL_CLOCK_H_INCLUDED
giuliomoro@135 3
giuliomoro@141 4 #include "math.h"
giuliomoro@135 5 #include "stats.hpp"
giuliomoro@135 6 #include "Clock.h"
giuliomoro@149 7 #include "IirFilter.h"
giuliomoro@149 8 #include "Kalman.h"
giuliomoro@141 9 #ifdef USE_JUCE
giuliomoro@141 10 #else
giuliomoro@141 11 #include <BeagleRT.h>
giuliomoro@150 12 #include <I2c_Codec.h>
giuliomoro@150 13 extern I2c_Codec* gAudioCodec;
giuliomoro@141 14 #endif /* USE_JUCE */
giuliomoro@135 15
giuliomoro@135 16 class VirtualClock{
giuliomoro@135 17 private:
giuliomoro@135 18 myClock_t startTime;
giuliomoro@141 19 myClock_t startTimeOffset;
giuliomoro@149 20 myClock_t lastSyncTime;
giuliomoro@149 21 // myClock_t lastSyncEstimatedTime;
giuliomoro@149 22 double lastSyncEstimatedTime;
giuliomoro@135 23 bool firstRun;
giuliomoro@141 24 double elapsedPeriods;
giuliomoro@141 25 double elapsedPeriodsOffset;
giuliomoro@149 26 double blockPeriod;
giuliomoro@135 27 double period;
giuliomoro@135 28 MovingAverage<double> movingAverage;
giuliomoro@149 29 IirFilter iir;
giuliomoro@149 30 KalmanOne kalman;
giuliomoro@135 31 public:
giuliomoro@149 32 void init(float initialValueUs);
giuliomoro@135 33 VirtualClock();
giuliomoro@135 34 /**
giuliomoro@135 35 Call this method at regular intervals to sync che virtual clock
giuliomoro@135 36 */
giuliomoro@135 37 void sync();
giuliomoro@135 38 /**
giuliomoro@135 39 Call this method asynchronously, passing a number of equally spaced events that have elapsed since the last call.
giuliomoro@135 40 */
giuliomoro@141 41 void sync(double numPeriods);
giuliomoro@135 42 /**
giuliomoro@135 43 Get the current time according to the VirtualClock.
giuliomoro@135 44
giuliomoro@135 45 @return Time elapsed since the first call to sync(), in period units.
giuliomoro@135 46 */
giuliomoro@135 47 double getNow();
giuliomoro@135 48 /**
giuliomoro@135 49 Get the length of the period.
giuliomoro@135 50
giuliomoro@135 51 Get the length of the period (difference between calls to sync() after various filtering operations)
giuliomoro@135 52 */
giuliomoro@135 53 double getPeriod();
giuliomoro@141 54 /**
giuliomoro@141 55 * Add an offset to the number of elapsed periods.
giuliomoro@141 56 *
giuliomoro@141 57 * Add an offset to the number of elapsed periods. It also compensates for the corresponding time offset.
giuliomoro@141 58 */
giuliomoro@141 59 void addOffset(double periodOffset);
giuliomoro@135 60 };
giuliomoro@135 61
giuliomoro@135 62 #endif /* VIRTUAL_CLOCK_H_INCLUDED */