#!/usr/bin/perl -w



#使い方 perl -f trace-pcm.pl ファイル名
#例     perl -f trace-pcm.pl pcm1


#入力ファイル名は、コマンドラインから受け取る
$file = shift @ARGV;

#出力ファイル名は、 output.txt
#$outfile = "forARM_" . $file . ".txt";
#$outfile = "output.txt";

#print "$file \n";
#print "$outfile \n";

#読み込み用にファイルを開く
open IN, '<' , "$file"  or die "file open error: $!";

#書き込み用にファイルを開く
#open OUT1, '>' , "$outfile"  or die "file open error: $!";



#-------------------------------------------------------------
#  smartpropoのヘッダーから引用

@jr_symbol = (
 -1 , 0, 16, -1, 17, 26, -1, -1, 21, 10,  8, -1, -1, -1, -1, -1,
 23, 14, 12, -1,  4, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 19, 15, 13, -1,  5, 25, -1, -1,  7, 29, 31, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 18, 11,  9, -1,  1, 24, -1, -1,  3, 28, 30, -1, -1, -1, -1, -1,
  2, 20, 22, -1,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
   );


#  初期化
$sync = 0;
$bitstream	= 0;
$bitcount	= -1;
$datacount	= 0;



while( <IN> ){
#print $_;

#改行削除
$_ =~ s/\r//;
$_ =~ s/\n//;

#print "input ". $_;
#print "\n";

#------------------ 16進->10進変換
	$_ = hex($_);
#print $_;
#print "\n";

#  まだsyncパルスを見つけられていなければ
	if( $sync == 0 ){
#print  $_ / 80 ." " ;
#print $_;

#------------------ syncパルスチェック
#  PICの計測単位が、16usec単位。
#  TMR0のカウント値を16倍して、usec単位の数値にする。
#  syncパルスの幅が約400usecなので、これを検出している。
#  sync以外のパルスは、160usec(166usec?)の倍数となっている。
#  syncのみ、160 x 2.5 = 400usec と、160の整数倍になっていない。
		if( int(($_ *16 / 80) + 0.5) == 5 ){
			$sync = 1;
			$bitstream	= 0;
			$bitcount	= -1;
			$datacount	= 0;
			next if 1;
		}
	}

#  syncパルスを見つけていれば
	else{

#  PICから受け取ったTMR0の値を usec換算し、
#  その後 160usecがいくつ分になるかを計算する。
#		$width = int(($_ *16 / 160) + 0.5);
#		$width = int(($_ *16 / 160) + 0.4);
		$tmp = $_ + 4;
		$width = int( $tmp / 10 );
#		$width = int(($_ *16 / 160) + 0.4);
#print $_ ." ";
#print $width;
#print "\n";

#  bitstreamを生成する。
		$bitstream = (($bitstream << 1) +1 ) << ($width -1);
#print $bitstream;
#print "\n";

#  現在のbitstreamのビット長を計算。
		$bitcount += $width;
#print $bitcount;
#print "\n";

#debug用出力
#$bit_bitstream = sprintf( "%b", $bitstream );
#print $width ." ". $bit_bitstream ." ". $bitcount ." ". $datacount;
#print "\n";

#  bitstreamが8bitより大きくなっていれば、
#  8bit->5bit変換実施して、データを格納しておく。
		if( $bitcount >= 8 ){
			$bitcount -= 8;
			$bitstream = $bitstream & 0xFFFF;
			$data[$datacount++] = $jr_symbol[($bitstream >> $bitcount) & 0xFF];
#$tmp = ($bitstream >> $bitcount) & 0xFF;
#print $tmp ." ";
#$tmp = unpack("H4", pack("C1", $tmp));		# 16進
#print $tmp ." ";
#print "jr_symbol[] ". $jr_symbol[$tmp] ." ";
#$tmp = unpack("B8", pack("H2", $tmp));		# 2進
#print $tmp;
#print $data[$datacount-1];
#print "\n";


#  エラーを検出したら、syncパルス検出に戻る。
			if( $jr_symbol[($bitstream >> $bitcount) & 0xFF] < 0 ){
				$sync = 0;
#print "Error\n";
				next if 1;
			}

#  各チャネルデータを計算。
#  ch9（AUX4）がよくわからない。
			if( $datacount == 3 ){  $position[2] = 1023 - (($data[1] << 5) | $data[2]) }; 
			if( $datacount == 6 ){  $position[0] = 1023 - (($data[4] << 5) | $data[5]) }; 
			if( $datacount == 11 ){ $position[5] = 1023 - (($data[9] << 5) | $data[10]) }; 
			if( $datacount == 14 ){ $position[7] = 1023 - (($data[12] << 5) | $data[13]) }; 
			if( $datacount == 18 ){ $position[3] = 1023 - (($data[16] << 5) | $data[17]) }; 
			if( $datacount == 21 ){ $position[1] = 1023 - (($data[19] << 5) | $data[20]) }; 
			if( $datacount == 26 ){ $position[4] = 1023 - (($data[24] << 5) | $data[25]) }; 
			if( $datacount == 29 ){ $position[6] = 1023 - (($data[27] << 5) | $data[28]) }; 
			if( $datacount == 30 ){ $sync = 0; }



#=for comment
#  デコード結果を表示
			if( $datacount == 30 ){
print "@data\n";
#=for comment
				print $position[2] ." ch2 AILE \n";
				print $position[0] ." ch4 RUDD \n";
				print $position[5] ." ch6 AUX1 \n";
				print $position[7] ." ch8 AUX3 \n";
				print $position[3] ." ch1 THRO \n";
				print $position[1] ." ch3 ELEV \n";
				print $position[4] ." CH5 GEAR \n";
				print $position[6] ." CH7 AUX2 \n";
				print "\n";
#=cut
			}

#=cut



		}	#end of if
	}	#end of else

}	# end of while




#close(OUT1);
close(IN);

