View Javadoc
1   package org.opentrafficsim.road.gtu.lane.perception.mental.channel;
2   
3   import java.util.Set;
4   import java.util.function.BiFunction;
5   import java.util.function.Function;
6   
7   import org.djutils.exceptions.Throw;
8   import org.opentrafficsim.base.parameters.ParameterException;
9   import org.opentrafficsim.core.network.LateralDirectionality;
10  import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
11  import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
12  import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
13  import org.opentrafficsim.road.gtu.lane.perception.mental.AbstractTask;
14  import org.opentrafficsim.road.gtu.lane.perception.mental.DistractionField;
15  import org.opentrafficsim.road.network.lane.object.RoadSideDistraction;
16  
17  /**
18   * Channel implementation of task due to road side distraction.
19   * <p>
20   * Copyright (c) 2026-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
21   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
22   * </p>
23   * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
24   */
25  public class ChannelTaskRoadSideDistraction extends AbstractTask implements ChannelTask
26  {
27  
28      /** Distraction field. */
29      private final DistractionField distractionField;
30  
31      /** Direction. */
32      private final LateralDirectionality direction;
33  
34      /** Filter to retain relevant distractions. */
35      private final BiFunction<RelativeLane, RoadSideDistraction, Boolean> filter;
36  
37      /**
38       * Constructor. This task applies to a subset of distractions depending on the direction:
39       * <ul>
40       * <li>LEFT: distractions on left lanes with NONE direction, and distractions on current lane with LEFT direction</li>
41       * <li>RIGHT: distractions on right lanes with NONE direction, and distractions on current lane with RIGHT direction</li>
42       * <li>NONE: distractions on current lane with NONE direction
43       * </ul>
44       * @param distractionField distraction field, which should be shared amongst instances
45       * @param direction direction of applicable distractions
46       */
47      public ChannelTaskRoadSideDistraction(final DistractionField distractionField, final LateralDirectionality direction)
48      {
49          super("road-side distraction (" + direction + ")");
50          Throw.whenNull(distractionField, "distractionField");
51          Throw.whenNull(direction, "direction");
52          this.distractionField = distractionField;
53          this.direction = direction;
54          // all distractions on current lane with direction of this task
55          // all distractions on lanes on the side of this task, where the distraction direction is NONE (i.e. on the lane)
56          this.filter = (lane, distraction) -> (lane.isCurrent() && this.direction.equals(distraction.getSide()))
57                  || (this.direction.equals(lane.getLateralDirectionality()) && distraction.getSide().isNone());
58      }
59  
60      @Override
61      protected double calculateTaskDemand(final LanePerception perception) throws ParameterException
62      {
63          return this.distractionField.getDistraction(this.filter);
64      }
65  
66      @Override
67      public Object getChannel()
68      {
69          return this.direction.isLeft() ? LEFT : (this.direction.isRight() ? RIGHT : FRONT);
70      }
71  
72      /**
73       * Supplier of distraction tasks. This supplier returns a persistent set in which each distraction task shares a distraction
74       * field.
75       */
76      public static class Supplier implements Function<LanePerception, Set<ChannelTask>>
77      {
78          /** Set of tasks. */
79          private final Set<ChannelTask> set;
80  
81          /**
82           * Constructor.
83           * @param gtu GTU
84           */
85          public Supplier(final LaneBasedGtu gtu)
86          {
87              DistractionField distractionField = new DistractionField(gtu);
88              this.set = Set.of(new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.LEFT),
89                      new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.NONE),
90                      new ChannelTaskRoadSideDistraction(distractionField, LateralDirectionality.RIGHT));
91          }
92  
93          @Override
94          public Set<ChannelTask> apply(final LanePerception t)
95          {
96              return this.set;
97          }
98      }
99  
100 }