Mercurial > hg > beaglert
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 */ |
