X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=loop.pl;h=e287ce5913b0370d0aa32345ac6348b42b343541;hb=b5935e862dc6dd1a6b6154905bac6db8836132d6;hp=b0e430055b5cebe676ea338e091255938619502a;hpb=ff9c8c8ded1b0ef402d75d968c07c15d6c4cbe1a;p=dweather.git diff --git a/loop.pl b/loop.pl index b0e4300..e287ce5 100755 --- a/loop.pl +++ b/loop.pl @@ -40,6 +40,11 @@ our $json = JSON->new->canonical(1); our $WS = {}; # websocket connections our $ld = {}; +our @last10minsr = (); +our @last5daysh = (); +our $windmins = 2; # no of minutes of wind data for the windrose +our $histdays = 5; # no of days of (half)hour data to search for main graph +our $updatepermin = 60 / 2.5; # no of updates per minute our $loop_count; # how many LOOPs we have done, used as start indicator @@ -109,12 +114,6 @@ websocket '/weather' => sub { $c->send($ld->{lasthour_h}) if exists $ld->{lasthour_h}; $c->send($ld->{lastmin_h}) if exists $ld->{lastmin_h}; - # send the last 24 hour's worth of data to the graph - my $lg = SMGLog->new('day'); - my $tnow = time; - my $dayno = int($tnow/86400); - send_history($c, $lg, $tnow, $_) for ($dayno-1, $dayno); - # disable timeout $c->inactivity_timeout(3615); @@ -153,11 +152,20 @@ dbg "*** starting $0"; dbg '***'; read_ld(); - + +my $tnow = time; +my $dayno = int ($tnow/86400); +for (my $i = 0-$histdays; $i < 0; ++$i ) { + push @last5daysh, grab_history(SMGLog->new("day"), "h", $tnow-(86400*$histdays), $dayno+$i+1); +} +@last10minsr = map {my ($t, $js) = split(/\s/, $_, 2); $js} grab_history(SMGLog->new("debug"), "r", $tnow-(60*$windmins), $dayno); +dbg sprintf("last5days = %d last10mins = %d", scalar @last5daysh, scalar @last10minsr); + our $dlog = SMGLog->new("day"); dbg "before next tick"; Mojo::IOLoop->next_tick(sub { loop() }); dbg "before app start"; +app->secrets([qw(Here's something that's really seakrett)]); app->start; dbg "after app start"; @@ -440,7 +448,11 @@ sub process @{$ld->{wind_hour}} = (); @{$ld->{wind_min}} = (); - output_str($s, 1) if $s; + if ($s) { + output_str($s, 1); + push @last5daysh, $s; + shift @last5daysh if @last5daysh > 5*24; + } write_ld(); } elsif ($ts >= $ld->{last_min} + 60) { @@ -476,7 +488,13 @@ sub process } else { my $o = gen_hash_diff($ld->{last_h}, \%h); if ($o) { + $o->{Dir} ||= $h{Dir}; + $o->{Wind} ||= $h{Wind}; + $o->{Dir} += 0; + $o->{Wind} += 0; $s = genstr($ts, 'r', $o); + push @last10minsr, $s; + shift @last10minsr while @last10minsr > ($windmins * $updatepermin); } else { dbg "loop rec not changed" if isdbg 'chan'; @@ -498,7 +516,7 @@ sub genstr my $h = shift; my $j = $json->encode($h); - my $tm = clocktime($ts, $let eq 'r' ? 1 : 0); + my $tm = clocktime($ts, 1); return qq|{"tm":"$tm","t":$ts,"$let":$j}|; } @@ -715,21 +733,23 @@ sub cycle_loop_data_files copy $datafn, "$datafn.o"; } -sub send_history +sub grab_history { - my $c = shift; my $lg = shift; - my $tnow = shift; + my $let = shift; + my $start = shift || time - 86400; my $dayno = shift; + my @out; + if ($lg->open($dayno, 'r+')) { while (my $l = $lg->read) { - next unless $l =~ /,"h":/; + next unless $l =~ /,"$let":/; my ($t) = $l =~ /"t":(\d+)/; - if ($t && $t >= $tnow-86400) { - $c->send($l); -# dbg "sending: $l"; + if ($t && $t >= $start) { + push @out, $l; } } $lg->close; } + return @out; }