From 937b032f3c67b466184684a7a94913383cacb9a6 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 12 Jan 2023 22:54:25 +0100 Subject: [PATCH] Use dynamic min/max values for io connections --- .../thingmanagerimplementation.cpp | 21 ++++++++++++------- .../integrations/thingmanagerimplementation.h | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/libnymea-core/integrations/thingmanagerimplementation.cpp b/libnymea-core/integrations/thingmanagerimplementation.cpp index bb8d29a2..b1765b41 100644 --- a/libnymea-core/integrations/thingmanagerimplementation.cpp +++ b/libnymea-core/integrations/thingmanagerimplementation.cpp @@ -1892,12 +1892,15 @@ void ThingManagerImplementation::syncIOConnection(Thing *thing, const StateTypeI continue; } StateType inputStateType = inputThing->thingClass().getStateType(stateTypeId); + State inputState = inputThing->state(stateTypeId); StateType outputStateType = outputThing->thingClass().getStateType(ioConnection.outputStateTypeId()); if (outputStateType.id().isNull()) { qCWarning(dcThingManager()) << "Could not find output state type for IO connection."; continue; } + State outputState = outputThing->state(ioConnection.outputStateTypeId()); + QVariant outputValue; if (outputStateType.ioType() == Types::IOTypeDigitalOutput) { // Digital IOs are mapped as-is @@ -1909,7 +1912,7 @@ void ThingManagerImplementation::syncIOConnection(Thing *thing, const StateTypeI } } else { // Analog IOs are mapped within the according min/max ranges - outputValue = mapValue(inputValue, inputStateType, outputStateType, ioConnection.inverted()); + outputValue = mapValue(inputValue, inputState, outputState, ioConnection.inverted()); // We're already in sync (fuzzy, good enough)! Skipping action. if (qFuzzyCompare(1.0 + outputThing->stateValue(outputStateType.id()).toDouble(), 1.0 + outputValue.toDouble())) { @@ -1929,7 +1932,7 @@ void ThingManagerImplementation::syncIOConnection(Thing *thing, const StateTypeI if (inputStateType.ioType() == Types::IOTypeDigitalInput) { inputThing->setStateValue(inputStateType.id(), outputThing->stateValue(outputStateType.id())); } else { - inputThing->setStateValue(inputStateType.id(), mapValue(outputThing->stateValue(outputStateType.id()), outputStateType, inputStateType, ioConnection.inverted())); + inputThing->setStateValue(inputStateType.id(), mapValue(outputThing->stateValue(outputStateType.id()), outputState, inputState, ioConnection.inverted())); } } }); @@ -1951,12 +1954,14 @@ void ThingManagerImplementation::syncIOConnection(Thing *thing, const StateTypeI continue; } StateType outputStateType = outputThing->thingClass().getStateType(stateTypeId); + State outputState = outputThing->state(stateTypeId); StateType inputStateType = inputThing->thingClass().getStateType(ioConnection.inputStateTypeId()); if (inputStateType.id().isNull()) { qCWarning(dcThingManager()) << "Could not find input state type for IO connection."; continue; } + State inputState = inputThing->state(ioConnection.inputStateTypeId()); if (!inputStateType.writable()) { qCDebug(dcThingManager()) << "Input state is not writable. This connection is unidirectional."; @@ -1974,7 +1979,7 @@ void ThingManagerImplementation::syncIOConnection(Thing *thing, const StateTypeI } } else { // Analog IOs are mapped within the according min/max ranges - inputValue = mapValue(outputValue, outputStateType, inputStateType, ioConnection.inverted()); + inputValue = mapValue(outputValue, outputState, inputState, ioConnection.inverted()); // Prevent looping even if the above calculation has rounding errors... Just skip this action if we're close enough already if (qFuzzyCompare(1.0 + inputThing->stateValue(inputStateType.id()).toDouble(), 1.0 + inputValue.toDouble())) { @@ -2224,12 +2229,12 @@ void ThingManagerImplementation::loadIOConnections() connectionSettings.endGroup(); } -QVariant ThingManagerImplementation::mapValue(const QVariant &value, const StateType &fromStateType, const StateType &toStateType, bool inverted) const +QVariant ThingManagerImplementation::mapValue(const QVariant &value, const State &fromState, const State &toState, bool inverted) const { - double fromMin = fromStateType.minValue().toDouble(); - double fromMax = fromStateType.maxValue().toDouble(); - double toMin = toStateType.minValue().toDouble(); - double toMax = toStateType.maxValue().toDouble(); + double fromMin = fromState.minValue().toDouble(); + double fromMax = fromState.maxValue().toDouble(); + double toMin = toState.minValue().toDouble(); + double toMax = toState.maxValue().toDouble(); double fromValue = value.toDouble(); double fromPercent = (fromValue - fromMin) / (fromMax - fromMin); fromPercent = inverted ? 1 - fromPercent : fromPercent; diff --git a/libnymea-core/integrations/thingmanagerimplementation.h b/libnymea-core/integrations/thingmanagerimplementation.h index 41cdea4e..f8769f7b 100644 --- a/libnymea-core/integrations/thingmanagerimplementation.h +++ b/libnymea-core/integrations/thingmanagerimplementation.h @@ -170,7 +170,7 @@ private: void storeIOConnections(); void loadIOConnections(); void syncIOConnection(Thing *inputThing, const StateTypeId &stateTypeId); - QVariant mapValue(const QVariant &value, const StateType &fromStateType, const StateType &toStateType, bool inverted) const; + QVariant mapValue(const QVariant &value, const State &fromState, const State &toState, bool inverted) const; IntegrationPlugin *createCppIntegrationPlugin(const QString &absoluteFilePath);