fprime/Svc/GenericHub/GenericHub.fpp
mshahabn e0afd3c3fb
Add missing implementation of GenericHub (#4420)
* Revise GenericHub model

* Revise GenericHub model

* Revise GenericHub model

* Update spelling

* Revise annotations

* Revise annotations for GenericHub model

* Revise annotations in GenericHub model

* Revise GenericHub model

* Revise GenericHub model

* Revise GenericHub model

* Revise GenericHub

* Revise GenericHub

* Revise GenericHub model

* Revise GenericHub model

* Revise GenericHub config

* Revise GenericHub model

* Revise GenericHub model

* Clean up naming in GenericHub implementation

* Revise GenericHub port names

* Revise annotations in GenericHub model

* Revise annotations in GenericHub model

* Revise annotations in GenericHub model

* Add ByteStreamDriverClient

* Revise ByteStreamDriverClient

* Revise ByteStreamDriverClient

* Revise driver interfaces

* Add PassiveByteStreamDriverClientSendAsync interface

* Add PassiveAsyncByteStreamDriverClient interface

* Add PassiveBufferDriver

* Revise PassiveByteStreamDriverClient interfaces

* Revise PassiveBufferDriver

* Revise Drv interfaces

* Revise PassiveBufferDriver

* Add PassiveBufferDriverClient

* Revise GenericHub model

Use interfaces from Drv

* Revise annotations in GenericHub model

* Revise FPP models

Point FPP to a non-released version with a bug fix

* Add ByteStreamBufferAdapter

* Revise ByteStreamBufferAdapter model

* Revise ByteStreamBufferAdapter

* Revise ByteStreamBufferAdapter

* Add AsyncByteStreamBufferAdapter

* Revise AsyncByteStreamBufferAdapter

* Revsie AsyncByteStreamBufferAdapter

* Revise AsyncByteStreamBufferAdapter

* Revise annotations in FPP model

* Revise ByteStreamBufferAdapter

* Bump fpp version

* Revise GenericHub model

* Revise GenericHub interface

* Revise GenericHub interface

* Fix typo in FPP annotations

* Revise Generic Hub model

* Fix spelling and formatting

* Review recommendations

---------

Co-authored-by: Rob Bocchino <bocchino@jpl.nasa.gov>
Co-authored-by: thomas-bc <thomas.boyerchammard@gmail.com>
2025-12-02 17:56:34 -08:00

189 lines
8.6 KiB
Fortran

module Svc {
@| ----------------------------------------------------------------------
@| A generic hub component
@| ----------------------------------------------------------------------
@| In F Prime, a *hub* is a mechanism for implementing logical port connections
@| that physically span two F Prime deployments. The pattern is called a "hub"
@| because any number of logical connections may be multiplexed through a single
@| pair of hubs. For example, a pair of logical connections like this
@|
@| A1 --> B1
@| A2 --> B2,
@|
@| where Ai and Bi are component instances in separate deployments A and B,
@| can be implemented using hubs HA and HB like this:
@|
@| A1 -->--+ +-->-- B1
@| | |
@| HA ~~> HB
@| | |
@| A2 -->--+ +-->-- B2
@|
@| The notation ~~> represents data transport between deployments,
@| e.g., via shared memory or across a network connection.
@|
@| The GenericHub component provides a generic capability for implementing a
@| hub. Typically there is a pair of instances of GenericHub, one in each
@| deployment, and each instance is paired with a driver for doing the
@| communication. Sending data between the deployments looks like this:
@|
@| FSW --> GenericHub --> Driver ~~> Driver --> GenericHub --> FSW
@|
@| The driver must be a *buffer driver*, i.e., any combination of component
@| instances that sends and receives Fw.Buffer objects across a network.
@| For example, the driver may be a pair consisting of (1) a ByteStreamDriver
@| component that implements ByteStreamDriverInterface and
@| (2) a ByteStreamBufferAdapter.
@|
@| The driver is specific to the transport mechanism.
@| The GenericHub may be paired with any driver that conforms to
@| its interface, and so can support any transport mechanism.
@| ----------------------------------------------------------------------
passive component GenericHub {
# ----------------------------------------------------------------------
# Ports for sending data from FSW to the hub
# ----------------------------------------------------------------------
# These ports establish the "send" interface from the rest of FSW to the hub.
# ----------------------------------------------------------------------
# Each of these ports has the following behavior:
# 1. Invoke allocate to allocate a buffer B.
# 2. Serialize the hub message type (event, telemetry, serial, buffer),
# the port number, and the data into B.
# 3. Emit B on toBufferDriver.
#
# Sample connections:
#
# eventProducer.eventOut -> genericHub.eventIn
# telemetryProducer.tlmOut -> genericHub.tlmIn
#
# valueProducer0.valueOut[0] -> genericHub.serialIn[0]
# valueProducer1.valueOut[1] -> genericHub.serialIn[1]
#
# bufferProducer0.bufferOut -> genericHub.bufferIn[0]
# genericHub.bufferInReturn[0] -> bufferProducer0.bufferIn
# bufferProducer1.bufferOut -> genericHub.bufferIn[1]
# genericHub.bufferInReturn[1] -> bufferProducer1.bufferIn
# ----------------------------------------------------------------------
@ Port for sending events to the hub
sync input port eventIn: Fw.Log
@ Port for sending telemetry to the hub
sync input port tlmIn: Fw.Tlm
@ Ports for sending serial data to the hub
@ You can connect any typed output ports to these input ports, so
@ long as the data carried by the ports is serialized by value.
@ Do not connect ports that emit Fw.Buffer objects, because these objects
@ store pointers to data that is not serialized across the port
@ interface. To connect output ports that emit buffers, use
@ buffersIn below.
sync input port serialIn: [GenericHubCfg.NumSerialInputPorts] serial
@ Ports for sending buffer data to the hub
@ Output ports connected to these ports must emit Fw.Buffer objects.
@ On invocation, each of these ports allocates a new buffer B, copies the
@ data from the incoming buffer to B, and returns the incoming
@ buffer to the sender for deallocation.
@
sync input port bufferIn: [GenericHubCfg.NumBufferInputPorts] Fw.BufferSend
@ Ports for returning buffers arriving on buffersIn
output port bufferInReturn: [GenericHubCfg.NumBufferInputPorts] Fw.BufferSend
@ bufferIn and bufferInReturn ports must match
match bufferIn with bufferInReturn
# ----------------------------------------------------------------------
# Ports for sending data from the hub to a buffer driver
# ----------------------------------------------------------------------
# These ports establish the "send" interface from the hub to a buffer driver.
#
# Sample connections:
#
# genericHub.allocate -> bufferManager.bufferGetCallee
# genericHub.toBufferDriver -> bufferDriver.bufferIn
# bufferDriver.bufferInReturn -> genericHub.toBufferDriverReturn
# genericHub.deallocate -> bufferManager.bufferSendIn
# ----------------------------------------------------------------------
@ This interface provides ports allocate and deallocate
import Svc.BufferAllocation
@ This interface provides ports toBufferDriver and toBufferDriverReturn
import Drv.PassiveBufferDriverClientSend
# ----------------------------------------------------------------------
# Ports for receiving data from a buffer driver to the hub
# ----------------------------------------------------------------------
# These ports establish the "receive" interface from a driver to the hub.
# Each of these ports has the following behavior:
# 1. Unpack the incoming buffer into hub message type, port number, and data.
# 2. If the hub message type is event, telemetry, or serial,
# then pass the data by value to the receiver and invoke fromBufferDriverReturn
# to return the incoming buffer for deallocation.
# 3. Otherwise adjust the metadata of the incoming buffer to point
# to the data, and emit the same buffer on bufferOut. When the
# buffer is returned on bufferOutReturn, invoke fromBufferDriverReturn to return it.
#
# Sample connections:
#
# bufferDriver.bufferOut -> genericHub.fromBufferDriver
# genericHub.fromBufferDriverReturn -> bufferDriver.bufferOutReturn
# ----------------------------------------------------------------------
@ This interface provides ports fromBufferDriver and fromBufferDriverReturn
import Drv.PassiveBufferDriverClientRecv
# ----------------------------------------------------------------------
# Ports for receiving data from the hub to FSW
# ----------------------------------------------------------------------
# These ports establish the "receive" interface from the hub to FSW
#
# Sample connections:
#
# genericHub.eventOut -> eventManager.eventIn
# genericHub.tlmOut -> tlmDb.eventIn
#
# genericHub.serialOut[0] -> valueConsumer0.valueIn[0]
# genericHub.serialOut[1] -> valueConsumer1.valueIn[1]
#
# genericHub.bufferOut[0] -> bufferConsumer0.bufferIn
# bufferConsumer0.bufferInReturn -> genericHub.bufferOutReturn[0]
# genericHub.bufferOut[1] -> bufferConsumer1.bufferIn
# bufferConsumer1.bufferInReturn -> genericHub.bufferOutReturn[1]
# ----------------------------------------------------------------------
@ Port for receiving events
@ Data emitted on this port is copied from a buffer received on fromBufferDriver,
@ and the buffer is returned.
output port eventOut: Fw.Log
@ Port for receiving telemetry channels
@ Data emitted on this port is copied from a buffer received on fromBufferDriver,
@ and the buffer is returned.
output port tlmOut: Fw.Tlm
@ Ports for receiving serial data
@ You can connect each of these output ports to any typed input port.
@ Data emitted on one of these ports is copied from a buffer received on fromBufferDriver,
@ and the buffer is returned.
output port serialOut: [GenericHubCfg.NumSerialOutputPorts] serial
@ Ports for receiving buffer data
@ A buffer emitted on one of these ports is a buffer received on fromBufferDriver,
@ With adjusted metadata to point to the data stored in the buffer.
output port bufferOut: [GenericHubCfg.NumBufferOutputPorts] Fw.BufferSend
@ Ports for receiving buffers sent on bufferOut and then returned
sync input port bufferOutReturn: [GenericHubCfg.NumBufferOutputPorts] Fw.BufferSend
@ bufferOut and bufferOutReturn ports must match
match bufferOut with bufferOutReturn
}
}