| 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 |