From 66216448e94fb8bb3875f98b073f8431bb6b485f Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Thu, 16 Jul 2009 16:05:43 +0200 Subject: [PATCH] debugger: implementation progress in the trk manual test --- tests/manual/trk/adapter.cpp | 689 ++++++++++++++++++++++++++++++++- tests/manual/trk/trkserver.cpp | 8 +- tests/manual/trk/trkutils.cpp | 604 ----------------------------- tests/manual/trk/trkutils.h | 87 +---- 4 files changed, 679 insertions(+), 709 deletions(-) diff --git a/tests/manual/trk/adapter.cpp b/tests/manual/trk/adapter.cpp index 5e1320d2bf9..7b0fccfef7a 100644 --- a/tests/manual/trk/adapter.cpp +++ b/tests/manual/trk/adapter.cpp @@ -30,6 +30,7 @@ #include "trkutils.h" #include <QtCore/QCoreApplication> +#include <QtCore/QQueue> #include <QtCore/QTimer> #include <QtNetwork/QTcpServer> @@ -50,6 +51,9 @@ void signalHandler(int) using namespace trk; +#define CB(s) &Adapter::s + + class Adapter : public QObject { Q_OBJECT @@ -68,10 +72,73 @@ private: // Q_SLOT void readFromTrk(); - trk::TrkClient m_trkClient; + typedef void (Adapter::*TrkCallBack)(const TrkResult &); + + struct TrkMessage + { + TrkMessage() { token = 0; callBack = 0; } + byte command; + byte token; + QByteArray data; + TrkCallBack callBack; + }; + + bool openTrkPort(const QString &port); // or server name for local server + void sendTrkMessage(byte command, TrkCallBack callBack = 0, + const QByteArray &lit = QByteArray()); + // adds message to 'send' queue + void queueTrkMessage(const TrkMessage &msg); + void tryTrkWrite(); + void tryTrkRead(); + // actually writes a message to the device + void trkWrite(const TrkMessage &msg); + // convienience messages + void sendTrkInitialPing(); + void waitForTrkFinished(); + void sendTrkAck(byte token); + + // kill process and breakpoints + void cleanUp(); + + void timerEvent(QTimerEvent *ev); + byte nextTrkWriteToken(); + + void handleTrkCpuType(const TrkResult &result); + void handleTrkCreateProcess(const TrkResult &result); + void handleTrkDeleteProcess(const TrkResult &result); + void handleTrkSetBreakpoint(const TrkResult &result); + void handleTrkClearBreakpoint(const TrkResult &result); + void handleTrkContinue(const TrkResult &result); + void handleTrkReadInfo(const TrkResult &result); + void handleTrkWaitForFinished(const TrkResult &result); + void handleTrkStep(const TrkResult &result); + void handleTrkStop(const TrkResult &result); + void handleTrkReadRegisters(const TrkResult &result); + void handleTrkWriteRegisters(const TrkResult &result); + void handleTrkReadMemory(const TrkResult &result); + void handleTrkWriteMemory(const TrkResult &result); + void handleTrkSupportMask(const TrkResult &result); + void handleTrkDisconnect(const TrkResult &result); + + + void setTrkBreakpoint(const Breakpoint &bp); + void clearTrkBreakpoint(const Breakpoint &bp); + void handleTrkResult(const TrkResult &data); + + QLocalSocket *m_trkDevice; + QString m_trkServerName; QByteArray m_trkReadBuffer; + unsigned char m_trkWriteToken; + QQueue<TrkMessage> m_trkWriteQueue; + QHash<byte, TrkMessage> m_writtenTrkMessages; + QByteArray m_trkReadQueue; + bool m_trkWriteBusy; + + QList<Breakpoint> m_breakpoints; + Session m_session; + // // Gdb // @@ -89,22 +156,44 @@ private: QString m_gdbServerName; quint16 m_gdbServerPort; QByteArray m_gdbReadBuffer; - bool m_ackMode; + bool m_gdbAckMode; uint m_registers[100]; }; Adapter::Adapter() { + // Trk +#if USE_NATIVE + m_hdevice = NULL; +#else + m_trkDevice = 0; +#endif + m_trkWriteToken = 0; + m_trkWriteBusy = false; + //m_breakpoints.append(Breakpoint(0x0370)); + //m_breakpoints.append(Breakpoint(0x0340)); + //m_breakpoints.append(Breakpoint(0x0040)); // E32Main + startTimer(100); + + // Gdb m_gdbConnection = 0; - m_ackMode = true; + m_gdbAckMode = true; } Adapter::~Adapter() { + // Trk +#if USE_NATIVE + CloseHandle(m_hdevice); +#else + delete m_trkDevice; +#endif + + // Gdb m_gdbServer.close(); - //m_trkClient->disconnectFromServer(); - m_trkClient.abort(); + //>disconnectFromServer(); + m_trkDevice->abort(); logMessage("Shutting down.\n"); } @@ -122,26 +211,26 @@ void Adapter::setGdbServerName(const QString &name) void Adapter::startServer() { - if (!m_trkClient.openPort(m_trkServerName)) { + if (!openTrkPort(m_trkServerName)) { logMessage("Unable to connect to TRK server"); return; } - m_trkClient.sendInitialPing(); - m_trkClient.sendMessage(0x01); // Connect - //m_trkClient.sendMessage(0x05, CB(handleSupportMask)); - //m_trkClient.sendMessage(0x06, CB(handleCpuType)); - m_trkClient.sendMessage(0x04); // Versions - //sendMessage(0x09); Unrecognized command - m_trkClient.sendMessage(0x4a, 0, + sendTrkInitialPing(); + sendTrkMessage(0x01); // Connect + sendTrkMessage(0x05, CB(handleTrkSupportMask)); + sendTrkMessage(0x06, CB(handleTrkCpuType)); + sendTrkMessage(0x04); // Versions + sendTrkMessage(0x09); // Unrecognized command + sendTrkMessage(0x4a, 0, "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File - m_trkClient.sendMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File + sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File QByteArray exe = "C:\\sys\\bin\\UsingDLLs.exe"; exe.append('\0'); exe.append('\0'); - //m_trkClient.sendMessage(0x40, CB(handleCreateProcess), - // "00 00 00 " + formatString(exe)); // Create Item + sendTrkMessage(0x40, CB(handleTrkCreateProcess), + "00 00 00 " + formatString(exe)); // Create Item logMessage("Connected to TRK server"); @@ -240,7 +329,7 @@ void Adapter::readFromGdb() void Adapter::writeAckToGdb() { - if (!m_ackMode) + if (!m_gdbAckMode) return; QByteArray packet = "+"; logMessage("gdb: <- " + packet); @@ -288,7 +377,7 @@ void Adapter::handleGdbResponse(const QByteArray &response) //$qSupported#37 //logMessage("Handling 'QStartNoAckMode'"); writeToGdb(QByteArray("OK")); - m_ackMode = false; + m_gdbAckMode = false; } else if (response == "g") { @@ -341,6 +430,570 @@ void Adapter::readFromTrk() //logMessage("Read from gdb: " + ba); } +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 0 + m_trkDevice = new Win_QextSerialPort(port); + m_trkDevice->setBaudRate(BAUD115200); + m_trkDevice->setDataBits(DATA_8); + m_trkDevice->setParity(PAR_NONE); + //m_trkDevice->setStopBits(STO); + m_trkDevice->setFlowControl(FLOW_OFF); + m_trkDevice->setTimeout(0, 500); + + if (!m_trkDevice->open(QIODevice::ReadWrite)) { + QByteArray ba = m_trkDevice->errorString().toLatin1(); + logMessage("Could not open device " << ba); + return; + } +#else + m_trkDevice = new QLocalSocket(this); + m_trkDevice->connectToServer(port); + return m_trkDevice->waitForConnected(); +#endif +} + +void Adapter::timerEvent(QTimerEvent *) +{ + //qDebug("."); + tryTrkWrite(); + tryTrkRead(); +} + +unsigned char Adapter::nextTrkWriteToken() +{ + ++m_trkWriteToken; + if (m_trkWriteToken == 0) + ++m_trkWriteToken; + return m_trkWriteToken; +} + +void Adapter::sendTrkMessage(byte command, TrkCallBack callBack, + const QByteArray &lit) +{ + TrkMessage msg; + msg.command = command; + msg.token = nextTrkWriteToken(); + msg.callBack = callBack; + QList<QByteArray> list = lit.split(' '); + foreach (const QByteArray &item, list) { + if (item.isEmpty()) + continue; + bool ok = false; + int i = item.toInt(&ok, 16); + msg.data.append(char(i)); + } + //logMessage("PARSED: " << lit << " -> " << stringFromArray(data).toLatin1().data()); + queueTrkMessage(msg); +} + +void Adapter::sendTrkInitialPing() +{ + TrkMessage msg; + msg.command = 0x00; // Ping + msg.token = 0; // reset sequence count + queueTrkMessage(msg); +} + +void Adapter::waitForTrkFinished() +{ + TrkMessage msg; + // initiate one last roundtrip to ensure all is flushed + msg.command = 0x00; // Ping + msg.token = nextTrkWriteToken(); + msg.callBack = CB(handleTrkWaitForFinished); + queueTrkMessage(msg); +} + +void Adapter::sendTrkAck(byte token) +{ + logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN ").arg(int(token))); + TrkMessage msg; + msg.command = 0x80; + msg.token = token; + msg.data.append('\0'); + // The acknowledgement must not be queued! + //queueMessage(msg); + trkWrite(msg); + // 01 90 00 07 7e 80 01 00 7d 5e 7e +} + +void Adapter::queueTrkMessage(const TrkMessage &msg) +{ + m_trkWriteQueue.append(msg); +} + +void Adapter::tryTrkWrite() +{ + if (m_trkWriteBusy) + return; + if (m_trkWriteQueue.isEmpty()) + return; + + trkWrite(m_trkWriteQueue.dequeue()); +} + +void Adapter::trkWrite(const TrkMessage &msg) +{ + QByteArray ba = frameMessage(msg.command, msg.token, msg.data); + + m_writtenTrkMessages.insert(msg.token, msg); + m_trkWriteBusy = true; + +#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(); + +#endif +} + +void Adapter::tryTrkRead() +{ + //logMessage("TRY READ: " << m_trkDevice->bytesAvailable() + // << stringFromArray(m_trkReadQueue); + +#if USE_NATIVE + + const int BUFFERSIZE = 1024; + char buffer[BUFFERSIZE]; + DWORD charsRead; + + while (ReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL) + && BUFFERSIZE == charsRead) { + m_trkReadQueue.append(buffer, charsRead); + } + m_trkReadQueue.append(buffer, charsRead); + +#else // USE_NATIVE + + if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty()) + return; + + QByteArray res = m_trkDevice->readAll(); + m_trkReadQueue.append(res); + + +#endif // USE_NATIVE + + if (m_trkReadQueue.size() < 9) { + logMessage("ERROR READBUFFER INVALID (1): " + + stringFromArray(m_trkReadQueue)); + m_trkReadQueue.clear(); + return; + } + + while (!m_trkReadQueue.isEmpty()) + handleTrkResult(extractResult(&m_trkReadQueue)); + + m_trkWriteBusy = false; +} + + +void Adapter::handleTrkResult(const TrkResult &result) +{ + QByteArray prefix = "READ BUF: "; + QByteArray str = result.toString().toUtf8(); + switch (result.code) { + case 0x80: { // ACK + logMessage(prefix + "ACK: " + str); + if (!result.data.isEmpty() && result.data.at(0)) + logMessage(prefix + "ERR: " +QByteArray::number(result.data.at(0))); + //logMessage("READ RESULT FOR TOKEN: " << token); + if (!m_writtenTrkMessages.contains(result.token)) { + logMessage("NO ENTRY FOUND!"); + } + TrkMessage msg = m_writtenTrkMessages.take(result.token); + TrkCallBack cb = msg.callBack; + if (cb) { + //logMessage("HANDLE: " << stringFromArray(result.data)); + (this->*cb)(result); + } + break; + } + case 0xff: { // NAK + logMessage(prefix + "NAK: " + str); + //logMessage(prefix << "TOKEN: " << result.token); + logMessage(prefix + "ERROR: " + errorMessage(result.data.at(0))); + break; + } + case 0x90: { // Notified Stopped + logMessage(prefix + "NOTE: STOPPED" + str); + // 90 01 78 6a 40 40 00 00 07 23 00 00 07 24 00 00 + //const char *data = result.data.data(); +// uint addr = extractInt(data); //code address: 4 bytes; code base address for the library +// uint pid = extractInt(data + 4); // ProcessID: 4 bytes; +// uint tid = extractInt(data + 8); // ThreadID: 4 bytes + //logMessage(prefix << " ADDR: " << addr << " PID: " << pid << " TID: " << tid); + sendTrkAck(result.token); + //Sleep(10000); + //cleanUp(); + break; + } + case 0x91: { // Notify Exception (obsolete) + logMessage(prefix + "NOTE: EXCEPTION" + str); + sendTrkAck(result.token); + break; + } + case 0x92: { // + logMessage(prefix + "NOTE: INTERNAL ERROR: " + str); + sendTrkAck(result.token); + break; + } + + // target->host OS notification + case 0xa0: { // Notify Created + /* + const char *data = result.data.data(); + byte error = result.data.at(0); + byte type = result.data.at(1); // type: 1 byte; for dll item, this value is 2. + uint pid = extractInt(data + 2); // ProcessID: 4 bytes; + uint tid = extractInt(data + 6); //threadID: 4 bytes + uint codeseg = extractInt(data + 10); //code address: 4 bytes; code base address for the library + uint dataseg = extractInt(data + 14); //data address: 4 bytes; data base address for the library + uint len = extractShort(data + 18); //length: 2 bytes; length of the library name string to follow + QByteArray name = result.data.mid(20, len); // name: library name + + logMessage(prefix + "NOTE: LIBRARY LOAD: " + str); + logMessage(prefix + "TOKEN: " + result.token); + logMessage(prefix + "ERROR: " + int(error)); + logMessage(prefix + "TYPE: " + int(type)); + logMessage(prefix + "PID: " + pid); + logMessage(prefix + "TID: " + tid); + logMessage(prefix + "CODE: " + codeseg); + logMessage(prefix + "DATA: " + dataseg); + logMessage(prefix + "LEN: " + len); + logMessage(prefix + "NAME: " + name); + */ + + sendTrkMessage(0x18, CB(handleTrkContinue), + formatInt(m_session.pid) + formatInt(m_session.tid)); + + //sendTrkAck(result.token) + break; + } + case 0xa1: { // NotifyDeleted + logMessage(prefix + "NOTE: LIBRARY UNLOAD: " + str); + sendTrkAck(result.token); + break; + } + case 0xa2: { // NotifyProcessorStarted + logMessage(prefix + "NOTE: PROCESSOR STARTED: " + str); + sendTrkAck(result.token); + break; + } + case 0xa6: { // NotifyProcessorStandby + logMessage(prefix + "NOTE: PROCESSOR STANDBY: " + str); + sendTrkAck(result.token); + break; + } + case 0xa7: { // NotifyProcessorReset + logMessage(prefix + "NOTE: PROCESSOR RESET: " + str); + sendTrkAck(result.token); + break; + } + default: { + logMessage(prefix + "INVALID: " + str); + break; + } + } +} + +void Adapter::handleTrkCpuType(const TrkResult &result) +{ + logMessage("HANDLE CPU TYPE: " + result.toString()); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 03 00 04 00 00 04 00 00 00] + m_session.cpuMajor = result.data[0]; + m_session.cpuMinor = result.data[1]; + m_session.bigEndian = result.data[2]; + m_session.defaultTypeSize = result.data[3]; + m_session.fpTypeSize = result.data[4]; + m_session.extended1TypeSize = result.data[5]; + //m_session.extended2TypeSize = result.data[6]; +} + +void Adapter::handleTrkCreateProcess(const TrkResult &result) +{ + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 + // 40 00 00] + + logMessage(" RESULT: " + result.toString()); + const char *data = result.data.data(); + m_session.pid = extractInt(data); + m_session.tid = extractInt(data + 4); + m_session.codeseg = extractInt(data + 8); + m_session.dataseg = extractInt(data + 12); + + /* + logMessage("PID: " + formatInt(m_session.pid) + m_session.pid); + logMessage("TID: " + formatInt(m_session.tid) + m_session.tid); + logMessage("COD: " + formatInt(m_session.codeseg) + m_session.codeseg); + logMessage("DAT: " + formatInt(m_session.dataseg) + m_session.dataseg); + */ + + + //setTrkBreakpoint(0x0000, ArmMode); + //clearTrkBreakpoint(0x0000); + +#if 1 + foreach (const Breakpoint &bp, m_breakpoints) + setTrkBreakpoint(bp); +#endif + +#if 1 + //---IDE------------------------------------------------------ + // Command: 0x42 Read Info + // [42 0C 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F + // 72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00] + sendTrkMessage(0x42, CB(handleTrkReadInfo), + "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " + "72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00"); + //sendTrkMessage(0x42, CB(handleTrkReadInfo), + // "00 01 00 00 00 00"); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x20 Unspecified general OS-related error + // [80 0C 20] + + + //---IDE------------------------------------------------------ + // Command: 0x42 Read Info + // [42 0D 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F + // 72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00] + sendTrkMessage(0x42, CB(handleTrkReadInfo), + "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " + "72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00"); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x20 Unspecified general OS-related error + // [80 0D 20] +#endif + + //sendTrkMessage(0x18, CB(handleTrkStop), + // "01 " + formatInt(m_session.pid) + formatInt(m_session.tid)); + + //---IDE------------------------------------------------------ + // Command: 0x18 Continue + //ProcessID: 0x000001B5 (437) + // ThreadID: 0x000001B6 (438) + // [18 0E 00 00 01 B5 00 00 01 B6] + sendTrkMessage(0x18, CB(handleTrkContinue), + formatInt(m_session.pid) + formatInt(m_session.tid)); + //sendTrkMessage(0x18, CB(handleTrkContinue), + // formatInt(m_session.pid) + "ff ff ff ff"); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 0E 00] +} + +void Adapter::setTrkBreakpoint(const Breakpoint &bp) +{ + //---IDE------------------------------------------------------ + // Command: 0x1B Set Break + //BreakType: 0x82 + // Options: 0x00 + // Address: 0x78674340 (2020033344) i.e + 0x00000340 + // Length: 0x00000001 (1) + // Count: 0x00000000 (0) + //ProcessID: 0x000001b5 (437) + // ThreadID: 0xffffffff (-1) + // [1B 09 82 00 78 67 43 40 00 00 00 01 00 00 00 00 + // 00 00 01 B5 FF FF FF FF] + sendTrkMessage(0x1B, CB(handleTrkSetBreakpoint), + "82 " + + QByteArray(bp.mode == ArmMode ? "00 " : "01 ") + + formatInt(m_session.codeseg + bp.offset) + + "00 00 00 01 00 00 00 00 " + formatInt(m_session.pid) + + "FF FF FF FF"); + //m_session.toekn + + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 09 00 00 00 00 0A] +} + +void Adapter::handleTrkSetBreakpoint(const TrkResult &result) +{ + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 09 00 00 00 00 0A] + uint bpnr = extractInt(result.data.data()); + logMessage("SET BREAKPOINT " + bpnr + + stringFromArray(result.data.data())); +} + +void Adapter::clearTrkBreakpoint(const Breakpoint &bp) +{ + sendTrkMessage(0x1C, CB(handleTrkClearBreakpoint), + //formatInt(m_session.codeseg + bp.offset)); + "00 " + formatShort(bp.number) + + formatInt(m_session.codeseg + bp.offset)); + + //---IDE------------------------------------------------------ + // Command: 0x1C Clear Break + // [1C 25 00 00 00 0A 78 6A 43 40] +} + +void Adapter::handleTrkClearBreakpoint(const TrkResult &result) +{ + Q_UNUSED(result); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 09 00 00 00 00 0A] + logMessage("CLEAR BREAKPOINT "); +} + +void Adapter::handleTrkContinue(const TrkResult &result) +{ + logMessage(" HANDLE CONTINUE: " + stringFromArray(result.data)); + //if (result.result.token) + //logMessage(" ERROR: " + byte(result.result.token) + // sendTrkMessage(0x18, CB(handleTrkContinue), + // formatInt(m_session.pid) + formatInt(m_session.tid)); + //} +} + +void Adapter::handleTrkDisconnect(const TrkResult &result) +{ + logMessage(" HANDLE DISCONNECT: " + stringFromArray(result.data)); + //if (result.result.token) + //logMessage(" ERROR: " + byte(result.result.token) + // sendTrkMessage(0x18, CB(handleTrkContinue), + // formatInt(m_session.pid) + formatInt(m_session.tid)); + //} +} + +void Adapter::handleTrkDeleteProcess(const TrkResult &result) +{ + logMessage(" HANDLE DELETE PROCESS: " + stringFromArray(result.data)); + //if (result.result.token) + //logMessage(" ERROR: " + byte(result.token) + // sendTrkMessage(0x18, CB(handleTrkContinue), + // formatInt(m_session.pid) + formatInt(m_session.tid)); + //} +} + +void Adapter::handleTrkStep(const TrkResult &result) +{ + logMessage(" HANDLE STEP: " + stringFromArray(result.data)); +} + +void Adapter::handleTrkStop(const TrkResult &result) +{ + logMessage(" HANDLE STOP: " + stringFromArray(result.data)); +} + + +void Adapter::handleTrkReadInfo(const TrkResult &result) +{ + logMessage(" HANDLE READ INFO: " + stringFromArray(result.data)); +} + +void Adapter::handleTrkWaitForFinished(const TrkResult &result) +{ + logMessage(" FINISHED: " + stringFromArray(result.data)); + //qApp->exit(1); +} + +void Adapter::handleTrkSupportMask(const TrkResult &result) +{ + const char *data = result.data.data(); + QByteArray str; + for (int i = 0; i < 32; ++i) { + //str.append(" [" + formatByte(data[i]) + "]: "); + for (int j = 0; j < 8; ++j) + if (data[i] & (1 << j)) + str.append(formatByte(i * 8 + j)); + } + logMessage("SUPPORTED: " + str); +} + + +void Adapter::cleanUp() +{ + // + //---IDE------------------------------------------------------ + // Command: 0x41 Delete Item + // Sub Cmd: Delete Process + //ProcessID: 0x0000071F (1823) + // [41 24 00 00 00 00 07 1F] + sendTrkMessage(0x41, CB(handleTrkDeleteProcess), + "00 00 " + formatInt(m_session.pid)); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 24 00] + + foreach (const Breakpoint &bp, m_breakpoints) + clearTrkBreakpoint(bp); + + //---IDE------------------------------------------------------ + // Command: 0x1C Clear Break + // [1C 25 00 00 00 0A 78 6A 43 40] + + //---TRK------------------------------------------------------ + // Command: 0xA1 Notify Deleted + // [A1 09 00 00 00 00 00 00 00 00 07 1F] + //---IDE------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 09 00] + + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 25 00] + + //---IDE------------------------------------------------------ + // Command: 0x1C Clear Break + // [1C 26 00 00 00 0B 78 6A 43 70] + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 + // [80 26 00] + + + //---IDE------------------------------------------------------ + // Command: 0x02 Disconnect + // [02 27] + sendTrkMessage(0x02, CB(handleTrkDisconnect)); + //---TRK------------------------------------------------------ + // Command: 0x80 Acknowledge + // Error: 0x00 +} + int main(int argc, char *argv[]) { if (argc < 3) { diff --git a/tests/manual/trk/trkserver.cpp b/tests/manual/trk/trkserver.cpp index 764cacda368..cc8cbf59e70 100644 --- a/tests/manual/trk/trkserver.cpp +++ b/tests/manual/trk/trkserver.cpp @@ -177,14 +177,18 @@ void TrkServer::writeToAdapter(byte command, byte token, const QByteArray &data) void TrkServer::handleAdapterMessage(const TrkResult &result) { QByteArray data; + data.append(char(0x00)); // No error switch (result.code) { case 0x00: { // Ping - data.append(char(0x00)); // No error writeToAdapter(0x80, 0x00, data); break; } + case 0x01: { // Connect + writeToAdapter(0x80, result.token, data); + break; + } default: - data.append(char(0x10)); // Command not supported + data[0] = 0x10; // Command not supported writeToAdapter(0xff, result.token, data); break; } diff --git a/tests/manual/trk/trkutils.cpp b/tests/manual/trk/trkutils.cpp index 3277747d053..681dcaefd25 100644 --- a/tests/manual/trk/trkutils.cpp +++ b/tests/manual/trk/trkutils.cpp @@ -192,8 +192,6 @@ QByteArray encode7d(const QByteArray &ba) return res; } -#define CB(s) &TrkClient::s - // FIXME: Use the QByteArray based version below? QString stringFromByte(byte c) { @@ -278,608 +276,6 @@ QByteArray errorMessage(byte code) return "Unknown error"; } -TrkClient::TrkClient() -{ -#if USE_NATIVE - m_hdevice = NULL; -#else - m_device = 0; -#endif - m_writeToken = 0; - m_readToken = 0; - m_writeBusy = false; - //m_breakpoints.append(Breakpoint(0x0370)); - //m_breakpoints.append(Breakpoint(0x0340)); - //m_breakpoints.append(Breakpoint(0x0040)); // E32Main - startTimer(100); -} - -TrkClient::~TrkClient() -{ -#if USE_NATIVE - CloseHandle(m_hdevice); -#else - delete m_device; -#endif -} - -bool TrkClient::openPort(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_device = new QFile; - if (!m_device->open(f, QIODevice::ReadWrite)) - */ - -#if 0 - m_device = new Win_QextSerialPort(port); - m_device->setBaudRate(BAUD115200); - m_device->setDataBits(DATA_8); - m_device->setParity(PAR_NONE); - //m_device->setStopBits(STO); - m_device->setFlowControl(FLOW_OFF); - m_device->setTimeout(0, 500); - - if (!m_device->open(QIODevice::ReadWrite)) { - QByteArray ba = m_device->errorString().toLatin1(); - logMessage("Could not open device " << ba); - return; - } -#else - m_device = new QLocalSocket(this); - m_device->connectToServer(port); - return m_device->waitForConnected(); -#endif -} - -void TrkClient::timerEvent(QTimerEvent *) -{ - //qDebug("."); - tryWrite(); - tryRead(); -} - -unsigned char TrkClient::nextWriteToken() -{ - ++m_writeToken; - if (m_writeToken == 0) - ++m_writeToken; - return m_writeToken; -} - -void TrkClient::sendMessage(byte command, - CallBack callBack, const QByteArray &lit) -{ - Message msg; - msg.command = command; - msg.token = nextWriteToken(); - msg.callBack = callBack; - QList<QByteArray> list = lit.split(' '); - foreach (const QByteArray &item, list) { - if (item.isEmpty()) - continue; - bool ok = false; - int i = item.toInt(&ok, 16); - msg.data.append(char(i)); - } - //logMessage("PARSED: " << lit << " -> " << stringFromArray(data).toLatin1().data()); - queueMessage(msg); -} - -void TrkClient::sendInitialPing() -{ - Message msg; - msg.command = 0x00; // Ping - msg.token = 0; // reset sequence count - queueMessage(msg); -} - -void TrkClient::waitForFinished() -{ - Message msg; - // initiate one last roundtrip to ensure all is flushed - msg.command = 0x00; // Ping - msg.token = nextWriteToken(); - msg.callBack = CB(handleWaitForFinished); - queueMessage(msg); -} - -void TrkClient::sendAck(byte token) -{ - logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN ").arg(int(token))); - Message msg; - msg.command = 0x80; - msg.token = token; - msg.data.append('\0'); - // The acknowledgement must not be queued! - //queueMessage(msg); - doWrite(msg); - // 01 90 00 07 7e 80 01 00 7d 5e 7e -} - -void TrkClient::queueMessage(const Message &msg) -{ - m_writeQueue.append(msg); -} - -void TrkClient::tryWrite() -{ - if (m_writeBusy) - return; - if (m_writeQueue.isEmpty()) - return; - - doWrite(m_writeQueue.dequeue()); -} - -void TrkClient::doWrite(const Message &msg) -{ - QByteArray ba = frameMessage(msg.command, msg.token, msg.data); - - m_written.insert(msg.token, msg); - m_writeBusy = true; - -#if USE_NATIVE - - DWORD charsWritten; - - if (!WriteFile( m_hdevice, - ba.data(), - ba.size(), - &charsWritten, - NULL)){ - logMessage("WRITE ERROR: "); - } - - - logMessage("WRITE: " << qPrintable(stringFromArray(ba))); - FlushFileBuffers(m_hdevice); - -#else - - logMessage("WRITE: " << qPrintable(stringFromArray(ba))); - if (!m_device->write(ba)) - logMessage("WRITE ERROR: " << m_device->errorString()); - m_device->flush(); - -#endif - -} - -void TrkClient::tryRead() -{ - //logMessage("TRY READ: " << m_device->bytesAvailable() - // << stringFromArray(m_readQueue); - -#if USE_NATIVE - - const int BUFFERSIZE = 1024; - char buffer[BUFFERSIZE]; - DWORD charsRead; - - while (ReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL) - && BUFFERSIZE == charsRead) { - m_readQueue.append(buffer, charsRead); - } - m_readQueue.append(buffer, charsRead); - -#else // USE_NATIVE - - if (m_device->bytesAvailable() == 0 && m_readQueue.isEmpty()) - return; - - QByteArray res = m_device->readAll(); - m_readQueue.append(res); - - -#endif // USE_NATIVE - - if (m_readQueue.size() < 9) { - logMessage("ERROR READBUFFER INVALID (1): " - << stringFromArray(m_readQueue)); - m_readQueue.clear(); - return; - } - - while (!m_readQueue.isEmpty()) - handleResult(extractResult(&m_readQueue)); - - m_writeBusy = false; -} - - -void TrkClient::handleResult(const TrkResult &result) -{ - const char *prefix = "READ BUF: "; - QByteArray str = result.toString().toUtf8(); - switch (result.code) { - case 0x80: { // ACK - logMessage(prefix << "ACK: " << str.data()); - if (!result.data.isEmpty() && result.data.at(0)) - logMessage(prefix << "ERR: " << QByteArray::number(result.data.at(0))); - //logMessage("READ RESULT FOR TOKEN: " << token); - if (!m_written.contains(result.token)) { - logMessage("NO ENTRY FOUND!"); - } - Message msg = m_written.take(result.token); - CallBack cb = msg.callBack; - if (cb) { - //logMessage("HANDLE: " << stringFromArray(result.data)); - (this->*cb)(result); - } - break; - } - case 0xff: { // NAK - logMessage(prefix << "NAK: " << str.data()); - //logMessage(prefix << "TOKEN: " << result.token); - logMessage(prefix << "ERROR: " << errorMessage(result.data.at(0))); - break; - } - case 0x90: { // Notified Stopped - logMessage(prefix << "NOTE: STOPPED" << str.data()); - // 90 01 78 6a 40 40 00 00 07 23 00 00 07 24 00 00 - const char *data = result.data.data(); - uint addr = extractInt(data); //code address: 4 bytes; code base address for the library - uint pid = extractInt(data + 4); // ProcessID: 4 bytes; - uint tid = extractInt(data + 8); // ThreadID: 4 bytes - logMessage(prefix << " ADDR: " << addr << " PID: " << pid << " TID: " << tid); - sendAck(result.token); - //Sleep(10000); - //cleanUp(); - break; - } - case 0x91: { // Notify Exception (obsolete) - logMessage(prefix << "NOTE: EXCEPTION" << str.data()); - sendAck(result.token); - break; - } - case 0x92: { // - logMessage(prefix << "NOTE: INTERNAL ERROR: " << str.data()); - sendAck(result.token); - break; - } - - // target->host OS notification - case 0xa0: { // Notify Created - const char *data = result.data.data(); - byte error = result.data.at(0); - byte type = result.data.at(1); // type: 1 byte; for dll item, this value is 2. - uint pid = extractInt(data + 2); // ProcessID: 4 bytes; - uint tid = extractInt(data + 6); //threadID: 4 bytes - uint codeseg = extractInt(data + 10); //code address: 4 bytes; code base address for the library - uint dataseg = extractInt(data + 14); //data address: 4 bytes; data base address for the library - uint len = extractShort(data + 18); //length: 2 bytes; length of the library name string to follow - QByteArray name = result.data.mid(20, len); // name: library name - - logMessage(prefix << "NOTE: LIBRARY LOAD: " << str.data()); - logMessage(prefix << "TOKEN: " << result.token); - logMessage(prefix << "ERROR: " << int(error)); - logMessage(prefix << "TYPE: " << int(type)); - logMessage(prefix << "PID: " << pid); - logMessage(prefix << "TID: " << tid); - logMessage(prefix << "CODE: " << codeseg); - logMessage(prefix << "DATA: " << dataseg); - logMessage(prefix << "LEN: " << len); - logMessage(prefix << "NAME: " << name); - - sendMessage(0x18, CB(handleContinue), - formatInt(m_session.pid) + formatInt(m_session.tid)); - - //sendAck(result.token) - break; - } - case 0xa1: { // NotifyDeleted - logMessage(prefix << "NOTE: LIBRARY UNLOAD: " << str.data()); - sendAck(result.token); - break; - } - case 0xa2: { // NotifyProcessorStarted - logMessage(prefix << "NOTE: PROCESSOR STARTED: " << str.data()); - sendAck(result.token); - break; - } - case 0xa6: { // NotifyProcessorStandby - logMessage(prefix << "NOTE: PROCESSOR STANDBY: " << str.data()); - sendAck(result.token); - break; - } - case 0xa7: { // NotifyProcessorReset - logMessage(prefix << "NOTE: PROCESSOR RESET: " << str.data()); - sendAck(result.token); - break; - } - default: { - logMessage(prefix << "INVALID: " << str << result.data.size()); - break; - } - } -} - -void TrkClient::handleCpuType(const TrkResult &result) -{ - logMessage("HANDLE CPU TYPE: " << result.toString()); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 03 00 04 00 00 04 00 00 00] - m_session.cpuMajor = result.data[0]; - m_session.cpuMinor = result.data[1]; - m_session.bigEndian = result.data[2]; - m_session.defaultTypeSize = result.data[3]; - m_session.fpTypeSize = result.data[4]; - m_session.extended1TypeSize = result.data[5]; - //m_session.extended2TypeSize = result.data[6]; -} - -void TrkClient::handleCreateProcess(const TrkResult &result) -{ - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 - // 40 00 00] - - logMessage(" RESULT: " << qPrintable(result.toString())); - const char *data = result.data.data(); - m_session.pid = extractInt(data); - m_session.tid = extractInt(data + 4); - m_session.codeseg = extractInt(data + 8); - m_session.dataseg = extractInt(data + 12); - - logMessage("PID: " << formatInt(m_session.pid) << m_session.pid); - logMessage("TID: " << formatInt(m_session.tid) << m_session.tid); - logMessage("COD: " << formatInt(m_session.codeseg) << m_session.codeseg); - logMessage("DAT: " << formatInt(m_session.dataseg) << m_session.dataseg); - - - //setBreakpoint(0x0000, ArmMode); - //clearBreakpoint(0x0000); - -#if 1 - foreach (const Breakpoint &bp, m_breakpoints) - setBreakpoint(bp); -#endif - -#if 1 - //---IDE------------------------------------------------------ - // Command: 0x42 Read Info - // [42 0C 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F - // 72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00] - sendMessage(0x42, CB(handleReadInfo), - "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " - "72 70 68 69 63 44 4C 4C 32 2E 64 6C 6C 00"); - //sendMessage(0x42, CB(handleReadInfo), - // "00 01 00 00 00 00"); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x20 Unspecified general OS-related error - // [80 0C 20] - - - //---IDE------------------------------------------------------ - // Command: 0x42 Read Info - // [42 0D 00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F - // 72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00] - sendMessage(0x42, CB(handleReadInfo), - "00 06 00 00 00 00 00 14 50 6F 6C 79 6D 6F " - "72 70 68 69 63 44 4C 4C 31 2E 64 6C 6C 00"); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x20 Unspecified general OS-related error - // [80 0D 20] -#endif - - //sendMessage(0x18, CB(handleStop), - // "01 " + formatInt(m_session.pid) + formatInt(m_session.tid)); - - //---IDE------------------------------------------------------ - // Command: 0x18 Continue - //ProcessID: 0x000001B5 (437) - // ThreadID: 0x000001B6 (438) - // [18 0E 00 00 01 B5 00 00 01 B6] - sendMessage(0x18, CB(handleContinue), - formatInt(m_session.pid) + formatInt(m_session.tid)); - //sendMessage(0x18, CB(handleContinue), - // formatInt(m_session.pid) + "ff ff ff ff"); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 0E 00] -} - -void TrkClient::setBreakpoint(const Breakpoint &bp) -{ - //---IDE------------------------------------------------------ - // Command: 0x1B Set Break - //BreakType: 0x82 - // Options: 0x00 - // Address: 0x78674340 (2020033344) i.e + 0x00000340 - // Length: 0x00000001 (1) - // Count: 0x00000000 (0) - //ProcessID: 0x000001b5 (437) - // ThreadID: 0xffffffff (-1) - // [1B 09 82 00 78 67 43 40 00 00 00 01 00 00 00 00 - // 00 00 01 B5 FF FF FF FF] - sendMessage(0x1B, CB(handleSetBreakpoint), - "82 " - + QByteArray(bp.mode == ArmMode ? "00 " : "01 ") - + formatInt(m_session.codeseg + bp.offset) - + "00 00 00 01 00 00 00 00 " + formatInt(m_session.pid) - + "FF FF FF FF"); - //m_session.toekn - - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 09 00 00 00 00 0A] -} - -void TrkClient::handleSetBreakpoint(const TrkResult &result) -{ - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 09 00 00 00 00 0A] - uint bpnr = extractInt(result.data.data()); - logMessage("SET BREAKPOINT " << bpnr - << stringFromArray(result.data.data())); -} - -void TrkClient::clearBreakpoint(const Breakpoint &bp) -{ - sendMessage(0x1C, CB(handleClearBreakpoint), - //formatInt(m_session.codeseg + bp.offset)); - "00 " + formatShort(bp.number) - + formatInt(m_session.codeseg + bp.offset)); - - //---IDE------------------------------------------------------ - // Command: 0x1C Clear Break - // [1C 25 00 00 00 0A 78 6A 43 40] -} - -void TrkClient::handleClearBreakpoint(const TrkResult &result) -{ - Q_UNUSED(result); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 09 00 00 00 00 0A] - logMessage("CLEAR BREAKPOINT "); -} - -void TrkClient::handleContinue(const TrkResult &result) -{ - logMessage(" HANDLE CONTINUE: " << qPrintable(stringFromArray(result.data))); - //if (result.result.token) - //logMessage(" ERROR: " << byte(result.result.token) - // sendMessage(0x18, CB(handleContinue), - // formatInt(m_session.pid) + formatInt(m_session.tid)); - //} -} - -void TrkClient::handleDisconnect(const TrkResult &result) -{ - logMessage(" HANDLE DISCONNECT: " - << qPrintable(stringFromArray(result.data))); - //if (result.result.token) - //logMessage(" ERROR: " << byte(result.result.token) - // sendMessage(0x18, CB(handleContinue), - // formatInt(m_session.pid) + formatInt(m_session.tid)); - //} -} - -void TrkClient::handleDeleteProcess(const TrkResult &result) -{ - logMessage(" HANDLE DELETE PROCESS: " << -qPrintable(stringFromArray(result.data))); - //if (result.result.token) - //logMessage(" ERROR: " << byte(result.token) - // sendMessage(0x18, CB(handleContinue), - // formatInt(m_session.pid) + formatInt(m_session.tid)); - //} -} - -void TrkClient::handleStep(const TrkResult &result) -{ - logMessage(" HANDLE STEP: " << -qPrintable(stringFromArray(result.data))); -} - -void TrkClient::handleStop(const TrkResult &result) -{ - logMessage(" HANDLE STOP: " << -qPrintable(stringFromArray(result.data))); -} - - -void TrkClient::handleReadInfo(const TrkResult &result) -{ - logMessage(" HANDLE READ INFO: " << -qPrintable(stringFromArray(result.data))); -} - -void TrkClient::handleWaitForFinished(const TrkResult &result) -{ - logMessage(" FINISHED: " << qPrintable(stringFromArray(result.data))); - //qApp->exit(1); -} - -void TrkClient::handleSupportMask(const TrkResult &result) -{ - const char *data = result.data.data(); - QByteArray str; - for (int i = 0; i < 32; ++i) { - //str.append(" [" + formatByte(data[i]) + "]: "); - for (int j = 0; j < 8; ++j) - if (data[i] & (1 << j)) - str.append(formatByte(i * 8 + j)); - } - logMessage("SUPPORTED: " << str); -} - - -void TrkClient::cleanUp() -{ - // - //---IDE------------------------------------------------------ - // Command: 0x41 Delete Item - // Sub Cmd: Delete Process - //ProcessID: 0x0000071F (1823) - // [41 24 00 00 00 00 07 1F] - sendMessage(0x41, CB(handleDeleteProcess), - "00 00 " + formatInt(m_session.pid)); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 24 00] - - foreach (const Breakpoint &bp, m_breakpoints) - clearBreakpoint(bp); - - //---IDE------------------------------------------------------ - // Command: 0x1C Clear Break - // [1C 25 00 00 00 0A 78 6A 43 40] - - //---TRK------------------------------------------------------ - // Command: 0xA1 Notify Deleted - // [A1 09 00 00 00 00 00 00 00 00 07 1F] - //---IDE------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 09 00] - - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 25 00] - - //---IDE------------------------------------------------------ - // Command: 0x1C Clear Break - // [1C 26 00 00 00 0B 78 6A 43 70] - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 - // [80 26 00] - - - //---IDE------------------------------------------------------ - // Command: 0x02 Disconnect - // [02 27] - sendMessage(0x02, CB(handleDisconnect)); - //---TRK------------------------------------------------------ - // Command: 0x80 Acknowledge - // Error: 0x00 -} - -void TrkClient::onStopped(const TrkResult &result) -{ - Q_UNUSED(result); -} } // namespace trk diff --git a/tests/manual/trk/trkutils.h b/tests/manual/trk/trkutils.h index ee6530cadbb..8632541a45f 100644 --- a/tests/manual/trk/trkutils.h +++ b/tests/manual/trk/trkutils.h @@ -32,12 +32,8 @@ #include <QtCore/QByteArray> #include <QtCore/QHash> -#include <QtCore/QObject> -#include <QtCore/QQueue> #include <QtCore/QString> -#include <QtNetwork/QLocalSocket> - namespace trk { typedef unsigned char byte; @@ -111,7 +107,7 @@ struct Breakpoint struct TrkResult { - TrkResult() {} + TrkResult() { code = token = 0; } QString toString() const; byte code; @@ -119,89 +115,10 @@ struct TrkResult QByteArray data; }; -class TrkClient : public QObject -{ - Q_OBJECT - -public: - TrkClient(); - ~TrkClient(); - struct Message; - typedef void (TrkClient::*CallBack)(const TrkResult &); - -public slots: - void abort() { m_device->abort(); } - bool openPort(const QString &port); // or server name for local server - void sendMessage(byte command, CallBack callBack = 0, - const QByteArray &lit = QByteArray()); - // adds message to 'send' queue - void queueMessage(const Message &msg); - void tryWrite(); - void tryRead(); - // actually writes a message to the device - void doWrite(const Message &msg); - // convienience messages - void sendInitialPing(); - void waitForFinished(); - void sendAck(byte token); - - // kill process and breakpoints - void cleanUp(); - -public: - struct Message - { - Message() { token = 0; callBack = 0; } - byte command; - byte token; - QByteArray data; - CallBack callBack; - }; - -private: - void timerEvent(QTimerEvent *ev); - byte nextWriteToken(); - - void handleCpuType(const TrkResult &result); - void handleCreateProcess(const TrkResult &result); - void handleDeleteProcess(const TrkResult &result); - void handleSetBreakpoint(const TrkResult &result); - void handleClearBreakpoint(const TrkResult &result); - void handleContinue(const TrkResult &result); - void handleReadInfo(const TrkResult &result); - void handleWaitForFinished(const TrkResult &result); - void handleStep(const TrkResult &result); - void handleStop(const TrkResult &result); - void handleReadRegisters(const TrkResult &result); - void handleWriteRegisters(const TrkResult &result); - void handleReadMemory(const TrkResult &result); - void handleWriteMemory(const TrkResult &result); - void handleSupportMask(const TrkResult &result); - void handleDisconnect(const TrkResult &result); - - - void setBreakpoint(const Breakpoint &bp); - void clearBreakpoint(const Breakpoint &bp); - void onStopped(const TrkResult &result); - void handleResult(const TrkResult &data); - - QLocalSocket *m_device; - - unsigned char m_writeToken; - QQueue<Message> m_writeQueue; - QHash<byte, Message> m_written; - unsigned char m_readToken; - QByteArray m_readQueue; - bool m_writeBusy; - - QList<Breakpoint> m_breakpoints; - Session m_session; -}; - // returns a QByteArray containing 0x01 0x90 <len> 0x7e encoded7d(ba) 0x7e QByteArray frameMessage(byte command, byte token, const QByteArray &data); TrkResult extractResult(QByteArray *buffer); - +QByteArray errorMessage(byte code); } // namespace trk -- GitLab