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:
JamieB
Date:
Thu Dec 15 06:05:30 2022 +0000
Revision:
85:0cc5931bb9ef
Parent:
10:053bac3e326b
Push to somewhere else due to merge issue

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 10:053bac3e326b 1 #include "LTCApp.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 10:053bac3e326b 41 // a 1, must be a zero and start of the next bit.
AndyA 1:dd1f7e162f91 42 lastBitStart = transitionTime;
AndyA 10:053bac3e326b 43 addBitToBuffer(false);
AndyA 10:053bac3e326b 44 return;// can't be an end of frame, they must end on a 1
AndyA 0:97661408d0f9 45 }
AndyA 9:7214e3c3e5f8 46
AndyA 1:dd1f7e162f91 47 // if it's not a 0 it must be a 1 but are we at the end of the bit yet?
AndyA 1:dd1f7e162f91 48 if ((transitionTime - lastBitStart)> minBitPeriodUS) { // end of a bit
AndyA 1:dd1f7e162f91 49 lastBitStart = transitionTime;
AndyA 10:053bac3e326b 50 gotSync = addBitToBuffer(true);
AndyA 9:7214e3c3e5f8 51 if (gotSync) {
AndyA 9:7214e3c3e5f8 52 LTCsynced = true;
AndyA 9:7214e3c3e5f8 53 decodeTime();
AndyA 9:7214e3c3e5f8 54 if (FrameCallback)
AndyA 9:7214e3c3e5f8 55 FrameCallback.call();
AndyA 9:7214e3c3e5f8 56 }
AndyA 1:dd1f7e162f91 57 }
AndyA 0:97661408d0f9 58 }
AndyA 0:97661408d0f9 59
AndyA 9:7214e3c3e5f8 60 // add a bit. Return true if we got the end of frame pattern
AndyA 9:7214e3c3e5f8 61 bool LTCDecode::addBitToBuffer(bool bit)
AndyA 1:dd1f7e162f91 62 {
AndyA 10:053bac3e326b 63 LTCBuffer[0] = LTCBuffer[0]>>1;
AndyA 10:053bac3e326b 64 if (LTCBuffer[1] & 0x01)
AndyA 9:7214e3c3e5f8 65 LTCBuffer[0] |= 0x80000000;
AndyA 9:7214e3c3e5f8 66
AndyA 10:053bac3e326b 67 LTCBuffer[1] = LTCBuffer[1]>>1;
AndyA 10:053bac3e326b 68 if (LTCBuffer[2] & 0x01)
AndyA 9:7214e3c3e5f8 69 LTCBuffer[1] |= 0x80000000;
AndyA 9:7214e3c3e5f8 70
AndyA 10:053bac3e326b 71 LTCBuffer[2] = LTCBuffer[2]>>1;
AndyA 9:7214e3c3e5f8 72 if (bit)
AndyA 10:053bac3e326b 73 LTCBuffer[2] |= 0x80000000;
AndyA 9:7214e3c3e5f8 74
AndyA 10:053bac3e326b 75 // frame sync patterin is 1011 1111 1111 1100
AndyA 9:7214e3c3e5f8 76 // 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 77 return ((((LTCBuffer[2]>>16) & 0x0000FFFF) == 0xBFFC) && ((LTCBuffer[0] & 0x0000FFFF) == 0xBFFC));
AndyA 1:dd1f7e162f91 78 }
AndyA 0:97661408d0f9 79
AndyA 9:7214e3c3e5f8 80 void LTCDecode::decodeTime()
AndyA 1:dd1f7e162f91 81 {
AndyA 10:053bac3e326b 82 _frame = ((LTCBuffer[0]>>16) & 0x0f) + ((LTCBuffer[0] >> 24) & 0x03) * 10;
AndyA 10:053bac3e326b 83 _seconds = ((LTCBuffer[1]>>0) & 0x0f) + ((LTCBuffer[1] >> 8) & 0x07) * 10;
AndyA 10:053bac3e326b 84 _minutes = ((LTCBuffer[1]>>16) & 0x0f) + ((LTCBuffer[1] >> 24) & 0x07) * 10;
AndyA 10:053bac3e326b 85 _hours = ((LTCBuffer[2]>>0) & 0x0f) + ((LTCBuffer[2] >> 8) & 0x03) * 10;
AndyA 9:7214e3c3e5f8 86 _frameDrop = (LTCBuffer[0] & (1<<26));
AndyA 0:97661408d0f9 87 }