Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
77dd027ff7 | |||
8e0018480b | |||
16757c5f78 | |||
ef7aa73c8d | |||
95b68bc67d | |||
d0966cfcc7 | |||
d6a36c0450 | |||
27e5db45d6 | |||
51f9a2af52 | |||
0b3198c90e | |||
f55d3aa9df | |||
bf3ad2be2f | |||
f230e4cc8b |
@ -8,8 +8,18 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: [windows11]
|
runs-on: [windows11]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Clone repository
|
||||||
uses: actions/checkout@v4
|
run: |
|
||||||
|
$ref = "${{ github.ref }}"
|
||||||
|
if ($ref -like 'refs/heads/*') {
|
||||||
|
$branch = $ref -replace '^refs/heads/', ''
|
||||||
|
} elseif ($ref -like 'refs/tags/*') {
|
||||||
|
$branch = $ref -replace '^refs/tags/', ''
|
||||||
|
} else {
|
||||||
|
$branch = $ref
|
||||||
|
}
|
||||||
|
git clone --depth 1 --branch=$branch https://${{ secrets.GIT_USERNAME }}:${{ secrets.GIT_PASSWORD }}@amass.fun/gitea/${{ gitea.repository }}.git .
|
||||||
|
git checkout ${{ github.sha }}
|
||||||
- name: Build and deploy
|
- name: Build and deploy
|
||||||
run: |
|
run: |
|
||||||
resources/build.ps1 build
|
resources/build.ps1 build
|
||||||
@ -20,4 +30,4 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
body_path: build/CHANGELOG.txt
|
body_path: build/CHANGELOG.txt
|
||||||
files: |-
|
files: |-
|
||||||
build/AntiClipSettings.zip
|
build/视觉防夹设备上位机工具*.zip
|
@ -40,7 +40,7 @@ Application::Application(int &argc, char **argv)
|
|||||||
font.setFamily("微软雅黑");
|
font.setFamily("微软雅黑");
|
||||||
m_app->setFont(font);
|
m_app->setFont(font);
|
||||||
m_app->setApplicationName(APPLICATION_NAME);
|
m_app->setApplicationName(APPLICATION_NAME);
|
||||||
m_app->setApplicationVersion(QString("V%1").arg(APP_VERSION));
|
m_app->setApplicationVersion(QString("v%1").arg(APP_VERSION));
|
||||||
m_player->open();
|
m_player->open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,6 +164,35 @@ void Application::updateShieldedAreaPoints(const QList<QPointF> &points) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Application::currentDeviceFlip() const {
|
||||||
|
return m_currentDeviceFlip;
|
||||||
|
}
|
||||||
|
void Application::setCurrentDeviceFlip(bool flip) {
|
||||||
|
if (m_currentDeviceFlip != flip) {
|
||||||
|
m_currentDeviceFlip = flip;
|
||||||
|
emit currentDeviceFlipChanged();
|
||||||
|
if (!m_device.expired()) {
|
||||||
|
auto device = m_device.lock();
|
||||||
|
device->updateFlip(flip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Application::currentDeviceRotation() const {
|
||||||
|
return m_currentDeviceRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::setCurrentDeviceRotation(int rotation) {
|
||||||
|
if (m_currentDeviceRotation != rotation) {
|
||||||
|
m_currentDeviceRotation = rotation;
|
||||||
|
emit currentDeviceRotationChanged();
|
||||||
|
if (!m_device.expired()) {
|
||||||
|
auto device = m_device.lock();
|
||||||
|
device->updateRotation(rotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Application::updateNetworkInfomation(bool dhcp, const QString &ip, const QString &netmask, const QString &gateway,
|
void Application::updateNetworkInfomation(bool dhcp, const QString &ip, const QString &netmask, const QString &gateway,
|
||||||
const QString &dns) {
|
const QString &dns) {
|
||||||
if (!m_device.expired()) {
|
if (!m_device.expired()) {
|
||||||
@ -180,6 +209,8 @@ void Application::updateNetworkInfomation(bool dhcp, const QString &ip, const QS
|
|||||||
void Application::connectToDevice(int index) {
|
void Application::connectToDevice(int index) {
|
||||||
if (!m_device.expired()) {
|
if (!m_device.expired()) {
|
||||||
auto device = m_device.lock();
|
auto device = m_device.lock();
|
||||||
|
disconnect(device.get(), &DeviceConnection::rotationChanged, this, &Application::onDeviceRotationChanged);
|
||||||
|
disconnect(device.get(), &DeviceConnection::flipChanged, this, &Application::onDeviceFlipChanged);
|
||||||
disconnect(device.get(), &DeviceConnection::openDoorAreaChanged, this, &Application::onDeviceOpenDoorArea);
|
disconnect(device.get(), &DeviceConnection::openDoorAreaChanged, this, &Application::onDeviceOpenDoorArea);
|
||||||
disconnect(device.get(), &DeviceConnection::shieldedAreaChanged, this, &Application::onDeviceShieldedArea);
|
disconnect(device.get(), &DeviceConnection::shieldedAreaChanged, this, &Application::onDeviceShieldedArea);
|
||||||
disconnect(device.get(), &DeviceConnection::antiClipAreaChanged, this, &Application::onDeviceAntiClipArea);
|
disconnect(device.get(), &DeviceConnection::antiClipAreaChanged, this, &Application::onDeviceAntiClipArea);
|
||||||
@ -202,6 +233,8 @@ void Application::connectToDevice(int index) {
|
|||||||
auto device = m_devices->device(index);
|
auto device = m_devices->device(index);
|
||||||
m_device = device;
|
m_device = device;
|
||||||
|
|
||||||
|
connect(device.get(), &DeviceConnection::rotationChanged, this, &Application::onDeviceRotationChanged);
|
||||||
|
connect(device.get(), &DeviceConnection::flipChanged, this, &Application::onDeviceFlipChanged);
|
||||||
connect(device.get(), &DeviceConnection::openDoorAreaChanged, this, &Application::onDeviceOpenDoorArea);
|
connect(device.get(), &DeviceConnection::openDoorAreaChanged, this, &Application::onDeviceOpenDoorArea);
|
||||||
connect(device.get(), &DeviceConnection::shieldedAreaChanged, this, &Application::onDeviceShieldedArea);
|
connect(device.get(), &DeviceConnection::shieldedAreaChanged, this, &Application::onDeviceShieldedArea);
|
||||||
connect(device.get(), &DeviceConnection::antiClipAreaChanged, this, &Application::onDeviceAntiClipArea);
|
connect(device.get(), &DeviceConnection::antiClipAreaChanged, this, &Application::onDeviceAntiClipArea);
|
||||||
@ -220,16 +253,20 @@ void Application::connectToDevice(int index) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
device->setLiveStreamEnabled(true);
|
device->setLiveStreamEnabled(true);
|
||||||
auto area = device->area();
|
auto info = device->infomation();
|
||||||
m_currentOpenDoorAreaWay = area.openDoorAreaWay;
|
m_currentOpenDoorAreaWay = info.openDoorAreaWay;
|
||||||
m_currentOpenDoorAreaPoints = area.openDoorArea;
|
m_currentOpenDoorAreaPoints = info.openDoorArea;
|
||||||
m_currentShieldedAreaEnabled = area.shieldedAreaEnabled;
|
m_currentShieldedAreaEnabled = info.shieldedAreaEnabled;
|
||||||
m_currentShieldedAreaPoints = area.shieldedArea;
|
m_currentShieldedAreaPoints = info.shieldedArea;
|
||||||
m_currentAntiClipAreaEnabled = area.antiClipAreaEnabled;
|
m_currentAntiClipAreaEnabled = info.antiClipAreaEnabled;
|
||||||
m_currentAntiClipAreaPoints = area.antiClipArea;
|
m_currentAntiClipAreaPoints = info.antiClipArea;
|
||||||
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();
|
||||||
|
m_currentDeviceFlip = info.flip;
|
||||||
|
m_currentDeviceRotation = info.rotation;
|
||||||
|
emit currentDeviceRotationChanged();
|
||||||
|
emit currentDeviceFlipChanged();
|
||||||
emit currentOpenDoorAreaPointsChanged();
|
emit currentOpenDoorAreaPointsChanged();
|
||||||
emit currentShieldedAreaPointsChanged();
|
emit currentShieldedAreaPointsChanged();
|
||||||
emit currentAntiClipAreaPointsChanged();
|
emit currentAntiClipAreaPointsChanged();
|
||||||
@ -258,9 +295,10 @@ void Application::upgradeDevice(const QString &file) {
|
|||||||
int position = baseName.indexOf(versionPrefix);
|
int position = baseName.indexOf(versionPrefix);
|
||||||
if (position < 0 || ((baseName.length() - position) < std::strlen(version))) {
|
if (position < 0 || ((baseName.length() - position) < std::strlen(version))) {
|
||||||
emit newMessage(2, "OTA升级", "文件名格式不合法!");
|
emit newMessage(2, "OTA升级", "文件名格式不合法!");
|
||||||
|
LOG(error) << "baseName: " << baseName.toStdString() << ", position: " << position;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QString firmware = baseName.mid(position, std::strlen(version));
|
QString firmware = baseName.mid(position);
|
||||||
if (device->isConnected()) {
|
if (device->isConnected()) {
|
||||||
device->requestOta(firmware, file);
|
device->requestOta(firmware, file);
|
||||||
} else {
|
} else {
|
||||||
@ -273,6 +311,13 @@ void Application::onDeviceOpenDoorArea(DeviceConnection::AreaWay way, const QLis
|
|||||||
setCurrentOpenDoorAreaPoints(points);
|
setCurrentOpenDoorAreaPoints(points);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::onDeviceRotationChanged(int rotation) {
|
||||||
|
setCurrentDeviceRotation(rotation);
|
||||||
|
}
|
||||||
|
void Application::onDeviceFlipChanged(bool flip) {
|
||||||
|
setCurrentDeviceFlip(flip);
|
||||||
|
}
|
||||||
|
|
||||||
void Application::onDeviceShieldedArea(bool enabled, const QList<QPointF> &points) {
|
void Application::onDeviceShieldedArea(bool enabled, const QList<QPointF> &points) {
|
||||||
setCurrentShieldedAreaEnabled(enabled);
|
setCurrentShieldedAreaEnabled(enabled);
|
||||||
setCurrentShieldedAreaPoints(points);
|
setCurrentShieldedAreaPoints(points);
|
||||||
|
@ -40,6 +40,10 @@ class Application : public QObject {
|
|||||||
NetworkInfomation currentNetworkInfomation READ currentNetworkInfomation NOTIFY currentNetworkInfomationChanged)
|
NetworkInfomation currentNetworkInfomation READ currentNetworkInfomation NOTIFY currentNetworkInfomationChanged)
|
||||||
Q_PROPERTY(QString currentFirmware MEMBER m_currentFirmware NOTIFY currentFirmwareChanged)
|
Q_PROPERTY(QString currentFirmware MEMBER m_currentFirmware NOTIFY currentFirmwareChanged)
|
||||||
Q_PROPERTY(bool currentDeviceConnected MEMBER m_currentDeviceConnected NOTIFY currentDeviceConnectedChanged)
|
Q_PROPERTY(bool currentDeviceConnected MEMBER m_currentDeviceConnected NOTIFY currentDeviceConnectedChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY(bool currentDeviceFlip READ currentDeviceFlip WRITE setCurrentDeviceFlip NOTIFY currentDeviceFlipChanged)
|
||||||
|
Q_PROPERTY(int currentDeviceRotation READ currentDeviceRotation WRITE setCurrentDeviceRotation NOTIFY
|
||||||
|
currentDeviceRotationChanged)
|
||||||
friend class Amass::Singleton<Application>;
|
friend class Amass::Singleton<Application>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -64,6 +68,12 @@ public:
|
|||||||
QList<QPointF> currentAntiClipAreaPoints() const;
|
QList<QPointF> currentAntiClipAreaPoints() const;
|
||||||
void setCurrentAntiClipAreaPoints(const QList<QPointF> &points);
|
void setCurrentAntiClipAreaPoints(const QList<QPointF> &points);
|
||||||
|
|
||||||
|
bool currentDeviceFlip() const;
|
||||||
|
void setCurrentDeviceFlip(bool flip);
|
||||||
|
|
||||||
|
int currentDeviceRotation() const;
|
||||||
|
void setCurrentDeviceRotation(int rotation);
|
||||||
|
|
||||||
Q_INVOKABLE void updateOpenDoorAreaPoints(const QList<QPointF> &points);
|
Q_INVOKABLE void updateOpenDoorAreaPoints(const QList<QPointF> &points);
|
||||||
Q_INVOKABLE void updateAntiClipAreaPoints(const QList<QPointF> &points);
|
Q_INVOKABLE void updateAntiClipAreaPoints(const QList<QPointF> &points);
|
||||||
Q_INVOKABLE void updateShieldedAreaPoints(const QList<QPointF> &points);
|
Q_INVOKABLE void updateShieldedAreaPoints(const QList<QPointF> &points);
|
||||||
@ -88,10 +98,14 @@ signals:
|
|||||||
void currentFirmwareChanged();
|
void currentFirmwareChanged();
|
||||||
void currentDeviceConnectedChanged();
|
void currentDeviceConnectedChanged();
|
||||||
void currentDeviceOtaProgressChanged(bool status, int progress, const QString &message);
|
void currentDeviceOtaProgressChanged(bool status, int progress, const QString &message);
|
||||||
|
void currentDeviceFlipChanged();
|
||||||
|
void currentDeviceRotationChanged();
|
||||||
void newMessage(int type, const QString &title, const QString &message);
|
void newMessage(int type, const QString &title, const QString &message);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Application(int &argc, char **argv);
|
Application(int &argc, char **argv);
|
||||||
|
void onDeviceRotationChanged(int rotation);
|
||||||
|
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);
|
||||||
@ -118,6 +132,8 @@ private:
|
|||||||
NetworkInfomation m_currentNetworkInfomation;
|
NetworkInfomation m_currentNetworkInfomation;
|
||||||
QString m_currentFirmware;
|
QString m_currentFirmware;
|
||||||
bool m_currentDeviceConnected = false;
|
bool m_currentDeviceConnected = false;
|
||||||
|
bool m_currentDeviceFlip = false;
|
||||||
|
int m_currentDeviceRotation = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // APPLICATION_H
|
#endif // APPLICATION_H
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(AntiClipSettings VERSION 1.4 LANGUAGES C CXX)
|
project(AntiClipSettings VERSION 1.6 LANGUAGES C CXX)
|
||||||
set(APPLICATION_NAME "视觉防夹设备上位机工具")
|
set(APPLICATION_NAME "视觉防夹设备上位机工具")
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
@ -18,6 +18,7 @@ if (Qt6_FOUND)
|
|||||||
add_compile_definitions(
|
add_compile_definitions(
|
||||||
BOOST_USE_WINAPI_VERSION=BOOST_WINAPI_VERSION_WIN10
|
BOOST_USE_WINAPI_VERSION=BOOST_WINAPI_VERSION_WIN10
|
||||||
)
|
)
|
||||||
|
set(FFmpeg_ROOT ${Libraries_ROOT}/ffmpeg-7.0.2-full_build-shared)
|
||||||
else()
|
else()
|
||||||
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
|
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
|
||||||
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
||||||
@ -25,6 +26,7 @@ else()
|
|||||||
set(CMAKE_AUTORCC ON)
|
set(CMAKE_AUTORCC ON)
|
||||||
set(BOOST_ROOT ${Libraries_ROOT}/boost_1_83_0_msvc2022_64bit)
|
set(BOOST_ROOT ${Libraries_ROOT}/boost_1_83_0_msvc2022_64bit)
|
||||||
set(Boost_INCLUDE_DIR ${BOOST_ROOT}/include/boost-1_83)
|
set(Boost_INCLUDE_DIR ${BOOST_ROOT}/include/boost-1_83)
|
||||||
|
set(FFmpeg_ROOT ${Libraries_ROOT}/ffmpeg-6.1.1-full_build-shared)
|
||||||
endif()
|
endif()
|
||||||
option(Boost_USE_STATIC_LIBS OFF)
|
option(Boost_USE_STATIC_LIBS OFF)
|
||||||
|
|
||||||
@ -33,15 +35,19 @@ set(OPENSSL_INCLUDE_DIR ${OpenSSL_ROOT}/include)
|
|||||||
set(OpenSSL_LIBRARY_DIRS ${OpenSSL_ROOT}/lib)
|
set(OpenSSL_LIBRARY_DIRS ${OpenSSL_ROOT}/lib)
|
||||||
set(OpenSSL_LIBRARIES libssl libcrypto)
|
set(OpenSSL_LIBRARIES libssl libcrypto)
|
||||||
|
|
||||||
set(FFmpeg_ROOT ${Libraries_ROOT}/ffmpeg-7.0.2-full_build-shared)
|
|
||||||
set(FFmpeg_INCLUDE_DIR ${FFmpeg_ROOT}/include)
|
set(FFmpeg_INCLUDE_DIR ${FFmpeg_ROOT}/include)
|
||||||
set(FFmpeg_LIB_DIR ${FFmpeg_ROOT}/lib)
|
set(FFmpeg_LIB_DIR ${FFmpeg_ROOT}/lib)
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
set(JPEGTURBO_ROOT ${Libraries_ROOT}/libjpeg-turbo-3.0.3_msvc2022_64bit_debug)
|
set(JPEGTURBO_ROOT ${Libraries_ROOT}/libjpeg-turbo-3.0.3_msvc2022_64bit_debug)
|
||||||
|
set(MBEDTLS_ROOT ${Libraries_ROOT}/mbedtls-3.6.2_msvc2022_64bit_debug)
|
||||||
else()
|
else()
|
||||||
set(JPEGTURBO_ROOT ${Libraries_ROOT}/libjpeg-turbo-3.0.3_msvc2022_64bit_release)
|
set(JPEGTURBO_ROOT ${Libraries_ROOT}/libjpeg-turbo-3.0.3_msvc2022_64bit_release)
|
||||||
|
set(MBEDTLS_ROOT ${Libraries_ROOT}/mbedtls-3.6.2_msvc2022_64bit_release)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(MbedTLS_DIR ${MBEDTLS_ROOT}/lib/cmake/MbedTLS)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
@ -102,7 +108,7 @@ set_target_properties(AntiClipSettings PROPERTIES
|
|||||||
include(CPack)
|
include(CPack)
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
FetchContent_Declare(Kylin
|
FetchContent_Declare(Kylin
|
||||||
GIT_REPOSITORY https://gitea.amass.fun/amass/Kylin.git
|
GIT_REPOSITORY https://amass.fun/gitea/amass/Kylin.git
|
||||||
)
|
)
|
||||||
set(KYLIN_WITH_FLUENT OFF)
|
set(KYLIN_WITH_FLUENT OFF)
|
||||||
FetchContent_MakeAvailable(Kylin)
|
FetchContent_MakeAvailable(Kylin)
|
||||||
|
@ -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();
|
||||||
@ -73,10 +74,6 @@ void DeviceConnection::connect(const Infomation &infomation) {
|
|||||||
m_h264Socket->connectToHost(infomation.ip, 8000);
|
m_h264Socket->connectToHost(infomation.ip, 8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceConnection::Area DeviceConnection::area() const {
|
|
||||||
return m_area;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkInfomation DeviceConnection::networkInfomation() const {
|
NetworkInfomation DeviceConnection::networkInfomation() const {
|
||||||
return m_networkInfomation;
|
return m_networkInfomation;
|
||||||
}
|
}
|
||||||
@ -262,6 +259,44 @@ void DeviceConnection::requestResolution(Resolution resolution) {
|
|||||||
m_requests.push(task);
|
m_requests.push(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceConnection::updateRotation(int rotation) {
|
||||||
|
Task task;
|
||||||
|
task.command = "a23imagerotate_setdata";
|
||||||
|
task.task = [this, rotation]() {
|
||||||
|
boost::json::object request;
|
||||||
|
request["func"] = "a23imagerotate_setdata";
|
||||||
|
request["deviceid"] = "0";
|
||||||
|
boost::json::object data;
|
||||||
|
data["value"] = std::to_string(rotation);
|
||||||
|
request["data"] = std::move(data);
|
||||||
|
auto text = boost::json::serialize(request);
|
||||||
|
m_commandSocket->write(text.data(), text.size());
|
||||||
|
LOG(info) << "updateRotation: " << text;
|
||||||
|
};
|
||||||
|
if (m_requests.empty()) {
|
||||||
|
task.task();
|
||||||
|
}
|
||||||
|
m_requests.push(task);
|
||||||
|
}
|
||||||
|
void DeviceConnection::updateFlip(bool flip) {
|
||||||
|
Task task;
|
||||||
|
task.command = "a04imageflipping_setdata";
|
||||||
|
task.task = [this, flip]() {
|
||||||
|
boost::json::object request;
|
||||||
|
request["func"] = "a04imageflipping_setdata";
|
||||||
|
request["deviceid"] = "0";
|
||||||
|
boost::json::object data;
|
||||||
|
data["value"] = flip ? "2" : "1";
|
||||||
|
request["data"] = std::move(data);
|
||||||
|
auto text = boost::json::serialize(request);
|
||||||
|
m_commandSocket->write(text.data(), text.size());
|
||||||
|
};
|
||||||
|
if (m_requests.empty()) {
|
||||||
|
task.task();
|
||||||
|
}
|
||||||
|
m_requests.push(task);
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceConnection::requestVersion() {
|
void DeviceConnection::requestVersion() {
|
||||||
Task task;
|
Task task;
|
||||||
task.command = "a15devicedetail_getdata";
|
task.command = "a15devicedetail_getdata";
|
||||||
@ -281,6 +316,27 @@ void DeviceConnection::requestVersion() {
|
|||||||
m_requests.push(task);
|
m_requests.push(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceConnection::requestVideoInformation() {
|
||||||
|
constexpr const char *commands[] = {"a23imagerotate_getdata", "a04imageflipping_getdata"};
|
||||||
|
for (auto command : commands) {
|
||||||
|
Task task;
|
||||||
|
task.command = command;
|
||||||
|
task.task = [this, command]() {
|
||||||
|
boost::json::object request;
|
||||||
|
request["func"] = command;
|
||||||
|
request["deviceid"] = "0";
|
||||||
|
boost::json::object data;
|
||||||
|
request["data"] = std::move(data);
|
||||||
|
auto text = boost::json::serialize(request);
|
||||||
|
m_commandSocket->write(text.data(), text.size());
|
||||||
|
};
|
||||||
|
if (m_requests.empty()) {
|
||||||
|
task.task();
|
||||||
|
}
|
||||||
|
m_requests.push(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceConnection::requestNetworkInfomation() {
|
void DeviceConnection::requestNetworkInfomation() {
|
||||||
Task task;
|
Task task;
|
||||||
task.command = "netconfig_getdata";
|
task.command = "netconfig_getdata";
|
||||||
@ -332,11 +388,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;
|
||||||
@ -425,7 +481,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分钟左右(包含算法模型)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,8 +513,8 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
|
|||||||
} else if (value == "2") {
|
} else if (value == "2") {
|
||||||
way = Quadrangle;
|
way = Quadrangle;
|
||||||
}
|
}
|
||||||
m_area.openDoorAreaWay = way;
|
m_infomation.openDoorAreaWay = way;
|
||||||
m_area.openDoorArea = points;
|
m_infomation.openDoorArea = points;
|
||||||
emit openDoorAreaChanged(way, points);
|
emit openDoorAreaChanged(way, points);
|
||||||
} else if (function == "a03opendoor4_getdata") {
|
} else if (function == "a03opendoor4_getdata") {
|
||||||
auto &data = reply.at("data").as_object();
|
auto &data = reply.at("data").as_object();
|
||||||
@ -472,8 +528,8 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
|
|||||||
point.setY(obj.at("y").as_double());
|
point.setY(obj.at("y").as_double());
|
||||||
points.push_back(point);
|
points.push_back(point);
|
||||||
}
|
}
|
||||||
m_area.shieldedAreaEnabled = value == "1";
|
m_infomation.shieldedAreaEnabled = value == "1";
|
||||||
m_area.shieldedArea = points;
|
m_infomation.shieldedArea = points;
|
||||||
emit shieldedAreaChanged(value == "1", points);
|
emit shieldedAreaChanged(value == "1", points);
|
||||||
} else if (function == "a03opendoor5_getdata") {
|
} else if (function == "a03opendoor5_getdata") {
|
||||||
auto &data = reply.at("data").as_object();
|
auto &data = reply.at("data").as_object();
|
||||||
@ -487,8 +543,8 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
|
|||||||
point.setY(obj.at("y").as_double());
|
point.setY(obj.at("y").as_double());
|
||||||
points.push_back(point);
|
points.push_back(point);
|
||||||
}
|
}
|
||||||
m_area.antiClipAreaEnabled = value == "1";
|
m_infomation.antiClipAreaEnabled = value == "1";
|
||||||
m_area.antiClipArea = points;
|
m_infomation.antiClipArea = points;
|
||||||
emit antiClipAreaChanged(value == "1", points);
|
emit antiClipAreaChanged(value == "1", points);
|
||||||
} else if (function == "netconfig_getdata") {
|
} else if (function == "netconfig_getdata") {
|
||||||
auto &data = reply.at("data").as_object();
|
auto &data = reply.at("data").as_object();
|
||||||
@ -558,7 +614,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;
|
||||||
@ -579,10 +635,44 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
|
|||||||
}
|
}
|
||||||
emit otaProgressChanged(false, m_otaProgress, tip);
|
emit otaProgressChanged(false, m_otaProgress, tip);
|
||||||
}
|
}
|
||||||
|
} else if (function == "a23imagerotate_getdata") {
|
||||||
|
// {"data":{"value":"2"},"deviceid":"0","flag":"ok","func":"a23imagerotate_getdata"}
|
||||||
|
auto &data = reply.at("data").as_object();
|
||||||
|
auto &value = data.at("value").as_string();
|
||||||
|
m_infomation.rotation = std::stoi(static_cast<std::string>(value));
|
||||||
|
emit rotationChanged(m_infomation.rotation);
|
||||||
|
} else if (function == "a04imageflipping_getdata") {
|
||||||
|
// {"data":{"value":"1"},"deviceid":"0","flag":"ok","func":"a04imageflipping_getdata"}
|
||||||
|
auto &data = reply.at("data").as_object();
|
||||||
|
auto &value = data.at("value").as_string();
|
||||||
|
m_infomation.flip = value == "2";
|
||||||
|
emit flipChanged(m_infomation.flip);
|
||||||
|
} else if (function == "a04imageflipping_setdata") {
|
||||||
|
if ((task != nullptr) && (task->command.toStdString() == function)) {
|
||||||
|
if (task->timeoutTimer) {
|
||||||
|
task->timeoutTimer->stop();
|
||||||
|
}
|
||||||
|
bool status = true;
|
||||||
|
if (task->future) {
|
||||||
|
task->future->reportFinished(&status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
requestVideoInformation();
|
||||||
|
} else if (function == "a23imagerotate_setdata") {
|
||||||
|
if ((task != nullptr) && (task->command.toStdString() == function)) {
|
||||||
|
if (task->timeoutTimer) {
|
||||||
|
task->timeoutTimer->stop();
|
||||||
|
}
|
||||||
|
bool status = true;
|
||||||
|
if (task->future) {
|
||||||
|
task->future->reportFinished(&status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
requestVideoInformation();
|
||||||
} 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() {
|
||||||
@ -593,8 +683,9 @@ void DeviceConnection::onConnected() {
|
|||||||
requestShieldedArea();
|
requestShieldedArea();
|
||||||
requestAntiClipArea();
|
requestAntiClipArea();
|
||||||
requestNetworkInfomation();
|
requestNetworkInfomation();
|
||||||
|
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, "设备升级成功!");
|
||||||
@ -602,6 +693,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);
|
||||||
@ -612,9 +706,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)) {
|
||||||
@ -653,7 +751,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;
|
||||||
@ -665,9 +762,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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -679,6 +780,8 @@ void DeviceConnection::onErrorOccurred(QAbstractSocket::SocketError socketError)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeviceConnection::timerEvent(QTimerEvent *event) {
|
void DeviceConnection::timerEvent(QTimerEvent *event) {
|
||||||
|
using namespace std::chrono;
|
||||||
|
if (event->timerId() == m_heartbeatTimerId) {
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
int index = heartbeats % 3;
|
int index = heartbeats % 3;
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
@ -690,4 +793,22 @@ void DeviceConnection::timerEvent(QTimerEvent *event) {
|
|||||||
}
|
}
|
||||||
heartbeats++;
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
@ -34,11 +35,10 @@ public:
|
|||||||
QString softwareVersion;
|
QString softwareVersion;
|
||||||
QString firmwareVersion;
|
QString firmwareVersion;
|
||||||
QString ip;
|
QString ip;
|
||||||
};
|
|
||||||
Q_ENUM(AreaWay)
|
|
||||||
|
|
||||||
class Area {
|
int rotation = 0;
|
||||||
public:
|
bool flip = false;
|
||||||
|
|
||||||
QList<QPointF> openDoorArea;
|
QList<QPointF> openDoorArea;
|
||||||
AreaWay openDoorAreaWay;
|
AreaWay openDoorAreaWay;
|
||||||
|
|
||||||
@ -48,6 +48,7 @@ public:
|
|||||||
QList<QPointF> antiClipArea;
|
QList<QPointF> antiClipArea;
|
||||||
bool antiClipAreaEnabled;
|
bool antiClipAreaEnabled;
|
||||||
};
|
};
|
||||||
|
Q_ENUM(AreaWay)
|
||||||
|
|
||||||
using H264FrameCallback = std::function<void(const char *data, uint32_t size)>;
|
using H264FrameCallback = std::function<void(const char *data, uint32_t size)>;
|
||||||
DeviceConnection(QObject *parent = nullptr);
|
DeviceConnection(QObject *parent = nullptr);
|
||||||
@ -60,7 +61,6 @@ public:
|
|||||||
void setLiveStreamEnabled(bool enabled);
|
void setLiveStreamEnabled(bool enabled);
|
||||||
|
|
||||||
NetworkInfomation networkInfomation() const;
|
NetworkInfomation networkInfomation() const;
|
||||||
Area area() const;
|
|
||||||
|
|
||||||
void requestOpenDoorArea();
|
void requestOpenDoorArea();
|
||||||
QFuture<bool> updateOpenDoorAreaPoints(AreaWay way, const QList<QPointF> &points);
|
QFuture<bool> updateOpenDoorAreaPoints(AreaWay way, const QList<QPointF> &points);
|
||||||
@ -73,6 +73,9 @@ public:
|
|||||||
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,
|
||||||
const QString &dns);
|
const QString &dns);
|
||||||
void requestVersion();
|
void requestVersion();
|
||||||
|
void requestVideoInformation();
|
||||||
|
void updateRotation(int rotation);
|
||||||
|
void updateFlip(bool flip);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 对设备升级OTA,主要有几个步骤
|
* @brief 对设备升级OTA,主要有几个步骤
|
||||||
@ -91,6 +94,8 @@ signals:
|
|||||||
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);
|
||||||
|
void rotationChanged(int rotation);
|
||||||
|
void flipChanged(bool flip);
|
||||||
void networkInfomationChanged(const NetworkInfomation &info);
|
void networkInfomationChanged(const NetworkInfomation &info);
|
||||||
void firmwareChanged(const QString &firmware);
|
void firmwareChanged(const QString &firmware);
|
||||||
void otaProgressChanged(bool status, int progress, const QString &message);
|
void otaProgressChanged(bool status, int progress, const QString &message);
|
||||||
@ -99,6 +104,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;
|
||||||
@ -131,9 +137,9 @@ 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;
|
||||||
Area m_area;
|
|
||||||
NetworkInfomation m_networkInfomation;
|
NetworkInfomation m_networkInfomation;
|
||||||
QString m_firmware;
|
QString m_firmware;
|
||||||
};
|
};
|
||||||
|
@ -16,6 +16,9 @@ Item {
|
|||||||
property color antiClipAreaColor: "blue"
|
property color antiClipAreaColor: "blue"
|
||||||
property var antiClipAreaPoints: []
|
property var antiClipAreaPoints: []
|
||||||
property bool antiClipAreaEnabled: false
|
property bool antiClipAreaEnabled: false
|
||||||
|
property alias flip: flipSwitch.checked
|
||||||
|
property alias videoRotation: rotateComboBox.currentIndex
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
@ -246,6 +249,35 @@ Item {
|
|||||||
columns: 2
|
columns: 2
|
||||||
spacing: 10
|
spacing: 10
|
||||||
verticalItemAlignment: Qt.AlignVCenter
|
verticalItemAlignment: Qt.AlignVCenter
|
||||||
|
|
||||||
|
Label { text: qsTr("图像: ") }
|
||||||
|
|
||||||
|
Row {
|
||||||
|
enabled: root.enabled
|
||||||
|
Label {
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
text: qsTr("旋转")
|
||||||
|
}
|
||||||
|
Item {width: 10; height:10}
|
||||||
|
ComboBox {
|
||||||
|
id: rotateComboBox
|
||||||
|
model: ["0°","90°","180°","270°"]
|
||||||
|
onCurrentIndexChanged: {
|
||||||
|
App.currentDeviceRotation = rotateComboBox.currentIndex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Item {width: 70; height:10}
|
||||||
|
Label {
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
text: qsTr("翻转")
|
||||||
|
}
|
||||||
|
Item {width: 10; height:10}
|
||||||
|
Switch {
|
||||||
|
id: flipSwitch
|
||||||
|
onToggled: App.currentDeviceFlip=flipSwitch.checked
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("开门区域: ")
|
text: qsTr("开门区域: ")
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,8 @@ ApplicationWindow {
|
|||||||
shieldedAreaPoints: App.currentShieldedAreaPoints
|
shieldedAreaPoints: App.currentShieldedAreaPoints
|
||||||
antiClipAreaEnabled: App.currentAntiClipAreaEnabled
|
antiClipAreaEnabled: App.currentAntiClipAreaEnabled
|
||||||
antiClipAreaPoints: App.currentAntiClipAreaPoints
|
antiClipAreaPoints: App.currentAntiClipAreaPoints
|
||||||
|
flip: App.currentDeviceFlip
|
||||||
|
videoRotation: App.currentDeviceRotation
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkSettingPopup {
|
NetworkSettingPopup {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
param($type)
|
param($type)
|
||||||
|
# 该脚本设置为 UTF8-bom 编码即可支持中文
|
||||||
|
|
||||||
$MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Community\Common7\Tools\Launch-VsDevShell.ps1'
|
$MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Community\Common7\Tools\Launch-VsDevShell.ps1'
|
||||||
if (!(Test-Path $MsvcScript)) { $MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Professional\Common7\Tools\Launch-VsDevShell.ps1' }
|
if (!(Test-Path $MsvcScript)) { $MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Professional\Common7\Tools\Launch-VsDevShell.ps1' }
|
||||||
@ -10,12 +11,22 @@ $openSSLRoot = "D:\Qt\Tools\OpenSSLv3\Win_x64"
|
|||||||
$librariesPath = "E:\Projects\Libraries"
|
$librariesPath = "E:\Projects\Libraries"
|
||||||
if (!(Test-Path $librariesPath)) { $librariesPath = "D:\Projects\Libraries" }
|
if (!(Test-Path $librariesPath)) { $librariesPath = "D:\Projects\Libraries" }
|
||||||
$boostRoot = "$librariesPath\boost_1_83_0_msvc2022_64bit"
|
$boostRoot = "$librariesPath\boost_1_83_0_msvc2022_64bit"
|
||||||
$ffmpegRoot = "$librariesPath\ffmpeg-7.0.2-full_build-shared"
|
|
||||||
|
# 6.1.1 版本支持 windows7
|
||||||
|
$ffmpegRoot = "$librariesPath\ffmpeg-6.1.1-full_build-shared"
|
||||||
|
|
||||||
$projectPath = Get-Location
|
$projectPath = Get-Location
|
||||||
$buildPath = Join-Path -Path $projectPath -ChildPath "build"
|
$buildPath = Join-Path -Path $projectPath -ChildPath "build"
|
||||||
$deployPath = Join-Path -Path $buildPath -ChildPath "AntiClipSettings"
|
|
||||||
$zipFilePath = Join-Path -Path $buildPath -ChildPath "AntiClipSettings.zip"
|
$fileContent = (Get-Content -Path "CMakeLists.txt") -join " "
|
||||||
|
if ($fileContent -match 'project\([^\)]+VERSION\s+([0-9]+\.[0-9]+)') {
|
||||||
|
$version = $Matches[1]
|
||||||
|
} else {
|
||||||
|
Write-Output "未找到版本号"
|
||||||
|
}
|
||||||
|
|
||||||
|
$deployPath = Join-Path -Path $buildPath -ChildPath "视觉防夹设备上位机工具v$version"
|
||||||
|
$zipFilePath = Join-Path -Path $buildPath -ChildPath "视觉防夹设备上位机工具v$version.zip"
|
||||||
$changelogPath = Join-Path -Path $buildPath -ChildPath "CHANGELOG.txt"
|
$changelogPath = Join-Path -Path $buildPath -ChildPath "CHANGELOG.txt"
|
||||||
|
|
||||||
function Build() {
|
function Build() {
|
||||||
@ -36,8 +47,19 @@ function Deploy() {
|
|||||||
Remove-Item $deployPath -Recurse -Force
|
Remove-Item $deployPath -Recurse -Force
|
||||||
}
|
}
|
||||||
New-Item $deployPath -ItemType Directory
|
New-Item $deployPath -ItemType Directory
|
||||||
Copy-Item $buildPath\AntiClipSettings.exe $deployPath\AntiClipSettings.exe
|
Copy-Item $buildPath\AntiClipSettings.exe $deployPath\视觉防夹设备上位机工具v$version.exe
|
||||||
& $qtHome\bin\windeployqt.exe $deployPath\AntiClipSettings.exe --qmldir=$qtHome\qml
|
& $qtHome\bin\windeployqt.exe $deployPath\视觉防夹设备上位机工具v$version.exe --qmldir=$qtHome\qml
|
||||||
|
# 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\Qt5Test.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\qmltooling -Recurse -Force
|
||||||
|
Remove-Item -Path $deployPath\QtTest -Recurse -Force
|
||||||
|
Remove-Item -Path $deployPath\QtGraphicalEffects -Recurse -Force
|
||||||
|
|
||||||
|
|
||||||
# $modules = "QmlCore"
|
# $modules = "QmlCore"
|
||||||
@ -61,7 +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
|
||||||
}
|
}
|
||||||
|
|
||||||
$ffmpegs = "avcodec-61", "avdevice-61", "avfilter-10", "avformat-61", "avutil-59", "postproc-58", "swresample-5", "swscale-8"
|
# 暂时不需要 avfilter-9、avformat-60、postproc-57、avdevice-60
|
||||||
|
$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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user