diff --git a/Servo/include/ModbusMaster.h b/Servo/include/ModbusMaster.h index 22c454a..c2201a0 100644 --- a/Servo/include/ModbusMaster.h +++ b/Servo/include/ModbusMaster.h @@ -20,6 +20,7 @@ class ModbusMaster : public QObject private: bool _initialized = false; + bool _connected = false; QModbusClient* _modbusDevice = nullptr; int _clientAddress; QModbusDataUnit _modbusReplyUnit; @@ -38,12 +39,14 @@ public: quint16 writeSize); + //uncrustify off public slots: //uncrustify on void init(ExpConfig& expConfig); void connectToDevice(ModbusConfig modbusConfig, ExpConfig& expConfig); void connectionStateChanged(QModbusDevice::State state); + bool getConnectionState(); QBitArray getCoil(int startAddress, quint16 readSize, ExpConfig& expConfig); QBitArray getInputCoil(int startAddress, quint16 readSize, ExpConfig& expConfig); diff --git a/Servo/include/ModbusWrapper.h b/Servo/include/ModbusWrapper.h index e2ee254..b548c7b 100644 --- a/Servo/include/ModbusWrapper.h +++ b/Servo/include/ModbusWrapper.h @@ -31,11 +31,12 @@ public: void setMultipleCoil(int startAddress, quint16 writeSize, QBitArray coilFlags); void setSingleRegister(int startAddress, quint16 registerValue); void setMultipleRegister(int startAddress, quint16 writeSize, QVector registerValues); - + bool getStatus(); signals: void connectOrder(ModbusConfig modbusConfig, ExpConfig& expConfig); void initOrder(ExpConfig& expConfig); void closeOrder(); + bool getConnectionStateOrder(); QBitArray getCoilOrder(int startAddress, quint16 readSize, ExpConfig& expConfig); QBitArray getInputCoilOrder(int startAddress, quint16 readSize, ExpConfig& expConfig); diff --git a/Servo/include/ServoController.h b/Servo/include/ServoController.h index 125470e..b0b712f 100644 --- a/Servo/include/ServoController.h +++ b/Servo/include/ServoController.h @@ -11,14 +11,14 @@ private: const int SRV_START_ANGLE_INT_PART_REG = 2000; const int SRV_STOP_ANGLE_INT_PART_REG = 2001; const int SRV_AZIMUTH_SPEED_REG = 2002; - const int SRV_APPLY_SETTING_REG = 2003; //2004; - const int SRV_START_STOP_REG = 2004; //2005; - const int SRV_ZERO_OFFSET_ANGLE = 2005; //2007; - const int SRV_START_ANGLE_FRAC_PART_REG = 2006; //2010; - const int SRV_STOP_ANGLE_FRAC_PART_REG = 2007; //2011; - const int SRV_CALIBRATE_REG = 2008; //2013; - const int SRV_ENABLE_DRIVE_REG = 2009; //2017; - const int SRV_AZIMUTH_REG = 2010; //2030; + const int SRV_APPLY_SETTING_REG = 2004; + const int SRV_START_STOP_REG = 2005; + const int SRV_ZERO_OFFSET_ANGLE = 2007; + const int SRV_START_ANGLE_FRAC_PART_REG = 2010; + const int SRV_STOP_ANGLE_FRAC_PART_REG = 2011; + const int SRV_CALIBRATE_REG = 2013; + const int SRV_ENABLE_DRIVE_REG = 2017; + const int SRV_AZIMUTH_REG = 2030; const double SRV_ANGLE_FACTOR = 100.0; const double SRV_SPEED_FACTOR = 1000.0; diff --git a/Servo/src/ModbusMaster.cpp b/Servo/src/ModbusMaster.cpp index 591201c..5cffa40 100644 --- a/Servo/src/ModbusMaster.cpp +++ b/Servo/src/ModbusMaster.cpp @@ -19,8 +19,8 @@ void ModbusMaster::init(ExpConfig& expConfig) connect(_modbusDevice, &QModbusClient::errorOccurred, [this](QModbusDevice::Error) { - _initialized = false; - throw ServoException(_modbusDevice->errorString()); + _initialized = false; + throw ServoException(_modbusDevice->errorString()); }); connect(_modbusDevice, @@ -48,7 +48,11 @@ void ModbusMaster::connectionStateChanged(QModbusDevice::State state) { if(state == QModbusDevice::UnconnectedState) { - throw ServoException("Connection wasnt prepared"); + _connected = false; + } + else if (state == QModbusDevice::ConnectedState) + { + _connected = true; } } @@ -110,6 +114,7 @@ QBitArray ModbusMaster::getCoil(int startAddress, quint16 readSize, ExpConfig& e { expConfig.valid = true; expConfig.message = ex.getMessage(); + return QBitArray(); } } @@ -138,6 +143,7 @@ QBitArray ModbusMaster::getInputCoil(int startAddress, quint16 readSize, ExpConf { expConfig.valid = true; expConfig.message = ex.getMessage(); + return QBitArray(); } } @@ -166,6 +172,7 @@ QVector ModbusMaster::getHoldingRegister(int startAddress, { expConfig.valid = true; expConfig.message = ex.getMessage(); + return QVector(); } } @@ -194,6 +201,7 @@ QVector ModbusMaster::getInputRegister(int startAddress, { expConfig.valid = true; expConfig.message = ex.getMessage(); + return QVector(); } } @@ -308,16 +316,20 @@ void ModbusMaster::readRequest(QModbusDataUnit::RegisterType registerType, void ModbusMaster::checkForError(QModbusReply* _reply) { if(_reply->error() == QModbusDevice::NoError) + { + _connected = true; return; - + } if(_reply->error() == QModbusDevice::ProtocolError) { - throw ServoException(QString("Read response error: %1 (Mobus exception: %2)") + _connected = false; + throw ServoException(QString("Read response error: %1 (Modbus exception: %2)") .arg(_reply->errorString()) .arg(_reply->rawResult().exceptionCode())); } else { + _connected = false; throw ServoException(QString("Read response error: %1 (code: %2)") .arg(_reply->errorString()) .arg(_reply->error())); @@ -363,9 +375,16 @@ void ModbusMaster::writeRequest(QModbusDataUnit::RegisterType registerType, } } +/*************************************************************************************************/ +bool ModbusMaster::getConnectionState() +{ + return _connected; +} + +/*************************************************************************************************/ void ModbusMaster::close() { - qDebug() << " ModbusMaster::close " <state() == QModbusDevice::ConnectedState || _modbusDevice->state() == QModbusDevice::ConnectingState) diff --git a/Servo/src/ModbusWrapper.cpp b/Servo/src/ModbusWrapper.cpp index ba77a2c..12c30d5 100644 --- a/Servo/src/ModbusWrapper.cpp +++ b/Servo/src/ModbusWrapper.cpp @@ -23,6 +23,11 @@ void ModbusWrapper::init() connect(&_workerThread, &QThread::started, &loop, &QEventLoop::quit); loop.exec(); + connect(this, + &ModbusWrapper::getConnectionStateOrder, + &_modbusMaster, + &ModbusMaster::getConnectionState, + Qt::BlockingQueuedConnection); connect(this, &ModbusWrapper::initOrder, &_modbusMaster, @@ -97,6 +102,55 @@ void ModbusWrapper::close() emit closeOrder(); _workerThread.quit(); _workerThread.wait(); + disconnect(this, + &ModbusWrapper::getConnectionStateOrder, + &_modbusMaster, + &ModbusMaster::getConnectionState); + disconnect(this, + &ModbusWrapper::initOrder, + &_modbusMaster, + &ModbusMaster::init); + disconnect(this, + &ModbusWrapper::connectOrder, + &_modbusMaster, + &ModbusMaster::connectToDevice); + disconnect(this, + &ModbusWrapper::getCoilOrder, + &_modbusMaster, + &ModbusMaster::getCoil); + disconnect(this, + &ModbusWrapper::getInputCoilOrder, + &_modbusMaster, + &ModbusMaster::getInputCoil); + disconnect(this, + &ModbusWrapper::getHoldingRegisterOrder, + &_modbusMaster, + &ModbusMaster::getHoldingRegister); + disconnect(this, + &ModbusWrapper::getInputRegisterOrder, + &_modbusMaster, + &ModbusMaster::getInputRegister); + + disconnect(this, + &ModbusWrapper::setSingleCoilOrder, + &_modbusMaster, + &ModbusMaster::setSingleCoil); + disconnect(this, + &ModbusWrapper::setMultipleCoilOrder, + &_modbusMaster, + &ModbusMaster::setMultipleCoil); + disconnect(this, + &ModbusWrapper::setSingleRegisterOrder, + &_modbusMaster, + &ModbusMaster::setSingleRegister); + disconnect(this, + &ModbusWrapper::setMultipleRegisterOrder, + &_modbusMaster, + &ModbusMaster::setMultipleRegister); + disconnect(this, + &ModbusWrapper::closeOrder, + &_modbusMaster, + &ModbusMaster::close); } } @@ -200,6 +254,12 @@ void ModbusWrapper::setMultipleRegister(int startAddress, } } +/*************************************************************************************************/ +bool ModbusWrapper::getStatus() +{ + return emit getConnectionStateOrder(); +} + /*************************************************************************************************/ void ModbusWrapper::connectToDevice(ModbusConfig modbusConfig) { diff --git a/Servo/src/ServoController.cpp b/Servo/src/ServoController.cpp index f3b0ef9..84ef272 100644 --- a/Servo/src/ServoController.cpp +++ b/Servo/src/ServoController.cpp @@ -160,12 +160,5 @@ double ServoController::getAzimuth() /*************************************************************************************************/ bool ServoController::getStatus() { - try { - getSpeed(); - return true; - - } catch (ServoException ex) { - _modbusWrapper.close(); - return false; - } + return _modbusWrapper.getStatus(); } diff --git a/Test/MainWindow.cpp b/Test/MainWindow.cpp index f4b0aa8..68b519b 100644 --- a/Test/MainWindow.cpp +++ b/Test/MainWindow.cpp @@ -1,5 +1,6 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include "QtConcurrent/QtConcurrent" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) @@ -16,11 +17,6 @@ MainWindow::MainWindow(QWidget* parent) /*************************************************************************************************/ MainWindow::~MainWindow() { - if (timer->isActive()) - { - timer->stop(); - delete timer; - } delete ui; } @@ -200,19 +196,12 @@ void MainWindow::on_writeMultiRegister_clicked() void MainWindow::on_init_clicked() { try { + ui->showServoError->setText(""); _servoControler.init(ui->serialPortServo->text()); - timer = new QTimer(); - timer->setInterval(2000); - timer->start(); - connect(timer, &QTimer::timeout, this, &MainWindow::handleGetRequestFromServo); + QtConcurrent::run(this,&MainWindow::handleGetRequestFromServo); } catch(ServoException exp) { - if (timer->isActive()) - { - timer->stop(); - delete timer; - } ui->showServoError->setText(exp.getMessage()); } } @@ -220,32 +209,22 @@ void MainWindow::on_init_clicked() /*************************************************************************************************/ void MainWindow::handleGetRequestFromServo() { - try { - //ui->showSpeed->setText(QString::number(_servoControler.getSpeed())); - // ui->showStartAngle->setText(QString::number(_servoControler.getStartAngle())); - // ui->showStopAngle->setText(QString::number(_servoControler.getStopAngle())); - //ui->showAngleOffset->setText(QString::number(_servoControler.getAngleOffset())); - // ui->showAzimuth->setText(QString::number(_servoControler.getAzimuth())); - auto currentstatus=_servoControler.getStatus(); - if (!currentstatus) - { - if (timer->isActive()) - { - timer->stop(); - delete timer; - } - } - ui->connectionState->setText(QVariant(currentstatus).toString()); - } - catch(ServoException exp) + while(1) { - if (timer->isActive()) + try { + ui->showSpeed->setText(QString::number(_servoControler.getSpeed())); + ui->showStartAngle->setText(QString::number(_servoControler.getStartAngle())); + ui->showStopAngle->setText(QString::number(_servoControler.getStopAngle())); + ui->showAngleOffset->setText(QString::number(_servoControler.getAngleOffset())); + ui->showAzimuth->setText(QString::number(_servoControler.getAzimuth())); + QThread::sleep(2); + } + catch(ServoException exp) { - timer->stop(); - delete timer; + ui->showServoError->setText(exp.getMessage()); } - ui->showServoError->setText(exp.getMessage()); - + auto currentstatus=_servoControler.getStatus(); + ui->connectionState->setText(QVariant(currentstatus).toString()); } } diff --git a/Test/main.cpp b/Test/main.cpp index 4fd31bf..bc51f04 100644 --- a/Test/main.cpp +++ b/Test/main.cpp @@ -15,18 +15,18 @@ public: } //reimplemented from QApplication so we can throw exceptions in slots - virtual bool notify(QObject* receiver, QEvent* event) { - try { - return QApplication::notify(receiver, event); - } - catch(std::exception& e) - { - qDebug() << "e exception " << e.what(); - ; - } +// virtual bool notify(QObject* receiver, QEvent* event) { +// try { +// return QApplication::notify(receiver, event); +// } +// catch(std::exception& e) +// { +// qDebug() << "e exception " << e.what(); +// ; +// } - return false; - } +// return false; +// } }; int main(int argc, char* argv[]) {