aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui/mainwindow.cpp')
-rw-r--r--qtmips_gui/mainwindow.cpp83
1 files changed, 73 insertions, 10 deletions
diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp
index 6a507fa..9e1902a 100644
--- a/qtmips_gui/mainwindow.cpp
+++ b/qtmips_gui/mainwindow.cpp
@@ -1,13 +1,17 @@
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
+ machine = nullptr;
+ corescene = nullptr;
settings = new QSettings("CTU", "QtMips");
- coreview = nullptr;
ui = new Ui::MainWindow();
ui->setupUi(this);
setWindowTitle("QtMips");
+ // Prepare empty core view
+ coreview = new CoreView(this);
+ this->setCentralWidget(coreview);
// Create/prepare other widgets
ndialog = new NewDialog(this, settings);
cache_content = new CacheContentDock(this);
@@ -32,6 +36,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
MainWindow::~MainWindow() {
settings->sync();
delete settings;
+ if (corescene != nullptr)
+ delete corescene;
if (coreview != nullptr)
delete coreview;
delete ndialog;
@@ -49,22 +55,34 @@ void MainWindow::start() {
}
void MainWindow::create_core(machine::MachineConfig *config) {
+ // Remove old machine
+ if (machine != nullptr)
+ delete machine;
// Create machine
machine = new machine::QtMipsMachine(config);
// Create machine view
- coreview = new CoreView(this, machine);
- this->setCentralWidget(coreview);
+ corescene = new CoreViewScene(coreview, machine);
- machine->set_speed(1000); // Set default speed to 1 sec
+ //machine->set_speed(1000); // Set default speed to 1 sec
+ machine->set_speed(0);
- // Connect machine signals
+ // Connect machine signals and slots
connect(ui->actionRun, SIGNAL(triggered(bool)), machine, SLOT(play()));
connect(ui->actionPause, SIGNAL(triggered(bool)), machine, SLOT(pause()));
connect(ui->actionStep, SIGNAL(triggered(bool)), machine, SLOT(step()));
connect(ui->actionRestart, SIGNAL(triggered(bool)), machine, SLOT(restart()));
+ connect(machine, SIGNAL(status_change(machine::QtMipsMachine::Status)), this, SLOT(machine_status(machine::QtMipsMachine::Status)));
+ connect(machine, SIGNAL(program_exit()), this, SLOT(machine_exit()));
+ connect(machine, SIGNAL(program_trap(machine::QtMipsException&)), this, SLOT(machine_trap(machine::QtMipsException&)));
// Setup docks
registers->setup(machine);
+ // Set status to ready
+ machine_status(machine::QtMipsMachine::ST_READY);
+}
+
+bool MainWindow::configured() {
+ return (machine != nullptr);
}
void MainWindow::new_machine() {
@@ -83,15 +101,10 @@ void MainWindow::show_registers() {
show_dockwidget(registers);
}
-bool MainWindow::configured() {
- return (machine != nullptr);
-}
-
void MainWindow::closeEvent(QCloseEvent *event) {
settings->setValue("windowGeometry", saveGeometry());
settings->setValue("windowState", saveState());
settings->sync();
- QMainWindow::closeEvent(event);
}
void MainWindow::show_dockwidget(QDockWidget *dw) {
@@ -103,3 +116,53 @@ void MainWindow::show_dockwidget(QDockWidget *dw) {
dw->setFocus();
}
}
+
+void MainWindow::machine_status(enum machine::QtMipsMachine::Status st) {
+ QString status;
+ switch (st) {
+ case machine::QtMipsMachine::ST_READY:
+ ui->actionPause->setEnabled(false);
+ ui->actionRun->setEnabled(true);
+ ui->actionStep->setEnabled(true);
+ status = "Ready";
+ break;
+ case machine::QtMipsMachine::ST_RUNNING:
+ ui->actionPause->setEnabled(true);
+ ui->actionRun->setEnabled(false);
+ ui->actionStep->setEnabled(false);
+ status = "Running";
+ break;
+ case machine::QtMipsMachine::ST_BUSY:
+ // Busy is not interesting (in such case we should just be running
+ return;
+ case machine::QtMipsMachine::ST_EXIT:
+ // machine_exit is called so we disable controls in that
+ status = "Exited";
+ break;
+ case machine::QtMipsMachine::ST_TRAPPED:
+ // machine_trap is called so we disable controls in that
+ status = "Trapped";
+ break;
+ default:
+ status = "Unknown";
+ break;
+ }
+ ui->statusBar->showMessage(status);
+}
+
+void MainWindow::machine_exit() {
+ ui->actionPause->setEnabled(false);
+ ui->actionRun->setEnabled(false);
+ ui->actionStep->setEnabled(false);
+}
+
+void MainWindow::machine_trap(machine::QtMipsException &e) {
+ machine_exit();
+
+ QMessageBox msg(this);
+ msg.setText(e.msg(false));
+ msg.setIcon(QMessageBox::Critical);
+ msg.setDetailedText(e.msg(true));
+ msg.setWindowTitle("Machine trapped");
+ msg.exec();
+}