I messed up the merge, so pushing it over to another repo so I don't lose it. Will tidy up and remove later
Dependencies: BufferedSerial FatFileSystemCpp mbed
frameRates.cpp@9:7214e3c3e5f8, 2021-02-18 (annotated)
- Committer:
- AndyA
- Date:
- Thu Feb 18 18:15:48 2021 +0000
- Revision:
- 9:7214e3c3e5f8
- Parent:
- 0:97661408d0f9
- Child:
- 22:0dd9c1b5664a
massive ripup and redesign; currently has file system build errors
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AndyA | 0:97661408d0f9 | 1 | #include "LTCApp.h" |
AndyA | 0:97661408d0f9 | 2 | |
AndyA | 9:7214e3c3e5f8 | 3 | |
AndyA | 9:7214e3c3e5f8 | 4 | |
AndyA | 9:7214e3c3e5f8 | 5 | const float FrameRates[] = {0, 23.976, 24, 25, 29.97, 30, |
AndyA | 9:7214e3c3e5f8 | 6 | 47.95, 48, 50, 59.94, 60, 10000000 |
AndyA | 9:7214e3c3e5f8 | 7 | }; |
AndyA | 9:7214e3c3e5f8 | 8 | const double FramePeriods[] = {1000000, 1000000 / 23.976, 1000000 / 24, |
AndyA | 9:7214e3c3e5f8 | 9 | 1000000 / 25, 1000000 / 29.97, 1000000 / 30, |
AndyA | 9:7214e3c3e5f8 | 10 | 1000000 / 47.95, 1000000 / 48, 1000000 / 50, |
AndyA | 9:7214e3c3e5f8 | 11 | 1000000 / 59.94, 1000000 / 60, 10 |
AndyA | 9:7214e3c3e5f8 | 12 | }; |
AndyA | 9:7214e3c3e5f8 | 13 | const int numberOfRates = 11; |
AndyA | 9:7214e3c3e5f8 | 14 | |
AndyA | 9:7214e3c3e5f8 | 15 | |
AndyA | 0:97661408d0f9 | 16 | frameRates::frameRates() { |
AndyA | 0:97661408d0f9 | 17 | setRate(1); |
AndyA | 0:97661408d0f9 | 18 | } |
AndyA | 0:97661408d0f9 | 19 | |
AndyA | 0:97661408d0f9 | 20 | void frameRates::setRate(int index) { |
AndyA | 0:97661408d0f9 | 21 | _currentRate = frameRateInfo::FrameRates[index]; |
AndyA | 0:97661408d0f9 | 22 | _currentPeriod = frameRateInfo::FramePeriods[index]; |
AndyA | 0:97661408d0f9 | 23 | _currentIndex = index; |
AndyA | 0:97661408d0f9 | 24 | TimeSinceLastFrameWrap = frameRateInfo::FramePeriods[index]; |
AndyA | 0:97661408d0f9 | 25 | } |
AndyA | 0:97661408d0f9 | 26 | |
AndyA | 0:97661408d0f9 | 27 | bool frameRates::isSyncable() { |
AndyA | 0:97661408d0f9 | 28 | if (_currentIndex < 2) // 0 or 1 |
AndyA | 0:97661408d0f9 | 29 | return false; |
AndyA | 0:97661408d0f9 | 30 | if (((_currentIndex == 4) || (_currentIndex == 9)) && !_currentDrop) |
AndyA | 0:97661408d0f9 | 31 | return false; |
AndyA | 0:97661408d0f9 | 32 | return true; |
AndyA | 0:97661408d0f9 | 33 | } |
AndyA | 0:97661408d0f9 | 34 | |
AndyA | 0:97661408d0f9 | 35 | |
AndyA | 0:97661408d0f9 | 36 | const char *frameRates::frameRateString() { |
AndyA | 0:97661408d0f9 | 37 | switch (_currentIndex) { |
AndyA | 0:97661408d0f9 | 38 | case 0: |
AndyA | 0:97661408d0f9 | 39 | default: |
AndyA | 0:97661408d0f9 | 40 | return "Unknown"; |
AndyA | 0:97661408d0f9 | 41 | case 1: |
AndyA | 0:97661408d0f9 | 42 | return "23.976"; |
AndyA | 0:97661408d0f9 | 43 | case 2: |
AndyA | 0:97661408d0f9 | 44 | return "24"; |
AndyA | 0:97661408d0f9 | 45 | case 3: |
AndyA | 0:97661408d0f9 | 46 | return "25"; |
AndyA | 0:97661408d0f9 | 47 | case 4: |
AndyA | 0:97661408d0f9 | 48 | return _currentDrop ? "29.97 Drop" : "29.97"; |
AndyA | 0:97661408d0f9 | 49 | case 5: |
AndyA | 0:97661408d0f9 | 50 | return "30"; |
AndyA | 0:97661408d0f9 | 51 | case 6: |
AndyA | 0:97661408d0f9 | 52 | return "47.95"; |
AndyA | 0:97661408d0f9 | 53 | case 7: |
AndyA | 0:97661408d0f9 | 54 | return "48"; |
AndyA | 0:97661408d0f9 | 55 | case 8: |
AndyA | 0:97661408d0f9 | 56 | return "50"; |
AndyA | 0:97661408d0f9 | 57 | case 9: |
AndyA | 0:97661408d0f9 | 58 | return _currentDrop ? "59.94 Drop" : "59.94"; |
AndyA | 0:97661408d0f9 | 59 | case 10: |
AndyA | 0:97661408d0f9 | 60 | return "60"; |
AndyA | 0:97661408d0f9 | 61 | } |
AndyA | 0:97661408d0f9 | 62 | } |
AndyA | 0:97661408d0f9 | 63 | |
AndyA | 0:97661408d0f9 | 64 | |
AndyA | 0:97661408d0f9 | 65 | long frameRates::getOffsetFromSecondStart(int minutes, int seconds, int frame, |
AndyA | 0:97661408d0f9 | 66 | int rateIndex, bool frameDrop){ |
AndyA | 0:97661408d0f9 | 67 | if (!frameDrop) { |
AndyA | 0:97661408d0f9 | 68 | return frameRateInfo::FramePeriods[rateIndex] * |
AndyA | 0:97661408d0f9 | 69 | frame; // for non frame drops all second starts are perfect |
AndyA | 0:97661408d0f9 | 70 | // not true for non-integer rates but for non-drop versions we |
AndyA | 0:97661408d0f9 | 71 | // don't try to sync to those. |
AndyA | 0:97661408d0f9 | 72 | } else { |
AndyA | 0:97661408d0f9 | 73 | int MinutesSinceLastSync = minutes % 10; |
AndyA | 0:97661408d0f9 | 74 | const int framesPerMinute = 30 * 59 + 28; |
AndyA | 0:97661408d0f9 | 75 | |
AndyA | 0:97661408d0f9 | 76 | double indicatedTimeSinceLastSync = |
AndyA | 0:97661408d0f9 | 77 | (MinutesSinceLastSync * framesPerMinute + seconds * 30 + frame) * |
AndyA | 0:97661408d0f9 | 78 | frameRateInfo::FramePeriods[rateIndex]; |
AndyA | 0:97661408d0f9 | 79 | double framesMismatch = |
AndyA | 0:97661408d0f9 | 80 | (MinutesSinceLastSync * framesPerMinute + seconds * 30) - |
AndyA | 0:97661408d0f9 | 81 | (frameRateInfo::FrameRates[rateIndex] * (MinutesSinceLastSync * 60 + seconds)); |
AndyA | 0:97661408d0f9 | 82 | double timeErrorAtSecondStart = framesMismatch * frameRateInfo::FramePeriods[rateIndex]; |
AndyA | 0:97661408d0f9 | 83 | double timeThisSecond = frame * frameRateInfo::FramePeriods[rateIndex]; |
AndyA | 0:97661408d0f9 | 84 | return (long)(timeThisSecond + timeErrorAtSecondStart + 0.5); |
AndyA | 0:97661408d0f9 | 85 | } |
AndyA | 0:97661408d0f9 | 86 | } |
AndyA | 0:97661408d0f9 | 87 | |
AndyA | 0:97661408d0f9 | 88 | long frameRates::getOffsetFromSecondStart(int minutes, int seconds, int frame){ |
AndyA | 0:97661408d0f9 | 89 | if (!_currentDrop) { |
AndyA | 0:97661408d0f9 | 90 | return _currentPeriod * frame; // for non frame drops all second starts are perfect |
AndyA | 0:97661408d0f9 | 91 | // not true for non-integer rates but for non-drop versions we |
AndyA | 0:97661408d0f9 | 92 | // don't try to sync to those. |
AndyA | 0:97661408d0f9 | 93 | } else { |
AndyA | 0:97661408d0f9 | 94 | int MinutesSinceLastSync = minutes % 10; |
AndyA | 0:97661408d0f9 | 95 | const int framesPerMinute = 30 * 59 + 28; |
AndyA | 0:97661408d0f9 | 96 | |
AndyA | 0:97661408d0f9 | 97 | double indicatedTimeSinceLastSync = |
AndyA | 0:97661408d0f9 | 98 | (MinutesSinceLastSync * framesPerMinute + seconds * 30 + frame) * _currentPeriod; |
AndyA | 0:97661408d0f9 | 99 | double framesMismatch = |
AndyA | 0:97661408d0f9 | 100 | (MinutesSinceLastSync * framesPerMinute + seconds * 30) - (_currentRate * (MinutesSinceLastSync * 60 + seconds)); |
AndyA | 0:97661408d0f9 | 101 | double timeErrorAtSecondStart = framesMismatch * _currentPeriod; |
AndyA | 0:97661408d0f9 | 102 | double timeThisSecond = frame * _currentPeriod; |
AndyA | 0:97661408d0f9 | 103 | return (long)(timeThisSecond + timeErrorAtSecondStart + 0.5); |
AndyA | 0:97661408d0f9 | 104 | } |
AndyA | 0:97661408d0f9 | 105 | } |
AndyA | 0:97661408d0f9 | 106 | |
AndyA | 9:7214e3c3e5f8 | 107 | int frameRates::getClosestRate(long int framePeriodUS) |
AndyA | 9:7214e3c3e5f8 | 108 | { |
AndyA | 9:7214e3c3e5f8 | 109 | int indexOver = 1; |
AndyA | 9:7214e3c3e5f8 | 110 | while (framePeriodUS <= frameRateInfo::FramePeriods[indexOver]) |
AndyA | 9:7214e3c3e5f8 | 111 | indexOver++; |
AndyA | 9:7214e3c3e5f8 | 112 | float amountOver = framePeriodUS - frameRateInfo::FramePeriods[indexOver]; |
AndyA | 9:7214e3c3e5f8 | 113 | float amountUnder = frameRateInfo::FramePeriods[indexOver - 1] - framePeriodUS; |
AndyA | 9:7214e3c3e5f8 | 114 | if (amountOver > amountUnder) |
AndyA | 9:7214e3c3e5f8 | 115 | indexOver--; |
AndyA | 9:7214e3c3e5f8 | 116 | return (int)(FrameRates[indexOver]+0.5); |
AndyA | 9:7214e3c3e5f8 | 117 | } |
AndyA | 9:7214e3c3e5f8 | 118 |