From 27ed001a734aaac2310c855d20fdb027357a0585 Mon Sep 17 00:00:00 2001 From: "Gary E. Miller" Date: Wed, 25 Mar 2015 14:02:39 -0700 Subject: Revert "Removed contrib/skyview.php amd contrib/maxsats.pl, they used the old protocol." This reverts commit 0dac112485e7a7117bd9ac735625f20e10750e79. Sanjeev Gupta wants a chance to fix the old programs. --- contrib/skyview.php | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100755 contrib/skyview.php (limited to 'contrib/skyview.php') diff --git a/contrib/skyview.php b/contrib/skyview.php new file mode 100755 index 00000000..581b2f50 --- /dev/null +++ b/contrib/skyview.php @@ -0,0 +1,264 @@ +#!/usr/local/bin/php + +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +$cellmode = 0; +if ($argc != 3){ + if (($argc != 4) || strcmp("cells", $argv[3])){ + die("usage: ${argv[0]} logfile imagefile [cells]\n"); + } else { + $cellmode = 1; + } +} + +$sz = 640; +$cellsize = 5; # degrees +$radius = 8; # pixels +$filled = 0; + +$im = imageCreate($sz, $sz); +$C = colorsetup($im); +skyview($im, $sz, $C); +legend($im, $sz, $C); + +$sky = array(); + +$fd = @fopen($argv[1], 'r'); +while (!feof($fd)){ + $line = fgets($fd); + if (preg_match('/,Y=\S+ [0-9\.\?]+ (\d+):/', $line, $m)){ + $n = $m[1]; + $s = explode(':', $line); + for($i = 1; $i <= $n; $i++){ + list($sv, $el, $az, $snr, $u) = explode(' ', $s[$i]); + if ($cellmode){ + $az = $cellsize * (int)($az/$cellsize); + $el = $cellsize * (int)($el/$cellsize); + } + if (isset($sky[$az][$el]['avg'])){ + $sky[$az][$el]['snr'] += $snr; + $sky[$az][$el]['num']++; + } else { + $sky[$az][$el]['snr'] = $snr; + $sky[$az][$el]['num'] = 1; + } + $sky[$az][$el]['avg'] = $sky[$az][$el]['snr'] / $sky[$az][$el]['num']; + } + } +} +foreach($sky as $az => $x){ + foreach ($sky[$az] as $el => $y){ + $e = array(-1, $el, $az, $sky[$az][$el]['avg'], -1); + if ($cellmode) + cellplot($im, $sz, $C, $cellsize, $e); + else + splot($im, $sz, $C, $radius, $filled, $e); + } +} + +skygrid($im, $sz, $C); # redraw grid over satellites +imagePNG($im, $argv[2]); +imageDestroy($im); + +exit(0); + +########################################################################### +function colorsetup($im){ + $C['white'] = imageColorAllocate($im, 255, 255, 255); + $C['ltgray'] = imageColorAllocate($im, 191, 191, 191); + $C['mdgray'] = imageColorAllocate($im, 127, 127, 127); + $C['dkgray'] = imageColorAllocate($im, 63, 63, 63); + $C['black'] = imageColorAllocate($im, 0, 0, 0); + $C['red'] = imageColorAllocate($im, 255, 0, 0); + $C['brightgreen'] = imageColorAllocate($im, 0, 255, 0); + $C['darkgreen'] = imageColorAllocate($im, 0, 192, 0); + $C['blue'] = imageColorAllocate($im, 0, 0, 255); + $C['cyan'] = imageColorAllocate($im, 0, 255, 255); + $C['magenta'] = imageColorAllocate($im, 255, 0, 255); + $C['yellow'] = imageColorAllocate($im, 255, 255, 0); + $C['orange'] = imageColorAllocate($im, 255, 128, 0); + + return $C; +} + +function legend($im, $sz, $C){ + $r = 30; + $fn = 5; + $x = $sz - (4*$r+7) - 2; + $y = $sz - $r - 3; + + imageFilledRectangle($im, $x, $y, $x + 4*$r + 7, $y + $r +1, $C['dkgray']); + imageRectangle($im, $x+0*$r+1, $y+1, $x + 1*$r + 0, $y + $r, $C['red']); + imageRectangle($im, $x+1*$r+2, $y+1, $x + 2*$r + 2, $y + $r, $C['yellow']); + imageRectangle($im, $x+2*$r+4, $y+1, $x + 3*$r + 4, $y + $r, $C['darkgreen']); + imageRectangle($im, $x+4*$r+6, $y+1, $x + 3*$r + 6, $y + $r, $C['brightgreen']); + imageString($im, $fn, $x+3+0*$r, $y+$r/3, "<30", $C['red']); + imageString($im, $fn, $x+5+1*$r, $y+$r/3, "30+", $C['yellow']); + imageString($im, $fn, $x+7+2*$r, $y+$r/3, "35+", $C['darkgreen']); + imageString($im, $fn, $x+9+3*$r, $y+$r/3, "40+", $C['brightgreen']); +} + +function radial($angle, $sz){ + #turn into radians + $angle = deg2rad($angle); + + # determine length of radius + $r = $sz * 0.5 * 0.95; + + # and convert length/azimuth to cartesian + $x0 = sprintf("%d", (($sz * 0.5) - ($r * cos($angle)))); + $y0 = sprintf("%d", (($sz * 0.5) - ($r * sin($angle)))); + $x1 = sprintf("%d", (($sz * 0.5) + ($r * cos($angle)))); + $y1 = sprintf("%d", (($sz * 0.5) + ($r * sin($angle)))); + + return array($x0, $y0, $x1, $y1); +} + +function azel2xy($az, $el, $sz){ + #rotate coords... 90deg W = 180deg trig + $az += 270; + + #turn into radians + $az = deg2rad($az); + + # determine length of radius + $r = $sz * 0.5 * 0.95; + $r -= ($r * ($el/90)); + + # and convert length/azimuth to cartesian + $x = sprintf("%d", (($sz * 0.5) + ($r * cos($az)))); + $y = sprintf("%d", (($sz * 0.5) + ($r * sin($az)))); + $x = $sz - $x; + + return array($x, $y); +} + +function cellplot($im, $sz, $C, $cellsize, $e){ + list($sv, $el, $az, $snr, $u) = $e; + + if ((0 == $sv) || (0 == $az + $el + $snr) || + ($az < 0) || ($el < 0)) + return; + + $color = $C['brightgreen']; + if ($snr < 40) + $color = $C['darkgreen']; + if ($snr < 35) + $color = $C['yellow']; + if ($snr < 30) + $color = $C['red']; + if ($snr < 15) + $color = $C['dkgray']; + + #consider an N-degree cell plotted at (0,0). its top left corner + #will be (0,0) and its bottom right corner will be at (N,N). The + #sides are straight lines from (0,0)-(0,N) and (N,0)-(N,N). The + #top and bottom edges will be approximated by segments from + #(0,0):(0,1)..(0,N-1):(0,N) and (N,0):(N,1)...(N,N-1):(N,N). + #Plotting that unholy mess is the job of + # imagefilledpolygon ( $image, array $points, $num_points, $color ) + + $np = 0; + $points = array(); + for($x = $az; $x <= $az+$cellsize; $x++){ + list($px,$py) = azel2xy($x, $el, $sz); + array_push($points, $px, $py); + $np++; + } + for($x = $az+$cellsize; $x >= $az; $x--){ + list($px,$py) = azel2xy($x, $el+$cellsize, $sz); + array_push($points, $px, $py); + $np++; + } + list($px,$py) = azel2xy($az, $el, $sz); + array_push($points, $px, $py); + $np++; + + if ($snr > 0) + imageFilledPolygon($im, $points, $np, $color); +} + +function splot($im, $sz, $C, $r, $filled, $e){ + list($sv, $az, $el, $snr, $u) = $e; + + if ((0 == $sv) || (0 == $az + $el + $snr)) + return; + + $color = $C['brightgreen']; + if ($snr < 40) + $color = $C['darkgreen']; + if ($snr < 35) + $color = $C['yellow']; + if ($snr < 30) + $color = $C['red']; + if ($snr == 0) + $color = $C['black']; + + list($x, $y) = azel2xy($el, $az, $sz); + + if ($snr > 0){ + if ($filled) + imageFilledArc($im, $x, $y, $r, $r, 0, 360, $color, 0); + else + imageArc($im, $x, $y, $r, $r, 0, 360, $color); + } +} + +function elevation($im, $sz, $C, $a){ + $b = 90 - $a; + $a = $sz * 0.95 * ($a/180); + imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); + $x = $sz/2 - 16; + $y = $sz/2 - $a; + imageString($im, 2, $x, $y, $b, $C['ltgray']); +} + +function skyview($im, $sz, $C){ + $a = 90; $a = $sz * 0.95 * ($a/180); + imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['mdgray'], 0); + imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['black']); + $x = $sz/2 - 16; $y = $sz/2 - $a; + imageString($im, 2, $x, $y, "0", $C['ltgray']); + + $a = 85; $a = $sz * 0.95 * ($a/180); + imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['white'], 0); + imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); + imageString($im, 1, $sz/2 - 6, $sz+$a, '5', $C['black']); + $x = $sz/2 - 16; $y = $sz/2 - $a; + imageString($im, 2, $x, $y, "5", $C['ltgray']); + + skygrid($im, $sz, $C); + $x = $sz/2 - 16; $y = $sz/2 - 8; + /* imageString($im, 2, $x, $y, "90", $C['ltgray']); */ + + imageString($im, 4, $sz/2 + 4, 2 , 'N', $C['black']); + imageString($im, 4, $sz/2 + 4, $sz - 16 , 'S', $C['black']); + imageString($im, 4, 4 , $sz/2 + 4, 'E', $C['black']); + imageString($im, 4, $sz - 10 , $sz/2 + 4, 'W', $C['black']); + +} + +function skygrid($im, $sz, $C){ + for($i = 0; $i < 180; $i += 15){ + list($x0, $y0, $x1, $y1) = radial($i, $sz); + imageLine($im, $x0, $y0, $x1, $y1, $C['ltgray']); + } + + for($i = 15; $i < 90; $i += 15) + elevation($im, $sz, $C, $i); +} + +?> -- cgit v1.2.1