opentrons 8.6.0a1__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 (600) 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 +501 -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 +183 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +552 -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/simulator_setup.py +260 -0
  200. opentrons/hardware_control/thread_manager.py +431 -0
  201. opentrons/hardware_control/threaded_async_lock.py +97 -0
  202. opentrons/hardware_control/types.py +792 -0
  203. opentrons/hardware_control/util.py +234 -0
  204. opentrons/legacy_broker.py +53 -0
  205. opentrons/legacy_commands/__init__.py +1 -0
  206. opentrons/legacy_commands/commands.py +483 -0
  207. opentrons/legacy_commands/helpers.py +153 -0
  208. opentrons/legacy_commands/module_commands.py +215 -0
  209. opentrons/legacy_commands/protocol_commands.py +54 -0
  210. opentrons/legacy_commands/publisher.py +155 -0
  211. opentrons/legacy_commands/robot_commands.py +51 -0
  212. opentrons/legacy_commands/types.py +1115 -0
  213. opentrons/motion_planning/__init__.py +32 -0
  214. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  215. opentrons/motion_planning/deck_conflict.py +396 -0
  216. opentrons/motion_planning/errors.py +35 -0
  217. opentrons/motion_planning/types.py +42 -0
  218. opentrons/motion_planning/waypoints.py +218 -0
  219. opentrons/ordered_set.py +138 -0
  220. opentrons/protocol_api/__init__.py +105 -0
  221. opentrons/protocol_api/_liquid.py +157 -0
  222. opentrons/protocol_api/_liquid_properties.py +814 -0
  223. opentrons/protocol_api/_nozzle_layout.py +31 -0
  224. opentrons/protocol_api/_parameter_context.py +300 -0
  225. opentrons/protocol_api/_parameters.py +31 -0
  226. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  227. opentrons/protocol_api/_types.py +43 -0
  228. opentrons/protocol_api/config.py +23 -0
  229. opentrons/protocol_api/core/__init__.py +23 -0
  230. opentrons/protocol_api/core/common.py +33 -0
  231. opentrons/protocol_api/core/core_map.py +74 -0
  232. opentrons/protocol_api/core/engine/__init__.py +22 -0
  233. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  234. opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
  235. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  236. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  237. opentrons/protocol_api/core/engine/labware.py +238 -0
  238. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  239. opentrons/protocol_api/core/engine/module_core.py +1025 -0
  240. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  241. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  242. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  243. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  244. opentrons/protocol_api/core/engine/robot.py +139 -0
  245. opentrons/protocol_api/core/engine/stringify.py +74 -0
  246. opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
  247. opentrons/protocol_api/core/engine/well.py +241 -0
  248. opentrons/protocol_api/core/instrument.py +459 -0
  249. opentrons/protocol_api/core/labware.py +151 -0
  250. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  251. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  252. opentrons/protocol_api/core/legacy/deck.py +369 -0
  253. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  254. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  255. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  256. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  257. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  258. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  259. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  260. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  261. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  262. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  263. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  265. opentrons/protocol_api/core/module.py +484 -0
  266. opentrons/protocol_api/core/protocol.py +311 -0
  267. opentrons/protocol_api/core/robot.py +51 -0
  268. opentrons/protocol_api/core/well.py +116 -0
  269. opentrons/protocol_api/core/well_grid.py +45 -0
  270. opentrons/protocol_api/create_protocol_context.py +177 -0
  271. opentrons/protocol_api/deck.py +223 -0
  272. opentrons/protocol_api/disposal_locations.py +244 -0
  273. opentrons/protocol_api/instrument_context.py +3212 -0
  274. opentrons/protocol_api/labware.py +1579 -0
  275. opentrons/protocol_api/module_contexts.py +1425 -0
  276. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  277. opentrons/protocol_api/protocol_context.py +1688 -0
  278. opentrons/protocol_api/robot_context.py +303 -0
  279. opentrons/protocol_api/validation.py +761 -0
  280. opentrons/protocol_engine/__init__.py +155 -0
  281. opentrons/protocol_engine/actions/__init__.py +65 -0
  282. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  283. opentrons/protocol_engine/actions/action_handler.py +13 -0
  284. opentrons/protocol_engine/actions/actions.py +302 -0
  285. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  286. opentrons/protocol_engine/clients/__init__.py +5 -0
  287. opentrons/protocol_engine/clients/sync_client.py +174 -0
  288. opentrons/protocol_engine/clients/transports.py +197 -0
  289. opentrons/protocol_engine/commands/__init__.py +757 -0
  290. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  296. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  297. opentrons/protocol_engine/commands/aspirate.py +244 -0
  298. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  299. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  300. opentrons/protocol_engine/commands/blow_out.py +146 -0
  301. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  302. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  303. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  306. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  307. opentrons/protocol_engine/commands/command.py +308 -0
  308. opentrons/protocol_engine/commands/command_unions.py +974 -0
  309. opentrons/protocol_engine/commands/comment.py +57 -0
  310. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  311. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  312. opentrons/protocol_engine/commands/custom.py +67 -0
  313. opentrons/protocol_engine/commands/dispense.py +194 -0
  314. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  315. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  316. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  317. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  318. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  319. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  320. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  321. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  322. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  323. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  324. opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
  325. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  326. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  327. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  328. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  329. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  330. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  331. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  333. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  334. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  336. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  337. opentrons/protocol_engine/commands/home.py +100 -0
  338. opentrons/protocol_engine/commands/identify_module.py +86 -0
  339. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  340. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  341. opentrons/protocol_engine/commands/load_labware.py +210 -0
  342. opentrons/protocol_engine/commands/load_lid.py +154 -0
  343. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  344. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  345. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  346. opentrons/protocol_engine/commands/load_module.py +223 -0
  347. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  348. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  349. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  350. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  351. opentrons/protocol_engine/commands/move_labware.py +546 -0
  352. opentrons/protocol_engine/commands/move_relative.py +102 -0
  353. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  355. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  356. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  357. opentrons/protocol_engine/commands/movement_common.py +338 -0
  358. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  359. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  360. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  361. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  362. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  363. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  364. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  365. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  366. opentrons/protocol_engine/commands/robot/common.py +18 -0
  367. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  369. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  370. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  371. opentrons/protocol_engine/commands/save_position.py +109 -0
  372. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  373. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  374. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  375. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  376. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  377. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  378. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  379. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  380. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  381. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  384. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  386. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  388. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  390. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  391. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  392. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  401. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  402. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  403. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  404. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  405. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  406. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  407. opentrons/protocol_engine/engine_support.py +28 -0
  408. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  409. opentrons/protocol_engine/errors/__init__.py +191 -0
  410. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  411. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  412. opentrons/protocol_engine/execution/__init__.py +50 -0
  413. opentrons/protocol_engine/execution/command_executor.py +216 -0
  414. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  415. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  416. opentrons/protocol_engine/execution/equipment.py +819 -0
  417. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  418. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  419. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  420. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  421. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  422. opentrons/protocol_engine/execution/movement.py +349 -0
  423. opentrons/protocol_engine/execution/pipetting.py +607 -0
  424. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  425. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  426. opentrons/protocol_engine/execution/run_control.py +33 -0
  427. opentrons/protocol_engine/execution/status_bar.py +34 -0
  428. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  429. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  430. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  431. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  432. opentrons/protocol_engine/notes/__init__.py +17 -0
  433. opentrons/protocol_engine/notes/notes.py +59 -0
  434. opentrons/protocol_engine/plugins.py +104 -0
  435. opentrons/protocol_engine/protocol_engine.py +683 -0
  436. opentrons/protocol_engine/resources/__init__.py +26 -0
  437. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  438. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  439. opentrons/protocol_engine/resources/file_provider.py +161 -0
  440. opentrons/protocol_engine/resources/fixture_validation.py +58 -0
  441. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  442. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  443. opentrons/protocol_engine/resources/model_utils.py +32 -0
  444. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  445. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  446. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  447. opentrons/protocol_engine/slot_standardization.py +128 -0
  448. opentrons/protocol_engine/state/__init__.py +1 -0
  449. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  450. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  451. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  452. opentrons/protocol_engine/state/_move_types.py +83 -0
  453. opentrons/protocol_engine/state/_well_math.py +193 -0
  454. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  455. opentrons/protocol_engine/state/command_history.py +309 -0
  456. opentrons/protocol_engine/state/commands.py +1158 -0
  457. opentrons/protocol_engine/state/config.py +39 -0
  458. opentrons/protocol_engine/state/files.py +57 -0
  459. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  460. opentrons/protocol_engine/state/geometry.py +2359 -0
  461. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  462. opentrons/protocol_engine/state/labware.py +1459 -0
  463. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  464. opentrons/protocol_engine/state/liquids.py +73 -0
  465. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  466. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  467. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  468. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  469. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  471. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  472. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  473. opentrons/protocol_engine/state/modules.py +1500 -0
  474. opentrons/protocol_engine/state/motion.py +373 -0
  475. opentrons/protocol_engine/state/pipettes.py +905 -0
  476. opentrons/protocol_engine/state/state.py +421 -0
  477. opentrons/protocol_engine/state/state_summary.py +36 -0
  478. opentrons/protocol_engine/state/tips.py +420 -0
  479. opentrons/protocol_engine/state/update_types.py +904 -0
  480. opentrons/protocol_engine/state/wells.py +290 -0
  481. opentrons/protocol_engine/types/__init__.py +308 -0
  482. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  483. opentrons/protocol_engine/types/command_annotations.py +53 -0
  484. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  485. opentrons/protocol_engine/types/execution.py +96 -0
  486. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  487. opentrons/protocol_engine/types/instrument.py +47 -0
  488. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  489. opentrons/protocol_engine/types/labware.py +131 -0
  490. opentrons/protocol_engine/types/labware_movement.py +22 -0
  491. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  492. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  493. opentrons/protocol_engine/types/liquid.py +40 -0
  494. opentrons/protocol_engine/types/liquid_class.py +59 -0
  495. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  496. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  497. opentrons/protocol_engine/types/location.py +194 -0
  498. opentrons/protocol_engine/types/module.py +303 -0
  499. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  500. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  501. opentrons/protocol_engine/types/tip.py +18 -0
  502. opentrons/protocol_engine/types/util.py +21 -0
  503. opentrons/protocol_engine/types/well_position.py +124 -0
  504. opentrons/protocol_reader/__init__.py +37 -0
  505. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  506. opentrons/protocol_reader/file_format_validator.py +152 -0
  507. opentrons/protocol_reader/file_hasher.py +27 -0
  508. opentrons/protocol_reader/file_identifier.py +284 -0
  509. opentrons/protocol_reader/file_reader_writer.py +90 -0
  510. opentrons/protocol_reader/input_file.py +16 -0
  511. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  512. opentrons/protocol_reader/protocol_reader.py +188 -0
  513. opentrons/protocol_reader/protocol_source.py +124 -0
  514. opentrons/protocol_reader/role_analyzer.py +86 -0
  515. opentrons/protocol_runner/__init__.py +26 -0
  516. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  517. opentrons/protocol_runner/json_file_reader.py +55 -0
  518. opentrons/protocol_runner/json_translator.py +314 -0
  519. opentrons/protocol_runner/legacy_command_mapper.py +848 -0
  520. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  521. opentrons/protocol_runner/protocol_runner.py +530 -0
  522. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  523. opentrons/protocol_runner/run_orchestrator.py +496 -0
  524. opentrons/protocol_runner/task_queue.py +95 -0
  525. opentrons/protocols/__init__.py +6 -0
  526. opentrons/protocols/advanced_control/__init__.py +0 -0
  527. opentrons/protocols/advanced_control/common.py +38 -0
  528. opentrons/protocols/advanced_control/mix.py +60 -0
  529. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  530. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  531. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  532. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  533. opentrons/protocols/api_support/__init__.py +0 -0
  534. opentrons/protocols/api_support/constants.py +8 -0
  535. opentrons/protocols/api_support/deck_type.py +110 -0
  536. opentrons/protocols/api_support/definitions.py +18 -0
  537. opentrons/protocols/api_support/instrument.py +151 -0
  538. opentrons/protocols/api_support/labware_like.py +233 -0
  539. opentrons/protocols/api_support/tip_tracker.py +175 -0
  540. opentrons/protocols/api_support/types.py +32 -0
  541. opentrons/protocols/api_support/util.py +403 -0
  542. opentrons/protocols/bundle.py +89 -0
  543. opentrons/protocols/duration/__init__.py +4 -0
  544. opentrons/protocols/duration/errors.py +5 -0
  545. opentrons/protocols/duration/estimator.py +628 -0
  546. opentrons/protocols/execution/__init__.py +0 -0
  547. opentrons/protocols/execution/dev_types.py +181 -0
  548. opentrons/protocols/execution/errors.py +40 -0
  549. opentrons/protocols/execution/execute.py +84 -0
  550. opentrons/protocols/execution/execute_json_v3.py +275 -0
  551. opentrons/protocols/execution/execute_json_v4.py +359 -0
  552. opentrons/protocols/execution/execute_json_v5.py +28 -0
  553. opentrons/protocols/execution/execute_python.py +169 -0
  554. opentrons/protocols/execution/json_dispatchers.py +87 -0
  555. opentrons/protocols/execution/types.py +7 -0
  556. opentrons/protocols/geometry/__init__.py +0 -0
  557. opentrons/protocols/geometry/planning.py +297 -0
  558. opentrons/protocols/labware.py +312 -0
  559. opentrons/protocols/models/__init__.py +0 -0
  560. opentrons/protocols/models/json_protocol.py +679 -0
  561. opentrons/protocols/parameters/__init__.py +0 -0
  562. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  563. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  564. opentrons/protocols/parameters/exceptions.py +34 -0
  565. opentrons/protocols/parameters/parameter_definition.py +272 -0
  566. opentrons/protocols/parameters/types.py +17 -0
  567. opentrons/protocols/parameters/validation.py +267 -0
  568. opentrons/protocols/parse.py +671 -0
  569. opentrons/protocols/types.py +159 -0
  570. opentrons/py.typed +0 -0
  571. opentrons/resources/scripts/lpc21isp +0 -0
  572. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  573. opentrons/simulate.py +1065 -0
  574. opentrons/system/__init__.py +6 -0
  575. opentrons/system/camera.py +51 -0
  576. opentrons/system/log_control.py +59 -0
  577. opentrons/system/nmcli.py +856 -0
  578. opentrons/system/resin.py +24 -0
  579. opentrons/system/smoothie_update.py +15 -0
  580. opentrons/system/wifi.py +204 -0
  581. opentrons/tools/__init__.py +0 -0
  582. opentrons/tools/args_handler.py +22 -0
  583. opentrons/tools/write_pipette_memory.py +157 -0
  584. opentrons/types.py +618 -0
  585. opentrons/util/__init__.py +1 -0
  586. opentrons/util/async_helpers.py +166 -0
  587. opentrons/util/broker.py +84 -0
  588. opentrons/util/change_notifier.py +47 -0
  589. opentrons/util/entrypoint_util.py +278 -0
  590. opentrons/util/get_union_elements.py +26 -0
  591. opentrons/util/helpers.py +6 -0
  592. opentrons/util/linal.py +178 -0
  593. opentrons/util/logging_config.py +265 -0
  594. opentrons/util/logging_queue_handler.py +61 -0
  595. opentrons/util/performance_helpers.py +157 -0
  596. opentrons-8.6.0a1.dist-info/METADATA +37 -0
  597. opentrons-8.6.0a1.dist-info/RECORD +600 -0
  598. opentrons-8.6.0a1.dist-info/WHEEL +4 -0
  599. opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
  600. opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,367 @@
1
+ from enum import Enum
2
+ from dataclasses import dataclass, fields
3
+ from typing import List, Dict, Optional
4
+
5
+ from opentrons.drivers.command_builder import CommandBuilder
6
+
7
+
8
+ class GCODE(str, Enum):
9
+
10
+ MOVE_TO = "G0"
11
+ MOVE_TO_SWITCH = "G5"
12
+ HOME_AXIS = "G28"
13
+ STOP_MOTORS = "M0"
14
+ ENABLE_MOTORS = "M17"
15
+ GET_ESTOP_ENGAGED = "M112"
16
+ GET_RESET_REASON = "M114"
17
+ DEVICE_INFO = "M115"
18
+ GET_LIMIT_SWITCH = "M119"
19
+ GET_MOVE_PARAMS = "M120"
20
+ GET_PLATFORM_SENSOR = "M121"
21
+ GET_DOOR_SWITCH = "M122"
22
+ GET_INSTALL_DETECTED = "M123"
23
+ GET_STALLGUARD_THRESHOLD = "M911"
24
+ GET_MOTOR_DRIVER_REGISTER = "M920"
25
+ GET_TOF_SENSOR_STATUS = "M215"
26
+ GET_TOF_DRIVER_REGISTER = "M222"
27
+ GET_TOF_MEASUREMENT = "M226"
28
+ ENABLE_TOF_SENSOR = "M224"
29
+ MANAGE_TOF_MEASUREMENT = "M225"
30
+ SET_TOF_CONFIGURATION = "M227"
31
+ GET_TOF_CONFIGURATION = "M228"
32
+ SET_LED = "M200"
33
+ SET_SERIAL_NUMBER = "M996"
34
+ SET_RUN_CURRENT = "M906"
35
+ SET_IHOLD_CURRENT = "M907"
36
+ SET_STALLGUARD = "M910"
37
+ SET_MOTOR_DRIVER_REGISTER = "M921"
38
+ SET_TOF_DRIVER_REGISTER = "M223"
39
+ ENTER_BOOTLOADER = "dfu"
40
+
41
+ def build_command(self) -> CommandBuilder:
42
+ """Build command."""
43
+ return CommandBuilder().add_gcode(self)
44
+
45
+
46
+ STACKER_VID = 0x483
47
+ STACKER_PID = 0xEF24
48
+ STACKER_FREQ = 115200
49
+
50
+
51
+ class HardwareRevision(Enum):
52
+ """Hardware Revision."""
53
+
54
+ NFF = "nff"
55
+ EVT = "a1"
56
+ DVT = "b1"
57
+ PVT = "b2"
58
+
59
+
60
+ @dataclass
61
+ class StackerInfo:
62
+ """Stacker Info."""
63
+
64
+ fw: str
65
+ hw: HardwareRevision
66
+ sn: str
67
+ rr: int = 0
68
+
69
+ def to_dict(self) -> Dict[str, str]:
70
+ """Build command."""
71
+ return {
72
+ "serial": self.sn,
73
+ "version": self.fw,
74
+ "model": self.hw.value,
75
+ "reset_reason": str(self.rr),
76
+ }
77
+
78
+
79
+ class StackerAxis(str, Enum):
80
+ """Stacker Axis."""
81
+
82
+ X = "X"
83
+ Z = "Z"
84
+ L = "L"
85
+
86
+
87
+ class TOFSensor(str, Enum):
88
+ """Stacker TOF sensor."""
89
+
90
+ X = "X"
91
+ Z = "Z"
92
+
93
+
94
+ class LEDColor(Enum):
95
+ """Stacker LED Color."""
96
+
97
+ WHITE = 0
98
+ RED = 1
99
+ GREEN = 2
100
+ BLUE = 3
101
+ YELLOW = 4
102
+
103
+ @classmethod
104
+ def from_name(cls, name: str) -> "LEDColor":
105
+ match (name.lower()):
106
+ case "red":
107
+ return cls.RED
108
+ case "green":
109
+ return cls.GREEN
110
+ case "blue":
111
+ return cls.BLUE
112
+ case "yellow":
113
+ return cls.YELLOW
114
+ case _:
115
+ return cls.WHITE
116
+
117
+ def to_name(self) -> "str":
118
+ return self.name.lower()
119
+
120
+
121
+ class LEDPattern(Enum):
122
+ """Stacker LED Pattern."""
123
+
124
+ STATIC = 0
125
+ FLASH = 1
126
+ PULSE = 2
127
+ CONFIRM = 3
128
+
129
+
130
+ class Direction(Enum):
131
+ """Direction."""
132
+
133
+ RETRACT = 0 # negative
134
+ EXTEND = 1 # positive
135
+
136
+ def __str__(self) -> str:
137
+ """Convert to tag for clear logging."""
138
+ return self.name.lower()
139
+
140
+ def polarity(self) -> str:
141
+ """Convert to polarity tag for testing."""
142
+ return "positive" if self == Direction.EXTEND else "negative"
143
+
144
+ def opposite(self) -> "Direction":
145
+ """Get opposite direction."""
146
+ return Direction.EXTEND if self == Direction.RETRACT else Direction.RETRACT
147
+
148
+ def distance(self, distance: float) -> float:
149
+ """Get signed distance, where retract direction is negative."""
150
+ return distance * -1 if self == Direction.RETRACT else distance
151
+
152
+
153
+ class TOFSensorState(Enum):
154
+ """TOF Sensor state."""
155
+
156
+ DISABLED = 0
157
+ INITIALIZING = 1
158
+ IDLE = 2
159
+ MEASURING = 3
160
+ ERROR = 4
161
+
162
+
163
+ class TOFSensorMode(Enum):
164
+ """The mode the sensor is in."""
165
+
166
+ UNKNOWN = 0
167
+ MEASURE = 0x03
168
+ BOOTLOADER = 0x80
169
+
170
+
171
+ @dataclass
172
+ class LimitSwitchStatus:
173
+ """Stacker Limit Switch Statuses."""
174
+
175
+ XE: bool
176
+ XR: bool
177
+ ZE: bool
178
+ ZR: bool
179
+ LR: bool
180
+
181
+ @classmethod
182
+ def get_fields(cls) -> List[str]:
183
+ """Get fields."""
184
+ return [f.name for f in fields(cls)]
185
+
186
+ def get(self, axis: StackerAxis, direction: Direction) -> bool:
187
+ """Get limit switch status."""
188
+ if axis == StackerAxis.X:
189
+ return self.XE if direction == Direction.EXTEND else self.XR
190
+ if axis == StackerAxis.Z:
191
+ return self.ZE if direction == Direction.EXTEND else self.ZR
192
+ if direction == Direction.EXTEND:
193
+ raise ValueError("Latch does not have extent limit switch")
194
+ return self.LR
195
+
196
+
197
+ @dataclass
198
+ class PlatformStatus:
199
+ """Stacker Platform Statuses."""
200
+
201
+ E: bool
202
+ R: bool
203
+
204
+ @classmethod
205
+ def get_fields(cls) -> List[str]:
206
+ """Get fields."""
207
+ return [f.name for f in fields(cls)]
208
+
209
+ def get(self, direction: Direction) -> bool:
210
+ """Get platform status."""
211
+ return self.E if direction == Direction.EXTEND else self.R
212
+
213
+ def to_dict(self) -> Dict[str, bool]:
214
+ """Dict of the data."""
215
+ return {
216
+ "extent": self.E,
217
+ "retract": self.R,
218
+ }
219
+
220
+
221
+ @dataclass
222
+ class TOFSensorStatus:
223
+ """Stacker TOF sensor status."""
224
+
225
+ sensor: TOFSensor
226
+ state: TOFSensorState
227
+ mode: TOFSensorMode
228
+ ok: bool
229
+
230
+
231
+ @dataclass
232
+ class MoveParams:
233
+ """Move Parameters."""
234
+
235
+ max_speed: float
236
+ acceleration: float
237
+ max_speed_discont: float
238
+
239
+ @classmethod
240
+ def get_fields(cls) -> List[str]:
241
+ """Get parsing fields."""
242
+ return ["V", "A", "D"]
243
+
244
+ def update(
245
+ self,
246
+ max_speed: Optional[float] = None,
247
+ acceleration: Optional[float] = None,
248
+ max_speed_discont: Optional[float] = None,
249
+ ) -> "MoveParams":
250
+ """Update the move parameters and return a new object."""
251
+ return MoveParams(
252
+ max_speed=max_speed if max_speed is not None else self.max_speed,
253
+ acceleration=acceleration
254
+ if acceleration is not None
255
+ else self.acceleration,
256
+ max_speed_discont=max_speed_discont
257
+ if max_speed_discont is not None
258
+ else self.max_speed_discont,
259
+ )
260
+
261
+
262
+ @dataclass
263
+ class AxisParams:
264
+ """Axis Parameters."""
265
+
266
+ run_current: float
267
+ hold_current: float
268
+ move_params: MoveParams
269
+
270
+
271
+ @dataclass
272
+ class StallGuardParams:
273
+ """StallGuard Parameters."""
274
+
275
+ axis: StackerAxis
276
+ enabled: bool
277
+ threshold: int
278
+
279
+
280
+ class MoveResult(str, Enum):
281
+ """The result of a move command."""
282
+
283
+ NO_ERROR = "ok"
284
+ STALL_ERROR = "stall"
285
+ UNKNOWN_ERROR = "unknown"
286
+
287
+
288
+ class MeasurementKind(Enum):
289
+ """The kind of measurement to request."""
290
+
291
+ HISTOGRAM = 0
292
+
293
+
294
+ class SpadMapID(Enum):
295
+ """The spad map id for the TOF sensor."""
296
+
297
+ SPAD_MAP_ID_1 = 1
298
+ # 3x3 macro 1 mode 33°x47° FoV off center
299
+ SPAD_MAP_ID_2 = 2
300
+ # 3x3 macro 2 mode 33°x47° FoV
301
+ SPAD_MAP_ID_3 = 3
302
+ # 3x3 wide mode 41°x52° FoV
303
+ SPAD_MAP_ID_6 = 6
304
+ # 3x3 mode 33°x32° FoV, checkerboard
305
+ SPAD_MAP_ID_11 = 11
306
+ # 3x3 mode 33°x32° FoV, inverted checkerboard
307
+ SPAD_MAP_ID_12 = 12
308
+ # User defined mode, single measurement mode
309
+ SPAD_MAP_ID_14 = 14
310
+
311
+
312
+ class ActiveRange(Enum):
313
+ """The active range for the TOF sensor."""
314
+
315
+ NOT_SUPPORTED = 0
316
+ SHORT_RANGE = 0x6E
317
+ LONG_RANGE = 0x6F
318
+
319
+
320
+ @dataclass
321
+ class TOFMeasurement:
322
+ """The start measurement data."""
323
+
324
+ sensor: TOFSensor
325
+ kind: MeasurementKind
326
+ cancelled: bool
327
+ total_bytes: int
328
+
329
+
330
+ @dataclass
331
+ class TOFMeasurementFrame:
332
+ """Stacker TOF measurement frame."""
333
+
334
+ sensor: TOFSensor
335
+ frame_id: int
336
+ data: bytes
337
+
338
+
339
+ @dataclass
340
+ class TOFMeasurementResult:
341
+ """Stacker TOF measurement result."""
342
+
343
+ sensor: TOFSensor
344
+ kind: MeasurementKind
345
+ bins: Dict[int, List[float]]
346
+
347
+
348
+ @dataclass
349
+ class TOFDetection:
350
+ """Labware detection parameters."""
351
+
352
+ sensor: TOFSensor
353
+ zones: List[int]
354
+ bins: list[int]
355
+ threshold: int
356
+
357
+
358
+ @dataclass
359
+ class TOFConfiguration:
360
+ """Stacker TOF configuration."""
361
+
362
+ sensor: TOFSensor
363
+ spad_map_id: SpadMapID
364
+ active_range: Optional[ActiveRange]
365
+ kilo_iterations: Optional[int]
366
+ report_period_ms: Optional[int]
367
+ histogram_dump: Optional[bool]
@@ -0,0 +1,19 @@
1
+ NUMBER_OF_ZONES = 10
2
+ NUMBER_OF_BINS = 128
3
+
4
+
5
+ def validate_histogram_frame(data: bytes, next_frame_id: int) -> bool:
6
+ """Validate Histogram frame, Raise error if invalid."""
7
+ start_delimn = data[0]
8
+ assert (
9
+ start_delimn == 0x81 # histogram start byte
10
+ ), f"Invalid delimn, {hex(start_delimn)} != 0x81."
11
+ frame_id = data[4]
12
+ assert (
13
+ next_frame_id == frame_id
14
+ ), f"Invalid frame id, expected {next_frame_id} got {frame_id}."
15
+ frame_len = data[5]
16
+ assert (
17
+ frame_len == 128 # len is always 128
18
+ ), f"Invalid frame length, expected 128 got {frame_len}."
19
+ return True
@@ -0,0 +1,5 @@
1
+ from .driver import HeaterShakerDriver
2
+ from .simulator import SimulatingDriver
3
+ from .abstract import AbstractHeaterShakerDriver
4
+
5
+ __all__ = ["HeaterShakerDriver", "SimulatingDriver", "AbstractHeaterShakerDriver"]
@@ -0,0 +1,76 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Dict
3
+
4
+ from opentrons.drivers.types import Temperature, RPM, HeaterShakerLabwareLatchStatus
5
+
6
+
7
+ class AbstractHeaterShakerDriver(ABC):
8
+ @abstractmethod
9
+ async def connect(self) -> None:
10
+ """Connect to heater-shaker"""
11
+ ...
12
+
13
+ @abstractmethod
14
+ async def disconnect(self) -> None:
15
+ """Disconnect from heater-shaker"""
16
+ ...
17
+
18
+ @abstractmethod
19
+ async def is_connected(self) -> bool:
20
+ """Check connection to heater-shaker"""
21
+ ...
22
+
23
+ @abstractmethod
24
+ async def open_labware_latch(self) -> None:
25
+ """Send open-labware-latch command"""
26
+ ...
27
+
28
+ @abstractmethod
29
+ async def close_labware_latch(self) -> None:
30
+ """Send close-labware-latch command"""
31
+ ...
32
+
33
+ @abstractmethod
34
+ async def set_temperature(self, temperature: float) -> None:
35
+ """Send set-temperature command"""
36
+ ...
37
+
38
+ @abstractmethod
39
+ async def get_temperature(self) -> Temperature:
40
+ """Send get-temperature command"""
41
+ ...
42
+
43
+ @abstractmethod
44
+ async def set_rpm(self, rpm: int) -> None:
45
+ """Send set-rpm command"""
46
+ ...
47
+
48
+ @abstractmethod
49
+ async def get_rpm(self) -> RPM:
50
+ """Send get-rpm command"""
51
+ ...
52
+
53
+ @abstractmethod
54
+ async def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus:
55
+ """Send get-labware-latch-status command"""
56
+ ...
57
+
58
+ @abstractmethod
59
+ async def home(self) -> None:
60
+ """Send deactivate shaker command"""
61
+ ...
62
+
63
+ @abstractmethod
64
+ async def deactivate_heater(self) -> None:
65
+ """Send deactivate heater command"""
66
+ ...
67
+
68
+ @abstractmethod
69
+ async def get_device_info(self) -> Dict[str, str]:
70
+ """Send get device info command"""
71
+ ...
72
+
73
+ @abstractmethod
74
+ async def enter_programming_mode(self) -> None:
75
+ """Reboot into programming mode"""
76
+ ...
@@ -0,0 +1,204 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+ import asyncio
5
+
6
+ from typing import Optional, Dict
7
+ from opentrons.drivers import utils
8
+ from opentrons.drivers.command_builder import CommandBuilder
9
+ from opentrons.drivers.asyncio.communication import (
10
+ AsyncResponseSerialConnection,
11
+ UnhandledGcode,
12
+ )
13
+ from opentrons.drivers.heater_shaker.abstract import AbstractHeaterShakerDriver
14
+ from opentrons.drivers.types import Temperature, RPM, HeaterShakerLabwareLatchStatus
15
+
16
+
17
+ class GCODE(str, Enum):
18
+ SET_RPM = "M3"
19
+ GET_RPM = "M123"
20
+ SET_TEMPERATURE = "M104"
21
+ GET_TEMPERATURE = "M105"
22
+ HOME = "G28"
23
+ ENTER_BOOTLOADER = "dfu"
24
+ GET_VERSION = "M115"
25
+ OPEN_LABWARE_LATCH = "M242"
26
+ CLOSE_LABWARE_LATCH = "M243"
27
+ GET_LABWARE_LATCH_STATE = "M241"
28
+ DEACTIVATE_HEATER = "M106"
29
+ GET_RESET_REASON = "M114"
30
+
31
+
32
+ HS_BAUDRATE = 115200
33
+ DEFAULT_HS_TIMEOUT = 40
34
+ HS_COMMAND_TERMINATOR = "\n"
35
+ HS_ACK = "OK" + HS_COMMAND_TERMINATOR
36
+ HS_ERROR_KEYWORD = "err"
37
+ HS_ASYNC_ERROR_ACK = "async"
38
+ DEFAULT_COMMAND_RETRIES = 0
39
+
40
+
41
+ class HeaterShakerDriver(AbstractHeaterShakerDriver):
42
+ @classmethod
43
+ async def create(
44
+ cls, port: str, loop: Optional[asyncio.AbstractEventLoop]
45
+ ) -> HeaterShakerDriver:
46
+ """
47
+ Create a heater-shaker driver.
48
+
49
+ Args:
50
+ port: port or url of heater shaker
51
+ loop: optional event loop
52
+
53
+ Returns: driver
54
+ """
55
+ connection = await AsyncResponseSerialConnection.create(
56
+ port=port,
57
+ baud_rate=HS_BAUDRATE,
58
+ timeout=DEFAULT_HS_TIMEOUT,
59
+ ack=HS_ACK,
60
+ loop=loop,
61
+ error_keyword=HS_ERROR_KEYWORD,
62
+ async_error_ack=HS_ASYNC_ERROR_ACK,
63
+ )
64
+ return cls(connection=connection)
65
+
66
+ def __init__(self, connection: AsyncResponseSerialConnection) -> None:
67
+ """
68
+ Constructor
69
+
70
+ Args:
71
+ connection: SerialConnection to the heater-shaker
72
+ """
73
+ self._connection = connection
74
+
75
+ async def connect(self) -> None:
76
+ """Connect to heater-shaker"""
77
+ await self._connection.open()
78
+
79
+ async def disconnect(self) -> None:
80
+ """Disconnect from heater-shaker"""
81
+ await self._connection.close()
82
+
83
+ async def is_connected(self) -> bool:
84
+ """Check connection"""
85
+ return await self._connection.is_open()
86
+
87
+ async def open_labware_latch(self) -> None:
88
+ """Send open-plate-lock command.
89
+
90
+ Note: Labware latch is referred to as 'plate lock' in firmware.
91
+ """
92
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
93
+ gcode=GCODE.OPEN_LABWARE_LATCH
94
+ )
95
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
96
+
97
+ async def close_labware_latch(self) -> None:
98
+ """Send close-plate-lock command.
99
+
100
+ Note: Labware latch is referred to as 'plate lock' in firmware.
101
+ """
102
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
103
+ gcode=GCODE.CLOSE_LABWARE_LATCH
104
+ )
105
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
106
+
107
+ async def set_temperature(self, temperature: float) -> None:
108
+ """Set temperature"""
109
+ c = (
110
+ CommandBuilder(terminator=HS_COMMAND_TERMINATOR)
111
+ .add_gcode(gcode=GCODE.SET_TEMPERATURE)
112
+ .add_float(
113
+ prefix="S",
114
+ value=temperature,
115
+ precision=utils.HS_GCODE_ROUNDING_PRECISION,
116
+ )
117
+ )
118
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
119
+
120
+ async def get_temperature(self) -> Temperature:
121
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
122
+ gcode=GCODE.GET_TEMPERATURE
123
+ )
124
+ response = await self._connection.send_command(
125
+ command=c, retries=DEFAULT_COMMAND_RETRIES
126
+ )
127
+ return utils.parse_temperature_response(
128
+ temperature_string=response, rounding_val=utils.HS_GCODE_ROUNDING_PRECISION
129
+ )
130
+
131
+ async def set_rpm(self, rpm: int) -> None:
132
+ """Set RPM"""
133
+ c = (
134
+ CommandBuilder(terminator=HS_COMMAND_TERMINATOR)
135
+ .add_gcode(gcode=GCODE.SET_RPM)
136
+ .add_int(prefix="S", value=int(rpm))
137
+ )
138
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
139
+
140
+ async def get_rpm(self) -> RPM:
141
+ """Get RPM"""
142
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
143
+ gcode=GCODE.GET_RPM
144
+ )
145
+ response = await self._connection.send_command(
146
+ command=c, retries=DEFAULT_COMMAND_RETRIES
147
+ )
148
+ return utils.parse_rpm_response(rpm_string=response)
149
+
150
+ async def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus:
151
+ """Send get-labware-latch-status command.
152
+
153
+ Note: Labware latch is referred to as 'plate lock' in firmware.
154
+ """
155
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
156
+ gcode=GCODE.GET_LABWARE_LATCH_STATE
157
+ )
158
+ response = await self._connection.send_command(
159
+ command=c, retries=DEFAULT_COMMAND_RETRIES
160
+ )
161
+ return utils.parse_labware_latch_status_response(status_string=response)
162
+
163
+ async def home(self) -> None:
164
+ """Send home command.
165
+
166
+ Note: Homing also stops the shaking motion if applicable.
167
+ """
168
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(gcode=GCODE.HOME)
169
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
170
+
171
+ async def get_device_info(self) -> Dict[str, str]:
172
+ """Send get-device-info command"""
173
+ device_info = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
174
+ gcode=GCODE.GET_VERSION
175
+ )
176
+ response = await self._connection.send_command(
177
+ command=device_info, retries=DEFAULT_COMMAND_RETRIES
178
+ )
179
+
180
+ reset_reason = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
181
+ gcode=GCODE.GET_RESET_REASON
182
+ )
183
+ try:
184
+ await self._connection.send_command(
185
+ command=reset_reason, retries=DEFAULT_COMMAND_RETRIES
186
+ )
187
+ except UnhandledGcode:
188
+ pass
189
+
190
+ return utils.parse_hs_device_information(device_info_string=response)
191
+
192
+ async def enter_programming_mode(self) -> None:
193
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
194
+ gcode=GCODE.ENTER_BOOTLOADER
195
+ )
196
+ await self._connection.send_dfu_command(command=c)
197
+ await self._connection.close()
198
+
199
+ async def deactivate_heater(self) -> None:
200
+ """Send deactivate-heater command"""
201
+ c = CommandBuilder(terminator=HS_COMMAND_TERMINATOR).add_gcode(
202
+ gcode=GCODE.DEACTIVATE_HEATER
203
+ )
204
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)