diff --git a/scriptcontainer.cpp b/scriptcontainer.cpp index eb81b48..9f934da 100644 --- a/scriptcontainer.cpp +++ b/scriptcontainer.cpp @@ -102,6 +102,60 @@ void ScriptContainer::tick() } } +void ScriptContainer::addParameter(QJSValue name) +{ + scriptParams.append(name.toString()); +} + +void ScriptContainer::updateValuesTable(QTableWidget *widget) +{ + QString valu; + + if (widget->columnCount() == 0) + { + widget->insertColumn(0); + widget->insertColumn(1); + } + + foreach (QString paramName, scriptParams) + { + valu = scriptEngine.globalObject().property(paramName).toString(); + qDebug() << paramName << " - " << valu; + bool found = false; + for (int i = 0; i < widget->rowCount(); i++) + { + if (widget->item(i, 0)->text().compare(paramName) == 0) + { + found = true; + if (!widget->item(i, 1)->isSelected()) + { + widget->item(i,1)->setText(valu); + } + break; + } + } + if (!found) + { + int row = widget->rowCount(); + widget->insertRow(widget->rowCount()); + QTableWidgetItem *item; + item = new QTableWidgetItem(); + item->setText(paramName); + item->setFlags(Qt::ItemIsEnabled); + widget->setItem(row, 0, item); + item = new QTableWidgetItem(); + item->setText(valu); + widget->setItem(row, 1, item); + } + } +} + +void ScriptContainer::updateParameter(QString name, QString value) +{ + qDebug() << name << " * " << value; + QJSValue val(value); + scriptEngine.globalObject().setProperty(name, val); +} diff --git a/scriptcontainer.h b/scriptcontainer.h index 5512068..04d10f4 100644 --- a/scriptcontainer.h +++ b/scriptcontainer.h @@ -83,10 +83,17 @@ public: QString filePath; QString scriptText; +/* + Anything registered as a public slot on this class and that takes either no arguments + or only QJSValue arguments will be callable from scripts via host.XXX calls. So, have at it, champ. +*/ public slots: void compileScript(); void setTickInterval(QJSValue interval); void log(QJSValue logString); + void addParameter(QJSValue name); + void updateValuesTable(QTableWidget *widget); + void updateParameter(QString name, QString value); signals: void sendLog(QString text); @@ -104,6 +111,7 @@ private: CANScriptHelper *canHelper; ISOTPScriptHelper *isoHelper; UDSScriptHelper *udsHelper; + QVector scriptParams; }; #endif // SCRIPTCONTAINER_H diff --git a/scriptingwindow.cpp b/scriptingwindow.cpp index 814e289..081ad84 100644 --- a/scriptingwindow.cpp +++ b/scriptingwindow.cpp @@ -33,12 +33,16 @@ ScriptingWindow::ScriptingWindow(const QVector *frames, QWidget *paren connect(ui->btnSaveScript, &QAbstractButton::pressed, this, &ScriptingWindow::saveScript); connect(ui->btnClearLog, &QAbstractButton::pressed, this, &ScriptingWindow::clickedLogClear); connect(ui->listLoadedScripts, &QListWidget::currentRowChanged, this, &ScriptingWindow::changeCurrentScript); + connect(ui->tableVariables, SIGNAL(cellChanged(int,int)), this, SLOT(updatedValue(int, int))); connect(CANConManager::getInstance(), &CANConManager::framesReceived, this, &ScriptingWindow::newFrames); + connect(&valuesTimer, SIGNAL(timeout()), this, SLOT(valuesTimerElapsed())); + currentScript = NULL; elapsedTime.start(); + valuesTimer.start(1000); } ScriptingWindow::~ScriptingWindow() @@ -62,6 +66,22 @@ void ScriptingWindow::newFrames(const CANConnection* pConn, const QVectortableVariables->item(row, 0); + QTableWidgetItem *valItem = ui->tableVariables->item(row, 1); + + if (!valItem) return; + if (col == 0) return; + if (!valItem->isSelected()) return; // don't record updates not from a user edited cell + + if (nameItem && valItem) + { + QString name = nameItem->text(); + QString val = valItem->text(); + emit updatedParameter(name, val); + } +} void ScriptingWindow::closeEvent(QCloseEvent *event) { @@ -100,12 +120,27 @@ void ScriptingWindow::changeCurrentScript() int sel = ui->listLoadedScripts->currentRow(); if (sel < 0) return; - if (currentScript) currentScript->scriptText = editor->toPlainText(); + if (currentScript) { + currentScript->scriptText = editor->toPlainText(); + disconnect(this, SIGNAL(updateValueTable(QTableWidget*)), currentScript, SLOT(updateValuesTable(QTableWidget*))); + disconnect(this, SIGNAL(updatedParameter(QString,QString)), currentScript, SLOT(updateParameter(QString,QString))); + } ScriptContainer *container = scripts.at(sel); currentScript = container; editor->setPlainText(container->scriptText); editor->setEnabled(true); + ui->tableVariables->clear(); + connect(this, SIGNAL(updateValueTable(QTableWidget*)), currentScript, SLOT(updateValuesTable(QTableWidget*))); + connect(this, SIGNAL(updatedParameter(QString,QString)), currentScript, SLOT(updateParameter(QString,QString))); +} + +void ScriptingWindow::valuesTimerElapsed() +{ + if (currentScript) + { + emit updateValueTable(ui->tableVariables); + } } void ScriptingWindow::loadNewScript() diff --git a/scriptingwindow.h b/scriptingwindow.h index 66589c5..fbdad5a 100644 --- a/scriptingwindow.h +++ b/scriptingwindow.h @@ -27,6 +27,10 @@ public: public slots: void log(QString text); +signals: + void updateValueTable(QTableWidget *widget); + void updatedParameter(QString name, QString value); + private slots: void loadNewScript(); void createNewScript(); @@ -38,6 +42,8 @@ private slots: void changeCurrentScript(); void newFrames(const CANConnection*, const QVector&); void clickedLogClear(); + void valuesTimerElapsed(); + void updatedValue(int row, int col); private: void closeEvent(QCloseEvent *event); @@ -50,6 +56,7 @@ private: ScriptContainer *currentScript; const QVector *modelFrames; QElapsedTimer elapsedTime; + QTimer valuesTimer; }; #endif // SCRIPTINGWINDOW_H