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
LTCDecode.cpp@1:dd1f7e162f91, 2021-01-15 (annotated)
- 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?
User | Revision | Line number | New 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, <CDecode::LTCOnEdge)); |
AndyA | 1:dd1f7e162f91 | 29 | _LTCIn.rise(callback(this, <CDecode::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 | } |