From 1d1424f52f2fe7f4cdae247ef40bc50abb890593 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 19 Nov 2018 15:35:26 +0100 Subject: [PATCH] fix handling DeviceChanged notification --- libnymea-app-core/devicemanager.cpp | 3 ++- libnymea-app-core/jsonrpc/jsontypes.cpp | 16 ++++++++++++---- libnymea-common/types/device.cpp | 18 ++++++++++++++---- libnymea-common/types/states.cpp | 1 + 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/libnymea-app-core/devicemanager.cpp b/libnymea-app-core/devicemanager.cpp index bd358724..78fe04a6 100644 --- a/libnymea-app-core/devicemanager.cpp +++ b/libnymea-app-core/devicemanager.cpp @@ -121,7 +121,7 @@ void DeviceManager::notificationReceived(const QVariantMap &data) device->deleteLater(); } else if (notification == "Devices.DeviceChanged") { QUuid deviceId = data.value("params").toMap().value("device").toMap().value("id").toUuid(); - qDebug() << "Device changed notification" << deviceId; + qDebug() << "Device changed notification" << deviceId << data.value("params").toMap(); Device *oldDevice = m_devices->getDevice(deviceId); if (!oldDevice) { qWarning() << "Received a device changed notification for a device we don't know"; @@ -131,6 +131,7 @@ void DeviceManager::notificationReceived(const QVariantMap &data) qWarning() << "Error parsing device changed notification"; return; } + qDebug() << "*** device unpacked" << oldDevice->stateValue("98e4476f-e745-4a7f-b795-19269cb70c40"); } else { qWarning() << "DeviceManager unhandled device notification received" << notification; } diff --git a/libnymea-app-core/jsonrpc/jsontypes.cpp b/libnymea-app-core/jsonrpc/jsontypes.cpp index b22a6fb2..62e1b1a6 100644 --- a/libnymea-app-core/jsonrpc/jsontypes.cpp +++ b/libnymea-app-core/jsonrpc/jsontypes.cpp @@ -232,10 +232,18 @@ Device* JsonTypes::unpackDevice(const QVariantMap &deviceMap, DeviceClasses *dev } device->setParams(params); - States *states = new States(device); - foreach (StateType *stateType, deviceClass->stateTypes()->stateTypes()) { - State *state = new State(device->id(), stateType->id(), stateType->defaultValue(), states); - states->addState(state); + States *states = device->states(); + if (!states) { + states = new States(device); + } + foreach (const QVariant &stateVariant, deviceMap.value("states").toList()) { + State *state = states->getState(stateVariant.toMap().value("stateTypeId").toUuid()); + if (!state) { + state = new State(device->id(), stateVariant.toMap().value("stateTypeId").toUuid(), stateVariant.toMap().value("value"), states); + states->addState(state); + } else { + state->setValue(stateVariant.toMap().value("value")); + } } device->setStates(states); diff --git a/libnymea-common/types/device.cpp b/libnymea-common/types/device.cpp index b2c44e8d..e130e629 100644 --- a/libnymea-common/types/device.cpp +++ b/libnymea-common/types/device.cpp @@ -75,8 +75,13 @@ Params *Device::params() const void Device::setParams(Params *params) { - m_params = params; - emit paramsChanged(); + if (m_params != params) { + if (m_params) { + m_params->deleteLater(); + } + m_params = params; + emit paramsChanged(); + } } States *Device::states() const @@ -86,8 +91,13 @@ States *Device::states() const void Device::setStates(States *states) { - m_states = states; - emit statesChanged(); + if (m_states != states) { + if (m_states) { + m_states->deleteLater(); + } + m_states = states; + emit statesChanged(); + } } DeviceClass *Device::deviceClass() const diff --git a/libnymea-common/types/states.cpp b/libnymea-common/types/states.cpp index e49f3a0e..01c1d68b 100644 --- a/libnymea-common/types/states.cpp +++ b/libnymea-common/types/states.cpp @@ -76,6 +76,7 @@ QVariant States::data(const QModelIndex &index, int role) const void States::addState(State *state) { + state->setParent(this); beginInsertRows(QModelIndex(), m_states.count(), m_states.count()); //qDebug() << "States: loaded state" << state->stateTypeId(); m_states.append(state);