#!/usr/bin/perl -T #!/usr/local/bin/perl -T ## --> Free Space Path Loss, path_loss.cgi ## --> Green Bay Professional Packet Radio, www.gbppr.org ## This file Copyright 2003 under the GPL ## NO WARRANTY. Please send bug reports / patches / reports. # Setup # select STDOUT; $| = 1; sub log10 { log($_[0]) * (1 / log(10)); } # 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 $frq = $FORM{'frq'}; my $frq_val = $FORM{'frq_val'}; my $pwr = $FORM{'pwr'}; my $pwr_val = $FORM{'pwr_val'}; my $tx_ant = $FORM{'tx_ant'}; my $tx_ant_val = $FORM{'tx_ant_val'}; my $rx_ant = $FORM{'rx_ant'}; my $rx_ant_val = $FORM{'rx_ant_val'}; my $dist = $FORM{'dist'}; my $dist_val = $FORM{'dist_val'}; # Clean up user input data # # Frequency # $frq =~ tr/0-9.//csd; if (!$frq) { print "Enter a Frequency"; exit 1; } if ($frq_val eq "GHz") { $frq_mhz = sprintf "%.4f", $frq * 1000; $frq_ghz = sprintf "%.4f", $frq; } else { $frq_mhz = sprintf "%.4f", $frq; $frq_ghz = sprintf "%.4f", $frq / 1000; } # Power # $pwr =~ tr/0-9.-//csd; if ($pwr_val eq "Watts") { $pwr_dbm = sprintf "%.2f", (10 * log10($pwr)) + 30; $pwr_w = sprintf "%.2f", $pwr; } else { $pwr_dbm = sprintf "%.2f", $pwr; $pwr_w = sprintf "%.2f", 10 ** (($pwr - 30) / 10); } # TX Ant # $tx_ant =~ tr/0-9.-//csd; if ($tx_ant_val eq "dBi") { $tx_ant_dbi = sprintf "%.2f", $tx_ant; $tx_ant_dbd = sprintf "%.2f", $tx_ant - 2.15; } else { $tx_ant_dbi = sprintf "%.2f", $tx_ant + 2.15; $tx_ant_dbd = sprintf "%.2f", $tx_ant; } # RX Ant # $rx_ant =~ tr/0-9.-//csd; if ($rx_ant_val eq "dBi") { $rx_ant_dbi = sprintf "%.2f", $rx_ant; $rx_ant_dbd = sprintf "%.2f", $rx_ant - 2.15; } else { $rx_ant_dbi = sprintf "%.2f", $rx_ant + 2.15; $rx_ant_dbd = sprintf "%.2f", $rx_ant; } # Distance # $dist =~ tr/0-9.//csd; if (!$dist) { print "Enter a Distance"; exit 1; } if ($dist_val eq "kilometers") { $dist_mi = sprintf "%.2f", $dist * 0.62137119; $dist_km = sprintf "%.2f", $dist; $dist_ft = sprintf "%.2f", $dist * 3280.8399; $dist_m = sprintf "%.2f", $dist * 1000; } elsif ($dist_val eq "meters") { $dist_mi = sprintf "%.2f", $dist / 1609.344; $dist_km = sprintf "%.2f", $dist / 1000; $dist_ft = sprintf "%.2f", $dist / 0.3048; $dist_m = sprintf "%.2f", $dist; } elsif ($dist_val eq "feet") { $dist_mi = sprintf "%.2f", $dist / 5280; $dist_km = sprintf "%.2f", $dist / 3280.8399; $dist_ft = sprintf "%.2f", $dist; $dist_m = sprintf "%.2f", $dist / 3.2808399; } else { $dist_mi = sprintf "%.2f", $dist; $dist_km = sprintf "%.2f", $dist * 1.609344; $dist_ft = sprintf "%.2f", $dist * 5280; $dist_m = sprintf "%.2f", $dist * 1609.344; } # Start calculations # $fs = (20 * (log10 $frq_mhz)) + (20 * (log10 ($dist_mi * 1.609344))) + 32.447782; $rx_dbm = (($pwr_dbm + $tx_ant_dbi) - $fs) + $rx_ant_dbi; $rx_uvolt = (sqrt((10 ** ($rx_dbm / 10) / 1000) * 50)) * 1000000; # Make all pretty # $fs = sprintf "%.2f", $fs; $rx_dbm = sprintf "%.2f", $rx_dbm; $rx_uvolt = sprintf "%.2f", $rx_uvolt; $date = scalar gmtime; # Draw me a web page # $p = ""; $r = ""; $b = ""; $e = ""; print < Free Space Path Loss Results

Free Space Path Loss Results


$p  Distance to Transmitter : $e$dist_km$p kilometers  ($e$dist_m$p meters) $e
$p                          : $e$dist_mi$p miles  ($e$dist_ft$p feet) $e
$p    Transmitter Frequency : $e$frq_mhz$p MHz  ($e$frq_ghz$p GHz) $e
$p        Transmitter Power : $e$pwr_w$p Watts  ($e$pwr_dbm$p dBm) $e
$p Transmitter Antenna Gain : $e$tx_ant_dbi$p dBi  ($e$tx_ant_dbd$p dBd) $e
$p    Receiver Antenna Gain : $e$rx_ant_dbi$p dBi  ($e$rx_ant_dbd$p dBd) $e

$b Received Power Level : $e$rx_dbm$b dBm ($e$rx_uvolt$b µVolts) $e $b Free Space Attenuation : $e$fs$b dB $e

Calculated on $date GMT

EOF