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 file access to the working directory (where PrmDb.dat lives)
58  FileHandling::fileUplink.configure(".");
59  FileHandling::fileDownlink.configure(".");
60  FileHandling::prmDb.configureSandbox(".");
61 }
62 
63 // Public functions for use in main program are namespaced with deployment name Ref
64 namespace Ref {
65 void setupTopology(const TopologyState& state) {
66  // Autocoded initialization. Function provided by autocoder.
67  initComponents(state);
68  // Autocoded id setup. Function provided by autocoder.
69  setBaseIds();
70  // Autocoded connection wiring. Function provided by autocoder.
71  connectComponents();
72  // Autocoded configuration. Function provided by autocoder.
73  configComponents(state);
74  if (state.hostname != nullptr && state.port != 0) {
75  comDriver.configure(state.hostname, state.port);
76  }
77  // Project-specific component configuration. Function provided above. May be inlined, if desired.
79  // Autocoded command registration. Function provided by autocoder.
80  regCommands();
81  // Autocoded parameter file read (prmDb). Function provided by autocoder.
82  readParameters();
83  // Autocoded parameter loading. Function provided by autocoder.
84  loadParameters();
85  // Autocoded task kick-off (active components). Function provided by autocoder.
86  startTasks(state);
87  // Initialize socket client communication if and only if there is a valid specification
88  if (state.hostname != nullptr && state.port != 0) {
89  Os::TaskString name("ReceiveTask");
90  comDriver.start(name, COMM_PRIORITY, Default::STACK_SIZE);
91  }
92 }
93 
94 void startRateGroups(const Fw::TimeInterval& interval) {
95  // This timer drives the fundamental tick rate of the system.
96  // Svc::RateGroupDriver will divide this down to the slower rate groups.
97  // This call will block until the stopRateGroups() call is made.
98  // For this Linux demo, that call is made from a signal handler.
99  linuxTimer.startTimer(interval);
100 }
101 
103  linuxTimer.quit();
104 }
105 
106 void teardownTopology(const TopologyState& state) {
107  // Autocoded (active component) task clean-up. Functions provided by topology autocoder.
108  stopTasks(state);
109  freeThreads(state);
110 
111  // Stop the comDriver component, free thread
112  comDriver.stop();
113  (void)comDriver.join();
114 
115  // Resource deallocation
116  cmdSeq.deallocateBuffer(mallocator);
117  tearDownComponents(state);
118  deinitComponents(state);
119 }
120 } // namespace Ref
void startRateGroups(const Fw::TimeInterval &interval)
cycle the rate group driver based in a system timer
Definition: RefTopology.cpp:94
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:65
Fw::MallocAllocator mallocator
Definition: RefTopology.cpp:22
Struct containing an array of dividers.
Svc::ActiveRateGroup::ContextArray rateGroup2Context(0)