cgse 0.13.1__tar.gz → 0.14.1__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.13.1 → cgse-0.14.1}/PKG-INFO +1 -1
- cgse-0.14.1/docs/libs/cgse-core/notifyhub.md +168 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/cgse.py +1 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/calibration.py +2 -2
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/config.py +3 -27
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/counter.py +4 -8
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/decorators.py +11 -12
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/device.py +0 -1
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/dicts.py +15 -14
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/env.py +2 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/heartbeat.py +0 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/hk.py +5 -6
- cgse-0.14.1/libs/cgse-common/src/egse/log.py +163 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/metrics.py +1 -4
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugin.py +14 -10
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/process.py +21 -23
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/resource.py +6 -9
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/scpi.py +1 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/settings.py +4 -5
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/setup.py +176 -127
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/signal.py +1 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/socketdevice.py +1 -4
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/state.py +5 -30
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/system.py +3 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/zmq_ser.py +5 -2
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/empty_process.py +3 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/process_with_children.py +4 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_decorators.py +7 -2
- cgse-0.14.1/libs/cgse-common/tests/test_log.py +46 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_plugin.py +14 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_process.py +10 -1
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_setup.py +45 -21
- cgse-0.14.1/libs/cgse-common/tests/test_state.py +21 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/pyproject.toml +7 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/_start.py +14 -0
- cgse-0.14.1/libs/cgse-core/src/cgse_core/_stop.py +125 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/cgse_explore.py +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/services.py +27 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/settings.yaml +7 -1
- cgse-0.14.1/libs/cgse-core/src/egse/_setup_core.py +154 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/command.py +1 -6
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/__init__.py +40 -29
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/confman_cs.py +20 -18
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/control.py +59 -34
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/dummy.py +79 -79
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/listener.py +4 -5
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/__init__.py +88 -50
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/log_cs.py +55 -28
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/mixin.py +11 -14
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/monitoring.py +14 -16
- cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/__init__.py +63 -0
- cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/client.py +258 -0
- cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/event.py +29 -0
- cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/server.py +354 -0
- cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/services.py +301 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/notifyhub/test.py +16 -9
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_cs.py +14 -12
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/protocol.py +1 -3
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/proxy.py +8 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/__init__.py +19 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/client.py +7 -5
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/server.py +20 -16
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/services.py +14 -15
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/__init__.py +34 -31
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/storage_cs.py +38 -18
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/helpers.py +7 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/services.py +25 -5
- cgse-0.14.1/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +29 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_async_control.py +2 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_client_server_interaction.py +41 -3
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_cm_cs.py +18 -6
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_command.py +0 -1
- cgse-0.14.1/libs/cgse-core/tests/test_dummy.py +68 -0
- cgse-0.14.1/libs/cgse-core/tests/test_event_notification.py +182 -0
- cgse-0.14.1/libs/cgse-core/tests/test_extensions.py +10 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_logger.py +10 -3
- cgse-0.14.1/libs/cgse-core/tests/test_notify_hub.py +170 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_registry_service.py +128 -54
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_server_running.py +5 -8
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_server_running_with_fixture.py +5 -9
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/mkdocs.yml +1 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +2 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.13.1 → cgse-0.14.1}/pyproject.toml +2 -2
- {cgse-0.13.1 → cgse-0.14.1}/service_registry.db +0 -0
- cgse-0.13.1/libs/cgse-common/tests/test_state.py +0 -9
- cgse-0.13.1/libs/cgse-core/src/cgse_core/_stop.py +0 -75
- cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -8
- cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/event.py +0 -11
- cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/server.py +0 -155
- cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/services.py +0 -179
- cgse-0.13.1/service_registry.db-shm +0 -0
- cgse-0.13.1/service_registry.db-wal +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/.gitignore +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/bump.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/conftest.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/bits.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/calibration.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/command.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/config.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/control.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/counter.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/decorators.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/device.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/dicts.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/dummy.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/env.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/exceptions.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/heartbeat.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/hk.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/listener.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/metrics.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/mixin.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/monitoring.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/observer.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/obsid.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/persistence.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/plugin.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/process.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/reload.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/settings.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/setup.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/api/system.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/custom_theme/main.html +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/docs.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/installation.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/nox.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/uv.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/getting_started.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/help.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/images/grafana-queries.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/initialize.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-core/registry.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/libs/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/package_list.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/projects/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/roadmap.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/stylesheets/custom.css +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/stylesheets/extra.css +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/tutorial.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/docs/user_guide/index.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/duckdb_metrics.db +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/duckdb_metrics.db.wal +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/identifier.sqlite +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/justfile +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/justfile +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_metrics.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/async_control.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/async_control_claude.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/services.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_control.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_listener.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_mixin.py +0 -0
- {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/noxfile.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/ruff.toml +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/scratch/advanced-process-monitoring.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/scratch/live-process-monitoring.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/scratch/match-case.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/scratch/processes.json +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/scratch/simple-process-monitoring.py +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/temperature_readings.log +0 -0
- {cgse-0.13.1 → cgse-0.14.1}/test_service_registry.db +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# The Notification Hub
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Notification Hub serves as a centralized event distribution system for the core services and control servers.
|
|
6
|
+
Instead of having services directly subscribe to each other, all services publish their events to the hub, which
|
|
7
|
+
then redistributes them to interested subscribers via ZeroMQ PUB-SUB sockets.
|
|
8
|
+
|
|
9
|
+
## Benefits
|
|
10
|
+
|
|
11
|
+
- **Decoupling**: Services don't need to know about each other directly
|
|
12
|
+
- **Scalability**: Easy to add new subscribers without modifying existing services
|
|
13
|
+
- **Reliability**: Single point of event distribution with consistent delivery
|
|
14
|
+
- **Simplicity**: One subscription endpoint for all system events
|
|
15
|
+
|
|
16
|
+
# Socket Endpoints
|
|
17
|
+
|
|
18
|
+
The Notification Hub exposes three ZeroMQ sockets:
|
|
19
|
+
|
|
20
|
+
| Purpose | Pattern | Your Socket | Endpoint |
|
|
21
|
+
|--------------------|:--------------:|:-------------:|-----------------------------|
|
|
22
|
+
| Event Publishing | PUSH-PULL | PUSH | tcp://notification-hub:4245 |
|
|
23
|
+
| Event Subscription | PUB-SUB | SUB | tcp://notification-hub:4246 |
|
|
24
|
+
| Health Checks | ROUTER-DEALER | DEALER | tcp://notification-hub:4247 |
|
|
25
|
+
|
|
26
|
+
Note: port numbers can be changed in the local settings YAML file.
|
|
27
|
+
|
|
28
|
+
## Events
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
from egse.notifyhub.event import NotificationEvent
|
|
32
|
+
|
|
33
|
+
event = NotificationEvent(
|
|
34
|
+
event_type="new_setup",
|
|
35
|
+
source_service="cm_cs",
|
|
36
|
+
data={"setup_id": "0001234"},
|
|
37
|
+
)
|
|
38
|
+
```
|
|
39
|
+
A `NotificationEvent` also has a `timestamp` and a `correlation_id`
|
|
40
|
+
associated. These fields are automatically filled on creation of the event
|
|
41
|
+
and must not be provided. An event can be converted into a plain dictionary
|
|
42
|
+
with the `.as_dict()` method.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
>>> print(event.as_dict())
|
|
46
|
+
{
|
|
47
|
+
'event_type': 'new_setup',
|
|
48
|
+
'source_service': 'cm_cs',
|
|
49
|
+
'data': {'setup_id': '0001234'},
|
|
50
|
+
'timestamp': 1756709627.25942,
|
|
51
|
+
'correlation_id': '23b44f16-34f9-498a-85f7-5c57658ea363'
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Publishing Events
|
|
56
|
+
|
|
57
|
+
Any core service, control server, or script can publish events to the notification hub using the EventPublisher class. For convenience, EventPublisher supports usage as a context manager, making it easy to send single events.
|
|
58
|
+
|
|
59
|
+
=== "Synchronous"
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from egse.notifyhub.services import EventPublisher
|
|
63
|
+
|
|
64
|
+
with EventPublisher() as publisher:
|
|
65
|
+
publisher.publish(event)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
=== "Asynchronous"
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from egse.notifyhub.services import AsyncEventPublisher
|
|
72
|
+
|
|
73
|
+
async with AsyncEventPublisher() as publisher:
|
|
74
|
+
await publisher.publish(event)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
## Subscribing to Events
|
|
79
|
+
|
|
80
|
+
Listen to events from the notification hub with the EventSubscriber class.
|
|
81
|
+
The usage for this class is quite different for synchronous and asynchronous
|
|
82
|
+
contexts.
|
|
83
|
+
|
|
84
|
+
=== "Synchronous"
|
|
85
|
+
|
|
86
|
+
In a synchronous context, you will need to add code to poll the socket
|
|
87
|
+
and handle the event inside your own event loop. The subscriber socket
|
|
88
|
+
can be retrieved with the `subscriber.socket` property, you can then add
|
|
89
|
+
the socket to a Poller object.
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
from egse.notifyhub.services import EventSubscriber
|
|
93
|
+
|
|
94
|
+
def load_setup(event_data: dict):
|
|
95
|
+
...
|
|
96
|
+
|
|
97
|
+
subscriber = EventSubscriber(["new_setup"])
|
|
98
|
+
subscriber.register_handler("new_setup", load_setup)
|
|
99
|
+
subscriber.connect()
|
|
100
|
+
|
|
101
|
+
while True:
|
|
102
|
+
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
if subscriber.poll():
|
|
106
|
+
subscriber.handle_event()
|
|
107
|
+
|
|
108
|
+
subscriber.disconnect()
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
=== "Asynchronous"
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from egse.notifyhub.services import AsyncEventSubscriber
|
|
115
|
+
|
|
116
|
+
async def load_setup(event_data: dict):
|
|
117
|
+
...
|
|
118
|
+
|
|
119
|
+
subscriber = AsyncEventSubscriber(["new_setup"])
|
|
120
|
+
subscriber.register_handler("new_setup", load_setup)
|
|
121
|
+
await subscriber.connect()
|
|
122
|
+
|
|
123
|
+
event_listener = asyncio.create_task(subscriber.start_listening())
|
|
124
|
+
|
|
125
|
+
...
|
|
126
|
+
|
|
127
|
+
subscriber.disconnect()
|
|
128
|
+
await event_listener # add a wait_for with a timeout if needed
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Health Checks
|
|
132
|
+
|
|
133
|
+
The Notification Hub provides a health check interface to monitor the status and availability of the hub. This allows services and scripts to verify connectivity and basic hub functionality.
|
|
134
|
+
To perform a health check, use the NotificationHubClient class. The client
|
|
135
|
+
connects to the hub's ROUTER-DEALER socket and sends a health check request.
|
|
136
|
+
If the hub is available, it responds True. In case of an error or when the
|
|
137
|
+
hub is not available, False is returned.
|
|
138
|
+
|
|
139
|
+
=== "Synchronous"
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
from egse.notifyhub.client import NotificationHubClient
|
|
143
|
+
|
|
144
|
+
with NotificationHubClient() as client:
|
|
145
|
+
if not client.health_check():
|
|
146
|
+
... # notification hub not available
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
=== "Asynchronous"
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from egse.notifyhub.client import AsyncNotificationHubClient
|
|
153
|
+
|
|
154
|
+
with AsyncNotificationHubClient() as client:
|
|
155
|
+
if not await client.health_check():
|
|
156
|
+
... # notification hub not available
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The health check has a default timeout of 5 seconds. If this is too long for
|
|
160
|
+
your needs, provide a `request_timeout` argument as a float in seconds to
|
|
161
|
+
the `NotificationHubClient` call.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Monitoring
|
|
165
|
+
|
|
166
|
+
Every 30s, the hub provides basic connection and event statistics to the log.
|
|
167
|
+
|
|
168
|
+
TODO: this should also go on the PUB channel as a StatsEvent.
|
|
@@ -5,8 +5,8 @@ This module provides functions to calibrate sensor values.
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
-
|
|
9
|
-
from egse.setup import
|
|
8
|
+
from navdict import navdict
|
|
9
|
+
from egse.setup import Setup, SetupError
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def apply_gain_offset(counts: float, gain: float, offset: float) -> float:
|
|
@@ -3,27 +3,15 @@ This module provides convenience functions to properly configure the CGSE
|
|
|
3
3
|
and to find paths and resources.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
|
|
8
|
-
import errno
|
|
9
6
|
import fnmatch
|
|
10
|
-
import logging
|
|
11
7
|
import os
|
|
12
|
-
from functools import lru_cache
|
|
13
|
-
from os.path import exists
|
|
14
|
-
from os.path import join
|
|
15
8
|
from pathlib import Path
|
|
16
9
|
from pathlib import PurePath
|
|
17
|
-
from typing import
|
|
18
|
-
from typing import Optional
|
|
10
|
+
from typing import Generator
|
|
19
11
|
from typing import Tuple
|
|
20
12
|
from typing import Union
|
|
21
|
-
from typing import Generator
|
|
22
13
|
|
|
23
|
-
import
|
|
24
|
-
from egse.decorators import deprecate
|
|
25
|
-
|
|
26
|
-
_logger = logging.getLogger(__name__)
|
|
14
|
+
from egse.log import logger
|
|
27
15
|
|
|
28
16
|
|
|
29
17
|
def find_first_occurrence_of_dir(pattern: str, root: Path | str) -> Path | None:
|
|
@@ -252,18 +240,6 @@ def find_root(
|
|
|
252
240
|
return Path(default) if default is not None else None
|
|
253
241
|
|
|
254
242
|
|
|
255
|
-
def set_logger_levels(logger_levels: List[Tuple] = None):
|
|
256
|
-
"""
|
|
257
|
-
Set the logging level for the given loggers.
|
|
258
|
-
|
|
259
|
-
"""
|
|
260
|
-
logger_levels = logger_levels or []
|
|
261
|
-
|
|
262
|
-
for name, level in logger_levels:
|
|
263
|
-
a_logger = logging.getLogger(name)
|
|
264
|
-
a_logger.setLevel(level)
|
|
265
|
-
|
|
266
|
-
|
|
267
243
|
class WorkingDirectory:
|
|
268
244
|
"""
|
|
269
245
|
WorkingDirectory is a context manager to temporarily change the working directory while
|
|
@@ -301,7 +277,7 @@ class WorkingDirectory:
|
|
|
301
277
|
try:
|
|
302
278
|
os.chdir(self._current_dir)
|
|
303
279
|
except OSError as exc:
|
|
304
|
-
|
|
280
|
+
logger.warning(f"Change back to previous directory failed: {exc}")
|
|
305
281
|
|
|
306
282
|
@property
|
|
307
283
|
def path(self):
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
This module manages files that have a counter in their filename.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
5
|
__all__ = [
|
|
8
6
|
"counter_exists",
|
|
9
7
|
"counter_filename",
|
|
@@ -11,12 +9,10 @@ __all__ = [
|
|
|
11
9
|
"new_counter",
|
|
12
10
|
]
|
|
13
11
|
|
|
14
|
-
import logging
|
|
15
12
|
from pathlib import Path
|
|
16
13
|
|
|
17
14
|
from egse.config import find_files
|
|
18
|
-
|
|
19
|
-
_LOGGER = logging.getLogger(__name__)
|
|
15
|
+
from egse.log import logger
|
|
20
16
|
|
|
21
17
|
|
|
22
18
|
def counter_filename(location: Path, filename: Path | str) -> Path:
|
|
@@ -133,7 +129,7 @@ def get_next_counter(filename: Path) -> int:
|
|
|
133
129
|
return counter
|
|
134
130
|
|
|
135
131
|
|
|
136
|
-
def determine_counter_from_dir_list(location: str, pattern: str, index: int = -1) -> int:
|
|
132
|
+
def determine_counter_from_dir_list(location: Path | str, pattern: str, index: int = -1) -> int:
|
|
137
133
|
"""
|
|
138
134
|
Determine counter for a new file at the given location and with the given pattern.
|
|
139
135
|
The next counter is determined from the sorted list of files that match the given pattern.
|
|
@@ -170,9 +166,9 @@ def determine_counter_from_dir_list(location: str, pattern: str, index: int = -1
|
|
|
170
166
|
# <anything here>_counter>.<extension>
|
|
171
167
|
|
|
172
168
|
counter = int(parts[index].split(".")[0]) + 1
|
|
173
|
-
|
|
169
|
+
logger.debug(f"{counter = }")
|
|
174
170
|
return counter
|
|
175
171
|
|
|
176
172
|
except ValueError:
|
|
177
|
-
|
|
173
|
+
logger.warning("ValueError", exc_info=True)
|
|
178
174
|
return 1
|
|
@@ -17,8 +17,7 @@ import rich
|
|
|
17
17
|
|
|
18
18
|
from egse.settings import Settings
|
|
19
19
|
from egse.system import get_caller_info
|
|
20
|
-
|
|
21
|
-
_LOGGER = logging.getLogger(__name__)
|
|
20
|
+
from egse.log import logger
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
def static_vars(**kwargs):
|
|
@@ -161,14 +160,14 @@ def average_time(*, name: str = "average_time", level: int = logging.INFO, preci
|
|
|
161
160
|
def _report_average_time():
|
|
162
161
|
if func._call_count:
|
|
163
162
|
average_time = func._run_time / func._call_count
|
|
164
|
-
|
|
163
|
+
logger.log(
|
|
165
164
|
level,
|
|
166
165
|
f"{name}: "
|
|
167
166
|
f"average runtime of {func.__name__!r} is {average_time:.{precision}f}s, "
|
|
168
167
|
f"#calls = {func._call_count}.",
|
|
169
168
|
)
|
|
170
169
|
else:
|
|
171
|
-
|
|
170
|
+
logger.log(level, f"{name}: function {func.__name__!r} was never called.")
|
|
172
171
|
|
|
173
172
|
return func._run_time, func._call_count
|
|
174
173
|
|
|
@@ -210,7 +209,7 @@ def timer(*, name: str = "timer", level: int = logging.INFO, precision: int = 4)
|
|
|
210
209
|
value = func(*args, **kwargs)
|
|
211
210
|
end_time = time.perf_counter()
|
|
212
211
|
run_time = end_time - start_time
|
|
213
|
-
|
|
212
|
+
logger.log(level, f"{name}: Finished {func.__name__!r} in {run_time:.{precision}f} secs")
|
|
214
213
|
return value
|
|
215
214
|
|
|
216
215
|
return wrapper_timer
|
|
@@ -235,7 +234,7 @@ def async_timer(*, name: str = "timer", level: int = logging.INFO, precision: in
|
|
|
235
234
|
value = await func(*args, **kwargs)
|
|
236
235
|
end_time = time.perf_counter()
|
|
237
236
|
run_time = end_time - start_time
|
|
238
|
-
|
|
237
|
+
logger.log(level, f"{name}: Finished {func.__name__!r} in {run_time:.{precision}f} secs")
|
|
239
238
|
return value
|
|
240
239
|
|
|
241
240
|
return wrapper_timer
|
|
@@ -307,9 +306,9 @@ def debug(func):
|
|
|
307
306
|
args_repr = [repr(a) for a in args]
|
|
308
307
|
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]
|
|
309
308
|
signature = ", ".join(args_repr + kwargs_repr)
|
|
310
|
-
|
|
309
|
+
logger.debug(f"Calling {func.__name__}({signature})")
|
|
311
310
|
value = func(*args, **kwargs)
|
|
312
|
-
|
|
311
|
+
logger.debug(f"{func.__name__!r} returned {value!r}")
|
|
313
312
|
else:
|
|
314
313
|
value = func(*args, **kwargs)
|
|
315
314
|
return value
|
|
@@ -523,7 +522,7 @@ def to_be_implemented(func):
|
|
|
523
522
|
|
|
524
523
|
@functools.wraps(func)
|
|
525
524
|
def wrapper_tbi(*args, **kwargs):
|
|
526
|
-
|
|
525
|
+
logger.warning(f"The function/method {func.__name__} is not yet implemented.")
|
|
527
526
|
return func(*args, **kwargs)
|
|
528
527
|
|
|
529
528
|
return wrapper_tbi
|
|
@@ -736,12 +735,12 @@ def retry_with_exponential_backoff(
|
|
|
736
735
|
while attempt < max_attempts:
|
|
737
736
|
try:
|
|
738
737
|
response = func(*args, **kwargs) # Attempt to call the function
|
|
739
|
-
|
|
738
|
+
logger.info(f"{func.__name__} successfully executed.")
|
|
740
739
|
return response
|
|
741
740
|
except tuple(exceptions) as exc:
|
|
742
741
|
last_exception = exc
|
|
743
742
|
attempt += 1
|
|
744
|
-
|
|
743
|
+
logger.info(
|
|
745
744
|
f"Retry {attempt}: {func.__name__} will be executing again in {wait_time * backoff_factor}s. "
|
|
746
745
|
f"Received a {last_exception!r}."
|
|
747
746
|
)
|
|
@@ -805,7 +804,7 @@ def retry(times: int = 3, wait: float = 10.0, exceptions: List = None) -> Callab
|
|
|
805
804
|
except tuple(exceptions) as exc:
|
|
806
805
|
previous_exception = exc
|
|
807
806
|
if n < times:
|
|
808
|
-
|
|
807
|
+
logger.info(
|
|
809
808
|
f"Retry {n + 1}: {func.__name__} will be executing again in {wait}s. "
|
|
810
809
|
f"Received a {previous_exception!r}."
|
|
811
810
|
)
|
|
@@ -9,14 +9,14 @@ __all__ = [
|
|
|
9
9
|
]
|
|
10
10
|
import logging
|
|
11
11
|
|
|
12
|
-
from egse.system import capture_rich_output
|
|
13
|
-
from egse.system import flatten_dict
|
|
14
12
|
from rich.table import Table
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
from egse.log import logger
|
|
15
|
+
from egse.system import capture_rich_output
|
|
16
|
+
from egse.system import flatten_dict
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def log_differences(dict_1, dict_2):
|
|
19
|
+
def log_differences(dict_1, dict_2, log_level: int = logging.INFO):
|
|
20
20
|
"""
|
|
21
21
|
Takes two flattened dictionaries and compares them. This function only compares those
|
|
22
22
|
keys that are common to both dictionaries. The key-value pairs that are unique to one
|
|
@@ -49,13 +49,14 @@ def log_differences(dict_1, dict_2):
|
|
|
49
49
|
for name in sorted(mismatched):
|
|
50
50
|
table.add_row(name, str(dict_1[name]), str(dict_2[name]))
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
# rich.print(table)
|
|
52
|
+
logger.log(log_level, capture_rich_output(table))
|
|
54
53
|
else:
|
|
55
|
-
|
|
54
|
+
logger.log(
|
|
55
|
+
log_level, f"No differences between the two flattened dictionaries, {len(all_keys)} values compared."
|
|
56
|
+
)
|
|
56
57
|
|
|
57
58
|
|
|
58
|
-
def log_key_differences(dict_1, dict_2):
|
|
59
|
+
def log_key_differences(dict_1, dict_2, log_level: int = logging.INFO):
|
|
59
60
|
"""
|
|
60
61
|
Takes two dictionaries and compares the top-level keys. The differences are logged in a Rich Table at level=INFO.
|
|
61
62
|
Keys that are present on both dictionaries are not logged.
|
|
@@ -81,7 +82,7 @@ def log_key_differences(dict_1, dict_2):
|
|
|
81
82
|
not_in_s1 = s2 - s1
|
|
82
83
|
|
|
83
84
|
if not not_in_s1 and not not_in_s2:
|
|
84
|
-
|
|
85
|
+
logger.log(log_level, "Both dictionaries contains the same keys.")
|
|
85
86
|
|
|
86
87
|
table = Table("Dictionary 1", "Dictionary 2", title="Key differences", title_justify="left")
|
|
87
88
|
|
|
@@ -91,11 +92,11 @@ def log_key_differences(dict_1, dict_2):
|
|
|
91
92
|
for key in not_in_s1:
|
|
92
93
|
table.add_row("", str(key))
|
|
93
94
|
|
|
94
|
-
|
|
95
|
+
logger.log(log_level, capture_rich_output(table))
|
|
95
96
|
|
|
96
97
|
|
|
97
98
|
if __name__ == "__main__":
|
|
98
|
-
|
|
99
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
99
100
|
|
|
100
101
|
d1 = {
|
|
101
102
|
"A": 1,
|
|
@@ -115,7 +116,7 @@ if __name__ == "__main__":
|
|
|
115
116
|
"C": 3,
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
log_differences(d1, d2)
|
|
119
|
-
log_key_differences(d1, d2)
|
|
119
|
+
log_differences(d1, d2, logging.DEBUG)
|
|
120
|
+
log_key_differences(d1, d2, logging.DEBUG)
|
|
120
121
|
|
|
121
|
-
log_differences(d1, d3)
|
|
122
|
+
log_differences(d1, d3, logging.DEBUG)
|
|
@@ -63,11 +63,11 @@ __all__ = [
|
|
|
63
63
|
]
|
|
64
64
|
|
|
65
65
|
import contextlib
|
|
66
|
-
import logging
|
|
67
66
|
import os
|
|
68
67
|
import warnings
|
|
69
68
|
from pathlib import Path
|
|
70
69
|
|
|
70
|
+
from egse.log import logger
|
|
71
71
|
from egse.system import all_logging_disabled
|
|
72
72
|
from egse.system import get_caller_info
|
|
73
73
|
from egse.system import ignore_m_warning
|
|
@@ -75,7 +75,6 @@ from egse.system import ignore_m_warning
|
|
|
75
75
|
from rich.console import Console
|
|
76
76
|
|
|
77
77
|
console = Console(width=100)
|
|
78
|
-
logger = logging.getLogger("egse.env")
|
|
79
78
|
|
|
80
79
|
# Every project shall have a PROJECT and a SITE_ID environment variable set. This variable will be used to
|
|
81
80
|
# create the other environment variables that are specific to the project.
|
|
@@ -484,7 +483,7 @@ def get_local_settings_path() -> str or None:
|
|
|
484
483
|
|
|
485
484
|
def has_conf_repo_location() -> bool:
|
|
486
485
|
location = _env.get("CONF_REPO_LOCATION")
|
|
487
|
-
return True if location else False
|
|
486
|
+
return True if location in (None, NoValue) else False
|
|
488
487
|
|
|
489
488
|
|
|
490
489
|
def get_conf_repo_location_env_name() -> str:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
-
import logging
|
|
5
4
|
import pickle
|
|
6
5
|
import queue
|
|
7
6
|
import random
|
|
@@ -13,8 +12,6 @@ import zmq
|
|
|
13
12
|
from egse.system import format_datetime
|
|
14
13
|
from egse.zmq_ser import MessageIdentifier
|
|
15
14
|
|
|
16
|
-
_LOGGER = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
15
|
|
|
19
16
|
def _g_tick(period: float):
|
|
20
17
|
"""Generator for ticks every period [s]."""
|
|
@@ -10,7 +10,6 @@ __all__ = [
|
|
|
10
10
|
]
|
|
11
11
|
import csv
|
|
12
12
|
import datetime
|
|
13
|
-
import logging
|
|
14
13
|
from enum import Enum
|
|
15
14
|
from pathlib import Path
|
|
16
15
|
from typing import Optional
|
|
@@ -19,9 +18,11 @@ from typing import Union
|
|
|
19
18
|
import dateutil.parser as date_parser
|
|
20
19
|
import numpy as np
|
|
21
20
|
import pandas as pd
|
|
21
|
+
|
|
22
22
|
from egse.config import find_files
|
|
23
23
|
from egse.env import get_data_storage_location
|
|
24
24
|
from egse.env import get_site_id
|
|
25
|
+
from egse.log import logger
|
|
25
26
|
from egse.obsid import ObservationIdentifier
|
|
26
27
|
from egse.obsid import obsid_from_storage
|
|
27
28
|
from egse.setup import Setup
|
|
@@ -33,8 +34,6 @@ from egse.system import read_last_lines
|
|
|
33
34
|
from egse.system import str_to_datetime
|
|
34
35
|
from egse.system import time_since_epoch_1958
|
|
35
36
|
|
|
36
|
-
_LOGGER = logging.getLogger(__name__)
|
|
37
|
-
|
|
38
37
|
|
|
39
38
|
class TmDictionaryColumns(str, Enum):
|
|
40
39
|
"""Enumeration of the relevant columns in the TM dictionary spreadsheet.
|
|
@@ -438,7 +437,7 @@ def _get_housekeeping_daily(hk_name: str, data_dir, time_window: int = None, set
|
|
|
438
437
|
# (those will have to be read entirely)
|
|
439
438
|
|
|
440
439
|
else:
|
|
441
|
-
|
|
440
|
+
logger.warning(f"No HK available for {origin} on {start_time.day}/{start_time.month}/{start_time.year}")
|
|
442
441
|
|
|
443
442
|
day = (start_time + datetime.timedelta(days=1)).date() # The day after the first day
|
|
444
443
|
last_day = datetime.date(now.year, now.month, now.day) # Today
|
|
@@ -463,7 +462,7 @@ def _get_housekeeping_daily(hk_name: str, data_dir, time_window: int = None, set
|
|
|
463
462
|
hk_array = np.append(hk_array, row[hk_index])
|
|
464
463
|
|
|
465
464
|
else:
|
|
466
|
-
|
|
465
|
+
logger.warning(f"No HK available for {origin} on {day.day}/{day.month}/{day.year}")
|
|
467
466
|
|
|
468
467
|
day += datetime.timedelta(days=1)
|
|
469
468
|
|
|
@@ -673,7 +672,7 @@ def read_conversion_dict(storage_mnemonic: str, use_site: bool = False, setup: O
|
|
|
673
672
|
|
|
674
673
|
else:
|
|
675
674
|
if len(original_name_col) != len(correct_name_col):
|
|
676
|
-
|
|
675
|
+
logger.error(
|
|
677
676
|
f"Name columns in TM dictionary have different length: "
|
|
678
677
|
f"{len(original_name_col)} != {len(correct_name_col)}"
|
|
679
678
|
)
|