#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
+#if USE_NATIVE
+#include <windows.h>
+#endif
+
#ifdef Q_OS_UNIX
#include <signal.h>
~Adapter();
void setGdbServerName(const QString &name);
void setTrkServerName(const QString &name) { m_trkServerName = name; }
- void startServer();
+ bool startServer();
private:
//
void startInferiorIfNeeded();
void interruptInferior();
- QLocalSocket *m_trkDevice;
+#if USE_NATIVE
+ HANDLE m_hdevice;
+#else
+ QLocalSocket *m_trkDevice;
+#endif
QString m_trkServerName;
QByteArray m_trkReadBuffer;
#if USE_NATIVE
CloseHandle(m_hdevice);
#else
+ m_trkDevice->abort();
delete m_trkDevice;
#endif
// Gdb
m_gdbServer.close();
//>disconnectFromServer();
- m_trkDevice->abort();
logMessage("Shutting down.\n");
}
}
}
-void Adapter::startServer()
+bool Adapter::startServer()
{
if (!openTrkPort(m_trkServerName)) {
logMessage("Unable to connect to TRK server");
- return;
+ return false;
}
sendTrkInitialPing();
logMessage(QString("Unable to start the gdb server at %1:%2: %3.")
.arg(m_gdbServerName).arg(m_gdbServerPort)
.arg(m_gdbServer.errorString()));
- return;
+ return false;
}
logMessage(QString("Gdb server running on port %1. Run arm-gdb now.")
connect(&m_gdbServer, SIGNAL(newConnection()),
this, SLOT(handleGdbConnection()));
+ return true;
}
void Adapter::logMessage(const QString &msg)
bool Adapter::openTrkPort(const QString &port)
{
- // QFile does not work with "COM3", so work around
- /*
- FILE *f = fopen("COM3", "r+");
- if (!f) {
- logMessage("Could not open file ");
- return;
- }
- m_trkDevice = new QFile;
- if (!m_trkDevice->open(f, QIODevice::ReadWrite))
- */
-
+#if USE_NATIVE
+ m_hdevice = CreateFile(port.toStdWString().c_str(),
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (INVALID_HANDLE_VALUE == m_hdevice){
+ logMessage("Could not open device " + port);
+ return false;
+ }
+ return true;
+#else
#if 0
m_trkDevice = new Win_QextSerialPort(port);
m_trkDevice->setBaudRate(BAUD115200);
if (!m_trkDevice->open(QIODevice::ReadWrite)) {
QByteArray ba = m_trkDevice->errorString().toLatin1();
logMessage("Could not open device " << ba);
- return;
+ return false;
}
+ return true
#else
m_trkDevice = new QLocalSocket(this);
m_trkDevice->connectToServer(port);
return m_trkDevice->waitForConnected();
#endif
+#endif
}
void Adapter::timerEvent(QTimerEvent *)
m_writtenTrkMessages.insert(msg.token, msg);
m_trkWriteBusy = true;
-#if USE_NATIVE
+ logMessage("WRITE: " + stringFromArray(ba));
+#if USE_NATIVE
DWORD charsWritten;
if (!WriteFile(m_hdevice, ba.data(), ba.size(), &charsWritten, NULL))
logMessage("WRITE ERROR: ");
- //logMessage("WRITE: " + stringFromArray(ba));
FlushFileBuffers(m_hdevice);
-
#else
-
- //logMessage("WRITE: " + stringFromArray(ba));
if (!m_trkDevice->write(ba))
logMessage("WRITE ERROR: " + m_trkDevice->errorString());
m_trkDevice->flush();
// << stringFromArray(m_trkReadQueue);
#if USE_NATIVE
-
- const int BUFFERSIZE = 1024;
+ const DWORD BUFFERSIZE = 1;
char buffer[BUFFERSIZE];
DWORD charsRead;
- while (ReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)
- && BUFFERSIZE == charsRead) {
+ while (ReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)) {
m_trkReadQueue.append(buffer, charsRead);
+ if (isValidTrkResult(m_trkReadQueue))
+ break;
}
- m_trkReadQueue.append(buffer, charsRead);
-
#else // USE_NATIVE
if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty())
m_snapshot.registers[i] = extractInt(data + 4 * i);
//qDebug() << i << hexNumber(m_snapshot.registers[i], 8);
}
-
//QByteArray ba = result.data.toHex();
QByteArray ba;
for (int i = 0; i < 16; ++i)
ba += hexNumber(m_snapshot.registers[i], 8);
-
sendGdbMessage(ba, "register contents");
}
Adapter adapter;
adapter.setTrkServerName(argv[1]);
adapter.setGdbServerName(argv[2]);
- adapter.startServer();
-
- return app.exec();
+ if (adapter.startServer())
+ return app.exec();
+ return 4;
}
#include "adapter.moc"