diff --git a/lib/App/FrameUtils.pm b/lib/App/FrameUtils.pm index ab99e8d04fa04d967295783b7eb6ab6fdfe3f497..3915dde4668b2a8b10a7e4688977413efc1e8cf7 100644 --- a/lib/App/FrameUtils.pm +++ b/lib/App/FrameUtils.pm @@ -2,7 +2,7 @@ package FrameUtils; use strict; use warnings; -use Data::Dumper; +use Data::Printer; BEGIN { @@ -10,35 +10,33 @@ BEGIN } use App::Utils; +use App::MasterUtils; sub get_syubetsu { my %frame = %{ $_[0] }; - my $index = $_[1]; + my $rosen_id = $_[1]; + my $index = $_[2]; - if ($index >= scalar @{ $frame{'syubetsu'} }) { die "Index error"; } - return %{ @{ $frame{'syubetsu'} }[$index] }{'name'}; -} - -sub get_ekimei -{ - my %frame = %{ $_[0] }; - my $eki = $_[1]; - - if ($eki >= $frame{'eki_num'}) { die "Index error" }; - return @{ $frame{'eki'} }[$eki]; + my $rosen = MasterUtils::get_rosen_frame \%frame, $rosen_id; + my @syubetsus = @{ $rosen->{'syubetsu'} }; + if ($index >= scalar @syubetsus) { die "Index error"; } + return %{ $syubetsus[$index] }{'name'}; } sub get_destination { my %frame = %{ $_[0] }; - my @jikoku = @{ $_[1] }; - my $offset = $_[2]; - my $is_down = $_[3]; + my $rosen_id = $_[1]; + my $rosen = MasterUtils::get_rosen_frame \%frame, $rosen_id; + my @jikoku = @{ $_[2] }; + my $offset = $_[3]; + my $is_down = $_[4]; - return get_ekimei \%frame, $is_down - ? scalar $offset + @jikoku - 1 - : $frame{'eki_num'} - $offset - @jikoku; + return (MasterUtils::sta_from_index \%frame, $rosen_id, $is_down + ? scalar $offset + @jikoku - 1 + : $rosen->{'eki_num'} - $offset - @jikoku) + ->{'ekimei'}; } sub hassya_hyou @@ -46,17 +44,20 @@ sub hassya_hyou my %frame = %{ $_[0] }; my $eki = $_[1]; - if ($eki >= $frame{'eki_num'}) { die "Index error" }; - print "Timetable for station @{ $frame{'eki'} }[$eki]\n"; + my @rosens = MasterUtils::get_routes \%frame, $eki; + + my %sta_info = %{ MasterUtils::sta_from_id \%frame, $eki }; sub process_ressya_list { - my @ressyas = @{ $_[0] }; - my $is_down = $_[2]; - my $target_absolute = $_[1]; + my $rosen_id = $_[0]; + my $rosen = MasterUtils::get_rosen_frame \%frame, $rosen_id; + my @ressyas = @{ $_[1] }; + my $is_down = $_[3]; + my $target_absolute = MasterUtils::get_eki_position \%frame, $rosen_id, $_[2]; my $target_relative = $is_down ? $target_absolute - : $frame{'eki_num'} - $target_absolute - 1; + : $rosen->{'eki_num'} - $target_absolute - 1; foreach my $ressya (@ressyas) { @@ -68,13 +69,16 @@ sub hassya_hyou my %ts = %{ $jikoku[0] }; my $time = $ts{'hatsu'}; + # Timestamp has no dep time (only arrival time for ex) if (!defined $time) { next; } + # This service does not stop here + if (%ts{'mode'} != 1) { next; } # Format: time (tab) destination (tab) type (with eventual name) - my $syubetsu = get_syubetsu \%frame, $data{'syubetsu'}; - print Utils::format_time $time + my $syubetsu = get_syubetsu \%frame, $rosen_id, $data{'syubetsu'}; + print ((Utils::format_time $time) . "\tfor " - . (get_destination \%frame, \@jikoku, $target_relative, $is_down) - . "\t$syubetsu" + . (get_destination \%frame, $rosen_id, \@jikoku, $target_relative, $is_down) + . "\t$syubetsu") ; if (defined $data{'meisyo'}) { @@ -85,10 +89,19 @@ sub hassya_hyou print "\n"; } - print "=================== Down ===================\n"; - process_ressya_list \@{ $frame{'dia'}{'kudari'} }, $eki, 1; - print "==================== Up ====================\n"; - process_ressya_list \@{ $frame{'dia'}{'nobori'} }, $eki, 0; + foreach my $rosen_id (@rosens) + { + my $rosenmei = MasterUtils::get_rosenmei \%frame, $rosen_id; + print "$rosenmei timetable for station $sta_info{'ekimei'}\n"; + + my $dia = $frame{'rosen'}->{$rosen_id}->{'dia'}; + + print "=================== Down ===================\n"; + process_ressya_list $rosen_id, $dia->{'kudari'}, $eki, 1; + print "==================== Up ====================\n"; + process_ressya_list $rosen_id, $dia->{'nobori'}, $eki, 0; + + } } 1; diff --git a/lib/App/MasterUtils.pm b/lib/App/MasterUtils.pm index 9742aca608ed32b86a2ce6b03de0535b55a26710..45b93df009f5b907134e26a0c88b7a0cf98edd5f 100644 --- a/lib/App/MasterUtils.pm +++ b/lib/App/MasterUtils.pm @@ -9,6 +9,8 @@ BEGIN } use App::Log; + +use List::Util qw(first); use Data::Printer; sub sta_from_id @@ -24,6 +26,51 @@ sub sta_from_id Log::e "Station id $id not found."; } +sub get_ekimei +{ + return (sta_from_id $_[0], $_[1])->{'ekimei'}; +} + +sub get_rosen_frame +{ + my %master = %{ $_[0] }; + my $rosen_id = $_[1]; + if (!defined $rosen_id) { Log::e 'Please specify a route id.'; } + foreach my $rosen (keys %{ $master{'rosen'} }) + { + if ($rosen eq $rosen_id) { return $master{'rosen'}->{$rosen}; } + } + Log::e "Route id $rosen_id not found."; +} + +sub get_rosenmei +{ + return (get_rosen_frame $_[0], $_[1])->{'rosenmei'}; +} + +sub get_eki_position +{ + my %master = %{ $_[0] }; + my $rosen_id = $_[1]; + my $id = $_[2]; + my $rosen = get_rosen_frame \%master, $rosen_id; + my @ekis = @{ $rosen->{'eki'} }; + + return first { $ekis[$_] eq $id } 0..$#ekis; +} + +sub sta_from_index +{ + my %master = %{ $_[0] }; + my $rosen_id = $_[1]; + my $index = $_[2]; + if (!defined $rosen_id) { Log::e 'Please specify a route id.'; } + if (!defined $index) { Log::e 'Please specify a station index.'; } + + my $rosen = get_rosen_frame \%master, $rosen_id; + return sta_from_id \%master, @{ $rosen->{'eki'} }[$index]; +} + sub get_routes { my %master = %{ $_[0] }; diff --git a/src/oud2_parser.pl b/src/oud2_parser.pl index cb39b81b98577d3f1af8f39bff6576c0a9537b25..47eb083adb5572c30af2f994256a4c6c92d3fe73 100644 --- a/src/oud2_parser.pl +++ b/src/oud2_parser.pl @@ -326,4 +326,5 @@ foreach my $frame (values %{ $master{'rosen'} }) $frame->{'eki'} = \@new_ekis; } -MasterUtils::get_routes \%master, 'konpoku_10'; +# MasterUtils::get_routes \%master, 'konpoku_9'; +FrameUtils::hassya_hyou \%master, 'konpoku_9';