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.
- zaber_motion/__init__.py +103 -103
- zaber_motion/ascii/__init__.py +73 -73
- zaber_motion/ascii/all_axes.py +352 -352
- zaber_motion/ascii/axis.py +1673 -1666
- zaber_motion/ascii/axis_group.py +391 -391
- zaber_motion/ascii/axis_settings.py +752 -752
- zaber_motion/ascii/connection.py +1174 -1174
- zaber_motion/ascii/device.py +908 -908
- zaber_motion/ascii/device_io.py +1170 -1170
- zaber_motion/ascii/device_settings.py +735 -735
- zaber_motion/ascii/lockstep.py +1184 -1184
- zaber_motion/ascii/oscilloscope.py +635 -635
- zaber_motion/ascii/oscilloscope_data.py +240 -240
- zaber_motion/ascii/pvt.py +105 -105
- zaber_motion/ascii/pvt_buffer.py +146 -146
- zaber_motion/ascii/pvt_io.py +630 -630
- zaber_motion/ascii/pvt_sequence.py +1530 -1530
- zaber_motion/ascii/servo_tuner.py +637 -637
- zaber_motion/ascii/setting_constants.py +1755 -1755
- zaber_motion/ascii/storage.py +905 -905
- zaber_motion/ascii/stream.py +2182 -2182
- zaber_motion/ascii/stream_buffer.py +101 -101
- zaber_motion/ascii/stream_io.py +700 -700
- zaber_motion/ascii/streams.py +105 -105
- zaber_motion/ascii/transport.py +202 -202
- zaber_motion/ascii/trigger.py +886 -886
- zaber_motion/ascii/triggers.py +241 -241
- zaber_motion/ascii/warning_flags.py +178 -178
- zaber_motion/ascii/warnings.py +152 -152
- zaber_motion/async_utils.py +46 -46
- zaber_motion/binary/__init__.py +14 -14
- zaber_motion/binary/connection.py +648 -648
- zaber_motion/binary/device.py +924 -924
- zaber_motion/binary/device_settings.py +121 -121
- zaber_motion/bindings.py +50 -50
- zaber_motion/call.py +198 -198
- zaber_motion/convert_exception.py +138 -138
- zaber_motion/dto/__init__.py +11 -11
- zaber_motion/dto/ascii/__init__.py +46 -46
- zaber_motion/dto/ascii/alert_event.py +110 -110
- zaber_motion/dto/ascii/axis_identity.py +134 -117
- zaber_motion/dto/ascii/axis_type.py +14 -14
- zaber_motion/dto/ascii/can_set_state_axis_response.py +69 -69
- zaber_motion/dto/ascii/can_set_state_device_response.py +75 -75
- zaber_motion/dto/ascii/conversion_factor.py +81 -81
- zaber_motion/dto/ascii/device_identity.py +136 -136
- zaber_motion/dto/ascii/device_io_info.py +108 -108
- zaber_motion/dto/ascii/digital_output_action.py +13 -13
- zaber_motion/dto/ascii/get_axis_setting.py +64 -64
- zaber_motion/dto/ascii/get_axis_setting_result.py +81 -81
- zaber_motion/dto/ascii/get_setting.py +88 -88
- zaber_motion/dto/ascii/get_setting_result.py +87 -87
- zaber_motion/dto/ascii/io_port_label.py +84 -84
- zaber_motion/dto/ascii/io_port_type.py +14 -14
- zaber_motion/dto/ascii/lockstep_axes.py +108 -108
- zaber_motion/dto/ascii/measurement_sequence.py +73 -73
- zaber_motion/dto/ascii/message_type.py +14 -14
- zaber_motion/dto/ascii/optional_measurement_sequence.py +71 -71
- zaber_motion/dto/ascii/oscilloscope_capture_properties.py +116 -116
- zaber_motion/dto/ascii/oscilloscope_data_source.py +11 -11
- zaber_motion/dto/ascii/paramset_info.py +92 -92
- zaber_motion/dto/ascii/pid_tuning.py +125 -125
- zaber_motion/dto/ascii/pvt_axis_definition.py +70 -70
- zaber_motion/dto/ascii/pvt_axis_type.py +11 -11
- zaber_motion/dto/ascii/pvt_csv_data.py +75 -75
- zaber_motion/dto/ascii/pvt_mode.py +12 -12
- zaber_motion/dto/ascii/pvt_sequence_data.py +99 -99
- zaber_motion/dto/ascii/response.py +137 -137
- zaber_motion/dto/ascii/servo_tuning_param.py +66 -66
- zaber_motion/dto/ascii/servo_tuning_paramset.py +21 -21
- zaber_motion/dto/ascii/set_state_axis_response.py +75 -75
- zaber_motion/dto/ascii/set_state_device_response.py +80 -80
- zaber_motion/dto/ascii/simple_tuning.py +118 -118
- zaber_motion/dto/ascii/simple_tuning_param_definition.py +100 -100
- zaber_motion/dto/ascii/stream_axis_definition.py +70 -70
- zaber_motion/dto/ascii/stream_axis_type.py +11 -11
- zaber_motion/dto/ascii/stream_mode.py +13 -13
- zaber_motion/dto/ascii/trigger_action.py +12 -12
- zaber_motion/dto/ascii/trigger_condition.py +15 -15
- zaber_motion/dto/ascii/trigger_enabled_state.py +68 -68
- zaber_motion/dto/ascii/trigger_operation.py +12 -12
- zaber_motion/dto/ascii/trigger_state.py +114 -114
- zaber_motion/dto/ascii/unknown_response_event.py +137 -137
- zaber_motion/dto/axis_address.py +74 -74
- zaber_motion/dto/binary/__init__.py +11 -11
- zaber_motion/dto/binary/binary_settings.py +74 -74
- zaber_motion/dto/binary/command_code.py +106 -106
- zaber_motion/dto/binary/device_identity.py +156 -156
- zaber_motion/dto/binary/device_type.py +12 -12
- zaber_motion/dto/binary/error_code.py +101 -101
- zaber_motion/dto/binary/message.py +91 -91
- zaber_motion/dto/binary/reply_code.py +16 -16
- zaber_motion/dto/binary/reply_only_event.py +91 -91
- zaber_motion/dto/binary/unknown_response_event.py +91 -91
- zaber_motion/dto/channel_address.py +74 -74
- zaber_motion/dto/device_db_source.py +66 -66
- zaber_motion/dto/device_db_source_type.py +11 -11
- zaber_motion/dto/exceptions/__init__.py +24 -24
- zaber_motion/dto/exceptions/binary_command_failed_exception_data.py +57 -57
- zaber_motion/dto/exceptions/command_failed_exception_data.py +151 -151
- zaber_motion/dto/exceptions/command_too_long_exception_data.py +98 -98
- zaber_motion/dto/exceptions/device_address_conflict_exception_data.py +63 -63
- zaber_motion/dto/exceptions/device_db_failed_exception_data.py +74 -74
- zaber_motion/dto/exceptions/device_db_inner_error.py +85 -85
- zaber_motion/dto/exceptions/g_code_execution_exception_data.py +75 -75
- zaber_motion/dto/exceptions/g_code_syntax_exception_data.py +75 -75
- zaber_motion/dto/exceptions/invalid_packet_exception_data.py +63 -63
- zaber_motion/dto/exceptions/invalid_pvt_point.py +69 -69
- zaber_motion/dto/exceptions/invalid_response_exception_data.py +51 -51
- zaber_motion/dto/exceptions/movement_failed_exception_data.py +104 -104
- zaber_motion/dto/exceptions/movement_interrupted_exception_data.py +104 -104
- zaber_motion/dto/exceptions/operation_failed_exception_data.py +104 -104
- zaber_motion/dto/exceptions/pvt_execution_exception_data.py +86 -86
- zaber_motion/dto/exceptions/pvt_movement_failed_exception_data.py +69 -69
- zaber_motion/dto/exceptions/pvt_movement_interrupted_exception_data.py +69 -69
- zaber_motion/dto/exceptions/set_device_state_exception_data.py +176 -176
- zaber_motion/dto/exceptions/set_peripheral_state_exception_data.py +121 -121
- zaber_motion/dto/exceptions/stream_execution_exception_data.py +63 -63
- zaber_motion/dto/exceptions/stream_movement_failed_exception_data.py +69 -69
- zaber_motion/dto/exceptions/stream_movement_interrupted_exception_data.py +69 -69
- zaber_motion/dto/firmware_version.py +91 -91
- zaber_motion/dto/gcode/__init__.py +9 -9
- zaber_motion/dto/gcode/axis_definition.py +74 -74
- zaber_motion/dto/gcode/axis_mapping.py +69 -69
- zaber_motion/dto/gcode/axis_transformation.py +79 -79
- zaber_motion/dto/gcode/device_definition.py +99 -99
- zaber_motion/dto/gcode/translate_message.py +87 -87
- zaber_motion/dto/gcode/translate_result.py +79 -79
- zaber_motion/dto/gcode/translator_config.py +84 -84
- zaber_motion/dto/log_output_mode.py +13 -13
- zaber_motion/dto/measurement.py +67 -67
- zaber_motion/dto/microscopy/__init__.py +6 -6
- zaber_motion/dto/microscopy/autofocus_status.py +57 -57
- zaber_motion/dto/microscopy/microscope_config.py +159 -159
- zaber_motion/dto/microscopy/third_party_components.py +55 -55
- zaber_motion/dto/microscopy/wdi_autofocus_provider_status.py +57 -57
- zaber_motion/dto/named_parameter.py +64 -64
- zaber_motion/dto/product/__init__.py +5 -5
- zaber_motion/dto/product/process_controller_mode.py +13 -13
- zaber_motion/dto/product/process_controller_source.py +72 -72
- zaber_motion/dto/product/process_controller_source_sensor.py +11 -11
- zaber_motion/dto/requests/__init__.py +256 -254
- zaber_motion/dto/requests/alert_event_wrapper.py +82 -82
- zaber_motion/dto/requests/autofocus_focus_request.py +131 -131
- zaber_motion/dto/requests/autofocus_get_objective_params_request.py +121 -121
- zaber_motion/dto/requests/autofocus_get_objective_params_response.py +56 -56
- zaber_motion/dto/requests/autofocus_get_status_response.py +50 -50
- zaber_motion/dto/requests/autofocus_set_objective_params_request.py +141 -141
- zaber_motion/dto/requests/axes_empty_request.py +95 -95
- zaber_motion/dto/requests/axes_get_setting_request.py +121 -121
- zaber_motion/dto/requests/axes_move_request.py +114 -114
- zaber_motion/dto/requests/axis_empty_request.py +79 -79
- zaber_motion/dto/requests/axis_move_type.py +12 -12
- zaber_motion/dto/requests/axis_to_string_request.py +88 -88
- zaber_motion/dto/requests/binary_device_detect_request.py +56 -56
- zaber_motion/dto/requests/binary_device_detect_response.py +57 -57
- zaber_motion/dto/requests/binary_device_get_setting_request.py +89 -89
- zaber_motion/dto/requests/binary_device_home_request.py +88 -88
- zaber_motion/dto/requests/binary_device_move_request.py +111 -111
- zaber_motion/dto/requests/binary_device_set_setting_request.py +100 -100
- zaber_motion/dto/requests/binary_device_stop_request.py +88 -88
- zaber_motion/dto/requests/binary_generic_with_units_request.py +122 -122
- zaber_motion/dto/requests/binary_message_collection.py +56 -56
- zaber_motion/dto/requests/binary_reply_only_event_wrapper.py +82 -82
- zaber_motion/dto/requests/bool_response.py +43 -43
- zaber_motion/dto/requests/can_set_state_axis_response.py +60 -60
- zaber_motion/dto/requests/can_set_state_request.py +100 -100
- zaber_motion/dto/requests/channel_on.py +84 -84
- zaber_motion/dto/requests/channel_set_intensity.py +90 -90
- zaber_motion/dto/requests/check_version_request.py +54 -54
- zaber_motion/dto/requests/custom_interface_close_request.py +60 -60
- zaber_motion/dto/requests/custom_interface_open_response.py +51 -51
- zaber_motion/dto/requests/custom_interface_read_request.py +51 -51
- zaber_motion/dto/requests/custom_interface_write_request.py +60 -60
- zaber_motion/dto/requests/device_cancel_all_outputs_schedule_request.py +80 -80
- zaber_motion/dto/requests/device_cancel_output_schedule_request.py +84 -84
- zaber_motion/dto/requests/device_convert_setting_request.py +116 -116
- zaber_motion/dto/requests/device_detect_request.py +68 -68
- zaber_motion/dto/requests/device_detect_response.py +57 -57
- zaber_motion/dto/requests/device_empty_request.py +65 -65
- zaber_motion/dto/requests/device_get_all_analog_io_request.py +74 -74
- zaber_motion/dto/requests/device_get_all_analog_io_response.py +54 -54
- zaber_motion/dto/requests/device_get_all_digital_io_request.py +74 -74
- zaber_motion/dto/requests/device_get_all_digital_io_response.py +46 -46
- zaber_motion/dto/requests/device_get_analog_io_request.py +88 -88
- zaber_motion/dto/requests/device_get_digital_io_request.py +88 -88
- zaber_motion/dto/requests/device_get_setting_request.py +100 -100
- zaber_motion/dto/requests/device_get_storage_request.py +93 -93
- zaber_motion/dto/requests/device_get_warnings_request.py +84 -84
- zaber_motion/dto/requests/device_get_warnings_response.py +51 -51
- zaber_motion/dto/requests/device_home_request.py +84 -84
- zaber_motion/dto/requests/device_identify_request.py +77 -77
- zaber_motion/dto/requests/device_move_request.py +177 -177
- zaber_motion/dto/requests/device_move_sin_request.py +140 -140
- zaber_motion/dto/requests/device_multi_get_setting_request.py +118 -118
- zaber_motion/dto/requests/device_on_all_request.py +56 -56
- zaber_motion/dto/requests/device_on_all_response.py +57 -57
- zaber_motion/dto/requests/device_restore_request.py +84 -84
- zaber_motion/dto/requests/device_set_all_analog_outputs_request.py +82 -82
- zaber_motion/dto/requests/device_set_all_analog_outputs_schedule_request.py +121 -121
- zaber_motion/dto/requests/device_set_all_digital_outputs_request.py +83 -83
- zaber_motion/dto/requests/device_set_all_digital_outputs_schedule_request.py +122 -122
- zaber_motion/dto/requests/device_set_analog_output_request.py +90 -90
- zaber_motion/dto/requests/device_set_analog_output_schedule_request.py +124 -124
- zaber_motion/dto/requests/device_set_digital_output_request.py +91 -91
- zaber_motion/dto/requests/device_set_digital_output_schedule_request.py +125 -125
- zaber_motion/dto/requests/device_set_lowpass_filter_request.py +102 -102
- zaber_motion/dto/requests/device_set_setting_bool_request.py +93 -93
- zaber_motion/dto/requests/device_set_setting_int_request.py +102 -102
- zaber_motion/dto/requests/device_set_setting_request.py +111 -111
- zaber_motion/dto/requests/device_set_setting_str_request.py +97 -97
- zaber_motion/dto/requests/device_set_storage_bool_request.py +93 -93
- zaber_motion/dto/requests/device_set_storage_number_request.py +99 -99
- zaber_motion/dto/requests/device_set_storage_request.py +102 -102
- zaber_motion/dto/requests/device_set_unit_conversions_request.py +108 -108
- zaber_motion/dto/requests/device_stop_request.py +84 -84
- zaber_motion/dto/requests/device_storage_list_keys_request.py +88 -88
- zaber_motion/dto/requests/device_storage_request.py +88 -88
- zaber_motion/dto/requests/device_type.py +8 -8
- zaber_motion/dto/requests/device_wait_until_idle_request.py +84 -84
- zaber_motion/dto/requests/disconnected_event.py +101 -101
- zaber_motion/dto/requests/double_array_response.py +54 -54
- zaber_motion/dto/requests/double_response.py +48 -48
- zaber_motion/dto/requests/driver_enable_request.py +90 -90
- zaber_motion/dto/requests/empty_autofocus_request.py +107 -107
- zaber_motion/dto/requests/empty_request.py +38 -38
- zaber_motion/dto/requests/errors.py +68 -68
- zaber_motion/dto/requests/find_device_request.py +65 -65
- zaber_motion/dto/requests/find_device_response.py +51 -51
- zaber_motion/dto/requests/forget_devices_request.py +71 -71
- zaber_motion/dto/requests/gateway_event.py +45 -45
- zaber_motion/dto/requests/gateway_request.py +45 -45
- zaber_motion/dto/requests/gateway_response.py +69 -69
- zaber_motion/dto/requests/generic_binary_request.py +107 -107
- zaber_motion/dto/requests/generic_command_request.py +107 -107
- zaber_motion/dto/requests/generic_command_response_collection.py +56 -56
- zaber_motion/dto/requests/get_all_io_port_labels_response.py +56 -56
- zaber_motion/dto/requests/get_axis_setting_results.py +56 -56
- zaber_motion/dto/requests/get_io_port_label_request.py +91 -91
- zaber_motion/dto/requests/get_setting_results.py +56 -56
- zaber_motion/dto/requests/get_simple_tuning_param_definition_response.py +56 -56
- zaber_motion/dto/requests/int_64_response.py +51 -51
- zaber_motion/dto/requests/int_array_response.py +57 -57
- zaber_motion/dto/requests/int_request.py +51 -51
- zaber_motion/dto/requests/int_response.py +51 -51
- zaber_motion/dto/requests/interface_empty_request.py +51 -51
- zaber_motion/dto/requests/interface_type.py +11 -11
- zaber_motion/dto/requests/load_paramset.py +102 -102
- zaber_motion/dto/requests/lockstep_disable_request.py +84 -84
- zaber_motion/dto/requests/lockstep_empty_request.py +79 -79
- zaber_motion/dto/requests/lockstep_enable_request.py +99 -99
- zaber_motion/dto/requests/lockstep_get_axis_numbers_response.py +57 -57
- zaber_motion/dto/requests/lockstep_get_request.py +91 -91
- zaber_motion/dto/requests/lockstep_home_request.py +84 -84
- zaber_motion/dto/requests/lockstep_move_request.py +163 -163
- zaber_motion/dto/requests/lockstep_move_sin_request.py +140 -140
- zaber_motion/dto/requests/lockstep_set_request.py +116 -116
- zaber_motion/dto/requests/lockstep_stop_request.py +84 -84
- zaber_motion/dto/requests/lockstep_wait_until_idle_request.py +84 -84
- zaber_motion/dto/requests/microscope_config_response.py +50 -50
- zaber_motion/dto/requests/microscope_empty_request.py +65 -65
- zaber_motion/dto/requests/microscope_find_request.py +63 -63
- zaber_motion/dto/requests/microscope_init_request.py +70 -70
- zaber_motion/dto/requests/microscope_trigger_camera_request.py +107 -107
- zaber_motion/dto/requests/objective_changer_change_request.py +119 -119
- zaber_motion/dto/requests/objective_changer_create_response.py +79 -79
- zaber_motion/dto/requests/objective_changer_get_current_response.py +51 -51
- zaber_motion/dto/requests/objective_changer_request.py +93 -93
- zaber_motion/dto/requests/objective_changer_set_request.py +116 -116
- zaber_motion/dto/requests/open_binary_interface_request.py +100 -100
- zaber_motion/dto/requests/open_interface_request.py +159 -159
- zaber_motion/dto/requests/open_interface_response.py +51 -51
- zaber_motion/dto/requests/oscilloscope_add_io_channel_request.py +91 -91
- zaber_motion/dto/requests/oscilloscope_add_setting_channel_request.py +88 -88
- zaber_motion/dto/requests/oscilloscope_data_get_request.py +63 -63
- zaber_motion/dto/requests/oscilloscope_data_get_sample_time_request.py +77 -77
- zaber_motion/dto/requests/oscilloscope_data_get_samples_response.py +54 -54
- zaber_motion/dto/requests/oscilloscope_data_identifier.py +51 -51
- zaber_motion/dto/requests/oscilloscope_read_response.py +57 -57
- zaber_motion/dto/requests/oscilloscope_request.py +65 -65
- zaber_motion/dto/requests/oscilloscope_start_request.py +79 -79
- zaber_motion/dto/requests/prepare_command_request.py +108 -108
- zaber_motion/dto/requests/process_on.py +107 -107
- zaber_motion/dto/requests/pvt_buffer_get_sequence_data_request.py +79 -79
- zaber_motion/dto/requests/pvt_csv_request.py +59 -59
- zaber_motion/dto/requests/pvt_generate_positions_request.py +74 -74
- zaber_motion/dto/requests/pvt_generate_velocities_and_times_request.py +96 -96
- zaber_motion/dto/requests/pvt_generate_velocities_request.py +93 -93
- zaber_motion/dto/requests/pvt_load_csv_request.py +45 -45
- zaber_motion/dto/requests/pvt_point_request.py +145 -145
- zaber_motion/dto/requests/pvt_points_request.py +147 -147
- zaber_motion/dto/requests/pvt_save_csv_request.py +74 -74
- zaber_motion/dto/requests/pvt_submit_sequence_data_request.py +93 -93
- zaber_motion/dto/requests/renumber_request.py +79 -79
- zaber_motion/dto/requests/response_type.py +8 -8
- zaber_motion/dto/requests/servo_tuning_paramset_response.py +48 -48
- zaber_motion/dto/requests/servo_tuning_request.py +91 -91
- zaber_motion/dto/requests/set_device_db_layered_sources_request.py +56 -56
- zaber_motion/dto/requests/set_device_db_source_request.py +63 -63
- zaber_motion/dto/requests/set_interface_checksum_enabled_request.py +56 -56
- zaber_motion/dto/requests/set_interface_timeout_request.py +65 -65
- zaber_motion/dto/requests/set_internal_mode_request.py +43 -43
- zaber_motion/dto/requests/set_io_port_label_request.py +100 -100
- zaber_motion/dto/requests/set_log_output_request.py +57 -57
- zaber_motion/dto/requests/set_process_controller_source.py +93 -93
- zaber_motion/dto/requests/set_servo_tuning_pid_request.py +135 -135
- zaber_motion/dto/requests/set_servo_tuning_request.py +116 -116
- zaber_motion/dto/requests/set_simple_tuning.py +174 -174
- zaber_motion/dto/requests/set_state_request.py +93 -93
- zaber_motion/dto/requests/stream_arc_request.py +199 -199
- zaber_motion/dto/requests/stream_buffer_erase_request.py +84 -84
- zaber_motion/dto/requests/stream_buffer_get_content_request.py +84 -84
- zaber_motion/dto/requests/stream_buffer_get_content_response.py +51 -51
- zaber_motion/dto/requests/stream_buffer_list.py +70 -70
- zaber_motion/dto/requests/stream_call_request.py +112 -112
- zaber_motion/dto/requests/stream_cancel_all_outputs_schedule_request.py +99 -99
- zaber_motion/dto/requests/stream_cancel_output_schedule_request.py +103 -103
- zaber_motion/dto/requests/stream_circle_request.py +155 -155
- zaber_motion/dto/requests/stream_empty_request.py +84 -84
- zaber_motion/dto/requests/stream_generic_command_batch_request.py +99 -99
- zaber_motion/dto/requests/stream_generic_command_request.py +93 -93
- zaber_motion/dto/requests/stream_get_axes_response.py +75 -75
- zaber_motion/dto/requests/stream_get_max_centripetal_acceleration_request.py +96 -96
- zaber_motion/dto/requests/stream_get_max_speed_request.py +96 -96
- zaber_motion/dto/requests/stream_get_max_tangential_acceleration_request.py +96 -96
- zaber_motion/dto/requests/stream_line_request.py +135 -135
- zaber_motion/dto/requests/stream_mode_response.py +60 -60
- zaber_motion/dto/requests/stream_segment_type.py +8 -8
- zaber_motion/dto/requests/stream_set_all_analog_outputs_request.py +101 -101
- zaber_motion/dto/requests/stream_set_all_analog_outputs_schedule_request.py +140 -140
- zaber_motion/dto/requests/stream_set_all_digital_outputs_request.py +102 -102
- zaber_motion/dto/requests/stream_set_all_digital_outputs_schedule_request.py +141 -141
- zaber_motion/dto/requests/stream_set_analog_output_request.py +109 -109
- zaber_motion/dto/requests/stream_set_analog_output_schedule_request.py +143 -143
- zaber_motion/dto/requests/stream_set_digital_output_request.py +110 -110
- zaber_motion/dto/requests/stream_set_digital_output_schedule_request.py +144 -144
- zaber_motion/dto/requests/stream_set_hold_request.py +89 -89
- zaber_motion/dto/requests/stream_set_max_centripetal_acceleration_request.py +107 -107
- zaber_motion/dto/requests/stream_set_max_speed_request.py +107 -107
- zaber_motion/dto/requests/stream_set_max_tangential_acceleration_request.py +107 -107
- zaber_motion/dto/requests/stream_setup_live_composite_request.py +123 -123
- zaber_motion/dto/requests/stream_setup_live_request.py +104 -104
- zaber_motion/dto/requests/stream_setup_store_arbitrary_axes_request.py +126 -126
- zaber_motion/dto/requests/stream_setup_store_composite_request.py +151 -151
- zaber_motion/dto/requests/stream_setup_store_request.py +132 -132
- zaber_motion/dto/requests/stream_wait_analog_input_request.py +118 -118
- zaber_motion/dto/requests/stream_wait_digital_input_request.py +103 -103
- zaber_motion/dto/requests/stream_wait_request.py +107 -107
- zaber_motion/dto/requests/stream_wait_until_idle_request.py +89 -89
- zaber_motion/dto/requests/string_array_response.py +51 -51
- zaber_motion/dto/requests/string_response.py +45 -45
- zaber_motion/dto/requests/test_event.py +45 -45
- zaber_motion/dto/requests/test_request.py +55 -55
- zaber_motion/dto/requests/test_request_complex.py +57 -0
- zaber_motion/dto/requests/test_response.py +45 -45
- zaber_motion/dto/requests/test_response_long.py +51 -51
- zaber_motion/dto/requests/toggle_device_db_store_request.py +50 -50
- zaber_motion/dto/requests/tools_list_serial_ports_response.py +51 -51
- zaber_motion/dto/requests/translator_create_from_device_request.py +97 -97
- zaber_motion/dto/requests/translator_create_live_request.py +91 -91
- zaber_motion/dto/requests/translator_create_request.py +62 -62
- zaber_motion/dto/requests/translator_create_response.py +51 -51
- zaber_motion/dto/requests/translator_empty_request.py +51 -51
- zaber_motion/dto/requests/translator_flush_live_request.py +56 -56
- zaber_motion/dto/requests/translator_flush_response.py +51 -51
- zaber_motion/dto/requests/translator_get_axis_offset_request.py +81 -81
- zaber_motion/dto/requests/translator_get_axis_position_request.py +72 -72
- zaber_motion/dto/requests/translator_set_axis_position_request.py +83 -83
- zaber_motion/dto/requests/translator_set_feed_rate_override_request.py +62 -62
- zaber_motion/dto/requests/translator_set_traverse_rate_request.py +74 -74
- zaber_motion/dto/requests/translator_translate_request.py +60 -60
- zaber_motion/dto/requests/trigger_clear_action_request.py +91 -91
- zaber_motion/dto/requests/trigger_empty_request.py +79 -79
- zaber_motion/dto/requests/trigger_enable_request.py +93 -93
- zaber_motion/dto/requests/trigger_enabled_states.py +56 -56
- zaber_motion/dto/requests/trigger_fire_at_interval_request.py +102 -102
- zaber_motion/dto/requests/trigger_fire_when_distance_travelled_request.py +116 -116
- zaber_motion/dto/requests/trigger_fire_when_io_request.py +128 -128
- zaber_motion/dto/requests/trigger_fire_when_request.py +88 -88
- zaber_motion/dto/requests/trigger_fire_when_setting_request.py +137 -137
- zaber_motion/dto/requests/trigger_on_fire_request.py +114 -114
- zaber_motion/dto/requests/trigger_on_fire_set_request.py +149 -149
- zaber_motion/dto/requests/trigger_on_fire_set_to_setting_request.py +149 -149
- zaber_motion/dto/requests/trigger_set_label_request.py +88 -88
- zaber_motion/dto/requests/trigger_states.py +56 -56
- zaber_motion/dto/requests/unit_convert_unit_request.py +71 -71
- zaber_motion/dto/requests/unit_get_enum_request.py +45 -45
- zaber_motion/dto/requests/unit_get_enum_response.py +48 -48
- zaber_motion/dto/requests/unit_get_symbol_request.py +48 -48
- zaber_motion/dto/requests/unit_get_symbol_response.py +45 -45
- zaber_motion/dto/requests/unknown_binary_response_event_wrapper.py +82 -82
- zaber_motion/dto/requests/unknown_response_event_wrapper.py +82 -82
- zaber_motion/dto/requests/wait_to_clear_warnings_request.py +105 -105
- zaber_motion/dto/requests/wait_to_respond_request.py +76 -76
- zaber_motion/dto/requests/wdi_generic_float_request.py +119 -0
- zaber_motion/dto/requests/wdi_generic_request.py +136 -136
- zaber_motion/dto/requests/wdi_get_status_response.py +50 -50
- zaber_motion/dto/rotation_direction.py +13 -13
- zaber_motion/dto_object.py +18 -18
- zaber_motion/events.py +112 -112
- zaber_motion/exceptions/__init__.py +87 -87
- zaber_motion/exceptions/bad_command_exception.py +10 -10
- zaber_motion/exceptions/bad_data_exception.py +10 -10
- zaber_motion/exceptions/binary_command_failed_exception.py +27 -27
- zaber_motion/exceptions/command_failed_exception.py +27 -27
- zaber_motion/exceptions/command_preempted_exception.py +10 -10
- zaber_motion/exceptions/command_too_long_exception.py +27 -27
- zaber_motion/exceptions/connection_closed_exception.py +10 -10
- zaber_motion/exceptions/connection_failed_exception.py +10 -10
- zaber_motion/exceptions/conversion_failed_exception.py +10 -10
- zaber_motion/exceptions/device_address_conflict_exception.py +27 -27
- zaber_motion/exceptions/device_busy_exception.py +10 -10
- zaber_motion/exceptions/device_db_failed_exception.py +27 -27
- zaber_motion/exceptions/device_detection_failed_exception.py +10 -10
- zaber_motion/exceptions/device_failed_exception.py +11 -11
- zaber_motion/exceptions/device_not_identified_exception.py +10 -10
- zaber_motion/exceptions/driver_disabled_exception.py +10 -10
- zaber_motion/exceptions/g_code_execution_exception.py +27 -27
- zaber_motion/exceptions/g_code_syntax_exception.py +27 -27
- zaber_motion/exceptions/incompatible_shared_library_exception.py +11 -11
- zaber_motion/exceptions/internal_error_exception.py +10 -10
- zaber_motion/exceptions/invalid_argument_exception.py +10 -10
- zaber_motion/exceptions/invalid_csv_data_exception.py +10 -10
- zaber_motion/exceptions/invalid_data_exception.py +10 -10
- zaber_motion/exceptions/invalid_operation_exception.py +10 -10
- zaber_motion/exceptions/invalid_packet_exception.py +27 -27
- zaber_motion/exceptions/invalid_park_state_exception.py +10 -10
- zaber_motion/exceptions/invalid_request_data_exception.py +11 -11
- zaber_motion/exceptions/invalid_response_exception.py +27 -27
- zaber_motion/exceptions/io_channel_out_of_range_exception.py +10 -10
- zaber_motion/exceptions/io_failed_exception.py +10 -10
- zaber_motion/exceptions/lockstep_enabled_exception.py +10 -10
- zaber_motion/exceptions/lockstep_not_enabled_exception.py +10 -10
- zaber_motion/exceptions/motion_lib_exception.py +18 -18
- zaber_motion/exceptions/movement_failed_exception.py +27 -27
- zaber_motion/exceptions/movement_interrupted_exception.py +27 -27
- zaber_motion/exceptions/no_device_found_exception.py +10 -10
- zaber_motion/exceptions/no_value_for_key_exception.py +10 -10
- zaber_motion/exceptions/not_supported_exception.py +10 -10
- zaber_motion/exceptions/operation_failed_exception.py +27 -27
- zaber_motion/exceptions/os_failed_exception.py +10 -10
- zaber_motion/exceptions/out_of_request_ids_exception.py +10 -10
- zaber_motion/exceptions/pvt_discontinuity_exception.py +10 -10
- zaber_motion/exceptions/pvt_execution_exception.py +27 -27
- zaber_motion/exceptions/pvt_mode_exception.py +10 -10
- zaber_motion/exceptions/pvt_movement_failed_exception.py +27 -27
- zaber_motion/exceptions/pvt_movement_interrupted_exception.py +27 -27
- zaber_motion/exceptions/pvt_sequence_generation_failed_exception.py +10 -10
- zaber_motion/exceptions/pvt_setup_failed_exception.py +10 -10
- zaber_motion/exceptions/remote_mode_exception.py +11 -11
- zaber_motion/exceptions/request_timeout_exception.py +10 -10
- zaber_motion/exceptions/serial_port_busy_exception.py +10 -10
- zaber_motion/exceptions/set_device_state_failed_exception.py +27 -27
- zaber_motion/exceptions/set_peripheral_state_failed_exception.py +27 -27
- zaber_motion/exceptions/setting_not_found_exception.py +10 -10
- zaber_motion/exceptions/stream_discontinuity_exception.py +10 -10
- zaber_motion/exceptions/stream_execution_exception.py +27 -27
- zaber_motion/exceptions/stream_mode_exception.py +10 -10
- zaber_motion/exceptions/stream_movement_failed_exception.py +27 -27
- zaber_motion/exceptions/stream_movement_interrupted_exception.py +27 -27
- zaber_motion/exceptions/stream_setup_failed_exception.py +10 -10
- zaber_motion/exceptions/timeout_exception.py +10 -10
- zaber_motion/exceptions/transport_already_used_exception.py +10 -10
- zaber_motion/exceptions/unknown_request_exception.py +10 -10
- zaber_motion/gcode/__init__.py +11 -11
- zaber_motion/gcode/offline_translator.py +401 -401
- zaber_motion/gcode/translator.py +424 -424
- zaber_motion/library.py +179 -179
- zaber_motion/microscopy/__init__.py +14 -14
- zaber_motion/microscopy/autofocus.py +645 -645
- zaber_motion/microscopy/camera_trigger.py +108 -108
- zaber_motion/microscopy/filter_changer.py +167 -167
- zaber_motion/microscopy/illuminator.py +139 -139
- zaber_motion/microscopy/illuminator_channel.py +616 -616
- zaber_motion/microscopy/microscope.py +315 -315
- zaber_motion/microscopy/objective_changer.py +403 -403
- zaber_motion/microscopy/wdi_autofocus_provider.py +536 -396
- zaber_motion/product/__init__.py +7 -7
- zaber_motion/product/process.py +818 -818
- zaber_motion/product/process_controller.py +134 -134
- zaber_motion/serialization.py +32 -32
- zaber_motion/tools.py +78 -78
- zaber_motion/unit_table.py +86 -86
- zaber_motion/units.py +206 -206
- zaber_motion/version.py +1 -1
- {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/LICENSE.txt +2119 -2119
- {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/METADATA +1 -1
- zaber_motion-7.14.0.dist-info/RECORD +496 -0
- zaber_motion_bindings/zaber-motion-core-windows-386.dll +0 -0
- zaber_motion-7.12.0.dist-info/RECORD +0 -494
- {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/WHEEL +0 -0
- {zaber_motion-7.12.0.dist-info → zaber_motion-7.14.0.dist-info}/top_level.txt +0 -0
zaber_motion/ascii/device.py
CHANGED
|
@@ -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
|