#!/usr/bin/perl
# 以下は変更する必要なし
#-----------------------------------------------------------------------------
#
# RawHk2stt_pixel(version  $Id: eodv,v 1.4 2007/05/22 02:22:33 Exp $) 
#
# RawHkからをSTTのpixelデータを抽出する
# 
# Usage:
# > RawHk2stt_pixel.pl RawHk****.txt
#
# options: none
#
# example:
# RawHk2stt_pixel.pl RawHk****.txt				#(1)
#
#-----------------------------------------------------------------------------
# Libraries
#use strict;
#use warnings;

my $ver = "RawHk2stt_pixel v1.0.0\n";
my $buf	= 0;
my $ch	= 0;
my $pint	= 0;
my $sint	= 0;
my $bnum	= 0;
my $flgc	= 0;
my $str1	= "_temp1.txt";
my $str2	= "_temp2.txt";
my $str3	= "_temp3.txt";
my $str4	= "_temp4.txt";
my $str5	= "_temp5.txt";
my $str6	= "_temp6.txt";
my $str7	= "_temp7.txt";
my $str8	= "stt_pixel";
my $filename;
my @dat = ();

for(my $i=0;$i<256;$i++)
{
	for(my $j=0;$j<256;$j++)
  	{
  		$dat[$i][$j] = -1;
  	}
}
#-----------------------------------------------------------------------------
# Code begin
#-----------------------------------------------------------------------------
# オプションがない場合
if ($#ARGV == -1)
{
	print $ver;
	print "Error:ファイル名を指定してください\n";
}
# オプションが1つある場合
if ($#ARGV == 0)
{
	print "Now Loading...\n";
	
	## 1.元ファイルを読み込みテキスト変換を行う
	##------------------------------------------------------------------------
	# 対象のファイルオープン
	open INFILE, "<$ARGV[0]" or die "file open error: $!";
	# バイナリモードに変更
	binmode INFILE;
	
	# 内容読み込み
	#sysread(INFILE, $buf, $size);
	sysread(INFILE, $buf, -s INFILE);
	my @data = unpack("C*", $buf);
	
	# ファイルを閉じる
	close INFILE;
	
	
	## 2.HEX(テキスト)に変換したものを出力する
	##------------------------------------------------------------------------
	open OUT,">$str1" or die "file open error 1: $!";
	# Byte数読み込み
	for my $x (@data)
	{
		my $disp = sprintf("%02X",$x);
		print OUT $disp;
  	}
  	close OUT;
  	
  	## 3.HEXを読み込みヘッダ改行にする
  	##------------------------------------------------------------------------
  	open IN ,"<$str1" or die "file open error 1: $!";
  	my @line = <IN>;
  	close IN;
  	
  	open OUT,">$str2" or die "file open error 2: $!";
  	foreach(@line)
  	{
  		my $disp = $_;
  		$disp =~ s/1ACFFC1D/\n1ACFFC1D/gi;
  		print OUT 	$disp;
  	}
	close OUT;
	
	## 4.ヘッダ及びフッタを除去
  	##------------------------------------------------------------------------
  	open IN ,"<$str2" or die "file open error 2: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str3" or die "file open error 3: $!";
  	foreach(@line)
  	{
  		my $disp = $_;
  		
  		if(/1ACFFC1D/)
  		{
  			# 時刻の取得
  			$sattime = substr($disp,36,8);
  			
  			# APIDの取得
  			$apid	 = substr($disp,24,4);
  			
  			# ヘッダ除去
  			$disp =~ s/1ACFFC1D[A-Z\d]{28}//gi;
  			
  			# 74Byte分のSIO領域を抽出
  			$disp = substr($disp,0,148);
  			
  			# 出力
  			print OUT	$sattime.",";
  			print OUT	$apid.",";
  			print OUT 	$disp."\n";
  		}
  	}
	close OUT;
	
	## 5.SIOストア分だけ抽出
  	##------------------------------------------------------------------------
  	open IN ,"<$str3" or die "file open error 3: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str4" or die "file open error 4: $!";
  	#open OUT2,">$str5" or die "file open error 5: $!";
  	#$filename = (split(/\./,$ARGV[0]))[0];
  	#open OUT,">$filename"."_sio.txt" or die "file open error $filename: $!";
  	
  	foreach(@line)
  	{
  		$sattime= (split(/,/,$_))[0];
  		$apid 	= (split(/,/,$_))[1];
  		$disp 	= (split(/,/,$_))[2];
		
		$sattime= hex($sattime);
		
		# SIO機器のAPIDの場合
		if($apid =~ /5C[A-F\d]/)
		{
			# 64Byte分のストアデータを抽出
  			$disp = substr($disp,20,128);
  			
  			# 出力1
  			print OUT	$sattime.",";
  			print OUT	$apid.",";
  			print OUT 	$disp."\n";
  			
  			# 出力2
  			#print OUT2 	$disp;
  		}
  	}
	close OUT;

	## 6.SIOストア分だけ抽出(改行なし)
  	##------------------------------------------------------------------------
  	open IN ,"<$str4" or die "file open error 4: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str5" or die "file open error 5: $!";
  	
  	foreach(@line)
  	{
  		#$sattime= (split(/,/,$_))[0];
  		$apid 	= (split(/,/,$_))[1];
  		$disp 	= (split(/,/,$_))[2];
		
		# SIO機器のAPIDの場合
		if($apid =~ /5C[A-F\d]/)
		{
			# 改行削除
  			chomp($disp);

  			print OUT 	$disp;
  		}
  	}
	close OUT;
	
	## 7.pixelストア分だけ抽出
  	##------------------------------------------------------------------------
  	open IN ,"<$str5" or die "file open error 5: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str6" or die "file open error 6: $!";
  	
  	foreach(@line)
  	{
  		$disp 	= $_;
		
		# pixelデータ区切りに改行コード挿入
		$disp =~ s/FF6F80/FF\n6F80/g;
		#$disp =~ s/FF6F2A/FF\n6F2A/g;
		#$disp =~ s/FF6F4E/FF\n6F4E/g;
		#$disp =~ s/FF6F16/FF\n6F16/g;
		#$disp =~ s/FF6F00/FF\n6F00/g;
		#$disp =~ s/FF4D4D/FF\n4D4D/g;
		
		# 出力
		print OUT 	$disp;

  	}
	close OUT;
	
	## 8.pixelデータだけ出力する. 1データ/1行
  	##------------------------------------------------------------------------
  	open IN ,"<$str6" or die "file open error 6: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str7" or die "file open error 7: $!";
  	
  	foreach(@line)
  	{
  		$disp 	= $_;
		$head = substr($disp,0,4);
		
		# pixelデータ区切りに改行コード挿入
		if($head =~ /6F80/)
		{
			# 出力
			print OUT 	substr($disp,4,1280);
			print OUT	"\n";
		}
		
  	}
	close OUT;
	
	## 8.pixelデータだけ出力する
  	##------------------------------------------------------------------------
  	open IN ,"<$str7" or die "file open error 7: $!";
  	@line = <IN>;
  	close IN;
  	
  	# カウンタ def:0
  	my $cnt = 0;
  	
  	foreach(@line)
  	{
  		$disp 	= $_;
		
		# 改行コード削除
		chomp($disp);
		
  		# ファイル生成
  		$filename = sprintf("%s%03d.bin",$str8,$cnt);
  		open OUT,">:raw","$filename" or die "file open error filename: $!";
		
		# バイナリ出力
		print OUT pack("H*", $disp);
		
		close OUT;
		
		# カウントアップ
		$cnt++;
  	}
	
	
  	## X.tempファイル削除
  	##------------------------------------------------------------------------
  	unlink($str1);  	
  	#unlink($str2);
  	#unlink($str3);
  	#unlink($str4);
  	#unlink($str5);
  	#unlink($str6);
  	#unlink($str7);
}

# オプションが２つある場合
if ($#ARGV == 1){	
}
exit;

#-----------------------------------------------------------------------------
# Sub code begin
#-----------------------------------------------------------------------------
sub show_usage()
{
 print "Usage:\n";
 print "> RawHk2stt_pixel.pl [-h]\n";
 print "\n";
 print "options:\n";
 print "         -h : 利用方法を提示する\n";
 print "\n";
 print "example:\n";
 print "RawHk2stt_pixel.pl -h                         #(1) HELP\n";
}