Merge PR #380: Support inverted IO connections

This commit is contained in:
Jenkins nymea 2020-05-10 22:56:40 +02:00
commit d029ebdf26
7 changed files with 89 additions and 37 deletions

View File

@ -233,7 +233,8 @@ void DeviceManager::notificationReceived(const QVariantMap &data)
QUuid inputStateTypeId = connectionMap.value("inputStateTypeId").toUuid();
QUuid outputThingId = connectionMap.value("outputThingId").toUuid();
QUuid outputStateTypeId = connectionMap.value("outputStateTypeId").toUuid();
IOConnection *ioConnection = new IOConnection(id, inputThingId, inputStateTypeId, outputThingId, outputStateTypeId);
bool inverted = connectionMap.value("inverted").toBool();
IOConnection *ioConnection = new IOConnection(id, inputThingId, inputStateTypeId, outputThingId, outputStateTypeId, inverted);
m_ioConnections->addIOConnection(ioConnection);
} else if (notification == "Integrations.IOConnectionRemoved") {
QUuid connectionId = data.value("params").toMap().value("ioConnectionId").toUuid();
@ -712,13 +713,14 @@ int DeviceManager::executeBrowserItemAction(const QUuid &deviceId, const QString
return m_jsonClient->sendCommand("Actions.ExecuteBrowserItemAction", data, this, "executeBrowserItemActionResponse");
}
int DeviceManager::connectIO(const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId)
int DeviceManager::connectIO(const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, bool inverted)
{
QVariantMap data;
data.insert("inputThingId", inputThingId);
data.insert("inputStateTypeId", inputStateTypeId);
data.insert("outputThingId", outputThingId);
data.insert("outputStateTypeId", outputStateTypeId);
data.insert("inverted", inverted);
return m_jsonClient->sendCommand("Integrations.ConnectIO", data, this, "connectIOResponse");
}
@ -746,7 +748,8 @@ void DeviceManager::getIOConnectionsResponse(const QVariantMap &params)
QUuid inputStateTypeId = connectionMap.value("inputStateTypeId").toUuid();
QUuid outputThingId = connectionMap.value("outputThingId").toUuid();
QUuid outputStateTypeId = connectionMap.value("outputStateTypeId").toUuid();
IOConnection *ioConnection = new IOConnection(id, inputThingId, inputStateTypeId, outputThingId, outputStateTypeId);
bool inverted = connectionMap.value("inverted").toBool();
IOConnection *ioConnection = new IOConnection(id, inputThingId, inputStateTypeId, outputThingId, outputStateTypeId, inverted);
m_ioConnections->addIOConnection(ioConnection);
}
}

View File

@ -103,7 +103,7 @@ public:
Q_INVOKABLE int executeBrowserItem(const QUuid &deviceId, const QString &itemId);
Q_INVOKABLE int executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantList &params = QVariantList());
Q_INVOKABLE int connectIO(const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId);
Q_INVOKABLE int connectIO(const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, bool inverted);
Q_INVOKABLE int disconnectIO(const QUuid &ioConnectionId);
private:

View File

@ -30,13 +30,14 @@
#include "ioconnection.h"
IOConnection::IOConnection(const QUuid &id, const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, QObject *parent):
IOConnection::IOConnection(const QUuid &id, const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, bool inverted, QObject *parent):
QObject(parent),
m_id(id),
m_inputThingId(inputThingId),
m_inputStateTypeId(inputStateTypeId),
m_outputThingId(outputThingId),
m_outputStateTypeId(outputStateTypeId)
m_outputStateTypeId(outputStateTypeId),
m_inverted(inverted)
{
}
@ -65,3 +66,8 @@ QUuid IOConnection::outputStateTypeId() const
{
return m_outputStateTypeId;
}
bool IOConnection::inverted() const
{
return m_inverted;
}

View File

@ -42,15 +42,17 @@ class IOConnection : public QObject
Q_PROPERTY(QUuid inputStateTypeId READ inputStateTypeId CONSTANT)
Q_PROPERTY(QUuid outputThingId READ outputThingId CONSTANT)
Q_PROPERTY(QUuid outputStateTypeId READ outputStateTypeId CONSTANT)
Q_PROPERTY(bool inverted READ inverted CONSTANT)
public:
explicit IOConnection(const QUuid &id, const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, QObject *parent = nullptr);
explicit IOConnection(const QUuid &id, const QUuid &inputThingId, const QUuid &inputStateTypeId, const QUuid &outputThingId, const QUuid &outputStateTypeId, bool inverted, QObject *parent = nullptr);
QUuid id() const;
QUuid inputThingId() const;
QUuid inputStateTypeId() const;
QUuid outputThingId() const;
QUuid outputStateTypeId() const;
bool inverted() const;
private:
QUuid m_id;
@ -58,6 +60,7 @@ private:
QUuid m_inputStateTypeId;
QUuid m_outputThingId;
QUuid m_outputStateTypeId;
bool m_inverted = false;
};
#endif // IOCONNECTION_H

View File

@ -52,6 +52,8 @@ QVariant IOConnections::data(const QModelIndex &index, int role) const
return m_list.at(index.row())->outputThingId();
case RoleOutputStateTypeId:
return m_list.at(index.row())->outputStateTypeId();
case RoleInverted:
return m_list.at(index.row())->inverted();
}
return QVariant();
}
@ -63,6 +65,7 @@ QHash<int, QByteArray> IOConnections::roleNames() const
roles.insert(RoleInputStateTypeId, "inputStateTypeId");
roles.insert(RoleOutputThingId, "outputThingId");
roles.insert(RoleOutputStateTypeId, "outputStateTypeId");
roles.insert(RoleInverted, "inverted");
return roles;
}

View File

@ -44,7 +44,8 @@ public:
RoleInputThingId,
RoleInputStateTypeId,
RoleOutputThingId,
RoleOutputStateTypeId
RoleOutputStateTypeId,
RoleInverted
};
Q_ENUM(Roles)

View File

@ -130,7 +130,7 @@ SettingsPageBase {
RowLayout {
Layout.leftMargin: app.margins; Layout.rightMargin: app.margins
Label {
text: qsTr("Type")
text: qsTr("Type:")
Layout.fillWidth: true
}
Label {
@ -322,14 +322,15 @@ SettingsPageBase {
id: ioConnectionsDialogComponent
MeaDialog {
id: ioConnectionDialog
standardButtons: Dialog.Ok | Dialog.Cancel | Dialog.Reset
standardButtons: Dialog.NoButton
title: qsTr("Connect Inputs/Outputs")
property StateType ioStateType: null
property IOInputConnectionWatcher inputWatcher: null
property IOOutputConnectionWatcher outputWatcher: null
readonly property bool isInput: ioConnectionDialog.ioStateType.ioType == Types.IOTypeDigitalInput || ioConnectionDialog.ioStateType.ioType == Types.IOTypeAnalogInput
Label {
Layout.fillWidth: true
text: qsTr("Connect \"%1\" to:").arg(ioConnectionDialog.ioStateType.displayName)
@ -409,39 +410,74 @@ SettingsPageBase {
}
}
}
}
onAccepted: {
var inputThingId;
var inputStateTypeId;
var outputThingId;
var outputStateTypeId;
if (ioConnectionDialog.ioStateType.ioType == Types.IOTypeDigitalInput
|| ioConnectionDialog.ioStateType.ioType == Types.IOTypeAnalogInput) {
inputThingId = root.device.id;
inputStateTypeId = ioConnectionDialog.ioStateType.id;
outputThingId = connectableIODevices.get(ioThingComboBox.currentIndex).id;
outputStateTypeId = connectableStateTypes.get(ioStateComboBox.currentIndex).id;
} else {
inputThingId = connectableIODevices.get(ioThingComboBox.currentIndex).id;
inputStateTypeId = connectableStateTypes.get(ioStateComboBox.currentIndex).id;
outputThingId = root.device.id;
outputStateTypeId = ioConnectionDialog.ioStateType.id;
Label {
text: qsTr("Inverted")
Layout.fillWidth: true
}
print("connecting", inputThingId, inputStateTypeId, outputThingId, outputStateTypeId)
engine.deviceManager.connectIO(inputThingId, inputStateTypeId, outputThingId, outputStateTypeId);
CheckBox {
id: invertCheckBox
checked: ioConnectionDialog.isInput ? ioConnectionDialog.inputWatcher.ioConnection.inverted : ioConnectionDialog.outputWatcher.ioConnection.inverted
}
}
onReset: {
if (ioConnectionDialog.ioStateType.ioType == Types.IOTypeDigitalInput
|| ioConnectionDialog.ioStateType.ioType == Types.IOTypeAnalogInput) {
engine.deviceManager.disconnectIO(ioConnectionDialog.inputWatcher.ioConnection.id);
} else {
engine.deviceManager.disconnectIO(ioConnectionDialog.outputWatcher.ioConnection.id);
RowLayout {
Item {
Layout.fillWidth: true
}
ioConnectionDialog.reject();
Button {
text: qsTr("Cancel")
onClicked: ioConnectionDialog.reject();
}
Button {
text: qsTr("Disconnect")
enabled: ioConnectionDialog.isInput ? ioConnectionDialog.inputWatcher.ioConnection != null : ioConnectionDialog.outputWatcher.ioConnection != null
onClicked: {
if (ioConnectionDialog.ioStateType.ioType == Types.IOTypeDigitalInput
|| ioConnectionDialog.ioStateType.ioType == Types.IOTypeAnalogInput) {
engine.deviceManager.disconnectIO(ioConnectionDialog.inputWatcher.ioConnection.id);
} else {
engine.deviceManager.disconnectIO(ioConnectionDialog.outputWatcher.ioConnection.id);
}
ioConnectionDialog.reject();
}
}
Button {
text: qsTr("Connect")
enabled: ioThingComboBox.currentIndex >= 0 && ioStateComboBox.currentIndex >= 0
onClicked: {
var inputThingId;
var inputStateTypeId;
var outputThingId;
var outputStateTypeId;
if (ioConnectionDialog.ioStateType.ioType == Types.IOTypeDigitalInput
|| ioConnectionDialog.ioStateType.ioType == Types.IOTypeAnalogInput) {
inputThingId = root.device.id;
inputStateTypeId = ioConnectionDialog.ioStateType.id;
outputThingId = connectableIODevices.get(ioThingComboBox.currentIndex).id;
outputStateTypeId = connectableStateTypes.get(ioStateComboBox.currentIndex).id;
} else {
inputThingId = connectableIODevices.get(ioThingComboBox.currentIndex).id;
inputStateTypeId = connectableStateTypes.get(ioStateComboBox.currentIndex).id;
outputThingId = root.device.id;
outputStateTypeId = ioConnectionDialog.ioStateType.id;
}
var inverted = invertCheckBox.checked
print("connecting", inputThingId, inputStateTypeId, outputThingId, outputStateTypeId, inverted)
engine.deviceManager.connectIO(inputThingId, inputStateTypeId, outputThingId, outputStateTypeId, inverted);
ioConnectionDialog.accept();
}
}
}
}
}
}