Skip to content

Commit

Permalink
FMU inputs via FMU properties dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
adeas31 committed Jun 7, 2018
1 parent 50fc6a2 commit ce21b10
Show file tree
Hide file tree
Showing 5 changed files with 217 additions and 26 deletions.
106 changes: 86 additions & 20 deletions OMEdit/OMEditGUI/Component/FMUProperties.cpp
Expand Up @@ -38,6 +38,7 @@
FMUProperties::FMUProperties()
{
mParameterValues.clear();
mInputValues.clear();
}

/*!
Expand Down Expand Up @@ -68,6 +69,7 @@ FMUPropertiesDialog::FMUPropertiesDialog(Component *pComponent, QWidget *pParent
mpGeneralGroupBox = new QGroupBox(Helper::general);
mpDescriptionLabel = new Label(QString("%1:").arg(Helper::description));
mpDescriptionValueLabel = new Label(QString(pFMUInfo->description));
mpDescriptionValueLabel->setElideMode(Qt::ElideMiddle);
mpFMUKindLabel = new Label(tr("FMU Kind:"));
mpFMUKindValueLabel = new Label(OMSProxy::getFMUKindString(pFMUInfo->fmiKind));
mpFMIVersionLabel = new Label(tr("FMI Version:"));
Expand All @@ -89,7 +91,7 @@ FMUPropertiesDialog::FMUPropertiesDialog(Component *pComponent, QWidget *pParent
pGeneralLayout->addWidget(mpFMIVersionLabel, 2, 0);
pGeneralLayout->addWidget(mpFMIVersionValueLabel, 2, 1);
pGeneralLayout->addWidget(mpGenerationToolLabel, 3, 0);
pGeneralLayout->addWidget(mpGenerationTimeValueLabel, 3, 1);
pGeneralLayout->addWidget(mpGenerationToolValueLabel, 3, 1);
pGeneralLayout->addWidget(mpGuidLabel, 4, 0);
pGeneralLayout->addWidget(mpGuidValueLabel, 4, 1);
pGeneralLayout->addWidget(mpGenerationTimeLabel, 5, 0);
Expand Down Expand Up @@ -131,22 +133,24 @@ FMUPropertiesDialog::FMUPropertiesDialog(Component *pComponent, QWidget *pParent
pCapabilitiesGridLayout->addWidget(mpProvidesDirectionalDerivativeValueLabel, 6, 1);
mpCapabilitiesGroupBox->setLayout(pCapabilitiesGridLayout);
// FMU Parameters
ParametersScrollArea *pParametersScrollArea = new ParametersScrollArea;
pParametersScrollArea->setBackgroundRole(QPalette::NoRole);
pParametersScrollArea->getLayout()->setContentsMargins(0, 0, 0, 0);
GroupBox *pParametersGroupBox = new GroupBox("Parameters");
pParametersScrollArea->addGroupBox(pParametersGroupBox);
QGridLayout *pParametersGridLayout = new QGridLayout;
pParametersGridLayout->setContentsMargins(5, 5, 5, 5);
QGroupBox *pParametersGroupBox = new QGroupBox(Helper::parameters);
pParametersGroupBox->setLayout(pParametersGridLayout);
QScrollArea *pParametersScrollArea = new QScrollArea;
pParametersScrollArea->setFrameShape(QFrame::NoFrame);
pParametersScrollArea->setWidgetResizable(true);
pParametersScrollArea->setWidget(pParametersGroupBox);
mParameterLabels.clear();
mParameterLineEdits.clear();
int index = 0;
if (mpComponent->getLibraryTreeItem()->getOMSElement()) {
oms_connector_t** pInterfaces = mpComponent->getLibraryTreeItem()->getOMSElement()->connectors;
for (int i = 0 ; pInterfaces[i] ; i++) {
if (pInterfaces[i]->causality == oms_causality_parameter) {
index++;
QString name = StringHandler::getLastWordAfterDot(pInterfaces[i]->name);
name = name.split(':', QString::SkipEmptyParts).last();
mParameterLabels.append(new Label(name));
QString name = QString(pInterfaces[i]->name).split(':', QString::SkipEmptyParts).last();
Label *pNameLabel = new Label(name);
pNameLabel->setToolTip(pInterfaces[i]->name);
mParameterLabels.append(pNameLabel);
QLineEdit *pParameterLineEdit = new QLineEdit;
bool status = false;
if (pInterfaces[i]->type == oms_signal_type_real) {
Expand Down Expand Up @@ -184,15 +188,73 @@ FMUPropertiesDialog::FMUPropertiesDialog(Component *pComponent, QWidget *pParent
}
mParameterLineEdits.append(pParameterLineEdit);
mOldFMUProperties.mParameterValues.append(pParameterLineEdit->text());
GroupBox *pParametersGroupBox = pParametersScrollArea->getGroupBox("Parameters");
if (pParametersGroupBox) {
pParametersGroupBox->show();
QGridLayout *pGroupBoxGridLayout = pParametersGroupBox->getGridLayout();
int layoutIndex = pGroupBoxGridLayout->rowCount();
int columnIndex = 0;
pGroupBoxGridLayout->addWidget(mParameterLabels.last(), layoutIndex, columnIndex++);
pGroupBoxGridLayout->addWidget(mParameterLineEdits.last(), layoutIndex, columnIndex++);
int layoutIndex = pParametersGridLayout->rowCount();
int columnIndex = 0;
pParametersGridLayout->addWidget(mParameterLabels.last(), layoutIndex, columnIndex++);
pParametersGridLayout->addWidget(mParameterLineEdits.last(), layoutIndex, columnIndex++);
}
}
}
// FMU Inputs
QGridLayout *pInputsGridLayout = new QGridLayout;
pInputsGridLayout->setContentsMargins(5, 5, 5, 5);
QGroupBox *pInputsGroupBox = new QGroupBox(tr("Inputs"));
pInputsGroupBox->setLayout(pInputsGridLayout);
QScrollArea *pInputsScrollArea = new QScrollArea;
pInputsScrollArea->setFrameShape(QFrame::NoFrame);
pInputsScrollArea->setWidgetResizable(true);
pInputsScrollArea->setWidget(pInputsGroupBox);
mInputLabels.clear();
mInputLineEdits.clear();
if (mpComponent->getLibraryTreeItem()->getOMSElement()) {
oms_connector_t** pInterfaces = mpComponent->getLibraryTreeItem()->getOMSElement()->connectors;
for (int i = 0 ; pInterfaces[i] ; i++) {
if (pInterfaces[i]->causality == oms_causality_input) {
QString name = QString(pInterfaces[i]->name).split(':', QString::SkipEmptyParts).last();
Label *pNameLabel = new Label(name);
pNameLabel->setToolTip(pInterfaces[i]->name);
mInputLabels.append(pNameLabel);
QLineEdit *pInputLineEdit = new QLineEdit;
bool status = false;
if (pInterfaces[i]->type == oms_signal_type_real) {
QDoubleValidator *pDoubleValidator = new QDoubleValidator(this);
pInputLineEdit->setValidator(pDoubleValidator);
double value;
if ((status = OMSProxy::instance()->getReal(pInterfaces[i]->name, &value))) {
pInputLineEdit->setText(QString::number(value));
}
} else if (pInterfaces[i]->type == oms_signal_type_integer) {
QIntValidator *pIntValidator = new QIntValidator(this);
pInputLineEdit->setValidator(pIntValidator);
int value;
if ((status = OMSProxy::instance()->getInteger(pInterfaces[i]->name, &value))) {
pInputLineEdit->setText(QString::number(value));
}
} else if (pInterfaces[i]->type == oms_signal_type_boolean) {
QIntValidator *pIntValidator = new QIntValidator(this);
pInputLineEdit->setValidator(pIntValidator);
bool value;
if ((status = OMSProxy::instance()->getBoolean(pInterfaces[i]->name, &value))) {
pInputLineEdit->setText(QString::number(value));
}
} else if (pInterfaces[i]->type == oms_signal_type_string) {
qDebug() << "OMSSubModelAttributes::OMSSubModelAttributes() oms_signal_type_string not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_enum) {
qDebug() << "OMSSubModelAttributes::OMSSubModelAttributes() oms_signal_type_enum not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_bus) {
qDebug() << "OMSSubModelAttributes::OMSSubModelAttributes() oms_signal_type_bus not implemented yet.";
} else {
qDebug() << "OMSSubModelAttributes::OMSSubModelAttributes() unknown oms_signal_type_enu_t.";
}
if (!status) {
pInputLineEdit->setPlaceholderText("unknown");
}
mInputLineEdits.append(pInputLineEdit);
mOldFMUProperties.mInputValues.append(pInputLineEdit->text());
int layoutIndex = pInputsGridLayout->rowCount();
int columnIndex = 0;
pInputsGridLayout->addWidget(mInputLabels.last(), layoutIndex, columnIndex++);
pInputsGridLayout->addWidget(mInputLineEdits.last(), layoutIndex, columnIndex++);
}
}
}
Expand All @@ -217,7 +279,8 @@ FMUPropertiesDialog::FMUPropertiesDialog(Component *pComponent, QWidget *pParent
pMainLayout->addWidget(mpGeneralGroupBox, 3, 0, 1, 2);
pMainLayout->addWidget(mpCapabilitiesGroupBox, 4, 0, 1, 2);
pMainLayout->addWidget(pParametersScrollArea, 5, 0, 1, 2);
pMainLayout->addWidget(mpButtonBox, 6, 0, 1, 2, Qt::AlignRight);
pMainLayout->addWidget(pInputsScrollArea, 6, 0, 1, 2);
pMainLayout->addWidget(mpButtonBox, 7, 0, 1, 2, Qt::AlignRight);
setLayout(pMainLayout);
}

Expand All @@ -234,6 +297,9 @@ void FMUPropertiesDialog::updateFMUParameters()
foreach (QLineEdit *pParameterLineEdit, mParameterLineEdits) {
newFMUProperties.mParameterValues.append(pParameterLineEdit->text());
}
foreach (QLineEdit *pInputLineEdit, mInputLineEdits) {
newFMUProperties.mInputValues.append(pInputLineEdit->text());
}
// push the change on the undo stack
FMUPropertiesCommand *pFMUPropertiesCommand = new FMUPropertiesCommand(mpComponent, oldName, newName, mOldFMUProperties, newFMUProperties);
ModelWidget *pModelWidget = mpComponent->getGraphicsView()->getModelWidget();
Expand Down
3 changes: 3 additions & 0 deletions OMEdit/OMEditGUI/Component/FMUProperties.h
Expand Up @@ -42,6 +42,7 @@ class FMUProperties
FMUProperties();

QList<QString> mParameterValues;
QList<QString> mInputValues;
};

class FMUPropertiesDialog : public QDialog
Expand Down Expand Up @@ -87,6 +88,8 @@ class FMUPropertiesDialog : public QDialog
Label *mpProvidesDirectionalDerivativeValueLabel;
QList<Label*> mParameterLabels;
QList<QLineEdit*> mParameterLineEdits;
QList<Label*> mInputLabels;
QList<QLineEdit*> mInputLineEdits;
FMUProperties mOldFMUProperties;
QPushButton *mpOkButton;
QPushButton *mpCancelButton;
Expand Down
50 changes: 44 additions & 6 deletions OMEdit/OMEditGUI/Modeling/Commands.cpp
Expand Up @@ -1955,13 +1955,14 @@ void FMUPropertiesCommand::redo()
// mpComponent->componentNameHasChanged();
// }
// Parameters
int index = 0;
int parametersIndex = 0;
int inputsIndex = 0;
if (mpComponent->getLibraryTreeItem()->getOMSElement()) {
oms_connector_t** pInterfaces = mpComponent->getLibraryTreeItem()->getOMSElement()->connectors;
for (int i = 0 ; pInterfaces[i] ; i++) {
if (pInterfaces[i]->causality == oms_causality_parameter) {
QString parameterValue = mNewFMUProperties.mParameterValues.at(index);
index++;
QString parameterValue = mNewFMUProperties.mParameterValues.at(parametersIndex);
parametersIndex++;
if (pInterfaces[i]->type == oms_signal_type_real) {
OMSProxy::instance()->setRealParameter(pInterfaces[i]->name, parameterValue.toDouble());
} else if (pInterfaces[i]->type == oms_signal_type_integer) {
Expand All @@ -1977,6 +1978,24 @@ void FMUPropertiesCommand::redo()
} else {
qDebug() << "FMUPropertiesCommand::redo() unknown oms_signal_type_enu_t.";
}
} else if (pInterfaces[i]->causality == oms_causality_input) {
QString inputValue = mNewFMUProperties.mInputValues.at(inputsIndex);
inputsIndex++;
if (pInterfaces[i]->type == oms_signal_type_real) {
OMSProxy::instance()->setReal(pInterfaces[i]->name, inputValue.toDouble());
} else if (pInterfaces[i]->type == oms_signal_type_integer) {
OMSProxy::instance()->setInteger(pInterfaces[i]->name, inputValue.toInt());
} else if (pInterfaces[i]->type == oms_signal_type_boolean) {
OMSProxy::instance()->setBoolean(pInterfaces[i]->name, inputValue.toInt());
} else if (pInterfaces[i]->type == oms_signal_type_string) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_string not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_enum) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_enum not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_bus) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_bus not implemented yet.";
} else {
qDebug() << "FMUPropertiesCommand::redo() unknown oms_signal_type_enu_t.";
}
}
}
}
Expand All @@ -1994,13 +2013,14 @@ void FMUPropertiesCommand::undo()
// mpComponent->componentNameHasChanged();
// }
// Parameters
int index = 0;
int parametersIndex = 0;
int inputsIndex = 0;
if (mpComponent->getLibraryTreeItem()->getOMSElement()) {
oms_connector_t** pInterfaces = mpComponent->getLibraryTreeItem()->getOMSElement()->connectors;
for (int i = 0 ; pInterfaces[i] ; i++) {
if (pInterfaces[i]->causality == oms_causality_parameter) {
QString parameterValue = mOldFMUProperties.mParameterValues.at(index);
index++;
QString parameterValue = mOldFMUProperties.mParameterValues.at(parametersIndex);
parametersIndex++;
if (pInterfaces[i]->type == oms_signal_type_real) {
OMSProxy::instance()->setRealParameter(pInterfaces[i]->name, parameterValue.toDouble());
} else if (pInterfaces[i]->type == oms_signal_type_integer) {
Expand All @@ -2016,6 +2036,24 @@ void FMUPropertiesCommand::undo()
} else {
qDebug() << "FMUPropertiesCommand::redo() unknown oms_signal_type_enu_t.";
}
} else if (pInterfaces[i]->causality == oms_causality_input) {
QString inputValue = mOldFMUProperties.mInputValues.at(inputsIndex);
inputsIndex++;
if (pInterfaces[i]->type == oms_signal_type_real) {
OMSProxy::instance()->setReal(pInterfaces[i]->name, inputValue.toDouble());
} else if (pInterfaces[i]->type == oms_signal_type_integer) {
OMSProxy::instance()->setInteger(pInterfaces[i]->name, inputValue.toInt());
} else if (pInterfaces[i]->type == oms_signal_type_boolean) {
OMSProxy::instance()->setBoolean(pInterfaces[i]->name, inputValue.toInt());
} else if (pInterfaces[i]->type == oms_signal_type_string) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_string not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_enum) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_enum not implemented yet.";
} else if (pInterfaces[i]->type == oms_signal_type_bus) {
qDebug() << "FMUPropertiesCommand::redo() oms_signal_type_bus not implemented yet.";
} else {
qDebug() << "FMUPropertiesCommand::redo() unknown oms_signal_type_enu_t.";
}
}
}
}
Expand Down
78 changes: 78 additions & 0 deletions OMEdit/OMEditGUI/OMS/OMSProxy.cpp
Expand Up @@ -560,6 +560,32 @@ void OMSProxy::setWorkingDirectory(QString path)
oms2_setWorkingDirectory(path.toStdString().c_str());
}

/*!
* \brief OMSProxy::getReal
* Gets the real variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::getReal(QString signal, double *value)
{
oms_status_enu_t status = oms2_getReal(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::setReal
* Sets the real variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::setReal(QString signal, double value)
{
oms_status_enu_t status = oms2_setReal(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::getRealParameter
* Gets the real parameter value.
Expand All @@ -586,6 +612,32 @@ bool OMSProxy::setRealParameter(const char* signal, double value)
return statusToBool(status);
}

/*!
* \brief OMSProxy::getInteger
* Gets the integer variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::getInteger(QString signal, int *value)
{
oms_status_enu_t status = oms2_getInteger(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::setInteger
* Sets the integer variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::setInteger(QString signal, int value)
{
oms_status_enu_t status = oms2_setInteger(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::getIntegerParameter
* Gets the integer parameter value.
Expand All @@ -612,6 +664,32 @@ bool OMSProxy::setIntegerParameter(const char* signal, int value)
return statusToBool(status);
}

/*!
* \brief OMSProxy::getBoolean
* Gets the boolean variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::getBoolean(QString signal, bool *value)
{
oms_status_enu_t status = oms2_getBoolean(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::setBoolean
* Sets the boolean variable value.
* \param signal
* \param value
* \return
*/
bool OMSProxy::setBoolean(QString signal, bool value)
{
oms_status_enu_t status = oms2_setBoolean(signal.toStdString().c_str(), value);
return statusToBool(status);
}

/*!
* \brief OMSProxy::getBooleanParameter
* Gets the boolean parameter value.
Expand Down
6 changes: 6 additions & 0 deletions OMEdit/OMEditGUI/OMS/OMSProxy.h
Expand Up @@ -86,10 +86,16 @@ class OMSProxy : public QObject
void setLogFile(QString filename);
void setTempDirectory(QString path);
void setWorkingDirectory(QString path);
bool getReal(QString signal, double* value);
bool setReal(QString signal, double value);
bool getRealParameter(QString signal, double* pValue);
bool setRealParameter(const char* signal, double value);
bool getInteger(QString signal, int* value);
bool setInteger(QString signal, int value);
bool getIntegerParameter(QString signal, int* pValue);
bool setIntegerParameter(const char* signal, int value);
bool getBoolean(QString signal, bool* value);
bool setBoolean(QString signal, bool value);
bool getBooleanParameter(QString signal, bool* pValue);
bool setBooleanParameter(const char* signal, bool value);
bool getStartTime(QString cref, double* startTime);
Expand Down

0 comments on commit ce21b10

Please sign in to comment.