zaber-motion 7.12.0__py3-none-win32.whl → 7.14.0__py3-none-win32.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 (492) hide show
  1. zaber_motion/__init__.py +103 -103
  2. zaber_motion/ascii/__init__.py +73 -73
  3. zaber_motion/ascii/all_axes.py +352 -352
  4. zaber_motion/ascii/axis.py +1673 -1666
  5. zaber_motion/ascii/axis_group.py +391 -391
  6. zaber_motion/ascii/axis_settings.py +752 -752
  7. zaber_motion/ascii/connection.py +1174 -1174
  8. zaber_motion/ascii/device.py +908 -908
  9. zaber_motion/ascii/device_io.py +1170 -1170
  10. zaber_motion/ascii/device_settings.py +735 -735
  11. zaber_motion/ascii/lockstep.py +1184 -1184
  12. zaber_motion/ascii/oscilloscope.py +635 -635
  13. zaber_motion/ascii/oscilloscope_data.py +240 -240
  14. zaber_motion/ascii/pvt.py +105 -105
  15. zaber_motion/ascii/pvt_buffer.py +146 -146
  16. zaber_motion/ascii/pvt_io.py +630 -630
  17. zaber_motion/ascii/pvt_sequence.py +1530 -1530
  18. zaber_motion/ascii/servo_tuner.py +637 -637
  19. zaber_motion/ascii/setting_constants.py +1755 -1755
  20. zaber_motion/ascii/storage.py +905 -905
  21. zaber_motion/ascii/stream.py +2182 -2182
  22. zaber_motion/ascii/stream_buffer.py +101 -101
  23. zaber_motion/ascii/stream_io.py +700 -700
  24. zaber_motion/ascii/streams.py +105 -105
  25. zaber_motion/ascii/transport.py +202 -202
  26. zaber_motion/ascii/trigger.py +886 -886
  27. zaber_motion/ascii/triggers.py +241 -241
  28. zaber_motion/ascii/warning_flags.py +178 -178
  29. zaber_motion/ascii/warnings.py +152 -152
  30. zaber_motion/async_utils.py +46 -46
  31. zaber_motion/binary/__init__.py +14 -14
  32. zaber_motion/binary/connection.py +648 -648
  33. zaber_motion/binary/device.py +924 -924
  34. zaber_motion/binary/device_settings.py +121 -121
  35. zaber_motion/bindings.py +50 -50
  36. zaber_motion/call.py +198 -198
  37. zaber_motion/convert_exception.py +138 -138
  38. zaber_motion/dto/__init__.py +11 -11
  39. zaber_motion/dto/ascii/__init__.py +46 -46
  40. zaber_motion/dto/ascii/alert_event.py +110 -110
  41. zaber_motion/dto/ascii/axis_identity.py +134 -117
  42. zaber_motion/dto/ascii/axis_type.py +14 -14
  43. zaber_motion/dto/ascii/can_set_state_axis_response.py +69 -69
  44. zaber_motion/dto/ascii/can_set_state_device_response.py +75 -75
  45. zaber_motion/dto/ascii/conversion_factor.py +81 -81
  46. zaber_motion/dto/ascii/device_identity.py +136 -136
  47. zaber_motion/dto/ascii/device_io_info.py +108 -108
  48. zaber_motion/dto/ascii/digital_output_action.py +13 -13
  49. zaber_motion/dto/ascii/get_axis_setting.py +64 -64
  50. zaber_motion/dto/ascii/get_axis_setting_result.py +81 -81
  51. zaber_motion/dto/ascii/get_setting.py +88 -88
  52. zaber_motion/dto/ascii/get_setting_result.py +87 -87
  53. zaber_motion/dto/ascii/io_port_label.py +84 -84
  54. zaber_motion/dto/ascii/io_port_type.py +14 -14
  55. zaber_motion/dto/ascii/lockstep_axes.py +108 -108
  56. zaber_motion/dto/ascii/measurement_sequence.py +73 -73
  57. zaber_motion/dto/ascii/message_type.py +14 -14
  58. zaber_motion/dto/ascii/optional_measurement_sequence.py +71 -71
  59. zaber_motion/dto/ascii/oscilloscope_capture_properties.py +116 -116
  60. zaber_motion/dto/ascii/oscilloscope_data_source.py +11 -11
  61. zaber_motion/dto/ascii/paramset_info.py +92 -92
  62. zaber_motion/dto/ascii/pid_tuning.py +125 -125
  63. zaber_motion/dto/ascii/pvt_axis_definition.py +70 -70
  64. zaber_motion/dto/ascii/pvt_axis_type.py +11 -11
  65. zaber_motion/dto/ascii/pvt_csv_data.py +75 -75
  66. zaber_motion/dto/ascii/pvt_mode.py +12 -12
  67. zaber_motion/dto/ascii/pvt_sequence_data.py +99 -99
  68. zaber_motion/dto/ascii/response.py +137 -137
  69. zaber_motion/dto/ascii/servo_tuning_param.py +66 -66
  70. zaber_motion/dto/ascii/servo_tuning_paramset.py +21 -21
  71. zaber_motion/dto/ascii/set_state_axis_response.py +75 -75
  72. zaber_motion/dto/ascii/set_state_device_response.py +80 -80
  73. zaber_motion/dto/ascii/simple_tuning.py +118 -118
  74. zaber_motion/dto/ascii/simple_tuning_param_definition.py +100 -100
  75. zaber_motion/dto/ascii/stream_axis_definition.py +70 -70
  76. zaber_motion/dto/ascii/stream_axis_type.py +11 -11
  77. zaber_motion/dto/ascii/stream_mode.py +13 -13
  78. zaber_motion/dto/ascii/trigger_action.py +12 -12
  79. zaber_motion/dto/ascii/trigger_condition.py +15 -15
  80. zaber_motion/dto/ascii/trigger_enabled_state.py +68 -68
  81. zaber_motion/dto/ascii/trigger_operation.py +12 -12
  82. zaber_motion/dto/ascii/trigger_state.py +114 -114
  83. zaber_motion/dto/ascii/unknown_response_event.py +137 -137
  84. zaber_motion/dto/axis_address.py +74 -74
  85. zaber_motion/dto/binary/__init__.py +11 -11
  86. zaber_motion/dto/binary/binary_settings.py +74 -74
  87. zaber_motion/dto/binary/command_code.py +106 -106
  88. zaber_motion/dto/binary/device_identity.py +156 -156
  89. zaber_motion/dto/binary/device_type.py +12 -12
  90. zaber_motion/dto/binary/error_code.py +101 -101
  91. zaber_motion/dto/binary/message.py +91 -91
  92. zaber_motion/dto/binary/reply_code.py +16 -16
  93. zaber_motion/dto/binary/reply_only_event.py +91 -91
  94. zaber_motion/dto/binary/unknown_response_event.py +91 -91
  95. zaber_motion/dto/channel_address.py +74 -74
  96. zaber_motion/dto/device_db_source.py +66 -66
  97. zaber_motion/dto/device_db_source_type.py +11 -11
  98. zaber_motion/dto/exceptions/__init__.py +24 -24
  99. zaber_motion/dto/exceptions/binary_command_failed_exception_data.py +57 -57
  100. zaber_motion/dto/exceptions/command_failed_exception_data.py +151 -151
  101. zaber_motion/dto/exceptions/command_too_long_exception_data.py +98 -98
  102. zaber_motion/dto/exceptions/device_address_conflict_exception_data.py +63 -63
  103. zaber_motion/dto/exceptions/device_db_failed_exception_data.py +74 -74
  104. zaber_motion/dto/exceptions/device_db_inner_error.py +85 -85
  105. zaber_motion/dto/exceptions/g_code_execution_exception_data.py +75 -75
  106. zaber_motion/dto/exceptions/g_code_syntax_exception_data.py +75 -75
  107. zaber_motion/dto/exceptions/invalid_packet_exception_data.py +63 -63
  108. zaber_motion/dto/exceptions/invalid_pvt_point.py +69 -69
  109. zaber_motion/dto/exceptions/invalid_response_exception_data.py +51 -51
  110. zaber_motion/dto/exceptions/movement_failed_exception_data.py +104 -104
  111. zaber_motion/dto/exceptions/movement_interrupted_exception_data.py +104 -104
  112. zaber_motion/dto/exceptions/operation_failed_exception_data.py +104 -104
  113. zaber_motion/dto/exceptions/pvt_execution_exception_data.py +86 -86
  114. zaber_motion/dto/exceptions/pvt_movement_failed_exception_data.py +69 -69
  115. zaber_motion/dto/exceptions/pvt_movement_interrupted_exception_data.py +69 -69
  116. zaber_motion/dto/exceptions/set_device_state_exception_data.py +176 -176
  117. zaber_motion/dto/exceptions/set_peripheral_state_exception_data.py +121 -121
  118. zaber_motion/dto/exceptions/stream_execution_exception_data.py +63 -63
  119. zaber_motion/dto/exceptions/stream_movement_failed_exception_data.py +69 -69
  120. zaber_motion/dto/exceptions/stream_movement_interrupted_exception_data.py +69 -69
  121. zaber_motion/dto/firmware_version.py +91 -91
  122. zaber_motion/dto/gcode/__init__.py +9 -9
  123. zaber_motion/dto/gcode/axis_definition.py +74 -74
  124. zaber_motion/dto/gcode/axis_mapping.py +69 -69
  125. zaber_motion/dto/gcode/axis_transformation.py +79 -79
  126. zaber_motion/dto/gcode/device_definition.py +99 -99
  127. zaber_motion/dto/gcode/translate_message.py +87 -87
  128. zaber_motion/dto/gcode/translate_result.py +79 -79
  129. zaber_motion/dto/gcode/translator_config.py +84 -84
  130. zaber_motion/dto/log_output_mode.py +13 -13
  131. zaber_motion/dto/measurement.py +67 -67
  132. zaber_motion/dto/microscopy/__init__.py +6 -6
  133. zaber_motion/dto/microscopy/autofocus_status.py +57 -57
  134. zaber_motion/dto/microscopy/microscope_config.py +159 -159
  135. zaber_motion/dto/microscopy/third_party_components.py +55 -55
  136. zaber_motion/dto/microscopy/wdi_autofocus_provider_status.py +57 -57
  137. zaber_motion/dto/named_parameter.py +64 -64
  138. zaber_motion/dto/product/__init__.py +5 -5
  139. zaber_motion/dto/product/process_controller_mode.py +13 -13
  140. zaber_motion/dto/product/process_controller_source.py +72 -72
  141. zaber_motion/dto/product/process_controller_source_sensor.py +11 -11
  142. zaber_motion/dto/requests/__init__.py +256 -254
  143. zaber_motion/dto/requests/alert_event_wrapper.py +82 -82
  144. zaber_motion/dto/requests/autofocus_focus_request.py +131 -131
  145. zaber_motion/dto/requests/autofocus_get_objective_params_request.py +121 -121
  146. zaber_motion/dto/requests/autofocus_get_objective_params_response.py +56 -56
  147. zaber_motion/dto/requests/autofocus_get_status_response.py +50 -50
  148. zaber_motion/dto/requests/autofocus_set_objective_params_request.py +141 -141
  149. zaber_motion/dto/requests/axes_empty_request.py +95 -95
  150. zaber_motion/dto/requests/axes_get_setting_request.py +121 -121
  151. zaber_motion/dto/requests/axes_move_request.py +114 -114
  152. zaber_motion/dto/requests/axis_empty_request.py +79 -79
  153. zaber_motion/dto/requests/axis_move_type.py +12 -12
  154. zaber_motion/dto/requests/axis_to_string_request.py +88 -88
  155. zaber_motion/dto/requests/binary_device_detect_request.py +56 -56
  156. zaber_motion/dto/requests/binary_device_detect_response.py +57 -57
  157. zaber_motion/dto/requests/binary_device_get_setting_request.py +89 -89
  158. zaber_motion/dto/requests/binary_device_home_request.py +88 -88
  159. zaber_motion/dto/requests/binary_device_move_request.py +111 -111
  160. zaber_motion/dto/requests/binary_device_set_setting_request.py +100 -100
  161. zaber_motion/dto/requests/binary_device_stop_request.py +88 -88
  162. zaber_motion/dto/requests/binary_generic_with_units_request.py +122 -122
  163. zaber_motion/dto/requests/binary_message_collection.py +56 -56
  164. zaber_motion/dto/requests/binary_reply_only_event_wrapper.py +82 -82
  165. zaber_motion/dto/requests/bool_response.py +43 -43
  166. zaber_motion/dto/requests/can_set_state_axis_response.py +60 -60
  167. zaber_motion/dto/requests/can_set_state_request.py +100 -100
  168. zaber_motion/dto/requests/channel_on.py +84 -84
  169. zaber_motion/dto/requests/channel_set_intensity.py +90 -90
  170. zaber_motion/dto/requests/check_version_request.py +54 -54
  171. zaber_motion/dto/requests/custom_interface_close_request.py +60 -60
  172. zaber_motion/dto/requests/custom_interface_open_response.py +51 -51
  173. zaber_motion/dto/requests/custom_interface_read_request.py +51 -51
  174. zaber_motion/dto/requests/custom_interface_write_request.py +60 -60
  175. zaber_motion/dto/requests/device_cancel_all_outputs_schedule_request.py +80 -80
  176. zaber_motion/dto/requests/device_cancel_output_schedule_request.py +84 -84
  177. zaber_motion/dto/requests/device_convert_setting_request.py +116 -116
  178. zaber_motion/dto/requests/device_detect_request.py +68 -68
  179. zaber_motion/dto/requests/device_detect_response.py +57 -57
  180. zaber_motion/dto/requests/device_empty_request.py +65 -65
  181. zaber_motion/dto/requests/device_get_all_analog_io_request.py +74 -74
  182. zaber_motion/dto/requests/device_get_all_analog_io_response.py +54 -54
  183. zaber_motion/dto/requests/device_get_all_digital_io_request.py +74 -74
  184. zaber_motion/dto/requests/device_get_all_digital_io_response.py +46 -46
  185. zaber_motion/dto/requests/device_get_analog_io_request.py +88 -88
  186. zaber_motion/dto/requests/device_get_digital_io_request.py +88 -88
  187. zaber_motion/dto/requests/device_get_setting_request.py +100 -100
  188. zaber_motion/dto/requests/device_get_storage_request.py +93 -93
  189. zaber_motion/dto/requests/device_get_warnings_request.py +84 -84
  190. zaber_motion/dto/requests/device_get_warnings_response.py +51 -51
  191. zaber_motion/dto/requests/device_home_request.py +84 -84
  192. zaber_motion/dto/requests/device_identify_request.py +77 -77
  193. zaber_motion/dto/requests/device_move_request.py +177 -177
  194. zaber_motion/dto/requests/device_move_sin_request.py +140 -140
  195. zaber_motion/dto/requests/device_multi_get_setting_request.py +118 -118
  196. zaber_motion/dto/requests/device_on_all_request.py +56 -56
  197. zaber_motion/dto/requests/device_on_all_response.py +57 -57
  198. zaber_motion/dto/requests/device_restore_request.py +84 -84
  199. zaber_motion/dto/requests/device_set_all_analog_outputs_request.py +82 -82
  200. zaber_motion/dto/requests/device_set_all_analog_outputs_schedule_request.py +121 -121
  201. zaber_motion/dto/requests/device_set_all_digital_outputs_request.py +83 -83
  202. zaber_motion/dto/requests/device_set_all_digital_outputs_schedule_request.py +122 -122
  203. zaber_motion/dto/requests/device_set_analog_output_request.py +90 -90
  204. zaber_motion/dto/requests/device_set_analog_output_schedule_request.py +124 -124
  205. zaber_motion/dto/requests/device_set_digital_output_request.py +91 -91
  206. zaber_motion/dto/requests/device_set_digital_output_schedule_request.py +125 -125
  207. zaber_motion/dto/requests/device_set_lowpass_filter_request.py +102 -102
  208. zaber_motion/dto/requests/device_set_setting_bool_request.py +93 -93
  209. zaber_motion/dto/requests/device_set_setting_int_request.py +102 -102
  210. zaber_motion/dto/requests/device_set_setting_request.py +111 -111
  211. zaber_motion/dto/requests/device_set_setting_str_request.py +97 -97
  212. zaber_motion/dto/requests/device_set_storage_bool_request.py +93 -93
  213. zaber_motion/dto/requests/device_set_storage_number_request.py +99 -99
  214. zaber_motion/dto/requests/device_set_storage_request.py +102 -102
  215. zaber_motion/dto/requests/device_set_unit_conversions_request.py +108 -108
  216. zaber_motion/dto/requests/device_stop_request.py +84 -84
  217. zaber_motion/dto/requests/device_storage_list_keys_request.py +88 -88
  218. zaber_motion/dto/requests/device_storage_request.py +88 -88
  219. zaber_motion/dto/requests/device_type.py +8 -8
  220. zaber_motion/dto/requests/device_wait_until_idle_request.py +84 -84
  221. zaber_motion/dto/requests/disconnected_event.py +101 -101
  222. zaber_motion/dto/requests/double_array_response.py +54 -54
  223. zaber_motion/dto/requests/double_response.py +48 -48
  224. zaber_motion/dto/requests/driver_enable_request.py +90 -90
  225. zaber_motion/dto/requests/empty_autofocus_request.py +107 -107
  226. zaber_motion/dto/requests/empty_request.py +38 -38
  227. zaber_motion/dto/requests/errors.py +68 -68
  228. zaber_motion/dto/requests/find_device_request.py +65 -65
  229. zaber_motion/dto/requests/find_device_response.py +51 -51
  230. zaber_motion/dto/requests/forget_devices_request.py +71 -71
  231. zaber_motion/dto/requests/gateway_event.py +45 -45
  232. zaber_motion/dto/requests/gateway_request.py +45 -45
  233. zaber_motion/dto/requests/gateway_response.py +69 -69
  234. zaber_motion/dto/requests/generic_binary_request.py +107 -107
  235. zaber_motion/dto/requests/generic_command_request.py +107 -107
  236. zaber_motion/dto/requests/generic_command_response_collection.py +56 -56
  237. zaber_motion/dto/requests/get_all_io_port_labels_response.py +56 -56
  238. zaber_motion/dto/requests/get_axis_setting_results.py +56 -56
  239. zaber_motion/dto/requests/get_io_port_label_request.py +91 -91
  240. zaber_motion/dto/requests/get_setting_results.py +56 -56
  241. zaber_motion/dto/requests/get_simple_tuning_param_definition_response.py +56 -56
  242. zaber_motion/dto/requests/int_64_response.py +51 -51
  243. zaber_motion/dto/requests/int_array_response.py +57 -57
  244. zaber_motion/dto/requests/int_request.py +51 -51
  245. zaber_motion/dto/requests/int_response.py +51 -51
  246. zaber_motion/dto/requests/interface_empty_request.py +51 -51
  247. zaber_motion/dto/requests/interface_type.py +11 -11
  248. zaber_motion/dto/requests/load_paramset.py +102 -102
  249. zaber_motion/dto/requests/lockstep_disable_request.py +84 -84
  250. zaber_motion/dto/requests/lockstep_empty_request.py +79 -79
  251. zaber_motion/dto/requests/lockstep_enable_request.py +99 -99
  252. zaber_motion/dto/requests/lockstep_get_axis_numbers_response.py +57 -57
  253. zaber_motion/dto/requests/lockstep_get_request.py +91 -91
  254. zaber_motion/dto/requests/lockstep_home_request.py +84 -84
  255. zaber_motion/dto/requests/lockstep_move_request.py +163 -163
  256. zaber_motion/dto/requests/lockstep_move_sin_request.py +140 -140
  257. zaber_motion/dto/requests/lockstep_set_request.py +116 -116
  258. zaber_motion/dto/requests/lockstep_stop_request.py +84 -84
  259. zaber_motion/dto/requests/lockstep_wait_until_idle_request.py +84 -84
  260. zaber_motion/dto/requests/microscope_config_response.py +50 -50
  261. zaber_motion/dto/requests/microscope_empty_request.py +65 -65
  262. zaber_motion/dto/requests/microscope_find_request.py +63 -63
  263. zaber_motion/dto/requests/microscope_init_request.py +70 -70
  264. zaber_motion/dto/requests/microscope_trigger_camera_request.py +107 -107
  265. zaber_motion/dto/requests/objective_changer_change_request.py +119 -119
  266. zaber_motion/dto/requests/objective_changer_create_response.py +79 -79
  267. zaber_motion/dto/requests/objective_changer_get_current_response.py +51 -51
  268. zaber_motion/dto/requests/objective_changer_request.py +93 -93
  269. zaber_motion/dto/requests/objective_changer_set_request.py +116 -116
  270. zaber_motion/dto/requests/open_binary_interface_request.py +100 -100
  271. zaber_motion/dto/requests/open_interface_request.py +159 -159
  272. zaber_motion/dto/requests/open_interface_response.py +51 -51
  273. zaber_motion/dto/requests/oscilloscope_add_io_channel_request.py +91 -91
  274. zaber_motion/dto/requests/oscilloscope_add_setting_channel_request.py +88 -88
  275. zaber_motion/dto/requests/oscilloscope_data_get_request.py +63 -63
  276. zaber_motion/dto/requests/oscilloscope_data_get_sample_time_request.py +77 -77
  277. zaber_motion/dto/requests/oscilloscope_data_get_samples_response.py +54 -54
  278. zaber_motion/dto/requests/oscilloscope_data_identifier.py +51 -51
  279. zaber_motion/dto/requests/oscilloscope_read_response.py +57 -57
  280. zaber_motion/dto/requests/oscilloscope_request.py +65 -65
  281. zaber_motion/dto/requests/oscilloscope_start_request.py +79 -79
  282. zaber_motion/dto/requests/prepare_command_request.py +108 -108
  283. zaber_motion/dto/requests/process_on.py +107 -107
  284. zaber_motion/dto/requests/pvt_buffer_get_sequence_data_request.py +79 -79
  285. zaber_motion/dto/requests/pvt_csv_request.py +59 -59
  286. zaber_motion/dto/requests/pvt_generate_positions_request.py +74 -74
  287. zaber_motion/dto/requests/pvt_generate_velocities_and_times_request.py +96 -96
  288. zaber_motion/dto/requests/pvt_generate_velocities_request.py +93 -93
  289. zaber_motion/dto/requests/pvt_load_csv_request.py +45 -45
  290. zaber_motion/dto/requests/pvt_point_request.py +145 -145
  291. zaber_motion/dto/requests/pvt_points_request.py +147 -147
  292. zaber_motion/dto/requests/pvt_save_csv_request.py +74 -74
  293. zaber_motion/dto/requests/pvt_submit_sequence_data_request.py +93 -93
  294. zaber_motion/dto/requests/renumber_request.py +79 -79
  295. zaber_motion/dto/requests/response_type.py +8 -8
  296. zaber_motion/dto/requests/servo_tuning_paramset_response.py +48 -48
  297. zaber_motion/dto/requests/servo_tuning_request.py +91 -91
  298. zaber_motion/dto/requests/set_device_db_layered_sources_request.py +56 -56
  299. zaber_motion/dto/requests/set_device_db_source_request.py +63 -63
  300. zaber_motion/dto/requests/set_interface_checksum_enabled_request.py +56 -56
  301. zaber_motion/dto/requests/set_interface_timeout_request.py +65 -65
  302. zaber_motion/dto/requests/set_internal_mode_request.py +43 -43
  303. zaber_motion/dto/requests/set_io_port_label_request.py +100 -100
  304. zaber_motion/dto/requests/set_log_output_request.py +57 -57
  305. zaber_motion/dto/requests/set_process_controller_source.py +93 -93
  306. zaber_motion/dto/requests/set_servo_tuning_pid_request.py +135 -135
  307. zaber_motion/dto/requests/set_servo_tuning_request.py +116 -116
  308. zaber_motion/dto/requests/set_simple_tuning.py +174 -174
  309. zaber_motion/dto/requests/set_state_request.py +93 -93
  310. zaber_motion/dto/requests/stream_arc_request.py +199 -199
  311. zaber_motion/dto/requests/stream_buffer_erase_request.py +84 -84
  312. zaber_motion/dto/requests/stream_buffer_get_content_request.py +84 -84
  313. zaber_motion/dto/requests/stream_buffer_get_content_response.py +51 -51
  314. zaber_motion/dto/requests/stream_buffer_list.py +70 -70
  315. zaber_motion/dto/requests/stream_call_request.py +112 -112
  316. zaber_motion/dto/requests/stream_cancel_all_outputs_schedule_request.py +99 -99
  317. zaber_motion/dto/requests/stream_cancel_output_schedule_request.py +103 -103
  318. zaber_motion/dto/requests/stream_circle_request.py +155 -155
  319. zaber_motion/dto/requests/stream_empty_request.py +84 -84
  320. zaber_motion/dto/requests/stream_generic_command_batch_request.py +99 -99
  321. zaber_motion/dto/requests/stream_generic_command_request.py +93 -93
  322. zaber_motion/dto/requests/stream_get_axes_response.py +75 -75
  323. zaber_motion/dto/requests/stream_get_max_centripetal_acceleration_request.py +96 -96
  324. zaber_motion/dto/requests/stream_get_max_speed_request.py +96 -96
  325. zaber_motion/dto/requests/stream_get_max_tangential_acceleration_request.py +96 -96
  326. zaber_motion/dto/requests/stream_line_request.py +135 -135
  327. zaber_motion/dto/requests/stream_mode_response.py +60 -60
  328. zaber_motion/dto/requests/stream_segment_type.py +8 -8
  329. zaber_motion/dto/requests/stream_set_all_analog_outputs_request.py +101 -101
  330. zaber_motion/dto/requests/stream_set_all_analog_outputs_schedule_request.py +140 -140
  331. zaber_motion/dto/requests/stream_set_all_digital_outputs_request.py +102 -102
  332. zaber_motion/dto/requests/stream_set_all_digital_outputs_schedule_request.py +141 -141
  333. zaber_motion/dto/requests/stream_set_analog_output_request.py +109 -109
  334. zaber_motion/dto/requests/stream_set_analog_output_schedule_request.py +143 -143
  335. zaber_motion/dto/requests/stream_set_digital_output_request.py +110 -110
  336. zaber_motion/dto/requests/stream_set_digital_output_schedule_request.py +144 -144
  337. zaber_motion/dto/requests/stream_set_hold_request.py +89 -89
  338. zaber_motion/dto/requests/stream_set_max_centripetal_acceleration_request.py +107 -107
  339. zaber_motion/dto/requests/stream_set_max_speed_request.py +107 -107
  340. zaber_motion/dto/requests/stream_set_max_tangential_acceleration_request.py +107 -107
  341. zaber_motion/dto/requests/stream_setup_live_composite_request.py +123 -123
  342. zaber_motion/dto/requests/stream_setup_live_request.py +104 -104
  343. zaber_motion/dto/requests/stream_setup_store_arbitrary_axes_request.py +126 -126
  344. zaber_motion/dto/requests/stream_setup_store_composite_request.py +151 -151
  345. zaber_motion/dto/requests/stream_setup_store_request.py +132 -132
  346. zaber_motion/dto/requests/stream_wait_analog_input_request.py +118 -118
  347. zaber_motion/dto/requests/stream_wait_digital_input_request.py +103 -103
  348. zaber_motion/dto/requests/stream_wait_request.py +107 -107
  349. zaber_motion/dto/requests/stream_wait_until_idle_request.py +89 -89
  350. zaber_motion/dto/requests/string_array_response.py +51 -51
  351. zaber_motion/dto/requests/string_response.py +45 -45
  352. zaber_motion/dto/requests/test_event.py +45 -45
  353. zaber_motion/dto/requests/test_request.py +55 -55
  354. zaber_motion/dto/requests/test_request_complex.py +57 -0
  355. zaber_motion/dto/requests/test_response.py +45 -45
  356. zaber_motion/dto/requests/test_response_long.py +51 -51
  357. zaber_motion/dto/requests/toggle_device_db_store_request.py +50 -50
  358. zaber_motion/dto/requests/tools_list_serial_ports_response.py +51 -51
  359. zaber_motion/dto/requests/translator_create_from_device_request.py +97 -97
  360. zaber_motion/dto/requests/translator_create_live_request.py +91 -91
  361. zaber_motion/dto/requests/translator_create_request.py +62 -62
  362. zaber_motion/dto/requests/translator_create_response.py +51 -51
  363. zaber_motion/dto/requests/translator_empty_request.py +51 -51
  364. zaber_motion/dto/requests/translator_flush_live_request.py +56 -56
  365. zaber_motion/dto/requests/translator_flush_response.py +51 -51
  366. zaber_motion/dto/requests/translator_get_axis_offset_request.py +81 -81
  367. zaber_motion/dto/requests/translator_get_axis_position_request.py +72 -72
  368. zaber_motion/dto/requests/translator_set_axis_position_request.py +83 -83
  369. zaber_motion/dto/requests/translator_set_feed_rate_override_request.py +62 -62
  370. zaber_motion/dto/requests/translator_set_traverse_rate_request.py +74 -74
  371. zaber_motion/dto/requests/translator_translate_request.py +60 -60
  372. zaber_motion/dto/requests/trigger_clear_action_request.py +91 -91
  373. zaber_motion/dto/requests/trigger_empty_request.py +79 -79
  374. zaber_motion/dto/requests/trigger_enable_request.py +93 -93
  375. zaber_motion/dto/requests/trigger_enabled_states.py +56 -56
  376. zaber_motion/dto/requests/trigger_fire_at_interval_request.py +102 -102
  377. zaber_motion/dto/requests/trigger_fire_when_distance_travelled_request.py +116 -116
  378. zaber_motion/dto/requests/trigger_fire_when_io_request.py +128 -128
  379. zaber_motion/dto/requests/trigger_fire_when_request.py +88 -88
  380. zaber_motion/dto/requests/trigger_fire_when_setting_request.py +137 -137
  381. zaber_motion/dto/requests/trigger_on_fire_request.py +114 -114
  382. zaber_motion/dto/requests/trigger_on_fire_set_request.py +149 -149
  383. zaber_motion/dto/requests/trigger_on_fire_set_to_setting_request.py +149 -149
  384. zaber_motion/dto/requests/trigger_set_label_request.py +88 -88
  385. zaber_motion/dto/requests/trigger_states.py +56 -56
  386. zaber_motion/dto/requests/unit_convert_unit_request.py +71 -71
  387. zaber_motion/dto/requests/unit_get_enum_request.py +45 -45
  388. zaber_motion/dto/requests/unit_get_enum_response.py +48 -48
  389. zaber_motion/dto/requests/unit_get_symbol_request.py +48 -48
  390. zaber_motion/dto/requests/unit_get_symbol_response.py +45 -45
  391. zaber_motion/dto/requests/unknown_binary_response_event_wrapper.py +82 -82
  392. zaber_motion/dto/requests/unknown_response_event_wrapper.py +82 -82
  393. zaber_motion/dto/requests/wait_to_clear_warnings_request.py +105 -105
  394. zaber_motion/dto/requests/wait_to_respond_request.py +76 -76
  395. zaber_motion/dto/requests/wdi_generic_float_request.py +119 -0
  396. zaber_motion/dto/requests/wdi_generic_request.py +136 -136
  397. zaber_motion/dto/requests/wdi_get_status_response.py +50 -50
  398. zaber_motion/dto/rotation_direction.py +13 -13
  399. zaber_motion/dto_object.py +18 -18
  400. zaber_motion/events.py +112 -112
  401. zaber_motion/exceptions/__init__.py +87 -87
  402. zaber_motion/exceptions/bad_command_exception.py +10 -10
  403. zaber_motion/exceptions/bad_data_exception.py +10 -10
  404. zaber_motion/exceptions/binary_command_failed_exception.py +27 -27
  405. zaber_motion/exceptions/command_failed_exception.py +27 -27
  406. zaber_motion/exceptions/command_preempted_exception.py +10 -10
  407. zaber_motion/exceptions/command_too_long_exception.py +27 -27
  408. zaber_motion/exceptions/connection_closed_exception.py +10 -10
  409. zaber_motion/exceptions/connection_failed_exception.py +10 -10
  410. zaber_motion/exceptions/conversion_failed_exception.py +10 -10
  411. zaber_motion/exceptions/device_address_conflict_exception.py +27 -27
  412. zaber_motion/exceptions/device_busy_exception.py +10 -10
  413. zaber_motion/exceptions/device_db_failed_exception.py +27 -27
  414. zaber_motion/exceptions/device_detection_failed_exception.py +10 -10
  415. zaber_motion/exceptions/device_failed_exception.py +11 -11
  416. zaber_motion/exceptions/device_not_identified_exception.py +10 -10
  417. zaber_motion/exceptions/driver_disabled_exception.py +10 -10
  418. zaber_motion/exceptions/g_code_execution_exception.py +27 -27
  419. zaber_motion/exceptions/g_code_syntax_exception.py +27 -27
  420. zaber_motion/exceptions/incompatible_shared_library_exception.py +11 -11
  421. zaber_motion/exceptions/internal_error_exception.py +10 -10
  422. zaber_motion/exceptions/invalid_argument_exception.py +10 -10
  423. zaber_motion/exceptions/invalid_csv_data_exception.py +10 -10
  424. zaber_motion/exceptions/invalid_data_exception.py +10 -10
  425. zaber_motion/exceptions/invalid_operation_exception.py +10 -10
  426. zaber_motion/exceptions/invalid_packet_exception.py +27 -27
  427. zaber_motion/exceptions/invalid_park_state_exception.py +10 -10
  428. zaber_motion/exceptions/invalid_request_data_exception.py +11 -11
  429. zaber_motion/exceptions/invalid_response_exception.py +27 -27
  430. zaber_motion/exceptions/io_channel_out_of_range_exception.py +10 -10
  431. zaber_motion/exceptions/io_failed_exception.py +10 -10
  432. zaber_motion/exceptions/lockstep_enabled_exception.py +10 -10
  433. zaber_motion/exceptions/lockstep_not_enabled_exception.py +10 -10
  434. zaber_motion/exceptions/motion_lib_exception.py +18 -18
  435. zaber_motion/exceptions/movement_failed_exception.py +27 -27
  436. zaber_motion/exceptions/movement_interrupted_exception.py +27 -27
  437. zaber_motion/exceptions/no_device_found_exception.py +10 -10
  438. zaber_motion/exceptions/no_value_for_key_exception.py +10 -10
  439. zaber_motion/exceptions/not_supported_exception.py +10 -10
  440. zaber_motion/exceptions/operation_failed_exception.py +27 -27
  441. zaber_motion/exceptions/os_failed_exception.py +10 -10
  442. zaber_motion/exceptions/out_of_request_ids_exception.py +10 -10
  443. zaber_motion/exceptions/pvt_discontinuity_exception.py +10 -10
  444. zaber_motion/exceptions/pvt_execution_exception.py +27 -27
  445. zaber_motion/exceptions/pvt_mode_exception.py +10 -10
  446. zaber_motion/exceptions/pvt_movement_failed_exception.py +27 -27
  447. zaber_motion/exceptions/pvt_movement_interrupted_exception.py +27 -27
  448. zaber_motion/exceptions/pvt_sequence_generation_failed_exception.py +10 -10
  449. zaber_motion/exceptions/pvt_setup_failed_exception.py +10 -10
  450. zaber_motion/exceptions/remote_mode_exception.py +11 -11
  451. zaber_motion/exceptions/request_timeout_exception.py +10 -10
  452. zaber_motion/exceptions/serial_port_busy_exception.py +10 -10
  453. zaber_motion/exceptions/set_device_state_failed_exception.py +27 -27
  454. zaber_motion/exceptions/set_peripheral_state_failed_exception.py +27 -27
  455. zaber_motion/exceptions/setting_not_found_exception.py +10 -10
  456. zaber_motion/exceptions/stream_discontinuity_exception.py +10 -10
  457. zaber_motion/exceptions/stream_execution_exception.py +27 -27
  458. zaber_motion/exceptions/stream_mode_exception.py +10 -10
  459. zaber_motion/exceptions/stream_movement_failed_exception.py +27 -27
  460. zaber_motion/exceptions/stream_movement_interrupted_exception.py +27 -27
  461. zaber_motion/exceptions/stream_setup_failed_exception.py +10 -10
  462. zaber_motion/exceptions/timeout_exception.py +10 -10
  463. zaber_motion/exceptions/transport_already_used_exception.py +10 -10
  464. zaber_motion/exceptions/unknown_request_exception.py +10 -10
  465. zaber_motion/gcode/__init__.py +11 -11
  466. zaber_motion/gcode/offline_translator.py +401 -401
  467. zaber_motion/gcode/translator.py +424 -424
  468. zaber_motion/library.py +179 -179
  469. zaber_motion/microscopy/__init__.py +14 -14
  470. zaber_motion/microscopy/autofocus.py +645 -645
  471. zaber_motion/microscopy/camera_trigger.py +108 -108
  472. zaber_motion/microscopy/filter_changer.py +167 -167
  473. zaber_motion/microscopy/illuminator.py +139 -139
  474. zaber_motion/microscopy/illuminator_channel.py +616 -616
  475. zaber_motion/microscopy/microscope.py +315 -315
  476. zaber_motion/microscopy/objective_changer.py +403 -403
  477. zaber_motion/microscopy/wdi_autofocus_provider.py +536 -396
  478. zaber_motion/product/__init__.py +7 -7
  479. zaber_motion/product/process.py +818 -818
  480. zaber_motion/product/process_controller.py +134 -134
  481. zaber_motion/serialization.py +32 -32
  482. zaber_motion/tools.py +78 -78
  483. zaber_motion/unit_table.py +86 -86
  484. zaber_motion/units.py +206 -206
  485. zaber_motion/version.py +1 -1
  486. {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/LICENSE.txt +2119 -2119
  487. {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/METADATA +1 -1
  488. zaber_motion-7.14.0.dist-info/RECORD +496 -0
  489. zaber_motion_bindings/zaber-motion-core-windows-386.dll +0 -0
  490. zaber_motion-7.12.0.dist-info/RECORD +0 -494
  491. {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/WHEEL +0 -0
  492. {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/top_level.txt +0 -0
@@ -1,908 +1,908 @@
1
- # ===== THIS FILE IS GENERATED FROM A TEMPLATE ===== #
2
- # ============== DO NOT EDIT DIRECTLY ============== #
3
-
4
- from typing import TYPE_CHECKING, List, Optional
5
- from ..call import call, call_async, call_sync
6
-
7
- from ..dto import requests as dto
8
- from .device_settings import DeviceSettings
9
- from .axis import Axis
10
- from .all_axes import AllAxes
11
- from .warnings import Warnings
12
- from ..dto.ascii.device_identity import DeviceIdentity
13
- from .device_io import DeviceIO
14
- from ..dto.ascii.response import Response
15
- from .lockstep import Lockstep
16
- from .oscilloscope import Oscilloscope
17
- from .storage import DeviceStorage
18
- from ..dto.ascii.can_set_state_device_response import CanSetStateDeviceResponse
19
- from .pvt import Pvt
20
- from .triggers import Triggers
21
- from .streams import Streams
22
- from ..dto.firmware_version import FirmwareVersion
23
- from ..dto.measurement import Measurement
24
- from ..dto.ascii.set_state_device_response import SetStateDeviceResponse
25
-
26
- if TYPE_CHECKING:
27
- from .connection import Connection
28
-
29
-
30
- class Device:
31
- """
32
- Represents the controller part of one device - may be either a standalone controller or an integrated controller.
33
- """
34
-
35
- @property
36
- def connection(self) -> 'Connection':
37
- """
38
- Connection of this device.
39
- """
40
- return self._connection
41
-
42
- @property
43
- def device_address(self) -> int:
44
- """
45
- The device address uniquely identifies the device on the connection.
46
- It can be configured or automatically assigned by the renumber command.
47
- """
48
- return self._device_address
49
-
50
- @property
51
- def settings(self) -> DeviceSettings:
52
- """
53
- Settings and properties of this device.
54
- """
55
- return self._settings
56
-
57
- @property
58
- def storage(self) -> DeviceStorage:
59
- """
60
- Key-value storage of this device.
61
- """
62
- return self._storage
63
-
64
- @property
65
- def io(self) -> DeviceIO:
66
- """
67
- I/O channels of this device.
68
- """
69
- return self._io
70
-
71
- @property
72
- def all_axes(self) -> AllAxes:
73
- """
74
- Virtual axis which allows you to target all axes of this device.
75
- """
76
- return self._all_axes
77
-
78
- @property
79
- def warnings(self) -> Warnings:
80
- """
81
- Warnings and faults of this device and all its axes.
82
- """
83
- return self._warnings
84
-
85
- @property
86
- def identity(self) -> DeviceIdentity:
87
- """
88
- Identity of the device.
89
- """
90
- return self.__retrieve_identity()
91
-
92
- @property
93
- def is_identified(self) -> bool:
94
- """
95
- Indicates whether or not the device has been identified.
96
- """
97
- return self.__retrieve_is_identified()
98
-
99
- @property
100
- def oscilloscope(self) -> Oscilloscope:
101
- """
102
- Oscilloscope recording helper for this device.
103
- Requires at least Firmware 7.00.
104
- """
105
- return self._oscilloscope
106
-
107
- @property
108
- def device_id(self) -> int:
109
- """
110
- Unique ID of the device hardware.
111
- """
112
- return self.identity.device_id
113
-
114
- @property
115
- def serial_number(self) -> int:
116
- """
117
- Serial number of the device.
118
- """
119
- return self.identity.serial_number
120
-
121
- @property
122
- def name(self) -> str:
123
- """
124
- Name of the product.
125
- """
126
- return self.identity.name
127
-
128
- @property
129
- def axis_count(self) -> int:
130
- """
131
- Number of axes this device has.
132
- """
133
- return self.identity.axis_count
134
-
135
- @property
136
- def firmware_version(self) -> FirmwareVersion:
137
- """
138
- Version of the firmware.
139
- """
140
- return self.identity.firmware_version
141
-
142
- @property
143
- def is_integrated(self) -> bool:
144
- """
145
- The device is an integrated product.
146
- """
147
- return self.identity.is_integrated
148
-
149
- @property
150
- def label(self) -> str:
151
- """
152
- User-assigned label of the device.
153
- """
154
- return self.__retrieve_label()
155
-
156
- @property
157
- def triggers(self) -> Triggers:
158
- """
159
- Triggers for this device.
160
- Requires at least Firmware 7.06.
161
- """
162
- return self._triggers
163
-
164
- @property
165
- def streams(self) -> Streams:
166
- """
167
- Gets an object that provides access to Streams on this device.
168
- Requires at least Firmware 7.05.
169
- """
170
- return self._streams
171
-
172
- @property
173
- def pvt(self) -> Pvt:
174
- """
175
- Gets an object that provides access to PVT functions of this device.
176
- Note that as of ZML v5.0.0, this returns a Pvt object and NOT a PvtSequence object.
177
- The PvtSequence can now be obtained from the Pvt object.
178
- Requires at least Firmware 7.33.
179
- """
180
- return self._pvt
181
-
182
- def __init__(self, connection: 'Connection', device_address: int):
183
- self._connection: 'Connection' = connection
184
- self._device_address: int = device_address
185
- self._settings: DeviceSettings = DeviceSettings(self)
186
- self._storage: DeviceStorage = DeviceStorage(self)
187
- self._io: DeviceIO = DeviceIO(self)
188
- self._all_axes: AllAxes = AllAxes(self)
189
- self._warnings: Warnings = Warnings(self, 0)
190
- self._oscilloscope: Oscilloscope = Oscilloscope(self)
191
- self._triggers: Triggers = Triggers(self)
192
- self._streams: Streams = Streams(self)
193
- self._pvt: Pvt = Pvt(self)
194
-
195
- def identify(
196
- self,
197
- assume_version: Optional[FirmwareVersion] = None
198
- ) -> DeviceIdentity:
199
- """
200
- Queries the device and the database, gathering information about the product.
201
- Without this information features such as unit conversions will not work.
202
- Usually, called automatically by detect devices method.
203
-
204
- Args:
205
- assume_version: The identification assumes the specified firmware version
206
- instead of the version queried from the device.
207
- Providing this argument can lead to unexpected compatibility issues.
208
-
209
- Returns:
210
- Device identification data.
211
- """
212
- request = dto.DeviceIdentifyRequest(
213
- interface_id=self.connection.interface_id,
214
- device=self.device_address,
215
- assume_version=assume_version,
216
- )
217
- response = call(
218
- "device/identify",
219
- request,
220
- DeviceIdentity.from_binary)
221
- return response
222
-
223
- async def identify_async(
224
- self,
225
- assume_version: Optional[FirmwareVersion] = None
226
- ) -> DeviceIdentity:
227
- """
228
- Queries the device and the database, gathering information about the product.
229
- Without this information features such as unit conversions will not work.
230
- Usually, called automatically by detect devices method.
231
-
232
- Args:
233
- assume_version: The identification assumes the specified firmware version
234
- instead of the version queried from the device.
235
- Providing this argument can lead to unexpected compatibility issues.
236
-
237
- Returns:
238
- Device identification data.
239
- """
240
- request = dto.DeviceIdentifyRequest(
241
- interface_id=self.connection.interface_id,
242
- device=self.device_address,
243
- assume_version=assume_version,
244
- )
245
- response = await call_async(
246
- "device/identify",
247
- request,
248
- DeviceIdentity.from_binary)
249
- return response
250
-
251
- def generic_command(
252
- self,
253
- command: str,
254
- axis: int = 0,
255
- check_errors: bool = True,
256
- timeout: int = 0
257
- ) -> Response:
258
- """
259
- Sends a generic ASCII command to this device.
260
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
261
-
262
- Args:
263
- command: Command and its parameters.
264
- axis: Optional axis number to send the command to.
265
- check_errors: Controls whether to throw an exception when the device rejects the command.
266
- timeout: The timeout, in milliseconds, for a device to respond to the command.
267
- Overrides the connection default request timeout.
268
-
269
- Returns:
270
- A response to the command.
271
- """
272
- request = dto.GenericCommandRequest(
273
- interface_id=self.connection.interface_id,
274
- device=self.device_address,
275
- command=command,
276
- axis=axis,
277
- check_errors=check_errors,
278
- timeout=timeout,
279
- )
280
- response = call(
281
- "interface/generic_command",
282
- request,
283
- Response.from_binary)
284
- return response
285
-
286
- async def generic_command_async(
287
- self,
288
- command: str,
289
- axis: int = 0,
290
- check_errors: bool = True,
291
- timeout: int = 0
292
- ) -> Response:
293
- """
294
- Sends a generic ASCII command to this device.
295
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
296
-
297
- Args:
298
- command: Command and its parameters.
299
- axis: Optional axis number to send the command to.
300
- check_errors: Controls whether to throw an exception when the device rejects the command.
301
- timeout: The timeout, in milliseconds, for a device to respond to the command.
302
- Overrides the connection default request timeout.
303
-
304
- Returns:
305
- A response to the command.
306
- """
307
- request = dto.GenericCommandRequest(
308
- interface_id=self.connection.interface_id,
309
- device=self.device_address,
310
- command=command,
311
- axis=axis,
312
- check_errors=check_errors,
313
- timeout=timeout,
314
- )
315
- response = await call_async(
316
- "interface/generic_command",
317
- request,
318
- Response.from_binary)
319
- return response
320
-
321
- def generic_command_multi_response(
322
- self,
323
- command: str,
324
- axis: int = 0,
325
- check_errors: bool = True,
326
- timeout: int = 0
327
- ) -> List[Response]:
328
- """
329
- Sends a generic ASCII command to this device and expect multiple responses.
330
- Responses are returned in order of arrival.
331
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
332
-
333
- Args:
334
- command: Command and its parameters.
335
- axis: Optional axis number to send the command to.
336
- check_errors: Controls whether to throw an exception when a device rejects the command.
337
- timeout: The timeout, in milliseconds, for a device to respond to the command.
338
- Overrides the connection default request timeout.
339
-
340
- Returns:
341
- All responses to the command.
342
- """
343
- request = dto.GenericCommandRequest(
344
- interface_id=self.connection.interface_id,
345
- device=self.device_address,
346
- command=command,
347
- axis=axis,
348
- check_errors=check_errors,
349
- timeout=timeout,
350
- )
351
- response = call(
352
- "interface/generic_command_multi_response",
353
- request,
354
- dto.GenericCommandResponseCollection.from_binary)
355
- return response.responses
356
-
357
- async def generic_command_multi_response_async(
358
- self,
359
- command: str,
360
- axis: int = 0,
361
- check_errors: bool = True,
362
- timeout: int = 0
363
- ) -> List[Response]:
364
- """
365
- Sends a generic ASCII command to this device and expect multiple responses.
366
- Responses are returned in order of arrival.
367
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
368
-
369
- Args:
370
- command: Command and its parameters.
371
- axis: Optional axis number to send the command to.
372
- check_errors: Controls whether to throw an exception when a device rejects the command.
373
- timeout: The timeout, in milliseconds, for a device to respond to the command.
374
- Overrides the connection default request timeout.
375
-
376
- Returns:
377
- All responses to the command.
378
- """
379
- request = dto.GenericCommandRequest(
380
- interface_id=self.connection.interface_id,
381
- device=self.device_address,
382
- command=command,
383
- axis=axis,
384
- check_errors=check_errors,
385
- timeout=timeout,
386
- )
387
- response = await call_async(
388
- "interface/generic_command_multi_response",
389
- request,
390
- dto.GenericCommandResponseCollection.from_binary)
391
- return response.responses
392
-
393
- def generic_command_no_response(
394
- self,
395
- command: str,
396
- axis: int = 0
397
- ) -> None:
398
- """
399
- Sends a generic ASCII command to this device without expecting a response and without adding a message ID
400
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
401
-
402
- Args:
403
- command: Command and its parameters.
404
- axis: Optional axis number to send the command to.
405
- Specifying -1 omits the number completely.
406
- """
407
- request = dto.GenericCommandRequest(
408
- interface_id=self.connection.interface_id,
409
- device=self.device_address,
410
- command=command,
411
- axis=axis,
412
- )
413
- call("interface/generic_command_no_response", request)
414
-
415
- async def generic_command_no_response_async(
416
- self,
417
- command: str,
418
- axis: int = 0
419
- ) -> None:
420
- """
421
- Sends a generic ASCII command to this device without expecting a response and without adding a message ID
422
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
423
-
424
- Args:
425
- command: Command and its parameters.
426
- axis: Optional axis number to send the command to.
427
- Specifying -1 omits the number completely.
428
- """
429
- request = dto.GenericCommandRequest(
430
- interface_id=self.connection.interface_id,
431
- device=self.device_address,
432
- command=command,
433
- axis=axis,
434
- )
435
- await call_async("interface/generic_command_no_response", request)
436
-
437
- def get_axis(
438
- self,
439
- axis_number: int
440
- ) -> Axis:
441
- """
442
- Gets an Axis class instance which allows you to control a particular axis on this device.
443
- Axes are numbered from 1.
444
-
445
- Args:
446
- axis_number: Number of axis intended to control.
447
-
448
- Returns:
449
- Axis instance.
450
- """
451
- if axis_number <= 0:
452
- raise ValueError('Invalid value; physical axes are numbered from 1.')
453
-
454
- return Axis(self, axis_number)
455
-
456
- def get_lockstep(
457
- self,
458
- lockstep_group_id: int
459
- ) -> Lockstep:
460
- """
461
- Gets a Lockstep class instance which allows you to control a particular lockstep group on the device.
462
- Requires at least Firmware 6.15 or 7.11.
463
-
464
- Args:
465
- lockstep_group_id: The ID of the lockstep group to control. Lockstep group IDs start at one.
466
-
467
- Returns:
468
- Lockstep instance.
469
- """
470
- if lockstep_group_id <= 0:
471
- raise ValueError('Invalid value; lockstep groups are numbered from 1.')
472
-
473
- return Lockstep(self, lockstep_group_id)
474
-
475
- def prepare_command(
476
- self,
477
- command_template: str,
478
- *parameters: Measurement
479
- ) -> str:
480
- """
481
- Formats parameters into a command and performs unit conversions.
482
- Parameters in the command template are denoted by a question mark.
483
- Command returned is only valid for this device.
484
- Unit conversion is not supported for commands where axes can be remapped, such as stream and PVT commands.
485
- For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
486
-
487
- Args:
488
- command_template: Template of a command to prepare. Parameters are denoted by question marks.
489
- parameters: Variable number of command parameters.
490
-
491
- Returns:
492
- Command with converted parameters.
493
- """
494
- request = dto.PrepareCommandRequest(
495
- interface_id=self.connection.interface_id,
496
- device=self.device_address,
497
- command_template=command_template,
498
- parameters=list(parameters),
499
- )
500
- response = call_sync(
501
- "device/prepare_command",
502
- request,
503
- dto.StringResponse.from_binary)
504
- return response.value
505
-
506
- def set_label(
507
- self,
508
- label: str
509
- ) -> None:
510
- """
511
- Sets the user-assigned device label.
512
- The label is stored on the controller and recognized by other software.
513
-
514
- Args:
515
- label: Label to set.
516
- """
517
- request = dto.DeviceSetStorageRequest(
518
- interface_id=self.connection.interface_id,
519
- device=self.device_address,
520
- value=label,
521
- )
522
- call("device/set_label", request)
523
-
524
- async def set_label_async(
525
- self,
526
- label: str
527
- ) -> None:
528
- """
529
- Sets the user-assigned device label.
530
- The label is stored on the controller and recognized by other software.
531
-
532
- Args:
533
- label: Label to set.
534
- """
535
- request = dto.DeviceSetStorageRequest(
536
- interface_id=self.connection.interface_id,
537
- device=self.device_address,
538
- value=label,
539
- )
540
- await call_async("device/set_label", request)
541
-
542
- def __retrieve_label(
543
- self
544
- ) -> str:
545
- """
546
- Gets the device name.
547
-
548
- Returns:
549
- The label.
550
- """
551
- request = dto.AxisEmptyRequest(
552
- interface_id=self.connection.interface_id,
553
- device=self.device_address,
554
- )
555
- response = call_sync(
556
- "device/get_label",
557
- request,
558
- dto.StringResponse.from_binary)
559
- return response.value
560
-
561
- def __repr__(
562
- self
563
- ) -> str:
564
- """
565
- Returns a string that represents the device.
566
-
567
- Returns:
568
- A string that represents the device.
569
- """
570
- request = dto.AxisToStringRequest(
571
- interface_id=self.connection.interface_id,
572
- device=self.device_address,
573
- )
574
- response = call_sync(
575
- "device/device_to_string",
576
- request,
577
- dto.StringResponse.from_binary)
578
- return response.value
579
-
580
- def get_state(
581
- self
582
- ) -> str:
583
- """
584
- Returns a serialization of the current device state that can be saved and reapplied.
585
-
586
- Returns:
587
- A serialization of the current state of the device.
588
- """
589
- request = dto.AxisEmptyRequest(
590
- interface_id=self.connection.interface_id,
591
- device=self.device_address,
592
- )
593
- response = call(
594
- "device/get_state",
595
- request,
596
- dto.StringResponse.from_binary)
597
- return response.value
598
-
599
- async def get_state_async(
600
- self
601
- ) -> str:
602
- """
603
- Returns a serialization of the current device state that can be saved and reapplied.
604
-
605
- Returns:
606
- A serialization of the current state of the device.
607
- """
608
- request = dto.AxisEmptyRequest(
609
- interface_id=self.connection.interface_id,
610
- device=self.device_address,
611
- )
612
- response = await call_async(
613
- "device/get_state",
614
- request,
615
- dto.StringResponse.from_binary)
616
- return response.value
617
-
618
- def set_state(
619
- self,
620
- state: str,
621
- device_only: bool = False
622
- ) -> SetStateDeviceResponse:
623
- """
624
- Applies a saved state to this device.
625
-
626
- Args:
627
- state: The state object to apply to this device.
628
- device_only: If true, only device scope settings and features will be set.
629
-
630
- Returns:
631
- Reports of any issues that were handled, but caused the state to not be exactly restored.
632
- """
633
- request = dto.SetStateRequest(
634
- interface_id=self.connection.interface_id,
635
- device=self.device_address,
636
- state=state,
637
- device_only=device_only,
638
- )
639
- response = call(
640
- "device/set_device_state",
641
- request,
642
- SetStateDeviceResponse.from_binary)
643
- return response
644
-
645
- async def set_state_async(
646
- self,
647
- state: str,
648
- device_only: bool = False
649
- ) -> SetStateDeviceResponse:
650
- """
651
- Applies a saved state to this device.
652
-
653
- Args:
654
- state: The state object to apply to this device.
655
- device_only: If true, only device scope settings and features will be set.
656
-
657
- Returns:
658
- Reports of any issues that were handled, but caused the state to not be exactly restored.
659
- """
660
- request = dto.SetStateRequest(
661
- interface_id=self.connection.interface_id,
662
- device=self.device_address,
663
- state=state,
664
- device_only=device_only,
665
- )
666
- response = await call_async(
667
- "device/set_device_state",
668
- request,
669
- SetStateDeviceResponse.from_binary)
670
- return response
671
-
672
- def can_set_state(
673
- self,
674
- state: str,
675
- firmware_version: Optional[FirmwareVersion] = None
676
- ) -> CanSetStateDeviceResponse:
677
- """
678
- Checks if a state can be applied to this device.
679
- This only covers exceptions that can be determined statically such as mismatches of ID or version,
680
- the process of applying the state can still fail when running.
681
-
682
- Args:
683
- state: The state object to check against.
684
- firmware_version: The firmware version of the device to apply the state to.
685
- Use this to ensure the state will still be compatible after an update.
686
-
687
- Returns:
688
- An object listing errors that come up when trying to set the state.
689
- """
690
- request = dto.CanSetStateRequest(
691
- interface_id=self.connection.interface_id,
692
- device=self.device_address,
693
- state=state,
694
- firmware_version=firmware_version,
695
- )
696
- response = call(
697
- "device/can_set_state",
698
- request,
699
- CanSetStateDeviceResponse.from_binary)
700
- return response
701
-
702
- async def can_set_state_async(
703
- self,
704
- state: str,
705
- firmware_version: Optional[FirmwareVersion] = None
706
- ) -> CanSetStateDeviceResponse:
707
- """
708
- Checks if a state can be applied to this device.
709
- This only covers exceptions that can be determined statically such as mismatches of ID or version,
710
- the process of applying the state can still fail when running.
711
-
712
- Args:
713
- state: The state object to check against.
714
- firmware_version: The firmware version of the device to apply the state to.
715
- Use this to ensure the state will still be compatible after an update.
716
-
717
- Returns:
718
- An object listing errors that come up when trying to set the state.
719
- """
720
- request = dto.CanSetStateRequest(
721
- interface_id=self.connection.interface_id,
722
- device=self.device_address,
723
- state=state,
724
- firmware_version=firmware_version,
725
- )
726
- response = await call_async(
727
- "device/can_set_state",
728
- request,
729
- CanSetStateDeviceResponse.from_binary)
730
- return response
731
-
732
- def wait_to_respond(
733
- self,
734
- timeout: float
735
- ) -> None:
736
- """
737
- Waits for the device to start responding to messages.
738
- Useful to call after resetting the device.
739
- Throws RequestTimeoutException upon timeout.
740
-
741
- Args:
742
- timeout: For how long to wait in milliseconds for the device to start responding.
743
- """
744
- request = dto.WaitToRespondRequest(
745
- interface_id=self.connection.interface_id,
746
- device=self.device_address,
747
- timeout=timeout,
748
- )
749
- call("device/wait_to_respond", request)
750
-
751
- async def wait_to_respond_async(
752
- self,
753
- timeout: float
754
- ) -> None:
755
- """
756
- Waits for the device to start responding to messages.
757
- Useful to call after resetting the device.
758
- Throws RequestTimeoutException upon timeout.
759
-
760
- Args:
761
- timeout: For how long to wait in milliseconds for the device to start responding.
762
- """
763
- request = dto.WaitToRespondRequest(
764
- interface_id=self.connection.interface_id,
765
- device=self.device_address,
766
- timeout=timeout,
767
- )
768
- await call_async("device/wait_to_respond", request)
769
-
770
- def renumber(
771
- self,
772
- address: int
773
- ) -> 'Device':
774
- """
775
- Changes the address of this device.
776
- After the address is successfully changed, the existing device class instance no longer represents the device.
777
- Instead, use the new device instance returned by this method.
778
-
779
- Args:
780
- address: The new address to assign to the device.
781
-
782
- Returns:
783
- New device instance with the new address.
784
- """
785
- if address < 1 or address > 99:
786
- raise ValueError('Invalid value; device addresses are numbered from 1 to 99.')
787
-
788
- request = dto.RenumberRequest(
789
- interface_id=self.connection.interface_id,
790
- device=self.device_address,
791
- address=address,
792
- )
793
- response = call(
794
- "device/renumber",
795
- request,
796
- dto.IntResponse.from_binary)
797
- return Device(self.connection, response.value)
798
-
799
- async def renumber_async(
800
- self,
801
- address: int
802
- ) -> 'Device':
803
- """
804
- Changes the address of this device.
805
- After the address is successfully changed, the existing device class instance no longer represents the device.
806
- Instead, use the new device instance returned by this method.
807
-
808
- Args:
809
- address: The new address to assign to the device.
810
-
811
- Returns:
812
- New device instance with the new address.
813
- """
814
- if address < 1 or address > 99:
815
- raise ValueError('Invalid value; device addresses are numbered from 1 to 99.')
816
-
817
- request = dto.RenumberRequest(
818
- interface_id=self.connection.interface_id,
819
- device=self.device_address,
820
- address=address,
821
- )
822
- response = await call_async(
823
- "device/renumber",
824
- request,
825
- dto.IntResponse.from_binary)
826
- return Device(self.connection, response.value)
827
-
828
- def restore(
829
- self,
830
- hard: bool = False
831
- ) -> None:
832
- """
833
- Restores most of the settings to their default values.
834
- Deletes all triggers, stream and PVT buffers, servo tunings.
835
- Deletes all zaber storage keys.
836
- Disables locksteps, unparks axes.
837
- Preserves storage, communication settings, peripherals (unless hard is specified).
838
- The device needs to be identified again after the restore.
839
-
840
- Args:
841
- hard: If true, completely erases device's memory. The device also resets.
842
- """
843
- request = dto.DeviceRestoreRequest(
844
- interface_id=self.connection.interface_id,
845
- device=self.device_address,
846
- hard=hard,
847
- )
848
- call("device/restore", request)
849
-
850
- async def restore_async(
851
- self,
852
- hard: bool = False
853
- ) -> None:
854
- """
855
- Restores most of the settings to their default values.
856
- Deletes all triggers, stream and PVT buffers, servo tunings.
857
- Deletes all zaber storage keys.
858
- Disables locksteps, unparks axes.
859
- Preserves storage, communication settings, peripherals (unless hard is specified).
860
- The device needs to be identified again after the restore.
861
-
862
- Args:
863
- hard: If true, completely erases device's memory. The device also resets.
864
- """
865
- request = dto.DeviceRestoreRequest(
866
- interface_id=self.connection.interface_id,
867
- device=self.device_address,
868
- hard=hard,
869
- )
870
- await call_async("device/restore", request)
871
-
872
- def __retrieve_identity(
873
- self
874
- ) -> DeviceIdentity:
875
- """
876
- Returns identity.
877
-
878
- Returns:
879
- Device identity.
880
- """
881
- request = dto.DeviceEmptyRequest(
882
- interface_id=self.connection.interface_id,
883
- device=self.device_address,
884
- )
885
- response = call_sync(
886
- "device/get_identity",
887
- request,
888
- DeviceIdentity.from_binary)
889
- return response
890
-
891
- def __retrieve_is_identified(
892
- self
893
- ) -> bool:
894
- """
895
- Returns whether or not the device have been identified.
896
-
897
- Returns:
898
- True if the device has already been identified. False otherwise.
899
- """
900
- request = dto.DeviceEmptyRequest(
901
- interface_id=self.connection.interface_id,
902
- device=self.device_address,
903
- )
904
- response = call_sync(
905
- "device/get_is_identified",
906
- request,
907
- dto.BoolResponse.from_binary)
908
- return response.value
1
+ # ===== THIS FILE IS GENERATED FROM A TEMPLATE ===== #
2
+ # ============== DO NOT EDIT DIRECTLY ============== #
3
+
4
+ from typing import TYPE_CHECKING, List, Optional
5
+ from ..call import call, call_async, call_sync
6
+
7
+ from ..dto import requests as dto
8
+ from .device_settings import DeviceSettings
9
+ from .axis import Axis
10
+ from .all_axes import AllAxes
11
+ from .warnings import Warnings
12
+ from ..dto.ascii.device_identity import DeviceIdentity
13
+ from .device_io import DeviceIO
14
+ from ..dto.ascii.response import Response
15
+ from .lockstep import Lockstep
16
+ from .oscilloscope import Oscilloscope
17
+ from .storage import DeviceStorage
18
+ from ..dto.ascii.can_set_state_device_response import CanSetStateDeviceResponse
19
+ from .pvt import Pvt
20
+ from .triggers import Triggers
21
+ from .streams import Streams
22
+ from ..dto.firmware_version import FirmwareVersion
23
+ from ..dto.measurement import Measurement
24
+ from ..dto.ascii.set_state_device_response import SetStateDeviceResponse
25
+
26
+ if TYPE_CHECKING:
27
+ from .connection import Connection
28
+
29
+
30
+ class Device:
31
+ """
32
+ Represents the controller part of one device - may be either a standalone controller or an integrated controller.
33
+ """
34
+
35
+ @property
36
+ def connection(self) -> 'Connection':
37
+ """
38
+ Connection of this device.
39
+ """
40
+ return self._connection
41
+
42
+ @property
43
+ def device_address(self) -> int:
44
+ """
45
+ The device address uniquely identifies the device on the connection.
46
+ It can be configured or automatically assigned by the renumber command.
47
+ """
48
+ return self._device_address
49
+
50
+ @property
51
+ def settings(self) -> DeviceSettings:
52
+ """
53
+ Settings and properties of this device.
54
+ """
55
+ return self._settings
56
+
57
+ @property
58
+ def storage(self) -> DeviceStorage:
59
+ """
60
+ Key-value storage of this device.
61
+ """
62
+ return self._storage
63
+
64
+ @property
65
+ def io(self) -> DeviceIO:
66
+ """
67
+ I/O channels of this device.
68
+ """
69
+ return self._io
70
+
71
+ @property
72
+ def all_axes(self) -> AllAxes:
73
+ """
74
+ Virtual axis which allows you to target all axes of this device.
75
+ """
76
+ return self._all_axes
77
+
78
+ @property
79
+ def warnings(self) -> Warnings:
80
+ """
81
+ Warnings and faults of this device and all its axes.
82
+ """
83
+ return self._warnings
84
+
85
+ @property
86
+ def identity(self) -> DeviceIdentity:
87
+ """
88
+ Identity of the device.
89
+ """
90
+ return self.__retrieve_identity()
91
+
92
+ @property
93
+ def is_identified(self) -> bool:
94
+ """
95
+ Indicates whether or not the device has been identified.
96
+ """
97
+ return self.__retrieve_is_identified()
98
+
99
+ @property
100
+ def oscilloscope(self) -> Oscilloscope:
101
+ """
102
+ Oscilloscope recording helper for this device.
103
+ Requires at least Firmware 7.00.
104
+ """
105
+ return self._oscilloscope
106
+
107
+ @property
108
+ def device_id(self) -> int:
109
+ """
110
+ Unique ID of the device hardware.
111
+ """
112
+ return self.identity.device_id
113
+
114
+ @property
115
+ def serial_number(self) -> int:
116
+ """
117
+ Serial number of the device.
118
+ """
119
+ return self.identity.serial_number
120
+
121
+ @property
122
+ def name(self) -> str:
123
+ """
124
+ Name of the product.
125
+ """
126
+ return self.identity.name
127
+
128
+ @property
129
+ def axis_count(self) -> int:
130
+ """
131
+ Number of axes this device has.
132
+ """
133
+ return self.identity.axis_count
134
+
135
+ @property
136
+ def firmware_version(self) -> FirmwareVersion:
137
+ """
138
+ Version of the firmware.
139
+ """
140
+ return self.identity.firmware_version
141
+
142
+ @property
143
+ def is_integrated(self) -> bool:
144
+ """
145
+ The device is an integrated product.
146
+ """
147
+ return self.identity.is_integrated
148
+
149
+ @property
150
+ def label(self) -> str:
151
+ """
152
+ User-assigned label of the device.
153
+ """
154
+ return self.__retrieve_label()
155
+
156
+ @property
157
+ def triggers(self) -> Triggers:
158
+ """
159
+ Triggers for this device.
160
+ Requires at least Firmware 7.06.
161
+ """
162
+ return self._triggers
163
+
164
+ @property
165
+ def streams(self) -> Streams:
166
+ """
167
+ Gets an object that provides access to Streams on this device.
168
+ Requires at least Firmware 7.05.
169
+ """
170
+ return self._streams
171
+
172
+ @property
173
+ def pvt(self) -> Pvt:
174
+ """
175
+ Gets an object that provides access to PVT functions of this device.
176
+ Note that as of ZML v5.0.0, this returns a Pvt object and NOT a PvtSequence object.
177
+ The PvtSequence can now be obtained from the Pvt object.
178
+ Requires at least Firmware 7.33.
179
+ """
180
+ return self._pvt
181
+
182
+ def __init__(self, connection: 'Connection', device_address: int):
183
+ self._connection: 'Connection' = connection
184
+ self._device_address: int = device_address
185
+ self._settings: DeviceSettings = DeviceSettings(self)
186
+ self._storage: DeviceStorage = DeviceStorage(self)
187
+ self._io: DeviceIO = DeviceIO(self)
188
+ self._all_axes: AllAxes = AllAxes(self)
189
+ self._warnings: Warnings = Warnings(self, 0)
190
+ self._oscilloscope: Oscilloscope = Oscilloscope(self)
191
+ self._triggers: Triggers = Triggers(self)
192
+ self._streams: Streams = Streams(self)
193
+ self._pvt: Pvt = Pvt(self)
194
+
195
+ def identify(
196
+ self,
197
+ assume_version: Optional[FirmwareVersion] = None
198
+ ) -> DeviceIdentity:
199
+ """
200
+ Queries the device and the database, gathering information about the product.
201
+ Without this information features such as unit conversions will not work.
202
+ Usually, called automatically by detect devices method.
203
+
204
+ Args:
205
+ assume_version: The identification assumes the specified firmware version
206
+ instead of the version queried from the device.
207
+ Providing this argument can lead to unexpected compatibility issues.
208
+
209
+ Returns:
210
+ Device identification data.
211
+ """
212
+ request = dto.DeviceIdentifyRequest(
213
+ interface_id=self.connection.interface_id,
214
+ device=self.device_address,
215
+ assume_version=assume_version,
216
+ )
217
+ response = call(
218
+ "device/identify",
219
+ request,
220
+ DeviceIdentity.from_binary)
221
+ return response
222
+
223
+ async def identify_async(
224
+ self,
225
+ assume_version: Optional[FirmwareVersion] = None
226
+ ) -> DeviceIdentity:
227
+ """
228
+ Queries the device and the database, gathering information about the product.
229
+ Without this information features such as unit conversions will not work.
230
+ Usually, called automatically by detect devices method.
231
+
232
+ Args:
233
+ assume_version: The identification assumes the specified firmware version
234
+ instead of the version queried from the device.
235
+ Providing this argument can lead to unexpected compatibility issues.
236
+
237
+ Returns:
238
+ Device identification data.
239
+ """
240
+ request = dto.DeviceIdentifyRequest(
241
+ interface_id=self.connection.interface_id,
242
+ device=self.device_address,
243
+ assume_version=assume_version,
244
+ )
245
+ response = await call_async(
246
+ "device/identify",
247
+ request,
248
+ DeviceIdentity.from_binary)
249
+ return response
250
+
251
+ def generic_command(
252
+ self,
253
+ command: str,
254
+ axis: int = 0,
255
+ check_errors: bool = True,
256
+ timeout: int = 0
257
+ ) -> Response:
258
+ """
259
+ Sends a generic ASCII command to this device.
260
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
261
+
262
+ Args:
263
+ command: Command and its parameters.
264
+ axis: Optional axis number to send the command to.
265
+ check_errors: Controls whether to throw an exception when the device rejects the command.
266
+ timeout: The timeout, in milliseconds, for a device to respond to the command.
267
+ Overrides the connection default request timeout.
268
+
269
+ Returns:
270
+ A response to the command.
271
+ """
272
+ request = dto.GenericCommandRequest(
273
+ interface_id=self.connection.interface_id,
274
+ device=self.device_address,
275
+ command=command,
276
+ axis=axis,
277
+ check_errors=check_errors,
278
+ timeout=timeout,
279
+ )
280
+ response = call(
281
+ "interface/generic_command",
282
+ request,
283
+ Response.from_binary)
284
+ return response
285
+
286
+ async def generic_command_async(
287
+ self,
288
+ command: str,
289
+ axis: int = 0,
290
+ check_errors: bool = True,
291
+ timeout: int = 0
292
+ ) -> Response:
293
+ """
294
+ Sends a generic ASCII command to this device.
295
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
296
+
297
+ Args:
298
+ command: Command and its parameters.
299
+ axis: Optional axis number to send the command to.
300
+ check_errors: Controls whether to throw an exception when the device rejects the command.
301
+ timeout: The timeout, in milliseconds, for a device to respond to the command.
302
+ Overrides the connection default request timeout.
303
+
304
+ Returns:
305
+ A response to the command.
306
+ """
307
+ request = dto.GenericCommandRequest(
308
+ interface_id=self.connection.interface_id,
309
+ device=self.device_address,
310
+ command=command,
311
+ axis=axis,
312
+ check_errors=check_errors,
313
+ timeout=timeout,
314
+ )
315
+ response = await call_async(
316
+ "interface/generic_command",
317
+ request,
318
+ Response.from_binary)
319
+ return response
320
+
321
+ def generic_command_multi_response(
322
+ self,
323
+ command: str,
324
+ axis: int = 0,
325
+ check_errors: bool = True,
326
+ timeout: int = 0
327
+ ) -> List[Response]:
328
+ """
329
+ Sends a generic ASCII command to this device and expect multiple responses.
330
+ Responses are returned in order of arrival.
331
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
332
+
333
+ Args:
334
+ command: Command and its parameters.
335
+ axis: Optional axis number to send the command to.
336
+ check_errors: Controls whether to throw an exception when a device rejects the command.
337
+ timeout: The timeout, in milliseconds, for a device to respond to the command.
338
+ Overrides the connection default request timeout.
339
+
340
+ Returns:
341
+ All responses to the command.
342
+ """
343
+ request = dto.GenericCommandRequest(
344
+ interface_id=self.connection.interface_id,
345
+ device=self.device_address,
346
+ command=command,
347
+ axis=axis,
348
+ check_errors=check_errors,
349
+ timeout=timeout,
350
+ )
351
+ response = call(
352
+ "interface/generic_command_multi_response",
353
+ request,
354
+ dto.GenericCommandResponseCollection.from_binary)
355
+ return response.responses
356
+
357
+ async def generic_command_multi_response_async(
358
+ self,
359
+ command: str,
360
+ axis: int = 0,
361
+ check_errors: bool = True,
362
+ timeout: int = 0
363
+ ) -> List[Response]:
364
+ """
365
+ Sends a generic ASCII command to this device and expect multiple responses.
366
+ Responses are returned in order of arrival.
367
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
368
+
369
+ Args:
370
+ command: Command and its parameters.
371
+ axis: Optional axis number to send the command to.
372
+ check_errors: Controls whether to throw an exception when a device rejects the command.
373
+ timeout: The timeout, in milliseconds, for a device to respond to the command.
374
+ Overrides the connection default request timeout.
375
+
376
+ Returns:
377
+ All responses to the command.
378
+ """
379
+ request = dto.GenericCommandRequest(
380
+ interface_id=self.connection.interface_id,
381
+ device=self.device_address,
382
+ command=command,
383
+ axis=axis,
384
+ check_errors=check_errors,
385
+ timeout=timeout,
386
+ )
387
+ response = await call_async(
388
+ "interface/generic_command_multi_response",
389
+ request,
390
+ dto.GenericCommandResponseCollection.from_binary)
391
+ return response.responses
392
+
393
+ def generic_command_no_response(
394
+ self,
395
+ command: str,
396
+ axis: int = 0
397
+ ) -> None:
398
+ """
399
+ Sends a generic ASCII command to this device without expecting a response and without adding a message ID
400
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
401
+
402
+ Args:
403
+ command: Command and its parameters.
404
+ axis: Optional axis number to send the command to.
405
+ Specifying -1 omits the number completely.
406
+ """
407
+ request = dto.GenericCommandRequest(
408
+ interface_id=self.connection.interface_id,
409
+ device=self.device_address,
410
+ command=command,
411
+ axis=axis,
412
+ )
413
+ call("interface/generic_command_no_response", request)
414
+
415
+ async def generic_command_no_response_async(
416
+ self,
417
+ command: str,
418
+ axis: int = 0
419
+ ) -> None:
420
+ """
421
+ Sends a generic ASCII command to this device without expecting a response and without adding a message ID
422
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
423
+
424
+ Args:
425
+ command: Command and its parameters.
426
+ axis: Optional axis number to send the command to.
427
+ Specifying -1 omits the number completely.
428
+ """
429
+ request = dto.GenericCommandRequest(
430
+ interface_id=self.connection.interface_id,
431
+ device=self.device_address,
432
+ command=command,
433
+ axis=axis,
434
+ )
435
+ await call_async("interface/generic_command_no_response", request)
436
+
437
+ def get_axis(
438
+ self,
439
+ axis_number: int
440
+ ) -> Axis:
441
+ """
442
+ Gets an Axis class instance which allows you to control a particular axis on this device.
443
+ Axes are numbered from 1.
444
+
445
+ Args:
446
+ axis_number: Number of axis intended to control.
447
+
448
+ Returns:
449
+ Axis instance.
450
+ """
451
+ if axis_number <= 0:
452
+ raise ValueError('Invalid value; physical axes are numbered from 1.')
453
+
454
+ return Axis(self, axis_number)
455
+
456
+ def get_lockstep(
457
+ self,
458
+ lockstep_group_id: int
459
+ ) -> Lockstep:
460
+ """
461
+ Gets a Lockstep class instance which allows you to control a particular lockstep group on the device.
462
+ Requires at least Firmware 6.15 or 7.11.
463
+
464
+ Args:
465
+ lockstep_group_id: The ID of the lockstep group to control. Lockstep group IDs start at one.
466
+
467
+ Returns:
468
+ Lockstep instance.
469
+ """
470
+ if lockstep_group_id <= 0:
471
+ raise ValueError('Invalid value; lockstep groups are numbered from 1.')
472
+
473
+ return Lockstep(self, lockstep_group_id)
474
+
475
+ def prepare_command(
476
+ self,
477
+ command_template: str,
478
+ *parameters: Measurement
479
+ ) -> str:
480
+ """
481
+ Formats parameters into a command and performs unit conversions.
482
+ Parameters in the command template are denoted by a question mark.
483
+ Command returned is only valid for this device.
484
+ Unit conversion is not supported for commands where axes can be remapped, such as stream and PVT commands.
485
+ For more information refer to: [ASCII Protocol Manual](https://www.zaber.com/protocol-manual#topic_commands).
486
+
487
+ Args:
488
+ command_template: Template of a command to prepare. Parameters are denoted by question marks.
489
+ parameters: Variable number of command parameters.
490
+
491
+ Returns:
492
+ Command with converted parameters.
493
+ """
494
+ request = dto.PrepareCommandRequest(
495
+ interface_id=self.connection.interface_id,
496
+ device=self.device_address,
497
+ command_template=command_template,
498
+ parameters=list(parameters),
499
+ )
500
+ response = call_sync(
501
+ "device/prepare_command",
502
+ request,
503
+ dto.StringResponse.from_binary)
504
+ return response.value
505
+
506
+ def set_label(
507
+ self,
508
+ label: str
509
+ ) -> None:
510
+ """
511
+ Sets the user-assigned device label.
512
+ The label is stored on the controller and recognized by other software.
513
+
514
+ Args:
515
+ label: Label to set.
516
+ """
517
+ request = dto.DeviceSetStorageRequest(
518
+ interface_id=self.connection.interface_id,
519
+ device=self.device_address,
520
+ value=label,
521
+ )
522
+ call("device/set_label", request)
523
+
524
+ async def set_label_async(
525
+ self,
526
+ label: str
527
+ ) -> None:
528
+ """
529
+ Sets the user-assigned device label.
530
+ The label is stored on the controller and recognized by other software.
531
+
532
+ Args:
533
+ label: Label to set.
534
+ """
535
+ request = dto.DeviceSetStorageRequest(
536
+ interface_id=self.connection.interface_id,
537
+ device=self.device_address,
538
+ value=label,
539
+ )
540
+ await call_async("device/set_label", request)
541
+
542
+ def __retrieve_label(
543
+ self
544
+ ) -> str:
545
+ """
546
+ Gets the device name.
547
+
548
+ Returns:
549
+ The label.
550
+ """
551
+ request = dto.AxisEmptyRequest(
552
+ interface_id=self.connection.interface_id,
553
+ device=self.device_address,
554
+ )
555
+ response = call_sync(
556
+ "device/get_label",
557
+ request,
558
+ dto.StringResponse.from_binary)
559
+ return response.value
560
+
561
+ def __repr__(
562
+ self
563
+ ) -> str:
564
+ """
565
+ Returns a string that represents the device.
566
+
567
+ Returns:
568
+ A string that represents the device.
569
+ """
570
+ request = dto.AxisToStringRequest(
571
+ interface_id=self.connection.interface_id,
572
+ device=self.device_address,
573
+ )
574
+ response = call_sync(
575
+ "device/device_to_string",
576
+ request,
577
+ dto.StringResponse.from_binary)
578
+ return response.value
579
+
580
+ def get_state(
581
+ self
582
+ ) -> str:
583
+ """
584
+ Returns a serialization of the current device state that can be saved and reapplied.
585
+
586
+ Returns:
587
+ A serialization of the current state of the device.
588
+ """
589
+ request = dto.AxisEmptyRequest(
590
+ interface_id=self.connection.interface_id,
591
+ device=self.device_address,
592
+ )
593
+ response = call(
594
+ "device/get_state",
595
+ request,
596
+ dto.StringResponse.from_binary)
597
+ return response.value
598
+
599
+ async def get_state_async(
600
+ self
601
+ ) -> str:
602
+ """
603
+ Returns a serialization of the current device state that can be saved and reapplied.
604
+
605
+ Returns:
606
+ A serialization of the current state of the device.
607
+ """
608
+ request = dto.AxisEmptyRequest(
609
+ interface_id=self.connection.interface_id,
610
+ device=self.device_address,
611
+ )
612
+ response = await call_async(
613
+ "device/get_state",
614
+ request,
615
+ dto.StringResponse.from_binary)
616
+ return response.value
617
+
618
+ def set_state(
619
+ self,
620
+ state: str,
621
+ device_only: bool = False
622
+ ) -> SetStateDeviceResponse:
623
+ """
624
+ Applies a saved state to this device.
625
+
626
+ Args:
627
+ state: The state object to apply to this device.
628
+ device_only: If true, only device scope settings and features will be set.
629
+
630
+ Returns:
631
+ Reports of any issues that were handled, but caused the state to not be exactly restored.
632
+ """
633
+ request = dto.SetStateRequest(
634
+ interface_id=self.connection.interface_id,
635
+ device=self.device_address,
636
+ state=state,
637
+ device_only=device_only,
638
+ )
639
+ response = call(
640
+ "device/set_device_state",
641
+ request,
642
+ SetStateDeviceResponse.from_binary)
643
+ return response
644
+
645
+ async def set_state_async(
646
+ self,
647
+ state: str,
648
+ device_only: bool = False
649
+ ) -> SetStateDeviceResponse:
650
+ """
651
+ Applies a saved state to this device.
652
+
653
+ Args:
654
+ state: The state object to apply to this device.
655
+ device_only: If true, only device scope settings and features will be set.
656
+
657
+ Returns:
658
+ Reports of any issues that were handled, but caused the state to not be exactly restored.
659
+ """
660
+ request = dto.SetStateRequest(
661
+ interface_id=self.connection.interface_id,
662
+ device=self.device_address,
663
+ state=state,
664
+ device_only=device_only,
665
+ )
666
+ response = await call_async(
667
+ "device/set_device_state",
668
+ request,
669
+ SetStateDeviceResponse.from_binary)
670
+ return response
671
+
672
+ def can_set_state(
673
+ self,
674
+ state: str,
675
+ firmware_version: Optional[FirmwareVersion] = None
676
+ ) -> CanSetStateDeviceResponse:
677
+ """
678
+ Checks if a state can be applied to this device.
679
+ This only covers exceptions that can be determined statically such as mismatches of ID or version,
680
+ the process of applying the state can still fail when running.
681
+
682
+ Args:
683
+ state: The state object to check against.
684
+ firmware_version: The firmware version of the device to apply the state to.
685
+ Use this to ensure the state will still be compatible after an update.
686
+
687
+ Returns:
688
+ An object listing errors that come up when trying to set the state.
689
+ """
690
+ request = dto.CanSetStateRequest(
691
+ interface_id=self.connection.interface_id,
692
+ device=self.device_address,
693
+ state=state,
694
+ firmware_version=firmware_version,
695
+ )
696
+ response = call(
697
+ "device/can_set_state",
698
+ request,
699
+ CanSetStateDeviceResponse.from_binary)
700
+ return response
701
+
702
+ async def can_set_state_async(
703
+ self,
704
+ state: str,
705
+ firmware_version: Optional[FirmwareVersion] = None
706
+ ) -> CanSetStateDeviceResponse:
707
+ """
708
+ Checks if a state can be applied to this device.
709
+ This only covers exceptions that can be determined statically such as mismatches of ID or version,
710
+ the process of applying the state can still fail when running.
711
+
712
+ Args:
713
+ state: The state object to check against.
714
+ firmware_version: The firmware version of the device to apply the state to.
715
+ Use this to ensure the state will still be compatible after an update.
716
+
717
+ Returns:
718
+ An object listing errors that come up when trying to set the state.
719
+ """
720
+ request = dto.CanSetStateRequest(
721
+ interface_id=self.connection.interface_id,
722
+ device=self.device_address,
723
+ state=state,
724
+ firmware_version=firmware_version,
725
+ )
726
+ response = await call_async(
727
+ "device/can_set_state",
728
+ request,
729
+ CanSetStateDeviceResponse.from_binary)
730
+ return response
731
+
732
+ def wait_to_respond(
733
+ self,
734
+ timeout: float
735
+ ) -> None:
736
+ """
737
+ Waits for the device to start responding to messages.
738
+ Useful to call after resetting the device.
739
+ Throws RequestTimeoutException upon timeout.
740
+
741
+ Args:
742
+ timeout: For how long to wait in milliseconds for the device to start responding.
743
+ """
744
+ request = dto.WaitToRespondRequest(
745
+ interface_id=self.connection.interface_id,
746
+ device=self.device_address,
747
+ timeout=timeout,
748
+ )
749
+ call("device/wait_to_respond", request)
750
+
751
+ async def wait_to_respond_async(
752
+ self,
753
+ timeout: float
754
+ ) -> None:
755
+ """
756
+ Waits for the device to start responding to messages.
757
+ Useful to call after resetting the device.
758
+ Throws RequestTimeoutException upon timeout.
759
+
760
+ Args:
761
+ timeout: For how long to wait in milliseconds for the device to start responding.
762
+ """
763
+ request = dto.WaitToRespondRequest(
764
+ interface_id=self.connection.interface_id,
765
+ device=self.device_address,
766
+ timeout=timeout,
767
+ )
768
+ await call_async("device/wait_to_respond", request)
769
+
770
+ def renumber(
771
+ self,
772
+ address: int
773
+ ) -> 'Device':
774
+ """
775
+ Changes the address of this device.
776
+ After the address is successfully changed, the existing device class instance no longer represents the device.
777
+ Instead, use the new device instance returned by this method.
778
+
779
+ Args:
780
+ address: The new address to assign to the device.
781
+
782
+ Returns:
783
+ New device instance with the new address.
784
+ """
785
+ if address < 1 or address > 99:
786
+ raise ValueError('Invalid value; device addresses are numbered from 1 to 99.')
787
+
788
+ request = dto.RenumberRequest(
789
+ interface_id=self.connection.interface_id,
790
+ device=self.device_address,
791
+ address=address,
792
+ )
793
+ response = call(
794
+ "device/renumber",
795
+ request,
796
+ dto.IntResponse.from_binary)
797
+ return Device(self.connection, response.value)
798
+
799
+ async def renumber_async(
800
+ self,
801
+ address: int
802
+ ) -> 'Device':
803
+ """
804
+ Changes the address of this device.
805
+ After the address is successfully changed, the existing device class instance no longer represents the device.
806
+ Instead, use the new device instance returned by this method.
807
+
808
+ Args:
809
+ address: The new address to assign to the device.
810
+
811
+ Returns:
812
+ New device instance with the new address.
813
+ """
814
+ if address < 1 or address > 99:
815
+ raise ValueError('Invalid value; device addresses are numbered from 1 to 99.')
816
+
817
+ request = dto.RenumberRequest(
818
+ interface_id=self.connection.interface_id,
819
+ device=self.device_address,
820
+ address=address,
821
+ )
822
+ response = await call_async(
823
+ "device/renumber",
824
+ request,
825
+ dto.IntResponse.from_binary)
826
+ return Device(self.connection, response.value)
827
+
828
+ def restore(
829
+ self,
830
+ hard: bool = False
831
+ ) -> None:
832
+ """
833
+ Restores most of the settings to their default values.
834
+ Deletes all triggers, stream and PVT buffers, servo tunings.
835
+ Deletes all zaber storage keys.
836
+ Disables locksteps, unparks axes.
837
+ Preserves storage, communication settings, peripherals (unless hard is specified).
838
+ The device needs to be identified again after the restore.
839
+
840
+ Args:
841
+ hard: If true, completely erases device's memory. The device also resets.
842
+ """
843
+ request = dto.DeviceRestoreRequest(
844
+ interface_id=self.connection.interface_id,
845
+ device=self.device_address,
846
+ hard=hard,
847
+ )
848
+ call("device/restore", request)
849
+
850
+ async def restore_async(
851
+ self,
852
+ hard: bool = False
853
+ ) -> None:
854
+ """
855
+ Restores most of the settings to their default values.
856
+ Deletes all triggers, stream and PVT buffers, servo tunings.
857
+ Deletes all zaber storage keys.
858
+ Disables locksteps, unparks axes.
859
+ Preserves storage, communication settings, peripherals (unless hard is specified).
860
+ The device needs to be identified again after the restore.
861
+
862
+ Args:
863
+ hard: If true, completely erases device's memory. The device also resets.
864
+ """
865
+ request = dto.DeviceRestoreRequest(
866
+ interface_id=self.connection.interface_id,
867
+ device=self.device_address,
868
+ hard=hard,
869
+ )
870
+ await call_async("device/restore", request)
871
+
872
+ def __retrieve_identity(
873
+ self
874
+ ) -> DeviceIdentity:
875
+ """
876
+ Returns identity.
877
+
878
+ Returns:
879
+ Device identity.
880
+ """
881
+ request = dto.DeviceEmptyRequest(
882
+ interface_id=self.connection.interface_id,
883
+ device=self.device_address,
884
+ )
885
+ response = call_sync(
886
+ "device/get_identity",
887
+ request,
888
+ DeviceIdentity.from_binary)
889
+ return response
890
+
891
+ def __retrieve_is_identified(
892
+ self
893
+ ) -> bool:
894
+ """
895
+ Returns whether or not the device have been identified.
896
+
897
+ Returns:
898
+ True if the device has already been identified. False otherwise.
899
+ """
900
+ request = dto.DeviceEmptyRequest(
901
+ interface_id=self.connection.interface_id,
902
+ device=self.device_address,
903
+ )
904
+ response = call_sync(
905
+ "device/get_is_identified",
906
+ request,
907
+ dto.BoolResponse.from_binary)
908
+ return response.value