Work on TRK adapter

This commit is contained in:
hjk
2009-08-31 18:04:53 +02:00
parent bde57a8832
commit b9e0860a67
3 changed files with 161 additions and 18 deletions

View File

@@ -44,3 +44,4 @@ rfcomm listen /dev/rfcomm0 1 $PWD/run.pl -af -av -w {}
cp /data5/dev/debugger/symbian-codesourcery-welsh/cs-gdb/build/gdb/gdb cs-gdb cp /data5/dev/debugger/symbian-codesourcery-welsh/cs-gdb/build/gdb/gdb cs-gdb
cp /data5/dev/trk/filebrowseapp* . cp /data5/dev/trk/filebrowseapp* .
cp /home/f*/dev/creator/tests/manual/trk/*.bin .

View File

@@ -82,6 +82,8 @@ $trkservername = ('TRKSERVER-' . $userid) unless defined $trkservername;
my $gdbserverip= '127.0.0.1'; my $gdbserverip= '127.0.0.1';
my $gdbserverport= 2222 + $userid; my $gdbserverport= 2222 + $userid;
print "Serverport: $gdbserverport\n" ;
system('fuser', '-n', 'tcp', '-k', $gdbserverport) if ($isUnix); system('fuser', '-n', 'tcp', '-k', $gdbserverport) if ($isUnix);
# Who writes that? # Who writes that?

View File

@@ -27,6 +27,7 @@
** **
**************************************************************************/ **************************************************************************/
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QFile> #include <QtCore/QFile>
@@ -35,24 +36,47 @@
#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QStringList> #include <QtCore/QStringList>
#include <QtCore/QTextStream> #include <QtCore/QTextStream>
#include <QtCore/QTimer>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QTextEdit>
#include <unistd.h> #include <unistd.h>
///////////////////////////////////////////////////////////////////////
//
// Runner
//
///////////////////////////////////////////////////////////////////////
class Runner : public QObject class Runner : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
Runner(); Runner();
void parseArguments();
signals:
void output(const QString &senderName, const QString &data);
private slots:
void handleProcError(QProcess::ProcessError error);
void handleProcFinished(int exitCode, QProcess::ExitStatus exitStatus);
void handleProcReadyReadStandardError();
void handleProcReadyReadStandardOutput();
void handleProcStarted();
void handleProcStateChanged(QProcess::ProcessState newState);
void run();
private: private:
void parseArguments(); friend class RunnerGui;
void launchAdapter(); void launchAdapter();
void launchTrkServer(); void launchTrkServer();
void writeGdbInit(); void writeGdbInit();
void run(); void connectProcess(QProcess *proc);
void sendOutput(QObject *sender, const QString &data);
void sendOutput(const QString &data) { sendOutput(0, data); }
QStringList m_adapterOptions; QStringList m_adapterOptions;
QStringList m_trkServerOptions; QStringList m_trkServerOptions;
@@ -79,11 +103,82 @@ Runner::Runner()
m_endianness = "little"; m_endianness = "little";
m_runTrkServer = true; m_runTrkServer = true;
m_waitAdapter = 0; m_waitAdapter = 0;
uid_t userId = getuid();
m_gdbServerIP = "127.0.0.1";
m_gdbServerPort = QString::number(2222 + userId);
m_trkServerProc.setObjectName("TRKSERVER");
m_adapterProc.setObjectName("ADAPTER");
m_debuggerProc.setObjectName("GDB");
connectProcess(&m_trkServerProc);
connectProcess(&m_adapterProc);
connectProcess(&m_debuggerProc);
} }
void Runner::connectProcess(QProcess *proc)
{
connect(proc, SIGNAL(error(QProcess::ProcessError)),
this, SLOT(handleProcError(QProcess::ProcessError)));
connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)),
this, SLOT(handleProcFinished(int, QProcess::ExitStatus)));
connect(proc, SIGNAL(readyReadStandardError()),
this, SLOT(handleProcReadyReadStandardError()));
connect(proc, SIGNAL(readyReadStandardOutput()),
this, SLOT(handleProcReadyReadStandardOutput()));
connect(proc, SIGNAL(started()),
this, SLOT(handleProcStarted()));
connect(proc, SIGNAL(stateChanged(QProcess::ProcessState)),
this, SLOT(handleProcStateChanged(QProcess::ProcessState)));
}
void Runner::sendOutput(QObject *sender, const QString &data)
{
if (sender)
emit output(sender->objectName(), data);
else
emit output(QString(), data);
}
void Runner::handleProcError(QProcess::ProcessError error)
{
sendOutput(sender(), QString("Process Error %1").arg(error));
}
void Runner::handleProcFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
sendOutput(sender(),
QString("ProcessFinished %1 %2").arg(exitCode).arg(exitStatus));
}
void Runner::handleProcReadyReadStandardError()
{
QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardError();
sendOutput(sender(), QString("stderr: %1").arg(QString::fromLatin1(ba)));
}
void Runner::handleProcReadyReadStandardOutput()
{
QByteArray ba = qobject_cast<QProcess *>(sender())->readAllStandardOutput();
sendOutput(sender(), QString("stdout: %1").arg(QString::fromLatin1(ba)));
}
void Runner::handleProcStarted()
{
sendOutput(sender(), QString("Process Started"));
}
void Runner::handleProcStateChanged(QProcess::ProcessState newState)
{
sendOutput(sender(), QString("Process State %1").arg(newState));
}
static QString usage() static QString usage()
{ {
return "Usage: run.pl -w -av -aq -au -tv -tq -l [COM]\n\n" return QString("Usage: %1 -w -av -aq -au -tv -tq -l [COM]\n\n"
"Options:\n" "Options:\n"
" -av Adapter verbose\n" " -av Adapter verbose\n"
" -aq Adapter quiet\n" " -aq Adapter quiet\n"
@@ -96,12 +191,13 @@ static QString usage()
" trkserver simulator will be run unless COM is specified\n" " trkserver simulator will be run unless COM is specified\n"
"\n" "\n"
"Bluetooth:\n" "Bluetooth:\n"
" rfcomm listen /dev/rfcomm0 1 $PWD/run.pl -av -af -w {}\n"; " rfcomm listen /dev/rfcomm0 1 $PWD/run.pl -av -af -w {}\n")
.arg(QCoreApplication::arguments().at(0));
} }
void Runner::parseArguments() void Runner::parseArguments()
{ {
QStringList args = qApp->arguments(); QStringList args = QCoreApplication::arguments();
for (int i = 1; i < args.size(); ++i) { for (int i = 1; i < args.size(); ++i) {
const QString arg = args.at(i); const QString arg = args.at(i);
if (arg.startsWith('-')) { if (arg.startsWith('-')) {
@@ -135,11 +231,12 @@ void Runner::parseArguments()
void Runner::launchTrkServer() void Runner::launchTrkServer()
{ {
sendOutput("Launching Trk Server");
const QString dumpPostfix = ".bin"; const QString dumpPostfix = ".bin";
QString trkServerName; QString trkServerName;
if (m_isUnix) if (m_isUnix)
trkServerName = QDir::currentPath() + "trkserver"; trkServerName = QDir::currentPath() + "/trkserver";
else else
trkServerName = "cmd.exe"; trkServerName = "cmd.exe";
@@ -156,7 +253,7 @@ void Runner::launchTrkServer()
trkServerArgs << "0x786a4000" + dumpPostfix; trkServerArgs << "0x786a4000" + dumpPostfix;
trkServerArgs << "0x00600000" + dumpPostfix; trkServerArgs << "0x00600000" + dumpPostfix;
qDebug() << "### Executing: " + trkServerArgs.join(" "); sendOutput("### Starting " + trkServerName + " " + trkServerArgs.join(" "));
m_trkServerProc.start(trkServerName, trkServerArgs); m_trkServerProc.start(trkServerName, trkServerArgs);
m_trkServerProc.waitForStarted(); m_trkServerProc.waitForStarted();
} }
@@ -165,7 +262,7 @@ void Runner::launchAdapter()
{ {
QString adapterName; QString adapterName;
if (m_isUnix) if (m_isUnix)
adapterName = QDir::currentPath() + "adapter"; adapterName = QDir::currentPath() + "/adapter";
else else
adapterName = "cmd.exe"; adapterName = "cmd.exe";
@@ -178,7 +275,7 @@ void Runner::launchAdapter()
adapterArgs << "-s"; adapterArgs << "-s";
adapterArgs << m_trkServerName << m_gdbServerIP + ':' + m_gdbServerPort; adapterArgs << m_trkServerName << m_gdbServerIP + ':' + m_gdbServerPort;
qDebug() << "### Executing: " + adapterArgs.join(" "); sendOutput("### Starting " + adapterName + " " + adapterArgs.join(" "));
m_adapterProc.start(adapterName, adapterArgs); m_adapterProc.start(adapterName, adapterArgs);
m_adapterProc.waitForStarted(); m_adapterProc.waitForStarted();
@@ -194,10 +291,10 @@ void Runner::launchAdapter()
void Runner::writeGdbInit() void Runner::writeGdbInit()
{ {
QString gdbInitFile = ".gdbinit"; QString gdbInitFile = QDir::currentPath() + "/.gdbinit";
QFile file(gdbInitFile); QFile file(gdbInitFile);
if (file.open(QIODevice::WriteOnly)) { if (!file.open(QIODevice::ReadWrite)) {
qDebug() << "Cannot open "<< gdbInitFile; sendOutput(QString("Cannot open %1 for writing").arg(gdbInitFile));
return; return;
} }
QTextStream ts(&file); QTextStream ts(&file);
@@ -230,14 +327,14 @@ void Runner::run()
uid_t userId = getuid(); uid_t userId = getuid();
if (m_trkServerName.isEmpty()) if (m_trkServerName.isEmpty())
m_trkServerName = QString("TRKSERVER-%").arg(userId); m_trkServerName = QString("TRKSERVER-%1").arg(userId);
m_gdbServerIP = "127.0.0.1";
m_gdbServerPort = QString::number(2222 + userId);
if (m_isUnix) { if (m_isUnix) {
QProcess fuserProc; QProcess fuserProc;
fuserProc.start("fuser -n tcp -k " + m_gdbServerPort); fuserProc.start("fuser -n tcp -k " + m_gdbServerPort);
fuserProc.waitForStarted();
fuserProc.closeWriteChannel();
fuserProc.waitForFinished();
qDebug() << "fuser: " << fuserProc.readAllStandardOutput(); qDebug() << "fuser: " << fuserProc.readAllStandardOutput();
qDebug() << "fuser: " << fuserProc.readAllStandardError(); qDebug() << "fuser: " << fuserProc.readAllStandardError();
} }
@@ -253,11 +350,54 @@ void Runner::run()
writeGdbInit(); writeGdbInit();
} }
///////////////////////////////////////////////////////////////////////
//
// RunnerGui
//
///////////////////////////////////////////////////////////////////////
class RunnerGui : public QTextEdit
{
Q_OBJECT
public:
RunnerGui(Runner *runner);
private slots:
void handleOutput(const QString &senderName, const QString &data);
private:
Runner *m_runner;
};
RunnerGui::RunnerGui(Runner *runner)
: m_runner(runner)
{
resize(600, 800);
connect(runner, SIGNAL(output(QString,QString)),
this, SLOT(handleOutput(QString,QString)));
}
void RunnerGui::handleOutput(const QString &senderName, const QString &data)
{
append(senderName + " : " + data);
}
///////////////////////////////////////////////////////////////////////
//
// main
//
///////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
Runner runner; Runner runner;
runner.parseArguments();
RunnerGui gui(&runner);
gui.show();
QTimer::singleShot(0, &runner, SLOT(run()));
return app.exec(); return app.exec();
} }