diff options
Diffstat (limited to 'lib/DBInfoscreen/Controller/Wagenreihung.pm')
-rw-r--r-- | lib/DBInfoscreen/Controller/Wagenreihung.pm | 220 |
1 files changed, 54 insertions, 166 deletions
diff --git a/lib/DBInfoscreen/Controller/Wagenreihung.pm b/lib/DBInfoscreen/Controller/Wagenreihung.pm index 5d48705..b9f0ee3 100644 --- a/lib/DBInfoscreen/Controller/Wagenreihung.pm +++ b/lib/DBInfoscreen/Controller/Wagenreihung.pm @@ -10,147 +10,40 @@ use Mojo::Util qw(b64_encode b64_decode); use utf8; -use Travel::Status::DE::DBWagenreihung; -use Travel::Status::DE::DBWagenreihung::Wagon; +use Travel::Status::DE::DBRIS::Formation; -sub get_zugbildung_db { - my ( $self, $train_no ) = @_; - - say $train_no; - - my $details = $self->app->train_details_db->{$train_no}; - - if ( not $details ) { - return; - } - - my @wagons; - - for my $wagon ( @{ $details->{wagons} } ) { - my $wagon_type = $wagon->{type}; - my $wagon_number = $wagon->{number}; - my %wagon = ( - fahrzeugnummer => "", - fahrzeugtyp => $wagon_type, - kategorie => $wagon_type =~ m{^[0-9.]+$} ? 'LOK' : '', - train_no => $train_no, - wagenordnungsnummer => $wagon_number, - positionamhalt => { - startprozent => 0, - endeprozent => 0, - startmeter => 0, - endemeter => 0, - } - ); - my $wagon = Travel::Status::DE::DBWagenreihung::Wagon->new(%wagon); - - if ( $details->{type} ) { - $wagon->set_traintype( $details->{type} ); - } - push( @wagons, $wagon ); - } - - my $pos = 0; - for my $wagon (@wagons) { - $wagon->{position}{start_percent} = $pos; - $wagon->{position}{end_percent} = $pos + 5; - $pos += 5; - } - - my $train_type = $details->{rawType}; - $train_type =~ s{ - .* }{}x; - - my $route_start = $details->{route}{start} // $details->{route}{preStart}; - my $route_end = $details->{route}{end} // $details->{route}{postEnd}; - my $route = "${route_start} → ${route_end}"; - - return { - route => $route, - train_type => $train_type, - wagons => [@wagons] - }; -} - -sub zugbildung_db { - my ($self) = @_; - - my $train_no = $self->param('train'); - - my $details = $self->get_zugbildung_db($train_no); - - if ( not $details ) { - $self->render( 'not_found', - message => "Keine Daten zu Zug ${train_no} bekannt" ); - return; - } +sub handle_wagenreihung_error { + my ( $self, $train, $err ) = @_; $self->render( - 'zugbildung_db', - description => sprintf( - 'Soll-Wagenreihung %s %s', - $details->{train_type} // 'Zug', $train_no - ), - wr_error => undef, - title => $details->{train_type} . ' ' . $train_no, - route => $details->{route}, - zb => $details, - train_no => $train_no, - wagons => $details->{wagons}, + 'wagenreihung', + title => $train, + wr_error => $err, + wr => undef, + wref => undef, hide_opts => 1, + status => 500, ); } -sub handle_wagenreihung_error { - my ( $self, $train_no, $err ) = @_; - - my $details = $self->get_zugbildung_db($train_no); - if ( $details and @{ $details->{wagons} } ) { - my $wr_error - = "${err}. Ersatzweise werden die Solldaten laut Fahrplan angezeigt."; - $self->render( - 'zugbildung_db', - description => sprintf( - 'Soll-Wagenreihung %s %s', - $details->{train_type} // 'Zug', $train_no - ), - wr_error => $wr_error, - title => $details->{train_type} . ' ' . $train_no, - route => $details->{route}, - zb => $details, - train_no => $train_no, - wagons => $details->{wagons}, - hide_opts => 1, - ); - } - else { - $self->render( - 'wagenreihung', - title => "Zug $train_no", - wr_error => $err, - train_no => $train_no, - wr => undef, - wref => undef, - hide_opts => 1, - ); - } -} - sub wagenreihung { - my ($self) = @_; - my $train = $self->stash('train'); - my $departure = $self->stash('departure'); + my ($self) = @_; my $exit_side = $self->param('e'); + my $train_type = $self->param('category'); + my $train_no = $self->param('number'); + my $train = "${train_type} ${train_no}"; + $self->render_later; - $self->wagonorder->get_p( $train, $departure )->then( + $self->wagonorder->get_p( param => $self->req->query_params->to_hash ) + ->then( sub { my ($json) = @_; my $wr; eval { $wr - = Travel::Status::DE::DBWagenreihung->new( - from_json => $json ); + = Travel::Status::DE::DBRIS::Formation->new( json => $json ); }; if ($@) { $self->handle_wagenreihung_error( $train, scalar $@ ); @@ -158,8 +51,8 @@ sub wagenreihung { } if ( $exit_side and $exit_side =~ m{^a} ) { - if ( $wr->sections and defined $wr->direction ) { - my $section_0 = ( $wr->sections )[0]; + if ( $wr->sectors and defined $wr->direction ) { + my $section_0 = ( $wr->sectors )[0]; my $direction = $wr->direction; if ( $section_0->name eq 'A' and $direction == 0 ) { $exit_side =~ s{^a}{}; @@ -179,22 +72,21 @@ sub wagenreihung { my $wref = { e => $exit_side ? substr( $exit_side, 0, 1 ) : '', tt => $wr->train_type, - tn => $train, - s => $wr->station_name, + tn => $train_no, p => $wr->platform }; - if ( $wr->has_bad_wagons ) { + #if ( $wr->has_bad_wagons ) { - # create fake positions as the correct ones are not available - my $pos = 0; - for my $wagon ( $wr->wagons ) { - $wagon->{position}{start_percent} = $pos; - $wagon->{position}{end_percent} = $pos + 4; - $pos += 4; - } - } - elsif ( defined $wr->direction and scalar $wr->wagons > 2 ) { + # # create fake positions as the correct ones are not available + # my $pos = 0; + # for my $wagon ( $wr->wagons ) { + # $wagon->{position}{start_percent} = $pos; + # $wagon->{position}{end_percent} = $pos + 4; + # $pos += 4; + # } + #} + if ( defined $wr->direction and scalar $wr->carriages > 2 ) { # wagenlexikon images only know one orientation. They assume # that the second class (i.e., the wagon with the lowest @@ -208,17 +100,17 @@ sub wagenreihung { # order differs, we do not show a direction, as we do not # handle that case yet. - my @wagons = $wr->wagons; + my @wagons = $wr->carriages; # skip first/last wagon as it may be a locomotive my $wna1 = $wagons[1]->number; my $wna2 = $wagons[2]->number; my $wnb1 = $wagons[-3]->number; my $wnb2 = $wagons[-2]->number; - my $wpa1 = $wagons[1]{position}{start_percent}; - my $wpa2 = $wagons[2]{position}{start_percent}; - my $wpb1 = $wagons[-3]{position}{start_percent}; - my $wpb2 = $wagons[-2]{position}{start_percent}; + my $wpa1 = $wagons[1]->start_percent; + my $wpa2 = $wagons[2]->start_percent; + my $wpb1 = $wagons[-3]->start_percent; + my $wpb2 = $wagons[-2]->start_percent; if ( $wna1 =~ m{^\d+$} and $wna2 =~ m{^\d+$} @@ -226,10 +118,10 @@ sub wagenreihung { and $wnb2 =~ m{^\d+$} ) { - # We need to perform normalization in two cases: - # * wagon 1 is leftmost and its number is higher than wagon 2 - # * wagon 1 is rightmost and its number is lower than wagon 2 - # (-> the leftmost wagon has the highest number) + # We need to perform normalization in two cases: + # * wagon 1 is leftmost and its number is higher than wagon 2 + # * wagon 1 is rightmost and its number is lower than wagon 2 + # (-> the leftmost wagon has the highest number) # However, if wpa/wna und wpb/wnb do not match, we have a # winged train with different normalization requirements @@ -269,33 +161,29 @@ sub wagenreihung { $wref = b64_encode( encode_json($wref) ); - my $title = join( ' / ', - map { $wr->train_type . ' ' . $_ } $wr->train_numbers ); + my $title = join( ' / ', map { $_->{name} } $wr->trains ); $self->render( 'wagenreihung', - description => sprintf( - 'Ist-Wagenreihung %s in %s', - $title, $wr->station_name - ), - wr_error => undef, - title => $title, - train_no => $train, - wr => $wr, - wref => $wref, - exit_dir => $exit_dir, - hide_opts => 1, + description => sprintf( 'Ist-Wagenreihung %s', $title ), + wr_error => undef, + title => $title, + wr => $wr, + wref => $wref, + exit_dir => $exit_dir, + hide_opts => 1, + ts => $json->{ts}, ); } - )->catch( + )->catch( sub { my ($err) = @_; $self->handle_wagenreihung_error( $train, - $err->{error}->{msg} // "Unbekannter Fehler" ); + $err // "Unbekannter Fehler" ); return; } - )->wait; + )->wait; } @@ -333,15 +221,15 @@ sub wagen { ); } - my $title = "Wagen $wagon_id"; + my $title = 'Wagen ' . $wagon_id; if ( $wref->{tt} and $wref->{tn} ) { $title = sprintf( '%s %s', $wref->{tt}, $wref->{tn} ); if ($wagon_no) { - $title .= " Wagen $wagon_no"; + $title .= ' Wagen ' . $wagon_no; } else { - $title .= " Wagen $wagon_id"; + $title .= ' Wagen ' . $wagon_id; } } |