all repos — mgba @ 9f3cf19c2d11fe139a8fd9e65264c54b4116e1d2

mGBA Game Boy Advance Emulator

src/platform/qt/GDBWindow.cpp (view raw)

 1#include "GDBWindow.h"
 2
 3#include <QGridLayout>
 4#include <QGroupBox>
 5#include <QLabel>
 6#include <QLineEdit>
 7#include <QPushButton>
 8#include <QVBoxLayout>
 9
10#include "GDBController.h"
11
12using namespace QGBA;
13
14GDBWindow::GDBWindow(GDBController* controller, QWidget* parent)
15	: QWidget(parent)
16	, m_gdbController(controller)
17{
18	setWindowFlags(windowFlags() & ~Qt::WindowFullscreenButtonHint);
19	QVBoxLayout* mainSegment = new QVBoxLayout;
20	setLayout(mainSegment);
21	QGroupBox* settings = new QGroupBox(tr("Server settings"));
22	mainSegment->addWidget(settings);
23
24	QGridLayout* settingsGrid = new QGridLayout;
25	settings->setLayout(settingsGrid);
26
27	QLabel* portLabel = new QLabel(tr("Local port"));
28	settingsGrid->addWidget(portLabel, 0, 0, Qt::AlignRight);
29	QLabel* bindAddressLabel = new QLabel(tr("Bind address"));
30	settingsGrid->addWidget(bindAddressLabel, 1, 0, Qt::AlignRight);
31
32	m_portEdit = new QLineEdit("2345");
33	m_portEdit->setMaxLength(5);
34	connect(m_portEdit, SIGNAL(textChanged(const QString&)), this, SLOT(portChanged(const QString&)));
35	settingsGrid->addWidget(m_portEdit, 0, 1, Qt::AlignLeft);
36
37	m_bindAddressEdit = new QLineEdit("0.0.0.0");
38	m_bindAddressEdit->setMaxLength(15);
39	connect(m_bindAddressEdit, SIGNAL(textChanged(const QString&)), this, SLOT(bindAddressChanged(const QString&)));
40	settingsGrid->addWidget(m_bindAddressEdit, 1, 1, Qt::AlignLeft);
41
42	m_startStopButton = new QPushButton(tr("Start"));
43	connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
44	connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
45	mainSegment->addWidget(m_startStopButton);
46}
47
48void GDBWindow::portChanged(const QString& portString) {
49	bool ok = false;
50	ushort port = portString.toUShort(&ok);
51	if (ok) {
52		m_gdbController->setPort(port);
53	}
54}
55
56void GDBWindow::bindAddressChanged(const QString& bindAddressString) {
57	bool ok = false;
58	QStringList parts = bindAddressString.split('.');
59	if (parts.length() != 4) {
60		return;
61	}
62	int i;
63	uint32_t address = 0;
64	for (i = 0; i < 4; ++i) {
65		ushort octet = parts[i].toUShort(&ok);
66		if (!ok) {
67			return;
68		}
69		if (octet > 0xFF) {
70			return;
71		}
72		address <<= 8;
73		address += octet;
74	}
75	m_gdbController->setBindAddress(address);
76}
77
78void GDBWindow::started() {
79	m_portEdit->setEnabled(false);
80	m_bindAddressEdit->setEnabled(false);
81	m_startStopButton->setText(tr("Stop"));
82	disconnect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
83	disconnect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
84	connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(detach()));
85	connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(stopped()));
86}
87
88void GDBWindow::stopped() {
89	m_portEdit->setEnabled(true);
90	m_bindAddressEdit->setEnabled(true);
91	m_startStopButton->setText(tr("Start"));
92	disconnect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(detach()));
93	disconnect(m_startStopButton, SIGNAL(clicked()), this, SLOT(stopped()));
94	connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
95	connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
96}