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
00001 #include "LTCApp.h" 00002 00003 00004 00005 const float FrameRates[] = {0, 23.976, 24, 25, 29.97, 30, 00006 47.95, 48, 50, 59.94, 60, 10000000 00007 }; 00008 //const double FramePeriods[] = {1000000, 1000000 / 23.976, 1000000 / 24, 00009 // 1000000 / 25, 1000000 / 29.97, 1000000 / 30, 00010 // 1000000 / 47.95, 1000000 / 48, 1000000 / 50, 00011 // 1000000 / 59.94, 1000000 / 60, 10 00012 // }; 00013 //const int numberOfRates = 11; 00014 00015 00016 frameRates::frameRates() { 00017 setRate(1); 00018 } 00019 00020 void frameRates::setRate(int index) { 00021 _currentRate = frameRateInfo::FrameRates[index]; 00022 _currentPeriod = frameRateInfo::FramePeriods[index]; 00023 _currentIndex = index; 00024 TimeSinceLastFrameWrap = frameRateInfo::FramePeriods[index]; 00025 } 00026 00027 bool frameRates::isSyncable() { 00028 if (_currentIndex < 2) // 0 or 1 00029 return false; 00030 if (((_currentIndex == 4) || (_currentIndex == 9)) && !_currentDrop) 00031 return false; 00032 return true; 00033 } 00034 00035 00036 const char *frameRates::frameRateString() { 00037 switch (_currentIndex) { 00038 case 0: 00039 default: 00040 return "Unknown"; 00041 case 1: 00042 return "23.976"; 00043 case 2: 00044 return "24"; 00045 case 3: 00046 return "25"; 00047 case 4: 00048 return _currentDrop ? "29.97 Drop" : "29.97"; 00049 case 5: 00050 return "30"; 00051 case 6: 00052 return "47.95"; 00053 case 7: 00054 return "48"; 00055 case 8: 00056 return "50"; 00057 case 9: 00058 return _currentDrop ? "59.94 Drop" : "59.94"; 00059 case 10: 00060 return "60"; 00061 } 00062 } 00063 00064 00065 long frameRates::getOffsetFromSecondStart(int minutes, int seconds, int frame, 00066 int rateIndex, bool frameDrop){ 00067 if (!frameDrop) { 00068 return frameRateInfo::FramePeriods[rateIndex] * 00069 frame; // for non frame drops all second starts are perfect 00070 // not true for non-integer rates but for non-drop versions we 00071 // don't try to sync to those. 00072 } else { 00073 int MinutesSinceLastSync = minutes % 10; 00074 const int framesPerMinute = 30 * 59 + 28; 00075 00076 // double indicatedTimeSinceLastSync = 00077 // (MinutesSinceLastSync * framesPerMinute + seconds * 30 + frame) * 00078 // frameRateInfo::FramePeriods[rateIndex]; 00079 double framesMismatch = 00080 (MinutesSinceLastSync * framesPerMinute + seconds * 30) - 00081 (frameRateInfo::FrameRates[rateIndex] * (MinutesSinceLastSync * 60 + seconds)); 00082 double timeErrorAtSecondStart = framesMismatch * frameRateInfo::FramePeriods[rateIndex]; 00083 double timeThisSecond = frame * frameRateInfo::FramePeriods[rateIndex]; 00084 return (long)(timeThisSecond + timeErrorAtSecondStart + 0.5); 00085 } 00086 } 00087 00088 long frameRates::getOffsetFromSecondStart(int minutes, int seconds, int frame){ 00089 if (!_currentDrop) { 00090 return _currentPeriod * frame; // for non frame drops all second starts are perfect 00091 // not true for non-integer rates but for non-drop versions we 00092 // don't try to sync to those. 00093 } else { 00094 int MinutesSinceLastSync = minutes % 10; 00095 const int framesPerMinute = 30 * 59 + 28; 00096 00097 // double indicatedTimeSinceLastSync = 00098 // (MinutesSinceLastSync * framesPerMinute + seconds * 30 + frame) * _currentPeriod; 00099 double framesMismatch = 00100 (MinutesSinceLastSync * framesPerMinute + seconds * 30) - (_currentRate * (MinutesSinceLastSync * 60 + seconds)); 00101 double timeErrorAtSecondStart = framesMismatch * _currentPeriod; 00102 double timeThisSecond = frame * _currentPeriod; 00103 return (long)(timeThisSecond + timeErrorAtSecondStart + 0.5); 00104 } 00105 } 00106 00107 int frameRates::getClosestRate(long int framePeriodUS) 00108 { 00109 int indexOver = 1; 00110 while (framePeriodUS <= frameRateInfo::FramePeriods[indexOver]) 00111 indexOver++; 00112 float amountOver = framePeriodUS - frameRateInfo::FramePeriods[indexOver]; 00113 float amountUnder = frameRateInfo::FramePeriods[indexOver - 1] - framePeriodUS; 00114 if (amountOver > amountUnder) 00115 indexOver--; 00116 return (int)(FrameRates[indexOver]+0.5); 00117 } 00118
Generated on Thu Dec 15 2022 06:07:04 by 1.7.2