F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
RefTopology.cpp
Go to the documentation of this file.
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
17 
18 // Allows easy reference to objects in FPP/autocoder required namespaces
19 using namespace Ref;
20 
21 // Instantiate a malloc allocator for cmdSeq buffer allocation
23 
24 // The reference topology divides the incoming clock signal (1Hz) into sub-signals: 1Hz, 1/2Hz, and 1/4Hz and
25 // zero offset for all the dividers
27 
28 // Rate groups may supply a context token to each of the attached children whose purpose is set by the project. The
29 // reference topology sets each token to zero as these contexts are unused in this project.
33 
36 };
37 
46  // Rate group driver needs a divisor list
47  rateGroupDriverComp.configure(rateGroupDivisorsSet);
48 
49  // Rate groups require context arrays. Empty for Reference example.
50  rateGroup1Comp.configure(rateGroup1Context);
51  rateGroup2Comp.configure(rateGroup2Context);
52  rateGroup3Comp.configure(rateGroup3Context);
53 
54  // Command sequencer needs to allocate memory to hold contents of command sequences
55  cmdSeq.allocateBuffer(0, mallocator, 5 * 1024);
56 
57  // Restrict uplinked files to a sandbox directory to prevent path-traversal writes
58  FileHandling::fileUplink.configure("/tmp/uplink/");
59 
60  // PrmDb file name must be supplied by the using topology
61  FileHandling::prmDb.configure("PrmDb.dat");
62 }
63 
64 // Public functions for use in main program are namespaced with deployment name Ref
65 namespace Ref {
66 void setupTopology(const TopologyState& state) {
67  // Autocoded initialization. Function provided by autocoder.
68  initComponents(state);
69  // Autocoded id setup. Function provided by autocoder.
70  setBaseIds();
71  // Autocoded connection wiring. Function provided by autocoder.
72  connectComponents();
73  // Autocoded configuration. Function provided by autocoder.
74  configComponents(state);
75  if (state.hostname != nullptr && state.port != 0) {
76  comDriver.configure(state.hostname, state.port);
77  }
78  // Project-specific component configuration. Function provided above. May be inlined, if desired.
80  // Autocoded command registration. Function provided by autocoder.
81  regCommands();
82  // Autocoded parameter loading. Function provided by autocoder.
83  loadParameters();
84  // Autocoded task kick-off (active components). Function provided by autocoder.
85  startTasks(state);
86  // Initialize socket client communication if and only if there is a valid specification
87  if (state.hostname != nullptr && state.port != 0) {
88  Os::TaskString name("ReceiveTask");
89  comDriver.start(name, COMM_PRIORITY, Default::STACK_SIZE);
90  }
91 }
92 
93 void startRateGroups(const Fw::TimeInterval& interval) {
94  // This timer drives the fundamental tick rate of the system.
95  // Svc::RateGroupDriver will divide this down to the slower rate groups.
96  // This call will block until the stopRateGroups() call is made.
97  // For this Linux demo, that call is made from a signal handler.
98  linuxTimer.startTimer(interval);
99 }
100 
102  linuxTimer.quit();
103 }
104 
105 void teardownTopology(const TopologyState& state) {
106  // Autocoded (active component) task clean-up. Functions provided by topology autocoder.
107  stopTasks(state);
108  freeThreads(state);
109 
110  // Stop the comDriver component, free thread
111  comDriver.stop();
112  (void)comDriver.join();
113 
114  // Resource deallocation
115  cmdSeq.deallocateBuffer(mallocator);
116  tearDownComponents(state);
117  deinitComponents(state);
118 }
119 } // namespace Ref
void startRateGroups(const Fw::TimeInterval &interval)
cycle the rate group driver based in a system timer
Definition: RefTopology.cpp:93
Svc::RateGroupDriver::DividerSet rateGroupDivisorsSet
Definition: RefTopology.cpp:26
required type definition to carry state
A MemAllocator implementation class that uses malloc.
Svc::ActiveRateGroup::ContextArray rateGroup3Context(0)
void configureTopology()
configure/setup components in project-specific way
Definition: RefTopology.cpp:45
void teardownTopology(const TopologyState &state)
teardown the F´ topology
TopologyConstants
Definition: RefTopology.cpp:34
U16 port
Port for TCP communication.
malloc based memory allocator
const char * hostname
Hostname for TCP communication.
Svc::ActiveRateGroup::ContextArray rateGroup1Context(0)
void stopRateGroups()
stop the rate groups
void setupTopology(const TopologyState &state)
initialize and run the F´ topology
Definition: RefTopology.cpp:66
Fw::MallocAllocator mallocator
Definition: RefTopology.cpp:22
Struct containing an array of dividers.
Svc::ActiveRateGroup::ContextArray rateGroup2Context(0)