Code owners
Assign users and groups as approvers for specific file changes. Learn more.
iprinter.cpp 4.48 KiB
#include "iprinter.h"
#include <QDebug>
#include <QTimer>
#include <QDateTime>
#ifdef CONSOLE
#include "cmd/console.h"
#include <cstdlib>
#include <sys/ioctl.h>
#include <unistd.h>
#endif
IPrinter::IPrinter(QObject *parent) : QObject(parent)
{
#ifdef CONSOLE //defined in .pro
//vmb (core, cam) -> ui (controller.console)
Console* console = Console::getInstance();
connect(this, SIGNAL(warning(const QString&)), console, SLOT(warning(const QString&)), Qt::DirectConnection);
connect(this, SIGNAL(error(const QString&, const int&)), console, SLOT(error(const QString&, const int&)), Qt::DirectConnection);
connect(this, SIGNAL(error(const int&)), console, SLOT(error(const int&)), Qt::DirectConnection);
connect(this, SIGNAL(info(const QString&)), console, SLOT(print(const QString&)), Qt::DirectConnection);
connect(this, SIGNAL(info(const QStringList&)), console, SLOT(print(const QStringList&)), Qt::DirectConnection);
#endif
}
IPrinter::~IPrinter()
{
}
bool IPrinter::f(const VmbErrorType& ret, const QString& msg)
{
// vimba function wrapper to test return type and potentially emit error message or successmsg
// returns true on error
// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " ret:" << ret << " msg:" << msg;
if ( VmbErrorSuccess == ret )
{
if (! msg.isEmpty())
emit info(msg);
return false;
}
else
{
if (! msg.isEmpty())
emit info("Fail! " + msg);
emit error(ret);
return true;
}
}
void IPrinter::g(const VmbErrorType& ret, const QString& msg)
{
//vimba function wrapper - throws exception on error - to declutter error handling code
if( f(ret,msg) )
throw std::runtime_error("Error: " + msg.toStdString());
}
void IPrinter::print(const QStringList& name)
{
emit info(name);
}
void IPrinter::print(const QString& name)
{
emit info(name);
}
void IPrinter::print(const QString& name, const VmbInt64_t& val)
{
// if( val != 0 )
// emit info(QString("%1: %2").arg(name).arg(val));
emit info(name + ": " + QString::number(val));
}
void IPrinter::print(const QString& name, const double& val)
{
emit info(name + ": " + QString::number(val));
}
void IPrinter::print(const QString& name, const bool& val)
{
emit info(name + ": " + QString::number(val));
}
void IPrinter::print(const QString& name, const std::string& val)
{
emit info(name + ": " + QString::fromStdString(val));
}
void IPrinter::print(const char* name)
{
emit info(QString::fromLocal8Bit(name));
}
void IPrinter::print(const char* name, const VmbInt64_t& val)
{
emit info(QString::fromLocal8Bit(name) + ": " + QString::number(val));
}
void IPrinter::print(const char* name, const QString& val)
{
emit info(QString::fromLocal8Bit(name) + ": " + val);
}
void IPrinter::print(const char* name, const seconds& val)
{
emit info(QString::fromLocal8Bit(name) + ": " + QString::number(val.count()) + "s");
}
QString IPrinter::progressBar(QTimer* timer, int width)
{
int total_ms = timer->interval();
int remaining_ms = timer->remainingTime();
auto elapsed_ms = total_ms - remaining_ms;
int progressInPercent = ((double) elapsed_ms / (double)total_ms) * 100;
//print in minutes and secs
QString s1 = QString( formatTime(elapsed_ms) + " < " + formatTime(remaining_ms));
QString s2 = QString::number(progressInPercent) + "% " + progressBar(progressInPercent,width); // auto keyword leads to segfault here...
// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << s2;
return s1 + " " + s2;
}
QString IPrinter::progressBar(int percentage, int width)
{
if (width == 0)
width = getTerminalWidth();
width-=2;
int pos_progress = width*(percentage/100.0);
QString left = QString("=").repeated(pos_progress);
QString right = QString(" ").repeated(width-pos_progress);
return QString("[%1%2]").arg(left).arg(right);
}
int IPrinter::getTerminalWidth()
{
struct winsize w;
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == -1)
{
error("ioctl: get terminal width failed");
return 42; // default fallback
}
return w.ws_col;
}
QString IPrinter::formatTime(const int& milliseconds)
{
int total_seconds = milliseconds / 1000;
int hours = total_seconds / 3600;
int minutes = (total_seconds % 3600) / 60;
int seconds = total_seconds % 60;
if( hours == 0 && minutes == 0 )
return QString::asprintf("%02ds", seconds);
else if( hours == 0 )
return QString::asprintf("%02dm:%02ds", minutes, seconds);
else
return QString::asprintf("%02dh:%02dm:%02ds", hours, minutes, seconds);
}
QString IPrinter::curDateTime()
{
QDateTime currentDateTime = QDateTime::currentDateTime();
return currentDateTime.toString("yyMMdd-HHmmss");
}