diff --git a/debian/guh-plugins.install b/debian/guh-plugins.install index 70e651bf..68ef0ccd 100644 --- a/debian/guh-plugins.install +++ b/debian/guh-plugins.install @@ -11,3 +11,5 @@ usr/lib/guh/plugins/libguh_devicepluginwakeonlan.so usr/lib/guh/plugins/libguh_devicepluginwemo.so usr/lib/guh/plugins/libguh_devicepluginwifidetector.so usr/lib/guh/plugins/libguh_deviceplugindatetime.so +usr/lib/guh/plugins/libguh_deviceplugingenericelements.so +usr/lib/guh/plugins/libguh_deviceplugincommandlauncher.so diff --git a/guh_0.1.8_amd64.deb b/guh_0.1.8_amd64.deb deleted file mode 100644 index 4df38cee..00000000 Binary files a/guh_0.1.8_amd64.deb and /dev/null differ diff --git a/libguh1_0.1.8_amd64.deb b/libguh1_0.1.8_amd64.deb deleted file mode 100644 index 8448eeb1..00000000 Binary files a/libguh1_0.1.8_amd64.deb and /dev/null differ diff --git a/plugins/deviceplugins/commandlauncher/commandlauncher.pro b/plugins/deviceplugins/commandlauncher/commandlauncher.pro new file mode 100644 index 00000000..65c00415 --- /dev/null +++ b/plugins/deviceplugins/commandlauncher/commandlauncher.pro @@ -0,0 +1,10 @@ +include (../../plugins.pri) + +TARGET = $$qtLibraryTarget(guh_deviceplugincommandlauncher) + +SOURCES += \ + deviceplugincommandlauncher.cpp + +HEADERS += \ + deviceplugincommandlauncher.h + diff --git a/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.cpp b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.cpp new file mode 100644 index 00000000..5ecce404 --- /dev/null +++ b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.cpp @@ -0,0 +1,254 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * This file is part of guh. * + * * + * Guh is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, version 2 of the License. * + * * + * Guh is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with guh. If not, see . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +#include "deviceplugincommandlauncher.h" + +#include "plugin/device.h" +#include "devicemanager.h" + +#include + +DeviceClassId applicationDeviceClassId = DeviceClassId("0f39fe9e-51ea-4230-9646-2482c6234791"); +DeviceClassId scriptDeviceClassId = DeviceClassId("96044325-a6fb-47c9-9117-f29c3b327978"); +StateTypeId runningStateTypeId = StateTypeId("28d7e933-ff05-4f4c-95a0-482689543de5"); +ActionTypeId executeActionTypeId = ActionTypeId("cf52b41d-3108-423c-8907-ca5b4d97cac5"); +ActionTypeId killActionTypeId = ActionTypeId("d21b1fed-1dd9-4c5a-a64e-0c6ba94059be"); + +DevicePluginCommandLauncher::DevicePluginCommandLauncher() +{ +} + +DeviceManager::DeviceSetupStatus DevicePluginCommandLauncher::setupDevice(Device *device) +{ + // Application + if(device->deviceClassId() == applicationDeviceClassId){ + device->setName("Application launcher (" + device->paramValue("name").toString() + ")"); + return DeviceManager::DeviceSetupStatusSuccess; + } + + // Script + if(device->deviceClassId() == scriptDeviceClassId){ + QStringList scriptArguments = device->paramValue("script").toString().split(QRegExp("[ \r\n][ \r\n]*")); + // check if script exists and if it is executable + QFileInfo fileInfo(scriptArguments.first()); + if (!fileInfo.exists()) { + qWarning() << "ERROR: script " << scriptArguments.first() << "does not exist."; + return DeviceManager::DeviceSetupStatusFailure; + } + if (!fileInfo.isExecutable()) { + qWarning() << "ERROR: script " << scriptArguments.first() << "is not executable. Please check the permissions."; + return DeviceManager::DeviceSetupStatusFailure; + } + if (!fileInfo.isReadable()) { + qWarning() << "ERROR: script " << scriptArguments.first() << "is not readable. Please check the permissions."; + return DeviceManager::DeviceSetupStatusFailure; + } + + device->setName("Bashscript launcher (" + device->paramValue("name").toString() + ")"); + return DeviceManager::DeviceSetupStatusSuccess; + } + return DeviceManager::DeviceSetupStatusFailure; +} + +DeviceManager::HardwareResources DevicePluginCommandLauncher::requiredHardware() const +{ + return DeviceManager::HardwareResourceNone; +} + +DeviceManager::DeviceError DevicePluginCommandLauncher::executeAction(Device *device, const Action &action) +{ + // Application + if (device->deviceClassId() == applicationDeviceClassId ) { + // execute application... + if (action.actionTypeId() == executeActionTypeId) { + // check if we allready have started the application + if (m_applications.values().contains(device)) { + if (m_applications.key(device)->state() == QProcess::Running) { + return DeviceManager::DeviceErrorDeviceInUse; + } + } + QProcess *process = new QProcess(this); + connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(applicationFinished(int,QProcess::ExitStatus))); + connect(process, &QProcess::stateChanged, this, &DevicePluginCommandLauncher::applicationStateChanged); + + m_applications.insert(process, device); + m_startingApplications.insert(process, action.id()); + process->start("/bin/bash", QStringList() << "-c" << device->paramValue("command").toString()); + + return DeviceManager::DeviceErrorAsync; + } + // kill application... + if (action.actionTypeId() == killActionTypeId) { + // check if the application is running... + if (!m_applications.values().contains(device)) { + return DeviceManager::DeviceErrorNoError; + } + QProcess *process = m_applications.key(device); + m_killingApplications.insert(process,action.id()); + process->kill(); + + return DeviceManager::DeviceErrorAsync; + } + return DeviceManager::DeviceErrorActionTypeNotFound; + } + + // Script + if (device->deviceClassId() == scriptDeviceClassId ) { + // execute script... + if (action.actionTypeId() == executeActionTypeId) { + // check if we allready have started the script + if (m_scripts.values().contains(device)) { + if (m_scripts.key(device)->state() == QProcess::Running) { + return DeviceManager::DeviceErrorDeviceInUse; + } + } + QProcess *process = new QProcess(this); + connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(scriptFinished(int,QProcess::ExitStatus))); + connect(process, &QProcess::stateChanged, this, &DevicePluginCommandLauncher::scriptStateChanged); + + m_scripts.insert(process, device); + m_startingScripts.insert(process, action.id()); + process->start("/bin/bash", QStringList() << device->paramValue("script").toString()); + + return DeviceManager::DeviceErrorAsync; + } + // kill script... + if (action.actionTypeId() == killActionTypeId) { + // check if the script is running... + if (!m_scripts.values().contains(device)) { + return DeviceManager::DeviceErrorNoError; + } + QProcess *process = m_scripts.key(device); + m_killingScripts.insert(process,action.id()); + process->kill(); + + return DeviceManager::DeviceErrorAsync; + } + return DeviceManager::DeviceErrorActionTypeNotFound; + } + return DeviceManager::DeviceErrorDeviceClassNotFound; +} + +void DevicePluginCommandLauncher::deviceRemoved(Device *device) +{ + if (m_applications.values().contains(device)) { + QProcess * process = m_applications.key(device); + if (process->state() != QProcess::NotRunning) { + process->kill(); + } + m_applications.remove(process); + + if (m_startingApplications.contains(process)) { + m_startingApplications.remove(process); + } + if (m_killingApplications.contains(process)) { + m_killingApplications.remove(process); + } + process->deleteLater(); + } + if (m_scripts.values().contains(device)) { + QProcess * process = m_scripts.key(device); + if (process->state() != QProcess::NotRunning) { + process->kill(); + } + m_scripts.remove(process); + + if (m_startingScripts.contains(process)) { + m_startingScripts.remove(process); + } + if (m_killingScripts.contains(process)) { + m_killingScripts.remove(process); + } + process->deleteLater(); + } +} + +void DevicePluginCommandLauncher::scriptStateChanged(QProcess::ProcessState state) +{ + QProcess *process = static_cast(sender()); + Device *device = m_scripts.value(process); + + switch (state) { + case QProcess::Running: + device->setStateValue(runningStateTypeId, true); + emit actionExecutionFinished(m_startingScripts.value(process), DeviceManager::DeviceErrorNoError); + m_startingScripts.remove(process); + break; + case QProcess::NotRunning: + device->setStateValue(runningStateTypeId, false); + if (m_killingScripts.contains(process)) { + emit actionExecutionFinished(m_killingScripts.value(process), DeviceManager::DeviceErrorNoError); + m_killingScripts.remove(process); + } + break; + default: + break; + } +} + +void DevicePluginCommandLauncher::scriptFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + Q_UNUSED(exitCode); + Q_UNUSED(exitStatus); + + QProcess *process = static_cast(sender()); + Device *device = m_scripts.value(process); + + device->setStateValue(runningStateTypeId, false); + + m_scripts.remove(process); + process->deleteLater(); +} + +void DevicePluginCommandLauncher::applicationStateChanged(QProcess::ProcessState state) +{ + QProcess *process = static_cast(sender()); + Device *device = m_applications.value(process); + + switch (state) { + case QProcess::Running: + device->setStateValue(runningStateTypeId, true); + emit actionExecutionFinished(m_startingApplications.value(process), DeviceManager::DeviceErrorNoError); + m_startingApplications.remove(process); + break; + case QProcess::NotRunning: + device->setStateValue(runningStateTypeId, false); + if (m_killingApplications.contains(process)) { + emit actionExecutionFinished(m_killingApplications.value(process), DeviceManager::DeviceErrorNoError); + m_killingApplications.remove(process); + } + break; + default: + break; + } +} + +void DevicePluginCommandLauncher::applicationFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + Q_UNUSED(exitCode); + Q_UNUSED(exitStatus); + + QProcess *process = static_cast(sender()); + Device *device = m_applications.value(process); + + device->setStateValue(runningStateTypeId, false); + + m_applications.remove(process); + process->deleteLater(); +} diff --git a/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.h b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.h new file mode 100644 index 00000000..0c419e7c --- /dev/null +++ b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.h @@ -0,0 +1,59 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * This file is part of guh. * + * * + * Guh is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, version 2 of the License. * + * * + * Guh is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with guh. If not, see . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef DEVICEPLUGINCOMMANDLAUNCHER_H +#define DEVICEPLUGINCOMMANDLAUNCHER_H + +#include "plugin/deviceplugin.h" +#include +#include + +class DevicePluginCommandLauncher : public DevicePlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "guru.guh.DevicePlugin" FILE "deviceplugincommandlauncher.json") + Q_INTERFACES(DevicePlugin) + +public: + explicit DevicePluginCommandLauncher(); + + DeviceManager::DeviceSetupStatus setupDevice(Device *device) override; + DeviceManager::HardwareResources requiredHardware() const override; + DeviceManager::DeviceError executeAction(Device *device, const Action &action) override; + + void deviceRemoved(Device *device) override; + +private: + QHash m_scripts; + QHash m_applications; + + // Hashes for action execution4 + QHash m_startingScripts; + QHash m_startingApplications; + QHash m_killingScripts; + QHash m_killingApplications; + +private slots: + void scriptStateChanged(QProcess::ProcessState state); + void scriptFinished(int exitCode, QProcess::ExitStatus exitStatus); + void applicationStateChanged(QProcess::ProcessState state); + void applicationFinished(int exitCode, QProcess::ExitStatus exitStatus); +}; + +#endif // DEVICEPLUGINCOMMANDLAUNCHER_H diff --git a/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.json b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.json new file mode 100644 index 00000000..8bdca620 --- /dev/null +++ b/plugins/deviceplugins/commandlauncher/deviceplugincommandlauncher.json @@ -0,0 +1,78 @@ +{ + "name": "Application and script launcher", + "id": "5d37b796-4872-4eab-a7af-94ca9ddd8199", + "vendors": [ + { + "name": "guh", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "deviceClasses": [ + { + "deviceClassId": "0f39fe9e-51ea-4230-9646-2482c6234791", + "name": "Application launcher", + "createMethods": ["user"], + "paramTypes": [ + { + "name": "name", + "type": "QString" + }, + { + "name": "command", + "type": "QString" + } + ], + "stateTypes": [ + { + "id": "28d7e933-ff05-4f4c-95a0-482689543de5", + "name": "running", + "type": "bool", + "defaultValue": false + } + ], + "actionTypes": [ + { + "id": "cf52b41d-3108-423c-8907-ca5b4d97cac5", + "name": "execute" + }, + { + "id": "d21b1fed-1dd9-4c5a-a64e-0c6ba94059be", + "name": "kill" + } + ] + }, + { + "deviceClassId": "96044325-a6fb-47c9-9117-f29c3b327978", + "name": "Bashscript launcher", + "createMethods": ["user"], + "paramTypes": [ + { + "name": "name", + "type": "QString" + }, + { + "name": "script", + "type": "QString" + } + ], + "stateTypes": [ + { + "id": "28d7e933-ff05-4f4c-95a0-482689543de5", + "name": "running", + "type": "bool", + "defaultValue": false + } + ], + "actionTypes": [ + { + "id": "cf52b41d-3108-423c-8907-ca5b4d97cac5", + "name": "execute" + }, + { + "id": "d21b1fed-1dd9-4c5a-a64e-0c6ba94059be", + "name": "kill" + } + ] + } + ] + } + ] +} diff --git a/plugins/deviceplugins/deviceplugins.pro b/plugins/deviceplugins/deviceplugins.pro index 70407799..368490f4 100644 --- a/plugins/deviceplugins/deviceplugins.pro +++ b/plugins/deviceplugins/deviceplugins.pro @@ -11,6 +11,8 @@ SUBDIRS += elro \ philipshue \ lgsmarttv \ datetime \ + genericelements \ + commandlauncher \ diff --git a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.cpp b/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.cpp deleted file mode 100644 index 319e1193..00000000 --- a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/**************************************************************************** - * * - * This file is part of guh. * - * * - * Guh is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, version 2 of the License. * - * * - * Guh is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with guh. If not, see . * - * * - ***************************************************************************/ - -/*! - \page meisteranker.html - \title Meister Anker - - \ingroup plugins - \ingroup rf433 - - This plugin allows to receive thermometer signals from Meister Anker - devices. - - Following devices are supported: - - \chapter Supported devices - \section1 Thermometer - \table - \header - \li Model - \li Device Type - \row - \li - \li - \endtable - */ - -#include "devicepluginmeisteranker.h" - -#include "plugin/device.h" -#include "devicemanager.h" -#include "hardware/radio433.h" - -#include -#include - -VendorId meisterAnkerVendorId = VendorId("c181e749-5f72-4e25-a0af-094633abd7d5"); -DeviceClassId thermometer = DeviceClassId("e37e9f34-95b9-4a22-ae4f-e8b874eec871"); - -DevicePluginMeisterAnker::DevicePluginMeisterAnker() -{ -} - -QList DevicePluginMeisterAnker::supportedVendors() const -{ - QList ret; - Vendor meisterAnker(meisterAnkerVendorId, "Meister Anker"); - ret.append(meisterAnker); - return ret; -} - -QList DevicePluginMeisterAnker::supportedDevices() const -{ - QList ret; - - // Thermometer - DeviceClass deviceClassMeisterAnkerThermometer(pluginId(), meisterAnkerVendorId, thermometer); - deviceClassMeisterAnkerThermometer.setName("Meister Anker Thermometer"); - - QVariantList thermometerParams; - QVariantMap idParam; - - // ======================================= - // id -> first 8 bits of codeword - idParam.insert("name", "id"); - idParam.insert("type", "string"); - thermometerParams.append(idParam); - - deviceClassMeisterAnkerThermometer.setParams(thermometerParams); - - QList thermometerStates; - - StateType tempState(StateTypeId("a9849491-25f4-43a3-a6fe-3bfce43d6332")); - tempState.setName("Temperature"); - tempState.setType(QVariant::Double); - thermometerStates.append(tempState); - - StateType batteryState(StateTypeId("ebf951ba-75ca-47ac-ba3c-ea9ec1e7bbd1")); - batteryState.setName("Battery"); - batteryState.setType(QVariant::Bool); - thermometerStates.append(batteryState); - - deviceClassMeisterAnkerThermometer.setStates(thermometerStates); - - QList thermometerEvents; - - QVariantList paramsThermometer; - QVariantMap paramThermometer; - paramThermometer.insert("name", "temperature"); - paramThermometer.insert("type", "double"); - paramsThermometer.append(paramThermometer); - - EventType temperatureEvent(EventTypeId("174ab4d5-2ef0-491b-a55b-c895cedff80e")); - temperatureEvent.setName("temperature"); - temperatureEvent.setParameters(paramsThermometer); - thermometerEvents.append(temperatureEvent); - - QVariantList paramsThermometerBat; - QVariantMap paramThermometerBat; - paramThermometerBat.insert("name", "batteryStatus"); - paramThermometerBat.insert("type", "bool"); - paramsThermometerBat.append(paramThermometerBat); - - EventType batteryStatusEvent(EventTypeId("c376b532-993f-41c7-acc7-02b409136d32")); - batteryStatusEvent.setName("batteryStatus"); - batteryStatusEvent.setParameters(paramsThermometerBat); - thermometerEvents.append(batteryStatusEvent); - - // TODO: lock if we need a sync event - // EventType syncEvent(QUuid("174ab4d5-2ef0-491b-a55b-c895cedff80e")); - // temperatureEvent.setName("sync"); - // temperatureEvent.setParameters(paramsThermometer); - // thermometerEvents.append(temperatureEvent); - - - deviceClassMeisterAnkerThermometer.setEvents(thermometerEvents); - ret.append(deviceClassMeisterAnkerThermometer); - - return ret; -} - -DeviceManager::HardwareResources DevicePluginMeisterAnker::requiredHardware() const -{ - return DeviceManager::HardwareResourceRadio433; -} - -QString DevicePluginMeisterAnker::pluginName() const -{ - return "Meister Anker"; -} - -QUuid DevicePluginMeisterAnker::pluginId() const -{ - return QUuid("993a7c86-e4b9-44aa-b61e-1f7165df1348"); -} - -void DevicePluginMeisterAnker::executeAction(Device *device, const Action &action) -{ - Q_UNUSED(device) - Q_UNUSED(action) -} - -void DevicePluginMeisterAnker::radioData(QList rawData) -{ - // filter right here a wrong signal length - if(rawData.length() != 49){ - return; - } - - QByteArray binCode; - int delay = rawData.first()/31; - - // parse rawdate to binary code - if(delay > 240 && delay < 260){ - - /* __ - * | |________ = 0 1100000000 - * __ - * | |________________ = 1 110000000000000000 - */ - - for(int i = 1; i <= 48; i+=2 ){ - if(rawData.at(i) < 1000 && rawData.at(i+1) < 3000 && rawData.at(i+1) > 1000){ - binCode.append('0'); - }else if(rawData.at(i) < 1000 && rawData.at(i+1) > 3000){ - binCode.append('1'); - }else{ - return; - } - } - }else{ - return; - } - - //qDebug() << "bin code" << binCode; - - // ======================================= - // { ID },{ temp },{Batt},{,temp} - // "XXXX","XXXX","XXXX","XXXX","XXXX","XXXX", - - QString idCode = QString(binCode.left(8)); - QByteArray temperatureBin = binCode.mid(8,8); - QByteArray batteryBin = binCode.mid(16,4); - QByteArray temperatureTenthBin = binCode.right(4); - - qDebug() << "id:" << idCode; - qDebug() << "battery" << batteryBin; - - // check if we have a sync signal (id = 11111111) - if(idCode == "11111111"){ - qDebug() << "temperatursensor sync signal"; - return; - } - - // check if the battery is low - bool batteryStatus; - if(batteryBin.toInt(0,2) == 0){ - batteryStatus = true; - }else{ - batteryStatus = false; - } - - // check sign of temperature -> if first bit of temperature byte is 1 -> temp is negativ - int sign = 0; - if(temperatureBin.left(1).toInt() == 1){ - sign = -1; - }else{ - sign = 1; - } - - // calc temperature - float temperature = sign*(temperatureBin.right(7).toInt(0,2) + (float)temperatureTenthBin.toInt(0,2)/10); - - // TODO: check if it is the same temperature than the last time - // QString timeStamp = QDateTime::currentDateTime().toString("dd.MM.yyyy, hh:mm:ss"); - -} diff --git a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.h b/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.h deleted file mode 100644 index 62b274fb..00000000 --- a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** - * * - * This file is part of guh. * - * * - * Guh is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, version 2 of the License. * - * * - * Guh is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with guh. If not, see . * - * * - ***************************************************************************/ - -#ifndef DEVICEPLUGINMEISTERANKER_H -#define DEVICEPLUGINMEISTERANKER_H - -#include "plugin/deviceplugin.h" - - -class DevicePluginMeisterAnker : public DevicePlugin -{ - Q_OBJECT - - Q_PLUGIN_METADATA(IID "org.guh.DevicePlugin" FILE "devicepluginmeisteranker.json") - Q_INTERFACES(DevicePlugin) - -public: - explicit DevicePluginMeisterAnker(); - - QList supportedVendors() const override; - QList supportedDevices() const override; - DeviceManager::HardwareResources requiredHardware() const override; - - QString pluginName() const override; - QUuid pluginId() const override; - - void radioData(QList rawData) override; - -public slots: - void executeAction(Device *device, const Action &action) override; -}; - -#endif // DEVICEPLUGINMEISTERANKER_H diff --git a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.json b/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.json deleted file mode 100644 index 0967ef42..00000000 --- a/plugins/deviceplugins/meisteranker/devicepluginmeisteranker.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/plugins/deviceplugins/meisteranker/meisteranker.pro b/plugins/deviceplugins/meisteranker/meisteranker.pro deleted file mode 100644 index 3a6a5729..00000000 --- a/plugins/deviceplugins/meisteranker/meisteranker.pro +++ /dev/null @@ -1,11 +0,0 @@ -include(../../plugins.pri) - -TARGET = $$qtLibraryTarget(guh_devicepluginmeisteranker) - -SOURCES += \ - devicepluginmeisteranker.cpp - -HEADERS += \ - devicepluginmeisteranker.h - -