Class Cop1TcPacketHandler

java.lang.Object
com.google.common.util.concurrent.AbstractService
org.yamcs.tctm.AbstractLink
org.yamcs.tctm.AbstractTcDataLink
org.yamcs.tctm.ccsds.Cop1TcPacketHandler
All Implemented Interfaces:
com.google.common.util.concurrent.Service, SystemParametersProducer, VcUplinkHandler, Link, LinkActionProvider, TcDataLink

public class Cop1TcPacketHandler extends AbstractTcDataLink implements VcUplinkHandler
Assembles TC packets into TC frames as per CCSDS 232.0-B-3 and sends them out via FOP1

Implements the FOP (transmitter) part of the Communications Operations Procedure-1 CCSDS 232.1-B-2 September 2010

The FOP1 implementation is a little different than the standard: the "Initiate AD service with CLCW check" will wait for the first CLCW and immediately set the vS to the nR in the CLCW. The standard specifies that the vS has somehow to be set manually to an CLCW observed value before calling the "Initiate AD with CLCW check" directive.

  • Field Details

  • Constructor Details

  • Method Details

    • addMonitor

      public void addMonitor(Cop1Monitor monitor)
    • removeMonitor

      public void removeMonitor(Cop1Monitor monitor)
    • sendCommand

      public boolean sendCommand(PreparedCommand pc)
      Description copied from interface: TcDataLink
      Attempt to send the command and return true if the command has been sent or its processing has finished.

      If false is returned, the LinkManager will attempt to send the command via the next TC link (if any).

      The link is expected to update the CommandHistoryPublisher.AcknowledgeSent_KEY ack in the command history if the method returned true. If it returned false, the ack should not be updated (it will be updated by the next link or by the Link Manager if there is other no link).

      The link can update the CommandHistoryPublisher.AcknowledgeSent_KEY ack with a negative ack and return true (i.e. the command has not been really sent but it has finished processing).

      The return true/false has been introduced in Yamcs 5.6.0. Before that version, the old method sendTc was implicitly returning true. As of Yamcs 5.6.0 most links return true even when they cannot send the command (setting the negative Sent ack).

      Throwing an exception is equivalent with returning false, except a error log will be printed (this is considered a bug)

      Specified by:
      sendCommand in interface TcDataLink
      Returns:
    • getFrame

      public TcTransferFrame getFrame()
      Description copied from interface: VcUplinkHandler
      Retrieves the next frame in the Virtual Channel, or returns null if there is no frame available at the moment.
      Specified by:
      getFrame in interface VcUplinkHandler
      Returns:
    • getFirstFrameTimestamp

      public long getFirstFrameTimestamp()
      Description copied from interface: VcUplinkHandler
      Returns the timestamp of the first frame ready to be dispatched or TimeEncoding.INVALID_INSTANT if there is no frame.

      The timestamp is used by the MasterChannelFrameMultiplexer to select the Virtual Channel from which the next frame is sent in case of FIFO priority scheme.

      Specified by:
      getFirstFrameTimestamp in interface VcUplinkHandler
      Returns:
    • setVs

      public CompletableFuture<Void> setVs(int vs)
    • initiateAD

      public CompletableFuture<Void> initiateAD(boolean clcwCheck, long waitMillisec)
      Initiate AD with or without CLCW check The returned future will be completed when the operation has been initiated.
      Parameters:
      clcwCheck - - if true, a CLCW will be expected from the remote system and used to initialise the vS. - If false, the current value of vS will be used.
    • initiateAD

      public CompletableFuture<Void> initiateAD(boolean clcwCheck)
    • initiateADWithVR

      public CompletableFuture<Void> initiateADWithVR(int vR)
      Initiate AD with set V(R). This will cause a BC frame to be sent to the remote system.

      The returned future is completed as soon as a BC frame has been sent downstream (could be unsuccessful!).

      Parameters:
      vR -
    • initiateADWithUnlock

      public CompletableFuture<Void> initiateADWithUnlock()
      Initiate AD with Unlock. This causes a BC Unlock frame to be sent to the remote system.
    • terminateAD

      public CompletableFuture<Void> terminateAD()
      Terminate the AD service
      Returns:
    • setWindowWidth

      public CompletableFuture<Void> setWindowWidth(int K)
      Set the FOP sliding window with - that is the maximum number of commands that can be unacknoledged at one time.
      Parameters:
      K -
      Returns:
    • resume

      public CompletableFuture<Void> resume()
      Resume the AD service (if it is suspended)
      Returns:
    • purgeSentQueue

      public void purgeSentQueue()
    • purgeWaitQueue

      public void purgeWaitQueue()
    • onCLCW

      public void onCLCW(int clcw)
      Called when a new CLCW is received from the remote system
      Parameters:
      clcw -
    • doStart

      protected void doStart()
      Specified by:
      doStart in class com.google.common.util.concurrent.AbstractService
    • doStop

      protected void doStop()
      Specified by:
      doStop in class com.google.common.util.concurrent.AbstractService
    • getDataAvailableSemaphore

      public Semaphore getDataAvailableSemaphore()
    • disableCop1

      public void disableCop1(boolean bypassAll)
    • setDataAvailableSemaphore

      public void setDataAvailableSemaphore(Semaphore dataAvailableSemaphore)
      The semaphore will be used by the data link to signal when there is some data to be transmitted.

      A permit will be released in these circumstances

      • a new AD telecommand has been placed into the incoming queue;
      • a BC frame has been released
      • a BD command has been released
      Note that if two commands are placed, two permits will be released but the commands might be put in the same frame. This means that the number of permits released is not exactly the same with the number of frames ready to be sent. However the semaphore is used by the master channel to avoid pooling each VC in turn even though no data is available.
      Specified by:
      setDataAvailableSemaphore in interface VcUplinkHandler
      Parameters:
      dataAvailableSemaphore -
    • getParameters

      public VcUplinkManagedParameters getParameters()
      Description copied from interface: VcUplinkHandler
      return the virtual channel parameters
      Specified by:
      getParameters in interface VcUplinkHandler
      Returns:
    • setConfig

      public CompletableFuture<Void> setConfig(Cop1Config config)
    • getCop1Config

      public CompletableFuture<Cop1Config> getCop1Config()
    • getCop1Status

      public CompletableFuture<Cop1Status> getCop1Status()
    • setupSystemParameters

      public void setupSystemParameters(SystemParametersService sysParamsService)
      Description copied from interface: Link
      Called by the LinkManager before startup if the SystemParametersService service is enabled, to setup necessary things for later parameter collection.

      The method is called only on the links that implement the SystemParametersProducer interface; they are also registered with the SystemParametersService to be called regularly after the start.

      Specified by:
      setupSystemParameters in interface Link
      Overrides:
      setupSystemParameters in class AbstractLink
    • collectSystemParameters

      protected void collectSystemParameters(long time, List<ParameterValue> list)
      Description copied from class: AbstractLink
      adds system parameters link status and data in/out to the list.

      The inheriting classes should call super.collectSystemParameters and then add their own parameters to the list

      Overrides:
      collectSystemParameters in class AbstractLink
    • connectionStatus

      protected Link.Status connectionStatus()
      Description copied from class: AbstractLink
      In case the link should be connected (i.e. is running and enabled) this method is called to return the actual connection status
      Specified by:
      connectionStatus in class AbstractLink