GCC Code Coverage Report


Directory: ./
File: Ref/Top/RefTopology.cpp
Date: 2026-09-23 22:11:34
Exec Total Coverage
Lines: 42 42 100.0%
Functions: 5 5 100.0%
Branches: 6 10 60.0%

Line Branch Exec Source
1 // ======================================================================
2 // \title Topology.cpp
3 // \author mstarch
4 // \brief cpp file containing the topology instantiation code
5 //
6 // \copyright
7 // Copyright 2009-2022, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 // ======================================================================
11
12 // Provides access to autocoded functions
13 #include <Ref/Top/RefTopologyAc.hpp>
14
15 // Necessary project-specified types
16 #include <Fw/Types/MallocAllocator.hpp>
17 #include "Fw/Types/MemAllocator.hpp"
18
19 // Allows easy reference to objects in FPP/autocoder required namespaces
20 using namespace Ref;
21
22 // Instantiate a malloc allocator for cmdSeq buffer allocation
23 Fw::MallocAllocator mallocator;
24
25 namespace Ref {
26 Fw::MemAllocator& memAllocator = mallocator;
27 }
28
29 // The reference topology divides the incoming clock signal (1Hz) into sub-signals: 1Hz, 1/2Hz, and 1/4Hz and
30 // zero offset for all the dividers
31 Svc::RateGroupDriver::DividerSet rateGroupDivisorsSet{{{1, 0}, {2, 0}, {4, 0}}};
32
33 // Rate groups may supply a context token to each of the attached children whose purpose is set by the project. The
34 // reference topology sets each token to zero as these contexts are unused in this project.
35 Svc::ActiveRateGroup::ContextArray rateGroup1Context(0);
36 Svc::ActiveRateGroup::ContextArray rateGroup2Context(0);
37 Svc::ActiveRateGroup::ContextArray rateGroup3Context(0);
38
39 enum TopologyConstants {
40 COMM_PRIORITY = 34,
41 };
42
43 /**
44 * \brief configure/setup components in project-specific way
45 *
46 * This is a *helper* function which configures/sets up each component requiring project specific input. This includes
47 * allocating resources, passing-in arguments, etc. This function may be inlined into the topology setup function if
48 * desired, but is extracted here for clarity.
49 */
50 1 void configureTopology() {
51 // Rate group driver needs a divisor list
52 1 rateGroupDriverComp.configure(rateGroupDivisorsSet);
53
54 // Rate groups require context arrays. Empty for Reference example.
55 1 rateGroup1Comp.configure(rateGroup1Context);
56 1 rateGroup2Comp.configure(rateGroup2Context);
57 1 rateGroup3Comp.configure(rateGroup3Context);
58
59 // Command sequencer needs to allocate memory to hold contents of command sequences
60 1 cmdSeq.allocateBuffer(0, mallocator, 5 * 1024);
61
62 // Restrict file access to the working directory (where PrmDb.dat lives)
63 1 FileHandling::fileUplink.configure(".");
64 1 FileHandling::fileDownlink.configure(".");
65 1 FileHandling::prmDb.configureSandbox(".");
66 1 }
67
68 // Public functions for use in main program are namespaced with deployment name Ref
69 namespace Ref {
70 1 void setupTopology(const TopologyState& state) {
71 // Autocoded initialization. Function provided by autocoder.
72 1 initComponents(state);
73 // Autocoded id setup. Function provided by autocoder.
74 1 setBaseIds();
75 // Autocoded connection wiring. Function provided by autocoder.
76 1 connectComponents();
77 // Autocoded configuration. Function provided by autocoder.
78 1 configComponents(state);
79
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if (state.hostname != nullptr && state.port != 0) {
80 1 comDriver.configure(state.hostname, state.port);
81 }
82 // Project-specific component configuration. Function provided above. May be inlined, if desired.
83 1 configureTopology();
84 // Autocoded command registration. Function provided by autocoder.
85 1 regCommands();
86 // Autocoded parameter file read (prmDb). Function provided by autocoder.
87 1 readParameters();
88 // Autocoded parameter loading. Function provided by autocoder.
89 1 loadParameters();
90 // Autocoded task kick-off (active components). Function provided by autocoder.
91 1 startTasks(state);
92 // Initialize socket client communication if and only if there is a valid specification
93
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if (state.hostname != nullptr && state.port != 0) {
94
1/1
✓ Branch 1 taken 1 times.
1 Os::TaskString name("ReceiveTask");
95
1/1
✓ Branch 1 taken 1 times.
1 comDriver.start(name, COMM_PRIORITY, Default::STACK_SIZE);
96 1 }
97 1 }
98
99 1 void startRateGroups(const Fw::TimeInterval& interval) {
100 // This timer drives the fundamental tick rate of the system.
101 // Svc::RateGroupDriver will divide this down to the slower rate groups.
102 // This call will block until the stopRateGroups() call is made.
103 // For this Linux demo, that call is made from a signal handler.
104 1 linuxTimer.startTimer(interval);
105 1 }
106
107 1 void stopRateGroups() {
108 1 linuxTimer.quit();
109 1 }
110
111 1 void teardownTopology(const TopologyState& state) {
112 // Autocoded (active component) task clean-up. Functions provided by topology autocoder.
113 1 stopTasks(state);
114 1 freeThreads(state);
115
116 // Stop the comDriver component, free thread
117 1 comDriver.stop();
118 1 (void)comDriver.join();
119
120 // Resource deallocation
121 1 cmdSeq.deallocateBuffer(mallocator);
122 1 tearDownComponents(state);
123 1 deinitComponents(state);
124 1 }
125 } // namespace Ref
126