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

Committer:
AndyA
Date:
Mon Jul 05 15:30:14 2021 +0000
Revision:
22:0dd9c1b5664a
Parent:
9:7214e3c3e5f8
Child:
84:8094a1e64ecf
First pass at adding UDP FreeD output

Who changed what in which revision?

UserRevisionLine numberNew 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 22:0dd9c1b5664a 8 //const double FramePeriods[] = {1000000, 1000000 / 23.976, 1000000 / 24,
AndyA 22:0dd9c1b5664a 9 // 1000000 / 25, 1000000 / 29.97, 1000000 / 30,
AndyA 22:0dd9c1b5664a 10 // 1000000 / 47.95, 1000000 / 48, 1000000 / 50,
AndyA 22:0dd9c1b5664a 11 // 1000000 / 59.94, 1000000 / 60, 10
AndyA 22:0dd9c1b5664a 12 // };
AndyA 22:0dd9c1b5664a 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 22:0dd9c1b5664a 76 // double indicatedTimeSinceLastSync =
AndyA 22:0dd9c1b5664a 77 // (MinutesSinceLastSync * framesPerMinute + seconds * 30 + frame) *
AndyA 22:0dd9c1b5664a 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 22:0dd9c1b5664a 97 // double indicatedTimeSinceLastSync =
AndyA 22:0dd9c1b5664a 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