cgse 0.15.1__tar.gz → 0.16.0__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.15.1 → cgse-0.16.0}/PKG-INFO +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/installation.md +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/plugins.md +16 -7
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/uv.md +5 -5
- {cgse-0.15.1 → cgse-0.16.0}/docs/getting_started.md +17 -9
- {cgse-0.15.1 → cgse-0.16.0}/docs/initialize.md +6 -6
- cgse-0.16.0/docs/package_list.md +25 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/cgse_common/cgse.py +1 -1
- cgse-0.16.0/libs/cgse-common/src/egse/connect.py +369 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/env.py +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/system.py +2 -2
- cgse-0.16.0/libs/cgse-common/tests/test_connect.py +200 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/pyproject.toml +3 -3
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/services.py +30 -8
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/settings.yaml +17 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/async_control.py +9 -4
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/confman/__init__.py +31 -19
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/confman/confman_cs.py +45 -23
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/control.py +4 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/logger/log_cs.py +5 -8
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/monitoring.py +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/procman/__init__.py +3 -3
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/procman/procman_cs.py +45 -23
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/protocol.py +2 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/registry/client.py +0 -1
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/storage/__init__.py +22 -12
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/storage/storage_cs.py +47 -23
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/pyproject.toml +1 -1
- {cgse-0.15.1 → cgse-0.16.0}/service_registry.db +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/service_registry.db-shm +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/service_registry.db-wal +0 -0
- cgse-0.15.1/docs/package_list.md +0 -24
- {cgse-0.15.1 → cgse-0.16.0}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/.gitignore +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/buffer_vat.log +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/buffer_vat.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/bump.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/conftest.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/bits.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/calibration.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/command.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/config.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/control.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/counter.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/decorators.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/device.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/dicts.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/dummy.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/env.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/exceptions.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/heartbeat.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/hk.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/listener.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/metrics.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/mixin.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/monitoring.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/observer.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/obsid.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/persistence.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/plugin.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/process.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/reload.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/settings.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/setup.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/api/system.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/custom_theme/main.html +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/docs.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/nox.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/help.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/cli-cgse.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/grafana-queries.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-core/notifyhub.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-core/registry.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/libs/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/projects/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/roadmap.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/stylesheets/custom.css +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/stylesheets/extra.css +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/tutorial.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/user_guide/cli.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/docs/user_guide/index.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/duckdb_metrics.db +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/duckdb_metrics.db.wal +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/identifier.sqlite +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/justfile +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/justfile +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/log.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/scpi.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/setup.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/signal.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/socketdevice.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_log.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_metrics.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_plugin.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_process.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_state.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/_start.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/_setup_core.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/async_control_claude.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/command.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/dummy.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/listener.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/mixin.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/client.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/notifyhub/test.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/proxy.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/registry/server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/services.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_async_control.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_client_server_interaction.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_cm_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_command.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_control.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_dummy.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_event_notification.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_extensions.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_listener.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_mixin.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_notify_hub.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_registry_service.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_server_running.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/mkdocs.yml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/noxfile.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_acs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/tests/script_daq6510_central_heating.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/tests/script_plot_readings.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/ruff.toml +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/scratch/advanced-process-monitoring.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/scratch/live-process-monitoring.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/scratch/match-case.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/scratch/processes.json +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/scratch/simple-process-monitoring.py +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/temperature_readings.log +0 -0
- {cgse-0.15.1 → cgse-0.16.0}/test_service_registry.db +0 -0
|
@@ -163,17 +163,26 @@ explore = "<package>.cgse_explore"
|
|
|
163
163
|
So, what happens is that a command that wants to apply a functionality on an external package
|
|
164
164
|
loads the `cgse_explore.py` module for that package and checks if a function with a specific
|
|
165
165
|
name exists in that module. It then executes that function. For the `show procs` command, the
|
|
166
|
-
function `show_processes` is expected and it shall return a list of
|
|
167
|
-
|
|
166
|
+
function `show_processes` is expected, and it shall return a list of ProcessInfo objects which
|
|
167
|
+
will be used to print a nice process table. This entry-point is currently implemented for `cgse-core` and
|
|
168
168
|
`cgse-dummy` (an external demo package) and when you run the `cgse show procs` command it looks
|
|
169
169
|
something like below (the format is from the unix `ps -ef` command).
|
|
170
170
|
|
|
171
171
|
```text
|
|
172
|
-
➜
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
172
|
+
➜ cgse show procs
|
|
173
|
+
Process Information
|
|
174
|
+
┏━━━━━━━┳━━━━━━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
175
|
+
┃ PID ┃ Name ┃ User ┃ CPU% ┃ Memory MB ┃ Status ┃ Command ┃
|
|
176
|
+
┡━━━━━━━╇━━━━━━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
|
|
177
|
+
│ 94461 │ python3.12 │ rik │ 0.0 │ 46.9 │ running │ python -m cgse_dummy.dummy_sim start │
|
|
178
|
+
│ 94554 │ python3.12 │ rik │ 0.0 │ 124.1 │ running │ python -m cgse_dummy.dummy_cs start │
|
|
179
|
+
│ 94360 │ python3.12 │ rik │ 0.0 │ 121.3 │ running │ python -m egse.registry.server start --log-level WARNING │
|
|
180
|
+
│ 94361 │ python3.12 │ rik │ 0.0 │ 49.6 │ running │ python -m egse.logger.log_cs start │
|
|
181
|
+
│ 94362 │ python3.12 │ rik │ 0.0 │ 40.5 │ running │ python -m egse.notifyhub.server start │
|
|
182
|
+
│ 94363 │ python3.12 │ rik │ 0.0 │ 125.9 │ running │ python -m egse.storage.storage_cs start │
|
|
183
|
+
│ 94364 │ python3.12 │ rik │ 0.0 │ 126.1 │ running │ python -m egse.confman.confman_cs start │
|
|
184
|
+
│ 94365 │ python3.12 │ rik │ 0.0 │ 125.6 │ running │ python -m egse.procman.procman_cs start │
|
|
185
|
+
└───────┴────────────┴──────┴──────┴───────────┴─────────┴──────────────────────────────────────────────────────────┘
|
|
177
186
|
```
|
|
178
187
|
|
|
179
188
|
## Register resources
|
|
@@ -28,7 +28,7 @@ Python, but currently these have not been tested. So, we will for the moment sti
|
|
|
28
28
|
3.9.20. Install this version as follows:
|
|
29
29
|
|
|
30
30
|
```shell
|
|
31
|
-
$ uv python install 3.
|
|
31
|
+
$ uv python install 3.10
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
!!! note "`pyenv`"
|
|
@@ -38,7 +38,7 @@ $ uv python install 3.9.20
|
|
|
38
38
|
error. This is a known issue with `uv`.
|
|
39
39
|
|
|
40
40
|
```
|
|
41
|
-
pyenv: version `3.
|
|
41
|
+
pyenv: version `3.10.16' is not installed (set by /Users/rik/github/cgse/libs/cgse-common/.python-version)
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
You can check which Python versions are installed already on your system:
|
|
@@ -67,7 +67,7 @@ You can check which Python versions are installed already on your system:
|
|
|
67
67
|
You can pin a python version with the command:
|
|
68
68
|
|
|
69
69
|
```
|
|
70
|
-
$ uv python pin 3.
|
|
70
|
+
$ uv python pin 3.10
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
`uv` will search for a pinned version in the parent folders up to the root folder or your home directory.
|
|
@@ -83,7 +83,7 @@ When creating a virtual environment make sure you are in the root folder, e.g. `
|
|
|
83
83
|
|
|
84
84
|
```shell
|
|
85
85
|
$ cd ~/github/cgse
|
|
86
|
-
$ uv venv --python 3.
|
|
86
|
+
$ uv venv --python 3.10
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
If you want to name your virtual environment, use the optional argument `--prompt <venv name>` in
|
|
@@ -103,7 +103,7 @@ with the command:
|
|
|
103
103
|
|
|
104
104
|
```shell
|
|
105
105
|
$ uv pip list -v
|
|
106
|
-
Using Python 3.
|
|
106
|
+
Using Python 3.10.16 environment at: /Users/rik/github/cgse/.venv
|
|
107
107
|
Package Version Editable project location
|
|
108
108
|
----------------- ----------- ---------------------------------------
|
|
109
109
|
apscheduler 3.11.0
|
|
@@ -2,19 +2,27 @@ All you need to get started using and building the CGSE.
|
|
|
2
2
|
|
|
3
3
|
## Requirements
|
|
4
4
|
|
|
5
|
-
- Python 3.
|
|
5
|
+
- Python 3.10.x (we do not yet support higher versions, but are working to extend the list)
|
|
6
6
|
- macOS or Linux
|
|
7
7
|
|
|
8
8
|
## Virtual environment
|
|
9
9
|
|
|
10
10
|
You should always work inside a virtual environment to somehow containerize your project such that it doesn't
|
|
11
11
|
pollute your global environment and you can run different projects next to each other. Create and activate a new
|
|
12
|
-
virtual environment as follows. It should be Python >= 3.
|
|
12
|
+
virtual environment as follows. It should be Python >= 3.10.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
=== "venv"
|
|
15
|
+
|
|
16
|
+
```shell
|
|
17
|
+
$ python -m venv venv
|
|
18
|
+
$ source venv/bin/activate
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
=== "uv"
|
|
22
|
+
|
|
23
|
+
```shell
|
|
24
|
+
$ uv venv --python 3.10
|
|
25
|
+
```
|
|
18
26
|
|
|
19
27
|
## Installation
|
|
20
28
|
|
|
@@ -26,7 +34,7 @@ with the `cgse-common` which contains all common code that is generic and useful
|
|
|
26
34
|
$ pip install cgse-common
|
|
27
35
|
```
|
|
28
36
|
|
|
29
|
-
Check the [list of packages](./package_list.md) that are part of the CGSE
|
|
37
|
+
Check the [list of packages](./package_list.md) that are part of the CGSE monorepo and can be installed with `pip`. The
|
|
30
38
|
packages are described in more detail in the sections [Libs](./libs/index.md) and [Projects](./projects/index.md).
|
|
31
39
|
|
|
32
40
|
## Set up your environment
|
|
@@ -38,8 +46,8 @@ probably be higher and more lines will appear when other packages are installed.
|
|
|
38
46
|
|
|
39
47
|
```shell
|
|
40
48
|
$ py -m egse.version
|
|
41
|
-
CGSE version in Settings: 0.
|
|
42
|
-
Installed version for cgse-common= 0.
|
|
49
|
+
CGSE version in Settings: 0.15.1
|
|
50
|
+
Installed version for cgse-common= 0.15.1
|
|
43
51
|
```
|
|
44
52
|
|
|
45
53
|
Check your environment with the command below. This will probably print out some warning since you have not defined
|
|
@@ -19,9 +19,9 @@ You should now have at least the follow three packages installed in your virtual
|
|
|
19
19
|
|
|
20
20
|
```text
|
|
21
21
|
$ pip list | grep cgse
|
|
22
|
-
cgse-common 0.
|
|
23
|
-
cgse-core 0.
|
|
24
|
-
cgse-tools 0.
|
|
22
|
+
cgse-common 0.15.1
|
|
23
|
+
cgse-core 0.15.1
|
|
24
|
+
cgse-tools 0.15.1
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
## The `cgse` command
|
|
@@ -61,9 +61,9 @@ version of the different components, use:
|
|
|
61
61
|
|
|
62
62
|
```text
|
|
63
63
|
$ cgse version
|
|
64
|
-
CGSE-COMMON installed version = 0.
|
|
65
|
-
CGSE-CORE installed version = 0.
|
|
66
|
-
CGSE-TOOLS installed version = 0.
|
|
64
|
+
CGSE-COMMON installed version = 0.15.1 — Software framework to support hardware testing
|
|
65
|
+
CGSE-CORE installed version = 0.15.1 — Core services for the CGSE framework
|
|
66
|
+
CGSE-TOOLS installed version = 0.15.1 — Tools for CGSE
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
We will for now concentrate on the `init` command. This command will guide us through a number of
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Packages in the CGSE
|
|
2
|
+
|
|
3
|
+
The CGSE is a monorepo and consists of numerous packages. Each of these packages are individually installable from
|
|
4
|
+
PyPI. We maintain a list here with all the packages in the monorepo.
|
|
5
|
+
|
|
6
|
+
| Package | Description |
|
|
7
|
+
|-------------------------|--------------------------------------------------------|
|
|
8
|
+
| `cgse-common` | The common code used by all other packages |
|
|
9
|
+
| `cgse-core` | The core services |
|
|
10
|
+
| `cgse-coordinates` | Coordinate reference Frames |
|
|
11
|
+
| `cgse-gui` | GUI components and styles (PyQt5) |
|
|
12
|
+
| `cgse-tools` | Plugin that adds functions to the `cgse` command |
|
|
13
|
+
| `symetrie-hexapod` | Device drivers for the Symétrie Hexapods |
|
|
14
|
+
| `keithley-tempcontrol` | Device driver for the Keithley temperature controller |
|
|
15
|
+
| `lakeshore-tempcontrol` | Device driver for the LakeShore temperature controller |
|
|
16
|
+
| `plato-fits` | FITS driver with PLATO specific format |
|
|
17
|
+
| `plato-hdf5` | HDF5 driver with PLATO specific format |
|
|
18
|
+
| `plato-spw` | SpaceWire driver with PATO specific packets |
|
|
19
|
+
|
|
20
|
+
The following is a non-exhaustive list of known external packages that work well with the CGSE
|
|
21
|
+
in terms of commanding and monitoring.
|
|
22
|
+
|
|
23
|
+
| Package | Description |
|
|
24
|
+
|---------------|-----------------------------------------------------------------------------------------------------------------------|
|
|
25
|
+
| `cgse-dummy` | Provides a dummy device driver to demonstrate plugins, commands and how to develop an external package for the CGSE. |
|
|
@@ -72,7 +72,7 @@ class SortedCommandGroup(TyperGroup):
|
|
|
72
72
|
commands = super().list_commands(ctx)
|
|
73
73
|
|
|
74
74
|
# Define priority commands in specific order
|
|
75
|
-
priority_commands = ["init", "version", "show", "top", "core", "
|
|
75
|
+
priority_commands = ["init", "version", "show", "top", "core", "reg", "not", "log", "cm", "sm", "pm"]
|
|
76
76
|
|
|
77
77
|
# Custom sort:
|
|
78
78
|
# First the priority commands in the given order (their index)
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import random
|
|
2
|
+
import threading
|
|
3
|
+
import time
|
|
4
|
+
from enum import Enum
|
|
5
|
+
|
|
6
|
+
from egse.log import logging
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger("egse.connect")
|
|
9
|
+
|
|
10
|
+
# random.seed(time.monotonic()) # uncomment for testing only, main application should set a seed.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ConnectionState(Enum):
|
|
14
|
+
DISCONNECTED = "disconnected"
|
|
15
|
+
CONNECTING = "connecting"
|
|
16
|
+
CONNECTED = "connected"
|
|
17
|
+
CIRCUIT_OPEN = "circuit_open" # Temporarily stopped trying
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BackoffStrategy(Enum):
|
|
21
|
+
"""
|
|
22
|
+
Specifies the strategy for increasing the delay between retry attempts
|
|
23
|
+
in backoff algorithms to reduce load and avoid overwhelming services.
|
|
24
|
+
|
|
25
|
+
Strategies:
|
|
26
|
+
EXPONENTIAL:
|
|
27
|
+
The delay doubles with each retry attempt (e.g., 1s, 2s, 4s, 8s).
|
|
28
|
+
This is the most widely used approach because it quickly reduces load on struggling systems.
|
|
29
|
+
LINEAR:
|
|
30
|
+
The delay increases by a fixed amount each time (e.g., 1s, 2s, 3s, 4s).
|
|
31
|
+
This provides a more gradual reduction in request rate.
|
|
32
|
+
FIXED:
|
|
33
|
+
Uses the same delay between all retry attempts.
|
|
34
|
+
Simple but less adaptive to system conditions.
|
|
35
|
+
|
|
36
|
+
References:
|
|
37
|
+
- AWS Architecture Blog: Exponential Backoff And Jitter
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
EXPONENTIAL = "exponential"
|
|
41
|
+
"""The delay doubles with each retry attempt (e.g., 1s, 2s, 4s, 8s).
|
|
42
|
+
This is the most widely used approach because it quickly reduces load on struggling systems."""
|
|
43
|
+
LINEAR = "linear"
|
|
44
|
+
"""The delay increases by a fixed amount each time (e.g., 1s, 2s, 3s, 4s).
|
|
45
|
+
This provides a more gradual reduction in request rate."""
|
|
46
|
+
FIXED = "fixed"
|
|
47
|
+
"""Uses the same delay between all retry attempts. Simple but less adaptive to system conditions."""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class JitterStrategy(Enum):
|
|
51
|
+
"""
|
|
52
|
+
Specifies the strategy for applying jitter (randomization) to retry intervals
|
|
53
|
+
in backoff algorithms to avoid synchronized retries and reduce load spikes.
|
|
54
|
+
|
|
55
|
+
Strategies:
|
|
56
|
+
NONE:
|
|
57
|
+
No jitter is applied. The retry interval is deterministic.
|
|
58
|
+
FULL:
|
|
59
|
+
Applies full jitter by selecting a random value uniformly between 0 and the calculated interval.
|
|
60
|
+
This maximizes randomness but can result in very short delays.
|
|
61
|
+
EQUAL:
|
|
62
|
+
Applies "equal jitter" as described in the AWS Architecture Blog.
|
|
63
|
+
The interval is randomized within [interval/2, interval], ensuring a minimum delay of half the interval.
|
|
64
|
+
Note: This is not the same as "a jitter of 50% around interval" (which would be [0.5 * interval, 1.5 * interval]).
|
|
65
|
+
PERCENT_10:
|
|
66
|
+
Applies a jitter of ±10% around the base interval, resulting in a random interval within [0.9 * interval, 1.1 * interval].
|
|
67
|
+
|
|
68
|
+
References:
|
|
69
|
+
- AWS Architecture Blog: Exponential Backoff And Jitter
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
NONE = "none"
|
|
73
|
+
"""No jitter is applied to the backoff."""
|
|
74
|
+
FULL = "full"
|
|
75
|
+
"""Maximum distribution but can be too random with very short intervals."""
|
|
76
|
+
EQUAL = "equal"
|
|
77
|
+
"""Best balance, maintains backoff properties while preventing synchronization."""
|
|
78
|
+
PERCENT_10 = "10%"
|
|
79
|
+
"""Add a jitter of 10% around the base interval."""
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def calculate_retry_interval(
|
|
83
|
+
attempt_number,
|
|
84
|
+
base_interval,
|
|
85
|
+
max_interval,
|
|
86
|
+
backoff_strategy: BackoffStrategy = BackoffStrategy.EXPONENTIAL,
|
|
87
|
+
jitter_strategy: JitterStrategy = JitterStrategy.EQUAL,
|
|
88
|
+
):
|
|
89
|
+
"""
|
|
90
|
+
Calculates the next retry interval based on the given backoff and jitter strategies.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
attempt_number (int): The current retry attempt (starting from 0).
|
|
94
|
+
base_interval (float): The initial interval in seconds.
|
|
95
|
+
max_interval (float): The maximum allowed interval in seconds.
|
|
96
|
+
backoff_strategy (BackoffStrategy): Strategy for increasing the delay (exponential, linear, or fixed).
|
|
97
|
+
jitter_strategy (JitterStrategy): Strategy for randomizing the delay to avoid synchronization.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
float: The computed retry interval in seconds.
|
|
101
|
+
|
|
102
|
+
Notes:
|
|
103
|
+
- See the docstrings for BackoffStrategy and JitterStrategy for details on each strategy.
|
|
104
|
+
- Based on best practices from the AWS Architecture Blog: Exponential Backoff And Jitter.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
if backoff_strategy == BackoffStrategy.EXPONENTIAL:
|
|
108
|
+
interval = min(base_interval * (2**attempt_number), max_interval)
|
|
109
|
+
elif backoff_strategy == BackoffStrategy.LINEAR:
|
|
110
|
+
interval = min(base_interval + attempt_number, max_interval)
|
|
111
|
+
else:
|
|
112
|
+
interval = base_interval
|
|
113
|
+
|
|
114
|
+
if jitter_strategy == JitterStrategy.NONE:
|
|
115
|
+
return interval
|
|
116
|
+
elif jitter_strategy == JitterStrategy.FULL:
|
|
117
|
+
return random.uniform(0, interval)
|
|
118
|
+
elif jitter_strategy == JitterStrategy.EQUAL:
|
|
119
|
+
return interval / 2 + random.uniform(0, interval / 2)
|
|
120
|
+
elif jitter_strategy == JitterStrategy.PERCENT_10:
|
|
121
|
+
jitter_amount = interval * 0.1
|
|
122
|
+
return interval + random.uniform(-jitter_amount, jitter_amount)
|
|
123
|
+
|
|
124
|
+
return interval
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class AsyncServiceConnector:
|
|
128
|
+
"""
|
|
129
|
+
Asynchronous base class for robust service connection management with retry, backoff, and circuit breaker logic.
|
|
130
|
+
|
|
131
|
+
This class is intended to be subclassed for managing persistent connections to external services
|
|
132
|
+
(such as devices, databases, or remote APIs) that may be unreliable or temporarily unavailable.
|
|
133
|
+
|
|
134
|
+
Features:
|
|
135
|
+
- Automatic retry with configurable backoff and jitter strategies.
|
|
136
|
+
- Circuit breaker to prevent repeated connection attempts after multiple failures.
|
|
137
|
+
- Connection state tracking (disconnected, connecting, connected, circuit open).
|
|
138
|
+
|
|
139
|
+
Usage:
|
|
140
|
+
1. Subclass `AsyncServiceConnector` and override the `connect_to_service()` coroutine with your
|
|
141
|
+
actual connection logic. Optionally, override `health_check()` for custom health verification.
|
|
142
|
+
2. Store the actual connection object (e.g., socket, transport) as an instance attribute in your subclass.
|
|
143
|
+
3. Use `attempt_connection()` to initiate connection attempts; it will handle retries and backoff automatically.
|
|
144
|
+
4. Use `is_connected()` to check connection status.
|
|
145
|
+
|
|
146
|
+
Example:
|
|
147
|
+
class MyConnector(AsyncServiceConnector):
|
|
148
|
+
async def connect_to_service(self):
|
|
149
|
+
self.connection = await create_socket()
|
|
150
|
+
return self.connection is not None
|
|
151
|
+
|
|
152
|
+
def get_connection(self):
|
|
153
|
+
return self.connection
|
|
154
|
+
|
|
155
|
+
Note:
|
|
156
|
+
The base class does not manage or expose the underlying connection object.
|
|
157
|
+
Your subclass should provide a method or property to access it as needed.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
def __init__(self, service_name: str):
|
|
161
|
+
self.state = ConnectionState.DISCONNECTED
|
|
162
|
+
self.last_attempt = 0
|
|
163
|
+
self.base_interval = 1
|
|
164
|
+
self.retry_interval = 1 # Start with 1 second
|
|
165
|
+
self.max_retry_interval = 300 # Max 5 minutes
|
|
166
|
+
self.failure_count = 0
|
|
167
|
+
self.max_failures_before_circuit_break = 5
|
|
168
|
+
self.circuit_break_duration = 60 # 1 minute
|
|
169
|
+
self.circuit_opened_at = None
|
|
170
|
+
|
|
171
|
+
self.service_name = service_name
|
|
172
|
+
|
|
173
|
+
async def connect_to_service(self) -> bool:
|
|
174
|
+
logger.warning(
|
|
175
|
+
f"The connect_to_service() method is not implemented for {self.service_name}, connection will always fail."
|
|
176
|
+
)
|
|
177
|
+
return False
|
|
178
|
+
|
|
179
|
+
async def health_check(self) -> bool:
|
|
180
|
+
logger.warning(
|
|
181
|
+
f"The health_check() method is not implemented for {self.service_name}, check will always return false."
|
|
182
|
+
)
|
|
183
|
+
return False
|
|
184
|
+
|
|
185
|
+
def should_attempt_connection(self) -> bool:
|
|
186
|
+
"""Return True if we should attempt a new connection."""
|
|
187
|
+
now = time.monotonic()
|
|
188
|
+
|
|
189
|
+
# If circuit is open, check if we should close it
|
|
190
|
+
if self.state == ConnectionState.CIRCUIT_OPEN:
|
|
191
|
+
if now - self.circuit_opened_at > self.circuit_break_duration:
|
|
192
|
+
self.state = ConnectionState.DISCONNECTED
|
|
193
|
+
self.failure_count = 0
|
|
194
|
+
self.retry_interval = 1
|
|
195
|
+
return True
|
|
196
|
+
return False
|
|
197
|
+
|
|
198
|
+
# Regular backoff logic
|
|
199
|
+
return now - self.last_attempt >= self.retry_interval
|
|
200
|
+
|
|
201
|
+
async def attempt_connection(self):
|
|
202
|
+
"""Try to connect to the service.
|
|
203
|
+
|
|
204
|
+
This will execute the callable argument `connect_to_service` that was passed
|
|
205
|
+
into the constructor. That function shall return True when the connection
|
|
206
|
+
succeeded, False otherwise.
|
|
207
|
+
"""
|
|
208
|
+
if not self.should_attempt_connection():
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
self.state = ConnectionState.CONNECTING
|
|
212
|
+
self.last_attempt = time.monotonic()
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
success = await self.connect_to_service()
|
|
216
|
+
|
|
217
|
+
if success:
|
|
218
|
+
self.state = ConnectionState.CONNECTED
|
|
219
|
+
self.failure_count = 0
|
|
220
|
+
self.retry_interval = 1 # Reset backoff
|
|
221
|
+
logger.info(f"Successfully connected to service {self.service_name}")
|
|
222
|
+
else:
|
|
223
|
+
# warning should have been logged by the connect_to_service() callable.
|
|
224
|
+
self.handle_connection_failure()
|
|
225
|
+
|
|
226
|
+
except Exception as exc:
|
|
227
|
+
logger.warning(f"Failed to connect to service {self.service_name}: {exc}")
|
|
228
|
+
self.handle_connection_failure()
|
|
229
|
+
|
|
230
|
+
def handle_connection_failure(self):
|
|
231
|
+
self.failure_count += 1
|
|
232
|
+
|
|
233
|
+
# Open circuit breaker if too many failures
|
|
234
|
+
if self.failure_count >= self.max_failures_before_circuit_break:
|
|
235
|
+
self.state = ConnectionState.CIRCUIT_OPEN
|
|
236
|
+
self.circuit_opened_at = time.time()
|
|
237
|
+
logger.warning(
|
|
238
|
+
f"Circuit breaker opened for service {self.service_name} after {self.failure_count} failures"
|
|
239
|
+
)
|
|
240
|
+
else:
|
|
241
|
+
self.state = ConnectionState.DISCONNECTED
|
|
242
|
+
self.retry_interval = calculate_retry_interval(
|
|
243
|
+
self.failure_count,
|
|
244
|
+
self.base_interval,
|
|
245
|
+
self.max_retry_interval,
|
|
246
|
+
BackoffStrategy.EXPONENTIAL,
|
|
247
|
+
JitterStrategy.EQUAL,
|
|
248
|
+
)
|
|
249
|
+
logger.debug(f"retry_interval={self.retry_interval}")
|
|
250
|
+
|
|
251
|
+
def is_connected(self) -> bool:
|
|
252
|
+
return self.state == ConnectionState.CONNECTED
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class ServiceConnector:
|
|
256
|
+
"""
|
|
257
|
+
Synchronous base class for robust service connection management with retry, backoff, and circuit breaker logic.
|
|
258
|
+
|
|
259
|
+
This class is intended to be subclassed for managing persistent connections to external services
|
|
260
|
+
(such as devices, databases, or remote APIs) that may be unreliable or temporarily unavailable.
|
|
261
|
+
|
|
262
|
+
Features:
|
|
263
|
+
- Automatic retry with configurable backoff and jitter strategies.
|
|
264
|
+
- Circuit breaker to prevent repeated connection attempts after multiple failures.
|
|
265
|
+
- Connection state tracking (disconnected, connecting, connected, circuit open).
|
|
266
|
+
- Thread-safe operation using a lock for all state changes.
|
|
267
|
+
|
|
268
|
+
Usage:
|
|
269
|
+
1. Subclass `ServiceConnector` and override the `connect_to_service()` method with your
|
|
270
|
+
actual connection logic. Optionally, override `health_check()` for custom health verification.
|
|
271
|
+
2. Store the actual connection object (e.g., socket, transport) as an instance attribute in your subclass.
|
|
272
|
+
3. Use `attempt_connection()` to initiate connection attempts; it will handle retries and backoff automatically.
|
|
273
|
+
4. Use `is_connected()` to check connection status.
|
|
274
|
+
|
|
275
|
+
Example:
|
|
276
|
+
class MyConnector(ServiceConnector):
|
|
277
|
+
def connect_to_service(self):
|
|
278
|
+
self.connection = create_socket()
|
|
279
|
+
return self.connection is not None
|
|
280
|
+
|
|
281
|
+
def get_connection(self):
|
|
282
|
+
return self.connection
|
|
283
|
+
|
|
284
|
+
Note:
|
|
285
|
+
The base class does not manage or expose the underlying connection object.
|
|
286
|
+
Your subclass should provide a method or property to access it as needed.
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
def __init__(self, service_name: str):
|
|
290
|
+
self.state = ConnectionState.DISCONNECTED
|
|
291
|
+
self.last_attempt = 0
|
|
292
|
+
self.base_interval = 1
|
|
293
|
+
self.retry_interval = 1
|
|
294
|
+
self.max_retry_interval = 300
|
|
295
|
+
self.failure_count = 0
|
|
296
|
+
self.max_failures_before_circuit_break = 5
|
|
297
|
+
self.circuit_break_duration = 60
|
|
298
|
+
self.circuit_opened_at = None
|
|
299
|
+
self.service_name = service_name
|
|
300
|
+
self._lock = threading.RLock()
|
|
301
|
+
|
|
302
|
+
def connect_to_service(self) -> bool:
|
|
303
|
+
logger.warning(
|
|
304
|
+
f"The connect_to_service() method is not implemented for {self.service_name}, connection will always fail."
|
|
305
|
+
)
|
|
306
|
+
return False
|
|
307
|
+
|
|
308
|
+
def health_check(self) -> bool:
|
|
309
|
+
logger.warning(
|
|
310
|
+
f"The health_check() method is not implemented for {self.service_name}, check will always return false."
|
|
311
|
+
)
|
|
312
|
+
return False
|
|
313
|
+
|
|
314
|
+
def should_attempt_connection(self) -> bool:
|
|
315
|
+
now = time.monotonic()
|
|
316
|
+
with self._lock:
|
|
317
|
+
if self.state == ConnectionState.CIRCUIT_OPEN:
|
|
318
|
+
if now - self.circuit_opened_at > self.circuit_break_duration:
|
|
319
|
+
self.state = ConnectionState.DISCONNECTED
|
|
320
|
+
self.failure_count = 0
|
|
321
|
+
self.retry_interval = 1
|
|
322
|
+
return True
|
|
323
|
+
return False
|
|
324
|
+
return now - self.last_attempt >= self.retry_interval
|
|
325
|
+
|
|
326
|
+
def attempt_connection(self):
|
|
327
|
+
with self._lock:
|
|
328
|
+
if not self.should_attempt_connection():
|
|
329
|
+
return
|
|
330
|
+
self.state = ConnectionState.CONNECTING
|
|
331
|
+
self.last_attempt = time.monotonic()
|
|
332
|
+
|
|
333
|
+
try:
|
|
334
|
+
success = self.connect_to_service()
|
|
335
|
+
with self._lock:
|
|
336
|
+
if success:
|
|
337
|
+
self.state = ConnectionState.CONNECTED
|
|
338
|
+
self.failure_count = 0
|
|
339
|
+
self.retry_interval = 1
|
|
340
|
+
logger.info(f"Successfully connected to service {self.service_name}")
|
|
341
|
+
else:
|
|
342
|
+
self.handle_connection_failure()
|
|
343
|
+
except Exception as exc:
|
|
344
|
+
logger.error(f"Failed to connect to service {self.service_name}: {exc}")
|
|
345
|
+
with self._lock:
|
|
346
|
+
self.handle_connection_failure()
|
|
347
|
+
|
|
348
|
+
def handle_connection_failure(self):
|
|
349
|
+
self.failure_count += 1
|
|
350
|
+
if self.failure_count >= self.max_failures_before_circuit_break:
|
|
351
|
+
self.state = ConnectionState.CIRCUIT_OPEN
|
|
352
|
+
self.circuit_opened_at = time.monotonic()
|
|
353
|
+
logger.warning(
|
|
354
|
+
f"Circuit breaker opened for service {self.service_name} after {self.failure_count} failures"
|
|
355
|
+
)
|
|
356
|
+
else:
|
|
357
|
+
self.state = ConnectionState.DISCONNECTED
|
|
358
|
+
self.retry_interval = calculate_retry_interval(
|
|
359
|
+
self.failure_count,
|
|
360
|
+
self.base_interval,
|
|
361
|
+
self.max_retry_interval,
|
|
362
|
+
BackoffStrategy.EXPONENTIAL,
|
|
363
|
+
JitterStrategy.EQUAL,
|
|
364
|
+
)
|
|
365
|
+
logger.debug(f"retry_interval={self.retry_interval}")
|
|
366
|
+
|
|
367
|
+
def is_connected(self) -> bool:
|
|
368
|
+
with self._lock:
|
|
369
|
+
return self.state == ConnectionState.CONNECTED
|
|
@@ -451,7 +451,7 @@ def set_local_settings(path: str | Path | None):
|
|
|
451
451
|
_env.set("LOCAL_SETTINGS", path)
|
|
452
452
|
|
|
453
453
|
|
|
454
|
-
def get_local_settings_path() -> str
|
|
454
|
+
def get_local_settings_path() -> str | None:
|
|
455
455
|
"""
|
|
456
456
|
Returns the fully qualified filename of the local settings YAML file. When the local settings environment
|
|
457
457
|
variable is not defined or is an empty string, None is returned.
|
|
@@ -2298,13 +2298,13 @@ def caffeinate(pid: int = None):
|
|
|
2298
2298
|
|
|
2299
2299
|
See Also:
|
|
2300
2300
|
macOS caffeinate(8) man page for more details on the underlying utility.
|
|
2301
|
-
|
|
2301
|
+
"""
|
|
2302
2302
|
if not pid:
|
|
2303
2303
|
pid = os.getpid()
|
|
2304
2304
|
|
|
2305
2305
|
if get_os_name() == "macos":
|
|
2306
2306
|
logger.warning(f"Running 'caffeinate -i -w {pid}' on macOS to prevent the system from idle sleeping.")
|
|
2307
|
-
subprocess.Popen([shutil.which(
|
|
2307
|
+
subprocess.Popen([shutil.which("caffeinate"), "-i", "-w", str(pid)])
|
|
2308
2308
|
|
|
2309
2309
|
|
|
2310
2310
|
ignore_m_warning("egse.system")
|