[{"data":1,"prerenderedAt":3444},["ShallowReactive",2],{"navigation":3,"reference-meta:python-bus\u002F0.1.6":733,"reference-data:python-bus\u002F0.1.6":735},[4,80,134,347,411,513,550,629],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","\u002Foperate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":159,"path":160,"stem":161},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":163,"path":164,"stem":165},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":167,"path":168,"stem":169},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":179,"path":180,"stem":181},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":229,"path":230,"stem":231},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":171,"path":250,"stem":251},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":179,"path":257,"stem":258},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[264,305,330],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":323,"path":324,"stem":325},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":327,"path":328,"stem":329},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":331,"path":332,"stem":333,"children":334,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[335,338,341,344],{"title":246,"path":336,"stem":337},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":238,"path":339,"stem":340},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":171,"path":342,"stem":343},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":274,"path":345,"stem":346},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":348,"path":349,"stem":350,"children":351,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[352,355,368,385,398],{"title":348,"path":353,"stem":354},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":356,"path":357,"stem":358,"children":359,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[360,364],{"title":361,"path":362,"stem":363},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":365,"path":366,"stem":367},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":369,"path":370,"stem":371,"children":372,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[373,377,381],{"title":374,"path":375,"stem":376},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":378,"path":379,"stem":380},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":382,"path":383,"stem":384},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[390,394],{"title":391,"path":392,"stem":393},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":395,"path":396,"stem":397},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":399,"path":400,"stem":401,"children":402,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[403,407],{"title":404,"path":405,"stem":406},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":408,"path":409,"stem":410},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":412,"path":413,"stem":414,"children":415,"page":42},"Automate","\u002Fautomate","07.automate",[416,420,424,428,477],{"title":417,"path":418,"stem":419},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":421,"path":422,"stem":423},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":425,"path":426,"stem":427},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":429,"path":439,"stem":440,"children":441,"page":42},[430,431,432,433,434,435,436,437,438],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[442,446,450,454,458,462,466,470,474],{"title":443,"path":444,"stem":445},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":447,"path":448,"stem":449},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":451,"path":452,"stem":453},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":455,"path":456,"stem":457},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":459,"path":460,"stem":461},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":463,"path":464,"stem":465},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":467,"path":468,"stem":469},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":471,"path":472,"stem":473},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":183,"path":475,"stem":476},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":478,"stem":479,"children":480,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[481,485,489,493,497,501,505,509],{"title":482,"path":483,"stem":484},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":486,"path":487,"stem":488},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":490,"path":491,"stem":492},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":494,"path":495,"stem":496},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":498,"path":499,"stem":500},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":502,"path":503,"stem":504},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":506,"path":507,"stem":508},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":510,"path":511,"stem":512},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":514,"path":515,"stem":516,"children":517,"page":42},"Observe","\u002Fobserve","08.observe",[518,522,538],{"title":519,"path":520,"stem":521},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":523,"stem":524,"children":525,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[526,530,534],{"title":527,"path":528,"stem":529},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":531,"path":532,"stem":533},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":535,"path":536,"stem":537},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":187,"path":539,"stem":540,"children":541,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[542,546],{"title":543,"path":544,"stem":545},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":547,"path":548,"stem":549},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":551,"path":552,"stem":553,"children":554,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[555,559,563,575,586,597,607,618],{"title":556,"path":557,"stem":558},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":560,"path":561,"stem":562},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":564,"stem":565,"children":566,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[567,571],{"title":568,"path":569,"stem":570},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":572,"path":573,"stem":574},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":576,"path":577,"stem":578,"children":579,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[580,583],{"title":568,"path":581,"stem":582},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":572,"path":584,"stem":585},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":587,"path":588,"stem":589,"children":590,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[591,594],{"title":568,"path":592,"stem":593},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":572,"path":595,"stem":596},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":163,"path":598,"stem":599,"children":600,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[601,604],{"title":568,"path":602,"stem":603},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":572,"path":605,"stem":606},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":608,"path":609,"stem":610,"children":611,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[612,615],{"title":568,"path":613,"stem":614},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":572,"path":616,"stem":617},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":619,"path":620,"stem":621,"children":622,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[623,626],{"title":568,"path":624,"stem":625},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":572,"path":627,"stem":628},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":630,"path":631,"stem":632,"children":633},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[634,636,655,688,696,727],{"title":630,"path":631,"stem":635},"20.connector-development\u002Findex",{"title":637,"path":638,"stem":639,"children":640,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[641,644,648,651],{"title":519,"path":642,"stem":643},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":645,"path":646,"stem":647},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":649,"stem":650},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":652,"path":653,"stem":654},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":656,"path":657,"stem":658,"children":659,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[660,664,668,672,676,680,684],{"title":661,"path":662,"stem":663},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":665,"path":666,"stem":667},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":669,"path":670,"stem":671},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":673,"path":674,"stem":675},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":677,"path":678,"stem":679},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":681,"path":682,"stem":683},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":685,"path":686,"stem":687},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":689,"stem":690,"children":691,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[692],{"title":693,"path":694,"stem":695},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":187,"path":697,"stem":698,"children":699,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[700,704,708,712,716,719,723],{"title":701,"path":702,"stem":703},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":705,"path":706,"stem":707},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":709,"path":710,"stem":711},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":713,"path":714,"stem":715},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":183,"path":717,"stem":718},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":720,"path":721,"stem":722},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":724,"path":725,"stem":726},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":728,"path":729,"stem":730,"children":731},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[732],{"title":728,"path":729,"stem":730},{"description":734},"",{"modules":736,"package":739,"dependencies":3428,"version":3443},{"unitelabs.bus":737,"unitelabs.bus.__all__":763,"unitelabs.bus.testing":780,"unitelabs.bus.testing.__all__":799,"unitelabs.bus.testing.stub":810,"unitelabs.bus.testing.stub.Stub":814,"unitelabs.bus.testing.stub.stub_maker":818,"unitelabs.bus.testing.serial_device_mock":837,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock":841,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__init__":866,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.cancel":883,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.reader":887,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__enter__":890,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__exit__":896,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.port":908,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.open":914,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.close":920,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.receive":926,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.received":932,"unitelabs.bus.testing.mock_transport":940,"unitelabs.bus.testing.mock_transport.MockTransport":944,"unitelabs.bus.testing.mock_transport.MockTransport.__init__":1007,"unitelabs.bus.testing.mock_transport.MockTransport.stubs":1036,"unitelabs.bus.testing.mock_transport.MockTransport.device":1040,"unitelabs.bus.testing.mock_transport.MockTransport.autorespond":1042,"unitelabs.bus.testing.mock_transport.MockTransport.queue":1044,"unitelabs.bus.testing.mock_transport.MockTransport.mock":1048,"unitelabs.bus.testing.mock_transport.MockTransport.kwargs":1052,"unitelabs.bus.testing.mock_transport.MockTransport.write":1056,"unitelabs.bus.testing.mock_transport.MockTransport._write":1064,"unitelabs.bus.testing.mock_transport.MockTransport._read":1075,"unitelabs.bus.testing.mock_factory":1083,"unitelabs.bus.testing.mock_factory.create_mock_connection":1087,"unitelabs.bus.testing.device_mock":1117,"unitelabs.bus.testing.device_mock.DeviceMock":1121,"unitelabs.bus.testing.device_mock.DeviceMock.__init__":1133,"unitelabs.bus.testing.device_mock.DeviceMock.stubs":1144,"unitelabs.bus.testing.device_mock.DeviceMock.logger":1151,"unitelabs.bus.testing.device_mock.DeviceMock.get_response":1156,"unitelabs.bus.testing.fixtures":1169,"unitelabs.bus.testing.fixtures.mock_factory":1174,"unitelabs.bus.testing.fixtures.serial_device":1184,"unitelabs.bus.protocols":1196,"unitelabs.bus.protocols.__all__":1203,"unitelabs.bus.protocols.protocol":1206,"unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY":1215,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS":1218,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS":1222,"unitelabs.bus.protocols.protocol.Protocol":1225,"unitelabs.bus.protocols.protocol.Protocol.__init__":1264,"unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing":1300,"unitelabs.bus.protocols.protocol.Protocol._transport_factory":1303,"unitelabs.bus.protocols.protocol.Protocol._transport_kwargs":1306,"unitelabs.bus.protocols.protocol.Protocol._commands":1309,"unitelabs.bus.protocols.protocol.Protocol.max_parallel_commands":1316,"unitelabs.bus.protocols.protocol.Protocol.is_open":1318,"unitelabs.bus.protocols.protocol.Protocol.autodetect":1321,"unitelabs.bus.protocols.protocol.Protocol._autodetector":1323,"unitelabs.bus.protocols.protocol.Protocol._validation_kwargs":1325,"unitelabs.bus.protocols.protocol.Protocol.is_validated":1328,"unitelabs.bus.protocols.protocol.Protocol.reconnect":1331,"unitelabs.bus.protocols.protocol.Protocol.reconnect_delay":1334,"unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts":1337,"unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts":1340,"unitelabs.bus.protocols.protocol.Protocol.logger":1342,"unitelabs.bus.protocols.protocol.Protocol.autodetector":1347,"unitelabs.bus.protocols.protocol.Protocol._connect_transport":1352,"unitelabs.bus.protocols.protocol.Protocol.identity":1360,"unitelabs.bus.protocols.protocol.Protocol.validate":1378,"unitelabs.bus.protocols.protocol.Protocol.open":1398,"unitelabs.bus.protocols.protocol.Protocol.close":1412,"unitelabs.bus.protocols.protocol.Protocol.connection_made":1419,"unitelabs.bus.protocols.protocol.Protocol.connection_lost":1430,"unitelabs.bus.protocols.protocol.Protocol.pause_writing":1443,"unitelabs.bus.protocols.protocol.Protocol.resume_writing":1449,"unitelabs.bus.protocols.protocol.Protocol.data_received":1455,"unitelabs.bus.protocols.protocol.Protocol.error_received":1465,"unitelabs.bus.protocols.protocol.Protocol.execute":1484,"unitelabs.bus.utils":1520,"unitelabs.bus.utils.__all__":1529,"unitelabs.bus.utils.device_manager":1535,"unitelabs.bus.utils.device_manager.NoSuchDeviceFound":1542,"unitelabs.bus.utils.device_manager.DeviceInfo":1548,"unitelabs.bus.utils.device_manager.DeviceInfo.device":1571,"unitelabs.bus.utils.device_manager.DeviceInfo.name":1574,"unitelabs.bus.utils.device_manager.DeviceInfo.description":1578,"unitelabs.bus.utils.device_manager.DeviceInfo.hwid":1583,"unitelabs.bus.utils.device_manager.DeviceInfo.vid":1588,"unitelabs.bus.utils.device_manager.DeviceInfo.pid":1593,"unitelabs.bus.utils.device_manager.DeviceInfo.serial_number":1598,"unitelabs.bus.utils.device_manager.DeviceInfo.location":1603,"unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer":1608,"unitelabs.bus.utils.device_manager.DeviceInfo.product":1613,"unitelabs.bus.utils.device_manager.DeviceInfo.interface":1618,"unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__":1624,"unitelabs.bus.utils.device_manager.DeviceInfo.__repr__":1628,"unitelabs.bus.utils.device_manager.DeviceInfo.__init__":1633,"unitelabs.bus.utils.device_manager.DeviceManager":1688,"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs":1697,"unitelabs.bus.utils.device_manager.DeviceManager.get_all":1719,"unitelabs.bus.utils.device_manager.DeviceManager.check_device_match":1728,"unitelabs.bus.utils.device_manager.DeviceManager.filter":1741,"unitelabs.bus.utils.device_manager.SerialDeviceManager":1751,"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS":1766,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs":1770,"unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all":1793,"unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match":1806,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter":1822,"unitelabs.bus.utils.device_manager.devices":1836,"unitelabs.bus.utils.autodetect":1840,"unitelabs.bus.utils.autodetect.TransportType":1844,"unitelabs.bus.utils.autodetect.TransportType.serial":1855,"unitelabs.bus.utils.autodetect.TransportType.usb":1859,"unitelabs.bus.utils.autodetect.TransportType.unknown":1862,"unitelabs.bus.utils.autodetect.AutoDetector":1864,"unitelabs.bus.utils.autodetect.AutoDetector._transport_type":1886,"unitelabs.bus.utils.autodetect.AutoDetector.__init__":1889,"unitelabs.bus.utils.autodetect.AutoDetector.protocol":1899,"unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs":1902,"unitelabs.bus.utils.autodetect.AutoDetector._device_manager":1904,"unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs":1906,"unitelabs.bus.utils.autodetect.AutoDetector._is_resolving":1908,"unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type":1910,"unitelabs.bus.utils.autodetect.AutoDetector.logger":1916,"unitelabs.bus.utils.autodetect.AutoDetector.device_manager":1919,"unitelabs.bus.utils.autodetect.AutoDetector.get_device_manager":1924,"unitelabs.bus.utils.autodetect.AutoDetector.is_resolving":1934,"unitelabs.bus.utils.autodetect.AutoDetector.resolve":1939,"unitelabs.bus.utils.autodetect.AutoDetector._connect":1950,"unitelabs.bus.utils.autodetect.AutoDetector._update_protocol_transport":1965,"unitelabs.bus.transports":1974,"unitelabs.bus.transports.__all__":1989,"unitelabs.bus.transports.serial_transport":1999,"unitelabs.bus.transports.serial_transport.ByteSize":2004,"unitelabs.bus.transports.serial_transport.ByteSize.FIVEBITS":2016,"unitelabs.bus.transports.serial_transport.ByteSize.SIXBITS":2019,"unitelabs.bus.transports.serial_transport.ByteSize.SEVENBITS":2022,"unitelabs.bus.transports.serial_transport.ByteSize.EIGHTBITS":2025,"unitelabs.bus.transports.serial_transport.Parity":2028,"unitelabs.bus.transports.serial_transport.Parity.NONE":2042,"unitelabs.bus.transports.serial_transport.Parity.ODD":2045,"unitelabs.bus.transports.serial_transport.Parity.EVEN":2048,"unitelabs.bus.transports.serial_transport.Parity.MARK":2051,"unitelabs.bus.transports.serial_transport.Parity.SPACE":2054,"unitelabs.bus.transports.serial_transport.StopBits":2057,"unitelabs.bus.transports.serial_transport.StopBits.ONE":2069,"unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE":2071,"unitelabs.bus.transports.serial_transport.StopBits.TWO":2074,"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME":2077,"unitelabs.bus.transports.serial_transport.SerialTransport":2080,"unitelabs.bus.transports.serial_transport.SerialTransport.__init__":2105,"unitelabs.bus.transports.serial_transport.SerialTransport._serial":2134,"unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size":2137,"unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer":2140,"unitelabs.bus.transports.serial_transport.SerialTransport._open":2142,"unitelabs.bus.transports.serial_transport.SerialTransport._close":2147,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader":2154,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_read":2160,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader":2165,"unitelabs.bus.transports.serial_transport.SerialTransport._read":2171,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer":2181,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_write":2191,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer":2197,"unitelabs.bus.transports.serial_transport.SerialTransport._write":2204,"unitelabs.bus.transports.read_transport":2213,"unitelabs.bus.transports.read_transport.ReadTransport":2216,"unitelabs.bus.transports.read_transport.ReadTransport.__init__":2234,"unitelabs.bus.transports.read_transport.ReadTransport._has_reader":2238,"unitelabs.bus.transports.read_transport.ReadTransport.open":2240,"unitelabs.bus.transports.read_transport.ReadTransport.close":2245,"unitelabs.bus.transports.read_transport.ReadTransport.is_reading":2250,"unitelabs.bus.transports.read_transport.ReadTransport.pause_reading":2258,"unitelabs.bus.transports.read_transport.ReadTransport.resume_reading":2263,"unitelabs.bus.transports.read_transport.ReadTransport._abort":2268,"unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader":2280,"unitelabs.bus.transports.read_transport.ReadTransport._remove_reader":2286,"unitelabs.bus.transports.read_transport.ReadTransport._safe_read":2292,"unitelabs.bus.transports.read_transport.ReadTransport._read":2298,"unitelabs.bus.transports.read_transport.ReadTransport.read_all":2309,"unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer":2318,"unitelabs.bus.transports.transport":2324,"unitelabs.bus.transports.transport.Transport":2327,"unitelabs.bus.transports.transport.Transport._open":2342,"unitelabs.bus.transports.transport.Transport._close":2346,"unitelabs.bus.transports.transport.Transport._ensure_reader":2350,"unitelabs.bus.transports.transport.Transport._remove_reader":2354,"unitelabs.bus.transports.transport.Transport._read":2358,"unitelabs.bus.transports.transport.Transport._ensure_writer":2366,"unitelabs.bus.transports.transport.Transport._remove_writer":2370,"unitelabs.bus.transports.transport.Transport._write":2374,"unitelabs.bus.transports.usb_transport":2382,"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME":2388,"unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE":2391,"unitelabs.bus.transports.usb_transport.UsbTransport":2394,"unitelabs.bus.transports.usb_transport.UsbTransport.__init__":2423,"unitelabs.bus.transports.usb_transport.UsbTransport.vendor":2443,"unitelabs.bus.transports.usb_transport.UsbTransport.product":2445,"unitelabs.bus.transports.usb_transport.UsbTransport._closing":2447,"unitelabs.bus.transports.usb_transport.UsbTransport._protocol":2449,"unitelabs.bus.transports.usb_transport.UsbTransport._interface_index":2451,"unitelabs.bus.transports.usb_transport.UsbTransport._device":2453,"unitelabs.bus.transports.usb_transport.UsbTransport.read_endpoint":2459,"unitelabs.bus.transports.usb_transport.UsbTransport.write_endpoint":2465,"unitelabs.bus.transports.usb_transport.UsbTransport._reader_event":2470,"unitelabs.bus.transports.usb_transport.UsbTransport._open":2472,"unitelabs.bus.transports.usb_transport.UsbTransport._close":2476,"unitelabs.bus.transports.usb_transport.UsbTransport._ensure_reader":2480,"unitelabs.bus.transports.usb_transport.UsbTransport._remove_reader":2485,"unitelabs.bus.transports.usb_transport.UsbTransport.__read":2490,"unitelabs.bus.transports.usb_transport.UsbTransport._read":2494,"unitelabs.bus.transports.usb_transport.UsbTransport._ensure_writer":2501,"unitelabs.bus.transports.usb_transport.UsbTransport._remove_writer":2506,"unitelabs.bus.transports.usb_transport.UsbTransport._write":2512,"unitelabs.bus.transports.write_transport":2518,"unitelabs.bus.transports.write_transport.WriteTransport":2522,"unitelabs.bus.transports.write_transport.WriteTransport.__init__":2542,"unitelabs.bus.transports.write_transport.WriteTransport._has_writer":2546,"unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused":2548,"unitelabs.bus.transports.write_transport.WriteTransport._write_buffer":2550,"unitelabs.bus.transports.write_transport.WriteTransport.open":2563,"unitelabs.bus.transports.write_transport.WriteTransport.close":2568,"unitelabs.bus.transports.write_transport.WriteTransport.writes_pending":2573,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size":2577,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits":2585,"unitelabs.bus.transports.write_transport.WriteTransport.set_write_buffer_limits":2600,"unitelabs.bus.transports.write_transport.WriteTransport.write":2618,"unitelabs.bus.transports.write_transport.WriteTransport.can_write_eof":2632,"unitelabs.bus.transports.write_transport.WriteTransport.write_eof":2642,"unitelabs.bus.transports.write_transport.WriteTransport.writelines":2647,"unitelabs.bus.transports.write_transport.WriteTransport.flush":2666,"unitelabs.bus.transports.write_transport.WriteTransport._ensure_writer":2671,"unitelabs.bus.transports.write_transport.WriteTransport._remove_writer":2676,"unitelabs.bus.transports.write_transport.WriteTransport._abort":2682,"unitelabs.bus.transports.write_transport.WriteTransport._safe_write":2691,"unitelabs.bus.transports.write_transport.WriteTransport._write":2697,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_pause_writing":2708,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_resume_protocol":2715,"unitelabs.bus.transports.write_transport.WriteTransport._set_write_buffer_limits":2722,"unitelabs.bus.transports.base_transport":2738,"unitelabs.bus.transports.base_transport.P_co":2743,"unitelabs.bus.transports.base_transport.BaseTransport":2746,"unitelabs.bus.transports.base_transport.BaseTransport.__init__":2765,"unitelabs.bus.transports.base_transport.BaseTransport._loop":2769,"unitelabs.bus.transports.base_transport.BaseTransport._protocol":2772,"unitelabs.bus.transports.base_transport.BaseTransport._is_closing":2777,"unitelabs.bus.transports.base_transport.BaseTransport.get_protocol":2779,"unitelabs.bus.transports.base_transport.BaseTransport.set_protocol":2789,"unitelabs.bus.transports.base_transport.BaseTransport.is_closing":2802,"unitelabs.bus.transports.base_transport.BaseTransport.open":2810,"unitelabs.bus.transports.base_transport.BaseTransport._open":2815,"unitelabs.bus.transports.base_transport.BaseTransport.close":2820,"unitelabs.bus.transports.base_transport.BaseTransport._close":2825,"unitelabs.bus.transports.base_transport.BaseTransport.abort":2831,"unitelabs.bus.transports.base_transport.BaseTransport._abort":2837,"unitelabs.bus.transports.base_transport.BaseTransport._exception":2848,"unitelabs.bus.commands":2860,"unitelabs.bus.commands.multiline":2874,"unitelabs.bus.commands.multiline.multiline":2878,"unitelabs.bus.commands.__all__":2886,"unitelabs.bus.commands.request":2894,"unitelabs.bus.commands.request.Request":2897,"unitelabs.bus.commands.request.Request.payload":2908,"unitelabs.bus.commands.request.Request.timeout":2911,"unitelabs.bus.commands.request.Request.__post_init__":2916,"unitelabs.bus.commands.request.Request.__init__":2920,"unitelabs.bus.commands.command":2931,"unitelabs.bus.commands.command.InType_co":2935,"unitelabs.bus.commands.command.OutType_co":2938,"unitelabs.bus.commands.command.Command":2941,"unitelabs.bus.commands.command.Command.receiver":2974,"unitelabs.bus.commands.command.Command.__init__":2979,"unitelabs.bus.commands.command.Command._response":2997,"unitelabs.bus.commands.command.Command._request":3002,"unitelabs.bus.commands.command.Command.message":3007,"unitelabs.bus.commands.command.Command.timeout":3009,"unitelabs.bus.commands.command.Command._response_buffer":3011,"unitelabs.bus.commands.command.Command.is_void":3014,"unitelabs.bus.commands.command.Command.request":3016,"unitelabs.bus.commands.command.Command.response":3020,"unitelabs.bus.commands.command.Command.result":3025,"unitelabs.bus.commands.command.Command.serialize":3035,"unitelabs.bus.commands.command.Command.deserialize":3050,"unitelabs.bus.commands.command.Command.validate_request":3068,"unitelabs.bus.commands.command.Command._set_response":3080,"unitelabs.bus.commands.command.Command.validate_response":3086,"unitelabs.bus.commands.command.Command._validate_response":3095,"unitelabs.bus.commands.command.Command.match_response":3105,"unitelabs.bus.commands.serial_command":3120,"unitelabs.bus.commands.serial_command.SerialCommand":3123,"unitelabs.bus.commands.serial_command.SerialCommand.__init__":3144,"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator":3167,"unitelabs.bus.commands.serial_command.SerialCommand._write_terminator":3169,"unitelabs.bus.commands.serial_command.SerialCommand._encoding":3171,"unitelabs.bus.commands.serial_command.SerialCommand.serialize":3173,"unitelabs.bus.commands.serial_command.SerialCommand.deserialize":3183,"unitelabs.bus.commands.serial_command.SerialCommand._validate_response":3193,"unitelabs.bus.commands.byte_command":3201,"unitelabs.bus.commands.byte_command.ByteCommand":3204,"unitelabs.bus.commands.byte_command.ByteCommand.__init__":3221,"unitelabs.bus.commands.byte_command.ByteCommand.serialize":3231,"unitelabs.bus.commands.byte_command.ByteCommand.deserialize":3241,"unitelabs.bus.commands.response":3251,"unitelabs.bus.commands.response.Response":3254,"unitelabs.bus.commands.response.Response.request":3265,"unitelabs.bus.commands.response.Response.__post_init__":3268,"unitelabs.bus.commands.response.Response.__handle_done":3272,"unitelabs.bus.commands.response.Response.__init__":3284,"unitelabs.bus.factories":3290,"unitelabs.bus.factories.__all__":3301,"unitelabs.bus.factories.usb_factory":3306,"unitelabs.bus.factories.usb_factory.create_usb_connection":3311,"unitelabs.bus.factories.usb_factory.open_usb_connection":3336,"unitelabs.bus.factories.serial_factory":3355,"unitelabs.bus.factories.serial_factory.create_serial_connection":3359,"unitelabs.bus.factories.transport_factory":3393,"unitelabs.bus.factories.transport_factory.P":3397,"unitelabs.bus.factories.transport_factory.TransportFactory":3400,"unitelabs.bus.factories.transport_factory.TransportFactory.__call__":3410},{"type":738,"name":739,"path":740,"parent":741,"packages":742,"attributes":749,"classes":751,"functions":760},"package","unitelabs.bus","unitelabs\u002Fbus\u002F__init__.py","unitelabs",[743,744,745,746,747,748],"unitelabs.bus.testing","unitelabs.bus.protocols","unitelabs.bus.utils","unitelabs.bus.transports","unitelabs.bus.commands","unitelabs.bus.factories",[750],"unitelabs.bus.__all__",[752,753,754,755,756,757,758,759],"unitelabs.bus.commands.command.Command","unitelabs.bus.commands.request.Request","unitelabs.bus.commands.response.Response","unitelabs.bus.factories.transport_factory.TransportFactory","unitelabs.bus.protocols.protocol.Protocol","unitelabs.bus.transports.serial_transport.SerialTransport","unitelabs.bus.transports.usb_transport.UsbTransport","unitelabs.bus.utils.device_manager.SerialDeviceManager",[761,762],"unitelabs.bus.factories.serial_factory.create_serial_connection","unitelabs.bus.factories.usb_factory.create_usb_connection",{"type":764,"name":750,"path":740,"parent":739,"lines":765,"value":768},"attribute",[766,767],8,21,[769,770,771,772,773,774,775,774,776,777,778,779],"Protocol","Command","Request","Response","TransportFactory","create_usb_connection","create_serial_connection","SerialTransport","UsbTransport","SerialDeviceManager","testing",{"type":738,"name":743,"path":781,"parent":739,"packages":782,"attributes":789,"classes":792,"functions":796},"unitelabs\u002Fbus\u002Ftesting\u002F__init__.py",[783,784,785,786,787,788],"unitelabs.bus.testing.stub","unitelabs.bus.testing.serial_device_mock","unitelabs.bus.testing.mock_transport","unitelabs.bus.testing.mock_factory","unitelabs.bus.testing.device_mock","unitelabs.bus.testing.fixtures",[790,791],"unitelabs.bus.testing.stub.Stub","unitelabs.bus.testing.__all__",[793,794,795],"unitelabs.bus.testing.device_mock.DeviceMock","unitelabs.bus.testing.mock_transport.MockTransport","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock",[797,798],"unitelabs.bus.testing.stub.stub_maker","unitelabs.bus.testing.mock_factory.create_mock_connection",{"type":764,"name":791,"path":781,"parent":743,"lines":800,"value":803},[801,802],7,14,[804,805,806,807,808,809],"DeviceMock","SerialDeviceMock","create_mock_connection","MockTransport","Stub","stub_maker",{"type":738,"name":783,"path":811,"parent":743,"attributes":812,"functions":813},"unitelabs\u002Fbus\u002Ftesting\u002Fstub.py",[790],[797],{"type":764,"name":790,"path":811,"parent":783,"lines":815,"value":817},[816,816],3,"typing.Callable[[bytes], typing.Optional[bytes]]",{"type":819,"name":797,"path":811,"parent":783,"lines":820,"parameters":823,"returns":834},"function",[821,822],6,10,[824,831],{"name":825,"kind":826,"annotation":827,"required":830},"request","positional or keyword",{"name":828,"cls":829},"bytes","ExprName",true,{"name":832,"kind":826,"annotation":833,"required":830},"expected_response",{"name":828,"cls":829},{"description":835,"annotation":836},null,{"name":790,"cls":829},{"type":738,"name":784,"path":838,"parent":743,"attributes":839,"classes":840},"unitelabs\u002Fbus\u002Ftesting\u002Fserial_device_mock.py",[790],[795],{"type":842,"name":795,"path":838,"parent":784,"description":843,"lines":844,"bases":847,"attributes":850,"functions":856,"mro":865},"class","A device mock implementation that simulates a serial connection.",[845,846],12,75,[848],{"annotation":849},{"name":793,"cls":829},[851,852,853,854,855],"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.cancel","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.reader","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.port","unitelabs.bus.testing.device_mock.DeviceMock.stubs","unitelabs.bus.testing.device_mock.DeviceMock.logger",[857,858,859,860,861,862,863,864],"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__init__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__enter__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__exit__","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.open","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.close","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.receive","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.received","unitelabs.bus.testing.device_mock.DeviceMock.get_response",[795,793],{"type":819,"name":857,"path":838,"parent":795,"lines":867,"parameters":870},[868,869],17,23,[871,873],{"name":872,"kind":826,"required":830},"self",{"name":874,"kind":826,"annotation":875,"required":42,"default":882},"stubs",{"left":876,"slice":878},{"name":877,"cls":829},"typing.Optional",{"left":879,"slice":881},{"name":880,"cls":829},"list",{"name":790,"cls":829},"None",{"type":764,"name":851,"path":838,"parent":795,"lines":884,"value":886},[885,885],22,"threading.Event()",{"type":764,"name":852,"path":838,"parent":795,"lines":888,"value":889},[869,869],"threading.Thread(target=self.receive, daemon=True)",{"type":819,"name":858,"path":838,"parent":795,"lines":891,"parameters":894},[892,893],25,28,[895],{"name":872,"kind":826,"required":830},{"type":819,"name":859,"path":838,"parent":795,"lines":897,"parameters":900},[898,899],30,31,[901,902,904,906],{"name":872,"kind":826,"required":830},{"name":903,"kind":826,"required":830},"exc_type",{"name":905,"kind":826,"required":830},"exc_val",{"name":907,"kind":826,"required":830},"exc_tb",{"type":764,"name":853,"path":838,"parent":795,"lines":909,"value":882,"annotation":912},[910,911],34,35,{"name":913,"cls":829},"str",{"type":819,"name":860,"path":838,"parent":795,"lines":915,"parameters":918},[916,917],37,39,[919],{"name":872,"kind":826,"required":830},{"type":819,"name":861,"path":838,"parent":795,"lines":921,"parameters":924},[922,923],41,55,[925],{"name":872,"kind":826,"required":830},{"type":819,"name":862,"path":838,"parent":795,"lines":927,"parameters":930},[928,929],57,72,[931],{"name":872,"kind":826,"required":830},{"type":819,"name":863,"path":838,"parent":795,"lines":933,"parameters":935},[934,846],74,[936,937],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":939,"required":830},"data",{"name":828,"cls":829},{"type":738,"name":785,"path":941,"parent":743,"attributes":942,"classes":943},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_transport.py",[790],[794],{"type":842,"name":794,"path":941,"parent":785,"description":945,"lines":946,"bases":948,"attributes":952,"functions":967,"mro":1003},"Mocks `Transport` functionality. Must provide either `stubs`\nor set `autorespond=True` to get responses.",[822,947],80,[949],{"annotation":950},{"name":951,"cls":829},"unitelabs.bus.transports.transport.Transport",[953,954,955,956,957,958,959,960,961,962,963,964,965,966],"unitelabs.bus.testing.mock_transport.MockTransport.stubs","unitelabs.bus.testing.mock_transport.MockTransport.device","unitelabs.bus.testing.mock_transport.MockTransport.autorespond","unitelabs.bus.testing.mock_transport.MockTransport.queue","unitelabs.bus.testing.mock_transport.MockTransport.mock","unitelabs.bus.testing.mock_transport.MockTransport.kwargs","unitelabs.bus.transports.read_transport.ReadTransport._has_reader","unitelabs.bus.transports.write_transport.WriteTransport._has_writer","unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused","unitelabs.bus.transports.write_transport.WriteTransport._write_buffer","unitelabs.bus.transports.write_transport.WriteTransport.writes_pending","unitelabs.bus.transports.base_transport.BaseTransport._loop","unitelabs.bus.transports.base_transport.BaseTransport._protocol","unitelabs.bus.transports.base_transport.BaseTransport._is_closing",[968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002],"unitelabs.bus.testing.mock_transport.MockTransport.__init__","unitelabs.bus.testing.mock_transport.MockTransport.write","unitelabs.bus.testing.mock_transport.MockTransport._write","unitelabs.bus.testing.mock_transport.MockTransport._read","unitelabs.bus.transports.transport.Transport._open","unitelabs.bus.transports.transport.Transport._close","unitelabs.bus.transports.transport.Transport._ensure_reader","unitelabs.bus.transports.transport.Transport._remove_reader","unitelabs.bus.transports.transport.Transport._ensure_writer","unitelabs.bus.transports.transport.Transport._remove_writer","unitelabs.bus.transports.read_transport.ReadTransport.open","unitelabs.bus.transports.read_transport.ReadTransport.close","unitelabs.bus.transports.read_transport.ReadTransport.is_reading","unitelabs.bus.transports.read_transport.ReadTransport.pause_reading","unitelabs.bus.transports.read_transport.ReadTransport.resume_reading","unitelabs.bus.transports.read_transport.ReadTransport._abort","unitelabs.bus.transports.read_transport.ReadTransport._safe_read","unitelabs.bus.transports.read_transport.ReadTransport.read_all","unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer","unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size","unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits","unitelabs.bus.transports.write_transport.WriteTransport.set_write_buffer_limits","unitelabs.bus.transports.write_transport.WriteTransport.can_write_eof","unitelabs.bus.transports.write_transport.WriteTransport.write_eof","unitelabs.bus.transports.write_transport.WriteTransport.writelines","unitelabs.bus.transports.write_transport.WriteTransport.flush","unitelabs.bus.transports.write_transport.WriteTransport._safe_write","unitelabs.bus.transports.write_transport.WriteTransport._maybe_pause_writing","unitelabs.bus.transports.write_transport.WriteTransport._maybe_resume_protocol","unitelabs.bus.transports.write_transport.WriteTransport._set_write_buffer_limits","unitelabs.bus.transports.base_transport.BaseTransport.get_protocol","unitelabs.bus.transports.base_transport.BaseTransport.set_protocol","unitelabs.bus.transports.base_transport.BaseTransport.is_closing","unitelabs.bus.transports.base_transport.BaseTransport.abort","unitelabs.bus.transports.base_transport.BaseTransport._exception",[794,951,1004,1005,1006],"unitelabs.bus.transports.read_transport.ReadTransport","unitelabs.bus.transports.write_transport.WriteTransport","unitelabs.bus.transports.base_transport.BaseTransport",{"type":819,"name":968,"path":941,"parent":794,"lines":1008,"parameters":1010},[885,1009],47,[1011,1012,1019,1025,1031],{"name":872,"kind":826,"required":830},{"name":874,"kind":826,"annotation":1013,"required":42,"default":882,"description":1018},{"left":1014,"slice":1015},{"name":877,"cls":829},{"left":1016,"slice":1017},{"name":880,"cls":829},{"name":790,"cls":829},"List of callable functions that return responses based matching to requests.",{"name":1020,"kind":826,"annotation":1021,"required":42,"default":882,"description":1024},"device",{"left":1022,"slice":1023},{"name":877,"cls":829},{"name":793,"cls":829},"A `DeviceMock` through which device communication will be mocked.",{"name":1026,"kind":826,"annotation":1027,"required":42,"default":1029,"description":1030},"autorespond",{"name":1028,"cls":829},"bool","False","Whether to return request bytes without checking `stubs`, i.e. loopback responses.",{"name":1032,"kind":1033,"required":42,"default":1034,"description":1035},"**kwargs","variadic keyword","{}","Any additional `Transport` init kwargs.",{"type":764,"name":953,"path":941,"parent":794,"lines":1037,"value":1039},[1038,1038],33,"stubs or []",{"type":764,"name":954,"path":941,"parent":794,"lines":1041,"value":1020},[910,910],{"type":764,"name":955,"path":941,"parent":794,"lines":1043,"value":1026},[916,916],{"type":764,"name":956,"path":941,"parent":794,"lines":1045,"value":1047},[1046,1046],38,"queue.Queue()",{"type":764,"name":957,"path":941,"parent":794,"lines":1049,"value":1051},[1050,1050],40,"unittest.mock.Mock()",{"type":764,"name":958,"path":941,"parent":794,"lines":1053,"value":1055},[1054,1054],43,"kwargs",{"type":819,"name":969,"path":941,"parent":794,"lines":1057,"parameters":1060},[1058,1059],49,52,[1061,1062],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1063,"required":830},{"name":828,"cls":829},{"type":819,"name":970,"path":941,"parent":794,"lines":1065,"parameters":1068,"returns":1072},[1066,1067],54,70,[1069,1070],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1071,"required":830},{"name":828,"cls":829},{"description":835,"annotation":1073},{"name":1074,"cls":829},"int",{"type":819,"name":971,"path":941,"parent":794,"lines":1076,"parameters":1077,"returns":1079},[929,947],[1078],{"name":872,"kind":826,"required":830},{"description":835,"annotation":1080},{"left":1081,"slice":1082},{"name":877,"cls":829},{"name":828,"cls":829},{"type":738,"name":786,"path":1084,"parent":743,"attributes":1085,"functions":1086},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_factory.py",[790],[798],{"type":819,"name":798,"path":1084,"parent":786,"lines":1088,"parameters":1091,"returns":1109},[1089,1090],9,18,[1092,1102,1108],{"name":1093,"kind":826,"annotation":1094,"required":830},"protocol_factory",{"left":1095,"slice":1097},{"name":1096,"cls":829},"typing.Callable",{"elements":1098},[1099,1100],"...",{"name":1101,"cls":829},"asyncio.Protocol",{"name":874,"kind":826,"annotation":1103,"required":42,"default":882},{"left":1104,"slice":1105},{"name":877,"cls":829},{"left":1106,"slice":1107},{"name":880,"cls":829},{"name":790,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034},{"description":835,"annotation":1110},{"left":1111,"slice":1113},{"name":1112,"cls":829},"typing.Tuple",{"elements":1114},[1115,1116],{"name":951,"cls":829},{"name":1101,"cls":829},{"type":738,"name":787,"path":1118,"parent":743,"attributes":1119,"classes":1120},"unitelabs\u002Fbus\u002Ftesting\u002Fdevice_mock.py",[790],[793],{"type":842,"name":793,"path":1118,"parent":787,"description":1122,"lines":1123,"bases":1125,"attributes":1129,"functions":1130,"mro":1132},"Abstract base class to mock devices (hardware or software components) for\ntesting purposes.",[1089,1124],56,[1126],{"annotation":1127},{"name":1128,"cls":829},"contextlib.AbstractContextManager",[854,855],[1131,864],"unitelabs.bus.testing.device_mock.DeviceMock.__init__",[793],{"type":819,"name":1131,"path":1118,"parent":793,"lines":1134,"parameters":1135},[885,869],[1136,1137],{"name":872,"kind":826,"required":830},{"name":874,"kind":826,"annotation":1138,"required":42,"default":882,"description":1143},{"left":1139,"slice":1140},{"name":877,"cls":829},{"left":1141,"slice":1142},{"name":880,"cls":829},{"name":790,"cls":829},"An optional list of stub methods that receive the same request as\nthe device and optionally return the corresponding response. Stubs can\nbe modified later on by directly modifying the `mock.stubs` list. Stubs\nat the end of the list have a higher priority and overwrite responses\nfrom the stubs at the beginning of the list.",{"type":764,"name":854,"path":1118,"parent":793,"lines":1145,"value":882,"annotation":1148},[1146,1147],26,27,{"left":1149,"slice":1150},{"name":880,"cls":829},{"name":790,"cls":829},{"type":764,"name":855,"path":1118,"parent":793,"description":1152,"lines":1153,"value":882,"annotation":1154},"A standard python logger available to debug device mocks.",[910,916],{"name":1155,"cls":829},"logging.Logger",{"type":819,"name":864,"path":1118,"parent":793,"description":1157,"lines":1158,"parameters":1159,"returns":1164},"Returns the stubbed response for a given request. Responses from stubs\nat the end of the list have a higher priority and overwrite responses\nfrom the stubs at the beginning of the list.",[917,1124],[1160,1161],{"name":872,"kind":826,"required":830},{"name":825,"kind":826,"annotation":1162,"required":830,"description":1163},{"name":828,"cls":829},"The request sent to the hardware.",{"description":1165,"annotation":1166},"The response corresponding to the received request.",{"left":1167,"slice":1168},{"name":877,"cls":829},{"name":828,"cls":829},{"type":738,"name":788,"path":1170,"parent":743,"functions":1171},"unitelabs\u002Fbus\u002Ftesting\u002Ffixtures.py",[798,1172,1173],"unitelabs.bus.testing.fixtures.mock_factory","unitelabs.bus.testing.fixtures.serial_device",{"type":819,"name":1172,"path":1170,"parent":788,"description":1175,"lines":1176,"decorators":1177,"parameters":1179,"returns":1182},"Returns `create_mock_connection` function that uses `pytest-asyncio` event-loop fixture\nto ensure no global loop exists.",[822,868],[1178],"pytest.fixture",[1180],{"name":1181,"kind":826,"required":830},"event_loop",{"description":835,"annotation":1183},{"name":755,"cls":829},{"type":819,"name":1173,"path":1170,"parent":788,"lines":1185,"decorators":1188,"returns":1189},[1186,1187],20,24,[1178],{"description":835,"annotation":1190},{"left":1191,"slice":1193},{"name":1192,"cls":829},"typing.AsyncGenerator",{"elements":1194},[1195,882],{"name":795,"cls":829},{"type":738,"name":744,"path":1197,"parent":739,"packages":1198,"attributes":1200,"classes":1202},"unitelabs\u002Fbus\u002Fprotocols\u002F__init__.py",[1199],"unitelabs.bus.protocols.protocol",[1201],"unitelabs.bus.protocols.__all__",[756],{"type":764,"name":1201,"path":1197,"parent":744,"lines":1204,"value":1205},[816,816],[769],{"type":738,"name":1199,"path":1207,"parent":744,"attributes":1208,"classes":1214},"unitelabs\u002Fbus\u002Fprotocols\u002Fprotocol.py",[1209,1210,1211,1212,1213],"unitelabs.bus.commands.command.InType_co","unitelabs.bus.commands.command.OutType_co","unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY","unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS","unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS",[756],{"type":764,"name":1211,"path":1207,"parent":1199,"lines":1216,"value":1217},[845,845],"20.0",{"type":764,"name":1212,"path":1207,"parent":1199,"lines":1219,"value":1221},[1220,1220],13,"3",{"type":764,"name":1213,"path":1207,"parent":1199,"lines":1223,"value":1224},[802,802],"1",{"type":842,"name":756,"path":1207,"parent":1199,"description":1226,"lines":1227,"bases":1229,"attributes":1232,"functions":1249,"mro":1263},"Base communication Protocol.",[868,1228],312,[1230],{"annotation":1231},{"name":1101,"cls":829},[1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248],"unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing","unitelabs.bus.protocols.protocol.Protocol._transport_factory","unitelabs.bus.protocols.protocol.Protocol._transport_kwargs","unitelabs.bus.protocols.protocol.Protocol._commands","unitelabs.bus.protocols.protocol.Protocol.max_parallel_commands","unitelabs.bus.protocols.protocol.Protocol.is_open","unitelabs.bus.protocols.protocol.Protocol.autodetect","unitelabs.bus.protocols.protocol.Protocol._autodetector","unitelabs.bus.protocols.protocol.Protocol._validation_kwargs","unitelabs.bus.protocols.protocol.Protocol.is_validated","unitelabs.bus.protocols.protocol.Protocol.reconnect","unitelabs.bus.protocols.protocol.Protocol.reconnect_delay","unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts","unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts","unitelabs.bus.protocols.protocol.Protocol.logger","unitelabs.bus.protocols.protocol.Protocol.autodetector",[1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262],"unitelabs.bus.protocols.protocol.Protocol.__init__","unitelabs.bus.protocols.protocol.Protocol._connect_transport","unitelabs.bus.protocols.protocol.Protocol.identity","unitelabs.bus.protocols.protocol.Protocol.validate","unitelabs.bus.protocols.protocol.Protocol.open","unitelabs.bus.protocols.protocol.Protocol.close","unitelabs.bus.protocols.protocol.Protocol.connection_made","unitelabs.bus.protocols.protocol.Protocol.connection_lost","unitelabs.bus.protocols.protocol.Protocol.pause_writing","unitelabs.bus.protocols.protocol.Protocol.resume_writing","unitelabs.bus.protocols.protocol.Protocol.data_received","unitelabs.bus.protocols.protocol.Protocol.error_received","unitelabs.bus.protocols.protocol.Protocol.execute",[756],{"type":819,"name":1250,"path":1207,"parent":756,"lines":1265,"parameters":1267},[910,1266],66,[1268,1269,1273,1278,1284,1289,1293,1298],{"name":872,"kind":826,"required":830},{"name":1270,"kind":826,"annotation":1271,"required":830,"description":1272},"transport_factory",{"name":755,"cls":829},"A callable used to create a connection to a transport.",{"name":1274,"kind":826,"annotation":1275,"required":42,"default":1276,"description":1277},"reconnect",{"name":1028,"cls":829},"True","Whether or not to a attempt to reconnect to a device when the connection is lost.",{"name":1279,"kind":826,"annotation":1280,"required":42,"default":1282,"description":1283},"reconnect_delay",{"name":1281,"cls":829},"float",{"name":1211,"cls":829},"How long in seconds to wait between reconnection attempts.",{"name":1285,"kind":826,"annotation":1286,"required":42,"default":1287,"description":1288},"max_reconnect_attempts",{"name":1074,"cls":829},{"name":1212,"cls":829},"How many times to attempt to reconnect to a device before\nconnection is considered lost.",{"name":1290,"kind":826,"annotation":1291,"required":42,"default":1029,"description":1292},"autodetect",{"name":1028,"cls":829},"Whether or not to use autodetection for device connectivity.",{"name":1294,"kind":826,"annotation":1295,"required":42,"default":1296,"description":1297},"max_parallel_commands",{"name":1074,"cls":829},{"name":1213,"cls":829},"The maximum number of commands to process in parallel.\nThis should be 1 for serial devices, but can be configured to allow more\ndepending on the processing capacity of the usb device.",{"name":1032,"kind":1033,"required":42,"default":1034,"description":1299},"additional kwargs, including kwargs for use with `TransportFactory`.",{"type":764,"name":1233,"path":1207,"parent":756,"lines":1301,"value":1276},[1302,1302],44,{"type":764,"name":1234,"path":1207,"parent":756,"lines":1304,"value":1270},[1305,1305],45,{"type":764,"name":1235,"path":1207,"parent":756,"lines":1307,"value":1055},[1308,1308],46,{"type":764,"name":1236,"path":1207,"parent":756,"lines":1310,"value":1312,"annotation":1313},[1311,1311],48,"[]",{"left":1314,"slice":1315},{"name":880,"cls":829},{"name":752,"cls":829},{"type":764,"name":1237,"path":1207,"parent":756,"lines":1317,"value":1294},[1058,1058],{"type":764,"name":1238,"path":1207,"parent":756,"lines":1319,"value":1320},[1059,1059],"asyncio.Event()",{"type":764,"name":1239,"path":1207,"parent":756,"lines":1322,"value":1290},[923,923],{"type":764,"name":1240,"path":1207,"parent":756,"lines":1324,"value":882},[1124,1124],{"type":764,"name":1241,"path":1207,"parent":756,"lines":1326,"value":882},[1327,1327],59,{"type":764,"name":1242,"path":1207,"parent":756,"lines":1329,"value":1320},[1330,1330],60,{"type":764,"name":1243,"path":1207,"parent":756,"lines":1332,"value":1274},[1333,1333],63,{"type":764,"name":1244,"path":1207,"parent":756,"lines":1335,"value":1279},[1336,1336],64,{"type":764,"name":1245,"path":1207,"parent":756,"lines":1338,"value":1285},[1339,1339],65,{"type":764,"name":1246,"path":1207,"parent":756,"lines":1341,"value":1285},[1266,1266],{"type":764,"name":1247,"path":1207,"parent":756,"description":1343,"lines":1344,"value":882,"annotation":1346},"A standard python logger.",[1345,929],69,{"name":1155,"cls":829},{"type":764,"name":1248,"path":1207,"parent":756,"lines":1348,"value":882,"annotation":1350},[846,1349],79,{"name":1351,"cls":829},"unitelabs.bus.utils.autodetect.AutoDetector",{"type":819,"name":1251,"path":1207,"parent":756,"description":1353,"lines":1354,"parameters":1357},"Create a new transport instance.",[1355,1356],81,87,[1358,1359],{"name":872,"kind":826,"required":830},{"name":1032,"kind":1033,"required":42,"default":1034},{"type":819,"name":1252,"path":1207,"parent":756,"description":1361,"lines":1362,"decorators":1365,"parameters":1367,"returns":1372,"examples":1375},"Method for validating the identity of the connected device.\nThis method will call another user-defined method on `Protocol`\nand compare the device's response (i.e. the method's return value)\nto values provided in `config_kwargs`.",[1363,1364],89,113,[1366],"abc.abstractmethod",[1368,1369],{"name":872,"kind":826,"required":830},{"name":1370,"kind":1033,"required":42,"default":1034,"description":1371},"**config_kwargs","kwargs sent from `validate`",{"description":1373,"annotation":1374},"True if the result of the inner call matches the expectation from `config_kwargs` else False.",{"name":1028,"cls":829},[1376],{"description":734,"code":1377},">>> class MyProtocol(Protocol):\n>>>   async def get_serial_number(self) -> str:\n>>>     ...\n>>>   async def identity(self, **config_kwargs) -> bool:\n>>>     serial_number = await self.get_serial_number()\n>>>     return serial_number == config_kwargs[\"serial_number\"]\n>>> p = MyProtocol(...)\n>>> cfg = {\"serial_number\": \"my_serial_number\"}\n>>> await p.open(**cfg)",{"type":819,"name":1253,"path":1207,"parent":756,"description":1379,"lines":1380,"parameters":1383,"returns":1392,"examples":1395},"This method will be called by user after `__init__` via `open`;\nit calls `identity` to determine if the connected device is the one\nthat was expected.\n\nIf autodetect=True this is called internally by `unitelabs.bus.utils.AutoDetector` to cycle through\npossile devices until the correct device or no device is found.\n\n`validation_kwargs` and `__init__` kwargs are stored on the `Protocol` such that they must only be provided once.\nShould there be values which overlap, `__init__` values are overwritten by values in `validation_kwargs`.\n\n`validation_kwargs` may contain stable information about the device. Check `unitelabs.bus.utils.device_manager`\nfor more information about valid device filter kwargs.",[1381,1382],115,157,[1384,1385,1389],{"name":872,"kind":826,"required":830},{"name":1386,"kind":826,"annotation":1387,"required":830,"description":1388},"timeout",{"name":1281,"cls":829},"How long in seconds to wait for a response from the device.",{"name":1390,"kind":1033,"required":42,"default":1034,"description":1391},"**validation_kwargs","Kwargs to use to run validation of the device, in the case of\nuse with `autodetect=True`, these kwargs will be stored on the first call for all future validations.",{"description":1393,"annotation":1394},"Propagated return value from `identity`; True if `identity` returns True else False",{"name":1028,"cls":829},[1396],{"description":734,"code":1397},">>> p = Protocol(t:TransportFactory, **kwargs)  # kwargs passed to `Protocol` p and `Transport` t\n>>> p.open(**config_kwargs)                     # user-parsed config variables set",{"type":819,"name":1254,"path":1207,"parent":756,"description":1399,"lines":1400,"parameters":1403},"Open underlying `Transport`, establish a connection to a device and validate the device's identity.",[1401,1402],159,178,[1404,1405,1410],{"name":872,"kind":826,"required":830},{"name":1406,"kind":826,"annotation":1407,"required":42,"default":1408,"description":1409},"validation_timeout",{"name":1281,"cls":829},"1.0","How long in seconds to wait for a response to `Protocol.validate`.",{"name":1390,"kind":1033,"required":42,"default":1034,"description":1411},"kwargs to be passed to `Protocol.validate` to test device identity against.",{"type":819,"name":1255,"path":1207,"parent":756,"description":1413,"lines":1414,"parameters":1417},"Close underlying `Transport`.\nExplicitly calling `close` will NOT attempt to reconnect to the `Transport`.",[1415,1416],180,187,[1418],{"name":872,"kind":826,"required":830},{"type":819,"name":1256,"path":1207,"parent":756,"description":1420,"lines":1421,"parameters":1424},"Invoked by `transport` when connection is made. Logs the connection.",[1422,1423],189,196,[1425,1426],{"name":872,"kind":826,"required":830},{"name":1427,"kind":826,"annotation":1428,"required":830},"transport",{"name":1429,"cls":829},"asyncio.Transport",{"type":819,"name":1257,"path":1207,"parent":756,"description":1431,"lines":1432,"parameters":1435},"Invoked by transport when connection is lost.\nAttempts to reconnect after `reconnect_delay` seconds.\n\nHere `exc` can be None as a result of :\n    - manual abort through direct call of transport's `abort` method\n    - connection closing after `_safe_write` successfully wrote all data in write-buffer",[1433,1434],198,224,[1436,1437],{"name":872,"kind":826,"required":830},{"name":1438,"kind":826,"annotation":1439,"required":42,"default":882},"exc",{"left":1440,"slice":1441},{"name":877,"cls":829},{"name":1442,"cls":829},"Exception",{"type":819,"name":1258,"path":1207,"parent":756,"lines":1444,"parameters":1447},[1445,1446],226,227,[1448],{"name":872,"kind":826,"required":830},{"type":819,"name":1259,"path":1207,"parent":756,"lines":1450,"parameters":1453},[1451,1452],229,230,[1454],{"name":872,"kind":826,"required":830},{"type":819,"name":1260,"path":1207,"parent":756,"description":1456,"lines":1457,"parameters":1460},"Invoked by transport when data is received. Logs the data and sets the\nresponse if not already set.\nFurther invocations with the same `Response` will only be logged.",[1458,1459],232,245,[1461,1462],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1463,"required":830,"description":1464},{"name":828,"cls":829},"The data received.",{"type":819,"name":1261,"path":1207,"parent":756,"description":1466,"lines":1467,"parameters":1470},"Invoked by transport when an error is received. Logs the error and sets\nthe response if not already set.\nFurther invocations with the same `Response` will only be logged.",[1468,1469],247,259,[1471,1472],{"name":872,"kind":826,"required":830},{"name":1438,"kind":826,"annotation":1473,"required":830,"description":1483},{"left":1474,"slice":1476},{"name":1475,"cls":829},"typing.Union",{"elements":1477},[1478,1479],{"name":1442,"cls":829},{"left":1480,"slice":1482},{"name":1481,"cls":829},"type",{"name":1442,"cls":829},"The error received.",{"type":819,"name":1262,"path":1207,"parent":756,"description":1485,"lines":1486,"parameters":1488,"returns":1499,"throws":1504,"examples":1513},"Executes a `Command` by sending the `Request` within the `Command` to the `Transport`.",[1487,1228],261,[1489,1490],{"name":872,"kind":826,"required":830},{"name":1491,"kind":826,"annotation":1492,"required":830,"description":1498},"command",{"left":1493,"slice":1494},{"name":752,"cls":829},{"elements":1495},[1496,1497],{"name":1209,"cls":829},{"name":1210,"cls":829},"The `Command` to be executed.",{"description":1500,"annotation":1501},"The deserialized response, created by `command.result()` or None if `Command.is_void` is True.",{"left":1502,"slice":1503},{"name":877,"cls":829},{"name":1210,"cls":829},[1505,1509],{"description":1506,"annotation":1507},"If the transport is not open, does not currently allow writing, or\nis busy processing and cannot accept more work at the moment.",{"name":1508,"cls":829},"RuntimeError",{"description":1510,"annotation":1511},"If the response is not received within the specified timeout.",{"name":1512,"cls":829},"TimeoutError",[1514,1517],{"description":1515,"code":1516},"Use with a single command.",">>> response = await protocol.execute(ByteCommand(b\"test\"))",{"description":1518,"code":1519},"Use with `asyncio.gather` to send multiple commands at once, here using `return_exceptions=True`\ntreats exceptions the same as successful results and stores them in the `responses` list.",">>> responses = await asyncio.gather(\n>>>   *[ByteCommand(req) for req in [b\"test1\", b\"test2\"]],\n>>>   return_exceptions=True,\n>>> )",{"type":738,"name":745,"path":1521,"parent":739,"packages":1522,"attributes":1525,"classes":1527},"unitelabs\u002Fbus\u002Futils\u002F__init__.py",[1523,1524],"unitelabs.bus.utils.device_manager","unitelabs.bus.utils.autodetect",[1526],"unitelabs.bus.utils.__all__",[1351,1528,759],"unitelabs.bus.utils.device_manager.DeviceInfo",{"type":764,"name":1526,"path":1521,"parent":745,"lines":1530,"value":1532},[1531,1531],4,[1533,778,1534],"AutoDetector","DeviceInfo",{"type":738,"name":1523,"path":1536,"parent":745,"attributes":1537,"classes":1539},"unitelabs\u002Fbus\u002Futils\u002Fdevice_manager.py",[1538],"unitelabs.bus.utils.device_manager.devices",[1540,1528,1541,759],"unitelabs.bus.utils.device_manager.NoSuchDeviceFound","unitelabs.bus.utils.device_manager.DeviceManager",{"type":842,"name":1540,"path":1536,"parent":1523,"lines":1543,"bases":1544,"mro":1547},[801,766],[1545],{"annotation":1546},{"name":1442,"cls":829},[1540],{"type":842,"name":1528,"path":1536,"parent":1523,"description":1549,"lines":1550,"decorators":1552,"attributes":1554,"functions":1566,"mro":1570},"Translation of `serial.tools.list_ports.ListPortInfo` for unified interface between USB and Serial `DeviceManagers`.\nAttrs here represent valid filter criteria during device search.",[1551,916],11,[1553],"dataclasses.dataclass",[1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565],"unitelabs.bus.utils.device_manager.DeviceInfo.device","unitelabs.bus.utils.device_manager.DeviceInfo.name","unitelabs.bus.utils.device_manager.DeviceInfo.description","unitelabs.bus.utils.device_manager.DeviceInfo.hwid","unitelabs.bus.utils.device_manager.DeviceInfo.vid","unitelabs.bus.utils.device_manager.DeviceInfo.pid","unitelabs.bus.utils.device_manager.DeviceInfo.serial_number","unitelabs.bus.utils.device_manager.DeviceInfo.location","unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer","unitelabs.bus.utils.device_manager.DeviceInfo.product","unitelabs.bus.utils.device_manager.DeviceInfo.interface",[1567,1568,1569],"unitelabs.bus.utils.device_manager.DeviceInfo.__init__","unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__","unitelabs.bus.utils.device_manager.DeviceInfo.__repr__",[1528],{"type":764,"name":1555,"path":1536,"parent":1528,"lines":1572,"value":882,"annotation":1573},[1090,1090],{"name":913,"cls":829},{"type":764,"name":1556,"path":1536,"parent":1528,"lines":1575,"value":882,"annotation":1577},[1576,1576],19,{"name":913,"cls":829},{"type":764,"name":1557,"path":1536,"parent":1528,"lines":1579,"value":882,"annotation":1580},[1186,1186],{"left":1581,"slice":1582},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1558,"path":1536,"parent":1528,"lines":1584,"value":882,"annotation":1585},[885,885],{"left":1586,"slice":1587},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1559,"path":1536,"parent":1528,"lines":1589,"value":882,"annotation":1590},[869,869],{"left":1591,"slice":1592},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1560,"path":1536,"parent":1528,"lines":1594,"value":882,"annotation":1595},[1187,1187],{"left":1596,"slice":1597},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1561,"path":1536,"parent":1528,"lines":1599,"value":882,"annotation":1600},[892,892],{"left":1601,"slice":1602},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1562,"path":1536,"parent":1528,"lines":1604,"value":882,"annotation":1605},[1146,1146],{"left":1606,"slice":1607},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1563,"path":1536,"parent":1528,"lines":1609,"value":882,"annotation":1610},[1147,1147],{"left":1611,"slice":1612},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1564,"path":1536,"parent":1528,"lines":1614,"value":882,"annotation":1615},[893,893],{"left":1616,"slice":1617},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1565,"path":1536,"parent":1528,"lines":1619,"value":882,"annotation":1621},[1620,1620],29,{"left":1622,"slice":1623},{"name":877,"cls":829},{"name":913,"cls":829},{"type":819,"name":1568,"path":1536,"parent":1528,"lines":1625,"parameters":1626},[899,910],[1627],{"name":872,"kind":826,"required":830},{"type":819,"name":1569,"path":1536,"parent":1528,"lines":1629,"parameters":1631},[1630,916],36,[1632],{"name":872,"kind":826,"required":830},{"type":819,"name":1567,"path":1536,"parent":1528,"lines":1634,"parameters":1636},[1635,1635],0,[1637,1638,1640,1643,1648,1653,1658,1663,1668,1673,1678,1683],{"name":872,"kind":826,"required":830},{"name":1020,"kind":826,"annotation":1639,"required":830},{"name":913,"cls":829},{"name":1641,"kind":826,"annotation":1642,"required":830},"name",{"name":913,"cls":829},{"name":1644,"kind":826,"annotation":1645,"required":42,"default":882},"description",{"left":1646,"slice":1647},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1649,"kind":826,"annotation":1650,"required":42,"default":882},"hwid",{"left":1651,"slice":1652},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1654,"kind":826,"annotation":1655,"required":42,"default":882},"vid",{"left":1656,"slice":1657},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1659,"kind":826,"annotation":1660,"required":42,"default":882},"pid",{"left":1661,"slice":1662},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1664,"kind":826,"annotation":1665,"required":42,"default":882},"serial_number",{"left":1666,"slice":1667},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1669,"kind":826,"annotation":1670,"required":42,"default":882},"location",{"left":1671,"slice":1672},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1674,"kind":826,"annotation":1675,"required":42,"default":882},"manufacturer",{"left":1676,"slice":1677},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1679,"kind":826,"annotation":1680,"required":42,"default":882},"product",{"left":1681,"slice":1682},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1684,"kind":826,"annotation":1685,"required":42,"default":882},"interface",{"left":1686,"slice":1687},{"name":877,"cls":829},{"name":913,"cls":829},{"type":842,"name":1541,"path":1536,"parent":1523,"description":1689,"lines":1690,"functions":1691,"mro":1696},"Detect, filter, and get info for connected devices.",[1050,928],[1692,1693,1694,1695],"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs","unitelabs.bus.utils.device_manager.DeviceManager.get_all","unitelabs.bus.utils.device_manager.DeviceManager.check_device_match","unitelabs.bus.utils.device_manager.DeviceManager.filter",[1541],{"type":819,"name":1692,"path":1536,"parent":1541,"lines":1698,"decorators":1699,"parameters":1701,"returns":1712},[1054,1305],[1700,1366],"classmethod",[1702,1704],{"name":1703,"kind":826,"required":830},"cls",{"name":1055,"kind":826,"annotation":1705,"required":830},{"left":1706,"slice":1708},{"name":1707,"cls":829},"typing.Dict",{"elements":1709},[1710,1711],{"name":913,"cls":829},{"name":913,"cls":829},{"description":835,"annotation":1713},{"left":1714,"slice":1715},{"name":1707,"cls":829},{"elements":1716},[1717,1718],{"name":913,"cls":829},{"name":913,"cls":829},{"type":819,"name":1693,"path":1536,"parent":1541,"lines":1720,"decorators":1721,"parameters":1722,"returns":1724},[1009,1058],[1700,1366],[1723],{"name":1703,"kind":826,"required":830},{"description":835,"annotation":1725},{"left":1726,"slice":1727},{"name":880,"cls":829},{"name":1528,"cls":829},{"type":819,"name":1694,"path":1536,"parent":1541,"lines":1729,"decorators":1732,"parameters":1733,"returns":1739},[1730,1731],51,53,[1700,1366],[1734,1735,1738],{"name":1703,"kind":826,"required":830},{"name":1736,"kind":826,"annotation":1737,"required":830},"device_info",{"name":1528,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034},{"description":835,"annotation":1740},{"name":1028,"cls":829},{"type":819,"name":1695,"path":1536,"parent":1541,"lines":1742,"decorators":1743,"parameters":1744,"returns":1747},[923,928],[1700,1366],[1745,1746],{"name":1703,"kind":826,"required":830},{"name":1032,"kind":1033,"required":42,"default":1034},{"description":835,"annotation":1748},{"left":1749,"slice":1750},{"name":880,"cls":829},{"name":1528,"cls":829},{"type":842,"name":759,"path":1536,"parent":1523,"description":1752,"lines":1753,"bases":1755,"attributes":1758,"functions":1760,"mro":1765},"Detect, filter, and get info for connected serial devices.",[1330,1754],154,[1756],{"annotation":1757},{"name":1541,"cls":829},[1759],"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS",[1761,1762,1763,1764],"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs","unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all","unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match","unitelabs.bus.utils.device_manager.SerialDeviceManager.filter",[759,1541],{"type":764,"name":1759,"path":1536,"parent":759,"lines":1767,"value":1769},[1339,1768],78,"['device', 'name', 'description', 'hwid', 'vid', 'pid', 'serial_number', 'location', 'manufacturer', 'product', 'interface']",{"type":819,"name":1761,"path":1536,"parent":759,"description":1771,"lines":1772,"decorators":1774,"parameters":1775,"returns":1785},"Filter kwargs to those which are returned from `serial.tools.list_ports.comports`,\ni.e. the attributes of `DeviceInfo`.  Supports the use of `port` as alternative name for `device`.",[947,1773],94,[1700],[1776,1777],{"name":1703,"kind":826,"required":830},{"name":1055,"kind":826,"annotation":1778,"required":830,"description":1784},{"left":1779,"slice":1780},{"name":1707,"cls":829},{"elements":1781},[1782,1783],{"name":913,"cls":829},{"name":913,"cls":829},"A dictionary of key-value pairs to filter.",{"description":1786,"annotation":1787},"The filtered dictionary.",{"left":1788,"slice":1789},{"name":1707,"cls":829},{"elements":1790},[1791,1792],{"name":913,"cls":829},{"name":913,"cls":829},{"type":819,"name":1762,"path":1536,"parent":759,"description":1794,"lines":1795,"decorators":1798,"parameters":1799,"returns":1801},"Get all connected devices.",[1796,1797],96,109,[1700],[1800],{"name":1703,"kind":826,"required":830},{"description":1802,"annotation":1803},"A list of all devices detected.",{"left":1804,"slice":1805},{"name":880,"cls":829},{"name":1528,"cls":829},{"type":819,"name":1763,"path":1536,"parent":759,"description":1807,"lines":1808,"decorators":1811,"parameters":1812,"returns":1819},"Determine if the `DeviceInfo` instance's attributes match the filter `**kwargs`",[1809,1810],111,132,[1700],[1813,1814,1817],{"name":1703,"kind":826,"required":830},{"name":1736,"kind":826,"annotation":1815,"required":830,"description":1816},{"name":1528,"cls":829},"The device to check for a match against.",{"name":1032,"kind":1033,"required":42,"default":1034,"description":1818},"The key-value pairs, which will be filtered, and then used to evaluate the device for a match.",{"description":1820,"annotation":1821},"True if the `DeviceInfo` matches (or no kwargs provided, or all kwargs have been filtered), else False.",{"name":1028,"cls":829},{"type":819,"name":1764,"path":1536,"parent":759,"description":1823,"lines":1824,"decorators":1826,"parameters":1827,"returns":1831},"Search through all detectable devices.\n`**kwargs` are first filtered by `filter_kwargs` based on attrs of `DeviceInfo`.\nThis allows the number of devices detected to be pared down based on known, stable\ninformation about the device being searched for.",[1825,1754],134,[1700],[1828,1829],{"name":1703,"kind":826,"required":830},{"name":1032,"kind":1033,"required":42,"default":1034,"description":1830},"Search criteria for finding a device.",{"description":1832,"annotation":1833},"A list of devices which match all `**kwargs` provided.",{"left":1834,"slice":1835},{"name":880,"cls":829},{"name":1528,"cls":829},{"type":764,"name":1538,"path":1536,"parent":1523,"lines":1837,"value":1839},[1838,1838],158,"SerialDeviceManager().get_all()",{"type":738,"name":1524,"path":1841,"parent":745,"classes":1842},"unitelabs\u002Fbus\u002Futils\u002Fautodetect.py",[1843,1351],"unitelabs.bus.utils.autodetect.TransportType",{"type":842,"name":1843,"path":1841,"parent":1524,"lines":1845,"bases":1846,"attributes":1850,"mro":1854},[802,868],[1847],{"annotation":1848},{"name":1849,"cls":829},"enum.Enum",[1851,1852,1853],"unitelabs.bus.utils.autodetect.TransportType.serial","unitelabs.bus.utils.autodetect.TransportType.usb","unitelabs.bus.utils.autodetect.TransportType.unknown",[1843],{"type":764,"name":1851,"path":1841,"parent":1843,"lines":1856,"value":1858},[1857,1857],15,"enum.auto()",{"type":764,"name":1852,"path":1841,"parent":1843,"lines":1860,"value":1858},[1861,1861],16,{"type":764,"name":1853,"path":1841,"parent":1843,"lines":1863,"value":1858},[868,868],{"type":842,"name":1351,"path":1841,"parent":1524,"description":1865,"lines":1866,"attributes":1868,"functions":1878,"mro":1885},"This class is used by the `unitelabs.bus.Protocol` to cycle through possible devices until the correct device is found.",[1186,1867],148,[1869,1870,1871,1872,1873,1874,1875,1876,1877],"unitelabs.bus.utils.autodetect.AutoDetector._transport_type","unitelabs.bus.utils.autodetect.AutoDetector.protocol","unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs","unitelabs.bus.utils.autodetect.AutoDetector._device_manager","unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs","unitelabs.bus.utils.autodetect.AutoDetector._is_resolving","unitelabs.bus.utils.autodetect.AutoDetector.logger","unitelabs.bus.utils.autodetect.AutoDetector.device_manager","unitelabs.bus.utils.autodetect.AutoDetector.is_resolving",[1879,1880,1881,1882,1883,1884],"unitelabs.bus.utils.autodetect.AutoDetector.__init__","unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type","unitelabs.bus.utils.autodetect.AutoDetector.get_device_manager","unitelabs.bus.utils.autodetect.AutoDetector.resolve","unitelabs.bus.utils.autodetect.AutoDetector._connect","unitelabs.bus.utils.autodetect.AutoDetector._update_protocol_transport",[1351],{"type":764,"name":1869,"path":1841,"parent":1351,"lines":1887,"value":882,"annotation":1888},[1620,1620],{"name":1843,"cls":829},{"type":819,"name":1879,"path":1841,"parent":1351,"lines":1890,"parameters":1891},[899,1050],[1892,1893,1897],{"name":872,"kind":826,"required":830},{"name":1894,"kind":826,"annotation":1895,"required":830,"description":1896},"protocol",{"name":756,"cls":829},"The `unitelabs.bus.Protocol` instance to use.",{"name":1032,"kind":1033,"required":42,"default":1034,"description":1898},"Kwargs used to initialize the `Protocol` instance, which contains `Transport` init kwargs.",{"type":764,"name":1870,"path":1841,"parent":1351,"lines":1900,"value":1894},[1901,1901],32,{"type":764,"name":1871,"path":1841,"parent":1351,"lines":1903,"value":1055},[1038,1038],{"type":764,"name":1872,"path":1841,"parent":1351,"lines":1905,"value":882},[911,911],{"type":764,"name":1873,"path":1841,"parent":1351,"lines":1907,"value":1055},[1630,1630],{"type":764,"name":1874,"path":1841,"parent":1351,"lines":1909,"value":1029},[1046,1046],{"type":819,"name":1880,"path":1841,"parent":1351,"description":1911,"lines":1912,"parameters":1914},"Infer the type of the transport based on the `protocol._transport_factory`\nwhich stores the `TransportFactory` used to initialize the `Protocol`.\nThis allows the differential initialization of new transport instances based on `DeviceInfo`.",[1913,1731],42,[1915],{"name":872,"kind":826,"required":830},{"type":764,"name":1875,"path":1841,"parent":1351,"lines":1917,"value":882,"annotation":1918},[1124,928],{"name":1155,"cls":829},{"type":764,"name":1876,"path":1841,"parent":1351,"lines":1920,"value":882,"annotation":1921},[1330,1333],{"left":1922,"slice":1923},{"name":1481,"cls":829},{"name":1541,"cls":829},{"type":819,"name":1881,"path":1841,"parent":1351,"description":1925,"lines":1926,"parameters":1928,"returns":1930},"Get the correct `DeviceManager` based on the `TransportType`.",[1339,1927],71,[1929],{"name":872,"kind":826,"required":830},{"description":835,"annotation":1931},{"left":1932,"slice":1933},{"name":1481,"cls":829},{"name":1541,"cls":829},{"type":764,"name":1877,"path":1841,"parent":1351,"description":1935,"lines":1936,"value":882,"annotation":1938},"Whether or not we are currently trying to connect to a device",[934,1937],76,{"name":1028,"cls":829},{"type":819,"name":1882,"path":1841,"parent":1351,"description":1940,"lines":1941,"parameters":1943},"User entry-point.\nIterates through all available devices until a connection is successfully made,\nor all available devices have been tested. If no valid connection can be found,\ncalls to `protocol.connection_lost` to pass control back to `protocol`.",[1768,1942],108,[1944,1945,1948],{"name":872,"kind":826,"required":830},{"name":1406,"kind":826,"annotation":1946,"required":830,"description":1947},{"name":1281,"cls":829},"How long in seconds to wait for a response from `Protocol.validate`.",{"name":1390,"kind":1033,"required":42,"default":1034,"description":1949},"kwargs from `Protocol.validate` used to validate the connection.",{"type":819,"name":1883,"path":1841,"parent":1351,"description":1951,"lines":1952,"parameters":1955,"returns":1962},"Updates the `transport` on the `protocol` and attempts to open said `transport`\nand validate the connection using `Protocol.validate`.",[1953,1954],110,129,[1956,1957,1959],{"name":872,"kind":826,"required":830},{"name":1406,"kind":826,"annotation":1958,"required":830,"description":1947},{"name":1281,"cls":829},{"name":1020,"kind":826,"annotation":1960,"required":830,"description":1961},{"name":1528,"cls":829},"The device to which we wish to attempt to validate a connection.",{"description":1963,"annotation":1964},"Whether or not the connection was successfully made and validated.",{"name":1028,"cls":829},{"type":819,"name":1884,"path":1841,"parent":1351,"description":1966,"lines":1967,"parameters":1969},"Update the `Protocol`s underlying `Transport` to connect to the given `device`.",[1968,1867],131,[1970,1971],{"name":872,"kind":826,"required":830},{"name":1020,"kind":826,"annotation":1972,"required":830,"description":1973},{"name":1528,"cls":829},"The `DeviceInfo` of the new device to connect the `Protocol` to.",{"type":738,"name":746,"path":1975,"parent":739,"packages":1976,"attributes":1983,"classes":1985},"unitelabs\u002Fbus\u002Ftransports\u002F__init__.py",[1977,1978,1979,1980,1981,1982],"unitelabs.bus.transports.serial_transport","unitelabs.bus.transports.read_transport","unitelabs.bus.transports.transport","unitelabs.bus.transports.usb_transport","unitelabs.bus.transports.write_transport","unitelabs.bus.transports.base_transport",[1984],"unitelabs.bus.transports.__all__",[1006,1004,1986,1987,757,1988,951,758,1005],"unitelabs.bus.transports.serial_transport.ByteSize","unitelabs.bus.transports.serial_transport.Parity","unitelabs.bus.transports.serial_transport.StopBits",{"type":764,"name":1984,"path":1975,"parent":746,"lines":1990,"value":1991},[766,1090],[1992,1993,1994,1995,776,1996,1997,1998,777],"BaseTransport","ReadTransport","WriteTransport","Transport","ByteSize","Parity","StopBits",{"type":738,"name":1977,"path":2000,"parent":746,"attributes":2001,"classes":2003},"unitelabs\u002Fbus\u002Ftransports\u002Fserial_transport.py",[2002],"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME",[1986,1987,1988,757],{"type":842,"name":1986,"path":2000,"parent":1977,"lines":2005,"bases":2006,"attributes":2010,"mro":2015},[1857,1576],[2007],{"annotation":2008},{"name":2009,"cls":829},"enum.IntEnum",[2011,2012,2013,2014],"unitelabs.bus.transports.serial_transport.ByteSize.FIVEBITS","unitelabs.bus.transports.serial_transport.ByteSize.SIXBITS","unitelabs.bus.transports.serial_transport.ByteSize.SEVENBITS","unitelabs.bus.transports.serial_transport.ByteSize.EIGHTBITS",[1986],{"type":764,"name":2011,"path":2000,"parent":1986,"lines":2017,"value":2018},[1861,1861],"5",{"type":764,"name":2012,"path":2000,"parent":1986,"lines":2020,"value":2021},[868,868],"6",{"type":764,"name":2013,"path":2000,"parent":1986,"lines":2023,"value":2024},[1090,1090],"7",{"type":764,"name":2014,"path":2000,"parent":1986,"lines":2026,"value":2027},[1576,1576],"8",{"type":842,"name":1987,"path":2000,"parent":1977,"lines":2029,"bases":2030,"attributes":2035,"mro":2041},[885,1147],[2031,2033],{"annotation":2032},{"name":913,"cls":829},{"annotation":2034},{"name":1849,"cls":829},[2036,2037,2038,2039,2040],"unitelabs.bus.transports.serial_transport.Parity.NONE","unitelabs.bus.transports.serial_transport.Parity.ODD","unitelabs.bus.transports.serial_transport.Parity.EVEN","unitelabs.bus.transports.serial_transport.Parity.MARK","unitelabs.bus.transports.serial_transport.Parity.SPACE",[1987],{"type":764,"name":2036,"path":2000,"parent":1987,"lines":2043,"value":2044},[869,869],"'N'",{"type":764,"name":2037,"path":2000,"parent":1987,"lines":2046,"value":2047},[1187,1187],"'O'",{"type":764,"name":2038,"path":2000,"parent":1987,"lines":2049,"value":2050},[892,892],"'E'",{"type":764,"name":2039,"path":2000,"parent":1987,"lines":2052,"value":2053},[1146,1146],"'M'",{"type":764,"name":2040,"path":2000,"parent":1987,"lines":2055,"value":2056},[1147,1147],"'S'",{"type":842,"name":1988,"path":2000,"parent":1977,"lines":2058,"bases":2059,"attributes":2064,"mro":2068},[898,1038],[2060,2062],{"annotation":2061},{"name":1281,"cls":829},{"annotation":2063},{"name":1849,"cls":829},[2065,2066,2067],"unitelabs.bus.transports.serial_transport.StopBits.ONE","unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE","unitelabs.bus.transports.serial_transport.StopBits.TWO",[1988],{"type":764,"name":2065,"path":2000,"parent":1988,"lines":2070,"value":1408},[899,899],{"type":764,"name":2066,"path":2000,"parent":1988,"lines":2072,"value":2073},[1901,1901],"1.5",{"type":764,"name":2067,"path":2000,"parent":1988,"lines":2075,"value":2076},[1038,1038],"2.0",{"type":764,"name":2002,"path":2000,"parent":1977,"lines":2078,"value":2079},[1630,1630],"0.0005",{"type":842,"name":757,"path":2000,"parent":1977,"description":2081,"lines":2082,"bases":2084,"attributes":2087,"functions":2091,"mro":2104},"Transport for serial devices.",[917,2083],168,[2085],{"annotation":2086},{"name":951,"cls":829},[2088,2089,2090,959,960,961,962,963,964,965,966],"unitelabs.bus.transports.serial_transport.SerialTransport._serial","unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size","unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer",[2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,978,979,980,981,982,983,984,985,986,987,988,989,2103,990,991,992,993,994,995,996,997,998,999,1000,1001,1002],"unitelabs.bus.transports.serial_transport.SerialTransport.__init__","unitelabs.bus.transports.serial_transport.SerialTransport._open","unitelabs.bus.transports.serial_transport.SerialTransport._close","unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader","unitelabs.bus.transports.serial_transport.SerialTransport._poll_read","unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader","unitelabs.bus.transports.serial_transport.SerialTransport._read","unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer","unitelabs.bus.transports.serial_transport.SerialTransport._poll_write","unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer","unitelabs.bus.transports.serial_transport.SerialTransport._write","unitelabs.bus.transports.write_transport.WriteTransport.write",[757,951,1004,1005,1006],{"type":819,"name":2092,"path":2000,"parent":757,"lines":2106,"parameters":2108},[2107,929],50,[2109,2110,2114,2119,2124,2129],{"name":872,"kind":826,"required":830},{"name":2111,"kind":826,"annotation":2112,"required":830,"description":2113},"port",{"name":913,"cls":829},"The port where the serial device is connected.",{"name":2115,"kind":826,"annotation":2116,"required":42,"default":2117,"description":2118},"baudrate",{"name":1074,"cls":829},"9600","The baud rate.",{"name":2120,"kind":826,"annotation":2121,"required":42,"default":2122,"description":2123},"bytesize",{"name":1986,"cls":829},{"name":2014,"cls":829},"Number of data bits.",{"name":2125,"kind":826,"annotation":2126,"required":42,"default":2127,"description":2128},"parity",{"name":1987,"cls":829},{"name":2036,"cls":829},"Parity checking method for error-detection.",{"name":2130,"kind":826,"annotation":2131,"required":42,"default":2132,"description":2133},"stopbits",{"name":1988,"cls":829},{"name":2065,"cls":829},"The number of stopbits.",{"type":764,"name":2088,"path":2000,"parent":757,"lines":2135,"value":2136},[1345,1345],"_serial",{"type":764,"name":2089,"path":2000,"parent":757,"lines":2138,"value":2139},[1067,1067],"1024",{"type":764,"name":2090,"path":2000,"parent":757,"lines":2141,"value":1312},[929,929],{"type":819,"name":2093,"path":2000,"parent":757,"description":2143,"lines":2144,"parameters":2145},"Opens underlying serial port, if not already open.",[934,947],[2146],{"name":872,"kind":826,"required":830},{"type":819,"name":2094,"path":2000,"parent":757,"description":2148,"lines":2149,"parameters":2152},"Closes underlying serial port, if open.",[2150,2151],82,88,[2153],{"name":872,"kind":826,"required":830},{"type":819,"name":2095,"path":2000,"parent":757,"lines":2155,"parameters":2158},[2156,2157],93,102,[2159],{"name":872,"kind":826,"required":830},{"type":819,"name":2096,"path":2000,"parent":757,"lines":2161,"parameters":2163},[2162,1953],104,[2164],{"name":872,"kind":826,"required":830},{"type":819,"name":2097,"path":2000,"parent":757,"lines":2166,"parameters":2169},[2167,2168],112,118,[2170],{"name":872,"kind":826,"required":830},{"type":819,"name":2098,"path":2000,"parent":757,"lines":2172,"parameters":2175,"returns":2177},[2173,2174],120,127,[2176],{"name":872,"kind":826,"required":830},{"description":835,"annotation":2178},{"left":2179,"slice":2180},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":2099,"path":2000,"parent":757,"description":2182,"lines":2183,"parameters":2184,"throws":2186},"Adds a writer to the loop if not already added.",[1810,1867],[2185],{"name":872,"kind":826,"required":830},[2187],{"description":2188,"annotation":2189},"If the serial port is not open.",{"name":2190,"cls":829},"serial.PortNotOpenError",{"type":819,"name":2100,"path":2000,"parent":757,"lines":2192,"parameters":2195},[2193,2194],150,153,[2196],{"name":872,"kind":826,"required":830},{"type":819,"name":2101,"path":2000,"parent":757,"description":2198,"lines":2199,"parameters":2202},"Removes a writer from the loop.",[2200,2201],155,165,[2203],{"name":872,"kind":826,"required":830},{"type":819,"name":2102,"path":2000,"parent":757,"lines":2205,"parameters":2207,"returns":2211},[2206,2083],167,[2208,2209],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2210,"required":830},{"name":828,"cls":829},{"description":835,"annotation":2212},{"name":1074,"cls":829},{"type":738,"name":1978,"path":2214,"parent":746,"classes":2215},"unitelabs\u002Fbus\u002Ftransports\u002Fread_transport.py",[1004],{"type":842,"name":1004,"path":2214,"parent":1978,"description":2217,"lines":2218,"bases":2219,"attributes":2225,"functions":2226,"mro":2233},"Interface for read-only transports.",[766,1810],[2220,2222],{"annotation":2221},{"name":1006,"cls":829},{"annotation":2223},{"name":2224,"cls":829},"asyncio.ReadTransport",[959,964,965,966],[2227,978,979,980,981,982,983,2228,2229,984,2230,985,986,998,999,1000,2231,2232,1001,1002],"unitelabs.bus.transports.read_transport.ReadTransport.__init__","unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader","unitelabs.bus.transports.read_transport.ReadTransport._remove_reader","unitelabs.bus.transports.read_transport.ReadTransport._read","unitelabs.bus.transports.base_transport.BaseTransport._open","unitelabs.bus.transports.base_transport.BaseTransport._close",[1004,1006],{"type":819,"name":2227,"path":2214,"parent":1004,"lines":2235,"parameters":2236},[1551,1220],[2237],{"name":872,"kind":826,"required":830},{"type":764,"name":959,"path":2214,"parent":1004,"lines":2239,"value":1029},[1220,1220],{"type":819,"name":978,"path":2214,"parent":1004,"description":2241,"lines":2242,"parameters":2243},"Opens the transport and sets state to allow future read operations.",[1857,885],[2244],{"name":872,"kind":826,"required":830},{"type":819,"name":979,"path":2214,"parent":1004,"description":2246,"lines":2247,"parameters":2248},"Closes the transport and sets state to disallow further read operations.",[1187,898],[2249],{"name":872,"kind":826,"required":830},{"type":819,"name":980,"path":2214,"parent":1004,"description":2251,"lines":2252,"parameters":2253,"returns":2255},"Whether or not reading operations are currently being performed.",[1901,917],[2254],{"name":872,"kind":826,"required":830},{"description":2256,"annotation":2257},"True if the transport is receiving, otherwise False.",{"name":1028,"cls":829},{"type":819,"name":981,"path":2214,"parent":1004,"description":2259,"lines":2260,"parameters":2261},"Pause the receiving end.\n\nNo data will be passed to the protocol's `data_received()`\nmethod until `resume_reading()` is called.",[922,1058],[2262],{"name":872,"kind":826,"required":830},{"type":819,"name":982,"path":2214,"parent":1004,"description":2264,"lines":2265,"parameters":2266},"Resume the receiving end.\n\nData received will once again be passed to the protocol's\n`data_received()` method.",[1730,1327],[2267],{"name":872,"kind":826,"required":830},{"type":819,"name":983,"path":2214,"parent":1004,"description":2269,"lines":2270,"parameters":2272},"Closes the transport immediately and updates state to disable further\nread operations.",[2271,1927],61,[2273,2274],{"name":872,"kind":826,"required":830},{"name":2275,"kind":826,"annotation":2276,"required":42,"default":882,"description":2279},"exception",{"left":2277,"slice":2278},{"name":877,"cls":829},{"name":1442,"cls":829},"The Exception to propagate to the protocol when aborting, if connected.",{"type":819,"name":2228,"path":2214,"parent":1004,"description":2281,"lines":2282,"parameters":2284},"Set state to enable future read operations.",[2283,1768],73,[2285],{"name":872,"kind":826,"required":830},{"type":819,"name":2229,"path":2214,"parent":1004,"description":2287,"lines":2288,"parameters":2290},"Set state to disable further read operations.",[947,2289],85,[2291],{"name":872,"kind":826,"required":830},{"type":819,"name":984,"path":2214,"parent":1004,"description":2293,"lines":2294,"parameters":2296},"Safely and asynchronously read data from the transport.",[1356,2295],98,[2297],{"name":872,"kind":826,"required":830},{"type":819,"name":2230,"path":2214,"parent":1004,"description":2299,"lines":2300,"parameters":2302,"returns":2304},"Read data from the transport.\nCalled within `_safe_read` for asynchronous reading.",[2301,1797],100,[2303],{"name":872,"kind":826,"required":830},{"description":2305,"annotation":2306},"Data read from the transport.",{"left":2307,"slice":2308},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":985,"path":2214,"parent":1004,"description":2310,"lines":2311,"parameters":2313,"returns":2315},"Read all available data from the transport. Repeatedly calls `_read` and\naggregates the results until no further data is available.",[1809,2312],124,[2314],{"name":872,"kind":826,"required":830},{"description":2316,"annotation":2317},"All available data from the transport.",{"name":828,"cls":829},{"type":819,"name":986,"path":2214,"parent":1004,"description":2319,"lines":2320,"parameters":2322},"Clears out all available read data without notifying the protocol. Calls `read_all` and throws away the result.",[2321,1810],126,[2323],{"name":872,"kind":826,"required":830},{"type":738,"name":1979,"path":2325,"parent":746,"classes":2326},"unitelabs\u002Fbus\u002Ftransports\u002Ftransport.py",[951],{"type":842,"name":951,"path":2325,"parent":1979,"description":2328,"lines":2329,"bases":2330,"attributes":2337,"functions":2338,"mro":2341},"Interface defining bidirectional communication with a device.\n\nTransports read bytes from and write bytes to a device.",[766,916],[2331,2333,2335],{"annotation":2332},{"name":1429,"cls":829},{"annotation":2334},{"name":1004,"cls":829},{"annotation":2336},{"name":1005,"cls":829},[959,960,961,962,963,964,965,966],[972,973,974,975,2339,976,977,2340,2227,978,979,980,981,982,983,984,985,986,987,988,989,2103,990,991,992,993,994,995,996,997,998,999,1000,1001,1002],"unitelabs.bus.transports.transport.Transport._read","unitelabs.bus.transports.transport.Transport._write",[951,1004,1005,1006],{"type":819,"name":972,"path":2325,"parent":951,"lines":2343,"parameters":2344},[1857,1861],[2345],{"name":872,"kind":826,"required":830},{"type":819,"name":973,"path":2325,"parent":951,"lines":2347,"parameters":2348},[1090,1576],[2349],{"name":872,"kind":826,"required":830},{"type":819,"name":974,"path":2325,"parent":951,"lines":2351,"parameters":2352},[767,885],[2353],{"name":872,"kind":826,"required":830},{"type":819,"name":975,"path":2325,"parent":951,"lines":2355,"parameters":2356},[1187,892],[2357],{"name":872,"kind":826,"required":830},{"type":819,"name":2339,"path":2325,"parent":951,"lines":2359,"parameters":2360,"returns":2362},[1147,893],[2361],{"name":872,"kind":826,"required":830},{"description":835,"annotation":2363},{"left":2364,"slice":2365},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":976,"path":2325,"parent":951,"lines":2367,"parameters":2368},[898,899],[2369],{"name":872,"kind":826,"required":830},{"type":819,"name":977,"path":2325,"parent":951,"lines":2371,"parameters":2372},[1038,910],[2373],{"name":872,"kind":826,"required":830},{"type":819,"name":2340,"path":2325,"parent":951,"lines":2375,"parameters":2376,"returns":2380},[1630,916],[2377,2378],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2379,"required":830},{"name":828,"cls":829},{"description":835,"annotation":2381},{"name":1074,"cls":829},{"type":738,"name":1980,"path":2383,"parent":746,"attributes":2384,"classes":2387},"unitelabs\u002Fbus\u002Ftransports\u002Fusb_transport.py",[2385,2386],"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME","unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE",[758],{"type":764,"name":2385,"path":2383,"parent":1980,"lines":2389,"value":2390},[1857,1857],"0.1",{"type":764,"name":2386,"path":2383,"parent":1980,"lines":2392,"value":2393},[1861,1861],"0",{"type":842,"name":758,"path":2383,"parent":1980,"description":2395,"lines":2396,"bases":2398,"attributes":2401,"functions":2411,"mro":2422},"Transport for devices connected via USB.\n\nBy default, this implementation uses Interface 0 of Configuration 1 on the device.",[1576,2397],215,[2399],{"annotation":2400},{"name":951,"cls":829},[2402,2403,2404,2405,2406,2407,2408,2409,2410,959,960,961,962,963,964,966],"unitelabs.bus.transports.usb_transport.UsbTransport.vendor","unitelabs.bus.transports.usb_transport.UsbTransport.product","unitelabs.bus.transports.usb_transport.UsbTransport._closing","unitelabs.bus.transports.usb_transport.UsbTransport._protocol","unitelabs.bus.transports.usb_transport.UsbTransport._interface_index","unitelabs.bus.transports.usb_transport.UsbTransport._device","unitelabs.bus.transports.usb_transport.UsbTransport.read_endpoint","unitelabs.bus.transports.usb_transport.UsbTransport.write_endpoint","unitelabs.bus.transports.usb_transport.UsbTransport._reader_event",[2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,978,979,980,981,982,983,984,985,986,987,988,989,2103,990,991,992,993,994,995,996,997,998,999,1000,1001,1002],"unitelabs.bus.transports.usb_transport.UsbTransport.__init__","unitelabs.bus.transports.usb_transport.UsbTransport._open","unitelabs.bus.transports.usb_transport.UsbTransport._close","unitelabs.bus.transports.usb_transport.UsbTransport._ensure_reader","unitelabs.bus.transports.usb_transport.UsbTransport._remove_reader","unitelabs.bus.transports.usb_transport.UsbTransport.__read","unitelabs.bus.transports.usb_transport.UsbTransport._read","unitelabs.bus.transports.usb_transport.UsbTransport._ensure_writer","unitelabs.bus.transports.usb_transport.UsbTransport._remove_writer","unitelabs.bus.transports.usb_transport.UsbTransport._write",[758,951,1004,1005,1006],{"type":819,"name":2412,"path":2383,"parent":758,"lines":2424,"parameters":2425},[899,2107],[2426,2427,2431,2434,2438],{"name":872,"kind":826,"required":830},{"name":2428,"kind":826,"annotation":2429,"required":830,"description":2430},"vendor",{"name":1074,"cls":829},"The vendor ID of the USB device.",{"name":1679,"kind":826,"annotation":2432,"required":830,"description":2433},{"name":1074,"cls":829},"The product ID of the USB device.",{"name":1894,"kind":826,"annotation":2435,"required":830,"description":2437},{"name":2436,"cls":829},"asyncio.BaseProtocol","The protocol instance to use for communication.",{"name":2439,"kind":826,"annotation":2440,"required":42,"default":2441,"description":2442},"interface_index",{"name":1074,"cls":829},{"name":2386,"cls":829},"The index of the USB Interface to use. Defaults to 0.",{"type":764,"name":2402,"path":2383,"parent":758,"lines":2444,"value":2428},[1050,1050],{"type":764,"name":2403,"path":2383,"parent":758,"lines":2446,"value":1679},[922,922],{"type":764,"name":2404,"path":2383,"parent":758,"lines":2448,"value":1276},[1913,1913],{"type":764,"name":2405,"path":2383,"parent":758,"lines":2450,"value":1894},[1054,1054],{"type":764,"name":2406,"path":2383,"parent":758,"lines":2452,"value":2439},[1302,1302],{"type":764,"name":2407,"path":2383,"parent":758,"lines":2454,"value":882,"annotation":2455},[1308,1308],{"left":2456,"slice":2457},{"name":877,"cls":829},{"name":2458,"cls":829},"usb.core.Device",{"type":764,"name":2408,"path":2383,"parent":758,"lines":2460,"value":882,"annotation":2461},[1009,1009],{"left":2462,"slice":2463},{"name":877,"cls":829},{"name":2464,"cls":829},"usb.core.Endpoint",{"type":764,"name":2409,"path":2383,"parent":758,"lines":2466,"value":882,"annotation":2467},[1311,1311],{"left":2468,"slice":2469},{"name":877,"cls":829},{"name":2464,"cls":829},{"type":764,"name":2410,"path":2383,"parent":758,"lines":2471,"value":886},[2107,2107],{"type":819,"name":2413,"path":2383,"parent":758,"lines":2473,"parameters":2474},[1059,2295],[2475],{"name":872,"kind":826,"required":830},{"type":819,"name":2414,"path":2383,"parent":758,"lines":2477,"parameters":2478},[2301,2157],[2479],{"name":872,"kind":826,"required":830},{"type":819,"name":2415,"path":2383,"parent":758,"lines":2481,"parameters":2483},[2482,2167],107,[2484],{"name":872,"kind":826,"required":830},{"type":819,"name":2416,"path":2383,"parent":758,"lines":2486,"parameters":2488},[2487,2312],119,[2489],{"name":872,"kind":826,"required":830},{"type":819,"name":2417,"path":2383,"parent":758,"lines":2491,"parameters":2492},[2321,1954],[2493],{"name":872,"kind":826,"required":830},{"type":819,"name":2418,"path":2383,"parent":758,"description":2495,"lines":2496,"parameters":2499},"Read data from the transport.",[2497,2498],133,156,[2500],{"name":872,"kind":826,"required":830},{"type":819,"name":2419,"path":2383,"parent":758,"lines":2502,"parameters":2504},[1422,2503],193,[2505],{"name":872,"kind":826,"required":830},{"type":819,"name":2420,"path":2383,"parent":758,"lines":2507,"parameters":2510},[2508,2509],201,205,[2511],{"name":872,"kind":826,"required":830},{"type":819,"name":2421,"path":2383,"parent":758,"lines":2513,"parameters":2515},[2514,2397],207,[2516,2517],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"required":830},{"type":738,"name":1981,"path":2519,"parent":746,"description":2520,"classes":2521},"unitelabs\u002Fbus\u002Ftransports\u002Fwrite_transport.py","Modified from https:\u002F\u002Fgithub.com\u002Fpyserial\u002Fpyserial-asyncio\u002Fblob\u002Fmaster\u002Fserial_asyncio\u002F__init__.py",[1005],{"type":842,"name":1005,"path":2519,"parent":1981,"description":2523,"lines":2524,"bases":2526,"attributes":2532,"functions":2533,"mro":2541},"Interface for write-only transports.",[1551,2525],308,[2527,2529],{"annotation":2528},{"name":1006,"cls":829},{"annotation":2530},{"name":2531,"cls":829},"asyncio.WriteTransport",[960,961,962,963,964,965,966],[2534,2535,2536,987,988,989,2103,990,991,992,993,2537,2538,2539,994,2540,995,996,997,998,999,1000,2231,2232,1001,1002],"unitelabs.bus.transports.write_transport.WriteTransport.__init__","unitelabs.bus.transports.write_transport.WriteTransport.open","unitelabs.bus.transports.write_transport.WriteTransport.close","unitelabs.bus.transports.write_transport.WriteTransport._ensure_writer","unitelabs.bus.transports.write_transport.WriteTransport._remove_writer","unitelabs.bus.transports.write_transport.WriteTransport._abort","unitelabs.bus.transports.write_transport.WriteTransport._write",[1005,1006],{"type":819,"name":2534,"path":2519,"parent":1005,"lines":2543,"parameters":2544},[802,1186],[2545],{"name":872,"kind":826,"required":830},{"type":764,"name":960,"path":2519,"parent":1005,"lines":2547,"value":1029},[868,868],{"type":764,"name":961,"path":2519,"parent":1005,"lines":2549,"value":1029},[1090,1090],{"type":764,"name":962,"path":2519,"parent":1005,"lines":2551,"value":1312,"annotation":2552},[1576,1576],{"left":2553,"slice":2554},{"name":880,"cls":829},{"left":2555,"slice":2556},{"name":1475,"cls":829},{"elements":2557},[2558,2559,2561],{"name":828,"cls":829},{"name":2560,"cls":829},"bytearray",{"name":2562,"cls":829},"memoryview",{"type":819,"name":2535,"path":2519,"parent":1005,"description":2564,"lines":2565,"parameters":2566},"Opens the transport and if write buffer currently contains data, sets state to allow future write operations.",[885,1620],[2567],{"name":872,"kind":826,"required":830},{"type":819,"name":2536,"path":2519,"parent":1005,"description":2569,"lines":2570,"parameters":2571},"Closes the transport. If write buffer is empty, sets state to disallow further write operations.",[899,1046],[2572],{"name":872,"kind":826,"required":830},{"type":764,"name":963,"path":2519,"parent":1005,"description":2574,"lines":2575,"value":882,"annotation":2576},"Whether or not there is data in the write buffer waiting to be written.",[922,1009],{"name":1028,"cls":829},{"type":819,"name":987,"path":2519,"parent":1005,"description":2578,"lines":2579,"parameters":2580,"returns":2582},"Calculate the current size of the write buffer.",[1058,1124],[2581],{"name":872,"kind":826,"required":830},{"description":2583,"annotation":2584},"The number of bytes in the write buffer.",{"name":1074,"cls":829},{"type":819,"name":988,"path":2519,"parent":1005,"description":2586,"lines":2587,"parameters":2589,"returns":2591},"Get the high and low watermarks for write flow control.",[2588,1266],58,[2590],{"name":872,"kind":826,"required":830},{"description":2592,"annotation":2593},"a tuple (low, high) where low and high are positive number of bytes.",{"left":2594,"slice":2596},{"name":2595,"cls":829},"tuple",{"elements":2597},[2598,2599],{"name":1074,"cls":829},{"name":1074,"cls":829},{"type":819,"name":989,"path":2519,"parent":1005,"description":2601,"lines":2602,"parameters":2604},"Set the high- and low-water limits for write flow control.\n\nThese two values control when to call the protocol's\n`pause_writing()` and `resume_writing()` methods. If specified,\nthe low-water limit must be less than or equal to the\nhigh-water limit. Neither value can be negative.\n\nThe defaults are implementation-specific. If only the\nhigh-water limit is given, the low-water limit defaults to an\nimplementation-specific value less than or equal to the\nhigh-water limit. Setting high to zero forces low to zero as\nwell, and causes `pause_writing()` to be called whenever the\nbuffer becomes non-empty. Setting low to zero causes\n`resume_writing()` to be called only once the buffer is empty.\nUse of zero for either limit is generally sub-optimal as it\nreduces opportunities for doing I\u002FO and computation\nconcurrently.",[2603,2295],68,[2605,2606,2612],{"name":872,"kind":826,"required":830},{"name":2607,"kind":826,"annotation":2608,"required":42,"default":882,"description":2611},"high",{"left":2609,"slice":2610},{"name":877,"cls":829},{"name":1074,"cls":829},"The maximum allowed number of bytes in the write buffer.",{"name":2613,"kind":826,"annotation":2614,"required":42,"default":882,"description":2617},"low",{"left":2615,"slice":2616},{"name":877,"cls":829},{"name":1074,"cls":829},"The minimum allowed number of bytes in the write buffer.",{"type":819,"name":2103,"path":2519,"parent":1005,"description":2619,"lines":2620,"parameters":2621},"Write some data bytes to the transport.\n\nThis does not block; it buffers the data and arranges for it\nto be sent out asynchronously.",[2301,1381],[2622,2623],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2624,"required":830,"description":2631},{"left":2625,"slice":2626},{"name":1475,"cls":829},{"elements":2627},[2628,2629,2630],{"name":828,"cls":829},{"name":2560,"cls":829},{"name":2562,"cls":829},"The bytes to write to the Transport.",{"type":819,"name":990,"path":2519,"parent":1005,"description":2633,"lines":2634,"parameters":2637,"returns":2639},"Whether or not this transport has implemented `write_eof()` method.",[2635,2636],117,125,[2638],{"name":872,"kind":826,"required":830},{"description":2640,"annotation":2641},"True if this transport supports `write_eof()`, False if not.",{"name":1028,"cls":829},{"type":819,"name":991,"path":2519,"parent":1005,"description":2643,"lines":2644,"parameters":2645},"Close the write with end-of-file after flushing buffered data.\n\n(This is like typing ^D into a UNIX program reading from stdin.)\n\nData may still be received.",[2174,1825],[2646],{"name":872,"kind":826,"required":830},{"type":819,"name":992,"path":2519,"parent":1005,"description":2648,"lines":2649,"parameters":2651},"Write a list (or any iterable) of data bytes to the transport.\n\nThe default implementation concatenates the arguments and\ncalls `write()` on the result.",[2650,1867],136,[2652,2653],{"name":872,"kind":826,"required":830},{"name":2654,"kind":826,"annotation":2655,"required":830,"description":2665},"list_of_data",{"left":2656,"slice":2658},{"name":2657,"cls":829},"typing.Iterable",{"left":2659,"slice":2660},{"name":1475,"cls":829},{"elements":2661},[2662,2663,2664],{"name":828,"cls":829},{"name":2560,"cls":829},{"name":2562,"cls":829},"The list of bytes to concatenate and write to the Transport.",{"type":819,"name":993,"path":2519,"parent":1005,"description":2667,"lines":2668,"parameters":2669},"Flush the write buffer and disable further writing.",[2193,1382],[2670],{"name":872,"kind":826,"required":830},{"type":819,"name":2537,"path":2519,"parent":1005,"description":2672,"lines":2673,"parameters":2674},"Sets state to allow future write operations, if transport is still open.",[1401,2201],[2675],{"name":872,"kind":826,"required":830},{"type":819,"name":2538,"path":2519,"parent":1005,"description":2677,"lines":2678,"parameters":2680},"Sets state to disallow future write operations.",[2206,2679],172,[2681],{"name":872,"kind":826,"required":830},{"type":819,"name":2539,"path":2519,"parent":1005,"description":2683,"lines":2684,"parameters":2687},"Closes the transport immediately and sets state to disallow further\nwrite operations.",[2685,2686],174,184,[2688,2689],{"name":872,"kind":826,"required":830},{"name":2275,"kind":826,"required":42,"default":882,"description":2690},"The exception to propagate to the transport when closing.",{"type":819,"name":994,"path":2519,"parent":1005,"description":2692,"lines":2693,"parameters":2695},"Asynchronously write buffered data.\n\nThis method is called back asynchronously as a writer\nregistered with the asyncio event-loop against the\nunderlying file descriptor for the serial port.\n\nIf this method is invoked while the transport is closing,\nand the write-buffer is then emptied by this method, the protocol's\n`connection_lost()` method will be called with None as its\nargument.",[2694,1446],186,[2696],{"name":872,"kind":826,"required":830},{"type":819,"name":2540,"path":2519,"parent":1005,"description":2698,"lines":2699,"parameters":2701,"returns":2705},"Write data to the Transport.\nCalled within `_safe_write` for asynchronous writing.",[1451,2700],241,[2702,2703],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2704,"required":830,"description":2631},{"name":828,"cls":829},{"description":2706,"annotation":2707},"the number of bytes written.",{"name":1074,"cls":829},{"type":819,"name":995,"path":2519,"parent":1005,"description":2709,"lines":2710,"parameters":2713},"To be called whenever the write-buffer size increases.\n\nTests the current write-buffer size against the high water\nmark configured for this transport. If the high water mark is\nexceeded, the `Protocol` is instructed to `pause_writing()`.",[2711,2712],243,260,[2714],{"name":872,"kind":826,"required":830},{"type":819,"name":996,"path":2519,"parent":1005,"description":2716,"lines":2717,"parameters":2720},"To be called whenever the write-buffer size decreases.\n\nTests the current write-buffer size against the low water\nmark configured for this transport. If writing is currently paused and the\nwrite-buffer size is below the low water mark, the `Protocol` is\ninstructed to `resume_writing()`.",[2718,2719],262,278,[2721],{"name":872,"kind":826,"required":830},{"type":819,"name":997,"path":2519,"parent":1005,"description":2723,"lines":2724,"parameters":2726},"Set the high- and low-water limits for write flow control.\n\nBy default, the high-water limit is 4 times the high-water limit\nand if neither is specified, (16384, 65536).",[2725,2525],280,[2727,2728,2733],{"name":872,"kind":826,"required":830},{"name":2613,"kind":826,"annotation":2729,"required":42,"default":882,"description":2732},{"left":2730,"slice":2731},{"name":877,"cls":829},{"name":1074,"cls":829},"The low-water limit for write flow control.",{"name":2607,"kind":826,"annotation":2734,"required":42,"default":882,"description":2737},{"left":2735,"slice":2736},{"name":877,"cls":829},{"name":1074,"cls":829},"The high-water limit for write flow control.",{"type":738,"name":1982,"path":2739,"parent":746,"attributes":2740,"classes":2742},"unitelabs\u002Fbus\u002Ftransports\u002Fbase_transport.py",[2741],"unitelabs.bus.transports.base_transport.P_co",[1006],{"type":764,"name":2741,"path":2739,"parent":1982,"lines":2744,"value":2745},[1531,1531],"typing.TypeVar('P_co', bound=asyncio.BaseProtocol, covariant=True)",{"type":842,"name":1006,"path":2739,"parent":1982,"lines":2747,"bases":2749,"attributes":2758,"functions":2759,"mro":2764},[801,2748],137,[2750,2753],{"annotation":2751},{"name":2752,"cls":829},"asyncio.BaseTransport",{"annotation":2754},{"left":2755,"slice":2757},{"name":2756,"cls":829},"typing.Generic",{"name":2741,"cls":829},[964,965,966],[2760,998,999,1000,2761,2231,2762,2232,1001,2763,1002],"unitelabs.bus.transports.base_transport.BaseTransport.__init__","unitelabs.bus.transports.base_transport.BaseTransport.open","unitelabs.bus.transports.base_transport.BaseTransport.close","unitelabs.bus.transports.base_transport.BaseTransport._abort",[1006],{"type":819,"name":2760,"path":2739,"parent":1006,"lines":2766,"parameters":2767},[766,1220],[2768],{"name":872,"kind":826,"required":830},{"type":764,"name":964,"path":2739,"parent":1006,"lines":2770,"value":2771},[1551,1551],"asyncio.get_event_loop_policy().get_event_loop()",{"type":764,"name":965,"path":2739,"parent":1006,"lines":2773,"value":882,"annotation":2774},[845,845],{"left":2775,"slice":2776},{"name":877,"cls":829},{"name":2741,"cls":829},{"type":764,"name":966,"path":2739,"parent":1006,"lines":2778,"value":1276},[1220,1220],{"type":819,"name":998,"path":2739,"parent":1006,"description":2780,"lines":2781,"parameters":2782,"returns":2784},"Get the current `Protocol` associated with this transport.",[1857,869],[2783],{"name":872,"kind":826,"required":830},{"description":2785,"annotation":2786},"The current `Protocol` instance.",{"left":2787,"slice":2788},{"name":877,"cls":829},{"name":2741,"cls":829},{"type":819,"name":999,"path":2739,"parent":1006,"description":2790,"lines":2791,"parameters":2792,"throws":2797},"Associate a new `Protocol` with this transport.",[892,1050],[2793,2794],{"name":872,"kind":826,"required":830},{"name":1894,"kind":826,"annotation":2795,"required":830,"description":2796},{"name":2741,"cls":829},"The new `Protocol` instance.",[2798],{"description":2799,"annotation":2800},"If the protocol is not an instance of asyncio.BaseProtocol\nor None.",{"name":2801,"cls":829},"TypeError",{"type":819,"name":1000,"path":2739,"parent":1006,"description":2803,"lines":2804,"parameters":2805,"returns":2807},"Whether the transport is closing or closed.",[1913,2107],[2806],{"name":872,"kind":826,"required":830},{"description":2808,"annotation":2809},"True if the transport is closing or closed, False otherwise.",{"name":1028,"cls":829},{"type":819,"name":2761,"path":2739,"parent":1006,"description":2811,"lines":2812,"parameters":2813},"Open the transport and inform the `Protocol` whether the connection was\nestablished successfully.",[1059,1266],[2814],{"name":872,"kind":826,"required":830},{"type":819,"name":2231,"path":2739,"parent":1006,"description":2816,"lines":2817,"parameters":2818},"Underlying action performed when calling `open`.\nSubclasses override this method to specify behavior when opening the\nconnection.",[2603,2283],[2819],{"name":872,"kind":826,"required":830},{"type":819,"name":2762,"path":2739,"parent":1006,"description":2821,"lines":2822,"parameters":2823},"Close the transport and inform the protocol whether the connection was\nterminated successfully.",[846,1363],[2824],{"name":872,"kind":826,"required":830},{"type":819,"name":2232,"path":2739,"parent":1006,"description":2826,"lines":2827,"parameters":2829},"Underlying action performed when calling `close`.\nSubclasses override this method to specify behavior when closing the\nconnection.",[2828,1796],91,[2830],{"name":872,"kind":826,"required":830},{"type":819,"name":1001,"path":2739,"parent":1006,"description":2832,"lines":2833,"parameters":2835},"Close the transport immediately.",[2295,2834],103,[2836],{"name":872,"kind":826,"required":830},{"type":819,"name":2763,"path":2739,"parent":1006,"description":2838,"lines":2839,"parameters":2841},"Underlying action performed when calling `abort`.\n\nSubclasses may override this method to specify behavior when aborting the\nconnection.",[2840,2168],105,[2842,2843],{"name":872,"kind":826,"required":830},{"name":2275,"kind":826,"annotation":2844,"required":42,"default":882,"description":2847},{"left":2845,"slice":2846},{"name":877,"cls":829},{"name":1442,"cls":829},"The Exception to propagate to the protocol, if connected.",{"type":819,"name":1002,"path":2739,"parent":1006,"description":2849,"lines":2850,"parameters":2851},"Report a fatal error to the event-loop and abort the transport.",[2173,2748],[2852,2853,2856],{"name":872,"kind":826,"required":830},{"name":2275,"kind":826,"annotation":2854,"required":830,"description":2855},{"name":1442,"cls":829},"The Exception to pass on the the loop's exception handler.",{"name":2857,"kind":826,"annotation":2858,"required":830,"description":2859},"message",{"name":913,"cls":829},"Human-readable text describing the exception's execution state, cause, etc.",{"type":738,"name":747,"path":2861,"parent":739,"packages":2862,"attributes":2869,"classes":2871},"unitelabs\u002Fbus\u002Fcommands\u002F__init__.py",[2863,2864,2865,2866,2867,2868],"unitelabs.bus.commands.multiline","unitelabs.bus.commands.request","unitelabs.bus.commands.command","unitelabs.bus.commands.serial_command","unitelabs.bus.commands.byte_command","unitelabs.bus.commands.response",[2870,1209,1210],"unitelabs.bus.commands.__all__",[2872,752,753,754,2873],"unitelabs.bus.commands.byte_command.ByteCommand","unitelabs.bus.commands.serial_command.SerialCommand",{"type":738,"name":2863,"path":2875,"parent":747,"functions":2876},"unitelabs\u002Fbus\u002Fcommands\u002Fmultiline.py",[2877],"unitelabs.bus.commands.multiline.multiline",{"type":819,"name":2877,"path":2875,"parent":2863,"description":2879,"lines":2880,"parameters":2881},"This decorator can be used in combination with the `_validate_response` method of `Command`\nto handle multi-line responses in which the standard `_validate_response` method would trigger an early exit.\nIt creates a delay of `timeout` seconds to allow for more data to come in before calling the `_validate_response`\nmethod to set the `payload` of the `Response`.",[821,1630],[2882],{"name":1386,"kind":826,"annotation":2883,"required":42,"default":2884,"description":2885},{"name":1281,"cls":829},"0.01","The wait time in seconds before calling the `_validate_response` method.",{"type":764,"name":2870,"path":2861,"parent":747,"lines":2887,"value":2888},[766,868],[770,2889,2890,2891,2892,771,772,2893],"InType_co","OutType_co","SerialCommand","ByteCommand","multiline",{"type":738,"name":2864,"path":2895,"parent":747,"classes":2896},"unitelabs\u002Fbus\u002Fcommands\u002Frequest.py",[753],{"type":842,"name":753,"path":2895,"parent":2864,"description":2898,"lines":2899,"decorators":2900,"attributes":2901,"functions":2904,"mro":2907},"Protocols use `Request`s to specify data that is sent to a transport.",[821,892],[1553],[2902,2903],"unitelabs.bus.commands.request.Request.payload","unitelabs.bus.commands.request.Request.timeout",[2905,2906],"unitelabs.bus.commands.request.Request.__init__","unitelabs.bus.commands.request.Request.__post_init__",[753],{"type":764,"name":2902,"path":2895,"parent":753,"lines":2909,"value":882,"annotation":2910},[1090,1090],{"name":828,"cls":829},{"type":764,"name":2903,"path":2895,"parent":753,"lines":2912,"value":882,"annotation":2913},[1576,1576],{"left":2914,"slice":2915},{"name":877,"cls":829},{"name":1281,"cls":829},{"type":819,"name":2906,"path":2895,"parent":753,"lines":2917,"parameters":2918},[767,892],[2919],{"name":872,"kind":826,"required":830},{"type":819,"name":2905,"path":2895,"parent":753,"lines":2921,"parameters":2922},[1635,1635],[2923,2924,2927],{"name":872,"kind":826,"required":830},{"name":2925,"kind":826,"annotation":2926,"required":830},"payload",{"name":828,"cls":829},{"name":1386,"kind":826,"annotation":2928,"required":42,"default":882},{"left":2929,"slice":2930},{"name":877,"cls":829},{"name":1281,"cls":829},{"type":738,"name":2865,"path":2932,"parent":747,"attributes":2933,"classes":2934},"unitelabs\u002Fbus\u002Fcommands\u002Fcommand.py",[1209,1210],[752],{"type":764,"name":1209,"path":2932,"parent":2865,"lines":2936,"value":2937},[822,822],"typing.TypeVar('InType_co', covariant=True)",{"type":764,"name":1210,"path":2932,"parent":2865,"lines":2939,"value":2940},[1551,1551],"typing.TypeVar('OutType_co', covariant=True)",{"type":842,"name":752,"path":2932,"parent":2865,"description":2942,"lines":2943,"bases":2945,"attributes":2953,"functions":2963,"mro":2973},"Generic Command that can be used with `Protocol.execute`.\nThe first type parameter of the `Command` determines the type that the `Command` accepts on init and serialization,\nand the second type parameter determines the type returned by deserialization, e.g.\n`Command[str, typing.List[bool]]` would ingest strings and returns a list of booleans.",[802,2944],194,[2946],{"annotation":2947},{"left":2948,"slice":2949},{"name":2756,"cls":829},{"elements":2950},[2951,2952],{"name":1209,"cls":829},{"name":1210,"cls":829},[2954,2955,2956,2957,2958,2959,2960,2961,2962],"unitelabs.bus.commands.command.Command.receiver","unitelabs.bus.commands.command.Command._response","unitelabs.bus.commands.command.Command._request","unitelabs.bus.commands.command.Command.message","unitelabs.bus.commands.command.Command.timeout","unitelabs.bus.commands.command.Command._response_buffer","unitelabs.bus.commands.command.Command.is_void","unitelabs.bus.commands.command.Command.request","unitelabs.bus.commands.command.Command.response",[2964,2965,2966,2967,2968,2969,2970,2971,2972],"unitelabs.bus.commands.command.Command.__init__","unitelabs.bus.commands.command.Command.result","unitelabs.bus.commands.command.Command.serialize","unitelabs.bus.commands.command.Command.deserialize","unitelabs.bus.commands.command.Command.validate_request","unitelabs.bus.commands.command.Command._set_response","unitelabs.bus.commands.command.Command.validate_response","unitelabs.bus.commands.command.Command._validate_response","unitelabs.bus.commands.command.Command.match_response",[752],{"type":764,"name":2954,"path":2932,"parent":752,"lines":2975,"value":882,"annotation":2976},[1147,1147],{"left":2977,"slice":2978},{"name":877,"cls":829},{"name":756,"cls":829},{"type":819,"name":2964,"path":2932,"parent":752,"lines":2980,"parameters":2981},[1620,1050],[2982,2983,2986,2991],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":2984,"required":830,"description":2985},{"name":1209,"cls":829},"The contents of the message to be sent to the device, pre-serialization.",{"name":1386,"kind":826,"annotation":2987,"required":42,"default":882,"description":2990},{"left":2988,"slice":2989},{"name":877,"cls":829},{"name":1281,"cls":829},"How long is seconds to wait for a response.",{"name":2992,"kind":826,"annotation":2993,"required":42,"default":1029,"description":2996},"is_void",{"left":2994,"slice":2995},{"name":877,"cls":829},{"name":1028,"cls":829},"If true, does not return a response. Void commands ignore all response validations.",{"type":764,"name":2955,"path":2932,"parent":752,"lines":2998,"value":882,"annotation":2999},[911,911],{"left":3000,"slice":3001},{"name":877,"cls":829},{"name":754,"cls":829},{"type":764,"name":2956,"path":2932,"parent":752,"lines":3003,"value":882,"annotation":3004},[1630,1630],{"left":3005,"slice":3006},{"name":877,"cls":829},{"name":753,"cls":829},{"type":764,"name":2957,"path":2932,"parent":752,"lines":3008,"value":2857},[916,916],{"type":764,"name":2958,"path":2932,"parent":752,"lines":3010,"value":1386},[1046,1046],{"type":764,"name":2959,"path":2932,"parent":752,"lines":3012,"value":3013},[917,917],"b''",{"type":764,"name":2960,"path":2932,"parent":752,"lines":3015,"value":2992},[1050,1050],{"type":764,"name":2961,"path":2932,"parent":752,"description":3017,"lines":3018,"value":882,"annotation":3019},"The `Request` which will be used by the `Protocol` to send bytes to the device.\nCalls `validate_request` on the `command` before serializing it and creating the `Request` object.",[1054,1327],{"name":753,"cls":829},{"type":764,"name":2962,"path":2932,"parent":752,"description":3021,"lines":3022,"value":882,"annotation":3024},"The `Response` used by `Protocol.data_received` to set the `payload` of the command.\nWhen using the `Protocol.execute` method, the `Protocol` will call `validate_response`\nfrom within it's `Protocol.data_received` method and only set the result if valid.",[3023,929],62,{"name":754,"cls":829},{"type":819,"name":2965,"path":2932,"parent":752,"description":3026,"lines":3027,"parameters":3028,"returns":3030},"Deserializes the `Response.payload.result()` bytes.",[934,2289],[3029],{"name":872,"kind":826,"required":830},{"description":3031,"annotation":3032},"The deserialized `Response.payload`",{"left":3033,"slice":3034},{"name":877,"cls":829},{"name":1210,"cls":829},{"type":819,"name":2966,"path":2932,"parent":752,"description":3036,"lines":3037,"decorators":3039,"parameters":3040,"returns":3047},"Serializes the message into bytes. Should use `self.message` if `message` is None.",[1356,3038],97,[1366],[3041,3042],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":3043,"required":42,"default":882,"description":3046},{"left":3044,"slice":3045},{"name":877,"cls":829},{"name":1209,"cls":829},"A command input, or None to use `self.message`.",{"description":3048,"annotation":3049},"The serialized message to be sent to the device.",{"name":828,"cls":829},{"type":819,"name":2967,"path":2932,"parent":752,"description":3051,"lines":3052,"decorators":3054,"parameters":3055,"returns":3063},"Deserializes the `response` bytes. Should call `self.result()` if `response` is None.",[3053,1797],99,[1366],[3056,3057],{"name":872,"kind":826,"required":830},{"name":3058,"kind":826,"annotation":3059,"required":42,"default":882,"description":3062},"response",{"left":3060,"slice":3061},{"name":877,"cls":829},{"name":828,"cls":829},"bytes to be deserialized, or None to use `self.result()`.",{"description":3064,"annotation":3065},"The deserialized `response`.",{"left":3066,"slice":3067},{"name":877,"cls":829},{"name":1210,"cls":829},{"type":819,"name":2968,"path":2932,"parent":752,"description":3069,"lines":3070,"parameters":3072,"returns":3077},"Validate a serialized message.\nCalled within `Command.request` before generating a `Request` object.",[3071,2321],114,[3073,3074],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":3075,"required":830,"description":3076},{"name":828,"cls":829},"The message to set as the `Request.payload`, if valid.",{"description":3078,"annotation":3079},"Whether or not the `message` is valid.",{"name":1028,"cls":829},{"type":819,"name":2969,"path":2932,"parent":752,"description":3081,"lines":3082,"parameters":3084},"Set the result of `self.response.payload` to `self._response_buffer` and clears `self._response_buffer`.",[3083,1825],128,[3085],{"name":872,"kind":826,"required":830},{"type":819,"name":2970,"path":2932,"parent":752,"description":3087,"lines":3088,"parameters":3090},"This method is called by `Protocol.data_received` and is responsible for setting the `Response.payload`.\nIt manages the `_response_buffer` that accumulates the response bytes and calls `_validate_response`\nto determine whether the accumulated message in the `_response_buffer` is finished or 'valid'.\nIf the response is valid, it sets the `Response.payload.result`\nto the accumulated bytes from the `_response_buffer`.",[2650,3089],151,[3091,3092],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":3093,"required":830,"description":3094},{"name":828,"cls":829},"The bytes from the `Transport` to add to the response_buffer and evaluate for completeness.",{"type":819,"name":2971,"path":2932,"parent":752,"description":3096,"lines":3097,"parameters":3098,"returns":3103},"Validate the data received from the `Transport` and determine if the data is a complete response.\nSubclasses override this method to specify behavior when validating a response.",[2194,2201],[3099,3100],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":3101,"required":830,"description":3102},{"name":828,"cls":829},"The bytes to evaluate for completeness.",{"description":835,"annotation":3104},{"name":1028,"cls":829},{"type":819,"name":2972,"path":2932,"parent":752,"description":3106,"lines":3107,"parameters":3108,"returns":3113,"examples":3116},"For devices that allow parallel command processing, first check if `data` belongs\nto this command and then validate the response.",[2206,2944],[3109,3110],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":3111,"required":830,"description":3112},{"name":828,"cls":829},"The bytes to check for match during parallel processing, usually an identifier\nshared by request and response.",{"description":3114,"annotation":3115},"True if the `data` matches to this command, otherwise False.",{"name":1028,"cls":829},[3117],{"description":3118,"code":3119},"For a command which expects responses to begin with the shared identifier `command_id`",">>> class MyCommand(Command):\n>>>   command_id = \"my_identifier\"\n>>>   def match_response(self, data: bytes):\n>>>     try:\n>>>       processed_data = self.deserialize(data)\n>>>       if not processed_data.startswith(self.command_id):\n>>>         return False\n>>>     except DeserializationError:\n>>>       return False\n>>>     return super().match_response(data)",{"type":738,"name":2866,"path":3121,"parent":747,"classes":3122},"unitelabs\u002Fbus\u002Fcommands\u002Fserial_command.py",[2873],{"type":842,"name":2873,"path":3121,"parent":2866,"description":3124,"lines":3125,"bases":3126,"attributes":3134,"functions":3138,"mro":3143},"Command for use with serial communication device.",[821,1009],[3127],{"annotation":3128},{"left":3129,"slice":3130},{"name":752,"cls":829},{"elements":3131},[3132,3133],{"name":913,"cls":829},{"name":913,"cls":829},[3135,3136,3137,2954,2955,2956,2957,2958,2959,2960,2961,2962],"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator","unitelabs.bus.commands.serial_command.SerialCommand._write_terminator","unitelabs.bus.commands.serial_command.SerialCommand._encoding",[3139,3140,3141,3142,2965,2968,2969,2970,2972],"unitelabs.bus.commands.serial_command.SerialCommand.__init__","unitelabs.bus.commands.serial_command.SerialCommand.serialize","unitelabs.bus.commands.serial_command.SerialCommand.deserialize","unitelabs.bus.commands.serial_command.SerialCommand._validate_response",[2873,752],{"type":819,"name":3139,"path":3121,"parent":2873,"lines":3145,"parameters":3146},[1576,898],[3147,3148,3151,3156,3160,3165],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":3149,"required":830,"description":3150},{"name":913,"cls":829},"the string message to send to the device.",{"name":3152,"kind":826,"annotation":3153,"required":42,"default":3154,"description":3155},"read_terminator",{"name":828,"cls":829},"b'\\r\\n'","the byte-string expected at the end of messages coming from the device.",{"name":3157,"kind":826,"annotation":3158,"required":42,"default":3154,"description":3159},"write_terminator",{"name":828,"cls":829},"the byte-string to append to our string `message` which indicates to the device that\na complete message has been received.",{"name":3161,"kind":826,"annotation":3162,"required":42,"default":3163,"description":3164},"encoding",{"name":913,"cls":829},"'ascii'","The encoding used to convert between strings and bytes.",{"name":1032,"kind":1033,"required":42,"default":1034,"description":3166},"Additional `Command` kwargs.",{"type":764,"name":3135,"path":3121,"parent":2873,"lines":3168,"value":3152},[893,893],{"type":764,"name":3136,"path":3121,"parent":2873,"lines":3170,"value":3157},[1620,1620],{"type":764,"name":3137,"path":3121,"parent":2873,"lines":3172,"value":3161},[898,898],{"type":819,"name":3140,"path":3121,"parent":2873,"lines":3174,"parameters":3175,"returns":3181},[1901,1046],[3176,3177],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":3178,"required":42,"default":882},{"left":3179,"slice":3180},{"name":877,"cls":829},{"name":913,"cls":829},{"description":835,"annotation":3182},{"name":828,"cls":829},{"type":819,"name":3141,"path":3121,"parent":2873,"lines":3184,"parameters":3185,"returns":3191},[1050,1302],[3186,3187],{"name":872,"kind":826,"required":830},{"name":3058,"kind":826,"annotation":3188,"required":830},{"left":3189,"slice":3190},{"name":877,"cls":829},{"name":828,"cls":829},{"description":835,"annotation":3192},{"name":913,"cls":829},{"type":819,"name":3142,"path":3121,"parent":2873,"lines":3194,"parameters":3195,"returns":3199},[1308,1009],[3196,3197],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":3198,"required":830},{"name":828,"cls":829},{"description":835,"annotation":3200},{"name":1028,"cls":829},{"type":738,"name":2867,"path":3202,"parent":747,"classes":3203},"unitelabs\u002Fbus\u002Fcommands\u002Fbyte_command.py",[2872],{"type":842,"name":2872,"path":3202,"parent":2867,"description":3205,"lines":3206,"bases":3207,"attributes":3215,"functions":3216,"mro":3220},"The most basic form of a `Command`, which ingests and returns bytes.",[821,1090],[3208],{"annotation":3209},{"left":3210,"slice":3211},{"name":752,"cls":829},{"elements":3212},[3213,3214],{"name":828,"cls":829},{"name":828,"cls":829},[2954,2955,2956,2957,2958,2959,2960,2961,2962],[3217,3218,3219,2965,2968,2969,2970,2971,2972],"unitelabs.bus.commands.byte_command.ByteCommand.__init__","unitelabs.bus.commands.byte_command.ByteCommand.serialize","unitelabs.bus.commands.byte_command.ByteCommand.deserialize",[2872,752],{"type":819,"name":3217,"path":3202,"parent":2872,"lines":3222,"parameters":3223},[1551,845],[3224,3225,3227],{"name":872,"kind":826,"required":830},{"name":1491,"kind":826,"annotation":3226,"required":830},{"name":828,"cls":829},{"name":1386,"kind":826,"annotation":3228,"required":42,"default":882},{"left":3229,"slice":3230},{"name":877,"cls":829},{"name":1281,"cls":829},{"type":819,"name":3218,"path":3202,"parent":2872,"lines":3232,"parameters":3233,"returns":3239},[802,1857],[3234,3235],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":3236,"required":42,"default":882},{"left":3237,"slice":3238},{"name":877,"cls":829},{"name":828,"cls":829},{"description":835,"annotation":3240},{"name":828,"cls":829},{"type":819,"name":3219,"path":3202,"parent":2872,"lines":3242,"parameters":3243,"returns":3249},[868,1090],[3244,3245],{"name":872,"kind":826,"required":830},{"name":3058,"kind":826,"annotation":3246,"required":42,"default":882},{"left":3247,"slice":3248},{"name":877,"cls":829},{"name":828,"cls":829},{"description":835,"annotation":3250},{"name":828,"cls":829},{"type":738,"name":2868,"path":3252,"parent":747,"classes":3253},"unitelabs\u002Fbus\u002Fcommands\u002Fresponse.py",[754],{"type":842,"name":754,"path":3252,"parent":2868,"description":3255,"lines":3256,"decorators":3257,"attributes":3258,"functions":3260,"mro":3264},"Protocols use `Response`s to specify data that is received from a transport.",[1089,1630],[1553],[3259],"unitelabs.bus.commands.response.Response.request",[3261,3262,3263],"unitelabs.bus.commands.response.Response.__init__","unitelabs.bus.commands.response.Response.__post_init__","unitelabs.bus.commands.response.Response.__handle_done",[754],{"type":764,"name":3259,"path":3252,"parent":754,"lines":3266,"value":882,"annotation":3267},[1186,1186],{"name":753,"cls":829},{"type":819,"name":3262,"path":3252,"parent":754,"lines":3269,"parameters":3270},[885,1146],[3271],{"name":872,"kind":826,"required":830},{"type":819,"name":3263,"path":3252,"parent":754,"description":3273,"lines":3274,"parameters":3275},"The callback to be run when the payload `Future` becomes done.",[893,1630],[3276,3277],{"name":872,"kind":826,"required":830},{"name":3278,"kind":826,"annotation":3279,"required":830,"description":3283},"_payload",{"left":3280,"slice":3282},{"name":3281,"cls":829},"asyncio.Future",{"name":828,"cls":829},"The `Future` object.",{"type":819,"name":3261,"path":3252,"parent":754,"lines":3285,"parameters":3286},[1635,1635],[3287,3288],{"name":872,"kind":826,"required":830},{"name":825,"kind":826,"annotation":3289,"required":830},{"name":753,"cls":829},{"type":738,"name":748,"path":3291,"parent":739,"packages":3292,"attributes":3296,"classes":3298,"functions":3299},"unitelabs\u002Fbus\u002Ffactories\u002F__init__.py",[3293,3294,3295],"unitelabs.bus.factories.usb_factory","unitelabs.bus.factories.serial_factory","unitelabs.bus.factories.transport_factory",[3297],"unitelabs.bus.factories.__all__",[755],[761,762,3300],"unitelabs.bus.factories.usb_factory.open_usb_connection",{"type":764,"name":3297,"path":3291,"parent":748,"lines":3302,"value":3304},[3303,822],5,[775,773,774,3305],"open_usb_connection",{"type":738,"name":3293,"path":3307,"parent":748,"attributes":3308,"functions":3310},"unitelabs\u002Fbus\u002Ffactories\u002Fusb_factory.py",[3309],"unitelabs.bus.factories.transport_factory.P",[762,3300],{"type":819,"name":762,"path":3307,"parent":3293,"description":3312,"lines":3313,"parameters":3314,"returns":3328},"Create a USB connection with a device based on specified `vendor` and `product` IDs.",[766,1620],[3315,3322,3324,3326],{"name":1093,"kind":826,"annotation":3316,"required":830,"description":3321},{"left":3317,"slice":3318},{"name":1096,"cls":829},{"elements":3319},[1099,3320],{"name":3309,"cls":829},"A callable that returns an instance of the protocol to be used.",{"name":2428,"kind":826,"annotation":3323,"required":830,"description":2430},{"name":1074,"cls":829},{"name":1679,"kind":826,"annotation":3325,"required":830,"description":2433},{"name":1074,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034,"description":3327},"Additional keyword arguments to be passed to the `UsbTransport` constructor.",{"description":3329,"annotation":3330},"A tuple containing the `UsbTransport` instance and the protocol instance.",{"left":3331,"slice":3332},{"name":2595,"cls":829},{"elements":3333},[3334,3335],{"name":951,"cls":829},{"name":3309,"cls":829},{"type":819,"name":3300,"path":3307,"parent":3293,"description":3337,"lines":3338,"parameters":3339,"returns":3345},"Establish a USB connection with a device based on specified `vendor` and `product` IDs.",[1901,923],[3340,3342,3344],{"name":2428,"kind":826,"annotation":3341,"required":830,"description":2430},{"name":1074,"cls":829},{"name":1679,"kind":826,"annotation":3343,"required":830,"description":2433},{"name":1074,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034,"description":3327},{"description":3346,"annotation":3347},"A tuple containing the `asyncio.streams.StreamReader` and `asyncio.streams.StreamWriter` instances for the USB connection.",{"left":3348,"slice":3349},{"name":2595,"cls":829},{"elements":3350},[3351,3353],{"name":3352,"cls":829},"asyncio.streams.StreamReader",{"name":3354,"cls":829},"asyncio.streams.StreamWriter",{"type":738,"name":3294,"path":3356,"parent":748,"attributes":3357,"functions":3358},"unitelabs\u002Fbus\u002Ffactories\u002Fserial_factory.py",[3309],[761],{"type":819,"name":761,"path":3356,"parent":3294,"description":3360,"lines":3361,"parameters":3362,"returns":3385},"Create a serial connection with the specified port.",[801,917],[3363,3369,3372,3374,3377,3380,3383],{"name":1093,"kind":826,"annotation":3364,"required":830,"description":3321},{"left":3365,"slice":3366},{"name":1096,"cls":829},{"elements":3367},[1099,3368],{"name":3309,"cls":829},{"name":2111,"kind":826,"annotation":3370,"required":830,"description":3371},{"name":913,"cls":829},"The port of the serial device.",{"name":2115,"kind":826,"annotation":3373,"required":42,"default":2117},{"name":1074,"cls":829},{"name":2120,"kind":826,"annotation":3375,"required":42,"default":3376},{"name":1986,"cls":829},{"name":2014,"cls":829},{"name":2125,"kind":826,"annotation":3378,"required":42,"default":3379},{"name":1987,"cls":829},{"name":2036,"cls":829},{"name":2130,"kind":826,"annotation":3381,"required":42,"default":3382},{"name":1988,"cls":829},{"name":2065,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034,"description":3384},"Additional keyword arguments to be passed to the `SerialTransport` constructor.",{"description":3386,"annotation":3387},"A tuple containing the `SerialTransport` instance and the `Protocol` instance.",{"left":3388,"slice":3389},{"name":2595,"cls":829},{"elements":3390},[3391,3392],{"name":951,"cls":829},{"name":3309,"cls":829},{"type":738,"name":3295,"path":3394,"parent":748,"attributes":3395,"classes":3396},"unitelabs\u002Fbus\u002Ffactories\u002Ftransport_factory.py",[3309],[755],{"type":764,"name":3309,"path":3394,"parent":3295,"lines":3398,"value":3399},[821,821],"typing.TypeVar('P', bound=asyncio.Protocol)",{"type":842,"name":755,"path":3394,"parent":3295,"description":3401,"lines":3402,"bases":3403,"functions":3407,"mro":3409},"Interface representing a factory for creating transports.",[1089,767],[3404],{"annotation":3405},{"name":3406,"cls":829},"typing.Protocol",[3408],"unitelabs.bus.factories.transport_factory.TransportFactory.__call__",[755],{"type":819,"name":3408,"path":3394,"parent":755,"lines":3411,"parameters":3412,"returns":3421},[767,767],[3413,3414,3420],{"name":872,"kind":826,"required":830},{"name":1093,"kind":826,"annotation":3415,"required":830},{"left":3416,"slice":3417},{"name":1096,"cls":829},{"elements":3418},[1099,3419],{"name":3309,"cls":829},{"name":1032,"kind":1033,"required":42,"default":1034},{"description":835,"annotation":3422},{"left":3423,"slice":3424},{"name":2595,"cls":829},{"elements":3425},[3426,3427],{"name":951,"cls":829},{"name":3309,"cls":829},[3429,3432,3436,3440],{"dist_name":3430,"name":3430,"version":3431},"python","\u003C4.0,>=3.9",{"dist_name":3433,"name":3434,"version":3435},"pyserial","serial","3.5",{"dist_name":3437,"name":3438,"version":3439},"pyusb","usb","1.2.1",{"dist_name":3441,"name":3441,"version":3442},"wrapt","1.16.0","0.1.6",1781787401309]