diff options
Diffstat (limited to 'utils/regtools/qeditor/regtab.cpp')
-rw-r--r-- | utils/regtools/qeditor/regtab.cpp | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp index 568d859c0e..a335475e48 100644 --- a/utils/regtools/qeditor/regtab.cpp +++ b/utils/regtools/qeditor/regtab.cpp | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <QFileDialog> | 5 | #include <QFileDialog> |
6 | #include <QDebug> | 6 | #include <QDebug> |
7 | #include <QStyle> | 7 | #include <QStyle> |
8 | #include <QMessageBox> | ||
8 | #include "backend.h" | 9 | #include "backend.h" |
9 | #include "analyser.h" | 10 | #include "analyser.h" |
10 | #include "regdisplaypanel.h" | 11 | #include "regdisplaypanel.h" |
@@ -111,9 +112,11 @@ RegTab::RegTab(Backend *backend, QWidget *parent) | |||
111 | m_readonly_check = new QCheckBox("Read-only"); | 112 | m_readonly_check = new QCheckBox("Read-only"); |
112 | m_readonly_check->setCheckState(Qt::Checked); | 113 | m_readonly_check->setCheckState(Qt::Checked); |
113 | m_data_soc_label = new QLabel; | 114 | m_data_soc_label = new QLabel; |
114 | QPushButton *data_sel_reload = new QPushButton; | 115 | m_dump = new QPushButton("Dump", this); |
115 | data_sel_reload->setIcon(QIcon::fromTheme("view-refresh")); | 116 | m_dump->setIcon(QIcon::fromTheme("system-run")); |
116 | data_sel_reload->setToolTip("Reload data"); | 117 | m_data_sel_reload = new QPushButton(this); |
118 | m_data_sel_reload->setIcon(QIcon::fromTheme("view-refresh")); | ||
119 | m_data_sel_reload->setToolTip("Reload data"); | ||
117 | data_sel_layout->addWidget(m_data_selector); | 120 | data_sel_layout->addWidget(m_data_selector); |
118 | data_sel_layout->addWidget(m_data_sel_edit, 1); | 121 | data_sel_layout->addWidget(m_data_sel_edit, 1); |
119 | data_sel_layout->addStretch(0); | 122 | data_sel_layout->addStretch(0); |
@@ -123,7 +126,8 @@ RegTab::RegTab(Backend *backend, QWidget *parent) | |||
123 | #endif | 126 | #endif |
124 | data_sel_layout->addWidget(m_readonly_check); | 127 | data_sel_layout->addWidget(m_readonly_check); |
125 | data_sel_layout->addWidget(m_data_soc_label); | 128 | data_sel_layout->addWidget(m_data_soc_label); |
126 | data_sel_layout->addWidget(data_sel_reload); | 129 | data_sel_layout->addWidget(m_dump); |
130 | data_sel_layout->addWidget(m_data_sel_reload); | ||
127 | data_sel_group->setLayout(data_sel_layout); | 131 | data_sel_group->setLayout(data_sel_layout); |
128 | m_data_soc_label->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); | 132 | m_data_soc_label->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); |
129 | 133 | ||
@@ -153,6 +157,7 @@ RegTab::RegTab(Backend *backend, QWidget *parent) | |||
153 | this, SLOT(OnDevChanged(int))); | 157 | this, SLOT(OnDevChanged(int))); |
154 | #endif | 158 | #endif |
155 | connect(m_readonly_check, SIGNAL(clicked(bool)), this, SLOT(OnReadOnlyClicked(bool))); | 159 | connect(m_readonly_check, SIGNAL(clicked(bool)), this, SLOT(OnReadOnlyClicked(bool))); |
160 | connect(m_dump, SIGNAL(clicked(bool)), this, SLOT(OnDumpRegs(bool))); | ||
156 | 161 | ||
157 | OnSocListChanged(); | 162 | OnSocListChanged(); |
158 | OnDataSelChanged(0); | 163 | OnDataSelChanged(0); |
@@ -205,6 +210,8 @@ void RegTab::OnDataSelChanged(int index) | |||
205 | m_dev_selector->hide(); | 210 | m_dev_selector->hide(); |
206 | #endif | 211 | #endif |
207 | m_readonly_check->show(); | 212 | m_readonly_check->show(); |
213 | m_data_sel_reload->show(); | ||
214 | m_dump->hide(); | ||
208 | QFileDialog *fd = new QFileDialog(m_data_selector); | 215 | QFileDialog *fd = new QFileDialog(m_data_selector); |
209 | fd->setFilter("Textual files (*.txt);;All files (*)"); | 216 | fd->setFilter("Textual files (*.txt);;All files (*)"); |
210 | fd->setDirectory(Settings::Get()->value("loaddatadir", QDir::currentPath()).toString()); | 217 | fd->setDirectory(Settings::Get()->value("loaddatadir", QDir::currentPath()).toString()); |
@@ -226,6 +233,8 @@ void RegTab::OnDataSelChanged(int index) | |||
226 | m_data_sel_edit->hide(); | 233 | m_data_sel_edit->hide(); |
227 | m_readonly_check->show(); | 234 | m_readonly_check->show(); |
228 | m_dev_selector->show(); | 235 | m_dev_selector->show(); |
236 | m_data_sel_reload->hide(); | ||
237 | m_dump->show(); | ||
229 | OnDevListChanged(); | 238 | OnDevListChanged(); |
230 | } | 239 | } |
231 | #endif | 240 | #endif |
@@ -236,6 +245,8 @@ void RegTab::OnDataSelChanged(int index) | |||
236 | m_dev_selector->hide(); | 245 | m_dev_selector->hide(); |
237 | #endif | 246 | #endif |
238 | m_readonly_check->hide(); | 247 | m_readonly_check->hide(); |
248 | m_data_sel_reload->hide(); | ||
249 | m_dump->hide(); | ||
239 | 250 | ||
240 | delete m_io_backend; | 251 | delete m_io_backend; |
241 | m_io_backend = m_backend->CreateDummyIoBackend(); | 252 | m_io_backend = m_backend->CreateDummyIoBackend(); |
@@ -363,7 +374,10 @@ void RegTab::OnDevChanged(int index) | |||
363 | return; | 374 | return; |
364 | HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >()); | 375 | HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >()); |
365 | delete m_io_backend; | 376 | delete m_io_backend; |
366 | m_io_backend = m_backend->CreateHWStubIoBackend(dev); | 377 | /* NOTE: make a copy of the HWStubDevice device because the one in the list |
378 | * might get destroyed when clearing the list while the backend is still | ||
379 | * active: this would result in a double free when the backend is also destroyed */ | ||
380 | m_io_backend = m_backend->CreateHWStubIoBackend(new HWStubDevice(dev)); | ||
367 | SetDataSocName(m_io_backend->GetSocName()); | 381 | SetDataSocName(m_io_backend->GetSocName()); |
368 | OnDataSocActivated(m_io_backend->GetSocName()); | 382 | OnDataSocActivated(m_io_backend->GetSocName()); |
369 | OnDataChanged(); | 383 | OnDataChanged(); |
@@ -435,3 +449,22 @@ void RegTab::OnReadOnlyClicked(bool checked) | |||
435 | m_right_content->AllowWrite(!checked); | 449 | m_right_content->AllowWrite(!checked); |
436 | UpdateSocFilename(); | 450 | UpdateSocFilename(); |
437 | } | 451 | } |
452 | |||
453 | void RegTab::OnDumpRegs(bool c) | ||
454 | { | ||
455 | Q_UNUSED(c); | ||
456 | QFileDialog *fd = new QFileDialog(this); | ||
457 | fd->setAcceptMode(QFileDialog::AcceptSave); | ||
458 | fd->setFilter("Textual files (*.txt);;All files (*)"); | ||
459 | fd->setDirectory(Settings::Get()->value("loaddatadir", QDir::currentPath()).toString()); | ||
460 | if(!fd->exec()) | ||
461 | return; | ||
462 | QStringList filenames = fd->selectedFiles(); | ||
463 | Settings::Get()->setValue("loaddatadir", fd->directory().absolutePath()); | ||
464 | BackendHelper bh(m_io_backend, m_cur_soc); | ||
465 | if(!bh.DumpAllRegisters(filenames[0])) | ||
466 | { | ||
467 | QMessageBox::warning(this, "The register dump was not saved", | ||
468 | "There was an error when dumping the registers"); | ||
469 | } | ||
470 | } | ||