From 2ba1ecbe5e470e0a7561e48e1f7ea8aad70eec31 Mon Sep 17 00:00:00 2001 From: Alice Khoudli Date: Fri, 17 Jan 2025 00:44:05 +0100 Subject: [PATCH] core: add warning on route ending on non route delimiting signal in block generation Signed-off-by: Alice Khoudli --- .../fr/sncf/osrd/signaling/SignalDriver.kt | 1 + .../sncf/osrd/signaling/impl/BlockBuilder.kt | 40 +++++++++++++++++++ .../signaling/impl/MockSigSystemManager.kt | 4 ++ .../signaling/impl/SigSystemManagerImpl.kt | 4 ++ .../sim_infra/api/LoadedSignalingInfra.kt | 2 + .../kotlin/fr/sncf/osrd/signaling/bal/BAL.kt | 1 + .../fr/sncf/osrd/signaling/bapr/BAPR.kt | 1 + .../osrd/signaling/etcs_level2/ETCS_LEVEL2.kt | 1 + .../fr/sncf/osrd/signaling/tvm300/TVM300.kt | 1 + .../fr/sncf/osrd/signaling/tvm430/TVM430.kt | 1 + 10 files changed, 56 insertions(+) diff --git a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/SignalDriver.kt b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/SignalDriver.kt index 247efd050fe..cbabd848f5c 100644 --- a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/SignalDriver.kt +++ b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/SignalDriver.kt @@ -94,6 +94,7 @@ interface SignalingSystemDriver { val stateSchema: SigStateSchema val settingsSchema: SigSettingsSchema val isBlockDelimiterExpr: String + val isRouteDelimiterExpr: String fun checkBlock(reporter: BlockDiagReporter, block: SigBlock) diff --git a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/BlockBuilder.kt b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/BlockBuilder.kt index 6efb5c2ee4d..d9a7c7a727d 100644 --- a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/BlockBuilder.kt +++ b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/BlockBuilder.kt @@ -20,6 +20,7 @@ internal fun internalBuildBlocks( val signalDelimiters = findSignalDelimiters(rawSignalingInfra, loadedSignalInfra) val detectorEntrySignals = makeDetectorEntrySignals(loadedSignalInfra, signalDelimiters) val missingSignalLogAggregator = LogAggregator({ logger.debug(it) }) + val nonRouteDelimitingSignalLogAggregator = LogAggregator({ logger.debug(it) }) val result = blockInfraBuilder(loadedSignalInfra, rawSignalingInfra) { // Step 2) iterate on zone paths along the route path. @@ -96,9 +97,24 @@ internal fun internalBuildBlocks( curBlock.signalPositions ) } + + // Finally we want to emit a warning if the route ends on a non route delimiting + // signal + if (!routeEndsAtBufferStop) { + warnOnRouteEndingOnNonRouteDelimitingSignal( + route, + routeExitDet, + detectorEntrySignals, + sigModuleManager, + rawSignalingInfra, + loadedSignalInfra, + nonRouteDelimitingSignalLogAggregator + ) + } } } missingSignalLogAggregator.logAggregatedSummary() + nonRouteDelimitingSignalLogAggregator.logAggregatedSummary() return result } @@ -334,3 +350,27 @@ private fun BlockInfraBuilder.updatePartialBlocks( } return nextBlocks } + +private fun warnOnRouteEndingOnNonRouteDelimitingSignal( + route: RouteId, + routeExitDet: DirDetectorId, + detectorSignals: IdxMap>, + sigModuleManager: InfraSigSystemManager, + rawSignalingInfra: RawSignalingInfra, + loadedSignalInfra: LoadedSignalInfra, + logAggregator: LogAggregator +) { + val endSignals = detectorSignals[routeExitDet] ?: return + for (associatedSignal in endSignals.values()) { + val logicalSignalId = associatedSignal.signal + val signalingSystem = loadedSignalInfra.getSignalingSystem(logicalSignalId) + val sigSettings = loadedSignalInfra.getSettings(logicalSignalId) + val routeEndsWithRouteEndingSignal = + sigModuleManager.isRouteDelimiter(signalingSystem, sigSettings) + if (!routeEndsWithRouteEndingSignal) { + logAggregator.registerError( + "Route ${rawSignalingInfra.getRouteName(route)} ends with non-route delimiting signal on signaling system ${signalingSystem}" + ) + } + } +} diff --git a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/MockSigSystemManager.kt b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/MockSigSystemManager.kt index b6a9872fc24..940943a3997 100644 --- a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/MockSigSystemManager.kt +++ b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/MockSigSystemManager.kt @@ -90,4 +90,8 @@ class MockSigSystemManager( override fun isBlockDelimiter(sigSystem: SignalingSystemId, settings: SigSettings): Boolean { return true } + + override fun isRouteDelimiter(sigSystem: SignalingSystemId, settings: SigSettings): Boolean { + return true + } } diff --git a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/SigSystemManagerImpl.kt b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/SigSystemManagerImpl.kt index aeb600f4bf6..d6f1732e779 100644 --- a/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/SigSystemManagerImpl.kt +++ b/core/kt-osrd-signaling/src/main/kotlin/fr/sncf/osrd/signaling/impl/SigSystemManagerImpl.kt @@ -95,6 +95,10 @@ class SigSystemManagerImpl : SigSystemManager { return evalSigSettings(sigSystemPool[sigSystem].isBlockDelimiterExpr, settings) } + override fun isRouteDelimiter(sigSystem: SignalingSystemId, settings: SigSettings): Boolean { + return evalSigSettings(sigSystemPool[sigSystem].isRouteDelimiterExpr, settings) + } + override fun checkSignalingSystemBlock( reporter: BlockDiagReporter, sigSystem: SignalingSystemId, diff --git a/core/kt-osrd-sim-infra/src/main/kotlin/fr/sncf/osrd/sim_infra/api/LoadedSignalingInfra.kt b/core/kt-osrd-sim-infra/src/main/kotlin/fr/sncf/osrd/sim_infra/api/LoadedSignalingInfra.kt index 9864deebbc6..b1c90b030de 100644 --- a/core/kt-osrd-sim-infra/src/main/kotlin/fr/sncf/osrd/sim_infra/api/LoadedSignalingInfra.kt +++ b/core/kt-osrd-sim-infra/src/main/kotlin/fr/sncf/osrd/sim_infra/api/LoadedSignalingInfra.kt @@ -57,6 +57,8 @@ interface InfraSigSystemManager { fun getOutputSignalingSystem(driver: SignalDriverId): SignalingSystemId fun isBlockDelimiter(sigSystem: SignalingSystemId, settings: SigSettings): Boolean + + fun isRouteDelimiter(sigSystem: SignalingSystemId, settings: SigSettings): Boolean } interface LoadedSignalInfra { diff --git a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bal/BAL.kt b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bal/BAL.kt index 8713393a6b0..8270ce80957 100644 --- a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bal/BAL.kt +++ b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bal/BAL.kt @@ -12,6 +12,7 @@ object BAL : SignalingSystemDriver { override val settingsSchema = SigSettingsSchema { flag("Nf") } override val parametersSchema = SigParametersSchema { flag("jaune_cli") } override val isBlockDelimiterExpr = "true" + override val isRouteDelimiterExpr = "Nf" override fun checkBlock(reporter: BlockDiagReporter, block: SigBlock) { // Check that we have the correct number of signals diff --git a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bapr/BAPR.kt b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bapr/BAPR.kt index d18fd71b4cb..7834d686e45 100644 --- a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bapr/BAPR.kt +++ b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/bapr/BAPR.kt @@ -15,6 +15,7 @@ object BAPR : SignalingSystemDriver { } override val parametersSchema = SigParametersSchema {} override val isBlockDelimiterExpr = "!distant" + override val isRouteDelimiterExpr = "Nf" override fun checkBlock(reporter: BlockDiagReporter, block: SigBlock) { // Check that we have the correct number of signals diff --git a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/etcs_level2/ETCS_LEVEL2.kt b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/etcs_level2/ETCS_LEVEL2.kt index f6909157bf3..ab7d78a1118 100644 --- a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/etcs_level2/ETCS_LEVEL2.kt +++ b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/etcs_level2/ETCS_LEVEL2.kt @@ -28,6 +28,7 @@ object ETCS_LEVEL2 : SignalingSystemDriver { override val parametersSchema = SigParametersSchema {} override val isBlockDelimiterExpr = "true" + override val isRouteDelimiterExpr = "Nf" override fun checkBlock(reporter: BlockDiagReporter, block: SigBlock) { // Check that we have the correct number of signals diff --git a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm300/TVM300.kt b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm300/TVM300.kt index fdb8c7a563c..8341b104f56 100644 --- a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm300/TVM300.kt +++ b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm300/TVM300.kt @@ -22,6 +22,7 @@ object TVM300 : SignalingSystemDriver { override val settingsSchema = SigSettingsSchema { flag("Nf") } override val parametersSchema = SigParametersSchema {} override val isBlockDelimiterExpr = "true" + override val isRouteDelimiterExpr = "Nf" private fun maxSpeedForState(state: SigState): Speed { return when (val aspect = state.getEnum("aspect")) { diff --git a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm430/TVM430.kt b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm430/TVM430.kt index 027be35d564..2b049b40af3 100644 --- a/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm430/TVM430.kt +++ b/core/kt-osrd-sncf-signaling/src/main/kotlin/fr/sncf/osrd/signaling/tvm430/TVM430.kt @@ -20,6 +20,7 @@ object TVM430 : SignalingSystemDriver { override val parametersSchema = SigParametersSchema {} override val isBlockDelimiterExpr = "true" + override val isRouteDelimiterExpr = "Nf" override fun checkBlock(reporter: BlockDiagReporter, block: SigBlock) { // Check that we have the correct number of signals