F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
ActiveTextLoggerImpl.cpp
Go to the documentation of this file.
1 // \copyright
2 // Copyright 2009-2015, by the California Institute of Technology.
3 // ALL RIGHTS RESERVED. United States Government Sponsorship
4 // acknowledged.
5 
7 #include <Fw/Types/Assert.hpp>
8 #include <Fw/Logger/Logger.hpp>
9 #include <ctime>
10 
11 namespace Svc {
12 
13  // ----------------------------------------------------------------------
14  // Initialization/Exiting
15  // ----------------------------------------------------------------------
16 
18  ActiveTextLoggerComponentBase(name),
19  m_log_file()
20  {
21 
22  }
23 
25  {
26 
27  }
28 
30  {
31  ActiveTextLoggerComponentBase::init(queueDepth,instance);
32  }
33 
34  // ----------------------------------------------------------------------
35  // Handlers to implement for typed input ports
36  // ----------------------------------------------------------------------
37 
38  void ActiveTextLoggerComponentImpl::TextLogger_handler(NATIVE_INT_TYPE portNum,
39  FwEventIdType id,
40  Fw::Time &timeTag,
41  const Fw::LogSeverity& severity,
42  Fw::TextLogString &text)
43  {
44 
45  // Currently not doing any input filtering
46  // TKC - 5/3/2018 - remove diagnostic
47  if (Fw::LogSeverity::DIAGNOSTIC == severity.e) {
48  return;
49  }
50 
51  // Format the string here, so that it is done in the task context
52  // of the caller. Format doc borrowed from PassiveTextLogger.
53  const char *severityString = "UNKNOWN";
54  switch (severity.e) {
55  case Fw::LogSeverity::FATAL:
56  severityString = "FATAL";
57  break;
58  case Fw::LogSeverity::WARNING_HI:
59  severityString = "WARNING_HI";
60  break;
61  case Fw::LogSeverity::WARNING_LO:
62  severityString = "WARNING_LO";
63  break;
64  case Fw::LogSeverity::COMMAND:
65  severityString = "COMMAND";
66  break;
67  case Fw::LogSeverity::ACTIVITY_HI:
68  severityString = "ACTIVITY_HI";
69  break;
70  case Fw::LogSeverity::ACTIVITY_LO:
71  severityString = "ACTIVITY_LO";
72  break;
73  case Fw::LogSeverity::DIAGNOSTIC:
74  severityString = "DIAGNOSTIC";
75  break;
76  default:
77  severityString = "SEVERITY ERROR";
78  break;
79  }
80 
81  // TODO: Add calling task id to format string
83 
84  if (timeTag.getTimeBase() == TB_WORKSTATION_TIME) {
85 
86  time_t t = timeTag.getSeconds();
87  // Using localtime_r prevents any other calls to localtime (from another thread for example) from
88  // interfering with our time object before we use it. However, the null pointer check is still needed
89  // to ensure a successful call
90  tm tm;
91  if (localtime_r(&t, &tm) == nullptr) {
92  return;
93  }
94 
95  (void) snprintf(textStr,
97  "EVENT: (%d) (%04d-%02d-%02dT%02d:%02d:%02d.%03u) %s: %s\n",
98  id, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
99  tm.tm_min,tm.tm_sec,timeTag.getUSeconds(),
100  severityString,text.toChar());
101  }
102  else {
103 
104  (void) snprintf(textStr,
106  "EVENT: (%d) (%d:%d,%d) %s: %s\n",
107  id,timeTag.getTimeBase(),timeTag.getSeconds(),timeTag.getUSeconds(),severityString,text.toChar());
108  }
109 
110  // Call internal interface so that everything else is done on component thread,
111  // this helps ensure consistent ordering of the printed text:
112  Fw::InternalInterfaceString intText(textStr);
113  this->TextQueue_internalInterfaceInvoke(intText);
114  }
115 
116  // ----------------------------------------------------------------------
117  // Internal interface handlers
118  // ----------------------------------------------------------------------
119 
120  void ActiveTextLoggerComponentImpl::TextQueue_internalInterfaceHandler(const Fw::InternalInterfaceString& text)
121  {
122 
123  // Print to console:
124  Fw::Logger::logMsg(text.toChar(),0,0,0,0,0,0,0,0,0);
125 
126  // Print to file if there is one:
127  (void) this->m_log_file.write_to_log(text.toChar(), text.length()); // Ignoring return status
128 
129  }
130 
131  // ----------------------------------------------------------------------
132  // Helper Methods
133  // ----------------------------------------------------------------------
134 
135  bool ActiveTextLoggerComponentImpl::set_log_file(const char* fileName, const U32 maxSize, const U32 maxBackups)
136  {
137  FW_ASSERT(fileName != nullptr);
138 
139  return this->m_log_file.set_log_file(fileName, maxSize, maxBackups);
140  }
141 
142 
143 } // namespace Svc
Fw::InternalInterfaceString
Definition: InternalInterfaceString.hpp:11
Fw::TextLogString
Definition: TextLogString.hpp:11
Fw::Time
Definition: Time.hpp:10
Fw::Time::getSeconds
U32 getSeconds() const
Definition: Time.cpp:134
Fw::StringBase::length
NATIVE_UINT_TYPE length() const
Get length of string.
Definition: StringType.cpp:123
Svc::LogFile::set_log_file
bool set_log_file(const char *fileName, const U32 maxSize, const U32 maxBackups=10)
Set log file and max size.
Definition: LogFile.cpp:80
Fw::Time::getUSeconds
U32 getUSeconds() const
Definition: Time.cpp:138
Svc::ActiveTextLoggerComponentImpl::ActiveTextLoggerComponentImpl
ActiveTextLoggerComponentImpl(const char *compName)
Component constructor.
Definition: ActiveTextLoggerImpl.cpp:17
Assert.hpp
Fw::TextLogString::toChar
const char * toChar() const
Definition: TextLogString.cpp:47
Svc::ActiveTextLoggerComponentImpl::~ActiveTextLoggerComponentImpl
virtual ~ActiveTextLoggerComponentImpl()
Component destructor.
Definition: ActiveTextLoggerImpl.cpp:24
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:8
Svc::ActiveTextLoggerComponentImpl::set_log_file
bool set_log_file(const char *fileName, const U32 maxSize, const U32 maxBackups=10)
Set log file and max size.
Definition: ActiveTextLoggerImpl.cpp:135
ActiveTextLoggerImpl.hpp
Svc::LogFile::write_to_log
bool write_to_log(const char *const buf, const U32 size)
Write the passed buf to the log if possible.
Definition: LogFile.cpp:39
Fw::Logger::logMsg
static void logMsg(const char *fmt, POINTER_CAST a0=0, POINTER_CAST a1=0, POINTER_CAST a2=0, POINTER_CAST a3=0, POINTER_CAST a4=0, POINTER_CAST a5=0, POINTER_CAST a6=0, POINTER_CAST a7=0, POINTER_CAST a8=0, POINTER_CAST a9=0)
Definition: Logger.cpp:18
Fw::Time::getTimeBase
TimeBase getTimeBase() const
Definition: Time.cpp:142
Svc
Definition: ActiveRateGroupImplCfg.hpp:18
TB_WORKSTATION_TIME
@ TB_WORKSTATION_TIME
Time as reported on workstation where software is running. For testing.
Definition: FpConfig.hpp:327
Fw::InternalInterfaceString::toChar
const char * toChar() const
gets char buffer
Definition: InternalInterfaceString.cpp:48
FwEventIdType
#define FwEventIdType
Type representation for an event id.
Definition: FpConfig.hpp:66
FW_INTERNAL_INTERFACE_STRING_MAX_SIZE
#define FW_INTERNAL_INTERFACE_STRING_MAX_SIZE
Max size of interface string parameter type.
Definition: FpConfig.hpp:282
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Logger.hpp
Svc::ActiveTextLoggerComponentImpl::init
void init(NATIVE_INT_TYPE queueDepth, NATIVE_INT_TYPE instance=0)
Component initialization routine.
Definition: ActiveTextLoggerImpl.cpp:29