mirror of
https://github.com/gtalent/sc9k.git
synced 2025-01-23 00:33:36 -06:00
Add camera reboot option
This commit is contained in:
parent
56f98eed60
commit
ac7bb9c585
1
deps/buildcore/base.cmake
vendored
1
deps/buildcore/base.cmake
vendored
@ -14,6 +14,7 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
# enable ccache
|
# enable ccache
|
||||||
if(NOT DEFINED ENV{BUILDCORE_SUPPRESS_CCACHE})
|
if(NOT DEFINED ENV{BUILDCORE_SUPPRESS_CCACHE})
|
||||||
find_program(CCACHE_PROGRAM ccache)
|
find_program(CCACHE_PROGRAM ccache)
|
||||||
|
32
deps/buildcore/base.mk
vendored
32
deps/buildcore/base.mk
vendored
@ -6,6 +6,10 @@
|
|||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
ifndef USE_CONAN
|
||||||
|
USE_CONAN=0
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq (${OS},Windows_NT)
|
ifeq (${OS},Windows_NT)
|
||||||
SHELL := powershell.exe
|
SHELL := powershell.exe
|
||||||
.SHELLFLAGS := -NoProfile -Command
|
.SHELLFLAGS := -NoProfile -Command
|
||||||
@ -78,6 +82,7 @@ purge:
|
|||||||
${ENV_RUN} ${RM_RF} .current_build
|
${ENV_RUN} ${RM_RF} .current_build
|
||||||
${ENV_RUN} ${RM_RF} ${BUILD_PATH}
|
${ENV_RUN} ${RM_RF} ${BUILD_PATH}
|
||||||
${ENV_RUN} ${RM_RF} dist
|
${ENV_RUN} ${RM_RF} dist
|
||||||
|
${ENV_RUN} ${RM_RF} compile_commands.json
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: build
|
test: build
|
||||||
${ENV_RUN} mypy ${SCRIPTS}
|
${ENV_RUN} mypy ${SCRIPTS}
|
||||||
@ -129,6 +134,8 @@ else
|
|||||||
${ENV_RUN} ${VCPKG_DIR}/bootstrap-vcpkg.bat
|
${ENV_RUN} ${VCPKG_DIR}/bootstrap-vcpkg.bat
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: vcpkg-install
|
.PHONY: vcpkg-install
|
||||||
vcpkg-install:
|
vcpkg-install:
|
||||||
ifneq (${OS},windows)
|
ifneq (${OS},windows)
|
||||||
@ -137,39 +144,30 @@ else
|
|||||||
${VCPKG_DIR}/vcpkg install --triplet x64-windows ${VCPKG_PKGS}
|
${VCPKG_DIR}/vcpkg install --triplet x64-windows ${VCPKG_PKGS}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
else ifdef USE_CONAN # USE_VCPKG ################################################
|
ifeq (${USE_CONAN},1) # USE_CONAN ################################################
|
||||||
|
.PHONY: conan-config
|
||||||
.PHONY: setup-conan
|
|
||||||
conan-config:
|
conan-config:
|
||||||
${ENV_RUN} conan profile new ${PROJECT_NAME} --detect --force
|
${ENV_RUN} conan profile detect -f --name ${PROJECT_NAME}
|
||||||
ifeq ($(OS),linux)
|
|
||||||
${ENV_RUN} conan profile update settings.compiler.libcxx=libstdc++11 ${PROJECT_NAME}
|
|
||||||
else
|
|
||||||
${ENV_RUN} conan profile update settings.compiler.cppstd=20 ${PROJECT_NAME}
|
|
||||||
ifeq ($(OS),windows)
|
|
||||||
${ENV_RUN} conan profile update settings.compiler.runtime=static ${PROJECT_NAME}
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
.PHONY: conan
|
.PHONY: conan
|
||||||
conan:
|
conan:
|
||||||
${ENV_RUN} ${PYBB} conan-install ${PROJECT_NAME}
|
${ENV_RUN} ${PYBB} conan-install ${PROJECT_NAME}
|
||||||
endif # USE_VCPKG ###############################################
|
endif # USE_CONAN ###############################################
|
||||||
|
|
||||||
ifeq (${OS},darwin)
|
ifeq (${OS},darwin)
|
||||||
.PHONY: configure-xcode
|
.PHONY: configure-xcode
|
||||||
configure-xcode:
|
configure-xcode:
|
||||||
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_tool=xcode --current_build=0 --build_root=${BUILD_PATH}
|
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_tool=xcode --current_build=0 --build_root=${BUILD_PATH} --use_conan=${USE_CONAN}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: configure-release
|
.PHONY: configure-release
|
||||||
configure-release:
|
configure-release:
|
||||||
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=release --build_root=${BUILD_PATH}
|
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=release --build_root=${BUILD_PATH} --use_conan=${USE_CONAN}
|
||||||
|
|
||||||
.PHONY: configure-debug
|
.PHONY: configure-debug
|
||||||
configure-debug:
|
configure-debug:
|
||||||
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=debug --build_root=${BUILD_PATH}
|
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=debug --build_root=${BUILD_PATH} --use_conan=${USE_CONAN}
|
||||||
|
|
||||||
.PHONY: configure-asan
|
.PHONY: configure-asan
|
||||||
configure-asan:
|
configure-asan:
|
||||||
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=asan --build_root=${BUILD_PATH}
|
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=asan --build_root=${BUILD_PATH} --use_conan=${USE_CONAN}
|
||||||
|
|
||||||
|
4
deps/buildcore/scripts/pybb.py
vendored
4
deps/buildcore/scripts/pybb.py
vendored
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env python3
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2016 - 2021 gary@drinkingtea.net
|
# Copyright 2016 - 2023 gary@drinkingtea.net
|
||||||
#
|
#
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
@ -74,7 +74,7 @@ def conan() -> int:
|
|||||||
return 1
|
return 1
|
||||||
if err != 0:
|
if err != 0:
|
||||||
return err
|
return err
|
||||||
args = ['conan', 'install', '../', '--build=missing', '-pr', project_name]
|
args = ['conan', 'install', '../', '-of', '.', '--build=missing', '-pr', project_name]
|
||||||
os.chdir(conan_dir)
|
os.chdir(conan_dir)
|
||||||
err = subprocess.run(args).returncode
|
err = subprocess.run(args).returncode
|
||||||
if err != 0:
|
if err != 0:
|
||||||
|
5
deps/buildcore/scripts/setup-build.py
vendored
5
deps/buildcore/scripts/setup-build.py
vendored
@ -1,7 +1,7 @@
|
|||||||
#! /usr/bin/env python3
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2016 - 2021 gary@drinkingtea.net
|
# Copyright 2016 - 2023 gary@drinkingtea.net
|
||||||
#
|
#
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
@ -28,6 +28,7 @@ def main() -> int:
|
|||||||
parser.add_argument('--build_root', help='Path to the root of build directories (must be in project dir)', default='build')
|
parser.add_argument('--build_root', help='Path to the root of build directories (must be in project dir)', default='build')
|
||||||
parser.add_argument('--toolchain', help='Path to CMake toolchain file', default='')
|
parser.add_argument('--toolchain', help='Path to CMake toolchain file', default='')
|
||||||
parser.add_argument('--current_build', help='Indicates whether or not to make this the active build', default=1)
|
parser.add_argument('--current_build', help='Indicates whether or not to make this the active build', default=1)
|
||||||
|
parser.add_argument('--use_conan', help='Indicates whether or not should use .conanbuild/conan_toolchain.cmake', default='0')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.build_type == 'asan':
|
if args.build_type == 'asan':
|
||||||
@ -76,6 +77,8 @@ def main() -> int:
|
|||||||
'-DBUILDCORE_BUILD_CONFIG={:s}'.format(build_config),
|
'-DBUILDCORE_BUILD_CONFIG={:s}'.format(build_config),
|
||||||
'-DBUILDCORE_TARGET={:s}'.format(args.target),
|
'-DBUILDCORE_TARGET={:s}'.format(args.target),
|
||||||
]
|
]
|
||||||
|
if args.use_conan != '0':
|
||||||
|
cmake_cmd.append('-DCMAKE_TOOLCHAIN_FILE={:s}'.format('.conanbuild/conan_toolchain.cmake'))
|
||||||
if qt_path != '':
|
if qt_path != '':
|
||||||
cmake_cmd.append(qt_path)
|
cmake_cmd.append(qt_path)
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
|
@ -73,6 +73,11 @@ void CameraClient::setHue(int val) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CameraClient::reboot() {
|
||||||
|
post("/cgi-bin/param.cgi?post_reboot");
|
||||||
|
emit pollFailed();
|
||||||
|
}
|
||||||
|
|
||||||
void CameraClient::setBaseUrl() {
|
void CameraClient::setBaseUrl() {
|
||||||
auto const [host, port] = getCameraConnectionData();
|
auto const [host, port] = getCameraConnectionData();
|
||||||
m_baseUrl = QString("http://%1:%2").arg(host, QString::number(port));
|
m_baseUrl = QString("http://%1:%2").arg(host, QString::number(port));
|
||||||
@ -81,7 +86,14 @@ void CameraClient::setBaseUrl() {
|
|||||||
void CameraClient::get(QString const&urlExt) {
|
void CameraClient::get(QString const&urlExt) {
|
||||||
QUrl url(QString(m_baseUrl) + urlExt);
|
QUrl url(QString(m_baseUrl) + urlExt);
|
||||||
QNetworkRequest rqst(url);
|
QNetworkRequest rqst(url);
|
||||||
auto reply = m_nam->get(rqst);
|
auto const reply = m_nam->get(rqst);
|
||||||
|
connect(reply, &QIODevice::readyRead, reply, &QObject::deleteLater);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraClient::post(QString const&urlExt) {
|
||||||
|
QUrl url(QString(m_baseUrl) + urlExt);
|
||||||
|
QNetworkRequest rqst(url);
|
||||||
|
auto const reply = m_nam->post(rqst, QByteArray{});
|
||||||
connect(reply, &QIODevice::readyRead, reply, &QObject::deleteLater);
|
connect(reply, &QIODevice::readyRead, reply, &QObject::deleteLater);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,12 +39,16 @@ class CameraClient: public QObject {
|
|||||||
|
|
||||||
void setHue(int val);
|
void setHue(int val);
|
||||||
|
|
||||||
|
void reboot();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setBaseUrl();
|
void setBaseUrl();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void get(QString const&url);
|
void get(QString const&url);
|
||||||
|
|
||||||
|
void post(QString const&url);
|
||||||
|
|
||||||
void poll();
|
void poll();
|
||||||
|
|
||||||
void handlePollResponse(QNetworkReply *reply);
|
void handlePollResponse(QNetworkReply *reply);
|
||||||
|
@ -112,7 +112,7 @@ void MainWindow::setupMenu() {
|
|||||||
}
|
}
|
||||||
// camera preset menu
|
// camera preset menu
|
||||||
{
|
{
|
||||||
auto const menu = menuBar()->addMenu(tr("&Camera Preset"));
|
auto const menu = menuBar()->addMenu(tr("&Camera"));
|
||||||
for (auto i = 0; i < std::min(9, MaxCameraPresets); ++i) {
|
for (auto i = 0; i < std::min(9, MaxCameraPresets); ++i) {
|
||||||
auto const cameraPresetAct = new QAction(tr("Camera Preset &%1").arg(i + 1), this);
|
auto const cameraPresetAct = new QAction(tr("Camera Preset &%1").arg(i + 1), this);
|
||||||
cameraPresetAct->setShortcut(Qt::ALT | static_cast<Qt::Key>(Qt::Key_1 + i));
|
cameraPresetAct->setShortcut(Qt::ALT | static_cast<Qt::Key>(Qt::Key_1 + i));
|
||||||
@ -121,6 +121,18 @@ void MainWindow::setupMenu() {
|
|||||||
});
|
});
|
||||||
menu->addAction(cameraPresetAct);
|
menu->addAction(cameraPresetAct);
|
||||||
}
|
}
|
||||||
|
menu->addSeparator();
|
||||||
|
auto const rebootAct = new QAction(tr("&Reboot"), this);
|
||||||
|
connect(rebootAct, &QAction::triggered, &m_cameraClient, [this] {
|
||||||
|
QMessageBox confirm(this);
|
||||||
|
confirm.setText(tr("Are you sure you want to reboot the camera? This will take about 20 seconds."));
|
||||||
|
confirm.addButton(tr("&No"), QMessageBox::ButtonRole::NoRole);
|
||||||
|
confirm.addButton(tr("&Yes"), QMessageBox::ButtonRole::YesRole);
|
||||||
|
if (confirm.exec() == QMessageBox::YesRole) {
|
||||||
|
m_cameraClient.reboot();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
menu->addAction(rebootAct);
|
||||||
}
|
}
|
||||||
// help menu
|
// help menu
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user