service interface stream enhancements

This commit is contained in:
Robin Müller 2020-05-29 20:31:08 +02:00
parent cb14ec15b5
commit e5cea3ead0
4 changed files with 47 additions and 22 deletions

View File

@ -23,14 +23,16 @@ int ServiceInterfaceBuffer::sync(void) {
if (this->isActive) { if (this->isActive) {
Clock::TimeOfDay_t loggerTime; Clock::TimeOfDay_t loggerTime;
Clock::getDateAndTime(&loggerTime); Clock::getDateAndTime(&loggerTime);
char preamble[96] = { 0 }; std::string preamble;
sprintf(preamble, "%s: | %lu:%02lu:%02lu.%03lu | ", if(addCrToPreamble) {
this->log_message.c_str(), (unsigned long) loggerTime.hour, preamble += "\r";
(unsigned long) loggerTime.minute, }
(unsigned long) loggerTime.second, preamble += log_message + ": | " + zero_padded(loggerTime.hour, 2)
(unsigned long) loggerTime.usecond /1000); + ":" + zero_padded(loggerTime.minute, 2) + ":"
+ zero_padded(loggerTime.second, 2) + "."
+ zero_padded(loggerTime.usecond/1000, 3) + " | ";
// Write log_message and time // Write log_message and time
this->putChars(preamble, preamble + sizeof(preamble)); this->putChars(preamble.c_str(), preamble.c_str() + preamble.size());
// Handle output // Handle output
this->putChars(pbase(), pptr()); this->putChars(pbase(), pptr());
} }
@ -39,9 +41,13 @@ int ServiceInterfaceBuffer::sync(void) {
return 0; return 0;
} }
#ifndef UT699 #ifndef UT699
ServiceInterfaceBuffer::ServiceInterfaceBuffer(std::string set_message, uint16_t port) { ServiceInterfaceBuffer::ServiceInterfaceBuffer(std::string set_message,
uint16_t port, bool addCrToPreamble) {
this->addCrToPreamble = addCrToPreamble;
this->log_message = set_message; this->log_message = set_message;
this->isActive = true; this->isActive = true;
setp( buf, buf + BUF_SIZE ); setp( buf, buf + BUF_SIZE );
@ -55,17 +61,19 @@ void ServiceInterfaceBuffer::putChars(char const* begin, char const* end) {
} }
memcpy(array, begin, length); memcpy(array, begin, length);
for( ; begin != end; begin++){ for(; begin != end; begin++){
printChar(begin); printChar(begin);
} }
} }
#endif #endif
#ifdef UT699 #ifdef UT699
#include <framework/osal/rtems/Interrupt.h> #include <framework/osal/rtems/Interrupt.h>
ServiceInterfaceBuffer::ServiceInterfaceBuffer(std::string set_message, uint16_t port) { ServiceInterfaceBuffer::ServiceInterfaceBuffer(std::string set_message,
uint16_t port) {
this->log_message = set_message; this->log_message = set_message;
this->isActive = true; this->isActive = true;
setp( buf, buf + BUF_SIZE ); setp( buf, buf + BUF_SIZE );

View File

@ -2,32 +2,36 @@
#define FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACEBUFFER_H_ #define FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACEBUFFER_H_
#include <iostream> #include <iostream>
#include <iosfwd>
#include <sstream> #include <sstream>
#include <cstdio> #include <cstdio>
#include <iomanip>
#ifndef UT699 #ifndef UT699
class ServiceInterfaceBuffer: public std::basic_streambuf<char, class ServiceInterfaceBuffer:
std::char_traits<char> > { public std::basic_streambuf<char,std::char_traits<char>> {
friend class ServiceInterfaceStream; friend class ServiceInterfaceStream;
public: public:
ServiceInterfaceBuffer(std::string set_message, uint16_t port); ServiceInterfaceBuffer(std::string set_message, uint16_t port,
bool addCrToPreamble);
protected: protected:
bool isActive; bool isActive;
// This is called when buffer becomes full. If // This is called when buffer becomes full. If
// buffer is not used, then this is called every // buffer is not used, then this is called every
// time when characters are put to stream. // time when characters are put to stream.
virtual int overflow(int c = Traits::eof()); int overflow(int c = Traits::eof()) override;
// This function is called when stream is flushed, // This function is called when stream is flushed,
// for example when std::endl is put to stream. // for example when std::endl is put to stream.
virtual int sync(void); int sync(void) override;
private: private:
// For additional message information // For additional message information
std::string log_message; std::string log_message;
// For EOF detection // For EOF detection
typedef std::char_traits<char> Traits; typedef std::char_traits<char> Traits;
// This is useful for some terminal programs which do not have
// implicit carriage return with newline characters.
bool addCrToPreamble;
// Work in buffer mode. It is also possible to work without buffer. // Work in buffer mode. It is also possible to work without buffer.
static size_t const BUF_SIZE = 128; static size_t const BUF_SIZE = 128;
@ -35,6 +39,18 @@ private:
// In this function, the characters are parsed. // In this function, the characters are parsed.
void putChars(char const* begin, char const* end); void putChars(char const* begin, char const* end);
template<typename T>
std::string zero_padded(const T& num, uint8_t width) {
std::ostringstream string_to_pad;
string_to_pad << std::setw(width) << std::setfill('0') << num;
std::string result = string_to_pad.str();
if (result.length() > width)
{
result.erase(0, result.length() - width);
}
return result;
}
}; };
#endif #endif

View File

@ -5,7 +5,7 @@ void ServiceInterfaceStream::setActive( bool myActive) {
} }
ServiceInterfaceStream::ServiceInterfaceStream(std::string set_message, ServiceInterfaceStream::ServiceInterfaceStream(std::string set_message,
uint16_t port) : bool addCrToPreamble, uint16_t port) :
std::basic_ostream<char, std::char_traits<char> >(&buf), buf( std::basic_ostream<char, std::char_traits<char>>(&buf),
set_message, port) { buf(set_message, port, addCrToPreamble) {
} }

View File

@ -17,14 +17,15 @@ extern std::ostream error;
} }
class ServiceInterfaceStream : public std::basic_ostream< char, std::char_traits< char > > { class ServiceInterfaceStream :
public std::basic_ostream<char, std::char_traits<char>> {
protected: protected:
ServiceInterfaceBuffer buf; ServiceInterfaceBuffer buf;
public: public:
ServiceInterfaceStream( std::string set_message, uint16_t port = 1234 ); ServiceInterfaceStream( std::string set_message,
bool addCrToPreamble = false, uint16_t port = 1234);
void setActive( bool ); void setActive( bool );
}; };
#endif /* FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACESTREAM_H_ */ #endif /* FRAMEWORK_SERVICEINTERFACE_SERVICEINTERFACESTREAM_H_ */