F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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