You are on page 1of 4

#!

/usr/bin/perl
#!/usr/local/bin/perl -T
## --> Maximum Jammer Distance, jammin.cgi
## --> Green Bay Professional Packet Radio, www.gbppr.org
## This file Copyright 2003 <contact@gbppr.org> under the GPL
## NO WARRANTY. Please send bug reports / patches / reports.
# Setup
#
use Math::Complex;
select STDOUT;
$| = 1;
my $pic = "pics/jammin.png";
# Print MIME
#
print "Content-type:text/html\n\n";
# Read environment
#
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
my $pt = $FORM{'pt'};
my $pt_val = $FORM{'pt_val'};
my $ht = $FORM{'ht'};
my $ht_val = $FORM{'ht_val'};
my $dt = $FORM{'dt'};
my $dt_val = $FORM{'dt_val'};
my $hj = $FORM{'hj'};
my $hj_val = $FORM{'hj_val'};
my $pj = $FORM{'pj'};
my $pj_val = $FORM{'pj_val'};
my $n = $FORM{'n'};
# Clean up user input data
#
# Power
#
$pt =~ tr/0-9.-//csd;
if ($pt == 0) {
$pt = 0.001;
}
if ($pt_val eq "dBm") {
$pt = 10 ** (($pt - 30) / 10); # dBm to W
}
$pt_w = sprintf "%.3f", $pt;
$pt_dbm = sprintf "%.3f", (10 * log10($pt_w)) + 30;
$pj =~ tr/0-9.-//csd;
if ($pj == 0) {
$pj = 0.001;
}
if ($pj_val eq "dBm") {
$pj = 10 ** (($pj - 30) / 10); # dBm to W
}
$pj_w = sprintf "%.3f", $pj;
$pj_dbm = sprintf "%.3f", (10 * log10($pj_w)) + 30;
# Elevation
#
$ht =~ tr/0-9.//csd;
if (!$ht) {
$ht = 385; # 385 meters
}
if ($ht_val eq "feet") {
$ht = $ht * 0.3048; # ft to m
}
$ht_m = sprintf "%.3f", $ht;
$ht_ft = sprintf "%.3f", $ht * 3.2808399;
$hj =~ tr/0-9.//csd;
if (!$hj) {
$hj = 386; # 386 meters
}
if ($hj_val eq "feet") {
$hj = $hj * 0.3048; # ft to m
}
$hj_m = sprintf "%.3f", $hj;
$hj_ft = sprintf "%.3f", $hj * 3.2808399;
# Distance
#
$dt =~ tr/0-9.//csd;
if (!$dt) {
$dt = 9; # 9 kilometers
}
if ($dt_val eq "miles") {
$dt = $dt * 1.609344; # mi to km
}
$dt_km = sprintf "%.3f", $dt;
$dt_mi = sprintf "%.3f", $dt * 0.62137119;
if ($n eq "Level terrain (over water, sea, lakes, and ponds) - good conductivity
") {
$nv = 2;
}
elsif ($n eq "Rolling hills (farmland type terrain) - good conductivity") {
$nv = 3;
}
elsif ($n eq "Moderately rough terrain (rolling to high hills, forested farmland
) - fair/good conductivity") {
$nv = 4;
}
elsif ($n eq "Very rough terrain (rocky mountains or desert) - poor conductivity
") {
$nv = 5;
}
# Start calculations
#
$a = $pj_w / ($pt_w * 2 * (($ht_m / $hj_m) ** 2));
$dj = $dt_km * ($a ** (1 / $nv));
$dj_km = sprintf "%.3f", $dj;
$dj_mi = sprintf "%.3f", $dj * 0.62137119;
$nv = sprintf "%.2f", $nv;
$date = scalar gmtime;
# Draw me a web page
#
$g = "<font color=\"green\">";
$r = "<font color=\"red\">";
$b = "<font color=\"blue\">";
$e = "</font>";
print <<EOF;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>Maximum Jammer Distance Results</title>
</head>
<body bgcolor="#D3D3D3" text="#000000" link="blue">
<center>
<h2>Maximum Jammer Distance Results</h2>
</center>
<hr noshade>
<center><img src="$pic" alt="[jamdis]"></center>
<hr noshade>
<pre>
$r Power Output of the Enemy Transmitter : $e$pt_w$r Watts ($e$pt_
dbm$r dBm) $e
$r Elevation of the Enemy Transmitter Location (AMSL) : $e$ht_m$r meters ($e$ht
_ft$r feet) $e
$r Enemy Transmitter-to-Target Receiver Distance : $e$dt_km$r kilometers (
$e$dt_mi$r miles) $e
<br>
$g Power Output of the Jammer Transmitter : $e$pj_w$g Watts ($e$pj_
dbm$g dBm) $e
$g Elevation of the Jammer Transmitter Location (AMSL) : $e$hj_m$g meters ($e$hj
_ft$g feet) $e
<br>
$b Terrain and Ground Conductivity Factor : $e$nv
$b Maximum Jammer Location-to-Target Receiver Distance : $e$dj_km$b kilometers (
$e$dj_mi$b miles) $e
</pre>
<hr noshade size="5">
<blockquote>
</blockquote>
<p><font size="-1">Calculated on $date GMT</font></p>
</body>
</html>
EOF

You might also like