]> git.sesse.net Git - nms/blob - web/overlay.pl
Merge.
[nms] / web / overlay.pl
1 #! /usr/bin/perl
2 use GD;
3 use LWP::Simple;
4 use CGI;
5 use DBI;
6 use lib '../include';
7 use nms;
8
9 my $cgi = CGI->new;
10 my $dbh = nms::db_connect();
11
12 my $cam = $cgi->param('cam');
13 if (!defined($cam) || ($cam ne "1" && $cam ne "2")) {
14         $cam = 1;
15 }
16
17 GD::Image->trueColor(1);
18 my $imgfile = LWP::Simple::get(($cam == 1) ? 'http://tgcam.jodal.no/techserver.php' : 'http://tgcam.jodal.no/crewcam.php')
19         or die "LWP: $!";
20 my $gd = GD::Image->newFromJpegData($imgfile)
21         or die "GD: $!";
22
23 my @coeffs;
24 if ($cam == 1)  {
25         @coeffs = (
26                 2.295433895, -3.779680538, 1041.484066,
27                 0.2246879859, 6.923972919, -1575.662172,
28                 -0.0004822922595, 0.01151624710, -1.684908753
29         );
30 } else {
31         @coeffs = (
32                 3.656223906, -6.265111699, 863.9199590,
33                 -5.954616242, 51.56856164, -9307.725196,
34                 -0.006634136987, 0.04963057393, -7.875733154
35         );
36 }
37
38 # fetch our data
39 my $q = $dbh->prepare('select * from switches natural left join
40                 ( select switch,sum(bytes_in)/count(*) as
41                   bytes_in,sum(bytes_out)/count(*) as bytes_out from get_datarate() group
42                   by switch ) t1 where ip<>\'127.0.0.1\' and sysname like \'e%-%sw\'');
43 $q->execute();
44
45 my %sc = ();
46 while (my $ref = $q->fetchrow_hashref()) {
47         if (defined($ref->{'bytes_in'})) {
48                 my $intensity = 0.0;
49                 my $traffic = 4.0 * $ref->{'bytes_in'} + $ref->{'bytes_out'};  # average and convert to bits (should be about the same in practice)
50
51                 my $max = 20_000_000.0;   # 10mbit
52                 my $min =    100_000.0;   # 100kbit
53                 if ($traffic >= $min) {
54                         $intensity = 2.0 * (log($traffic / $min) / log(10)) / (log($max / $min) / log(10));
55                         $intensity = 2.0 if ($intensity > 2.0);
56                 }
57
58                 $sc{$ref->{'sysname'}} = get_color($intensity);
59         }
60 }
61
62 for my $y (0..479) {
63         for my $x (0..639) {
64                 my $z = 1.0;
65
66                 my $nx = $coeffs[0] * $x + $coeffs[1] * $y + $coeffs[2] * $z;
67                 my $ny = $coeffs[3] * $x + $coeffs[4] * $y + $coeffs[5] * $z;
68                 my $nz = $coeffs[6] * $x + $coeffs[7] * $y + $coeffs[8] * $z;
69
70                 my $kx = $nx / $nz + (($cam == 2) ? 700 : 0);
71                 my $ky = $ny / $nz + (($cam == 2) ? -15 : 0);
72
73                 if ($kx >= 0 && $kx < 640 && $ky >= 0 && $ky < 476) {
74                         my $col = int($kx / 213) + 1;
75                         my $row = int($ky / 32) * 2 + 5;
76
77                         my $gnf = $sc{"e$row-${col}sw"};
78                         if (defined($gnf)) {
79                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
80                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
81
82                                 my $f = 0.5;
83
84                                 my $r = $ra * (1.0 - $f) + $rb * $f;
85                                 my $g = $ga * (1.0 - $f) + $gb * $f;
86                                 my $b = $ba * (1.0 - $f) + $bb * $f;
87
88                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
89                         }
90                 }
91                 if ($kx >= 680 && $kx < 1280 && $ky >= 0 && $ky < 476) {
92                         my $col = int(($kx - 680) / 213) + 4;
93                         my $row = int($ky / 32) * 2 + 5;
94
95                         my $gnf = $sc{"e$row-${col}sw"};
96                         if (defined($gnf)) {
97                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
98                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
99
100                                 my $f = 0.5;
101
102                                 my $r = $ra * (1.0 - $f) + $rb * $f;
103                                 my $g = $ga * (1.0 - $f) + $gb * $f;
104                                 my $b = $ba * (1.0 - $f) + $bb * $f;
105
106                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
107                         }
108                 }
109                 if ($kx >= 0 && $kx < 640 && $ky >= 510 && $ky < 1050) {
110                         my $col = int($kx / 213) + 1;
111                         my $row = int($ky / 32) * 2 + 5;
112
113                         my $gnf = $sc{"e$row-${col}sw"};
114                         if (defined($gnf)) {
115                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
116                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
117
118                                 my $f = 0.5;
119
120                                 my $r = $ra * (1.0 - $f) + $rb * $f;
121                                 my $g = $ga * (1.0 - $f) + $gb * $f;
122                                 my $b = $ba * (1.0 - $f) + $bb * $f;
123
124                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
125                         }
126                 }
127                 if ($kx >= 680 && $kx < 1280 && $ky >= 510 && $ky < 1050) {
128                         my $col = int(($kx - 680) / 213) + 4;
129                         my $row = int($ky / 32) * 2 + 5;
130
131                         my $gnf = $sc{"e$row-${col}sw"};
132                         if (defined($gnf)) {
133                                 my ($ra, $ga, $ba) = $gd->rgb($gd->getPixel($x, $y));
134                                 my ($rb, $gb, $bb) = $gd->rgb($gnf);
135
136                                 my $f = 0.5;
137
138                                 my $r = $ra * (1.0 - $f) + $rb * $f;
139                                 my $g = $ga * (1.0 - $f) + $gb * $f;
140                                 my $b = $ba * (1.0 - $f) + $bb * $f;
141
142                                 $gd->setPixel($x, $y, $gd->colorAllocate($r, $g, $b));
143                         }
144                 }
145         }
146 }
147
148
149 print CGI::header(-type=>'image/png', -refresh=>'10; http://nms.tg07.gathering.org/overlay.pl?cam=' . $cam);
150 print $gd->png;
151
152 sub get_color {
153         my $intensity = shift;
154         my $gamma = 1.0/1.90;
155         if ($intensity > 1.0) {
156                 return $gd->colorAllocate(255.0, 255.0 * ((2.0 - $intensity) ** $gamma), 0);
157         } else {
158                 return $gd->colorAllocate(255.0 * ($intensity ** $gamma), 255, 0);
159         }
160 }
161