Add Core Subtopologies: ComFprime, ComCcsds, DataProducts, FileHandling (#3768)

* Added led-blinker workflow for aarch64-linux platform

* Update runner label

* Added Tags to RPI self hosted workflows, sparse-checkout-cone-mode false

* Add subtopologies to Svc/ restructing of Ref to include CDH subtopology

* CDHCore Subtopology added under Svc and integrated into Ref

* Health instance within CDHCore references CDHCoreConfig for queue size

* Update metadata

check-spelling run (push) for add-subtopologies

Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

* Added AssertFatalAdapter Version PassiveTextLogger to Subtopology, config clarity improvements

* Comms subtopology without cmdSeq created, integrated in Ref

* Added cmdSeq to Comms Subtopology, integrated into Ref

* Add FileHandling Subtopology, initial structure

* Fixed Spelling, Flie -> File

* Update metadata

check-spelling run (push) for add-subtopologies

Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

* Added working FileHandling, DataProducts subtopology, integrated into Ref

* prmDb part of FileHandling, fatalHandler part of CDHCore

* Update metadata

check-spelling run (push) for add-subtopologies

Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

* Update comment for clarity

* Initial move to phasing components

* Fixing Phasing: Adding initial Phasing for CDHCore, DataProducts, FileHandling

* Renaming topologydefs.hpp, phasing fully working on all four subtopologies, needs cleaning up

* Cleanup with Ports_ComPacketQueue, definition only in Comms.fpp now

* Base project with all 4 subtopologies, integrated into Ref, and passing CI

* Initial Commit with all Subtopologies in Svc/Subtopologies

* Added posixtime back in to Ref Deployment (Accidentally Deleted)

* Updates to match new subtopology structure, integrate CCSDS into Ref

* Changes to CommCCSDS that go with last changes

* Standardize subtopology structure and naming to PascalCase

* Namespace fixe for ComFprime

* CDHCore->Cdhcore for consistency

* Rename CDHCore to CdhCore for consistency

* Update metadata

check-spelling run (pull_request_target) for add-subtopologies

Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
on-behalf-of: @check-spelling <check-spelling-bot@check-spelling.dev>

* Reorder on teardown phases for Com Subtopolgies

* Cpp check style fix

* Fix: Add missing tearDownComponents cleanup for DataProducts dpBufferManager

* Delete old comments, test using same mallocator for all subtopologies

* fix: Deallocated DataProducts BufferMgr

* Fix DataProducts subtopology memory cleanup

* Fix: Dataproducts subtopology teardown order

* Added tearDownComponents(state)

* Consolidate all cleanup to teardowncomponents

* Fix memory leaks: restore teardown phases

* Removal of redundant teardowncomponents()

* Revert "Removal of redundant teardowncomponents()"

This reverts commit 29d4ff8242574f1afc1bb6aacdf5cfef4d79987d.

* Fix formatting, remove commented out code

* Swap hardcoded numbers to config constants in subtopologies

* register_fprime_config() in config modules, isolated ComDriver into a separate config fpp file

* Added explicit CMake Module Names and Depends between Subtopologies and their Configs

* Fixed CCSDS case, more config constants

* Added explicit depends for each subtopology config

* added mallocator config, subtopology state structure

* Update subtopology config names for clarity, fixes #3571

* Fix reference to dpBuffer config Constants

---------

Signed-off-by: check-spelling-bot <check-spelling-bot@users.noreply.github.com>
Co-authored-by: Moises Mata <moisesmata@users.noreply.github.com>
This commit is contained in:
Moises Mata 2025-06-26 15:00:57 -07:00 committed by GitHub
parent c602046f4b
commit d69b7a10d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
54 changed files with 1245 additions and 506 deletions

View File

@ -68,7 +68,7 @@ CCB
CComponent CComponent
ccsds ccsds
ccsparc ccsparc
CDH cdh
CDHCORE CDHCORE
cerrno cerrno
CFDP CFDP
@ -95,6 +95,10 @@ CODEFILE
COLORSTYLE COLORSTYLE
colorwheel colorwheel
COMBUFFER COMBUFFER
COMCCSDS
COMCCSDSSUBTOPOLOGY
COMFPRIME
COMFPRIMESUBTOPOLOGY
comlogger comlogger
COMMANDDISPATCHERIMPL COMMANDDISPATCHERIMPL
COMMANDDISPATCHERIMPLCFG COMMANDDISPATCHERIMPLCFG
@ -133,6 +137,8 @@ ctu
culates culates
cuz cuz
CYCLEOUT CYCLEOUT
DATAPRODUCTS
DATAPRODUCTSSUBTOPOLOGY
DATAROOTDIR DATAROOTDIR
DDDTHH DDDTHH
Debian Debian
@ -213,11 +219,12 @@ ffff
Ffs Ffs
FILEDOWNLINK FILEDOWNLINK
FILEDOWNLINKCFG FILEDOWNLINKCFG
FILEHANDLING
FILEHANDLINGSUBTOPOLOGY
FILEID FILEID
FILEOPENERROR FILEOPENERROR
FILEWRITEERROR FILEWRITEERROR
fio fio
FLDP
FNDELAY FNDELAY
FONTPATH FONTPATH
foodoodie foodoodie
@ -390,7 +397,6 @@ multitool
mutexattr mutexattr
Mutexed Mutexed
mycompany mycompany
NACI
nasafprime nasafprime
nbits nbits
ncsl ncsl
@ -451,7 +457,6 @@ PASSIVERATEGROUP
PASSIVERATEGROUPIMPLTESTER PASSIVERATEGROUPIMPLTESTER
patsubst patsubst
pdflatex pdflatex
PEB
penv penv
PERLMOD PERLMOD
PINGENTRIES PINGENTRIES

View File

@ -82,8 +82,8 @@ int main(int argc, char* argv[]) {
} }
// Object for communicating state to the reference topology // Object for communicating state to the reference topology
Ref::TopologyState inputs; Ref::TopologyState inputs;
inputs.hostname = hostname; inputs.comCcsds.hostname = hostname;
inputs.port = port_number; inputs.comCcsds.port = port_number;
// Setup program shutdown via Ctrl-C // Setup program shutdown via Ctrl-C
signal(SIGINT, signalHandler); signal(SIGINT, signalHandler);

View File

@ -1,39 +1,44 @@
telemetry packets RefPackets { telemetry packets RefPackets {
packet CDH id 1 group 1 { packet CDH id 1 group 1 {
CDHCore.cmdDisp.CommandsDispatched CdhCore.cmdDisp.CommandsDispatched
FileHandling.fileUplink.FilesReceived
FileHandling.fileUplink.PacketsReceived
FileHandling.fileDownlink.FilesSent
FileHandling.fileDownlink.PacketsSent
FileHandling.fileManager.CommandsExecuted
ComCcsds.cmdSeq.CS_LoadCommands
ComCcsds.cmdSeq.CS_CancelCommands
ComCcsds.cmdSeq.CS_CommandsExecuted
ComCcsds.cmdSeq.CS_SequencesCompleted
ComCcsds.comQueue.comQueueDepth
ComCcsds.comQueue.buffQueueDepth
ComCcsds.commsBufferManager.TotalBuffs
ComCcsds.commsBufferManager.CurrBuffs
ComCcsds.commsBufferManager.HiBuffs
#ComCcsds.tlmSend.SendLevel
Ref.rateGroup1Comp.RgMaxTime Ref.rateGroup1Comp.RgMaxTime
Ref.rateGroup2Comp.RgMaxTime Ref.rateGroup2Comp.RgMaxTime
Ref.rateGroup3Comp.RgMaxTime Ref.rateGroup3Comp.RgMaxTime
Ref.cmdSeq.CS_LoadCommands
Ref.cmdSeq.CS_CancelCommands
Ref.cmdSeq.CS_CommandsExecuted
Ref.cmdSeq.CS_SequencesCompleted
Ref.fileUplink.FilesReceived
Ref.fileUplink.PacketsReceived
Ref.commsBufferManager.TotalBuffs
Ref.commsBufferManager.CurrBuffs
Ref.commsBufferManager.HiBuffs
Ref.fileDownlink.FilesSent
Ref.fileDownlink.PacketsSent
Ref.fileManager.CommandsExecuted
Ref.comQueue.comQueueDepth
Ref.comQueue.buffQueueDepth
#CDHCore.tlmSend.SendLevel
} }
packet CDHErrors id 2 group 1 { packet CDHErrors id 2 group 1 {
CdhCore.$health.PingLateWarnings
FileHandling.fileUplink.Warnings
FileHandling.fileDownlink.Warnings
FileHandling.fileManager.Errors
ComCcsds.cmdSeq.CS_Errors
ComCcsds.commsBufferManager.NoBuffs
ComCcsds.commsBufferManager.EmptyBuffs
Ref.rateGroup1Comp.RgCycleSlips Ref.rateGroup1Comp.RgCycleSlips
Ref.rateGroup2Comp.RgCycleSlips Ref.rateGroup2Comp.RgCycleSlips
Ref.rateGroup3Comp.RgCycleSlips Ref.rateGroup3Comp.RgCycleSlips
Ref.cmdSeq.CS_Errors
Ref.fileUplink.Warnings
Ref.fileDownlink.Warnings
CDHCore.$health.PingLateWarnings
Ref.fileManager.Errors
Ref.commsBufferManager.NoBuffs
Ref.commsBufferManager.EmptyBuffs
Ref.fileManager.Errors
} }
packet DriveTlm id 3 group 1 { packet DriveTlm id 3 group 1 {
@ -175,94 +180,97 @@ telemetry packets RefPackets {
} }
packet DataProducts id 21 group 3 { packet DataProducts id 21 group 3 {
Ref.dpCat.CatalogDps DataProducts.dpCat.CatalogDps
Ref.dpCat.DpsSent DataProducts.dpCat.DpsSent
Ref.dpMgr.NumSuccessfulAllocations
Ref.dpMgr.NumFailedAllocations DataProducts.dpMgr.NumSuccessfulAllocations
Ref.dpMgr.NumDataProducts DataProducts.dpMgr.NumFailedAllocations
Ref.dpMgr.NumBytes DataProducts.dpMgr.NumDataProducts
Ref.dpWriter.NumBuffersReceived DataProducts.dpMgr.NumBytes
Ref.dpWriter.NumBytesWritten
Ref.dpWriter.NumSuccessfulWrites DataProducts.dpWriter.NumBuffersReceived
Ref.dpWriter.NumFailedWrites DataProducts.dpWriter.NumBytesWritten
Ref.dpWriter.NumErrors DataProducts.dpWriter.NumSuccessfulWrites
Ref.dpBufferManager.TotalBuffs DataProducts.dpWriter.NumFailedWrites
Ref.dpBufferManager.CurrBuffs DataProducts.dpWriter.NumErrors
Ref.dpBufferManager.HiBuffs
Ref.dpBufferManager.NoBuffs DataProducts.dpBufferManager.TotalBuffs
Ref.dpBufferManager.EmptyBuffs DataProducts.dpBufferManager.CurrBuffs
DataProducts.dpBufferManager.HiBuffs
DataProducts.dpBufferManager.NoBuffs
DataProducts.dpBufferManager.EmptyBuffs
} }
packet Version1 id 22 group 2 { packet Version1 id 22 group 2 {
CDHCore.version.FrameworkVersion CdhCore.version.FrameworkVersion
CDHCore.version.ProjectVersion CdhCore.version.ProjectVersion
} }
packet Version_Library1 id 23 group 2 { packet Version_Library1 id 23 group 2 {
CDHCore.version.LibraryVersion01 CdhCore.version.LibraryVersion01
CDHCore.version.LibraryVersion02 CdhCore.version.LibraryVersion02
} }
packet Version_Library2 id 24 group 2 { packet Version_Library2 id 24 group 2 {
CDHCore.version.LibraryVersion03 CdhCore.version.LibraryVersion03
CDHCore.version.LibraryVersion04 CdhCore.version.LibraryVersion04
} }
packet Version_Library3 id 25 group 2 { packet Version_Library3 id 25 group 2 {
CDHCore.version.LibraryVersion05 CdhCore.version.LibraryVersion05
CDHCore.version.LibraryVersion06 CdhCore.version.LibraryVersion06
} }
packet Version_Library4 id 26 group 2 { packet Version_Library4 id 26 group 2 {
CDHCore.version.LibraryVersion07 CdhCore.version.LibraryVersion07
CDHCore.version.LibraryVersion08 CdhCore.version.LibraryVersion08
} }
packet Version_Library5 id 27 group 2 { packet Version_Library5 id 27 group 2 {
CDHCore.version.LibraryVersion09 CdhCore.version.LibraryVersion09
CDHCore.version.LibraryVersion10 CdhCore.version.LibraryVersion10
} }
packet Version_Custom1 id 28 group 2 { packet Version_Custom1 id 28 group 2 {
CDHCore.version.CustomVersion01 CdhCore.version.CustomVersion01
} }
packet Version_Custom2 id 29 group 2 { packet Version_Custom2 id 29 group 2 {
CDHCore.version.CustomVersion02 CdhCore.version.CustomVersion02
} }
packet Version_Custom3 id 30 group 2 { packet Version_Custom3 id 30 group 2 {
CDHCore.version.CustomVersion03 CdhCore.version.CustomVersion03
} }
packet Version_Custom4 id 31 group 2 { packet Version_Custom4 id 31 group 2 {
CDHCore.version.CustomVersion04 CdhCore.version.CustomVersion04
} }
packet Version_Custom5 id 32 group 2 { packet Version_Custom5 id 32 group 2 {
CDHCore.version.CustomVersion05 CdhCore.version.CustomVersion05
} }
packet Version_Custom6 id 33 group 2 { packet Version_Custom6 id 33 group 2 {
CDHCore.version.CustomVersion06 CdhCore.version.CustomVersion06
} }
packet Version_Custom7 id 34 group 2 { packet Version_Custom7 id 34 group 2 {
CDHCore.version.CustomVersion07 CdhCore.version.CustomVersion07
} }
packet Version_Custom8 id 35 group 2 { packet Version_Custom8 id 35 group 2 {
CDHCore.version.CustomVersion08 CdhCore.version.CustomVersion08
} }
packet Version_Custom9 id 36 group 2 { packet Version_Custom9 id 36 group 2 {
CDHCore.version.CustomVersion09 CdhCore.version.CustomVersion09
} }
packet Version_Custom10 id 37 group 2 { packet Version_Custom10 id 37 group 2 {
CDHCore.version.CustomVersion10 CdhCore.version.CustomVersion10
} }
} omit { } omit {
CDHCore.cmdDisp.CommandErrors CdhCore.cmdDisp.CommandErrors
} }

View File

@ -14,8 +14,6 @@
// Necessary project-specified types // Necessary project-specified types
#include <Fw/Types/MallocAllocator.hpp> #include <Fw/Types/MallocAllocator.hpp>
#include <Os/Console.hpp> #include <Os/Console.hpp>
#include <Svc/FrameAccumulator/FrameDetector/CcsdsTcFrameDetector.hpp>
#include <Ref/Top/Ports_ComPacketQueueEnumAc.hpp>
// Used for 1Hz synthetic cycling // Used for 1Hz synthetic cycling
#include <Os/Mutex.hpp> #include <Os/Mutex.hpp>
@ -26,14 +24,6 @@ using namespace Ref;
// Instantiate a system logger that will handle Fw::Logger::log calls // Instantiate a system logger that will handle Fw::Logger::log calls
Os::Console logger; Os::Console logger;
// The reference topology uses a malloc-based allocator for components that need to allocate memory during the
// initialization phase.
Fw::MallocAllocator mallocator;
// The reference topology uses the F´ packet protocol when communicating with the ground and therefore uses the F´
// framing and deframing implementations.
Svc::FrameDetectors::CcsdsTcFrameDetector frameDetector;
// The reference topology divides the incoming clock signal (1Hz) into sub-signals: 1Hz, 1/2Hz, and 1/4Hz and // The reference topology divides the incoming clock signal (1Hz) into sub-signals: 1Hz, 1/2Hz, and 1/4Hz and
// zero offset for all the dividers // zero offset for all the dividers
Svc::RateGroupDriver::DividerSet rateGroupDivisorsSet{{{1, 0}, {2, 0}, {4, 0}}}; Svc::RateGroupDriver::DividerSet rateGroupDivisorsSet{{{1, 0}, {2, 0}, {4, 0}}};
@ -44,28 +34,6 @@ U32 rateGroup1Context[Svc::ActiveRateGroup::CONNECTION_COUNT_MAX] = {};
U32 rateGroup2Context[Svc::ActiveRateGroup::CONNECTION_COUNT_MAX] = {}; U32 rateGroup2Context[Svc::ActiveRateGroup::CONNECTION_COUNT_MAX] = {};
U32 rateGroup3Context[Svc::ActiveRateGroup::CONNECTION_COUNT_MAX] = {}; U32 rateGroup3Context[Svc::ActiveRateGroup::CONNECTION_COUNT_MAX] = {};
Svc::ComQueue::QueueConfigurationTable configurationTable;
// A number of constants are needed for construction of the topology. These are specified here.
enum TopologyConstants {
CMD_SEQ_BUFFER_SIZE = 5 * 1024,
FILE_DOWNLINK_TIMEOUT = 1000,
FILE_DOWNLINK_COOLDOWN = 1000,
FILE_DOWNLINK_CYCLE_TIME = 1000,
FILE_DOWNLINK_FILE_QUEUE_DEPTH = 10,
COMM_PRIORITY = 100,
// Buffer manager for Uplink/Downlink
COMMS_BUFFER_MANAGER_STORE_SIZE = 2048,
COMMS_BUFFER_MANAGER_STORE_COUNT = 20,
COMMS_BUFFER_MANAGER_FILE_STORE_SIZE = 3000,
COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE = 30,
COMMS_BUFFER_MANAGER_ID = 200,
// Buffer manager for Data Products
DP_BUFFER_MANAGER_STORE_SIZE = 10000,
DP_BUFFER_MANAGER_STORE_COUNT = 10,
DP_BUFFER_MANAGER_ID = 300,
};
/** /**
* \brief configure/setup components in project-specific way * \brief configure/setup components in project-specific way
* *
@ -74,9 +42,6 @@ enum TopologyConstants {
* desired, but is extracted here for clarity. * desired, but is extracted here for clarity.
*/ */
void configureTopology() { void configureTopology() {
// Command sequencer needs to allocate memory to hold contents of command sequences
cmdSeq.allocateBuffer(0, mallocator, CMD_SEQ_BUFFER_SIZE);
// Rate group driver needs a divisor list // Rate group driver needs a divisor list
rateGroupDriverComp.configure(rateGroupDivisorsSet); rateGroupDriverComp.configure(rateGroupDivisorsSet);
@ -84,53 +49,6 @@ void configureTopology() {
rateGroup1Comp.configure(rateGroup1Context, FW_NUM_ARRAY_ELEMENTS(rateGroup1Context)); rateGroup1Comp.configure(rateGroup1Context, FW_NUM_ARRAY_ELEMENTS(rateGroup1Context));
rateGroup2Comp.configure(rateGroup2Context, FW_NUM_ARRAY_ELEMENTS(rateGroup2Context)); rateGroup2Comp.configure(rateGroup2Context, FW_NUM_ARRAY_ELEMENTS(rateGroup2Context));
rateGroup3Comp.configure(rateGroup3Context, FW_NUM_ARRAY_ELEMENTS(rateGroup3Context)); rateGroup3Comp.configure(rateGroup3Context, FW_NUM_ARRAY_ELEMENTS(rateGroup3Context));
// File downlink requires some project-derived properties.
fileDownlink.configure(FILE_DOWNLINK_TIMEOUT, FILE_DOWNLINK_COOLDOWN, FILE_DOWNLINK_CYCLE_TIME,
FILE_DOWNLINK_FILE_QUEUE_DEPTH);
// Parameter database is configured with a database file name, and that file must be initially read.
prmDb.configure("PrmDb.dat");
prmDb.readParamFile();
// Buffer managers need a configured set of buckets and an allocator used to allocate memory for those buckets.
Svc::BufferManager::BufferBins commsBuffMgrBins;
memset(&commsBuffMgrBins, 0, sizeof(commsBuffMgrBins));
commsBuffMgrBins.bins[0].bufferSize = COMMS_BUFFER_MANAGER_STORE_SIZE;
commsBuffMgrBins.bins[0].numBuffers = COMMS_BUFFER_MANAGER_STORE_COUNT;
commsBuffMgrBins.bins[1].bufferSize = COMMS_BUFFER_MANAGER_FILE_STORE_SIZE;
commsBuffMgrBins.bins[1].numBuffers = COMMS_BUFFER_MANAGER_FILE_QUEUE_SIZE;
commsBufferManager.setup(COMMS_BUFFER_MANAGER_ID, 0, mallocator, commsBuffMgrBins);
Svc::BufferManager::BufferBins dpBuffMgrBins;
memset(&dpBuffMgrBins, 0, sizeof(dpBuffMgrBins));
dpBuffMgrBins.bins[0].bufferSize = DP_BUFFER_MANAGER_STORE_SIZE;
dpBuffMgrBins.bins[0].numBuffers = DP_BUFFER_MANAGER_STORE_COUNT;
dpBufferManager.setup(DP_BUFFER_MANAGER_ID, 0, mallocator, dpBuffMgrBins);
frameAccumulator.configure(frameDetector, 1, mallocator, 2048);
Fw::FileNameString dpDir("./DpCat");
Fw::FileNameString dpState("./DpCat/DpState.dat");
// create the DP directory if it doesn't exist
Os::FileSystem::createDirectory(dpDir.toChar());
dpCat.configure(&dpDir,1,dpState,0,mallocator);
dpWriter.configure(dpDir);
// ComQueue configuration
// Events (highest-priority)
configurationTable.entries[Ref::Ports_ComPacketQueue::EVENTS].depth = 100;
configurationTable.entries[Ref::Ports_ComPacketQueue::EVENTS].priority = 0;
// Telemetry
configurationTable.entries[Ref::Ports_ComPacketQueue::TELEMETRY].depth = 500;
configurationTable.entries[Ref::Ports_ComPacketQueue::TELEMETRY].priority = 2;
// File Downlink (first entry after the ComPacket queues = NUM_CONSTANTS)
configurationTable.entries[Ref::Ports_ComPacketQueue::NUM_CONSTANTS].depth = 100;
configurationTable.entries[Ref::Ports_ComPacketQueue::NUM_CONSTANTS].priority = 1;
// Allocation identifier is 0 as the MallocAllocator discards it
comQueue.configure(configurationTable, 0, mallocator);
} }
// Public functions for use in main program are namespaced with deployment name Ref // Public functions for use in main program are namespaced with deployment name Ref
@ -146,21 +64,12 @@ void setupTopology(const TopologyState& state) {
regCommands(); regCommands();
// Autocoded configuration. Function provided by autocoder. // Autocoded configuration. Function provided by autocoder.
configComponents(state); configComponents(state);
if (state.hostname != nullptr && state.port != 0) {
comDriver.configure(state.hostname, state.port);
}
// Project-specific component configuration. Function provided above. May be inlined, if desired. // Project-specific component configuration. Function provided above. May be inlined, if desired.
configureTopology(); configureTopology();
// Autocoded parameter loading. Function provided by autocoder. // Autocoded parameter loading. Function provided by autocoder.
loadParameters(); loadParameters();
// Autocoded task kick-off (active components). Function provided by autocoder. // Autocoded task kick-off (active components). Function provided by autocoder.
startTasks(state); startTasks(state);
// Initialize socket client communication if and only if there is a valid specification
if (state.hostname != nullptr && state.port != 0) {
Os::TaskString name("ReceiveTask");
// Uplink is configured for receive so a socket task is started
comDriver.start(name, COMM_PRIORITY, Default::STACK_SIZE);
}
} }
void startRateGroups(Fw::TimeInterval interval) { void startRateGroups(Fw::TimeInterval interval) {
@ -179,14 +88,6 @@ void teardownTopology(const TopologyState& state) {
// Autocoded (active component) task clean-up. Functions provided by topology autocoder. // Autocoded (active component) task clean-up. Functions provided by topology autocoder.
stopTasks(state); stopTasks(state);
freeThreads(state); freeThreads(state);
tearDownComponents(state);
// Other task clean-up.
comDriver.stop();
(void)comDriver.join();
// Resource deallocation
cmdSeq.deallocateBuffer(mallocator);
commsBufferManager.cleanup();
frameAccumulator.cleanup();
} }
} // namespace Ref } // namespace Ref

View File

@ -16,9 +16,24 @@
#include "Ref/Top/FppConstantsAc.hpp" #include "Ref/Top/FppConstantsAc.hpp"
#include "Svc/Health/Health.hpp" #include "Svc/Health/Health.hpp"
// Subtopology PingEntries includes // Subtopology PingEntries includes
#include "Svc/Subtopologies/CDHCore/PingEntries.hpp" #include "Svc/Subtopologies/CdhCore/PingEntries.hpp"
#include "Svc/Subtopologies/ComCcsds/PingEntries.hpp"
#include "Svc/Subtopologies/DataProducts/PingEntries.hpp"
#include "Svc/Subtopologies/FileHandling/PingEntries.hpp"
// SubtopologyTopologyDefs includes
#include "Svc/Subtopologies/ComCcsds/SubtopologyTopologyDefs.hpp"
#include "Svc/Subtopologies/DataProducts/SubtopologyTopologyDefs.hpp"
#include "Svc/Subtopologies/FileHandling/SubtopologyTopologyDefs.hpp"
namespace PingEntries {
namespace Ref_blockDrv {enum { WARN = 3, FATAL = 5 };}
namespace Ref_pingRcvr {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup1Comp {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup2Comp {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup3Comp {enum { WARN = 3, FATAL = 5 };}
} // namespace PingEntries
/** /**
* \brief required ping constants * \brief required ping constants
* *
@ -38,19 +53,6 @@
* } * }
* ``` * ```
*/ */
namespace PingEntries {
namespace Ref_blockDrv {enum { WARN = 3, FATAL = 5 };}
namespace Ref_cmdSeq {enum { WARN = 3, FATAL = 5 };}
namespace Ref_fileDownlink {enum { WARN = 3, FATAL = 5 };}
namespace Ref_fileManager {enum { WARN = 3, FATAL = 5 };}
namespace Ref_fileUplink {enum { WARN = 3, FATAL = 5 };}
namespace Ref_pingRcvr {enum { WARN = 3, FATAL = 5 };}
namespace Ref_prmDb {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup1Comp {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup2Comp {enum { WARN = 3, FATAL = 5 };}
namespace Ref_rateGroup3Comp {enum { WARN = 3, FATAL = 5 };}
namespace Ref_dpCat {enum { WARN = 3, FATAL = 5 };}
} // namespace PingEntries
// Definitions are placed within a namespace named after the deployment // Definitions are placed within a namespace named after the deployment
namespace Ref { namespace Ref {
@ -64,8 +66,7 @@ namespace Ref {
* fields, which are derived by command line inputs. * fields, which are derived by command line inputs.
*/ */
struct TopologyState { struct TopologyState {
const char* hostname; ComCcsds::SubtopologyState comCcsds; //!< Subtopology state for ComCcsds
U16 port;
}; };
namespace PingEntries = ::PingEntries; namespace PingEntries = ::PingEntries;

View File

@ -33,58 +33,12 @@ module Ref {
stack size Default.STACK_SIZE \ stack size Default.STACK_SIZE \
priority 118 priority 118
instance cmdSeq: Svc.CmdSequencer base id 0x0500 \ instance pingRcvr: Ref.PingReceiver base id 0x0A00 \
queue size Default.QUEUE_SIZE \ queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \ stack size Default.STACK_SIZE \
priority 100 priority 100
instance fileDownlink: Svc.FileDownlink base id 0x0600 \ instance typeDemo: Ref.TypeDemo base id 0x1200
queue size 30 \
stack size Default.STACK_SIZE \
priority 100
instance fileManager: Svc.FileManager base id 0x0700 \
queue size 30 \
stack size Default.STACK_SIZE \
priority 100
instance fileUplink: Svc.FileUplink base id 0x0800 \
queue size 30 \
stack size Default.STACK_SIZE \
priority 100
instance pingRcvr: Ref.PingReceiver base id 0x0900 \
queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \
priority 100
instance prmDb: Svc.PrmDb base id 0x0A00 \
queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \
priority 96
instance dpCat: Svc.DpCatalog base id 0x0B00 \
queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \
priority 96
instance dpMgr: Svc.DpManager base id 0x0C00 \
queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \
priority 96
instance dpWriter: Svc.DpWriter base id 0x0D00 \
queue size Default.QUEUE_SIZE \
stack size Default.STACK_SIZE \
priority 96
# ComQueue has a deeper queue to be resilient to spikes in com throughput
instance comQueue: Svc.ComQueue base id 0x0E00 \
queue size 50 \
stack size Default.STACK_SIZE \
priority 100
instance typeDemo: Ref.TypeDemo base id 0x0F00
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Queued component instances # Queued component instances
@ -112,11 +66,6 @@ module Ref {
# Passive component instances # Passive component instances
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@ Communications driver. May be swapped with other comm drivers like UART
instance comDriver: Drv.TcpClient base id 0x4100
instance commsBufferManager: Svc.BufferManager base id 0x4200
instance posixTime: Svc.PosixTime base id 0x4300 instance posixTime: Svc.PosixTime base id 0x4300
instance rateGroupDriverComp: Svc.RateGroupDriver base id 0x4400 instance rateGroupDriverComp: Svc.RateGroupDriver base id 0x4400
@ -125,25 +74,6 @@ module Ref {
instance systemResources: Svc.SystemResources base id 0x4600 instance systemResources: Svc.SystemResources base id 0x4600
instance dpBufferManager: Svc.BufferManager base id 0x4700
instance frameAccumulator: Svc.FrameAccumulator base id 0x4800
instance tcDeframer: Svc.Ccsds.TcDeframer base id 0x4900
instance spacePacketDeframer: Svc.Ccsds.SpacePacketDeframer base id 0x4A00
instance tmFramer: Svc.Ccsds.TmFramer base id 0x4B00
instance spacePacketFramer: Svc.Ccsds.SpacePacketFramer base id 0x4C00
instance fprimeRouter: Svc.FprimeRouter base id 0x4D00
instance apidManager: Svc.Ccsds.ApidManager base id 0x4E00
instance comStub: Svc.ComStub base id 0x4F00
instance linuxTimer: Svc.LinuxTimer base id 0x5000 instance linuxTimer: Svc.LinuxTimer base id 0x5000
} }

View File

@ -10,21 +10,17 @@ module Ref {
rateGroup3 rateGroup3
} }
enum Ports_ComPacketQueue {
EVENTS,
TELEMETRY
}
enum Ports_ComBufferQueue {
FILE_DOWNLINK
}
topology Ref { topology Ref {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Subtopology imports # Subtopology imports
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
import CDHCore.Subtopology import CdhCore.Subtopology
import ComCcsds.Subtopology
import FileHandling.Subtopology
import DataProducts.Subtopology
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Instances used in the topology # Instances used in the topology
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@ -35,53 +31,33 @@ module Ref {
instance SG4 instance SG4
instance SG5 instance SG5
instance blockDrv instance blockDrv
instance cmdSeq
instance comDriver
instance comStub
instance comQueue
instance tcDeframer
instance spacePacketDeframer
instance tmFramer
instance spacePacketFramer
instance fileDownlink
instance fileManager
instance fileUplink
instance commsBufferManager
instance frameAccumulator
instance apidManager
instance posixTime instance posixTime
instance pingRcvr instance pingRcvr
instance prmDb
instance rateGroup1Comp instance rateGroup1Comp
instance rateGroup2Comp instance rateGroup2Comp
instance rateGroup3Comp instance rateGroup3Comp
instance rateGroupDriverComp instance rateGroupDriverComp
instance recvBuffComp instance recvBuffComp
instance fprimeRouter
instance sendBuffComp instance sendBuffComp
instance typeDemo instance typeDemo
instance systemResources instance systemResources
instance dpCat
instance dpMgr
instance dpWriter
instance dpBufferManager
instance linuxTimer instance linuxTimer
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Pattern graph specifiers # Pattern graph specifiers
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
command connections instance CDHCore.cmdDisp command connections instance CdhCore.cmdDisp
event connections instance CDHCore.events event connections instance CdhCore.events
telemetry connections instance CDHCore.tlmSend telemetry connections instance CdhCore.tlmSend
health connections instance CDHCore.$health text event connections instance CdhCore.textLogger
text event connections instance CDHCore.textLogger health connections instance CdhCore.$health
param connections instance prmDb param connections instance FileHandling.prmDb
time connections instance posixTime time connections instance posixTime
@ -95,38 +71,6 @@ module Ref {
# Direct graph specifiers # Direct graph specifiers
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
connections Downlink {
# Data Products
dpCat.fileOut -> fileDownlink.SendFile
fileDownlink.FileComplete -> dpCat.fileDone
# Inputs to ComQueue (events, telemetry, file)
CDHCore.events.PktSend -> comQueue.comPacketQueueIn[Ports_ComPacketQueue.EVENTS]
CDHCore.tlmSend.PktSend -> comQueue.comPacketQueueIn[Ports_ComPacketQueue.TELEMETRY]
fileDownlink.bufferSendOut -> comQueue.bufferQueueIn[Ports_ComBufferQueue.FILE_DOWNLINK]
comQueue.bufferReturnOut[Ports_ComBufferQueue.FILE_DOWNLINK] -> fileDownlink.bufferReturn
# ComQueue <-> SpacePacketFramer
comQueue.dataOut -> spacePacketFramer.dataIn
spacePacketFramer.dataReturnOut -> comQueue.dataReturnIn
# SpacePacketFramer buffer and APID management
spacePacketFramer.bufferAllocate -> commsBufferManager.bufferGetCallee
spacePacketFramer.bufferDeallocate -> commsBufferManager.bufferSendIn
spacePacketFramer.getApidSeqCount -> apidManager.getApidSeqCountIn
# SpacePacketFramer <-> TmFramer
spacePacketFramer.dataOut -> tmFramer.dataIn
tmFramer.dataReturnOut -> spacePacketFramer.dataReturnIn
# Framer <-> ComStub
tmFramer.dataOut -> comStub.dataIn
comStub.dataReturnOut -> tmFramer.dataReturnIn
# ComStub <-> ComDriver
comStub.drvSendOut -> comDriver.$send
comDriver.sendReturnOut -> comStub.drvSendReturnIn
comDriver.ready -> comStub.drvConnected
# ComStatus
comStub.comStatusOut -> tmFramer.comStatusIn
tmFramer.comStatusOut -> spacePacketFramer.comStatusIn
spacePacketFramer.comStatusOut -> comQueue.comStatusIn
}
connections RateGroups { connections RateGroups {
# Linux timer to drive cycle # Linux timer to drive cycle
@ -136,91 +80,72 @@ module Ref {
rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup1] -> rateGroup1Comp.CycleIn rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup1] -> rateGroup1Comp.CycleIn
rateGroup1Comp.RateGroupMemberOut[0] -> SG1.schedIn rateGroup1Comp.RateGroupMemberOut[0] -> SG1.schedIn
rateGroup1Comp.RateGroupMemberOut[1] -> SG2.schedIn rateGroup1Comp.RateGroupMemberOut[1] -> SG2.schedIn
rateGroup1Comp.RateGroupMemberOut[2] -> CDHCore.tlmSend.Run rateGroup1Comp.RateGroupMemberOut[2] -> CdhCore.tlmSend.Run
rateGroup1Comp.RateGroupMemberOut[3] -> fileDownlink.Run rateGroup1Comp.RateGroupMemberOut[3] -> FileHandling.fileDownlink.Run
rateGroup1Comp.RateGroupMemberOut[4] -> systemResources.run rateGroup1Comp.RateGroupMemberOut[4] -> systemResources.run
rateGroup1Comp.RateGroupMemberOut[5] -> comQueue.run rateGroup1Comp.RateGroupMemberOut[5] -> ComCcsds.comQueue.run
# Rate group 2 # Rate group 2
rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup2] -> rateGroup2Comp.CycleIn rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup2] -> rateGroup2Comp.CycleIn
rateGroup2Comp.RateGroupMemberOut[0] -> cmdSeq.schedIn rateGroup2Comp.RateGroupMemberOut[0] -> ComCcsds.cmdSeq.schedIn
rateGroup2Comp.RateGroupMemberOut[1] -> sendBuffComp.SchedIn rateGroup2Comp.RateGroupMemberOut[1] -> sendBuffComp.SchedIn
rateGroup2Comp.RateGroupMemberOut[2] -> SG3.schedIn rateGroup2Comp.RateGroupMemberOut[2] -> SG3.schedIn
rateGroup2Comp.RateGroupMemberOut[3] -> SG4.schedIn rateGroup2Comp.RateGroupMemberOut[3] -> SG4.schedIn
# Rate group 3 # Rate group 3
rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup3] -> rateGroup3Comp.CycleIn rateGroupDriverComp.CycleOut[Ports_RateGroups.rateGroup3] -> rateGroup3Comp.CycleIn
rateGroup3Comp.RateGroupMemberOut[0] -> CDHCore.$health.Run rateGroup3Comp.RateGroupMemberOut[0] -> CdhCore.$health.Run
rateGroup3Comp.RateGroupMemberOut[1] -> SG5.schedIn rateGroup3Comp.RateGroupMemberOut[1] -> SG5.schedIn
rateGroup3Comp.RateGroupMemberOut[2] -> blockDrv.Sched rateGroup3Comp.RateGroupMemberOut[2] -> blockDrv.Sched
rateGroup3Comp.RateGroupMemberOut[3] -> commsBufferManager.schedIn rateGroup3Comp.RateGroupMemberOut[3] -> ComCcsds.commsBufferManager.schedIn
rateGroup3Comp.RateGroupMemberOut[4] -> dpBufferManager.schedIn rateGroup3Comp.RateGroupMemberOut[4] -> DataProducts.dpBufferManager.schedIn
rateGroup3Comp.RateGroupMemberOut[5] -> dpWriter.schedIn rateGroup3Comp.RateGroupMemberOut[5] -> DataProducts.dpWriter.schedIn
rateGroup3Comp.RateGroupMemberOut[6] -> dpMgr.schedIn rateGroup3Comp.RateGroupMemberOut[6] -> DataProducts.dpMgr.schedIn
} }
connections Ref { connections Ref {
sendBuffComp.Data -> blockDrv.BufferIn sendBuffComp.Data -> blockDrv.BufferIn
blockDrv.BufferOut -> recvBuffComp.Data blockDrv.BufferOut -> recvBuffComp.Data
}
connections Sequencer {
cmdSeq.comCmdOut -> CDHCore.cmdDisp.seqCmdBuff
CDHCore.cmdDisp.seqCmdStatus -> cmdSeq.cmdResponseIn
}
connections Uplink {
# ComDriver buffer allocations
comDriver.allocate -> commsBufferManager.bufferGetCallee
comDriver.deallocate -> commsBufferManager.bufferSendIn
# ComDriver <-> ComStub
comDriver.$recv -> comStub.drvReceiveIn
comStub.drvReceiveReturnOut -> comDriver.recvReturnIn
# ComStub <-> FrameAccumulator
comStub.dataOut -> frameAccumulator.dataIn
frameAccumulator.dataReturnOut -> comStub.dataReturnIn
# FrameAccumulator buffer allocations
frameAccumulator.bufferDeallocate -> commsBufferManager.bufferSendIn
frameAccumulator.bufferAllocate -> commsBufferManager.bufferGetCallee
# FrameAccumulator <-> Deframer
frameAccumulator.dataOut -> tcDeframer.dataIn
tcDeframer.dataReturnOut -> frameAccumulator.dataReturnIn
# TcDeframer <-> SpacePacketDeframer
tcDeframer.dataOut -> spacePacketDeframer.dataIn
spacePacketDeframer.dataReturnOut -> tcDeframer.dataReturnIn
# SpacePacketDeframer APID validation
spacePacketDeframer.validateApidSeqCount -> apidManager.validateApidSeqCountIn
# SpacePacketDeframer <-> Router
spacePacketDeframer.dataOut -> fprimeRouter.dataIn
fprimeRouter.dataReturnOut -> spacePacketDeframer.dataReturnIn
# Router buffer allocations
fprimeRouter.bufferAllocate -> commsBufferManager.bufferGetCallee
fprimeRouter.bufferDeallocate -> commsBufferManager.bufferSendIn
# Router <-> CmdDispatcher/FileUplink
fprimeRouter.commandOut -> CDHCore.cmdDisp.seqCmdBuff
CDHCore.cmdDisp.seqCmdStatus -> fprimeRouter.cmdResponseIn
fprimeRouter.fileOut -> fileUplink.bufferSendIn
fileUplink.bufferSendOut -> fprimeRouter.fileBufferReturnIn
}
connections DataProducts {
# DpMgr and DpWriter connections. Have explicit port indexes for demo
dpMgr.bufferGetOut[0] -> dpBufferManager.bufferGetCallee
dpMgr.productSendOut[0] -> dpWriter.bufferSendIn
dpWriter.deallocBufferSendOut -> dpBufferManager.bufferSendIn
# Component DP connections
### Moved this out of DataProducts Subtopology --> anything specific to deployment should live in Ref connections
# Synchronous request. Will have both request kinds for demo purposes, not typical # Synchronous request. Will have both request kinds for demo purposes, not typical
SG1.productGetOut -> dpMgr.productGetIn[0] SG1.productGetOut -> DataProducts.dpMgr.productGetIn
# Asynchronous request # Asynchronous request
SG1.productRequestOut -> dpMgr.productRequestIn[0] SG1.productRequestOut -> DataProducts.dpMgr.productRequestIn
dpMgr.productResponseOut[0] -> SG1.productRecvIn DataProducts.dpMgr.productResponseOut -> SG1.productRecvIn
# Send filled DP # Send filled DP
SG1.productSendOut -> dpMgr.productSendIn[0] SG1.productSendOut -> DataProducts.dpMgr.productSendIn
} }
connections ComCcsds_CdhCore{
# events and telemetry to comQueue
CdhCore.events.PktSend -> ComCcsds.comQueue.comPacketQueueIn[ComCcsds.Ports_ComPacketQueue.EVENTS]
CdhCore.tlmSend.PktSend -> ComCcsds.comQueue.comPacketQueueIn[ComCcsds.Ports_ComPacketQueue.TELEMETRY]
# Router <-> CmdDispatcher
ComCcsds.fprimeRouter.commandOut -> CdhCore.cmdDisp.seqCmdBuff
CdhCore.cmdDisp.seqCmdStatus -> ComCcsds.fprimeRouter.cmdResponseIn
ComCcsds.cmdSeq.comCmdOut -> CdhCore.cmdDisp.seqCmdBuff
CdhCore.cmdDisp.seqCmdStatus -> ComCcsds.cmdSeq.cmdResponseIn
}
connections ComCcsds_FileHandling {
# File Downlink <-> ComQueue
FileHandling.fileDownlink.bufferSendOut -> ComCcsds.comQueue.bufferQueueIn[FileHandling.Ports_ComBufferQueue.FILE_DOWNLINK]
ComCcsds.comQueue.bufferReturnOut[FileHandling.Ports_ComBufferQueue.FILE_DOWNLINK] -> FileHandling.fileDownlink.bufferReturn
# Router <-> FileUplink
ComCcsds.fprimeRouter.fileOut -> FileHandling.fileUplink.bufferSendIn
FileHandling.fileUplink.bufferSendOut -> ComCcsds.fprimeRouter.fileBufferReturnIn
}
connections FileHandling_DataProducts{
# Data Products
DataProducts.dpCat.fileOut -> FileHandling.fileDownlink.SendFile
FileHandling.fileDownlink.FileComplete -> DataProducts.dpCat.fileDone
}
} }
} }

View File

@ -57,7 +57,7 @@ def set_event_filter(fprime_test_api, severity, enabled):
severity = FilterSeverity[severity].name severity = FilterSeverity[severity].name
try: try:
fprime_test_api.send_command( fprime_test_api.send_command(
"CDHCore.events.SET_EVENT_FILTER", "CdhCore.events.SET_EVENT_FILTER",
[severity, enabled], [severity, enabled],
) )
return True return True
@ -80,9 +80,9 @@ def test_send_command(fprime_test_api):
Tests command send, dispatch, and receipt using send_and_assert command with a pair of NO-OP commands. Tests command send, dispatch, and receipt using send_and_assert command with a pair of NO-OP commands.
""" """
fprime_test_api.send_and_assert_command("CDHCore.cmdDisp.CMD_NO_OP", max_delay=0.1) fprime_test_api.send_and_assert_command("CdhCore.cmdDisp.CMD_NO_OP", max_delay=0.1)
assert fprime_test_api.get_command_test_history().size() == 1 assert fprime_test_api.get_command_test_history().size() == 1
fprime_test_api.send_and_assert_command("CDHCore.cmdDisp.CMD_NO_OP", max_delay=0.1) fprime_test_api.send_and_assert_command("CdhCore.cmdDisp.CMD_NO_OP", max_delay=0.1)
assert fprime_test_api.get_command_test_history().size() == 2 assert fprime_test_api.get_command_test_history().size() == 2
@ -94,11 +94,11 @@ def test_send_command_args(fprime_test_api):
for count, value in enumerate(["Test String 1", "Some other string"], 1): for count, value in enumerate(["Test String 1", "Some other string"], 1):
events = [ events = [
fprime_test_api.get_event_pred( fprime_test_api.get_event_pred(
"CDHCore.cmdDisp.NoOpStringReceived", [value] "CdhCore.cmdDisp.NoOpStringReceived", [value]
) )
] ]
fprime_test_api.send_and_assert_command( fprime_test_api.send_and_assert_command(
"CDHCore.cmdDisp.CMD_NO_OP_STRING", "CdhCore.cmdDisp.CMD_NO_OP_STRING",
[ [
value, value,
], ],
@ -117,15 +117,15 @@ def test_send_and_assert_no_op(fprime_test_api):
length = 100 length = 100
failed = 0 failed = 0
evr_seq = [ evr_seq = [
"CDHCore.cmdDisp.OpCodeDispatched", "CdhCore.cmdDisp.OpCodeDispatched",
"CDHCore.cmdDisp.NoOpReceived", "CdhCore.cmdDisp.NoOpReceived",
"CDHCore.cmdDisp.OpCodeCompleted", "CdhCore.cmdDisp.OpCodeCompleted",
] ]
any_reordered = False any_reordered = False
dropped = False dropped = False
for i in range(0, length): for i in range(0, length):
results = fprime_test_api.send_and_await_event( results = fprime_test_api.send_and_await_event(
"CDHCore.cmdDisp.CMD_NO_OP", events=evr_seq, timeout=25 "CdhCore.cmdDisp.CMD_NO_OP", events=evr_seq, timeout=25
) )
msg = "Send and assert NO_OP Trial #{}".format(i) msg = "Send and assert NO_OP Trial #{}".format(i)
if not fprime_test_api.test_assert(len(results) == 3, msg, True): if not fprime_test_api.test_assert(len(results) == 3, msg, True):
@ -232,8 +232,8 @@ def test_active_logger_filter(fprime_test_api):
# Drain time for dispatch events # Drain time for dispatch events
time.sleep(10) time.sleep(10)
fprime_test_api.send_and_assert_command("CDHCore.cmdDisp.CMD_NO_OP") fprime_test_api.send_and_assert_command("CdhCore.cmdDisp.CMD_NO_OP")
fprime_test_api.send_and_assert_command("CDHCore.cmdDisp.CMD_NO_OP") fprime_test_api.send_and_assert_command("CdhCore.cmdDisp.CMD_NO_OP")
time.sleep(0.5) time.sleep(0.5)
@ -244,8 +244,8 @@ def test_active_logger_filter(fprime_test_api):
# Drain time for dispatch events # Drain time for dispatch events
time.sleep(10) time.sleep(10)
fprime_test_api.clear_histories() fprime_test_api.clear_histories()
fprime_test_api.send_command("CDHCore.cmdDisp.CMD_NO_OP") fprime_test_api.send_command("CdhCore.cmdDisp.CMD_NO_OP")
fprime_test_api.send_command("CDHCore.cmdDisp.CMD_NO_OP") fprime_test_api.send_command("CdhCore.cmdDisp.CMD_NO_OP")
time.sleep(0.5) time.sleep(0.5)
@ -285,5 +285,5 @@ def test_seqgen(fprime_test_api):
== 0 == 0
), "Failed to run fprime-seqgen" ), "Failed to run fprime-seqgen"
fprime_test_api.send_and_assert_command( fprime_test_api.send_and_assert_command(
"Ref.cmdSeq.CS_RUN", args=["/tmp/ref_test_int.bin", "BLOCK"], max_delay=5 "ComCcsds.cmdSeq.CS_RUN", args=["/tmp/ref_test_int.bin", "BLOCK"], max_delay=5
) )

View File

@ -1,6 +1,6 @@
; A test sequence ; A test sequence
; ;
R00:00:00 CDHCore.cmdDisp.CMD_NO_OP R00:00:00 CdhCore.cmdDisp.CMD_NO_OP
; Let's try out some commands with arguments ; Let's try out some commands with arguments
R00:00:01.050 CDHCore.cmdDisp.CMD_NO_OP_STRING "Awesome string!"; R00:00:01.050 CdhCore.cmdDisp.CMD_NO_OP_STRING "Awesome string!";

View File

@ -1,56 +0,0 @@
module CDHCoreConfig {
#Base ID for the CDHCore Subtopology, all components are offsets from this base ID
constant BASE_ID = 0x3000
module QueueSizes {
constant cmdDisp = 10
constant events = 10
constant tlmSend = 10
constant $health = 25
}
module StackSizes {
constant cmdDisp = 64 * 1024
constant events = 64 * 1024
constant tlmSend = 64 * 1024
}
module Priorities {
constant cmdDisp = 102
constant $health = 101
constant events = 100
constant tlmSend = 99
}
}
module CDHCore {
instance tlmSend: Svc.TlmChan base id CDHCoreConfig.BASE_ID + 0x0700 \
queue size CDHCoreConfig.QueueSizes.tlmSend \
stack size CDHCoreConfig.StackSizes.tlmSend \
priority CDHCoreConfig.Priorities.tlmSend \
# Uncomment the following block and comment the above block to use TlmPacketizer instead of TlmChan
#instance tlmSend: Svc.TlmPacketizer base id CDHCoreConfig.BASE_ID + 0x0700 \
# queue size CDHCoreConfig.QueueSizes.tlmSend \
# stack size CDHCoreConfig.StackSizes.tlmSend \
# priority CDHCoreConfig.Priorities.tlmSend \
#{
# # NOTE: The Name Ref is specific to the Reference deployment, Ref
# # This name will need to be updated if wishing to use this in a custom deployment
# phase Fpp.ToCpp.Phases.configComponents """
# CDHCore::tlmSend.setPacketList(
# Ref::Ref_RefPacketsTlmPackets::packetList,
# Ref::Ref_RefPacketsTlmPackets::omittedChannels,
# 1
# );
# """
#}
# Update this as a custom fatal handler if needed
instance fatalHandler: Svc.FatalHandler base id CDHCoreConfig.BASE_ID + 0x0800
}

View File

@ -1,5 +0,0 @@
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/CDHCoreConfig.fpp"
INTERFACE
)

View File

@ -1,9 +0,0 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CDHCoreConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/CDHCore.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
INTERFACE
)

View File

@ -1,10 +0,0 @@
#ifndef CDHCORE_PINGENTRIES_HPP
#define CDHCORE_PINGENTRIES_HPP
namespace PingEntries {
struct CDHCore_cmdDisp { enum { WARN=3, FATAL=5 }; };
struct CDHCore_events { enum { WARN=3, FATAL=5 }; };
struct CDHCore_tlmSend { enum { WARN=3, FATAL=5 }; };
}
#endif

View File

@ -1,2 +1,5 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CDHCore/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CdhCore/")
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComCcsds/")
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComFprime/")
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FileHandling/")
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DataProducts/")

View File

@ -0,0 +1,11 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/CdhCoreConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/CdhCore.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
INTERFACE
DEPENDS
Svc_Subtopologies_CdhCore_CdhCoreConfig
)

View File

@ -1,22 +1,22 @@
module CDHCore { module CdhCore {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Active Components # Active Components
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
instance cmdDisp: Svc.CommandDispatcher base id CDHCoreConfig.BASE_ID + 0x0100 \ instance cmdDisp: Svc.CommandDispatcher base id CdhCoreConfig.BASE_ID + 0x0100 \
queue size CDHCoreConfig.QueueSizes.cmdDisp \ queue size CdhCoreConfig.QueueSizes.cmdDisp \
stack size CDHCoreConfig.StackSizes.cmdDisp \ stack size CdhCoreConfig.StackSizes.cmdDisp \
priority CDHCoreConfig.Priorities.cmdDisp priority CdhCoreConfig.Priorities.cmdDisp
instance events: Svc.ActiveLogger base id CDHCoreConfig.BASE_ID + 0x0200 \ instance events: Svc.ActiveLogger base id CdhCoreConfig.BASE_ID + 0x0200 \
queue size CDHCoreConfig.QueueSizes.events \ queue size CdhCoreConfig.QueueSizes.events \
stack size CDHCoreConfig.StackSizes.events \ stack size CdhCoreConfig.StackSizes.events \
priority CDHCoreConfig.Priorities.events priority CdhCoreConfig.Priorities.events
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Queued Components # Queued Components
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
instance $health: Svc.Health base id CDHCoreConfig.BASE_ID + 0x0300 \ instance $health: Svc.Health base id CdhCoreConfig.BASE_ID + 0x0300 \
queue size CDHCoreConfig.QueueSizes.$health \ queue size CdhCoreConfig.QueueSizes.$health \
{ {
phase Fpp.ToCpp.Phases.configConstants """ phase Fpp.ToCpp.Phases.configConstants """
enum { enum {
@ -25,10 +25,10 @@ module CDHCore {
""" """
phase Fpp.ToCpp.Phases.configComponents """ phase Fpp.ToCpp.Phases.configComponents """
// Health is supplied a set of ping entires. // Health is supplied a set of ping entires.
CDHCore::health.setPingEntries( CdhCore::health.setPingEntries(
ConfigObjects::CDHCore_health::pingEntries, ConfigObjects::CdhCore_health::pingEntries,
FW_NUM_ARRAY_ELEMENTS(ConfigObjects::CDHCore_health::pingEntries), FW_NUM_ARRAY_ELEMENTS(ConfigObjects::CdhCore_health::pingEntries),
ConfigConstants::CDHCore_health::HEALTH_WATCHDOG_CODE ConfigConstants::CdhCore_health::HEALTH_WATCHDOG_CODE
); );
""" """
} }
@ -36,17 +36,17 @@ module CDHCore {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Passive Components # Passive Components
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
instance version: Svc.Version base id CDHCoreConfig.BASE_ID + 0x0400 \ instance version: Svc.Version base id CdhCoreConfig.BASE_ID + 0x0400 \
{ {
phase Fpp.ToCpp.Phases.configComponents """ phase Fpp.ToCpp.Phases.configComponents """
// Startup TLM and Config verbosity for Versions // Startup TLM and Config verbosity for Versions
CDHCore::version.config(true); CdhCore::version.config(true);
""" """
} }
instance textLogger: Svc.PassiveTextLogger base id CDHCoreConfig.BASE_ID + 0x0500 instance textLogger: Svc.PassiveTextLogger base id CdhCoreConfig.BASE_ID + 0x0500
instance fatalAdapter: Svc.AssertFatalAdapter base id CDHCoreConfig.BASE_ID + 0x0600 instance fatalAdapter: Svc.AssertFatalAdapter base id CdhCoreConfig.BASE_ID + 0x0600
topology Subtopology { topology Subtopology {
#Active Components #Active Components
@ -68,4 +68,4 @@ module CDHCore {
} }
} # end topology } # end topology
} # end CDHCore Subtopology } # end CdhCore Subtopology

View File

@ -0,0 +1,7 @@
register_fprime_config(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/CdhCoreConfig.fpp"
"${CMAKE_CURRENT_LIST_DIR}/CdhCoreFatalHandlerConfig.fpp"
"${CMAKE_CURRENT_LIST_DIR}/CdhCoreTlmConfig.fpp"
INTERFACE
)

View File

@ -0,0 +1,26 @@
module CdhCoreConfig {
#Base ID for the CdhCore Subtopology, all components are offsets from this base ID
constant BASE_ID = 0x6000
module QueueSizes {
constant cmdDisp = 10
constant events = 10
constant tlmSend = 10
constant $health = 25
}
module StackSizes {
constant cmdDisp = 64 * 1024
constant events = 64 * 1024
constant tlmSend = 64 * 1024
}
module Priorities {
constant cmdDisp = 102
constant $health = 101
constant events = 100
constant tlmSend = 99
}
}

View File

@ -0,0 +1,6 @@
module CdhCore {
# Update this as a custom fatal handler if needed
instance fatalHandler: Svc.FatalHandler base id CdhCoreConfig.BASE_ID + 0x0800
}

View File

@ -0,0 +1,24 @@
module CdhCore{
instance tlmSend: Svc.TlmChan base id CdhCoreConfig.BASE_ID + 0x0700 \
queue size CdhCoreConfig.QueueSizes.tlmSend \
stack size CdhCoreConfig.StackSizes.tlmSend \
priority CdhCoreConfig.Priorities.tlmSend \
# Uncomment the following block and comment the above block to use TlmPacketizer instead of TlmChan
#instance tlmSend: Svc.TlmPacketizer base id CdhCoreConfig.BASE_ID + 0x0700 \
# queue size CdhCoreConfig.QueueSizes.tlmSend \
# stack size CdhCoreConfig.StackSizes.tlmSend \
# priority CdhCoreConfig.Priorities.tlmSend \
#{
# # NOTE: The Name Ref is specific to the Reference deployment, Ref
# # This name will need to be updated if wishing to use this in a custom deployment
# phase Fpp.ToCpp.Phases.configComponents """
# CdhCore::tlmSend.setPacketList(
# Ref::Ref_RefPacketsTlmPackets::packetList,
# Ref::Ref_RefPacketsTlmPackets::omittedChannels,
# 1
# );
# """
#}
}

View File

@ -0,0 +1,10 @@
#ifndef CDHCORE_PINGENTRIES_HPP
#define CDHCORE_PINGENTRIES_HPP
namespace PingEntries {
struct CdhCore_cmdDisp { enum { WARN=3, FATAL=5 }; };
struct CdhCore_events { enum { WARN=3, FATAL=5 }; };
struct CdhCore_tlmSend { enum { WARN=3, FATAL=5 }; };
}
#endif

View File

@ -0,0 +1,12 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComCcsdsConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/ComCcsds.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/SubtopologyTopologyDefs.hpp"
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
DEPENDS
Svc_Subtopologies_ComCcsds_ComCcsdsConfig
INTERFACE
)

View File

@ -0,0 +1,198 @@
module ComCcsds {
# ComPacket Queue enum for queue types
enum Ports_ComPacketQueue {
EVENTS,
TELEMETRY,
FILE_QUEUE
}
# ----------------------------------------------------------------------
# Active Components
# ----------------------------------------------------------------------
instance comQueue: Svc.ComQueue base id ComCcsdsConfig.BASE_ID + 0x0100 \
queue size ComCcsdsConfig.QueueSizes.comQueue \
stack size ComCcsdsConfig.StackSizes.comQueue \
priority ComCcsdsConfig.Priorities.comQueue \
{
phase Fpp.ToCpp.Phases.configConstants """
enum {
EVENTS,
TELEMETRY,
FILE_QUEUE
};
"""
phase Fpp.ToCpp.Phases.configComponents """
Svc::ComQueue::QueueConfigurationTable configurationTable;
// Events (highest-priority)
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::EVENTS].depth = ComCcsdsConfig::QueueDepths::events;
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::EVENTS].priority = ComCcsdsConfig::QueuePriorities::events;
// Telemetry
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::TELEMETRY].depth = ComCcsdsConfig::QueueDepths::tlm;
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::TELEMETRY].priority = ComCcsdsConfig::QueuePriorities::tlm;
// File Downlink Queue
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::FILE_QUEUE].depth = ComCcsdsConfig::QueueDepths::file;
configurationTable.entries[ConfigConstants::ComCcsds_comQueue::FILE_QUEUE].priority = ComCcsdsConfig::QueuePriorities::file;
// Allocation identifier is 0 as the MallocAllocator discards it
ComCcsds::comQueue.configure(configurationTable, 0, ComCcsds::Allocation::memAllocator);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComCcsds::comQueue.cleanup();
"""
}
instance cmdSeq: Svc.CmdSequencer base id ComCcsdsConfig.BASE_ID + 0x0200 \
queue size ComCcsdsConfig.QueueSizes.cmdSeq \
stack size ComCcsdsConfig.StackSizes.cmdSeq \
priority ComCcsdsConfig.Priorities.cmdSeq \
{
phase Fpp.ToCpp.Phases.configComponents """
ComCcsds::cmdSeq.allocateBuffer(0, ComCcsds::Allocation::memAllocator, ComCcsdsConfig::BuffMgr::cmdSeqBuffSize);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComCcsds::cmdSeq.deallocateBuffer(ComCcsds::Allocation::memAllocator);
"""
}
# ----------------------------------------------------------------------
# Passive Components
# ----------------------------------------------------------------------
instance frameAccumulator: Svc.FrameAccumulator base id ComCcsdsConfig.BASE_ID + 0x0500 \
{
phase Fpp.ToCpp.Phases.configObjects """
Svc::FrameDetectors::CcsdsTcFrameDetector frameDetector;
"""
phase Fpp.ToCpp.Phases.configComponents """
ComCcsds::frameAccumulator.configure(
ConfigObjects::ComCcsds_frameAccumulator::frameDetector,
1,
ComCcsds::Allocation::memAllocator,
ComCcsdsConfig::BuffMgr::frameAccumulatorSize
);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComCcsds::frameAccumulator.cleanup();
"""
}
instance commsBufferManager: Svc.BufferManager base id ComCcsdsConfig.BASE_ID + 0x0600 \
{
phase Fpp.ToCpp.Phases.configObjects """
Svc::BufferManager::BufferBins bins;
"""
phase Fpp.ToCpp.Phases.configComponents """
memset(&ConfigObjects::ComCcsds_commsBufferManager::bins, 0, sizeof(ConfigObjects::ComCcsds_commsBufferManager::bins));
ConfigObjects::ComCcsds_commsBufferManager::bins.bins[0].bufferSize = ComCcsdsConfig::BuffMgr::commsBuffSize;
ConfigObjects::ComCcsds_commsBufferManager::bins.bins[0].numBuffers = ComCcsdsConfig::BuffMgr::commsBuffCount;
ConfigObjects::ComCcsds_commsBufferManager::bins.bins[1].bufferSize = ComCcsdsConfig::BuffMgr::commsFileBuffSize;
ConfigObjects::ComCcsds_commsBufferManager::bins.bins[1].numBuffers = ComCcsdsConfig::BuffMgr::commsFileBuffCount;
ComCcsds::commsBufferManager.setup(
ComCcsdsConfig::BuffMgr::commsBuffMgrId,
0,
ComCcsds::Allocation::memAllocator,
ConfigObjects::ComCcsds_commsBufferManager::bins
);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComCcsds::commsBufferManager.cleanup();
"""
}
instance fprimeRouter: Svc.FprimeRouter base id ComCcsdsConfig.BASE_ID + 0x0700 \
instance comStub: Svc.ComStub base id ComCcsdsConfig.BASE_ID + 0x0800 \
instance tcDeframer: Svc.Ccsds.TcDeframer base id ComCcsdsConfig.BASE_ID + 0x0900 \
instance spacePacketDeframer: Svc.Ccsds.SpacePacketDeframer base id ComCcsdsConfig.BASE_ID + 0x0A00 \
instance tmFramer: Svc.Ccsds.TmFramer base id ComCcsdsConfig.BASE_ID + 0x0B00 \
instance spacePacketFramer: Svc.Ccsds.SpacePacketFramer base id ComCcsdsConfig.BASE_ID + 0x0C00 \
instance apidManager: Svc.Ccsds.ApidManager base id ComCcsdsConfig.BASE_ID + 0x0D00 \
topology Subtopology {
# Active Components
instance comQueue
instance cmdSeq
# Passive Components
instance commsBufferManager
instance frameAccumulator
instance fprimeRouter
instance comStub
instance comDriver
instance tcDeframer
instance spacePacketDeframer
instance tmFramer
instance spacePacketFramer
instance apidManager
connections Downlink {
# ComQueue <-> SpacePacketFramer
comQueue.dataOut -> spacePacketFramer.dataIn
spacePacketFramer.dataReturnOut -> comQueue.dataReturnIn
# SpacePacketFramer buffer and APID management
spacePacketFramer.bufferAllocate -> commsBufferManager.bufferGetCallee
spacePacketFramer.bufferDeallocate -> commsBufferManager.bufferSendIn
spacePacketFramer.getApidSeqCount -> apidManager.getApidSeqCountIn
# SpacePacketFramer <-> TmFramer
spacePacketFramer.dataOut -> tmFramer.dataIn
tmFramer.dataReturnOut -> spacePacketFramer.dataReturnIn
# Framer <-> ComStub
tmFramer.dataOut -> comStub.dataIn
comStub.dataReturnOut -> tmFramer.dataReturnIn
# ComStub <-> ComDriver
comStub.drvSendOut -> comDriver.$send
comDriver.sendReturnOut -> comStub.drvSendReturnIn
comDriver.ready -> comStub.drvConnected
# ComStatus
comStub.comStatusOut -> tmFramer.comStatusIn
tmFramer.comStatusOut -> spacePacketFramer.comStatusIn
spacePacketFramer.comStatusOut -> comQueue.comStatusIn
}
connections Uplink {
# ComDriver buffer allocations
comDriver.allocate -> commsBufferManager.bufferGetCallee
comDriver.deallocate -> commsBufferManager.bufferSendIn
# ComDriver <-> ComStub
comDriver.$recv -> comStub.drvReceiveIn
comStub.drvReceiveReturnOut -> comDriver.recvReturnIn
# ComStub <-> FrameAccumulator
comStub.dataOut -> frameAccumulator.dataIn
frameAccumulator.dataReturnOut -> comStub.dataReturnIn
# FrameAccumulator buffer allocations
frameAccumulator.bufferDeallocate -> commsBufferManager.bufferSendIn
frameAccumulator.bufferAllocate -> commsBufferManager.bufferGetCallee
# FrameAccumulator <-> Deframer
frameAccumulator.dataOut -> tcDeframer.dataIn
tcDeframer.dataReturnOut -> frameAccumulator.dataReturnIn
# TcDeframer <-> SpacePacketDeframer
tcDeframer.dataOut -> spacePacketDeframer.dataIn
spacePacketDeframer.dataReturnOut -> tcDeframer.dataReturnIn
# SpacePacketDeframer APID validation
spacePacketDeframer.validateApidSeqCount -> apidManager.validateApidSeqCountIn
# SpacePacketDeframer <-> Router
spacePacketDeframer.dataOut -> fprimeRouter.dataIn
fprimeRouter.dataReturnOut -> spacePacketDeframer.dataReturnIn
# Router buffer allocations
fprimeRouter.bufferAllocate -> commsBufferManager.bufferGetCallee
fprimeRouter.bufferDeallocate -> commsBufferManager.bufferSendIn
}
} # end topology
} # end ComCcsds Subtopology

View File

@ -0,0 +1,11 @@
register_fprime_config(
SOURCES
"${CMAKE_CURRENT_LIST_DIR}/ComCcsdsSubtopologyConfig.cpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/ComCcsdsSubtopologyConfig.hpp"
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/ComCcsdsConfig.fpp"
"${CMAKE_CURRENT_LIST_DIR}/ComCcsdsComDriverConfig.fpp"
DEPENDS
Fw_Types
)

View File

@ -0,0 +1,28 @@
module ComCcsds {
# Communications driver. May be swapped out with other comm drivers like UART in this file
# to use another driver in the Comms Subtopology
instance comDriver: Drv.TcpClient base id ComCcsdsConfig.BASE_ID + 0x0B00 \
{
phase Fpp.ToCpp.Phases.configComponents """
if (state.comCcsds.hostname != nullptr && state.comCcsds.port != 0) {
ComCcsds::comDriver.configure(state.comCcsds.hostname, state.comCcsds.port);
}
"""
phase Fpp.ToCpp.Phases.startTasks """
// Initialize socket client communication if and only if there is a valid specification
if (state.comCcsds.hostname != nullptr && state.comCcsds.port != 0) {
Os::TaskString name("ReceiveTask");
ComCcsds::comDriver.start(name, ComCcsdsConfig::Priorities::comDriver, ComCcsdsConfig::StackSizes::comDriver);
}
"""
phase Fpp.ToCpp.Phases.stopTasks """
ComCcsds::comDriver.stop();
"""
phase Fpp.ToCpp.Phases.freeThreads """
(void)ComCcsds::comDriver.join();
"""
}
}

View File

@ -0,0 +1,45 @@
module ComCcsdsConfig {
#Base ID for the ComCcsds Subtopology, all components are offsets from this base ID
constant BASE_ID = 0x8000
module QueueSizes {
constant comQueue = 10
constant cmdSeq = 10
}
module StackSizes {
constant comQueue = 64 * 1024
constant cmdSeq = 64 * 1024
constant comDriver = 100
}
module Priorities {
constant comQueue = 101
constant cmdSeq = 100
constant comDriver = 100
}
# Queue configuration constants
module QueueDepths {
constant events = 100
constant tlm = 500
constant file = 100
}
module QueuePriorities {
constant events = 0
constant tlm = 2
constant file = 1
}
# Buffer management constants
module BuffMgr {
constant cmdSeqBuffSize = 5 * 1024
constant frameAccumulatorSize = 2048
constant commsBuffSize = 2048
constant commsFileBuffSize = 3000
constant commsBuffCount = 20
constant commsFileBuffCount = 30
constant commsBuffMgrId = 200
}
}

View File

@ -0,0 +1,9 @@
#include "ComCcsdsSubtopologyConfig.hpp"
namespace ComCcsds{
namespace Allocation{
//This instance can be changed to use a different allocator in the ComCcsds Subtopology
Fw::MallocAllocator mallocatorInstance;
Fw::MemAllocator& memAllocator = mallocatorInstance;
}
}

View File

@ -0,0 +1,12 @@
#ifndef COMCCSDSSUBTOPOLOGY_CONFIG_HPP
#define COMCCSDSSUBTOPOLOGY_CONFIG_HPP
#include "Fw/Types/MallocAllocator.hpp"
namespace ComCcsds {
namespace Allocation {
extern Fw::MemAllocator& memAllocator;
}
}
#endif

View File

@ -0,0 +1,9 @@
#ifndef COMCCSDS_PINGENTRIES_HPP
#define COMCCSDS_PINGENTRIES_HPP
namespace PingEntries {
namespace ComCcsds_cmdSeq {enum { WARN = 3, FATAL = 5 };}
}
#endif

View File

@ -0,0 +1,21 @@
#ifndef COMCCSDSSUBTOPOLOGY_DEFS_HPP
#define COMCCSDSSUBTOPOLOGY_DEFS_HPP
#include <Svc/FrameAccumulator/FrameDetector/CcsdsTcFrameDetector.hpp>
#include <Fw/Types/MallocAllocator.hpp>
#include <Svc/BufferManager/BufferManager.hpp>
#include "Svc/Subtopologies/ComCcsds/ComCcsdsConfig/FppConstantsAc.hpp"
#include "ComCcsdsConfig/ComCcsdsSubtopologyConfig.hpp"
namespace ComCcsds {
struct SubtopologyState {
const char* hostname;
U16 port;
};
struct TopologyState {
SubtopologyState comCcsds;
};
}
#endif

View File

@ -0,0 +1,12 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/ComFprimeConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/ComFprime.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/SubtopologyTopologyDefs.hpp"
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
DEPENDS
Svc_Subtopologies_ComFprime_ComFprimeConfig
INTERFACE
)

View File

@ -0,0 +1,164 @@
module ComFprime {
enum Ports_ComPacketQueue {
EVENTS,
TELEMETRY,
FILE_QUEUE
};
# ----------------------------------------------------------------------
# Active Components
# ----------------------------------------------------------------------
instance comQueue: Svc.ComQueue base id ComFprimeConfig.BASE_ID + 0x0100 \
queue size ComFprimeConfig.QueueSizes.comQueue \
stack size ComFprimeConfig.StackSizes.comQueue \
priority ComFprimeConfig.Priorities.comQueue \
{
phase Fpp.ToCpp.Phases.configConstants """
enum{
EVENTS,
TELEMETRY,
FILE_QUEUE
};
"""
phase Fpp.ToCpp.Phases.configComponents """
Svc::ComQueue::QueueConfigurationTable configurationTable;
// Events (highest-priority)
configurationTable.entries[ConfigConstants::ComFprime_comQueue::EVENTS].depth = ComFprimeConfig::QueueDepths::events;
configurationTable.entries[ConfigConstants::ComFprime_comQueue::EVENTS].priority = ComFprimeConfig::QueuePriorities::events;
// Telemetry
configurationTable.entries[ConfigConstants::ComFprime_comQueue::TELEMETRY].depth = ComFprimeConfig::QueueDepths::tlm;
configurationTable.entries[ConfigConstants::ComFprime_comQueue::TELEMETRY].priority = ComFprimeConfig::QueuePriorities::tlm;
// File Downlink Queue
configurationTable.entries[ConfigConstants::ComFprime_comQueue::FILE_QUEUE].depth = ComFprimeConfig::QueueDepths::file;
configurationTable.entries[ConfigConstants::ComFprime_comQueue::FILE_QUEUE].priority = ComFprimeConfig::QueuePriorities::file;
// Allocation identifier is 0 as the MallocAllocator discards it
ComFprime::comQueue.configure(configurationTable, 0, ComFprime::Allocation::memAllocator);
"""
}
instance cmdSeq: Svc.CmdSequencer base id ComFprimeConfig.BASE_ID + 0x0200 \
queue size ComFprimeConfig.QueueSizes.cmdSeq \
stack size ComFprimeConfig.StackSizes.cmdSeq \
priority ComFprimeConfig.Priorities.cmdSeq \
{
phase Fpp.ToCpp.Phases.configComponents """
ComFprime::cmdSeq.allocateBuffer(0, ComFprime::Allocation::memAllocator, ComFprimeConfig::BuffMgr::cmdSeqBuffSize);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComFprime::cmdSeq.deallocateBuffer(ComFprime::Allocation::memAllocator);
"""
}
# ----------------------------------------------------------------------
# Passive Components
# ----------------------------------------------------------------------
instance frameAccumulator: Svc.FrameAccumulator base id ComFprimeConfig.BASE_ID + 0x0500 \
{
phase Fpp.ToCpp.Phases.configComponents """
ComFprime::frameAccumulator.configure(
ComFprime::Detector::frameDetector,
1,
ComFprime::Allocation::memAllocator,
ComFprimeConfig::BuffMgr::frameAccumulatorSize
);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComFprime::frameAccumulator.cleanup();
"""
}
instance commsBufferManager: Svc.BufferManager base id ComFprimeConfig.BASE_ID + 0x0600 \
{
phase Fpp.ToCpp.Phases.configComponents """
memset(&ComFprime::BufferManagerBins::bins, 0, sizeof(ComFprime::BufferManagerBins::bins));
ComFprime::BufferManagerBins::bins.bins[0].bufferSize = ComFprimeConfig::BuffMgr::commsBuffSize;
ComFprime::BufferManagerBins::bins.bins[0].numBuffers = ComFprimeConfig::BuffMgr::commsBuffCount;
ComFprime::BufferManagerBins::bins.bins[1].bufferSize = ComFprimeConfig::BuffMgr::commsFileBuffSize;
ComFprime::BufferManagerBins::bins.bins[1].numBuffers = ComFprimeConfig::BuffMgr::commsFileBuffCount;
ComFprime::commsBufferManager.setup(
ComFprimeConfig::BuffMgr::commsBuffMgrId,
0,
ComFprime::Allocation::memAllocator,
ComFprime::BufferManagerBins::bins
);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
ComFprime::commsBufferManager.cleanup();
"""
}
instance deframer: Svc.FprimeDeframer base id ComFprimeConfig.BASE_ID + 0x0700 \
instance fprimeFramer: Svc.FprimeFramer base id ComFprimeConfig.BASE_ID + 0x0800 \
instance fprimeRouter: Svc.FprimeRouter base id ComFprimeConfig.BASE_ID + 0x0900 \
instance comStub: Svc.ComStub base id ComFprimeConfig.BASE_ID + 0x0A00 \
topology Subtopology {
# Active Components
instance comQueue
instance cmdSeq
# Passive Components
instance commsBufferManager
instance frameAccumulator
instance deframer
instance fprimeFramer
instance fprimeRouter
instance comStub
instance comDriver
connections Downlink {
# Inputs to ComQueue (events, telemetry)
# ComQueue <-> Framer
comQueue.dataOut -> fprimeFramer.dataIn
fprimeFramer.dataReturnOut -> comQueue.dataReturnIn
# Buffer Management for Framer
fprimeFramer.bufferAllocate -> commsBufferManager.bufferGetCallee
fprimeFramer.bufferDeallocate -> commsBufferManager.bufferSendIn
# Framer <-> ComStub
fprimeFramer.dataOut -> comStub.dataIn
comStub.dataReturnOut -> fprimeFramer.dataReturnIn
# ComStub <-> ComDriver
comStub.drvSendOut -> comDriver.$send
comDriver.sendReturnOut -> comStub.drvSendReturnIn
comDriver.ready -> comStub.drvConnected
# ComStatus
comStub.comStatusOut -> fprimeFramer.comStatusIn
fprimeFramer.comStatusOut -> comQueue.comStatusIn
}
connections Uplink {
# ComDriver buffer allocations
comDriver.allocate -> commsBufferManager.bufferGetCallee
comDriver.deallocate -> commsBufferManager.bufferSendIn
# ComDriver <-> ComStub
comDriver.$recv -> comStub.drvReceiveIn
comStub.drvReceiveReturnOut -> comDriver.recvReturnIn
# ComStub <-> FrameAccumulator
comStub.dataOut -> frameAccumulator.dataIn
frameAccumulator.dataReturnOut -> comStub.dataReturnIn
# FrameAccumulator buffer allocations
frameAccumulator.bufferDeallocate -> commsBufferManager.bufferSendIn
frameAccumulator.bufferAllocate -> commsBufferManager.bufferGetCallee
# FrameAccumulator <-> Deframer
frameAccumulator.dataOut -> deframer.dataIn
deframer.dataReturnOut -> frameAccumulator.dataReturnIn
# Deframer <-> Router
deframer.dataOut -> fprimeRouter.dataIn
fprimeRouter.dataReturnOut -> deframer.dataReturnIn
# Router buffer allocations
fprimeRouter.bufferAllocate -> commsBufferManager.bufferGetCallee
fprimeRouter.bufferDeallocate -> commsBufferManager.bufferSendIn
}
} # end topology
} # end ComFprime Subtopology

View File

@ -0,0 +1,9 @@
register_fprime_config(
SOURCES
"${CMAKE_CURRENT_LIST_DIR}/ComFprimeSubtopologyConfig.cpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/ComFprimeSubtopologyConfig.hpp"
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/ComFprimeConfig.fpp"
"${CMAKE_CURRENT_LIST_DIR}/ComFprimeComDriverConfig.fpp"
)

View File

@ -0,0 +1,28 @@
module ComFprime {
# Communications driver. May be swapped out with other comm drivers like UART in this file
# to use another driver in the Comms Subtopology
instance comDriver: Drv.TcpClient base id ComFprimeConfig.BASE_ID + 0x0B00 \
{
phase Fpp.ToCpp.Phases.configComponents """
if (state.hostname != nullptr && state.port != 0) {
ComFprime::comDriver.configure(state.hostname, state.port);
}
"""
phase Fpp.ToCpp.Phases.startTasks """
// Initialize socket client communication if and only if there is a valid specification
if (state.hostname != nullptr && state.port != 0) {
Os::TaskString name("ReceiveTask");
ComFprime::comDriver.start(name, ComFprimeConfig::Priorities::comDriver, ComFprimeConfig::StackSizes::comDriver);
}
"""
phase Fpp.ToCpp.Phases.stopTasks """
ComFprime::comDriver.stop();
"""
phase Fpp.ToCpp.Phases.freeThreads """
(void)ComFprime::comDriver.join();
"""
}
}

View File

@ -0,0 +1,45 @@
module ComFprimeConfig {
#Base ID for the ComFprime Subtopology, all components are offsets from this base ID
constant BASE_ID = 0x7000
module QueueSizes {
constant comQueue = 10
constant cmdSeq = 10
}
module StackSizes {
constant comQueue = 64 * 1024
constant cmdSeq = 64 * 1024
constant comDriver = 100
}
module Priorities {
constant comQueue = 101
constant cmdSeq = 100
constant comDriver = 100
}
# Queue configuration constants
module QueueDepths {
constant events = 100
constant tlm = 500
constant file = 100
}
module QueuePriorities {
constant events = 0
constant tlm = 2
constant file = 1
}
# Buffer management constants
module BuffMgr {
constant cmdSeqBuffSize = 5 * 1024
constant frameAccumulatorSize = 2048
constant commsBuffSize = 2048
constant commsFileBuffSize = 3000
constant commsBuffCount = 20
constant commsFileBuffCount = 30
constant commsBuffMgrId = 200
}
}

View File

@ -0,0 +1,9 @@
#include "ComFprimeSubtopologyConfig.hpp"
namespace ComFprime {
namespace Allocation{
//This instance can be changed to use a different allocator in the ComFprime Subtopology
Fw::MallocAllocator mallocatorInstance;
Fw::MemAllocator& memAllocator = mallocatorInstance;
}
}

View File

@ -0,0 +1,12 @@
#ifndef COMFPRIMESUBTOPOLOGY_CONFIG_HPP
#define COMFPRIMESUBTOPOLOGY_CONFIG_HPP
#include "Fw/Types/MallocAllocator.hpp"
namespace ComFprime {
namespace Allocation {
extern Fw::MemAllocator& memAllocator;
}
}
#endif

View File

@ -0,0 +1,8 @@
#ifndef COMFPRIME_PINGENTRIES_HPP
#define COMFPRIME_PINGENTRIES_HPP
namespace PingEntries {
namespace ComFprime_cmdSeq {enum { WARN = 3, FATAL = 5 };}
}
#endif

View File

@ -0,0 +1,20 @@
#ifndef COMFPRIMESUBTOPOLOGY_DEFS_HPP
#define COMFPRIMESUBTOPOLOGY_DEFS_HPP
#include <Svc/FrameAccumulator/FrameDetector/FprimeFrameDetector.hpp>
#include <Fw/Types/MallocAllocator.hpp>
#include <Svc/BufferManager/BufferManager.hpp>
#include "Svc/Subtopologies/ComFprime/ComFprimeConfig/FppConstantsAc.hpp"
#include "ComFprimeConfig/ComFprimeSubtopologyConfig.hpp"
namespace ComFprime {
struct SubtopologyState {
const char* hostname;
U16 port;
};
struct TopologyState {
SubtopologyState comFprime;
};
}
#endif

View File

@ -0,0 +1,12 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/DataProductsConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/DataProducts.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/SubtopologyTopologyDefs.hpp"
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
DEPENDS
Svc_Subtopologies_DataProducts_DataProductsConfig
INTERFACE
)

View File

@ -0,0 +1,76 @@
module DataProducts{
# ----------------------------------------------------------------------
# Active Components
# ----------------------------------------------------------------------
instance dpCat: Svc.DpCatalog base id DataProductsConfig.BASE_ID + 0x0100 \
queue size DataProductsConfig.QueueSizes.dpCat \
stack size DataProductsConfig.StackSizes.dpCat \
priority DataProductsConfig.Priorities.dpCat \
{
phase Fpp.ToCpp.Phases.configComponents """
Fw::FileNameString dpDir(DataProductsConfig::Paths::dpDir);
Fw::FileNameString dpState(DataProductsConfig::Paths::dpState);
Os::FileSystem::createDirectory(dpDir.toChar());
DataProducts::dpCat.configure(&dpDir,1,dpState,0, DataProducts::Allocation::memAllocator);
"""
}
instance dpMgr: Svc.DpManager base id DataProductsConfig.BASE_ID + 0x0200 \
queue size DataProductsConfig.QueueSizes.dpMgr \
stack size DataProductsConfig.StackSizes.dpMgr \
priority DataProductsConfig.Priorities.dpMgr
instance dpWriter: Svc.DpWriter base id DataProductsConfig.BASE_ID + 0x0300 \
queue size DataProductsConfig.QueueSizes.dpWriter \
stack size DataProductsConfig.StackSizes.dpWriter \
priority DataProductsConfig.Priorities.dpWriter \
{
phase Fpp.ToCpp.Phases.configComponents """
DataProducts::dpWriter.configure(dpDir);
"""
}
# ----------------------------------------------------------------------
# Passive Components
# ----------------------------------------------------------------------
instance dpBufferManager: Svc.BufferManager base id DataProductsConfig.BASE_ID + 0x0400 \
{
phase Fpp.ToCpp.Phases.configObjects """
Svc::BufferManager::BufferBins bins;
"""
phase Fpp.ToCpp.Phases.configComponents """
memset(&ConfigObjects::DataProducts_dpBufferManager::bins, 0, sizeof(ConfigObjects::DataProducts_dpBufferManager::bins));
ConfigObjects::DataProducts_dpBufferManager::bins.bins[0].bufferSize = DataProductsConfig::BuffMgr::dpBufferStoreSize;
ConfigObjects::DataProducts_dpBufferManager::bins.bins[0].numBuffers = DataProductsConfig::BuffMgr::dpBufferStoreCount;
DataProducts::dpBufferManager.setup(
DataProductsConfig::BuffMgr::dpBufferManagerId,
0,
DataProducts::Allocation::memAllocator,
ConfigObjects::DataProducts_dpBufferManager::bins
);
"""
phase Fpp.ToCpp.Phases.tearDownComponents """
DataProducts::dpCat.shutdown();
DataProducts::dpBufferManager.cleanup();
"""
}
topology Subtopology {
#Active Components
instance dpCat
instance dpMgr
instance dpWriter
#Passive Components
instance dpBufferManager
connections DataProducts {
# DpMgr and DpWriter connections. Have explicit port indexes for demo
dpMgr.bufferGetOut[0] -> dpBufferManager.bufferGetCallee
dpMgr.productSendOut[0] -> dpWriter.bufferSendIn
dpWriter.deallocBufferSendOut -> dpBufferManager.bufferSendIn
}
} # end topology
} # end DataProducts Subtopology

View File

@ -0,0 +1,10 @@
register_fprime_config(
SOURCES
"${CMAKE_CURRENT_LIST_DIR}/DataProductsSubtopologyConfig.cpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/DataProductsSubtopologyConfig.hpp"
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/DataProductsConfig.fpp"
DEPENDS
Fw_Types
)

View File

@ -0,0 +1,39 @@
module DataProductsConfig {
#Base ID for the DataProducts Subtopology, all components are offsets from this base ID
constant BASE_ID = 0x9000
module QueueSizes {
constant dpCat = 10
constant dpMgr = 10
constant dpWriter = 10
constant dpBufferManager = 10
}
module StackSizes {
constant dpCat = 64 * 1024
constant dpMgr = 64 * 1024
constant dpWriter = 64 * 1024
constant dpBufferManager = 64 * 1024
}
module Priorities {
constant dpCat = 101
constant dpMgr = 100
constant dpWriter = 99
constant dpBufferManager = 98
}
# Buffer management constants
module BuffMgr {
constant dpBufferStoreSize = 10000
constant dpBufferStoreCount = 10
constant dpBufferManagerId = 300
}
# Directory and file paths
module Paths {
constant dpDir = "./DpCat"
constant dpState = "./DpCat/DpState.dat"
}
}

View File

@ -0,0 +1,9 @@
#include "DataProductsSubtopologyConfig.hpp"
namespace DataProducts {
namespace Allocation{
//This instance can be changed to use a different allocator in the DataProducts Subtopology
Fw::MallocAllocator mallocatorInstance;
Fw::MemAllocator& memAllocator = mallocatorInstance;
}
}

View File

@ -0,0 +1,12 @@
#ifndef DATAPRODUCTSSUBTOPOLOGY_CONFIG_HPP
#define DATAPRODUCTSSUBTOPOLOGY_CONFIG_HPP
#include "Fw/Types/MallocAllocator.hpp"
namespace DataProducts {
namespace Allocation {
extern Fw::MemAllocator& memAllocator;
}
}
#endif

View File

@ -0,0 +1,8 @@
#ifndef DATAPRODUCTS_PINGENTRIES_HPP
#define DATAPRODUCTS_PINGENTRIES_HPP
namespace PingEntries {
namespace DataProducts_dpCat {enum { WARN = 3, FATAL = 5 };}
}
#endif

View File

@ -0,0 +1,16 @@
#ifndef DATAPRODUCTSSUBTOPOLOGY_DEFS_HPP
#define DATAPRODUCTSSUBTOPOLOGY_DEFS_HPP
#include <Fw/Types/MallocAllocator.hpp>
#include <Svc/BufferManager/BufferManager.hpp>
#include <Os/FileSystem.hpp>
#include "Svc/Subtopologies/DataProducts/DataProductsConfig/FppConstantsAc.hpp"
#include "DataProductsConfig/DataProductsSubtopologyConfig.hpp"
namespace DataProducts {
// State for topology construction
struct TopologyState {
};
}
#endif

View File

@ -0,0 +1,12 @@
add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/FileHandlingConfig/")
register_fprime_module(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/FileHandling.fpp"
HEADERS
"${CMAKE_CURRENT_LIST_DIR}/SubtopologyTopologyDefs.hpp"
"${CMAKE_CURRENT_LIST_DIR}/PingEntries.hpp"
INTERFACE
DEPENDS
Svc_Subtopologies_FileHandling_FileHandlingConfig
)

View File

@ -0,0 +1,56 @@
module FileHandling {
enum Ports_ComBufferQueue {
FILE_DOWNLINK
}
# ----------------------------------------------------------------------
# Active Components
# ----------------------------------------------------------------------
instance fileUplink: Svc.FileUplink base id FileHandlingConfig.BASE_ID + 0x0100 \
queue size FileHandlingConfig.QueueSizes.fileUplink \
stack size FileHandlingConfig.StackSizes.fileUplink \
priority FileHandlingConfig.Priorities.fileUplink
instance fileDownlink: Svc.FileDownlink base id FileHandlingConfig.BASE_ID + 0x0200 \
queue size FileHandlingConfig.QueueSizes.fileDownlink \
stack size FileHandlingConfig.StackSizes.fileDownlink \
priority FileHandlingConfig.Priorities.fileDownlink \
{
phase Fpp.ToCpp.Phases.configComponents """
FileHandling::fileDownlink.configure(
FileHandlingConfig::DownlinkConfig::timeout,
FileHandlingConfig::DownlinkConfig::cooldown,
FileHandlingConfig::DownlinkConfig::cycleTime,
FileHandlingConfig::DownlinkConfig::fileQueueDepth
);
"""
}
instance fileManager: Svc.FileManager base id FileHandlingConfig.BASE_ID + 0x0300 \
queue size FileHandlingConfig.QueueSizes.fileManager \
stack size FileHandlingConfig.StackSizes.fileManager \
priority FileHandlingConfig.Priorities.fileManager
instance prmDb: Svc.PrmDb base id FileHandlingConfig.BASE_ID + 0x0400 \
queue size FileHandlingConfig.QueueSizes.prmDb \
stack size FileHandlingConfig.StackSizes.prmDb \
priority FileHandlingConfig.Priorities.prmDb \
{
phase Fpp.ToCpp.Phases.configComponents """
FileHandling::prmDb.configure("PrmDb.dat");
"""
phase Fpp.ToCpp.Phases.readParameters """
FileHandling::prmDb.readParamFile();
"""
}
topology Subtopology {
#Active Components
instance fileUplink
instance fileDownlink
instance fileManager
instance prmDb
} # end topology
} # end FileHandling Subtopology

View File

@ -0,0 +1,5 @@
register_fprime_config(
AUTOCODER_INPUTS
"${CMAKE_CURRENT_LIST_DIR}/FileHandlingConfig.fpp"
INTERFACE
)

View File

@ -0,0 +1,33 @@
module FileHandlingConfig {
#Base ID for the FileHandling Subtopology, all components are offsets from this base ID
constant BASE_ID = 0xA000
module QueueSizes {
constant fileUplink = 10
constant fileDownlink = 10
constant fileManager = 10
constant prmDb = 10
}
module StackSizes {
constant fileUplink = 64 * 1024
constant fileDownlink = 64 * 1024
constant fileManager = 64 * 1024
constant prmDb = 64 * 1024
}
module Priorities {
constant fileUplink = 101
constant fileDownlink = 100
constant fileManager = 99
constant prmDb = 98
}
# File downlink configuration constants
module DownlinkConfig {
constant timeout = 1000 # File downlink timeout in ms
constant cooldown = 1000 # File downlink cooldown in ms
constant cycleTime = 1000 # File downlink cycle time in ms
constant fileQueueDepth = 10 # File downlink queue depth
}
}

View File

@ -0,0 +1,11 @@
#ifndef FILEHANDLING_PINGENTRIES_HPP
#define FILEHANDLING_PINGENTRIES_HPP
namespace PingEntries {
namespace FileHandling_fileDownlink {enum { WARN = 3, FATAL = 5 };}
namespace FileHandling_fileManager {enum { WARN = 3, FATAL = 5 };}
namespace FileHandling_fileUplink {enum { WARN = 3, FATAL = 5 };}
namespace FileHandling_prmDb {enum { WARN = 3, FATAL = 5 };}
}
#endif

View File

@ -0,0 +1,11 @@
#ifndef FILEHANDLINGSUBTOPOLOGY_DEFS_HPP
#define FILEHANDLINGSUBTOPOLOGY_DEFS_HPP
#include "Svc/Subtopologies/FileHandling/FileHandlingConfig/FppConstantsAc.hpp"
namespace FileHandling {
// State for topology construction
struct TopologyState {
};
}
#endif

View File

@ -31,4 +31,4 @@ add_fprime_subdirectory(./TestRelative)
set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/Main.cpp") set(SOURCE_FILES "${CMAKE_CURRENT_LIST_DIR}/Main.cpp")
set(MOD_DEPS Svc_CmdDispatcher TestLibrary_TestComponent TestLibrary2_TestComponent) set(MOD_DEPS Svc_CmdDispatcher TestLibrary_TestComponent TestLibrary2_TestComponent)
register_fprime_deployment() register_fprime_deployment()