From 2996106bc76382f9a3cce52589aa7f5f68d2e9bc Mon Sep 17 00:00:00 2001 From: Alexandru Lie Date: Fri, 26 Jul 2024 15:40:04 +0300 Subject: [PATCH] core/scopymainwindow_api: Implemented new API's Signed-off-by: Alexandru Lie --- core/include/core/devicemanager.h | 4 +- core/include/core/scopymainwindow_api.h | 14 ++ core/src/devicemanager.cpp | 11 +- core/src/scopymainwindow_api.cpp | 166 ++++++++++++++++++++++++ 4 files changed, 193 insertions(+), 2 deletions(-) diff --git a/core/include/core/devicemanager.h b/core/include/core/devicemanager.h index cc7cd29e56..cf5ec51150 100644 --- a/core/include/core/devicemanager.h +++ b/core/include/core/devicemanager.h @@ -26,7 +26,8 @@ class SCOPY_CORE_EXPORT DeviceManager : public QObject public Q_SLOTS: void addDevice(Device *d); - QString createDevice(QString category, QString param, bool async = true); + QString createDevice(QString category, QString param, bool async = true, + QList plugins = QList()); void removeDevice(QString category, QString id); void removeDeviceById(QString id); @@ -62,6 +63,7 @@ private Q_SLOTS: bool exclusive = false; QStringList scannedDev; QStringList connectedDev; + QList m_plugins; QMap map; PluginManager *pm; diff --git a/core/include/core/scopymainwindow_api.h b/core/include/core/scopymainwindow_api.h index 927759d26f..6f9ba0eafc 100644 --- a/core/include/core/scopymainwindow_api.h +++ b/core/include/core/scopymainwindow_api.h @@ -3,6 +3,7 @@ #include "scopy-core_export.h" #include "scopymainwindow.h" +#include "scanbuttoncontroller.h" #include namespace scopy { @@ -15,6 +16,10 @@ class SCOPY_CORE_EXPORT ScopyMainWindow_API : public ApiObject Q_INVOKABLE void acceptLicense(); Q_INVOKABLE QString addDevice(QString cat, QString uri); + Q_INVOKABLE QString addDevice(QString cat, QString uri, QList plugins); + Q_INVOKABLE void removeDevice(QString cat, QString uri); + Q_INVOKABLE void startScan(bool scan); + Q_INVOKABLE void printDevices(); Q_INVOKABLE bool connectDevice(int idx); Q_INVOKABLE bool connectDevice(QString devID); Q_INVOKABLE bool disconnectDevice(QString devID); @@ -23,6 +28,15 @@ class SCOPY_CORE_EXPORT ScopyMainWindow_API : public ApiObject Q_INVOKABLE void switchTool(QString toolName); Q_INVOKABLE void runScript(QString scriptPath, bool exitApp = true); Q_INVOKABLE void runScriptList(QStringList scriptPathList, bool exitApp = true); + Q_INVOKABLE void exit(); + Q_INVOKABLE QStringList getTools(); + Q_INVOKABLE QStringList getToolsPlugin(QString plugin); + Q_INVOKABLE void getPreference(QString prfName = NULL); + Q_INVOKABLE void setPreference(QString preName, QVariant value); + Q_INVOKABLE void aboutPage(); + Q_INVOKABLE QStringList getPlugins(int idx); + Q_INVOKABLE QStringList getPlugins(QString param, QString cat = "iio"); + Q_INVOKABLE QStringList availablePlugins(QString param, QString cat, int idx, Device *dev); private: static bool sortByUUID(const QString &k1, const QString &k2); diff --git a/core/src/devicemanager.cpp b/core/src/devicemanager.cpp index 72989185a3..05deab3f6a 100644 --- a/core/src/devicemanager.cpp +++ b/core/src/devicemanager.cpp @@ -40,16 +40,25 @@ void DeviceManager::addDevice(Device *d) QString id = d->id(); map[id] = d; di->setParent(this); + QList availablePlugins = di->plugins(); + if(!m_plugins.isEmpty()) { + for(Plugin *p : qAsConst(availablePlugins)) { + if(!m_plugins.contains(p->name())) { + p->setEnabled(false); + } + } + } di->loadPlugins(); connectDeviceToManager(di); Q_EMIT deviceAdded(id, d); } -QString DeviceManager::createDevice(QString category, QString param, bool async) +QString DeviceManager::createDevice(QString category, QString param, bool async, QList plugins) { qInfo(CAT_DEVICEMANAGER) << category << "device with params" << param << "added"; Q_EMIT deviceAddStarted(param); + m_plugins = plugins; DeviceImpl *d = DeviceFactory::build(param, pm, category); DeviceLoader *dl = new DeviceLoader(d, this); diff --git a/core/src/scopymainwindow_api.cpp b/core/src/scopymainwindow_api.cpp index 8406fe819f..bcbdeddc24 100644 --- a/core/src/scopymainwindow_api.cpp +++ b/core/src/scopymainwindow_api.cpp @@ -34,6 +34,38 @@ QString ScopyMainWindow_API::addDevice(QString cat, QString uri) return devID; } +QString ScopyMainWindow_API::addDevice(QString cat, QString uri, QList plugins) +{ + Q_ASSERT(m_w->dm != nullptr); + QString devID = ""; + devID = m_w->dm->createDevice(cat, uri, false, plugins); + qInfo(CAT_SCOPY_API) << "Device with id " << devID << " has been created!"; + return devID; +} + +void ScopyMainWindow_API::removeDevice(QString cat, QString uri) +{ + Q_ASSERT(m_w->dm != nullptr); + m_w->dm->removeDevice(cat, uri); + qInfo(CAT_SCOPY_API) << "Device " << uri << " has been removed"; +} + +void ScopyMainWindow_API::startScan(bool scan) +{ + ScanButtonController *sbc = new ScanButtonController(m_w->scanCycle, m_w->hp->scanControlBtn(), this); + sbc->enableScan(scan); +} + +void ScopyMainWindow_API::printDevices() +{ + Q_ASSERT(m_w->dm != nullptr); + QList mapKeys = m_w->dm->map.keys(); + qInfo() << "Available devices: "; + for(int i = 0; i < mapKeys.size(); i++) { + qInfo(CAT_SCOPY_API) << m_w->dm->map[mapKeys[i]]->displayParam(); + } +} + bool ScopyMainWindow_API::connectDevice(int idx) { Q_ASSERT(m_w->dm != nullptr); @@ -196,4 +228,138 @@ bool ScopyMainWindow_API::sortByUUID(const QString &k1, const QString &k2) return k1.split("_").last() < k2.split("_").last(); } +void ScopyMainWindow_API::exit() { qApp->exit(); } + +QStringList ScopyMainWindow_API::getTools() +{ + Q_ASSERT(m_w->dm != nullptr); + QString devID = ""; + QStringList resultList; + if(!m_w->dm->connectedDev.isEmpty()) { + devID = m_w->dm->connectedDev.back(); + } + Device *dev = m_w->dm->getDevice(devID); + if(dev) { + QList toolList = dev->toolList(); + qInfo(CAT_SCOPY_API) << "Available tools: "; + for(int i = 0; i < toolList.size(); i++) { + qInfo(CAT_SCOPY_API) << toolList[i]->name(); + resultList.append(toolList[i]->name()); + } + } else { + qWarning(CAT_SCOPY_API) << "Device with id " << devID << " is not available!"; + } + return resultList; +} + +QStringList ScopyMainWindow_API::getToolsPlugin(QString plugin) +{ + Q_ASSERT(m_w->dm != nullptr); + QString devID = ""; + QStringList resultList; + if(!m_w->dm->connectedDev.isEmpty()) { + devID = m_w->dm->connectedDev.back(); + } + Device *dev = m_w->dm->getDevice(devID); + if(dev) { + QList toolList = dev->toolList(); + for(int i = 0; i < toolList.size(); i++) { + if(toolList[i]->pluginName() == plugin){ + resultList.append(toolList[i]->name()); + } + } + } else { + qWarning(CAT_SCOPY_API) << "Device with id " << devID << " is not available!"; + } + return resultList; +} + +void ScopyMainWindow_API::getPreference(QString prefName) +{ + Preferences *p = Preferences::GetInstance(); + QMap prefMap = p->getPreferences(); + if(prefName != NULL) { + qInfo(CAT_SCOPY_API) << prefName << " " << prefMap[prefName]; + } else { + qInfo(CAT_SCOPY_API) << "Preferences: "; + for(auto it = prefMap.keyValueBegin(); it != prefMap.keyValueEnd(); it++) { + qInfo(CAT_SCOPY_API) << it->first << " " << it->second; + } + } +} + +void ScopyMainWindow_API::setPreference(QString prefName, QVariant value) +{ + Preferences *p = Preferences::GetInstance(); + p->set(prefName, value); + if(prefName == "general_use_opengl") { + qWarning(CAT_SCOPY_API) << "Restart is required for the change to take place"; + + } else if(prefName == "general_theme") { + qWarning(CAT_SCOPY_API) << "Restart is required for the change to take place"; + + } else if(prefName == "general_language") { + qWarning(CAT_SCOPY_API) << "Restart is required for the change to take place"; + } +} + +void ScopyMainWindow_API::aboutPage() +{ + QString path = ":/about.html"; + QFile file(path); + + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning(CAT_SCOPY_API) << "Could not open the file:" << path; + } + + QTextStream in(&file); + + while(!in.atEnd()) { + QString line = in.readLine(); + qInfo(CAT_SCOPY_API) << line; + } + + file.close(); +} + +QStringList ScopyMainWindow_API::getPlugins(int idx) +{ + Q_ASSERT(m_w->dm != nullptr); + Device *dev = nullptr; + QList mapKeys = m_w->dm->map.keys(); + std::sort(mapKeys.begin(), mapKeys.end(), sortByUUID); + if(idx < mapKeys.size()) { + dev = m_w->dm->map[mapKeys[idx]]; + } + QStringList pluginList = availablePlugins("", "", idx, dev); + return pluginList; +} + +QStringList ScopyMainWindow_API::getPlugins(QString param, QString cat) +{ + QStringList pluginList = availablePlugins(param, cat, -1, nullptr); + return pluginList; +} + +QStringList ScopyMainWindow_API::availablePlugins(QString param, QString cat, int idx, Device *dev) +{ + PluginRepository *pr = new PluginRepository(this); + m_w->loadPluginsFromRepository(pr); + PluginManager *pm = pr->getPluginManager(); + QList compatiblePlugins; + if(!param.isEmpty()){ + compatiblePlugins = pm->getCompatiblePlugins(param, cat); + qInfo(CAT_SCOPY_API) << "Available plugins for" << param << ":"; + } else { + compatiblePlugins = pm->getCompatiblePlugins(dev->param(), dev->category()); + qInfo(CAT_SCOPY_API) << "Available plugins for" << dev->param() << ":"; + } + + QStringList resultList; + for(int i = 0; i < compatiblePlugins.size(); i++) { + qInfo(CAT_SCOPY_API) << compatiblePlugins[i]->name(); + resultList.append(compatiblePlugins[i]->name()); + } + return resultList; +} #include "moc_scopymainwindow_api.cpp"