From fb27b0fa57e8d68824398d043600fb6f97a53a16 Mon Sep 17 00:00:00 2001 From: luocai Date: Wed, 4 Dec 2024 15:23:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=90=91=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E9=98=B2=E5=A4=B9=E7=81=B5=E6=95=8F=E5=BA=A6?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=8C=E6=81=A2=E5=A4=8D=E5=87=BA=E5=8E=82?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E8=AF=B7=E6=B1=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Application.cpp | 36 ++++++++++++++++++++-- Application.h | 8 ++++- DeviceConnection.cpp | 34 +++++++++++++++++++-- DeviceConnection.h | 6 ++-- qml/DeviceView.qml | 23 +++++++++++--- qml/Main.qml | 23 ++++++++++++-- qml/MessageDialog.qml | 71 +++++++++++++++++++++++++++++++------------ 7 files changed, 165 insertions(+), 36 deletions(-) diff --git a/Application.cpp b/Application.cpp index 2f89a35..5747c09 100644 --- a/Application.cpp +++ b/Application.cpp @@ -127,7 +127,24 @@ void Application::setCurrentAntiClipAreaEnabled(bool enabled) { emit currentAntiClipAreaEnabledChanged(); if (!m_device.expired()) { auto device = m_device.lock(); - device->updateAntiClipAreaPoints(m_currentAntiClipAreaEnabled, m_currentAntiClipAreaPoints); + device->updateAntiClipAreaPoints(m_currentAntiClipAreaEnabled, m_currentAntiClipAreaPoints, + m_currentAntiClipSensitivity); + } + } +} + +int Application::currentAntiClipSensitivity() const { + return m_currentAntiClipSensitivity; +} + +void Application::setCurrentAntiClipSensitivity(int sensitivity) { + if (m_currentAntiClipSensitivity != sensitivity) { + m_currentAntiClipSensitivity = sensitivity; + emit currentAntiClipSensitivityChanged(); + if (!m_device.expired()) { + auto device = m_device.lock(); + device->updateAntiClipAreaPoints(m_currentAntiClipAreaEnabled, m_currentAntiClipAreaPoints, + m_currentAntiClipSensitivity); } } } @@ -153,7 +170,7 @@ void Application::updateOpenDoorAreaPoints(const QList &points) { void Application::updateAntiClipAreaPoints(const QList &points) { if (!m_device.expired()) { auto device = m_device.lock(); - device->updateAntiClipAreaPoints(m_currentAntiClipAreaEnabled, points); + device->updateAntiClipAreaPoints(m_currentAntiClipAreaEnabled, points, m_currentAntiClipSensitivity); } } @@ -260,6 +277,7 @@ void Application::connectToDevice(int index) { m_currentShieldedAreaPoints = info.shieldedArea; m_currentAntiClipAreaEnabled = info.antiClipAreaEnabled; m_currentAntiClipAreaPoints = info.antiClipArea; + m_currentAntiClipSensitivity = info.antiClipSensitivity; m_currentNetworkInfomation = device->networkInfomation(); m_currentFirmware = device->infomation().firmwareVersion; m_currentDeviceConnected = device->isConnected(); @@ -273,6 +291,7 @@ void Application::connectToDevice(int index) { emit currentOpenDoorAreaWayChanged(); emit currentShieldedAreaEnabledChanged(); emit currentAntiClipAreaEnabledChanged(); + emit currentAntiClipSensitivityChanged(); emit currentNetworkInfomationChanged(); } emit currentFirmwareChanged(); @@ -306,6 +325,16 @@ void Application::upgradeDevice(const QString &file) { } } +void Application::resetDevice() { + if (m_device.expired()) return; + auto device = m_device.lock(); + if (device->isConnected()) { + device->requestReset(); + } else { + emit newMessage(2, "恢复出厂设置", "设备已离线,请重新连接设备!"); + } +} + void Application::onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QList &points) { setCurrentOpenDoorAreaWay(way); setCurrentOpenDoorAreaPoints(points); @@ -323,9 +352,10 @@ void Application::onDeviceShieldedArea(bool enabled, const QList &point setCurrentShieldedAreaPoints(points); } -void Application::onDeviceAntiClipArea(bool enabled, const QList &points) { +void Application::onDeviceAntiClipArea(bool enabled, const QList &points, int sensitivity) { setCurrentAntiClipAreaEnabled(enabled); setCurrentAntiClipAreaPoints(points); + setCurrentAntiClipSensitivity(sensitivity); } void Application::onDeviceNetworkInfomation(const NetworkInfomation &info) { diff --git a/Application.h b/Application.h index 0a5061c..0b8cf0d 100644 --- a/Application.h +++ b/Application.h @@ -34,6 +34,7 @@ class Application : public QObject { setCurrentShieldedAreaPoints NOTIFY currentShieldedAreaPointsChanged) Q_PROPERTY(bool currentAntiClipAreaEnabled READ currentAntiClipAreaEnabled WRITE setCurrentAntiClipAreaEnabled NOTIFY currentAntiClipAreaEnabledChanged) + Q_PROPERTY(int currentAntiClipSensitivity READ currentAntiClipSensitivity WRITE setCurrentAntiClipSensitivity NOTIFY currentAntiClipSensitivityChanged) Q_PROPERTY(QList currentAntiClipAreaPoints READ currentAntiClipAreaPoints WRITE setCurrentAntiClipAreaPoints NOTIFY currentAntiClipAreaPointsChanged) Q_PROPERTY( @@ -65,6 +66,8 @@ public: bool currentAntiClipAreaEnabled() const; void setCurrentAntiClipAreaEnabled(bool enabled); + int currentAntiClipSensitivity() const; + void setCurrentAntiClipSensitivity(int sensitivity); QList currentAntiClipAreaPoints() const; void setCurrentAntiClipAreaPoints(const QList &points); @@ -81,6 +84,7 @@ public: const QString &gateway, const QString &dns); Q_INVOKABLE void connectToDevice(int index); Q_INVOKABLE void upgradeDevice(const QString &file); + Q_INVOKABLE void resetDevice(); Q_INVOKABLE void startSearchDevice(); int exec(); @@ -94,6 +98,7 @@ signals: void currentOpenDoorAreaWayChanged(); void currentShieldedAreaEnabledChanged(); void currentAntiClipAreaEnabledChanged(); + void currentAntiClipSensitivityChanged(); void currentNetworkInfomationChanged(); void currentFirmwareChanged(); void currentDeviceConnectedChanged(); @@ -108,7 +113,7 @@ protected: void onDeviceFlipChanged(bool flip); void onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QList &points); void onDeviceShieldedArea(bool enabled, const QList &points); - void onDeviceAntiClipArea(bool enabled, const QList &points); + void onDeviceAntiClipArea(bool enabled, const QList &points, int sensitivity); void onDeviceNetworkInfomation(const NetworkInfomation &info); void onDeviceFirmware(const QString &firmware); void onDeviceConnected(); @@ -128,6 +133,7 @@ private: bool m_currentShieldedAreaEnabled = false; QList m_currentShieldedAreaPoints; bool m_currentAntiClipAreaEnabled = false; + int m_currentAntiClipSensitivity = 1; QList m_currentAntiClipAreaPoints; NetworkInfomation m_currentNetworkInfomation; QString m_currentFirmware; diff --git a/DeviceConnection.cpp b/DeviceConnection.cpp index d4fa8a4..7ea3379 100644 --- a/DeviceConnection.cpp +++ b/DeviceConnection.cpp @@ -210,15 +210,16 @@ void DeviceConnection::requestAntiClipArea() { m_requests.push(task); } -void DeviceConnection::updateAntiClipAreaPoints(bool enabled, const QList &points) { +void DeviceConnection::updateAntiClipAreaPoints(bool enabled, const QList &points, int sensitivity) { Task task; task.command = "a03opendoor5_setdata"; - task.task = [this, enabled, points]() { + task.task = [this, enabled, points, sensitivity]() { boost::json::object request; request["func"] = "a03opendoor5_setdata"; request["deviceid"] = "0"; boost::json::object data; data["value"] = enabled ? "1" : "0"; + data["sensitivity"] = std::to_string(sensitivity); boost::json::array pointArray; for (auto &p : points) { boost::json::object point; @@ -433,6 +434,28 @@ void DeviceConnection::requestOta(const QString &firmware, const QString &file) m_requests.push(task); } +void DeviceConnection::requestReset() { + Task task; + task.command = "a12factory_setdata"; + task.task = [this]() { + boost::json::object request; + request["func"] = "a12factory_setdata"; + request["deviceid"] = "0"; + boost::json::object data; + data["value"] = "1"; + + request["data"] = std::move(data); + auto text = boost::json::serialize(request); + m_commandSocket->write(text.data(), text.size()); + }; + task.future = std::make_shared>(); + if (m_requests.empty()) { + task.task(); + } + auto ret = task.future->future(); + m_requests.push(task); +} + void DeviceConnection::transferBinContent() { constexpr int SliceSize = 1024; constexpr int WaitMd5CheckTime = 3000; // ms @@ -545,7 +568,10 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const } m_infomation.antiClipAreaEnabled = value == "1"; m_infomation.antiClipArea = points; - emit antiClipAreaChanged(value == "1", points); + if (data.contains("sensitivity")) { + m_infomation.antiClipSensitivity = std::stoi(static_cast(data.at("sensitivity").as_string())); + } + emit antiClipAreaChanged(value == "1", points, m_infomation.antiClipSensitivity); } else if (function == "netconfig_getdata") { auto &data = reply.at("data").as_object(); m_networkInfomation.dhcp = data.at("type").as_string() == "dhcp"; @@ -669,6 +695,8 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const } } requestVideoInformation(); + } else if (function == "a12factory_setdata") { + LOG(info) << "device factory reset"; } else { LOG(warning) << "unknown reply: " << replyText; } diff --git a/DeviceConnection.h b/DeviceConnection.h index 2d6c80e..9cbc028 100644 --- a/DeviceConnection.h +++ b/DeviceConnection.h @@ -47,6 +47,7 @@ public: QList antiClipArea; bool antiClipAreaEnabled; + int antiClipSensitivity = 1; }; Q_ENUM(AreaWay) @@ -67,7 +68,7 @@ public: void requestShieldedArea(); void updateShieldedAreaPoints(bool enabled, const QList &points); void requestAntiClipArea(); - void updateAntiClipAreaPoints(bool enabled, const QList &points); + void updateAntiClipAreaPoints(bool enabled, const QList &points, int sensitivity); void requestResolution(Resolution resolution); void requestNetworkInfomation(); QFuture updateNetworkInfomation(bool dhcp, const QString &ip, const QString &netmask, const QString &gateway, @@ -87,13 +88,14 @@ public: * @param file */ void requestOta(const QString &firmware, const QString &file); + void requestReset(); signals: void connected(); void disconnected(); void openDoorAreaChanged(AreaWay way, const QList &points); void shieldedAreaChanged(bool enabled, const QList &points); - void antiClipAreaChanged(bool enabled, const QList &points); + void antiClipAreaChanged(bool enabled, const QList &points, int sensitivity); void rotationChanged(int rotation); void flipChanged(bool flip); void networkInfomationChanged(const NetworkInfomation &info); diff --git a/qml/DeviceView.qml b/qml/DeviceView.qml index f5670e3..9e785d5 100644 --- a/qml/DeviceView.qml +++ b/qml/DeviceView.qml @@ -16,6 +16,7 @@ Item { property color antiClipAreaColor: "blue" property var antiClipAreaPoints: [] property bool antiClipAreaEnabled: false + property int antiClipSensitivity: 1 property alias flip: flipSwitch.checked property alias videoRotation: rotateComboBox.currentIndex @@ -241,19 +242,18 @@ Item { } } } - Grid { + GridLayout { id: controlBar anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - columns: 2 - spacing: 10 - verticalItemAlignment: Qt.AlignVCenter + columns: 4 Label { text: qsTr("图像: ") } Row { enabled: root.enabled + Layout.columnSpan: 3 Label { anchors.verticalCenter: parent.verticalCenter text: qsTr("旋转") @@ -283,6 +283,7 @@ Item { } Row { enabled: root.enabled + Layout.columnSpan: 3 RadioButton { text: "关闭" checked: App.currentOpenDoorAreaWay ==DeviceConnection.Diabled @@ -310,6 +311,7 @@ Item { Label {text: qsTr("防夹区域: ")} Row { enabled: root.enabled + Layout.columnSpan: 1 RadioButton { text: "关闭" checked: !App.currentAntiClipAreaEnabled @@ -327,6 +329,19 @@ Item { } } + Label { text: qsTr("灵敏度: ") + Layout.alignment: Qt.AlignRight + } + ComboBox { + id: antiClipSensitivityComboBox + enabled: root.enabled + Layout.alignment: Qt.AlignLeft + model: [1,2,3,4,5] + currentIndex: root.antiClipSensitivity-1 + onCurrentIndexChanged: { + App.currentAntiClipSensitivity = antiClipSensitivityComboBox.currentIndex+1 + } + } Label {text: qsTr("屏蔽区域: ")} Row { diff --git a/qml/Main.qml b/qml/Main.qml index fc63aee..aae2e76 100644 --- a/qml/Main.qml +++ b/qml/Main.qml @@ -118,6 +118,7 @@ ApplicationWindow { shieldedAreaEnabled: App.currentShieldedAreaEnabled shieldedAreaPoints: App.currentShieldedAreaPoints antiClipAreaEnabled: App.currentAntiClipAreaEnabled + antiClipSensitivity: App.currentAntiClipSensitivity antiClipAreaPoints: App.currentAntiClipAreaPoints flip: App.currentDeviceFlip videoRotation: App.currentDeviceRotation @@ -163,6 +164,7 @@ ApplicationWindow { } Item {} Button { + Layout.alignment: Qt.AlignRight text: "升级" onClicked: { if (deviceList.currentIndex < 0) { @@ -175,17 +177,32 @@ ApplicationWindow { otaPopup.open() } } - Item {} + Button { + Layout.alignment: Qt.AlignRight + Layout.rightMargin: 5 + text: "重置" + onClicked: { + if (deviceList.currentIndex < 0) { + showMessageDialog(2, "恢复出厂设置", "请先选择设备") + return + } else { + showMessageDialog(2, "恢复出厂设置", "设备将会重启,重启后配置恢复默认",()=>{ + App.resetDevice(); + }) + } + } + } spacing: (parent.width - (2 * 100)) / 3 } - function showMessageDialog(type, title, message) { + function showMessageDialog(type, title, message, callback) { let component = Qt.createComponent("MessageDialog.qml") if (component.status === Component.Ready) { let dialog = component.createObject(window, { "type": type, "titleText": title, - "text": message + "text": message, + "callback": callback }) dialog.open() } diff --git a/qml/MessageDialog.qml b/qml/MessageDialog.qml index d86203b..16d1d7e 100644 --- a/qml/MessageDialog.qml +++ b/qml/MessageDialog.qml @@ -13,6 +13,7 @@ Dialog { property alias text: textLabel.text property alias textFontSize: textLabel.font.pixelSize property int type: MessageDialog.Type.Successful + property var callback closePolicy: Popup.CloseOnEscap | Popup.NoAutoClose background: Rectangle { radius: 8 @@ -62,30 +63,60 @@ Dialog { wrapMode: Text.WordWrap } - Button { - id: cancelButton + Row { Layout.alignment: Qt.AlignRight Layout.rightMargin: 6 - Layout.preferredWidth: 72 - Layout.preferredHeight: 40 - font.family: control.font.family - text: "关闭" - font.pixelSize: 14 - contentItem: Text { - text: parent.text - font: parent.font - color: parent.down ? "#FFFFFF" : "#53627C" - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + spacing: 10 + Button { + id: okButton + width: 72 + height: 40 + font.family: control.font.family + text: "好的" + font.pixelSize: 14 + contentItem: Text { + text: parent.text + font: parent.font + color: parent.down ? "#FFFFFF" : "#53627C" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + background: Rectangle { + border.color: "#E1E4E8" + border.width: 1 + color: parent.down ? "#F25959" : "#FFFFFF" + radius: 2 + } + onClicked: { + if(callback !== undefined){ + callback() + } + control.accept() + } } - - background: Rectangle { - border.color: "#E1E4E8" - border.width: 1 - color: parent.down ? "#F25959" : "#FFFFFF" - radius: 2 + Button { + id: cancelButton + visible: callback !== undefined + width: 72 + height: 40 + font.family: control.font.family + text: "取消" + font.pixelSize: 14 + contentItem: Text { + text: parent.text + font: parent.font + color: parent.down ? "#FFFFFF" : "#53627C" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + background: Rectangle { + border.color: "#E1E4E8" + border.width: 1 + color: parent.down ? "#F25959" : "#FFFFFF" + radius: 2 + } + onClicked: control.reject() } - onClicked: control.reject() } } onTypeChanged: {