Merge PR #256: Complete support for reconfiguring devices

This commit is contained in:
Jenkins nymea 2019-11-30 18:22:09 +01:00
commit 7ca34602af
3 changed files with 81 additions and 43 deletions

View File

@ -308,6 +308,7 @@ void DeviceManager::removeDeviceResponse(const QVariantMap &params)
void DeviceManager::pairDeviceResponse(const QVariantMap &params)
{
qDebug() << "Pair device response:" << params;
emit pairDeviceReply(params.value("params").toMap());
}
@ -369,23 +370,40 @@ void DeviceManager::addDiscoveredDevice(const QUuid &deviceClassId, const QUuid
m_jsonClient->sendCommand("Devices.AddConfiguredDevice", params, this, "addDeviceResponse");
}
void DeviceManager::pairDevice(const QUuid &deviceClassId, const QUuid &deviceDescriptorId, const QString &name)
void DeviceManager::pairDiscoveredDevice(const QUuid &deviceClassId, const QUuid &deviceDescriptorId, const QVariantList &deviceParams, const QString &name)
{
qDebug() << "JsonRpc: pair device " << deviceClassId.toString();
qDebug() << "JsonRpc: pair discovered device " << deviceDescriptorId.toString();
QVariantMap params;
params.insert("name", name);
params.insert("deviceClassId", deviceClassId.toString());
params.insert("deviceDescriptorId", deviceDescriptorId.toString());
params.insert("deviceParams", deviceParams);
params.insert("name", name);
if (!m_jsonClient->ensureServerVersion("3.2")) {
params.insert("deviceClassId", deviceClassId);
}
m_jsonClient->sendCommand("Devices.PairDevice", params, this, "pairDeviceResponse");
}
void DeviceManager::pairDevice(const QUuid &deviceClassId, const QString &name, const QVariantList &deviceParams)
void DeviceManager::pairDevice(const QUuid &deviceClassId, const QVariantList &deviceParams, const QString &name)
{
qDebug() << "JsonRpc: pair device " << deviceClassId.toString();
QVariantMap params;
params.insert("name", name);
params.insert("deviceClassId", deviceClassId.toString());
params.insert("deviceParams", deviceParams);
params.insert("name", name);
m_jsonClient->sendCommand("Devices.PairDevice", params, this, "pairDeviceResponse");
}
void DeviceManager::rePairDevice(const QUuid &deviceId, const QVariantList &deviceParams, const QString &name)
{
qDebug() << "JsonRpc: pair device (reconfigure)" << deviceId;
QVariantMap params;
params.insert("deviceId", deviceId.toString());
params.insert("deviceParams", deviceParams);
if (!name.isEmpty()) {
params.insert("name", name);
}
m_jsonClient->sendCommand("Devices.PairDevice", params, this, "pairDeviceResponse");
}

View File

@ -67,9 +67,12 @@ public:
bool fetchingData() const;
Q_INVOKABLE void addDevice(const QUuid &deviceClassId, const QString &name, const QVariantList &deviceParams);
// param deviceClassId is deprecated and should be removed when minimum JSONRPC version is 3.1
Q_INVOKABLE void addDiscoveredDevice(const QUuid &deviceClassId, const QUuid &deviceDescriptorId, const QString &name, const QVariantList &deviceParams);
Q_INVOKABLE void pairDevice(const QUuid &deviceClassId, const QUuid &deviceDescriptorId, const QString &name);
Q_INVOKABLE void pairDevice(const QUuid &deviceClassId, const QString &name, const QVariantList &deviceParams);
Q_INVOKABLE void pairDevice(const QUuid &deviceClassId, const QVariantList &deviceParams, const QString &name);
// param deviceClassId is deprecated and should be removed when minimum JSONRPC version is 3.1
Q_INVOKABLE void pairDiscoveredDevice(const QUuid &deviceClassId, const QUuid &deviceDescriptorId, const QVariantList &deviceParams, const QString &name);
Q_INVOKABLE void rePairDevice(const QUuid &deviceId, const QVariantList &deviceParams, const QString &name = QString());
Q_INVOKABLE void confirmPairing(const QUuid &pairingTransactionId, const QString &secret = QString(), const QString &username = QString());
Q_INVOKABLE void removeDevice(const QUuid &deviceId, RemovePolicy policy = RemovePolicyNone);
Q_INVOKABLE void editDevice(const QUuid &deviceId, const QString &name);

View File

@ -18,7 +18,7 @@ Page {
signal done();
header: NymeaHeader {
text: qsTr("Set up thing")
text: root.device ? qsTr("Reconfigure %1").arg(root.device.name) : qsTr("Set up %1").arg(root.deviceClass.displayName)
onBackPressed: {
if (internalPageStack.depth > 1) {
internalPageStack.pop();
@ -45,15 +45,54 @@ Page {
}
Component.onCompleted: {
print("Starting setup wizard")
if (root.deviceClass.createMethods.indexOf("CreateMethodDiscovery") !== -1) {
print("CreateMethodDiscovery")
if (deviceClass["discoveryParamTypes"].count > 0) {
print("Discovery params:", deviceClass.discoveryParamTypes.count)
internalPageStack.push(discoveryParamsPage)
} else {
print("Starting discovery...")
discovery.discoverDevices(deviceClass.id)
internalPageStack.push(discoveryPage, {deviceClass: deviceClass})
}
} else if (deviceClass.createMethods.indexOf("CreateMethodUser") !== -1) {
internalPageStack.push(paramsPage)
} else if (root.deviceClass.createMethods.indexOf("CreateMethodUser") !== -1) {
print("CreateMethodUser")
// Setting up a new device
if (!root.device) {
print("New device. Opening params page")
internalPageStack.push(paramsPage)
// Reconfigure
} else if (root.device) {
print("Existing device")
// There are params. Open params page in any case
if (root.deviceClass.paramTypes.count > 0) {
print("Params:", root.deviceClass.paramTypes.count)
internalPageStack.push(paramsPage)
// No params... go straight to reconfigure/repair
} else {
print("no params")
switch (root.deviceClass.setupMethod) {
case 0:
print("reconfiguring...")
// This totally does not make sense... Maybe we should hide the reconfigure button if there are no params?
engine.deviceManager.reconfigureDevice(root.device.id, [])
busyOverlay.shown = true;
break;
case 1:
case 2:
case 3:
case 4:
print("re-pairing", root.device.id)
engine.deviceManager.rePairDevice(root.device.id, []);
break;
default:
console.warn("Unahndled setup method!")
}
}
}
}
}
@ -181,6 +220,7 @@ Page {
ColumnLayout {
anchors.fill: parent
anchors.bottomMargin: app.margins
ListView {
Layout.fillWidth: true
@ -202,28 +242,6 @@ Page {
onClicked: {
d.deviceDescriptor = discoveryProxy.get(index);
d.deviceName = model.name;
// Overriding params for reconfiguring discovered devices not supported by core yet
// So if we are reconfiguring and discovering, go straight to end
if (root.device && d.deviceDescriptor) {
busyOverlay.shown = true;
switch (root.deviceClass.setupMethod) {
case 0:
engine.deviceManager.reconfigureDiscoveredDevice(root.device.id, d.deviceDescriptor.id);
break;
case 1:
case 2:
case 3:
engine.deviceManager.pairDevice(root.deviceClass.id, d.deviceDescriptor.id, root.device.name);
break;
}
return;
}
internalPageStack.push(paramsPage)
}
}
@ -240,7 +258,7 @@ Page {
Button {
id: manualAddButton
Layout.fillWidth: true
Layout.leftMargin: app.margins; Layout.rightMargin: app.margins; Layout.bottomMargin: app.margins
Layout.leftMargin: app.margins; Layout.rightMargin: app.margins;
visible: root.deviceClass.createMethods.indexOf("CreateMethodUser") >= 0
text: qsTr("Add thing manually")
onClicked: internalPageStack.push(paramsPage)
@ -304,7 +322,7 @@ Page {
width: parent.width
ColumnLayout {
visible: root.device === null
// visible: root.device === null
Label {
Layout.leftMargin: app.margins
Layout.rightMargin: app.margins
@ -378,18 +396,17 @@ Page {
case 4:
case 5:
if (root.device) {
// if (d.deviceDescriptor) {
// engine.deviceManager.pairDevice(root.deviceClass.id, d.deviceDescriptor.id, nameTextField.text);
// } else {
// engine.deviceManager.pairDevice(root.deviceClass.id, nameTextField.text, params);
// }
console.warn("Unhandled setupMethod!")
if (d.deviceDescriptor) {
engine.deviceManager.pairDiscoveredDevice(root.deviceClass.id, d.deviceDescriptor.id, params, nameTextField.text);
} else {
engine.deviceManager.rePairDevice(root.device.id, params, nameTextField.text);
}
return;
} else {
if (d.deviceDescriptor) {
engine.deviceManager.pairDevice(root.deviceClass.id, d.deviceDescriptor.id, nameTextField.text);
engine.deviceManager.pairDevice(d.deviceDescriptor.id, params, nameTextField.text);
} else {
engine.deviceManager.pairDevice(root.deviceClass.id, nameTextField.text, params);
engine.deviceManager.pairDevice(root.deviceClass.id, params, nameTextField.text);
}
}