- added parents
- waiting request are deleted after completed successfully
This commit is contained in:
parent
c571cb8c54
commit
5ad720ecf3
4 changed files with 39 additions and 27 deletions
|
@ -24,7 +24,7 @@ AppSettings::AppSettings(QObject* parent)
|
||||||
{
|
{
|
||||||
QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
|
QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
|
||||||
|
|
||||||
this->settingsManager = new QSettings(path+"/settings.ini", QSettings::IniFormat);
|
this->settingsManager = new QSettings(path+"/settings.ini", QSettings::IniFormat, this);
|
||||||
|
|
||||||
this->setDefaultSetting("ready_en", "false");
|
this->setDefaultSetting("ready_en", "false");
|
||||||
this->setDefaultSetting("ready_delay", 0);
|
this->setDefaultSetting("ready_delay", 0);
|
||||||
|
|
|
@ -5,7 +5,7 @@ BaseConn * pGlobalBaseConn = nullptr;
|
||||||
BaseConn::BaseConn(QObject *parent) : QObject(parent)
|
BaseConn::BaseConn(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
pGlobalBaseConn = this;
|
pGlobalBaseConn = this;
|
||||||
socket = new QTcpSocket();
|
socket = new QTcpSocket(this);
|
||||||
this->setState("disconnected");
|
this->setState("disconnected");
|
||||||
|
|
||||||
connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)),
|
connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)),
|
||||||
|
@ -143,54 +143,65 @@ QVariantMap BaseConn::sendCommand(int header, QJsonValue data){
|
||||||
|
|
||||||
// generate id and witing requests entry
|
// generate id and witing requests entry
|
||||||
int thisId = nextConnectionId;
|
int thisId = nextConnectionId;
|
||||||
//qDebug() << "sending command: " << header << " with data: " << data << " and id: " << thisId;
|
qDebug() << "sending command: " << header << " with data: " << data << " and id: " << thisId;
|
||||||
nextConnectionId ++;
|
nextConnectionId ++;
|
||||||
|
|
||||||
QEventLoop loop;
|
QEventLoop *loop = new QEventLoop(this);
|
||||||
|
QTimer *timer = new QTimer(this);
|
||||||
QJsonObject reply;
|
QJsonObject reply;
|
||||||
|
|
||||||
this->waitingRequests.append({thisId, &loop, reply});
|
this->waitingRequests.append({thisId, loop, reply});
|
||||||
|
|
||||||
QJsonObject requestObj;
|
QJsonObject requestObj;
|
||||||
requestObj.insert("id", thisId);
|
requestObj.insert("id", thisId);
|
||||||
requestObj.insert("header", header);
|
requestObj.insert("header", header);
|
||||||
requestObj.insert("data", data);
|
requestObj.insert("data", data);
|
||||||
|
|
||||||
|
|
||||||
QString jsonRequest = QJsonDocument(requestObj).toJson();
|
QString jsonRequest = QJsonDocument(requestObj).toJson();
|
||||||
|
|
||||||
QTimer timer;
|
timer->setSingleShot(true);
|
||||||
|
|
||||||
timer.setSingleShot(true);
|
|
||||||
// quit the loop when the timer times out
|
// quit the loop when the timer times out
|
||||||
loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
|
loop->connect(timer, SIGNAL(timeout()), loop, SLOT(quit()));
|
||||||
// quit the loop when the connection was established
|
// quit the loop when the connection was established
|
||||||
// loop.connect(this, &BaseConn::gotReply, &loop, &QEventLoop::quit);
|
// loop.connect(this, &BaseConn::gotReply, &loop, &QEventLoop::quit);
|
||||||
// start the timer before starting to connect
|
// start the timer before starting to connect
|
||||||
timer.start(3000);
|
timer->start(3000);
|
||||||
|
|
||||||
//write data
|
//write data
|
||||||
|
|
||||||
socket->write(jsonRequest.toLatin1());
|
socket->write(jsonRequest.toLatin1());
|
||||||
|
|
||||||
//wait for an answer to finish (programm gets stuck in here)
|
//wait for an answer to finish (programm gets stuck in here)
|
||||||
loop.exec();
|
loop->exec();
|
||||||
|
|
||||||
//loop finished
|
bool replyFound = false;
|
||||||
if(timer.remainingTime() == -1){
|
|
||||||
|
// find reply and delete the request from waiting list
|
||||||
|
for(int i = 0; i<this->waitingRequests.length(); i++){
|
||||||
|
if(this->waitingRequests[i].id == thisId){
|
||||||
|
// request was found
|
||||||
|
replyFound = true;
|
||||||
|
// delete event loop
|
||||||
|
if(this->waitingRequests[i].loop != nullptr) {
|
||||||
|
delete this->waitingRequests[i].loop;
|
||||||
|
}
|
||||||
|
// store reply
|
||||||
|
reply = this->waitingRequests[i].reply;
|
||||||
|
// remove reply from waiting list
|
||||||
|
this->waitingRequests.removeAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!replyFound) {
|
||||||
|
// some internal error occured
|
||||||
|
return {{"status", 900}, {"data", ""}};
|
||||||
|
}
|
||||||
|
|
||||||
|
if(timer->remainingTime() == -1){
|
||||||
//the time has been triggered -> timeout
|
//the time has been triggered -> timeout
|
||||||
|
|
||||||
return {{"status", 911}, {"data", ""}};
|
return {{"status", 911}, {"data", ""}};
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i<this->waitingRequests.length(); i++){
|
delete timer;
|
||||||
if(this->waitingRequests[i].id == thisId){
|
|
||||||
reply = this->waitingRequests[i].reply;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop the timer as the connection has been established
|
|
||||||
timer.stop();
|
|
||||||
|
|
||||||
return {{"status", reply.value("header").toInt()}, {"data", reply.value("data").toVariant()}};
|
return {{"status", reply.value("header").toInt()}, {"data", reply.value("data").toVariant()}};
|
||||||
|
|
||||||
|
|
|
@ -15,15 +15,15 @@ ClimbingRace::ClimbingRace(QObject *parent) : QObject(parent)
|
||||||
this->state = IDLE;
|
this->state = IDLE;
|
||||||
this->mode = LOCAL;
|
this->mode = LOCAL;
|
||||||
|
|
||||||
this->appSettings = new AppSettings;
|
this->appSettings = new AppSettings(this);
|
||||||
this->baseConn = new BaseConn;
|
this->baseConn = new BaseConn(this);
|
||||||
|
|
||||||
this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress"));
|
this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress"));
|
||||||
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::baseStationStateChanged);
|
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::baseStationStateChanged);
|
||||||
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::refreshMode);
|
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::refreshMode);
|
||||||
connect(this->baseConn, &BaseConn::connectionsChanged, this, &ClimbingRace::baseStationConnectionsChanged);
|
connect(this->baseConn, &BaseConn::connectionsChanged, this, &ClimbingRace::baseStationConnectionsChanged);
|
||||||
|
|
||||||
this->speedTimers.append( new SpeedTimer );
|
this->speedTimers.append( new SpeedTimer(this) );
|
||||||
|
|
||||||
this->player = new QMediaPlayer;
|
this->player = new QMediaPlayer;
|
||||||
this->date = new QDateTime;
|
this->date = new QDateTime;
|
||||||
|
@ -31,13 +31,13 @@ ClimbingRace::ClimbingRace(QObject *parent) : QObject(parent)
|
||||||
this->nextStartActionTimer = new QTimer(this);
|
this->nextStartActionTimer = new QTimer(this);
|
||||||
nextStartActionTimer->setSingleShot(true);
|
nextStartActionTimer->setSingleShot(true);
|
||||||
|
|
||||||
this->baseStationSyncTimer = new QTimer();
|
this->baseStationSyncTimer = new QTimer(this);
|
||||||
this->baseStationSyncTimer->setInterval(100);
|
this->baseStationSyncTimer->setInterval(100);
|
||||||
this->baseStationSyncTimer->setSingleShot(true);
|
this->baseStationSyncTimer->setSingleShot(true);
|
||||||
this->baseStationSyncTimer->connect(this->baseStationSyncTimer, &QTimer::timeout, this, &ClimbingRace::syncWithBaseStation);
|
this->baseStationSyncTimer->connect(this->baseStationSyncTimer, &QTimer::timeout, this, &ClimbingRace::syncWithBaseStation);
|
||||||
this->baseStationSyncTimer->start();
|
this->baseStationSyncTimer->start();
|
||||||
|
|
||||||
this->timerTextRefreshTimer = new QTimer();
|
this->timerTextRefreshTimer = new QTimer(this);
|
||||||
this->timerTextRefreshTimer->setInterval(1);
|
this->timerTextRefreshTimer->setInterval(1);
|
||||||
this->timerTextRefreshTimer->setSingleShot(true);
|
this->timerTextRefreshTimer->setSingleShot(true);
|
||||||
this->timerTextRefreshTimer->connect(this->timerTextRefreshTimer, &QTimer::timeout, this, &ClimbingRace::refreshTimerText);
|
this->timerTextRefreshTimer->connect(this->timerTextRefreshTimer, &QTimer::timeout, this, &ClimbingRace::refreshTimerText);
|
||||||
|
@ -460,7 +460,7 @@ bool ClimbingRace::refreshRemoteTimers() {
|
||||||
|
|
||||||
foreach(QVariant remTimer, timers){
|
foreach(QVariant remTimer, timers){
|
||||||
// create a local timer for each remote timer
|
// create a local timer for each remote timer
|
||||||
this->speedTimers.append(new SpeedTimer);
|
this->speedTimers.append(new SpeedTimer(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,7 @@ QString SpeedTimer::getState(){
|
||||||
case CANCELLED:
|
case CANCELLED:
|
||||||
return("CANCELLED");
|
return("CANCELLED");
|
||||||
}
|
}
|
||||||
|
return "ERROR";
|
||||||
}
|
}
|
||||||
|
|
||||||
double SpeedTimer::getCurrTime() {
|
double SpeedTimer::getCurrTime() {
|
||||||
|
|
Reference in a new issue