F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RateGroupDriver.cpp
Go to the documentation of this file.
2 #include <Fw/Types/BasicTypes.hpp>
3 #include <cstring>
4 #include <Fw/Types/Assert.hpp>
5 #include <cstdio>
6 
7 namespace Svc {
8 
9  RateGroupDriver::RateGroupDriver(const char* compName) :
10  RateGroupDriverComponentBase(compName),
11  m_numDividers(0),m_ticks(0),m_rollover(1) {
12 
13  }
14 
16  {
17 
18  // check arguments
19  FW_ASSERT(dividers);
20  FW_ASSERT(numDividers);
21  this->m_numDividers = numDividers;
22  FW_ASSERT(numDividers <= static_cast<NATIVE_INT_TYPE>(FW_NUM_ARRAY_ELEMENTS(this->m_dividers)),
23  numDividers,
24  static_cast<NATIVE_INT_TYPE>(FW_NUM_ARRAY_ELEMENTS(this->m_dividers)));
25  // verify port/table size matches
26  FW_ASSERT(FW_NUM_ARRAY_ELEMENTS(this->m_dividers) == this->getNum_CycleOut_OutputPorts(),
27  static_cast<NATIVE_INT_TYPE>(FW_NUM_ARRAY_ELEMENTS(this->m_dividers)),
28  this->getNum_CycleOut_OutputPorts());
29  // clear table
30  ::memset(this->m_dividers,0,sizeof(this->m_dividers));
31  // copy provided array of dividers
32  for (NATIVE_INT_TYPE entry = 0; entry < numDividers; entry++) {
33  this->m_dividers[entry] = dividers[entry];
34  // rollover value should be product of all dividers to make sure integer rollover doesn't jump cycles
35  // only use non-zero dividers
36  if (dividers[entry] != 0) {
37  this->m_rollover *= dividers[entry];
38  }
39  }
40 
41  }
42 
44 
45  }
46 
48  RateGroupDriverComponentBase::init(instanceId);
49  }
50 
51  void RateGroupDriver::CycleIn_handler(NATIVE_INT_TYPE portNum, Svc::TimerVal& cycleStart) {
52 
53  // Make sure that the dividers have been configured:
54  // If this asserts, add the configure() call to initialization.
55  FW_ASSERT(this->m_numDividers);
56 
57  // Loop through each divider. For a given port, the port will be called when the divider value
58  // divides evenly into the number of ticks. For example, if the divider value for a port is 4,
59  // it would be called every fourth invocation of the CycleIn port.
60  for (NATIVE_INT_TYPE entry = 0; entry < this->m_numDividers; entry++) {
61  if (this->m_dividers[entry] != 0) {
62  if (this->isConnected_CycleOut_OutputPort(entry)) {
63  if ((this->m_ticks % this->m_dividers[entry]) == 0) {
64  this->CycleOut_out(entry,cycleStart);
65  }
66  }
67  }
68  }
69 
70  // rollover the tick value when the tick count reaches the rollover value
71  // the rollover value is the product of all the dividers. See comment in constructor.
72  this->m_ticks = (this->m_ticks + 1) % this->m_rollover;
73 
74  }
75 
76 }
Svc::RateGroupDriver::init
void init(NATIVE_INT_TYPE instanceId=0)
RateGroupDriver initialization function.
Definition: RateGroupDriver.cpp:47
Svc::RateGroupDriver::RateGroupDriver
RateGroupDriver(const char *compName)
RateGroupDriver constructor.
Definition: RateGroupDriver.cpp:9
RateGroupDriver.hpp
RateGroupDivider component implementation.
FW_NUM_ARRAY_ELEMENTS
#define FW_NUM_ARRAY_ELEMENTS(a)
number of elements in an array
Definition: BasicTypes.hpp:100
Svc::RateGroupDriver::~RateGroupDriver
~RateGroupDriver()
RateGroupDriverImpl destructor.
Definition: RateGroupDriver.cpp:43
Svc::TimerVal
Serializable class for carrying timer values.
Definition: TimerVal.hpp:22
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:27
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Svc::RateGroupDriver::configure
void configure(NATIVE_INT_TYPE dividers[], NATIVE_INT_TYPE numDividers)
RateGroupDriver configuration function.
Definition: RateGroupDriver.cpp:15
Svc
Definition: ActiveRateGroupCfg.hpp:18