diff --git a/src/plugins/baremetal/baremetal.pro b/src/plugins/baremetal/baremetal.pro index e877b934a12..7cf1db563dd 100644 --- a/src/plugins/baremetal/baremetal.pro +++ b/src/plugins/baremetal/baremetal.pro @@ -27,7 +27,3 @@ HEADERS += baremetalplugin.h \ baremetaldeviceconfigurationwidget.h \ baremetaldeviceconfigurationwizard.h \ baremetaldeviceconfigurationwizardpages.h - -FORMS += \ - baremetaldeviceconfigurationwizardsetuppage.ui \ - baremetaldeviceconfigurationwidget.ui diff --git a/src/plugins/baremetal/baremetal.qbs b/src/plugins/baremetal/baremetal.qbs index 5571c745f63..72a2f3f71f2 100644 --- a/src/plugins/baremetal/baremetal.qbs +++ b/src/plugins/baremetal/baremetal.qbs @@ -21,12 +21,11 @@ QtcPlugin { "baremetaldeviceconfigurationwidget.cpp", "baremetaldeviceconfigurationwidget.h", "baremetaldeviceconfigurationwizard.cpp", "baremetaldeviceconfigurationwizard.h", "baremetaldeviceconfigurationwizardpages.cpp", "baremetaldeviceconfigurationwizardpages.h", - "baremetaldeviceconfigurationwizardsetuppage.ui", "baremetalgdbcommandsdeploystep.cpp", "baremetalgdbcommandsdeploystep.h", "baremetalplugin.cpp", "baremetalplugin.h", "baremetalrunconfiguration.cpp", "baremetalrunconfiguration.h", "baremetalrunconfigurationfactory.cpp", "baremetalrunconfigurationfactory.h", - "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h", "baremetaldeviceconfigurationwidget.ui", + "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h", "baremetalruncontrolfactory.cpp", "baremetalruncontrolfactory.h", ] } diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index 5913f33a914..8a0ab724d73 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -38,6 +38,7 @@ using namespace ProjectExplorer; namespace BareMetal { namespace Internal { +const char GdbResetKey[] = "GdbResetCommand"; const char GdbCommandsKey[] = "GdbCommands"; BareMetalDevice::Ptr BareMetalDevice::create() @@ -58,12 +59,14 @@ BareMetalDevice::Ptr BareMetalDevice::create(const BareMetalDevice &other) void BareMetalDevice::fromMap(const QVariantMap &map) { IDevice::fromMap(map); + setGdbResetCommands(map.value(QLatin1String(GdbResetKey)).toString()); setGdbInitCommands(map.value(QLatin1String(GdbCommandsKey)).toString()); } QVariantMap BareMetalDevice::toMap() const { QVariantMap map = IDevice::toMap(); + map.insert(QLatin1String(GdbResetKey), gdbResetCommands()); map.insert(QLatin1String(GdbCommandsKey), gdbInitCommands()); return map; } @@ -114,8 +117,51 @@ BareMetalDevice::BareMetalDevice(const QString &name, Core::Id type, MachineType BareMetalDevice::BareMetalDevice(const BareMetalDevice &other) : IDevice(other) { + setGdbResetCommands(other.gdbResetCommands()); setGdbInitCommands(other.gdbInitCommands()); } +QString BareMetalDevice::exampleString() +{ + return QLatin1String("

") + + QCoreApplication::translate("BareMetal", "Example:") + + QLatin1String("

"); +} + +QString BareMetalDevice::hostLineToolTip() +{ + return QLatin1String("") + + QCoreApplication::translate("BareMetal", + "Enter your hostname like \"localhost\" or \"192.0.2.1\" or " + "a command which must support GDB pipelining " + "starting with a pipe symbol.") + + exampleString() + QLatin1String( + "  |openocd -c \"gdb_port pipe; " + "log_output openocd.log\" -f boards/myboard.cfg"); +} + +QString BareMetalDevice::resetCommandToolTip() +{ + return QLatin1String("") + + QCoreApplication::translate("BareMetal", + "Enter the hardware reset command here.
" + "The CPU should be halted after this command.") + + exampleString() + QLatin1String( + "  monitor reset halt"); +} + +QString BareMetalDevice::initCommandToolTip() +{ + return QLatin1String("") + + QCoreApplication::translate("BareMetal", + "Enter commands to reset the board, and write the nonvolatile memory.") + + exampleString() + QLatin1String( + "  set remote hardware-breakpoint-limit 6
" + "  set remote hardware-watchpoint-limit 4
" + "  monitor reset halt
" + "  load
" + "  monitor reset halt"); +} + } //namespace Internal } //namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index 3da87b64e8d..375fcf400a3 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -55,12 +55,20 @@ public: ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const; + QString gdbResetCommands() const { return m_gdbResetCommands; } + void setGdbResetCommands(const QString &gdbResetCommands) { m_gdbResetCommands = gdbResetCommands; } + QString gdbInitCommands() const { return m_gdbInitCommands; } void setGdbInitCommands(const QString &gdbCommands) { m_gdbInitCommands=gdbCommands; } virtual void fromMap(const QVariantMap &map); virtual QVariantMap toMap() const; + static QString exampleString(); + static QString hostLineToolTip(); + static QString initCommandToolTip(); + static QString resetCommandToolTip(); + protected: BareMetalDevice() {} BareMetalDevice(const QString &name, Core::Id type, @@ -69,6 +77,7 @@ protected: private: BareMetalDevice &operator=(const BareMetalDevice &); + QString m_gdbResetCommands; QString m_gdbInitCommands; }; diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp index 34cc50b51e3..0431977fbc9 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp @@ -29,74 +29,100 @@ #include "baremetaldeviceconfigurationwidget.h" -#include "ui_baremetaldeviceconfigurationwidget.h" #include "baremetaldevice.h" #include #include #include +#include #include +#include +#include +#include +using namespace Core; using namespace QSsh; namespace BareMetal { -using namespace Internal; +namespace Internal { BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget( - const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) : - IDeviceWidget(deviceConfig, parent), - m_ui(new Ui::BareMetalDeviceConfigurationWidget) + const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) + : IDeviceWidget(deviceConfig, parent) { - m_ui->setupUi(this); - connect(m_ui->gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged())); - connect(m_ui->gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged())); - connect(m_ui->gdbCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged())); - Core::VariableChooser::addVariableSupport(m_ui->gdbCommandsTextEdit); - new Core::VariableChooser(this); - initGui(); -} + SshConnectionParameters sshParams = device()->sshParameters(); + QSharedPointer p = qSharedPointerCast(device()); + QTC_ASSERT(!p.isNull(), return); -BareMetalDeviceConfigurationWidget::~BareMetalDeviceConfigurationWidget() -{ - delete m_ui; + m_gdbHostLineEdit = new QLineEdit(this); + m_gdbHostLineEdit->setText(sshParams.host); + m_gdbHostLineEdit->setToolTip(BareMetalDevice::hostLineToolTip()); + + m_gdbPortSpinBox = new QSpinBox(this); + m_gdbPortSpinBox->setRange(1, 65535); + m_gdbPortSpinBox->setValue(sshParams.port); + + m_gdbInitCommandsTextEdit = new QPlainTextEdit(this); + m_gdbInitCommandsTextEdit->setPlainText(p->gdbInitCommands()); + m_gdbInitCommandsTextEdit->setToolTip(BareMetalDevice::initCommandToolTip()); + + m_gdbResetCommandsTextEdit = new QPlainTextEdit(this); + m_gdbResetCommandsTextEdit->setPlainText(p->gdbResetCommands()); + m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip()); + + QFormLayout *formLayout = new QFormLayout(this); + formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + formLayout->addRow(tr("GDB host:"), m_gdbHostLineEdit); + formLayout->addRow(tr("GDB port:"), m_gdbPortSpinBox); + formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsTextEdit); + formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit); + + VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit); + VariableChooser::addVariableSupport(m_gdbInitCommandsTextEdit); + (void)new VariableChooser(this); + + connect(m_gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged())); + connect(m_gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged())); + connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()),SLOT(gdbResetCommandsChanged())); + connect(m_gdbInitCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged())); } void BareMetalDeviceConfigurationWidget::hostnameChanged() { SshConnectionParameters sshParams = device()->sshParameters(); - sshParams.host = m_ui->gdbHostLineEdit->text().trimmed(); + sshParams.host = m_gdbHostLineEdit->text().trimmed(); device()->setSshParameters(sshParams); } void BareMetalDeviceConfigurationWidget::portChanged() { SshConnectionParameters sshParams = device()->sshParameters(); - sshParams.port = m_ui->gdbPortSpinBox->value(); + sshParams.port = m_gdbPortSpinBox->value(); device()->setSshParameters(sshParams); } +void BareMetalDeviceConfigurationWidget::gdbResetCommandsChanged() +{ + QSharedPointer p = qSharedPointerCast(device()); + QTC_ASSERT(!p.isNull(), return); + p->setGdbResetCommands(m_gdbResetCommandsTextEdit->toPlainText().trimmed()); +} + void BareMetalDeviceConfigurationWidget::gdbInitCommandsChanged() { QSharedPointer p = qSharedPointerCast(device()); QTC_ASSERT(!p.isNull(), return); - p->setGdbInitCommands(m_ui->gdbCommandsTextEdit->toPlainText()); + p->setGdbInitCommands(m_gdbInitCommandsTextEdit->toPlainText()); } -void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() { +void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() +{ hostnameChanged(); portChanged(); + gdbResetCommandsChanged(); gdbInitCommandsChanged(); } -void BareMetalDeviceConfigurationWidget::initGui() -{ - SshConnectionParameters sshParams = device()->sshParameters(); - m_ui->gdbHostLineEdit->setText(sshParams.host); - m_ui->gdbPortSpinBox->setValue(sshParams.port); - QSharedPointer p = qSharedPointerCast(device()); - QTC_ASSERT(!p.isNull(), return); - m_ui->gdbCommandsTextEdit->setPlainText(p->gdbInitCommands()); -} - -} //namespace BareMetal +} // namespace Internal +} // namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h index 3927a5b397a..fb1dc29088e 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h @@ -32,9 +32,14 @@ #include -namespace BareMetal { +QT_BEGIN_NAMESPACE +class QLineEdit; +class QSpinBox; +class QPlainTextEdit; +QT_END_NAMESPACE -namespace Ui { class BareMetalDeviceConfigurationWidget; } +namespace BareMetal { +namespace Internal { class BareMetalDeviceConfigurationWidget : public ProjectExplorer::IDeviceWidget @@ -44,19 +49,24 @@ class BareMetalDeviceConfigurationWidget public: explicit BareMetalDeviceConfigurationWidget( const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = 0); - ~BareMetalDeviceConfigurationWidget(); private slots: void hostnameChanged(); void portChanged(); + void gdbResetCommandsChanged(); void gdbInitCommandsChanged(); private: void updateDeviceFromUi(); void initGui(); - Ui::BareMetalDeviceConfigurationWidget *m_ui; + + QLineEdit *m_gdbHostLineEdit; + QSpinBox *m_gdbPortSpinBox; + QPlainTextEdit *m_gdbResetCommandsTextEdit; + QPlainTextEdit *m_gdbInitCommandsTextEdit; }; -} //namespace BareMetal +} // namespace Internal +} // namespace BareMetal #endif // BAREMETALDEVICECONFIGURATIONWIDGET_H diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui deleted file mode 100644 index 17236089bec..00000000000 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui +++ /dev/null @@ -1,82 +0,0 @@ - - - BareMetal::BareMetalDeviceConfigurationWidget - - - - 0 - 0 - 496 - 251 - - - - - 100 - 100 - - - - Form - - - - - - - QFormLayout::ExpandingFieldsGrow - - - - - - - - GDB host: - - - - - - - - - - - - - GDB port: - - - - - - - 1 - - - 65535 - - - 3333 - - - - - - - - - - GDB commands: - - - - - - - - - - - diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp index d891267e0ea..ae15ced0b73 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp @@ -78,6 +78,7 @@ IDevice::Ptr BareMetalDeviceConfigurationWizard::device() const Core::Id(Constants::BareMetalOsType), IDevice::Hardware); device->setSshParameters(sshParams); + device->setGdbResetCommands(d->m_setupPage.gdbResetCommands()); device->setGdbInitCommands(d->m_setupPage.gdbInitCommands()); return device; } diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp index 717a6190789..90ef922f837 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp @@ -28,39 +28,73 @@ ****************************************************************************/ #include "baremetaldeviceconfigurationwizardpages.h" -#include "ui_baremetaldeviceconfigurationwizardsetuppage.h" +#include "baremetaldevice.h" #include #include +#include +#include +#include +#include + +using namespace Core; + namespace BareMetal { namespace Internal { -class BareMetalDeviceConfigurationWizardSetupPagePrivate; -} // namespace Internal -BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent) : - QWizardPage(parent), d(new Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate) +BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent) + : QWizardPage(parent) { - d->ui.setupUi(this); setTitle(tr("Set up GDB Server or Hardware Debugger")); - setSubTitle(QLatin1String(" ")); // For Qt bug (background color) - connect(d->ui.hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); - connect(d->ui.nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); - connect(d->ui.portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged())); - connect(d->ui.gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); - Core::VariableChooser::addVariableSupport(d->ui.gdbInitCommandsPlainTextEdit); - new Core::VariableChooser(this); -} -BareMetalDeviceConfigurationWizardSetupPage::~BareMetalDeviceConfigurationWizardSetupPage() -{ - delete d; + m_nameLineEdit = new QLineEdit(this); + + m_hostNameLineEdit = new QLineEdit(this); + m_hostNameLineEdit->setToolTip(BareMetalDevice::hostLineToolTip()); + m_hostNameLineEdit->setText(QLatin1String( + "|openocd -c \"gdb_port pipe\" -c \"log_output openocd.log;\" " + "-f board/stm3241g_eval_stlink.cfg")); + + m_portSpinBox = new QSpinBox(this); + m_portSpinBox->setRange(1, 65535); + m_portSpinBox->setValue(3333); + + m_gdbInitCommandsPlainTextEdit = new QPlainTextEdit(this); + m_gdbInitCommandsPlainTextEdit->setToolTip(BareMetalDevice::initCommandToolTip()); + m_gdbInitCommandsPlainTextEdit->setPlainText(QLatin1String( + "set remote hardware-breakpoint-limit 6\n" + "set remote hardware-watchpoint-limit 4\n" + "monitor reset halt\n" + "load\n" + "monitor reset halt")); + + m_gdbResetCommandsTextEdit = new QPlainTextEdit(this); + m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip()); + m_gdbResetCommandsTextEdit->setPlainText(QLatin1String("monitor reset halt")); + + QFormLayout *formLayout = new QFormLayout(this); + formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + formLayout->addRow(tr("Name:"), m_nameLineEdit); + formLayout->addRow(tr("GDB host:"), m_hostNameLineEdit); + formLayout->addRow(tr("GDB port:"), m_portSpinBox); + formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsPlainTextEdit); + formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit); + + connect(m_nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); + connect(m_hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); + connect(m_portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged())); + connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); + connect(m_gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); + + VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit); + VariableChooser::addVariableSupport(m_gdbInitCommandsPlainTextEdit); + (void)new VariableChooser(this); } void BareMetalDeviceConfigurationWizardSetupPage::initializePage() { - d->ui.nameLineEdit->setText(defaultConfigurationName()); - + m_nameLineEdit->setText(defaultConfigurationName()); } bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const @@ -70,22 +104,27 @@ bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const QString BareMetalDeviceConfigurationWizardSetupPage::configurationName() const { - return d->ui.nameLineEdit->text().trimmed(); + return m_nameLineEdit->text().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::gdbHostname() const { - return d->ui.hostNameLineEdit->text().trimmed(); + return m_hostNameLineEdit->text().trimmed(); } quint16 BareMetalDeviceConfigurationWizardSetupPage::gdbPort() const { - return quint16(d->ui.portSpinBox->value()); + return quint16(m_portSpinBox->value()); +} + +QString BareMetalDeviceConfigurationWizardSetupPage::gdbResetCommands() const +{ + return m_gdbResetCommandsTextEdit->toPlainText().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::gdbInitCommands() const { - return d->ui.gdbInitCommandsPlainTextEdit->toPlainText(); + return m_gdbInitCommandsPlainTextEdit->toPlainText().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() const @@ -93,4 +132,5 @@ QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() return tr("Bare Metal Device"); } +} // namespace Internal } // namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h index 1cbb75455e8..16096a14947 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h @@ -30,40 +30,41 @@ #ifndef BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H #define BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H -#include "ui_baremetaldeviceconfigurationwizardsetuppage.h" #include +QT_BEGIN_NAMESPACE +class QLineEdit; +class QSpinBox; +class QPlainTextEdit; +QT_END_NAMESPACE + namespace BareMetal { - namespace Internal { -class BareMetalDeviceConfigurationWizardSetupPagePrivate -{ -public: - Ui::BareMetalDeviceConfigurationWizardSetupPage ui; -}; - -} // namespace Internal - class BareMetalDeviceConfigurationWizardSetupPage : public QWizardPage { - Q_OBJECT public: explicit BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent = 0); - ~BareMetalDeviceConfigurationWizardSetupPage(); void initializePage(); bool isComplete() const; QString configurationName() const; QString gdbHostname() const; quint16 gdbPort() const; + QString gdbResetCommands() const; QString gdbInitCommands() const; virtual QString defaultConfigurationName() const; + private: - Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate * const d; + QLineEdit *m_nameLineEdit; + QLineEdit *m_hostNameLineEdit; + QSpinBox *m_portSpinBox; + QPlainTextEdit *m_gdbResetCommandsTextEdit; + QPlainTextEdit *m_gdbInitCommandsPlainTextEdit; }; +} // namespace Internal } // namespace BareMetal #endif // BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui deleted file mode 100644 index be6c1dd1203..00000000000 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui +++ /dev/null @@ -1,86 +0,0 @@ - - - BareMetal::Internal::BareMetalDeviceConfigurationWizardSetupPage - - - - 0 - 0 - 517 - 301 - - - - Form - - - - - - - - - Name: - - - - - - - - - - |openocd -c "gdb_port pipe" -c "log_output openocd.log;" -f board/stm3241g_eval_stlink.cfg - - - - - - - GDB port: - - - - - - - GDB host: - - - - - - - 1 - - - 65535 - - - 3333 - - - - - - - GDB commands: - - - - - - - set remote hardware-breakpoint-limit 6 -set remote hardware-watchpoint-limit 4 -monitor reset halt -load -monitor reset halt - - - - - - - - diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.cpp b/src/plugins/baremetal/baremetalruncontrolfactory.cpp index 04cd5b0b787..b79cfb91f73 100644 --- a/src/plugins/baremetal/baremetalruncontrolfactory.cpp +++ b/src/plugins/baremetal/baremetalruncontrolfactory.cpp @@ -33,7 +33,6 @@ #include "baremetaldevice.h" #include -#include #include #include #include @@ -104,6 +103,7 @@ DebuggerStartParameters BareMetalRunControlFactory::startParameters(const BareMe params.remoteChannel = device->sshParameters().host + QLatin1String(":") + QString::number(device->sshParameters().port); params.remoteSetupNeeded = false; // qml stuff, not needed params.commandsAfterConnect = device->gdbInitCommands().toLatin1(); + params.commandsForReset = device->gdbResetCommands().toLatin1(); BuildConfiguration *bc = target->activeBuildConfiguration(); BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId()); if (bsl) { diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.h b/src/plugins/baremetal/baremetalruncontrolfactory.h index 2b349c687e5..b0b6f2dcefa 100644 --- a/src/plugins/baremetal/baremetalruncontrolfactory.h +++ b/src/plugins/baremetal/baremetalruncontrolfactory.h @@ -34,6 +34,7 @@ #include #include +#include namespace BareMetal { namespace Internal { diff --git a/src/plugins/debugger/debugger.qrc b/src/plugins/debugger/debugger.qrc index 06ac7d09d1e..5fe047141be 100644 --- a/src/plugins/debugger/debugger.qrc +++ b/src/plugins/debugger/debugger.qrc @@ -36,5 +36,7 @@ images/qml/select.png images/qml/app-on-top.png images/qml/apply-on-save.png + images/debugger_restart.png + images/debugger_restart_small.png diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 02517dc65c9..838cb7464a7 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -58,6 +58,7 @@ const char STEP[] = "Debugger.StepLine"; const char STEPOUT[] = "Debugger.StepOut"; const char NEXT[] = "Debugger.NextLine"; const char REVERSE[] = "Debugger.ReverseDirection"; +const char RESET[] = "Debugger.Reset"; const char OPERATE_BY_INSTRUCTION[] = "Debugger.OperateByInstruction"; const char QML_SHOW_APP_ON_TOP[] = "Debugger.QmlShowAppOnTop"; const char QML_UPDATE_ON_SAVE[] = "Debugger.QmlUpdateOnSave"; @@ -162,7 +163,8 @@ enum DebuggerCapabilities MemoryAddressCapability = 0x1000000, ShowModuleSectionsCapability = 0x200000, WatchComplexExpressionsCapability = 0x400000, // Used to filter out challenges for cdb. - AdditionalQmlStackCapability = 0x800000 // C++ debugger engine is able to retrieve QML stack as well. + AdditionalQmlStackCapability = 0x800000, // C++ debugger engine is able to retrieve QML stack as well. + ResetInferiorCapability = 0x1000000 //!< restart program while debugging }; enum LogChannel diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index e1c41638841..453c755f4b5 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -334,6 +334,7 @@ protected: virtual void runEngine() = 0; virtual void shutdownInferior() = 0; virtual void shutdownEngine() = 0; + virtual void resetInferior() {} virtual void detachDebugger(); virtual void exitDebugger(); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 89b2de50aeb..303a1af21ee 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1004,6 +1004,12 @@ public slots: currentEngine()->abortDebugger(); } + void handleReset() + { + currentEngine()->resetLocation(); + currentEngine()->resetInferior(); + } + void handleExecStep() { if (currentEngine()->state() == DebuggerNotReady) { @@ -1250,6 +1256,7 @@ public: QAction *m_reverseDirectionAction; QAction *m_frameUpAction; QAction *m_frameDownAction; + QAction *m_resetAction; QToolButton *m_reverseToolButton; @@ -1258,6 +1265,7 @@ public: QIcon m_continueIcon; QIcon m_interruptIcon; QIcon m_locationMarkIcon; + QIcon m_resetIcon; StatusLabel *m_statusLabel; QComboBox *m_threadBox; @@ -2247,6 +2255,7 @@ void DebuggerPluginPrivate::setInitialState() m_exitAction->setEnabled(false); m_abortAction->setEnabled(false); + m_resetAction->setEnabled(false); m_interruptAction->setEnabled(false); m_continueAction->setEnabled(false); @@ -2386,6 +2395,8 @@ void DebuggerPluginPrivate::updateState(DebuggerEngine *engine) m_abortAction->setEnabled(state != DebuggerNotReady && state != DebuggerFinished); + m_resetAction->setEnabled((stopped || state == DebuggerNotReady) + && engine->hasCapability(ResetInferiorCapability)); m_stepAction->setEnabled(stopped || state == DebuggerNotReady); m_nextAction->setEnabled(stopped || state == DebuggerNotReady); @@ -2775,6 +2786,8 @@ void DebuggerPluginPrivate::extensionsInitialized() m_interruptIcon = QIcon(_(Core::Constants::ICON_PAUSE)); m_interruptIcon.addFile(QLatin1String(":/debugger/images/debugger_interrupt.png")); m_locationMarkIcon = QIcon(_(":/debugger/images/location_16.png")); + m_resetIcon = QIcon(_(":/debugger/images/debugger_restart_small.png:")); + m_resetIcon.addFile(QLatin1String(":/debugger/images/debugger_restart.png")); m_busy = false; @@ -2849,6 +2862,11 @@ void DebuggerPluginPrivate::extensionsInitialized() "resets the debugger to the initial state.")); connect(act, SIGNAL(triggered()), SLOT(handleAbort())); + act = m_resetAction = new QAction(tr("Restart Debugging"),this); + act->setToolTip(tr("Restart the debugging session.")); + act->setIcon(m_resetIcon); + connect(act,SIGNAL(triggered()),SLOT(handleReset())); + act = m_nextAction = new QAction(tr("Step Over"), this); act->setIcon(QIcon(QLatin1String(":/debugger/images/debugger_stepover_small.png"))); connect(act, SIGNAL(triggered()), SLOT(handleExecNext())); @@ -3098,6 +3116,12 @@ void DebuggerPluginPrivate::extensionsInitialized() cmd->setDescription(tr("Reset Debugger")); debugMenu->addAction(cmd, CC::G_DEFAULT_ONE); + cmd = ActionManager::registerAction(m_resetAction, + Constants::RESET, globalcontext); + cmd->setDescription(tr("Restart Debugging")); + cmd->setDefaultKeySequence(QKeySequence(tr("Shift+Ctrl+R"))); + debugMenu->addAction(cmd, CC::G_DEFAULT_ONE); + debugMenu->addSeparator(globalcontext); cmd = ActionManager::registerAction(m_nextAction, @@ -3310,6 +3334,7 @@ void DebuggerPluginPrivate::extensionsInitialized() hbox->addWidget(toolButton(Constants::NEXT)); hbox->addWidget(toolButton(Constants::STEP)); hbox->addWidget(toolButton(Constants::STEPOUT)); + hbox->addWidget(toolButton(Constants::RESET)); hbox->addWidget(toolButton(Constants::OPERATE_BY_INSTRUCTION)); //hbox->addWidget(new StyledSeparator); diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 17dc02a7b62..4f8ffe7d073 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -131,6 +131,7 @@ public: QMap sourcePathMap; // Used by baremetal plugin + QByteArray commandsForReset; // commands used for resetting the inferior bool useContinueInsteadOfRun; // if connected to a hw debugger run is not possible but continue is used QByteArray commandsAfterConnect; // additional commands to post after connection to debug target diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 41bc6c05b50..02c142415af 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1213,7 +1213,8 @@ void GdbEngine::handleResultRecord(GdbResponse *response) showMessage(_("ALL COMMANDS DONE; INVOKING CALLBACK")); CommandsDoneCallback cont = m_commandsDoneCallback; m_commandsDoneCallback = 0; - (this->*cont)(); + if (response->resultClass != GdbResultRunning) //only start if the thing is not already running + (this->*cont)(); } else { PENDING_DEBUG("MISSING TOKENS: " << m_cookieForToken.keys()); } @@ -2028,7 +2029,8 @@ bool GdbEngine::hasCapability(unsigned cap) const | RunToLineCapability | WatchComplexExpressionsCapability | MemoryAddressCapability - | AdditionalQmlStackCapability)) + | AdditionalQmlStackCapability + | ResetInferiorCapability)) return true; if (startParameters().startMode == AttachCore) @@ -4430,6 +4432,29 @@ void GdbEngine::abortDebugger() } } +void GdbEngine::resetInferior() +{ + if (!startParameters().commandsForReset.isEmpty()) { + QByteArray substitutedCommands = VariableManager::expandedString( + QString::fromLatin1(startParameters().commandsForReset)).toLatin1(); + foreach (QByteArray command, substitutedCommands.split('\n')) { + command = command.trimmed(); + if (!command.isEmpty()) { + if (state() == InferiorStopOk) { + postCommand(command, ConsoleCommand|Immediate); + } else { + GdbCommand gdbCmd; + gdbCmd.command = command; + gdbCmd.flags = ConsoleCommand; + m_commandsToRunOnTemporaryBreak.append(gdbCmd); + } + } + } + } + requestInterruptInferior(); + runEngine(); +} + void GdbEngine::handleAdapterStartFailed(const QString &msg, Id settingsIdHint) { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 28a793869ba..215338b25d5 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -78,6 +78,7 @@ private: ////////// General Interface ////////// virtual void shutdownInferior(); virtual void shutdownEngine() = 0; virtual void abortDebugger(); + virtual void resetInferior(); virtual bool acceptsDebuggerCommands() const; virtual void executeDebuggerCommand(const QString &command, DebuggerLanguages languages); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 4d2098fc9da..ca6e95771d7 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -406,7 +406,7 @@ void GdbRemoteServerEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); - const QString remoteExecutable = startParameters().remoteExecutable; // This is only set for pure QNX + const QString remoteExecutable = startParameters().remoteExecutable; if (!remoteExecutable.isEmpty()) { postCommand("-exec-run", GdbEngine::RunRequest, CB(handleExecRun)); } else { diff --git a/src/plugins/debugger/images/debugger_restart.png b/src/plugins/debugger/images/debugger_restart.png new file mode 100644 index 00000000000..2c649312078 Binary files /dev/null and b/src/plugins/debugger/images/debugger_restart.png differ diff --git a/src/plugins/debugger/images/debugger_restart.svg b/src/plugins/debugger/images/debugger_restart.svg new file mode 100644 index 00000000000..08af9db3e3d --- /dev/null +++ b/src/plugins/debugger/images/debugger_restart.svg @@ -0,0 +1,77 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/plugins/debugger/images/debugger_restart_small.png b/src/plugins/debugger/images/debugger_restart_small.png new file mode 100644 index 00000000000..6b10c8fe79e Binary files /dev/null and b/src/plugins/debugger/images/debugger_restart_small.png differ diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp index db9b15f45d1..11a5f0df529 100644 --- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp +++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp @@ -104,6 +104,7 @@ DebuggerStartParameters LinuxDeviceDebugSupport::startParameters(const AbstractR params.startMode = AttachToRemoteServer; params.executable = runConfig->localExecutableFilePath(); params.remoteChannel = device->sshParameters().host + QLatin1String(":-1"); + params.remoteExecutable = runConfig->remoteExecutableFilePath(); } else { params.startMode = AttachToRemoteServer; }