F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
ActiveRateGroupImpl.cpp
Go to the documentation of this file.
1 /*
2 * \author: Tim Canham
3 * \file:
4 * \brief
5 *
6 * This file implements the ActiveRateGroup component,
7 * which invokes a set of components the comprise the rate group.
8 *
9 * Copyright 2014-2015, by the California Institute of Technology.
10 * ALL RIGHTS RESERVED. United States Government Sponsorship
11 * acknowledged.
12 *
13 */
14 
15 #include <Svc/ActiveRateGroup/ActiveRateGroupImpl.hpp>
16 #include <ActiveRateGroupImplCfg.hpp>
17 #include <Fw/Types/BasicTypes.hpp>
18 #include <Fw/Types/Assert.hpp>
19 #include <Os/Log.hpp>
20 
21 namespace Svc {
22 
23  ActiveRateGroupImpl::ActiveRateGroupImpl(const char* compName, NATIVE_UINT_TYPE contexts[], NATIVE_UINT_TYPE numContexts) :
24  ActiveRateGroupComponentBase(compName),
25  m_cycles(0),
26  m_maxTime(0),
27  m_cycleStarted(false),
28  m_overrunThrottle(0),
29  m_cycleSlips(0) {
30  FW_ASSERT(contexts);
31  FW_ASSERT(numContexts == static_cast<NATIVE_UINT_TYPE>(this->getNum_RateGroupMemberOut_OutputPorts()),numContexts,this->getNum_RateGroupMemberOut_OutputPorts());
32  FW_ASSERT(FW_NUM_ARRAY_ELEMENTS(this->m_contexts) == this->getNum_RateGroupMemberOut_OutputPorts(),
33  static_cast<NATIVE_INT_TYPE>(FW_NUM_ARRAY_ELEMENTS(this->m_contexts)),
34  this->getNum_RateGroupMemberOut_OutputPorts());
35 
36  // copy context values
37  for (NATIVE_INT_TYPE entry = 0; entry < this->getNum_RateGroupMemberOut_OutputPorts(); entry++) {
38  this->m_contexts[entry] = contexts[entry];
39  }
40  }
41 
42  void ActiveRateGroupImpl::init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance) {
43  ActiveRateGroupComponentBase::init(queueDepth,instance);
44  }
45 
46  ActiveRateGroupImpl::~ActiveRateGroupImpl() {
47 
48  }
49 
50  void ActiveRateGroupImpl::preamble() {
51  this->log_DIAGNOSTIC_RateGroupStarted();
52  }
53 
54  void ActiveRateGroupImpl::CycleIn_handler(NATIVE_INT_TYPE portNum, Svc::TimerVal& cycleStart) {
55 
56  TimerVal end;
57 
58  this->m_cycleStarted = false;
59 
60  // invoke any members of the rate group
61  for (NATIVE_INT_TYPE port = 0; port < this->getNum_RateGroupMemberOut_OutputPorts(); port++) {
62  if (this->isConnected_RateGroupMemberOut_OutputPort(port)) {
63  this->RateGroupMemberOut_out(port,this->m_contexts[port]);
64  }
65  }
66 
67  // grab timer for end of cycle
68  end.take();
69 
70  // get rate group execution time
71  U32 cycle_time = end.diffUSec(cycleStart);
72 
73  // check to see if the time has exceeded the previous maximum
74  if (cycle_time > this->m_maxTime) {
75  this->m_maxTime = cycle_time;
76  }
77 
78  // update cycle telemetry
79  this->tlmWrite_RgMaxTime(this->m_maxTime);
80 
81  // check for cycle slip. That will happen if new cycle message has been received
82  // which will cause flag will be set again.
83  if (this->m_cycleStarted) {
84  this->m_cycleSlips++;
85  if (this->m_overrunThrottle < ACTIVE_RATE_GROUP_OVERRUN_THROTTLE) {
86  this->log_WARNING_HI_RateGroupCycleSlip(this->m_cycles);
87  this->m_overrunThrottle++;
88  }
89  // update cycle cycle slips
90  this->tlmWrite_RgCycleSlips(this->m_cycleSlips);
91  } else { // if cycle is okay start decrementing throttle value
92  if (this->m_overrunThrottle > 0) {
93  this->m_overrunThrottle--;
94  }
95  }
96 
97  // increment cycle
98  this->m_cycles++;
99 
100  }
101 
102  void ActiveRateGroupImpl::CycleIn_preMsgHook(NATIVE_INT_TYPE portNum, Svc::TimerVal& cycleStart) {
103  // set flag to indicate cycle has started. Check in thread for overflow.
104  this->m_cycleStarted = true;
105  }
106 
107  void ActiveRateGroupImpl::PingIn_handler(NATIVE_INT_TYPE portNum, U32 key) {
108  // return the key to health
109  this->PingOut_out(0,key);
110  }
111 
112 
113 }
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:28
FW_NUM_ARRAY_ELEMENTS
#define FW_NUM_ARRAY_ELEMENTS(a)
number of elements in an array
Definition: BasicTypes.hpp:100
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
Definition: ActiveRateGroupCfg.hpp:18
Svc::ACTIVE_RATE_GROUP_OVERRUN_THROTTLE
@ ACTIVE_RATE_GROUP_OVERRUN_THROTTLE
Number of overruns allowed before overrun event is throttled.
Definition: ActiveRateGroupCfg.hpp:22
Log.hpp