Skip to content
Snippets Groups Projects
Commit 4539f88e authored by am0ebe's avatar am0ebe
Browse files

console: interpret user input as number, line or single char! => fix set duration, fix setcam ID -1

parent b94a5984
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,8 @@
#include <iostream>
#include <math.h>
Console::Console(): QObject() {}; // Private constructor to prevent instantiation
Console* Console::getInstance() {
static Console* instance = new Console; // Static local variable ensures single instance
return instance;
......@@ -20,37 +22,27 @@ void Console::listenKeys()
{
// listen to keyevents in endless loop
/* This is an expensive or blocking operation, why we use threaded approach to not block main event loop! */
std::string line;
std::string input;
forever
{
std::getline(std::cin, line);
emit keyPressed(line[0]);
if( line[0] == 'q' )
break;
std::getline(std::cin, input);
if (!input.empty() && input.find_first_not_of("0123456789") == std::string::npos)
{
emit numberEntered(std::stoi(input)); // Number
}
else if (input.size() == 1)
{
emit keyPressed(input[0]); // Single char (excluding single digits)
if( input[0] == 'q' )
break;
}
else
{
emit lineEntered(QString::fromStdString(input)); // Line
}
}
}
// read line from cin
QString Console::getLine()
{
std::string line;
std::getline(std::cin, line);
// emit lineEntered(QString::fromStdString(line));
return QString::fromStdString(line);
}
// read number from cin
int Console::getNumber()
{
int number;
std::cin >> number;
// emit numberEntered(number);
return number;
}
void Console::error(const int& errCode )
{
if( errCode )
......@@ -113,13 +105,17 @@ void Console::printHelp()
// ###############################
// Controller
Controller::Controller()
Controller::Controller() :
getDur(false)
{
auto console = Console::getInstance();
console->moveToThread(&thread);
connect(&thread, &QThread::finished, console, &QObject::deleteLater);
connect(this, &Controller::operate, console, &Console::listenKeys);
connect(console, &Console::keyPressed, this, &Controller::keyPress);
connect(console, &Console::keyPressed, this, &Controller::onKeyPressed);
connect(console, &Console::lineEntered, this, &Controller::onLineEntered);
connect(console, &Console::numberEntered, this, &Controller::onNumberEntered);
QTimer::singleShot(0, this, SIGNAL(operate()));
thread.start();
......@@ -132,57 +128,69 @@ Controller::~Controller()
// qDebug().noquote() << __FUNCTION__ << "():" << __LINE__ << ": ";
}
void Controller::keyPress(const QChar& key)
void Controller::onKeyPressed(const QChar& key)
{
auto console = Console::getInstance();
qDebug().noquote() << __FUNCTION__ << ": " << key;
if ( key.isDigit() )
{
emit cam(key.digitValue()-1);
}
else
switch (key.unicode())
{
int dur;
switch (key.unicode())
{
// XXX add new func
case 'h':
console->printHelp();
break;
// XXX add new func
case 'h':
console->printHelp();
break;
case 'd':
console->print("Enter duration in seconds: ");
dur = console->getNumber(); // XXX not thread safe? + interferes with forever loop?
emit setDuration(dur);
break;
case 'd':
console->print("Enter duration in seconds: ");
getDur = true;
break;
case 'c':
emit closeCam();
break;
case 'c':
emit closeCam();
break;
case 'o':
emit openCam();
break;
case 'o':
emit openCam();
break;
case 'l':
emit listCams();
break;
case 'l':
emit listCams();
break;
case 'r':
emit startRecording();
break;
case 'r':
emit startRecording();
break;
case 't':
emit stopRecording();
break;
case 't':
emit stopRecording();
break;
case 'v':
console->printVersion();
break;
case 'v':
console->printVersion();
break;
case 'q':
qApp->quit();
break;
}
case 'q':
qApp->quit();
break;
}
}
void Controller::onLineEntered(const QString&)
{
// qDebug().noquote() << "Line entered: " << line;
}
void Controller::onNumberEntered(int number)
{
// qDebug().noquote() << "Number entered: " << number;
if( getDur )
{
emit setDuration(number);
getDur = false;
}
else
{
emit cam(number-1);
}
}
......@@ -18,12 +18,11 @@ public:
Console& operator=(const Console&) = delete;
private:
Console() : QObject(){}; //// Private constructor to prevent instantiation
Console();
public slots:
void listenKeys();
QString getLine();
int getNumber();
void error(const QString&,const int&);
void error(const int&);
void print(const QString&);
......@@ -35,8 +34,8 @@ public slots:
signals:
void keyPressed(const QChar &key);
// void lineEntered(const QString&);
// void numberEntered(const int&);
void lineEntered(const QString&);
void numberEntered(const int&);
};
......@@ -51,7 +50,9 @@ class Controller : public QObject
~Controller();
public slots:
void keyPress(const QChar &);
void onKeyPressed(const QChar &);
void onLineEntered(const QString& line);
void onNumberEntered(int number);
signals:
// to UI
......@@ -71,4 +72,7 @@ class Controller : public QObject
// void storeSettings();
// ... more signals here, new func XXX
private:
bool getDur;
};
......@@ -204,5 +204,6 @@ void Core::stopRecording()
void Core::setDuration(int dur)
{
qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
_recDuration = seconds(dur);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment