diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp index 54bf5942c3dbf8552f7cb25288210b16dfd8a6ac..e5bab311beb721fc7253f9de2348d8ab2157d1ab 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp @@ -12,7 +12,7 @@ Contributors: #include <QtCore/QDebug> -#include <QtCore/QTime> +#include <QtCore/QElapsedTimer> #include <QtCore/QTimer> #include <QtWidgets/QMessageBox> #include <QtWidgets/QFileDialog> @@ -81,40 +81,40 @@ std::string diagnosticToolMainView::generateLogTopics() void diagnosticToolMainView::resetGUI() { - try - { - //Stop periodic receiving if any - if(ui->periodicReceiveButton->isChecked()==true) - { - ui->periodicReceiveButton->setChecked(false); - Utils::logInfo(ui->console,"Monitoring was stopped due to cluster closure."); - } - ui->sendButton->setEnabled(false); - ui->receiveButton->setEnabled(false); - ui->periodicReceiveButton->setEnabled(false); - ui->copyButton->setEnabled(false); - //Clear the tree - ui->treeWidget->clear(); - - ui->sendComboBox->clear(); - ui->receiveComboBox->clear(); - ui->copyComboBox->clear(); - // disable connect and disconnect - ui->connectButton->setEnabled(false); - ui->disconnectButton->setEnabled(false); - - if(mysilecs!=NULL) - { - delete mysilecs; - mysilecs = NULL; - } - - if(redirector!=NULL) - { - delete redirector; - redirector = NULL; - } - } + try + { + //Stop periodic receiving if any + if(ui->periodicReceiveButton->isChecked()==true) + { + ui->periodicReceiveButton->setChecked(false); + Utils::logInfo(ui->console,"Monitoring was stopped due to cluster closure."); + } + ui->sendButton->setEnabled(false); + ui->receiveButton->setEnabled(false); + ui->periodicReceiveButton->setEnabled(false); + ui->copyButton->setEnabled(false); + //Clear the tree + ui->treeWidget->clear(); + + ui->sendComboBox->clear(); + ui->receiveComboBox->clear(); + ui->copyComboBox->clear(); + // disable connect and disconnect + ui->connectButton->setEnabled(false); + ui->disconnectButton->setEnabled(false); + + if(mysilecs!=NULL) + { + delete mysilecs; + mysilecs = NULL; + } + + if(redirector!=NULL) + { + delete redirector; + redirector = NULL; + } + } catch(std::string *str) { Utils::logError(ui->console,*str); @@ -123,16 +123,16 @@ void diagnosticToolMainView::resetGUI() { Utils::logError(ui->console,ex.what()); } - catch(...) - { - Utils::logError(ui->console,"Unexpected error while reseting GUI. Please notify SILECS support"); - } + catch(...) + { + Utils::logError(ui->console,"Unexpected error while reseting GUI. Please notify SILECS support"); + } } void diagnosticToolMainView::loadFiles() { - resetGUI(); + resetGUI(); try { this->redirector = new StdErrRedirect(ui->console); @@ -218,7 +218,7 @@ void diagnosticToolMainView::loadFiles() void diagnosticToolMainView::on_connectButton_clicked() { - ui->console->clear(); + ui->console->clear(); // Connect button @@ -228,42 +228,42 @@ void diagnosticToolMainView::on_connectButton_clicked() // Cast the linked object PLC type Silecs::PLC* plc = (Silecs::PLC*)(currentItem->getLinkedObject()); - try - { - plc->connect(Silecs::MASTER_SYNCHRO,true,ui->compareChecksums->isChecked()); - if(!plc->isConnected()) - { - Utils::logError(ui->console,"Connection to PLC failed."); - return; - } - mysilecs->updatePLCItem(currentItem,false); - if(!plc->isConnected()) - { - Utils::logError(ui->console,"Updating PLC-items failed."); - return; - } - - // disable connect button - ui->connectButton->setEnabled(false); - ui->disconnectButton->setEnabled(true); - - // enable send and receive - ui->sendBox->setEnabled(true); - ui->receiveBox->setEnabled(true); - ui->copyBox->setEnabled(true); - - //refresh console - Utils::displayPLCInformation(plc,ui->InformationMessage); - - //highlight PLC background in green - currentItem->setBackgroundColor(0,Qt::green); - - //show the run-state of the PLC - mysilecs->updatePLCRunState(currentItem); + try + { + plc->connect(Silecs::MASTER_SYNCHRO,true,ui->compareChecksums->isChecked()); + if(!plc->isConnected()) + { + Utils::logError(ui->console,"Connection to PLC failed."); + return; + } + mysilecs->updatePLCItem(currentItem,false); + if(!plc->isConnected()) + { + Utils::logError(ui->console,"Updating PLC-items failed."); + return; + } - // Increment number of connected PLC - mysilecs->counterConnectedPLC++; - } + // disable connect button + ui->connectButton->setEnabled(false); + ui->disconnectButton->setEnabled(true); + + // enable send and receive + ui->sendBox->setEnabled(true); + ui->receiveBox->setEnabled(true); + ui->copyBox->setEnabled(true); + + //refresh console + Utils::displayPLCInformation(plc,ui->InformationMessage); + + //highlight PLC background in green + currentItem->setBackground(0, Qt::green); + + //show the run-state of the PLC + mysilecs->updatePLCRunState(currentItem); + + // Increment number of connected PLC + mysilecs->counterConnectedPLC++; + } catch(std::string *str) { Utils::logError(ui->console,*str); @@ -311,7 +311,7 @@ void diagnosticToolMainView::on_disconnectButton_clicked() Utils::displayPLCInformation(plc,ui->InformationMessage); // remove green background - ui->treeWidget->currentItem()->setBackgroundColor(0,Qt::white); + ui->treeWidget->currentItem()->setBackground(0, Qt::white); // Decrement number of connected PLC mysilecs->counterConnectedPLC--; @@ -341,7 +341,7 @@ void diagnosticToolMainView::on_disconnectButton_clicked() void diagnosticToolMainView::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { - ui->console->clear(); + ui->console->clear(); (void)current; // to suppress unused warning (void)previous; // to suppress unused warning try @@ -354,87 +354,87 @@ void diagnosticToolMainView::on_treeWidget_currentItemChanged(QTreeWidgetItem *c return; } - Item *currentItem = dynamic_cast<Item*>(current); - - /* - * If the selected item is a Cluster - */ - if(!currentItem->whatsThis(0).compare(QString::fromStdString(CLUSTER_TYPE))) - { - qDebug() << "Cluster selected"; - Utils::displayClusterInformation(((Silecs::Cluster*)(currentItem->getLinkedObject())),ui->InformationMessage); - } - - /* - * If the selected item is a PLC - */ - if(!currentItem->whatsThis(0).compare(QString::fromStdString(PLC_TYPE))) - { - qDebug() << "Plc selected"; - Utils::displayPLCInformation(((Silecs::PLC*)(currentItem->getLinkedObject())),ui->InformationMessage); - - bool connected = ((Silecs::PLC*)(currentItem->getLinkedObject()))->isConnected(); - ui->connectButton->setEnabled(!connected); - ui->disconnectButton->setEnabled(connected); - } - else - { - ui->connectButton->setEnabled(false); - ui->disconnectButton->setEnabled(false); - } - - /* - * If the selected item is a device - */ - if(!currentItem->whatsThis(0).compare(QString::fromStdString(DEVICE_TYPE))) - { - qDebug() << "Device selected"; - Silecs::Device* device = (Silecs::Device*)(currentItem->getLinkedObject()); - Utils::displayDeviceInformation(device,ui->InformationMessage); - - bool connected = ((Silecs::PLC*)dynamic_cast<Item*>(currentItem->parent())->getLinkedObject())->isConnected(); - - ui->sendBox->setEnabled(connected); - ui->receiveBox->setEnabled(connected); - ui->copyBox->setEnabled(connected); - ui->sendButton->setEnabled(connected); - ui->receiveButton->setEnabled(connected); - ui->copyButton->setEnabled(connected); - ui->periodicReceiveButton->setEnabled(connected); - } - else - { - ui->sendBox->setEnabled(false); - ui->receiveBox->setEnabled(false); - ui->copyBox->setEnabled(false); - ui->sendButton->setEnabled(false); - ui->receiveButton->setEnabled(false); - ui->copyButton->setEnabled(false); - ui->periodicReceiveButton->setEnabled(false); - } - - /* - * If the selected item is a register - */ - if(!currentItem->whatsThis(0).compare(QString::fromStdString(REGISTER_TYPE))) - { - qDebug() << "Register selected"; - Utils::displayRegisterInformation(((Silecs::Register*)(currentItem->getLinkedObject())),ui->InformationMessage); - - //bool connected = ((Silecs::PLC*)dynamic_cast<Item*>(currentItem->parent()->parent())->getLinkedObject())->isConnected(); - Utils::displayRegisterValue((Silecs::Register*)(currentItem->getLinkedObject()), - ui->binValueLabel, - ui->HexValueLabel, - ui->DecValueLabel, - ui->asciiValueLabel); - } - else - { - ui->binValueLabel->setText("--Not relevant--"); - ui->HexValueLabel->setText("--Not relevant--"); - ui->DecValueLabel->setText("--Not relevant--"); - ui->asciiValueLabel->setText("--Not relevant--"); - } + Item *currentItem = dynamic_cast<Item*>(current); + + /* + * If the selected item is a Cluster + */ + if(!currentItem->whatsThis(0).compare(QString::fromStdString(CLUSTER_TYPE))) + { + qDebug() << "Cluster selected"; + Utils::displayClusterInformation(((Silecs::Cluster*)(currentItem->getLinkedObject())),ui->InformationMessage); + } + + /* + * If the selected item is a PLC + */ + if(!currentItem->whatsThis(0).compare(QString::fromStdString(PLC_TYPE))) + { + qDebug() << "Plc selected"; + Utils::displayPLCInformation(((Silecs::PLC*)(currentItem->getLinkedObject())),ui->InformationMessage); + + bool connected = ((Silecs::PLC*)(currentItem->getLinkedObject()))->isConnected(); + ui->connectButton->setEnabled(!connected); + ui->disconnectButton->setEnabled(connected); + } + else + { + ui->connectButton->setEnabled(false); + ui->disconnectButton->setEnabled(false); + } + + /* + * If the selected item is a device + */ + if(!currentItem->whatsThis(0).compare(QString::fromStdString(DEVICE_TYPE))) + { + qDebug() << "Device selected"; + Silecs::Device* device = (Silecs::Device*)(currentItem->getLinkedObject()); + Utils::displayDeviceInformation(device,ui->InformationMessage); + + bool connected = ((Silecs::PLC*)dynamic_cast<Item*>(currentItem->parent())->getLinkedObject())->isConnected(); + + ui->sendBox->setEnabled(connected); + ui->receiveBox->setEnabled(connected); + ui->copyBox->setEnabled(connected); + ui->sendButton->setEnabled(connected); + ui->receiveButton->setEnabled(connected); + ui->copyButton->setEnabled(connected); + ui->periodicReceiveButton->setEnabled(connected); + } + else + { + ui->sendBox->setEnabled(false); + ui->receiveBox->setEnabled(false); + ui->copyBox->setEnabled(false); + ui->sendButton->setEnabled(false); + ui->receiveButton->setEnabled(false); + ui->copyButton->setEnabled(false); + ui->periodicReceiveButton->setEnabled(false); + } + + /* + * If the selected item is a register + */ + if(!currentItem->whatsThis(0).compare(QString::fromStdString(REGISTER_TYPE))) + { + qDebug() << "Register selected"; + Utils::displayRegisterInformation(((Silecs::Register*)(currentItem->getLinkedObject())),ui->InformationMessage); + + //bool connected = ((Silecs::PLC*)dynamic_cast<Item*>(currentItem->parent()->parent())->getLinkedObject())->isConnected(); + Utils::displayRegisterValue((Silecs::Register*)(currentItem->getLinkedObject()), + ui->binValueLabel, + ui->HexValueLabel, + ui->DecValueLabel, + ui->asciiValueLabel); + } + else + { + ui->binValueLabel->setText("--Not relevant--"); + ui->HexValueLabel->setText("--Not relevant--"); + ui->DecValueLabel->setText("--Not relevant--"); + ui->asciiValueLabel->setText("--Not relevant--"); + } // Automaticaly resize the coloumn with the item name ui->treeWidget->resizeColumnToContents(0); } @@ -454,45 +454,45 @@ void diagnosticToolMainView::on_treeWidget_currentItemChanged(QTreeWidgetItem *c std::vector<QString> diagnosticToolMainView::openArrayDialogBase(Silecs::Register* reg, std::vector<QString> dataVector, bool localData) { - DisplayArrayDialog arrayDialog; - arrayDialog.setDataVector(dataVector,localData,reg->getDimension2()); - arrayDialog.setWindowTitle("Array View"); - arrayDialog.setModal(true); - if(arrayDialog.exec()==1) // ok pressed - { - return arrayDialog.getDataVector(); - } - return dataVector; + DisplayArrayDialog arrayDialog; + arrayDialog.setDataVector(dataVector,localData,reg->getDimension2()); + arrayDialog.setWindowTitle("Array View"); + arrayDialog.setModal(true); + if(arrayDialog.exec()==1) // ok pressed + { + return arrayDialog.getDataVector(); + } + return dataVector; } std::vector<QString> diagnosticToolMainView::open1DArrayDialog(Silecs::Register* reg, bool localData) { - std::vector<QString> dataVector; - for(unsigned long i=0;i<reg->getDimension1();i++) - { - if( localData ) - dataVector.push_back(QString::fromStdString(reg->getOutputValAsString(i))); - else - dataVector.push_back(QString::fromStdString(reg->getInputValAsString(i))); - } + std::vector<QString> dataVector; + for(unsigned long i=0;i<reg->getDimension1();i++) + { + if( localData ) + dataVector.push_back(QString::fromStdString(reg->getOutputValAsString(i))); + else + dataVector.push_back(QString::fromStdString(reg->getInputValAsString(i))); + } - return openArrayDialogBase(reg, dataVector, localData); + return openArrayDialogBase(reg, dataVector, localData); } std::vector<QString> diagnosticToolMainView::open2DArrayDialog(Silecs::Register* reg, bool localData) { - std::vector<QString> dataVector; - for(unsigned long i=0; i<reg->getDimension1(); i++) - { - for(unsigned long j=0; j<reg->getDimension2(); j++) - { - if( localData ) - dataVector.push_back(QString::fromStdString(reg->getOutputValAsString(i,j))); - else - dataVector.push_back(QString::fromStdString(reg->getInputValAsString(i,j))); - } - } - return openArrayDialogBase(reg, dataVector, localData); + std::vector<QString> dataVector; + for(unsigned long i=0; i<reg->getDimension1(); i++) + { + for(unsigned long j=0; j<reg->getDimension2(); j++) + { + if( localData ) + dataVector.push_back(QString::fromStdString(reg->getOutputValAsString(i,j))); + else + dataVector.push_back(QString::fromStdString(reg->getInputValAsString(i,j))); + } + } + return openArrayDialogBase(reg, dataVector, localData); } void diagnosticToolMainView::markItemNotEdiable(QTreeWidgetItem *item) @@ -503,61 +503,61 @@ void diagnosticToolMainView::markItemNotEdiable(QTreeWidgetItem *item) void diagnosticToolMainView::on_treeWidget_doubleClicked(const QModelIndex &index) { - ui->console->clear(); + ui->console->clear(); (void)index; // to suppress unused warning try { - QTreeWidgetItem *itm = ui->treeWidget->currentItem(); - if( itm->whatsThis(0).toStdString().compare(REGISTER_TYPE) != 0 ) - { - markItemNotEdiable(itm); + QTreeWidgetItem *itm = ui->treeWidget->currentItem(); + if( itm->whatsThis(0).toStdString().compare(REGISTER_TYPE) != 0 ) + { + markItemNotEdiable(itm); return; - } + } Item *registerItem = dynamic_cast<Item*>(itm); Silecs::Register* reg = (Silecs::Register*)registerItem->getLinkedObject(); switch(ui->treeWidget->currentColumn()) { - case 2:// double click performed on 2th column (PLC value) --> open non-editable ArrayDialog for arrays - if(reg->getDimension2()<=1) // scalar or 1d array (noting happens for scalar) - { - if(reg->getDimension1()<=1) //scalar - { - return; - } - open1DArrayDialog(reg,false); - } - else // 2d array - { - open2DArrayDialog(reg,false); - } - markItemNotEdiable(itm); - return; - case 3:// double click performed on 3th column (local value) - if(!reg->isWritable() )// is READ only for silecs or is wrong column - { - markItemNotEdiable(itm); - return; - } - if(reg->getDimension2()<=1) // scalar or 1d array - { - if(reg->getDimension1()<=1) //scalar - { - itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable); - return; - } - std::vector<QString> dataVector = open1DArrayDialog(reg,true); - mysilecs->setArrayRegValue(registerItem,&dataVector); - } - else // 2d array - { - std::vector<QString> dataVector= open2DArrayDialog(reg,true); - mysilecs->setArrayRegValue(registerItem,&dataVector); - } - return; - default: // other columns are not editable - markItemNotEdiable(itm); - return; + case 2:// double click performed on 2th column (PLC value) --> open non-editable ArrayDialog for arrays + if(reg->getDimension2()<=1) // scalar or 1d array (noting happens for scalar) + { + if(reg->getDimension1()<=1) //scalar + { + return; + } + open1DArrayDialog(reg,false); + } + else // 2d array + { + open2DArrayDialog(reg,false); + } + markItemNotEdiable(itm); + return; + case 3:// double click performed on 3th column (local value) + if(!reg->isWritable() )// is READ only for silecs or is wrong column + { + markItemNotEdiable(itm); + return; + } + if(reg->getDimension2()<=1) // scalar or 1d array + { + if(reg->getDimension1()<=1) //scalar + { + itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable); + return; + } + std::vector<QString> dataVector = open1DArrayDialog(reg,true); + mysilecs->setArrayRegValue(registerItem,&dataVector); + } + else // 2d array + { + std::vector<QString> dataVector= open2DArrayDialog(reg,true); + mysilecs->setArrayRegValue(registerItem,&dataVector); + } + return; + default: // other columns are not editable + markItemNotEdiable(itm); + return; } } catch(std::string *str) @@ -604,7 +604,7 @@ void diagnosticToolMainView::on_sendButton_clicked() } try{ //send and mesure sending time - QTime mytimer; + QElapsedTimer mytimer; mytimer.start(); cluster->send(ui->sendComboBox->currentText().toStdString()); logCommunicationSuccess(mytimer.elapsed()); @@ -630,7 +630,7 @@ void diagnosticToolMainView::on_sendButton_clicked() mysilecs->setScalarDataInDeviceFromItem((Item*)currentItem->child(i),ui->sendComboBox->currentText().toStdString()); try{ //send and mesure sending time - QTime mytimer; + QElapsedTimer mytimer; mytimer.start(); int ret = plc->send(ui->sendComboBox->currentText().toStdString()); if(ret != 0) @@ -657,7 +657,7 @@ void diagnosticToolMainView::on_sendButton_clicked() Silecs::Device* device = (Silecs::Device*)(currentItem->getLinkedObject()); //send and mesure sending time - QTime mytimer; + QElapsedTimer mytimer; mytimer.start(); Utils::logInfo(ui->console,"Sending data to device: '" + device->getLabel() + "', block: '" + ui->sendComboBox->currentText().toStdString() + "'"); int ret = device->send(ui->sendComboBox->currentText().toStdString()); @@ -723,64 +723,65 @@ void diagnosticToolMainView::on_receiveButton_clicked() void diagnosticToolMainView::on_classNameComboBox_currentIndexChanged(const QString &arg1) { - ui->console->clear(); - if( !deployFile.empty() ) - { - ui->DesignName->setText(""); - designName = ui->classNameComboBox->currentText().toStdString(); - loadFiles(); - } - return; + Q_UNUSED(arg1); + ui->console->clear(); + if( !deployFile.empty() ) + { + ui->DesignName->setText(""); + designName = ui->classNameComboBox->currentText().toStdString(); + loadFiles(); + } + return; } void diagnosticToolMainView::on_loadDeployButton_clicked() { - ui->console->clear(); - deployFile = QFileDialog::getOpenFileName(this, tr("Deploy to Open"), "" ,tr("Silecs Deploy Files (*.silecsdeploy)")).toStdString(); - if( !deployFile.empty() ) - { - ui->DeployName->setText(QString::fromStdString(deployFile)); - ui->DesignName->setText("pick a design"); - fillClassNameComboBox(); - } - return; + ui->console->clear(); + deployFile = QFileDialog::getOpenFileName(this, tr("Deploy to Open"), "" ,tr("Silecs Deploy Files (*.silecsdeploy)")).toStdString(); + if( !deployFile.empty() ) + { + ui->DeployName->setText(QString::fromStdString(deployFile)); + ui->DesignName->setText("pick a design"); + fillClassNameComboBox(); + } + return; } void diagnosticToolMainView::setDeployFile(std::string file) { - deployFile = file; - ui->DeployName->setText(QString::fromStdString(deployFile)); - ui->DesignName->setText("pick a design"); - fillClassNameComboBox(); + deployFile = file; + ui->DeployName->setText(QString::fromStdString(deployFile)); + ui->DesignName->setText("pick a design"); + fillClassNameComboBox(); } void diagnosticToolMainView::fillClassNameComboBox() { - Utils::logInfo(ui->console,"Loading deploy file: " + deployFile); - XMLParser parserDeploy(deployFile,true); - boost::ptr_vector<ElementXML> classNodes; - try - { - classNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/SilecsDesign"); - } - catch(const Silecs::SilecsException& ex2) - { - Utils::logError(ui->console,"No classes found for this Deploy: " + deployFile + ". Exception: " + ex2.what()); - return; - } + Utils::logInfo(ui->console,"Loading deploy file: " + deployFile); + XMLParser parserDeploy(deployFile,true); + boost::ptr_vector<ElementXML> classNodes; + try + { + classNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/SilecsDesign"); + } + catch(const Silecs::SilecsException& ex2) + { + Utils::logError(ui->console,"No classes found for this Deploy: " + deployFile + ". Exception: " + ex2.what()); + return; + } - QStringList list; - boost::ptr_vector<ElementXML>::const_iterator classIter; - for(classIter = classNodes.begin(); classIter != classNodes.end(); classIter++) - { - QString className(classIter->getAttribute("silecs-design-name").c_str()); - if(!list.contains(className)) - list += className; - } - QString headerName(HEADER_NAME.c_str()); - list += headerName; - ui->classNameComboBox->clear(); - ui->classNameComboBox->addItems(list); + QStringList list; + boost::ptr_vector<ElementXML>::const_iterator classIter; + for(classIter = classNodes.begin(); classIter != classNodes.end(); classIter++) + { + QString className(classIter->getAttribute("silecs-design-name").c_str()); + if(!list.contains(className)) + list += className; + } + QString headerName(HEADER_NAME.c_str()); + list += headerName; + ui->classNameComboBox->clear(); + ui->classNameComboBox->addItems(list); } void diagnosticToolMainView::ctxMenu(const QPoint &pos) @@ -802,18 +803,18 @@ void diagnosticToolMainView::on_treeWidget_itemExpanded(QTreeWidgetItem *item) ui->treeWidget->resizeColumnToContents(0); } -void diagnosticToolMainView::logBlockReceived(std::string blockName, int elapsedTime) +void diagnosticToolMainView::logBlockReceived(std::string blockName, qint64 elapsedTime) { - std::ostringstream message; - message << "Block '" << blockName << "' received successfully from the device in " << elapsedTime << " milliseconds"; - Utils::logInfo(ui->console,message.str().c_str()); + std::ostringstream message; + message << "Block '" << blockName << "' received successfully from the device in " << elapsedTime << " milliseconds"; + Utils::logInfo(ui->console,message.str().c_str()); } -void diagnosticToolMainView::logCommunicationSuccess(int elapsedTime) +void diagnosticToolMainView::logCommunicationSuccess(qint64 elapsedTime) { - std::ostringstream message; - message << "PLC communication successful. Elapsed time: " << elapsedTime << " milliseconds"; - Utils::logInfo(ui->console,message.str().c_str()); + std::ostringstream message; + message << "PLC communication successful. Elapsed time: " << elapsedTime << " milliseconds"; + Utils::logInfo(ui->console,message.str().c_str()); } @@ -823,11 +824,11 @@ void diagnosticToolMainView::receiveDevice(std::string blockName, Item* deviceIt qDebug() << "try to receive " << QString::fromStdString(blockName); try{ //receive device and mesure sending time - QTime mytimer; + QElapsedTimer mytimer; mytimer.start(); Utils::logInfo(ui->console,"Receiving data from device: '" + device->getLabel() + "', block: '" + blockName + "'"); int ret = device->recv(blockName); - int elapsedTime = mytimer.elapsed(); + qint64 elapsedTime = mytimer.elapsed(); if(ret != 0) { Utils::logError(ui->console,"Error while receiving the block to the selected device"); @@ -856,11 +857,11 @@ void diagnosticToolMainView::periodicReceiveDevice() qDebug()<< "try to receive "<< QString::fromStdString(blockNameForPeriodicReceive); try{ //receive device and mesure sending time - QTime mytimer; + QElapsedTimer mytimer; mytimer.start(); device->recv(blockNameForPeriodicReceive); - int elapsedTime = mytimer.elapsed(); - logBlockReceived(blockNameForPeriodicReceive,elapsedTime); + qint64 elapsedTime = mytimer.elapsed(); + logBlockReceived(blockNameForPeriodicReceive, elapsedTime); } catch(std::string *str) { @@ -882,7 +883,7 @@ void diagnosticToolMainView::periodicReceiveDevice() void diagnosticToolMainView::on_periodicReceiveButton_toggled(bool checked) { - ui->console->clear(); + ui->console->clear(); if(checked) { // receive periodic Button diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.h b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.h index cc150de89d44b88228caab1cb92a0c5873995dae..a436475e10e2d90a57755a8da74fe7d690a56281 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.h +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.h @@ -96,8 +96,8 @@ private: void fillClassNameComboBox(); - void logBlockReceived(std::string blockName, int elapsedTime); - void logCommunicationSuccess(int elapsedTime); + void logBlockReceived(std::string blockName, qint64 elapsedTime); + void logCommunicationSuccess(qint64 elapsedTime); std::vector<QString> openArrayDialogBase(Silecs::Register* reg, std::vector<QString> dataVector, bool localData); std::vector<QString> open1DArrayDialog(Silecs::Register* reg, bool localData); diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.cpp index f1e2dfb89153440f0f336a44712588fae4eebee8..9addd6df831d2416129006f712cb86c340a80442 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.cpp +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.cpp @@ -29,14 +29,14 @@ DisplayArrayDialog::~DisplayArrayDialog() delete ui; } -void DisplayArrayDialog::setDataVector(std::vector<QString> dataVector, bool editable, unsigned long dim2) +void DisplayArrayDialog::setDataVector(std::vector<QString> dataVector, bool editable, int dim2) { this->dataVector = dataVector; // display informations if(dim2 <= 1) // 1d array { - int numberOfValues = this->dataVector.size(); + int numberOfValues = static_cast<int>(this->dataVector.size()); ui->tableWidget->setColumnCount(1); ui->tableWidget->setRowCount(numberOfValues); @@ -52,13 +52,13 @@ void DisplayArrayDialog::setDataVector(std::vector<QString> dataVector, bool edi } else // 2d array { - unsigned long dim1 = (this->dataVector.size())/dim2; + int dim1 = static_cast<int>(this->dataVector.size()) / dim2; ui->tableWidget->setColumnCount(dim2); ui->tableWidget->setRowCount(dim1); - for(unsigned long i=0; i<dim1; i++) + for(int i=0; i<dim1; i++) { - for(unsigned long j=0; j<dim2; j++) + for(int j=0; j<dim2; j++) { QTableWidgetItem *item = new QTableWidgetItem(dataVector[i*dim2+j],1); if(!editable) // default flag contains editable @@ -78,7 +78,7 @@ std::vector<QString> DisplayArrayDialog::getDataVector() void DisplayArrayDialog::on_buttonBox_accepted() { - int numberOfValues = this->dataVector.size(); + int numberOfValues = static_cast<int>(this->dataVector.size()); for(int i= 0; i< numberOfValues; i++) this->dataVector[i] = ui->tableWidget->item(0,i)->text(); diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.h b/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.h index 2c5e524ca052e956b38215a4e233973453d18616..cd2f19b4e8aab38ddfd1561da64e06b11021f9d7 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.h +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/displayarraydialog.h @@ -28,7 +28,7 @@ public: explicit DisplayArrayDialog(QWidget *parent = 0); ~DisplayArrayDialog(); - void setDataVector(std::vector<QString> dataVector, bool editable, unsigned long dim2); + void setDataVector(std::vector<QString> dataVector, bool editable, int dim2); std::vector<QString> getDataVector(); diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp index 9f30def3f29679eef85344bd941ac10b6e2aa6ec..659e2b5f09c4403eee8086da182b093f6a8e9c2c 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp @@ -78,23 +78,23 @@ void silecsModule::updatePLCRunState(Item *plcItem) if( !plc->isConnected() ) { plcItem->setText(index,""); - plcItem->setBackgroundColor(index,Qt::white); + plcItem->setBackground(index, Qt::white); } if( plc->isRunning() ) { plcItem->setText(index,"running"); - plcItem->setBackgroundColor(index,Qt::green); + plcItem->setBackground(index, Qt::green); } else { plcItem->setText(index,"stopped"); - plcItem->setBackgroundColor(index,Qt::yellow); + plcItem->setBackground(index, Qt::yellow); } } catch(const Silecs::SilecsException& ex2) { plcItem->setText(index,"state unknown"); - plcItem->setBackgroundColor(index,Qt::red); + plcItem->setBackground(index, Qt::red); std::string message = "Failed to obtain plc run-state: "; message += ex2.what(); Utils::logError(messageConsole_,message); @@ -192,8 +192,8 @@ Item *silecsModule::generateTree(string className, string deployFile) registerItem->setText(1 , QString::fromStdString(reg->getBlockName())); // Color background of input and output buffer - registerItem->setBackgroundColor(2,QColor(255,255,204));//light yellow - registerItem->setBackgroundColor(3,QColor(204,255,255));//light blue + registerItem->setBackground(2, QColor(255,255,204));//light yellow + registerItem->setBackground(3, QColor(204,255,255));//light blue }while(registerListSplitted); } @@ -205,7 +205,7 @@ Item *silecsModule::generateTree(string className, string deployFile) } -void silecsModule::setScalarDataInDeviceFromItem(Item *currentItem, std::string blockName) throw (std::string*) +void silecsModule::setScalarDataInDeviceFromItem(Item *currentItem, std::string blockName) { Silecs::Device* device = (Silecs::Device*)(currentItem->getLinkedObject()); diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h index 92adcb6cc25064dfffcdeaa4ec653b1136b531c5..85b0b990dc407226cb12b4846dbeb4fea15d85fe 100755 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h @@ -76,7 +76,7 @@ public: * from the string present in the GUI * in case of error returns a string exception with the message */ - void setScalarDataInDeviceFromItem(Item *currentItem, std::string blockName) throw (std::string*); + void setScalarDataInDeviceFromItem(Item *currentItem, std::string blockName); /** * Set the register with the proper data converting diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/stderrredirect.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/stderrredirect.cpp index 8183b04a9eb1c138417c2200a5e00ec08b0ed32a..b68cf316f9119998bbaea0f4eb680c5d7bd0645e 100644 --- a/silecs-diagnostic-cpp/src/silecs-diagnostic/stderrredirect.cpp +++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/stderrredirect.cpp @@ -13,6 +13,8 @@ Contributors: #include <silecs-diagnostic/stderrredirect.h> +#include <cstring> + #include <QtWidgets/QApplication> #include <QtWidgets/QMessageBox> #include <QtCore/QDir> @@ -47,7 +49,12 @@ StdErrRedirect::StdErrRedirect(QTextEdit *errorLog,QObject *parent): QObject(par fileToRename.rename(tmpFileNameQtFormat+".old"); // Set up redirection to this file: - freopen(tmpFileNameNativeFormat.toLatin1().constData(), "a+", stderr); + auto errStream = freopen(tmpFileNameNativeFormat.toLatin1().constData(), "a+", stderr); + if (errStream == nullptr) + { + throw std::runtime_error{"Failed to open file for stderr stream redirect. " + + std::string(std::strerror(errno))}; + } // Initialise the QFileSystemWatcher: connect(&watcher, SIGNAL(fileChanged(const QString &)), @@ -68,7 +75,7 @@ StdErrRedirect::~StdErrRedirect() void StdErrRedirect::fileChanged(const QString &filename) { - (void)filename; + Q_UNUSED(filename); tmp.open(QIODevice::ReadOnly); QTextStream stream(&tmp); QString content = stream.readAll();