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,31 @@
1
+ from typing import List
2
+
3
+ from .types import PauseType
4
+
5
+
6
+ class PauseManager:
7
+ """This class determines whether or not the hardware controller should
8
+ pause or resume by evaluating the pause and resume types. The use of two
9
+ pause types are used to separate the delay resume (triggered when the delay
10
+ timer runs out) and the pause resume (trigged by user via the app).
11
+ """
12
+
13
+ def __init__(self) -> None:
14
+ self.queue: List[PauseType] = []
15
+
16
+ @property
17
+ def should_pause(self) -> bool:
18
+ return bool(self.queue)
19
+
20
+ def resume(self, pause_type: PauseType) -> None:
21
+ try:
22
+ self.queue.remove(pause_type)
23
+ except ValueError:
24
+ pass
25
+
26
+ def pause(self, pause_type: PauseType) -> None:
27
+ if pause_type not in self.queue:
28
+ self.queue.append(pause_type)
29
+
30
+ def reset(self) -> None:
31
+ self.queue = []
@@ -0,0 +1,112 @@
1
+ import asyncio
2
+ import contextlib
3
+ import logging
4
+ from abc import ABC, abstractmethod
5
+ from typing import AsyncGenerator, List, Optional
6
+ from opentrons.hardware_control.modules.errors import AbsorbanceReaderDisconnectedError
7
+ from opentrons_shared_data.errors.exceptions import ModuleCommunicationError
8
+
9
+
10
+ log = logging.getLogger(__name__)
11
+
12
+
13
+ class Reader(ABC):
14
+ @abstractmethod
15
+ async def read(self) -> None:
16
+ """Read some data from an external source."""
17
+
18
+ def on_error(self, exception: Exception) -> None:
19
+ """Handle an error from calling `read`."""
20
+
21
+
22
+ class Poller:
23
+ """A poller to call a given reader on an interval.
24
+
25
+ Args:
26
+ reader: An interface to read data.
27
+ interval: The poll interval, in seconds.
28
+ """
29
+
30
+ interval: float
31
+
32
+ def __init__(self, reader: Reader, interval: float) -> None:
33
+ self.interval = interval
34
+ self._reader = reader
35
+ self._read_lock: Optional["asyncio.Lock"] = None
36
+ self._poll_waiters: List["asyncio.Future[None]"] = []
37
+ self._poll_forever_task: Optional["asyncio.Task[None]"] = None
38
+
39
+ async def start(self) -> None:
40
+ if self._poll_forever_task is None:
41
+ self._poll_forever_task = asyncio.create_task(self._poll_forever())
42
+ await self.wait_next_poll()
43
+
44
+ async def stop(self) -> None:
45
+ """Stop polling."""
46
+ task = self._poll_forever_task
47
+ if task is not None:
48
+ async with self._use_read_lock():
49
+ task.cancel()
50
+ await asyncio.gather(task, return_exceptions=True)
51
+ for waiter in self._poll_waiters:
52
+ waiter.cancel(msg="Module was removed")
53
+ self._poll_forever_task = None
54
+
55
+ async def wait_next_poll(self) -> None:
56
+ """Wait for the next poll to complete.
57
+
58
+ If called in the middle of a read, it will not return until
59
+ the next complete read. If a read raises an exception,
60
+ it will be passed through to `wait_next_poll`.
61
+ """
62
+ if not self._poll_forever_task or self._poll_forever_task.done():
63
+ raise ModuleCommunicationError(message="Module was removed")
64
+
65
+ poll_future = asyncio.get_running_loop().create_future()
66
+ self._poll_waiters.append(poll_future)
67
+ await poll_future
68
+
69
+ @contextlib.asynccontextmanager
70
+ async def _use_read_lock(self) -> AsyncGenerator[None, None]:
71
+ self._read_lock = self._read_lock or asyncio.Lock()
72
+
73
+ async with self._read_lock:
74
+ yield
75
+
76
+ async def _poll_forever(self) -> None:
77
+ """Polling loop."""
78
+ while True:
79
+ await self._poll_once()
80
+ await asyncio.sleep(self.interval)
81
+
82
+ @staticmethod
83
+ def _set_waiter_complete(
84
+ waiter: "asyncio.Future[None]", e: Optional[Exception] = None
85
+ ) -> None:
86
+ try:
87
+ waiter.set_result(None) if e is None else waiter.set_exception(e)
88
+ except asyncio.InvalidStateError:
89
+ log.warning("Poller waiter was already cancelled")
90
+
91
+ async def _poll_once(self) -> None:
92
+ """Trigger a single read, notifying listeners of success or error."""
93
+ previous_waiters = self._poll_waiters
94
+ self._poll_waiters = []
95
+
96
+ try:
97
+ async with self._use_read_lock():
98
+ await self._reader.read()
99
+ except asyncio.CancelledError:
100
+ raise
101
+ except AbsorbanceReaderDisconnectedError as e:
102
+ for waiter in previous_waiters:
103
+ Poller._set_waiter_complete(waiter, None)
104
+ self._reader.on_error(e)
105
+ except Exception as e:
106
+ log.exception("Polling exception")
107
+ self._reader.on_error(e)
108
+ for waiter in previous_waiters:
109
+ Poller._set_waiter_complete(waiter, e)
110
+ else:
111
+ for waiter in previous_waiters:
112
+ Poller._set_waiter_complete(waiter)
@@ -0,0 +1,106 @@
1
+ """Typing protocols describing a hardware controller."""
2
+ from typing_extensions import Protocol, Type
3
+
4
+ from .module_provider import ModuleProvider
5
+ from .hardware_manager import HardwareManager
6
+ from .chassis_accessory_manager import ChassisAccessoryManager
7
+ from .event_sourcer import EventSourcer
8
+ from .liquid_handler import LiquidHandler
9
+ from .calibratable import Calibratable
10
+ from .configurable import Configurable
11
+ from .motion_controller import MotionController
12
+ from .instrument_configurer import InstrumentConfigurer
13
+ from .execution_controllable import ExecutionControllable
14
+ from .asyncio_configurable import AsyncioConfigurable
15
+ from .stoppable import Stoppable
16
+ from .simulatable import Simulatable
17
+ from .identifiable import Identifiable
18
+ from .gripper_controller import GripperController
19
+ from .flex_calibratable import FlexCalibratable
20
+ from .flex_instrument_configurer import FlexInstrumentConfigurer
21
+ from .position_estimator import PositionEstimator
22
+
23
+ from .types import (
24
+ CalibrationType,
25
+ MountArgType,
26
+ ConfigType,
27
+ OT2RobotType,
28
+ FlexRobotType,
29
+ )
30
+
31
+
32
+ class HardwareControlInterface(
33
+ ModuleProvider,
34
+ ExecutionControllable,
35
+ LiquidHandler[CalibrationType, MountArgType, ConfigType],
36
+ ChassisAccessoryManager,
37
+ HardwareManager,
38
+ AsyncioConfigurable,
39
+ Stoppable,
40
+ Simulatable,
41
+ Identifiable[Type[OT2RobotType]],
42
+ Protocol[CalibrationType, MountArgType, ConfigType],
43
+ ):
44
+ """A mypy protocol for a hardware controller.
45
+
46
+ This class provides an protocol for the basic hardware controller class,
47
+ with at least two implementations: one for the OT-2, and one for the
48
+ OT-3. While the two classes have the same API, fundamental architectural
49
+ decisions in the OT-2 hardware controller (specifically the data types used
50
+ in the HardwareControl/backend split) make it unsuitable for the OT-3.
51
+
52
+ This is a protocol rather than an ABC because of the use of wrapping adapters
53
+ such as ThreadManager and SynchAdapter. Because those classes work via
54
+ getattr, they can't inherit from an ABC that requires specific methods;
55
+ however, they can satisfy protocols.
56
+ """
57
+
58
+ def get_robot_type(self) -> Type[OT2RobotType]:
59
+ return OT2RobotType
60
+
61
+
62
+ class FlexHardwareControlInterface(
63
+ PositionEstimator,
64
+ ModuleProvider,
65
+ ExecutionControllable,
66
+ LiquidHandler[CalibrationType, MountArgType, ConfigType],
67
+ ChassisAccessoryManager,
68
+ HardwareManager,
69
+ AsyncioConfigurable,
70
+ Stoppable,
71
+ Simulatable,
72
+ GripperController,
73
+ FlexCalibratable,
74
+ FlexInstrumentConfigurer[MountArgType],
75
+ Identifiable[Type[FlexRobotType]],
76
+ Protocol[CalibrationType, MountArgType, ConfigType],
77
+ ):
78
+ """A mypy protocol for a hardware controller with Flex-specific extensions.
79
+
80
+ The interface for the Flex controller is mostly in-line with the OT-2 interface,
81
+ with some additional functionality and parameterization not supported on the OT-2.
82
+ """
83
+
84
+ def get_robot_type(self) -> Type[FlexRobotType]:
85
+ return FlexRobotType
86
+
87
+
88
+ __all__ = [
89
+ "HardwareControlInterface",
90
+ "FlexHardwareControlInterface",
91
+ "Simulatable",
92
+ "Stoppable",
93
+ "AsyncioConfigurable",
94
+ "ExecutionControllable",
95
+ "InstrumentConfigurer",
96
+ "MotionController",
97
+ "Configurable",
98
+ "Calibratable",
99
+ "LiquidHandler",
100
+ "EventSourcer",
101
+ "ChassisAccessoryManager",
102
+ "HardwareManager",
103
+ "ModuleProvider",
104
+ "Identifiable",
105
+ "FlexCalibratable",
106
+ ]
@@ -0,0 +1,11 @@
1
+ from asyncio import AbstractEventLoop
2
+ from typing_extensions import Protocol
3
+
4
+
5
+ class AsyncioConfigurable(Protocol):
6
+ """Protocol specifying controllability of asyncio behavior"""
7
+
8
+ @property
9
+ def loop(self) -> AbstractEventLoop:
10
+ """The event loop used by this instance."""
11
+ ...
@@ -0,0 +1,45 @@
1
+ from typing_extensions import Protocol
2
+ from .types import CalibrationType
3
+
4
+ from ..util import DeckTransformState
5
+
6
+
7
+ class Calibratable(Protocol[CalibrationType]):
8
+ """Protocol specifying calibration information"""
9
+
10
+ @property
11
+ def robot_calibration(self) -> CalibrationType:
12
+ """The currently-active robot calibration of the machine."""
13
+ ...
14
+
15
+ def reset_robot_calibration(self) -> None:
16
+ """Reset the active robot calibration to the machine default.
17
+
18
+ This may be an identity on some machines but not on others; this
19
+ method is therefore preferred to using set_robot_calibration() with a
20
+ caller-constructed identity.
21
+ """
22
+ ...
23
+
24
+ def reset_deck_calibration(self) -> None:
25
+ """Resets only deck calibration data."""
26
+ ...
27
+
28
+ def load_deck_calibration(self) -> None:
29
+ """Loads only any deck calibration data that is stored."""
30
+ ...
31
+
32
+ def set_robot_calibration(self, robot_calibration: CalibrationType) -> None:
33
+ """Set the current robot calibration from stored data."""
34
+ ...
35
+
36
+ def validate_calibration(self) -> DeckTransformState:
37
+ """Check whether the current calibration is valid."""
38
+ ...
39
+
40
+ def build_temporary_identity_calibration(self) -> CalibrationType:
41
+ """
42
+ Get temporary default calibration data suitable for use during
43
+ calibration
44
+ """
45
+ ...
@@ -0,0 +1,90 @@
1
+ from typing import Dict, Optional
2
+ from typing_extensions import Protocol
3
+ from ..types import (
4
+ DoorState,
5
+ StatusBarState,
6
+ EstopState,
7
+ StatusBarUpdateListener,
8
+ StatusBarUpdateUnsubscriber,
9
+ )
10
+ from .event_sourcer import EventSourcer
11
+
12
+
13
+ class ChassisAccessoryManager(EventSourcer, Protocol):
14
+ """Protocol specifying control of non-motion peripherals on the robot."""
15
+
16
+ @property
17
+ def door_state(self) -> DoorState:
18
+ """The current state of the machine's door."""
19
+ ...
20
+
21
+ @property
22
+ def module_door_serial(self) -> str | None:
23
+ """The serial number of a module with an open door."""
24
+ ...
25
+
26
+ async def set_lights(
27
+ self,
28
+ button: Optional[bool] = None,
29
+ rails: Optional[bool] = None,
30
+ ) -> None:
31
+ """Control the robot lights.
32
+
33
+ button If specified, turn the button light on (`True`) or
34
+ off (`False`). If not specified, do not change the
35
+ button light.
36
+ rails: If specified, turn the rail lights on (`True`) or
37
+ off (`False`). If not specified, do not change the
38
+ rail lights.
39
+ """
40
+ ...
41
+
42
+ async def get_lights(self) -> Dict[str, bool]:
43
+ """Return the current status of the robot lights.
44
+
45
+ :returns: A dict of the lights: `{'button': bool, 'rails': bool}`
46
+ """
47
+ ...
48
+
49
+ async def identify(self, duration_s: int = 5) -> None:
50
+ """Run a routine to identify the robot.
51
+
52
+ duration_s: The duration to blink for, in seconds.
53
+ """
54
+ ...
55
+
56
+ async def set_status_bar_state(self, state: StatusBarState) -> None:
57
+ """Control the status bar to indicate robot state.
58
+
59
+ state: The state to set the robot to. Some states are transient
60
+ and will implicitly revert back to the previous state after a short
61
+ action, while others"""
62
+ ...
63
+
64
+ async def set_status_bar_enabled(self, enabled: bool) -> None:
65
+ """Enable or disable the status bar entirely.
66
+
67
+ enabled: True to turn the status bar on, false to turn it off."""
68
+
69
+ def get_status_bar_state(self) -> StatusBarState:
70
+ """Get the current status bar state.
71
+
72
+ :returns: The current status bar state enumeration."""
73
+ ...
74
+
75
+ def add_status_bar_listener(
76
+ self, listener: StatusBarUpdateListener
77
+ ) -> StatusBarUpdateUnsubscriber:
78
+ """Add a listener to the status bar state.
79
+
80
+ listener: The listener to add.
81
+ :returns: A callback function that removes the listener."""
82
+ ...
83
+
84
+ def get_estop_state(self) -> EstopState:
85
+ """Get the current Estop state.
86
+
87
+ If the Estop is not supported on this robot, this will always return Disengaged.
88
+
89
+ :returns: The current Estop state."""
90
+ ...
@@ -0,0 +1,48 @@
1
+ from typing import Dict, Any
2
+ from typing_extensions import Protocol
3
+
4
+ from .types import ConfigType
5
+ from opentrons.hardware_control.types import HardwareFeatureFlags
6
+
7
+
8
+ class Configurable(Protocol[ConfigType]):
9
+ """Protocol specifying hardware control configuration."""
10
+
11
+ def get_config(self) -> ConfigType:
12
+ """Get the robot's configuration object.
13
+
14
+ :returns .RobotConfig: The object.
15
+ """
16
+ ...
17
+
18
+ def set_config(self, config: ConfigType) -> None:
19
+ """Replace the currently-loaded config"""
20
+ ...
21
+
22
+ @property
23
+ def hardware_feature_flags(self) -> HardwareFeatureFlags:
24
+ ...
25
+
26
+ @hardware_feature_flags.setter
27
+ def hardware_feature_flags(self, feature_flags: HardwareFeatureFlags) -> None:
28
+ """Replace the currently-configured hardware feature flags."""
29
+ ...
30
+
31
+ @property
32
+ def config(self) -> ConfigType:
33
+ ...
34
+
35
+ @config.setter
36
+ def config(self, config: ConfigType) -> None:
37
+ ...
38
+
39
+ async def update_config(self, **kwargs: Dict[str, Any]) -> None:
40
+ """Update values of the robot's configuration.
41
+
42
+ `kwargs` should contain keys of the robot's configuration. For
43
+ instance, `update_config(log_level='debug)` would change the API
44
+ server log level to logging.DEBUG.
45
+
46
+ Documentation on keys can be found in the documentation for RobotConfig.
47
+ """
48
+ ...
@@ -0,0 +1,18 @@
1
+ from typing import Callable
2
+ from typing_extensions import Protocol
3
+
4
+ from ..types import HardwareEventHandler
5
+
6
+
7
+ class EventSourcer(Protocol):
8
+ """Protocol specifying how to react to events."""
9
+
10
+ def register_callback(self, cb: HardwareEventHandler) -> Callable[[], None]:
11
+ """Register a callback that will be called when an event occurs.
12
+
13
+ The events may be asynchronous, from various things that can happen
14
+ to the hardware (for instance, the door opening or closing).
15
+
16
+ The returned callable removes the callback.
17
+ """
18
+ ...
@@ -0,0 +1,33 @@
1
+ from typing_extensions import Protocol
2
+ from ..types import PauseType
3
+
4
+
5
+ class ExecutionControllable(Protocol):
6
+ """A protocol specifying run control (pause, resume)."""
7
+
8
+ def pause(self, pause_type: PauseType) -> None:
9
+ """
10
+ Pause motion of the robot after a current motion concludes.
11
+
12
+ Individual calls to move
13
+ (which aspirate and dispense and other calls may depend on) are
14
+ considered atomic and will always complete if they have been called
15
+ prior to a call to this method. However, subsequent calls to move that
16
+ occur when the system is paused will not proceed until the system is
17
+ resumed with resume.
18
+ """
19
+ ...
20
+
21
+ def pause_with_message(self, message: str) -> None:
22
+ """Pause motion of the robot as with pause, but specify a message."""
23
+ ...
24
+
25
+ def resume(self, pause_type: PauseType) -> None:
26
+ """
27
+ Resume motion after a call to pause.
28
+ """
29
+ ...
30
+
31
+ async def delay(self, duration_s: float) -> None:
32
+ """Delay execution by pausing and sleeping."""
33
+ ...
@@ -0,0 +1,96 @@
1
+ from typing import Optional, Tuple, List, AsyncIterator, Union
2
+ import contextlib
3
+ from typing_extensions import Protocol
4
+
5
+ from opentrons import types as top_types
6
+ from opentrons.config.types import (
7
+ CapacitivePassSettings,
8
+ )
9
+ from opentrons.hardware_control.types import (
10
+ Axis,
11
+ OT3Mount,
12
+ InstrumentProbeType,
13
+ GripperProbe,
14
+ )
15
+ from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
16
+ GripperCalibrationOffset,
17
+ PipetteOffsetSummary,
18
+ )
19
+ from opentrons.hardware_control.modules.module_calibration import (
20
+ ModuleCalibrationOffset,
21
+ )
22
+
23
+
24
+ class FlexCalibratable(Protocol):
25
+ """Calibration extensions for Flex hardware."""
26
+
27
+ async def capacitive_probe(
28
+ self,
29
+ mount: OT3Mount,
30
+ moving_axis: Axis,
31
+ target_pos: float,
32
+ pass_settings: CapacitivePassSettings,
33
+ retract_after: bool = True,
34
+ probe: Optional[InstrumentProbeType] = None,
35
+ ) -> Tuple[float, bool]:
36
+ """Determine the position of something using the capacitive sensor.
37
+
38
+ This function orchestrates detecting the position of a collision between the
39
+ capacitive probe on the tool on the specified mount, and some fixed element
40
+ of the robot.
41
+
42
+ When calling this function, the mount's probe critical point should already
43
+ be aligned in the probe axis with the item to be probed.
44
+
45
+ It will move the mount's probe critical point to a small distance behind
46
+ the expected position of the element (which is target_pos, in deck coordinates,
47
+ in the axis to be probed) while running the tool's capacitive sensor. When the
48
+ sensor senses contact, the mount stops.
49
+
50
+ This function moves away and returns the sensed position.
51
+
52
+ This sensed position can be used in several ways, including
53
+ - To get an absolute position in deck coordinates of whatever was
54
+ targeted, if something was guaranteed to be physically present.
55
+ - To detect whether a collision occured at all. If this function
56
+ returns a value far enough past the anticipated position, then it indicates
57
+ there was no material there.
58
+ """
59
+ ...
60
+
61
+ async def capacitive_sweep(
62
+ self,
63
+ mount: OT3Mount,
64
+ moving_axis: Axis,
65
+ begin: top_types.Point,
66
+ end: top_types.Point,
67
+ speed_mm_s: float,
68
+ ) -> List[float]:
69
+ ...
70
+
71
+ # Note that there is a default implementation of this function to allow for
72
+ # the asynccontextmanager decorator to propagate properly.
73
+ @contextlib.asynccontextmanager
74
+ async def restore_system_constrants(self) -> AsyncIterator[None]:
75
+ yield
76
+
77
+ async def reset_instrument_offset(
78
+ self, mount: Union[top_types.Mount, OT3Mount], to_default: bool = True
79
+ ) -> None:
80
+ ...
81
+
82
+ def add_gripper_probe(self, probe: GripperProbe) -> None:
83
+ ...
84
+
85
+ def remove_gripper_probe(self) -> None:
86
+ ...
87
+
88
+ async def save_instrument_offset(
89
+ self, mount: Union[top_types.Mount, OT3Mount], delta: top_types.Point
90
+ ) -> Union[GripperCalibrationOffset, PipetteOffsetSummary]:
91
+ ...
92
+
93
+ async def save_module_offset(
94
+ self, module_id: str, mount: OT3Mount, slot: str, offset: top_types.Point
95
+ ) -> Optional[ModuleCalibrationOffset]:
96
+ ...
@@ -0,0 +1,52 @@
1
+ """Flex-specific extensions to instrument configuration."""
2
+ from typing import Union, Optional
3
+ from typing_extensions import Protocol
4
+
5
+ from .types import MountArgType
6
+
7
+ from opentrons.hardware_control.dev_types import (
8
+ PipetteStateDict,
9
+ )
10
+ from opentrons.hardware_control.types import (
11
+ TipStateType,
12
+ InstrumentProbeType,
13
+ )
14
+ from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
15
+ PipetteOffsetSummary,
16
+ GripperCalibrationOffset,
17
+ )
18
+
19
+
20
+ class FlexInstrumentConfigurer(Protocol[MountArgType]):
21
+ """A protocol specifying Flex-specific extensions to instrument configuration."""
22
+
23
+ async def get_instrument_state(
24
+ self,
25
+ mount: MountArgType,
26
+ ) -> PipetteStateDict:
27
+ ...
28
+
29
+ def get_instrument_offset(
30
+ self, mount: MountArgType
31
+ ) -> Union[GripperCalibrationOffset, PipetteOffsetSummary, None]:
32
+ ...
33
+
34
+ async def get_tip_presence_status(
35
+ self,
36
+ mount: MountArgType,
37
+ ) -> TipStateType:
38
+ """Check tip presence status.
39
+
40
+ If a high throughput pipette is present,
41
+ move the tip motors down before checking the sensor status.
42
+ """
43
+ ...
44
+
45
+ async def verify_tip_presence(
46
+ self,
47
+ mount: MountArgType,
48
+ expected: TipStateType,
49
+ follow_singular_sensor: Optional[InstrumentProbeType] = None,
50
+ ) -> None:
51
+ """Check tip presence status and raise if it does not match `expected`."""
52
+ ...