9 Commits

Author SHA1 Message Date
b5948efe8c Update changelog for 0.11.0~rc1-1 release 2023-10-27 16:59:58 +02:00
7dd4a62731 Merge tag 'unstable/0.11.0_rc1' into pkg/debian_rc 2023-10-27 16:58:49 +02:00
e205618e3d packaging(deb): Create debian release candidate packages 2023-10-27 16:57:09 +02:00
7c19e0acd1 Update changelog for 0.10.0-3 release 2023-09-18 07:05:43 +02:00
81f5b981a6 packaging: Use patched entry point and link it to /usr/bin
By renaming the entry point, which had the same name as the module,
both can now be installed in the same directory. The entry point can
then be created in /usr/bin as a link with the original name
'revpicommander'.

Signed-off-by: Sven Sager <akira@narux.de>
2023-09-18 07:03:35 +02:00
239273ae16 packaging(patch): Change entry point name in setup.py
Change entry point name to differ from the module name. In the package,
the module and its scripts are installed in the same directory. This is
done via PYBUILD_INSTALL_ARGS and --install-lib, --install-scripts.
Module name and script name must not be the same.
2023-09-18 06:53:37 +02:00
65280435a7 packaging: Remove unused GPL-3+ section from copyright file 2023-09-18 06:33:35 +02:00
b252aec126 Update changelog for 0.10.0-2 release
Signed-off-by: Sven Sager <akira@narux.de>
2023-09-16 17:32:35 +02:00
3d6e9877d7 packaging(deb): Start packaging branch
Signed-off-by: Sven Sager <akira@narux.de>
2023-09-16 17:13:27 +02:00
19 changed files with 300 additions and 190 deletions

View File

@@ -8,9 +8,6 @@ APP_NAME = RevPi\ Commander
APP_IDENT = org.revpimodio.revpicommander
APPLE_SIG = "Developer ID Application: Sven Sager (U3N5843D9K)"
# Python interpreter to use for venv creation
SYSTEM_PYTHON = python3
# Set path to create the virtual environment with package name
ifdef PYTHON3_VENV
VENV_PATH = $(PYTHON3_VENV)/$(PACKAGE)
@@ -18,37 +15,39 @@ else
VENV_PATH = venv
endif
# Set targets for "all"-target
all: build-ui build-rc build
# If virtualenv exists, use it. If not, use PATH to find commands
SYSTEM_PYTHON = python3
PYTHON = $(or $(wildcard $(VENV_PATH)/bin/python), $(SYSTEM_PYTHON))
APP_VERSION = $(shell "$(PYTHON)" src/$(PACKAGE) --version | cut -d ' ' -f 2)
all: build_ui build_rc test build
.PHONY: all
## Virtual environment creation with SYSTEM_PYTHON
## Environment
venv-info:
@echo Environment for $(APP_NAME) $(APP_VERSION)
@echo Using path: "$(VENV_PATH)"
exit 0
venv:
# Start with empty environment
"$(SYSTEM_PYTHON)" -m venv "$(VENV_PATH)"
"$(VENV_PATH)/bin/pip" install --upgrade pip
"$(VENV_PATH)/bin/pip" install --upgrade -r requirements.txt
source "$(VENV_PATH)/bin/activate" && \
python3 -m pip install --upgrade pip && \
python3 -m pip install -r requirements.txt
exit 0
venv-ssp:
# Include system installed site-packages and add just missing modules
"$(SYSTEM_PYTHON)" -m venv --system-site-packages "$(VENV_PATH)"
"$(VENV_PATH)/bin/pip" install --upgrade pip
"$(VENV_PATH)/bin/pip" install --upgrade -r requirements.txt
source "$(VENV_PATH)/bin/activate" && \
python3 -m pip install --upgrade pip && \
python3 -m pip install -r requirements.txt
exit 0
.PHONY: venv venv-ssp
# Choose python interpreter from venv or system
PYTHON = $(or $(wildcard $(VENV_PATH)/bin/python), $(SYSTEM_PYTHON))
# Read app version from program
APP_VERSION = $(shell "$(PYTHON)" src/$(PACKAGE) --version | cut -d ' ' -f 2)
# Environment info
venv-info:
@echo Environment for $(APP_NAME) $(APP_VERSION)
@echo Using path: "$(VENV_PATH)"
.PHONY: venv-info
.PHONY: venv-info venv venv-ssp
## Compile Qt UI files to python code
build-ui:
@@ -110,7 +109,6 @@ app-licenses:
app: build-ui build-rc app-licenses
"$(PYTHON)" -m PyInstaller -n $(APP_NAME) \
--collect-submodules=zeroconf \
--add-data="src/$(PACKAGE)/locale:./$(PACKAGE)/locale" \
--add-data="dist/bundled-libraries.md:$(PACKAGE)/open-source-licenses" \
--add-data="dist/open-source-licenses.*:$(PACKAGE)/open-source-licenses" \
@@ -125,7 +123,6 @@ app: build-ui build-rc app-licenses
app-mac: build-ui build-rc app-licenses
"$(PYTHON)" -m PyInstaller -n $(APP_NAME) \
--collect-submodules=zeroconf \
--add-data="src/$(PACKAGE)/locale:./$(PACKAGE)/locale" \
--add-data="dist/bundled-libraries.md:$(PACKAGE)/open-source-licenses" \
--add-data="dist/open-source-licenses.*:$(PACKAGE)/open-source-licenses" \
@@ -167,8 +164,6 @@ clean:
rm -rf build dist src/*.egg-info
# PyInstaller created files
rm -rf *.spec
# Pycaches
find . -type d -name '__pycache__' -exec rm -r {} \+
distclean: clean
# Virtual environment

125
debian/changelog vendored Normal file
View File

@@ -0,0 +1,125 @@
revpicommander (0.11.0~rc1-1) unstable; urgency=medium
* chore: Recompile UI files with PyQt generator 5.15.7
* refactor: Using module based logger and not root logger from proginit
* feat: Upgrade proginit to version 1.3.0
* build: Upgrade buildsystem with new Makefile and make.bat
* feat: Add open-source license viewer to help menu
* feat: Remove selector for Python version
* style: Change the selection method in developer file lists.
* refactor: Remove logging of debug logs from external modules
* refactor: Remove info logs of ssh transport handler loop
* fix: Signal connection_recovered when connected via XML-RPC native
* refactor: Set new tool tips with version information
* feat: Select start program in developer dialog
* packaging(deb): Create debian release candidate packages
* chore: Release 0.11.0rc1
-- Sven Sager <s.sager@kunbus.com> Fri, 27 Oct 2023 11:59:57 +0200
revpicommander (0.10.0-3) stable; urgency=medium
* packaging: Remove unused GPL-3+ section from copyright file
* packaging(patch): Change entry point name in setup.py
* packaging: Use patched entry point and link it to /usr/bin
-- Sven Sager <akira@narux.de> Mon, 18 Sep 2023 07:05:35 +0200
revpicommander (0.10.0-2) stable; urgency=medium
[ Sven Sager ]
* Renamed version of revpipycontrol written with Qt framework
* Replace widget search to widget directory (performance)
* Replace widget search to widget dict (performance)
* WIP: GUI and base function from revpidevelop
* Bugfix: PyInstaller script
* Save IP address, not hostname of avahisearch.py found RevPi
(Windows will not resolve)
* WIP: revpifiles.py has all functions for PyLoad 0.9.2
* revpifiles.py is ready with PyLoad 0.9.3 functions
* files.ui Design change, cleanup
* String fields (> 4 Bytes) can be switched to numbers
* Load and display logfiles block by block
* Add option for software watchdog and driver reset action
* Destroy changed IOs after piCtory changes
* UI Text check and translation-de
* Bugfixes - IP regex, Queue handling, file upload
* UI Text check and translation-de
* Bugfix: Load locales file
* Remove included revpimodio2 static link and add it as requires
* New release
* Get AVAHI IPv4 addresses with service_info
* Bugfix for translations strings and format function
* Add parameter to change connection timeout (default was and
is 5 seconds)
* Add a simulator dialog to manage simulator settings
* Bugfix for simulator to prevent GUI crash after first use
* Modified translations
* New release
* Add upload progress display in developer, bugfix on file download in
developer
* Fix error on decoding broken log files
* Fix crash during add new connection
* Reduce max block to load for log files on slow networks
* Improved RevPi search window
* New release
* Fix error in debugios.py with long byte values
* Bugfix: RevPi simulator could not be startet without existing
proc.img file
* Design things: enable HighDpi, dependency versions, icon text
* Add Windows files for pyinstaller and setup generation
* Fix qt parents of menu entries in connections
* Improved shortcuts to meet the needs of different operating systems
* Implement update function of ZeroConf ServiceListener
* Redesign main window with text boxes to copy host name or ip
* Add translation of status codes
* Bugfix: could not open debugcontrol, because of new layout names
* Add context menu with copy and piCtory actions to revpi search dialog
* Switch project so src layout
* Switch to setuptools for setup.py
* Add icons to commander main window for start, stop and so on
* Update Makefile and requirements.txt for build and clean ui files
* Add PyInstaller script for Windows
* QTranslator uses ui_languages to find translation
* Use cm.call_remote_function to fetch log files via XML-RPC
* Prepare SSH tunnel server and password GUI
* Configure and start ssh tunneled connections
* Choose connection type (ssh or xml-rpc) in avahisearch dialog
* Update Makefile rules
* Update translation file
* Update Windows setup script to match pyinstaller output
* Manage revolution pi saved settings in an own class
* Change most button pressed event to clicked and add global shortcuts
* Set the use of ssh tunnel to default value for new settings
* Save SSH credentials with keyring module
* Show just the hostname without .local in avahisearch.py list
* Bugfix for new settings management
* Clean up keyring when a connection is deleted
* Move version number from revpicommander.py to __init__.py
* New async connection management with user feedback
* Connection list with add folder button and removed naming bug
* Move version number from __init__.py to __main__.py
* Adjustments for creating installations on various operating systems
* Bugfix: Add missing packages to install_requires
* Add option to switch word order on debugios
* Add pyinstaller option for linux platform
* Bugfix type hinting, PyLoad version handling, piCtory browser
* Update translation and messages
* Change license from GPLv3 to GPLv2 after approval of all contributors
* Replaces Master-Slave with Client-Server
* Bugfix in super call of backgroundworker.py
* Ignore ssh known_hosts from home directory, use own
* build: Use system python interpreter in make file
* fix: Show program dialog, even if there are no files on the RevPi
* chore: Release 0.10.0rc1
* fix: PLC monitor crashes when a device has no inputs or outputs
* build: Add environment variable to set alternative venv path
* feat: SSH tunnel server extended to execute commands on remote host.
* build: Use python interpreter and modules for qt commands in Makefile
* feat: Try to start RevPiPyLoad via SSH on the Revolution Pi
* fix: Simulator always sets process image to NULL
* build: Fix Makefile targets to match GNU coding standards
* chore: Release 0.10.0
* packaging(deb): Start packaging branch
-- Sven Sager <s.sager@kunbus.com> Sat, 16 Sep 2023 14:10:12 +0200

32
debian/control vendored Normal file
View File

@@ -0,0 +1,32 @@
Source: revpicommander
Section: x11
Priority: optional
Maintainer: Sven Sager <akira@narux.de>
Rules-Requires-Root: no
Homepage: https://revpimodio.org/revpipyplc/
Vcs-Browser: https://github.com/narux/revpicommander
Vcs-Git: https://github.com/narux/revpicommander.git
Build-Depends:
debhelper-compat (= 12),
dh-python,
python3-all,
python3-keyring (>= 17.1.1),
python3-pyqt5,
python3-paramiko (>= 2.4.2),
python3-revpimodio2 (>= 2.5.6),
python3-zeroconf (>= 0.24.4),
python3-setuptools,
python3-wheel
Standards-Version: 4.3.0
Package: revpicommander
Architecture: all
Depends:
${python3:Depends},
${misc:Depends}
Description: GUI for Revolution Pi to upload programs and do IO-Checks
The RevPiCommander is a GUI tool to manage your revolution Pi over the
network. You can search for RevPis in your network, manage the settings
of RevPiPyLoad and do IO checks on your local machine. Developing your
control program is very easy with the developer, upload and debug it
over the network.

29
debian/copyright vendored Normal file
View File

@@ -0,0 +1,29 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://github.com/naruxde/revpicommander
Upstream-Name: revpicommander
Upstream-Contact: Sven Sager <akira@narux.de>
Files: *
Copyright: 2017-2023 Sven Sager
License: GPL-2+
Files: debian/*
Copyright: 2021-2023 KUNBUS GmbH
License: GPL-2+
License: GPL-2+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".

4
debian/gbp.conf vendored Normal file
View File

@@ -0,0 +1,4 @@
[DEFAULT]
upstream-branch = main
upstream-tag = unstable/%(version)s
debian-branch=pkg/debian_rc

2
debian/install vendored Normal file
View File

@@ -0,0 +1,2 @@
data/revpicommander.desktop /usr/share/applications
data/revpicommander.png /usr/share/icons/hicolor/128x128/apps

1
debian/links vendored Normal file
View File

@@ -0,0 +1 @@
/usr/share/revpicommander/revpicommander_entry_point /usr/bin/revpicommander

View File

@@ -0,0 +1,24 @@
From: Sven Sager <akira@narux.de>
Date: Mon, 18 Sep 2023 06:49:44 +0200
Subject: Change entry point name to differ from the module name
In the package, the module and its scripts are installed in the same
directory. This is done via PYBUILD_INSTALL_ARGS and --install-lib,
--install-scripts. Module name and script name must not be the same.
---
setup.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 227874b..8b2acab 100644
--- a/setup.py
+++ b/setup.py
@@ -25,7 +25,7 @@ setup(
],
entry_points={
'gui_scripts': [
- 'revpicommander = revpicommander.revpicommander:main',
+ 'revpicommander_entry_point = revpicommander.revpicommander:main',
],
},

1
debian/patches/series vendored Normal file
View File

@@ -0,0 +1 @@
0001-Change-entry-point-name-to-differ-from-the-module-na.patch

1
debian/py3dist-overrides vendored Normal file
View File

@@ -0,0 +1 @@
pyqt5 python3-pyqt5

9
debian/rules vendored Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/make -f
export PYBUILD_NAME=revpicommander
# Install this module as an application an not into the python standard library path
export PYBUILD_INSTALL_ARGS=--install-lib=/usr/share/revpicommander/ --install-scripts=/usr/share/revpicommander/
%:
dh $@ --with python3 --buildsystem=pybuild

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (quilt)

View File

@@ -2,7 +2,7 @@
set PACKAGE=revpicommander
set APP_NAME=RevPi Commander
set PYTHON=venv\Scripts\python.exe
set PYTHON=venv\\Scripts\\python.exe
if "%1" == "venv" goto venv
if "%1" == "test" goto test
@@ -24,7 +24,7 @@ goto end
:venv
python -m venv venv
venv\Scripts\pip.exe install -r requirements.txt
venv\\Scripts\\pip.exe install -r requirements.txt
goto end
:test
@@ -41,7 +41,7 @@ goto end
mkdir dist
%PYTHON% -m piplicenses ^
--format=markdown ^
--output-file dist\\bundled-libraries.md
--output-file dist/bundled-libraries.md
%PYTHON% -m piplicenses ^
--with-authors ^
--with-urls ^
@@ -49,7 +49,7 @@ goto end
--with-license-file ^
--no-license-path ^
--format=json ^
--output-file dist\\open-source-licenses.json
--output-file dist/open-source-licenses.json
%PYTHON% -m piplicenses ^
--with-authors ^
--with-urls ^
@@ -57,19 +57,14 @@ goto end
--with-license-file ^
--no-license-path ^
--format=plain-vertical ^
--output-file dist\\open-source-licenses.txt
--output-file dist/open-source-licenses.txt
%PYTHON% -m PyInstaller -n "%APP_NAME%" ^
--collect-submodules=zeroconf ^
--add-data="dist\\bundled-libraries.md;%PACKAGE%\\open-source-licenses" ^
--add-data="dist\\open-source-licenses.*;%PACKAGE%\\open-source-licenses" ^
--add-data="src\\%PACKAGE%\\locale;.\\%PACKAGE%\\locale" ^
--add-data="data\\%PACKAGE%.ico;." ^
--icon=data\\%PACKAGE%.ico ^
--add-data="dist/bundled-libraries.md;%PACKAGE%\open-source-licenses" ^
--add-data="dist/open-source-licenses.*;%PACKAGE%\open-source-licenses" ^
--noconfirm ^
--clean ^
--onedir ^
--windowed ^
src\%PACKAGE%\__main__.py
--onefile ^
src\\%PACKAGE%\\__main__.py
goto end
:distclean
@@ -77,7 +72,7 @@ goto end
:clean
rmdir /S /Q .pytest_cache
rmdir /S /Q build dist src\\%PACKAGE%.egg-info
rmdir /S /Q build dist src\%PACKAGE%.egg-info
del /Q *.spec
:end

View File

@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "RevPi Commander"
#define MyAppVersion "0.11.0"
#define MyAppVersion "0.10.0"
#define MyAppPublisher "Sven Sager"
#define MyAppURL "https://revpimodio.org/"
#define MyAppICO "data\revpicommander.ico"

View File

@@ -4,4 +4,4 @@ __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv2"
__package__ = "revpicommander"
__version__ = "0.11.0"
__version__ = "0.11.0rc1"

View File

@@ -10,6 +10,7 @@ from logging import getLogger
from PyQt5 import QtCore, QtGui, QtWidgets
from . import helper
from . import proginit as pi
from .ui.debugios_ui import Ui_win_debugios
log = getLogger(__name__)
@@ -101,12 +102,6 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
signed = io[6]
word_order = io[7] if len(io) > 7 else "ignored"
# Since RevPiPyLoad 0.11.0rc2 we have a list with async functions
if len(io) > 8:
async_call = io[8]
else:
async_call = []
val = container.findChild(self.search_class, name)
if val is not None:
# Destroy IO if the properties was changed
@@ -120,41 +115,24 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
else:
continue
lbl, val = self._create_widgets(
name,
byte_length,
bit_address,
byteorder,
signed,
read_only,
word_order,
async_call,
)
lbl.setParent(container)
lbl = QtWidgets.QLabel(name, container)
lbl.setObjectName("lbl_".format(name))
lbl.setStyleSheet(self.style_sheet)
val = self._create_widget(name, byte_length, bit_address, byteorder, signed, read_only, word_order)
val.setParent(container)
layout.insertRow(counter, val, lbl)
self.splitter.setSizes([1, 1])
def _create_widgets(
def _create_widget(
self, name: str, byte_length: int, bit_address: int, byteorder: str, signed: bool, read_only: bool,
word_order: str, async_call: list):
word_order: str):
"""Create widget in functions address space to use lambda functions."""
# Create lable to set same properties of value widget for context menues
lbl = QtWidgets.QLabel(name)
lbl.setObjectName("lbl_".format(name))
lbl.setStyleSheet(self.style_sheet)
if bit_address >= 0:
val = QtWidgets.QCheckBox()
val.setEnabled(not read_only)
if async_call:
lbl.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
val.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
lbl.customContextMenuRequested.connect(self.on_context_menu)
val.customContextMenuRequested.connect(self.on_context_menu)
# Set alias to use the same function name on all widget types
val.setValue = val.setChecked
if not read_only:
@@ -165,12 +143,9 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
# Bytes or string
val = QtWidgets.QLineEdit()
val.setReadOnly(read_only)
lbl.setProperty("struct_type", "text")
val.setProperty("struct_type", "text")
lbl.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
val.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
lbl.customContextMenuRequested.connect(self.on_context_menu)
val.customContextMenuRequested.connect(self.on_context_menu)
# Set alias to use the same function name on all widget types
@@ -184,20 +159,13 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
val = QtWidgets.QDoubleSpinBox()
val.setReadOnly(read_only)
lbl.setProperty("struct_type", struct_type)
val.setProperty("struct_type", struct_type)
lbl.setProperty("frm", "{0}{1}".format(
">" if byteorder == "big" else "<",
struct_type.lower() if signed else struct_type
))
val.setProperty("frm", "{0}{1}".format(
">" if byteorder == "big" else "<",
struct_type.lower() if signed else struct_type
))
lbl.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
val.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
lbl.customContextMenuRequested.connect(self.on_context_menu)
val.customContextMenuRequested.connect(self.on_context_menu)
val.setDecimals(0)
@@ -207,23 +175,15 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
if not read_only:
val.valueChanged.connect(self._change_sbx_dvalue)
lbl.setObjectName(name)
val.setObjectName(name)
lbl.setProperty("big_endian", byteorder == "big")
val.setProperty("big_endian", byteorder == "big")
lbl.setProperty("bit_address", bit_address)
val.setProperty("bit_address", bit_address)
lbl.setProperty("byte_length", byte_length)
val.setProperty("byte_length", byte_length)
lbl.setProperty("signed", signed)
val.setProperty("signed", signed)
lbl.setProperty("word_order", word_order)
val.setProperty("word_order", word_order)
lbl.setProperty("async_call", async_call)
val.setProperty("async_call", async_call)
self.__qwa[name] = val
return lbl, val
return val
@QtCore.pyqtSlot(int)
def _change_cbx_value(self, value: int):
@@ -257,31 +217,6 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
sender = self.sender()
men = QtWidgets.QMenu(sender)
act_reset = QtWidgets.QAction(self.tr("Reset counter"))
if "di_reset" in sender.property("async_call"):
men.addAction(act_reset)
men.addSeparator()
if "ro_get_switching_cycles" in sender.property("async_call"):
switching_cycles = helper.cm.call_remote_function(
"ps_switching_cycles",
sender.objectName(),
default_value=self.tr("Can not display"),
)
if type(switching_cycles) is not list:
switching_cycles = [switching_cycles]
for i in range(len(switching_cycles)):
relais_counter = self.tr(" Relais {0}").format(i + 1)
if len(switching_cycles) == 1:
relais_counter = ""
men.addAction(
self.tr("Switching cycles{0}: {1}").format(
relais_counter,
switching_cycles[i],
)
)
men.addSeparator()
if sender.property("byte_length") > 4:
# Textbox needs format buttons
act_as_text = QtWidgets.QAction(self.tr("as text"))
@@ -296,13 +231,11 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
act_signed = QtWidgets.QAction(self.tr("signed"), men)
act_signed.setCheckable(True)
act_signed.setChecked(sender.property("signed") or False)
if sender.property("bit_address") == -1:
men.addAction(act_signed)
act_byteorder = QtWidgets.QAction(self.tr("big_endian"), men)
act_byteorder.setCheckable(True)
act_byteorder.setChecked(sender.property("big_endian") or False)
if sender.property("bit_address") == -1:
men.addAction(act_byteorder)
if sender.property("byte_length") > 2:
@@ -333,12 +266,6 @@ class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):
sender.setProperty("big_endian", act_byteorder.isChecked())
elif rc == act_wordorder:
sender.setProperty("word_order", "big" if act_wordorder.isChecked() else "little")
elif rc == act_reset:
try:
helper.cm.call_remote_function("ps_reset_counter", sender.objectName(), raise_exception=True)
except Exception as e:
log.error(e)
QtWidgets.QMessageBox.critical(self, self.tr("Error"), self.tr("Could not reset the counter value"))
if sender.property("frm"):
sender.setProperty("frm", "{0}{1}".format(

View File

@@ -172,7 +172,7 @@ Das kann eine der folgenden Ursachen haben:
- Der RevPiPyLoad XML-RPC Dienst ist nur an localhost gebunden
- Die Berechtigungen sind nicht für diese IP gesetzt!!!
Benutze &quot;Über SSH verbinden&quot; um eine verschlüsselte Verbindung aufzubauen oder führe &apos;sudo revpipyload_secure_installation&apos; auf dem Revolution Pi aus, um eine direkte Verbindung zu konfigurieren!</translation>
Benutze &quot;Über SSH verbinden&quot; um eine verschlüsselte Verbindung aufzubauen oder führe 'sudo revpipyload_secure_installation' auf dem Revolution Pi aus, um eine direkte Verbindung zu konfigurieren!</translation>
</message>
<message>
<location filename="../helper.py" line="399"/>
@@ -216,7 +216,7 @@ Das kann eine der folgenden Ursachen haben:
<location filename="../debugcontrol.py" line="271"/>
<source>Error set value of device &apos;{0}&apos; Output &apos;{1}&apos;: {2}
</source>
<translation>Fehler beim Setzen des Ausgangs &apos;{1}&apos; auf Modul &apos;{0}&apos;: {2}
<translation>Fehler beim Setzen des Ausgangs '{1}' auf Modul '{0}': {2}
</translation>
</message>
<message>
@@ -228,75 +228,40 @@ Das kann eine der folgenden Ursachen haben:
<context>
<name>DebugIos</name>
<message>
<location filename="../debugios.py" line="287"/>
<location filename="../debugios.py" line="231"/>
<source>signed</source>
<translation></translation>
</message>
<message>
<location filename="../debugios.py" line="293"/>
<location filename="../debugios.py" line="236"/>
<source>big_endian</source>
<translation></translation>
</message>
<message>
<location filename="../debugios.py" line="278"/>
<location filename="../debugios.py" line="222"/>
<source>as text</source>
<translation></translation>
</message>
<message>
<location filename="../debugios.py" line="280"/>
<location filename="../debugios.py" line="224"/>
<source>as number</source>
<translation></translation>
</message>
<message>
<location filename="../debugios.py" line="444"/>
<location filename="../debugios.py" line="380"/>
<source>Can not use format text</source>
<translation>Formatierung nicht möglich</translation>
</message>
<message>
<location filename="../debugios.py" line="444"/>
<location filename="../debugios.py" line="380"/>
<source>Can not convert bytes {0} to a text for IO &apos;{1}&apos;. Switch to number format instead!</source>
<translation>Kann bytes {0} für &apos;{1}&apos; nicht in Text konvertieren. Wechseln Sie auf Nummernformat!</translation>
<translation>Kann bytes {0} für '{1}' nicht in Text konvertieren. Wechseln Sie auf Nummernformat!</translation>
</message>
<message>
<location filename="../debugios.py" line="300"/>
<location filename="../debugios.py" line="242"/>
<source>switch wordorder</source>
<translation>Wordorder tauschen</translation>
</message>
<message>
<location filename="../debugios.py" line="252"/>
<source>Reset counter</source>
<translation>Zähler zurücksetzen</translation>
</message>
<message>
<location filename="../debugios.py" line="258"/>
<source>can not display</source>
<translation type="obsolete">kann nicht angezeigt werden</translation>
</message>
<message>
<location filename="../debugios.py" line="265"/>
<source> Relais {0}</source>
<translation></translation>
</message>
<message>
<location filename="../debugios.py" line="268"/>
<source>Switching cycles{0}: {1}</source>
<translation>Schaltzyklen{0}: {1}</translation>
</message>
<message>
<location filename="../debugios.py" line="332"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../debugios.py" line="332"/>
<source>Could not reset the counter value</source>
<translation>Kann Zähler nicht zurücksetzen</translation>
</message>
<message>
<location filename="../debugios.py" line="258"/>
<source>Can not display</source>
<translation>Kann nicht angezeigt werden</translation>
</message>
</context>
<context>
<name>MqttManager</name>
@@ -431,7 +396,7 @@ Dies kann aus der Textbox oben kopiert werden.</translation>
<message>
<location filename="../revpicommander.py" line="339"/>
<source>Can not start the simulator! Maybe the piCtory file is corrupt or you have no write permissions for &apos;{0}&apos;.</source>
<translation>Kann Simulator nicht starten! Vielleicht ist die piCtory Datei defekt oder es gibt keine Schreibberechtigung für &apos;{0}&apos;.</translation>
<translation>Kann Simulator nicht starten! Vielleicht ist die piCtory Datei defekt oder es gibt keine Schreibberechtigung für '{0}'.</translation>
</message>
<message>
<location filename="../revpicommander.py" line="506"/>
@@ -477,7 +442,7 @@ Es sollten alle RevPiModIO Programme vorher beendet werden, da diese ihre IO Wer
We are trying to activate this service now and reconnect. The settings can be changed at any time via &apos;webstatus&apos;.</source>
<translation>Vielleicht läuft der RevPiPyLoad Dienst nicht.
Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einstellungen können über &apos;Webstatus&apos; jederzeit geändert werden.</translation>
Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einstellungen können über 'Webstatus' jederzeit geändert werden.</translation>
</message>
</context>
<context>
@@ -520,7 +485,7 @@ Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einst
<message>
<location filename="../revpifiles.py" line="276"/>
<source>Can not open last directory &apos;{0}&apos;.</source>
<translation>Kann letztes Verzeichnis &apos;{0}&apos; nicht öffnen.</translation>
<translation>Kann letztes Verzeichnis '{0}' nicht öffnen.</translation>
</message>
<message>
<location filename="../revpifiles.py" line="333"/>
@@ -545,7 +510,7 @@ Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einst
<message>
<location filename="../revpifiles.py" line="483"/>
<source>Can not access the folder &apos;{0}&apos; to read files.</source>
<translation>Keine Berechtigung für Zugriff auf Ordner &apos;{0}&apos;.</translation>
<translation>Keine Berechtigung für Zugriff auf Ordner '{0}'.</translation>
</message>
<message>
<location filename="../revpifiles.py" line="584"/>
@@ -555,7 +520,7 @@ Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einst
<message>
<location filename="../revpifiles.py" line="533"/>
<source>Error while download file &apos;{0}&apos;.</source>
<translation>Fehler beim Herunterladen der Datei &apos;{0}&apos;.</translation>
<translation>Fehler beim Herunterladen der Datei '{0}'.</translation>
</message>
<message>
<location filename="../revpifiles.py" line="541"/>
@@ -569,7 +534,7 @@ Wir versuchen diesen Dienst jetzt zu aktivieren und verbinden uns neu. Die Einst
Select &apos;Yes&apos; to override, &apos;No&apos; to download only missing files.</source>
<translation>Eine oder mehrere Dateien existieren auf diesem Computer! Sollen bestehende Dateien überschrieben werden?
Wählen Sie &apos;Ja&apos; zum Überschreiben, &apos;Nein&apos; um nur fehlende Dateien zu laden.</translation>
Wählen Sie 'Ja' zum Überschreiben, 'Nein' um nur fehlende Dateien zu laden.</translation>
</message>
<message>
<location filename="../revpifiles.py" line="573"/>
@@ -584,7 +549,7 @@ Wählen Sie &apos;Ja&apos; zum Überschreiben, &apos;Nein&apos; um nur fehlende
<message>
<location filename="../revpifiles.py" line="584"/>
<source>Error while delete file &apos;{0}&apos;.</source>
<translation>Fehler beim Löschen der Datei &apos;{0}&apos;.</translation>
<translation>Fehler beim Löschen der Datei '{0}'.</translation>
</message>
<message>
<location filename="../revpifiles.py" line="135"/>
@@ -609,12 +574,12 @@ Wählen Sie &apos;Ja&apos; zum Überschreiben, &apos;Nein&apos; um nur fehlende
<message>
<location filename="../revpifiles.py" line="179"/>
<source>Upgrade your Revolution Pi! This function needs at least &apos;revpipyload&apos; 0.11.0</source>
<translation>Aktualisiere deinen Revolution Pi! Diese Funktion benötigt mindestens &apos;revpipyload&apos; 0.11.0</translation>
<translation>Aktualisiere deinen Revolution Pi! Diese Funktion benötigt mindestens 'revpipyload' 0.11.0</translation>
</message>
<message>
<location filename="../revpifiles.py" line="198"/>
<source>Upgrade your Revolution Pi! This function needs at least &apos;revpipyload&apos; 0.9.5</source>
<translation>Aktualisiere deinen Revolution Pi! Diese Funktion benötigt mindestens &apos;revpipyload&apos; 0.9.5</translation>
<translation>Aktualisiere deinen Revolution Pi! Diese Funktion benötigt mindestens 'revpipyload' 0.9.5</translation>
</message>
<message>
<location filename="../revpifiles.py" line="193"/>
@@ -1289,7 +1254,7 @@ Dies ist kein Fehler von RevPi Commander.</translation>
<source>The base topic is the first part of any mqtt topic, the Revolution Pi will publish. You can use any character includig &apos;/&apos; to structure the messages on your broker.
For example: revpi0000/data</source>
<translation>Der Basistopic wird allen MQTT Topics vorangestellt, welche der Revolution Pi veröffentlicht. Es können alle Zeichen inklusive &apos;/&apos; verwendet werden, um die Nachrichten auf dem Broker zu strukturieren.
<translation>Der Basistopic wird allen MQTT Topics vorangestellt, welche der Revolution Pi veröffentlicht. Es können alle Zeichen inklusive '/' verwendet werden, um die Nachrichten auf dem Broker zu strukturieren.
Zum Beispiel: revpi0000/data</translation>
</message>

View File

@@ -5,7 +5,7 @@
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018-2023 Sven Sager"
__license__ = "LGPL-2.0-or-later"
__version__ = "1.3.1"
__version__ = "1.3.0"
import logging
import sys
@@ -14,6 +14,7 @@ from configparser import ConfigParser
from os import R_OK, W_OK, access, environ, getpid, remove
from os.path import abspath, dirname, exists, join
from shutil import copy, move
from socket import AF_UNIX, SOCK_DGRAM, socket
from threading import Event
try:
@@ -38,8 +39,6 @@ _daemon_started_up = Event()
_daemon_main_pid = getpid()
_systemd_notify = environ.get("NOTIFY_SOCKET", None)
if _systemd_notify:
from socket import AF_UNIX, SOCK_DGRAM, socket
# Set up the notification socket for systemd communication
_systemd_socket = socket(family=AF_UNIX, type=SOCK_DGRAM)
if _extend_daemon_startup_timeout: