#!/usr/bin/perl
# 以下は変更する必要なし
#-----------------------------------------------------------------------------
#
# RawHk2dssline(version  $Id: eodv,v 1.4 2007/05/22 02:22:33 Exp $) 
#
# RawHkからをDSSのラインデータを抽出する
# 
# Usage:
# > RawHk2dssline.pl RawHk****.txt
#
# options: none
#
# example:
# RawHk2dssline.pl RawHk****.txt				#(1)
#
#-----------------------------------------------------------------------------
# Libraries
#use strict;
#use warnings;

my $buf	= 0;
my $ch	= 0;
my $pint	= 0;
my $sint	= 0;
my $bnum	= 0;
my $flgc	= 0;
my $size	= 1000000;
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 $filename;
my @dat = ();

for(my $i=0;$i<256;$i++)
{
	for(my $j=0;$j<256;$j++)
  	{
  		$dat[$i][$j] = "-";
  	}
}
#-----------------------------------------------------------------------------
# Code begin
#-----------------------------------------------------------------------------
# オプションがない場合
if ($#ARGV == -1)
{
	print "Error:ファイル名を指定してください\n";
}
# オプションが1つある場合
if ($#ARGV == 0)
{
	## 1.元ファイルを読み込みテキスト変換を行う
	##------------------------------------------------------------------------
	# 対象のファイルオープン
	open INFILE, "<$ARGV[0]" or die "file open error: $!";
	# バイナリモードに変更
	binmode INFILE;
	
	# 内容読み込み
	sysread(INFILE, $buf, $size);
	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/)
  		{
  			# ヘッダ除去
  			$disp =~ s/1ACFFC1D[A-Z\d]{28}//gi;
  			
  			# 74Byte分のユーザーデータを抽出
  			$disp = substr($disp,0,148);
  			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: $!";
  	foreach(@line)
  	{
  		my $disp = $_;
		
		# 64Byte分のストアデータを抽出
  		$disp = substr($disp,20,128);
  		
  		# 改行連結
  		print OUT 	$disp."\n";
  	}
	close OUT;
  	
  	## 6.DSSラインデータだけ抽出
  	##------------------------------------------------------------------------
  	open IN ,"<$str4" or die "file open error 4: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str5" or die "file open error 5: $!";
  	foreach(@line)
  	{
  		my $disp = $_;
  		chomp($disp);
  		
		# ラインデータのヘッダを検索
		# ラインデータ内であれば、そのまま出力
  		if($flgc)
  		{
  			 $pint = index($disp,'C0C01139');
  			 if($pint > 0)
  			 {
  			 	# 該当があれば、終わりなのでフラグを戻す
  			 	$flgc = 0;
  				# 残りを出力,CRCは削除
    			$disp = substr($disp,0,$pint - 4);
    		 }else{
  			 	$pint = 128;
  			 	$disp = substr($disp,0,128);
  			 }
    		
    		# 改行なし連結
  			print OUT 	$disp;
  			if($flgc == 0){ print OUT "\n";}
  		}
  		
  		# ラインデータ箇所を検索
  		$pint = index($disp,'C01139A704');
  		if($pint > 0 && $flgc == 0)
  		{
    		$flgc = 1;
    		
    		# 残りを出力
    		$disp = substr($disp,$pint,128);
    		
    		# 改行なし連結
  			print OUT 	$disp;
  		}else{
  			# 該当しない行の場合は何もしない

  			if($flgc == 0){$disp = "";}
  		}
  	}
  	print OUT "\n";
	close OUT;
	
	## 7.可視化用の元データ出力
  	##------------------------------------------------------------------------
  	open IN ,"<$str5" or die "file open error 5: $!";
  	@line = <IN>;
  	close IN;
  	
  	open OUT,">$str6" or die "file open error 6: $!";
  	foreach(@line)
  	{
  	  	my $disp = $_;
  		chomp($disp);
  		
  	  	# ラインデータ箇所を検索
  		$disp =~ s/C01139A704//gi;
  		
  		# Unバイトスタッフィング
  		$disp =~ s/DBDC/C0/gi;
 		$disp =~ s/DBDD/DB/gi;
 		
 		# H･L入れ替え
  		$disp =~ s/([A-Z\d][A-Z\d])([A-Z\d][A-Z\d])/$2$1,/gi;
  		
  		# 出力
  		print OUT 	$disp."\n";
  	}
  	close OUT;
  	
  	## 8.可視化用のデータ出力
  	##------------------------------------------------------------------------
  	open IN ,"<$str6" or die "file open error 6: $!";
  	@line = <IN>;
  	close IN;
  	
  	$filename = (split(/\./,$ARGV[0]))[0];
  	open OUT,">$filename"."_graph.csv" or die "file open error $filename: $!";
  	
  	my $lin = 0;
  	foreach(@line)
  	{
  	  	my $disp = $_;
  		chomp($disp);
		
		# 空行であれば終了する
		if(length($disp) < 3){last;}
		
  	  	# 位置及び個数読み込み
		$bnum = substr((split(/\,/,$_))[0],0,2);
		$sint = substr((split(/\,/,$_))[0],2,2);
		
		#print $bnum.",".$sint."\n";
		
		# データ読み込み
  		for(my $i=0;$i<(hex($bnum));$i++)
  		{
  			my $temp = (split(/\,/,$_))[$i+1];
  			chomp($temp);
  			$dat[$lin][hex($sint)+$i] = hex($temp);
  			
  			# print $temp."\n";
  		}
  		
  		$lin++;
  	}
  	
  	# データ出力
  	print OUT "#Point,Dat,-はdataが無いところ,\n";
  	
  	for(my $i=0;$i<256;$i++)
  	{
  		# 行数表示
  		my $k = $i;
  		print OUT "$k,";
  		
  		# 出力
  		for(my $j=0;$j<$lin;$j++)
  		{
  			print OUT $dat[$j][$i].",";
  		}
  		print OUT "\n";
  	}
  	close OUT;
}

# オプションが２つある場合
if ($#ARGV == 1){	
}
exit;

#-----------------------------------------------------------------------------
# Sub code begin
#-----------------------------------------------------------------------------
sub show_usage()
{
 print "Usage:\n";
 print "> RawHk2dssline.pl [-h]\n";
 print "\n";
 print "options:\n";
 print "         -h : 利用方法を提示する\n";
 print "\n";
 print "example:\n";
 print "RawHk2dssline.pl -h                         #(1) HELP\n";
}