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.
Files changed (536) hide show
  1. {cgse-0.13.1 → cgse-0.14.1}/PKG-INFO +1 -1
  2. cgse-0.14.1/docs/libs/cgse-core/notifyhub.md +168 -0
  3. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/pyproject.toml +1 -1
  4. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/cgse.py +1 -0
  5. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/calibration.py +2 -2
  6. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/config.py +3 -27
  7. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/counter.py +4 -8
  8. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/decorators.py +11 -12
  9. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/device.py +0 -1
  10. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/dicts.py +15 -14
  11. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/env.py +2 -3
  12. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/heartbeat.py +0 -3
  13. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/hk.py +5 -6
  14. cgse-0.14.1/libs/cgse-common/src/egse/log.py +163 -0
  15. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/metrics.py +1 -4
  16. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugin.py +14 -10
  17. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/process.py +21 -23
  18. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/resource.py +6 -9
  19. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/scpi.py +1 -3
  20. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/settings.py +4 -5
  21. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/setup.py +176 -127
  22. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/signal.py +1 -3
  23. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/socketdevice.py +1 -4
  24. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/state.py +5 -30
  25. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/system.py +3 -3
  26. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/zmq_ser.py +5 -2
  27. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/empty_process.py +3 -3
  28. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/process_with_children.py +4 -3
  29. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_decorators.py +7 -2
  30. cgse-0.14.1/libs/cgse-common/tests/test_log.py +46 -0
  31. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_plugin.py +14 -3
  32. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_process.py +10 -1
  33. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_setup.py +45 -21
  34. cgse-0.14.1/libs/cgse-common/tests/test_state.py +21 -0
  35. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/pyproject.toml +1 -1
  36. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/pyproject.toml +7 -3
  37. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/_start.py +14 -0
  38. cgse-0.14.1/libs/cgse-core/src/cgse_core/_stop.py +125 -0
  39. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/cgse_explore.py +1 -1
  40. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/services.py +27 -3
  41. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/settings.yaml +7 -1
  42. cgse-0.14.1/libs/cgse-core/src/egse/_setup_core.py +154 -0
  43. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/command.py +1 -6
  44. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/__init__.py +40 -29
  45. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/confman_cs.py +20 -18
  46. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/control.py +59 -34
  47. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/dummy.py +79 -79
  48. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/listener.py +4 -5
  49. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/__init__.py +88 -50
  50. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/log_cs.py +55 -28
  51. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/mixin.py +11 -14
  52. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/monitoring.py +14 -16
  53. cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/__init__.py +63 -0
  54. cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/client.py +258 -0
  55. cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/event.py +29 -0
  56. cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/server.py +354 -0
  57. cgse-0.14.1/libs/cgse-core/src/egse/notifyhub/services.py +301 -0
  58. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/notifyhub/test.py +16 -9
  59. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_cs.py +14 -12
  60. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/protocol.py +1 -3
  61. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/proxy.py +8 -3
  62. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/__init__.py +19 -0
  63. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/client.py +7 -5
  64. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/server.py +20 -16
  65. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/services.py +14 -15
  66. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/__init__.py +34 -31
  67. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/storage_cs.py +38 -18
  68. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/helpers.py +7 -0
  69. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/services.py +25 -5
  70. cgse-0.14.1/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +29 -0
  71. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_async_control.py +2 -0
  72. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_client_server_interaction.py +41 -3
  73. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_cm_cs.py +18 -6
  74. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_command.py +0 -1
  75. cgse-0.14.1/libs/cgse-core/tests/test_dummy.py +68 -0
  76. cgse-0.14.1/libs/cgse-core/tests/test_event_notification.py +182 -0
  77. cgse-0.14.1/libs/cgse-core/tests/test_extensions.py +10 -0
  78. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_logger.py +10 -3
  79. cgse-0.14.1/libs/cgse-core/tests/test_notify_hub.py +170 -0
  80. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_registry_service.py +128 -54
  81. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_server_running.py +5 -8
  82. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_server_running_with_fixture.py +5 -9
  83. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/pyproject.toml +1 -1
  84. {cgse-0.13.1 → cgse-0.14.1}/mkdocs.yml +1 -0
  85. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/pyproject.toml +1 -1
  86. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +2 -1
  87. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
  88. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
  89. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
  90. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/pyproject.toml +1 -1
  91. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/pyproject.toml +1 -1
  92. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/pyproject.toml +1 -1
  93. {cgse-0.13.1 → cgse-0.14.1}/pyproject.toml +2 -2
  94. {cgse-0.13.1 → cgse-0.14.1}/service_registry.db +0 -0
  95. cgse-0.13.1/libs/cgse-common/tests/test_state.py +0 -9
  96. cgse-0.13.1/libs/cgse-core/src/cgse_core/_stop.py +0 -75
  97. cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -8
  98. cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/event.py +0 -11
  99. cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/server.py +0 -155
  100. cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/services.py +0 -179
  101. cgse-0.13.1/service_registry.db-shm +0 -0
  102. cgse-0.13.1/service_registry.db-wal +0 -0
  103. {cgse-0.13.1 → cgse-0.14.1}/.github/workflows/ruff-format-check.yaml +0 -0
  104. {cgse-0.13.1 → cgse-0.14.1}/.gitignore +0 -0
  105. {cgse-0.13.1 → cgse-0.14.1}/README.md +0 -0
  106. {cgse-0.13.1 → cgse-0.14.1}/bump.py +0 -0
  107. {cgse-0.13.1 → cgse-0.14.1}/conftest.py +0 -0
  108. {cgse-0.13.1 → cgse-0.14.1}/docs/api/bits.md +0 -0
  109. {cgse-0.13.1 → cgse-0.14.1}/docs/api/calibration.md +0 -0
  110. {cgse-0.13.1 → cgse-0.14.1}/docs/api/command.md +0 -0
  111. {cgse-0.13.1 → cgse-0.14.1}/docs/api/config.md +0 -0
  112. {cgse-0.13.1 → cgse-0.14.1}/docs/api/control.md +0 -0
  113. {cgse-0.13.1 → cgse-0.14.1}/docs/api/counter.md +0 -0
  114. {cgse-0.13.1 → cgse-0.14.1}/docs/api/decorators.md +0 -0
  115. {cgse-0.13.1 → cgse-0.14.1}/docs/api/device.md +0 -0
  116. {cgse-0.13.1 → cgse-0.14.1}/docs/api/dicts.md +0 -0
  117. {cgse-0.13.1 → cgse-0.14.1}/docs/api/dummy.md +0 -0
  118. {cgse-0.13.1 → cgse-0.14.1}/docs/api/env.md +0 -0
  119. {cgse-0.13.1 → cgse-0.14.1}/docs/api/exceptions.md +0 -0
  120. {cgse-0.13.1 → cgse-0.14.1}/docs/api/heartbeat.md +0 -0
  121. {cgse-0.13.1 → cgse-0.14.1}/docs/api/hk.md +0 -0
  122. {cgse-0.13.1 → cgse-0.14.1}/docs/api/index.md +0 -0
  123. {cgse-0.13.1 → cgse-0.14.1}/docs/api/listener.md +0 -0
  124. {cgse-0.13.1 → cgse-0.14.1}/docs/api/metrics.md +0 -0
  125. {cgse-0.13.1 → cgse-0.14.1}/docs/api/mixin.md +0 -0
  126. {cgse-0.13.1 → cgse-0.14.1}/docs/api/monitoring.md +0 -0
  127. {cgse-0.13.1 → cgse-0.14.1}/docs/api/observer.md +0 -0
  128. {cgse-0.13.1 → cgse-0.14.1}/docs/api/obsid.md +0 -0
  129. {cgse-0.13.1 → cgse-0.14.1}/docs/api/persistence.md +0 -0
  130. {cgse-0.13.1 → cgse-0.14.1}/docs/api/plugin.md +0 -0
  131. {cgse-0.13.1 → cgse-0.14.1}/docs/api/process.md +0 -0
  132. {cgse-0.13.1 → cgse-0.14.1}/docs/api/reload.md +0 -0
  133. {cgse-0.13.1 → cgse-0.14.1}/docs/api/settings.md +0 -0
  134. {cgse-0.13.1 → cgse-0.14.1}/docs/api/setup.md +0 -0
  135. {cgse-0.13.1 → cgse-0.14.1}/docs/api/system.md +0 -0
  136. {cgse-0.13.1 → cgse-0.14.1}/docs/custom_theme/main.html +0 -0
  137. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/coding_style.md +0 -0
  138. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/docs.md +0 -0
  139. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/index.md +0 -0
  140. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/installation.md +0 -0
  141. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/monitoring.md +0 -0
  142. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/monorepo.md +0 -0
  143. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/nox.md +0 -0
  144. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/plugins.md +0 -0
  145. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/project-configuration.md +0 -0
  146. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/unit_testing.md +0 -0
  147. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/uv.md +0 -0
  148. {cgse-0.13.1 → cgse-0.14.1}/docs/dev_guide/versioning.md +0 -0
  149. {cgse-0.13.1 → cgse-0.14.1}/docs/getting_started.md +0 -0
  150. {cgse-0.13.1 → cgse-0.14.1}/docs/help.md +0 -0
  151. {cgse-0.13.1 → cgse-0.14.1}/docs/images/github-fork-clone-dark.png +0 -0
  152. {cgse-0.13.1 → cgse-0.14.1}/docs/images/github-fork-clone.png +0 -0
  153. {cgse-0.13.1 → cgse-0.14.1}/docs/images/grafana-queries.png +0 -0
  154. {cgse-0.13.1 → cgse-0.14.1}/docs/images/icons/cgse-logo-blue.svg +0 -0
  155. {cgse-0.13.1 → cgse-0.14.1}/docs/images/icons/cgse-logo.svg +0 -0
  156. {cgse-0.13.1 → cgse-0.14.1}/docs/index.md +0 -0
  157. {cgse-0.13.1 → cgse-0.14.1}/docs/initialize.md +0 -0
  158. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/images/load_methods.png +0 -0
  159. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/index.md +0 -0
  160. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/settings.md +0 -0
  161. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-common/setup.md +0 -0
  162. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-coordinates/index.md +0 -0
  163. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-core/index.md +0 -0
  164. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-core/registry.md +0 -0
  165. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/cgse-gui/index.md +0 -0
  166. {cgse-0.13.1 → cgse-0.14.1}/docs/libs/index.md +0 -0
  167. {cgse-0.13.1 → cgse-0.14.1}/docs/package_list.md +0 -0
  168. {cgse-0.13.1 → cgse-0.14.1}/docs/projects/cgse-tools.md +0 -0
  169. {cgse-0.13.1 → cgse-0.14.1}/docs/projects/index.md +0 -0
  170. {cgse-0.13.1 → cgse-0.14.1}/docs/projects/symetrie-hexapod.md +0 -0
  171. {cgse-0.13.1 → cgse-0.14.1}/docs/roadmap.md +0 -0
  172. {cgse-0.13.1 → cgse-0.14.1}/docs/stylesheets/custom.css +0 -0
  173. {cgse-0.13.1 → cgse-0.14.1}/docs/stylesheets/extra.css +0 -0
  174. {cgse-0.13.1 → cgse-0.14.1}/docs/tutorial.md +0 -0
  175. {cgse-0.13.1 → cgse-0.14.1}/docs/user_guide/index.md +0 -0
  176. {cgse-0.13.1 → cgse-0.14.1}/duckdb_metrics.db +0 -0
  177. {cgse-0.13.1 → cgse-0.14.1}/duckdb_metrics.db.wal +0 -0
  178. {cgse-0.13.1 → cgse-0.14.1}/identifier.sqlite +0 -0
  179. {cgse-0.13.1 → cgse-0.14.1}/justfile +0 -0
  180. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/README.md +0 -0
  181. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/justfile +0 -0
  182. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/noxfile.py +0 -0
  183. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/service_registry.db +0 -0
  184. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
  185. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
  186. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/bits.py +0 -0
  187. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/exceptions.py +0 -0
  188. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/observer.py +0 -0
  189. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/obsid.py +0 -0
  190. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/persistence.py +0 -0
  191. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
  192. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
  193. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
  194. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/py.typed +0 -0
  195. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/randomwalk.py +0 -0
  196. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/ratelimit.py +0 -0
  197. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/reload.py +0 -0
  198. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/response.py +0 -0
  199. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/settings.yaml +0 -0
  200. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/task.py +0 -0
  201. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/src/egse/version.py +0 -0
  202. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/conftest.py +0 -0
  203. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/COPYING +0 -0
  204. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  205. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  206. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  207. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  208. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  209. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  210. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  211. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  212. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  213. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  214. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  215. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  216. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  217. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  218. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  219. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  220. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  221. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  222. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  223. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  224. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  225. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  226. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/command.yaml +0 -0
  227. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  228. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  229. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  230. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
  231. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
  232. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
  233. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  234. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
  235. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  236. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
  237. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  238. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  239. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
  240. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
  241. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
  242. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
  243. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/void-0.py +0 -0
  244. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/scripts/void-1.py +0 -0
  245. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_bits.py +0 -0
  246. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_config.py +0 -0
  247. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_device.py +0 -0
  248. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_env.py +0 -0
  249. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_fixtures.py +0 -0
  250. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_hk.py +0 -0
  251. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
  252. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_metrics.py +0 -0
  253. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_ratelimit.py +0 -0
  254. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_resource.py +0 -0
  255. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_response.py +0 -0
  256. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_settings.py +0 -0
  257. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_signal.py +0 -0
  258. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_system.py +0 -0
  259. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_task.py +0 -0
  260. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
  261. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/README.md +0 -0
  262. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
  263. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
  264. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
  265. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
  266. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
  267. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
  268. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
  269. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
  270. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
  271. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
  272. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
  273. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
  274. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
  275. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
  276. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
  277. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_point.py +0 -0
  278. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
  279. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
  280. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
  281. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/.envrc.disabled +0 -0
  282. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/README.md +0 -0
  283. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/service_registry.db +0 -0
  284. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
  285. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/cgse_core/_status.py +0 -0
  286. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/async_control.py +0 -0
  287. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/async_control_claude.py +0 -0
  288. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  289. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  290. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
  291. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
  292. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
  293. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
  294. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
  295. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
  296. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
  297. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
  298. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
  299. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
  300. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
  301. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  302. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
  303. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
  304. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/backend.py +0 -0
  305. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/registry/service.py +0 -0
  306. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/src/egse/services.yaml +0 -0
  307. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  308. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
  309. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  310. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/conftest.py +0 -0
  311. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
  312. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
  313. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
  314. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
  315. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
  316. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
  317. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/services.py +0 -0
  318. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
  319. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_confman_setups.py +0 -0
  320. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_control.py +0 -0
  321. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_listener.py +0 -0
  322. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_mixin.py +0 -0
  323. {cgse-0.13.1/libs/cgse-common → cgse-0.14.1/libs/cgse-core}/tests/test_protocol.py +0 -0
  324. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_registry_backend.py +0 -0
  325. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_settings_core.py +0 -0
  326. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
  327. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/README.md +0 -0
  328. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
  329. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
  330. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  331. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  332. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  333. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  334. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  335. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  336. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  337. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  338. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  339. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  340. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  341. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  342. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  343. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  344. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  345. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  346. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  347. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  348. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  349. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  350. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  351. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  352. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  353. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  354. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  355. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  356. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  357. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  358. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  359. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  360. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  361. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  362. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  363. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  364. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  365. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  366. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  367. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  368. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  369. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  370. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  371. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  372. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  373. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  374. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  375. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  376. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  377. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  378. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  379. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  380. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  381. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  382. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  383. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  384. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  385. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  386. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  387. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  388. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  389. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  390. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  391. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  392. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  393. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  394. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  395. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  396. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  397. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  398. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  399. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  400. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  401. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  402. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  403. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  404. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  405. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  406. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  407. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  408. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  409. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  410. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  411. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  412. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  413. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  414. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  415. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  416. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  417. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  418. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  419. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  420. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  421. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  422. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  423. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  424. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  425. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  426. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  427. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  428. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  429. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  430. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  431. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  432. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  433. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  434. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  435. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  436. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  437. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  438. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  439. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  440. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  441. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/led.py +0 -0
  442. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
  443. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/states.py +0 -0
  444. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  445. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  446. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  447. {cgse-0.13.1 → cgse-0.14.1}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
  448. {cgse-0.13.1 → cgse-0.14.1}/noxfile.py +0 -0
  449. {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/dbend-dark.svg +0 -0
  450. {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/dbend-light.svg +0 -0
  451. {cgse-0.13.1 → cgse-0.14.1}/overrides/.icons/custom/gear.svg +0 -0
  452. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/README.md +0 -0
  453. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
  454. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
  455. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
  456. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
  457. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/README.md +0 -0
  458. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/justfile +0 -0
  459. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
  460. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
  461. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
  462. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
  463. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
  464. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
  465. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
  466. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
  467. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
  468. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
  469. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
  470. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
  471. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
  472. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
  473. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
  474. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
  475. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
  476. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
  477. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
  478. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
  479. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
  480. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
  481. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
  482. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
  483. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
  484. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
  485. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
  486. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
  487. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
  488. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
  489. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/README.md +0 -0
  490. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
  491. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
  492. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
  493. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
  494. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
  495. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
  496. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
  497. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  498. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
  499. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
  500. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
  501. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
  502. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
  503. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
  504. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  505. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
  506. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
  507. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
  508. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
  509. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
  510. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
  511. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  512. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
  513. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
  514. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
  515. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
  516. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
  517. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
  518. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
  519. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
  520. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
  521. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
  522. {cgse-0.13.1 → cgse-0.14.1}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
  523. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/README.md +0 -0
  524. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
  525. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/README.md +0 -0
  526. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
  527. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/README.md +0 -0
  528. {cgse-0.13.1 → cgse-0.14.1}/projects/plato/plato-spw/src/egse/spw.py +0 -0
  529. {cgse-0.13.1 → cgse-0.14.1}/ruff.toml +0 -0
  530. {cgse-0.13.1 → cgse-0.14.1}/scratch/advanced-process-monitoring.py +0 -0
  531. {cgse-0.13.1 → cgse-0.14.1}/scratch/live-process-monitoring.py +0 -0
  532. {cgse-0.13.1 → cgse-0.14.1}/scratch/match-case.py +0 -0
  533. {cgse-0.13.1 → cgse-0.14.1}/scratch/processes.json +0 -0
  534. {cgse-0.13.1 → cgse-0.14.1}/scratch/simple-process-monitoring.py +0 -0
  535. {cgse-0.13.1 → cgse-0.14.1}/temperature_readings.log +0 -0
  536. {cgse-0.13.1 → cgse-0.14.1}/test_service_registry.db +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 0.13.1
3
+ Version: 0.14.1
4
4
  Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
5
5
  Author: IvS KU Leuven
6
6
  Maintainer-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
@@ -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.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "0.13.1"
3
+ version = "0.14.1"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -184,6 +184,7 @@ def main(ctx: typer.Context, verbose: bool = False):
184
184
  # print("Try 'cgse --help' for a list of commands.")
185
185
  typer.echo(ctx.get_help())
186
186
 
187
+
187
188
  build_app()
188
189
 
189
190
 
@@ -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 navdict, Setup, SetupError
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 List
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 git
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
- _logger.warning(f"Change back to previous directory failed: {exc}")
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
- _LOGGER.debug(f"{counter = }")
169
+ logger.debug(f"{counter = }")
174
170
  return counter
175
171
 
176
172
  except ValueError:
177
- _LOGGER.warning("ValueError", exc_info=True)
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
- _LOGGER.log(
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
- _LOGGER.log(level, f"{name}: function {func.__name__!r} was never called.")
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
- _LOGGER.log(level, f"{name}: Finished {func.__name__!r} in {run_time:.{precision}f} secs")
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
- _LOGGER.log(level, f"{name}: Finished {func.__name__!r} in {run_time:.{precision}f} secs")
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
- _LOGGER.debug(f"Calling {func.__name__}({signature})")
309
+ logger.debug(f"Calling {func.__name__}({signature})")
311
310
  value = func(*args, **kwargs)
312
- _LOGGER.debug(f"{func.__name__!r} returned {value!r}")
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
- _LOGGER.warning(f"The function/method {func.__name__} is not yet implemented.")
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
- _LOGGER.info(f"{func.__name__} successfully executed.")
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
- _LOGGER.info(
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
- _LOGGER.info(
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
  )
@@ -3,7 +3,6 @@ This module defines the generic interfaces to connect devices.
3
3
  """
4
4
 
5
5
  from enum import IntEnum
6
- from typing import List
7
6
 
8
7
  from egse.decorators import dynamic_interface
9
8
  from egse.exceptions import Error
@@ -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
- LOGGER = logging.getLogger(__name__)
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
- LOGGER.info(capture_rich_output(table))
53
- # rich.print(table)
52
+ logger.log(log_level, capture_rich_output(table))
54
53
  else:
55
- LOGGER.info(f"No differences between the two flattened dictionaries, {len(all_keys)} values compared.")
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
- LOGGER.info("Both dictionaries contains the same keys.")
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
- LOGGER.info(capture_rich_output(table))
95
+ logger.log(log_level, capture_rich_output(table))
95
96
 
96
97
 
97
98
  if __name__ == "__main__":
98
- import egse.logger # noqa activates the logger
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
- _LOGGER.warning(f"No HK available for {origin} on {start_time.day}/{start_time.month}/{start_time.year}")
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
- _LOGGER.warning(f"No HK available for {origin} on {day.day}/{day.month}/{day.year}")
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
- _LOGGER.error(
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
  )