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,792 @@
1
+ from asyncio import Queue
2
+ import enum
3
+ import logging
4
+ from dataclasses import dataclass
5
+ from typing import cast, Tuple, Union, List, Callable, Dict, TypeVar, Type
6
+ from typing_extensions import Literal
7
+ from opentrons import types as top_types
8
+ from opentrons_shared_data.pipette.types import PipetteChannelType
9
+ from opentrons.config import feature_flags
10
+
11
+ MODULE_LOG = logging.getLogger(__name__)
12
+
13
+
14
+ class MotionChecks(enum.Enum):
15
+ NONE = 0
16
+ LOW = 1
17
+ HIGH = 2
18
+ BOTH = 3
19
+
20
+
21
+ class OT3Mount(enum.Enum):
22
+ LEFT = top_types.Mount.LEFT.value
23
+ RIGHT = top_types.Mount.RIGHT.value
24
+ GRIPPER = enum.auto()
25
+
26
+ @classmethod
27
+ def from_mount(
28
+ cls,
29
+ mount: Union[
30
+ top_types.Mount, top_types.MountType, top_types.OT3MountType, "OT3Mount"
31
+ ],
32
+ ) -> "OT3Mount":
33
+ if mount == top_types.Mount.EXTENSION or mount == top_types.MountType.EXTENSION:
34
+ return OT3Mount.GRIPPER
35
+ return cls[mount.name]
36
+
37
+ def to_mount(self) -> top_types.Mount:
38
+ if self.value == self.GRIPPER.value:
39
+ return top_types.Mount.EXTENSION
40
+ return top_types.Mount[self.name]
41
+
42
+ @classmethod
43
+ def pipette_mounts(cls) -> List["Literal[OT3Mount.LEFT, OT3Mount.RIGHT]"]:
44
+ return [cls.LEFT, cls.RIGHT]
45
+
46
+
47
+ class OT3AxisKind(enum.Enum):
48
+ """An enum of the different kinds of axis we have.
49
+
50
+ The machine may have different numbers of specific axes implementing
51
+ each axis kind.
52
+ """
53
+
54
+ X = 0
55
+ #: Gantry X axis
56
+ Y = 1
57
+ #: Gantry Y axis
58
+ Z = 2
59
+ #: Z axis (of the left and right)
60
+ P = 3
61
+ #: Plunger axis (of the left and right pipettes)
62
+ Z_G = 4
63
+ #: Gripper Z axis
64
+ Q = 6
65
+ #: High-throughput tip grabbing axis
66
+ OTHER = 6
67
+ #: The internal axes of high throughput pipettes, for instance
68
+
69
+ def __str__(self) -> str:
70
+ return self.name
71
+
72
+ def is_z_axis(self) -> bool:
73
+ return self in [OT3AxisKind.Z, OT3AxisKind.Z_G]
74
+
75
+
76
+ class Axis(enum.Enum):
77
+ X = 0 # gantry
78
+ Y = 1
79
+ Z_L = 2 # left pipette mount Z
80
+ Z_R = 3 # right pipette mount Z
81
+ Z_G = 4 # gripper mount Z
82
+ P_L = 5 # left pipette plunger
83
+ P_R = 6 # right pipette plunger
84
+ Q = 7 # hi-throughput pipette tiprack grab
85
+ G = 8 # gripper grab
86
+
87
+ # OT2 axes' aliases:
88
+ Z = Z_L # left pipette mount Z
89
+ A = Z_R # right pipette mount Z
90
+ B = P_L # left pipette plunger
91
+ C = P_R # right pipette plunger
92
+
93
+ @classmethod
94
+ def by_mount(cls, mount: Union[top_types.Mount, OT3Mount]) -> "Axis":
95
+ bm = {
96
+ top_types.Mount.LEFT: cls.Z_L,
97
+ top_types.Mount.RIGHT: cls.Z_R,
98
+ top_types.Mount.EXTENSION: cls.Z_G,
99
+ OT3Mount.LEFT: cls.Z_L,
100
+ OT3Mount.RIGHT: cls.Z_R,
101
+ OT3Mount.GRIPPER: cls.Z_G,
102
+ }
103
+ return bm[mount]
104
+
105
+ @classmethod
106
+ def pipette_axes(cls) -> Tuple["Axis", "Axis"]:
107
+ """The axes which are used for moving plunger motors."""
108
+ return cls.P_L, cls.P_R
109
+
110
+ @classmethod
111
+ def mount_axes(cls) -> None:
112
+ """The axes which are used for moving instruments up and down."""
113
+ raise NotImplementedError(
114
+ "`Axis.mount_axes` has been removed. Use `Axis.ot2_mount_axes` or "
115
+ "`Axis.ot3_mount_axes` instead."
116
+ )
117
+
118
+ @classmethod
119
+ def ot2_mount_axes(cls) -> Tuple["Axis", "Axis"]:
120
+ """The OT2 axes which are used for moving instruments up and down."""
121
+ # TODO (spp, 2023-07-14): make this a separate function outside of Axis
122
+ # Does this need to be Z_R, Z_L ?
123
+ return cls.Z_L, cls.Z_R
124
+
125
+ @classmethod
126
+ def ot3_mount_axes(cls) -> Tuple["Axis", "Axis", "Axis"]:
127
+ """The OT3 axes which are used for moving instruments up and down."""
128
+ # TODO (spp, 2023-07-14): make this a separate function outside of Axis
129
+ return cls.Z_R, cls.Z_L, cls.Z_G
130
+
131
+ @classmethod
132
+ def gantry_axes(
133
+ cls,
134
+ ) -> Tuple["Axis", "Axis", "Axis", "Axis", "Axis"]:
135
+ """The axes which are tied to the gantry and require the deck
136
+ calibration transform
137
+ """
138
+ return cls.X, cls.Y, cls.Z_L, cls.Z_R, cls.Z_G
139
+
140
+ @classmethod
141
+ def of_main_tool_actuator(cls, mount: Union[top_types.Mount, OT3Mount]) -> "Axis":
142
+ if isinstance(mount, top_types.Mount):
143
+ checked_mount = OT3Mount.from_mount(mount)
144
+ else:
145
+ checked_mount = mount
146
+ pm = {OT3Mount.LEFT: cls.P_L, OT3Mount.RIGHT: cls.P_R, OT3Mount.GRIPPER: cls.G}
147
+ return pm[checked_mount]
148
+
149
+ @classmethod
150
+ def to_kind(cls, axis: "Axis") -> OT3AxisKind:
151
+ kind_map: Dict[Axis, OT3AxisKind] = {
152
+ cls.P_L: OT3AxisKind.P,
153
+ cls.P_R: OT3AxisKind.P,
154
+ cls.X: OT3AxisKind.X,
155
+ cls.Y: OT3AxisKind.Y,
156
+ cls.Z_L: OT3AxisKind.Z,
157
+ cls.Z_R: OT3AxisKind.Z,
158
+ cls.Z_G: OT3AxisKind.Z_G,
159
+ cls.Q: OT3AxisKind.Q,
160
+ cls.G: OT3AxisKind.OTHER,
161
+ }
162
+ return kind_map[axis]
163
+
164
+ @classmethod
165
+ def of_kind(cls, kind: OT3AxisKind) -> List["Axis"]:
166
+ kind_map: Dict[OT3AxisKind, List[Axis]] = {
167
+ OT3AxisKind.P: [cls.P_R, cls.P_L],
168
+ OT3AxisKind.X: [cls.X],
169
+ OT3AxisKind.Y: [cls.Y],
170
+ OT3AxisKind.Z: [cls.Z_L, cls.Z_R],
171
+ OT3AxisKind.Z_G: [cls.Z_G],
172
+ OT3AxisKind.Q: [cls.Q],
173
+ OT3AxisKind.OTHER: [cls.Q, cls.G],
174
+ }
175
+ return kind_map[kind]
176
+
177
+ @classmethod
178
+ def to_ot2_mount(cls, inst: "Axis") -> top_types.Mount:
179
+ # TODO (spp, 2023-07-14): make this a separate function outside of Axis
180
+ return {
181
+ cls.Z: top_types.Mount.LEFT,
182
+ cls.A: top_types.Mount.RIGHT,
183
+ cls.B: top_types.Mount.LEFT,
184
+ cls.C: top_types.Mount.RIGHT,
185
+ }[inst]
186
+
187
+ @classmethod
188
+ def to_ot3_mount(cls, inst: "Axis") -> OT3Mount:
189
+ # TODO (spp, 2023-07-14): make this a separate function outside of Axis
190
+ return {
191
+ cls.Z_R: OT3Mount.RIGHT,
192
+ cls.Z_L: OT3Mount.LEFT,
193
+ cls.P_L: OT3Mount.LEFT,
194
+ cls.P_R: OT3Mount.RIGHT,
195
+ cls.Z_G: OT3Mount.GRIPPER,
196
+ cls.G: OT3Mount.GRIPPER,
197
+ }[inst]
198
+
199
+ def __str__(self) -> str:
200
+ return self.name
201
+
202
+ def of_point(self, point: top_types.Point) -> float:
203
+ if Axis.to_kind(self).is_z_axis():
204
+ return point.z
205
+ elif self == Axis.X:
206
+ return point.x
207
+ elif self == Axis.Y:
208
+ return point.y
209
+ else:
210
+ raise KeyError(self)
211
+
212
+ def set_in_point(self, point: top_types.Point, position: float) -> top_types.Point:
213
+ if Axis.to_kind(self).is_z_axis():
214
+ return point._replace(z=position)
215
+ elif self == Axis.X:
216
+ return point._replace(x=position)
217
+ elif self == Axis.Y:
218
+ return point._replace(y=position)
219
+ else:
220
+ raise KeyError(self)
221
+
222
+ @classmethod
223
+ def ot2_axes(cls) -> List["Axis"]:
224
+ """Returns only OT2 axes."""
225
+ # TODO (spp, 2023-07-14): make this a separate function outside of Axis
226
+ return [axis for axis in Axis if axis not in [Axis.Z_G, Axis.Q, Axis.G]]
227
+
228
+ @classmethod
229
+ def of_plunger(cls, mount: top_types.Mount) -> "Axis":
230
+ """Get plunger axes.
231
+
232
+ Same as `of_main_tool_actuator` but for OT2 backwards compatibility.
233
+ """
234
+ return cls.of_main_tool_actuator(mount)
235
+
236
+ @classmethod
237
+ def node_axes(cls) -> List["Axis"]:
238
+ """
239
+ Get a list of axes that are backed by flex canbus nodes.
240
+ """
241
+ return [cls.X, cls.Y, cls.Z_L, cls.Z_R, cls.P_L, cls.P_R, cls.Z_G, cls.G]
242
+
243
+
244
+ class SubSystem(enum.Enum):
245
+ """An enumeration of ot3 components.
246
+
247
+ This is a complete list of unique firmware nodes in the ot3.
248
+ """
249
+
250
+ gantry_x = 0
251
+ gantry_y = 1
252
+ head = 2
253
+ pipette_left = 3
254
+ pipette_right = 4
255
+ gripper = 5
256
+ rear_panel = 6
257
+ motor_controller_board = 7
258
+ hepa_uv = 8
259
+
260
+ def __str__(self) -> str:
261
+ return self.name
262
+
263
+ @classmethod
264
+ def of_mount(
265
+ cls: "Type[SubSystem]", mount: Union[top_types.Mount, OT3Mount]
266
+ ) -> "Literal[SubSystem.pipette_left, SubSystem.pipette_right, SubSystem.gripper]":
267
+ return cast(
268
+ Literal[SubSystem.pipette_left, SubSystem.pipette_right, SubSystem.gripper],
269
+ {
270
+ top_types.Mount.LEFT: cls.pipette_left,
271
+ top_types.Mount.RIGHT: cls.pipette_right,
272
+ OT3Mount.LEFT: cls.pipette_left,
273
+ OT3Mount.RIGHT: cls.pipette_right,
274
+ OT3Mount.GRIPPER: cls.gripper,
275
+ }[mount],
276
+ )
277
+
278
+
279
+ OT3SubSystem = SubSystem
280
+
281
+
282
+ class PipetteSubType(enum.Enum):
283
+ """Pipette type to map from lower level PipetteType."""
284
+
285
+ pipette_single = 1
286
+ pipette_multi = 2
287
+ pipette_96 = 3
288
+
289
+ def __str__(self) -> str:
290
+ return self.name
291
+
292
+ @classmethod
293
+ def from_channels(cls, channels: PipetteChannelType) -> "PipetteSubType":
294
+ pipette_subtype_lookup = {
295
+ PipetteChannelType.SINGLE_CHANNEL: cls.pipette_single,
296
+ PipetteChannelType.EIGHT_CHANNEL: cls.pipette_multi,
297
+ PipetteChannelType.NINETY_SIX_CHANNEL: cls.pipette_96,
298
+ }
299
+ return pipette_subtype_lookup[channels]
300
+
301
+
302
+ class UpdateState(enum.Enum):
303
+ """Update state to map from lower level FirmwareUpdateStatus"""
304
+
305
+ queued = "queued"
306
+ updating = "updating"
307
+ done = "done"
308
+
309
+ def __str__(self) -> str:
310
+ return self.value
311
+
312
+
313
+ @dataclass(frozen=True)
314
+ class UpdateStatus:
315
+ subsystem: SubSystem
316
+ state: UpdateState
317
+ progress: int
318
+
319
+
320
+ @dataclass
321
+ class SubSystemState:
322
+ ok: bool
323
+ current_fw_version: int
324
+ next_fw_version: int
325
+ fw_update_needed: bool
326
+ current_fw_sha: str
327
+ pcba_revision: str
328
+ update_state: Union[UpdateState, None]
329
+
330
+
331
+ BCAxes = Axis # This doesn't seem to be used. Remove?
332
+ AxisMapValue = TypeVar("AxisMapValue")
333
+ OT3AxisMap = Dict[Axis, AxisMapValue]
334
+
335
+
336
+ @dataclass
337
+ class CurrentConfig:
338
+ hold_current: float
339
+ run_current: float
340
+
341
+ def as_tuple(self) -> Tuple[float, float]:
342
+ return self.hold_current, self.run_current
343
+
344
+
345
+ @dataclass(frozen=True)
346
+ class MotorStatus:
347
+ motor_ok: bool
348
+ encoder_ok: bool
349
+
350
+
351
+ class DoorState(enum.Enum):
352
+ OPEN = False
353
+ CLOSED = True
354
+
355
+ def __str__(self) -> str:
356
+ return self.name.lower()
357
+
358
+
359
+ class EstopState(enum.Enum):
360
+ """Enumerated state machine for the estop status."""
361
+
362
+ PHYSICALLY_ENGAGED = enum.auto()
363
+ LOGICALLY_ENGAGED = enum.auto()
364
+ DISENGAGED = enum.auto()
365
+ NOT_PRESENT = enum.auto()
366
+
367
+
368
+ class EstopAttachLocation(enum.Enum):
369
+ """Enumerated estop attach locations."""
370
+
371
+ LEFT = enum.auto()
372
+ RIGHT = enum.auto()
373
+
374
+
375
+ class EstopPhysicalStatus(enum.Enum):
376
+ """Possible status of an estop."""
377
+
378
+ ENGAGED = enum.auto()
379
+ DISENGAGED = enum.auto()
380
+ NOT_PRESENT = enum.auto()
381
+
382
+
383
+ class HardwareEventType(enum.Enum):
384
+ DOOR_SWITCH_CHANGE = enum.auto()
385
+ ERROR_MESSAGE = enum.auto()
386
+ ESTOP_CHANGE = enum.auto()
387
+
388
+
389
+ @dataclass
390
+ class EstopOverallStatus:
391
+ state: EstopState
392
+ left_physical_state: EstopPhysicalStatus
393
+ right_physical_state: EstopPhysicalStatus
394
+
395
+
396
+ @dataclass
397
+ class HepaFanState:
398
+ fan_on: bool
399
+ duty_cycle: int
400
+
401
+
402
+ @dataclass
403
+ class HepaUVState:
404
+ light_on: bool
405
+ uv_duration_s: int
406
+ remaining_time_s: int
407
+
408
+
409
+ @dataclass(frozen=True)
410
+ class DoorStateNotification:
411
+ event: Literal[
412
+ HardwareEventType.DOOR_SWITCH_CHANGE
413
+ ] = HardwareEventType.DOOR_SWITCH_CHANGE
414
+ new_state: DoorState = DoorState.CLOSED
415
+ module_serial: str | None = None
416
+
417
+
418
+ @dataclass(frozen=True)
419
+ class EstopStateNotification:
420
+ event: Literal[HardwareEventType.ESTOP_CHANGE] = HardwareEventType.ESTOP_CHANGE
421
+ old_state: EstopState = EstopState.NOT_PRESENT
422
+ new_state: EstopState = EstopState.NOT_PRESENT
423
+
424
+
425
+ @dataclass(frozen=True)
426
+ class ErrorMessageNotification:
427
+ message: str
428
+ event: Literal[HardwareEventType.ERROR_MESSAGE] = HardwareEventType.ERROR_MESSAGE
429
+
430
+
431
+ # new event types get new dataclasses
432
+ # when we add more event types we add them here
433
+ HardwareEvent = Union[
434
+ DoorStateNotification, ErrorMessageNotification, EstopStateNotification
435
+ ]
436
+
437
+ HardwareEventHandler = Callable[[HardwareEvent], None]
438
+ HardwareEventUnsubscriber = Callable[[], None]
439
+
440
+
441
+ RevisionLiteral = Literal["2.1", "A", "B", "C", "UNKNOWN"]
442
+
443
+
444
+ class BoardRevision(enum.Enum):
445
+ UNKNOWN = enum.auto()
446
+ OG = enum.auto()
447
+ A = enum.auto()
448
+ B = enum.auto()
449
+ C = enum.auto()
450
+ FLEX_B2 = enum.auto()
451
+
452
+ @classmethod
453
+ def by_bits(cls, rev_bits: Tuple[bool, bool]) -> "BoardRevision":
454
+ br = {
455
+ (True, True): cls.OG,
456
+ (False, True): cls.A,
457
+ (True, False): cls.B,
458
+ (False, False): cls.C,
459
+ }
460
+ return br[rev_bits]
461
+
462
+ def real_name(self) -> Union[RevisionLiteral, Literal["UNKNOWN"]]:
463
+ rn = "2.1" if self.name == "OG" else self.name
464
+ return cast(Union[RevisionLiteral, Literal["UNKNOWN"]], rn)
465
+
466
+ def __str__(self) -> str:
467
+ return self.real_name()
468
+
469
+
470
+ class CriticalPoint(enum.Enum):
471
+ """Possibilities for the point to move in a move call.
472
+
473
+ The active critical point determines the offsets that are added to the
474
+ gantry position when moving a pipette around.
475
+ """
476
+
477
+ MOUNT = enum.auto()
478
+ """
479
+ For legacy reasons, the position of the end of a P300 single. The default
480
+ when no pipette is attached, and used for consistent behavior in certain
481
+ contexts (like change pipette) when a variety of different pipettes might
482
+ be attached.
483
+ """
484
+
485
+ NOZZLE = enum.auto()
486
+ """
487
+ The end of the nozzle of a single pipette or the end of the back-most
488
+ nozzle of a multipipette. Only relevant when a pipette is present.
489
+ """
490
+
491
+ TIP = enum.auto()
492
+ """
493
+ The end of the tip of a single pipette or the end of the back-most
494
+ tip of a multipipette. Only relevant when a pipette is present and
495
+ a tip with known tip length is attached.
496
+ """
497
+
498
+ XY_CENTER = enum.auto()
499
+ """
500
+ Separately from the z component of the critical point, XY_CENTER means
501
+ the critical point under consideration is the XY center of the pipette.
502
+ This changes nothing for single pipettes, but makes multipipettes
503
+ move their centers - so between channels 4 and 5 - to the specified
504
+ point. This is the same as the GRIPPER_JAW_CENTER for grippers.
505
+ """
506
+
507
+ INSTRUMENT_XY_CENTER = enum.auto()
508
+ """
509
+ The INSTRUMENT_XY_CENTER means the critical point under consideration is
510
+ the XY center of the entire pipette, regardless of configuration.
511
+ No pipettes, single or multi, will change their instrument center point.
512
+ """
513
+
514
+ FRONT_NOZZLE = enum.auto()
515
+ """
516
+ The end of the front-most nozzle of a multipipette with a tip attached.
517
+ Only relevant when a multichannel pipette is present.
518
+ """
519
+
520
+ GRIPPER_JAW_CENTER = enum.auto()
521
+ """
522
+ The center of the gripper jaw engagement zone, such that if this critical
523
+ point is moved to the center of a labware the gripper will be ready to
524
+ grip it.
525
+ """
526
+
527
+ GRIPPER_FRONT_CALIBRATION_PIN = enum.auto()
528
+ """
529
+ The center of the bottom face of a calibration pin inserted in the gripper's
530
+ front calibration pin slot.
531
+ """
532
+
533
+ GRIPPER_REAR_CALIBRATION_PIN = enum.auto()
534
+ """
535
+ The center of the bottom face of a calibration pin inserted in the gripper's
536
+ back calibration pin slot.
537
+ """
538
+
539
+ Y_CENTER = enum.auto()
540
+ """
541
+ Y_CENTER means the critical point under consideration is at the same X
542
+ coordinate as the default nozzle point (i.e. TIP | NOZZLE | FRONT_NOZZLE)
543
+ but halfway in between the Y axis bounding box of the pipette - it is the
544
+ XY center of the first column in the pipette. It's really only relevant for
545
+ the 96; it will produce the same position as XY_CENTER on an eight or one
546
+ channel pipette.
547
+ """
548
+
549
+
550
+ class ExecutionState(enum.Enum):
551
+ RUNNING = enum.auto()
552
+ PAUSED = enum.auto()
553
+ CANCELLED = enum.auto()
554
+
555
+ def __str__(self) -> str:
556
+ return self.name
557
+
558
+
559
+ class HardwareAction(enum.Enum):
560
+ DROPTIP = enum.auto()
561
+ ASPIRATE = enum.auto()
562
+ DISPENSE = enum.auto()
563
+ BLOWOUT = enum.auto()
564
+ PREPARE_ASPIRATE = enum.auto()
565
+ LIQUID_PROBE = enum.auto()
566
+
567
+ def __str__(self) -> str:
568
+ return self.name
569
+
570
+
571
+ class PauseType(enum.Enum):
572
+ PAUSE = 0
573
+ DELAY = 1
574
+
575
+
576
+ class StatusBarState(enum.Enum):
577
+ """Semantic status bar states.
578
+
579
+ These mostly correspond to cases listed out in the Flex manual.
580
+ """
581
+
582
+ IDLE = enum.auto()
583
+ RUNNING = enum.auto()
584
+ PAUSED = enum.auto()
585
+ HARDWARE_ERROR = enum.auto()
586
+ SOFTWARE_ERROR = enum.auto()
587
+ ERROR_RECOVERY = enum.auto()
588
+ CONFIRMATION = enum.auto()
589
+ RUN_COMPLETED = enum.auto()
590
+ UPDATING = enum.auto()
591
+ ACTIVATION = enum.auto()
592
+ DISCO = enum.auto()
593
+ OFF = enum.auto()
594
+
595
+ def transient(self) -> bool:
596
+ return self.value in {
597
+ StatusBarState.CONFIRMATION.value,
598
+ StatusBarState.RUN_COMPLETED.value,
599
+ StatusBarState.ACTIVATION.value,
600
+ StatusBarState.DISCO.value,
601
+ }
602
+
603
+
604
+ @dataclass(frozen=True)
605
+ class StatusBarUpdateEvent:
606
+ state: StatusBarState
607
+ enabled: bool
608
+
609
+
610
+ StatusBarUpdateListener = Callable[[StatusBarUpdateEvent], None]
611
+ StatusBarUpdateUnsubscriber = Callable[[], None]
612
+
613
+
614
+ @dataclass
615
+ class AionotifyEvent:
616
+ flags: enum.EnumMeta
617
+ name: str
618
+
619
+ @classmethod
620
+ def build(cls, name: str, flags: List[enum.Enum]) -> "AionotifyEvent":
621
+ # See https://github.com/python/mypy/issues/5317
622
+ # as to why mypy cannot detect that list
623
+ # comprehension or variables cannot be dynamically
624
+ # determined to meet the argument criteria for
625
+ # enums. Hence, the type ignore below.
626
+ flag_list = [f.name for f in flags]
627
+ Flag = enum.Enum("Flag", flag_list) # type: ignore
628
+ return cls(flags=Flag, name=name)
629
+
630
+
631
+ class GripperJawState(enum.Enum):
632
+ UNHOMED = enum.auto()
633
+ #: the gripper must be homed before it can do anything
634
+ HOMED_READY = enum.auto()
635
+ #: the gripper has been homed and is at its fully-open homed position
636
+ GRIPPING = enum.auto()
637
+ #: the gripper is actively force-control gripping something
638
+ HOLDING = enum.auto()
639
+ #: the gripper is in position-control mode
640
+ STOPPED = enum.auto()
641
+ #: the gripper has been homed before but is stopped now
642
+
643
+
644
+ class InstrumentProbeType(enum.Enum):
645
+ PRIMARY = enum.auto()
646
+ SECONDARY = enum.auto()
647
+ BOTH = enum.auto()
648
+
649
+
650
+ class TipScrapeType(enum.Enum):
651
+ NONE = enum.auto()
652
+ RIGHT_ONE_COL = enum.auto()
653
+ LEFT_ONE_COL = enum.auto()
654
+
655
+
656
+ class GripperProbe(enum.Enum):
657
+ FRONT = enum.auto()
658
+ REAR = enum.auto()
659
+
660
+ @classmethod
661
+ def to_type(cls, gp: "GripperProbe") -> InstrumentProbeType:
662
+ if gp == cls.FRONT:
663
+ return InstrumentProbeType.SECONDARY
664
+ else:
665
+ return InstrumentProbeType.PRIMARY
666
+
667
+
668
+ class TipStateType(enum.Enum):
669
+ ABSENT = 0
670
+ PRESENT = 1
671
+
672
+ def __str__(self) -> str:
673
+ return self.name
674
+
675
+
676
+ @dataclass
677
+ class HardwareFeatureFlags:
678
+ """
679
+ Hardware configuration options that can be passed to API instances.
680
+ Some options may not be relevant to every robot.
681
+
682
+ These generally map to the feature flag options in the opentrons.config
683
+ module.
684
+ """
685
+
686
+ use_old_aspiration_functions: bool = (
687
+ False # To support pipette backwards compatability
688
+ )
689
+ require_estop: bool = True
690
+ stall_detection_enabled: bool = True
691
+ overpressure_detection_enabled: bool = True
692
+
693
+ @classmethod
694
+ def build_from_ff(cls) -> "HardwareFeatureFlags":
695
+ """Build from the feature flags configuration file on disc.
696
+
697
+ Note that, if this class is built from the default constructor, the values
698
+ of all of the flags are just the default values instead of the values in the
699
+ feature_flags file or environment variables. Use this constructor to ensure
700
+ the right values are pulled in.
701
+ """
702
+ return HardwareFeatureFlags(
703
+ use_old_aspiration_functions=feature_flags.use_old_aspiration_functions(),
704
+ require_estop=feature_flags.require_estop(),
705
+ stall_detection_enabled=feature_flags.stall_detection_enabled(),
706
+ overpressure_detection_enabled=feature_flags.overpressure_detection_enabled(),
707
+ )
708
+
709
+
710
+ class EarlyLiquidSenseTrigger(RuntimeError):
711
+ """Error raised if sensor threshold reached before minimum probing distance."""
712
+
713
+ def __init__(
714
+ self, triggered_at: Dict[Axis, float], min_z_pos: Dict[Axis, float]
715
+ ) -> None:
716
+ """Initialize EarlyLiquidSenseTrigger error."""
717
+ super().__init__(
718
+ f"Liquid threshold triggered early at z={triggered_at}mm, "
719
+ f"minimum z position = {min_z_pos}"
720
+ )
721
+
722
+
723
+ class FailedTipStateCheck(RuntimeError):
724
+ """Error raised if the tip ejector state does not match the expected value."""
725
+
726
+ def __init__(
727
+ self, expected_state: TipStateType, actual_state: TipStateType
728
+ ) -> None:
729
+ """Initialize FailedTipStateCheck error."""
730
+ super().__init__(
731
+ f"Expected tip state {expected_state}, but received {actual_state}."
732
+ )
733
+
734
+
735
+ @enum.unique
736
+ class PipetteSensorId(int, enum.Enum):
737
+ """Sensor IDs available.
738
+
739
+ Not to be confused with SensorType. This is the ID value that separate
740
+ two or more of the same type of sensor within a system.
741
+
742
+ Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
743
+ is authoritative; this version is here because this data is exposed above the hardware control layer and
744
+ therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
745
+ """
746
+
747
+ S0 = 0x0
748
+ S1 = 0x1
749
+ UNUSED = 0x2
750
+ BOTH = 0x3
751
+
752
+
753
+ @enum.unique
754
+ class PipetteSensorType(int, enum.Enum):
755
+ """Sensor types available.
756
+
757
+ Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
758
+ is authoritative; this version is here because this data is exposed above the hardware control layer and
759
+ therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
760
+ """
761
+
762
+ tip = 0x00
763
+ capacitive = 0x01
764
+ environment = 0x02
765
+ pressure = 0x03
766
+ pressure_temperature = 0x04
767
+ humidity = 0x05
768
+ temperature = 0x06
769
+
770
+
771
+ @dataclass(frozen=True)
772
+ class PipetteSensorData:
773
+ """Sensor data from a monitored sensor.
774
+
775
+ Note that this is a copy of an enum defined in opentrons_hardware.firmware_bindings.constants. That version
776
+ is authoritative; this version is here because this data is exposed above the hardware control layer and
777
+ therefore needs a typing source here so that we don't create a dependency on the internal hardware package.
778
+ """
779
+
780
+ sensor_type: PipetteSensorType
781
+ _as_int: int
782
+ _as_float: float
783
+
784
+ def to_float(self) -> float:
785
+ return self._as_float
786
+
787
+ @property
788
+ def to_int(self) -> int:
789
+ return self._as_int
790
+
791
+
792
+ PipetteSensorResponseQueue = Queue[Dict[PipetteSensorId, List[PipetteSensorData]]]