cgse 0.15.1__tar.gz → 0.16.0__tar.gz

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