cgse 0.16.7__tar.gz → 0.16.9__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.7 → cgse-0.16.9}/PKG-INFO +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/proxy.py +15 -7
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/client.py +52 -126
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/server.py +2 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/storage_cs.py +2 -7
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_registry_service.py +0 -67
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/pyproject.toml +1 -1
- {cgse-0.16.7 → cgse-0.16.9}/service_registry.db +0 -0
- cgse-0.16.9/service_registry.db-shm +0 -0
- cgse-0.16.9/service_registry.db-wal +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/.gitignore +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/buffer_vat.log +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/buffer_vat.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/bump.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/conftest.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/bits.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/calibration.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/command.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/config.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/control.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/counter.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/decorators.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/device.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/dicts.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/dummy.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/env.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/exceptions.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/heartbeat.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/hk.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/listener.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/metrics.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/mixin.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/monitoring.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/observer.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/obsid.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/persistence.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/plugin.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/process.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/reload.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/settings.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/setup.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/api/system.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/custom_theme/main.html +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/docs.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/installation.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/nox.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/uv.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/getting_started.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/help.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/cli-cgse.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/grafana-queries.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/initialize.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/notifyhub.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/registry.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/libs/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/package_list.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/projects/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/roadmap.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/stylesheets/custom.css +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/stylesheets/extra.css +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/tutorial.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/user_guide/cli.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/docs/user_guide/index.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/duckdb_metrics.db +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/duckdb_metrics.db.wal +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/identifier.sqlite +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/justfile +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/justfile +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/cgse.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/log.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/scpi.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/setup.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/signal.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/socketdevice.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/system.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_log.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_metrics.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_plugin.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_process.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_state.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_start.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/_setup_core.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/async_control.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/async_control_claude.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/command.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/connect-todo.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/connect.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/control.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/dummy.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/listener.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/log_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/mixin.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/monitoring.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/client.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/server.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/test.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/services.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_async_control.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_client_server_interaction.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_cm_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_command.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_connect.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_control.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_dummy.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_event_notification.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_extensions.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_listener.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_mixin.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_notify_hub.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_server_running.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/mkdocs.yml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/noxfile.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_acs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_daq6510_central_heating.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_plot_readings.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/ruff.toml +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/scratch/advanced-process-monitoring.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/scratch/live-process-monitoring.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/scratch/match-case.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/scratch/processes.json +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/scratch/simple-process-monitoring.py +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/temperature_readings.log +0 -0
- {cgse-0.16.7 → cgse-0.16.9}/test_service_registry.db +0 -0
|
@@ -13,6 +13,7 @@ from types import MethodType
|
|
|
13
13
|
|
|
14
14
|
import zmq
|
|
15
15
|
|
|
16
|
+
from egse.connect import VERBOSE_DEBUG
|
|
16
17
|
from egse.decorators import dynamic_interface
|
|
17
18
|
from egse.log import logger
|
|
18
19
|
from egse.mixin import DynamicClientCommandMixin
|
|
@@ -102,7 +103,7 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
102
103
|
for a reply from the control server.
|
|
103
104
|
"""
|
|
104
105
|
|
|
105
|
-
self._logger =
|
|
106
|
+
self._logger = logger
|
|
106
107
|
|
|
107
108
|
self._ctx = zmq.Context.instance()
|
|
108
109
|
self._poller = zmq.Poller()
|
|
@@ -123,7 +124,8 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
123
124
|
self.disconnect_cs()
|
|
124
125
|
|
|
125
126
|
def connect_cs(self):
|
|
126
|
-
|
|
127
|
+
if VERBOSE_DEBUG:
|
|
128
|
+
self._logger.debug(f"Trying to connect {self.__class__.__name__} to {self._endpoint}")
|
|
127
129
|
|
|
128
130
|
self._socket = self._ctx.socket(zmq.REQ)
|
|
129
131
|
self._socket.connect(self._endpoint)
|
|
@@ -135,7 +137,8 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
135
137
|
self._poller.unregister(self._socket)
|
|
136
138
|
|
|
137
139
|
def reconnect_cs(self):
|
|
138
|
-
|
|
140
|
+
if VERBOSE_DEBUG:
|
|
141
|
+
self._logger.debug(f"Trying to reconnect {self.__class__.__name__} to {self._endpoint}")
|
|
139
142
|
|
|
140
143
|
if not self._socket.closed:
|
|
141
144
|
self._socket.close(linger=0)
|
|
@@ -145,7 +148,8 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
145
148
|
self._poller.register(self._socket, zmq.POLLIN)
|
|
146
149
|
|
|
147
150
|
def reset_cs_connection(self):
|
|
148
|
-
|
|
151
|
+
if VERBOSE_DEBUG:
|
|
152
|
+
self._logger.debug(f"Trying to reset the connection from {self.__class__.__name__} to {self._endpoint}")
|
|
149
153
|
|
|
150
154
|
self.disconnect_cs()
|
|
151
155
|
self.connect_cs()
|
|
@@ -191,7 +195,9 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
191
195
|
if self._socket.closed:
|
|
192
196
|
self.reconnect_cs()
|
|
193
197
|
|
|
194
|
-
|
|
198
|
+
if VERBOSE_DEBUG:
|
|
199
|
+
self._logger.debug(f"Sending '{data}'")
|
|
200
|
+
|
|
195
201
|
self._socket.send(pickle_string)
|
|
196
202
|
|
|
197
203
|
while True:
|
|
@@ -202,7 +208,8 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
202
208
|
if not pickle_string:
|
|
203
209
|
break
|
|
204
210
|
response = pickle.loads(pickle_string)
|
|
205
|
-
|
|
211
|
+
if VERBOSE_DEBUG:
|
|
212
|
+
self._logger.debug(f"Receiving response: {response}")
|
|
206
213
|
return response
|
|
207
214
|
else:
|
|
208
215
|
# timeout - server unavailable
|
|
@@ -227,7 +234,8 @@ class BaseProxy(ControlServerConnectionInterface):
|
|
|
227
234
|
|
|
228
235
|
def ping(self):
|
|
229
236
|
return_code = self.send("Ping", retries=0, timeout=1.0)
|
|
230
|
-
|
|
237
|
+
if VERBOSE_DEBUG:
|
|
238
|
+
self._logger.debug(f"Check if control server is available: Ping - {return_code}")
|
|
231
239
|
return return_code == "Pong"
|
|
232
240
|
|
|
233
241
|
def get_endpoint(self) -> str:
|
|
@@ -329,7 +329,7 @@ class RegistryClient:
|
|
|
329
329
|
metadata=self._service_info["metadata"],
|
|
330
330
|
)
|
|
331
331
|
|
|
332
|
-
def discover_service(self, service_type: str
|
|
332
|
+
def discover_service(self, service_type: str) -> dict[str, Any] | None:
|
|
333
333
|
"""
|
|
334
334
|
Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
|
|
335
335
|
|
|
@@ -341,15 +341,10 @@ class RegistryClient:
|
|
|
341
341
|
|
|
342
342
|
Args:
|
|
343
343
|
service_type: Type of service to discover
|
|
344
|
-
use_cache: Whether to use cached service information
|
|
345
344
|
|
|
346
345
|
Returns:
|
|
347
346
|
Service information if found, None otherwise
|
|
348
347
|
"""
|
|
349
|
-
# Try to use cache first if enabled
|
|
350
|
-
if use_cache:
|
|
351
|
-
self.logger.info("Cache not yet implemented.")
|
|
352
|
-
|
|
353
348
|
request = {"action": "discover", "service_type": service_type}
|
|
354
349
|
|
|
355
350
|
response = self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -363,14 +358,13 @@ class RegistryClient:
|
|
|
363
358
|
self.logger.warning(f"Service discovery failed: {response.get('error')}")
|
|
364
359
|
return None
|
|
365
360
|
|
|
366
|
-
def get_service(self, service_id: str | None = None
|
|
361
|
+
def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
|
|
367
362
|
"""
|
|
368
363
|
Get information about a specific service. When no service_id is given,
|
|
369
364
|
the service_id known to this client will be used.
|
|
370
365
|
|
|
371
366
|
Args:
|
|
372
367
|
service_id: ID of the service to get [default=None]
|
|
373
|
-
use_cache: Whether to use cached service information
|
|
374
368
|
|
|
375
369
|
Returns:
|
|
376
370
|
Service information if found, None otherwise.
|
|
@@ -461,6 +455,9 @@ class RegistryClient:
|
|
|
461
455
|
self.logger.warning("Cannot start heartbeat: no service is registered")
|
|
462
456
|
return None
|
|
463
457
|
|
|
458
|
+
# Cancel an existing heartbeat thread if present
|
|
459
|
+
self.stop_heartbeat()
|
|
460
|
+
|
|
464
461
|
# If interval not specified, use 1/3 of TTL
|
|
465
462
|
if interval is None:
|
|
466
463
|
interval = max(1, self._ttl // 3)
|
|
@@ -479,7 +476,7 @@ class RegistryClient:
|
|
|
479
476
|
self.logger.warning("ServiceRegistry not responding.")
|
|
480
477
|
return
|
|
481
478
|
else:
|
|
482
|
-
self.logger.info("Health check succeeded, reregistering
|
|
479
|
+
self.logger.info("Health check succeeded, reregistering...")
|
|
483
480
|
self.reregister()
|
|
484
481
|
|
|
485
482
|
else:
|
|
@@ -579,10 +576,6 @@ class AsyncRegistryClient:
|
|
|
579
576
|
|
|
580
577
|
self._event_handlers = {}
|
|
581
578
|
|
|
582
|
-
# Service cache (for discovery)
|
|
583
|
-
self._service_cache = {}
|
|
584
|
-
self._service_cache_lock = None
|
|
585
|
-
|
|
586
579
|
self.req_socket: zmq.asyncio.Socket | None = None
|
|
587
580
|
self.sub_socket: zmq.asyncio.Socket | None = None
|
|
588
581
|
self.hb_socket: zmq.asyncio.Socket | None = None
|
|
@@ -609,8 +602,6 @@ class AsyncRegistryClient:
|
|
|
609
602
|
# Default to receiving all events
|
|
610
603
|
self.sub_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
611
604
|
|
|
612
|
-
self._connect_hb_socket()
|
|
613
|
-
|
|
614
605
|
def _connect_hb_socket(self):
|
|
615
606
|
self.hb_socket = self.context.socket(zmq.REQ)
|
|
616
607
|
self.hb_socket.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages on close()
|
|
@@ -627,18 +618,12 @@ class AsyncRegistryClient:
|
|
|
627
618
|
self.sub_socket.close(linger=0)
|
|
628
619
|
self.sub_socket = None
|
|
629
620
|
|
|
630
|
-
self._disconnect_hb_socket()
|
|
631
|
-
|
|
632
621
|
def _disconnect_hb_socket(self):
|
|
633
622
|
if self.hb_socket:
|
|
634
|
-
self.hb_socket.
|
|
623
|
+
self.hb_socket.setsockopt(zmq.LINGER, 0)
|
|
624
|
+
self.hb_socket.close()
|
|
635
625
|
self.hb_socket = None
|
|
636
626
|
|
|
637
|
-
def _get_service_cache_lock(self):
|
|
638
|
-
if self._service_cache_lock is None:
|
|
639
|
-
self._service_cache_lock = asyncio.Lock()
|
|
640
|
-
return self._service_cache_lock
|
|
641
|
-
|
|
642
627
|
async def _send_request(
|
|
643
628
|
self, msg_type: MessageType, request: dict[str, Any], timeout: float = None
|
|
644
629
|
) -> dict[str, Any]:
|
|
@@ -653,10 +638,10 @@ class AsyncRegistryClient:
|
|
|
653
638
|
Returns:
|
|
654
639
|
The response from the registry as a dictionary.
|
|
655
640
|
"""
|
|
656
|
-
self.logger.debug(f"Sending request: {request}")
|
|
657
641
|
|
|
658
642
|
timeout = timeout or self.timeout
|
|
659
643
|
try:
|
|
644
|
+
self.logger.debug(f"Sending request: {request}")
|
|
660
645
|
await self.req_socket.send_multipart([msg_type.value, json.dumps(request).encode()])
|
|
661
646
|
|
|
662
647
|
try:
|
|
@@ -714,9 +699,9 @@ class AsyncRegistryClient:
|
|
|
714
699
|
except asyncio.TimeoutError:
|
|
715
700
|
self.logger.error(f"Heartbeat request timed out after {HEART_BEAT_TIMEOUT:.2f}s")
|
|
716
701
|
# Reset the socket to avoid invalid state
|
|
717
|
-
self.
|
|
718
|
-
|
|
719
|
-
self.
|
|
702
|
+
self._disconnect_hb_socket()
|
|
703
|
+
await asyncio.sleep(HEART_BEAT_RECONNECT)
|
|
704
|
+
self._connect_hb_socket()
|
|
720
705
|
return {"success": False, "error": "Heartbeat request timed out"}
|
|
721
706
|
except zmq.ZMQError as exc:
|
|
722
707
|
self.logger.error(f"ZMQ error: {exc}", exc_info=True)
|
|
@@ -816,6 +801,25 @@ class AsyncRegistryClient:
|
|
|
816
801
|
self.logger.error(f"Failed to deregister service: {response.get('error')}")
|
|
817
802
|
return False
|
|
818
803
|
|
|
804
|
+
async def reregister(self) -> str | None:
|
|
805
|
+
if not self._service_id:
|
|
806
|
+
self.logger.warning("Cannot reregister: no service is registered")
|
|
807
|
+
return None
|
|
808
|
+
|
|
809
|
+
if not self._service_info:
|
|
810
|
+
self.logger.warning(
|
|
811
|
+
"Cannot reregister: no service info was saved by this registry client or service already deregistered."
|
|
812
|
+
)
|
|
813
|
+
return None
|
|
814
|
+
|
|
815
|
+
return await self.register(
|
|
816
|
+
name=self._service_info["name"],
|
|
817
|
+
host=self._service_info["host"],
|
|
818
|
+
port=self._service_info["port"],
|
|
819
|
+
service_type=self._service_info["type"],
|
|
820
|
+
metadata=self._service_info["metadata"],
|
|
821
|
+
)
|
|
822
|
+
|
|
819
823
|
async def start_heartbeat(self, interval: int | None = None) -> asyncio.Task | None:
|
|
820
824
|
"""
|
|
821
825
|
Start sending heartbeats to the registry.
|
|
@@ -840,6 +844,8 @@ class AsyncRegistryClient:
|
|
|
840
844
|
self._running = True
|
|
841
845
|
|
|
842
846
|
async def heartbeat_loop():
|
|
847
|
+
self._connect_hb_socket()
|
|
848
|
+
|
|
843
849
|
try:
|
|
844
850
|
while self._running and self._service_id:
|
|
845
851
|
try:
|
|
@@ -849,8 +855,17 @@ class AsyncRegistryClient:
|
|
|
849
855
|
|
|
850
856
|
if not response.get("success"):
|
|
851
857
|
self.logger.warning(f"Heartbeat failed: {response.get('error')}")
|
|
858
|
+
|
|
859
|
+
# Do a health check
|
|
860
|
+
if not await self.health_check():
|
|
861
|
+
self.logger.warning("ServiceRegistry not responding.")
|
|
862
|
+
continue
|
|
863
|
+
else:
|
|
864
|
+
self.logger.info("Health check succeeded, reregistering...")
|
|
865
|
+
await self.reregister()
|
|
866
|
+
|
|
852
867
|
else:
|
|
853
|
-
self.logger.
|
|
868
|
+
self.logger.debug(response.get("message"))
|
|
854
869
|
except Exception as exc:
|
|
855
870
|
self.logger.error(f"Error in heartbeat loop: {exc}", exc_info=True)
|
|
856
871
|
|
|
@@ -858,6 +873,8 @@ class AsyncRegistryClient:
|
|
|
858
873
|
await asyncio.sleep(interval)
|
|
859
874
|
except asyncio.CancelledError:
|
|
860
875
|
self.logger.info("Heartbeat task cancelled")
|
|
876
|
+
finally:
|
|
877
|
+
self._disconnect_hb_socket()
|
|
861
878
|
|
|
862
879
|
# Start the heartbeat task
|
|
863
880
|
self._heartbeat_task = task = asyncio.create_task(heartbeat_loop())
|
|
@@ -960,9 +977,6 @@ class AsyncRegistryClient:
|
|
|
960
977
|
|
|
961
978
|
self.logger.debug(f"Received event: {event_type}")
|
|
962
979
|
|
|
963
|
-
# Update service cache based on events
|
|
964
|
-
await self._update_cache_from_event(event_type, event)
|
|
965
|
-
|
|
966
980
|
# Call registered handlers
|
|
967
981
|
handlers = self._event_handlers.get(event_type, [])
|
|
968
982
|
for handler in handlers:
|
|
@@ -990,30 +1004,7 @@ class AsyncRegistryClient:
|
|
|
990
1004
|
self.logger.info("Started event listener task")
|
|
991
1005
|
return task
|
|
992
1006
|
|
|
993
|
-
async def
|
|
994
|
-
"""
|
|
995
|
-
Update the service cache based on registry events.
|
|
996
|
-
|
|
997
|
-
Args:
|
|
998
|
-
event_type: Type of the event.
|
|
999
|
-
event: Event data
|
|
1000
|
-
"""
|
|
1001
|
-
async with self._get_service_cache_lock():
|
|
1002
|
-
data = event.get("data", {})
|
|
1003
|
-
service_id = data.get("service_id")
|
|
1004
|
-
|
|
1005
|
-
if not service_id:
|
|
1006
|
-
return
|
|
1007
|
-
|
|
1008
|
-
if event_type == "register":
|
|
1009
|
-
service_info = data.get("service_info", {})
|
|
1010
|
-
if service_info:
|
|
1011
|
-
self._service_cache[service_id] = service_info
|
|
1012
|
-
elif event_type in ("deregister", "expire"):
|
|
1013
|
-
if service_id in self._service_cache:
|
|
1014
|
-
del self._service_cache[service_id]
|
|
1015
|
-
|
|
1016
|
-
async def discover_service(self, service_type: str, use_cache: bool = True) -> dict[str, Any] | None:
|
|
1007
|
+
async def discover_service(self, service_type: str) -> dict[str, Any] | None:
|
|
1017
1008
|
"""
|
|
1018
1009
|
Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
|
|
1019
1010
|
|
|
@@ -1025,27 +1016,11 @@ class AsyncRegistryClient:
|
|
|
1025
1016
|
|
|
1026
1017
|
Args:
|
|
1027
1018
|
service_type: Type of service to discover
|
|
1028
|
-
use_cache: Whether to use cached service information
|
|
1029
1019
|
|
|
1030
1020
|
Returns:
|
|
1031
1021
|
Service information if found, None otherwise
|
|
1032
1022
|
"""
|
|
1033
|
-
|
|
1034
|
-
if use_cache:
|
|
1035
|
-
async with self._get_service_cache_lock():
|
|
1036
|
-
# Find services of the specified type
|
|
1037
|
-
matching_services = []
|
|
1038
|
-
for service_id, service_info in self._service_cache.items():
|
|
1039
|
-
if service_info.get("type") == service_type or service_type in service_info.get("tags", []):
|
|
1040
|
-
matching_services.append(service_info)
|
|
1041
|
-
|
|
1042
|
-
if matching_services:
|
|
1043
|
-
# Simple load balancing - random selection
|
|
1044
|
-
import random
|
|
1045
|
-
|
|
1046
|
-
return random.choice(matching_services)
|
|
1047
|
-
|
|
1048
|
-
# If not found in cache or cache disabled, ask the registry
|
|
1023
|
+
|
|
1049
1024
|
request = {"action": "discover", "service_type": service_type}
|
|
1050
1025
|
|
|
1051
1026
|
response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -1055,34 +1030,25 @@ class AsyncRegistryClient:
|
|
|
1055
1030
|
if response.get("success"):
|
|
1056
1031
|
service = response.get("service")
|
|
1057
1032
|
|
|
1058
|
-
# Update cache
|
|
1059
|
-
if service and "id" in service:
|
|
1060
|
-
async with self._get_service_cache_lock():
|
|
1061
|
-
self._service_cache[service["id"]] = service
|
|
1062
|
-
|
|
1063
1033
|
return service
|
|
1064
1034
|
else:
|
|
1065
1035
|
self.logger.warning(f"Service discovery failed: {response.get('error')}")
|
|
1066
1036
|
return None
|
|
1067
1037
|
|
|
1068
|
-
async def get_service(self, service_id: str
|
|
1038
|
+
async def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
|
|
1069
1039
|
"""
|
|
1070
|
-
Get information about a specific service.
|
|
1040
|
+
Get information about a specific service. When no service_id is given,
|
|
1041
|
+
the service_id known to this client will be used.
|
|
1071
1042
|
|
|
1072
1043
|
Args:
|
|
1073
1044
|
service_id: ID of the service to get
|
|
1074
|
-
use_cache: Whether to use cached service information
|
|
1075
1045
|
|
|
1076
1046
|
Returns:
|
|
1077
1047
|
Service information if found, None otherwise
|
|
1078
1048
|
"""
|
|
1079
|
-
# Try to use cache first if enabled
|
|
1080
|
-
if use_cache:
|
|
1081
|
-
async with self._get_service_cache_lock():
|
|
1082
|
-
if service_id in self._service_cache:
|
|
1083
|
-
return self._service_cache[service_id]
|
|
1084
1049
|
|
|
1085
|
-
|
|
1050
|
+
service_id = service_id or self._service_id
|
|
1051
|
+
|
|
1086
1052
|
request = {"action": "get", "service_id": service_id}
|
|
1087
1053
|
|
|
1088
1054
|
response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
|
|
@@ -1090,11 +1056,6 @@ class AsyncRegistryClient:
|
|
|
1090
1056
|
if response.get("success"):
|
|
1091
1057
|
service = response.get("service")
|
|
1092
1058
|
|
|
1093
|
-
# Update cache
|
|
1094
|
-
if service:
|
|
1095
|
-
async with self._get_service_cache_lock():
|
|
1096
|
-
self._service_cache[service_id] = service
|
|
1097
|
-
|
|
1098
1059
|
return service
|
|
1099
1060
|
else:
|
|
1100
1061
|
self.logger.warning(f"Get service failed: {response.get('error')}")
|
|
@@ -1117,12 +1078,6 @@ class AsyncRegistryClient:
|
|
|
1117
1078
|
if response.get("success"):
|
|
1118
1079
|
services = response.get("services", [])
|
|
1119
1080
|
|
|
1120
|
-
# Update cache
|
|
1121
|
-
async with self._get_service_cache_lock():
|
|
1122
|
-
for service in services:
|
|
1123
|
-
if "id" in service:
|
|
1124
|
-
self._service_cache[service["id"]] = service
|
|
1125
|
-
|
|
1126
1081
|
return services
|
|
1127
1082
|
else:
|
|
1128
1083
|
self.logger.warning(f"List services failed: {response.get('error')}")
|
|
@@ -1192,35 +1147,6 @@ class AsyncRegistryClient:
|
|
|
1192
1147
|
except Exception as exc:
|
|
1193
1148
|
self.logger.error(f"Error during cleanup: {exc}")
|
|
1194
1149
|
|
|
1195
|
-
@asynccontextmanager
|
|
1196
|
-
async def register_context(self, *args, **kwargs):
|
|
1197
|
-
"""
|
|
1198
|
-
Async context manager for service registration.
|
|
1199
|
-
|
|
1200
|
-
Example:
|
|
1201
|
-
async with client.register_context("my-service", "localhost", 8080):
|
|
1202
|
-
# Service is registered
|
|
1203
|
-
await app.start()
|
|
1204
|
-
# Service is automatically deregistered
|
|
1205
|
-
"""
|
|
1206
|
-
service_id = await self.register(*args, **kwargs)
|
|
1207
|
-
|
|
1208
|
-
if not service_id:
|
|
1209
|
-
raise RuntimeError("Failed to register service")
|
|
1210
|
-
|
|
1211
|
-
# Start heartbeat and event listener
|
|
1212
|
-
await self.start_heartbeat()
|
|
1213
|
-
await self.start_event_listener()
|
|
1214
|
-
|
|
1215
|
-
try:
|
|
1216
|
-
yield service_id
|
|
1217
|
-
finally:
|
|
1218
|
-
# Clean up
|
|
1219
|
-
await self.stop_event_listener()
|
|
1220
|
-
await self.stop_heartbeat()
|
|
1221
|
-
await self.deregister()
|
|
1222
|
-
# await self.close() # client shall not be closed by this context manager !!
|
|
1223
|
-
|
|
1224
1150
|
|
|
1225
1151
|
def is_service_registered(service_type: str):
|
|
1226
1152
|
"""Convenience function to check if a service is registered."""
|
|
@@ -490,6 +490,7 @@ class AsyncRegistryServer:
|
|
|
490
490
|
"status": "ok",
|
|
491
491
|
"req_port": self.req_port,
|
|
492
492
|
"pub_port": self.pub_port,
|
|
493
|
+
"hb_port": self.hb_port,
|
|
493
494
|
"services": services,
|
|
494
495
|
}
|
|
495
496
|
|
|
@@ -577,6 +578,7 @@ async def status(
|
|
|
577
578
|
Status: {response["status"]}
|
|
578
579
|
Requests port: {response["req_port"]}
|
|
579
580
|
Notifications port: {response["pub_port"]}
|
|
581
|
+
Heartbeat port: {response["hb_port"]}
|
|
580
582
|
Registrations: {", ".join([f"({x['name']}, {x['health']})" for x in response["services"]])}\
|
|
581
583
|
"""
|
|
582
584
|
)
|
|
@@ -62,6 +62,8 @@ class StorageControlServer(ControlServer):
|
|
|
62
62
|
|
|
63
63
|
multiprocessing.current_process().name = PROCESS_NAME
|
|
64
64
|
|
|
65
|
+
self.scheduler: BackgroundScheduler | None = None
|
|
66
|
+
|
|
65
67
|
self.logger = logger
|
|
66
68
|
self.service_name = PROCESS_NAME
|
|
67
69
|
self.service_type = SERVICE_TYPE
|
|
@@ -76,13 +78,6 @@ class StorageControlServer(ControlServer):
|
|
|
76
78
|
|
|
77
79
|
self.register_service(service_type=SERVICE_TYPE)
|
|
78
80
|
|
|
79
|
-
# NOTE:
|
|
80
|
-
# Since the CM CS is started after the SM CS in the normal startup sequence, delay the task to load
|
|
81
|
-
# the Setup until after the CM CS has been properly started. We do that now with a delay time of 30s,
|
|
82
|
-
# but we might in the future use a function returning a boolean, until...
|
|
83
|
-
# from egse.confman import is_configuration_manager_active
|
|
84
|
-
# self.schedule_task(self.device_protocol.controller.load_setup, after=10.0, when=is_configuration_manager_active)
|
|
85
|
-
|
|
86
81
|
def before_serve(self):
|
|
87
82
|
self.scheduler = BackgroundScheduler(timezone=utc)
|
|
88
83
|
self.scheduler.start()
|
|
@@ -787,70 +787,3 @@ async def test_client_health_check(client, server):
|
|
|
787
787
|
"""Test health check."""
|
|
788
788
|
health = await client.health_check()
|
|
789
789
|
assert health is True
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
@pytest.mark.asyncio
|
|
793
|
-
async def test_client_caching(client, server):
|
|
794
|
-
"""Test client's service caching."""
|
|
795
|
-
|
|
796
|
-
service_id = await client.register("cache-test-service", "localhost", 8080, service_type="cache-test")
|
|
797
|
-
|
|
798
|
-
# Look up the service (should populate cache)
|
|
799
|
-
service = await client.get_service(service_id)
|
|
800
|
-
assert service is not None
|
|
801
|
-
|
|
802
|
-
# Check if it's in the cache
|
|
803
|
-
async with client._service_cache_lock:
|
|
804
|
-
assert service_id in client._service_cache
|
|
805
|
-
|
|
806
|
-
# Look up by type (should use cache when use_cache=True)
|
|
807
|
-
with patch.object(client, "_send_request", new_callable=AsyncMock) as mock_send:
|
|
808
|
-
# First call with use_cache=True should check cache
|
|
809
|
-
service = await client.discover_service("cache-test", use_cache=True)
|
|
810
|
-
assert service is not None
|
|
811
|
-
assert service["id"] == service_id
|
|
812
|
-
|
|
813
|
-
# Configure the mock to return a dictionary that matches what _send_request would return
|
|
814
|
-
mock_send.return_value = {
|
|
815
|
-
"success": True,
|
|
816
|
-
"service": {
|
|
817
|
-
"id": service_id,
|
|
818
|
-
"name": "cache-test-service",
|
|
819
|
-
"host": "localhost",
|
|
820
|
-
"port": 8080,
|
|
821
|
-
"type": "cache-test",
|
|
822
|
-
},
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
# Second call with use_cache=False should make a request
|
|
826
|
-
service = await client.discover_service("cache-test", use_cache=False)
|
|
827
|
-
assert service is not None
|
|
828
|
-
assert mock_send.called
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
@pytest.mark.asyncio
|
|
832
|
-
async def test_client_register_context(client, server, req_socket):
|
|
833
|
-
"""Test the register_context context manager."""
|
|
834
|
-
|
|
835
|
-
# Use the context manager
|
|
836
|
-
async with client.register_context(
|
|
837
|
-
"context-test-service", "localhost", 8080, service_type="context-test"
|
|
838
|
-
) as service_id:
|
|
839
|
-
# Verify the service was registered
|
|
840
|
-
response = await send_request(
|
|
841
|
-
MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
|
|
842
|
-
)
|
|
843
|
-
|
|
844
|
-
logger.info(f"----- In test_client_register_context: {response}")
|
|
845
|
-
|
|
846
|
-
assert response["success"] is True
|
|
847
|
-
assert response["service"]["name"] == "context-test-service"
|
|
848
|
-
|
|
849
|
-
logger.info("----- In test_client_register_context: after context...")
|
|
850
|
-
|
|
851
|
-
# After exiting the context, the service should be deregistered
|
|
852
|
-
response = await send_request(
|
|
853
|
-
MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
|
|
854
|
-
)
|
|
855
|
-
|
|
856
|
-
assert response["success"] is False
|
|
index e914731..6227ca3 100644
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|