Skip to content
Snippets Groups Projects
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");
}