[go: up one dir, main page]

Menu

[r2]: / trunk / scripts / decodemtc  Maximize  Restore  History

Download this file

128 lines (125 with data), 2.5 kB

#!/usr/bin/perl -w --
$|=1;  # disable output buffering

use strict;
use Switch;
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
open (MTCSOURCE, "amidi --dump --port=hw:1,0,0|");
my $set=0;
my $hour=0;
my $min=0;
my $sec=0;
my $frame=0;
my $tmptmphour=0;
my $tmptmpmin=0;
my $tmptmpsec=0;
my $tmptmpframe=0;
my $tmphour=0;
my $tmpmin=0;
my $tmpsec=0;
my $tmpframe=0;
my $qframe=-1;
my $settmp=0;
my $t0=[gettimeofday()];
my $t1;
my $elapsed;
while (<MTCSOURCE>) {
	chomp($_);
	if (/F0 7F (.*) 06 44 06 01 (.*) F7/) {
		my @tc=split(' ',substr($_,21,14));
		$hour=hex("0x".$tc[0]) & 31;
		$min=hex("0x".$tc[1]);
		$sec=hex("0x".$tc[2]);
		$frame=hex("0x".$tc[3]);
		$qframe=hex("0x".$tc[4]);
			printf "%02d:%02d:%02d.%02d/%02d (LOCATE) \r",$hour,$min,$sec,$frame,$qframe;
		next;
	}
	if (/F1 (.*)/) {
		$t1=[gettimeofday()];
		$elapsed=tv_interval($t0,$t1);
		if ($elapsed>.1) {
			$set=0;
			$tmptmphour=0;
			$tmptmpmin=0;
			$tmptmpsec=0;
			$tmptmpframe=0;
			$settmp=0;
			$qframe=-1;
			$tmphour=0;
			$tmpmin=0;
			$tmpsec=0;
			$tmpframe=0;
			$hour=0;
			$min=0;
			$sec=0;
			$frame=0;
			
		}
		$t0=$t1;
#		print $_." | ";
		my $nibble=hex ("0x".substr($1,1,1));
		my $cmd=substr($1,0,1);
		if ($set ==0) {
			if ($cmd ne "0") {
				print "skip\n";
				next;
			}
		}
		$settmp=0;
		switch (0+substr($1,0,1)) {
			case 0 {
				$tmptmpframe=($tmptmpframe & 0xf0)|$nibble;
				$set|=1;
				}
			case 1 {
				$tmptmpframe=($tmptmpframe & 0x0f)|($nibble*16);
				$set|=2;	
				$tmpframe=$tmptmpframe;
				$settmp=1;
				}
			case 2 {
				$set|=4;
				$tmptmpsec=($tmptmpsec & 0xf0)|$nibble;
				}
			case 3 {
				$set|=8;
				$tmptmpsec=($tmptmpsec & 0x0f)|($nibble*16);
				}
				$tmpsec=$tmptmpsec;
			case 4 {
				$set|=16;
				$tmptmpmin=($tmptmpmin & 0xf0)|$nibble;
				}
			case 5 {
				$set|=32;
				$tmptmpmin=($tmptmpmin & 0x0f)|($nibble*16);
				$tmpmin=$tmptmpmin;
				}
			case 6 {
				$set|=64;
				$tmptmphour=($tmptmphour & 0xf0)|$nibble;
				}
			case 7 {
				$set|=128;
				$tmptmphour=($tmptmphour & 0x0f)|(($nibble*16)&1);
				$tmphour=$tmptmphour;
			}
		}
		$qframe++;
		if ($qframe > 3) {
			$qframe=0;
			if ($settmp == 0) {
				$tmpframe++;
			}
			$frame=$tmpframe;
			$sec=$tmpsec;
			$min=$tmpmin;
			$hour=$tmphour;
		}
		if ($set==255) {
			printf "%02d:%02d:%02d.%02d/%02d          \r",$hour,$min,$sec,$frame,$qframe;
		} else {
			printf "%02d:%02d:%02d.%02d/%02d (no lock)\r",$hour,$min,$sec,$frame,$qframe;
		}
	}
}
close (MTCSOURCE);