#!/usr/bin/perl

&ReadParse;
print "Content-type: text/html\n\n";

#print "<h3>FORM PARAMETERS</h3>MODEL: $in{'model'}<BR>Frequency:$in{'frequency'}<HR>\n";

if (length($in{'model'})> 3 && $in{'model'} ne "Select One" && $in{'frequency'} > 1)
	{
	&Header;
	print @header;
	# Show Results
	&RetrieveDBRecord;
	#print "<h3>FORMULA:</h3>\n";
	if ($method eq "output" && $output_step > 0)
		{
		$decimal_value = ($in{'frequency'} + $output_if) / $output_step;
		#print "<b>$decimal_value</b> = ($in{'frequency'} + $output_if) / $output_step<BR>\n";
		&DecToBin;
		#@bits = NewDecToBin($decimal_value);
		#print "<HR>BITS: @bits</hr>\n";
		#$binary_string = join ("", @bits);
		}
	elsif ($input_step >0)
		{
		$decimal_value = ($in{'frequency'} + $input_if) / $input_step;
		#print "<b>$decimal_value</b> = ($in{'frequency'} + $input_if) / $input_step<BR>\n";
		&DecToBin;
		&BandSelect;
		}
	else
		{
		print "ERROR: Division By Zero Error<BR>Record: $record<BR>\n";
		die;
		}
	#print "<HR><h3>RESULT</h3>Convert $in{'frequency'} uses <b>$binary_string ($decimal_value)</b>\n";
	if ($band_select ne "")
		{
		#print " Band Select: <b>$band_select</b>\n";
		}
	#print "<HR>\n";
	&CheckFreqLimits;
	($integer, $decimal) = split (/\./,$decimal_value);
	if ($integer != $decimal_value && $decimal > 0)
	#if (int($decimal_value) != $decimal_value)
		{
		#$integer = int($decimal_value);
		print "<BR><BR><BR><h3>ERROR: Division Error</h3><BR><B>The resultant frequency is not an integer.<BR><BR>DECIMAL VALUE: $decimal_value<BR>INTEGER: $integer<BR>DECIMAL: $decimal<BR><BR><BR><BR>\n";
		}
	elsif ($invalid_freq == 1)
		{
		print "<BR><BR><BR><h3>ERROR: Invalid Frequency</h3><BR><B>$in{'frequency'}</b> is not a valid frequency for this product.<BR><BR><BR><BR>\n";
		}
	else
		{
		if ($bits == 10)
			{
			&DisplayVertical;
			}
		else
			{
			&DisplayResults;
			}
		}
	print @footer;
	}
elsif (length($in{'model'})> 3 && $in{'model'} ne "Select One")
	{
	&RetrieveDBRecord;
	&Header;
	print @header;
	print "<form action=dip_settings.cgi>\n";
	print "<h3>$printmodel</h3>\n";
	if ($method eq "output")
		{
		print "<b>IF Frequency:</b> $output_if<BR>\n";
		print "<b>Step Size:</b> $output_step<BR>\n";
		}		
	else
		{
		print "<b>IF Frequency:</b> $input_if<BR>\n";
		print "<b>Step Size:</b> $input_step<BR>\n";
		}
	print "<BR>\n";
	print "<b>RF Frequency:</b><BR>\n";
	print "<input name=frequency>\n";
	print "<input type=hidden name=model value=\"$in{'model'}\">\n";
	print "<BR><BR><input name=submit type=image src=\"/xtranet/Images/calculate-button.gif\">\n";
	print "</form>\n";
	print @footer;
	}
else
	{
	# Show Form
	&HeaderFront;
	print @header;
	print "<form name=\"menu\">\n";#action=dip_settings.cgi>\n";
	print "<b>Select Model:</b><BR>\n";
	print "<select name=a onChange=\"location.href = this.form.a.options[this.form.a.selectedIndex].value\">\n";
	print "<option value=\"dip_settings.cgi\" selected>Select One</option>\n";
	open (IN, "dip_conversion_table.txt");
	while (<IN>)
		{
		chop ($_);
		@split = split (/\t/, $_);	
		if ($split[1] > 0 && $split[2] > 0)
			{
			print "<option value=\"dip_settings.cgi?model=$split[0]+(Output)\">$split[0] (Output)</option>\n";
			print "<option value=\"dip_settings.cgi?model=$split[0]+(Input)\">$split[0] (Input)</option>\n";
			}
		elsif ($split[1] > 0)
			{
			print "<option value=\"dip_settings.cgi?model=$split[0]+(Input)\">$split[0]</option>\n";
			}
		else
			{
			print "<option value=\"dip_settings.cgi?model=$split[0]+(Output)\">$split[0]</option>\n";
			}
		}
	close (IN);
	print "</select><BR><BR>\n";
	#print "<BR><BR><input type=submit value=\"Locate Model\">\n";
	print "</form>\n";
	print @footer;
	}
	
	
sub ReadParse {
    local (*in) = @_ if @_;


  local ($i, $loc, $key, $val);

  # Read in text
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $in = $ENV{'QUERY_STRING'};
  } elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
  }

  @in = split(/&/,$in);

  foreach $i (0 .. $#in) {
    # Convert plus's to spaces
    $in[$i] =~ s/\+/ /g;

    # Convert %XX from hex numbers to alphanumeric
    $in[$i] =~ s/%(..)/pack("c",hex($1))/ge;

    # Split into key and value.  
    ($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
    $in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
    $in{$key} .= $val;
  }

  return 1; # just for fun
}

sub DecToBin
{
if ($bits == 10)
	{
	$binval[0] = 512;
	$binval[1] = 256;
	$binval[2] = 128;
	$binval[3] = 64;
	$binval[4] = 32;
	$binval[5] = 16;
	$binval[6] = 8;
	$binval[7] = 4;
	$binval[8] = 2;
	$binval[9] = 1;
	}
elsif ($bits == 13)
	{
	$binval[0] = 4096;
	$binval[1] = 2048;
	$binval[2] = 1024;
	$binval[3] = 512;
	$binval[4] = 256;
	$binval[5] = 128;
	$binval[6] = 64;
	$binval[7] = 32;
	$binval[8] = 16;
	$binval[9] = 8;
	$binval[10] = 4;
	$binval[11] = 2;
	$binval[12] = 1;
	}
else
	{
	$binval[0] = 2048;
	$binval[1] = 1024;
	$binval[2] = 512;
	$binval[3] = 256;
	$binval[4] = 128;
	$binval[5] = 64;
	$binval[6] = 32;
	$binval[7] = 16;
	$binval[8] = 8;
	$binval[9] = 4;
	$binval[10] = 2;
	$binval[11] = 1;
	}

$count_bits = $bits;
#$count_bits = $bits + 1; #Initial Setting
$dec = $decimal_value;
foreach (@binval)
	{
	$count_bits--;
	#print "&nbsp;&nbsp;&nbsp;&nbsp;BINARY CONVERSION: Bit # $count_bits--$_--$dec--==\n";
	if ($_ <= $dec)
		{
		$binary[$count_bits] = 1;
		$dec -= $_;
		$integer = int ($dec);
		$diff = $integer - $dec;
		$fix=0;
		if ($diff < 0)
			{
			$diff *= -1;
			}
		if ($diff > .9999 && $diff < 1)
			{
			($dec, $trash) = split (/\./, $dec);
			#$dec++;
			$fix = 1;
			}
		#print " <b>$_ <= $dec</b> == $diff ($fix) == \n";
		}
	else
		{
		$binary[$count_bits] = 0;
		#print " <b>$_ > $dec</b> == \n";
		}
	#print "$binary[$count_bits]<BR>\n";
	$binary_string .= $binary[$count_bits];
	}
}

sub BandSelect
{
$frequency = $in{'frequency'};
if ($model =~ /LCD-500/ || $model =~ /LCP-500/)  # All LCD-500-x AND LCP-500-x
	{
	if ($frequency <= 110)
		{
		$band_select = "011";
		}
	elsif ($frequency <= 300)
		{
		$band_select = "101";
		}
	else
		{
		$band_select = "110";
		}
	}
if ($model eq "LCP-600-C")  # Only LCP-600-C
	{
	if ($frequency <= 168)
		{
		$band_select = "011";
		}
	elsif ($frequency <= 447)
		{
		$band_select = "101";
		}
	else
		{
		$band_select = "110";
		}
	}
if ($model =~ /OTD-2000/ || $model =~ /OTR-2500/)   # All OTD-2000-x AND OTR-2500-x
	{
	if ($frequency <= 98)
		{
		$band_select = "0111";
		}
	elsif ($frequency <= 212)
		{
		$band_select = "1011";
		}
	elsif ($frequency <= 368)
		{
		$band_select = "1101";
		}
	else
		{
		$band_select = "1110";
		}
	}
if ($model =~ /OTD-3000-B\/G/)  # ONLY
	{
	if ($frequency <= 168)
		{
		$band_select = "0111";
		}
	elsif ($frequency <= 447)
		{
		$band_select = "1011";
		}
	else
		{
		$band_select = "1110";
		}
	}
if ($model =~ /OTD-3000 PAL DC/)  # Only OTD-300 PAL DC
	{
	if ($frequency <= 109)
		{
		$band_select = "0111";
		}
	elsif ($frequency <= 269)
		{
		$band_select = "1011";
		}
	elsif ($frequency <= 419)
		{
		$band_select = "1101";
		}
	else
		{
		$band_select = "1110";
		}
	}
if ($model eq "OTD-3000" || $model eq "OTD-3550-NTSC")   # All OTD-2000-x AND OTR-2500-x
	{
	if ($frequency <= 98)
		{
		$band_select = "111";
		}
	elsif ($frequency <= 212)
		{
		$band_select = "011";
		}
	elsif ($frequency <= 368)
		{
		$band_select = "101";
		}
	else
		{
		$band_select = "110";
		}
	}
if ($model =~ /OTR-2000/)
	{
	if ($frequency <= 84)
		{
		$band_select = "100";
		}
	elsif ($frequency <= 212)
		{
		$band_select = "0100";
		}
	elsif ($frequency <= 465)
		{
		$band_select = "0010";
		}
	else
		{
		$band_select = "0001";
		}
	}	
if ($model eq "LCP-500-550-DC" || $model eq "LCP-500-H-DC" || $model eq "LCD-500-DC")
	{
	if ($frequency <= 106)
		{
		$band_select = "0111";
		}
	elsif ($frequency <= 300)
		{
		$band_select = "1011";
		}
	else
		{
		$band_select = "1101";
		}
	}
$bs_len = length ($band_select);
$counter = -1;
$bs_len--;
while ($counter < $bs_len)
	{
	$counter++;
	$band_select_bit[$counter] = substr($band_select,$counter,1);
	#print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONVERTING Band Select: $counter -> $band_select_bit[$counter]<BR>\n";
	}
}

sub Header
{
$footer = 0;
open (IN, "template-dips.htm");
while (<IN>)
	{
	chop($_);
	#$_ =~ s/src="/src="http:\/\/www.olson-technology.com\//g;
	if ($_ =~ /<!INSERT>/)
		{
		# Begin Footer
		$header++;
		$header[$header] = "<! Begin Insert>\n";
		$footer++;
		$footer[$footer] = "<! End Insert>\n";
		}
	if ($footer < 1)
		{
		$header++;
		$header[$header] = "$_\n";
		}
	else
		{
		$footer++;
		$footer[$footer] = "$_\n";
		}
	}
close (IN);
}
sub HeaderFront
{
$footer = 0;
open (IN, "template-dips-intro.htm");
while (<IN>)
	{
	chop($_);
	#$_ =~ s/src="/src="http:\/\/www.olson-technology.com\//g;
	if ($_ =~ /<!INSERT>/)
		{
		# Begin Footer
		$header++;
		$header[$header] = "<! Begin Insert>\n";
		$footer++;
		$footer[$footer] = "<! End Insert>\n";
		}
	if ($footer < 1)
		{
		$header++;
		$header[$header] = "$_\n";
		}
	else
		{
		$footer++;
		$footer[$footer] = "$_\n";
		}
	}
close (IN);
}

sub RetrieveDBRecord
{
open (IN, "dip_conversion_table.txt");
while (<IN>)
	{
	chop ($_);
	@split = split (/\t/, $_);
	if ($in{'model'} =~ /Input/)
		{
		$method = "input";
		$model = $in{'model'};
		$model =~ s/ \(Input\)//g;
		}
	else
		{
		$method = "output";
		$model = $in{'model'};
		$model =~ s/ \(Output\)//g;
		}
	if ($split[0] eq $model && length ($model) >1)
		{
		$input_if = $split[1];
		$output_if = $split[2];
		$input_step = $split[3];
		$output_step = $split[4];
		$emulation = $split[5];
		$record = $_;
		$bits = $split[6];
		$displaymode = $split[7];
		if ($input_if > 0 && $output_if > 0)
			{
			$printmodel = $in{'model'};
			}
		else
			{
			$printmodel = $split[0];
			}
		}
	}
close (IN);
}

sub DisplayResults
{
print "<font size=4>Dip Switch Settings For $printmodel</font><BR>\n";
if ($method eq "output")
	{
	print "<b>IF Frequency:</b> $output_if -- \n";
	print "<b>Step Size:</b> $output_step<BR>\n";
	}		
else
	{
	print "<b>IF Frequency:</b> $input_if -- \n";
	print "<b>Step Size:</b> $input_step<BR>\n";
	}
print "<BR><B>RF Frequency:</b> $in{'frequency'}\n";
print "<TABLE border=1 cellpadding=1 cellspacing=10 width=750>\n";
print "<TR><TD Colspan = $bits><CENTER><Font face=arial size=4><B>Frequency Dip Switches</b></font></td>\n";
if ($band_select ne "")
	{
	$bs_len = length ($band_select);
	print "<TD Colspan = $bs_len><CENTER><Font face=arial size=4><B>Band Select</b></font></td>\n";
	}
print "</tr>\n";
print "<TR>\n";
$counter = 0;
while ($counter < $bits)
	{
	$counter ++;
	$display = $counter;
	if ($displaymode == 3)
		{
		if ($display == 1)
			{
			$display = 13;
			}
		else
			{
			$display--;
			}
		}
	if ($counter == 13 && $displaymode == 1)
		{
		$display = "Rear Toggle Switch";
		}
	print "<TD><CENTER><font face=arial size=3>$display</td>\n";
	}
$counter = 0;
while ($counter < $bs_len)
	{
	$counter ++;
	print "<TD><CENTER><font face=arial size=3>$counter</td>\n";
	}
print "</tr>\n";
print "<TR>\n";
$counter = -1;
foreach (@binary)
	{
	$counter ++;
	$display = $counter;
	if ($displaymode == 3)
		{
		if ($display == 0)
			{
			$display = 12;
			}
		else
			{
			$display--;
			}
		}
	print "<TD><CENTER><img src=\"$binary[$display].gif\"></td>\n";
	}
foreach (@band_select_bit)
	{
	print "<TD><CENTER><img src=\"$_.gif\"></td>\n";
	}
print "</tr>\n";
print "<TR>\n";
$counter = -1;
foreach (@binary)
	{
	$counter ++;
	$display = $counter;
	if ($displaymode == 3)
		{
		if ($display == 0)
			{
			$display = 12;
			}
		else
			{
			$display--;
			}
		}
	print "<TD><CENTER><Font face=arial size=2><B>$binary[$display]</td>\n";
	}
foreach (@band_select_bit)
	{
	print "<TD><CENTER><Font face=arial size=2><B>$_</td>\n";
	}
print "</tr>\n";
if ($displaymode == 2)
	{
	$totalcols = $bs_len+$bits;
	print "<TR><TD colspan=$totalcols><B>NOTE:</b> Earlier versions have a Toggle Switch on the rear panel for the 13th bit. Later versions use dip switch # 4 in the 4 position group to the left of the 12 position group of dip switches.</td></tr>\n";
	}
print "</table>\n";	
}


sub CheckFreqLimits
{
$in{'frequency'}++;
$in{'frequency'}--;
if ($in{'frequency'} > 411 && ($in{'model'} eq "OTM-2000-SW (Output)" || $in{'model'} eq "OTR-2000-SW (Output)"))
	{
	$invalid_freq = 1;
	}
if (($in{'frequency'} > 301 && $in{'frequency'} <=469 ) && ($in{'model'} eq "LCD-500 (Input)" || $in{'model'} eq "LCD-500-DC" || $in{'model'} eq "LCP-500-550 (Input)" || $in{'model'} eq "LCP-500-550-DC (Input)" || $in{'model'} eq "LCP-500-A (Input)" || $in{'model'} eq "LCP-500-A (Input)" || $in{'model'} eq "LCP-500-H (Input)" || $in{'model'} eq "LCP-500-H-DC (Output)" || $in{'model'} eq "LCP-500-H (Output)"))
	{
	$invalid_freq = 1;
	}
if (($in{'frequency'} < 88 || $in{'frequency'} > 108) && $in{'model'} =~ /OTFM-1000/)
	{
	$invalid_freq = 1;
	}
}

sub NewDecToBin
{
#Up to 65536 decimal
$bincounter=$bits;
$value = pop(@_);
while ($bincounter > 0)
	{
	$bincounter--;
	$factor = $bincounter;
	$exp = 2 ** $factor;
	if ($value >= $exp)
		{
		#print "$value -- $bincounter -- $factor--$exp<BR>\n";
		$value -= $exp;
		$bit[$bincounter] = 1;
		}
	else
		{
		$bit[$bincounter] = 0;
		}
	}
return (@bit);
}


sub DisplayVertical
{
print "<font size=4>Dip Switch Settings For $printmodel</font><BR>\n";
if ($method eq "output")
	{
	print "<b>IF Frequency:</b> $output_if -- \n";
	print "<b>Step Size:</b> $output_step<BR>\n";
	}		
else
	{
	print "<b>IF Frequency:</b> $input_if -- \n";
	print "<b>Step Size:</b> $input_step<BR>\n";
	}
print "<BR><B>RF Frequency:</b> $in{'frequency'}\n";
print "<TABLE border=1 cellpadding=1 cellspacing=10 width=300>\n";
print "<TR><TD Colspan = 3><CENTER><Font face=arial size=4><B>Frequency Dip Switches</b></font></td>\n";
print "</tr>\n";
print "<TR>\n";
print "<TD><CENTER><font face=arial size=3>Switch Number</td>\n";
print "<TD colspan=2><CENTER><font face=arial size=3>Switch Setting</td>\n";
print "</tr>\n";
#$counter = -1;
#while ($counter < ($bits -1 ))
#	{
#	$counter++;
#	$switch = $counter + 1;
#	print "<TR>\n";
#	print "<TD><CENTER><font face=arial size=3>$switch</td>\n";
#	print "<td><CENTER><img src=\"horiz$binary[$counter].gif\"></td>\n";
#	print "<td><CENTER><font face=arial size=3>$binary[$counter]</td>\n";
#	print "</tr>\n";
#	}
$counter = $bits;
$switch = 0;
while ($counter > 0)
	{
	$counter--;
	$switch++;
	print "<TR>\n";
	print "<TD><CENTER><font face=arial size=3>$switch</td>\n";
	print "<td><CENTER><img src=\"horiz$binary[$counter].gif\"></td>\n";
	print "<td><CENTER><font face=arial size=3>$binary[$counter]</td>\n";
	print "</tr>\n";
	}

print "</table>\n";	
}
