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
@@ -1,872 +0,0 @@
1
- """
2
- This module defines the device classes to be used to connect to and control the Hexapod ZONDA from
3
- Symétrie.
4
-
5
- """
6
- import logging
7
- import math
8
- import time
9
- from typing import Dict
10
-
11
- from egse.device import DeviceInterface
12
- from egse.hexapod import HexapodError
13
- from egse.hexapod.symetrie.alpha import AlphaPlusControllerInterface
14
- from egse.hexapod.symetrie.zonda_devif import RETURN_CODES
15
- from egse.hexapod.symetrie.zonda_devif import ZondaError
16
- from egse.hexapod.symetrie.zonda_devif import ZondaTelnetInterface
17
- from egse.hexapod.symetrie.zonda_devif import decode_command
18
- from egse.proxy import Proxy
19
- from egse.settings import Settings
20
- from egse.system import Timer
21
- from egse.system import wait_until
22
- from egse.zmq_ser import connect_address
23
- from numpy import loadtxt
24
- from time import sleep
25
-
26
- logger = logging.getLogger(__name__)
27
-
28
- ZONDA_SETTINGS = Settings.load("ZONDA Controller")
29
- CTRL_SETTINGS = Settings.load("Hexapod ZONDA Control Server")
30
- DEVICE_SETTINGS = Settings.load(filename="zonda.yaml")
31
-
32
- HOME_COMPLETE = 6
33
- IN_POSITION = 3
34
- IN_MOTION = 4
35
-
36
- GENERAL_STATE = [
37
- "Error",
38
- "System initialized",
39
- "Control on",
40
- "In position",
41
- "Motion task running",
42
- "Home task running",
43
- "Home complete",
44
- "Home virtual",
45
- "Phase found",
46
- "Brake on",
47
- "Motion restricted",
48
- "Power on encoders",
49
- "Power on limit switches",
50
- "Power on drives",
51
- "Emergency stop",
52
- ]
53
-
54
- ACTUATOR_STATE = [
55
- "Error",
56
- "Control on",
57
- "In position",
58
- "Motion task running",
59
- "Home task running",
60
- "Home complete",
61
- "Phase found",
62
- "Brake on",
63
- "Home hardware input",
64
- "Negative hardware limit switch",
65
- "Positive hardware limit switch",
66
- "Software limit reached",
67
- "Following error",
68
- "Drive fault",
69
- "Encoder error",
70
- ]
71
-
72
- VALIDATION_LIMITS = [
73
- "Factory workspace limits",
74
- "Machine workspace limits",
75
- "User workspace limits",
76
- "Actuator limits",
77
- "Joints limits",
78
- "Due to backlash compensation",
79
- ]
80
-
81
-
82
- class ZondaInterface(AlphaPlusControllerInterface, DeviceInterface):
83
- """
84
- Interface definition for the ZondaController, the ZondaProxy and the ZondaSimulator.
85
- """
86
-
87
-
88
- class ZondaController(ZondaInterface):
89
- def __init__(self):
90
-
91
- super().__init__()
92
-
93
- logger.info(f"Initializing ZondaController with hostname={ZONDA_SETTINGS.IP} on port={ZONDA_SETTINGS.PORT}")
94
-
95
- self.v_pos = None
96
-
97
- self.cm = ["absolute", "object relative", "user relative"]
98
-
99
- self.speed = {"vt": 0,
100
- "vr": 0,
101
- "vtmin": 0,
102
- "vrmin": 0,
103
- "vtmax": 0,
104
- "vrmax": 0}
105
-
106
- try:
107
- self.hexapod = ZondaTelnetInterface()
108
-
109
- except ZondaError as exc:
110
- logger.warning(
111
- f"HexapodError: Couldn't establish connection with the Hexapod ZONDA Hardware "
112
- f"Controller: ({exc})"
113
- )
114
-
115
- def is_simulator(self):
116
- return False
117
-
118
- def is_connected(self):
119
- return self.hexapod.is_connected()
120
-
121
- def connect(self):
122
- try:
123
- self.hexapod.connect(ZONDA_SETTINGS.IP)
124
- except ZondaError as exc:
125
- logger.warning(f"ZondaError caught: Couldn't establish connection ({exc})")
126
- raise HexapodError("Couldn't establish a connection with the Hexapod.") from exc
127
-
128
- def disconnect(self):
129
- try:
130
- self.hexapod.disconnect()
131
- except ZondaError as exc:
132
- raise HexapodError("Couldn't disconnect from Hexapod.") from exc
133
-
134
- def reconnect(self):
135
- if self.is_connected():
136
- self.disconnect()
137
- self.connect()
138
-
139
- def info(self):
140
- try:
141
- _version = self.hexapod.trans("VERS")
142
- msg = "Info about the Hexapod ZONDA:\n"
143
- msg += f"version = {_version}\n"
144
- except ZondaError as exc:
145
- raise HexapodError(
146
- "Couldn't retrieve information from Hexapod ZONDA Hardware Controller."
147
- ) from exc
148
-
149
- return msg
150
-
151
- def get_general_state(self):
152
- """
153
- Asks the general state of the hexapod on all the motors following the bits definition
154
- presented below.
155
-
156
- GENERAL_STATE =
157
- 0: "Error",
158
- 1: "System initialized",
159
- 2: "Control on",
160
- 3: "In position",
161
- 4: "Motion task running",
162
- 5: "Home task running",
163
- 6: "Home complete",
164
- 7: "Home virtual",
165
- 8: "Phase found",
166
- 9: "Brake on",
167
- 10:"Motion restricted",
168
- 11:"Power on encoders",
169
- 12:"Power on limit switches",
170
- 13:"Power on drives",
171
- 14:"Emergency stop"
172
-
173
- Returns:
174
- A dictionary with the bits value of each parameter.
175
- """
176
- try:
177
- rc = self.hexapod.trans("s_hexa")
178
- rc = int(rc[0])
179
-
180
- # from int to bit list of 15 elements corresponding to the hexapod state bits
181
- # the bit list must be reversed to get lsb
182
-
183
- s_hexa = [int(x) for x in f'{rc:015b}'[::-1]]
184
- state = {k: v for k, v in zip(GENERAL_STATE, s_hexa)}
185
- except ZondaError as exc:
186
- raise HexapodError("Couldn't retrieve the state from Hexapod.") from exc
187
-
188
- return [state, list(state.values())]
189
-
190
- def stop(self):
191
- try:
192
- self.hexapod.trans("c_cmd=C_STOP")
193
- sc = self.hexapod.check_command_status()
194
- logger.warning(f"Stop command has been executed: {sc}")
195
- except ZondaError as exc:
196
- raise HexapodError("Couldn't disconnect from Hexapod.") from exc
197
- return sc
198
-
199
- def clear_error(self):
200
- try:
201
- print("Cleaning errors from buffer")
202
- sc = self.hexapod.trans("c_cmd=C_CLEARERROR")
203
- number = self.hexapod.trans('s_err_nr')
204
- number = int(number[0])
205
-
206
- if number == 0:
207
- logger.info("All the errors have been cleared.")
208
- else:
209
- logger.warning("Couldn't clear all errors from Hexapod.")
210
-
211
- except ZondaError as exc:
212
- raise HexapodError("Couldn't clear all the errors from Hexapod.") from exc
213
- return sc
214
-
215
- def reset(self, wait=True):
216
- try:
217
- print("Resetting the Hexapod Controller")
218
- print("STOP and CONTROLOFF commands are sent to the controller before reseting...")
219
- self.stop()
220
- print("Hexapod is stopped")
221
- self.deactivate_control_loop()
222
- print("Hexapod control loop has been deactivated")
223
-
224
- print("Rebooting the controller: will take 2 min to initialize")
225
-
226
- # FIXME: you might want to rethink this, because the reboot will close the Ethernet
227
- # connection and therefore we need to reconnect after a two minutes waiting time.
228
- # During the waiting time, the GUI should have all functions disabled and the
229
- # connection icon should show a disconnected icon. Don't use `time.sleep()` as
230
- # that will block the GUI, run a timer in a QThread signaling a reconnect when
231
- # the sleep time is over.
232
- self.hexapod.trans("system reboot")
233
-
234
- except ZondaError as exc:
235
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
236
- return None
237
-
238
- def jog(self, axis: int, inc: float):
239
- try:
240
- self.hexapod.trans("c_ax={} c_par(0)={} c_cmd=C_JOG")
241
- sc = self.hexapod.check_command_status()
242
-
243
- except ZondaError as exc:
244
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
245
- return sc
246
-
247
- def perform_maintenance(self, axis):
248
- try:
249
- if axis == 10:
250
- self.hexapod.trans("c_par(0)=3 c_cmd=C_MAINTENANCE")
251
- else:
252
- self.hexapod.trans("c_par(0)=2 c_par(1)={} c_cmd=C_MAINTENANCE".format(str(axis)))
253
-
254
- sc = self.hexapod.check_command_status()
255
- except ZondaError as exc:
256
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
257
- return sc
258
-
259
- def set_default(self):
260
- try:
261
- print("Resetting the hexapod to the factory default parameters...:")
262
- self.hexapod.trans("c_cfg=1 c_cmd=C_CFG_DEFAULT")
263
- sc = self.hexapod.check_command_status()
264
-
265
- except ZondaError as exc:
266
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
267
- return sc
268
-
269
- def homing(self):
270
- try:
271
- print("Executing homing command")
272
- self.hexapod.trans("c_cmd=C_HOME")
273
- sc = self.hexapod.check_command_status()
274
-
275
- except ZondaError as exc:
276
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
277
- return sc
278
-
279
- def goto_specific_position(self, pos):
280
- try:
281
- sc = self.hexapod.trans("c_par(0)={} c_cmd=C_MOVE_SPECIFICPOS".format(str(pos)))
282
- print(sc)
283
-
284
- except ZondaError as exc:
285
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
286
-
287
- return sc
288
-
289
- def goto_zero_position(self):
290
- try:
291
- sc = self.hexapod.trans("c_par(0)=1 c_cmd=C_MOVE_SPECIFICPOS")
292
- print(sc)
293
-
294
- except ZondaError as exc:
295
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
296
-
297
- return sc
298
-
299
- def goto_retracted_position(self):
300
- try:
301
- sc = self.hexapod.trans("c_par(0)=2 c_cmd=C_MOVE_SPECIFICPOS")
302
- print(sc)
303
-
304
- except ZondaError as exc:
305
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
306
-
307
- return sc
308
-
309
- def is_homing_done(self):
310
- try:
311
- sc = self.get_general_state()
312
- homing = sc[1][HOME_COMPLETE]
313
-
314
- except ZondaError as exc:
315
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
316
- return homing
317
-
318
- def is_in_position(self):
319
- try:
320
- sc = self.get_general_state()
321
- in_position = sc[1][IN_POSITION]
322
-
323
- except ZondaError as exc:
324
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
325
- return in_position
326
-
327
- def activate_control_loop(self):
328
- try:
329
- self.hexapod.trans("c_cmd=C_CONTROLON")
330
- print("Executing activate_control_loop command")
331
- sc = self.hexapod.check_command_status()
332
- except ZondaError as exc:
333
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
334
- return sc
335
-
336
- def deactivate_control_loop(self):
337
- try:
338
- self.hexapod.trans("c_cmd=C_CONTROLOFF")
339
- print("Executing deactivate_control_loop")
340
- sc = self.hexapod.check_command_status()
341
- except ZondaError as exc:
342
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
343
- return sc
344
-
345
- def machine_limit_enable(self, state: int):
346
- try:
347
- command = decode_command("CFG_LIMITENABLE", 1, state)
348
- print(f"Executing machine_limit_enable command to state {state}. ")
349
- self.hexapod.trans(command)
350
- rc = self.hexapod.check_command_status()
351
- except ZondaError as exc:
352
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
353
-
354
- return rc
355
-
356
- def machine_limit_set(
357
- self, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p):
358
- try:
359
- name = "CFG_LIMIT"
360
- arguments = [1, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p]
361
-
362
- cmd = decode_command(name, *arguments)
363
-
364
- print("Executing machine_limit_set command {}...: ".format(cmd), end="")
365
- self.hexapod.trans(cmd)
366
- self.hexapod.check_command_status()
367
-
368
- except ZondaError as exc:
369
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
370
-
371
- def user_limit_enable(self, state: int):
372
- try:
373
- command = decode_command("CFG_LIMITENABLE", 2, state)
374
- print(f"Executing user_limit_enable command to state {state}...: ")
375
- self.hexapod.trans(command)
376
- self.hexapod.check_command_status()
377
- except ZondaError as exc:
378
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
379
-
380
- return None
381
-
382
- def user_limit_set(
383
- self, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p):
384
- try:
385
- name = "CFG_LIMIT"
386
- arguments = [2, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p]
387
-
388
- cmd = decode_command(name, *arguments)
389
-
390
- print(f"Executing user_limit_set command {cmd}...: ")
391
- self.hexapod.trans(cmd)
392
- rc = self.hexapod.check_command_status()
393
-
394
- except ZondaError as exc:
395
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
396
-
397
- return rc
398
-
399
- def __move(self, cm, tx, ty, tz, rx, ry, rz):
400
- """
401
- Ask the controller to perform the movement defined by the arguments and the command MOVE_PTP.
402
-
403
- For all control modes cm, the rotation centre coincides with the Object
404
- Coordinates System origin and the movements are controlled with translation
405
- components at first (Tx, Ty, tZ) and then the rotation components (Rx, Ry, Rz).
406
-
407
- Control mode cm:
408
- * 0 = absolute control, object coordinate system position and orientation
409
- expressed in the invariant user coordinate system
410
- * 1 = object relative, motion expressed in the Object Coordinate System
411
- * 2 = user relative, motion expressed in the User Coordinate System
412
-
413
- Args:
414
- cm (int): control mode
415
- tx (float): position on the X-axis [mm]
416
- ty (float): position on the Y-axis [mm]
417
- tz (float): position on the Z-axis [mm]
418
- rx (float): rotation around the X-axis [deg]
419
- ry (float): rotation around the Y-axis [deg]
420
- rz (float): rotation around the Z-axis [deg]
421
- """
422
-
423
- name = "MOVE_PTP"
424
- arguments = [cm, tx, ty, tz, rx, ry, rz]
425
-
426
- command = decode_command(name, *arguments)
427
- print(f"Executing move_ptp command in {self.cm[cm]} mode ... {command}")
428
- self.hexapod.trans(command)
429
- return self.hexapod.check_command_status()
430
-
431
- def validate_position(self, vm, cm, tx, ty, tz, rx, ry, rz):
432
- # Currently only the vm=1 mode is developed by Symétrie
433
- """
434
- Ask the controller if the movement defined by the arguments is feasible.
435
-
436
- Returns a tuple where the first element is an integer that represents the
437
- bitfield encoding the errors. The second element is a dictionary with the
438
- bit numbers that were (on) and the corresponding error description as
439
- defined by VALIDATION_LIMITS.
440
-
441
- Args:
442
- tx (float): position on the X-axis [mm]
443
- ty (float): position on the Y-axis [mm]
444
- tz (float): position on the Z-axis [mm]
445
- rx (float): rotation around the X-axis [deg]
446
- ry (float): rotation around the Y-axis [deg]
447
- rz (float): rotation around the Z-axis [deg]
448
-
449
- """
450
- name = "VALID_PTP"
451
- arguments = [vm, cm, tx, ty, tz, rx, ry, rz]
452
-
453
- command = decode_command(name, *arguments)
454
-
455
- #print(f"Executing validate_position command: {command}")
456
-
457
- self.hexapod.trans(command)
458
- rc = self.hexapod.check_command_status()
459
- pc = self.hexapod.get_pars(0)
460
- pc = int(pc[0])
461
-
462
- if pc == 0:
463
- return 0, {}
464
-
465
- if pc > 0:
466
- d = decode_validation_error(pc)
467
- return pc, d
468
-
469
- # When coming here the command returned an error
470
-
471
- msg = f"{RETURN_CODES.get(pc, 'unknown error code')}"
472
- logger.error(f"Validate position: error code={pc} - {msg}")
473
-
474
- return pc, {pc: msg}
475
-
476
-
477
- def move_absolute(self, tx, ty, tz, rx, ry, rz):
478
- try:
479
- rc = self.__move(0, tx, ty, tz, rx, ry, rz)
480
-
481
- except ZondaError as exc:
482
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
483
- return rc
484
-
485
- def move_relative_object(self, tx, ty, tz, rx, ry, rz):
486
- try:
487
- rc = self.__move(1, tx, ty, tz, rx, ry, rz)
488
-
489
- except ZondaError as exc:
490
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
491
- return rc
492
-
493
- def move_relative_user(self, tx, ty, tz, rx, ry, rz):
494
- try:
495
- rc = self.__move(2, tx, ty, tz, rx, ry, rz)
496
-
497
- except ZondaError as exc:
498
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
499
- return rc
500
-
501
- def check_absolute_movement(self, tx, ty, tz, rx, ry, rz):
502
- # Currently only the vm=1 mode is developed by Symétrie
503
- # Parameter cm = 0
504
- return self.validate_position(1, 0, tx, ty, tz, rx, ry, rz)
505
-
506
- def check_relative_object_movement(self, tx, ty, tz, rx, ry, rz):
507
- # Currently only the vm=1 mode is developed by Symétrie
508
- # Parameter cm = 1 for object
509
- return self.validate_position(1, 1, tx, ty, tz, rx, ry, rz)
510
-
511
- def check_relative_user_movement(self, tx, ty, tz, rx, ry, rz):
512
- # Currently only the vm=1 mode is developed by Symétrie
513
- # Parameter cm = 2 for user relative
514
- return self.validate_position(1, 2, tx, ty, tz, rx, ry, rz)
515
-
516
- def get_temperature(self):
517
- #TODO: to be tested with the real Hexapod (the emulator does not implement this and only returns zeros)
518
- try:
519
- temp = self.hexapod.trans("s_ai_1,6,1")
520
- temp = [float(x) for x in temp]
521
-
522
- except ZondaError as exc:
523
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
524
- return temp
525
-
526
- def get_user_positions(self):
527
- try:
528
- uto = self.hexapod.trans("s_uto_tx,6,1")
529
- uto = [float(x) for x in uto]
530
-
531
- except ZondaError as exc:
532
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
533
- return uto
534
-
535
- def get_machine_positions(self):
536
- try:
537
- mtp = self.hexapod.trans("s_mtp_tx,6,1")
538
- mtp = [float(x) for x in mtp]
539
-
540
- except ZondaError as exc:
541
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
542
- return mtp
543
-
544
- def get_actuator_length(self):
545
- try:
546
- pos = self.hexapod.trans("s_pos_ax_1,6,1")
547
- pos = [float(x) for x in pos]
548
-
549
- except ZondaError as exc:
550
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
551
- return pos
552
-
553
- def get_actuator_state(self):
554
-
555
- response = []
556
- try:
557
- actuator_states = self.hexapod.trans("s_ax_1,6,1")
558
- actuator_states = [int(x) for x in actuator_states]
559
-
560
- for idx, state in enumerate(actuator_states):
561
- state_bits = [int(x) for x in f'{state:015b}'[::-1]]
562
- state_dict = {k: v for k, v in zip(ACTUATOR_STATE, state_bits)}
563
- response.append([state_dict, state_bits])
564
-
565
- except ZondaError as exc:
566
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
567
-
568
- return response
569
-
570
- def get_coordinates_systems(self):
571
- try:
572
- command = decode_command("CFG_CS?")
573
- print(f"Executing get_coordinate_system command: {command}")
574
- self.hexapod.trans(command)
575
- sc = self.hexapod.check_command_status()
576
- cs = self.hexapod.get_pars(12)
577
- cs = [float(x) for x in cs]
578
-
579
- except ZondaError as exc:
580
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
581
- return cs
582
-
583
- def configure_coordinates_systems(
584
- self, tx_u, ty_u, tz_u, rx_u, ry_u, rz_u, tx_o, ty_o, tz_o, rx_o, ry_o, rz_o
585
- ):
586
- try:
587
- name = "CFG_CS"
588
- arguments = [tx_u, ty_u, tz_u, rx_u, ry_u, rz_u, tx_o, ty_o, tz_o, rx_o, ry_o, rz_o]
589
- command = decode_command(name, *arguments)
590
- print(f"Executing configure_coordinates_systems: {command}")
591
- self.hexapod.trans(command)
592
- rc = self.hexapod.check_command_status()
593
-
594
- except ZondaError as exc:
595
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
596
- return rc
597
-
598
- def get_limits_value(self, lim):
599
- # Not implemented in Puna
600
- # lim: int | 0 = Factory, 1 = machine cs limits, 2 = user cs limits
601
- try:
602
- cmd = decode_command("CFG_LIMIT?", lim)
603
- print(f"Executing get_limits_value command: {cmd=}")
604
- self.hexapod.trans(cmd)
605
- self.hexapod.check_command_status()
606
-
607
- pc = self.hexapod.get_pars(13)
608
- pc = [float(x) for x in pc[1:]]
609
-
610
- except ZondaError as exc:
611
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
612
- return pc
613
-
614
- def get_limits_state(self):
615
- # not implemented in Puna
616
- try:
617
- command = decode_command("CFG_LIMITENABLE?")
618
- print(f"Executing get_limits_state command: {command=}")
619
- self.hexapod.trans(command)
620
- sc = self.hexapod.check_command_status()
621
-
622
- if sc[0] == 0:
623
- pc = self.hexapod.get_pars(3)
624
- pc = [int(i) for i in pc]
625
- else:
626
- pc = ["nan", "nan", "nan"]
627
-
628
- keys = VALIDATION_LIMITS[:3]
629
- ls = {k: v for k, v in zip(keys, pc)}
630
-
631
- except ZondaError as exc:
632
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
633
-
634
- return ls
635
-
636
- def get_speed(self):
637
- try:
638
- command = decode_command("CFG_SPEED?")
639
- print(f"Executing get_speed command: {command}")
640
- self.hexapod.trans(command)
641
- sc = self.hexapod.check_command_status()
642
- speed = self.hexapod.get_pars(6)
643
- speed = [float(x) for x in speed]
644
- keys = list(self.speed.keys())
645
-
646
- s = {k: v for k, v in zip(keys, speed)}
647
-
648
- except ZondaError as exc:
649
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
650
- return s
651
-
652
- def set_speed(self, vt, vr):
653
- try:
654
- name = "CFG_SPEED"
655
- arguments = [vt, vr]
656
- command = decode_command(name, *arguments)
657
- # The parameters are automatically limited by the controller between the factory
658
- # configured min/max speeds
659
- self.hexapod.trans(command)
660
-
661
- except ZondaError as exc:
662
- raise HexapodError("Couldn't Execute command on Hexapod.") from exc
663
- return
664
-
665
- def sequence(self, file_path: str, time_sleep: float):
666
- file = file_path + ".txt"
667
- SEQUENCE = loadtxt(file)
668
- for step in SEQUENCE:
669
- state = self.check_absolute_movement(step[0], step[1], step[2], step[3], step[4], step[5])
670
- if state[0] != 0:
671
- print('Error: Out of bounds! One pont is out of the workspace!')
672
- return
673
- print("OK! The entire trajectory is reachable in the defined workspace.")
674
- step_number = 0
675
- for step in SEQUENCE:
676
- step_number += 1
677
- print("\nExecuting step number ", step_number, "over ", len(SEQUENCE), ": ", step)
678
- self.move_absolute(step[0], step[1], step[2], step[3], step[4], step[5])
679
- in_pos = self.get_general_state()[1][3]
680
- while not(in_pos):
681
- in_pos = self.get_general_state()[1][3]
682
- print("Step ", step_number, "done.\nWaiting for ", time_sleep, "seconds.")
683
- sleep(time_sleep)
684
- print('Sequence "' + file_path + '" done with success!')
685
-
686
- class ZondaSimulator(ZondaInterface):
687
- """
688
- HexapodSimulator simulates the Symétrie Hexapod ZONDA. The class is heavily based on the
689
- ReferenceFrames in the `egse.coordinates` package.
690
-
691
- The simulator implements the same methods as the HexapodController class which acts on the
692
- real hardware controller in either simulation mode or with a real Hexapod ZONDA connected.
693
-
694
- Therefore, the HexapodSimulator can be used instead of the Hexapod class in test harnesses
695
- and when the hardware is not available.
696
-
697
- This class simulates all the movements and status of the Hexapod.
698
- """
699
- def __init__(self):
700
- # Keep a record if the homing() command has been executed.
701
-
702
- self.homing_done = False
703
- self.control_loop = False
704
- self._virtual_homing = False
705
- self._virtual_homing_position = None
706
-
707
- def is_simulator(self):
708
- return True
709
-
710
- def connect(self):
711
- pass
712
-
713
- def reconnect(self):
714
- pass
715
-
716
- def disconnect(self):
717
- # TODO:
718
- # Should I keep state in this class to check if it has been disconnected?
719
- #
720
- # TODO:
721
- # What happens when I re-connect to this Simulator? Shall it be in Homing position or
722
- # do I have to keep state via a persistency mechanism?
723
- pass
724
-
725
- def is_connected(self):
726
- return True
727
-
728
- def clear_error(self):
729
- return 0
730
-
731
- def homing(self):
732
- self.goto_zero_position()
733
- self.homing_done = True
734
- self._virtual_homing = False
735
- self._virtual_homing_position = None
736
- return 0
737
-
738
- def is_homing_done(self):
739
- return self.homing_done
740
-
741
- def activate_control_loop(self):
742
- self.control_loop = True
743
- return self.control_loop
744
-
745
- def deactivate_control_loop(self):
746
- self.control_loop = False
747
- return self.control_loop
748
-
749
- pass
750
-
751
-
752
- class ZondaProxy(Proxy, ZondaInterface):
753
- """The ZondaProxy class is used to connect to the control server and send commands to the
754
- Hexapod ZONDA remotely."""
755
-
756
- def __init__(
757
- self,
758
- protocol=CTRL_SETTINGS.PROTOCOL,
759
- hostname=CTRL_SETTINGS.HOSTNAME,
760
- port=CTRL_SETTINGS.COMMANDING_PORT,
761
- ):
762
- """
763
- Args:
764
- protocol: the transport protocol [default is taken from settings file]
765
- hostname: location of the control server (IP address) [default is taken from settings
766
- file]
767
- port: TCP port on which the control server is listening for commands [default is
768
- taken from settings file]
769
- """
770
- super().__init__(connect_address(protocol, hostname, port))
771
-
772
-
773
- def decode_validation_error(value) -> Dict:
774
- """
775
- Decode the bitfield variable that is returned by the VALID_PTP command.
776
-
777
- Each bit in this variable represents a particular error in the validation of a movement.
778
- Several errors can be combined into the given variable.
779
-
780
- Returns a dictionary with the bit numbers that were (on) and the corresponding error description.
781
- """
782
-
783
- return {bit: VALIDATION_LIMITS[bit] for bit in range(6) if value >> bit & 0b01}
784
-
785
-
786
- if __name__ == "__main__":
787
-
788
- from rich import print as rp
789
-
790
- zonda = ZondaController()
791
- zonda.connect()
792
-
793
- with Timer("ZondaController"):
794
-
795
- rp(zonda.info())
796
- rp(zonda.is_homing_done())
797
- rp(zonda.is_in_position())
798
- rp(zonda.activate_control_loop())
799
- rp(zonda.get_general_state())
800
- rp(zonda.get_actuator_state())
801
- rp(zonda.deactivate_control_loop())
802
- rp(zonda.get_general_state())
803
- rp(zonda.get_actuator_state())
804
- rp(zonda.stop())
805
- rp(zonda.get_limits_value(0))
806
- rp(zonda.get_limits_value(1))
807
- rp(zonda.check_absolute_movement(1, 1, 1, 1, 1, 1))
808
- rp(zonda.check_absolute_movement(51, 51, 51, 1, 1, 1))
809
- rp(zonda.get_speed())
810
- rp(zonda.set_speed(2.0, 1.0))
811
- time.sleep(0.5) # if we do not sleep, the get_speed() will get the old values
812
- speed = zonda.get_speed()
813
-
814
- if not math.isclose(speed['vt'], 2.0):
815
- rp(f"[red]{speed['vt']} != 2.0[/red]")
816
- if not math.isclose(speed['vr'], 1.0):
817
- rp(f"[red]{speed['vr']} != 1.0[/red]")
818
-
819
- rp(zonda.get_actuator_length())
820
-
821
- # rp(zonda.machine_limit_enable(0))
822
- # rp(zonda.machine_limit_enable(1))
823
- # rp(zonda.get_limits_state())
824
- rp(zonda.get_coordinates_systems())
825
- rp(zonda.configure_coordinates_systems(
826
- 0.033000, -0.238000, 230.205000, 0.003282, 0.005671, 0.013930,
827
- 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000))
828
- rp(zonda.get_coordinates_systems())
829
- rp(zonda.get_machine_positions())
830
- rp(zonda.get_user_positions())
831
- rp(zonda.configure_coordinates_systems(
832
- 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
833
- 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000))
834
- rp(zonda.validate_position(1, 0, 0, 0, 0, 0, 0, 0))
835
- rp(zonda.validate_position(1, 0, 0, 0, 50, 0, 0, 0))
836
-
837
- rp(zonda.goto_zero_position())
838
- rp(zonda.is_in_position())
839
- if wait_until(zonda.is_in_position, interval=1, timeout=300):
840
- rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
841
- rp(zonda.is_in_position())
842
-
843
- rp(zonda.get_machine_positions())
844
- rp(zonda.get_user_positions())
845
-
846
- rp(zonda.move_absolute(0, 0, 12, 0, 0, 10))
847
-
848
- rp(zonda.is_in_position())
849
- if wait_until(zonda.is_in_position, interval=1, timeout=300):
850
- rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
851
- rp(zonda.is_in_position())
852
-
853
- rp(zonda.get_machine_positions())
854
- rp(zonda.get_user_positions())
855
-
856
- rp(zonda.move_absolute(0, 0, 0, 0, 0, 0))
857
-
858
- rp(zonda.is_in_position())
859
- if wait_until(zonda.is_in_position, interval=1, timeout=300):
860
- rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
861
- rp(zonda.is_in_position())
862
-
863
- rp(zonda.get_machine_positions())
864
- rp(zonda.get_user_positions())
865
-
866
- # zonda.reset()
867
- zonda.disconnect()
868
-
869
- # rp(0, decode_validation_error(0))
870
- # rp(11, decode_validation_error(11))
871
- # rp(8, decode_validation_error(8))
872
- # rp(24, decode_validation_error(24))