2 #include "ui_qpidmainwindow.h"
3 #include "qextserialenumerator.h"
5 #include "qwt_legend.h"
6 #include "qwt_symbol.h"
10 #include <QMessageBox>
11 #include <QCloseEvent>
12 #include <QFileDialog>
14 #include <QTableWidgetItem>
27 QwtLegend *x =
new QwtLegend(
ui->m_TemperatureGraph);
29 ui->m_TemperatureGraph->enableAxis(QwtPlot::yRight,
true);
30 ui->m_TemperatureGraph->insertLegend(x, QwtPlot::BottomLegend);
42 connect(
ui->m_ActionSettings, SIGNAL(triggered()),
this, SLOT(
editSettings()));
43 connect(
ui->m_ActionChangeSetpoint, SIGNAL(triggered()),
this, SLOT(
changeSetpoint()));
44 connect(
ui->m_ActionAutoTune, SIGNAL(triggered()),
this, SLOT(
autoTune()));
45 connect(
ui->m_ActionRampTemperature, SIGNAL(triggered()),
this, SLOT(
rampTemperature()));
46 connect(
ui->m_ActionConfigureGraph, SIGNAL(triggered()),
this, SLOT(
configureGraph()));
48 connect(
ui->m_ActionLoadSettings, SIGNAL(triggered()),
this, SLOT(
loadSettings()));
49 connect(
ui->m_ActionSaveSettings, SIGNAL(triggered()),
this, SLOT(
saveSettings()));
51 connect(
ui->m_ActionAutoScaleGraph, SIGNAL(triggered()),
ui->m_TemperatureGraph, SLOT(autoScale()));
53 connect(
ui->m_CommandInput, SIGNAL(returnPressed()),
this, SLOT(
commandEntered()));
60 ctrl->prop_RampPoint()->linkTo(
ui->m_SetPointDisplay);
61 ctrl->prop_Temperature()->linkTo(
ui->m_TemperatureDisplay);
62 ctrl->prop_OutputLevel()->linkTo(
ui->m_OutputLevelDisplay);
63 ctrl->prop_Enabled()->linkTo(
ui->m_Enabled);
64 ctrl->prop_LoopEnabled()->linkTo(
ui->m_LoopEnabled);
66 ctrl->prop_SetPoint()->linkTo(
ui->m_TargetSetPoint);
67 ctrl->prop_RampRate()->linkTo(
ui->m_RampRate);
69 connect(ctrl->prop_ControllerStatus(), SIGNAL(valueChanged(
int,
int)),
73 ui->m_StartControllerButton->setDefaultAction(
ui->m_ActionStartController);
74 ui->m_StopControllerButton->setDefaultAction(
ui->m_ActionStopController);
75 ui->m_RestartControllerButton->setDefaultAction(
ui->m_ActionRestartController);
78 connect(
ui->m_ActionStopController, SIGNAL(triggered()),
this, SLOT(
onStopController()));
81 ui->m_CreateDeviceButton->setDefaultAction(
ui->m_ActionCreateNewDevice);
82 ui->m_DeleteDeviceButton->setDefaultAction(
ui->m_ActionDeleteDevice);
84 connect(
ui->m_ActionCreateNewDevice, SIGNAL(triggered()),
ui->m_DevicesList, SLOT(doCreateNewDevice()));
85 connect(
ui->m_ActionDeleteDevice, SIGNAL(triggered()),
ui->m_DevicesList, SLOT(doDeleteDevice()));
95 ui->m_TemperatureGraph->autoScale();
97 ui->m_DevicesList->updateDevicesList();
115 log->prop_Enabled()->linkTo(
ui->m_LoggingIndicator);
116 log->prop_FileName()->linkTo(
ui->m_LoggingPath);
123 if (QThread::currentThread() != thread()) {
124 QMetaObject::invokeMethod(
this,
"printMessage", Q_ARG(QString, msg), Q_ARG(QDateTime, ts));
126 ui->m_OutputMessages->append(ts.toString(
"yyyy MMM dd hh:mm:ss.zzz: ")+msg);
132 if (QThread::currentThread() != thread()) {
133 QMetaObject::invokeMethod(
this,
"criticalMessage", Q_ARG(QString, msg));
135 ui->m_OutputMessages->append(
"Error: " + msg);
150 ctrl->writeSettings();
163 return QMessageBox::question(
this, tr(
"Really Close?"),
164 tr(
"Do you really want to close the window?"),
165 QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok;
188 QString filePath = QFileDialog::getSaveFileName(
this,
"Save Log File as...", log->get_FileName(),
"Log File (*.log);; Any file (* *.*)");
190 if (filePath !=
"") {
191 log->set_FileName(filePath);
202 QString filePath = QFileDialog::getOpenFileName(
this,
"Load Settings from...", ctrl->settingsFilePath(),
"QPIDCTRL Settings (*.qpset);; Any file (* *.*)");
204 if (filePath !=
"") {
205 ctrl->loadSettings(filePath);
215 QString filePath = QFileDialog::getSaveFileName(
this,
"Save Settings as...", ctrl->settingsFilePath(),
"QPIDCTRL Settings (*.qpset);; Any file (* *.*)");
217 if (filePath !=
"") {
218 ctrl->saveSettings(filePath);
225 ui->m_ActionStartController->setEnabled(canStart);
226 ui->m_ActionStopController->setEnabled(canStop);
227 ui->m_ActionRestartController->setEnabled(canRestart);
235 QString statusString = ctrl->controllerStatusString(newStatus);
237 ui->m_ControllerStatusLabel->setText(statusString);
271 ctrl -> startController();
280 ctrl -> stopController();
289 ctrl -> restartController();
295 QString cmd =
ui->m_CommandInput->text();
300 ctrl->executeCommand(cmd);
360 dev->configurationDialog();
368 if (units.length()) {
369 ui->m_TemperatureLabel->setText(tr(
"Input : %1 (%2)").arg(name).arg(units));
371 ui->m_TemperatureLabel->setText(name);
379 if (units.length()) {
380 ui->m_OutputLevelLabel->setText(tr(
"Output : %1 (%2)").arg(name).arg(units));
382 ui->m_OutputLevelLabel->setText(name);
391 static QwtSymbol::Style
Symbols[
NSYMS] = { QwtSymbol::Ellipse, QwtSymbol::Cross, QwtSymbol::Diamond, QwtSymbol::Rect };
395 QwtPlotCurve *pc =
new QwtPlotCurve(title);
397 int npen = n %
NPENS;
401 QwtSymbol::Style symbl =
Symbols[nsym];
403 pc->setPen(QPen(color));
407 symb.setStyle(symbl);
409 symb.setPen(QPen(color));
410 symb.setBrush(QBrush(color));
412 pc->setSymbol(&symb);
419 if (QThread::currentThread() != thread()) {
420 INVOKE_CHECK(QMetaObject::invokeMethod(
this,
"updateGraphCurves"));
423 printMessage(tr(
"QPidMainWindow::updateGraphCurves()"));
429 QStringList names = ctrl->get_ColumnNames();
431 int n = names.length();
434 ui->m_TemperatureGraph->detachItems(QwtPlotItem::Rtti_PlotCurve);
435 ui->m_TemperatureGraph->detachItems(QwtPlotItem::Rtti_PlotMarker);
439 for (
int i=0+ctrl->m_SkippedColumns; i<n; i++) {
440 QString name = names.value(i);
442 if (ctrl->yChecked(i)) {
445 pc->setSamples(ctrl->m_PlottedValues.value(0), ctrl->m_PlottedValues.value(i));
446 pc->attach(
ui->m_TemperatureGraph);
451 if (ctrl->y2Checked(i)) {
454 pc->setSamples(ctrl->m_PlottedValues.value(0), ctrl->m_PlottedValues.value(i));
455 pc->setAxes(QwtPlot::xBottom, QwtPlot::yRight);
456 pc->attach(
ui->m_TemperatureGraph);
462 ui->m_TemperatureGraph->replot();
469 if (QThread::currentThread() != thread()) {
470 INVOKE_CHECK(QMetaObject::invokeMethod(
this,
"graphChannelNames", Q_ARG(QStringList, names)));
473 printMessage(tr(
"QPidMainWindow::graphChannelNames %1 ,...").arg(names.value(0)));
481 int n = names.length();
482 int ns = ctrl->m_SkippedColumns;
484 ui->m_ColumnList->setRowCount(n-ns);
485 ui->m_ColumnList->setColumnWidth(0, 120);
486 ui->m_ColumnList->setColumnWidth(1, 30);
487 ui->m_ColumnList->setColumnWidth(2, 30);
489 for (
int i=0+ctrl->m_SkippedColumns; i<n; i++) {
490 QString name = names.value(i);
492 ui->m_ColumnList->setItem(i-ns,0,
new QTableWidgetItem(name));
493 ui->m_ColumnList->setItem(i-ns,1,
new QTableWidgetItem());
494 ui->m_ColumnList->setItem(i-ns,2,
new QTableWidgetItem());
496 ui->m_ColumnList->item(i-ns,0)->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
497 ui->m_ColumnList->item(i-ns,1)->setFlags(Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);
498 ui->m_ColumnList->item(i-ns,2)->setFlags(Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);
500 ui->m_ColumnList->item(i-ns,1)->setCheckState(ctrl->yChecked(i));
501 ui->m_ColumnList->item(i-ns,2)->setCheckState(ctrl->y2Checked(i));
513 if (QThread::currentThread() != thread()) {
514 INVOKE_CHECK(QMetaObject::invokeMethod(
this,
"graphChannelValues", Q_ARG(QcepDoubleList, values)));
517 printMessage(tr(
"QPidMainWindow::graphChannelValues %1 ,...").arg(values.value(0)));
520 int n= values.length();
526 for (
int i=0+ctrl->m_SkippedColumns; i<n; i++) {
527 if (ctrl->yChecked(i)) {
528 QwtPlotCurve *pc =
m_Curves.value(cvidx++);
531 pc->setSamples(ctrl->m_PlottedValues.value(0), ctrl->m_PlottedValues.value(i));
535 if (ctrl->y2Checked(i)) {
536 QwtPlotCurve *pc =
m_Curves.value(cvidx++);
539 pc->setSamples(ctrl->m_PlottedValues.value(0), ctrl->m_PlottedValues.value(i));
545 ui->m_TemperatureGraph->replot();
552 printMessage(tr(
"onGraphSelectionChanged(R%1,C%2)").arg(row).arg(col));
559 ctrl->setYChecked(row+ctrl->m_SkippedColumns,
ui->m_ColumnList->item(row,col)->checkState());
560 }
else if (col == 2) {
561 ctrl->setY2Checked(row+ctrl->m_SkippedColumns,
ui->m_ColumnList->item(row,col)->checkState());
570 settings->beginWriteArray(
"splitters");
575 settings->endArray();
580 int nsplitters = settings->beginReadArray(
"splitters");
585 settings->endArray();
591 QSplitter *splitter = qobject_cast<QSplitter*>(object);
595 settings->setArrayIndex(*counter);
596 QByteArray state = splitter->saveState();
598 settings->setValue(
"state", state);
604 foreach (QObject *obj, object->children()) {
615 QSplitter *splitter = qobject_cast<QSplitter*>(object);
619 settings->setArrayIndex(*counter);
620 QByteArray state = settings->value(
"state").toByteArray();
622 Qt::Orientation orient = splitter->orientation();
624 splitter->restoreState(state);
626 splitter->setOrientation(orient);
632 foreach (QObject *obj, object->children()) {
640 #define STRINGIFY(s) _str(s)
645 ui->m_MenuDefaultDevice->clear();
650 for (
int i=0; i<ctrl->countDevices(); i++) {
654 QAction *select =
new QAction(tr(
"%1: %2 : %3").arg(i).arg(dev->get_DeviceName()).arg(dev->get_DeviceLongTypeName()), NULL);
659 select->setCheckable(
true);
660 select->setChecked(ctrl->get_DefaultDeviceNumber() == i);
662 ui->m_MenuDefaultDevice->addAction(select);
669 QString desc = tr(
"%1 : %2")
670 .arg(dev->get_DeviceName())
671 .arg(dev->get_DeviceLongTypeName());
673 setWindowTitle(tr(
"QPidCtrl : Device %1 : %2 : %3")
674 .arg(ctrl->get_DefaultDeviceNumber())
678 ui->m_ActionStartController->setToolTip(tr(
"Start Device %1").arg(desc));
679 ui->m_ActionStopController->setToolTip(tr(
"Halt Device %1").arg(desc));
680 ui->m_ActionRestartController->setToolTip(tr(
"Restart Device %1").arg(desc));
682 setWindowTitle(tr(
"QPidCtrl : %1 : No Controller")
685 ui->m_ActionStartController->setToolTip(tr(
"Start Device"));
686 ui->m_ActionStopController->setToolTip(tr(
"Halt Device"));
687 ui->m_ActionRestartController->setToolTip(tr(
"Restart Device"));
void restoreSplitterState(QPidSettings *settings)
void closeEvent(QCloseEvent *event)
QPointer< QPidRampDialog > m_Ramp
void onGraphSelectionChanged(int row, int col)
void criticalMessage(QString msg)
QSharedPointer< QPidDevice > QPidDevicePtr
void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())
void enableControllerActions(int canStart, int canStop, int canRestart)
QWeakPointer< QPidController > QPidControllerWPtr
void onInputChannelChanged(QString name, QString units)
void saveSplitterState(QPidSettings *settings)
QSharedPointer< QPidLogger > QPidLoggerPtr
QSharedPointer< QPidController > QPidControllerPtr
void onRestartController()
void graphChannelNames(QStringList names)
QPointer< QPidSetPointDialog > m_SetPoint
QPidControllerWPtr m_Controller
QList< QwtPlotCurve * > m_Curves
QwtPlotCurve * newPlotCurve(int n, QString title)
static Qt::GlobalColor PenColors[NPENS]
void saveObjectSplitterState(QObject *object, QPidSettings *settings, int *counter)
static QwtSymbol::Style Symbols[NSYMS]
void graphChannelValues(QcepDoubleList values)
QSignalMapper * m_DeviceDefaultMapper
void onOutputChannelChanged(QString name, QString units)
void deviceConfiguration()
QPidMainWindow(QPidControllerWPtr ctl, QWidget *parent=0)
QPointer< QPidAutoTuneDialog > m_AutoTune
QPointer< QPidConfigureGraphDialog > m_ConfigureGraph
void onControllerStatusChanged(int newStatus)
QPointer< QPidSettingsDialog > m_SettingsDialog
void restoreObjectSplitterState(QObject *object, QPidSettings *settings, int *counter, int nsplitters)