F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
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 
16  typedef ActiveLogger_Enabled Enabled;
17  typedef ActiveLogger_FilterSeverity FilterSeverity;
18 
20  ActiveLoggerComponentBase(name)
21  {
22  // set filter defaults
23  this->m_filterState[FilterSeverity::WARNING_HI].enabled =
24  FILTER_WARNING_HI_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
25  this->m_filterState[FilterSeverity::WARNING_LO].enabled =
26  FILTER_WARNING_LO_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
27  this->m_filterState[FilterSeverity::COMMAND].enabled =
28  FILTER_COMMAND_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
29  this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled =
30  FILTER_ACTIVITY_HI_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
31  this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled =
32  FILTER_ACTIVITY_LO_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
33  this->m_filterState[FilterSeverity::DIAGNOSTIC].enabled =
34  FILTER_DIAGNOSTIC_DEFAULT?Enabled::ENABLED:Enabled::DISABLED;
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;
58  case Fw::LogSeverity::WARNING_HI:
59  if (this->m_filterState[FilterSeverity::WARNING_HI].enabled == Enabled::DISABLED) {
60  return;
61  }
62  break;
63  case Fw::LogSeverity::WARNING_LO:
64  if (this->m_filterState[FilterSeverity::WARNING_LO].enabled == Enabled::DISABLED) {
65  return;
66  }
67  break;
68  case Fw::LogSeverity::COMMAND:
69  if (this->m_filterState[FilterSeverity::COMMAND].enabled == Enabled::DISABLED) {
70  return;
71  }
72  break;
73  case Fw::LogSeverity::ACTIVITY_HI:
74  if (this->m_filterState[FilterSeverity::ACTIVITY_HI].enabled == Enabled::DISABLED) {
75  return;
76  }
77  break;
78  case Fw::LogSeverity::ACTIVITY_LO:
79  if (this->m_filterState[FilterSeverity::ACTIVITY_LO].enabled == Enabled::DISABLED) {
80  return;
81  }
82  break;
83  case Fw::LogSeverity::DIAGNOSTIC:
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) {
108  if (this->isConnected_FatalAnnounce_OutputPort(0)) {
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  if ( (filterLevel.e > FilterSeverity::DIAGNOSTIC) or
131  (filterLevel.e < FilterSeverity::WARNING_HI) or
132  (filterEnable.e < Enabled::ENABLED) or
133  (filterEnable.e > Enabled::DISABLED)) {
134  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::VALIDATION_ERROR);
135  return;
136  }
137  this->m_filterState[filterLevel.e].enabled = filterEnable;
138  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
139  }
140 
141  void ActiveLoggerImpl::SET_ID_FILTER_cmdHandler(
142  FwOpcodeType opCode,
143  U32 cmdSeq,
144  U32 ID,
145  Enabled idEnabled
146  ) {
147 
148  // check parameter
149  switch (idEnabled.e) {
150  case Enabled::ENABLED:
151  case Enabled::DISABLED:
152  break;
153  default:
154  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::VALIDATION_ERROR);
155  return;
156  }
157 
158  if (Enabled::ENABLED == idEnabled.e) { // add ID
159  // search list for existing entry
160  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
161  if (this->m_filteredIDs[entry] == ID) {
162  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
163  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(ID);
164  return;
165  }
166  }
167  // if not already a match, search for an open slot
168  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
169  if (this->m_filteredIDs[entry] == 0) {
170  this->m_filteredIDs[entry] = ID;
171  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
172  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(ID);
173  return;
174  }
175  }
176  // if an empty slot was not found, send an error event
177  this->log_WARNING_LO_ID_FILTER_LIST_FULL(ID);
178  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::EXECUTION_ERROR);
179  } else { // remove ID
180  // search list for existing entry
181  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
182  if (this->m_filteredIDs[entry] == ID) {
183  this->m_filteredIDs[entry] = 0; // zero entry
184  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
185  this->log_ACTIVITY_HI_ID_FILTER_REMOVED(ID);
186  return;
187  }
188  }
189  // if it gets here, wasn't found
190  this->log_WARNING_LO_ID_FILTER_NOT_FOUND(ID);
191  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::EXECUTION_ERROR);
192  }
193 
194  }
195 
196  void ActiveLoggerImpl::DUMP_FILTER_STATE_cmdHandler(
197  FwOpcodeType opCode,
198  U32 cmdSeq
199  ) {
200 
201  // first, iterate through severity filters
202  for (NATIVE_UINT_TYPE filter = 0; filter < FilterSeverity::NUM_CONSTANTS; filter++) {
203  FilterSeverity filterState(static_cast<FilterSeverity::t>(filter));
204  this->log_ACTIVITY_LO_SEVERITY_FILTER_STATE(
205  filterState,
206  Enabled::ENABLED == this->m_filterState[filter].enabled.e
207  );
208  }
209 
210  // iterate through ID filter
211  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
212  if (this->m_filteredIDs[entry] != 0) {
213  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(this->m_filteredIDs[entry]);
214  }
215  }
216 
217  this->cmdResponse_out(opCode,cmdSeq,Fw::CmdResponse::OK);
218  }
219 
220  void ActiveLoggerImpl::pingIn_handler(
221  const NATIVE_INT_TYPE portNum,
222  U32 key
223  )
224  {
225  // return key
226  this->pingOut_out(0,key);
227  }
228 
229 } // namespace Svc
Fw::Time
Definition: Time.hpp:10
Fw::LogPacket::serialize
SerializeStatus serialize(SerializeBufferBase &buffer) const
serialize contents
Definition: LogPacket.cpp:20
FILTER_ACTIVITY_HI_DEFAULT
@ FILTER_ACTIVITY_HI_DEFAULT
ACTIVITY HI events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:19
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:28
Svc::FilterSeverity
ActiveLogger_FilterSeverity FilterSeverity
Definition: ActiveLoggerImpl.cpp:17
Fw::LogBuffer
Definition: LogBuffer.hpp:22
Svc::ActiveLoggerImpl::ActiveLoggerImpl
ActiveLoggerImpl(const char *compName)
constructor
Definition: ActiveLoggerImpl.cpp:19
Fw::SerializeBufferBase::resetSer
void resetSer(void)
reset to beginning of buffer to reuse for serialization
Definition: Serializable.cpp:572
Fw::LogPacket::setTimeTag
void setTimeTag(const Fw::Time &timeTag)
Definition: LogPacket.cpp:77
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:27
Svc::Enabled
ActiveLogger_Enabled Enabled
Definition: ActiveLoggerImpl.cpp:16
OK
@ OK
Definition: StandardTypes.hpp:15
FwEventIdType
#define FwEventIdType
Type representation for a event id.
Definition: FpConfig.hpp:70
FwOpcodeType
#define FwOpcodeType
Type representation for a command opcode.
Definition: FpConfig.hpp:62
File.hpp
FILTER_ACTIVITY_LO_DEFAULT
@ FILTER_ACTIVITY_LO_DEFAULT
ACTIVITY LO events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:20
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Svc
Definition: ActiveRateGroupCfg.hpp:18
FILTER_DIAGNOSTIC_DEFAULT
@ FILTER_DIAGNOSTIC_DEFAULT
DIAGNOSTIC events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:21
Fw::LogPacket::setId
void setId(FwEventIdType id)
Definition: LogPacket.cpp:69
Fw::LogPacket::setLogBuffer
void setLogBuffer(const LogBuffer &buffer)
Definition: LogPacket.cpp:73
FILTER_COMMAND_DEFAULT
@ FILTER_COMMAND_DEFAULT
COMMAND events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:18
TELEM_ID_FILTER_SIZE
@ TELEM_ID_FILTER_SIZE
Size of telemetry ID filter.
Definition: ActiveLoggerImplCfg.hpp:26
ActiveLoggerImpl.hpp
Svc::ActiveLoggerImpl::init
void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance)
initialization function
Definition: ActiveLoggerImpl.cpp:43
Svc::ActiveLoggerImpl::~ActiveLoggerImpl
virtual ~ActiveLoggerImpl()
destructor
Definition: ActiveLoggerImpl.cpp:40
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
FILTER_WARNING_LO_DEFAULT
@ FILTER_WARNING_LO_DEFAULT
WARNING LO events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:17
FILTER_WARNING_HI_DEFAULT
@ FILTER_WARNING_HI_DEFAULT
WARNING HI events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:16