cgse 0.16.3__tar.gz → 0.16.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cgse-0.16.3 → cgse-0.16.4}/PKG-INFO +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/async_control_claude.py +0 -88
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/confman/__init__.py +0 -22
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/confman/confman.yaml +0 -3
- cgse-0.16.4/libs/cgse-core/src/egse/connect.py +50 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/control.py +1 -124
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/dummy.py +6 -57
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/logger/log_cs.py +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/procman/__init__.py +3 -10
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/procman/procman.yaml +1 -5
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/procman/procman_cs.py +1 -12
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/registry/client.py +9 -2
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/storage/__init__.py +2 -19
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/storage/storage.yaml +0 -4
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/storage/storage_cs.py +2 -13
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/pyproject.toml +1 -1
- {cgse-0.16.3 → cgse-0.16.4}/service_registry.db +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/service_registry.db-shm +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/service_registry.db-wal +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/.gitignore +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/buffer_vat.log +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/buffer_vat.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/bump.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/conftest.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/bits.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/calibration.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/command.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/config.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/control.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/counter.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/decorators.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/device.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/dicts.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/dummy.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/env.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/exceptions.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/heartbeat.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/hk.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/listener.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/metrics.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/mixin.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/monitoring.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/observer.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/obsid.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/persistence.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/plugin.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/process.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/reload.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/settings.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/setup.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/api/system.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/custom_theme/main.html +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/docs.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/installation.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/nox.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/uv.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/getting_started.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/help.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/cli-cgse.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/grafana-queries.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/initialize.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-core/notifyhub.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-core/registry.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/libs/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/package_list.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/projects/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/roadmap.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/stylesheets/custom.css +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/stylesheets/extra.css +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/tutorial.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/user_guide/cli.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/docs/user_guide/index.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/duckdb_metrics.db +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/duckdb_metrics.db.wal +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/identifier.sqlite +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/justfile +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/justfile +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/cgse_common/cgse.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/log.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/scpi.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/setup.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/signal.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/socketdevice.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/system.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_log.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_metrics.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_plugin.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_process.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_state.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/_start.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/_setup_core.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/async_control.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/command.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
- /cgse-0.16.3/libs/cgse-core/src/egse/connect.py → /cgse-0.16.4/libs/cgse-core/src/egse/connect-todo.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/listener.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/mixin.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/monitoring.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/client.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/notifyhub/test.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/proxy.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/registry/server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/services.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_async_control.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_client_server_interaction.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_cm_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_command.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_connect.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_control.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_dummy.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_event_notification.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_extensions.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_listener.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_mixin.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_notify_hub.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_registry_service.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_server_running.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/mkdocs.yml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/noxfile.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_acs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/tests/script_daq6510_central_heating.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/tests/script_plot_readings.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/ruff.toml +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/scratch/advanced-process-monitoring.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/scratch/live-process-monitoring.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/scratch/match-case.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/scratch/processes.json +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/scratch/simple-process-monitoring.py +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/temperature_readings.log +0 -0
- {cgse-0.16.3 → cgse-0.16.4}/test_service_registry.db +0 -0
|
@@ -805,91 +805,3 @@ class ControlServer(abc.ABC):
|
|
|
805
805
|
the `egse.storage` module might not be available, it is provided by the `cgse-core` package.
|
|
806
806
|
"""
|
|
807
807
|
pass
|
|
808
|
-
|
|
809
|
-
async def notify_listeners(self, event_id: int = 0, context: dict = None):
|
|
810
|
-
"""
|
|
811
|
-
Notifies registered listeners about an event.
|
|
812
|
-
|
|
813
|
-
This function creates an Event object with the provided `event_id` and `context`
|
|
814
|
-
and notifies all registered listeners with the created event.
|
|
815
|
-
|
|
816
|
-
Args:
|
|
817
|
-
event_id (int, optional): The identifier for the event. Defaults to 0.
|
|
818
|
-
context (dict, optional): Additional context information associated with the event.
|
|
819
|
-
Defaults to None.
|
|
820
|
-
|
|
821
|
-
Note:
|
|
822
|
-
The notification is performed by the `notify_listeners` method of the `listeners` object
|
|
823
|
-
associated with this instance.
|
|
824
|
-
The notification is executed as a task to avoid blocking the commanding chain.
|
|
825
|
-
"""
|
|
826
|
-
self.logger.info(f"Notifying listeners for {EVENT_ID(event_id).name}")
|
|
827
|
-
|
|
828
|
-
# Create a task for notification instead of a daemon thread
|
|
829
|
-
event = Event(event_id=event_id, context=context)
|
|
830
|
-
asyncio.create_task(self.listeners.notify_listeners_async(event))
|
|
831
|
-
|
|
832
|
-
def get_listener_names(self):
|
|
833
|
-
return self.listeners.get_listener_names()
|
|
834
|
-
|
|
835
|
-
async def register_as_listener(self, proxy: Type, listener: dict):
|
|
836
|
-
"""
|
|
837
|
-
Registers a listener with the specified proxy.
|
|
838
|
-
|
|
839
|
-
This function attempts to add the provided listener to the specified proxy.
|
|
840
|
-
It employs a retry mechanism to handle potential ConnectionError exceptions.
|
|
841
|
-
|
|
842
|
-
Args:
|
|
843
|
-
proxy: A callable object representing the proxy to which the listener will be added.
|
|
844
|
-
listener (dict): The listener to be registered. Should be a dictionary containing
|
|
845
|
-
listener details.
|
|
846
|
-
|
|
847
|
-
Raises:
|
|
848
|
-
ConnectionError: If the connection to the proxy encounters issues even after
|
|
849
|
-
multiple retry attempts.
|
|
850
|
-
"""
|
|
851
|
-
|
|
852
|
-
@retry_with_exponential_backoff(exceptions=[ConnectionError])
|
|
853
|
-
async def _add_listener(proxy, listener):
|
|
854
|
-
async with proxy() as x, x.get_service_proxy() as srv:
|
|
855
|
-
rc = await srv.add_listener_async(listener)
|
|
856
|
-
_LOGGER.info(f"Response from {proxy.__name__} service add_listener: {rc}")
|
|
857
|
-
|
|
858
|
-
_LOGGER.info(f"Registering {self.__class__.__name__} as a listener to {proxy.__name__}")
|
|
859
|
-
await _add_listener(proxy, listener)
|
|
860
|
-
|
|
861
|
-
async def unregister_as_listener(self, proxy: Type, listener: dict):
|
|
862
|
-
"""
|
|
863
|
-
Removes a registered listener from the specified proxy.
|
|
864
|
-
|
|
865
|
-
This function attempts to remove the provided listener from the specified proxy.
|
|
866
|
-
It employs a retry mechanism to handle potential ConnectionError exceptions.
|
|
867
|
-
|
|
868
|
-
Args:
|
|
869
|
-
proxy: A callable object representing the proxy from which the listener will be removed.
|
|
870
|
-
listener (dict): The listener to be removed. Should be a dictionary containing
|
|
871
|
-
listener details.
|
|
872
|
-
|
|
873
|
-
Raises:
|
|
874
|
-
ConnectionError: If the connection to the proxy encounters issues even after
|
|
875
|
-
multiple retry attempts.
|
|
876
|
-
"""
|
|
877
|
-
|
|
878
|
-
@retry(times=5, exceptions=[ConnectionError])
|
|
879
|
-
async def _remove_listener(proxy, listener):
|
|
880
|
-
async with proxy() as x, x.get_service_proxy() as srv:
|
|
881
|
-
rc = await srv.remove_listener_async(listener)
|
|
882
|
-
_LOGGER.debug(f"Response from remove_listener: {rc=}")
|
|
883
|
-
|
|
884
|
-
# Check if the CS is available
|
|
885
|
-
try:
|
|
886
|
-
async with proxy():
|
|
887
|
-
pass
|
|
888
|
-
except ConnectionError:
|
|
889
|
-
_LOGGER.warning(
|
|
890
|
-
f"The {proxy.__class__.__name__} endpoint is not responding, {listener['name']} not un-registered."
|
|
891
|
-
)
|
|
892
|
-
return
|
|
893
|
-
|
|
894
|
-
_LOGGER.info(f"Removing {self.__class__.__name__} as a listener from {proxy.__name__}")
|
|
895
|
-
await _remove_listener(proxy, listener)
|
|
@@ -138,7 +138,6 @@ from egse.env import get_conf_repo_location
|
|
|
138
138
|
from egse.env import get_project_name
|
|
139
139
|
from egse.env import get_site_id
|
|
140
140
|
from egse.exceptions import InternalError
|
|
141
|
-
from egse.listener import EVENT_ID
|
|
142
141
|
from egse.log import logger
|
|
143
142
|
from egse.notifyhub.event import NotificationEvent
|
|
144
143
|
from egse.notifyhub.services import EventPublisher
|
|
@@ -552,10 +551,6 @@ class ConfigurationManagerInterface:
|
|
|
552
551
|
def get_setup_for_obsid(self, obsid):
|
|
553
552
|
raise NotImplementedError
|
|
554
553
|
|
|
555
|
-
@dynamic_interface
|
|
556
|
-
def get_listener_names(self):
|
|
557
|
-
raise NotImplementedError
|
|
558
|
-
|
|
559
554
|
|
|
560
555
|
class ConfigurationManagerController(ConfigurationManagerInterface):
|
|
561
556
|
"""Handles the commands that are sent to the configuration manager.
|
|
@@ -763,12 +758,6 @@ class ConfigurationManagerController(ConfigurationManagerInterface):
|
|
|
763
758
|
self._sut_name = _get_sut_id_for_setup(self._setup)
|
|
764
759
|
logger.info(f"New Setup loaded from {setup_file}")
|
|
765
760
|
save_last_setup_id(self._setup_id)
|
|
766
|
-
if self._control_server:
|
|
767
|
-
logger.info("Notifying listeners for a new Setup!")
|
|
768
|
-
with Timer(f"Notify Listeners for Setup change, Setup={self._setup_id}"):
|
|
769
|
-
self._control_server.notify_listeners(
|
|
770
|
-
EVENT_ID.SETUP, {"event_type": "new_setup", "setup_id": self._setup_id}
|
|
771
|
-
)
|
|
772
761
|
|
|
773
762
|
with EventPublisher() as pub:
|
|
774
763
|
pub.publish(
|
|
@@ -952,12 +941,6 @@ class ConfigurationManagerController(ConfigurationManagerInterface):
|
|
|
952
941
|
logger.info(f"New Setup was submitted and loaded: {setup_id=}")
|
|
953
942
|
self._sut_name = self._setup.camera.ID.lower()
|
|
954
943
|
save_last_setup_id(setup_id)
|
|
955
|
-
if self._control_server:
|
|
956
|
-
logger.info("Notifying listeners for a new Setup!")
|
|
957
|
-
with Timer(f"Notify Listeners for Setup change, Setup={self._setup_id}"):
|
|
958
|
-
self._control_server.notify_listeners(
|
|
959
|
-
EVENT_ID.SETUP, {"event_type": "new_setup", "setup_id": setup_id}
|
|
960
|
-
)
|
|
961
944
|
|
|
962
945
|
with EventPublisher() as pub:
|
|
963
946
|
pub.publish(
|
|
@@ -980,10 +963,6 @@ class ConfigurationManagerController(ConfigurationManagerInterface):
|
|
|
980
963
|
|
|
981
964
|
return int(setup_id) + 1
|
|
982
965
|
|
|
983
|
-
def get_listener_names(self):
|
|
984
|
-
"""Returns the names of the control servers that are listening for a new Setup."""
|
|
985
|
-
return self._control_server.get_listener_names()
|
|
986
|
-
|
|
987
966
|
|
|
988
967
|
class ConfigurationManagerCommand(ClientServerCommand):
|
|
989
968
|
pass
|
|
@@ -1119,7 +1098,6 @@ def get_status():
|
|
|
1119
1098
|
Monitoring port: {cm.get_monitoring_port()}
|
|
1120
1099
|
Commanding port: {cm.get_commanding_port()}
|
|
1121
1100
|
Service port: {cm.get_service_port()}
|
|
1122
|
-
Listeners: {", ".join(cm.get_listener_names())}
|
|
1123
1101
|
"""
|
|
1124
1102
|
)
|
|
1125
1103
|
except ConnectionError as exc:
|
|
@@ -62,9 +62,6 @@ Commands:
|
|
|
62
62
|
description: Submit a (new) Setup to the configuration manager. The Setup will be
|
|
63
63
|
assigned a unique identifier and committed to the git repository.
|
|
64
64
|
cmd: "{setup} {description} {replace}"
|
|
65
|
-
|
|
66
|
-
get_listener_names:
|
|
67
|
-
description: Returns a list of names of listeners that need to be notified when a new Setup is loaded.
|
|
68
65
|
|
|
69
66
|
# Commands that are mainly used by the ProcessManager
|
|
70
67
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from egse.log import logging
|
|
2
|
+
from egse.zmq_ser import connect_address
|
|
3
|
+
|
|
4
|
+
logger = logging.getLogger("egse.connect")
|
|
5
|
+
|
|
6
|
+
# random.seed(time.monotonic()) # uncomment for testing only, main application should set a seed.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_endpoint(
|
|
10
|
+
service_type: str,
|
|
11
|
+
protocol: str = None,
|
|
12
|
+
hostname: str = None,
|
|
13
|
+
port: int = 0,
|
|
14
|
+
):
|
|
15
|
+
"""
|
|
16
|
+
Returns the endpoint for a service, either from the registry or by constructing
|
|
17
|
+
it from protocol, hostname and port.
|
|
18
|
+
|
|
19
|
+
If port is 0 (the default), attempt to retrieve the endpoint from the service registry.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
service_type: The service type to look up in the registry.
|
|
23
|
+
protocol: Protocol to use if constructing the endpoint.
|
|
24
|
+
hostname: Hostname to use if constructing the endpoint.
|
|
25
|
+
port: Port to use if constructing the endpoint.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
The endpoint string.
|
|
29
|
+
|
|
30
|
+
Raises:
|
|
31
|
+
RuntimeError: If no endpoint can be determined.
|
|
32
|
+
"""
|
|
33
|
+
endpoint = None
|
|
34
|
+
from egse.registry.client import RegistryClient
|
|
35
|
+
|
|
36
|
+
if port == 0:
|
|
37
|
+
with RegistryClient() as reg:
|
|
38
|
+
endpoint = reg.get_endpoint(service_type)
|
|
39
|
+
if endpoint:
|
|
40
|
+
logger.info(f"Endpoint for {service_type} found in registry: {endpoint}")
|
|
41
|
+
else:
|
|
42
|
+
logger.warning(f"No endpoint for {service_type} found in registry.")
|
|
43
|
+
|
|
44
|
+
if not endpoint:
|
|
45
|
+
if port == 0:
|
|
46
|
+
raise RuntimeError(f"No service registered as {service_type} and no port provided.")
|
|
47
|
+
endpoint = connect_address(protocol, hostname, port)
|
|
48
|
+
logger.info(f"Endpoint constructed from protocol/hostname/port: {endpoint}")
|
|
49
|
+
|
|
50
|
+
return endpoint
|
|
@@ -634,6 +634,7 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
634
634
|
# FIXME: not sure if the stop heartbeat is necessary here, but I see that after
|
|
635
635
|
# a re-registration signal, the heartbeat socket is None.
|
|
636
636
|
# self.registry.stop_heartbeat()
|
|
637
|
+
|
|
637
638
|
self.register_service(self.service_type)
|
|
638
639
|
|
|
639
640
|
def register_service(self, service_type: str):
|
|
@@ -748,127 +749,3 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
748
749
|
"""
|
|
749
750
|
|
|
750
751
|
pass
|
|
751
|
-
|
|
752
|
-
def notify_listeners(self, event_id: int = 0, context: dict = None):
|
|
753
|
-
"""
|
|
754
|
-
Notifies registered listeners about an event.
|
|
755
|
-
|
|
756
|
-
This function creates an Event object with the provided `event_id` and `context`
|
|
757
|
-
and notifies all registered listeners with the created event.
|
|
758
|
-
|
|
759
|
-
Args:
|
|
760
|
-
event_id (int, optional): The identifier for the event. Defaults to 0.
|
|
761
|
-
context (dict, optional): Additional context information associated with the event.
|
|
762
|
-
Defaults to None.
|
|
763
|
-
|
|
764
|
-
Note:
|
|
765
|
-
The notification is performed by the `notify_listeners` method of the `listeners` object
|
|
766
|
-
associated with this instance.
|
|
767
|
-
The notification is executed in a daemon thread to avoid blocking the commanding
|
|
768
|
-
chain.
|
|
769
|
-
|
|
770
|
-
"""
|
|
771
|
-
from egse.listener import Event, EVENT_ID
|
|
772
|
-
|
|
773
|
-
self.logger.info(f"Notifying listeners for {EVENT_ID(event_id).name}")
|
|
774
|
-
|
|
775
|
-
retry_thread = threading.Thread(
|
|
776
|
-
target=self.listeners.notify_listeners, args=(Event(event_id=event_id, context=context),)
|
|
777
|
-
)
|
|
778
|
-
retry_thread.daemon = True
|
|
779
|
-
retry_thread.start()
|
|
780
|
-
|
|
781
|
-
def get_listener_names(self):
|
|
782
|
-
return self.listeners.get_listener_names()
|
|
783
|
-
|
|
784
|
-
def register_as_listener(self, proxy: Type, listener: dict):
|
|
785
|
-
"""
|
|
786
|
-
Registers a listener with the specified proxy.
|
|
787
|
-
|
|
788
|
-
This function attempts to add the provided listener to the specified proxy.
|
|
789
|
-
It employs a retry mechanism to handle potential ConnectionError exceptions,
|
|
790
|
-
making up to 5 attempts to add the listener.
|
|
791
|
-
|
|
792
|
-
Args:
|
|
793
|
-
proxy: A callable object representing the proxy to which the listener will be added.
|
|
794
|
-
listener (dict): The listener to be registered. Should be a dictionary containing
|
|
795
|
-
listener details.
|
|
796
|
-
|
|
797
|
-
Raises:
|
|
798
|
-
ConnectionError: If the connection to the proxy encounters issues even after
|
|
799
|
-
multiple retry attempts.
|
|
800
|
-
|
|
801
|
-
Note:
|
|
802
|
-
The function runs in a separate daemon thread to avoid blocking the main thread.
|
|
803
|
-
|
|
804
|
-
"""
|
|
805
|
-
|
|
806
|
-
@retry_with_exponential_backoff(exceptions=[ConnectionError])
|
|
807
|
-
def _add_listener(proxy, listener):
|
|
808
|
-
try:
|
|
809
|
-
with proxy() as x, x.get_service_proxy() as srv:
|
|
810
|
-
response = srv.add_listener(listener)
|
|
811
|
-
logger.info(f"Response from {proxy.__name__} service add_listener: {response}")
|
|
812
|
-
except Exception as exc:
|
|
813
|
-
logger.error(f"Caught {type_name(exc)}: {exc} – listener '{listener['name']}' could not be registered")
|
|
814
|
-
|
|
815
|
-
logger.info(f"Registering {self.__class__.__name__} as a listener to {proxy.__name__}")
|
|
816
|
-
|
|
817
|
-
retry_thread = threading.Thread(target=_add_listener, args=(proxy, listener))
|
|
818
|
-
retry_thread.daemon = True
|
|
819
|
-
retry_thread.start()
|
|
820
|
-
|
|
821
|
-
def unregister_as_listener(self, proxy: Type, listener: dict):
|
|
822
|
-
"""
|
|
823
|
-
Removes a registered listener from the specified proxy.
|
|
824
|
-
|
|
825
|
-
This function attempts to remove the provided listener from the specified proxy.
|
|
826
|
-
It employs a retry mechanism to handle potential ConnectionError exceptions,
|
|
827
|
-
making up to 5 attempts to add the listener.
|
|
828
|
-
|
|
829
|
-
Args:
|
|
830
|
-
proxy: A callable object representing the proxy from which the listener will be removed.
|
|
831
|
-
listener (dict): The listener to be removed. Should be a dictionary containing
|
|
832
|
-
listener details.
|
|
833
|
-
|
|
834
|
-
Raises:
|
|
835
|
-
ConnectionError: If the connection to the proxy encounters issues even after
|
|
836
|
-
multiple retry attempts.
|
|
837
|
-
|
|
838
|
-
Note:
|
|
839
|
-
The function runs in a separate thread but will block until the de-registration is finished.
|
|
840
|
-
The reason being that this method is usually called in a `after_serve` block so it needs to
|
|
841
|
-
finish before the ZeroMQ context is destroyed.
|
|
842
|
-
|
|
843
|
-
"""
|
|
844
|
-
|
|
845
|
-
@retry(times=5, exceptions=[ConnectionError])
|
|
846
|
-
def _remove_listener(proxy, listener):
|
|
847
|
-
with proxy() as x, x.get_service_proxy() as srv:
|
|
848
|
-
rc = srv.remove_listener(listener)
|
|
849
|
-
logger.debug(f"Response from remove_listener: {rc=}")
|
|
850
|
-
|
|
851
|
-
# Since we do not have the endpoint available, we can not check if the CS is active, and to get the endpoint
|
|
852
|
-
# we have to use the proxy anyway. So, let's use the proxy object to check if the CS is available.
|
|
853
|
-
|
|
854
|
-
try:
|
|
855
|
-
with proxy():
|
|
856
|
-
pass
|
|
857
|
-
except ConnectionError:
|
|
858
|
-
logger.warning(
|
|
859
|
-
f"The {proxy.__class__.__name__} endpoint is not responding, {listener['name']} not un-registered."
|
|
860
|
-
)
|
|
861
|
-
return
|
|
862
|
-
|
|
863
|
-
logger.info(f"Removing {self.__class__.__name__} as a listener from {proxy.__name__}")
|
|
864
|
-
|
|
865
|
-
retry_thread = threading.Thread(target=_remove_listener, args=(proxy, listener))
|
|
866
|
-
retry_thread.daemon = False
|
|
867
|
-
retry_thread.start()
|
|
868
|
-
|
|
869
|
-
# Block until the listener has been removed. This is needed because this unregister function will usually
|
|
870
|
-
# be called in the `after_server()` method of the control server (which is the listener) and if we do not
|
|
871
|
-
# wait until the thread is finished the ZeroMQ Context will be destroyed before the reply can be sent.
|
|
872
|
-
# Note: we could probably do without the thread, and directly call the `_remove_listener()` function.
|
|
873
|
-
|
|
874
|
-
retry_thread.join()
|
|
@@ -56,8 +56,6 @@ from egse.device import DeviceConnectionError
|
|
|
56
56
|
from egse.device import DeviceConnectionInterface
|
|
57
57
|
from egse.device import DeviceTimeoutError
|
|
58
58
|
from egse.device import DeviceTransport
|
|
59
|
-
from egse.listener import Event
|
|
60
|
-
from egse.listener import EventInterface
|
|
61
59
|
from egse.log import logger
|
|
62
60
|
from egse.protocol import CommandProtocol
|
|
63
61
|
from egse.proxy import Proxy
|
|
@@ -110,12 +108,6 @@ commands = attrdict(
|
|
|
110
108
|
"description": "Read a value from the device.",
|
|
111
109
|
},
|
|
112
110
|
"division": {"description": "Return a / b", "cmd": "{a} {b}"},
|
|
113
|
-
"handle_event": {
|
|
114
|
-
"description": "Notification of an event",
|
|
115
|
-
"device_method": "handle_event",
|
|
116
|
-
"cmd": "{event}",
|
|
117
|
-
"response": "handle_device_method",
|
|
118
|
-
},
|
|
119
111
|
}
|
|
120
112
|
)
|
|
121
113
|
|
|
@@ -172,7 +164,7 @@ class DummyInterface:
|
|
|
172
164
|
raise NotImplementedError("The division() method has not been loaded from the service.")
|
|
173
165
|
|
|
174
166
|
|
|
175
|
-
class DummyProxy(Proxy, DummyInterface
|
|
167
|
+
class DummyProxy(Proxy, DummyInterface):
|
|
176
168
|
"""
|
|
177
169
|
The Proxy class for the dummy device.
|
|
178
170
|
|
|
@@ -193,7 +185,7 @@ class DummyProxy(Proxy, DummyInterface, EventInterface):
|
|
|
193
185
|
super().__init__(connect_address(protocol, hostname, port), timeout=timeout)
|
|
194
186
|
|
|
195
187
|
|
|
196
|
-
class DummyController(DummyInterface
|
|
188
|
+
class DummyController(DummyInterface):
|
|
197
189
|
"""
|
|
198
190
|
The controller class for the dummy device.
|
|
199
191
|
|
|
@@ -214,32 +206,6 @@ class DummyController(DummyInterface, EventInterface):
|
|
|
214
206
|
def division(self, a, b) -> float:
|
|
215
207
|
return a / b
|
|
216
208
|
|
|
217
|
-
def handle_event(self, event: Event) -> str:
|
|
218
|
-
_exec_in_thread = False
|
|
219
|
-
|
|
220
|
-
def _handle_event(_event):
|
|
221
|
-
logger.info(f"An event is received, {_event=}")
|
|
222
|
-
logger.info(f"CM CS active? {is_control_server_active()}")
|
|
223
|
-
time.sleep(5.0)
|
|
224
|
-
logger.info(f"CM CS active? {is_control_server_active()}")
|
|
225
|
-
logger.info(f"An event is processed, {_event=}")
|
|
226
|
-
|
|
227
|
-
if _exec_in_thread:
|
|
228
|
-
# We execute this function in a daemon thread so the acknowledgment is
|
|
229
|
-
# sent back immediately (the ACK means 'command received and will be
|
|
230
|
-
# executed').
|
|
231
|
-
|
|
232
|
-
retry_thread = threading.Thread(target=_handle_event, args=(event,))
|
|
233
|
-
retry_thread.daemon = True
|
|
234
|
-
retry_thread.start()
|
|
235
|
-
else:
|
|
236
|
-
# An alternative to the daemon thread is to create a scheduled task that will be executed
|
|
237
|
-
# after the event is acknowledged.
|
|
238
|
-
|
|
239
|
-
self._cs.schedule_task(partial(_handle_event, event))
|
|
240
|
-
|
|
241
|
-
return "ACK"
|
|
242
|
-
|
|
243
209
|
|
|
244
210
|
class DummyProtocol(CommandProtocol):
|
|
245
211
|
"""
|
|
@@ -319,21 +285,6 @@ class DummyControlServer(ControlServer):
|
|
|
319
285
|
|
|
320
286
|
self.set_hk_delay(ctrl_settings.HK_DELAY)
|
|
321
287
|
|
|
322
|
-
from egse.confman import ConfigurationManagerProxy
|
|
323
|
-
from egse.listener import EVENT_ID
|
|
324
|
-
|
|
325
|
-
# The following import is needed because without this import, DummyProxy would
|
|
326
|
-
# be <class '__main__.DummyProxy'> instead of `egse.dummy.DummyProxy` and the
|
|
327
|
-
# ConfigurationManager control server will not be able to de-pickle
|
|
328
|
-
# the register message.
|
|
329
|
-
|
|
330
|
-
from egse.dummy import DummyProxy # noqa
|
|
331
|
-
|
|
332
|
-
self.register_as_listener(
|
|
333
|
-
proxy=ConfigurationManagerProxy,
|
|
334
|
-
listener={"name": "Dummy CS", "proxy": DummyProxy, "event_id": EVENT_ID.SETUP},
|
|
335
|
-
)
|
|
336
|
-
|
|
337
288
|
def get_communication_protocol(self):
|
|
338
289
|
return "tcp"
|
|
339
290
|
|
|
@@ -349,13 +300,11 @@ class DummyControlServer(ControlServer):
|
|
|
349
300
|
def get_storage_mnemonic(self):
|
|
350
301
|
return "DUMMY-HK"
|
|
351
302
|
|
|
352
|
-
def
|
|
353
|
-
logger.debug("
|
|
354
|
-
|
|
355
|
-
with contextlib.suppress(ModuleNotFoundError):
|
|
356
|
-
from egse.confman import ConfigurationManagerProxy
|
|
303
|
+
def before_serve(self) -> None:
|
|
304
|
+
logger.debug("Before Serve ...")
|
|
357
305
|
|
|
358
|
-
|
|
306
|
+
def after_serve(self):
|
|
307
|
+
logger.debug("After Serve ...")
|
|
359
308
|
|
|
360
309
|
|
|
361
310
|
class DummyDeviceEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
@@ -62,7 +62,7 @@ LOG_NAME_TO_LEVEL = {
|
|
|
62
62
|
|
|
63
63
|
# LOG_FORMAT_FILE = "%(asctime)s:%(processName)s:%(process)s:%(levelname)s:%(lineno)d:%(name)s:%(message)s"
|
|
64
64
|
LOG_FORMAT_FILE = (
|
|
65
|
-
"{asctime} [{levelname:>8s}] [{processName:>12s}] {message} ({process}:{package_name}:{filename}:{lineno:d})"
|
|
65
|
+
"{asctime} [{levelname:>8s}] [{processName:>12s}] {message} ({name}:{process}:{package_name}:{filename}:{lineno:d})"
|
|
66
66
|
)
|
|
67
67
|
LOG_FORMAT_FILE_STYLE = "{"
|
|
68
68
|
|
|
@@ -8,15 +8,14 @@ from egse.command import ClientServerCommand
|
|
|
8
8
|
from egse.connect import get_endpoint
|
|
9
9
|
from egse.control import is_control_server_active
|
|
10
10
|
from egse.decorators import dynamic_interface
|
|
11
|
-
from egse.listener import EventInterface, Event
|
|
12
11
|
from egse.plugin import entry_points
|
|
13
12
|
from egse.process import SubProcess
|
|
14
13
|
from egse.proxy import Proxy
|
|
15
14
|
from egse.registry.client import RegistryClient
|
|
16
15
|
from egse.settings import Settings
|
|
17
|
-
from egse.setup import Setup
|
|
16
|
+
from egse.setup import Setup
|
|
17
|
+
from egse.setup import load_setup
|
|
18
18
|
from egse.storage import is_storage_manager_active
|
|
19
|
-
from egse.zmq_ser import connect_address
|
|
20
19
|
|
|
21
20
|
HERE = Path(__file__).parent
|
|
22
21
|
LOGGER = logging.getLogger("egse.procman")
|
|
@@ -210,7 +209,7 @@ class ProcessManagerCommand(ClientServerCommand):
|
|
|
210
209
|
pass
|
|
211
210
|
|
|
212
211
|
|
|
213
|
-
class ProcessManagerInterface
|
|
212
|
+
class ProcessManagerInterface:
|
|
214
213
|
def __init__(self):
|
|
215
214
|
super().__init__()
|
|
216
215
|
self.setup = load_setup()
|
|
@@ -358,12 +357,6 @@ class ProcessManagerController(ProcessManagerInterface):
|
|
|
358
357
|
except AttributeError:
|
|
359
358
|
return {}
|
|
360
359
|
|
|
361
|
-
def handle_event(self, event: Event):
|
|
362
|
-
LOGGER.info(f"An event is received, {event=}")
|
|
363
|
-
LOGGER.info(f"Setup ID: {event.context['setup_id']}")
|
|
364
|
-
|
|
365
|
-
self.setup = load_setup(setup_id=event.context["setup_id"])
|
|
366
|
-
|
|
367
360
|
def start_process(self, start_cmd: StartCommand):
|
|
368
361
|
# subprocess.call(start_cmd.cmd, shell=True) -> PM hangs
|
|
369
362
|
process = SubProcess("MyApp", [start_cmd.cmd], shell=True)
|
|
@@ -12,10 +12,6 @@ Commands:
|
|
|
12
12
|
get_device_ids:
|
|
13
13
|
description: Returns a list of the identifiers of the devices in the current setup.
|
|
14
14
|
|
|
15
|
-
handle_event:
|
|
16
|
-
description: Notification of an event
|
|
17
|
-
cmd: '{event}'
|
|
18
|
-
|
|
19
15
|
start_process:
|
|
20
16
|
description: Starts a process
|
|
21
17
|
cmd: '{start_cmd}'
|
|
@@ -30,4 +26,4 @@ Commands:
|
|
|
30
26
|
|
|
31
27
|
get_device_process_status:
|
|
32
28
|
description: Returns the status of a process
|
|
33
|
-
cmd: '{status_cmd}'
|
|
29
|
+
cmd: '{status_cmd}'
|
|
@@ -6,7 +6,6 @@ Manager (from the setup).
|
|
|
6
6
|
The Process Manager Control Server is implemented as a standard control server.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import logging
|
|
10
9
|
import multiprocessing
|
|
11
10
|
import sys
|
|
12
11
|
|
|
@@ -15,12 +14,10 @@ import typer
|
|
|
15
14
|
import zmq
|
|
16
15
|
from rich.console import Console
|
|
17
16
|
|
|
18
|
-
from egse.confman import ConfigurationManagerProxy
|
|
19
17
|
from egse.control import ControlServer
|
|
20
|
-
from egse.
|
|
18
|
+
from egse.log import logging
|
|
21
19
|
from egse.logger import remote_logging
|
|
22
20
|
from egse.process import SubProcess
|
|
23
|
-
from egse.procman import ProcessManagerProxy
|
|
24
21
|
from egse.procman.procman_protocol import ProcessManagerProtocol
|
|
25
22
|
from egse.registry.client import RegistryClient
|
|
26
23
|
from egse.services import ServiceProxy
|
|
@@ -56,10 +53,6 @@ class ProcessManagerControlServer(ControlServer):
|
|
|
56
53
|
|
|
57
54
|
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
58
55
|
|
|
59
|
-
self.register_as_listener(
|
|
60
|
-
proxy=ConfigurationManagerProxy,
|
|
61
|
-
listener={"name": "Process Manager CS", "proxy": ProcessManagerProxy, "event_id": EVENT_ID.SETUP},
|
|
62
|
-
)
|
|
63
56
|
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
64
57
|
|
|
65
58
|
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
@@ -116,10 +109,6 @@ class ProcessManagerControlServer(ControlServer):
|
|
|
116
109
|
unregister_from_storage_manager(origin=self.get_storage_mnemonic())
|
|
117
110
|
|
|
118
111
|
def after_serve(self):
|
|
119
|
-
from egse.confman import ConfigurationManagerProxy
|
|
120
|
-
|
|
121
|
-
self.unregister_as_listener(proxy=ConfigurationManagerProxy, listener={"name": "Process Manager CS"})
|
|
122
|
-
|
|
123
112
|
self.deregister_service()
|
|
124
113
|
|
|
125
114
|
|
|
@@ -477,8 +477,15 @@ class RegistryClient:
|
|
|
477
477
|
def stop_heartbeat(self) -> None:
|
|
478
478
|
if self._hb_stop_event:
|
|
479
479
|
self._hb_stop_event.set()
|
|
480
|
-
if self._hb_thread
|
|
481
|
-
self._hb_thread.
|
|
480
|
+
if self._hb_thread:
|
|
481
|
+
if self._hb_thread.is_alive():
|
|
482
|
+
self.logger.debug(f"Heartbeat thread is alive, joining with timeout={THREAD_JOIN_TIMEOUT}s")
|
|
483
|
+
self._hb_thread.join(timeout=THREAD_JOIN_TIMEOUT)
|
|
484
|
+
else:
|
|
485
|
+
self.logger.debug("Heartbeat thread is not alive.")
|
|
486
|
+
self._hb_thread = None
|
|
487
|
+
else:
|
|
488
|
+
self.logger.debug("No heartbeat thread defined.")
|
|
482
489
|
|
|
483
490
|
def close(self) -> None:
|
|
484
491
|
"""Clean up resources."""
|
|
@@ -128,8 +128,6 @@ from egse.decorators import dynamic_interface
|
|
|
128
128
|
from egse.env import get_data_storage_location
|
|
129
129
|
from egse.env import get_site_id
|
|
130
130
|
from egse.exceptions import Error
|
|
131
|
-
from egse.listener import Event
|
|
132
|
-
from egse.listener import EventInterface
|
|
133
131
|
from egse.log import logger
|
|
134
132
|
from egse.obsid import ObservationIdentifier
|
|
135
133
|
from egse.obsid import TEST_LAB
|
|
@@ -715,7 +713,7 @@ def determine_counter_from_dir_list(location, pattern, index: int = -1):
|
|
|
715
713
|
return 1
|
|
716
714
|
|
|
717
715
|
|
|
718
|
-
class StorageController(StorageInterface
|
|
716
|
+
class StorageController(StorageInterface):
|
|
719
717
|
"""
|
|
720
718
|
The Storage Controller handles the registration of components, the start and end of an
|
|
721
719
|
observation/test and the dispatching of the persistence functions in save.
|
|
@@ -1051,27 +1049,12 @@ class StorageController(StorageInterface, EventInterface):
|
|
|
1051
1049
|
self._setup = setup
|
|
1052
1050
|
logger.info(f"Setup {setup.get_id()} loaded in the Storage manager.")
|
|
1053
1051
|
|
|
1054
|
-
def handle_event(self, event: Event) -> str:
|
|
1055
|
-
logger.info(f"An event is received, {event=}")
|
|
1056
|
-
|
|
1057
|
-
logger.warning(
|
|
1058
|
-
f"----------> This functionality has been replaced with the notification events and will be removed soon."
|
|
1059
|
-
)
|
|
1060
|
-
|
|
1061
|
-
# try:
|
|
1062
|
-
# if event.type == "new_setup":
|
|
1063
|
-
# self._cs.schedule_task(partial(self.load_setup, setup_id=event.context["setup_id"]))
|
|
1064
|
-
# except KeyError as exc:
|
|
1065
|
-
# return f"Expected event context to contain the following key: {exc}"
|
|
1066
|
-
|
|
1067
|
-
return "ACK"
|
|
1068
|
-
|
|
1069
1052
|
|
|
1070
1053
|
class StorageCommand(ClientServerCommand):
|
|
1071
1054
|
pass
|
|
1072
1055
|
|
|
1073
1056
|
|
|
1074
|
-
class StorageProxy(Proxy, StorageInterface
|
|
1057
|
+
class StorageProxy(Proxy, StorageInterface):
|
|
1075
1058
|
"""
|
|
1076
1059
|
The StorageProxy class is used to connect to the Storage Manager (control server) and
|
|
1077
1060
|
send commands remotely.
|