1
1
package fr.sncf.osrd
2
2
3
+ import com.charleskorn.kaml.Yaml
3
4
import com.google.common.primitives.Doubles
4
5
import fr.sncf.osrd.geom.LineString
5
6
import fr.sncf.osrd.railjson.schema.common.graph.EdgeDirection
6
7
import fr.sncf.osrd.railjson.schema.common.graph.EdgeEndpoint
7
8
import fr.sncf.osrd.railjson.schema.geom.RJSLineString
8
- import fr.sncf.osrd.railjson.schema.infra.*
9
+ import fr.sncf.osrd.railjson.schema.infra.RJSInfra
10
+ import fr.sncf.osrd.railjson.schema.infra.RJSRoute
11
+ import fr.sncf.osrd.railjson.schema.infra.RJSSwitch
12
+ import fr.sncf.osrd.railjson.schema.infra.RJSSwitchType
13
+ import fr.sncf.osrd.railjson.schema.infra.RJSTrackSection
9
14
import fr.sncf.osrd.railjson.schema.infra.trackobjects.RJSRouteWaypoint
10
15
import fr.sncf.osrd.railjson.schema.infra.trackobjects.RJSSignal
11
16
import fr.sncf.osrd.railjson.schema.infra.trackranges.RJSElectrification
@@ -15,28 +20,70 @@ import fr.sncf.osrd.railjson.schema.infra.trackranges.RJSSpeedSection
15
20
import fr.sncf.osrd.railjson.schema.rollingstock.RJSLoadingGaugeType
16
21
import fr.sncf.osrd.reporting.exceptions.ErrorType
17
22
import fr.sncf.osrd.reporting.exceptions.OSRDError
18
- import fr.sncf.osrd.sim_infra.api.*
23
+ import fr.sncf.osrd.sim_infra.api.Detector
24
+ import fr.sncf.osrd.sim_infra.api.DetectorId
25
+ import fr.sncf.osrd.sim_infra.api.DirDetectorId
26
+ import fr.sncf.osrd.sim_infra.api.DirTrackSectionId
27
+ import fr.sncf.osrd.sim_infra.api.EndpointTrackSectionId
28
+ import fr.sncf.osrd.sim_infra.api.LoadingGaugeConstraint
29
+ import fr.sncf.osrd.sim_infra.api.LoadingGaugeType
30
+ import fr.sncf.osrd.sim_infra.api.NeutralSection
31
+ import fr.sncf.osrd.sim_infra.api.RawInfra
32
+ import fr.sncf.osrd.sim_infra.api.RawSignalParameters
33
+ import fr.sncf.osrd.sim_infra.api.TrackChunk
34
+ import fr.sncf.osrd.sim_infra.api.TrackNodeConfig
35
+ import fr.sncf.osrd.sim_infra.api.TrackNodeConfigId
36
+ import fr.sncf.osrd.sim_infra.api.TrackNodeId
37
+ import fr.sncf.osrd.sim_infra.api.TrackNodePort
38
+ import fr.sncf.osrd.sim_infra.api.TrackNodePortId
39
+ import fr.sncf.osrd.sim_infra.api.TrackSection
40
+ import fr.sncf.osrd.sim_infra.api.ZoneId
41
+ import fr.sncf.osrd.sim_infra.api.decreasing
42
+ import fr.sncf.osrd.sim_infra.api.increasing
19
43
import fr.sncf.osrd.sim_infra.impl.BuildRouteError
20
44
import fr.sncf.osrd.sim_infra.impl.MissingNodeConfig
21
45
import fr.sncf.osrd.sim_infra.impl.RawInfraBuilder
22
46
import fr.sncf.osrd.sim_infra.impl.ReachedNodeDeadEnd
23
47
import fr.sncf.osrd.sim_infra.impl.ReachedTrackDeadEnd
48
+ import fr.sncf.osrd.sim_infra.impl.SpeedLimitTagDescriptor
24
49
import fr.sncf.osrd.sim_infra.impl.SpeedSection
25
50
import fr.sncf.osrd.sim_infra.impl.TrackChunkDescriptor
26
51
import fr.sncf.osrd.sim_infra.impl.TrackNodeConfigDescriptor
27
52
import fr.sncf.osrd.sim_infra.impl.route
28
- import fr.sncf.osrd.utils.*
53
+ import fr.sncf.osrd.utils.Direction
29
54
import fr.sncf.osrd.utils.Direction.DECREASING
30
55
import fr.sncf.osrd.utils.Direction.INCREASING
31
- import fr.sncf.osrd.utils.indexing.*
32
- import fr.sncf.osrd.utils.units.*
56
+ import fr.sncf.osrd.utils.DirectionalMap
57
+ import fr.sncf.osrd.utils.DistanceRangeMap
58
+ import fr.sncf.osrd.utils.DistanceRangeMapImpl
59
+ import fr.sncf.osrd.utils.Endpoint
60
+ import fr.sncf.osrd.utils.UnionFind
61
+ import fr.sncf.osrd.utils.distanceRangeMapOf
62
+ import fr.sncf.osrd.utils.indexing.DirStaticIdx
63
+ import fr.sncf.osrd.utils.indexing.MutableStaticIdxArraySet
64
+ import fr.sncf.osrd.utils.indexing.StaticIdx
65
+ import fr.sncf.osrd.utils.indexing.StaticPool
66
+ import fr.sncf.osrd.utils.indexing.mutableStaticIdxArrayListOf
67
+ import fr.sncf.osrd.utils.indexing.mutableStaticIdxArraySetOf
68
+ import fr.sncf.osrd.utils.units.Distance
69
+ import fr.sncf.osrd.utils.units.Offset
70
+ import fr.sncf.osrd.utils.units.Speed
71
+ import fr.sncf.osrd.utils.units.meters
72
+ import fr.sncf.osrd.utils.units.metersPerSecond
73
+ import fr.sncf.osrd.utils.units.mutableOffsetArrayListOf
74
+ import java.io.IOException
33
75
import java.util.*
34
76
import kotlin.collections.set
35
77
import kotlin.math.abs
36
78
import kotlin.time.Duration.Companion.seconds
79
+ import kotlinx.serialization.SerialName
80
+ import kotlinx.serialization.Serializable
81
+ import kotlinx.serialization.builtins.MapSerializer
82
+ import kotlinx.serialization.builtins.serializer
37
83
import mu.KotlinLogging
38
84
39
85
val logger = KotlinLogging .logger {}
86
+ private const val SPEED_LIMIT_TAGS_RESOURCE_PATH = " speed_limit_tags.yml"
40
87
41
88
private fun parseLineString (rjsLineString : RJSLineString ? ): LineString ? {
42
89
if (rjsLineString == null ) return null
@@ -717,6 +764,41 @@ fun EdgeEndpoint.toEndpoint(): Endpoint {
717
764
return if (this == EdgeEndpoint .BEGIN ) Endpoint .START else Endpoint .END
718
765
}
719
766
767
+ @Serializable
768
+ data class YamlSpeedLimitTagDescriptor (
769
+ val name : String ,
770
+ @SerialName(" fallback_list" ) val fallbackList : List <String >,
771
+ @SerialName(" default_speed" ) val defaultSpeed : Double? ,
772
+ )
773
+
774
+ fun parseSpeedLimitTags (builder : RawInfraBuilder ) {
775
+ val resourceURL =
776
+ {}.javaClass.classLoader.getResource(SPEED_LIMIT_TAGS_RESOURCE_PATH )
777
+ ? : throw IOException (
778
+ " can't find speedLimitTags resource $SPEED_LIMIT_TAGS_RESOURCE_PATH "
779
+ )
780
+ val speedLimitTagDescriptors =
781
+ Yaml .default.decodeFromString(
782
+ MapSerializer (String .serializer(), YamlSpeedLimitTagDescriptor .serializer()),
783
+ resourceURL.readText(),
784
+ )
785
+
786
+ for ((tagCode, tagDescriptor) in speedLimitTagDescriptors.entries) {
787
+ val defaultSpeed =
788
+ if (tagDescriptor.defaultSpeed != null )
789
+ Speed .fromMetersPerSecond(tagDescriptor.defaultSpeed)
790
+ else null
791
+ builder.speedLimitTag(
792
+ SpeedLimitTagDescriptor (
793
+ tagCode,
794
+ tagDescriptor.name,
795
+ tagDescriptor.fallbackList,
796
+ defaultSpeed
797
+ )
798
+ )
799
+ }
800
+ }
801
+
720
802
fun parseRJSInfra (rjsInfra : RJSInfra ): RawInfra {
721
803
val builder = RawInfraBuilder ()
722
804
@@ -821,5 +903,7 @@ fun parseRJSInfra(rjsInfra: RJSInfra): RawInfra {
821
903
parseSignal(builder, rjsSignal)
822
904
}
823
905
906
+ parseSpeedLimitTags(builder)
907
+
824
908
return builder.build()
825
909
}
0 commit comments