cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl

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 (664) hide show
  1. README.md +27 -0
  2. bump.py +85 -0
  3. cgse-2025.0.2.dist-info/METADATA +38 -0
  4. cgse-2025.0.2.dist-info/RECORD +5 -0
  5. {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
  6. cgse-2024.7.0.dist-info/COPYING +0 -674
  7. cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
  8. cgse-2024.7.0.dist-info/METADATA +0 -144
  9. cgse-2024.7.0.dist-info/RECORD +0 -660
  10. cgse-2024.7.0.dist-info/entry_points.txt +0 -75
  11. cgse-2024.7.0.dist-info/top_level.txt +0 -2
  12. egse/__init__.py +0 -12
  13. egse/__main__.py +0 -32
  14. egse/aeu/aeu.py +0 -5238
  15. egse/aeu/aeu_awg.yaml +0 -265
  16. egse/aeu/aeu_crio.yaml +0 -273
  17. egse/aeu/aeu_cs.py +0 -627
  18. egse/aeu/aeu_devif.py +0 -321
  19. egse/aeu/aeu_main_ui.py +0 -903
  20. egse/aeu/aeu_metrics.py +0 -131
  21. egse/aeu/aeu_protocol.py +0 -463
  22. egse/aeu/aeu_psu.yaml +0 -204
  23. egse/aeu/aeu_ui.py +0 -873
  24. egse/aeu/arbdata/FccdRead.arb +0 -2
  25. egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
  26. egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
  27. egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
  28. egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
  29. egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
  30. egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
  31. egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
  32. egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
  33. egse/aeu/arbdata/ccdRead25.arb +0 -2
  34. egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
  35. egse/aeu/arbdata/ccdRead31_25.arb +0 -2
  36. egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
  37. egse/aeu/arbdata/ccdRead37_50.arb +0 -2
  38. egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
  39. egse/aeu/arbdata/ccdRead43_75.arb +0 -2
  40. egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
  41. egse/aeu/arbdata/ccdRead50.arb +0 -2
  42. egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
  43. egse/alert/__init__.py +0 -1049
  44. egse/alert/alertman.yaml +0 -37
  45. egse/alert/alertman_cs.py +0 -233
  46. egse/alert/alertman_ui.py +0 -600
  47. egse/alert/gsm/beaglebone.py +0 -138
  48. egse/alert/gsm/beaglebone.yaml +0 -51
  49. egse/alert/gsm/beaglebone_cs.py +0 -108
  50. egse/alert/gsm/beaglebone_devif.py +0 -122
  51. egse/alert/gsm/beaglebone_protocol.py +0 -46
  52. egse/bits.py +0 -318
  53. egse/camera.py +0 -44
  54. egse/collimator/__init__.py +0 -0
  55. egse/collimator/fcul/__init__.py +0 -0
  56. egse/collimator/fcul/ogse.py +0 -1077
  57. egse/collimator/fcul/ogse.yaml +0 -14
  58. egse/collimator/fcul/ogse_cs.py +0 -154
  59. egse/collimator/fcul/ogse_devif.py +0 -358
  60. egse/collimator/fcul/ogse_protocol.py +0 -132
  61. egse/collimator/fcul/ogse_sim.py +0 -431
  62. egse/collimator/fcul/ogse_ui.py +0 -1108
  63. egse/command.py +0 -699
  64. egse/config.py +0 -410
  65. egse/confman/__init__.py +0 -1058
  66. egse/confman/confman.yaml +0 -70
  67. egse/confman/confman_cs.py +0 -240
  68. egse/confman/confman_ui.py +0 -381
  69. egse/confman/setup_ui.py +0 -565
  70. egse/control.py +0 -632
  71. egse/coordinates/__init__.py +0 -534
  72. egse/coordinates/avoidance.py +0 -100
  73. egse/coordinates/cslmodel.py +0 -127
  74. egse/coordinates/laser_tracker_to_dict.py +0 -122
  75. egse/coordinates/point.py +0 -707
  76. egse/coordinates/pyplot.py +0 -194
  77. egse/coordinates/referenceFrame.py +0 -1279
  78. egse/coordinates/refmodel.py +0 -737
  79. egse/coordinates/rotationMatrix.py +0 -85
  80. egse/coordinates/transform3d_addon.py +0 -419
  81. egse/csl/__init__.py +0 -50
  82. egse/csl/commanding.py +0 -78
  83. egse/csl/icons/hexapod-connected-selected.svg +0 -30
  84. egse/csl/icons/hexapod-connected.svg +0 -30
  85. egse/csl/icons/hexapod-homing-selected.svg +0 -68
  86. egse/csl/icons/hexapod-homing.svg +0 -68
  87. egse/csl/icons/hexapod-retract-selected.svg +0 -56
  88. egse/csl/icons/hexapod-retract.svg +0 -51
  89. egse/csl/icons/hexapod-zero-selected.svg +0 -56
  90. egse/csl/icons/hexapod-zero.svg +0 -56
  91. egse/csl/icons/logo-puna.svg +0 -92
  92. egse/csl/icons/stop.svg +0 -1
  93. egse/csl/initialisation.py +0 -102
  94. egse/csl/mech_pos_settings.yaml +0 -18
  95. egse/das.py +0 -1240
  96. egse/das.yaml +0 -7
  97. egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
  98. egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
  99. egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
  100. egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
  101. egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
  102. egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
  103. egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
  104. egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
  105. egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
  106. egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
  107. egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
  108. egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
  109. egse/decorators.py +0 -514
  110. egse/device.py +0 -269
  111. egse/dpu/__init__.py +0 -2698
  112. egse/dpu/ccd_ui.py +0 -514
  113. egse/dpu/dpu.py +0 -783
  114. egse/dpu/dpu.yaml +0 -153
  115. egse/dpu/dpu_cs.py +0 -272
  116. egse/dpu/dpu_ui.py +0 -671
  117. egse/dpu/fitsgen.py +0 -2096
  118. egse/dpu/fitsgen_ui.py +0 -399
  119. egse/dpu/hdf5_model.py +0 -332
  120. egse/dpu/hdf5_ui.py +0 -277
  121. egse/dpu/hdf5_viewer.py +0 -506
  122. egse/dpu/hk_ui.py +0 -468
  123. egse/dpu_commands.py +0 -81
  124. egse/dsi/__init__.py +0 -33
  125. egse/dsi/_libesl.py +0 -232
  126. egse/dsi/constants.py +0 -296
  127. egse/dsi/esl.py +0 -630
  128. egse/dsi/rmap.py +0 -444
  129. egse/dsi/rmapci.py +0 -39
  130. egse/dsi/spw.py +0 -335
  131. egse/dsi/spw_state.py +0 -29
  132. egse/dummy.py +0 -318
  133. egse/dyndummy.py +0 -179
  134. egse/env.py +0 -278
  135. egse/exceptions.py +0 -88
  136. egse/fdir/__init__.py +0 -26
  137. egse/fdir/fdir_manager.py +0 -85
  138. egse/fdir/fdir_manager.yaml +0 -37
  139. egse/fdir/fdir_manager_controller.py +0 -136
  140. egse/fdir/fdir_manager_cs.py +0 -164
  141. egse/fdir/fdir_manager_interface.py +0 -15
  142. egse/fdir/fdir_remote.py +0 -73
  143. egse/fdir/fdir_remote.yaml +0 -30
  144. egse/fdir/fdir_remote_controller.py +0 -30
  145. egse/fdir/fdir_remote_cs.py +0 -94
  146. egse/fdir/fdir_remote_interface.py +0 -9
  147. egse/fdir/fdir_remote_popup.py +0 -26
  148. egse/fee/__init__.py +0 -106
  149. egse/fee/f_fee_register.yaml +0 -43
  150. egse/fee/feesim.py +0 -914
  151. egse/fee/n_fee_hk.py +0 -768
  152. egse/fee/nfee.py +0 -188
  153. egse/filterwheel/__init__.py +0 -4
  154. egse/filterwheel/eksma/__init__.py +0 -49
  155. egse/filterwheel/eksma/fw8smc4.py +0 -657
  156. egse/filterwheel/eksma/fw8smc4.yaml +0 -121
  157. egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
  158. egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
  159. egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
  160. egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
  161. egse/filterwheel/eksma/fw8smc5.py +0 -115
  162. egse/filterwheel/eksma/fw8smc5.yaml +0 -105
  163. egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
  164. egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
  165. egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
  166. egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
  167. egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
  168. egse/filterwheel/eksma/testpythonfw.py +0 -215
  169. egse/fov/__init__.py +0 -65
  170. egse/fov/fov_hk.py +0 -710
  171. egse/fov/fov_ui.py +0 -859
  172. egse/fov/fov_ui_controller.py +0 -140
  173. egse/fov/fov_ui_model.py +0 -200
  174. egse/fov/fov_ui_view.py +0 -345
  175. egse/gimbal/__init__.py +0 -32
  176. egse/gimbal/symetrie/__init__.py +0 -26
  177. egse/gimbal/symetrie/alpha.py +0 -586
  178. egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
  179. egse/gimbal/symetrie/gimbal.py +0 -877
  180. egse/gimbal/symetrie/gimbal.yaml +0 -168
  181. egse/gimbal/symetrie/gimbal_cs.py +0 -183
  182. egse/gimbal/symetrie/gimbal_protocol.py +0 -138
  183. egse/gimbal/symetrie/gimbal_ui.py +0 -361
  184. egse/gimbal/symetrie/pmac.py +0 -1006
  185. egse/gimbal/symetrie/pmac_regex.py +0 -83
  186. egse/graph.py +0 -132
  187. egse/gui/__init__.py +0 -47
  188. egse/gui/buttons.py +0 -378
  189. egse/gui/focalplane.py +0 -1285
  190. egse/gui/formatter.py +0 -10
  191. egse/gui/led.py +0 -162
  192. egse/gui/limitswitch.py +0 -143
  193. egse/gui/mechanisms.py +0 -587
  194. egse/gui/states.py +0 -148
  195. egse/gui/stripchart.py +0 -729
  196. egse/gui/styles.qss +0 -48
  197. egse/gui/switch.py +0 -112
  198. egse/h5.py +0 -274
  199. egse/help/__init__.py +0 -0
  200. egse/help/help_ui.py +0 -126
  201. egse/hexapod/__init__.py +0 -32
  202. egse/hexapod/symetrie/__init__.py +0 -137
  203. egse/hexapod/symetrie/alpha.py +0 -874
  204. egse/hexapod/symetrie/dynalpha.py +0 -1387
  205. egse/hexapod/symetrie/hexapod_ui.py +0 -1516
  206. egse/hexapod/symetrie/pmac.py +0 -1010
  207. egse/hexapod/symetrie/pmac_regex.py +0 -83
  208. egse/hexapod/symetrie/puna.py +0 -1167
  209. egse/hexapod/symetrie/puna.yaml +0 -193
  210. egse/hexapod/symetrie/puna_cs.py +0 -195
  211. egse/hexapod/symetrie/puna_protocol.py +0 -134
  212. egse/hexapod/symetrie/puna_ui.py +0 -433
  213. egse/hexapod/symetrie/punaplus.py +0 -107
  214. egse/hexapod/symetrie/zonda.py +0 -872
  215. egse/hexapod/symetrie/zonda.yaml +0 -337
  216. egse/hexapod/symetrie/zonda_cs.py +0 -172
  217. egse/hexapod/symetrie/zonda_devif.py +0 -414
  218. egse/hexapod/symetrie/zonda_protocol.py +0 -123
  219. egse/hexapod/symetrie/zonda_ui.py +0 -449
  220. egse/hk.py +0 -791
  221. egse/icons/aeu-cs-start.svg +0 -117
  222. egse/icons/aeu-cs-stop.svg +0 -118
  223. egse/icons/aeu-cs.svg +0 -107
  224. egse/icons/aeu_cs-started.svg +0 -112
  225. egse/icons/aeu_cs-stopped.svg +0 -112
  226. egse/icons/aeu_cs.svg +0 -55
  227. egse/icons/alert.svg +0 -1
  228. egse/icons/arrow-double-left.png +0 -0
  229. egse/icons/arrow-double-right.png +0 -0
  230. egse/icons/arrow-up.svg +0 -11
  231. egse/icons/backward.svg +0 -1
  232. egse/icons/busy.svg +0 -1
  233. egse/icons/cleaning.svg +0 -115
  234. egse/icons/color-scheme.svg +0 -1
  235. egse/icons/cs-connected-alert.svg +0 -91
  236. egse/icons/cs-connected-disabled.svg +0 -43
  237. egse/icons/cs-connected.svg +0 -89
  238. egse/icons/cs-not-connected.svg +0 -44
  239. egse/icons/double-left-arrow.svg +0 -1
  240. egse/icons/double-right-arrow.svg +0 -1
  241. egse/icons/erase-disabled.svg +0 -19
  242. egse/icons/erase.svg +0 -59
  243. egse/icons/fitsgen-start.svg +0 -47
  244. egse/icons/fitsgen-stop.svg +0 -48
  245. egse/icons/fitsgen.svg +0 -1
  246. egse/icons/forward.svg +0 -1
  247. egse/icons/fov-hk-start.svg +0 -33
  248. egse/icons/fov-hk-stop.svg +0 -37
  249. egse/icons/fov-hk.svg +0 -1
  250. egse/icons/front-desk.svg +0 -1
  251. egse/icons/home-actioned.svg +0 -15
  252. egse/icons/home-disabled.svg +0 -15
  253. egse/icons/home.svg +0 -13
  254. egse/icons/info.svg +0 -1
  255. egse/icons/invalid.png +0 -0
  256. egse/icons/led-green.svg +0 -20
  257. egse/icons/led-grey.svg +0 -20
  258. egse/icons/led-orange.svg +0 -20
  259. egse/icons/led-red.svg +0 -20
  260. egse/icons/led-square-green.svg +0 -134
  261. egse/icons/led-square-grey.svg +0 -134
  262. egse/icons/led-square-orange.svg +0 -134
  263. egse/icons/led-square-red.svg +0 -134
  264. egse/icons/limit-switch-all-green.svg +0 -115
  265. egse/icons/limit-switch-all-red.svg +0 -117
  266. egse/icons/limit-switch-el+.svg +0 -116
  267. egse/icons/limit-switch-el-.svg +0 -117
  268. egse/icons/location-marker.svg +0 -1
  269. egse/icons/logo-dpu.svg +0 -48
  270. egse/icons/logo-gimbal.svg +0 -112
  271. egse/icons/logo-huber.svg +0 -23
  272. egse/icons/logo-ogse.svg +0 -31
  273. egse/icons/logo-puna.svg +0 -92
  274. egse/icons/logo-tcs.svg +0 -29
  275. egse/icons/logo-zonda.svg +0 -66
  276. egse/icons/maximize.svg +0 -1
  277. egse/icons/meter.svg +0 -1
  278. egse/icons/more.svg +0 -45
  279. egse/icons/n-fee-hk-start.svg +0 -24
  280. egse/icons/n-fee-hk-stop.svg +0 -25
  281. egse/icons/n-fee-hk.svg +0 -83
  282. egse/icons/observing-off.svg +0 -46
  283. egse/icons/observing-on.svg +0 -46
  284. egse/icons/open-document-hdf5.png +0 -0
  285. egse/icons/open-document-hdf5.svg +0 -21
  286. egse/icons/ops-mode.svg +0 -1
  287. egse/icons/play-green.svg +0 -17
  288. egse/icons/plugged-disabled.svg +0 -27
  289. egse/icons/plugged.svg +0 -21
  290. egse/icons/pm_ui.svg +0 -1
  291. egse/icons/power-button-green.svg +0 -27
  292. egse/icons/power-button-red.svg +0 -27
  293. egse/icons/power-button.svg +0 -27
  294. egse/icons/radar.svg +0 -1
  295. egse/icons/radioactive.svg +0 -2
  296. egse/icons/reload.svg +0 -1
  297. egse/icons/remote-control-off.svg +0 -28
  298. egse/icons/remote-control-on.svg +0 -28
  299. egse/icons/repeat-blue.svg +0 -15
  300. egse/icons/repeat.svg +0 -1
  301. egse/icons/settings.svg +0 -1
  302. egse/icons/shrink.svg +0 -1
  303. egse/icons/shutter.svg +0 -1
  304. egse/icons/sign-off.svg +0 -1
  305. egse/icons/sign-on.svg +0 -1
  306. egse/icons/sim-mode.svg +0 -1
  307. egse/icons/small-buttons-go.svg +0 -20
  308. egse/icons/small-buttons-minus.svg +0 -51
  309. egse/icons/small-buttons-plus.svg +0 -51
  310. egse/icons/sponge.svg +0 -220
  311. egse/icons/start-button-disabled.svg +0 -84
  312. egse/icons/start-button.svg +0 -50
  313. egse/icons/stop-button-disabled.svg +0 -84
  314. egse/icons/stop-button.svg +0 -50
  315. egse/icons/stop-red.svg +0 -17
  316. egse/icons/stop.svg +0 -1
  317. egse/icons/switch-disabled-square.svg +0 -87
  318. egse/icons/switch-disabled.svg +0 -15
  319. egse/icons/switch-off-square.svg +0 -87
  320. egse/icons/switch-off.svg +0 -72
  321. egse/icons/switch-on-square.svg +0 -87
  322. egse/icons/switch-on.svg +0 -61
  323. egse/icons/temperature-control.svg +0 -44
  324. egse/icons/th_ui_logo.svg +0 -1
  325. egse/icons/unplugged.svg +0 -23
  326. egse/icons/unvalid.png +0 -0
  327. egse/icons/user-interface.svg +0 -1
  328. egse/icons/vacuum.svg +0 -1
  329. egse/icons/valid.png +0 -0
  330. egse/icons/zoom-to-pixel-dark.svg +0 -64
  331. egse/icons/zoom-to-pixel-white.svg +0 -36
  332. egse/images/big-rotation-stage.png +0 -0
  333. egse/images/connected-100.png +0 -0
  334. egse/images/cross.svg +0 -6
  335. egse/images/disconnected-100.png +0 -0
  336. egse/images/gui-icon.png +0 -0
  337. egse/images/home.svg +0 -6
  338. egse/images/info-icon.png +0 -0
  339. egse/images/led-black.svg +0 -89
  340. egse/images/led-green.svg +0 -85
  341. egse/images/led-orange.svg +0 -85
  342. egse/images/led-red.svg +0 -85
  343. egse/images/load-icon.png +0 -0
  344. egse/images/load-setup.png +0 -0
  345. egse/images/load.png +0 -0
  346. egse/images/pause.png +0 -0
  347. egse/images/play-button.svg +0 -8
  348. egse/images/play.png +0 -0
  349. egse/images/process-status.png +0 -0
  350. egse/images/restart.png +0 -0
  351. egse/images/search.png +0 -0
  352. egse/images/sma.png +0 -0
  353. egse/images/start.png +0 -0
  354. egse/images/stop-button.svg +0 -8
  355. egse/images/stop.png +0 -0
  356. egse/images/switch-off.svg +0 -48
  357. egse/images/switch-on.svg +0 -48
  358. egse/images/undo.png +0 -0
  359. egse/images/update-button.svg +0 -11
  360. egse/imageviewer/exposureselection.py +0 -475
  361. egse/imageviewer/imageviewer.py +0 -198
  362. egse/imageviewer/matchfocalplane.py +0 -179
  363. egse/imageviewer/subfieldposition.py +0 -133
  364. egse/lampcontrol/__init__.py +0 -4
  365. egse/lampcontrol/beaglebone/beaglebone.py +0 -178
  366. egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
  367. egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
  368. egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
  369. egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
  370. egse/lampcontrol/energetiq/__init__.py +0 -22
  371. egse/lampcontrol/energetiq/eq99.yaml +0 -98
  372. egse/lampcontrol/energetiq/lampEQ99.py +0 -283
  373. egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
  374. egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
  375. egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
  376. egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
  377. egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
  378. egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
  379. egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
  380. egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
  381. egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
  382. egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
  383. egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
  384. egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
  385. egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
  386. egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
  387. egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
  388. egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
  389. egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
  390. egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
  391. egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
  392. egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
  393. egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
  394. egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
  395. egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
  396. egse/lib/ximc/libximc.framework/libbindy.so +0 -0
  397. egse/lib/ximc/libximc.framework/libximc +0 -0
  398. egse/lib/ximc/libximc.framework/libximc.so +0 -0
  399. egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
  400. egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
  401. egse/lib/ximc/pyximc.py +0 -922
  402. egse/listener.py +0 -179
  403. egse/logger/__init__.py +0 -243
  404. egse/logger/log_cs.py +0 -321
  405. egse/metrics.py +0 -102
  406. egse/mixin.py +0 -464
  407. egse/monitoring.py +0 -95
  408. egse/ni/alarms/__init__.py +0 -26
  409. egse/ni/alarms/cdaq9375.py +0 -300
  410. egse/ni/alarms/cdaq9375.yaml +0 -89
  411. egse/ni/alarms/cdaq9375_cs.py +0 -130
  412. egse/ni/alarms/cdaq9375_devif.py +0 -183
  413. egse/ni/alarms/cdaq9375_protocol.py +0 -48
  414. egse/obs_inspection.py +0 -165
  415. egse/observer.py +0 -41
  416. egse/obsid.py +0 -163
  417. egse/powermeter/__init__.py +0 -0
  418. egse/powermeter/ni/__init__.py +0 -38
  419. egse/powermeter/ni/cdaq9184.py +0 -224
  420. egse/powermeter/ni/cdaq9184.yaml +0 -73
  421. egse/powermeter/ni/cdaq9184_cs.py +0 -130
  422. egse/powermeter/ni/cdaq9184_devif.py +0 -201
  423. egse/powermeter/ni/cdaq9184_protocol.py +0 -48
  424. egse/powermeter/ni/cdaq9184_ui.py +0 -544
  425. egse/powermeter/thorlabs/__init__.py +0 -25
  426. egse/powermeter/thorlabs/pm100a.py +0 -380
  427. egse/powermeter/thorlabs/pm100a.yaml +0 -132
  428. egse/powermeter/thorlabs/pm100a_cs.py +0 -136
  429. egse/powermeter/thorlabs/pm100a_devif.py +0 -127
  430. egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
  431. egse/powermeter/thorlabs/pm100a_ui.py +0 -725
  432. egse/process.py +0 -451
  433. egse/procman/__init__.py +0 -834
  434. egse/procman/cannot_start_process_popup.py +0 -43
  435. egse/procman/procman.yaml +0 -49
  436. egse/procman/procman_cs.py +0 -201
  437. egse/procman/procman_ui.py +0 -2081
  438. egse/protocol.py +0 -605
  439. egse/proxy.py +0 -531
  440. egse/randomwalk.py +0 -140
  441. egse/reg.py +0 -585
  442. egse/reload.py +0 -122
  443. egse/reprocess.py +0 -693
  444. egse/resource.py +0 -333
  445. egse/rmap.py +0 -406
  446. egse/rst.py +0 -135
  447. egse/search.py +0 -182
  448. egse/serialdevice.py +0 -190
  449. egse/services.py +0 -247
  450. egse/services.yaml +0 -68
  451. egse/settings.py +0 -379
  452. egse/settings.yaml +0 -980
  453. egse/setup.py +0 -1181
  454. egse/shutter/__init__.py +0 -0
  455. egse/shutter/thorlabs/__init__.py +0 -19
  456. egse/shutter/thorlabs/ksc101.py +0 -205
  457. egse/shutter/thorlabs/ksc101.yaml +0 -105
  458. egse/shutter/thorlabs/ksc101_cs.py +0 -136
  459. egse/shutter/thorlabs/ksc101_devif.py +0 -201
  460. egse/shutter/thorlabs/ksc101_protocol.py +0 -71
  461. egse/shutter/thorlabs/ksc101_ui.py +0 -548
  462. egse/shutter/thorlabs/sc10.py +0 -82
  463. egse/shutter/thorlabs/sc10.yaml +0 -52
  464. egse/shutter/thorlabs/sc10_controller.py +0 -81
  465. egse/shutter/thorlabs/sc10_cs.py +0 -108
  466. egse/shutter/thorlabs/sc10_interface.py +0 -25
  467. egse/shutter/thorlabs/sc10_simulator.py +0 -30
  468. egse/simulator.py +0 -41
  469. egse/slack.py +0 -61
  470. egse/socketdevice.py +0 -218
  471. egse/sockets.py +0 -218
  472. egse/spw.py +0 -1401
  473. egse/stages/__init__.py +0 -12
  474. egse/stages/aerotech/ensemble.py +0 -245
  475. egse/stages/aerotech/ensemble.yaml +0 -205
  476. egse/stages/aerotech/ensemble_controller.py +0 -275
  477. egse/stages/aerotech/ensemble_cs.py +0 -110
  478. egse/stages/aerotech/ensemble_interface.py +0 -132
  479. egse/stages/aerotech/ensemble_parameters.py +0 -433
  480. egse/stages/aerotech/ensemble_simulator.py +0 -27
  481. egse/stages/aerotech/mgse_sim.py +0 -188
  482. egse/stages/arun/smd3.py +0 -110
  483. egse/stages/arun/smd3.yaml +0 -68
  484. egse/stages/arun/smd3_controller.py +0 -470
  485. egse/stages/arun/smd3_cs.py +0 -112
  486. egse/stages/arun/smd3_interface.py +0 -53
  487. egse/stages/arun/smd3_simulator.py +0 -27
  488. egse/stages/arun/smd3_stop.py +0 -16
  489. egse/stages/huber/__init__.py +0 -49
  490. egse/stages/huber/smc9300.py +0 -920
  491. egse/stages/huber/smc9300.yaml +0 -63
  492. egse/stages/huber/smc9300_cs.py +0 -178
  493. egse/stages/huber/smc9300_devif.py +0 -345
  494. egse/stages/huber/smc9300_protocol.py +0 -113
  495. egse/stages/huber/smc9300_sim.py +0 -547
  496. egse/stages/huber/smc9300_ui.py +0 -973
  497. egse/state.py +0 -173
  498. egse/statemachine.py +0 -274
  499. egse/storage/__init__.py +0 -1067
  500. egse/storage/persistence.py +0 -2295
  501. egse/storage/storage.yaml +0 -79
  502. egse/storage/storage_cs.py +0 -231
  503. egse/styles/dark.qss +0 -343
  504. egse/styles/default.qss +0 -48
  505. egse/synoptics/__init__.py +0 -417
  506. egse/synoptics/syn.yaml +0 -9
  507. egse/synoptics/syn_cs.py +0 -195
  508. egse/system.py +0 -1611
  509. egse/tcs/__init__.py +0 -14
  510. egse/tcs/tcs.py +0 -879
  511. egse/tcs/tcs.yaml +0 -14
  512. egse/tcs/tcs_cs.py +0 -202
  513. egse/tcs/tcs_devif.py +0 -292
  514. egse/tcs/tcs_protocol.py +0 -180
  515. egse/tcs/tcs_sim.py +0 -177
  516. egse/tcs/tcs_ui.py +0 -543
  517. egse/tdms.py +0 -171
  518. egse/tempcontrol/__init__.py +0 -23
  519. egse/tempcontrol/agilent/agilent34970.py +0 -109
  520. egse/tempcontrol/agilent/agilent34970.yaml +0 -44
  521. egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
  522. egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
  523. egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
  524. egse/tempcontrol/agilent/agilent34972.py +0 -111
  525. egse/tempcontrol/agilent/agilent34972.yaml +0 -44
  526. egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
  527. egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
  528. egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
  529. egse/tempcontrol/beaglebone/beaglebone.py +0 -341
  530. egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
  531. egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
  532. egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
  533. egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
  534. egse/tempcontrol/digalox/digalox.py +0 -115
  535. egse/tempcontrol/digalox/digalox.yaml +0 -36
  536. egse/tempcontrol/digalox/digalox_cs.py +0 -108
  537. egse/tempcontrol/digalox/digalox_protocol.py +0 -56
  538. egse/tempcontrol/keithley/__init__.py +0 -33
  539. egse/tempcontrol/keithley/daq6510.py +0 -662
  540. egse/tempcontrol/keithley/daq6510.yaml +0 -105
  541. egse/tempcontrol/keithley/daq6510_cs.py +0 -163
  542. egse/tempcontrol/keithley/daq6510_devif.py +0 -343
  543. egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
  544. egse/tempcontrol/keithley/daq6510_sim.py +0 -186
  545. egse/tempcontrol/lakeshore/__init__.py +0 -33
  546. egse/tempcontrol/lakeshore/lsci.py +0 -361
  547. egse/tempcontrol/lakeshore/lsci.yaml +0 -162
  548. egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
  549. egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
  550. egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
  551. egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
  552. egse/tempcontrol/ni/__init__.py +0 -0
  553. egse/tempcontrol/spid/spid.py +0 -109
  554. egse/tempcontrol/spid/spid.yaml +0 -81
  555. egse/tempcontrol/spid/spid_controller.py +0 -279
  556. egse/tempcontrol/spid/spid_cs.py +0 -136
  557. egse/tempcontrol/spid/spid_protocol.py +0 -107
  558. egse/tempcontrol/spid/spid_ui.py +0 -723
  559. egse/tempcontrol/srs/__init__.py +0 -22
  560. egse/tempcontrol/srs/ptc10.py +0 -867
  561. egse/tempcontrol/srs/ptc10.yaml +0 -227
  562. egse/tempcontrol/srs/ptc10_cs.py +0 -128
  563. egse/tempcontrol/srs/ptc10_devif.py +0 -116
  564. egse/tempcontrol/srs/ptc10_protocol.py +0 -39
  565. egse/tempcontrol/srs/ptc10_ui.py +0 -906
  566. egse/ups/apc/apc.py +0 -236
  567. egse/ups/apc/apc.yaml +0 -45
  568. egse/ups/apc/apc_cs.py +0 -101
  569. egse/ups/apc/apc_protocol.py +0 -125
  570. egse/user.yaml +0 -7
  571. egse/vacuum/beaglebone/beaglebone.py +0 -149
  572. egse/vacuum/beaglebone/beaglebone.yaml +0 -44
  573. egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
  574. egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
  575. egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
  576. egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
  577. egse/vacuum/instrutech/igm402.py +0 -91
  578. egse/vacuum/instrutech/igm402.yaml +0 -90
  579. egse/vacuum/instrutech/igm402_controller.py +0 -124
  580. egse/vacuum/instrutech/igm402_cs.py +0 -108
  581. egse/vacuum/instrutech/igm402_interface.py +0 -49
  582. egse/vacuum/instrutech/igm402_simulator.py +0 -36
  583. egse/vacuum/keller/kellerBus.py +0 -256
  584. egse/vacuum/keller/leo3.py +0 -100
  585. egse/vacuum/keller/leo3.yaml +0 -38
  586. egse/vacuum/keller/leo3_controller.py +0 -81
  587. egse/vacuum/keller/leo3_cs.py +0 -101
  588. egse/vacuum/keller/leo3_interface.py +0 -33
  589. egse/vacuum/mks/evision.py +0 -86
  590. egse/vacuum/mks/evision.yaml +0 -75
  591. egse/vacuum/mks/evision_cs.py +0 -101
  592. egse/vacuum/mks/evision_devif.py +0 -313
  593. egse/vacuum/mks/evision_interface.py +0 -60
  594. egse/vacuum/mks/evision_simulator.py +0 -24
  595. egse/vacuum/mks/evision_ui.py +0 -701
  596. egse/vacuum/pfeiffer/acp40.py +0 -87
  597. egse/vacuum/pfeiffer/acp40.yaml +0 -60
  598. egse/vacuum/pfeiffer/acp40_controller.py +0 -117
  599. egse/vacuum/pfeiffer/acp40_cs.py +0 -109
  600. egse/vacuum/pfeiffer/acp40_interface.py +0 -40
  601. egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
  602. egse/vacuum/pfeiffer/tc400.py +0 -87
  603. egse/vacuum/pfeiffer/tc400.yaml +0 -83
  604. egse/vacuum/pfeiffer/tc400_controller.py +0 -136
  605. egse/vacuum/pfeiffer/tc400_cs.py +0 -109
  606. egse/vacuum/pfeiffer/tc400_interface.py +0 -70
  607. egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
  608. egse/vacuum/pfeiffer/tpg261.py +0 -80
  609. egse/vacuum/pfeiffer/tpg261.yaml +0 -66
  610. egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
  611. egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
  612. egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
  613. egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
  614. egse/version.py +0 -174
  615. egse/visitedpositions.py +0 -398
  616. egse/windowing.py +0 -213
  617. egse/zmq/__init__.py +0 -28
  618. egse/zmq/spw.py +0 -160
  619. egse/zmq_ser.py +0 -41
  620. scripts/alerts/cold.yaml +0 -278
  621. scripts/alerts/example_alerts.yaml +0 -54
  622. scripts/alerts/transition.yaml +0 -14
  623. scripts/alerts/warm.yaml +0 -49
  624. scripts/analyse_n_fee_hk_data.py +0 -52
  625. scripts/check_hdf5_files.py +0 -192
  626. scripts/check_register_sync.py +0 -47
  627. scripts/check_tcs_calib_coef.py +0 -90
  628. scripts/correct_ccd_cold_temperature_cal.py +0 -157
  629. scripts/create_hdf5_report.py +0 -293
  630. scripts/csl_model.py +0 -420
  631. scripts/csl_restore_setup.py +0 -229
  632. scripts/export-grafana-dashboards.py +0 -49
  633. scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
  634. scripts/fdir/fdir_table.yaml +0 -70
  635. scripts/fdir/fdir_test_recovery.py +0 -10
  636. scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
  637. scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
  638. scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
  639. scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
  640. scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
  641. scripts/fix_csv.py +0 -80
  642. scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
  643. scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
  644. scripts/ias/correct_trp_swap_achel.py +0 -199
  645. scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
  646. scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
  647. scripts/n_fee_supply_voltage_calculation.py +0 -92
  648. scripts/playground.py +0 -30
  649. scripts/print_hdf5_hk_data.py +0 -68
  650. scripts/print_register_map.py +0 -43
  651. scripts/remove_lines_between_matches.py +0 -188
  652. scripts/sron/commanding/control_heaters.py +0 -44
  653. scripts/sron/commanding/pumpdown.py +0 -46
  654. scripts/sron/commanding/set_pid_setpoint.py +0 -19
  655. scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
  656. scripts/sron/commanding/shutdown_pumps.py +0 -33
  657. scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
  658. scripts/sron/correct_trp_swap_brigand.py +0 -204
  659. scripts/sron/gimbal_conversions.py +0 -75
  660. scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
  661. scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
  662. scripts/sron/tm_gen/tm_gen_spid.py +0 -13
  663. scripts/update_operational_cgse.py +0 -268
  664. scripts/update_operational_cgse_old.py +0 -273
egse/search.py DELETED
@@ -1,182 +0,0 @@
1
- """
2
- The search module defines some generic search functions.
3
-
4
- This code is taken from the book:
5
-
6
- Classic Computer Science Problems in Python, David Kopec, 2019.
7
- """
8
- from __future__ import annotations
9
-
10
- from collections import deque
11
- from typing import TypeVar, Iterable, Sequence, Generic, List, \
12
- Callable, Set, Deque, Dict, Any, Optional
13
- from typing_extensions import Protocol
14
- from heapq import heappush, heappop
15
-
16
- T = TypeVar('T')
17
-
18
-
19
- def linear_contains(iterable: Iterable[T], key: T) -> bool:
20
- for item in iterable:
21
- if item == key:
22
- return True
23
- return False
24
-
25
-
26
- # Note that Protocol is used here to define the Comparable type with structural
27
- # sub-typing. A Comparable type implements the comparison operators.
28
- # Protocol is defined in PEP-544 [https://www.python.org/dev/peps/pep-0544/]
29
-
30
- C = TypeVar('C', bound='Comparable')
31
-
32
-
33
- class Comparable(Protocol):
34
- def __eq__(self, other: Any) -> bool:
35
- ...
36
-
37
- def __lt__(self: C, other: C) -> bool:
38
- ...
39
-
40
- def __gt__(self: C, other: C) -> bool:
41
- return (not self < other) and self != other
42
-
43
- def __le__(self: C, other: C) -> bool:
44
- return self < other or self == other
45
-
46
- def __ge__(self: C, other: C) -> bool:
47
- return not self < other
48
-
49
-
50
- def binary_contains(sequence: Sequence[C], key: C) -> bool:
51
- low: int = 0
52
- high: int = len(sequence) - 1
53
- while low <= high: # while there is still a search space
54
- mid: int = (low + high) // 2
55
- if sequence[mid] < key:
56
- low = mid + 1
57
- elif sequence[mid] > key:
58
- high = mid - 1
59
- else:
60
- return True
61
- return False
62
-
63
-
64
- class Stack(Generic[T]):
65
- def __init__(self) -> None:
66
- self._container: List[T] = []
67
-
68
- @property
69
- def empty(self) -> bool:
70
- return not self._container
71
-
72
- def push(self, item: T) -> None:
73
- self._container.append(item)
74
-
75
- def pop(self) -> T:
76
- return self._container.pop() # LIFO
77
-
78
- def __repr__(self) -> str:
79
- return repr(self._container)
80
-
81
-
82
- class Node(Generic[T]):
83
- def __init__(self, state: T, parent: Optional[Node], cost: float = 0.0, heuristic: float = 0.0) -> None:
84
- self.state: T = state
85
- self.parent: Optional[Node] = parent
86
- self.cost: float = cost
87
- self.heuristic: float = heuristic
88
-
89
- def __lt__(self, other: Node) -> bool:
90
- return (self.cost + self.heuristic) < (other.cost + other.heuristic)
91
-
92
-
93
- def depth_first_search(initial: T, goal_test: Callable[[T], bool], successors: Callable[[T], List[T]]) -> Optional[Node[T]]:
94
- """
95
- The depth-first search (DFS) algorithm goes as deeply as it can before backtracking to its
96
- last decision point if it reaches a dead end.
97
-
98
- Args:
99
- initial: starting point for the search
100
- goal_test: function that defines if the goal is reached or not
101
- successors: function that returns all possible states that can be visited next
102
-
103
- Returns:
104
- the Node encapsulating the goal state if successful, otherwise None.
105
- """
106
- frontier: Stack[Node[T]] = Stack()
107
- frontier.push(Node(initial, None))
108
- explored: Set[T] = set(initial)
109
-
110
- while not frontier.empty:
111
- current_node: Node[T] = frontier.pop()
112
- current_state: T = current_node.state
113
-
114
- if goal_test(current_state):
115
- return current_node
116
-
117
- for child in successors(current_state):
118
- if child in explored:
119
- continue
120
- explored.add(child)
121
- frontier.push(Node(child, current_node))
122
-
123
- return None # we went through everything and never found goal
124
-
125
-
126
- def node_to_path(node: Node[T]) -> List[T]:
127
- """
128
- Returns the path that was followed from a starting state to reach a goal.
129
-
130
- Args:
131
- node:
132
-
133
- Returns:
134
- a list of states that were visited to reach the final goal.
135
- """
136
- path: List[T] = [node.state]
137
-
138
- while node.parent is not None:
139
- node = node.parent
140
- path.append(node.state)
141
- path.reverse()
142
- return path
143
-
144
-
145
- class Queue(Generic[T]):
146
- def __init__(self) -> None:
147
- self._container: Deque[T] = deque()
148
-
149
- @property
150
- def empty(self) -> bool:
151
- return not self._container
152
-
153
- def push(self, item: T) -> None:
154
- self._container.append(item)
155
-
156
- def pop(self) -> T:
157
- return self._container.popleft()
158
-
159
- def __repr__(self) -> str:
160
- return repr(self._container)
161
-
162
-
163
- def breadth_first_search(initial: T, goal_test: Callable[[T], bool], successors: Callable[[T], List[T]]) -> Optional[Node[T]]:
164
- frontier: Queue[Node[T]] = Queue()
165
- frontier.push(Node(initial, None))
166
- explored: Set[T] = set(initial)
167
-
168
- while not frontier.empty:
169
- current_node: Node[T] = frontier.pop()
170
- current_state: T = current_node.state
171
-
172
- if goal_test(current_state):
173
- return current_node
174
-
175
- for child in successors(current_state):
176
- if child in explored:
177
- continue
178
- explored.add(child)
179
- frontier.push(Node(child, current_node))
180
-
181
- return None # we went through everything and never found goal
182
-
egse/serialdevice.py DELETED
@@ -1,190 +0,0 @@
1
- """
2
- This module defines a generic base class for serial based device interface classes.
3
- """
4
-
5
- import logging
6
- from serial import Serial, SerialTimeoutException, SerialException
7
- from threading import Lock
8
-
9
- from egse.decorators import dynamic_interface
10
- from egse.device import DeviceConnectionInterface
11
-
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class SerialDevice(DeviceConnectionInterface):
17
- """ Generic base class for serial based device interface classes.
18
-
19
- This base class handles the serial connection.
20
- """
21
-
22
-
23
- def __init__(self, port=None, baudrate=9600, terminator='\r', timeout=5, encoding='ascii', errors='strict'):
24
- self._port = port
25
- self._baudrate = baudrate
26
- self._terminator = terminator
27
- self._encoding = encoding
28
- self._errors = errors
29
- self._timeout = timeout
30
- self._serial = None
31
- self._connected = False
32
- self._lock = Lock()
33
-
34
-
35
- @dynamic_interface
36
- def get_idn(self):
37
- """ Get the device ID string
38
-
39
- Child classes must implement this function because it is required for `is_connected()`
40
-
41
- Raises:
42
- ConnectionError: when the connection failed.
43
- """
44
- raise NotImplementedError
45
-
46
-
47
- def is_simulator(self):
48
-
49
- return False
50
-
51
-
52
- def connect(self):
53
- """ Create the serial conection.
54
-
55
- Raises a ConnectionError on failure.
56
- """
57
-
58
- # Sanity checks
59
- if self._connected:
60
- raise ConnectionError("Serial connection is already open")
61
- if self._port in (None, ""):
62
- raise ValueError("Serial port not initialized")
63
- if self._baudrate in (None, 0):
64
- raise ValueError("Baudrate not initialized")
65
-
66
- # Create a new serial connection
67
- try:
68
- self._serial = Serial(port=self._port, baudrate=self._baudrate,
69
- timeout=self._timeout, write_timeout=self._timeout)
70
- except ValueError as e_value:
71
- raise ConnectionError("Invalid parameters for serial connection") from e_value
72
- except SerialException as e_serial:
73
- raise ConnectionError("Failed to open serial device.") from e_serial
74
-
75
- self._connected = True
76
-
77
-
78
- def disconnect(self):
79
- """ Disconnect from the serial connection.
80
-
81
- Raises a ConnectionError on failure.
82
- """
83
-
84
- try:
85
- if self._connected:
86
- logger.debug(f"Disconnecting from {self._port}")
87
- with self._lock:
88
- self._serial.close()
89
- self._connected = False
90
- except Exception as e_exc:
91
- raise ConnectionError(f"Could not close serial connection to {self._port}") from e_exc
92
-
93
-
94
- def reconnect(self):
95
- """ Disconnect the serial connection if it is already connected and try to connect.
96
- """
97
-
98
- if self._connected:
99
- self.disconnect()
100
-
101
- self.connect()
102
-
103
-
104
- def is_connected(self):
105
- """ Check if the socket connection to the device is active.
106
- This function assumes the child class implements the get_idn method.
107
- """
108
-
109
- if not self._connected:
110
- return False
111
-
112
- try:
113
- response = self.get_idn()
114
- except ConnectionError as err:
115
- logger.error(f'While trying to talk to the device the following exception occured,',
116
- 'exception={err}')
117
- self.disconnect()
118
- return False
119
-
120
- return True
121
-
122
- def send_command(self, command: str):
123
- """
124
- Send a single command to the device controller without waiting for a response.
125
-
126
- Args:
127
- command: an order command for the controller.
128
-
129
- Raises:
130
- ConnectionError when the command could not be sent due to a timeout or a communication
131
- problem.
132
- """
133
-
134
- # print("send: ", repr(command))
135
-
136
- try:
137
- with self._lock:
138
- self._serial.write(command.encode(encoding=self._encoding, errors=self._errors))
139
-
140
- except SerialTimeoutException as e_timeout:
141
- raise ConnectionError("Serial timeout error") from e_timeout
142
-
143
-
144
- def read(self):
145
- """
146
- Read a response from the device until a termination character is encountered.
147
-
148
- Returns:
149
- Either a string returned by the controller (on success), or an error message (on
150
- failure).
151
-
152
- Raises:
153
- ConnectionError when there was an I/O problem during communication with the
154
- controller.
155
- """
156
-
157
- try:
158
- with self._lock:
159
- # Read the response
160
- # NOTE: the serial module reads until it encounters the \n termination character
161
- return_string = self._serial.read_until(self._terminator.encode(encoding=self._encoding, errors=self._errors), size=1024)
162
- # print(f"recv: ", repr(return_string))
163
-
164
- return return_string.decode(encoding=self._encoding, errors=self._errors)
165
-
166
- except SerialTimeoutException as e_timeout:
167
- raise ConnectionError("Serial timeout during query") from e_timeout
168
-
169
-
170
- def query(self, command: str):
171
- """
172
- Send a single command to the device controller and block until a response from the
173
- controller. This function can be overridden by the child class to implement device specific
174
- sanity checks on the reponse.
175
-
176
- Args:
177
- command: is the command to be sent
178
-
179
- Returns:
180
- Either a string returned by the controller (on success), or an error message (on
181
- failure).
182
-
183
- Raises:
184
- ConnectionError when there was an I/O problem during communication with the
185
- controller.
186
- """
187
-
188
- # Attempt to send the command
189
- self.send_command(command)
190
- return self.read()
egse/services.py DELETED
@@ -1,247 +0,0 @@
1
- """
2
- This module provides the services to the control servers.
3
-
4
- Each control server has a services protocol which provides commands that will
5
- be executed on the control server instead of the device controller. This is
6
- typically used to access control server specific settings like monitoring frequency,
7
- logging levels, or to quit the control server in a controlled way.
8
-
9
- """
10
-
11
- import inspect
12
- import logging
13
-
14
- from egse.command import ClientServerCommand
15
- from egse.control import ControlServer
16
- from egse.decorators import dynamic_interface
17
- from egse.protocol import CommandProtocol
18
- from egse.proxy import Proxy
19
- from egse.settings import Settings
20
- from egse.zmq_ser import bind_address
21
- from egse.zmq_ser import connect_address
22
-
23
- LOGGER = logging.getLogger(__name__)
24
-
25
- SERVICE_SETTINGS = Settings.load(filename="services.yaml")
26
-
27
-
28
- class ServiceCommand(ClientServerCommand):
29
- pass
30
-
31
-
32
- class ServiceProtocol(CommandProtocol):
33
- def __init__(self, control_server: ControlServer):
34
- super().__init__()
35
- self.control_server = control_server
36
-
37
- self.load_commands(SERVICE_SETTINGS.Commands, ServiceCommand, ServiceProtocol)
38
-
39
- def get_bind_address(self):
40
- return bind_address(self.control_server.get_communication_protocol(), self.control_server.get_service_port())
41
-
42
- def get_status(self):
43
- return super().get_status()
44
-
45
- def handle_set_monitoring_frequency(self, freq: float):
46
- """
47
- Sets the monitoring frequency (Hz) to the given freq value. This is only approximate since the frequency is
48
- converted into a delay time and the actual execution of the status function is subject to the load on the
49
- server and the overhead of the timing.
50
-
51
- Args:
52
- freq: frequency of execution (Hz)
53
-
54
- Returns:
55
- Sends back the selected delay time in milliseconds.
56
- """
57
- delay = self.control_server.set_delay(1.0 / freq)
58
-
59
- LOGGER.debug(f"Set monitoring frequency to {freq}Hz, ± every {delay:.0f}ms.")
60
-
61
- self.send(delay)
62
-
63
- def handle_set_hk_frequency(self, freq: float):
64
- """
65
- Sets the housekeeping frequency (Hz) to the given freq value. This is only approximate since the frequency is
66
- converted into a delay time and the actual execution of the `housekeeping` function is subject to the load on
67
- the server and the overhead of the timing.
68
-
69
- Args:
70
- freq: frequency of execution (Hz)
71
-
72
- Returns:
73
- Sends back the selected delay time in milliseconds.
74
- """
75
- delay = self.control_server.set_hk_delay(1.0 / freq)
76
-
77
- LOGGER.debug(f"Set housekeeping frequency to {freq}Hz, ± every {delay:.0f}ms.")
78
-
79
- self.send(delay)
80
-
81
- def handle_set_logging_level(self, *args, **kwargs):
82
- """
83
- Set the logging level for the logger with the given name.
84
-
85
- When 'all' is given for the name of the logger, the level of all loggers for which the name
86
- starts with 'egse' will be changed to `level`.
87
-
88
- Args:
89
- name (str): the name of an existing Logger
90
- level (int): the logging level
91
-
92
- Returns:
93
- Sends back an info message on what level was set.
94
- """
95
- if args:
96
- name = args[0]
97
- level = int(args[1])
98
- else:
99
- name = kwargs['name']
100
- level = int(kwargs['level'])
101
-
102
- if name == 'all':
103
- for logger in [logging.getLogger(logger_name)
104
- for logger_name in logging.root.manager.loggerDict
105
- if logger_name.startswith('egse')]:
106
- logger.setLevel(level)
107
- msg = f"Logging level set to {level} for ALL 'egse' loggers"
108
- elif name in logging.root.manager.loggerDict:
109
- logger = logging.getLogger(name)
110
- logger.setLevel(level)
111
- msg = f"Logging level for {name} set to {level}."
112
- else:
113
- msg = f"Logger with name '{name}' doesn't exist at the server side."
114
-
115
- # self.control_server.set_logging_level(level)
116
- logging.debug(msg)
117
- self.send(msg)
118
-
119
- def handle_quit(self):
120
- LOGGER.info(f"Sending interrupt to {self.control_server.__class__.__name__}.")
121
- self.control_server.quit()
122
- self.send(f"Sent interrupt to {self.control_server.__class__.__name__}.")
123
-
124
- def handle_get_process_status(self):
125
- LOGGER.debug(f"Asking for process status of {self.control_server.__class__.__name__}.")
126
- self.send(self.get_status())
127
-
128
- def handle_get_cs_module(self):
129
- """
130
- Returns the module in which the control server has been implemented.
131
- """
132
- LOGGER.debug(f"Asking for module of {self.control_server.__class__.__name__}.")
133
- self.send(inspect.getmodule(self.control_server).__spec__.name)
134
-
135
- def handle_get_average_execution_times(self):
136
- LOGGER.debug(f"Asking for average execution times of {self.control_server.__class__.__name__} functions.")
137
- self.send(self.control_server.get_average_execution_times())
138
-
139
- def handle_get_storage_mnemonic(self):
140
- LOGGER.debug(f"Asking for the storage menmonic of {self.control_server.__class__.__name__}.")
141
- self.send(self.control_server.get_storage_mnemonic())
142
-
143
- def handle_add_listener(self, listener: dict):
144
- LOGGER.debug(f"Add listener to {self.control_server.__class__.__name__}: {listener}")
145
- try:
146
- self.control_server.listeners.add_listener(listener)
147
- LOGGER.info(f"Registered listener: {listener['name']} with proxy {listener['proxy']}")
148
- self.send(("ACK",))
149
- except ValueError as exc:
150
- self.send(("NACK", exc)) # Why not send back a failure object?
151
-
152
- def handle_remove_listener(self, listener: dict):
153
- LOGGER.debug(f"Remove listener from {self.control_server.__class__.__name__}: {listener}")
154
- try:
155
- self.control_server.listeners.remove_listener(listener)
156
- LOGGER.info(f"Removed listener: {listener['name']}")
157
- self.send(("ACK",))
158
- except ValueError as exc:
159
- self.send(("NACK", exc)) # Why not send back a failure object?
160
-
161
- def handle_get_listener_names(self):
162
- LOGGER.debug(f"Get names of registered listener from {self.control_server.__class__.__name__}")
163
- try:
164
- names = self.control_server.listeners.get_listener_names()
165
- self.send((names,))
166
- except ValueError as exc:
167
- self.send(("", exc)) # Why not sent back a Failure object?
168
-
169
- class ServiceInterface:
170
- @dynamic_interface
171
- def set_monitoring_frequency(self, freq: float):
172
- ...
173
- @dynamic_interface
174
- def set_hk_frequency(self, freq: float):
175
- ...
176
- @dynamic_interface
177
- def set_logging_level(self, name: str, level: int):
178
- ...
179
- @dynamic_interface
180
- def quit_server(self):
181
- ...
182
- @dynamic_interface
183
- def get_process_status(self):
184
- ...
185
- @dynamic_interface
186
- def get_cs_module(self):
187
- ...
188
- @dynamic_interface
189
- def get_average_execution_times(self):
190
- ...
191
- @dynamic_interface
192
- def get_storage_mnemonic(self):
193
- ...
194
- @dynamic_interface
195
- def add_listener(self, listener: dict):
196
- ...
197
- @dynamic_interface
198
- def remove_listener(self, listener: dict):
199
- ...
200
- @dynamic_interface
201
- def get_listener_names(self, listener: dict):
202
- ...
203
-
204
- class ServiceProxy(Proxy, ServiceInterface):
205
- """
206
- A ServiceProxy is a simple class that forwards service commands to a control server.
207
- """
208
-
209
- def __init__(self, ctrl_settings=None, *, protocol=None, hostname=None, port=None):
210
- """
211
- A ServiceProxy can be configured from the specific control server settings, or additional
212
- arguments `protocol`, `hostname` and `port` can be passed.
213
-
214
- The additional arguments always overwrite the values loaded from ctrl_settings. Either ctrl_settings or
215
- hostname and port must be provided, protocol is optional and defaults to 'tcp'.
216
-
217
- Args:
218
- ctrl_settings: an AttributeDict with HOSTNAME, PORT and PROTOCOL attributes
219
- protocol: the transport protocol [default: tcp]
220
- hostname: the IP addrress of the control server
221
- port: the port on which the control server is listening for service commands
222
- """
223
- _protocol = _hostname = _port = None
224
- if ctrl_settings:
225
- _protocol = ctrl_settings.PROTOCOL
226
- _hostname = ctrl_settings.HOSTNAME
227
- _port = ctrl_settings.SERVICE_PORT
228
-
229
- # the protocol argument is overwriting the standard crtl_settings
230
-
231
- if protocol:
232
- _protocol = protocol
233
-
234
- # if still _protocol is not set, neither by ctrl_settings, nor by the protocol argument, use a default
235
-
236
- if _protocol is None:
237
- _protocol = 'tcp'
238
-
239
- if hostname:
240
- _hostname = hostname
241
- if port:
242
- _port = port
243
-
244
- if _hostname is None or _port is None:
245
- raise ValueError("Expected ctrl-settings or hostname and port as arguments")
246
-
247
- super().__init__(connect_address(_protocol, _hostname, _port))
egse/services.yaml DELETED
@@ -1,68 +0,0 @@
1
-
2
- ProxyClass:
3
- egse.services.ServiceProxy
4
-
5
- ClassDescription:
6
- The Service Proxy class is used to send control commands to any of the control servers.
7
-
8
- Commands:
9
-
10
- set_monitoring_frequency:
11
- description: Sets the monitoring frequency (Hz) to the given freq value.
12
- cmd: '{freq}'
13
- device_method: None
14
- response: handle_set_monitoring_frequency
15
-
16
- set_hk_frequency:
17
- description: Sets the housekeeping frequency (Hz) to the given freq value.
18
- cmd: '{freq}'
19
- device_method: None
20
- response: handle_set_hk_frequency
21
-
22
- set_logging_level:
23
- description: Set the logging level for the logger with the given name.
24
- cmd: '{name} {level}'
25
- device_method: None
26
- response: handle_set_logging_level
27
-
28
- quit_server:
29
- description: Send an interrupt to the control server. The server will close all connections and exit.
30
- device_method: None
31
- response: handle_quit
32
-
33
- get_process_status:
34
- description: Ask for the process status of the control server.
35
- device_method: None
36
- response: handle_get_process_status
37
-
38
- get_cs_module:
39
- description: Returns the module in which the control server has been implemented.
40
- device_method: None
41
- response: handle_get_cs_module
42
-
43
- get_average_execution_times:
44
- description: Returns a dictionary with the average execution times of the get_housekeeping and get_status methods
45
- device_method: None
46
- response: handle_get_average_execution_times
47
-
48
- get_storage_mnemonic:
49
- description: Returns the mnemonic that is part of the filename where the housekeeping data are stored.
50
- device_method: None
51
- response: handle_get_storage_mnemonic
52
-
53
- add_listener:
54
- description: Adds a Listener process to be notified on special events.
55
- cmd: '{listener}'
56
- device_method: None
57
- response: handle_add_listener
58
-
59
- remove_listener:
60
- description: Remove a Listener process.
61
- cmd: '{listener}'
62
- device_method: None
63
- response: handle_remove_listener
64
-
65
- get_listener_names:
66
- description: Get the names of the registered Listener processes.
67
- device_method: None
68
- response: handle_get_listener_names