Class BasicVehicleCommAdapter

java.lang.Object
org.opentcs.drivers.vehicle.BasicVehicleCommAdapter
All Implemented Interfaces:
java.beans.PropertyChangeListener, java.util.EventListener, Lifecycle, VehicleCommAdapter

public abstract class BasicVehicleCommAdapter
extends java.lang.Object
implements VehicleCommAdapter, java.beans.PropertyChangeListener
A base class for communication adapters mainly providing command queue processing.

Implementation notes:

  • Accessing the command queue/sent queue from outside should always be protected by synchronization on the BasicVehicleCommunicationAdapter instance.
  • Constructor Details

    • BasicVehicleCommAdapter

      public BasicVehicleCommAdapter​(VehicleProcessModel vehicleModel, int commandQueueCapacity, int sentQueueCapacity, java.lang.String rechargeOperation, java.util.concurrent.Executor executor)
      Creates a new instance.
      Parameters:
      vehicleModel - An observable model of the vehicle's and its comm adapter's attributes.
      commandQueueCapacity - The number of commands this comm adapter's command queue accepts. Must be at least 1.
      sentQueueCapacity - The maximum number of orders to be sent to a vehicle.
      rechargeOperation - The string to recognize as a recharge operation.
      executor - The executor to run tasks on.
  • Method Details

    • initialize

      public void initialize()
      (Re-)Initializes this component before it is being used.

      Overriding methods are expected to call this implementation, too.

      Specified by:
      initialize in interface Lifecycle
    • terminate

      public void terminate()
      Terminates the instance and frees resources.

      Overriding methods are expected to call this implementation, too.

      Specified by:
      terminate in interface Lifecycle
    • isInitialized

      public boolean isInitialized()
      Description copied from interface: Lifecycle
      Checks whether this component is initialized.
      Specified by:
      isInitialized in interface Lifecycle
      Returns:
      true if, and only if, this component is initialized.
    • enable

      public void enable()
      Enables this comm adapter, i.e. turns it on.

      Overriding methods are expected to call this implementation, too.

      Specified by:
      enable in interface VehicleCommAdapter
    • disable

      public void disable()
      Disables this comm adapter, i.e. turns it off.

      Overriding methods are expected to call this implementation, too.

      Specified by:
      disable in interface VehicleCommAdapter
    • isEnabled

      public boolean isEnabled()
      Description copied from interface: VehicleCommAdapter
      Checks whether this communication adapter is enabled.
      Specified by:
      isEnabled in interface VehicleCommAdapter
      Returns:
      true if, and only if, this communication adapter is enabled.
    • getProcessModel

      public VehicleProcessModel getProcessModel()
      Description copied from interface: VehicleCommAdapter
      Returns an observable model of the vehicle's and its comm adapter's attributes.
      Specified by:
      getProcessModel in interface VehicleCommAdapter
      Returns:
      An observable model of the vehicle's and its comm adapter's attributes.
    • createTransferableProcessModel

      public VehicleProcessModelTO createTransferableProcessModel()
      Description copied from interface: VehicleCommAdapter
      Returns a transferable/serializable model of the vehicle's and its comm adapter's attributes.
      Specified by:
      createTransferableProcessModel in interface VehicleCommAdapter
      Returns:
      A transferable/serializable model of the vehicle's and its comm adapter's attributes.
    • getCommandQueueCapacity

      public int getCommandQueueCapacity()
      Description copied from interface: VehicleCommAdapter
      Indicates how many commands this comm adapter's command queue accepts.
      Specified by:
      getCommandQueueCapacity in interface VehicleCommAdapter
      Returns:
      The number of commands this comm adapter's command queue accepts.
    • getCommandQueue

      public java.util.Queue<MovementCommand> getCommandQueue()
      Description copied from interface: VehicleCommAdapter
      Returns this adapter's command queue.
      Specified by:
      getCommandQueue in interface VehicleCommAdapter
      Returns:
      This adapter's command queue.
    • getSentQueueCapacity

      public int getSentQueueCapacity()
      Description copied from interface: VehicleCommAdapter
      Returns the capacity of this adapter's sent queue.
      Specified by:
      getSentQueueCapacity in interface VehicleCommAdapter
      Returns:
      The capacity of this adapter's sent queue.
    • getSentQueue

      public java.util.Queue<MovementCommand> getSentQueue()
      Description copied from interface: VehicleCommAdapter
      Returns a queue containing the commands that this adapter has sent to the vehicle already but which have not yet been processed by it.
      Specified by:
      getSentQueue in interface VehicleCommAdapter
      Returns:
      A queue containing the commands that this adapter has sent to the vehicle already but which have not yet been processed by it.
    • getRechargeOperation

      public java.lang.String getRechargeOperation()
      Description copied from interface: VehicleCommAdapter
      Returns the string the comm adapter recognizes as a recharge operation.
      Specified by:
      getRechargeOperation in interface VehicleCommAdapter
      Returns:
      The string the comm adapter recognizes as a recharge operation.
    • enqueueCommand

      public boolean enqueueCommand​(MovementCommand newCommand)
      Description copied from interface: VehicleCommAdapter
      Appends a command to this communication adapter's command queue. The return value of this method indicates whether the command was really added to the queue. The primary reason for a commmand not being added to the queue is that it would exceed its capacity.
      Specified by:
      enqueueCommand in interface VehicleCommAdapter
      Parameters:
      newCommand - The command to be added to this adapter's command queue.
      Returns:
      true if, and only if, the new command was added to this adapter's command queue.
    • clearCommandQueue

      public void clearCommandQueue()
      Description copied from interface: VehicleCommAdapter
      Clears this communication adapter's command queue. All commands in the queue that have not been sent to this adapter's vehicle, yet, will be removed from the command queue. Any operation the vehicle might currently be executing will still be completed, though.
      Specified by:
      clearCommandQueue in interface VehicleCommAdapter
    • execute

      public void execute​(AdapterCommand command)
      Description copied from interface: VehicleCommAdapter
      Executes the given AdapterCommand.
      Specified by:
      execute in interface VehicleCommAdapter
      Parameters:
      command - The command to execute.
    • propertyChange

      public void propertyChange​(java.beans.PropertyChangeEvent evt)
      Processes updates of the VehicleProcessModel.

      Overriding methods should also call this.

      Specified by:
      propertyChange in interface java.beans.PropertyChangeListener
      Parameters:
      evt - The property change event published by the model.
    • getName

      public java.lang.String getName()
      Returns this communication adapter's name.
      Returns:
      This communication adapter's name.
    • sendCommand

      public abstract void sendCommand​(MovementCommand cmd) throws java.lang.IllegalArgumentException
      Converts the given command to something the vehicle can understand and sends the resulting data to the vehicle.

      Note that this method is called from the kernel executor and thus should not block.

      Parameters:
      cmd - The command to be sent.
      Throws:
      java.lang.IllegalArgumentException - If there was a problem with interpreting the command or communicating it to the vehicle.
    • canSendNextCommand

      protected boolean canSendNextCommand()
      Checks whether a new command can be sent to the vehicle. The default implementation of this method returns true only if the number of commands sent already is less than the vehicle's capacity and there is at least one command in the queue that is waiting to be sent.
      Returns:
      true if, and only if, a new command can be sent to the vehicle.
    • connectVehicle

      protected abstract void connectVehicle()
      Initiates a communication channel to the vehicle. This method should not block, i.e. it should not wait for the actual connection to be established, as the vehicle could be temporarily absent or not responding at all. If that's the case, the communication adapter should continue trying to establish a connection until successful or until disconnectVehicle is called.
    • disconnectVehicle

      protected abstract void disconnectVehicle()
      Closes the communication channel to the vehicle.
    • isVehicleConnected

      protected abstract boolean isVehicleConnected()
      Checks whether the communication channel to the vehicle is open.

      Note that the return value of this method does not indicate whether communication with the vehicle is currently alive and/or if the vehicle is considered to be working/responding correctly.

      Returns:
      true if, and only if, the communication channel to the vehicle is open.
    • createCustomTransferableProcessModel

      protected VehicleProcessModelTO createCustomTransferableProcessModel()
      Creates a transferable process model with the specific attributes of this comm adapter's process model set.

      This method should be overriden by implementing classes.

      Returns:
      A transferable process model.