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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers frameRates.cpp Source File

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