diff --git a/simulation/devicepluginsimulation.cpp b/simulation/devicepluginsimulation.cpp index 51f79878..1ecb869c 100644 --- a/simulation/devicepluginsimulation.cpp +++ b/simulation/devicepluginsimulation.cpp @@ -24,6 +24,7 @@ #include #include +#include DevicePluginSimulation::DevicePluginSimulation() { @@ -55,10 +56,14 @@ DeviceManager::DeviceSetupStatus DevicePluginSimulation::setupDevice(Device *dev qCDebug(dcSimulation()) << "Set up device" << device->name(); if (device->deviceClassId() == garageGateDeviceClassId || device->deviceClassId() == extendedAwningDeviceClassId || - device->deviceClassId() == rollerShutterDeviceClassId) { + device->deviceClassId() == rollerShutterDeviceClassId || + device->deviceClassId() == fingerPrintSensorDeviceClassId) { m_simulationTimers.insert(device, new QTimer(device)); connect(m_simulationTimers[device], &QTimer::timeout, this, &DevicePluginSimulation::simulationTimerTimeout); } + if (device->deviceClassId() == fingerPrintSensorDeviceClassId && device->stateValue(fingerPrintSensorUsersStateTypeId).toStringList().count() > 0) { + m_simulationTimers.value(device)->start(10000); + } return DeviceManager::DeviceSetupStatusSuccess; } @@ -352,6 +357,53 @@ DeviceManager::DeviceError DevicePluginSimulation::executeAction(Device *device, } } + if (device->deviceClassId() == fingerPrintSensorDeviceClassId) { + if (action.actionTypeId() == fingerPrintSensorAddUserActionTypeId) { + QStringList users = device->stateValue(fingerPrintSensorUsersStateTypeId).toStringList(); + QString username = action.param(fingerPrintSensorUserIdParamTypeId).value().toString(); + QString finger = action.param(fingerPrintSensorFingerParamTypeId).value().toString(); + QSettings settings; + settings.beginGroup(device->id().toString()); + QStringList usedFingers = settings.value(username).toStringList(); + if (users.contains(username) && usedFingers.contains(finger)) { + return DeviceManager::DeviceErrorDuplicateUuid; + } + QTimer::singleShot(5000, this, [this, action, device, username, finger]() { + if (username.toLower().trimmed() == "john") { + emit actionExecutionFinished(action.id(), DeviceManager::DeviceErrorHardwareFailure); + } else { + emit actionExecutionFinished(action.id(), DeviceManager::DeviceErrorNoError); + QStringList users = device->stateValue(fingerPrintSensorUsersStateTypeId).toStringList(); + if (!users.contains(username)) { + users.append(username); + device->setStateValue(fingerPrintSensorUsersStateTypeId, users); + m_simulationTimers.value(device)->start(10000); + } + + QSettings settings; + settings.beginGroup(device->id().toString()); + QStringList usedFingers = settings.value(username).toStringList(); + usedFingers.append(finger); + settings.setValue(username, usedFingers); + settings.endGroup(); + } + }); + return DeviceManager::DeviceErrorAsync; + } + if (action.actionTypeId() == fingerPrintSensorRemoveUserActionTypeId) { + QStringList users = device->stateValue(fingerPrintSensorUsersStateTypeId).toStringList(); + QString username = action.params().first().value().toString(); + if (!users.contains(username)) { + return DeviceManager::DeviceErrorInvalidParameter; + } + users.removeAll(username); + device->setStateValue(fingerPrintSensorUsersStateTypeId, users); + if (users.count() == 0) { + m_simulationTimers.value(device)->stop(); + } + return DeviceManager::DeviceErrorNoError; + } + } qCWarning(dcSimulation()) << "Unhandled device class" << device->deviceClassId() << "for device" << device->name(); return DeviceManager::DeviceErrorDeviceClassNotFound; @@ -460,5 +512,23 @@ void DevicePluginSimulation::simulationTimerTimeout() t->stop(); device->setStateValue(rollerShutterMovingStateTypeId, false); } + } else if (device->deviceClassId() == fingerPrintSensorDeviceClassId) { + EventTypeId evt = qrand() % 2 == 0 ? fingerPrintSensorAccessGrantedEventTypeId : fingerPrintSensorAccessDeniedEventTypeId; + ParamList params; + if (evt == fingerPrintSensorAccessGrantedEventTypeId) { + QStringList users = device->stateValue(fingerPrintSensorUsersStateTypeId).toStringList(); + QString user = users.at(qrand() % users.count()); + QSettings settings; + settings.beginGroup(device->id().toString()); + QStringList fingers = settings.value(user).toStringList(); + params.append(Param(fingerPrintSensorUserIdParamTypeId, user)); + QString finger = fingers.at(qrand() % fingers.count()); + params.append(Param(fingerPrintSensorFingerParamTypeId, finger)); + qCDebug(dcSimulation()) << "Emitting fingerprint accepted for user" << user << "and finger" << finger; + } else { + qCDebug(dcSimulation()) << "Emitting fingerprint denied"; + } + Event event(evt, device->id(), params); + emitEvent(event); } } diff --git a/simulation/devicepluginsimulation.json b/simulation/devicepluginsimulation.json index a0d57828..5ca9e39b 100644 --- a/simulation/devicepluginsimulation.json +++ b/simulation/devicepluginsimulation.json @@ -549,7 +549,7 @@ "name": "fingerPrintSensor", "displayName": "Finger Print Sensor", "createMethods": ["user"], - "interfaces": ["connectable"], + "interfaces": ["fingerprintreader", "connectable"], "deviceIcon": "Network", "basicTags": [ "Device", @@ -564,13 +564,93 @@ "displayNameEvent": "Connected changed", "type": "bool", "defaultValue": true + }, + { + "id": "02482093-3b82-4918-a3ce-2a2f4831aae0", + "name": "users", + "displayName": "users", + "displayNameEvent": "Users", + "type": "QStringList", + "defaultValue": [] + } + ], + "actionTypes": [ + { + "id": "c3805253-a09b-4657-b86c-97936f390672", + "name": "addUser", + "displayName": "Add user", + "paramTypes": [ + { + "id": "d9e0c68f-8b61-4f5a-9909-b27a4ac562a3", + "displayName": "User ID", + "name": "userId", + "type": "QString" + }, + { + "id": "2a97de6c-5ffb-4ca8-b4c7-41ad6790668d", + "displayName": "Finger", + "name": "finger", + "type": "QString", + "allowedValues": [ + "ThumbLeft", + "IndexFingerLeft", + "MiddleFingerLeft", + "RingFingerLeft", + "PinkyLeft", + "ThumbRight", + "IndexFingerRight", + "MiddleFingerRight", + "RingFingerRight", + "PinkyRight" + ] + } + ] + }, + { + "id": "28bf4cd1-bb1c-442b-8ba3-ed019f34abbd", + "name": "removeUser", + "displayName": "Remove user", + "paramTypes": [ + { + "id": "ca2ffce8-ee71-47ff-8247-f17fca14fd87", + "displayName": "User ID", + "name": "userId", + "type": "QString" + } + ] } ], "eventTypes": [ { "id": "1d2dde79-7121-4f8c-b7c1-904ced66a79e", "name": "accessGranted", - "displayName": "Access granted" + "displayName": "Access granted", + "paramTypes": [ + { + "id": "84addd61-15e9-4e98-aa80-6b0bf5d82a15", + "name": "userId", + "displayName": "User ID", + "type": "QString" + }, + { + "id": "3611bfc0-be3c-4ddb-8184-b64fc38c7256", + "displayName": "Finger", + "name": "finger", + "type": "QString", + "allowedValues": [ + "ThumbLeft", + "IndexFingerLeft", + "MiddleFingerLeft", + "RingFingerLeft", + "PinkyLeft", + "ThumbRight", + "IndexFingerRight", + "MiddleFingerRight", + "RingFingerRight", + "PinkyRight" + ] + } + ] }, { "id": "992b7742-af0c-447c-bd94-9ec70b872268",