From 729468e0480bc5a382f61b29e0c4ae27866536d4 Mon Sep 17 00:00:00 2001 From: Dirk Koopman Date: Fri, 23 Jan 2015 23:25:57 +0000 Subject: [PATCH] a WORKING WEBSERVER!!! --- loop.pl | 147 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 41 deletions(-) diff --git a/loop.pl b/loop.pl index 30bea05..71464fd 100755 --- a/loop.pl +++ b/loop.pl @@ -30,8 +30,11 @@ my $state = "ready"; my $buf; my $dbg; my $ser; # the serial port Mojo::IOLoop::Stream +my $last_min_h; +my $last_hour_h; our $json = JSON->new->canonical(1); +our $WS = {}; # websocket connections our $ld = {}; @@ -88,42 +91,48 @@ $SIG{TERM} = $SIG{INT} = sub {++$ending; Mojo::IOLoop->stop;}; $SIG{HUP} = 'IGNORE'; -get '/' => 'index'; - # WebSocket weather service -websocket '/index' => sub { +websocket '/weather' => sub { my $c = shift; - + my $msg = shift; + my $tx = $c->tx; + # Opened - $c->app->log->debug('WebSocket opened.'); + app->log->debug('WebSocket opened.'); dbg 'WebSocket opened' if isdbg 'chan'; - - # Increase inactivity timeout for connection a bit - $c->inactivity_timeout(300); + $WS->{$tx} = $tx; + + # send historical data + $c->send($ld->{lasthour_h}) if exists $ld->{lasthour_h}; + $c->send($ld->{lastmin_h}) if exists $ld->{lastmin_h}; + + # disable timeout + $c->inactivity_timeout(3615); # Incoming message $c->on( message => sub { my ($c, $msg) = @_; - dbg "websocket: $msg" if isdbg 'chan'; + dbg "websocket: text $msg" if isdbg 'chan'; }, json => sub { my ($c, $msg) = @_; - dbg "websocket: $msg" if isdbg 'chan'; + dbg "websocket: json $msg" if isdbg 'chan'; } ); # Closed $c->on(finish => sub { my ($c, $code, $reason) = @_; - $c->app->log->debug("WebSocket closed with status $code."); - dbg 'WebSocket closed with status $code' if isdbg 'chan'; + app->log->debug("WebSocket closed with status $code."); + dbg 'webwocket closed with status $code' if isdbg 'chan'; + delete $WS->{$tx}; }); - - $c->render; - }; +get '/' => {template => 'index'}; + + dbginit(); if (@ARGV) { dbgadd(@ARGV); @@ -398,7 +407,9 @@ sub process } $ld->{last_rain_min} = $ld->{last_rain_hour} = $rain; + $last_hour_h = {%h}; $s = genstr($ts, 'h', \%h); + $ld->{lasthour_h} = $s; $ld->{last_hour} = int($ts/1800)*1800; $ld->{last_min} = int($ts/60)*60; @@ -425,7 +436,9 @@ sub process $h{Temp_Out_Max} = $ld->{Temp_Out_Max}; $h{Temp_Out_Min} = $ld->{Temp_Out_Min}; + $last_min_h = {%h}; $s = genstr($ts, 'm', \%h); + $ld->{lastmin_h} = $s; $ld->{last_min} = int($ts/60)*60; @{$ld->{wind_min}} = (); @@ -469,6 +482,14 @@ sub output_str dbg $s; # say $s; $dlog->writenow($s); + foreach my $ws (keys $WS) { + my $tx = $WS->{$ws}; + if ($tx) { + $tx->send($s); + } else { + delete $WS->{$tx}; + } + } } sub gen_hash_diff @@ -607,12 +628,16 @@ sub read_ld # sort out rain stats my $c; - if (($c = @{$ld->{rain24}}) < 24*60) { + if ($ld->{rain24} && ($c = @{$ld->{rain24}}) < 24*60) { my $diff = 24*60 - $c; unshift @{$ld->{rain24}}, 0 for 0 .. $diff; } my $rain; - $rain += $_ for @{$ld->{rain24}}; + + if ($ld->{rain24}) { + $rain += $_ for @{$ld->{rain24}}; + } + $ld->{rain_24} = nearest(0.1, $rain); delete $ld->{hour}; delete $ld->{min}; @@ -634,37 +659,77 @@ sub write_ld __DATA__ @@ index.html.ep +% my $url = url_for 'weather'; DWeather +

DWeather

+ -

DWeather

+

+ + + + + + +
Time: +
Pressure: +
Temperature in: +Humidity: +
Temperature out: +Min: +Max: +Humidity: +Dew Point: +
Wind Direction: +Minute: +Speed: +Minute: +
Rain Hour: +Day: +24hrs: +Month: +Year: +
-- 2.34.1