diff --git a/simulation/devicepluginsimulation.cpp b/simulation/devicepluginsimulation.cpp index 2b9a008e..0b6e333e 100644 --- a/simulation/devicepluginsimulation.cpp +++ b/simulation/devicepluginsimulation.cpp @@ -53,9 +53,20 @@ void DevicePluginSimulation::init() DeviceManager::DeviceSetupStatus DevicePluginSimulation::setupDevice(Device *device) { qCDebug(dcSimulation()) << "Set up device" << device->name(); + if (device->deviceClassId() == garageGateDeviceClassId) { + m_simulationTimers.insert(device, new QTimer(device)); + connect(m_simulationTimers[device], &QTimer::timeout, this, &DevicePluginSimulation::simulationTimerTimeout); + } return DeviceManager::DeviceSetupStatusSuccess; } +void DevicePluginSimulation::deviceRemoved(Device *device) +{ + QTimer *t = m_simulationTimers.take(device); + t->stop(); + t->deleteLater(); +} + DeviceManager::DeviceError DevicePluginSimulation::executeAction(Device *device, const Action &action) { // Check the DeviceClassId for "Simple Button" @@ -229,6 +240,65 @@ DeviceManager::DeviceError DevicePluginSimulation::executeAction(Device *device, return DeviceManager::DeviceErrorActionTypeNotFound; } + if (device->deviceClassId() == garageGateDeviceClassId) { + if (action.actionTypeId() == garageGateOpenActionTypeId) { + if (device->stateValue(garageGateStateStateTypeId).toString() == "opening") { + qCDebug(dcSimulation()) << "Garage gate already opening."; + return DeviceManager::DeviceErrorNoError; + } + if (device->stateValue(garageGateStateStateTypeId).toString() == "open" && + !device->stateValue(garageGateIntermediatePositionStateTypeId).toBool()) { + qCDebug(dcSimulation()) << "Garage gate already open."; + return DeviceManager::DeviceErrorNoError; + } + device->setStateValue(garageGateStateStateTypeId, "opening"); + device->setStateValue(garageGateIntermediatePositionStateTypeId, true); + m_simulationTimers.value(device)->start(5000); + return DeviceManager::DeviceErrorNoError; + } + if (action.actionTypeId() == garageGateCloseActionTypeId) { + if (device->stateValue(garageGateStateStateTypeId).toString() == "closing") { + qCDebug(dcSimulation()) << "Garage gate already closing."; + return DeviceManager::DeviceErrorNoError; + } + if (device->stateValue(garageGateStateStateTypeId).toString() == "closed" && + !device->stateValue(garageGateIntermediatePositionStateTypeId).toBool()) { + qCDebug(dcSimulation()) << "Garage gate already closed."; + return DeviceManager::DeviceErrorNoError; + } + device->setStateValue(garageGateStateStateTypeId, "closing"); + device->setStateValue(garageGateIntermediatePositionStateTypeId, true); + m_simulationTimers.value(device)->start(5000); + return DeviceManager::DeviceErrorNoError; + } + if (action.actionTypeId() == garageGateStopActionTypeId) { + if (device->stateValue(garageGateStateStateTypeId).toString() == "opening" || + device->stateValue(garageGateStateStateTypeId).toString() == "closing") { + device->setStateValue(garageGateStateStateTypeId, "open"); + return DeviceManager::DeviceErrorNoError; + } + qCDebug(dcSimulation()) << "Garage gate not moving"; + return DeviceManager::DeviceErrorNoError; + } + } + + if (device->deviceClassId() == rollerShutterDeviceClassId) { + if (action.actionTypeId() == rollerShutterOpenActionTypeId) { + qCDebug(dcSimulation()) << "Opening roller shutter"; + return DeviceManager::DeviceErrorNoError; + } + if (action.actionTypeId() == rollerShutterCloseActionTypeId) { + qCDebug(dcSimulation()) << "Closing roller shutter"; + return DeviceManager::DeviceErrorNoError; + } + if (action.actionTypeId() == rollerShutterStopActionTypeId) { + qCDebug(dcSimulation()) << "Stopping roller shutter"; + return DeviceManager::DeviceErrorNoError; + } + } + + qCWarning(dcSimulation()) << "Unhandled device class" << device->deviceClassId() << "for device" << device->name(); + return DeviceManager::DeviceErrorDeviceClassNotFound; } @@ -304,3 +374,18 @@ void DevicePluginSimulation::onPluginTimer5Minutes() } } +void DevicePluginSimulation::simulationTimerTimeout() +{ + QTimer *t = static_cast(sender()); + Device *device = m_simulationTimers.key(t); + if (device->deviceClassId() == garageGateDeviceClassId) { + if (device->stateValue(garageGateStateStateTypeId).toString() == "opening") { + device->setStateValue(garageGateIntermediatePositionStateTypeId, false); + device->setStateValue(garageGateStateStateTypeId, "open"); + } + if (device->stateValue(garageGateStateStateTypeId).toString() == "closing") { + device->setStateValue(garageGateIntermediatePositionStateTypeId, false); + device->setStateValue(garageGateStateStateTypeId, "closed"); + } + } +} diff --git a/simulation/devicepluginsimulation.h b/simulation/devicepluginsimulation.h index be01afec..550f56f9 100644 --- a/simulation/devicepluginsimulation.h +++ b/simulation/devicepluginsimulation.h @@ -40,6 +40,7 @@ public: void init() override; DeviceManager::DeviceSetupStatus setupDevice(Device *device) override; + void deviceRemoved(Device *device) override; DeviceManager::DeviceError executeAction(Device *device, const Action &action) override; private: @@ -50,9 +51,11 @@ private: double generateRandomDoubleValue(double min, double max); bool generateRandomBoolValue(); + QHash m_simulationTimers; private slots: void onPluginTimer20Seconds(); void onPluginTimer5Minutes(); + void simulationTimerTimeout(); }; diff --git a/simulation/devicepluginsimulation.json b/simulation/devicepluginsimulation.json index ca29b027..6a190236 100644 --- a/simulation/devicepluginsimulation.json +++ b/simulation/devicepluginsimulation.json @@ -259,21 +259,27 @@ }, { "id": "cfb44bcf-b4b9-4bef-89f7-3a55baf35668", - "name": "garageDoor", - "displayName": "Garage Door", + "name": "garageGate", + "displayName": "Garage gate", "createMethods": ["user"], "deviceIcon": "Garage", - "basicTags": [ - "Device", - "Actuator" - ], + "interfaces": [ "garagegate" ], "paramTypes": [ ], "stateTypes": [ { "id": "f786029d-f3a6-4b47-978a-ac1a581aac0f", - "name": "door", - "displayName": "Garage door", - "displayNameEvent": "Garage door status changed", + "name": "state", + "displayName": "Garage gate state", + "displayNameEvent": "Garage gate state changed", + "type": "QString", + "possibleValues": ["open", "closed", "opening", "closing"], + "defaultValue": "open" + }, + { + "id": "324150cc-0357-4797-a746-37b554d82c44", + "name": "intermediatePosition", + "displayName": "Intermediate position", + "displayNameEvent": "Intermediate position changed", "type": "bool", "defaultValue": false } @@ -302,11 +308,7 @@ "displayName": "Roller Shutter", "createMethods": ["user"], "deviceIcon": "RollerShutter", - "basicTags": [ - "Device", - "Actuator", - "Shading" - ], + "interfaces": ["shutter"], "paramTypes": [ ], "stateTypes": [ {