F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
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 
9 #include <Fw/Types/Assert.hpp>
10 #include <Os/File.hpp>
11 
12 namespace Svc {
13 
15  ActiveLoggerComponentBase(name)
16  {
17  // set filter defaults
18  this->m_filterState[FILTER_WARNING_HI].enabled =
19  FILTER_WARNING_HI_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
20  this->m_filterState[FILTER_WARNING_LO].enabled =
21  FILTER_WARNING_LO_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
22  this->m_filterState[FILTER_COMMAND].enabled =
23  FILTER_COMMAND_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
24  this->m_filterState[FILTER_ACTIVITY_HI].enabled =
25  FILTER_ACTIVITY_HI_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
26  this->m_filterState[FILTER_ACTIVITY_LO].enabled =
27  FILTER_ACTIVITY_LO_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
28  this->m_filterState[FILTER_DIAGNOSTIC].enabled =
29  FILTER_DIAGNOSTIC_DEFAULT?FILTER_ENABLED:FILTER_DISABLED;
30 
31  memset(m_filteredIDs,0,sizeof(m_filteredIDs));
32 
33  }
34 
36  }
37 
39  NATIVE_INT_TYPE queueDepth,
40  NATIVE_INT_TYPE instance
41  ) {
42  ActiveLoggerComponentBase::init(queueDepth,instance);
43  }
44 
45  void ActiveLoggerImpl::LogRecv_handler(NATIVE_INT_TYPE portNum, FwEventIdType id, Fw::Time &timeTag, Fw::LogSeverity severity, Fw::LogBuffer &args) {
46 
47  // make sure ID is not zero. Zero is reserved for ID filter.
48  FW_ASSERT(id != 0);
49 
50  switch (severity) {
51  case Fw::LOG_FATAL: // always pass FATAL
52  break;
53  case Fw::LOG_WARNING_HI:
54  if (this->m_filterState[FILTER_WARNING_HI].enabled == FILTER_DISABLED) {
55  return;
56  }
57  break;
58  case Fw::LOG_WARNING_LO:
59  if (this->m_filterState[FILTER_WARNING_LO].enabled == FILTER_DISABLED) {
60  return;
61  }
62  break;
63  case Fw::LOG_COMMAND:
64  if (this->m_filterState[FILTER_COMMAND].enabled == FILTER_DISABLED) {
65  return;
66  }
67  break;
68  case Fw::LOG_ACTIVITY_HI:
69  if (this->m_filterState[FILTER_ACTIVITY_HI].enabled == FILTER_DISABLED) {
70  return;
71  }
72  break;
73  case Fw::LOG_ACTIVITY_LO:
74  if (this->m_filterState[FILTER_ACTIVITY_LO].enabled == FILTER_DISABLED) {
75  return;
76  }
77  break;
78  case Fw::LOG_DIAGNOSTIC:
79  if (this->m_filterState[FILTER_DIAGNOSTIC].enabled == FILTER_DISABLED) {
80  return;
81  }
82  break;
83  default:
84  FW_ASSERT(0,static_cast<NATIVE_INT_TYPE>(severity));
85  return;
86  }
87 
88  // check ID filters
89  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
90  if (
91  (m_filteredIDs[entry] == id) &&
92  (severity != Fw::LOG_FATAL)
93  ) {
94  return;
95  }
96  }
97 
98  // send event to the logger thread
99  this->loqQueue_internalInterfaceInvoke(id,timeTag,static_cast<QueueLogSeverity>(severity),args);
100 
101  // if connected, announce the FATAL
102  if (Fw::LOG_FATAL == severity) {
103  if (this->isConnected_FatalAnnounce_OutputPort(0)) {
104  this->FatalAnnounce_out(0,id);
105  }
106  }
107  }
108 
109  void ActiveLoggerImpl::loqQueue_internalInterfaceHandler(FwEventIdType id, Fw::Time &timeTag, QueueLogSeverity severity, Fw::LogBuffer &args) {
110 
111  // Serialize event
112  this->m_logPacket.setId(id);
113  this->m_logPacket.setTimeTag(timeTag);
114  this->m_logPacket.setLogBuffer(args);
115  this->m_comBuffer.resetSer();
116  Fw::SerializeStatus stat = this->m_logPacket.serialize(this->m_comBuffer);
117  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat,static_cast<NATIVE_INT_TYPE>(stat));
118 
119  if (this->isConnected_PktSend_OutputPort(0)) {
120  this->PktSend_out(0, this->m_comBuffer,0);
121  }
122  }
123 
124  void ActiveLoggerImpl::SET_EVENT_FILTER_cmdHandler(FwOpcodeType opCode, U32 cmdSeq, EventLevel FilterLevel, FilterEnabled FilterEnable) {
125  if ( (FilterLevel > FILTER_DIAGNOSTIC) or
126  (FilterLevel < FILTER_WARNING_HI) or
127  (FilterEnable < FILTER_ENABLED) or
128  (FilterEnable > FILTER_DISABLED)) {
129  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_VALIDATION_ERROR);
130  return;
131  }
132  this->m_filterState[FilterLevel].enabled = FilterEnable;
133  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
134  }
135 
136  void ActiveLoggerImpl::SET_ID_FILTER_cmdHandler(
137  FwOpcodeType opCode,
138  U32 cmdSeq,
139  U32 ID,
140  IdFilterEnabled IdFilterEnable
141  ) {
142 
143  // check parameter
144  switch (IdFilterEnable) {
145  case ID_ENABLED:
146  case ID_DISABLED:
147  break;
148  default:
149  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_VALIDATION_ERROR);
150  return;
151  }
152 
153  if (ID_ENABLED == IdFilterEnable) { // add ID
154  // search list for existing entry
155  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
156  if (this->m_filteredIDs[entry] == ID) {
157  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
158  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(ID);
159  return;
160  }
161  }
162  // if not already a match, search for an open slot
163  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
164  if (this->m_filteredIDs[entry] == 0) {
165  this->m_filteredIDs[entry] = ID;
166  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
167  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(ID);
168  return;
169  }
170  }
171  // if an empty slot was not found, send an error event
172  this->log_WARNING_LO_ID_FILTER_LIST_FULL(ID);
173  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_EXECUTION_ERROR);
174  } else { // remove ID
175  // search list for existing entry
176  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
177  if (this->m_filteredIDs[entry] == ID) {
178  this->m_filteredIDs[entry] = 0; // zero entry
179  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
180  this->log_ACTIVITY_HI_ID_FILTER_REMOVED(ID);
181  return;
182  }
183  }
184  // if it gets here, wasn't found
185  this->log_WARNING_LO_ID_FILTER_NOT_FOUND(ID);
186  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_EXECUTION_ERROR);
187  }
188 
189  }
190 
191  void ActiveLoggerImpl::DUMP_FILTER_STATE_cmdHandler(
192  FwOpcodeType opCode,
193  U32 cmdSeq
194  ) {
195 
196  // first, iterate through severity filters
197  for (NATIVE_INT_TYPE filter = 0; filter < EventLevel_MAX; filter++) {
198  this->log_ACTIVITY_LO_SEVERITY_FILTER_STATE(
199  static_cast<EventFilterState>(filter),
200  FILTER_ENABLED == this->m_filterState[filter].enabled
201  );
202  }
203 
204  // iterate through ID filter
205  for (NATIVE_INT_TYPE entry = 0; entry < TELEM_ID_FILTER_SIZE; entry++) {
206  if (this->m_filteredIDs[entry] != 0) {
207  this->log_ACTIVITY_HI_ID_FILTER_ENABLED(this->m_filteredIDs[entry]);
208  }
209  }
210 
211  this->cmdResponse_out(opCode,cmdSeq,Fw::COMMAND_OK);
212  }
213 
214  void ActiveLoggerImpl::pingIn_handler(
215  const NATIVE_INT_TYPE portNum,
216  U32 key
217  )
218  {
219  // return key
220  this->pingOut_out(0,key);
221  }
222 
223 } // namespace Svc
FILTER_ACTIVITY_LO_DEFAULT
@ FILTER_ACTIVITY_LO_DEFAULT
ACTIVITY LO events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:20
Fw::Time
Definition: Time.hpp:10
Fw::LogPacket::serialize
SerializeStatus serialize(SerializeBufferBase &buffer) const
serialize contents
Definition: LogPacket.cpp:20
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
FILTER_COMMAND_DEFAULT
@ FILTER_COMMAND_DEFAULT
COMMAND events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:18
FILTER_ACTIVITY_HI_DEFAULT
@ FILTER_ACTIVITY_HI_DEFAULT
ACTIVITY HI events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:19
Fw::LogBuffer
Definition: LogBuffer.hpp:22
Svc::ActiveLoggerImpl::ActiveLoggerImpl
ActiveLoggerImpl(const char *compName)
constructor
Definition: ActiveLoggerImpl.cpp:14
TELEM_ID_FILTER_SIZE
@ TELEM_ID_FILTER_SIZE
Size of telemetry ID filter.
Definition: ActiveLoggerImplCfg.hpp:26
Fw::SerializeBufferBase::resetSer
void resetSer(void)
reset to beginning of buffer to reuse for serialization
Definition: Serializable.cpp:565
FILTER_WARNING_LO_DEFAULT
@ FILTER_WARNING_LO_DEFAULT
WARNING LO events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:17
Assert.hpp
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Fw::LogPacket::setLogBuffer
void setLogBuffer(LogBuffer &buffer)
Definition: LogPacket.cpp:73
FwOpcodeType
#define FwOpcodeType
Type representation for a command opcode.
Definition: FpConfig.hpp:62
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
File.hpp
Svc
Definition: ActiveRateGroupImplCfg.hpp:18
Fw::LogPacket::setId
void setId(FwEventIdType id)
Definition: LogPacket.cpp:69
FwEventIdType
#define FwEventIdType
Type representation for a event id.
Definition: FpConfig.hpp:70
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
FILTER_DIAGNOSTIC_DEFAULT
@ FILTER_DIAGNOSTIC_DEFAULT
DIAGNOSTIC events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:21
ActiveLoggerImpl.hpp
Svc::ActiveLoggerImpl::init
void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance)
initialization function
Definition: ActiveLoggerImpl.cpp:38
Svc::ActiveLoggerImpl::~ActiveLoggerImpl
virtual ~ActiveLoggerImpl()
destructor
Definition: ActiveLoggerImpl.cpp:35
FILTER_WARNING_HI_DEFAULT
@ FILTER_WARNING_HI_DEFAULT
WARNING HI events are filtered at input.
Definition: ActiveLoggerImplCfg.hpp:16
Fw::LogPacket::setTimeTag
void setTimeTag(Fw::Time &timeTag)
Definition: LogPacket.cpp:77