F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
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