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:
Thu Feb 18 18:15:48 2021 +0000
Revision:
9:7214e3c3e5f8
Parent:
1:dd1f7e162f91
Child:
10:053bac3e326b
massive ripup and redesign; currently has file system build errors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:97661408d0f9 1 #include "LTCDecode.h"
AndyA 0:97661408d0f9 2
AndyA 9:7214e3c3e5f8 3
AndyA 9:7214e3c3e5f8 4 const uint32_t minBitPeriodUS =
AndyA 9:7214e3c3e5f8 5 (uint32_t)((1000000.0f / 2400) / 1.1f); // allow for 10% time error
AndyA 9:7214e3c3e5f8 6 const uint32_t maxMidSymbolTimeUS = (uint32_t)(
AndyA 9:7214e3c3e5f8 7 ((1000000.0f / (1920 * 2))) * 1.1f); // allow for 10% time error
AndyA 0:97661408d0f9 8
AndyA 0:97661408d0f9 9
AndyA 1:dd1f7e162f91 10 LTCDecode::LTCDecode(const PinName pin) : _LTCIn(pin)
AndyA 1:dd1f7e162f91 11 {
AndyA 1:dd1f7e162f91 12 LTCsynced = false;
AndyA 9:7214e3c3e5f8 13 inputTimer.reset();
AndyA 9:7214e3c3e5f8 14 inputTimer.start();
AndyA 9:7214e3c3e5f8 15 FrameCallback = NULL;
AndyA 0:97661408d0f9 16 }
AndyA 0:97661408d0f9 17
AndyA 9:7214e3c3e5f8 18 void LTCDecode::enable(bool enable)
AndyA 1:dd1f7e162f91 19 {
AndyA 9:7214e3c3e5f8 20 LTCsynced = false;
AndyA 9:7214e3c3e5f8 21 if (enable) {
AndyA 9:7214e3c3e5f8 22 inputTimer.start();
AndyA 9:7214e3c3e5f8 23 inputTimer.reset();
AndyA 9:7214e3c3e5f8 24 _LTCIn.fall(callback(this, &LTCDecode::LTCOnEdge));
AndyA 9:7214e3c3e5f8 25 _LTCIn.rise(callback(this, &LTCDecode::LTCOnEdge));
AndyA 9:7214e3c3e5f8 26 } else {
AndyA 9:7214e3c3e5f8 27 inputTimer.stop();
AndyA 9:7214e3c3e5f8 28 _LTCIn.fall(NULL);
AndyA 9:7214e3c3e5f8 29 _LTCIn.rise(NULL);
AndyA 9:7214e3c3e5f8 30 }
AndyA 0:97661408d0f9 31 }
AndyA 0:97661408d0f9 32
AndyA 1:dd1f7e162f91 33 void LTCDecode::LTCOnEdge()
AndyA 1:dd1f7e162f91 34 {
AndyA 9:7214e3c3e5f8 35 uint32_t transitionTime = inputTimer.read_us();
AndyA 1:dd1f7e162f91 36 uint32_t period = (transitionTime - lastTransition);
AndyA 1:dd1f7e162f91 37 lastTransition = transitionTime;
AndyA 9:7214e3c3e5f8 38 bool gotSync = false;
AndyA 9:7214e3c3e5f8 39
AndyA 9:7214e3c3e5f8 40 if (period > maxMidSymbolTimeUS) { // time since last transition is > maximum time for
AndyA 1:dd1f7e162f91 41 // a 1, must be a zero and start of the next bit.
AndyA 1:dd1f7e162f91 42 // printf("Z");
AndyA 1:dd1f7e162f91 43 lastBitStart = transitionTime;
AndyA 9:7214e3c3e5f8 44 addBitToBuffer(false); // can't be an end of frame, they must end on a 1
AndyA 1:dd1f7e162f91 45 return;
AndyA 0:97661408d0f9 46 }
AndyA 9:7214e3c3e5f8 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 lastBitStart = transitionTime;
AndyA 9:7214e3c3e5f8 51 gotSync = addBitToBuffer(false); // can't be an end of frame, they must end on a 1
AndyA 9:7214e3c3e5f8 52 if (gotSync) {
AndyA 9:7214e3c3e5f8 53 LTCsynced = true;
AndyA 9:7214e3c3e5f8 54 decodeTime();
AndyA 9:7214e3c3e5f8 55 if (FrameCallback)
AndyA 9:7214e3c3e5f8 56 FrameCallback.call();
AndyA 9:7214e3c3e5f8 57 }
AndyA 1:dd1f7e162f91 58 }
AndyA 0:97661408d0f9 59 }
AndyA 0:97661408d0f9 60
AndyA 9:7214e3c3e5f8 61 // add a bit. Return true if we got the end of frame pattern
AndyA 9:7214e3c3e5f8 62 bool LTCDecode::addBitToBuffer(bool bit)
AndyA 1:dd1f7e162f91 63 {
AndyA 9:7214e3c3e5f8 64 LTCBuffer[0] = LTCBuffer[0]>> 1;
AndyA 9:7214e3c3e5f8 65 if (LTCBuffer[1] &= 0x01)
AndyA 9:7214e3c3e5f8 66 LTCBuffer[0] |= 0x80000000;
AndyA 9:7214e3c3e5f8 67
AndyA 9:7214e3c3e5f8 68 LTCBuffer[1] = LTCBuffer[1]>> 1;
AndyA 9:7214e3c3e5f8 69 if (LTCBuffer[2] &= 0x01)
AndyA 9:7214e3c3e5f8 70 LTCBuffer[1] |= 0x80000000;
AndyA 9:7214e3c3e5f8 71
AndyA 9:7214e3c3e5f8 72 LTCBuffer[2] = LTCBuffer[2]>> 1;
AndyA 9:7214e3c3e5f8 73 if (bit)
AndyA 9:7214e3c3e5f8 74 LTCBuffer[2]|= 0x80000000;
AndyA 9:7214e3c3e5f8 75
AndyA 9:7214e3c3e5f8 76 // frame sync patterin is 1011 1111 1111 1100
AndyA 9:7214e3c3e5f8 77 // if it's a valid sync we will have it just received (buffer2 top bits) and the one from the last frame still in the buffer as the low 16 bits of buffer 0.
AndyA 9:7214e3c3e5f8 78 return ((((LTCBuffer[2]>>16) & 0x0000FFFF) == 0xBFFC) && ((LTCBuffer[0] & 0x0000FFFF) == 0xBFFC));
AndyA 1:dd1f7e162f91 79 }
AndyA 0:97661408d0f9 80
AndyA 9:7214e3c3e5f8 81 void LTCDecode::decodeTime()
AndyA 1:dd1f7e162f91 82 {
AndyA 9:7214e3c3e5f8 83 _frame = LTCBuffer[0]>>16 & 0x0f + ((LTCBuffer[0] >> 24) & 0x03) * 10;
AndyA 9:7214e3c3e5f8 84 _seconds = LTCBuffer[1]>>0 & 0x0f + ((LTCBuffer[1] >> 8) & 0x07) * 10;
AndyA 9:7214e3c3e5f8 85 _minutes = LTCBuffer[1]>>16 & 0x0f + ((LTCBuffer[1] >> 24) & 0x07) * 10;
AndyA 9:7214e3c3e5f8 86 _hours = LTCBuffer[2]>>0 & 0x0f + ((LTCBuffer[2] >> 8) & 0x03) * 10;
AndyA 9:7214e3c3e5f8 87 _frameDrop = (LTCBuffer[0] & (1<<26));
AndyA 0:97661408d0f9 88 }