cgse 2023.38.0__py3-none-any.whl → 2024.1.3__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 (653) hide show
  1. README.md +27 -0
  2. bump.py +77 -0
  3. cgse-2024.1.3.dist-info/METADATA +41 -0
  4. cgse-2024.1.3.dist-info/RECORD +5 -0
  5. {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
  6. cgse-2023.38.0.dist-info/COPYING +0 -674
  7. cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
  8. cgse-2023.38.0.dist-info/METADATA +0 -144
  9. cgse-2023.38.0.dist-info/RECORD +0 -649
  10. cgse-2023.38.0.dist-info/entry_points.txt +0 -75
  11. cgse-2023.38.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 -5235
  15. egse/aeu/aeu_awg.yaml +0 -265
  16. egse/aeu/aeu_crio.yaml +0 -273
  17. egse/aeu/aeu_cs.py +0 -626
  18. egse/aeu/aeu_devif.py +0 -321
  19. egse/aeu/aeu_main_ui.py +0 -912
  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 -234
  46. egse/alert/alertman_ui.py +0 -603
  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 -130
  51. egse/alert/gsm/beaglebone_protocol.py +0 -48
  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 -129
  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 -1015
  66. egse/confman/confman.yaml +0 -67
  67. egse/confman/confman_cs.py +0 -239
  68. egse/confman/confman_ui.py +0 -381
  69. egse/confman/setup_ui.py +0 -565
  70. egse/control.py +0 -442
  71. egse/coordinates/__init__.py +0 -531
  72. egse/coordinates/avoidance.py +0 -103
  73. egse/coordinates/cslmodel.py +0 -127
  74. egse/coordinates/laser_tracker_to_dict.py +0 -120
  75. egse/coordinates/point.py +0 -707
  76. egse/coordinates/pyplot.py +0 -195
  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 -1247
  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 -415
  110. egse/device.py +0 -269
  111. egse/dpu/__init__.py +0 -2681
  112. egse/dpu/ccd_ui.py +0 -508
  113. egse/dpu/dpu.py +0 -786
  114. egse/dpu/dpu.yaml +0 -153
  115. egse/dpu/dpu_cs.py +0 -272
  116. egse/dpu/dpu_ui.py +0 -668
  117. egse/dpu/fitsgen.py +0 -2077
  118. egse/dpu/fitsgen_test.py +0 -752
  119. egse/dpu/fitsgen_ui.py +0 -399
  120. egse/dpu/hdf5_model.py +0 -332
  121. egse/dpu/hdf5_ui.py +0 -277
  122. egse/dpu/hdf5_viewer.py +0 -506
  123. egse/dpu/hk_ui.py +0 -468
  124. egse/dpu_commands.py +0 -81
  125. egse/dsi/constants.py +0 -220
  126. egse/dsi/esl.py +0 -870
  127. egse/dsi/rmap.py +0 -1042
  128. egse/dsi/rmapci.py +0 -37
  129. egse/dsi/spw.py +0 -154
  130. egse/dsi/spw_state.py +0 -29
  131. egse/dummy.py +0 -258
  132. egse/dyndummy.py +0 -179
  133. egse/env.py +0 -278
  134. egse/exceptions.py +0 -88
  135. egse/fdir/__init__.py +0 -28
  136. egse/fdir/fdir_manager.py +0 -85
  137. egse/fdir/fdir_manager.yaml +0 -51
  138. egse/fdir/fdir_manager_controller.py +0 -228
  139. egse/fdir/fdir_manager_cs.py +0 -164
  140. egse/fdir/fdir_manager_interface.py +0 -25
  141. egse/fdir/fdir_remote.py +0 -73
  142. egse/fdir/fdir_remote.yaml +0 -37
  143. egse/fdir/fdir_remote_controller.py +0 -50
  144. egse/fdir/fdir_remote_cs.py +0 -97
  145. egse/fdir/fdir_remote_interface.py +0 -14
  146. egse/fdir/fdir_remote_popup.py +0 -31
  147. egse/fee/__init__.py +0 -114
  148. egse/fee/f_fee_register.yaml +0 -43
  149. egse/fee/fee.py +0 -631
  150. egse/fee/feesim.py +0 -750
  151. egse/fee/n_fee_hk.py +0 -761
  152. egse/fee/nfee.py +0 -187
  153. egse/filterwheel/__init__.py +0 -4
  154. egse/filterwheel/eksma/__init__.py +0 -24
  155. egse/filterwheel/eksma/fw8smc4.py +0 -661
  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 -81
  160. egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
  161. egse/filterwheel/eksma/fw8smc5.py +0 -111
  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 -1068
  168. egse/filterwheel/eksma/testpythonfw.py +0 -215
  169. egse/fov/__init__.py +0 -65
  170. egse/fov/fov_hk.py +0 -712
  171. egse/fov/fov_ui.py +0 -861
  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 -135
  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 -1281
  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 -588
  194. egse/gui/states.py +0 -148
  195. egse/gui/stripchart.py +0 -729
  196. egse/gui/switch.py +0 -112
  197. egse/h5.py +0 -274
  198. egse/help/__init__.py +0 -0
  199. egse/help/help_ui.py +0 -126
  200. egse/hexapod/__init__.py +0 -32
  201. egse/hexapod/symetrie/__init__.py +0 -138
  202. egse/hexapod/symetrie/alpha.py +0 -874
  203. egse/hexapod/symetrie/dynalpha.py +0 -1387
  204. egse/hexapod/symetrie/hexapod_ui.py +0 -1516
  205. egse/hexapod/symetrie/pmac.py +0 -1010
  206. egse/hexapod/symetrie/pmac_regex.py +0 -83
  207. egse/hexapod/symetrie/puna.py +0 -1167
  208. egse/hexapod/symetrie/puna.yaml +0 -193
  209. egse/hexapod/symetrie/puna_cs.py +0 -196
  210. egse/hexapod/symetrie/puna_protocol.py +0 -131
  211. egse/hexapod/symetrie/puna_ui.py +0 -434
  212. egse/hexapod/symetrie/punaplus.py +0 -107
  213. egse/hexapod/symetrie/zonda.py +0 -872
  214. egse/hexapod/symetrie/zonda.yaml +0 -337
  215. egse/hexapod/symetrie/zonda_cs.py +0 -172
  216. egse/hexapod/symetrie/zonda_devif.py +0 -415
  217. egse/hexapod/symetrie/zonda_protocol.py +0 -119
  218. egse/hexapod/symetrie/zonda_ui.py +0 -449
  219. egse/hk.py +0 -765
  220. egse/icons/aeu-cs-start.svg +0 -117
  221. egse/icons/aeu-cs-stop.svg +0 -118
  222. egse/icons/aeu-cs.svg +0 -107
  223. egse/icons/aeu_cs-started.svg +0 -112
  224. egse/icons/aeu_cs-stopped.svg +0 -112
  225. egse/icons/aeu_cs.svg +0 -55
  226. egse/icons/alert.svg +0 -1
  227. egse/icons/arrow-double-left.png +0 -0
  228. egse/icons/arrow-double-right.png +0 -0
  229. egse/icons/arrow-up.svg +0 -11
  230. egse/icons/backward.svg +0 -1
  231. egse/icons/busy.svg +0 -1
  232. egse/icons/cleaning.svg +0 -115
  233. egse/icons/color-scheme.svg +0 -1
  234. egse/icons/cs-connected-alert.svg +0 -91
  235. egse/icons/cs-connected-disabled.svg +0 -43
  236. egse/icons/cs-connected.svg +0 -89
  237. egse/icons/cs-not-connected.svg +0 -44
  238. egse/icons/double-left-arrow.svg +0 -1
  239. egse/icons/double-right-arrow.svg +0 -1
  240. egse/icons/erase-disabled.svg +0 -19
  241. egse/icons/erase.svg +0 -59
  242. egse/icons/fitsgen-start.svg +0 -47
  243. egse/icons/fitsgen-stop.svg +0 -48
  244. egse/icons/fitsgen.svg +0 -1
  245. egse/icons/forward.svg +0 -1
  246. egse/icons/fov-hk-start.svg +0 -33
  247. egse/icons/fov-hk-stop.svg +0 -37
  248. egse/icons/fov-hk.svg +0 -1
  249. egse/icons/front-desk.svg +0 -1
  250. egse/icons/home-actioned.svg +0 -15
  251. egse/icons/home-disabled.svg +0 -15
  252. egse/icons/home.svg +0 -13
  253. egse/icons/info.svg +0 -1
  254. egse/icons/invalid.png +0 -0
  255. egse/icons/led-green.svg +0 -20
  256. egse/icons/led-grey.svg +0 -20
  257. egse/icons/led-orange.svg +0 -20
  258. egse/icons/led-red.svg +0 -20
  259. egse/icons/led-square-green.svg +0 -134
  260. egse/icons/led-square-grey.svg +0 -134
  261. egse/icons/led-square-orange.svg +0 -134
  262. egse/icons/led-square-red.svg +0 -134
  263. egse/icons/limit-switch-all-green.svg +0 -115
  264. egse/icons/limit-switch-all-red.svg +0 -117
  265. egse/icons/limit-switch-el+.svg +0 -116
  266. egse/icons/limit-switch-el-.svg +0 -117
  267. egse/icons/location-marker.svg +0 -1
  268. egse/icons/logo-dpu.svg +0 -48
  269. egse/icons/logo-gimbal.svg +0 -112
  270. egse/icons/logo-huber.svg +0 -23
  271. egse/icons/logo-ogse.svg +0 -31
  272. egse/icons/logo-puna.svg +0 -92
  273. egse/icons/logo-tcs.svg +0 -29
  274. egse/icons/logo-zonda.svg +0 -66
  275. egse/icons/maximize.svg +0 -1
  276. egse/icons/meter.svg +0 -1
  277. egse/icons/more.svg +0 -45
  278. egse/icons/n-fee-hk-start.svg +0 -24
  279. egse/icons/n-fee-hk-stop.svg +0 -25
  280. egse/icons/n-fee-hk.svg +0 -83
  281. egse/icons/observing-off.svg +0 -46
  282. egse/icons/observing-on.svg +0 -46
  283. egse/icons/open-document-hdf5.png +0 -0
  284. egse/icons/open-document-hdf5.svg +0 -21
  285. egse/icons/ops-mode.svg +0 -1
  286. egse/icons/play-green.svg +0 -17
  287. egse/icons/plugged-disabled.svg +0 -27
  288. egse/icons/plugged.svg +0 -21
  289. egse/icons/pm_ui.svg +0 -1
  290. egse/icons/power-button-green.svg +0 -27
  291. egse/icons/power-button-red.svg +0 -27
  292. egse/icons/power-button.svg +0 -27
  293. egse/icons/radar.svg +0 -1
  294. egse/icons/radioactive.svg +0 -2
  295. egse/icons/reload.svg +0 -1
  296. egse/icons/remote-control-off.svg +0 -28
  297. egse/icons/remote-control-on.svg +0 -28
  298. egse/icons/repeat-blue.svg +0 -15
  299. egse/icons/repeat.svg +0 -1
  300. egse/icons/settings.svg +0 -1
  301. egse/icons/shrink.svg +0 -1
  302. egse/icons/shutter.svg +0 -1
  303. egse/icons/sign-off.svg +0 -1
  304. egse/icons/sign-on.svg +0 -1
  305. egse/icons/sim-mode.svg +0 -1
  306. egse/icons/small-buttons-go.svg +0 -20
  307. egse/icons/small-buttons-minus.svg +0 -51
  308. egse/icons/small-buttons-plus.svg +0 -51
  309. egse/icons/sponge.svg +0 -220
  310. egse/icons/start-button-disabled.svg +0 -84
  311. egse/icons/start-button.svg +0 -50
  312. egse/icons/stop-button-disabled.svg +0 -84
  313. egse/icons/stop-button.svg +0 -50
  314. egse/icons/stop-red.svg +0 -17
  315. egse/icons/stop.svg +0 -1
  316. egse/icons/switch-disabled-square.svg +0 -87
  317. egse/icons/switch-disabled.svg +0 -15
  318. egse/icons/switch-off-square.svg +0 -87
  319. egse/icons/switch-off.svg +0 -72
  320. egse/icons/switch-on-square.svg +0 -87
  321. egse/icons/switch-on.svg +0 -61
  322. egse/icons/temperature-control.svg +0 -44
  323. egse/icons/th_ui_logo.svg +0 -1
  324. egse/icons/unplugged.svg +0 -23
  325. egse/icons/unvalid.png +0 -0
  326. egse/icons/user-interface.svg +0 -1
  327. egse/icons/vacuum.svg +0 -1
  328. egse/icons/valid.png +0 -0
  329. egse/icons/zoom-to-pixel-dark.svg +0 -64
  330. egse/icons/zoom-to-pixel-white.svg +0 -36
  331. egse/images/big-rotation-stage.png +0 -0
  332. egse/images/connected-100.png +0 -0
  333. egse/images/cross.svg +0 -6
  334. egse/images/disconnected-100.png +0 -0
  335. egse/images/gui-icon.png +0 -0
  336. egse/images/home.svg +0 -6
  337. egse/images/info-icon.png +0 -0
  338. egse/images/led-black.svg +0 -89
  339. egse/images/led-green.svg +0 -85
  340. egse/images/led-orange.svg +0 -85
  341. egse/images/led-red.svg +0 -85
  342. egse/images/load-icon.png +0 -0
  343. egse/images/load-setup.png +0 -0
  344. egse/images/load.png +0 -0
  345. egse/images/pause.png +0 -0
  346. egse/images/play-button.svg +0 -8
  347. egse/images/play.png +0 -0
  348. egse/images/process-status.png +0 -0
  349. egse/images/restart.png +0 -0
  350. egse/images/search.png +0 -0
  351. egse/images/sma.png +0 -0
  352. egse/images/start.png +0 -0
  353. egse/images/stop-button.svg +0 -8
  354. egse/images/stop.png +0 -0
  355. egse/images/switch-off.svg +0 -48
  356. egse/images/switch-on.svg +0 -48
  357. egse/images/undo.png +0 -0
  358. egse/images/update-button.svg +0 -11
  359. egse/imageviewer/exposureselection.py +0 -475
  360. egse/imageviewer/imageviewer.py +0 -198
  361. egse/imageviewer/matchfocalplane.py +0 -179
  362. egse/imageviewer/subfieldposition.py +0 -133
  363. egse/lampcontrol/__init__.py +0 -4
  364. egse/lampcontrol/beaglebone/beaglebone.py +0 -178
  365. egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
  366. egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
  367. egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
  368. egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
  369. egse/lampcontrol/energetiq/__init__.py +0 -22
  370. egse/lampcontrol/energetiq/eq99.yaml +0 -98
  371. egse/lampcontrol/energetiq/lampEQ99.py +0 -283
  372. egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
  373. egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
  374. egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
  375. egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -69
  376. egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
  377. egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
  378. egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
  379. egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
  380. egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
  381. egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
  382. egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
  383. egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
  384. egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
  385. egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
  386. egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
  387. egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
  388. egse/lib/macOS/ESL-RMAP_v34_86.dylib +0 -0
  389. egse/lib/macOS/EtherSpaceLink_v34_86.dylib +0 -0
  390. egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
  391. egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
  392. egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
  393. egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
  394. egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
  395. egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
  396. egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
  397. egse/lib/ximc/libximc.framework/libbindy.so +0 -0
  398. egse/lib/ximc/libximc.framework/libximc +0 -0
  399. egse/lib/ximc/libximc.framework/libximc.so +0 -0
  400. egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
  401. egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
  402. egse/lib/ximc/pyximc.py +0 -922
  403. egse/listener.py +0 -73
  404. egse/logger/__init__.py +0 -243
  405. egse/logger/log_cs.py +0 -321
  406. egse/metrics.py +0 -98
  407. egse/mixin.py +0 -464
  408. egse/monitoring.py +0 -95
  409. egse/ni/alarms/__init__.py +0 -26
  410. egse/ni/alarms/cdaq9375.py +0 -300
  411. egse/ni/alarms/cdaq9375.yaml +0 -89
  412. egse/ni/alarms/cdaq9375_cs.py +0 -130
  413. egse/ni/alarms/cdaq9375_devif.py +0 -183
  414. egse/ni/alarms/cdaq9375_protocol.py +0 -48
  415. egse/obs_inspection.py +0 -163
  416. egse/observer.py +0 -41
  417. egse/obsid.py +0 -163
  418. egse/powermeter/__init__.py +0 -0
  419. egse/powermeter/ni/__init__.py +0 -38
  420. egse/powermeter/ni/cdaq9184.py +0 -224
  421. egse/powermeter/ni/cdaq9184.yaml +0 -73
  422. egse/powermeter/ni/cdaq9184_cs.py +0 -130
  423. egse/powermeter/ni/cdaq9184_devif.py +0 -201
  424. egse/powermeter/ni/cdaq9184_protocol.py +0 -48
  425. egse/powermeter/ni/cdaq9184_ui.py +0 -544
  426. egse/powermeter/thorlabs/__init__.py +0 -25
  427. egse/powermeter/thorlabs/pm100a.py +0 -380
  428. egse/powermeter/thorlabs/pm100a.yaml +0 -132
  429. egse/powermeter/thorlabs/pm100a_cs.py +0 -136
  430. egse/powermeter/thorlabs/pm100a_devif.py +0 -127
  431. egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
  432. egse/powermeter/thorlabs/pm100a_ui.py +0 -725
  433. egse/process.py +0 -451
  434. egse/procman/__init__.py +0 -811
  435. egse/procman/cannot_start_process_popup.py +0 -43
  436. egse/procman/procman.yaml +0 -49
  437. egse/procman/procman_cs.py +0 -201
  438. egse/procman/procman_ui.py +0 -2081
  439. egse/protocol.py +0 -603
  440. egse/proxy.py +0 -522
  441. egse/randomwalk.py +0 -140
  442. egse/reg.py +0 -585
  443. egse/reload.py +0 -122
  444. egse/reprocess.py +0 -675
  445. egse/resource.py +0 -333
  446. egse/rst.py +0 -135
  447. egse/search.py +0 -182
  448. egse/serialdevice.py +0 -190
  449. egse/services.py +0 -212
  450. egse/services.yaml +0 -51
  451. egse/settings.py +0 -379
  452. egse/settings.yaml +0 -980
  453. egse/setup.py +0 -1180
  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 -69
  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 -1479
  473. egse/stages/__init__.py +0 -12
  474. egse/stages/aerotech/ensemble.py +0 -247
  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 -193
  482. egse/stages/arun/smd3.py +0 -111
  483. egse/stages/arun/smd3.yaml +0 -68
  484. egse/stages/arun/smd3_controller.py +0 -472
  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 -904
  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 -111
  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 -1004
  500. egse/storage/persistence.py +0 -2295
  501. egse/storage/storage.yaml +0 -72
  502. egse/storage/storage_cs.py +0 -214
  503. egse/styles/dark.qss +0 -343
  504. egse/styles/default.qss +0 -48
  505. egse/synoptics/__init__.py +0 -412
  506. egse/synoptics/syn.yaml +0 -9
  507. egse/synoptics/syn_cs.py +0 -195
  508. egse/system.py +0 -1408
  509. egse/tcs/__init__.py +0 -14
  510. egse/tcs/tcs.py +0 -874
  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 -177
  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 -116
  522. egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
  523. egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
  524. egse/tempcontrol/agilent/agilent34972.py +0 -111
  525. egse/tempcontrol/agilent/agilent34972.yaml +0 -44
  526. egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
  527. egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
  528. egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
  529. egse/tempcontrol/beaglebone/beaglebone.py +0 -342
  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 -135
  533. egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
  534. egse/tempcontrol/digalox/digalox.py +0 -107
  535. egse/tempcontrol/digalox/digalox.yaml +0 -36
  536. egse/tempcontrol/digalox/digalox_cs.py +0 -112
  537. egse/tempcontrol/digalox/digalox_protocol.py +0 -55
  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 -78
  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 -73
  551. egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
  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 -727
  559. egse/tempcontrol/srs/__init__.py +0 -22
  560. egse/tempcontrol/srs/ptc10.py +0 -875
  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 -118
  564. egse/tempcontrol/srs/ptc10_protocol.py +0 -42
  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 -164
  575. egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
  576. egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
  577. egse/vacuum/instrutech/igm402.py +0 -92
  578. egse/vacuum/instrutech/igm402.yaml +0 -90
  579. egse/vacuum/instrutech/igm402_controller.py +0 -128
  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 -102
  585. egse/vacuum/keller/leo3.yaml +0 -38
  586. egse/vacuum/keller/leo3_controller.py +0 -83
  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 -316
  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 -704
  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 -39
  602. egse/vacuum/pfeiffer/tc400.py +0 -113
  603. egse/vacuum/pfeiffer/tc400.yaml +0 -83
  604. egse/vacuum/pfeiffer/tc400_controller.py +0 -140
  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 -24
  608. egse/vacuum/pfeiffer/tpg261.py +0 -81
  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 -60
  613. egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
  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 -44
  625. scripts/check_hdf5_files.py +0 -192
  626. scripts/check_register_sync.py +0 -47
  627. scripts/create_hdf5_report.py +0 -295
  628. scripts/csl_model.py +0 -436
  629. scripts/csl_restore_setup.py +0 -230
  630. scripts/export-grafana-dashboards.py +0 -50
  631. scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
  632. scripts/fdir/fdir_table.yaml +0 -70
  633. scripts/fdir/fdir_test_recovery.py +0 -11
  634. scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
  635. scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
  636. scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
  637. scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
  638. scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
  639. scripts/fix_csv.py +0 -80
  640. scripts/n_fee_supply_voltage_calculation.py +0 -92
  641. scripts/playground.py +0 -30
  642. scripts/print_hdf5_hk_data.py +0 -68
  643. scripts/print_register_map.py +0 -43
  644. scripts/sron/commanding/control_heaters.py +0 -44
  645. scripts/sron/commanding/pumpdown.py +0 -46
  646. scripts/sron/commanding/set_pid_setpoint.py +0 -19
  647. scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
  648. scripts/sron/commanding/shutdown_pumps.py +0 -33
  649. scripts/sron/tm_gen/tm_gen_agilent.py +0 -38
  650. scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
  651. scripts/sron/tm_gen/tm_gen_spid.py +0 -13
  652. scripts/update_operational_cgse.py +0 -268
  653. scripts/update_operational_cgse_old.py +0 -273
@@ -1,904 +0,0 @@
1
- """
2
- This module defines the device classes to be used to connect to and control the HUBER Stages.
3
- """
4
- from __future__ import annotations
5
-
6
- import logging
7
- import textwrap
8
- from typing import Tuple
9
-
10
- import rich
11
- import time
12
-
13
- from egse.control import Failure
14
- from egse.device import DeviceConnectionError
15
- from egse.device import DeviceConnectionState
16
- from egse.device import DeviceInterface
17
- from egse.mixin import DynamicCommandMixin
18
- from egse.mixin import add_cr_lf
19
- from egse.mixin import dynamic_command
20
- from egse.proxy import DynamicProxy
21
- from egse.settings import Settings
22
- from egse.stages.huber.smc9300_devif import HuberError
23
- from egse.stages.huber.smc9300_devif import HuberSMC9300EthernetInterface
24
- from egse.state import GlobalState
25
- from egse.zmq_ser import connect_address
26
-
27
- # Explicitly set the module name instead of __name__. When module is executed instead of imported
28
- # __name__ will result in __main__ and no logging to zmq will be done.
29
-
30
- MODULE_LOGGER = logging.getLogger("egse.stages.huber.smc9300")
31
-
32
- HC_SETTINGS = Settings.load("Huber Controller")
33
- CTRL_SETTINGS = Settings.load("Huber Control Server")
34
- DEVICE_SETTINGS = Settings.load(filename="smc9300.yaml")
35
-
36
-
37
- def print_state(state: int) -> None:
38
- """Prints the state of the axis."""
39
-
40
- rich.print(
41
- textwrap.dedent(
42
- f"""\
43
- axis ready: {bool(state & 1)}
44
- reference position installed: {bool(state & 2)}
45
- end/limit switch EL- active: {bool(state & 4)}
46
- end/limit switch EL+ active: {bool(state & 8)}
47
- program execution in progress: {bool(state & 64)}
48
- controller ready: {bool(state & 128)}
49
- oscillation in progress: {bool(state & 256)}
50
- oscillation positioning error: {bool(state & 512)}
51
- encoder reference installed: {bool(state & 1024)}
52
- axis error: {bool(state & 16384)}
53
- """
54
- )
55
- )
56
-
57
-
58
- def untangle_status(status: str) -> dict:
59
- """Returns a dictionary with all the values from the status string."""
60
-
61
- try:
62
-
63
- axis, errn, errm, pos, epos, el, ref, eref, rdy, osc, prog, *_ = status.split(":")
64
-
65
- return {
66
- "axis": int(axis), # the axis id
67
- "err_no": int(errn), # error number
68
- "err_msg": errm, # error message
69
- "pos": float(pos), # position
70
- "epos": float(epos), # encode position
71
- "elimit": int(el), # end/limit status
72
- "ref": int(ref), # reference status
73
- "eref": int(eref), # encoder reference status
74
- "ctrl": int(rdy), # controller ready
75
- "osc": int(osc), # oscillation status
76
- "prog": int(prog), # program running
77
- }
78
- except ValueError as exc:
79
- raise ValueError(
80
- textwrap.dedent(
81
- f"""\
82
- Could not disentangle the status from SMC9300, response from the device can not be parsed.
83
- The expected format is "axis:err_no:err_msg:pos:epos:elimit:ref:eref:ctrl:osc:prog", where
84
- `err_msg` is a string, `pos` and `epos` are floats and the others are of type int.
85
- {status=}
86
- """
87
- )
88
- ) from exc
89
-
90
-
91
- def decode_response(response: bytes) -> str:
92
- """Decodes the bytes object and strips off the newline."""
93
-
94
- # MODULE_LOGGER.debug(f"response -> {response}")
95
-
96
- return response.decode().rstrip()
97
-
98
-
99
- def decode_info(response: bytes) -> str:
100
- response = decode_response(response).split("\r\n")
101
-
102
- return "\n".join(response)
103
-
104
-
105
- def decode_get_state(response: bytes) -> int:
106
- """Decodes the response from the get state command and strips off the newline."""
107
-
108
- # The response argument has the following format: '<axis>:<state>;'
109
- # where <axis> is 1, 2, or 3 and we need the <state>, so we to
110
- # cut e.g. '1:' and ';' if <axis> is 1.
111
-
112
- response = decode_response(response)
113
- return int(response[2:-1])
114
-
115
-
116
- def decode_get_parameter(response: bytes) -> Tuple[str, int, str]:
117
- """
118
- Decodes the response from a request for a parameter value. The response contains
119
- the parameter name, the axis, and the value.
120
-
121
- Returns:
122
- A tuple of (`<parameter name: str>`, `<axis: int>`, `<value: str>`)
123
- """
124
- response = decode_response(response)
125
- name, value = response.split(":")
126
- axis = name[-1]
127
- name = name[:-1]
128
- return name, int(axis), value
129
-
130
-
131
- def decode_get_error(response: bytes) -> Tuple[str]:
132
- """Decodes the response from the get error command and strips off the newline."""
133
-
134
- response = decode_response(response)
135
-
136
- # The response string looks like '<axis>:<errno> <errmsg>' where <axis> is the axis number,
137
- # <errno> is the error number and <errmsg> is the error message.
138
-
139
- response = response[2:]
140
-
141
- error = response.split(maxsplit=1)
142
-
143
- if len(error) == 1 and error[0] == '0':
144
- error.append("no error")
145
-
146
- return tuple(error)
147
-
148
-
149
- def decode_axis_float(response: bytes) -> float:
150
- """Decodes the response of type `<axis>:<float>;` and strips off the newline."""
151
-
152
- response = decode_response(response)
153
-
154
- return float(response[2:-1])
155
-
156
-
157
- def decode_axis_int(response: bytes) -> int:
158
- """Decodes the response of type `<axis>:<int>;` and strips off the newline."""
159
-
160
- response = decode_response(response)
161
-
162
- return int(response[2:-1])
163
-
164
-
165
- def decode_get_configuration(response: bytes) -> dict | Failure:
166
- """Decodes the response from the controller on the request for the configuration parameters.
167
-
168
- Returns:
169
- A dictionary with parameter names and their values.
170
- """
171
- all_conf = decode_response(response).split("\r\n")
172
-
173
- # Every item in the all_conf list has the format '<var><axis>:<value>' where <var> is the
174
- # name of the configuration variable, <axis> is the axis number and <value> is the current
175
- # value for the configuration variable. A comment line starts with a '#' character.
176
-
177
- all_conf = [item.split(":") for item in all_conf if not item.startswith("#")]
178
-
179
- # Turn this list of lists into a dictionary and remove the <axis> from the variable names
180
-
181
- return {key[:-1]: value for key, value in all_conf}
182
-
183
-
184
- def process_cmd_string(command: str) -> str:
185
- """Prepares the command string for sending to the controller.
186
- A carriage return and newline is appended to the command."""
187
-
188
- # MODULE_LOGGER.debug(f"process_command() = {command}")
189
-
190
- return add_cr_lf(command)
191
-
192
-
193
- class HuberSMC9300Interface(DeviceInterface):
194
- """
195
- Interface definition for the Controller, Simulator and Proxy classes for this device.
196
- """
197
-
198
- @dynamic_command(
199
- cmd_type="query", cmd_string="?",
200
- process_cmd_string=process_cmd_string,
201
- process_response=decode_info)
202
- def info(self) -> str:
203
- """
204
- Retrieve basic information about the Huber Stages and the Controller.
205
- The returned string contains multiple lines seperated by a newline (`\n`).
206
- """
207
- raise NotImplementedError
208
-
209
- @dynamic_command(
210
- cmd_type="query", cmd_string="?conf${axis}",
211
- process_cmd_string=process_cmd_string,
212
- process_response=decode_get_configuration)
213
- def get_configuration(self, axis) -> dict | Failure:
214
- """
215
- Returns the configuration parameters for the given axis.
216
-
217
- Returns:
218
- A dictionary with configuration parameter names and their values.
219
- """
220
- raise NotImplementedError
221
-
222
- def get_conf_value(self, axis, name):
223
- """
224
- Returns the value of the requested configuration parameter.
225
-
226
- Returns:
227
- A string containing the value of the requested parameter. The returned object is
228
- always a string and needs to be converted to int or float by the caller if needed.
229
- """
230
- conf = self.get_configuration(axis)
231
- return conf[name] if name in conf else None
232
-
233
- @dynamic_command(
234
- cmd_type="query", cmd_string="?v",
235
- process_cmd_string=process_cmd_string,
236
- process_response=decode_response)
237
- def get_version(self):
238
- """
239
- Returns the version information about the current control program on the HUBER controller.
240
- """
241
- raise NotImplementedError
242
-
243
- def goto(self, axis: int, position: float, wait: bool = True) -> int:
244
- """
245
- Moves the stage to the given absolute position. For the big rotation stage, the movement is done
246
- relative to the current position and the avoidance range and hard stop from the Setup are taken
247
- into account.
248
-
249
- A positive angle moves the rotation stage counter clockwise.
250
-
251
- Args:
252
- axis (int): the integer identifier of one of the axis controlled by the SMC
253
- position (float): when the given axis is a rotation stage, the position is given
254
- in degrees [deg], for a translation stage, the position is given
255
- in millimeter [mm].
256
- wait (bool): Only return when the device is in position [default=True]
257
-
258
- Returns:
259
- Zero (0) is returned unless a limit switch was hit, in which case +1 is returned when the LIMIT+ switch
260
- was hit, and -1 is returned when the LIMIT- switch was hit.
261
- """
262
-
263
- # For the big rotation stage use the workaround to avoid continuous movement in the same
264
- # direction, and to avoid the limit switch.
265
-
266
- if axis == HC_SETTINGS.BIG_ROTATION_STAGE:
267
- current = self.get_current_position(axis)
268
- movement = calculate_relative_movement(current, position)
269
- self.move_direct(axis, movement)
270
- else:
271
- self.goto_direct(axis, position)
272
-
273
- if wait:
274
- return self.wait_until_axis_ready(axis)
275
-
276
- return 0
277
-
278
- @dynamic_command(
279
- cmd_type="write", cmd_string="goto${axis}:${position}",
280
- process_cmd_string=process_cmd_string)
281
- def goto_direct(self, axis: int, position: float) -> None:
282
- """
283
- Moves the stage to the given absolute position. No position checking nor conversion is done.
284
-
285
- A positive angle moves the rotation stage counter clockwise.
286
-
287
- Args:
288
- axis (int): the integer identifier of one of the axis controlled by the SMC
289
- position (float): when the given axis is a rotation stage, the position is given
290
- in degrees [deg], for a translation stage, the position is given
291
- in millimeter [mm].
292
- """
293
- raise NotImplementedError
294
-
295
- def move(self, axis: int, distance: float, wait: bool = True) -> int:
296
- """
297
- Moves the stage relative to the current position in the given distance.
298
-
299
- A positive angle moves the rotation stage counterclockwise.
300
-
301
- Args:
302
- axis: the integer identifier of one of the axis controlled by the SMC
303
- distance: when the given axis is a rotation stage, the distance is given
304
- in degrees [deg], for a translation stage, the distance is given
305
- in millimeter [mm].
306
- wait (bool): Only return when the device is in position [default=True]
307
-
308
- Returns:
309
- Zero (0) is returned unless a limit switch was hit, in which case +1 is returned when the LIMIT+ switch
310
- was hit, and -1 is returned when the LIMIT- switch was hit.
311
- """
312
- self.move_direct(axis, distance)
313
- if wait:
314
- return self.wait_until_axis_ready(axis)
315
- return 0
316
-
317
- @dynamic_command(
318
- cmd_type="write", cmd_string="move${axis}:${distance}",
319
- process_cmd_string=process_cmd_string,
320
- )
321
- def move_direct(self, axis: int, distance: float) -> None:
322
- """
323
- Moves the stage relative to the current position in the given distance.
324
-
325
- A positive angle moves the rotation stage counterclockwise.
326
-
327
- Args:
328
- axis: the integer identifier of one of the axis controlled by the SMC
329
- distance: when the given axis is a rotation stage, the distance is given
330
- in degrees [deg], for a translation stage, the distance is given
331
- in millimeter [mm].
332
- """
333
- raise NotImplementedError
334
-
335
- @dynamic_command(
336
- cmd_type="write", cmd_string="home${axis}:he;hm${pos}",
337
- process_cmd_string=process_cmd_string,
338
- )
339
- def home_forward_direction(self, axis: int, pos: float = 0):
340
- """
341
- Execute a home position search procedure for the given axis. This function will search in
342
- forward direction for the encoder ECZ (index) signal and set the position to `pos`.
343
-
344
- Args:
345
- axis: the integer identifier of one of the axis controlled by the SMC, this
346
- should be '3' for the translation stage (the other axes have an absolute encoder).
347
- pos: after the home is found, set the position to `pos`.
348
-
349
- """
350
- raise NotImplementedError
351
-
352
- @dynamic_command(
353
- cmd_type="write", cmd_string="home${axis}:he;hr${pos}",
354
- process_cmd_string=process_cmd_string,
355
- )
356
- def home_reverse_direction(self, axis: int, pos: float = 0):
357
- """
358
- Execute a home position search procedure for the given axis. This function will search in
359
- reverse direction for the encoder ECZ (index) signal and set the position to `pos`.
360
-
361
- Args:
362
- axis: the integer identifier of one of the axis controlled by the SMC, this
363
- should be '3' for the translation stage (the other axes have an absolute encoder).
364
- pos: after the home is found, set the position to `pos`.
365
-
366
- """
367
- raise NotImplementedError
368
-
369
- @dynamic_command(
370
- cmd_type="write", cmd_string="ffast${axis}:${speed}",
371
- process_cmd_string=process_cmd_string)
372
- def set_slew_speed(self, axis, speed):
373
- """
374
- Configures the maximum slew speed used for the execution of manual
375
- positioning commands. The maximum speed depends on the motor type,
376
- driver type and positioning hardware properties.
377
-
378
- For axis=1 (big rotation stage) the slew speed is given in 1e-4 deg/s, i.e. a slew_speed of
379
- 15_000 results in an actual speed of 1.5deg/s.
380
-
381
- Manual positioning commands are i.e. ``fast``, ``move``, ``goto``, or
382
- the use of the direction keys.
383
- """
384
- raise NotImplementedError
385
-
386
- def get_slew_speed(self, axis) -> int:
387
- """
388
- Returns the maximum slew speed used for the execution of manual
389
- positioning commands. The maximum speed depends on the motor type,
390
- driver type and positioning hardware properties.
391
- """
392
- return int(self.get_parameter(axis, "ffast")[-1])
393
-
394
- @dynamic_command(
395
- cmd_type="write", cmd_string="edev${axis}:${value}",
396
- process_cmd_string=process_cmd_string)
397
- def set_edev(self, axis, value):
398
- """
399
- Configure the maximum allowed deviation between actual position
400
- and commanded target position for closed-loop positioning. this
401
- value must not be less than the resolution of the used encoder.
402
-
403
- This command cannot be executed during positioning or program execution.
404
- """
405
- raise NotImplementedError
406
-
407
- def get_edev(self, axis) -> float:
408
- """
409
- Returns the maximum allowed deviation between actual position
410
- and commanded target position for closed-loop positioning.
411
- """
412
- return float(self.get_parameter(axis, "edev")[-1])
413
-
414
- @dynamic_command(
415
- cmd_type="write", cmd_string="edir${axis}:${value}",
416
- process_cmd_string=process_cmd_string)
417
- def set_edir(self, axis, value):
418
- """
419
- Configure the encoder rotation sense. For the case the controller returns the encoder
420
- position information with the wrong sign, use this command to change it correspondingly.
421
-
422
- This command cannot be executed during positioning or program execution.
423
- """
424
- raise NotImplementedError
425
-
426
- def get_edir(self, axis) -> int:
427
- """
428
- Returns the encoder rotation sense: 0 is normal, 1 is inverted.
429
- """
430
- return int(self.get_parameter(axis, "edir")[-1])
431
-
432
- def is_in_position(self, axis) -> bool:
433
- """
434
- Returns True if the mechanism is in position and not moving.
435
- """
436
-
437
- # The sleep of 0.5s here is empirically determined because tests failed randomly
438
- # because the position was apparently not completely reached. We also noticed an
439
- # oscilation when arriving at a certain position. A diagnostic test revealed that
440
- # the status sometimes changes bit 0 and bit 7 indicating the axis/controller
441
- # ready before the mechanism actually reached the setpoint. We need about
442
- # 0.2s before the actual value is reached, 0.5 seconds is a safe wait time.
443
-
444
- time.sleep(0.5)
445
-
446
- state = self.get_state(axis)
447
-
448
- return state & 0b10000001 == 0b10000001
449
-
450
- @dynamic_command(
451
- cmd_type="query", cmd_string="?p${axis}",
452
- process_cmd_string=process_cmd_string,
453
- process_response=decode_axis_float)
454
- def get_current_position(self, axis) -> float:
455
- """
456
- Returns the current position for this axis as a float. The position is
457
- given in degrees for rotation stages and in mm for translation stages.
458
- """
459
- raise NotImplementedError
460
-
461
- @dynamic_command(
462
- cmd_type="query", cmd_string="?e${axis}",
463
- process_cmd_string=process_cmd_string,
464
- process_response=decode_axis_float)
465
- def get_current_encoder_position(self, axis) -> float:
466
- """
467
- Returns the current encoder position for this axis as a float. The position
468
- is given in degrees for rotation stages and in mm for translation stages.
469
- """
470
- raise NotImplementedError
471
-
472
- @dynamic_command(
473
- cmd_type="query", cmd_string="?ec${axis}",
474
- process_cmd_string=process_cmd_string,
475
- process_response=decode_axis_int)
476
- def get_current_encoder_counter_value(self, axis) -> int:
477
- """
478
- Returns the current encoder counter value for this axis as an int.
479
- """
480
- raise NotImplementedError
481
-
482
- @dynamic_command(
483
- cmd_type="query", cmd_string="?err${axis}",
484
- process_cmd_string=process_cmd_string,
485
- process_response=decode_get_error)
486
- def get_error(self, axis) -> Tuple[str]:
487
- """
488
- Returns the last occurred error and corresponding error message for the given axis.
489
- """
490
- raise NotImplementedError
491
-
492
- @dynamic_command(
493
- cmd_type="query", cmd_string="?${name}${axis}",
494
- process_cmd_string=process_cmd_string,
495
- process_response=decode_get_parameter)
496
- def get_parameter(self, axis, name) -> Tuple[str, int, str]:
497
- """
498
- Queries the device for the current value of the given parameter and the given axis.
499
-
500
- Returns:
501
- A tuple containing the parameter name (str), axis (int), and the value (str).
502
- """
503
- raise NotImplementedError
504
-
505
- @dynamic_command(
506
- cmd_type="write", cmd_string="cerr${axis}",
507
- process_cmd_string=process_cmd_string)
508
- def clear_error(self, axis):
509
- """
510
- Reset the last occurred error and clear the error message.
511
- """
512
- raise NotImplementedError
513
-
514
- @dynamic_command(
515
- cmd_type="write", cmd_string="quit",
516
- process_cmd_string=process_cmd_string)
517
- def quit(self) -> None:
518
- """
519
- Immediately stop any positioning process.
520
-
521
- The controller decelerates with the configured deceleration ramp.
522
- In contrast to an emergency stop caused by limit switch events,
523
- the position information remains valid in this case.
524
- """
525
- raise NotImplementedError
526
-
527
- @dynamic_command(cmd_type="write", cmd_string="update", process_cmd_string=process_cmd_string)
528
- def save_configuration(self):
529
- """Saves the current configuration permanently. The settings will be reloaded automatically
530
- the next time the controller starts."""
531
- raise NotImplementedError
532
-
533
- @dynamic_command(cmd_type="write", cmd_string="reset", process_cmd_string=process_cmd_string)
534
- def reset(self):
535
- """Resets the controller back to power-on state. When you previously saved the configuration,
536
- those values will be reloaded automatically, otherwise the default configuration will be loaded."""
537
- raise NotImplementedError
538
-
539
- @dynamic_command(
540
- cmd_type="query", cmd_string="?s${axis}",
541
- process_cmd_string=process_cmd_string,
542
- process_response=decode_get_state)
543
- def get_state(self, axis) -> int:
544
- """Query of the current operating state of the controller."""
545
- raise NotImplementedError
546
-
547
- @dynamic_command(
548
- cmd_type="query", cmd_string="?status${axis}",
549
- process_cmd_string=process_cmd_string,
550
- process_response=decode_response)
551
- def get_status(self, axis) -> str:
552
- """
553
- Returns the status of the given axis. The status contains the following information:
554
-
555
- * axis: the axis number
556
- * err_no: the error number
557
- * err_msg: the error message if there is an error
558
- * pos: the current position
559
- * epos: the encoder position
560
- * elimit: end/limit status
561
- * ref: reference status
562
- * eref: encoder reference status
563
- * ctrl: is controller ready?
564
- * osc: status oscillation
565
- * pro: is program running?
566
-
567
- The status response can be untangled as follows:
568
-
569
- >>> dev = HuberSMC9300Proxy()
570
- >>> untangle_status(dev.get_status(axis=1))
571
-
572
- """
573
- raise NotImplementedError
574
-
575
- @dynamic_command(
576
- cmd_type="write", cmd_string="zero${axis}",
577
- process_cmd_string=process_cmd_string)
578
- def zero(self, axis) -> None:
579
- """
580
- Set the current position of the axis to zero (0.00). If a reference position
581
- offset value is configured (see the configuration command `rofs`) the current
582
- position is set to that reference offset value.
583
-
584
- If you want to retain this zero position, you will have to also call the
585
- 'save_configuration()' command. Otherwise the zero position will be lost
586
- after a reset or a power cycle.
587
- """
588
- raise NotImplementedError
589
-
590
- def wait_until_axis_ready(self, axis: int) -> int:
591
- """
592
- Send the given axis a state query and wait for the response.
593
-
594
- This function will return only when one of the following states has been reached:
595
-
596
- * The LIMIT- switch was activated
597
- * The LIMIT+ switch was activated
598
- * The end position was reached, axis ready (bit 0) & controller ready (bit 7)
599
-
600
- Returns:
601
-
602
- * 0: on success, i.e. position is reached
603
- * +1: when LIMIT+ switch is reached
604
- * -1: when LIMIT- switch is reached
605
- """
606
-
607
- # MODULE_LOGGER.debug(f"Wait until axis {axis} is ready...")
608
-
609
- while True:
610
-
611
- time.sleep(0.5)
612
-
613
- state = self.get_state(axis)
614
-
615
- # MODULE_LOGGER.debug(f"state for axis {axis}: {beautify_binary(state)} ({state})")
616
-
617
- if state & 4 == 4:
618
- MODULE_LOGGER.warning("LIMIT- active!")
619
- rv = -1
620
- break
621
-
622
- if state & 8 == 8:
623
- MODULE_LOGGER.warning("LIMIT+ active!")
624
- rv = +1
625
- break
626
-
627
- if state & 512 == 512:
628
- MODULE_LOGGER.error("oscillation positioning error (encoder)")
629
-
630
- if state & 129 == 129:
631
- # exit loop when position is reached,
632
- # state bit 0 and bit 7 indicate 'axis ready' AND 'controller ready',
633
- # i.e. all axes stopped
634
- rv = 0
635
- break
636
-
637
- if state & 16384: # 0b100_0000_0000_0000
638
- response = self.get_error(axis)
639
- MODULE_LOGGER.error(f"ERROR on axis {axis}: {response}")
640
- self.clear_error(axis)
641
-
642
- # The sleep of 0.5s here is empirically determined because tests failed randomly
643
- # because the position was apparently not completely reached. We also noticed an
644
- # oscillation when arriving at a certain position. A diagnostic test revealed that
645
- # the state sometimes changes bit 0 and bit 7 indicating the axis/controller
646
- # ready before the mechanism actually reached the setpoint. We need about
647
- # 0.2s before the actual value is reached, 0.5 seconds is a safe wait time.
648
-
649
- time.sleep(0.5)
650
-
651
- return rv
652
-
653
-
654
- class HuberSMC9300Controller(HuberSMC9300Interface, DynamicCommandMixin):
655
- """
656
- The HuberSmC9300Controller class is used to directly communicate with the HUBER SMC9300
657
- Controller through an Ethernet interface.
658
- """
659
-
660
- def __init__(self, hostname=HC_SETTINGS.HOSTNAME, port=HC_SETTINGS.PORT):
661
- """
662
- Opens a TCP/IP socket connection with the HUBER SMC9300 Hardware Controller.
663
-
664
- Args:
665
- hostname (str): the IP address or fully qualified hostname of the HUBER hardware
666
- controller. The default is defined in the ``settings.yaml`` configuration file.
667
-
668
- port (int): the IP port number to connect to, by default set in the `settings.yaml`
669
- configuration file.
670
-
671
- """
672
- super().__init__()
673
-
674
- MODULE_LOGGER.info(
675
- f"Initializing Huber SMC9300 Controller with hostname={hostname} on port={port}")
676
-
677
- self.transport = self.huber = HuberSMC9300EthernetInterface(hostname, port)
678
-
679
- self._number_of_axes = HC_SETTINGS.NUMBER_OF_AXES
680
-
681
- def connect(self):
682
- try:
683
- self.huber.connect()
684
-
685
- # set the speed of each of the stages to the default speed from the Settings.
686
-
687
- for stage in 1, 2, 3:
688
- default_speed = HC_SETTINGS.DEFAULT_SPEED[stage - 1]
689
- self.set_slew_speed(stage, default_speed)
690
-
691
- except HuberError as exc:
692
- MODULE_LOGGER.warning(f"HuberError caught: Couldn't establish connection ({exc})")
693
- raise ConnectionError("Couldn't establish a connection with the HUBER Stage.") from exc
694
-
695
- self.notify_observers(DeviceConnectionState.DEVICE_CONNECTED)
696
-
697
- def disconnect(self):
698
- try:
699
- # Clear the error for each of the axis before disconnecting
700
- for axis in range(1, self._number_of_axes + 1):
701
- self.clear_error(axis)
702
- self.huber.disconnect()
703
- except DeviceConnectionError as exc:
704
- raise ConnectionError("Couldn't disconnect from HUBER Controller.") from exc
705
-
706
- self.notify_observers(DeviceConnectionState.DEVICE_NOT_CONNECTED)
707
-
708
- def reconnect(self):
709
- if self.is_connected():
710
- self.disconnect()
711
- self.connect()
712
-
713
- def is_connected(self):
714
- """Check if the HUBER Stages Controller is connected. """
715
- return self.huber.is_connected()
716
-
717
- def is_simulator(self):
718
- return "simulator: true" in self.info()
719
-
720
-
721
- class HuberSMC9300Simulator(HuberSMC9300Interface):
722
- """
723
- The class simulates the HUBER Stages.
724
- """
725
-
726
- def __init__(self):
727
- super().__init__()
728
- MODULE_LOGGER.critical(
729
- textwrap.dedent(
730
- """\
731
- The HuberSMC9300Simulator class is deprecated in favor of the smc9300_sim process.
732
- Start the SMC9300 simulator in a separate terminal with the command:
733
-
734
- smc9300_sim start
735
-
736
- then restart the SCM9300 Control Server:
737
-
738
- smc9300_cs start
739
-
740
- Make sure the local_settings.yaml file contains the correct HOSTNAME
741
- and PORT for accessing the simulator process.
742
- """
743
- )
744
- )
745
-
746
-
747
- REQUEST_TIMEOUT = 10_000 # 10 seconds
748
-
749
-
750
- class HuberSMC9300Proxy(DynamicProxy, HuberSMC9300Interface):
751
- """
752
- The HuberProxy class is used to connect to the Huber SMC9300 control server and send commands
753
- to the HUBER Hardware Controller remotely.
754
- """
755
-
756
- def __init__(
757
- self,
758
- protocol=CTRL_SETTINGS.PROTOCOL,
759
- hostname=CTRL_SETTINGS.HOSTNAME,
760
- port=CTRL_SETTINGS.COMMANDING_PORT,
761
- timeout=REQUEST_TIMEOUT
762
- ):
763
- """
764
- Args:
765
- protocol: the transport protocol
766
- [default is taken from settings file]
767
- hostname: location of the control server (IP address)
768
- [default is taken from settings file]
769
- port: TCP port on which the control server is listening for commands
770
- [default is taken from settings file]
771
- timeout: time out on the response from the control server [milliseconds]
772
- """
773
- super().__init__(connect_address(protocol, hostname, port), timeout=timeout)
774
-
775
-
776
- def calculate_relative_movement(current, setpoint, hardstop=None, avoidance=None):
777
- """
778
- This function calculates the relative movement from the current position to the given setpoint.
779
- It defines the direction and the size of the movement based on the current position,
780
- the setpoint, the hardstop position and the avoidance angle.
781
-
782
- The function strives to always return the smallest possible angle in order to minimize the
783
- duration of the movement.
784
-
785
- The target position (setpoint) can not fall in the range [hardstop - avoidance,
786
- hardstop + avoidance]. There is no check on the current position, it is assumed not to be in
787
- the avoidance range.
788
-
789
- If hardstop or avoidance are not given, they are loaded from the setup.
790
-
791
- Args:
792
- current (float): the current position of the rotation stage
793
- setpoint (float): the target position of the rotation stage
794
- hardstop (float): the location of the hardstop
795
- avoidance (float): angle of avoidance
796
- Returns:
797
- The angle to move relative from current position to setpoint.
798
- Raises:
799
- A ValueError when the setpoint falls inside the avoidance range, i.e.
800
- [-180 + avoidance, +180 - avoidance].
801
- """
802
-
803
- setup = GlobalState.setup
804
-
805
- avoidance = avoidance if avoidance is not None else setup.gse.stages.big_rotation_stage.avoidance
806
- hardstop = hardstop if hardstop is not None else setup.gse.stages.big_rotation_stage.hardstop
807
-
808
- # MODULE_LOGGER.debug(f"@entry: {current=}, {setpoint=}, {hardstop=}, {avoidance=}")
809
-
810
- # Bring the current and the setpoint between 0 and 360 (non-inclusive)
811
-
812
- current %= 360
813
- setpoint %= 360
814
-
815
- # MODULE_LOGGER.debug(f"After % 360: {current=}, {setpoint=}")
816
-
817
- # Check if the setpoint falls in the avoidance range
818
-
819
- if hardstop - avoidance < setpoint < hardstop + avoidance:
820
- raise ValueError(
821
- f"setpoint argument shall NOT be between {hardstop - avoidance} and "
822
- f"{hardstop + avoidance}, given value {setpoint = }")
823
-
824
- # Find the smallest angle between the current and the setpoint
825
-
826
- movement = min(abs(current - setpoint), abs(360 + current - setpoint))
827
- direction = +1 if current + movement == setpoint else -1
828
-
829
- target = current + direction * movement
830
-
831
- # MODULE_LOGGER.debug(
832
- # f"Smallest movement: {current=}, {setpoint=}, {target=:.2f}, "
833
- # f"{movement=:.2f}, {direction=}"
834
- # )
835
-
836
- # Check if we will pass over 180º and invert direction if true.
837
-
838
- if (current < target and current < hardstop < target) or \
839
- (current > target and target < hardstop < current):
840
- movement = 360 - movement
841
- direction *= -1
842
-
843
- # target = current + direction * movement
844
- # MODULE_LOGGER.debug(
845
- # f"corrected: {current=}, {setpoint=}, {target=:.2f}, {movement=:.2f}, {direction=}"
846
- # )
847
-
848
- return direction * movement
849
-
850
-
851
- if __name__ == "__main__":
852
- from rich import print
853
-
854
- huber = HuberSMC9300Controller()
855
-
856
- # The .connect() method takes 1.5s because it also configures the slew speed of all the axes
857
-
858
- huber.connect()
859
-
860
- print(f"{huber.info()=}")
861
- print(f"{huber.get_version()=}")
862
- print(f"{huber.get_error(axis=1)=}")
863
- print(f"{huber.get_error(axis=2)=}")
864
- print(f"{huber.get_error(axis=3)=}")
865
- print(f"{huber.get_state(axis=1)=}")
866
- print(f"{huber.get_state(axis=2)=}")
867
- print(f"{huber.get_state(axis=3)=}")
868
- print(f"{huber.get_status(axis=1)=}")
869
- print(f"{huber.get_status(axis=2)=}")
870
- print(f"{huber.get_status(axis=3)=}")
871
- print(f"{huber.get_configuration(axis=1)=}")
872
- print(f"{huber.get_configuration(axis=2)=}")
873
- print(f"{huber.get_configuration(axis=3)=}")
874
- print(f"{huber.get_conf_value(axis=1, name='gnum')=}")
875
- print(f"{huber.get_slew_speed(axis=1)=}")
876
- print(f"{huber.get_slew_speed(axis=2)=}")
877
- print(f"{huber.get_slew_speed(axis=3)=}")
878
- print(f"{huber.is_in_position(axis=1)=}")
879
- print(f"{huber.is_in_position(axis=2)=}")
880
- print(f"{huber.is_in_position(axis=3)=}")
881
- print(f"{huber.get_current_position(axis=1)=}")
882
- print(f"{huber.get_current_position(axis=2)=}")
883
- print(f"{huber.get_current_position(axis=3)=}")
884
- print(f"{huber.get_current_encoder_position(axis=1)=}")
885
- print(f"{huber.get_current_encoder_position(axis=2)=}")
886
- print(f"{huber.get_current_encoder_position(axis=3)=}")
887
- print(f"{huber.get_current_encoder_counter_value(axis=1)=}")
888
- print(f"{huber.get_current_encoder_counter_value(axis=2)=}")
889
- print(f"{huber.get_current_encoder_counter_value(axis=3)=}")
890
-
891
- for axis_ in range(1, 4):
892
- print(f"{huber.get_parameter(axis=axis_, name='ffast')=}")
893
- print(f"{huber.get_parameter(axis=axis_, name='frun')=}")
894
- print(f"{huber.get_parameter(axis=axis_, name='rofs')=}")
895
- print(f"{huber.get_parameter(axis=axis_, name='erofs')=}")
896
-
897
- print(f"{huber.get_parameter(axis=axis_, name='ecl')=}")
898
- print(f"{huber.get_parameter(axis=axis_, name='edev')=}")
899
- print(f"{huber.get_parameter(axis=axis_, name='edir')=}")
900
- print(f"{huber.get_parameter(axis=axis_, name='eres')=}")
901
-
902
- huber.clear_error(axis=axis_)
903
-
904
- huber.disconnect()