F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
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 
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