diff options
Diffstat (limited to 'lib/DBInfoscreen')
-rw-r--r-- | lib/DBInfoscreen/Controller/Map.pm | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm index b4c9134..8912e5d 100644 --- a/lib/DBInfoscreen/Controller/Map.pm +++ b/lib/DBInfoscreen/Controller/Map.pm @@ -235,7 +235,7 @@ sub estimate_train_positions { # next_stop: {type, station} # positions: [current position [lat, lon], 2s from now, 4s from now, ...] sub estimate_train_positions2 { - my (%opt) = @_; + my ( $self, %opt ) = @_; my $now = $opt{now}; my @route = @{ $opt{route} // [] }; @@ -249,6 +249,9 @@ sub estimate_train_positions2 { and $now < ( $route[$i]{arr} // $route[$i]{dep} ) ) { + # HAFAS does not provide delays for past stops + $self->backpropagate_delay( $route[ $i - 1 ], $route[$i] ); + # (current position, future positons...) in 2 second steps @train_positions = estimate_train_positions( from => $route[ $i - 1 ], @@ -568,13 +571,13 @@ sub intersection { my @route2 = stopovers_to_route( @{ $pl2->{raw}{stopovers} // [] } ); - my $train1_pos = estimate_train_positions2( + my $train1_pos = $self->estimate_train_positions2( now => $now, route => \@route1, features => $pl1->{raw}{polyline}{features}, ); - my $train2_pos = estimate_train_positions2( + my $train2_pos = $self->estimate_train_positions2( now => $now, route => \@route2, features => $pl2->{raw}{polyline}{features}, @@ -662,6 +665,25 @@ sub intersection { )->wait; } +sub backpropagate_delay { + my ( $self, $prev_stop, $next_stop ) = @_; + + if ( ( $next_stop->{arr_delay} || $next_stop->{dep_delay} ) + and not( $prev_stop->{dep_delay} || $prev_stop->{arr_delay} ) ) + { + $self->log->debug("need to back-propagate delay"); + my $delay = $next_stop->{arr_delay} || $next_stop->{dep_delay}; + if ( $prev_stop->{arr} ) { + $prev_stop->{arr}->add( minutes => $delay ); + $prev_stop->{arr_delay} = $delay; + } + if ( $prev_stop->{dep} ) { + $prev_stop->{dep}->add( minutes => $delay ); + $prev_stop->{dep_delay} = $delay; + } + } +} + sub route { my ($self) = @_; my $trip_id = $self->stash('tripid'); @@ -689,6 +711,12 @@ sub route { my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } ); + my $train_pos = $self->estimate_train_positions2( + now => $now, + route => \@route, + features => $pl->{raw}{polyline}{features}, + ); + # Prepare from/to markers and name/time/delay overlays for stations for my $stop (@route) { my @stop_lines = ( $stop->{name} ); @@ -738,12 +766,6 @@ sub route { [ [ $stop->{lat}, $stop->{lon} ], [@stop_lines], ] ); } - my $train_pos = estimate_train_positions2( - now => $now, - route => \@route, - features => $pl->{raw}{polyline}{features}, - ); - push( @markers, { @@ -822,7 +844,7 @@ sub ajax_route { my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } ); - my $train_pos = estimate_train_positions2( + my $train_pos = $self->estimate_train_positions2( now => $now, route => \@route, features => $pl->{raw}{polyline}{features}, |