/**
|
|
* @file Log.cpp
|
|
*
|
|
* Created on: 16.01.2017
|
|
* @author Piotr Dergun
|
|
*/
|
|
|
|
#include "Log.h"
|
|
|
|
Log::Log()
|
|
{
|
|
this->color = WHITE;
|
|
this->delimiter = "";
|
|
this->lineNumber = 0;
|
|
this->objectName = NULL;
|
|
this->currentLine = 0;
|
|
this->firstLine = 0;
|
|
this->writeMutex = Log::getMutex();
|
|
this->setDelay(1);
|
|
}
|
|
|
|
LOG_COLOR Log::getColor() const
|
|
{
|
|
return color;
|
|
}
|
|
|
|
void Log::setColor(LOG_COLOR color)
|
|
{
|
|
this->color = color;
|
|
}
|
|
|
|
const string& Log::getDelimiter() const
|
|
{
|
|
return delimiter;
|
|
}
|
|
|
|
void Log::setDelimiter(const string& delimiter)
|
|
{
|
|
this->delimiter = delimiter;
|
|
}
|
|
|
|
int Log::getLineNumber() const
|
|
{
|
|
return lineNumber;
|
|
}
|
|
|
|
void Log::setLineNumber(int lineNumber)
|
|
{
|
|
this->lineNumber = lineNumber;
|
|
}
|
|
|
|
string* Log::getObjectName() const
|
|
{
|
|
return objectName;
|
|
}
|
|
|
|
void Log::printProgressBar(int lineNumber, int offset, string msg,
|
|
float percent)
|
|
{
|
|
int cols, rows, bar_width, pools;
|
|
stringstream ss;
|
|
#ifndef DEBUG
|
|
if (this->getObjectName() == NULL)
|
|
return;
|
|
|
|
if (this->getDelay() == 0)
|
|
return;
|
|
|
|
getmaxyx(stdscr, rows, cols);
|
|
|
|
pthread_mutex_lock(this->writeMutex);
|
|
move(lineNumber, 0);
|
|
clrtoeol();
|
|
ss << msg << ":" << (int) (percent * 100) << "%";
|
|
bar_width = cols - ss.str().size() - offset;
|
|
pools = (int) (percent * bar_width);
|
|
|
|
if (has_colors())
|
|
attron(COLOR_PAIR(this->getColor()));
|
|
printw("%s:", msg.c_str());
|
|
if (has_colors())
|
|
attroff(COLOR_PAIR(this->getColor()));
|
|
|
|
for (int i = 0; i < offset; ++i)
|
|
printw(" ");
|
|
|
|
if (has_colors())
|
|
{
|
|
if (percent < 0.66)
|
|
attron(COLOR_PAIR(GREEN));
|
|
else if (percent < 0.90)
|
|
attron(COLOR_PAIR(YELLOW));
|
|
else
|
|
attron(COLOR_PAIR(RED));
|
|
}
|
|
attron(A_BOLD);
|
|
|
|
for (int i = 0; i < pools; ++i)
|
|
printw("#");
|
|
ss.str("");
|
|
ss << " " << (int) (percent * 100) << "%";
|
|
move(lineNumber, cols - ss.str().size());
|
|
printw(" %d%%", (int) (percent * 100));
|
|
|
|
attroff(A_BOLD);
|
|
|
|
if (has_colors())
|
|
{
|
|
if (percent < 0.66)
|
|
attroff(COLOR_PAIR(GREEN));
|
|
else if (percent < 0.90)
|
|
attroff(COLOR_PAIR(YELLOW));
|
|
else
|
|
attroff(COLOR_PAIR(RED));
|
|
}
|
|
|
|
move(0, 0);
|
|
pthread_mutex_unlock(this->writeMutex);
|
|
|
|
#else
|
|
cout << this->getObjectName()->c_str() << ": " << this->getDelimiter() << msg << endl;
|
|
#endif
|
|
}
|
|
|
|
void Log::printLine(string msg, bool force)
|
|
{
|
|
int cols, rows;
|
|
getmaxyx(stdscr, rows, cols);
|
|
|
|
if (this->currentLine > rows-3)
|
|
this->currentLine = this->firstLine;
|
|
|
|
this->print(msg, force, this->currentLine);
|
|
|
|
pthread_mutex_lock(this->writeMutex);
|
|
move(this->currentLine+1, 0);
|
|
clrtoeol();
|
|
move(0,0);
|
|
pthread_mutex_unlock(this->writeMutex);
|
|
++this->currentLine;
|
|
}
|
|
|
|
int Log::getFirstLine() const
|
|
{
|
|
return firstLine;
|
|
}
|
|
|
|
void Log::setFirstLine(int firstLine)
|
|
{
|
|
this->firstLine = firstLine;
|
|
this->currentLine = firstLine;
|
|
}
|
|
|
|
void Log::setObjectName(string* objectName)
|
|
{
|
|
this->objectName = objectName;
|
|
}
|
|
|
|
void Log::print(string msg, bool force, int customLine)
|
|
{
|
|
#ifndef DEBUG
|
|
if (this->getObjectName() == NULL)
|
|
return;
|
|
|
|
if (this->getDelay() == 0 && !force)
|
|
return;
|
|
|
|
pthread_mutex_lock(this->writeMutex);
|
|
if (customLine > -1)
|
|
move(customLine, 0);
|
|
else
|
|
move(this->getLineNumber(), 0);
|
|
clrtoeol();
|
|
|
|
if(has_colors())
|
|
attron(COLOR_PAIR(this->getColor()));
|
|
|
|
printw("%s:%s", this->getObjectName()->c_str(), this->getDelimiter().c_str());
|
|
if(has_colors())
|
|
attron(A_BOLD);
|
|
printw("%s", msg.c_str());
|
|
attroff(A_BOLD);
|
|
if(has_colors())
|
|
attroff(COLOR_PAIR(this->getColor()));
|
|
|
|
move(0, 0);
|
|
pthread_mutex_unlock(this->writeMutex);
|
|
|
|
#else
|
|
cout << this->getObjectName()->c_str() << ": " << this->getDelimiter() << msg << endl;
|
|
#endif
|
|
}
|
|
|
|
void Log::setLogParams(int lineNumber, LOG_COLOR color, string delimiter)
|
|
{
|
|
this->setLineNumber(lineNumber);
|
|
this->setColor(color);
|
|
this->setDelimiter(delimiter);
|
|
}
|
|
|
|
int Log::getDelay() const
|
|
{
|
|
return delayVal;
|
|
}
|
|
|
|
void Log::setDelay(int delay)
|
|
{
|
|
this->delayVal = delay;
|
|
}
|
|
|
|
pthread_mutex_t* Log::getMutex()
|
|
{
|
|
static pthread_mutex_t m;
|
|
static int mutex_initalized;
|
|
if (mutex_initalized != 0)
|
|
{
|
|
pthread_mutex_init(&m, NULL);
|
|
}
|
|
|
|
return &m;
|
|
}
|
|
|
|
void Log::delay(int optional)
|
|
{
|
|
int t = (optional > -1) ? optional : this->delayVal;
|
|
|
|
if (t == 0)
|
|
return;
|
|
|
|
if (t >= 10)
|
|
usleep(t);
|
|
else
|
|
sleep(t);
|
|
}
|