#include "mainwindow.h" #include "ui_mainwindow.h" #include "playfield.h" #include #include #include #include #include "parse.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); lblCycles = new QLabel(ui->statusBar); ui->statusBar->addWidget(lblCycles); loadProgramFromFile("C:\\test.ccp", Qt::red, 10, 10); // simulator.loadProgram(Qt::red, 10, 10); // simulator.loadProgram(Qt::blue, 15, 15); ui->centralWidget->layout()->addWidget(new Playfield(simulator, ui->centralWidget)); auto timerRepaint = new QTimer(this); connect(timerRepaint, &QTimer::timeout, this, [this](){ mutex.lock(); repaint(); lblCycles->setText(QString(tr("Cycles: %1")).arg(simulator.cycle)); // lblCycles->setText(QString(tr("Cycles: %1 CntA: %2 CntB: %3")).arg(simulator.cycle).arg(simulator.teams[0]->programCount).arg(simulator.teams[1]->programCount)); mutex.unlock(); }); timerRepaint->start(100); connect(timer, &QTimer::timeout, this, [this](){ simulate(); }); connect(ui->actionStart, &QAction::triggered, this, [this](){ timer->start(1); }); connect(ui->actionPause, &QAction::triggered, this, [this](){ timer->stop(); }); connect(ui->actionSingleStep, &QAction::triggered, this, [this](){ timer->stop(); simulate(); }); } MainWindow::~MainWindow() { delete ui; } QVector> MainWindow::loadProgramCodeFromFile(QString path) { QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw QException(); } QTextStream in(&file); QVector> banks; while(!in.atEnd()) { QString line = in.readLine(); process_line(line, banks); } return banks; } void MainWindow::loadProgramFromFile(QString path, QColor color, int x, int y) { auto programCode = loadProgramCodeFromFile(path); shared_ptr team = make_shared(color); ++team->programCount; simulator.teams.push_back(team); Program program(team, Right, Position{x, y}, 2, 0, 1); program.active = team->id; for(auto& bank : programCode) { vector instructions; for(auto& inst : bank) { instructions.push_back(inst); } program.banks.push_back(make_shared(team, instructions)); } simulator.programs.push_back(program); } void MainWindow::simulate() { mutex.lock(); simulator.simulate(); mutex.unlock(); }