Fix duplicate connections on case of retrying
This commit is contained in:
parent
6aaab68cdc
commit
8fee1bb2e5
@ -642,14 +642,13 @@ ThingPairingInfo *ThingManagerImplementation::confirmPairing(const PairingTransa
|
|||||||
|
|
||||||
if (addNewThing) {
|
if (addNewThing) {
|
||||||
qCDebug(dcThingManager()) << "Thing added:" << info->thing();
|
qCDebug(dcThingManager()) << "Thing added:" << info->thing();
|
||||||
m_configuredThings.insert(info->thing()->id(), info->thing());
|
registerThing(info->thing());
|
||||||
emit thingAdded(info->thing());
|
emit thingAdded(info->thing());
|
||||||
connect(info->thing(), &Thing::eventTriggered, this, &ThingManagerImplementation::onEventTriggered);
|
|
||||||
} else {
|
} else {
|
||||||
emit thingChanged(info->thing());
|
emit thingChanged(info->thing());
|
||||||
}
|
}
|
||||||
|
|
||||||
storeConfiguredThings();
|
storeConfiguredThings();
|
||||||
|
|
||||||
postSetupThing(info->thing());
|
postSetupThing(info->thing());
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -723,11 +722,9 @@ ThingSetupInfo* ThingManagerImplementation::addConfiguredThingInternal(const Thi
|
|||||||
info->thing()->setSetupStatus(Thing::ThingSetupStatusComplete, Thing::ThingErrorNoError);
|
info->thing()->setSetupStatus(Thing::ThingSetupStatusComplete, Thing::ThingErrorNoError);
|
||||||
|
|
||||||
qCDebug(dcThingManager) << "Thing setup complete.";
|
qCDebug(dcThingManager) << "Thing setup complete.";
|
||||||
m_configuredThings.insert(info->thing()->id(), info->thing());
|
registerThing(info->thing());
|
||||||
storeConfiguredThings();
|
storeConfiguredThings();
|
||||||
|
|
||||||
emit thingAdded(info->thing());
|
emit thingAdded(info->thing());
|
||||||
connect(info->thing(), &Thing::eventTriggered, this, &ThingManagerImplementation::onEventTriggered);
|
|
||||||
postSetupThing(info->thing());
|
postSetupThing(info->thing());
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1539,11 +1536,9 @@ void ThingManagerImplementation::loadConfiguredThings()
|
|||||||
// We always add the thing to the list in this case. If it's in the stored things
|
// We always add the thing to the list in this case. If it's in the stored things
|
||||||
// it means that it was working at some point so lets still add it as there might
|
// it means that it was working at some point so lets still add it as there might
|
||||||
// be rules associated with this thing.
|
// be rules associated with this thing.
|
||||||
m_configuredThings.insert(thing->id(), thing);
|
registerThing(thing);
|
||||||
|
|
||||||
emit thingAdded(thing);
|
emit thingAdded(thing);
|
||||||
|
|
||||||
connect(thing, &Thing::eventTriggered, this, &ThingManagerImplementation::onEventTriggered);
|
|
||||||
}
|
}
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
@ -1666,11 +1661,9 @@ void ThingManagerImplementation::onAutoThingsAppeared(const ThingDescriptors &th
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->thing()->setSetupStatus(Thing::ThingSetupStatusComplete, Thing::ThingErrorNoError);
|
info->thing()->setSetupStatus(Thing::ThingSetupStatusComplete, Thing::ThingErrorNoError);
|
||||||
m_configuredThings.insert(info->thing()->id(), info->thing());
|
registerThing(info->thing());
|
||||||
storeConfiguredThings();
|
storeConfiguredThings();
|
||||||
|
|
||||||
emit thingAdded(info->thing());
|
emit thingAdded(info->thing());
|
||||||
connect(info->thing(), &Thing::eventTriggered, this, &ThingManagerImplementation::onEventTriggered);
|
|
||||||
postSetupThing(info->thing());
|
postSetupThing(info->thing());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1746,7 +1739,7 @@ void ThingManagerImplementation::slotThingStateValueChanged(const StateTypeId &s
|
|||||||
qCWarning(dcThingManager()) << "Invalid thing id in state change. Not forwarding event. Thing setup not complete yet?";
|
qCWarning(dcThingManager()) << "Invalid thing id in state change. Not forwarding event. Thing setup not complete yet?";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
storeThingStates(thing);
|
storeThingState(thing, stateTypeId);
|
||||||
|
|
||||||
emit thingStateChanged(thing, stateTypeId, value);
|
emit thingStateChanged(thing, stateTypeId, value);
|
||||||
|
|
||||||
@ -1976,10 +1969,6 @@ ThingSetupInfo* ThingManagerImplementation::setupThing(Thing *thing)
|
|||||||
thing->setStates(states);
|
thing->setStates(states);
|
||||||
loadThingStates(thing);
|
loadThingStates(thing);
|
||||||
|
|
||||||
connect(thing, &Thing::stateValueChanged, this, &ThingManagerImplementation::slotThingStateValueChanged);
|
|
||||||
connect(thing, &Thing::settingChanged, this, &ThingManagerImplementation::slotThingSettingChanged);
|
|
||||||
connect(thing, &Thing::nameChanged, this, &ThingManagerImplementation::slotThingNameChanged);
|
|
||||||
|
|
||||||
ThingSetupInfo *info = new ThingSetupInfo(thing, this, 30000);
|
ThingSetupInfo *info = new ThingSetupInfo(thing, this, 30000);
|
||||||
|
|
||||||
if (!plugin) {
|
if (!plugin) {
|
||||||
@ -2114,14 +2103,28 @@ void ThingManagerImplementation::trySetupThing(Thing *thing)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThingManagerImplementation::registerThing(Thing *thing)
|
||||||
|
{
|
||||||
|
m_configuredThings.insert(thing->id(), thing);
|
||||||
|
connect(thing, &Thing::eventTriggered, this, &ThingManagerImplementation::onEventTriggered);
|
||||||
|
connect(thing, &Thing::stateValueChanged, this, &ThingManagerImplementation::slotThingStateValueChanged);
|
||||||
|
connect(thing, &Thing::settingChanged, this, &ThingManagerImplementation::slotThingSettingChanged);
|
||||||
|
connect(thing, &Thing::nameChanged, this, &ThingManagerImplementation::slotThingNameChanged);
|
||||||
|
}
|
||||||
|
|
||||||
void ThingManagerImplementation::storeThingStates(Thing *thing)
|
void ThingManagerImplementation::storeThingStates(Thing *thing)
|
||||||
|
{
|
||||||
|
ThingClass thingClass = m_supportedThings.value(thing->thingClassId());
|
||||||
|
foreach (const StateType &stateType, thingClass.stateTypes()) {
|
||||||
|
storeThingState(thing, stateType.id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThingManagerImplementation::storeThingState(Thing *thing, const StateTypeId &stateTypeId)
|
||||||
{
|
{
|
||||||
NymeaSettings settings(NymeaSettings::SettingsRoleThingStates);
|
NymeaSettings settings(NymeaSettings::SettingsRoleThingStates);
|
||||||
settings.beginGroup(thing->id().toString());
|
settings.beginGroup(thing->id().toString());
|
||||||
ThingClass thingClass = m_supportedThings.value(thing->thingClassId());
|
settings.setValue(stateTypeId.toString(), thing->stateValue(stateTypeId));
|
||||||
foreach (const StateType &stateType, thingClass.stateTypes()) {
|
|
||||||
settings.setValue(stateType.id().toString(), thing->stateValue(stateType.id()));
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -154,9 +154,11 @@ private:
|
|||||||
ThingSetupInfo *addConfiguredThingInternal(const ThingClassId &thingClassId, const QString &name, const ParamList ¶ms, const ThingId &parentId = ThingId());
|
ThingSetupInfo *addConfiguredThingInternal(const ThingClassId &thingClassId, const QString &name, const ParamList ¶ms, const ThingId &parentId = ThingId());
|
||||||
ThingSetupInfo *reconfigureThingInternal(Thing *thing, const ParamList ¶ms, const QString &name = QString());
|
ThingSetupInfo *reconfigureThingInternal(Thing *thing, const ParamList ¶ms, const QString &name = QString());
|
||||||
ThingSetupInfo *setupThing(Thing *thing);
|
ThingSetupInfo *setupThing(Thing *thing);
|
||||||
void postSetupThing(Thing *thing);
|
|
||||||
void trySetupThing(Thing *thing);
|
void trySetupThing(Thing *thing);
|
||||||
|
void registerThing(Thing *thing);
|
||||||
|
void postSetupThing(Thing *thing);
|
||||||
void storeThingStates(Thing *thing);
|
void storeThingStates(Thing *thing);
|
||||||
|
void storeThingState(Thing *thing, const StateTypeId &stateTypeId);
|
||||||
void loadThingStates(Thing *thing);
|
void loadThingStates(Thing *thing);
|
||||||
void storeIOConnections();
|
void storeIOConnections();
|
||||||
void loadIOConnections();
|
void loadIOConnections();
|
||||||
|
|||||||
@ -54,6 +54,7 @@ StateHandler::StateHandler(QObject *parent) :
|
|||||||
JsonHandler(parent)
|
JsonHandler(parent)
|
||||||
{
|
{
|
||||||
registerEnum<Types::Unit>();
|
registerEnum<Types::Unit>();
|
||||||
|
registerEnum<Types::IOType>();
|
||||||
registerObject<State>();
|
registerObject<State>();
|
||||||
registerObject<StateType>();
|
registerObject<StateType>();
|
||||||
|
|
||||||
|
|||||||
@ -2071,7 +2071,7 @@ void TestDevices::triggerEvent()
|
|||||||
// Check for the notification on JSON API
|
// Check for the notification on JSON API
|
||||||
QVariantList notifications;
|
QVariantList notifications;
|
||||||
notifications = checkNotifications(notificationSpy, "Devices.EventTriggered");
|
notifications = checkNotifications(notificationSpy, "Devices.EventTriggered");
|
||||||
QVERIFY2(notifications.count() == 1, "Should get Devices.EventTriggered notification");
|
QVERIFY2(notifications.count() == 1, QString("Should get Devices.EventTriggered notification but got: %1").arg(qUtf8Printable(QJsonDocument::fromVariant(notifications).toJson())).toUtf8());
|
||||||
QVariantMap notificationContent = notifications.first().toMap().value("params").toMap();
|
QVariantMap notificationContent = notifications.first().toMap().value("params").toMap();
|
||||||
|
|
||||||
QCOMPARE(notificationContent.value("event").toMap().value("deviceId").toUuid().toString(), device->id().toString());
|
QCOMPARE(notificationContent.value("event").toMap().value("deviceId").toUuid().toString(), device->id().toString());
|
||||||
|
|||||||
Reference in New Issue
Block a user