F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
ActiveLoggerImpl.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 
11 #include <Fw/Types/Assert.hpp>
12 #include <Os/File.hpp>
13 
14 namespace Svc {
15 
18 
21  {
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  }
39 
41  }
42 
44  NATIVE_INT_TYPE queueDepth,
45  NATIVE_INT_TYPE instance
46  ) {
47  ActiveLoggerComponentBase::init(queueDepth,instance);
48  }
49 
50  void ActiveLoggerImpl::LogRecv_handler(NATIVE_INT_TYPE portNum, FwEventIdType id, Fw::Time &timeTag, const Fw::LogSeverity& severity, Fw::LogBuffer &args) {
51 
52  // make sure ID is not zero. Zero is reserved for ID filter.
53  FW_ASSERT(id != 0);
54 
55  switch (severity.e) {
56  case Fw::LogSeverity::FATAL: // always pass FATAL
57  break;
59  if (this->m_filterState[FilterSeverity::WARNING_HI].enabled == Enabled::DISABLED) {
60  return;
61  }
62  break;
64  if (this->m_filterState[FilterSeverity::WARNING_LO].enabled == Enabled::DISABLED) {
65  return;
66  }
67  break;
69  if (this->m_filterState[FilterSeverity::COMMAND].enabled == Enabled::DISABLED) {
70  return;
71  }
72  break;
74  if (this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled == Enabled::DISABLED) {
75  return;
76  }
77  break;
79  if (this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled == Enabled::DISABLED) {
80  return;
81  }
82  break;
84  if (this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled == Enabled::DISABLED) {
85  return;
86  }
87  break;
88  default:
89  FW_ASSERT(0,static_cast<NATIVE_INT_TYPE>(severity.e));
90  return;
91  }
92 
93  // check ID filters
94  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
95  if (
96  (m_filteredIDs[entry] == id) &&
97  (severity != Fw::LogSeverity::FATAL)
98  ) {
99  return;
100  }
101  }
102 
103  // send event to the logger thread
104  this->loqQueue_internalInterfaceInvoke(id,timeTag,severity,args);
105 
106  // if connected, announce the FATAL
107  if (Fw::LogSeverity::FATAL == severity.e) {
109  this->FatalAnnounce_out(0,id);
110  }
111  }
112  }
113 
114  void ActiveLoggerImpl::loqQueue_internalInterfaceHandler(FwEventIdType id, const Fw::Time &timeTag, const Fw::LogSeverity& severity, const Fw::LogBuffer &args) {
115 
116  // Serialize event
117  this->m_logPacket.setId(id);
118  this->m_logPacket.setTimeTag(timeTag);
119  this->m_logPacket.setLogBuffer(args);
120  this->m_comBuffer.resetSer();
121  Fw::SerializeStatus stat = this->m_logPacket.serialize(this->m_comBuffer);
122  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat,static_cast<NATIVE_INT_TYPE>(stat));
123 
124  if (this->isConnected_PktSend_OutputPort(0)) {
125  this->PktSend_out(0, this->m_comBuffer,0);
126  }
127  }
128 
129  void ActiveLoggerImpl::SET_EVENT_FILTER_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, FilterSeverity filterLevel, Enabled filterEnable) {
130  this->m_filterState[filterLevel.e].enabled = filterEnable;
131  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
132  }
133 
134  void ActiveLoggerImpl::SET_ID_FILTER_cmdHandler(
135  FwOpcodeType opCode,
136  U32 cmdSeq,
137  U32 ID,
138  Enabled idEnabled
139  ) {
140 
141  if (Enabled::ENABLED == idEnabled.e) { // add ID
142  // search list for existing entry
143  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
144  if (this->m_filteredIDs[entry] == ID) {
145  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
147  return;
148  }
149  }
150  // if not already a match, search for an open slot
151  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
152  if (this->m_filteredIDs[entry] == 0) {
153  this->m_filteredIDs[entry] = ID;
154  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
156  return;
157  }
158  }
159  // if an empty slot was not found, send an error event
162  } else { // remove ID
163  // search list for existing entry
164  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
165  if (this->m_filteredIDs[entry] == ID) {
166  this->m_filteredIDs[entry] = 0; // zero entry
167  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
169  return;
170  }
171  }
172  // if it gets here, wasn't found
175  }
176 
177  }
178 
179  void ActiveLoggerImpl::DUMP_FILTER_STATE_cmdHandler(
180  FwOpcodeType opCode,
181  U32 cmdSeq
182  ) {
183 
184  // first, iterate through severity filters
185  for (NATIVE_UINT_TYPE filter = 0; filter < FilterSeverity::NUM_CONSTANTS; filter++) {
186  FilterSeverity filterState(static_cast<FilterSeverity::t>(filter));
188  filterState,
189  Enabled::ENABLED == this->m_filterState[filter].enabled.e
190  );
191  }
192 
193  // iterate through ID filter
194  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
195  if (this->m_filteredIDs[entry] != 0) {
196  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(this->m_filteredIDs[entry]);
197  }
198  }
199 
200  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
201  }
202 
203  void ActiveLoggerImpl::pingIn_handler(
204  const NATIVE_INT_TYPE portNum,
205  U32 key
206  )
207  {
208  // return key
209  this->pingOut_out(0,key);
210  }
211 
212 } // namespace Svc
@ FILTER_WARNING_HI_DEFAULT
WARNING HI events are filtered at input.
@ FILTER_WARNING_LO_DEFAULT
WARNING LO events are filtered at input.
@ FILTER_ACTIVITY_HI_DEFAULT
ACTIVITY HI events are filtered at input.
@ FILTER_ACTIVITY_LO_DEFAULT
ACTIVITY LO events are filtered at input.
@ FILTER_COMMAND_DEFAULT
COMMAND events are filtered at input.
@ FILTER_DIAGNOSTIC_DEFAULT
DIAGNOSTIC events are filtered at input.
@ TELEM_ID_FILTER_SIZE
Size of telemetry ID filter.
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:51
PlatformUIntType NATIVE_UINT_TYPE
Definition: BasicTypes.h:52
U32 FwEventIdType
Definition: FpConfig.h:62
U32 FwOpcodeType
Definition: FpConfig.h:56
@ EXECUTION_ERROR
Command had execution error.
@ OK
Command successfully executed.
SerializeStatus serialize(SerializeBufferBase &buffer) const
serialize contents
Definition: LogPacket.cpp:20
void setId(FwEventIdType id)
Definition: LogPacket.cpp:69
void setTimeTag(const Fw::Time &timeTag)
Definition: LogPacket.cpp:77
void setLogBuffer(const LogBuffer &buffer)
Definition: LogPacket.cpp:73
Enum representing event severity.
T e
The raw enum value.
@ WARNING_HI
A serious but recoverable event.
@ ACTIVITY_HI
Important informational events.
@ FATAL
A fatal non-recoverable event.
@ WARNING_LO
A less serious but recoverable event.
@ DIAGNOSTIC
Software diagnostic events.
@ ACTIVITY_LO
Less important informational events.
@ COMMAND
An activity related to commanding.
void init()
Object initializer.
Definition: ObjBase.cpp:27
void resetSer()
reset to beginning of buffer to reuse for serialization
Definition: Time.hpp:9
Enabled and disabled state.
@ NUM_CONSTANTS
The number of enumerated constants.
Auto-generated base for ActiveLogger component.
bool isConnected_PktSend_OutputPort(NATIVE_INT_TYPE portNum)
void FatalAnnounce_out(NATIVE_INT_TYPE portNum, FwEventIdType Id)
Invoke output port FatalAnnounce.
void PktSend_out(NATIVE_INT_TYPE portNum, Fw::ComBuffer &data, U32 context)
Invoke output port PktSend.
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void log_ACTIVITY_LO_SEVERITY_FILTER_STATE(Svc::ActiveLogger_FilterSeverity severity, bool enabled)
bool isConnected_FatalAnnounce_OutputPort(NATIVE_INT_TYPE portNum)
void loqQueue_internalInterfaceInvoke(FwEventIdType id, const Fw::Time &timeTag, const Fw::LogSeverity &severity, const Fw::LogBuffer &args)
Internal interface base-class function for loqQueue.
void pingOut_out(NATIVE_INT_TYPE portNum, U32 key)
Invoke output port pingOut.
ActiveLoggerImpl(const char *compName)
constructor
virtual ~ActiveLoggerImpl()
destructor
SerializeStatus
forward declaration for string
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
ActiveLogger_Enabled Enabled
ActiveLogger_FilterSeverity FilterSeverity