7 Commits
v1.5 ... v1.7

Author SHA1 Message Date
7284f18c43 更新版本。
All checks were successful
Release tag / build (push) Successful in 3m9s
2024-12-04 15:24:37 +08:00
fb27b0fa57 实现向设备发起防夹灵敏度设置,恢复出厂设置请求。 2024-12-04 15:23:42 +08:00
77dd027ff7 将任务定时器和心跳计时器分开。
All checks were successful
Release tag / build (push) Successful in 2m46s
2024-12-03 19:11:30 +08:00
8e0018480b 精简打包。 2024-12-03 18:22:55 +08:00
16757c5f78 修复Windows7打包行为。 2024-12-03 18:13:16 +08:00
ef7aa73c8d 修复早期T009版本不回复不支持的命令,导致上位机不发送后续命令的问题。
All checks were successful
Release tag / build (push) Successful in 3m5s
2024-12-03 17:56:24 +08:00
95b68bc67d config mbedtls. 2024-12-02 23:23:49 +08:00
9 changed files with 234 additions and 68 deletions

View File

@ -127,7 +127,24 @@ void Application::setCurrentAntiClipAreaEnabled(bool enabled) {
emit currentAntiClipAreaEnabledChanged(); emit currentAntiClipAreaEnabledChanged();
if (!m_device.expired()) { if (!m_device.expired()) {
auto device = m_device.lock(); 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<QPointF> &points) {
void Application::updateAntiClipAreaPoints(const QList<QPointF> &points) { void Application::updateAntiClipAreaPoints(const QList<QPointF> &points) {
if (!m_device.expired()) { if (!m_device.expired()) {
auto device = m_device.lock(); 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_currentShieldedAreaPoints = info.shieldedArea;
m_currentAntiClipAreaEnabled = info.antiClipAreaEnabled; m_currentAntiClipAreaEnabled = info.antiClipAreaEnabled;
m_currentAntiClipAreaPoints = info.antiClipArea; m_currentAntiClipAreaPoints = info.antiClipArea;
m_currentAntiClipSensitivity = info.antiClipSensitivity;
m_currentNetworkInfomation = device->networkInfomation(); m_currentNetworkInfomation = device->networkInfomation();
m_currentFirmware = device->infomation().firmwareVersion; m_currentFirmware = device->infomation().firmwareVersion;
m_currentDeviceConnected = device->isConnected(); m_currentDeviceConnected = device->isConnected();
@ -273,6 +291,7 @@ void Application::connectToDevice(int index) {
emit currentOpenDoorAreaWayChanged(); emit currentOpenDoorAreaWayChanged();
emit currentShieldedAreaEnabledChanged(); emit currentShieldedAreaEnabledChanged();
emit currentAntiClipAreaEnabledChanged(); emit currentAntiClipAreaEnabledChanged();
emit currentAntiClipSensitivityChanged();
emit currentNetworkInfomationChanged(); emit currentNetworkInfomationChanged();
} }
emit currentFirmwareChanged(); 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<QPointF> &points) { void Application::onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QList<QPointF> &points) {
setCurrentOpenDoorAreaWay(way); setCurrentOpenDoorAreaWay(way);
setCurrentOpenDoorAreaPoints(points); setCurrentOpenDoorAreaPoints(points);
@ -323,9 +352,10 @@ void Application::onDeviceShieldedArea(bool enabled, const QList<QPointF> &point
setCurrentShieldedAreaPoints(points); setCurrentShieldedAreaPoints(points);
} }
void Application::onDeviceAntiClipArea(bool enabled, const QList<QPointF> &points) { void Application::onDeviceAntiClipArea(bool enabled, const QList<QPointF> &points, int sensitivity) {
setCurrentAntiClipAreaEnabled(enabled); setCurrentAntiClipAreaEnabled(enabled);
setCurrentAntiClipAreaPoints(points); setCurrentAntiClipAreaPoints(points);
setCurrentAntiClipSensitivity(sensitivity);
} }
void Application::onDeviceNetworkInfomation(const NetworkInfomation &info) { void Application::onDeviceNetworkInfomation(const NetworkInfomation &info) {

View File

@ -34,6 +34,7 @@ class Application : public QObject {
setCurrentShieldedAreaPoints NOTIFY currentShieldedAreaPointsChanged) setCurrentShieldedAreaPoints NOTIFY currentShieldedAreaPointsChanged)
Q_PROPERTY(bool currentAntiClipAreaEnabled READ currentAntiClipAreaEnabled WRITE setCurrentAntiClipAreaEnabled Q_PROPERTY(bool currentAntiClipAreaEnabled READ currentAntiClipAreaEnabled WRITE setCurrentAntiClipAreaEnabled
NOTIFY currentAntiClipAreaEnabledChanged) NOTIFY currentAntiClipAreaEnabledChanged)
Q_PROPERTY(int currentAntiClipSensitivity READ currentAntiClipSensitivity WRITE setCurrentAntiClipSensitivity NOTIFY currentAntiClipSensitivityChanged)
Q_PROPERTY(QList<QPointF> currentAntiClipAreaPoints READ currentAntiClipAreaPoints WRITE Q_PROPERTY(QList<QPointF> currentAntiClipAreaPoints READ currentAntiClipAreaPoints WRITE
setCurrentAntiClipAreaPoints NOTIFY currentAntiClipAreaPointsChanged) setCurrentAntiClipAreaPoints NOTIFY currentAntiClipAreaPointsChanged)
Q_PROPERTY( Q_PROPERTY(
@ -65,6 +66,8 @@ public:
bool currentAntiClipAreaEnabled() const; bool currentAntiClipAreaEnabled() const;
void setCurrentAntiClipAreaEnabled(bool enabled); void setCurrentAntiClipAreaEnabled(bool enabled);
int currentAntiClipSensitivity() const;
void setCurrentAntiClipSensitivity(int sensitivity);
QList<QPointF> currentAntiClipAreaPoints() const; QList<QPointF> currentAntiClipAreaPoints() const;
void setCurrentAntiClipAreaPoints(const QList<QPointF> &points); void setCurrentAntiClipAreaPoints(const QList<QPointF> &points);
@ -81,6 +84,7 @@ public:
const QString &gateway, const QString &dns); const QString &gateway, const QString &dns);
Q_INVOKABLE void connectToDevice(int index); Q_INVOKABLE void connectToDevice(int index);
Q_INVOKABLE void upgradeDevice(const QString &file); Q_INVOKABLE void upgradeDevice(const QString &file);
Q_INVOKABLE void resetDevice();
Q_INVOKABLE void startSearchDevice(); Q_INVOKABLE void startSearchDevice();
int exec(); int exec();
@ -94,6 +98,7 @@ signals:
void currentOpenDoorAreaWayChanged(); void currentOpenDoorAreaWayChanged();
void currentShieldedAreaEnabledChanged(); void currentShieldedAreaEnabledChanged();
void currentAntiClipAreaEnabledChanged(); void currentAntiClipAreaEnabledChanged();
void currentAntiClipSensitivityChanged();
void currentNetworkInfomationChanged(); void currentNetworkInfomationChanged();
void currentFirmwareChanged(); void currentFirmwareChanged();
void currentDeviceConnectedChanged(); void currentDeviceConnectedChanged();
@ -108,7 +113,7 @@ protected:
void onDeviceFlipChanged(bool flip); void onDeviceFlipChanged(bool flip);
void onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QList<QPointF> &points); void onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QList<QPointF> &points);
void onDeviceShieldedArea(bool enabled, const QList<QPointF> &points); void onDeviceShieldedArea(bool enabled, const QList<QPointF> &points);
void onDeviceAntiClipArea(bool enabled, const QList<QPointF> &points); void onDeviceAntiClipArea(bool enabled, const QList<QPointF> &points, int sensitivity);
void onDeviceNetworkInfomation(const NetworkInfomation &info); void onDeviceNetworkInfomation(const NetworkInfomation &info);
void onDeviceFirmware(const QString &firmware); void onDeviceFirmware(const QString &firmware);
void onDeviceConnected(); void onDeviceConnected();
@ -128,6 +133,7 @@ private:
bool m_currentShieldedAreaEnabled = false; bool m_currentShieldedAreaEnabled = false;
QList<QPointF> m_currentShieldedAreaPoints; QList<QPointF> m_currentShieldedAreaPoints;
bool m_currentAntiClipAreaEnabled = false; bool m_currentAntiClipAreaEnabled = false;
int m_currentAntiClipSensitivity = 1;
QList<QPointF> m_currentAntiClipAreaPoints; QList<QPointF> m_currentAntiClipAreaPoints;
NetworkInfomation m_currentNetworkInfomation; NetworkInfomation m_currentNetworkInfomation;
QString m_currentFirmware; QString m_currentFirmware;

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
project(AntiClipSettings VERSION 1.5 LANGUAGES C CXX) project(AntiClipSettings VERSION 1.7 LANGUAGES C CXX)
set(APPLICATION_NAME "视觉防夹设备上位机工具") set(APPLICATION_NAME "视觉防夹设备上位机工具")
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@ -46,8 +46,7 @@ else()
set(MBEDTLS_ROOT ${Libraries_ROOT}/mbedtls-3.6.2_msvc2022_64bit_release) set(MBEDTLS_ROOT ${Libraries_ROOT}/mbedtls-3.6.2_msvc2022_64bit_release)
endif() endif()
set(MBEDTLS_INCLUDE_DIR ${MBEDTLS_ROOT}/include) set(MbedTLS_DIR ${MBEDTLS_ROOT}/lib/cmake/MbedTLS)
set(MBEDTLS_LIBRARY_DIRS ${MBEDTLS_ROOT}/lib)
set(JPEGTURBO_INCLUDE_DIR ${JPEGTURBO_ROOT}/include) set(JPEGTURBO_INCLUDE_DIR ${JPEGTURBO_ROOT}/include)
set(JPEGTURBO_LIB_DIR ${JPEGTURBO_ROOT}/lib) set(JPEGTURBO_LIB_DIR ${JPEGTURBO_ROOT}/lib)

View File

@ -4,6 +4,7 @@
#include <QFileInfo> #include <QFileInfo>
#include <QPointF> #include <QPointF>
#include <QTimer> #include <QTimer>
#include <QTimerEvent>
#include <WinSock2.h> #include <WinSock2.h>
#include <boost/json/object.hpp> #include <boost/json/object.hpp>
#include <boost/json/parse.hpp> #include <boost/json/parse.hpp>
@ -24,9 +25,9 @@ void DeviceConnection::close() {
m_otaTimer->deleteLater(); m_otaTimer->deleteLater();
m_otaTimer = nullptr; m_otaTimer = nullptr;
} }
if (m_timerId > 0) { if (m_heartbeatTimerId > 0) {
killTimer(m_timerId); killTimer(m_heartbeatTimerId);
m_timerId = -1; m_heartbeatTimerId = -1;
} }
if (m_commandSocket != nullptr) { if (m_commandSocket != nullptr) {
m_commandSocket->deleteLater(); m_commandSocket->deleteLater();
@ -209,15 +210,16 @@ void DeviceConnection::requestAntiClipArea() {
m_requests.push(task); m_requests.push(task);
} }
void DeviceConnection::updateAntiClipAreaPoints(bool enabled, const QList<QPointF> &points) { void DeviceConnection::updateAntiClipAreaPoints(bool enabled, const QList<QPointF> &points, int sensitivity) {
Task task; Task task;
task.command = "a03opendoor5_setdata"; task.command = "a03opendoor5_setdata";
task.task = [this, enabled, points]() { task.task = [this, enabled, points, sensitivity]() {
boost::json::object request; boost::json::object request;
request["func"] = "a03opendoor5_setdata"; request["func"] = "a03opendoor5_setdata";
request["deviceid"] = "0"; request["deviceid"] = "0";
boost::json::object data; boost::json::object data;
data["value"] = enabled ? "1" : "0"; data["value"] = enabled ? "1" : "0";
data["sensitivity"] = std::to_string(sensitivity);
boost::json::array pointArray; boost::json::array pointArray;
for (auto &p : points) { for (auto &p : points) {
boost::json::object point; boost::json::object point;
@ -387,11 +389,11 @@ QFuture<bool> DeviceConnection::updateNetworkInfomation(bool dhcp, const QString
void DeviceConnection::requestOta(const QString &firmware, const QString &file) { void DeviceConnection::requestOta(const QString &firmware, const QString &file) {
m_otaProgress = 0; m_otaProgress = 0;
emit otaProgressChanged(true, m_otaProgress, "正在向设备发起OTA请求......"); emit otaProgressChanged(true, m_otaProgress, "正在向设备发起OTA请求......");
if (m_timerId > 0) { if (m_heartbeatTimerId > 0) {
killTimer(m_timerId); killTimer(m_heartbeatTimerId);
m_timerId = -1; m_heartbeatTimerId = -1;
} }
if (!m_requests.empty()) { while (!m_requests.empty()) { // 清除之前的命令
m_requests.pop(); m_requests.pop();
} }
Task task; Task task;
@ -432,6 +434,28 @@ void DeviceConnection::requestOta(const QString &firmware, const QString &file)
m_requests.push(task); 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<QFutureInterface<bool>>();
if (m_requests.empty()) {
task.task();
}
auto ret = task.future->future();
m_requests.push(task);
}
void DeviceConnection::transferBinContent() { void DeviceConnection::transferBinContent() {
constexpr int SliceSize = 1024; constexpr int SliceSize = 1024;
constexpr int WaitMd5CheckTime = 3000; // ms constexpr int WaitMd5CheckTime = 3000; // ms
@ -480,7 +504,7 @@ void DeviceConnection::transferBinContent() {
m_h264Socket->close(); m_h264Socket->close();
}, },
type); type);
m_otaTimer->start(60 * 1000); m_otaTimer->start(5 * 60 * 1000); // 固件升级五分钟正常升级2.5分钟左右(包含算法模型)
} }
} }
@ -544,7 +568,10 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
} }
m_infomation.antiClipAreaEnabled = value == "1"; m_infomation.antiClipAreaEnabled = value == "1";
m_infomation.antiClipArea = points; m_infomation.antiClipArea = points;
emit antiClipAreaChanged(value == "1", points); if (data.contains("sensitivity")) {
m_infomation.antiClipSensitivity = std::stoi(static_cast<std::string>(data.at("sensitivity").as_string()));
}
emit antiClipAreaChanged(value == "1", points, m_infomation.antiClipSensitivity);
} else if (function == "netconfig_getdata") { } else if (function == "netconfig_getdata") {
auto &data = reply.at("data").as_object(); auto &data = reply.at("data").as_object();
m_networkInfomation.dhcp = data.at("type").as_string() == "dhcp"; m_networkInfomation.dhcp = data.at("type").as_string() == "dhcp";
@ -613,7 +640,7 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
emit otaProgressChanged(true, m_otaProgress, "设备正在升级中,请稍后......"); emit otaProgressChanged(true, m_otaProgress, "设备正在升级中,请稍后......");
} else { } else {
m_otaTimer->stop(); // 这里不需要再超时了 m_otaTimer->stop(); // 这里不需要再超时了
emit otaProgressChanged(true, 100, "设备正在升级中,请于分钟后重新连接wifi搜索设备"); emit otaProgressChanged(true, 100, "设备正在升级中,请于分钟后重新连接wifi搜索设备");
} }
} else { } else {
const char *message = nullptr; const char *message = nullptr;
@ -668,10 +695,12 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
} }
} }
requestVideoInformation(); requestVideoInformation();
} else if (function == "a12factory_setdata") {
LOG(info) << "device factory reset";
} else { } else {
LOG(warning) << "unknown reply: " << replyText; LOG(warning) << "unknown reply: " << replyText;
} }
return QString::fromStdString(std::string(std::move(function))); return QString::fromStdString(std::string(function));
} }
void DeviceConnection::onConnected() { void DeviceConnection::onConnected() {
@ -684,7 +713,7 @@ void DeviceConnection::onConnected() {
requestNetworkInfomation(); requestNetworkInfomation();
requestVideoInformation(); requestVideoInformation();
emit connected(); emit connected();
m_timerId = startTimer(2500); m_heartbeatTimerId = startTimer(2500);
if (m_otaProgress == 99) { if (m_otaProgress == 99) {
m_otaProgress = -1; m_otaProgress = -1;
emit otaProgressChanged(true, 100, "设备升级成功!"); emit otaProgressChanged(true, 100, "设备升级成功!");
@ -692,6 +721,9 @@ void DeviceConnection::onConnected() {
if (m_otaTimer != nullptr) { if (m_otaTimer != nullptr) {
m_otaTimer->stop(); m_otaTimer->stop();
} }
if (m_requestTimerId < 0) {
m_requestTimerId = startTimer(HeartbeatInterval);
}
} else if (socket == m_h264Socket) { } else if (socket == m_h264Socket) {
if (m_videoEnabled) { if (m_videoEnabled) {
setLiveStreamEnabled(true); setLiveStreamEnabled(true);
@ -702,9 +734,13 @@ void DeviceConnection::onConnected() {
void DeviceConnection::onDisconnected() { void DeviceConnection::onDisconnected() {
auto socket = dynamic_cast<QTcpSocket *>(sender()); auto socket = dynamic_cast<QTcpSocket *>(sender());
if (socket == m_commandSocket) { if (socket == m_commandSocket) {
if (m_timerId > 0) { if (m_requestTimerId > 0) {
killTimer(m_timerId); killTimer(m_requestTimerId);
m_timerId = -1; m_requestTimerId = -1;
}
if (m_heartbeatTimerId > 0) {
killTimer(m_heartbeatTimerId);
m_heartbeatTimerId = -1;
} }
emit disconnected(); emit disconnected();
if ((m_otaProgress >= 0) && (m_otaProgress <= 98)) { if ((m_otaProgress >= 0) && (m_otaProgress <= 98)) {
@ -743,7 +779,6 @@ void DeviceConnection::onH264ReadyRead() {
void DeviceConnection::onCommandReadyRead() { void DeviceConnection::onCommandReadyRead() {
auto data = m_commandSocket->readAll(); auto data = m_commandSocket->readAll();
m_commandBuffer.push_back(data); m_commandBuffer.push_back(data);
while (!m_commandBuffer.isEmpty()) { while (!m_commandBuffer.isEmpty()) {
auto packageSize = ntohl(*reinterpret_cast<uint32_t *>(m_commandBuffer.data())); auto packageSize = ntohl(*reinterpret_cast<uint32_t *>(m_commandBuffer.data()));
if (m_commandBuffer.size() < (packageSize + sizeof(uint32_t))) break; if (m_commandBuffer.size() < (packageSize + sizeof(uint32_t))) break;
@ -755,9 +790,13 @@ void DeviceConnection::onCommandReadyRead() {
auto &task = m_requests.front(); auto &task = m_requests.front();
if (task.command == command) { if (task.command == command) {
m_requests.pop(); m_requests.pop();
} else {
LOG(warning) << "current command[" << command.toStdString() << "] is no the task queue's head["
<< task.command.toStdString() << "]";
} }
if (!m_requests.empty()) { if (!m_requests.empty()) {
m_requests.front().task(); auto &command = m_requests.front();
command.task();
} }
} }
} }
@ -769,15 +808,35 @@ void DeviceConnection::onErrorOccurred(QAbstractSocket::SocketError socketError)
} }
void DeviceConnection::timerEvent(QTimerEvent *event) { void DeviceConnection::timerEvent(QTimerEvent *event) {
if (isConnected()) { using namespace std::chrono;
int index = heartbeats % 3; if (event->timerId() == m_heartbeatTimerId) {
if (index == 0) { if (isConnected()) {
requestOpenDoorArea(); int index = heartbeats % 3;
} else if (index == 1) { if (index == 0) {
requestShieldedArea(); requestOpenDoorArea();
} else if (index == 2) { } else if (index == 1) {
requestAntiClipArea(); requestShieldedArea();
} else if (index == 2) {
requestAntiClipArea();
}
heartbeats++;
}
} else if (event->timerId() == m_requestTimerId) {
if (!m_requests.empty()) {
auto &command = m_requests.front();
auto elapsed = duration_cast<milliseconds>(system_clock::now() - command.time);
if (elapsed > (HeartbeatInterval * 2)) {
LOG(info) << "not received command[" << command.command.toStdString() << "] more than "
<< (HeartbeatInterval * 2).count() << " ms, consider it failed, send next command.";
m_requests.pop();
if (!m_requests.empty()) {
m_requests.front().task();
}
} else if (elapsed > HeartbeatInterval) {
LOG(info) << "not received command[" << command.command.toStdString() << "] more than "
<< HeartbeatInterval.count() << " ms, resend it.";
command.task();
}
} }
heartbeats++;
} }
} }

View File

@ -19,6 +19,7 @@ class DeviceConnection : public QObject {
public: public:
constexpr static auto WirelessAddress = "192.168.10.2"; constexpr static auto WirelessAddress = "192.168.10.2";
constexpr static auto HeartbeatInterval = std::chrono::milliseconds(2500);
enum Resolution { enum Resolution {
Video_360P = 0, Video_360P = 0,
Video_720P, Video_720P,
@ -46,6 +47,7 @@ public:
QList<QPointF> antiClipArea; QList<QPointF> antiClipArea;
bool antiClipAreaEnabled; bool antiClipAreaEnabled;
int antiClipSensitivity = 1;
}; };
Q_ENUM(AreaWay) Q_ENUM(AreaWay)
@ -66,7 +68,7 @@ public:
void requestShieldedArea(); void requestShieldedArea();
void updateShieldedAreaPoints(bool enabled, const QList<QPointF> &points); void updateShieldedAreaPoints(bool enabled, const QList<QPointF> &points);
void requestAntiClipArea(); void requestAntiClipArea();
void updateAntiClipAreaPoints(bool enabled, const QList<QPointF> &points); void updateAntiClipAreaPoints(bool enabled, const QList<QPointF> &points, int sensitivity);
void requestResolution(Resolution resolution); void requestResolution(Resolution resolution);
void requestNetworkInfomation(); void requestNetworkInfomation();
QFuture<bool> updateNetworkInfomation(bool dhcp, const QString &ip, const QString &netmask, const QString &gateway, QFuture<bool> updateNetworkInfomation(bool dhcp, const QString &ip, const QString &netmask, const QString &gateway,
@ -86,13 +88,14 @@ public:
* @param file * @param file
*/ */
void requestOta(const QString &firmware, const QString &file); void requestOta(const QString &firmware, const QString &file);
void requestReset();
signals: signals:
void connected(); void connected();
void disconnected(); void disconnected();
void openDoorAreaChanged(AreaWay way, const QList<QPointF> &points); void openDoorAreaChanged(AreaWay way, const QList<QPointF> &points);
void shieldedAreaChanged(bool enabled, const QList<QPointF> &points); void shieldedAreaChanged(bool enabled, const QList<QPointF> &points);
void antiClipAreaChanged(bool enabled, const QList<QPointF> &points); void antiClipAreaChanged(bool enabled, const QList<QPointF> &points, int sensitivity);
void rotationChanged(int rotation); void rotationChanged(int rotation);
void flipChanged(bool flip); void flipChanged(bool flip);
void networkInfomationChanged(const NetworkInfomation &info); void networkInfomationChanged(const NetworkInfomation &info);
@ -103,6 +106,7 @@ protected:
class Task { class Task {
public: public:
QString command; QString command;
std::chrono::system_clock::time_point time = std::chrono::system_clock::now();
std::function<void()> task; std::function<void()> task;
std::shared_ptr<QTimer> timeoutTimer = nullptr; std::shared_ptr<QTimer> timeoutTimer = nullptr;
std::shared_ptr<QFutureInterface<bool>> future; std::shared_ptr<QFutureInterface<bool>> future;
@ -135,7 +139,8 @@ private:
H264FrameCallback m_frameCallback; H264FrameCallback m_frameCallback;
std::queue<Task> m_requests; std::queue<Task> m_requests;
int m_timerId = -1; int m_requestTimerId = -1;
int m_heartbeatTimerId = -1;
int heartbeats = 0; int heartbeats = 0;
NetworkInfomation m_networkInfomation; NetworkInfomation m_networkInfomation;
QString m_firmware; QString m_firmware;

View File

@ -16,6 +16,7 @@ Item {
property color antiClipAreaColor: "blue" property color antiClipAreaColor: "blue"
property var antiClipAreaPoints: [] property var antiClipAreaPoints: []
property bool antiClipAreaEnabled: false property bool antiClipAreaEnabled: false
property int antiClipSensitivity: 1
property alias flip: flipSwitch.checked property alias flip: flipSwitch.checked
property alias videoRotation: rotateComboBox.currentIndex property alias videoRotation: rotateComboBox.currentIndex
@ -241,19 +242,18 @@ Item {
} }
} }
} }
Grid { GridLayout {
id: controlBar id: controlBar
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
columns: 2 columns: 4
spacing: 10
verticalItemAlignment: Qt.AlignVCenter
Label { text: qsTr("图像: ") } Label { text: qsTr("图像: ") }
Row { Row {
enabled: root.enabled enabled: root.enabled
Layout.columnSpan: 3
Label { Label {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
text: qsTr("旋转") text: qsTr("旋转")
@ -283,6 +283,7 @@ Item {
} }
Row { Row {
enabled: root.enabled enabled: root.enabled
Layout.columnSpan: 3
RadioButton { RadioButton {
text: "关闭" text: "关闭"
checked: App.currentOpenDoorAreaWay ==DeviceConnection.Diabled checked: App.currentOpenDoorAreaWay ==DeviceConnection.Diabled
@ -310,6 +311,7 @@ Item {
Label {text: qsTr("防夹区域: ")} Label {text: qsTr("防夹区域: ")}
Row { Row {
enabled: root.enabled enabled: root.enabled
Layout.columnSpan: 1
RadioButton { RadioButton {
text: "关闭" text: "关闭"
checked: !App.currentAntiClipAreaEnabled 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("屏蔽区域: ")} Label {text: qsTr("屏蔽区域: ")}
Row { Row {

View File

@ -118,6 +118,7 @@ ApplicationWindow {
shieldedAreaEnabled: App.currentShieldedAreaEnabled shieldedAreaEnabled: App.currentShieldedAreaEnabled
shieldedAreaPoints: App.currentShieldedAreaPoints shieldedAreaPoints: App.currentShieldedAreaPoints
antiClipAreaEnabled: App.currentAntiClipAreaEnabled antiClipAreaEnabled: App.currentAntiClipAreaEnabled
antiClipSensitivity: App.currentAntiClipSensitivity
antiClipAreaPoints: App.currentAntiClipAreaPoints antiClipAreaPoints: App.currentAntiClipAreaPoints
flip: App.currentDeviceFlip flip: App.currentDeviceFlip
videoRotation: App.currentDeviceRotation videoRotation: App.currentDeviceRotation
@ -163,6 +164,7 @@ ApplicationWindow {
} }
Item {} Item {}
Button { Button {
Layout.alignment: Qt.AlignRight
text: "升级" text: "升级"
onClicked: { onClicked: {
if (deviceList.currentIndex < 0) { if (deviceList.currentIndex < 0) {
@ -175,17 +177,32 @@ ApplicationWindow {
otaPopup.open() 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 spacing: (parent.width - (2 * 100)) / 3
} }
function showMessageDialog(type, title, message) { function showMessageDialog(type, title, message, callback) {
let component = Qt.createComponent("MessageDialog.qml") let component = Qt.createComponent("MessageDialog.qml")
if (component.status === Component.Ready) { if (component.status === Component.Ready) {
let dialog = component.createObject(window, { let dialog = component.createObject(window, {
"type": type, "type": type,
"titleText": title, "titleText": title,
"text": message "text": message,
"callback": callback
}) })
dialog.open() dialog.open()
} }

View File

@ -13,6 +13,7 @@ Dialog {
property alias text: textLabel.text property alias text: textLabel.text
property alias textFontSize: textLabel.font.pixelSize property alias textFontSize: textLabel.font.pixelSize
property int type: MessageDialog.Type.Successful property int type: MessageDialog.Type.Successful
property var callback
closePolicy: Popup.CloseOnEscap | Popup.NoAutoClose closePolicy: Popup.CloseOnEscap | Popup.NoAutoClose
background: Rectangle { background: Rectangle {
radius: 8 radius: 8
@ -62,30 +63,60 @@ Dialog {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
} }
Button { Row {
id: cancelButton
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
Layout.rightMargin: 6 Layout.rightMargin: 6
Layout.preferredWidth: 72 spacing: 10
Layout.preferredHeight: 40 Button {
font.family: control.font.family id: okButton
text: "关闭" width: 72
font.pixelSize: 14 height: 40
contentItem: Text { font.family: control.font.family
text: parent.text text: "好的"
font: parent.font font.pixelSize: 14
color: parent.down ? "#FFFFFF" : "#53627C" contentItem: Text {
horizontalAlignment: Text.AlignHCenter text: parent.text
verticalAlignment: Text.AlignVCenter 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()
}
} }
Button {
background: Rectangle { id: cancelButton
border.color: "#E1E4E8" visible: callback !== undefined
border.width: 1 width: 72
color: parent.down ? "#F25959" : "#FFFFFF" height: 40
radius: 2 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: { onTypeChanged: {

View File

@ -49,9 +49,13 @@ function Deploy() {
New-Item $deployPath -ItemType Directory New-Item $deployPath -ItemType Directory
Copy-Item $buildPath\AntiClipSettings.exe $deployPath\视觉防夹设备上位机工具v$version.exe Copy-Item $buildPath\AntiClipSettings.exe $deployPath\视觉防夹设备上位机工具v$version.exe
& $qtHome\bin\windeployqt.exe $deployPath\视觉防夹设备上位机工具v$version.exe --qmldir=$qtHome\qml & $qtHome\bin\windeployqt.exe $deployPath\视觉防夹设备上位机工具v$version.exe --qmldir=$qtHome\qml
Remove-Item -Path $deployPath\d3dcompiler_47.dll -Force # Remove-Item -Path $deployPath\d3dcompiler_47.dll -Force # 删了这个会导致Windows 7 无法正常显示
Remove-Item -Path $deployPath\Qt5Multimedia.dll -Force
Remove-Item -Path $deployPath\Qt5MultimediaQuick.dll -Force
Remove-Item -Path $deployPath\Qt5RemoteObjects.dll -Force Remove-Item -Path $deployPath\Qt5RemoteObjects.dll -Force
Remove-Item -Path $deployPath\Qt5Test.dll -Force
Remove-Item -Path $deployPath\Qt5QuickTest.dll -Force Remove-Item -Path $deployPath\Qt5QuickTest.dll -Force
Remove-Item -Path $deployPath\Qt5WinExtras.dll -Force
Remove-Item -Path $deployPath\translations -Recurse -Force # 暂时不需要翻译文件 Remove-Item -Path $deployPath\translations -Recurse -Force # 暂时不需要翻译文件
Remove-Item -Path $deployPath\qmltooling -Recurse -Force Remove-Item -Path $deployPath\qmltooling -Recurse -Force
Remove-Item -Path $deployPath\QtTest -Recurse -Force Remove-Item -Path $deployPath\QtTest -Recurse -Force
@ -79,8 +83,8 @@ function Deploy() {
Copy-Item -Path $boostRoot\lib\boost_$boost-vc143-mt-x64-1_83.dll -Destination $deployPath Copy-Item -Path $boostRoot\lib\boost_$boost-vc143-mt-x64-1_83.dll -Destination $deployPath
} }
# 暂时不需要 avfilter-9、avformat-60 # 暂时不需要 avfilter-9、avformat-60、postproc-57、avdevice-60
$ffmpegs = "avcodec-60", "avdevice-60", "avutil-58", "postproc-57", "swresample-4", "swscale-7" $ffmpegs = "avcodec-60", "avutil-58", "swresample-4", "swscale-7"
foreach ($ffmpeg in $ffmpegs) { foreach ($ffmpeg in $ffmpegs) {
Copy-Item -Path $ffmpegRoot\bin\$ffmpeg.dll -Destination $deployPath Copy-Item -Path $ffmpegRoot\bin\$ffmpeg.dll -Destination $deployPath
} }