#!/usr/bin/perl
#
# @(@) $Revision: 2.0.0.43 $
# @(#) Format the timelog file from the HP receiver to
# @(#) a chart for EFC values and Holdover Uncertainty(HU) values.
#
# @(#) This software is relased under the GPL and
# @(#) is Copyright (C)GS3 Technologies Inc. 2000-2006
# @(#) For updates check: http://www.gs3tech.com/
#
use strict;
use GD::Graph::lines;
#
use vars qw ($StartTime $EndTime);
use vars qw ($RstrEdate $RstrSdate $RstrEtime $RstrStime);
use vars qw ($RstrRdate $RstrLdate $ReceiverTimeMode $RstrRtime $RstrLtime);
use vars qw ($TimeFormat $maxvalues);
use vars qw ($Inf1 $Inf2 $NumInf $Title $OutfEFC $OutfHU);
use vars qw ($ImageEFC $ImageHU);
use vars qw (@dataEFC @dataHU);
use vars qw ($LR1TimeP $LR1EFCP $LR1HUP $LR2TimeP $LR2EFCP $LR2HUP);		# Previous values
use vars qw ($LR1Time $LR1EFC $LR1HU $LR2Time $LR2EFC $LR2HU);				# Current values
use vars qw ($Npoints);
use vars qw ($f1open $f2open);
use vars qw ($Colorc1 $Colorc2);$Colorc1="green";$Colorc2="red";
use vars qw ($CWidth $CHeight);$CWidth=500; $CHeight=450;
#
use vars qw ($EFCy1min $EFCy1max $EFCy1last);$EFCy1min=0; $EFCy1max=0;
use vars qw ($EFCy2min $EFCy2max $EFCy2last);$EFCy2min=0; $EFCy2max=0;
use vars qw ($HUy1min $HUy1max $HUy1last);$HUy1min=0; $HUy1max=0;
use vars qw ($HUy2min $HUy2max $HUy2last);$HUy2min=0; $HUy2max=0;
#
use vars qw ($DEBUG);$DEBUG=0;
use vars qw ($NARGS);$NARGS=$#ARGV+1;				# Keep here to make life easier
#
my($li, $lj, $lk, $ll, $lm, $my_graphEFC, $my_graphHU);
my($rtimestart, $rtimeend);
$rtimestart=time;
#
$TimeFormat="USA1";
# Get any command line args
&ProcCmdLine;
#
if( $NumInf == 1 ) {
	print "Input File:\n\t${Inf1}\n";
	if( ! -f $Inf1 ) {
		print "Input file: ${Inf1} does not existi\r\n";
		exit;
	}
	#
	if( &read_data ) {
		print "Error Reading data file: ${Inf1}\r\n";	
		exit;
	}
	print "Chart Dimensions:\n\tWidth: $CWidth, Height: $CHeight\r\n";
	print "X axis values:\n\tMinvalue    : 0\n\tMaxvalue    : ${maxvalues}\n\tData Points : ${Npoints}\r\n";
	print "Y axis values:\r\n";
	print sprintf("\tGraph EFC min: %12.5E, Graph EFC max: %12.5E, Last: %12.5E\r\n", $EFCy1min, $EFCy1max, $EFCy1last);
	print sprintf("\tGraph HU  min: %12.5E, Graph HU  max: %12.5E, Last: %12.5E\r\n", $HUy1min, $HUy1max, $HUy1last);
} else {
	print "Input Files:\n\t${Inf1}\n\t${Inf2}\r\n";
	if( (! -f $Inf1) || (! -f $Inf2) ) {
		print "Input files: ${Inf1} or ${Inf2} do not exist\r\n";
		exit;
	}
	#
	if( &read_data2 ) {
		print "Error Reading data files: ${Inf1} ${Inf2}\r\n";	
		exit;
	}
	print "Chart Dimensions:\n\tWidth: $CWidth, Height: $CHeight\r\n";
	print "X axis values:\n\tMinvalue    : 0\n\tMaxvalue    : ${maxvalues}\n\tData Points : ${Npoints}\r\n";
	print "Y axis values:\r\n";
	print sprintf("\tGraph1 EFC min: %12.5E, Graph1 EFC max: %12.5E, Last: %12.5E\r\n", $EFCy1min, $EFCy1max, $EFCy1last);
	print sprintf("\tGraph2 EFC min: %12.5E, Graph2 EFC max: %12.5E, Last: %12.5E\r\n", $EFCy2min, $EFCy2max, $EFCy2last);
	print sprintf("\tGraph1 HU  min: %12.5E, Graph1 HU  max: %12.5E, Last: %12.5E\r\n", $HUy1min, $HUy1max, $HUy1last);
	print sprintf("\tGraph2 HU  min: %12.5E, Graph2 HU  max: %12.5E, Last: %12.5E\r\n", $HUy2min, $HUy2max, $HUy2last);
}
#
&FormatTime;
#
$ll = $EndTime - $StartTime;	# Total Seconds
$li = $ll/3600;					# Hours
$li = int($li);
$lj =($ll-($li*3600))/60;		# Minutes
$lj =int($lj);
$lk =$ll-($li*3600)-($lj*60);	# Seconds
$lm = sprintf("%d:%02d:%02d", $li, $lj, $lk);
#
$my_graphEFC = new GD::Graph::lines( $CWidth, $CHeight );
$my_graphHU = new GD::Graph::lines( $CWidth, $CHeight );

if( $NumInf == 1 ) {
	$my_graphEFC->set_legend('Receiver Data');
	$my_graphEFC->set( 
		x_label => "Start: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${lm}",
		y_label => 'EFC Value',
		title => "${Title} - ${Npoints} Data points",
		y_tick_number => 'auto',
		y_number_format =>"%7.3E",
		y_min_value => $EFCy1min,
		y_max_value => $EFCy1max,
		long_ticks => 1,
		#
		x_tick_number => 'auto',
		x_number_format => "%9d",
		#
		box_axis => 1,
		line_width => 2,
		x_label_position => 1/2,
		r_margin => 15,
		#
		x_labels_vertical => 1,
		bgclr => 'white',
		zero_axis => 1,
		dclrs => [$Colorc1, $Colorc2],
		#
		x_max_value => $maxvalues,
		#
		transparent => 0,
	);
	$my_graphHU->set_legend('Receiver Data');
	$my_graphHU->set( 
		x_label => "Start: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${lm}",
		y_label => 'Holdover Uncertainty in seconds',
		title => "${Title} - ${Npoints} Data points",
		y_tick_number => 'auto',
		y_number_format =>"%7.3E",
		y_min_value => $HUy1min,
		y_max_value => $HUy1max,
		long_ticks => 1,
		#
		x_tick_number => 'auto',
		x_number_format => "%9d",
		#
		box_axis => 1,
		line_width => 2,
		x_label_position => 1/2,
		r_margin => 15,
		#
		x_labels_vertical => 1,
		bgclr => 'white',
		zero_axis => 1,
		dclrs => [$Colorc2, $Colorc1],
		#
		x_max_value => $maxvalues,
		#
		transparent => 0,
	);
} else {
	$my_graphEFC->set_legend('Receiver-1', 'Receiver-2');
	$my_graphEFC->set( 
		two_axes => 1,
		x_label => "Start: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${lm}",
		title => "${Title} - ${Npoints} Data points",
		#
		y1_label => 'EFC (Receiver 1)',
		y2_label => 'EFC (Receiver 2)',
		y1_tick_number => 'auto',
		y2_tick_number => 'auto',
		y1_number_format =>"%7.3E",
		y2_number_format =>"%7.3E",
		#
		long_ticks => 1,
		#
		x_tick_number => 'auto',
		x_number_format => "%9d",
		#
		box_axis => 1,
		line_width => 2,
		x_label_position => 1/2,
		r_margin => 15,
		#
		x_labels_vertical => 1,
		bgclr => 'white',
		zero_axis => 1,
		#
		x_max_value => $maxvalues,
		dclrs => [$Colorc1, $Colorc2],
		line_types => [1, 1],
		#
		transparent => 0,
	);
	$my_graphHU->set_legend('Receiver-1', 'Receiver-2');
	$my_graphHU->set( 
		two_axes => 1,
		x_label => "Start: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${lm}",
		title => "${Title} - ${Npoints} Data points",
		#
		y1_label => 'Holdover Uncertainty in seconds (Receiver 1)',
		y2_label => 'Holdover Uncertainty in seconds (Receiver 2)',
		y1_tick_number => 'auto',
		y2_tick_number => 'auto',
		y1_number_format =>"%7.3E",
		y2_number_format =>"%7.3E",
		long_ticks => 1,
		#
		x_tick_number => 'auto',
		x_number_format => "%9d",
		#
		box_axis => 1,
		line_width => 2,
		x_label_position => 1/2,
		r_margin => 15,
		#
		x_labels_vertical => 1,
		bgclr => 'white',
		zero_axis => 1,
		#
		x_max_value => $maxvalues,
		dclrs => [$Colorc1, $Colorc2],
		line_types => [1, 1],
		#
		transparent => 0,
	);
}
#
print "Creating chart for EFC. One moment...\r\n";
$my_graphEFC->plot(\@dataEFC);
print "Creating chart for HU.  Almost done...\r\n";
$my_graphHU->plot(\@dataHU);
#
print "Saving charts...\r\n";
&save_chart($my_graphEFC, $OutfEFC);
&save_chart($my_graphHU, $OutfHU);
#
$rtimeend=time;
print "$0:\n\tTotal Processing Time: " . ($rtimeend-$rtimestart) . " seconds\r\n";
exit;
######################################################
# End of main. Soubroutine definitions are below.
# Call this routine to read a two data files
sub read_data2 {
	my($u, $t, $tex);
	@dataEFC=();
	undef $u;					# Use this for undef values
	#
	$maxvalues=0;
	$Npoints=0;
	#
	# Open file1
	if( !open(YYY, "<$Inf1") ) {
		return 1;
	}
	#
	# Open file2
	if( !open(ZZZ, "<$Inf2") ) {
		close YYY;
		return 1;
	}
	#
	$f1open=1;$f2open=1;			# Both files have data
	&ReadF1;						# Read the data
	&ReadF2;
	$EFCy1min = $LR1EFC;			# Init the min/max values
	$EFCy1max = $LR1EFC;
	$EFCy2min = $LR2EFC;
	$EFCy2max = $LR2EFC;
	$HUy1min  = $LR1HU;
	$HUy1max  = $LR1HU;
	$HUy2min  = $LR2HU;
	$HUy2max  = $LR2HU;
	#
	# Lets compare times.
	#
	# Lets find the earlyest starting time
	print "File starting times:\n\t${Inf1}: ${LR1Time}\n\t${Inf2}: ${LR2Time}\r\n";
	if( $LR1Time > $LR2Time ) {
		$StartTime=$LR2Time;
		print "Using starting time:\n\t${Inf2}: ${StartTime}\r\n"; 
	} elsif( $LR1Time < $LR2Time ) {
		$StartTime=$LR1Time;
		print "Using starting time:\n\t${Inf1}: ${StartTime}\r\n"; 
	} else {
		$StartTime=$LR1Time;
		print "Using starting time:\n\tSame for both files: ${StartTime}\r\n"; 
	}
	print "\nReading Data. This will take a minute...\r\n\n";
	#
	# We need to keep track of two things here:
	#
	# 1.	Did one of the files end prematurely?
	#		Yes? Then just use undef data values for the chart (that is finished)
	#		until the other chart reaches the end as well.
	#
	# 2.	Time
	#		
	#		1.	if chart1_time > chart2_time
	#			create a time slot chart2_time. Put value of chart2 there.
	#			read next chart2_time but DO NOT read from chart1
	#			Note that no slot for chart1_time has been created
	#
	#		2.	if chart1_time < chart2_time
	#			create a time slot chart1_time. Put value of chart1 there.
	#			read next chart1_time but DO NOT read from chart2
	#			Note that no slot for chart2_time has been created
	#
	#		3.	if chart1_time = chart2_time
	#			create a time slot chart1_time. Put value of chart1
	#			and chart2 there.
	#			read next chart1_time and next chart2_time
	#
	#		4.	Start from step 1 until files are read in
	#
	# Ok, now let's check times
	WHIDO: while(1) {
		if( $LR1Time > $LR2Time ) {
			$EndTime=$LR1Time;
			#
			# Let's create the first timestamp from chart2
			$t=$LR2Time - $StartTime;
			#
			push @{$dataEFC[0]}, $t;				# push the time value from chart2
			push @{$dataEFC[1]}, $u;				# Undefined value here
			push @{$dataEFC[2]}, $LR2EFC;			# push the data value
			#
			push @{$dataHU[0]}, $t;
			push @{$dataHU[1]}, $u;					# push undefined
			push @{$dataHU[2]}, $LR2HU;				# push the data value
			&Dprint("TC1 > TC2; $LR1Time > $LR2Time -- We read from TC2 again. GEN: $LR2Time");
			#
			# Let's read in a new line to see if chart2 caught up
			if( ! &ReadF2 ) {
				&ReadF1End;
				last WHIDO;
			}
		} elsif( $LR2Time > $LR1Time ) {
			$EndTime=$LR2Time;
			#
			# Let's create the first timestamp from chart1
			$t=$LR1Time - $StartTime;
			#
			push @{$dataEFC[0]}, $t;				# push the time value from chart2
			push @{$dataEFC[1]}, $LR1EFC;			# push the data value
			push @{$dataEFC[2]}, $u;				# push undefined value
			#
			push @{$dataHU[0]}, $t;
			push @{$dataHU[1]}, $LR1HU;				# push the data value
			push @{$dataHU[2]}, $u;					# push undefined
			&Dprint("TC1 < TC2; $LR1Time < $LR2Time -- We read from TC1 again. GEN: $LR1Time");
			#
			# Let's read in a new line and do it over
			if( ! &ReadF1 ) {
				&ReadF2End;
				last WHIDO;
			}
		} else {
			$EndTime=$LR1Time;						# Doesn't matter LR1Time = LR2Time
			#
			# Let's get the offset
			$t=$LR1Time - $StartTime;
			#
			push @{$dataEFC[0]}, $t;				# push the time value from chart2
			push @{$dataEFC[1]}, $LR1EFC;			# push the data value
			push @{$dataEFC[2]}, $LR2EFC;			# push the data value
			#
			push @{$dataHU[0]}, $t;
			push @{$dataHU[1]}, $LR1HU;				# push the data value
			push @{$dataHU[2]}, $LR2HU;				# push undefined
			&Dprint("TC1 = TC2; $LR1Time = $LR2Time -- We read from TC1,TC2 again. GEN: $LR1Time");
			#
			# Let's read in a new line and do it over
			if( ! &ReadF1 ) {
				&ReadF2End;
				last WHIDO;
			}
			#
			# Let's read in a new line and do it over
			if( ! &ReadF2 ) {
				&ReadF1End;
				last WHIDO;
			}
		}
		$maxvalues=$t;
		$Npoints++;
	}
	print "Ending time is:\n\t${EndTime}\r\n";
	close (YYY);
	close (ZZZ);
	return 0;
}
#
# Call this routine to read one data file
sub read_data
{
	my($t, $ft);
	@dataEFC=();
	@dataHU=();
	$Npoints=0;
	$maxvalues=0;
	#
	if( !open(YYY, $Inf1) ) {
		return 1;
	}
	$ft=0;$f1open=1;
	#
	TOPW: while(&ReadF1) {
		if( !$ft ) {
			$StartTime=$LR1Time;
			print "Using starting time:\n\t${Inf1}: ${StartTime}\r\n"; 
			print "\nReading Data. This will take a minute...\r\n\n";
			$ft++;
			$EFCy1min = $LR1EFC;			# Init the min/max values
			$EFCy1max = $LR1EFC;
			$HUy1min  = $LR1HU;
			$HUy1max  = $LR1HU;
		}
		$t=$LR1Time - $StartTime;
		push @{$dataEFC[0]}, $t;
		push @{$dataEFC[1]}, $LR1EFC;		# push the data value
		push @{$dataHU[0]}, $t;
		push @{$dataHU[1]}, $LR1HU;			# push the data value
		$Npoints++;
	}
	$EndTime=$LR1Time;
	print "Ending time is:\n\t${EndTime}\r\n";
	$maxvalues=$t;
	close (YYY);
	return 0;
}
#
# read the rest of chart1 until the end
sub ReadF1End {
	my($t, $u);
	undef $u;
	$t=$maxvalues;
	#
	# We read until the end
	print "Note:\n\tFile:\n\t\t${Inf2}\n\tFinished before:\n\t\t${Inf1}\n\tWe will extend to the end of:\n\t\t${Inf1}\r\n";
	while(&ReadF1) {
		$t=$LR1Time - $StartTime;
		push @{$dataEFC[0]}, $t;
		push @{$dataEFC[1]}, $LR1EFC;			# push the data value
		push @{$dataEFC[2]}, $u;				# push undefined
		#
		push @{$dataHU[0]}, $t;
		push @{$dataHU[1]}, $LR1HU;				# push the data value
		push @{$dataHU[2]}, $u;					# push undefined
		$Npoints++;
		&Dprint("GEN: $LR1Time");
	}
	$EndTime=$LR1Time;
	$maxvalues=$t;
}
#
# read the rest of chart2 until the end
sub ReadF2End {
	my($t, $u);
	undef $u;
	$t=$maxvalues;
	#
	# We read until the end
	print "Note:\n\tFile:\n\t\t${Inf1}\n\tFinished before:\n\t\t${Inf2}\n\tWe will extend to the end of:\n\t\t${Inf2}\r\n";
	while(&ReadF2) {
		$t=$LR2Time - $StartTime;
		push @{$dataEFC[0]}, $t;
		push @{$dataEFC[1]}, $u;				# push undefined
		push @{$dataEFC[2]}, $LR2EFC;			# push the data value
		#
		push @{$dataHU[0]}, $t;
		push @{$dataHU[1]}, $u;					# push undefined
		push @{$dataHU[2]}, $LR2HU;				# push the data value
		$Npoints++;
		&Dprint("GEN: $LR2Time");
	}
	$EndTime=$LR2Time;
	$maxvalues=$t;
}
#
# Read and parse a line from file1
sub ReadF1 {
	my(@row1);
	#
	if( !$f1open ) {
		return 0;
	}
	if( $_ = <YYY> ) {
		$LR1TimeP =$LR1Time;
		$LR1EFCP =$LR1EFC;
		$LR1HUP =$LR1HU;
		#
		# We got data from file1
		chomp;
		@row1 = split(/,/);
		$LR1Time =$row1[0];
		$LR1EFC=&EFC2Num($row1[1]);
		if( $LR1EFC == 9999 ) {
			undef $LR1EFC;
		} else {
			if( $LR1EFC < $EFCy1min ) {
				$EFCy1min = $LR1EFC;
			}
			if( $LR1EFC > $EFCy1max ) {
				$EFCy1max = $LR1EFC;
			}
			$EFCy1last=$LR1EFC;
		}
		$LR1HU = &HU2Num($row1[2]);
		if( !$LR1HU ) {
			undef $LR1HU;
		} else {
			if( $LR1HU < $HUy1min ) {
				$HUy1min = $LR1HU;
			}
			if( $LR1HU > $HUy1max ) {
				$HUy1max = $LR1HU;
			}
			$HUy1last=$LR1HU;
		}
	} else {
		close YYY;
		$f1open=0;							# No more data for file 1
		return 0;
	}
	return 1;
}
#
# Read and parse a line from file2
sub ReadF2 {
	my(@row2);
	#
	if( !$f2open ) {
		return 0;
	}
	if( $_ = <ZZZ> ) {
		$LR2TimeP =$LR2Time;
		$LR2EFCP =$LR2EFC;
		$LR2HUP =$LR2HU;
		#
		# We got data from file1
		chomp;
		@row2 = split(/,/);
		$LR2Time =$row2[0];
		$LR2EFC =&EFC2Num($row2[1]);
		if( $LR2EFC == 9999 ) {
			undef $LR2EFC;
		} else {
			if( $LR2EFC < $EFCy2min ) {
				$EFCy2min = $LR2EFC;
			}
			if( $LR2EFC > $EFCy2max ) {
				$EFCy2max = $LR2EFC;
			}
			$EFCy2last=$LR2EFC;
		}
		$LR2HU = &HU2Num($row2[2]);
		if( !$LR2HU ) {
			undef $LR2HU;
		} else {
			if( $LR2HU < $HUy2min ) {
				$HUy2min = $LR2HU;
			}
			if( $LR2HU > $HUy2max ) {
				$HUy2max = $LR2HU;
			}
			$HUy2last=$LR2HU;
		}
	} else {
		close ZZZ;
		$f2open=0;							# No more data for file 2
		return 0;
	}
	return 1;
}
#
# Create a number from an HU value
sub HU2Num {
	my($s, $i, $j, $k);
	$s=$_[0];
	if( $s =~ /^\s*$/ ) {
		return 0; 
	}
	if( $s =~ /undef/ ) {
		return 0; 
	}
	($i, $j) = $s =~ /^(\S*)\s*([^\/]*)\//;
	if( $j =~ /ms/ ) {
		$k=0.001;
	} elsif( $j =~ /us/ ) {
		$k=0.000001;
	} elsif( $j =~ /ns/ ) {
		$k=0.000000001;
	} else {
		$k=1;
	}
	$j= $i*$k;
	return $j;
}
#
# Create a number from an EFC value
sub EFC2Num {
	my($s, $i, $j, $k);
	$s=$_[0];
	if( $s =~ /^\s*$/ ) {
		return 9999; 
	}
	if( $s =~ /undef/ ) {
		return 9999; 
	}
	($i, $j) = $s =~ /^(.*)E(.*)/;
	$k=10**$j;
	$j= $i*$k;
	return $j;
}
#---------------------------------------------------------------
# ---Section--- Misc
#
# Printa line if debug is enabled
sub Dprint {
	if( $DEBUG ) {
		print $_[0] . "\r\n";
	}
}
#
# Save the current chart
sub save_chart
{
	my $chart = shift or die "Need a chart!";
	my $name = shift or die "Need a name!";
	local(*OUT);

	my $ext = $chart->export_format;

	open(OUT, ">$name.$ext") or 
		die "Cannot open $name.$ext for write: $!";
	binmode OUT;
	print OUT $chart->gd->$ext();
	close OUT;
}
#
# This routine builds the time strings
sub FormatTime {
	my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
	my($lsec, $lmin, $lhour, $lmday, $lmon, $lyear, $lwday, $lyday, $lisdst);
	#
	($lsec, $lmin, $lhour, $lmday, $lmon, $lyear, $lwday, $lyday, $lisdst) = gmtime($StartTime);
	$lyear+=1900;$lmon++;$lyday++;
	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($EndTime);
	$year+=1900;$mon++;$yday++;
	#
	# Now prepare the display for the time format
	# PB - Enjoy!
	if( $TimeFormat =~ /USA1/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%02d:%02d:%02d", $hour, $min, $sec);
		$RstrStime=sprintf("%02d:%02d:%02d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /USA2/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%3d-%02d:%02d:%02d", $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%3d-%02d:%02d:%02d", $lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /USA3/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%04d.%3d-%02d:%02d:%02d", $year, $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%04d.%3d-%02d:%02d:%02d", $lyear,$lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR1/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%02d:%02d:%02d", $hour, $min, $sec);
		$RstrStime=sprintf("%02d:%02d:%02d.%d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR2/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%3d-%02d:%02d:%02d", $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%3d-%02d:%02d:%02d", $lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR3/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%04d.%3d-%02d:%02d:%02d", $year, $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%04d.%3d-%02d:%02d:%02d", $lyear,$lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /ISO1/ ) {
		# Code by CRF
		$RstrRdate=sprintf("%04d-%02d-%02d", $year, $mon, $mday);
		$RstrLdate=sprintf("%04d-%02d-%02d", $lyear, $lmon, $lmday);
		#
		$RstrRtime=sprintf("%02d:%02d:%02d %s", $hour, $min, $sec, $ReceiverTimeMode);
		$RstrLtime=sprintf("%02d:%02d:%02d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /ISO2/ ) {
		#
		# Code by CRF
		$RstrRdate=sprintf("%04d-%02d-%02d", $year, $mon, $mday);
		$RstrLdate=sprintf("%04d-%02d-%02d", $lyear, $lmon, $lmday);
		#
		$RstrRtime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d %s", $year, $mon, $mday, $hour, $min, $sec, $ReceiverTimeMode);
		$RstrLtime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d", $year, $mon, $mday, $lhour, $lmin, $lsec);
	}
}
#---------------------------------------------------------------
# ---Section--- Command line processing
#
# Process the command line arguments
#
sub ProcCmdLine {
	my($ii, $sarg, @arsave);
	#
	@arsave = @ARGV;
	if( !$NARGS ) {
		&ShowHelp;
	}
	#
	CTEST: foreach $ii ( 0 .. $NARGS ) {
		$sarg = shift @ARGV;
		if( $sarg =~ /\s*-d/ ) {
			$DEBUG=1;
			next CTEST;
		}
		#
		# Time Format
		if( $sarg =~ /\s*-f/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid Time Format Specified: $sarg\r\n";
				exit;
			}
			if( $sarg =~ /USA[123]\s*$/i ) {
				$TimeFormat=$sarg;
			} elsif( $sarg =~ /EUR[123]\s*$/i ) {
				$TimeFormat=$sarg;
			} elsif( $sarg =~ /ISO[12]\s*$/i ) {
				$TimeFormat=$sarg;
			} else {
				print STDERR "Invalid time format: ${sarg}\r\n";
				exit 1;
			}
			next CTEST;
		}
		#
		# Title
		if( $sarg =~ /\s*-t/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid Title\r\n";
				exit;
			}
			$Title=$sarg;
		}
		#
		# Output EFC
		if( $sarg =~ /\s*-e/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid EFC output file\r\n";
				exit;
			}
			$OutfEFC=$sarg;
		}
		#
		# Output HU
		if( $sarg =~ /\s*-u/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid HU output file\r\n";
				exit;
			}
			$OutfHU=$sarg;
		}
		#
		# Input files
		if( $sarg =~ /\s*-i/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid HU output file\r\n";
				exit;
			}
			if( $sarg =~ /,/ ) {				# Do we have two files
				($Inf1,$Inf2) = split(/,/,$sarg);
				$NumInf=2;
			} else {
				$Inf1 = $sarg;
				$NumInf=1;
			}
		}
		#
		# Chart Geometry
		if( $sarg =~ /\s*-g/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid Geometry\r\n";
				exit;
			}
			if( $sarg =~ /x/ ) {				# Do we have two numbers?
				($CWidth,$CHeight) = $sarg =~ /^\s*(\d*)x(\d*).*$/;
			} else {
				print "Invalid Geometry\r\n";
				exit;
			}
			if( $CWidth =~ /^\s*$/ || $CHeight =~ /^\s*$/ ) {
				print "Invalid Geometry: ${sarg}\r\n";
				exit;
			}
		}
		#
		# Color
		if( $sarg =~ /\s*-c/ ) {
			$sarg = shift @ARGV;
			if( $sarg =~ /^-/ || !$sarg ) {		# Did we hit the next option?
				print "Invalid color specified.\r\n";
				exit;
			}
			if( $sarg =~ /,/ ) {				# Do we have two colors
				($Colorc1,$Colorc2) = split(/,/,$sarg);
			} else {
				$Colorc1 = $sarg;
			}
		}
	}
}
#
# Show the help info
sub ShowHelp {
	#
	print "\r\nUsage:\t$0 [-d] [-f time_format] -i input_file1,input_file2,...";
	print "\r\n\t\t\t-e outputEFC_jpg_image -u outputHU_jpg_image\r\n";
	print "\r\n\t\t\t[-g HxW] [-t Chart_Title] [-c color1,color2]";
	print "\n\tWhere:\n\n";
	print "\t-d Show debug output\n";
	print "\t-f time_format -- USA1,USA2,USA3,EUR1,EUR2,EUR3,ISO1,ISO2\n";
	print "\t   The format used to display the time and date\n";
	print "\t-i input_file1,input_file2,...\n";
	print "\t   Input files that will be used to generate the charts\n";
	print "\t-e outputEFC_jpg_image -- The generated JPG of the EFC values chart\n";
	print "\t-u outputHU_jpg_image -- The generated JPG of the Holdover Uncertainty values chart\n";
	print "\t-g Chart_Geometry -- Width x Height. e.x. 700x600\n";
	print "\t-t Chart_Title -- This will appear at the top of the charts\n";
	print "\t-c color1,color2 -- Chart Colors for chart1 and chart2\n";
	exit;
}
