From 7675296fcf092c9f57f3c2887d397dcad02e1e69 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 18 Mar 2020 03:17:35 +0100 Subject: [PATCH] McuSupport: Make hardcoded target list "semi data-driven" This change pushes the hard-coded list a bit towards a "data-driven" approach. That way, the planned switch to the .json files based apporach (see UL-2012) becomes less of a change. Some target entries are added to match the current target list in Qt for MCUs packages. If we don't manage to get the .json-based target listing in place, this could even serve as fall-back. Task-number: UL-2012 Change-Id: If39e5d581ac19468b6f52ed221ec2d39bfab9f80 Reviewed-by: hjk Reviewed-by: Marco Bubke --- src/plugins/mcusupport/mcusupportoptions.cpp | 33 +++++++--- src/plugins/mcusupport/mcusupportoptions.h | 7 +++ .../mcusupport/mcusupportoptionspage.cpp | 30 ++++++---- src/plugins/mcusupport/mcusupportsdk.cpp | 60 ++++++++++++------- src/plugins/mcusupport/mcusupportsdk.h | 2 +- 5 files changed, 92 insertions(+), 40 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 2a35abbf84d..98fa88617d6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -334,16 +334,22 @@ McuSupportOptions::McuSupportOptions(QObject *parent) : QObject(parent) , qtForMCUsSdkPackage(Sdk::createQtForMCUsPackage()) { - Sdk::hardcodedTargetsAndPackages(qtForMCUsSdkPackage, &packages, &mcuTargets); - - packages.append(qtForMCUsSdkPackage); - for (auto package : packages) - connect(package, &McuPackage::changed, [this](){ - emit changed(); - }); + connect(qtForMCUsSdkPackage, &McuPackage::changed, + this, &McuSupportOptions::populatePackagesAndTargets); } McuSupportOptions::~McuSupportOptions() +{ + deletePackagesAndTargets(); + delete qtForMCUsSdkPackage; +} + +void McuSupportOptions::populatePackagesAndTargets() +{ + setQulDir(Utils::FilePath::fromUserInput(qtForMCUsSdkPackage->path())); +} + +void McuSupportOptions::deletePackagesAndTargets() { qDeleteAll(packages); packages.clear(); @@ -351,6 +357,19 @@ McuSupportOptions::~McuSupportOptions() mcuTargets.clear(); } +void McuSupportOptions::setQulDir(const Utils::FilePath &dir) +{ + deletePackagesAndTargets(); + Sdk::hardcodedTargetsAndPackages(dir, &packages, &mcuTargets); + //packages.append(qtForMCUsSdkPackage); + for (auto package : packages) { + connect(package, &McuPackage::changed, [this](){ + emit changed(); + }); + } + emit changed(); +} + static bool mcuTargetIsDesktop(const McuTarget* mcuTarget) { return mcuTarget->qulPlatform() == "Qt"; diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index deb7010f9da..7e1edd60159 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -35,6 +35,7 @@ class Id; } namespace Utils { +class FilePath; class PathChooser; class InfoLabel; } @@ -158,10 +159,16 @@ public: QVector mcuTargets; McuPackage *qtForMCUsSdkPackage = nullptr; + void setQulDir(const Utils::FilePath &dir); + QString kitName(const McuTarget* mcuTarget) const; QList existingKits(const McuTarget *mcuTargt); ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget); + void populatePackagesAndTargets(); + +private: + void deletePackagesAndTargets(); signals: void changed(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index a991af60ece..cfbe4784930 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -62,6 +62,7 @@ public: private: void apply() final; + void populateMcuTargetsComboBox(); void showEvent(QShowEvent *event) final; QString m_armGccPath; @@ -108,14 +109,12 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() m_mcuTargetsGroupBox->setFlat(true); mainLayout->addWidget(m_mcuTargetsGroupBox); m_mcuTargetsComboBox = new QComboBox; - m_mcuTargetsComboBox->addItems( - Utils::transform(m_options.mcuTargets, [this](McuTarget *t){ - return m_options.kitName(t); - })); auto layout = new QVBoxLayout(m_mcuTargetsGroupBox); layout->addWidget(m_mcuTargetsComboBox); connect(m_mcuTargetsComboBox, &QComboBox::currentTextChanged, this, &McuSupportOptionsWidget::showMcuTargetPackages); + connect(m_options.qtForMCUsSdkPackage, &McuPackage::changed, + this, &McuSupportOptionsWidget::populateMcuTargetsComboBox); } { @@ -147,15 +146,13 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() void McuSupportOptionsWidget::updateStatus() { const McuTarget *mcuTarget = currentMcuTarget(); - if (!mcuTarget) - return; const bool cMakeAvailable = !CMakeProjectManager::CMakeToolManager::cmakeTools().isEmpty(); // Page elements { m_qtForMCUsSdkGroupBox->setVisible(cMakeAvailable); - const bool ready = cMakeAvailable && + const bool ready = cMakeAvailable && mcuTarget && m_options.qtForMCUsSdkPackage->status() == McuPackage::ValidPackage; m_mcuTargetsGroupBox->setVisible(ready); m_packagesGroupBox->setVisible(ready && !mcuTarget->packages().isEmpty()); @@ -163,7 +160,7 @@ void McuSupportOptionsWidget::updateStatus() } // Kit creation status - { + if (mcuTarget) { const bool mcuTargetValid = mcuTarget->isValid(); m_kitCreationInfoLabel->setType(mcuTargetValid ? Utils::InfoLabel::Ok : Utils::InfoLabel::NotOk); @@ -213,13 +210,15 @@ void McuSupportOptionsWidget::showMcuTargetPackages() McuTarget *McuSupportOptionsWidget::currentMcuTarget() const { const int mcuTargetIndex = m_mcuTargetsComboBox->currentIndex(); - return m_options.mcuTargets.isEmpty() ? nullptr : m_options.mcuTargets.at(mcuTargetIndex); + return (mcuTargetIndex == -1 || m_options.mcuTargets.isEmpty()) + ? nullptr + : m_options.mcuTargets.at(mcuTargetIndex); } void McuSupportOptionsWidget::showEvent(QShowEvent *event) { Q_UNUSED(event) - updateStatus(); + populateMcuTargetsComboBox(); } void McuSupportOptionsWidget::apply() @@ -241,6 +240,17 @@ void McuSupportOptionsWidget::apply() m_options.newKit(mcuTarget); } +void McuSupportOptionsWidget::populateMcuTargetsComboBox() +{ + m_options.populatePackagesAndTargets(); + m_mcuTargetsComboBox->clear(); + m_mcuTargetsComboBox->addItems( + Utils::transform(m_options.mcuTargets, [this](McuTarget *t){ + return m_options.kitName(t); + })); + updateStatus(); +} + McuSupportOptionsPage::McuSupportOptionsPage() { setId(Core::Id(Constants::SETTINGS_ID)); diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 87ca70b610a..cf8d7672cd8 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -158,8 +158,8 @@ static McuPackage *createSeggerJLinkPackage() return result; } -void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage, - QVector *packages, QVector *mcuTargets) +void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector *packages, + QVector *mcuTargets) { McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage(); McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage(); @@ -171,6 +171,8 @@ void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage, armGccPackage, stm32CubeProgrammerPackage}; QVector nxpEvalPackages = { armGccPackage, seggerJLinkPackage}; + QVector renesasEvalPackages = { + armGccPackage, seggerJLinkPackage}; QVector desktopPackages = {}; *packages = { armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, @@ -179,28 +181,42 @@ void hardcodedTargetsAndPackages(const McuPackage* qtForMCUsSdkPackage, const QString vendorStm = "STM"; const QString vendorNxp = "NXP"; const QString vendorQt = "Qt"; + const QString vendorRenesas = "Renesas"; - // STM - auto mcuTarget = new McuTarget(vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages, - armGccPackage); - mcuTarget->setColorDepth(32); - mcuTargets->append(mcuTarget); + const struct { + const QString &vendor; + const QString qulPlatform; + const QVector &packages; + McuToolChainPackage *toolchainPackage; + const QVector colorDepths; + } targets[] = { + {vendorNxp, "MIMXRT1050-EVK", nxpEvalPackages, armGccPackage, {16}}, + {vendorNxp, "MIMXRT1064-EVK", nxpEvalPackages, armGccPackage, {16}}, + {vendorQt, "Qt", desktopPackages, nullptr, {32}}, + {vendorRenesas, "RH850-D1M1A", renesasEvalPackages, armGccPackage, {32}}, + {vendorStm, "STM32F469I-DISCOVERY", stmEvalPackages, armGccPackage, {24}}, + {vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages, armGccPackage, {32, 16}}, + {vendorStm, "STM32F769I-DISCOVERY", stmEvalPackages, armGccPackage, {32}}, + {vendorStm, "STM32H750B-DISCOVERY", stmEvalPackages, armGccPackage, {32}}, + {vendorStm, "STM32L4R9I-DISCOVERY", stmEvalPackages, armGccPackage, {24}}, + {vendorStm, "STM32L4R9I-EVAL", stmEvalPackages, armGccPackage, {24}} + }; - mcuTarget = new McuTarget(vendorStm, "STM32F7508-DISCOVERY", stmEvalPackages, armGccPackage); - mcuTarget->setColorDepth(16); - mcuTargets->append(mcuTarget); - - mcuTarget = new McuTarget(vendorStm, "STM32F769I-DISCOVERY", stmEvalPackages, armGccPackage); - mcuTargets->append(mcuTarget); - - // NXP - mcuTarget = new McuTarget(vendorNxp, "MIMXRT1050-EVK", nxpEvalPackages, armGccPackage); - mcuTargets->append(mcuTarget); - - // Desktop (Qt) - mcuTarget = new McuTarget(vendorQt, "Qt", desktopPackages, nullptr); - mcuTarget->setColorDepth(32); - mcuTargets->append(mcuTarget); + const QString QulTargetTemplate = + dir.toString() + "/lib/cmake/Qul/QulTargets/QulTargets_%1_%2.cmake"; + for (auto target : targets) { + for (int colorDepth : target.colorDepths) { + const QString QulTarget = + QulTargetTemplate.arg(target.qulPlatform, QString::number(colorDepth)); + if (!Utils::FilePath::fromUserInput(QulTarget).exists()) + continue; + auto mcuTarget = new McuTarget(target.vendor, target.qulPlatform, target.packages, + target.toolchainPackage); + if (target.colorDepths.count() > 1) + mcuTarget->setColorDepth(colorDepth); + mcuTargets->append(mcuTarget); + } + } } } // namespace Sdk diff --git a/src/plugins/mcusupport/mcusupportsdk.h b/src/plugins/mcusupport/mcusupportsdk.h index b3116810f24..444855b881a 100644 --- a/src/plugins/mcusupport/mcusupportsdk.h +++ b/src/plugins/mcusupport/mcusupportsdk.h @@ -37,7 +37,7 @@ namespace Sdk { McuPackage *createQtForMCUsPackage(); // Legacy: List of targets supported by Qt for MCUs 1.0 -void hardcodedTargetsAndPackages(const McuPackage* const qtForMCUsSdkPackage, +void hardcodedTargetsAndPackages(const Utils::FilePath &qulDir, QVector *packages, QVector *mcuTargets); } // namespace Sdk