SMPTE timedode (LTC) decode library for mbed

Dependents:   LTC_SMPTE_sample

SMPTE timedode (LTC) decode library

SMPTEタイムコードをデコード(受信)・エンコード(送信)するライブラリです。

平衡/不平衡/サウンド等によるLTC信号は、適当な回路で整形して入力してください。
出力は適当なドライバ回路を設けてください。

簡易的なプログラムのため、細かいフラグなどは無視しています。

LPC1768 専用、Timer 2 を占有します。

Sample

Import programLTC_SMPTE_sample

SMPTE timedode (LTC) decode library for mbed https://developer.mbed.org/users/okini3939/code/LTC_SMPTE/

Committer:
okini3939
Date:
Mon Nov 16 12:51:43 2015 +0000
Revision:
0:8d19e2158eb4
Child:
1:63ceee4bfd05
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:8d19e2158eb4 1 /**
okini3939 0:8d19e2158eb4 2 * SMPTE timedode (LTC) decode library for mbed
okini3939 0:8d19e2158eb4 3 * Copyright (c) 2015 Suga
okini3939 0:8d19e2158eb4 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:8d19e2158eb4 5 */
okini3939 0:8d19e2158eb4 6 /** @file
okini3939 0:8d19e2158eb4 7 * @brief SMPTE timedode (LTC) decode library for mbed
okini3939 0:8d19e2158eb4 8 */
okini3939 0:8d19e2158eb4 9
okini3939 0:8d19e2158eb4 10 #include "LTC_SMPTE.h"
okini3939 0:8d19e2158eb4 11
okini3939 0:8d19e2158eb4 12 // pulse width: 416.7us(30fps)
okini3939 0:8d19e2158eb4 13 // 80bit x 30frame/s --> 416.7us/bit
okini3939 0:8d19e2158eb4 14 #define ONE_TIME_MIN 100
okini3939 0:8d19e2158eb4 15 #define ONE_TIME_MAX 250
okini3939 0:8d19e2158eb4 16 #define ZERO_TIME_MIN 300
okini3939 0:8d19e2158eb4 17 #define ZERO_TIME_MAX 500
okini3939 0:8d19e2158eb4 18
okini3939 0:8d19e2158eb4 19 LTC_SMPTE::LTC_SMPTE (PinName input) : _input(input) {
okini3939 0:8d19e2158eb4 20
okini3939 0:8d19e2158eb4 21 mode = 0;
okini3939 0:8d19e2158eb4 22 count = 0;
okini3939 0:8d19e2158eb4 23 oneflg = 0;
okini3939 0:8d19e2158eb4 24 direction = 0;
okini3939 0:8d19e2158eb4 25 received = 0;
okini3939 0:8d19e2158eb4 26
okini3939 0:8d19e2158eb4 27 _input.mode(PullUp);
okini3939 0:8d19e2158eb4 28 _input.fall(this, &LTC_SMPTE::isr_change);
okini3939 0:8d19e2158eb4 29 _input.rise(this, &LTC_SMPTE::isr_change);
okini3939 0:8d19e2158eb4 30 _timer.start();
okini3939 0:8d19e2158eb4 31 }
okini3939 0:8d19e2158eb4 32
okini3939 0:8d19e2158eb4 33 void LTC_SMPTE::isr_change () {
okini3939 0:8d19e2158eb4 34 int b, t;
okini3939 0:8d19e2158eb4 35
okini3939 0:8d19e2158eb4 36 t = _timer.read_us();
okini3939 0:8d19e2158eb4 37 _timer.reset();
okini3939 0:8d19e2158eb4 38
okini3939 0:8d19e2158eb4 39 if (t >= ONE_TIME_MIN && t < ONE_TIME_MAX) {
okini3939 0:8d19e2158eb4 40 if (oneflg == 0) {
okini3939 0:8d19e2158eb4 41 oneflg = 1;
okini3939 0:8d19e2158eb4 42 return;
okini3939 0:8d19e2158eb4 43 } else {
okini3939 0:8d19e2158eb4 44 oneflg = 0;
okini3939 0:8d19e2158eb4 45 b = 1;
okini3939 0:8d19e2158eb4 46 }
okini3939 0:8d19e2158eb4 47 } else
okini3939 0:8d19e2158eb4 48 if (t >= ZERO_TIME_MIN && t < ZERO_TIME_MAX) {
okini3939 0:8d19e2158eb4 49 oneflg = 0;
okini3939 0:8d19e2158eb4 50 b = 0;
okini3939 0:8d19e2158eb4 51 } else {
okini3939 0:8d19e2158eb4 52 return;
okini3939 0:8d19e2158eb4 53 }
okini3939 0:8d19e2158eb4 54
okini3939 0:8d19e2158eb4 55 if (mode == 0) {
okini3939 0:8d19e2158eb4 56 // sync word
okini3939 0:8d19e2158eb4 57 if (b) {
okini3939 0:8d19e2158eb4 58 // 1
okini3939 0:8d19e2158eb4 59 if (count == 12) {
okini3939 0:8d19e2158eb4 60 // error
okini3939 0:8d19e2158eb4 61 count = 0;
okini3939 0:8d19e2158eb4 62 } else
okini3939 0:8d19e2158eb4 63 if (count == 13) {
okini3939 0:8d19e2158eb4 64 // fwd
okini3939 0:8d19e2158eb4 65 direction = 1;
okini3939 0:8d19e2158eb4 66 count = 0;
okini3939 0:8d19e2158eb4 67 mode = 1;
okini3939 0:8d19e2158eb4 68 bit = 1;
okini3939 0:8d19e2158eb4 69 } else {
okini3939 0:8d19e2158eb4 70 count ++;
okini3939 0:8d19e2158eb4 71 }
okini3939 0:8d19e2158eb4 72 } else {
okini3939 0:8d19e2158eb4 73 // 0
okini3939 0:8d19e2158eb4 74 if (count == 12) {
okini3939 0:8d19e2158eb4 75 count ++;
okini3939 0:8d19e2158eb4 76 } else
okini3939 0:8d19e2158eb4 77 if (count == 13) {
okini3939 0:8d19e2158eb4 78 // rev
okini3939 0:8d19e2158eb4 79 direction = -1;
okini3939 0:8d19e2158eb4 80 count = 0;
okini3939 0:8d19e2158eb4 81 mode = 1;
okini3939 0:8d19e2158eb4 82 bit = 1;
okini3939 0:8d19e2158eb4 83 } else {
okini3939 0:8d19e2158eb4 84 // error
okini3939 0:8d19e2158eb4 85 count = 0;
okini3939 0:8d19e2158eb4 86 }
okini3939 0:8d19e2158eb4 87 }
okini3939 0:8d19e2158eb4 88
okini3939 0:8d19e2158eb4 89 } else {
okini3939 0:8d19e2158eb4 90 // time code
okini3939 0:8d19e2158eb4 91 if (b) {
okini3939 0:8d19e2158eb4 92 code[count] |= bit; // 1
okini3939 0:8d19e2158eb4 93 } else {
okini3939 0:8d19e2158eb4 94 code[count] &= ~bit; // 0
okini3939 0:8d19e2158eb4 95 }
okini3939 0:8d19e2158eb4 96 bit <<= 1;
okini3939 0:8d19e2158eb4 97 if (bit >= 0x100) {
okini3939 0:8d19e2158eb4 98 bit = 1;
okini3939 0:8d19e2158eb4 99 count ++;
okini3939 0:8d19e2158eb4 100 if (count >= 8) {
okini3939 0:8d19e2158eb4 101 count = 0;
okini3939 0:8d19e2158eb4 102 mode = 0;
okini3939 0:8d19e2158eb4 103 parse_code();
okini3939 0:8d19e2158eb4 104 }
okini3939 0:8d19e2158eb4 105 }
okini3939 0:8d19e2158eb4 106 }
okini3939 0:8d19e2158eb4 107 }
okini3939 0:8d19e2158eb4 108
okini3939 0:8d19e2158eb4 109 void LTC_SMPTE::parse_code () {
okini3939 0:8d19e2158eb4 110 frame = (code[1] & 0x03) * 10 + (code[0] & 0x0f);
okini3939 0:8d19e2158eb4 111 sec = (code[3] & 0x07) * 10 + (code[2] & 0x0f);
okini3939 0:8d19e2158eb4 112 min = (code[5] & 0x07) * 10 + (code[4] & 0x0f);
okini3939 0:8d19e2158eb4 113 hour = (code[7] & 0x03) * 10 + (code[6] & 0x0f);
okini3939 0:8d19e2158eb4 114 drop = code[1] & (1<<2) ? 1 : 0;
okini3939 0:8d19e2158eb4 115 received = 1;
okini3939 0:8d19e2158eb4 116 }
okini3939 0:8d19e2158eb4 117
okini3939 0:8d19e2158eb4 118 void LTC_SMPTE::read (int *hour, int *min, int *sec, int *frame, int *dir) {
okini3939 0:8d19e2158eb4 119 *hour = this->hour;
okini3939 0:8d19e2158eb4 120 *min = this->min;
okini3939 0:8d19e2158eb4 121 *sec = this->sec;
okini3939 0:8d19e2158eb4 122 *frame = this->frame;
okini3939 0:8d19e2158eb4 123 if (dir) *dir = this->direction;
okini3939 0:8d19e2158eb4 124 received = 0;
okini3939 0:8d19e2158eb4 125 }
okini3939 0:8d19e2158eb4 126
okini3939 0:8d19e2158eb4 127 int LTC_SMPTE::isReceived () {
okini3939 0:8d19e2158eb4 128 return received;
okini3939 0:8d19e2158eb4 129 }