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:
Fri Jan 15 15:44:39 2021 +0000
Revision:
1:dd1f7e162f91
Parent:
0:97661408d0f9
Child:
9:7214e3c3e5f8
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:97661408d0f9 1 #include "LTCDecode.h"
AndyA 0:97661408d0f9 2
AndyA 0:97661408d0f9 3 const float FrameRates[] = {0, 23.976, 24, 25, 29.97, 30,
AndyA 1:dd1f7e162f91 4 47.95, 48, 50, 59.94, 60, 10000000
AndyA 1:dd1f7e162f91 5 };
AndyA 0:97661408d0f9 6 const double FramePeriods[] = {1000000, 1000000 / 23.976, 1000000 / 24,
AndyA 1:dd1f7e162f91 7 1000000 / 25, 1000000 / 29.97, 1000000 / 30,
AndyA 1:dd1f7e162f91 8 1000000 / 47.95, 1000000 / 48, 1000000 / 50,
AndyA 1:dd1f7e162f91 9 1000000 / 59.94, 1000000 / 60, 10
AndyA 1:dd1f7e162f91 10 };
AndyA 0:97661408d0f9 11 const int numberOfRates = 11;
AndyA 0:97661408d0f9 12
AndyA 0:97661408d0f9 13
AndyA 1:dd1f7e162f91 14 LTCDecode::LTCDecode(const PinName pin) : _LTCIn(pin)
AndyA 1:dd1f7e162f91 15 {
AndyA 1:dd1f7e162f91 16 LTCsynced = false;
AndyA 1:dd1f7e162f91 17 newBitsWrite = 0;
AndyA 1:dd1f7e162f91 18 bitCounter = 0;
AndyA 1:dd1f7e162f91 19 dwordCounter = 0;
AndyA 1:dd1f7e162f91 20 newBitsRead = 0;
AndyA 1:dd1f7e162f91 21 markCount = 0;
AndyA 0:97661408d0f9 22
AndyA 0:97661408d0f9 23 }
AndyA 0:97661408d0f9 24
AndyA 1:dd1f7e162f91 25 void LTCDecode::setInputTimer(Timer *inputTimer)
AndyA 1:dd1f7e162f91 26 {
AndyA 1:dd1f7e162f91 27 _inputTimer = inputTimer;
AndyA 1:dd1f7e162f91 28 _LTCIn.fall(callback(this, &LTCDecode::LTCOnEdge));
AndyA 1:dd1f7e162f91 29 _LTCIn.rise(callback(this, &LTCDecode::LTCOnEdge));
AndyA 0:97661408d0f9 30 }
AndyA 0:97661408d0f9 31
AndyA 1:dd1f7e162f91 32 void LTCDecode::LTCOnEdge()
AndyA 1:dd1f7e162f91 33 {
AndyA 1:dd1f7e162f91 34 uint32_t transitionTime = _inputTimer->read_us();
AndyA 1:dd1f7e162f91 35 uint32_t period = (transitionTime - lastTransition);
AndyA 1:dd1f7e162f91 36 lastTransition = transitionTime;
AndyA 1:dd1f7e162f91 37 if (period >
AndyA 1:dd1f7e162f91 38 maxMidSymbolTimeUS) { // time since last transition is > maximum time for
AndyA 1:dd1f7e162f91 39 // a 1, must be a zero and start of the next bit.
AndyA 1:dd1f7e162f91 40 // printf("Z");
AndyA 1:dd1f7e162f91 41 bitTimes[newBitsWrite] = lastBitStart;
AndyA 1:dd1f7e162f91 42 lastBitStart = transitionTime;
AndyA 1:dd1f7e162f91 43 newBitBuffer[newBitsWrite++] = false;
AndyA 1:dd1f7e162f91 44 if (newBitsWrite == _newBitBufferSize_)
AndyA 1:dd1f7e162f91 45 newBitsWrite = 0;
AndyA 1:dd1f7e162f91 46 return;
AndyA 0:97661408d0f9 47 }
AndyA 1:dd1f7e162f91 48 // if it's not a 0 it must be a 1 but are we at the end of the bit yet?
AndyA 1:dd1f7e162f91 49 if ((transitionTime - lastBitStart)> minBitPeriodUS) { // end of a bit
AndyA 1:dd1f7e162f91 50 // printf("N");
AndyA 1:dd1f7e162f91 51 bitTimes[newBitsWrite] = lastBitStart;
AndyA 1:dd1f7e162f91 52 lastBitStart = transitionTime;
AndyA 1:dd1f7e162f91 53 newBitBuffer[newBitsWrite++] = true;
AndyA 1:dd1f7e162f91 54 if (newBitsWrite == _newBitBufferSize_)
AndyA 1:dd1f7e162f91 55 newBitsWrite = 0;
AndyA 1:dd1f7e162f91 56 return;
AndyA 1:dd1f7e162f91 57 }
AndyA 0:97661408d0f9 58 }
AndyA 0:97661408d0f9 59
AndyA 1:dd1f7e162f91 60 bool LTCDecode::searchForSync()
AndyA 1:dd1f7e162f91 61 {
AndyA 1:dd1f7e162f91 62 while (!LTCsynced && (newBitsRead != newBitsWrite)) {
AndyA 1:dd1f7e162f91 63 LTCBuffer[0] = LTCBuffer[0] << 1;
AndyA 1:dd1f7e162f91 64 if (newBitBuffer[newBitsRead++])
AndyA 1:dd1f7e162f91 65 LTCBuffer[0] |= 0x01;
AndyA 1:dd1f7e162f91 66 if (_newBitBufferSize_ == newBitsRead)
AndyA 1:dd1f7e162f91 67 newBitsRead = 0;
AndyA 1:dd1f7e162f91 68 if ((LTCBuffer[0] & 0x0000FFFF) == 0x3FFD) {
AndyA 1:dd1f7e162f91 69 LTCsynced = true;
AndyA 1:dd1f7e162f91 70 memset(LTCBuffer, 0, 3 * sizeof(uint32_t));
AndyA 1:dd1f7e162f91 71 }
AndyA 1:dd1f7e162f91 72 }
AndyA 1:dd1f7e162f91 73 return LTCsynced;
AndyA 1:dd1f7e162f91 74 }
AndyA 0:97661408d0f9 75
AndyA 1:dd1f7e162f91 76 bool LTCDecode::readWaitingData()
AndyA 1:dd1f7e162f91 77 {
AndyA 1:dd1f7e162f91 78 while (newBitsRead != newBitsWrite) {
AndyA 1:dd1f7e162f91 79 timeOfBit = bitTimes[newBitsRead];
AndyA 0:97661408d0f9 80
AndyA 1:dd1f7e162f91 81 if ((bitCounter == 0) && (dwordCounter == 0))
AndyA 1:dd1f7e162f91 82 frameStartTime = timeOfBit;
AndyA 1:dd1f7e162f91 83
AndyA 1:dd1f7e162f91 84 if (newBitBuffer[newBitsRead++])
AndyA 1:dd1f7e162f91 85 LTCBuffer[dwordCounter] |= (1 << bitCounter);
AndyA 1:dd1f7e162f91 86
AndyA 1:dd1f7e162f91 87 if (_newBitBufferSize_ == newBitsRead)
AndyA 1:dd1f7e162f91 88 newBitsRead = 0;
AndyA 0:97661408d0f9 89
AndyA 1:dd1f7e162f91 90 bitCounter++;
AndyA 1:dd1f7e162f91 91 if (32 == bitCounter) {
AndyA 1:dd1f7e162f91 92 dwordCounter++;
AndyA 1:dd1f7e162f91 93 bitCounter = 0;
AndyA 1:dd1f7e162f91 94 }
AndyA 1:dd1f7e162f91 95
AndyA 1:dd1f7e162f91 96 if ((2 == dwordCounter) && (16 == bitCounter)) {
AndyA 1:dd1f7e162f91 97 bitCounter = 0;
AndyA 1:dd1f7e162f91 98 dwordCounter = 0;
AndyA 1:dd1f7e162f91 99 if ((LTCBuffer[2] & 0xFFFF) != 0xBFFC) {
AndyA 1:dd1f7e162f91 100 LTCsynced = false;
AndyA 1:dd1f7e162f91 101 return true;
AndyA 1:dd1f7e162f91 102 } else {
AndyA 1:dd1f7e162f91 103 lastFrame.frame = LTCBuffer[0] & 0xf;
AndyA 1:dd1f7e162f91 104 lastFrame.frame += ((LTCBuffer[0] >> 8) & 0x3) * 10;
AndyA 1:dd1f7e162f91 105 lastFrame.seconds = (LTCBuffer[0] >> 16) & 0xf;
AndyA 1:dd1f7e162f91 106 lastFrame.seconds += ((LTCBuffer[0] >> 24) & 0x7) * 10;
AndyA 1:dd1f7e162f91 107 lastFrame.minutes = LTCBuffer[1] & 0xf;
AndyA 1:dd1f7e162f91 108 lastFrame.minutes += ((LTCBuffer[1] >> 8) & 0x7) * 10;
AndyA 1:dd1f7e162f91 109 lastFrame.hours = (LTCBuffer[1] >> 16) & 0xf;
AndyA 1:dd1f7e162f91 110 lastFrame.hours += ((LTCBuffer[1] >> 24) & 0x3) * 10;
AndyA 1:dd1f7e162f91 111 lastFrame.frameDrop = (LTCBuffer[0] & (1 << 10)) == (1 << 10);
AndyA 1:dd1f7e162f91 112 lastFrame.frameStartTime = frameStartTime;
AndyA 1:dd1f7e162f91 113 memset(LTCBuffer, 0, 3 * sizeof(uint32_t));
AndyA 1:dd1f7e162f91 114 return true;
AndyA 1:dd1f7e162f91 115 }
AndyA 1:dd1f7e162f91 116 }
AndyA 0:97661408d0f9 117 }
AndyA 1:dd1f7e162f91 118 return false;
AndyA 0:97661408d0f9 119 }