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 <Fw/Types/Assert.hpp>
9 #include <Os/File.hpp>
11 
12 namespace Svc {
13 static_assert(std::numeric_limits<FwSizeType>::max() >= TELEM_ID_FILTER_SIZE,
14  "TELEM_ID_FILTER_SIZE must fit within range of FwSizeType");
17 
19  // set filter defaults
20  this->m_filterState[FilterSeverity::WARNING_HI].enabled =
22  this->m_filterState[FilterSeverity::WARNING_LO].enabled =
24  this->m_filterState[FilterSeverity::COMMAND].enabled =
26  this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled =
28  this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled =
30  this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled =
32 }
33 
35 
36 void EventManager::LogRecv_handler(FwIndexType portNum,
37  FwEventIdType id,
38  Fw::Time& timeTag,
39  const Fw::LogSeverity& severity,
40  Fw::LogBuffer& args) {
41  switch (severity.e) {
42  case Fw::LogSeverity::FATAL: // always pass FATAL
43  break;
45  if (this->m_filterState[FilterSeverity::WARNING_HI].enabled == Enabled::DISABLED) {
46  return;
47  }
48  break;
50  if (this->m_filterState[FilterSeverity::WARNING_LO].enabled == Enabled::DISABLED) {
51  return;
52  }
53  break;
55  if (this->m_filterState[FilterSeverity::COMMAND].enabled == Enabled::DISABLED) {
56  return;
57  }
58  break;
60  if (this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled == Enabled::DISABLED) {
61  return;
62  }
63  break;
65  if (this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled == Enabled::DISABLED) {
66  return;
67  }
68  break;
70  if (this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled == Enabled::DISABLED) {
71  return;
72  }
73  break;
74  default:
75  FW_ASSERT(0, static_cast<FwAssertArgType>(severity.e));
76  return;
77  }
78 
79  // check ID filters
80  Fw::Success findStatus = m_filteredIDs.find(id);
81  if ((findStatus == Fw::Success::SUCCESS) && (severity != Fw::LogSeverity::FATAL)) {
82  return;
83  }
84 
85  // send event to the logger thread
86  this->loqQueue_internalInterfaceInvoke(id, timeTag, severity, args);
87 
88  // if connected, announce the FATAL
89  if (Fw::LogSeverity::FATAL == severity.e) {
91  this->FatalAnnounce_out(0, id);
92  }
93  }
94 }
95 
96 void EventManager::loqQueue_internalInterfaceHandler(FwEventIdType id,
97  const Fw::Time& timeTag,
98  const Fw::LogSeverity& severity,
99  const Fw::LogBuffer& args) {
100  // Serialize event
101  this->m_logPacket.setId(id);
102  this->m_logPacket.setTimeTag(timeTag);
103  this->m_logPacket.setLogBuffer(args);
104  this->m_comBuffer.resetSer();
105  Fw::SerializeStatus stat = this->m_logPacket.serializeTo(this->m_comBuffer);
106  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat, static_cast<FwAssertArgType>(stat));
107 
108  if (this->isConnected_PktSend_OutputPort(0)) {
109  this->PktSend_out(0, this->m_comBuffer, 0);
110  }
111 }
112 
113 void EventManager::SET_EVENT_FILTER_cmdHandler(FwOpcodeType opCode,
114  U32 cmdSeq,
115  FilterSeverity filterLevel,
116  Enabled filterEnable) {
117  this->m_filterState[filterLevel.e].enabled = filterEnable;
118  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
119 }
120 
121 void EventManager::SET_ID_FILTER_cmdHandler(FwOpcodeType opCode,
122  U32 cmdSeq,
123  FwEventIdType ID,
124  Enabled idEnabled
125 ) {
126  if (Enabled::ENABLED == idEnabled.e) { // add ID
127  if (m_filteredIDs.insert(ID) == Fw::Success::SUCCESS) {
128  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
130  } else {
131  // if an empty slot was not found, send an error event
133  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
134  }
135  } else { // remove ID
136  if (m_filteredIDs.remove(ID) == Fw::Success::SUCCESS) {
137  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
139  } else {
140  // Entry wasn't found
142  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
143  }
144  }
145 }
146 
147 void EventManager::DUMP_FILTER_STATE_cmdHandler(FwOpcodeType opCode,
148  U32 cmdSeq
149 ) {
150  // first, iterate through severity filters
151  for (FwEnumStoreType filter = 0; filter < FilterSeverity::NUM_CONSTANTS; filter++) {
152  FilterSeverity filterState(static_cast<FilterSeverity::t>(filter));
153  this->log_ACTIVITY_LO_SEVERITY_FILTER_STATE(filterState,
154  Enabled::ENABLED == this->m_filterState[filter].enabled.e);
155  }
156 
157  // iterate through ID filter
158  for (FwEventIdType ID : m_filteredIDs) {
160  }
161 
162  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
163 }
164 
165 void EventManager::pingIn_handler(const FwIndexType portNum, U32 key) {
166  // return key
167  this->pingOut_out(0, key);
168 }
169 
170 } // namespace Svc
Serialization/Deserialization operation was successful.
Enabled and disabled state.
FwIdType FwOpcodeType
The type of a command opcode.
Representing success.
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.
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
Success find(const T &element) const override
Definition: ArraySet.hpp:81
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.
Success remove(const T &element) override
Definition: ArraySet.hpp:103
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.
enum T e
The raw enum value.
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
Success insert(const T &element) override
Definition: ArraySet.hpp:96
#define FW_ASSERT(...)
Definition: Assert.hpp:14
Success/Failure.
void log_ACTIVITY_HI_ID_FILTER_REMOVED(FwEventIdType ID) const