cgse 2025.0.8.dev3__tar.gz → 2025.0.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/PKG-INFO +1 -1
  2. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/pyproject.toml +2 -2
  3. cgse-2025.0.9/libs/cgse-common/src/egse/control.py +448 -0
  4. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/device.py +4 -3
  5. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/mixin.py +8 -0
  6. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/protocol.py +3 -3
  7. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/services.py +1 -1
  8. cgse-2025.0.9/libs/cgse-common/tests/test_mixin.py +358 -0
  9. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/pyproject.toml +1 -1
  10. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/pyproject.toml +1 -1
  11. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/procman/__init__.py +1 -1
  12. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/pyproject.toml +1 -1
  13. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/pyproject.toml +2 -1
  14. cgse-2025.0.9/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +47 -0
  15. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +16 -0
  16. cgse-2025.0.9/projects/generic/keithley-tempcontrol/README.md +9 -0
  17. cgse-2025.0.9/projects/generic/keithley-tempcontrol/pyproject.toml +64 -0
  18. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +4 -0
  19. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +723 -0
  20. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +102 -0
  21. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +197 -0
  22. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_devif.py +359 -0
  23. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +105 -0
  24. cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +22 -0
  25. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
  26. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-fits/pyproject.toml +1 -1
  27. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-hdf5/pyproject.toml +1 -1
  28. cgse-2025.0.9/projects/plato/plato-spw/README.md +0 -0
  29. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-spw/pyproject.toml +1 -1
  30. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/pyproject.toml +2 -2
  31. cgse-2025.0.8.dev3/libs/cgse-common/src/egse/control.py +0 -348
  32. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/.gitignore +0 -0
  33. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/NOTES.md +0 -0
  34. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/README.md +0 -0
  35. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/TODO.md +0 -0
  36. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/bump.py +0 -0
  37. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/conftest.py +0 -0
  38. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/custom_theme/main.html +0 -0
  39. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/dev_guide/coding_style.md +0 -0
  40. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/dev_guide/docs.md +0 -0
  41. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/dev_guide/index.md +0 -0
  42. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/dev_guide/installation.md +0 -0
  43. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/dev_guide/uv.md +0 -0
  44. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/getting_started.md +0 -0
  45. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/help.md +0 -0
  46. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/images/icons/cgse-logo-blue.svg +0 -0
  47. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/images/icons/cgse-logo.svg +0 -0
  48. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/index.md +0 -0
  49. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-common/images/load_methods.png +0 -0
  50. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-common/index.md +0 -0
  51. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-common/settings.md +0 -0
  52. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-common/setup.md +0 -0
  53. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-coordinates/index.md +0 -0
  54. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-core/index.md +0 -0
  55. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/cgse-gui/index.md +0 -0
  56. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/libs/index.md +0 -0
  57. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/package_list.md +0 -0
  58. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/projects/cgse-tools.md +0 -0
  59. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/projects/index.md +0 -0
  60. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/projects/symetrie-hexapod.md +0 -0
  61. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/stylesheets/custom.css +0 -0
  62. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/tutorial.md +0 -0
  63. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/docs/user_guide/index.md +0 -0
  64. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/README.md +0 -0
  65. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
  66. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
  67. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/bits.py +0 -0
  68. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/calibration.py +0 -0
  69. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/command.py +0 -0
  70. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/config.py +0 -0
  71. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/decorators.py +0 -0
  72. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/env.py +0 -0
  73. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/exceptions.py +0 -0
  74. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/hk.py +0 -0
  75. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/metrics.py +0 -0
  76. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/monitoring.py +0 -0
  77. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/observer.py +0 -0
  78. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/obsid.py +0 -0
  79. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/persistence.py +0 -0
  80. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/plugin.py +0 -0
  81. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/process.py +0 -0
  82. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/proxy.py +0 -0
  83. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/reload.py +0 -0
  84. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/resource.py +0 -0
  85. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/response.py +0 -0
  86. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/services.yaml +0 -0
  87. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/settings.py +0 -0
  88. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/settings.yaml +0 -0
  89. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/setup.py +0 -0
  90. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/state.py +0 -0
  91. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/system.py +0 -0
  92. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/version.py +0 -0
  93. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
  94. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/conftest.py +0 -0
  95. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  96. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  97. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  98. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  99. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  100. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  101. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  102. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  103. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  104. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  105. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  106. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  107. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  108. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  109. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  110. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  111. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  112. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  113. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  114. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  115. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  116. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  117. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/command.yaml +0 -0
  118. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  119. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  120. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  121. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
  122. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
  123. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  124. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  125. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  126. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  127. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/dummy.py +0 -0
  128. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
  129. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
  130. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_bits.py +0 -0
  131. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_command.py +0 -0
  132. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_config.py +0 -0
  133. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_control.py +0 -0
  134. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_decorators.py +0 -0
  135. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_device.py +0 -0
  136. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_env.py +0 -0
  137. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_fixtures.py +0 -0
  138. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_hk.py +0 -0
  139. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_resource.py +0 -0
  140. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_response.py +0 -0
  141. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_settings.py +0 -0
  142. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_setup.py +0 -0
  143. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-common/tests/test_system.py +0 -0
  144. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/README.md +0 -0
  145. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
  146. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
  147. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
  148. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
  149. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
  150. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
  151. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
  152. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
  153. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
  154. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
  155. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/.envrc.disabled +0 -0
  156. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/README.md +0 -0
  157. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
  158. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
  159. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
  160. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  161. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  162. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
  163. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
  164. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
  165. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/logger/log_cs.py +0 -0
  166. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  167. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
  168. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
  169. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  170. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
  171. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  172. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/egse/storage/storage_cs.py +0 -0
  173. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/scripts/_start.py +0 -0
  174. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/scripts/_status.py +0 -0
  175. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/scripts/_stop.py +0 -0
  176. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/scripts/cgse.py +0 -0
  177. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/src/scripts/services.py +0 -0
  178. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/conftest.py +0 -0
  179. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
  180. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
  181. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
  182. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/fixtures/services.py +0 -0
  183. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/test_confman_setups.py +0 -0
  184. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/test_logger.py +0 -0
  185. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-core/tests/test_settings_core.py +0 -0
  186. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/README.md +0 -0
  187. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
  188. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
  189. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  190. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  191. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  192. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  193. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  194. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  195. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  196. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  197. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  198. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  199. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  200. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  201. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  202. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  203. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  204. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  205. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  206. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  207. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  208. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  209. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  210. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  211. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  212. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  213. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  214. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  215. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  216. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  217. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  218. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  219. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  220. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  221. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  222. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  223. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  224. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  225. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  226. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  227. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  228. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  229. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  230. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  231. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  232. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  233. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  234. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  235. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  236. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  237. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  238. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  239. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  240. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  241. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  242. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  243. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  244. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  245. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  246. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  247. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  248. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  249. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  250. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  251. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  252. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  253. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  254. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  255. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  256. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  257. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  258. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  259. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  260. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  261. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  262. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  263. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  264. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  265. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  266. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  267. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  268. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  269. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  270. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  271. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  272. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  273. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  274. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  275. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  276. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  277. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  278. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  279. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  280. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  281. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  282. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  283. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  284. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  285. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  286. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  287. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  288. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  289. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  290. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  291. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  292. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  293. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  294. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  295. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  296. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  297. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  298. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  299. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  300. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/led.py +0 -0
  301. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
  302. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/states.py +0 -0
  303. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  304. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  305. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  306. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
  307. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/mkdocs.yml +0 -0
  308. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/README.md +0 -0
  309. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
  310. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
  311. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
  312. /cgse-2025.0.8.dev3/projects/plato/plato-hdf5/README.md → /cgse-2025.0.9/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
  313. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/README.md +0 -0
  314. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
  315. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
  316. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
  317. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
  318. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
  319. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
  320. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  321. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
  322. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
  323. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
  324. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
  325. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
  326. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
  327. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  328. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
  329. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
  330. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
  331. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
  332. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
  333. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  334. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
  335. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
  336. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
  337. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
  338. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/generic/symetrie-hexapod/src/scripts/cgse_service_plugins.py +0 -0
  339. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-fits/README.md +0 -0
  340. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
  341. {cgse-2025.0.8.dev3/projects/plato/plato-spw → cgse-2025.0.9/projects/plato/plato-hdf5}/README.md +0 -0
  342. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
  343. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/projects/plato/plato-spw/src/egse/spw.py +0 -0
  344. {cgse-2025.0.8.dev3 → cgse-2025.0.9}/ruff.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 2025.0.8.dev3
3
+ Version: 2025.0.9
4
4
  Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
5
5
  Author-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "2025.0.8-dev.3"
3
+ version = "2025.0.9"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IVS KU Leuven"}
@@ -42,7 +42,7 @@ cgse-common = "cgse_common:settings.yaml"
42
42
  [tool.pytest.ini_options]
43
43
  pythonpath = "src"
44
44
  testpaths = ["tests"]
45
- addopts = "-ra --cov --cov-branch --cov-report html"
45
+ addopts = "-rA --cov --cov-branch --cov-report html"
46
46
  filterwarnings = [
47
47
  "ignore::DeprecationWarning"
48
48
  ]
@@ -0,0 +1,448 @@
1
+ """
2
+ This module defines the abstract class for any Control Server and some convenience functions.
3
+ """
4
+
5
+ import abc
6
+ import logging
7
+ import pickle
8
+ import threading
9
+ from typing import Union
10
+
11
+ import zmq
12
+
13
+ from egse.system import time_in_ms
14
+
15
+ try:
16
+ from egse.logger import close_all_zmq_handlers
17
+ except ImportError:
18
+ def close_all_zmq_handlers(): # noqa
19
+ pass
20
+
21
+ from egse.process import ProcessStatus
22
+ from egse.settings import Settings
23
+ from egse.system import do_every
24
+ from egse.system import get_average_execution_time
25
+ from egse.system import get_average_execution_times
26
+ from egse.system import get_full_classname
27
+ from egse.system import get_host_ip
28
+ from egse.system import save_average_execution_time
29
+
30
+ MODULE_LOGGER = logging.getLogger(__name__)
31
+ PROCESS_SETTINGS = Settings.load("PROCESS")
32
+
33
+
34
+ def is_control_server_active(endpoint: str = None, timeout: float = 0.5) -> bool:
35
+ """ Checks if the Control Server is running.
36
+
37
+ This function sends a *Ping* message to the Control Server and expects a *Pong* answer back within the timeout
38
+ period.
39
+
40
+ Args:
41
+ endpoint (str): Endpoint to connect to, i.e. <protocol>://<address>:<port>
42
+ timeout (float): Timeout when waiting for a reply [s, default=0.5]
43
+
44
+ Returns: True if the Control Server is running and replied with the expected answer; False otherwise.
45
+ """
46
+
47
+ ctx = zmq.Context.instance()
48
+
49
+ return_code = False
50
+
51
+ try:
52
+ socket = ctx.socket(zmq.REQ)
53
+ socket.connect(endpoint)
54
+ data = pickle.dumps("Ping")
55
+ socket.send(data)
56
+ rlist, _, _ = zmq.select([socket], [], [], timeout=timeout)
57
+
58
+ if socket in rlist:
59
+ data = socket.recv()
60
+ response = pickle.loads(data)
61
+ return_code = response == "Pong"
62
+ socket.close(linger=0)
63
+ except Exception as exc:
64
+ MODULE_LOGGER.warning(f"Caught an exception while pinging a control server at {endpoint}: {exc}.")
65
+
66
+ return return_code
67
+
68
+
69
+ class ControlServer(metaclass=abc.ABCMeta):
70
+ """ Base class for all device control servers and for the Storage Manager and Configuration Manager.
71
+
72
+ A Control Server reads commands from a ZeroMQ socket and executes these commands by calling the `execute()` method
73
+ of the commanding protocol class.
74
+
75
+ The sub-class shall define the following:
76
+
77
+ - Define the device protocol class -> `self.device_protocol`
78
+ - Bind the command socket to the device protocol -> `self.dev_ctrl_cmd_sock`
79
+ - Register the command socket in the poll set -> `self.poller`
80
+
81
+ """
82
+
83
+ def __init__(self):
84
+ """ Initialisation of a new Control Server."""
85
+
86
+ from egse.monitoring import MonitoringProtocol
87
+ from egse.services import ServiceProtocol
88
+
89
+ self._process_status = ProcessStatus()
90
+
91
+ self._timer_thread = threading.Thread(
92
+ target=do_every, args=(PROCESS_SETTINGS.METRICS_INTERVAL, self._process_status.update))
93
+ self._timer_thread.daemon = True
94
+ self._timer_thread.start()
95
+
96
+ # The logger will be overwritten by the sub-class, if not, we use this logger with the name of the sub-class.
97
+ # That will help us to identify which sub-class did not overwrite the logger attribute.
98
+
99
+ self.logger = logging.getLogger(get_full_classname(self))
100
+
101
+ self.interrupted = False
102
+ self.mon_delay = 1000 # Delay between publish status information [ms]
103
+ self.hk_delay = 1000 # Delay between saving housekeeping information [ms]
104
+
105
+ self.zcontext = zmq.Context.instance()
106
+ self.poller = zmq.Poller()
107
+
108
+ self.device_protocol = None # This will be set in the sub-class
109
+ self.service_protocol = ServiceProtocol(self)
110
+ self.monitoring_protocol = MonitoringProtocol(self)
111
+
112
+ # Set up the Control Server waiting for service requests
113
+
114
+ self.dev_ctrl_service_sock = self.zcontext.socket(zmq.REP)
115
+ self.service_protocol.bind(self.dev_ctrl_service_sock)
116
+
117
+ # Set up the Control Server for sending monitoring info
118
+
119
+ self.dev_ctrl_mon_sock = self.zcontext.socket(zmq.PUB)
120
+ self.monitoring_protocol.bind(self.dev_ctrl_mon_sock)
121
+
122
+ # Set up the Control Server waiting for device commands.
123
+ # The device protocol shall bind the socket in the sub-class
124
+
125
+ self.dev_ctrl_cmd_sock = self.zcontext.socket(zmq.REP)
126
+
127
+ # Initialise the poll set
128
+
129
+ self.poller.register(self.dev_ctrl_service_sock, zmq.POLLIN)
130
+ self.poller.register(self.dev_ctrl_mon_sock, zmq.POLLIN)
131
+
132
+ @abc.abstractmethod
133
+ def get_communication_protocol(self) -> str:
134
+ """ Returns the communication protocol used by the Control Server.
135
+
136
+ Returns: Communication protocol used by the Control Server, as specified in the settings.
137
+ """
138
+
139
+ pass
140
+
141
+ @abc.abstractmethod
142
+ def get_commanding_port(self) -> int:
143
+ """ Returns the commanding port used by the Control Server.
144
+
145
+ Returns: Commanding port used by the Control Server, as specified in the settings.
146
+ """
147
+
148
+ pass
149
+
150
+ @abc.abstractmethod
151
+ def get_service_port(self) -> int:
152
+ """ Returns the service port used by the Control Server.
153
+
154
+ Returns: Service port used by the Control Server, as specified in the settings.
155
+ """
156
+
157
+ pass
158
+
159
+ @abc.abstractmethod
160
+ def get_monitoring_port(self) -> int:
161
+ """ Returns the monitoring port used by the Control Server.
162
+
163
+ Returns: Monitoring port used by the Control Server, as specified in the settings.
164
+ """
165
+
166
+ pass
167
+
168
+ def get_ip_address(self) -> str:
169
+
170
+ return get_host_ip()
171
+
172
+ def get_storage_mnemonic(self) -> str:
173
+ """ Returns the storage mnemonics used by the Control Server.
174
+
175
+ This is a string that will appear in the filename with the housekeeping information of the device, as a way of
176
+ identifying the device. If this is not implemented in the sub-class, then the class name will be used.
177
+
178
+ Returns: Storage mnemonics used by the Control Server, as specified in the settings.
179
+ """
180
+
181
+ return self.__class__.__name__
182
+
183
+ def get_process_status(self) -> dict:
184
+ """ Returns the process status of the Control Server.
185
+
186
+ Returns: Dictionary with the process status of the Control Server.
187
+ """
188
+
189
+ return self._process_status.as_dict()
190
+
191
+ def get_average_execution_times(self) -> dict:
192
+ """ Returns the average execution times of all functions that have been monitored by this process.
193
+
194
+ Returns: Dictionary with the average execution times of all functions that have been monitored by this process.
195
+ The dictionary keys are the function names, and the values are the average execution times in ms.
196
+ """
197
+
198
+ return get_average_execution_times()
199
+
200
+ def set_mon_delay(self, seconds: float) -> float:
201
+ """ Sets the delay time for monitoring.
202
+
203
+ The delay time is the time between two successive executions of the `get_status()` function of the device
204
+ protocol.
205
+
206
+ It might happen that the delay time that is set is longer than what you requested. That is the case when the
207
+ execution of the `get_status()` function takes longer than the requested delay time. That should prevent the
208
+ server from blocking when a too short delay time is requested.
209
+
210
+ Args:
211
+ seconds (float): Number of seconds between the monitoring calls
212
+
213
+ Returns: Delay that was set [ms].
214
+ """
215
+
216
+ execution_time = get_average_execution_time(self.device_protocol.get_status)
217
+ self.mon_delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
218
+
219
+ return self.mon_delay
220
+
221
+ def set_hk_delay(self, seconds: float) -> float:
222
+ """ Sets the delay time for housekeeping.
223
+
224
+ The delay time is the time between two successive executions of the `get_housekeeping()` function of the device
225
+ protocol.
226
+
227
+ It might happen that the delay time that is set is longer than what you requested. That is the case when the
228
+ execution of the `get_housekeeping()` function takes longer than the requested delay time. That should prevent
229
+ the server from blocking when a too short delay time is requested.
230
+
231
+ Args:
232
+ seconds (float): Number of seconds between the housekeeping calls
233
+
234
+ Returns: Delay that was set [ms].
235
+ """
236
+
237
+ execution_time = get_average_execution_time(self.device_protocol.get_housekeeping)
238
+ self.hk_delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
239
+
240
+ return self.hk_delay
241
+
242
+ def set_logging_level(self, level: Union[int, str]) -> None:
243
+ """ Sets the logging level to the given level.
244
+
245
+ Allowed logging levels are:
246
+ - "CRITICAL" or 50
247
+ - "FATAL" or CRITICAL
248
+ - "ERROR" or 40
249
+ - "WARNING" or 30
250
+ - "WARN" or WARNING
251
+ - "INFO" or 20
252
+ - "DEBUG" or 10
253
+ - "NOTSET" or 0
254
+
255
+ Args:
256
+ level (int | str): Logging level to use, specified as either a string or an integer
257
+ """
258
+
259
+ self.logger.setLevel(level=level)
260
+
261
+ def quit(self) -> None:
262
+ """ Interrupts the Control Server."""
263
+
264
+ self.interrupted = True
265
+
266
+ def before_serve(self) -> None:
267
+ """ Steps to take before the Control Server is activated."""
268
+
269
+ pass
270
+
271
+ def after_serve(self) -> None:
272
+ """ Steps to take after the Control Server has been deactivated."""
273
+
274
+ pass
275
+
276
+ def is_storage_manager_active(self) -> bool:
277
+ """ Checks if the Storage Manager is active.
278
+
279
+ This method has to be implemented by the sub-class if you need to store information.
280
+
281
+ Note: You might want to set a specific timeout when checking for the Storage Manager.
282
+
283
+ Note: If this method returns True, the following methods shall also be implemented by the sub-class:
284
+
285
+ - register_to_storage_manager()
286
+ - unregister_from_storage_manager()
287
+ - store_housekeeping_information()
288
+
289
+ Returns: True if the Storage Manager is active; False otherwise.
290
+ """
291
+
292
+ return False
293
+
294
+ def serve(self) -> None:
295
+ """ Activation of the Control Server.
296
+
297
+ This comprises the following steps:
298
+
299
+ - Executing the `before_serve` method;
300
+ - Checking if the Storage Manager is active and registering the Control Server to it;
301
+ - Start listening for keyboard interrupts;
302
+ - Start accepting (listening to) commands;
303
+ - Start sending out monitoring information;
304
+ - Start sending out housekeeping information;
305
+ - Start listening for quit commands;
306
+ - After a quit command has been received:
307
+ - Unregister from the Storage Manager;
308
+ - Execute the `after_serve` method;
309
+ - Close all sockets;
310
+ - Clean up all threads.
311
+ """
312
+
313
+ self.before_serve()
314
+
315
+ # check if Storage Manager is available
316
+
317
+ storage_manager = self.is_storage_manager_active()
318
+
319
+ storage_manager and self.register_to_storage_manager()
320
+
321
+ # This approach is very simplistic and not time efficient
322
+ # We probably want to use a Timer that executes the monitoring and saving actions at
323
+ # dedicated times in the background.
324
+
325
+ # FIXME; we shall use the time.perf_counter() here!
326
+
327
+ last_time = time_in_ms()
328
+ last_time_hk = time_in_ms()
329
+
330
+ while True:
331
+ try:
332
+ socks = dict(self.poller.poll(50)) # timeout in milliseconds, do not block
333
+ except KeyboardInterrupt:
334
+ self.logger.warning("Keyboard interrupt caught!")
335
+ self.logger.warning(
336
+ "The ControlServer can not be interrupted with CTRL-C, send a quit command to the server instead."
337
+ )
338
+ continue
339
+
340
+ if self.dev_ctrl_cmd_sock in socks:
341
+ self.device_protocol.execute()
342
+
343
+ if self.dev_ctrl_service_sock in socks:
344
+ self.service_protocol.execute()
345
+
346
+ # Handle sending out monitoring information periodically, based on the MON_DELAY time that is specified in
347
+ # the YAML configuration file for the device
348
+
349
+ if time_in_ms() - last_time >= self.mon_delay:
350
+ last_time = time_in_ms()
351
+ # self.logger.debug("Sending status to monitoring processes.")
352
+ self.monitoring_protocol.send_status(
353
+ save_average_execution_time(self.device_protocol.get_status)
354
+ )
355
+
356
+ # Handle sending out housekeeping information periodically, based on the HK_DELAY time that is specified in
357
+ # the YAML configuration file for the device
358
+
359
+ if time_in_ms() - last_time_hk >= self.hk_delay:
360
+ last_time_hk = time_in_ms()
361
+ if storage_manager:
362
+ # self.logger.debug("Sending housekeeping information to Storage.")
363
+ self.store_housekeeping_information(
364
+ save_average_execution_time(self.device_protocol.get_housekeeping)
365
+ )
366
+
367
+ if self.interrupted:
368
+ self.logger.info(
369
+ f"Quit command received, closing down the {self.__class__.__name__}."
370
+ )
371
+ break
372
+
373
+ # Some device protocol sub-classes might start a number of threads or processes to support the commanding.
374
+ # Check if these threads/processes are still alive and terminate gracefully if they are not.
375
+
376
+ if not self.device_protocol.is_alive():
377
+ self.logger.error(
378
+ "Some Thread or sub-process that was started by Protocol has died, terminating..."
379
+ )
380
+ break
381
+
382
+ storage_manager and self.unregister_from_storage_manager()
383
+
384
+ self.after_serve()
385
+
386
+ self.device_protocol.quit()
387
+
388
+ self.dev_ctrl_mon_sock.close()
389
+ self.dev_ctrl_service_sock.close()
390
+ self.dev_ctrl_cmd_sock.close()
391
+
392
+ close_all_zmq_handlers()
393
+
394
+ self.zcontext.term()
395
+
396
+ def store_housekeeping_information(self, data: dict) -> None:
397
+ """ Sends housekeeping information to the Storage Manager.
398
+
399
+ This method has to be overwritten by the sub-classes if they want the device housekeeping information to be
400
+ saved.
401
+
402
+ Args:
403
+ data (dict): a dictionary containing parameter name and value of all device housekeeping. There is also
404
+ a timestamp that represents the date/time when the HK was received from the device.
405
+ """
406
+ pass
407
+
408
+ def register_to_storage_manager(self) -> None:
409
+ """ Registers this Control Server to the Storage Manager.
410
+
411
+ By doing so, the housekeeping information of the device will be sent to the Storage Manager, which will store
412
+ the information in a dedicated CSV file.
413
+
414
+ This method has to be overwritten by the sub-classes if they have housekeeping information that must be stored.
415
+
416
+ Subclasses need to overwrite this method if they have housekeeping information to be stored.
417
+
418
+ The following information is required for the registration:
419
+
420
+ - origin: Storage mnemonic, which can be retrieved from `self.get_storage_mnemonic()`
421
+ - persistence_class: Persistence layer (one of the TYPES in egse.storage.persistence)
422
+ - prep: depending on the type of the persistence class (see respective documentation)
423
+
424
+ The `egse.storage` module provides a convenience method that can be called from the method in the subclass:
425
+
426
+ >>> from egse.storage import register_to_storage_manager # noqa
427
+
428
+ Note: the `egse.storage` module might not be available, it is provided by the `cgse-core` package.
429
+ """
430
+ pass
431
+
432
+ def unregister_from_storage_manager(self) -> None:
433
+ """ Unregisters the Control Server from the Storage Manager.
434
+
435
+ This method has to be overwritten by the sub-classes.
436
+
437
+ The following information is required for the registration:
438
+
439
+ - origin: Storage mnemonic, which can be retrieved from `self.get_storage_mnemonic()`
440
+
441
+ The `egse.storage` module provides a convenience method that can be called from the method in the sub-class:
442
+
443
+ >>> from egse.storage import unregister_from_storage_manager # noqa
444
+
445
+ Note: the `egse.storage` module might not be available, it is provided by the `cgse-core` package.
446
+ """
447
+
448
+ pass
@@ -152,6 +152,7 @@ class DeviceConnectionInterface(DeviceConnectionObservable):
152
152
  Raises:
153
153
  ConnectionError: when the connection can not be opened.
154
154
  """
155
+
155
156
  raise NotImplementedError
156
157
 
157
158
  @dynamic_interface
@@ -187,13 +188,13 @@ class DeviceInterface(DeviceConnectionInterface):
187
188
 
188
189
  @dynamic_interface
189
190
  def is_simulator(self) -> bool:
190
- """Ask if the device class is a Simulator instead of the real Controller.
191
+ """ Checks whether the device is a simulator rather than a real hardware controller.
191
192
 
192
193
  This can be useful for testing purposes or when doing actual movement simulations.
193
194
 
194
- Returns:
195
- True if the Device is a Simulator, False if the Device is connected to real hardware.
195
+ Returns: True if the Device is a Simulator; False if the Device is connected to real hardware.
196
196
  """
197
+
197
198
  raise NotImplementedError
198
199
 
199
200
 
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "add_cr_lf",
29
29
  "dynamic_command",
30
30
  "DynamicCommandMixin",
31
+ "CommandType"
31
32
  ]
32
33
 
33
34
  # ----- Mixin for dynamic commanding ---------------------------------------------------------------
@@ -108,6 +109,13 @@ def expand_kwargs(kwargs: Dict):
108
109
  return " ".join(f"{k}={v}" for k, v in kwargs.items())
109
110
 
110
111
 
112
+ class CommandType(str, enum.Enum):
113
+
114
+ READ = "read"
115
+ WRITE = "write"
116
+ TRANSACTION = "transaction"
117
+
118
+
111
119
  def dynamic_command(
112
120
  *,
113
121
  cmd_type: str, # required keyword-only argument
@@ -163,7 +163,7 @@ class BaseCommandProtocol(DeviceConnectionObserver):
163
163
  """
164
164
  status = {
165
165
  "timestamp": format_datetime(),
166
- "delay": self.__control_server.delay,
166
+ "delay": self.__control_server.mon_delay,
167
167
  }
168
168
  status.update(self.__control_server.get_process_status())
169
169
  return status
@@ -386,7 +386,7 @@ class CommandProtocol(DeviceConnectionObserver, metaclass=abc.ABCMeta):
386
386
 
387
387
  def quit(self):
388
388
  """
389
- This method can be overridden by a sub-class to cleanup and stop threads that it
389
+ This method can be overridden by a sub-class to clean up and stop threads that it
390
390
  started.
391
391
  """
392
392
 
@@ -444,7 +444,7 @@ class CommandProtocol(DeviceConnectionObserver, metaclass=abc.ABCMeta):
444
444
  """
445
445
  status = {
446
446
  "timestamp": format_datetime(),
447
- "delay": self.control_server.delay,
447
+ "delay": self.control_server.mon_delay,
448
448
  }
449
449
  status.update(self.control_server.get_process_status())
450
450
  return status
@@ -57,7 +57,7 @@ class ServiceProtocol(CommandProtocol):
57
57
  Returns:
58
58
  Sends back the selected delay time in milliseconds.
59
59
  """
60
- delay = self.control_server.set_delay(1.0 / freq)
60
+ delay = self.control_server.set_mon_delay(1.0 / freq)
61
61
 
62
62
  LOGGER.debug(f"Set monitoring frequency to {freq}Hz, ± every {delay:.0f}ms.")
63
63