1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
package Travel::Routing::DE::HAFAS::Connection::Section;
# vim:foldmethod=marker
use strict;
use warnings;
use 5.014;
use parent 'Class::Accessor';
use DateTime::Duration;
use Travel::Routing::DE::HAFAS::Utils;
our $VERSION = '0.00';
Travel::Routing::DE::HAFAS::Connection::Section->mk_ro_accessors(
qw(type schep_dep rt_dep sched_arr rt_arr dep_datetime arr_datetime arr_delay dep_delay journey distance duration dep_loc arr_loc
operator id name category category_long class number line line_no load delay direction)
);
# {{{ Constructor
sub new {
my ( $obj, %opt ) = @_;
my $hafas = $opt{hafas};
my $sec = $opt{sec};
my $date = $opt{date};
my $locs = $opt{locL};
my @prodL = @{ $opt{common}{prodL} // [] };
my $strptime = DateTime::Format::Strptime->new(
pattern => '%Y%m%dT%H%M%S',
time_zone => 'Europe/Berlin'
);
my $sched_dep = $sec->{dep}{dTimeS};
my $rt_dep = $sec->{dep}{dTimeR};
my $sched_arr = $sec->{arr}{aTimeS};
my $rt_arr = $sec->{arr}{aTimeR};
for my $ts ( $sched_dep, $rt_dep, $sched_arr, $rt_arr ) {
if ($ts) {
$ts = handle_day_change(
date => $date,
time => $ts,
strp_obj => $strptime,
);
}
}
my $ref = {
type => $sec->{type},
sched_dep => $sched_dep,
rt_dep => $rt_dep,
sched_arr => $sched_arr,
rt_arr => $rt_arr,
dep_datetime => $rt_dep // $sched_dep,
arr_datetime => $rt_arr // $sched_arr,
dep_loc => $locs->[ $sec->{dep}{locX} ],
arr_loc => $locs->[ $sec->{arr}{locX} ],
};
if ( $sched_dep and $rt_dep ) {
$ref->{dep_delay} = ( $rt_dep->epoch - $sched_dep->epoch ) / 60;
}
if ( $sched_arr and $rt_arr ) {
$ref->{arr_delay} = ( $rt_arr->epoch - $sched_arr->epoch ) / 60;
}
if ( $sec->{type} eq 'JNY' ) {
#operator id name type type_long class number line line_no load delay direction)
my $journey = $sec->{jny};
my $product = $prodL[ $journey->{prodX} ];
$ref->{id} = $journey->{jid};
$ref->{direction} = $journey->{dirTxt};
$ref->{name} = $product->{addName} // $product->{name};
$ref->{category} = $product->{prodCtx}{catOut};
$ref->{category_long} = $product->{prodCtx}{catOutL};
$ref->{class} = $product->{cls};
$ref->{number} = $product->{prodCtx}{num};
$ref->{line} = $ref->{name};
$ref->{line_no} = $product->{prodCtx}{line};
if ( $ref->{name}
and $ref->{category}
and $ref->{name} eq $ref->{category}
and $product->{nameS} )
{
$ref->{name} .= ' ' . $product->{nameS};
}
}
elsif ( $sec->{type} eq 'WALK' ) {
$ref->{distance} = $sec->{gis}{dist};
my $duration = $sec->{gis}{durS};
$ref->{duration} = DateTime::Duration->new(
hours => substr( $duration, 0, 2 ),
minutes => substr( $duration, 2, 2 ),
seconds => substr( $duration, 4, 2 ),
);
}
bless( $ref, $obj );
return $ref;
}
# }}}
# {{{ Accessors
# }}}
1;
|