opentrons 8.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

Files changed (601) hide show
  1. opentrons/__init__.py +150 -0
  2. opentrons/_version.py +34 -0
  3. opentrons/calibration_storage/__init__.py +54 -0
  4. opentrons/calibration_storage/deck_configuration.py +62 -0
  5. opentrons/calibration_storage/encoder_decoder.py +31 -0
  6. opentrons/calibration_storage/file_operators.py +142 -0
  7. opentrons/calibration_storage/helpers.py +103 -0
  8. opentrons/calibration_storage/ot2/__init__.py +34 -0
  9. opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
  10. opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
  11. opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  12. opentrons/calibration_storage/ot2/models/v1.py +149 -0
  13. opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
  14. opentrons/calibration_storage/ot2/tip_length.py +281 -0
  15. opentrons/calibration_storage/ot3/__init__.py +31 -0
  16. opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
  17. opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
  18. opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  19. opentrons/calibration_storage/ot3/models/v1.py +122 -0
  20. opentrons/calibration_storage/ot3/module_offset.py +138 -0
  21. opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
  22. opentrons/calibration_storage/types.py +45 -0
  23. opentrons/cli/__init__.py +21 -0
  24. opentrons/cli/__main__.py +5 -0
  25. opentrons/cli/analyze.py +557 -0
  26. opentrons/config/__init__.py +631 -0
  27. opentrons/config/advanced_settings.py +871 -0
  28. opentrons/config/defaults_ot2.py +214 -0
  29. opentrons/config/defaults_ot3.py +499 -0
  30. opentrons/config/feature_flags.py +86 -0
  31. opentrons/config/gripper_config.py +55 -0
  32. opentrons/config/reset.py +203 -0
  33. opentrons/config/robot_configs.py +187 -0
  34. opentrons/config/types.py +183 -0
  35. opentrons/drivers/__init__.py +0 -0
  36. opentrons/drivers/absorbance_reader/__init__.py +11 -0
  37. opentrons/drivers/absorbance_reader/abstract.py +72 -0
  38. opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
  39. opentrons/drivers/absorbance_reader/driver.py +81 -0
  40. opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
  41. opentrons/drivers/absorbance_reader/simulator.py +84 -0
  42. opentrons/drivers/asyncio/__init__.py +0 -0
  43. opentrons/drivers/asyncio/communication/__init__.py +22 -0
  44. opentrons/drivers/asyncio/communication/async_serial.py +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
  47. opentrons/drivers/command_builder.py +102 -0
  48. opentrons/drivers/flex_stacker/__init__.py +13 -0
  49. opentrons/drivers/flex_stacker/abstract.py +214 -0
  50. opentrons/drivers/flex_stacker/driver.py +768 -0
  51. opentrons/drivers/flex_stacker/errors.py +68 -0
  52. opentrons/drivers/flex_stacker/simulator.py +309 -0
  53. opentrons/drivers/flex_stacker/types.py +367 -0
  54. opentrons/drivers/flex_stacker/utils.py +19 -0
  55. opentrons/drivers/heater_shaker/__init__.py +5 -0
  56. opentrons/drivers/heater_shaker/abstract.py +76 -0
  57. opentrons/drivers/heater_shaker/driver.py +204 -0
  58. opentrons/drivers/heater_shaker/simulator.py +94 -0
  59. opentrons/drivers/mag_deck/__init__.py +6 -0
  60. opentrons/drivers/mag_deck/abstract.py +44 -0
  61. opentrons/drivers/mag_deck/driver.py +208 -0
  62. opentrons/drivers/mag_deck/simulator.py +63 -0
  63. opentrons/drivers/rpi_drivers/__init__.py +33 -0
  64. opentrons/drivers/rpi_drivers/dev_types.py +94 -0
  65. opentrons/drivers/rpi_drivers/gpio.py +282 -0
  66. opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
  67. opentrons/drivers/rpi_drivers/interfaces.py +15 -0
  68. opentrons/drivers/rpi_drivers/types.py +364 -0
  69. opentrons/drivers/rpi_drivers/usb.py +102 -0
  70. opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
  71. opentrons/drivers/serial_communication.py +151 -0
  72. opentrons/drivers/smoothie_drivers/__init__.py +4 -0
  73. opentrons/drivers/smoothie_drivers/connection.py +51 -0
  74. opentrons/drivers/smoothie_drivers/constants.py +121 -0
  75. opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
  76. opentrons/drivers/smoothie_drivers/errors.py +49 -0
  77. opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
  78. opentrons/drivers/smoothie_drivers/simulator.py +99 -0
  79. opentrons/drivers/smoothie_drivers/types.py +16 -0
  80. opentrons/drivers/temp_deck/__init__.py +10 -0
  81. opentrons/drivers/temp_deck/abstract.py +54 -0
  82. opentrons/drivers/temp_deck/driver.py +197 -0
  83. opentrons/drivers/temp_deck/simulator.py +57 -0
  84. opentrons/drivers/thermocycler/__init__.py +12 -0
  85. opentrons/drivers/thermocycler/abstract.py +99 -0
  86. opentrons/drivers/thermocycler/driver.py +395 -0
  87. opentrons/drivers/thermocycler/simulator.py +126 -0
  88. opentrons/drivers/types.py +107 -0
  89. opentrons/drivers/utils.py +222 -0
  90. opentrons/execute.py +742 -0
  91. opentrons/hardware_control/__init__.py +65 -0
  92. opentrons/hardware_control/__main__.py +77 -0
  93. opentrons/hardware_control/adapters.py +98 -0
  94. opentrons/hardware_control/api.py +1347 -0
  95. opentrons/hardware_control/backends/__init__.py +7 -0
  96. opentrons/hardware_control/backends/controller.py +400 -0
  97. opentrons/hardware_control/backends/errors.py +9 -0
  98. opentrons/hardware_control/backends/estop_state.py +164 -0
  99. opentrons/hardware_control/backends/flex_protocol.py +497 -0
  100. opentrons/hardware_control/backends/ot3controller.py +1930 -0
  101. opentrons/hardware_control/backends/ot3simulator.py +900 -0
  102. opentrons/hardware_control/backends/ot3utils.py +664 -0
  103. opentrons/hardware_control/backends/simulator.py +442 -0
  104. opentrons/hardware_control/backends/status_bar_state.py +240 -0
  105. opentrons/hardware_control/backends/subsystem_manager.py +431 -0
  106. opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
  107. opentrons/hardware_control/backends/types.py +14 -0
  108. opentrons/hardware_control/constants.py +6 -0
  109. opentrons/hardware_control/dev_types.py +125 -0
  110. opentrons/hardware_control/emulation/__init__.py +0 -0
  111. opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
  112. opentrons/hardware_control/emulation/app.py +56 -0
  113. opentrons/hardware_control/emulation/connection_handler.py +38 -0
  114. opentrons/hardware_control/emulation/heater_shaker.py +150 -0
  115. opentrons/hardware_control/emulation/magdeck.py +60 -0
  116. opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
  117. opentrons/hardware_control/emulation/module_server/client.py +78 -0
  118. opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
  119. opentrons/hardware_control/emulation/module_server/models.py +31 -0
  120. opentrons/hardware_control/emulation/module_server/server.py +110 -0
  121. opentrons/hardware_control/emulation/parser.py +74 -0
  122. opentrons/hardware_control/emulation/proxy.py +241 -0
  123. opentrons/hardware_control/emulation/run_emulator.py +68 -0
  124. opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  125. opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
  126. opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
  127. opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
  128. opentrons/hardware_control/emulation/settings.py +119 -0
  129. opentrons/hardware_control/emulation/simulations.py +133 -0
  130. opentrons/hardware_control/emulation/smoothie.py +192 -0
  131. opentrons/hardware_control/emulation/tempdeck.py +69 -0
  132. opentrons/hardware_control/emulation/thermocycler.py +128 -0
  133. opentrons/hardware_control/emulation/types.py +10 -0
  134. opentrons/hardware_control/emulation/util.py +38 -0
  135. opentrons/hardware_control/errors.py +43 -0
  136. opentrons/hardware_control/execution_manager.py +164 -0
  137. opentrons/hardware_control/instruments/__init__.py +5 -0
  138. opentrons/hardware_control/instruments/instrument_abc.py +39 -0
  139. opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  140. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
  141. opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
  142. opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
  143. opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  144. opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
  145. opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
  146. opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
  147. opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
  148. opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
  149. opentrons/hardware_control/module_control.py +332 -0
  150. opentrons/hardware_control/modules/__init__.py +69 -0
  151. opentrons/hardware_control/modules/absorbance_reader.py +373 -0
  152. opentrons/hardware_control/modules/errors.py +7 -0
  153. opentrons/hardware_control/modules/flex_stacker.py +948 -0
  154. opentrons/hardware_control/modules/heater_shaker.py +426 -0
  155. opentrons/hardware_control/modules/lid_temp_status.py +35 -0
  156. opentrons/hardware_control/modules/magdeck.py +233 -0
  157. opentrons/hardware_control/modules/mod_abc.py +245 -0
  158. opentrons/hardware_control/modules/module_calibration.py +93 -0
  159. opentrons/hardware_control/modules/plate_temp_status.py +61 -0
  160. opentrons/hardware_control/modules/tempdeck.py +299 -0
  161. opentrons/hardware_control/modules/thermocycler.py +731 -0
  162. opentrons/hardware_control/modules/types.py +417 -0
  163. opentrons/hardware_control/modules/update.py +255 -0
  164. opentrons/hardware_control/modules/utils.py +73 -0
  165. opentrons/hardware_control/motion_utilities.py +318 -0
  166. opentrons/hardware_control/nozzle_manager.py +422 -0
  167. opentrons/hardware_control/ot3_calibration.py +1171 -0
  168. opentrons/hardware_control/ot3api.py +3227 -0
  169. opentrons/hardware_control/pause_manager.py +31 -0
  170. opentrons/hardware_control/poller.py +112 -0
  171. opentrons/hardware_control/protocols/__init__.py +106 -0
  172. opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
  173. opentrons/hardware_control/protocols/calibratable.py +45 -0
  174. opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
  175. opentrons/hardware_control/protocols/configurable.py +48 -0
  176. opentrons/hardware_control/protocols/event_sourcer.py +18 -0
  177. opentrons/hardware_control/protocols/execution_controllable.py +33 -0
  178. opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
  179. opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
  180. opentrons/hardware_control/protocols/gripper_controller.py +55 -0
  181. opentrons/hardware_control/protocols/hardware_manager.py +51 -0
  182. opentrons/hardware_control/protocols/identifiable.py +16 -0
  183. opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
  184. opentrons/hardware_control/protocols/liquid_handler.py +266 -0
  185. opentrons/hardware_control/protocols/module_provider.py +16 -0
  186. opentrons/hardware_control/protocols/motion_controller.py +243 -0
  187. opentrons/hardware_control/protocols/position_estimator.py +45 -0
  188. opentrons/hardware_control/protocols/simulatable.py +10 -0
  189. opentrons/hardware_control/protocols/stoppable.py +9 -0
  190. opentrons/hardware_control/protocols/types.py +27 -0
  191. opentrons/hardware_control/robot_calibration.py +224 -0
  192. opentrons/hardware_control/scripts/README.md +28 -0
  193. opentrons/hardware_control/scripts/__init__.py +1 -0
  194. opentrons/hardware_control/scripts/gripper_control.py +208 -0
  195. opentrons/hardware_control/scripts/ot3gripper +7 -0
  196. opentrons/hardware_control/scripts/ot3repl +7 -0
  197. opentrons/hardware_control/scripts/repl.py +187 -0
  198. opentrons/hardware_control/scripts/tc_control.py +97 -0
  199. opentrons/hardware_control/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,243 @@
1
+ from typing import Dict, List, Optional, Mapping
2
+ from typing_extensions import Protocol
3
+
4
+ from opentrons.types import Point
5
+ from ..types import Axis, CriticalPoint, MotionChecks
6
+ from .types import MountArgType
7
+
8
+
9
+ class MotionController(Protocol[MountArgType]):
10
+ """Protocol specifying fundamental motion controls."""
11
+
12
+ def get_deck_from_machine(
13
+ self, machine_pos: Dict[Axis, float]
14
+ ) -> Dict[Axis, float]:
15
+ """Convert machine coordinates to deck coordinates."""
16
+ ...
17
+
18
+ async def halt(self, disengage_before_stopping: bool = False) -> None:
19
+ """Immediately stop motion.
20
+
21
+ Calls to stop through the synch adapter while other calls
22
+ are ongoing will typically wait until those calls are done, since most
23
+ of the async calls here in fact block the loop while they talk to
24
+ smoothie. To provide actual immediate halting, call this method which
25
+ does not require use of the loop.
26
+
27
+ If disengage_before_stopping is True, the motors will disengage first and then
28
+ stop in place. Disengaging creates a smoother halt but requires homing after
29
+ in order to resume movement.
30
+ """
31
+ ...
32
+
33
+ async def stop(self, home_after: bool = True) -> None:
34
+ """
35
+ Stop motion as soon as possible, reset, and optionally home.
36
+
37
+ This will cancel motion (after the current call to :py:meth:`move`;
38
+ see :py:meth:`pause` for more detail), then home and reset the
39
+ robot.
40
+ """
41
+ ...
42
+
43
+ async def reset(self) -> None:
44
+ """Reset the stored state of the system.
45
+
46
+ This will re-scan instruments and models, clearing any cached
47
+ information about their presence or state.
48
+ """
49
+ ...
50
+
51
+ # Gantry/frame (i.e. not pipette) action API
52
+ async def home_z(
53
+ self,
54
+ mount: Optional[MountArgType] = None,
55
+ allow_home_other: bool = True,
56
+ ) -> None:
57
+ """Home a selected z-axis, or both if not specified."""
58
+ ...
59
+
60
+ async def home_plunger(self, mount: MountArgType) -> None:
61
+ """
62
+ Home the plunger motor for a mount, and then return it to the 'bottom'
63
+ position.
64
+
65
+ mount: the mount associated with the target plunger
66
+ """
67
+ ...
68
+
69
+ async def home(self, axes: Optional[List[Axis]] = None) -> None:
70
+ """Home a list of axes and initialize current position.
71
+
72
+ axes A list of axes to home. Default is `None`, which will
73
+ home everything.
74
+ """
75
+ ...
76
+
77
+ async def current_position(
78
+ self,
79
+ mount: MountArgType,
80
+ critical_point: Optional[CriticalPoint] = None,
81
+ refresh: bool = False,
82
+ # TODO(mc, 2021-11-15): combine with `refresh` for more reliable
83
+ # position reporting when motors are not homed
84
+ fail_on_not_homed: bool = False,
85
+ ) -> Dict[Axis, float]:
86
+ """Return the postion (in deck coords) of the critical point of the
87
+ specified mount.
88
+
89
+ This returns cached position to avoid hitting the smoothie driver
90
+ unless ``refresh`` is ``True``.
91
+
92
+ If `critical_point` is specified, that critical point will be applied
93
+ instead of the default one. For instance, if
94
+ `critical_point=CriticalPoints.MOUNT` then the position of the mount
95
+ will be returned. If the critical point specified does not exist, then
96
+ the next one down is returned - for instance, if there is no tip on the
97
+ specified mount but `CriticalPoint.TIP` was specified, the position of
98
+ the nozzle will be returned.
99
+
100
+ If `fail_on_not_homed` is `True`, this method will raise a `PositionUnknownError`
101
+ if any of the relavent axes are not homed, regardless of `refresh`.
102
+ """
103
+ ...
104
+
105
+ async def gantry_position(
106
+ self,
107
+ mount: MountArgType,
108
+ critical_point: Optional[CriticalPoint] = None,
109
+ refresh: bool = False,
110
+ # TODO(mc, 2021-11-15): combine with `refresh` for more reliable
111
+ # position reporting when motors are not homed
112
+ fail_on_not_homed: bool = False,
113
+ ) -> Point:
114
+ """Retrieve the position of just the currently-active pipette.
115
+
116
+ While current_position returns the position of every actuator on the system,
117
+ this function just returns the x, y, and z of the critical point of whichever
118
+ pipette is currently active (last moved).
119
+ """
120
+ ...
121
+
122
+ async def move_to(
123
+ self,
124
+ mount: MountArgType,
125
+ abs_position: Point,
126
+ speed: Optional[float] = None,
127
+ critical_point: Optional[CriticalPoint] = None,
128
+ max_speeds: Optional[Dict[Axis, float]] = None,
129
+ ) -> None:
130
+ """Move the critical point of the specified mount to a location
131
+ relative to the deck, at the specified speed. 'speed' sets the speed
132
+ of all robot axes to the given value. So, if multiple axes are to be
133
+ moved, they will do so at the same speed
134
+
135
+ The critical point of the mount depends on the current status of
136
+ the mount:
137
+ - If the mount does not have anything attached, its critical point is
138
+ the bottom of the mount attach bracket.
139
+ - If the mount has a pipette attached and it is not known to have a
140
+ pipette tip, the critical point is the end of the nozzle of a single
141
+ pipette or the end of the backmost nozzle of a multipipette
142
+ - If the mount has a pipette attached and it is known to have a
143
+ pipette tip, the critical point is the end of the pipette tip for
144
+ a single pipette or the end of the tip of the backmost nozzle of a
145
+ multipipette
146
+
147
+ :param mount: The mount to move
148
+ :param abs_position: The target absolute position in
149
+ deck coordinates to move the
150
+ critical point to
151
+ :param speed: An overall head speed to use during the move
152
+ :param critical_point: The critical point to move. In most situations
153
+ this is not needed. If not specified, the
154
+ current critical point will be moved. If
155
+ specified, the critical point must be one that
156
+ actually exists - that is, specifying
157
+ :py:attr:`.CriticalPoint.NOZZLE` when no pipette
158
+ is attached or :py:attr:`.CriticalPoint.TIP`
159
+ when no tip is applied will result in an error.
160
+ :param max_speeds: An optional override for per-axis maximum speeds. If
161
+ an axis is specified, it will not move faster than
162
+ the given speed. Note that this does not make that
163
+ axis move precisely at the given speed; it only
164
+ it if it was going to go faster. Direct speed
165
+ is still set by ``speed``.
166
+ """
167
+ ...
168
+
169
+ async def move_axes(
170
+ self,
171
+ position: Mapping[Axis, float],
172
+ speed: Optional[float] = None,
173
+ max_speeds: Optional[Dict[Axis, float]] = None,
174
+ expect_stalls: bool = False,
175
+ ) -> None:
176
+ """Moves the effectors of the specified axis to the specified position.
177
+ The effector of the x,y axis is the center of the carriage.
178
+ The effector of the pipette mount axis are the mount critical points but only in z.
179
+ """
180
+ ...
181
+
182
+ async def move_rel(
183
+ self,
184
+ mount: MountArgType,
185
+ delta: Point,
186
+ speed: Optional[float] = None,
187
+ max_speeds: Optional[Dict[Axis, float]] = None,
188
+ check_bounds: MotionChecks = MotionChecks.NONE,
189
+ fail_on_not_homed: bool = False,
190
+ ) -> None:
191
+ """Move the critical point of the specified mount by a specified
192
+ displacement in a specified direction, at the specified speed.
193
+ 'speed' sets the speed of all axes to the given value. So, if multiple
194
+ axes are to be moved, they will do so at the same speed.
195
+
196
+ If fail_on_not_homed is True (default False), if an axis that is not
197
+ homed moves it will raise a PositionUnknownError. Otherwise, it will home the axis.
198
+ """
199
+ ...
200
+
201
+ def get_engaged_axes(self) -> Dict[Axis, bool]:
202
+ """Which axes are engaged and holding."""
203
+ ...
204
+
205
+ @property
206
+ def engaged_axes(self) -> Dict[Axis, bool]:
207
+ """Which axes are engaged and holding"""
208
+ return self.get_engaged_axes()
209
+
210
+ async def disengage_axes(self, which: List[Axis]) -> None:
211
+ """Disengage some axes."""
212
+ ...
213
+
214
+ async def engage_axes(self, which: List[Axis]) -> None:
215
+ """Engage some axes."""
216
+ ...
217
+
218
+ async def retract(self, mount: MountArgType, margin: float = 10) -> None:
219
+ """Pull the specified mount up to its home position.
220
+
221
+ Works regardless of critical point or home status.
222
+ """
223
+ ...
224
+
225
+ async def retract_axis(self, axis: Axis) -> None:
226
+ """Retract the specified axis to its home position."""
227
+ ...
228
+
229
+ def is_movement_execution_taskified(self) -> bool:
230
+ """Get whether move functions are being executed inside cancellable tasks."""
231
+ ...
232
+
233
+ def should_taskify_movement_execution(self, taskify: bool) -> None:
234
+ """Specify whether move functions should be executed inside cancellable tasks."""
235
+ ...
236
+
237
+ async def cancel_execution_and_running_tasks(self) -> None:
238
+ """Cancel all tasks and set execution manager state to Cancelled."""
239
+ ...
240
+
241
+ async def prepare_for_mount_movement(self, mount: MountArgType) -> None:
242
+ """Retract the other mount if necessary."""
243
+ ...
@@ -0,0 +1,45 @@
1
+ from typing import Protocol, Sequence
2
+
3
+ from ..types import Axis
4
+
5
+
6
+ class PositionEstimator(Protocol):
7
+ """Position-control extensions for harwdare with encoders."""
8
+
9
+ async def update_axis_position_estimations(self, axes: Sequence[Axis]) -> None:
10
+ """Update the specified axes' position estimators from their encoders.
11
+
12
+ This will allow these axes to make a non-home move even if they do not currently have
13
+ a position estimation (unless there is no tracked position from the encoders, as would be
14
+ true immediately after boot).
15
+
16
+ Axis encoders have less precision than their position estimators. Calling this function will
17
+ cause absolute position drift. After this function is called, the axis should be homed before
18
+ it is relied upon for accurate motion.
19
+
20
+ This function updates only the requested axes. If other axes have bad position estimation,
21
+ moves that require those axes or attempts to get the position of those axes will still fail.
22
+ Axes that are not currently available (like a plunger for a pipette that is not connected)
23
+ will be ignored.
24
+ """
25
+ ...
26
+
27
+ def motor_status_ok(self, axis: Axis) -> bool:
28
+ """Return whether an axis' position estimator is healthy.
29
+
30
+ The position estimator is healthy if the axis has
31
+ 1) been homed
32
+ 2) not suffered a loss-of-positioning (from a cancel or stall, for instance) since being homed
33
+
34
+ If this function returns false, getting the position of this axis or asking it to move will fail.
35
+ """
36
+ ...
37
+
38
+ def encoder_status_ok(self, axis: Axis) -> bool:
39
+ """Return whether an axis' position encoder tracking is healthy.
40
+
41
+ The encoder status is healthy if the axis has been homed since booting up.
42
+
43
+ If this function returns false, updating the estimator from the encoder will fail.
44
+ """
45
+ ...
@@ -0,0 +1,10 @@
1
+ from typing_extensions import Protocol
2
+
3
+
4
+ class Simulatable(Protocol):
5
+ """Protocol specifying ability to simulate"""
6
+
7
+ @property
8
+ def is_simulator(self) -> bool:
9
+ """`True` if this is a simulator; `False` otherwise."""
10
+ ...
@@ -0,0 +1,9 @@
1
+ from typing_extensions import Protocol
2
+
3
+
4
+ class Stoppable(Protocol):
5
+ """Protocol specifying controllability of teardown"""
6
+
7
+ async def clean_up(self) -> None:
8
+ """Get the API ready to stop cleanly."""
9
+ ...
@@ -0,0 +1,27 @@
1
+ """Types that are common across protocols."""
2
+
3
+ from typing import TypeVar, Union, Type
4
+ from opentrons.hardware_control.types import OT3Mount
5
+ from opentrons.types import Mount
6
+ from opentrons.config.types import RobotConfig, OT3Config
7
+
8
+
9
+ class OT2RobotType:
10
+ pass
11
+
12
+
13
+ class FlexRobotType:
14
+ pass
15
+
16
+
17
+ CalibrationType = TypeVar("CalibrationType")
18
+
19
+ MountArgType = TypeVar(
20
+ "MountArgType", Mount, Union[OT3Mount, Mount], contravariant=True
21
+ )
22
+
23
+ ConfigType = TypeVar("ConfigType", RobotConfig, OT3Config)
24
+
25
+ ProtocolRobotType = TypeVar(
26
+ "ProtocolRobotType", Type[FlexRobotType], Type[OT2RobotType], covariant=True
27
+ )
@@ -0,0 +1,224 @@
1
+ from functools import lru_cache
2
+ import logging
3
+ import numpy as np
4
+ from datetime import datetime
5
+ from dataclasses import dataclass
6
+ from typing import Optional, List, Any, cast
7
+ from numpy.typing import NDArray
8
+
9
+ from opentrons import config
10
+
11
+ from opentrons.config.robot_configs import (
12
+ get_legacy_gantry_calibration,
13
+ default_ot2_deck_calibration,
14
+ )
15
+ from opentrons.calibration_storage import (
16
+ types,
17
+ save_robot_deck_attitude,
18
+ get_robot_deck_attitude,
19
+ )
20
+ from opentrons.util import linal
21
+
22
+ from .util import DeckTransformState
23
+
24
+ log = logging.getLogger(__name__)
25
+
26
+
27
+ @dataclass
28
+ class DeckCalibration:
29
+ attitude: types.AttitudeMatrix
30
+ source: types.SourceType
31
+ status: types.CalibrationStatus
32
+ belt_attitude: Optional[types.AttitudeMatrix] = None
33
+ last_modified: Optional[datetime] = None
34
+ pipette_calibrated_with: Optional[str] = None
35
+ tiprack: Optional[str] = None
36
+
37
+
38
+ @dataclass
39
+ class RobotCalibration:
40
+ deck_calibration: DeckCalibration
41
+
42
+
43
+ def validate_attitude_deck_calibration(
44
+ deck_cal: DeckCalibration,
45
+ ) -> DeckTransformState:
46
+ """
47
+ This function determines whether the deck calibration is valid
48
+ or not based on the following use-cases:
49
+
50
+ TODO(lc, 8/10/2020): As with the OT2, expand on this method, or create
51
+ another method to diagnose bad instrument offset data
52
+ """
53
+ curr_cal: linal.DoubleMatrix = np.array(deck_cal.attitude)
54
+ row, _ = curr_cal.shape
55
+ rank: int = np.linalg.matrix_rank(curr_cal)
56
+ if row != rank:
57
+ # Check that the matrix is non-singular
58
+ return DeckTransformState.SINGULARITY
59
+ elif not deck_cal.last_modified:
60
+ # Check that the matrix is not an identity
61
+ return DeckTransformState.IDENTITY
62
+ else:
63
+ # Transform as it stands is sufficient.
64
+ return DeckTransformState.OK
65
+
66
+
67
+ def validate_gantry_calibration(gantry_cal: List[List[float]]) -> DeckTransformState:
68
+ """
69
+ This function determines whether the gantry calibration is valid
70
+ or not based on the following use-cases:
71
+ """
72
+ curr_cal: linal.DoubleMatrix = np.array(gantry_cal)
73
+ row, _ = curr_cal.shape
74
+
75
+ rank: int = np.linalg.matrix_rank(curr_cal)
76
+
77
+ id_matrix = linal.identity_deck_transform()
78
+
79
+ z = abs(curr_cal[2][-1])
80
+
81
+ outofrange = z < 16 or z > 34
82
+ if row != rank:
83
+ # Check that the matrix is non-singular
84
+ return DeckTransformState.SINGULARITY
85
+ elif np.array_equal(curr_cal, id_matrix):
86
+ # Check that the matrix is not an identity
87
+ return DeckTransformState.IDENTITY
88
+ elif outofrange:
89
+ # Check that the matrix is not out of range.
90
+ return DeckTransformState.BAD_CALIBRATION
91
+ else:
92
+ # Transform as it stands is sufficient.
93
+ return DeckTransformState.OK
94
+
95
+
96
+ def migrate_affine_xy_to_attitude(
97
+ gantry_cal: List[List[float]],
98
+ ) -> types.AttitudeMatrix:
99
+ masked_transform: NDArray[np.bool_] = np.array(
100
+ [
101
+ [True, True, True, False],
102
+ [True, True, True, False],
103
+ [False, False, False, False],
104
+ [False, False, False, False],
105
+ ]
106
+ )
107
+ masked_array: np.ma.MaskedArray[
108
+ Any, np.dtype[np.float64]
109
+ ] = np.ma.masked_array( # type: ignore
110
+ gantry_cal, ~masked_transform
111
+ )
112
+ attitude_array: linal.DoubleMatrix = np.zeros((3, 3))
113
+ np.put(attitude_array, [0, 1, 2], masked_array[0].compressed())
114
+ np.put(attitude_array, [3, 4, 5], masked_array[1].compressed())
115
+ np.put(attitude_array, 8, 1)
116
+ return cast(List[List[float]], attitude_array.tolist())
117
+
118
+
119
+ def save_attitude_matrix(
120
+ expected: linal.SolvePoints,
121
+ actual: linal.SolvePoints,
122
+ pipette_id: str,
123
+ tiprack_hash: str,
124
+ ) -> None:
125
+ attitude = linal.solve_attitude(expected, actual)
126
+ save_robot_deck_attitude(
127
+ attitude,
128
+ pipette_id,
129
+ tiprack_hash,
130
+ )
131
+
132
+
133
+ def load_attitude_matrix() -> DeckCalibration:
134
+ calibration_data = get_robot_deck_attitude()
135
+ gantry_cal = get_legacy_gantry_calibration()
136
+ if not calibration_data and gantry_cal:
137
+ if validate_gantry_calibration(gantry_cal) == DeckTransformState.OK:
138
+ log.debug(
139
+ "Attitude deck calibration matrix not found. Migrating "
140
+ "existing affine deck calibration matrix to {}".format(
141
+ config.get_opentrons_path("robot_calibration_dir")
142
+ )
143
+ )
144
+ attitude = migrate_affine_xy_to_attitude(gantry_cal)
145
+ save_robot_deck_attitude(
146
+ transform=attitude,
147
+ pip_id=None,
148
+ lw_hash=None,
149
+ source=types.SourceType.legacy,
150
+ )
151
+ calibration_data = get_robot_deck_attitude()
152
+
153
+ if calibration_data:
154
+ return DeckCalibration(
155
+ attitude=calibration_data.attitude,
156
+ source=calibration_data.source,
157
+ status=types.CalibrationStatus(**calibration_data.status.model_dump()),
158
+ last_modified=calibration_data.last_modified,
159
+ pipette_calibrated_with=calibration_data.pipette_calibrated_with,
160
+ tiprack=calibration_data.tiprack,
161
+ )
162
+ else:
163
+ # load default if deck calibration data do not exist
164
+ return DeckCalibration(
165
+ attitude=default_ot2_deck_calibration(),
166
+ source=types.SourceType.default,
167
+ status=types.CalibrationStatus(),
168
+ )
169
+
170
+
171
+ def load() -> RobotCalibration:
172
+ return RobotCalibration(deck_calibration=load_attitude_matrix())
173
+
174
+
175
+ class RobotCalibrationProvider:
176
+ def __init__(self) -> None:
177
+ self._robot_calibration = load()
178
+
179
+ @lru_cache(1)
180
+ def _validate(self) -> DeckTransformState:
181
+ return validate_attitude_deck_calibration(
182
+ self._robot_calibration.deck_calibration
183
+ )
184
+
185
+ @property
186
+ def robot_calibration(self) -> RobotCalibration:
187
+ return self._robot_calibration
188
+
189
+ def reset_robot_calibration(self) -> None:
190
+ self._validate.cache_clear()
191
+ self._robot_calibration = load()
192
+
193
+ def reset_deck_calibration(self) -> None:
194
+ self._robot_calibration = load()
195
+
196
+ def load_deck_calibration(self) -> None:
197
+ self._robot_calibration = load()
198
+
199
+ def set_robot_calibration(self, robot_calibration: RobotCalibration) -> None:
200
+ self._validate.cache_clear()
201
+ self._robot_calibration = robot_calibration
202
+
203
+ def validate_calibration(self) -> DeckTransformState:
204
+ """
205
+ The lru cache decorator is currently not supported by the
206
+ ThreadManager. To work around this, we need to wrap the
207
+ actual function around a dummy outer function.
208
+
209
+ Once decorators are more fully supported, we can remove this.
210
+ """
211
+ return self._validate()
212
+
213
+ def build_temporary_identity_calibration(self) -> RobotCalibration:
214
+ """
215
+ Get a temporary identity deck cal suitable for use during
216
+ calibration
217
+ """
218
+ return RobotCalibration(
219
+ deck_calibration=DeckCalibration(
220
+ attitude=default_ot2_deck_calibration(),
221
+ source=types.SourceType.default,
222
+ status=types.CalibrationStatus(),
223
+ )
224
+ )
@@ -0,0 +1,28 @@
1
+ # Hardware Control Scripts
2
+
3
+ ## Repl Script
4
+
5
+ ### Overview
6
+
7
+ This script gives you access to a hardware controller object in a python shell.
8
+
9
+ ### Running on an OT-3
10
+
11
+ The script is installed to path by using the `make push-ot3` command. When you are ssh-ed in the robot, you can run `ot3repl` from anywhere.
12
+
13
+
14
+ ### Running on a computer
15
+
16
+ Please review [the setup for a simulated CAN connection](https://github.com/Opentrons/opentrons/tree/edge/hardware#can-bus-simulation) to see how to run OT-3 simulators on your computer. Once you have a simulated CAN connection and firmware, you can run the following:
17
+
18
+ `OPENTRONS_SIMULATION=true OT_API_FF_enableOT3HardwareController=true OT3_CAN_DRIVER_INTERFACE=opentrons_sock pipenv run python -m opentrons.hardware_control.scripts.repl`
19
+
20
+ ## Gripper Script
21
+
22
+ ### Overview
23
+
24
+ Gripper test script only for the OT-3.
25
+
26
+ ### Running on an OT-3
27
+
28
+ Install the script using `make push-ot3` command and run `ot3gripper` after you ssh-ed into the updated robot.
@@ -0,0 +1 @@
1
+ """Scripts for the hardware controller."""