Files
GUI/src/device/DmsSyncAction.cpp

84 lines
2.1 KiB
C++

#include "DmsSyncAction.h"
#include "dms_mq.h"
#include <QEventLoop>
#include <QTimer>
namespace
{
const int TIMEOUT_MSEC = 500;
}
DmsSyncAction::DmsSyncAction(int aServerId, int aActionId, QObject* aObject, const QString& aSignal, QObject* aParent)
: QObject(aParent)
, mServerId(aServerId)
, mActionId(aActionId)
, mLoop(new QEventLoop(this))
, mTimer(new QTimer(this))
, mObject(aObject)
, mSignal(aSignal)
, mTimeoutMsec(TIMEOUT_MSEC)
, mSendData()
, mActionResult()
, mIsResponsed(false)
{
mTimer->setSingleShot(true);
connect(mObject, ("2" + mSignal).toStdString().c_str(), this, SLOT(saveActionResult(const QString&)));
connect(mObject, ("2" + mSignal).toStdString().c_str(), mLoop, SLOT(quit()));
connect(mTimer, &QTimer::timeout, mLoop, &QEventLoop::quit);
}
DmsSyncAction::~DmsSyncAction()
{
disconnect(mObject, ("2" + mSignal).toStdString().c_str(), mLoop, SLOT(quit()));
disconnect(mObject, ("2" + mSignal).toStdString().c_str(), this, SLOT(saveActionResult(const QString&)));
disconnect(mTimer, &QTimer::timeout, mLoop, &QEventLoop::quit);
}
DmsSyncActionResult DmsSyncAction::execute()
{
mIsResponsed = false;
QByteArray byteArray = mSendData.toUtf8();
uint8_t* data = reinterpret_cast<uint8_t*>(byteArray.data());
if(dmsmq_send(mServerId, mActionId, data, byteArray.size()) < 0)
{
DmsSyncActionResult result(false, "mq error");
return result;
}
if(!waitUntilSignalReceived())
{
DmsSyncActionResult result(false, "time out");
return result;
}
return DmsSyncActionResult(true, mActionResult);
}
void DmsSyncAction::saveActionResult(const QString& aResult)
{
mActionResult = aResult;
}
void DmsSyncAction::setSendData(const QString& aData)
{
mSendData = aData;
}
bool DmsSyncAction::waitUntilSignalReceived()
{
mTimer->start(mTimeoutMsec);
mLoop->exec();
if(!mIsResponsed)
{
return false;
}
return true;
}
void DmsSyncAction::responsed()
{
if(mTimer->isActive())
{
mIsResponsed = true;
}
}