[General] network = InVehicleNetworkShowcase sim-time-limit = 10ms #abstract-config = true (requires omnet 7) description = "Ethernet Time-Sensitive Networking (TSN) example with time synchronization, clock drift, time-aware shaping, Z3 SAT based gate scheduling, credit-based shaping, per-stream filtering and policying, stream redundancy, unicast and multicast streams, link failure protection, frame preemption, cut-through switching, etc." ######################## # Scenario Configuration # optional broken component *.brokenComponent = ${brokenComponent = "none", "link", "wheel", "camera"} *.frontSwitch.ethg$o[3].channel.disabled = ${brokenComponent} == "link" *.frontLeftSwitch.ethg$o[0].channel.disabled = ${brokenComponent} == "link" *.frontLeftWheel.app[0].source.productionInterval = ${brokenComponent} == "wheel" ? 10us : 500us *.frontLeftCamera.app[0].source.productionInterval = ${brokenComponent} == "camera" ? 10us : 125us ########################### # Application Configuration # CONTENT CLASS PCP RATE TYPE PROTECTION SOURCE DESTINATION VISUALIZATION # telemetry CDT 6 2.8Mbps unicast 1 link steering engineActuator red # telemetry CDT 6 2.8Mbps unicast 1 link frontLeftWheel engineActuator red # telemetry CDT 6 2.8Mbps unicast 1 link frontRightWheel engineActuator red # telemetry CDT 6 2.8Mbps unicast 1 link reartLeftWheel engineActuator red # telemetry CDT 6 2.8Mbps unicast 1 link rearRightWheel engineActuator red # telemetry ClassA 5 10.4Mbps unicast none lidar hud blue # video ClassA 5 20.8Mbps multicast none frontLeftCamera obu and hud blue # video ClassA 5 20.8Mbps multicast none frontRightCamera obu and hud blue # video ClassA 5 20.8Mbps multicast none rearLeftCamera obu and hud blue # video ClassA 5 20.8Mbps multicast none rearRightCamera obu and hud blue # navigation ClassB 4 20.8Mbps unicast none hud rearDisplay green # entertainment ClassB 4 10.4Mbps unicast none obu rearDisplay green # navigation BestEffort 0 20.8Mbps unicast none obu hud gray # disable local multicast loop **.udp.defaultMulticastLoop = false # steering application *.steering.numApps = 1 *.steering.app[0].typename = "UdpSourceApp" *.steering.app[0].source.packetNameFormat = "%M->engineActuator:CDT-%c" *.steering.app[0].source.packetLength = 175B *.steering.app[0].source.productionInterval = 500us # ~2.8Mbps *.steering.app[0].io.destAddress = "engineActuator" *.steering.app[0].io.destPort = 1000 # wheel applications *.*Wheel.numApps = 1 *.*Wheel.app[0].typename = "UdpSourceApp" *.*Wheel.app[0].source.packetNameFormat = "%M->engineActuator:CDT-%c" *.*Wheel.app[0].source.packetLength = 175B *.*Wheel.app[0].source.productionInterval = 500us # ~2.8Mbps *.*Wheel.app[0].io.destAddress = "engineActuator" *.frontLeftWheel.app[0].io.destPort = 1001 *.frontRightWheel.app[0].io.destPort = 1002 *.rearLeftWheel.app[0].io.destPort = 1003 *.rearRightWheel.app[0].io.destPort = 1004 # lidar application *.lidar.numApps = 1 *.lidar.app[0].typename = "UdpSourceApp" *.lidar.app[0].source.packetNameFormat = "%M->hud:ClassA-%c" *.lidar.app[0].source.packetLength = 325B *.lidar.app[0].source.productionInterval = 250us # ~10.4Mbps *.lidar.app[0].io.destAddress = "hud" *.lidar.app[0].io.destPort = 1000 # camera applications *.*Camera.numApps = 1 *.*Camera.app[0].typename = "UdpSourceApp" *.*Camera.app[0].source.packetNameFormat = "%M->hud+obu:ClassA-%c" *.*Camera.app[0].source.packetLength = 325B *.*Camera.app[0].source.productionInterval = 125us # ~20.8Mbps *.*Camera.app[0].io.destAddress = "224.0.0.42" # obu and hud *.frontLeftCamera.app[0].io.destPort = 1001 *.frontRightCamera.app[0].io.destPort = 1002 *.rearLeftCamera.app[0].io.destPort = 1003 *.rearRightCamera.app[0].io.destPort = 1004 # obu applications *.obu.numApps = 6 *.obu.app[0].typename = "UdpSourceApp" *.obu.app[0].display-name = "entertainment" *.obu.app[0].source.packetNameFormat = "%M->rearDisplay:ClassB-%c" *.obu.app[0].source.packetLength = 325B *.obu.app[0].source.productionInterval = 250us # ~10.4Mbps *.obu.app[0].io.destAddress = "rearDisplay" *.obu.app[0].io.destPort = 1000 *.obu.app[1].typename = "UdpSourceApp" *.obu.app[1].display-name = "navigation" *.obu.app[1].source.packetNameFormat = "%M->hud:BestEffort-%c" *.obu.app[1].source.packetLength = 325B *.obu.app[1].source.productionInterval = 125us # ~20.8Mbps *.obu.app[1].io.destAddress = "hud" *.obu.app[1].io.destPort = 1005 *.obu.app[2].display-name = "front left camera" *.obu.app[3].display-name = "front right camera" *.obu.app[4].display-name = "rear left camera" *.obu.app[5].display-name = "rear right camera" *.obu.app[2..5].typename = "UdpSinkApp" *.obu.app[2..5].io.multicastAddresses = ["224.0.0.42"] *.obu.app[2].io.localPort = 1001 *.obu.app[3].io.localPort = 1002 *.obu.app[4].io.localPort = 1003 *.obu.app[5].io.localPort = 1004 # rear display applications *.rearDisplay.numApps = 2 *.rearDisplay.app[*].typename = "UdpSinkApp" *.rearDisplay.app[0].display-name = "entertainment" *.rearDisplay.app[1].display-name = "navigation" *.rearDisplay.app[0].io.localPort = 1000 *.rearDisplay.app[1].io.localPort = 1001 # engine actuator applications *.engineActuator.numApps = 5 *.engineActuator.app[*].typename = "UdpSinkApp" *.engineActuator.app[0].display-name = "steering" *.engineActuator.app[1].display-name = "front left wheel" *.engineActuator.app[2].display-name = "front right wheel" *.engineActuator.app[3].display-name = "rear left wheel" *.engineActuator.app[4].display-name = "rear right wheel" *.engineActuator.app[0].io.localPort = 1000 *.engineActuator.app[1].io.localPort = 1001 *.engineActuator.app[2].io.localPort = 1002 *.engineActuator.app[3].io.localPort = 1003 *.engineActuator.app[4].io.localPort = 1004 # hud applications *.hud.numApps = 7 *.hud.app[0].typename = "UdpSourceApp" *.hud.app[0].display-name = "navigation" *.hud.app[0].source.packetNameFormat = "%M->rearDisplay:ClassB-%c" *.hud.app[0].source.packetLength = 325B *.hud.app[0].source.productionInterval = 250us # ~20.8Mbps *.hud.app[0].io.destAddress = "rearDisplay" *.hud.app[0].io.destPort = 1001 *.hud.app[1].display-name = "lidar" *.hud.app[2].display-name = "front left camera" *.hud.app[3].display-name = "front right camera" *.hud.app[4].display-name = "rear left camera" *.hud.app[5].display-name = "rear right camera" *.hud.app[6].display-name = "navigation" *.hud.app[1..6].typename = "UdpSinkApp" *.hud.app[2..5].io.multicastAddresses = ["224.0.0.42"] *.hud.app[1].io.localPort = 1000 *.hud.app[2].io.localPort = 1001 *.hud.app[3].io.localPort = 1002 *.hud.app[4].io.localPort = 1003 *.hud.app[5].io.localPort = 1004 *.hud.app[6].io.localPort = 1005 ############################### # Common Ethernet Configuration # Ethernet links between switches are 1Gbps *.frontSwitch.eth[0..4].bitrate = 1Gbps *.frontLeftSwitch.eth[0..1].bitrate = 1Gbps *.frontRightSwitch.eth[0..1].bitrate = 1Gbps *.rearSwitch.eth[0..4].bitrate = 1Gbps *.rearLeftSwitch.eth[0..1].bitrate = 1Gbps *.rearRightSwitch.eth[0..1].bitrate = 1Gbps *.hud.eth[0].bitrate = 1Gbps *.obu.eth[0].bitrate = 1Gbps # other Ethernet links are 100Mbps *.*.eth[*].bitrate = 100Mbps ########################## # Visualizer Configuration # enable multiple canvas visualizers *.visualizer.typename = "IntegratedMultiCanvasVisualizer" # data link activity visualization for multicast packets *.visualizer.dataLinkVisualizer[0].displayLinks = true *.visualizer.dataLinkVisualizer[0].activityLevel = "protocol" *.visualizer.dataLinkVisualizer[0].packetFilter = "*Camera*" *.visualizer.dataLinkVisualizer[0].lineColor = "blue4" *.visualizer.dataLinkVisualizer[0].labelColor = "blue4" # network route activity visualization *.visualizer.numNetworkRouteVisualizers = 4 *.visualizer.networkRouteVisualizer[*].displayRoutes = true *.visualizer.networkRouteVisualizer[0].packetFilter = "*steering* or *Wheel*" *.visualizer.networkRouteVisualizer[0].lineColor = "red4" *.visualizer.networkRouteVisualizer[1].packetFilter = "*lidar*" *.visualizer.networkRouteVisualizer[1].lineColor = "blue4" *.visualizer.networkRouteVisualizer[2].packetFilter = "*rearDisplay*" *.visualizer.networkRouteVisualizer[2].lineColor = "green4" *.visualizer.networkRouteVisualizer[3].packetFilter = "*obu->hud*" *.visualizer.networkRouteVisualizer[3].lineColor = "gray" [Config StandardEthernet] description = "Using only standard Ethernet features" ################################# # Network Node Type Configuration # use standard Ethernet switches *.*Switch.typename = "EthernetSwitch" # use standard Ethernet devices *.steering.typename = "StandardHost" *.*Wheel.typename = "StandardHost" *.lidar.typename = "StandardHost" *.*Camera.typename = "StandardHost" *.obu.typename = "StandardHost" *.rearDisplay.typename = "StandardHost" *.engineActuator.typename = "StandardHost" *.hud.typename = "StandardHost" # disable master clock *.masterClock.typename = "" [Config TimeSensitiveNetworkingBase] #abstract-config = true (requires omnet 7) description = "Using Time-Sensitive Networking features" ################################# # Network Node Type Configuration # use TSN switches *.*Switch.typename = "TsnSwitch" # use TSN devices *.steering.typename = "TsnDevice" *.*Wheel.typename = "TsnDevice" *.lidar.typename = "TsnDevice" *.*Camera.typename = "TsnDevice" *.obu.typename = "TsnDevice" *.rearDisplay.typename = "TsnDevice" *.engineActuator.typename = "TsnDevice" *.hud.typename = "TsnDevice" # use TSN clock *.masterClock.typename = "TsnClock" ##################### # Clock Configuration # clocks have a random constant drift in all network nodes *.*.clock.oscillator.driftRate = uniform(-100ppm, 100ppm) # application traffic sources use the local clock of the network node *.*.app[*].source.clockModule = "^.^.clock" # periodic gates in all traffic shapers use the local clock of the network node *.*.eth[*].macLayer.queue.transmissionGate[*].clockModule = "^.^.^.^.clock" #################################### # Time Synchronization Configuration # enable time synchronization in all network nodes *.*.hasTimeSynchronization = true # time synchronization starts from the master clock *.masterClock.gptp.masterPorts = ["eth0"] # all Ethernet switches act as a gPTP bridge *.frontSwitch.gptp.slavePort = "eth8" *.frontSwitch.gptp.masterPorts = ["eth0", "eth1", "eth2", "eth3", "eth4", "eth5", "eth6", "eth7"] *.frontLeftSwitch.gptp.masterPorts = ["eth2", "eth3"] *.frontRightSwitch.gptp.masterPorts = ["eth2", "eth3"] *.rearSwitch.gptp.masterPorts = ["eth2", "eth3", "eth4", "eth5"] *.rearLeftSwitch.gptp.masterPorts = ["eth2", "eth3"] *.rearRightSwitch.gptp.masterPorts = ["eth2", "eth3"] ############################# # Stream Coding Configuration # enable outgoing TSN streams *.*.hasOutgoingStreams = true ############################### # Traffic Shaping Configuration # enable egress traffic shaping *.*Switch.hasEgressTrafficShaping = true #################################### # Per-stream Filtering Configuration # enable per-stream filtering *.*Switch.hasIngressTrafficFiltering = true ##################################### # Cut-through Switching Configuration # enable cut-through switching #*.frontSwitch.hasCutthroughSwitching = true #*.frontSwitch.hasCutthroughSwitching = true #*.frontSwitch.eth[0].typename = "LayeredEthernetInterface" #*.frontSwitch.eth[0].phyLayer.typename = "EthernetStreamingPhyLayer" ################################## # Frame Preemption Configuration # enable frame preemption #*.*Switch.hasFramePreemption = true #*.*Switch.eth[*].macLayer.typename = "EthernetPreemptingMacLayer" #*.*Switch.eth[*].phyLayer.typename = "EthernetPreemptingPhyLayer" ########################## # Visualizer Configuration # enable multiple canvas visualizers *.visualizer.typename = "IntegratedMultiCanvasVisualizer" # display time synchronization packets *.visualizer.numDataLinkVisualizers = 2 *.visualizer.dataLinkVisualizer[1].displayLinks = true *.visualizer.dataLinkVisualizer[1].activityLevel = "protocol" *.visualizer.dataLinkVisualizer[1].packetFilter = "*Gptp*" *.visualizer.dataLinkVisualizer[1].lineColor = "black" *.visualizer.dataLinkVisualizer[1].labelColor = "black" [Config ManualTsn] description = "Using manual Time-Sensitive Networking configuration" extends = TimeSensitiveNetworkingBase ############################# # Stream Coding Configuration # steering stream identification and coding *.steering.bridging.streamIdentifier.identifier.mapping = [{stream: "steering", packetFilter: expr(has(udp))}] *.steering.bridging.streamCoder.encoder.mapping = [{stream: "steering", pcp: 6}] # wheel stream identification and coding *.*Wheel.bridging.streamIdentifier.identifier.mapping = [{stream: "wheel", packetFilter: expr(has(udp))}] *.*Wheel.bridging.streamCoder.encoder.mapping = [{stream: "wheel", pcp: 6}] # lidar stream identification and coding *.lidar.bridging.streamIdentifier.identifier.mapping = [{stream: "lidar", packetFilter: expr(has(udp))}] *.lidar.bridging.streamCoder.encoder.mapping = [{stream: "lidar", pcp: 5}] # camera stream identification and coding *.*Camera.bridging.streamIdentifier.identifier.mapping = [{stream: "camera", packetFilter: expr(has(udp))}] *.*Camera.bridging.streamCoder.encoder.mapping = [{stream: "camera", pcp: 5}] # TODO add streams from obu and hud *.*Switch.bridging.streamCoder.decoder.mapping = [{source: "steering", pcp: 6, stream: "steering"}, {source: "frontLeftWheel", pcp: 6, stream: "front left wheel"}, {source: "frontRightWheel", pcp: 6, stream: "front right wheel"}, {source: "rearLeftWheel", pcp: 6, stream: "rear left wheel"}, {source: "rearRightWheel", pcp: 6, stream: "rear right wheel"}, {source: "lidar", pcp: 5, stream: "lidar"}, {source: "frontLeftCamera", pcp: 5, stream: "front left camera"}, {source: "frontRightCamera", pcp: 5, stream: "front right camera"}, {source: "rearLeftCamera", pcp: 5, stream: "rear left camera"}, {source: "rearRightCamera", pcp: 5, stream: "rear right camera"}] *.*Switch.bridging.streamCoder.encoder.mapping = [{stream: "steering", pcp: 6}, {stream: "front left wheel", pcp: 6}, {stream: "front right wheel", pcp: 6}, {stream: "rear left wheel", pcp: 6}, {stream: "rear right wheel", pcp: 6}, {stream: "lidar", pcp: 5}, {stream: "front left camera", pcp: 5}, {stream: "front right camera", pcp: 5}, {stream: "rear left camera", pcp: 5}, {stream: "rear right camera", pcp: 5}] #################################### # Per-stream Filtering Configuration *.*Switch.bridging.streamFilter.ingress.numStreams = 10 *.*Switch.bridging.streamFilter.ingress.classifier.mapping = {"steering": 0, "front left wheel": 1, "front right wheel": 2, "rear left wheel": 3, "rear right wheel": 4, "lidar": 5, "front left camera": 6, "front right camera": 7, "rear left camera": 8, "rear right camera": 9} *.*Switch.bridging.streamFilter.ingress.meter[*].typename = "SingleRateTwoColorMeter" *.*Switch.bridging.streamFilter.ingress.meter[0].display-name = "steering" *.*Switch.bridging.streamFilter.ingress.meter[1].display-name = "front left wheel" *.*Switch.bridging.streamFilter.ingress.meter[2].display-name = "front right wheel" *.*Switch.bridging.streamFilter.ingress.meter[3].display-name = "rear left wheel" *.*Switch.bridging.streamFilter.ingress.meter[4].display-name = "rear right wheel" *.*Switch.bridging.streamFilter.ingress.meter[5].display-name = "lidar" *.*Switch.bridging.streamFilter.ingress.meter[6].display-name = "front left camera" *.*Switch.bridging.streamFilter.ingress.meter[7].display-name = "front right camera" *.*Switch.bridging.streamFilter.ingress.meter[8].display-name = "rear left camera" *.*Switch.bridging.streamFilter.ingress.meter[9].display-name = "rear right camera" *.*Switch.bridging.streamFilter.ingress.meter[0..4].committedInformationRate = 2.8Mbps *.*Switch.bridging.streamFilter.ingress.meter[0..4].committedBurstSize = 10kB *.*Switch.bridging.streamFilter.ingress.meter[5].committedInformationRate = 10.4Mbps *.*Switch.bridging.streamFilter.ingress.meter[5].committedBurstSize = 40kB *.*Switch.bridging.streamFilter.ingress.meter[6..9].committedInformationRate = 20.8Mbps *.*Switch.bridging.streamFilter.ingress.meter[6..9].committedBurstSize = 80kB ############################### # Traffic Shaping Configuration # credit based shaper for AVB classes *.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[4..6].typename = "Ieee8021qCreditBasedShaper" # TODO higher data rates for 1Gbps links # TODO how do we calculate the data rate limits? *.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[4].idleSlope = 40Mbps *.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[5].idleSlope = 40Mbps *.*Switch.eth[*].macLayer.queue.transmissionSelectionAlgorithm[6].idleSlope = 10Mbps ################################# # Frame Replication Configuration # enabled stream redundancy *.*.hasStreamRedundancy = true [Config AutomaticTsn] description = "Using automatic Time-Sensitive Networking configuration" extends = TimeSensitiveNetworkingBase ################################# # Frame Replication Configuration # enabled stream redundancy *.*.hasStreamRedundancy = true # gate scheduling *.gateScheduleConfigurator.typename = "AlwaysOpenGateScheduleConfigurator" *.gateScheduleConfigurator.gateCycleDuration = 500us # stream redundancy configurator *.streamRedundancyConfigurator.typename = "StreamRedundancyConfigurator" # TSN configuration *.failureProtectionConfigurator.typename = "FailureProtectionConfigurator" # 54B = 8B (UDP) + 20B (IP) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY) # 64B = 8B (UDP) + 20B (IP) + 4B (802.1R) + 6B (802.1Q) + 14B (ETH MAC) + 4B (ETH FCS) + 8B (ETH PHY) *.failureProtectionConfigurator.configuration = [# single link failure protection redundancy for CDT traffic {name: "frontLeftWheel", application: "app[0]", source: "frontLeftWheel", destination: "engineActuator", pcp: 6, gateIndex: 6, packetFilter: "*->*", packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us, linkFailureProtection: [{any: 1, of: "not *->engineActuator and not frontLeftWheel->*"}]}, {name: "frontRightWheel", application: "app[0]", source: "frontRightWheel", destination: "engineActuator", pcp: 6, gateIndex: 6, packetFilter: "*->*", packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us, linkFailureProtection: [{any: 1, of: "not *->engineActuator and not frontRightWheel->*"}]}, {name: "rearLeftWheel", application: "app[0]", source: "rearLeftWheel", destination: "engineActuator", pcp: 6, gateIndex: 6, packetFilter: "*->*", packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us, linkFailureProtection: [{any: 1, of: "not *->engineActuator and not rearLeftWheel->*"}]}, {name: "rearRightWheel", application: "app[0]", source: "rearRightWheel", destination: "engineActuator", pcp: 6, gateIndex: 6, packetFilter: "*->*", packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us, linkFailureProtection: [{any: 1, of: "not *->engineActuator and not rearRightWheel->*"}]}, {name: "steering", application: "app[0]", source: "steering", destination: "engineActuator", pcp: 6, gateIndex: 6, packetFilter: "*->*", packetLength: 175B + 64B, packetInterval: 500us, maxLatency: 100us, linkFailureProtection: [{any: 1, of: "not *->engineActuator and not steering->*"}]}, # AVB class A streams # TODO these are not needed because we don't allocate slots for these streams? {name: "frontLeftCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A", source: "frontLeftCamera", destination: "hud or obu", pcp: 5, gateIndex: 5, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms}, {name: "frontRightCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A", source: "frontRightCamera", destination: "hud or obu", pcp: 5, gateIndex: 5, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms}, {name: "rearLeftCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A", source: "rearLeftCamera", destination: "hud or obu", pcp: 5, gateIndex: 5, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms}, {name: "rearRightCamera", application: "app[0]", destinationAddress: "01:00:5E:00:00:2A", source: "rearRightCamera", destination: "hud or obu", pcp: 5, gateIndex: 5, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms}, {name: "lidar", application: "app[0]", source: "lidar", destination: "hud", pcp: 5, gateIndex: 5, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us, maxLatency: 2ms}, # AVB class B streams {name: "obu", application: "app[0]", source: "obu", destination: "rearDisplay", pcp: 4, gateIndex: 4, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 250us, maxLatency: 50ms}, {name: "hud", application: "app[0]", source: "hud", destination: "rearDisplay", pcp: 4, gateIndex: 4, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 250us, maxLatency: 50ms}, # best effort streams {name: "bestEffort", application: "app[0]", source: "obu", destination: "hud", pcp: 0, gateIndex: 1, packetFilter: "*->*", packetLength: 325B + 54B, packetInterval: 125us}] ########################## # Visualizer Configuration # gate scheduling visualization *.visualizer.gateScheduleVisualizer[0].displayGateSchedules = true *.visualizer.gateScheduleVisualizer[0].displayDuration = 100us *.visualizer.gateScheduleVisualizer[0].gateFilter = "**.eth[0].queue.transmissionGate[*]" *.visualizer.gateScheduleVisualizer[0].height = 16 # Stream redundancy visualizer *.visualizer.numStreamRedundancyConfigurationVisualizers = 1 *.visualizer.streamRedundancyConfigurationVisualizer[0].displayTrees = true *.visualizer.streamRedundancyConfigurationVisualizer[0].streamFilter = "rearRightWheel" *.visualizer.streamRedundancyConfigurationVisualizer[0].lineColor = "green4" # TSN visualizer *.visualizer.numFailureProtectionConfigurationVisualizers = 1 *.visualizer.failureProtectionConfigurationVisualizer[0].displayTrees = true *.visualizer.failureProtectionConfigurationVisualizer[0].streamFilter = "rearRightWheel" *.visualizer.failureProtectionConfigurationVisualizer[0].lineStyle = "dashed"