diff options
author | Daniel Friesel <derf@finalrewind.org> | 2020-12-26 08:20:20 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2020-12-26 08:20:20 +0100 |
commit | a087ad571d40e90baf1dfbfe6393fa4bb5f057d1 (patch) | |
tree | dcd87c5eb5e0adc990f7b2cbf857487e6096ea43 /lib | |
parent | f9e5085f541baa2cdc0afcda5afbfd1425a8d790 (diff) |
normalize direction when showing the wagon view
Diffstat (limited to 'lib')
-rw-r--r-- | lib/DBInfoscreen/Controller/Wagenreihung.pm | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/lib/DBInfoscreen/Controller/Wagenreihung.pm b/lib/DBInfoscreen/Controller/Wagenreihung.pm index 04f193d..9567913 100644 --- a/lib/DBInfoscreen/Controller/Wagenreihung.pm +++ b/lib/DBInfoscreen/Controller/Wagenreihung.pm @@ -107,6 +107,14 @@ sub wagenreihung { ); } + my $wref = { + e => $exit_side ? substr( $exit_side, 0, 1 ) : '', + tt => $wr->train_type, + tn => $train, + s => $wr->station_name, + p => $wr->platform + }; + if ( $wr->has_bad_wagons ) { # create fake positions as the correct ones are not available @@ -117,16 +125,40 @@ sub wagenreihung { $pos += 4; } } + elsif ( defined $wr->direction and scalar $wr->wagons > 2 ) { + + # wagenlexikon images only know one orientation. They assume + # that the second class (i.e., the wagon with the lowest + # wagon number) is in the leftmost carriage(s). We define the + # wagon with the lowest start_percent value to be leftmost + # and invert the direction passed on to $wref if it is not + # the wagon with the lowest wagon number. + + my @wagons = $wr->wagons; + + # skip first wagon as it may be a locomotive + my $wn1 = $wagons[1]->number; + my $wn2 = $wagons[2]->number; + my $wp1 = $wagons[1]{position}{start_percent}; + my $wp2 = $wagons[2]{position}{start_percent}; + + if ( $wn1 =~ m{^\d+$} and $wn2 =~ 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) + if ( ( $wp1 < $wp2 and $wn1 > $wn2 ) + or ( $wp1 > $wp2 and $wn1 < $wn2 ) ) + { + $wref->{d} = 100 - $wr->direction; + } + else { + $wref->{d} = $wr->direction; + } + } + } - my $wref = { - - #d => $wr->direction, - #e => $exit_side ? substr( $exit_side, 0, 1 ) : '', - tt => $wr->train_type, - tn => $train, - s => $wr->station_name, - p => $wr->platform - }; $wref = b64_encode( encode_json($wref) ); $self->render( |