src/platform/qt/GDBController.cpp (view raw)
1#include "GDBController.h"
2
3#include "GameController.h"
4
5using namespace QGBA;
6
7GDBController::GDBController(GameController* controller, QObject* parent)
8 : QObject(parent)
9 , m_gameController(controller)
10 , m_port(2345)
11 , m_bindAddress(0)
12{
13 GDBStubCreate(&m_gdbStub);
14}
15
16ushort GDBController::port() {
17 return m_port;
18}
19
20uint32_t GDBController::bindAddress() {
21 return m_bindAddress;
22}
23
24bool GDBController::isAttached() {
25 return m_gameController->debugger() == &m_gdbStub.d;
26}
27
28void GDBController::setPort(ushort port) {
29 m_port = port;
30}
31
32void GDBController::setBindAddress(uint32_t bindAddress) {
33 m_bindAddress = bindAddress;
34}
35
36void GDBController::attach() {
37 if (isAttached()) {
38 return;
39 }
40 m_gameController->setDebugger(&m_gdbStub.d);
41}
42
43void GDBController::detach() {
44 if (!isAttached()) {
45 return;
46 }
47 bool wasPaused = m_gameController->isPaused();
48 disconnect(m_gameController, SIGNAL(frameAvailable(const uint32_t*)), this, SLOT(updateGDB()));
49 m_gameController->setPaused(true);
50 GDBStubShutdown(&m_gdbStub);
51 m_gameController->setDebugger(nullptr);
52 m_gameController->setPaused(wasPaused);
53}
54
55void GDBController::listen() {
56 if (!isAttached()) {
57 attach();
58 }
59 bool wasPaused = m_gameController->isPaused();
60 connect(m_gameController, SIGNAL(frameAvailable(const uint32_t*)), this, SLOT(updateGDB()));
61 m_gameController->setPaused(true);
62 GDBStubListen(&m_gdbStub, m_port, m_bindAddress);
63 m_gameController->setPaused(wasPaused);
64}
65
66void GDBController::updateGDB() {
67 bool wasPaused = m_gameController->isPaused();
68 m_gameController->setPaused(true);
69 GDBStubUpdate(&m_gdbStub);
70 m_gameController->setPaused(wasPaused);
71}