F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
EventManager.cpp
Go to the documentation of this file.
1 /*
2  * TestCommand1Impl.cpp
3  *
4  * Created on: Mar 28, 2014
5  * Author: tcanham
6  */
7 
8 #include <cstdio>
9 
10 #include <Fw/Types/Assert.hpp>
11 #include <Os/File.hpp>
13 #include <cstring>
14 
15 namespace Svc {
16 static_assert(std::numeric_limits<FwSizeType>::max() >= TELEM_ID_FILTER_SIZE,
17  "TELEM_ID_FILTER_SIZE must fit within range of FwSizeType");
20 
22  // set filter defaults
23  this->m_filterState[FilterSeverity::WARNING_HI].enabled =
25  this->m_filterState[FilterSeverity::WARNING_LO].enabled =
27  this->m_filterState[FilterSeverity::COMMAND].enabled =
29  this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled =
31  this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled =
33  this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled =
35 
36  memset(m_filteredIDs, 0, sizeof(m_filteredIDs));
37 }
38 
40 
41 void EventManager::LogRecv_handler(FwIndexType portNum,
42  FwEventIdType id,
43  Fw::Time& timeTag,
44  const Fw::LogSeverity& severity,
45  Fw::LogBuffer& args) {
46  // make sure ID is not zero. Zero is reserved for ID filter.
47  FW_ASSERT(id != 0);
48 
49  switch (severity.e) {
50  case Fw::LogSeverity::FATAL: // always pass FATAL
51  break;
53  if (this->m_filterState[FilterSeverity::WARNING_HI].enabled == Enabled::DISABLED) {
54  return;
55  }
56  break;
58  if (this->m_filterState[FilterSeverity::WARNING_LO].enabled == Enabled::DISABLED) {
59  return;
60  }
61  break;
63  if (this->m_filterState[FilterSeverity::COMMAND].enabled == Enabled::DISABLED) {
64  return;
65  }
66  break;
68  if (this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled == Enabled::DISABLED) {
69  return;
70  }
71  break;
73  if (this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled == Enabled::DISABLED) {
74  return;
75  }
76  break;
78  if (this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled == Enabled::DISABLED) {
79  return;
80  }
81  break;
82  default:
83  FW_ASSERT(0, static_cast<FwAssertArgType>(severity.e));
84  return;
85  }
86 
87  // check ID filters
88  for (FwSizeType entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
89  if ((m_filteredIDs[entry] == id) && (severity != Fw::LogSeverity::FATAL)) {
90  return;
91  }
92  }
93 
94  // send event to the logger thread
95  this->loqQueue_internalInterfaceInvoke(id, timeTag, severity, args);
96 
97  // if connected, announce the FATAL
98  if (Fw::LogSeverity::FATAL == severity.e) {
100  this->FatalAnnounce_out(0, id);
101  }
102  }
103 }
104 
105 void EventManager::loqQueue_internalInterfaceHandler(FwEventIdType id,
106  const Fw::Time& timeTag,
107  const Fw::LogSeverity& severity,
108  const Fw::LogBuffer& args) {
109  // Serialize event
110  this->m_logPacket.setId(id);
111  this->m_logPacket.setTimeTag(timeTag);
112  this->m_logPacket.setLogBuffer(args);
113  this->m_comBuffer.resetSer();
114  Fw::SerializeStatus stat = this->m_logPacket.serializeTo(this->m_comBuffer);
115  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat, static_cast<FwAssertArgType>(stat));
116 
117  if (this->isConnected_PktSend_OutputPort(0)) {
118  this->PktSend_out(0, this->m_comBuffer, 0);
119  }
120 }
121 
122 void EventManager::SET_EVENT_FILTER_cmdHandler(FwOpcodeType opCode,
123  U32 cmdSeq,
124  FilterSeverity filterLevel,
125  Enabled filterEnable) {
126  this->m_filterState[filterLevel.e].enabled = filterEnable;
127  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
128 }
129 
130 void EventManager::SET_ID_FILTER_cmdHandler(FwOpcodeType opCode,
131  U32 cmdSeq,
132  FwEventIdType ID,
133  Enabled idEnabled
134 ) {
135  if (Enabled::ENABLED == idEnabled.e) { // add ID
136  // search list for existing entry
137  for (FwSizeType entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
138  if (this->m_filteredIDs[entry] == ID) {
139  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
141  return;
142  }
143  }
144  // if not already a match, search for an open slot
145  for (FwSizeType entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
146  if (this->m_filteredIDs[entry] == 0) {
147  this->m_filteredIDs[entry] = ID;
148  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
150  return;
151  }
152  }
153  // if an empty slot was not found, send an error event
155  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
156  } else { // remove ID
157  // search list for existing entry
158  for (FwSizeType entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
159  if (this->m_filteredIDs[entry] == ID) {
160  this->m_filteredIDs[entry] = 0; // zero entry
161  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
163  return;
164  }
165  }
166  // if it gets here, wasn't found
168  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
169  }
170 }
171 
172 void EventManager::DUMP_FILTER_STATE_cmdHandler(FwOpcodeType opCode,
173  U32 cmdSeq
174 ) {
175  // first, iterate through severity filters
176  for (FwEnumStoreType filter = 0; filter < FilterSeverity::NUM_CONSTANTS; filter++) {
177  FilterSeverity filterState(static_cast<FilterSeverity::t>(filter));
178  this->log_ACTIVITY_LO_SEVERITY_FILTER_STATE(filterState,
179  Enabled::ENABLED == this->m_filterState[filter].enabled.e);
180  }
181 
182  // iterate through ID filter
183  for (FwSizeType entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
184  if (this->m_filteredIDs[entry] != 0) {
185  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(this->m_filteredIDs[entry]);
186  }
187  }
188 
189  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
190 }
191 
192 void EventManager::pingIn_handler(const FwIndexType portNum, U32 key) {
193  // return key
194  this->pingOut_out(0, key);
195 }
196 
197 } // namespace Svc
Serialization/Deserialization operation was successful.
Enabled and disabled state.
FwIdType FwOpcodeType
The type of a command opcode.
PlatformSizeType FwSizeType
WARNING HI events are filtered at input.
I32 FwEnumStoreType
void setTimeTag(const Fw::Time &timeTag)
Definition: LogPacket.cpp:74
EventManager(const char *compName)
constructor
void pingOut_out(FwIndexType portNum, U32 key)
Invoke output port pingOut.
ACTIVITY HI events are filtered at input.
void setId(FwEventIdType id)
Definition: LogPacket.cpp:66
void PktSend_out(FwIndexType portNum, Fw::ComBuffer &data, U32 context)
Invoke output port PktSend.
T e
The raw enum value.
Software diagnostic events.
SerializeStatus
forward declaration for string
Size of telemetry ID filter.
FwIdType FwEventIdType
The type of an event identifier.
void log_ACTIVITY_HI_ID_FILTER_ENABLED(FwEventIdType ID) const
EventManager_Enabled Enabled
Less important informational events.
void log_WARNING_LO_ID_FILTER_LIST_FULL(FwEventIdType ID) const
An activity related to commanding.
A less serious but recoverable event.
bool isConnected_FatalAnnounce_OutputPort(FwIndexType portNum)
void resetSer() override
Reset serialization pointer to beginning of buffer.
A serious but recoverable event.
Auto-generated base for EventManager component.
COMMAND events are filtered at input.
Enum representing event severity.
Command successfully executed.
virtual ~EventManager()
destructor
void setLogBuffer(const LogBuffer &buffer)
Definition: LogPacket.cpp:70
void log_WARNING_LO_ID_FILTER_NOT_FOUND(FwEventIdType ID) const
void loqQueue_internalInterfaceInvoke(FwEventIdType id, const Fw::Time &timeTag, const Fw::LogSeverity &severity, const Fw::LogBuffer &args)
Internal interface base-class function for loqQueue.
WARNING LO events are filtered at input.
Command had execution error.
Important informational events.
EventManager_FilterSeverity FilterSeverity
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
ACTIVITY LO events are filtered at input.
PlatformIndexType FwIndexType
A fatal non-recoverable event.
RateGroupDivider component implementation.
void log_ACTIVITY_LO_SEVERITY_FILTER_STATE(Svc::EventManager_FilterSeverity severity, bool enabled) const
void FatalAnnounce_out(FwIndexType portNum, FwEventIdType Id)
Invoke output port FatalAnnounce.
bool isConnected_PktSend_OutputPort(FwIndexType portNum)
DIAGNOSTIC events are filtered at input.
SerializeStatus serializeTo(SerialBufferBase &buffer, Fw::Endianness mode=Fw::Endianness::BIG) const override
serialize contents
Definition: LogPacket.cpp:19
#define FW_ASSERT(...)
Definition: Assert.hpp:14
void log_ACTIVITY_HI_ID_FILTER_REMOVED(FwEventIdType ID) const