[{"data":1,"prerenderedAt":3444},["ShallowReactive",2],{"navigation":3,"reference-meta:python-bus\u002F0.1.7":733,"reference-data:python-bus\u002F0.1.7":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":1037,"unitelabs.bus.testing.mock_transport.MockTransport.device":1041,"unitelabs.bus.testing.mock_transport.MockTransport.autorespond":1044,"unitelabs.bus.testing.mock_transport.MockTransport.queue":1047,"unitelabs.bus.testing.mock_transport.MockTransport.mock":1050,"unitelabs.bus.testing.mock_transport.MockTransport.kwargs":1053,"unitelabs.bus.testing.mock_transport.MockTransport.write":1057,"unitelabs.bus.testing.mock_transport.MockTransport._write":1065,"unitelabs.bus.testing.mock_transport.MockTransport._read":1076,"unitelabs.bus.testing.mock_factory":1085,"unitelabs.bus.testing.mock_factory.create_mock_connection":1089,"unitelabs.bus.testing.device_mock":1119,"unitelabs.bus.testing.device_mock.DeviceMock":1123,"unitelabs.bus.testing.device_mock.DeviceMock.__init__":1134,"unitelabs.bus.testing.device_mock.DeviceMock.stubs":1145,"unitelabs.bus.testing.device_mock.DeviceMock.logger":1151,"unitelabs.bus.testing.device_mock.DeviceMock.get_response":1156,"unitelabs.bus.testing.fixtures":1170,"unitelabs.bus.testing.fixtures.mock_factory":1175,"unitelabs.bus.testing.fixtures.serial_device":1186,"unitelabs.bus.protocols":1197,"unitelabs.bus.protocols.__all__":1204,"unitelabs.bus.protocols.protocol":1207,"unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY":1216,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS":1220,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS":1224,"unitelabs.bus.protocols.protocol.Protocol":1227,"unitelabs.bus.protocols.protocol.Protocol.__init__":1266,"unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing":1302,"unitelabs.bus.protocols.protocol.Protocol._transport_factory":1305,"unitelabs.bus.protocols.protocol.Protocol._transport_kwargs":1308,"unitelabs.bus.protocols.protocol.Protocol._commands":1311,"unitelabs.bus.protocols.protocol.Protocol.max_parallel_commands":1318,"unitelabs.bus.protocols.protocol.Protocol.is_open":1320,"unitelabs.bus.protocols.protocol.Protocol.autodetect":1323,"unitelabs.bus.protocols.protocol.Protocol._autodetector":1326,"unitelabs.bus.protocols.protocol.Protocol._validation_kwargs":1328,"unitelabs.bus.protocols.protocol.Protocol.is_validated":1331,"unitelabs.bus.protocols.protocol.Protocol.reconnect":1334,"unitelabs.bus.protocols.protocol.Protocol.reconnect_delay":1337,"unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts":1340,"unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts":1343,"unitelabs.bus.protocols.protocol.Protocol.logger":1345,"unitelabs.bus.protocols.protocol.Protocol.autodetector":1350,"unitelabs.bus.protocols.protocol.Protocol._connect_transport":1355,"unitelabs.bus.protocols.protocol.Protocol.identity":1363,"unitelabs.bus.protocols.protocol.Protocol.validate":1381,"unitelabs.bus.protocols.protocol.Protocol.open":1401,"unitelabs.bus.protocols.protocol.Protocol.close":1415,"unitelabs.bus.protocols.protocol.Protocol.connection_made":1422,"unitelabs.bus.protocols.protocol.Protocol.connection_lost":1433,"unitelabs.bus.protocols.protocol.Protocol.pause_writing":1446,"unitelabs.bus.protocols.protocol.Protocol.resume_writing":1452,"unitelabs.bus.protocols.protocol.Protocol.data_received":1458,"unitelabs.bus.protocols.protocol.Protocol.error_received":1468,"unitelabs.bus.protocols.protocol.Protocol.execute":1487,"unitelabs.bus.utils":1523,"unitelabs.bus.utils.__all__":1532,"unitelabs.bus.utils.device_manager":1538,"unitelabs.bus.utils.device_manager.NoSuchDeviceFound":1545,"unitelabs.bus.utils.device_manager.DeviceInfo":1551,"unitelabs.bus.utils.device_manager.DeviceInfo.device":1573,"unitelabs.bus.utils.device_manager.DeviceInfo.name":1576,"unitelabs.bus.utils.device_manager.DeviceInfo.description":1580,"unitelabs.bus.utils.device_manager.DeviceInfo.hwid":1585,"unitelabs.bus.utils.device_manager.DeviceInfo.vid":1590,"unitelabs.bus.utils.device_manager.DeviceInfo.pid":1595,"unitelabs.bus.utils.device_manager.DeviceInfo.serial_number":1600,"unitelabs.bus.utils.device_manager.DeviceInfo.location":1606,"unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer":1611,"unitelabs.bus.utils.device_manager.DeviceInfo.product":1616,"unitelabs.bus.utils.device_manager.DeviceInfo.interface":1622,"unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__":1627,"unitelabs.bus.utils.device_manager.DeviceInfo.__repr__":1631,"unitelabs.bus.utils.device_manager.DeviceInfo.__init__":1635,"unitelabs.bus.utils.device_manager.DeviceManager":1690,"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs":1700,"unitelabs.bus.utils.device_manager.DeviceManager.get_all":1722,"unitelabs.bus.utils.device_manager.DeviceManager.check_device_match":1731,"unitelabs.bus.utils.device_manager.DeviceManager.filter":1744,"unitelabs.bus.utils.device_manager.SerialDeviceManager":1754,"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS":1769,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs":1773,"unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all":1796,"unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match":1809,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter":1825,"unitelabs.bus.utils.device_manager.devices":1839,"unitelabs.bus.utils.autodetect":1843,"unitelabs.bus.utils.autodetect.TransportType":1847,"unitelabs.bus.utils.autodetect.TransportType.serial":1858,"unitelabs.bus.utils.autodetect.TransportType.usb":1862,"unitelabs.bus.utils.autodetect.TransportType.unknown":1864,"unitelabs.bus.utils.autodetect.AutoDetector":1866,"unitelabs.bus.utils.autodetect.AutoDetector._transport_type":1888,"unitelabs.bus.utils.autodetect.AutoDetector.__init__":1891,"unitelabs.bus.utils.autodetect.AutoDetector.protocol":1901,"unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs":1903,"unitelabs.bus.utils.autodetect.AutoDetector._device_manager":1905,"unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs":1907,"unitelabs.bus.utils.autodetect.AutoDetector._is_resolving":1909,"unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type":1911,"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":2070,"unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE":2072,"unitelabs.bus.transports.serial_transport.StopBits.TWO":2075,"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME":2078,"unitelabs.bus.transports.serial_transport.SerialTransport":2081,"unitelabs.bus.transports.serial_transport.SerialTransport.__init__":2106,"unitelabs.bus.transports.serial_transport.SerialTransport._serial":2135,"unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size":2138,"unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer":2141,"unitelabs.bus.transports.serial_transport.SerialTransport._open":2143,"unitelabs.bus.transports.serial_transport.SerialTransport._close":2148,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader":2155,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_read":2161,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader":2166,"unitelabs.bus.transports.serial_transport.SerialTransport._read":2172,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer":2182,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_write":2192,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer":2198,"unitelabs.bus.transports.serial_transport.SerialTransport._write":2205,"unitelabs.bus.transports.read_transport":2214,"unitelabs.bus.transports.read_transport.ReadTransport":2217,"unitelabs.bus.transports.read_transport.ReadTransport.__init__":2235,"unitelabs.bus.transports.read_transport.ReadTransport._has_reader":2239,"unitelabs.bus.transports.read_transport.ReadTransport.open":2241,"unitelabs.bus.transports.read_transport.ReadTransport.close":2246,"unitelabs.bus.transports.read_transport.ReadTransport.is_reading":2251,"unitelabs.bus.transports.read_transport.ReadTransport.pause_reading":2259,"unitelabs.bus.transports.read_transport.ReadTransport.resume_reading":2265,"unitelabs.bus.transports.read_transport.ReadTransport._abort":2270,"unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader":2282,"unitelabs.bus.transports.read_transport.ReadTransport._remove_reader":2287,"unitelabs.bus.transports.read_transport.ReadTransport._safe_read":2293,"unitelabs.bus.transports.read_transport.ReadTransport._read":2299,"unitelabs.bus.transports.read_transport.ReadTransport.read_all":2310,"unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer":2319,"unitelabs.bus.transports.transport":2325,"unitelabs.bus.transports.transport.Transport":2328,"unitelabs.bus.transports.transport.Transport._open":2343,"unitelabs.bus.transports.transport.Transport._close":2347,"unitelabs.bus.transports.transport.Transport._ensure_reader":2351,"unitelabs.bus.transports.transport.Transport._remove_reader":2355,"unitelabs.bus.transports.transport.Transport._read":2359,"unitelabs.bus.transports.transport.Transport._ensure_writer":2367,"unitelabs.bus.transports.transport.Transport._remove_writer":2371,"unitelabs.bus.transports.transport.Transport._write":2375,"unitelabs.bus.transports.usb_transport":2383,"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME":2389,"unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE":2392,"unitelabs.bus.transports.usb_transport.UsbTransport":2395,"unitelabs.bus.transports.usb_transport.UsbTransport.__init__":2424,"unitelabs.bus.transports.usb_transport.UsbTransport.vendor":2444,"unitelabs.bus.transports.usb_transport.UsbTransport.product":2446,"unitelabs.bus.transports.usb_transport.UsbTransport._closing":2448,"unitelabs.bus.transports.usb_transport.UsbTransport._protocol":2450,"unitelabs.bus.transports.usb_transport.UsbTransport._interface_index":2452,"unitelabs.bus.transports.usb_transport.UsbTransport._device":2454,"unitelabs.bus.transports.usb_transport.UsbTransport.read_endpoint":2460,"unitelabs.bus.transports.usb_transport.UsbTransport.write_endpoint":2466,"unitelabs.bus.transports.usb_transport.UsbTransport._reader_event":2471,"unitelabs.bus.transports.usb_transport.UsbTransport._open":2473,"unitelabs.bus.transports.usb_transport.UsbTransport._close":2477,"unitelabs.bus.transports.usb_transport.UsbTransport._ensure_reader":2481,"unitelabs.bus.transports.usb_transport.UsbTransport._remove_reader":2486,"unitelabs.bus.transports.usb_transport.UsbTransport.__read":2491,"unitelabs.bus.transports.usb_transport.UsbTransport._read":2495,"unitelabs.bus.transports.usb_transport.UsbTransport._ensure_writer":2502,"unitelabs.bus.transports.usb_transport.UsbTransport._remove_writer":2507,"unitelabs.bus.transports.usb_transport.UsbTransport._write":2513,"unitelabs.bus.transports.write_transport":2519,"unitelabs.bus.transports.write_transport.WriteTransport":2523,"unitelabs.bus.transports.write_transport.WriteTransport.__init__":2543,"unitelabs.bus.transports.write_transport.WriteTransport._has_writer":2547,"unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused":2549,"unitelabs.bus.transports.write_transport.WriteTransport._write_buffer":2551,"unitelabs.bus.transports.write_transport.WriteTransport.open":2564,"unitelabs.bus.transports.write_transport.WriteTransport.close":2569,"unitelabs.bus.transports.write_transport.WriteTransport.writes_pending":2574,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size":2578,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits":2586,"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],11,76,[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],16,24,[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],23,"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],26,29,[895],{"name":872,"kind":826,"required":830},{"type":819,"name":859,"path":838,"parent":795,"lines":897,"parameters":900},[898,899],31,32,[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],35,36,{"name":913,"cls":829},"str",{"type":819,"name":860,"path":838,"parent":795,"lines":915,"parameters":918},[916,917],38,40,[919],{"name":872,"kind":826,"required":830},{"type":819,"name":861,"path":838,"parent":795,"lines":921,"parameters":924},[922,923],42,56,[925],{"name":872,"kind":826,"required":830},{"type":819,"name":862,"path":838,"parent":795,"lines":927,"parameters":930},[928,929],58,73,[931],{"name":872,"kind":826,"required":830},{"type":819,"name":863,"path":838,"parent":795,"lines":933,"parameters":935},[934,846],75,[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":1011},[1009,1010],22,47,[1012,1013,1020,1026,1032],{"name":872,"kind":826,"required":830},{"name":874,"kind":826,"annotation":1014,"required":42,"default":882,"description":1019},{"left":1015,"slice":1016},{"name":877,"cls":829},{"left":1017,"slice":1018},{"name":880,"cls":829},{"name":790,"cls":829},"List of callable functions that return responses based matching to requests.",{"name":1021,"kind":826,"annotation":1022,"required":42,"default":882,"description":1025},"device",{"left":1023,"slice":1024},{"name":877,"cls":829},{"name":793,"cls":829},"A `DeviceMock` through which device communication will be mocked.",{"name":1027,"kind":826,"annotation":1028,"required":42,"default":1030,"description":1031},"autorespond",{"name":1029,"cls":829},"bool","False","Whether to return request bytes without checking `stubs`, i.e. loopback responses.",{"name":1033,"kind":1034,"required":42,"default":1035,"description":1036},"**kwargs","variadic keyword","{}","Any additional `Transport` init kwargs.",{"type":764,"name":953,"path":941,"parent":794,"lines":1038,"value":1040},[1039,1039],33,"stubs or []",{"type":764,"name":954,"path":941,"parent":794,"lines":1042,"value":1021},[1043,1043],34,{"type":764,"name":955,"path":941,"parent":794,"lines":1045,"value":1027},[1046,1046],37,{"type":764,"name":956,"path":941,"parent":794,"lines":1048,"value":1049},[916,916],"queue.Queue()",{"type":764,"name":957,"path":941,"parent":794,"lines":1051,"value":1052},[917,917],"unittest.mock.Mock()",{"type":764,"name":958,"path":941,"parent":794,"lines":1054,"value":1056},[1055,1055],43,"kwargs",{"type":819,"name":969,"path":941,"parent":794,"lines":1058,"parameters":1061},[1059,1060],49,52,[1062,1063],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1064,"required":830},{"name":828,"cls":829},{"type":819,"name":970,"path":941,"parent":794,"lines":1066,"parameters":1069,"returns":1073},[1067,1068],54,70,[1070,1071],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1072,"required":830},{"name":828,"cls":829},{"description":835,"annotation":1074},{"name":1075,"cls":829},"int",{"type":819,"name":971,"path":941,"parent":794,"lines":1077,"parameters":1079,"returns":1081},[1078,947],72,[1080],{"name":872,"kind":826,"required":830},{"description":835,"annotation":1082},{"left":1083,"slice":1084},{"name":877,"cls":829},{"name":828,"cls":829},{"type":738,"name":786,"path":1086,"parent":743,"attributes":1087,"functions":1088},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_factory.py",[790],[798],{"type":819,"name":798,"path":1086,"parent":786,"lines":1090,"parameters":1093,"returns":1111},[1091,1092],9,18,[1094,1104,1110],{"name":1095,"kind":826,"annotation":1096,"required":830},"protocol_factory",{"left":1097,"slice":1099},{"name":1098,"cls":829},"typing.Callable",{"elements":1100},[1101,1102],"...",{"name":1103,"cls":829},"asyncio.Protocol",{"name":874,"kind":826,"annotation":1105,"required":42,"default":882},{"left":1106,"slice":1107},{"name":877,"cls":829},{"left":1108,"slice":1109},{"name":880,"cls":829},{"name":790,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035},{"description":835,"annotation":1112},{"left":1113,"slice":1115},{"name":1114,"cls":829},"typing.Tuple",{"elements":1116},[1117,1118],{"name":951,"cls":829},{"name":1103,"cls":829},{"type":738,"name":787,"path":1120,"parent":743,"attributes":1121,"classes":1122},"unitelabs\u002Fbus\u002Ftesting\u002Fdevice_mock.py",[790],[793],{"type":842,"name":793,"path":1120,"parent":787,"description":1124,"lines":1125,"bases":1126,"attributes":1130,"functions":1131,"mro":1133},"Abstract base class to mock devices (hardware or software components) for\ntesting purposes.",[1091,923],[1127],{"annotation":1128},{"name":1129,"cls":829},"contextlib.AbstractContextManager",[854,855],[1132,864],"unitelabs.bus.testing.device_mock.DeviceMock.__init__",[793],{"type":819,"name":1132,"path":1120,"parent":793,"lines":1135,"parameters":1136},[1009,885],[1137,1138],{"name":872,"kind":826,"required":830},{"name":874,"kind":826,"annotation":1139,"required":42,"default":882,"description":1144},{"left":1140,"slice":1141},{"name":877,"cls":829},{"left":1142,"slice":1143},{"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":1120,"parent":793,"lines":1146,"value":882,"annotation":1148},[892,1147],27,{"left":1149,"slice":1150},{"name":880,"cls":829},{"name":790,"cls":829},{"type":764,"name":855,"path":1120,"parent":793,"description":1152,"lines":1153,"value":882,"annotation":1154},"A standard python logger available to debug device mocks.",[1043,1046],{"name":1155,"cls":829},"logging.Logger",{"type":819,"name":864,"path":1120,"parent":793,"description":1157,"lines":1158,"parameters":1160,"returns":1165},"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.",[1159,923],39,[1161,1162],{"name":872,"kind":826,"required":830},{"name":825,"kind":826,"annotation":1163,"required":830,"description":1164},{"name":828,"cls":829},"The request sent to the hardware.",{"description":1166,"annotation":1167},"The response corresponding to the received request.",{"left":1168,"slice":1169},{"name":877,"cls":829},{"name":828,"cls":829},{"type":738,"name":788,"path":1171,"parent":743,"functions":1172},"unitelabs\u002Fbus\u002Ftesting\u002Ffixtures.py",[798,1173,1174],"unitelabs.bus.testing.fixtures.mock_factory","unitelabs.bus.testing.fixtures.serial_device",{"type":819,"name":1173,"path":1171,"parent":788,"description":1176,"lines":1177,"decorators":1179,"parameters":1181,"returns":1184},"Returns `create_mock_connection` function that uses `pytest-asyncio` event-loop fixture\nto ensure no global loop exists.",[822,1178],17,[1180],"pytest.fixture",[1182],{"name":1183,"kind":826,"required":830},"event_loop",{"description":835,"annotation":1185},{"name":755,"cls":829},{"type":819,"name":1174,"path":1171,"parent":788,"lines":1187,"decorators":1189,"returns":1190},[1188,869],20,[1180],{"description":835,"annotation":1191},{"left":1192,"slice":1194},{"name":1193,"cls":829},"typing.AsyncGenerator",{"elements":1195},[1196,882],{"name":795,"cls":829},{"type":738,"name":744,"path":1198,"parent":739,"packages":1199,"attributes":1201,"classes":1203},"unitelabs\u002Fbus\u002Fprotocols\u002F__init__.py",[1200],"unitelabs.bus.protocols.protocol",[1202],"unitelabs.bus.protocols.__all__",[756],{"type":764,"name":1202,"path":1198,"parent":744,"lines":1205,"value":1206},[816,816],[769],{"type":738,"name":1200,"path":1208,"parent":744,"attributes":1209,"classes":1215},"unitelabs\u002Fbus\u002Fprotocols\u002Fprotocol.py",[1210,1211,1212,1213,1214],"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":1212,"path":1208,"parent":1200,"lines":1217,"value":1219},[1218,1218],12,"20.0",{"type":764,"name":1213,"path":1208,"parent":1200,"lines":1221,"value":1223},[1222,1222],13,"3",{"type":764,"name":1214,"path":1208,"parent":1200,"lines":1225,"value":1226},[802,802],"1",{"type":842,"name":756,"path":1208,"parent":1200,"description":1228,"lines":1229,"bases":1231,"attributes":1234,"functions":1251,"mro":1265},"Base communication Protocol.",[1178,1230],312,[1232],{"annotation":1233},{"name":1103,"cls":829},[1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250],"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",[1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264],"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":1252,"path":1208,"parent":756,"lines":1267,"parameters":1269},[1043,1268],66,[1270,1271,1275,1280,1286,1291,1295,1300],{"name":872,"kind":826,"required":830},{"name":1272,"kind":826,"annotation":1273,"required":830,"description":1274},"transport_factory",{"name":755,"cls":829},"A callable used to create a connection to a transport.",{"name":1276,"kind":826,"annotation":1277,"required":42,"default":1278,"description":1279},"reconnect",{"name":1029,"cls":829},"True","Whether or not to a attempt to reconnect to a device when the connection is lost.",{"name":1281,"kind":826,"annotation":1282,"required":42,"default":1284,"description":1285},"reconnect_delay",{"name":1283,"cls":829},"float",{"name":1212,"cls":829},"How long in seconds to wait between reconnection attempts.",{"name":1287,"kind":826,"annotation":1288,"required":42,"default":1289,"description":1290},"max_reconnect_attempts",{"name":1075,"cls":829},{"name":1213,"cls":829},"How many times to attempt to reconnect to a device before\nconnection is considered lost.",{"name":1292,"kind":826,"annotation":1293,"required":42,"default":1030,"description":1294},"autodetect",{"name":1029,"cls":829},"Whether or not to use autodetection for device connectivity.",{"name":1296,"kind":826,"annotation":1297,"required":42,"default":1298,"description":1299},"max_parallel_commands",{"name":1075,"cls":829},{"name":1214,"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":1033,"kind":1034,"required":42,"default":1035,"description":1301},"additional kwargs, including kwargs for use with `TransportFactory`.",{"type":764,"name":1235,"path":1208,"parent":756,"lines":1303,"value":1278},[1304,1304],44,{"type":764,"name":1236,"path":1208,"parent":756,"lines":1306,"value":1272},[1307,1307],45,{"type":764,"name":1237,"path":1208,"parent":756,"lines":1309,"value":1056},[1310,1310],46,{"type":764,"name":1238,"path":1208,"parent":756,"lines":1312,"value":1314,"annotation":1315},[1313,1313],48,"[]",{"left":1316,"slice":1317},{"name":880,"cls":829},{"name":752,"cls":829},{"type":764,"name":1239,"path":1208,"parent":756,"lines":1319,"value":1296},[1059,1059],{"type":764,"name":1240,"path":1208,"parent":756,"lines":1321,"value":1322},[1060,1060],"asyncio.Event()",{"type":764,"name":1241,"path":1208,"parent":756,"lines":1324,"value":1292},[1325,1325],55,{"type":764,"name":1242,"path":1208,"parent":756,"lines":1327,"value":882},[923,923],{"type":764,"name":1243,"path":1208,"parent":756,"lines":1329,"value":882},[1330,1330],59,{"type":764,"name":1244,"path":1208,"parent":756,"lines":1332,"value":1322},[1333,1333],60,{"type":764,"name":1245,"path":1208,"parent":756,"lines":1335,"value":1276},[1336,1336],63,{"type":764,"name":1246,"path":1208,"parent":756,"lines":1338,"value":1281},[1339,1339],64,{"type":764,"name":1247,"path":1208,"parent":756,"lines":1341,"value":1287},[1342,1342],65,{"type":764,"name":1248,"path":1208,"parent":756,"lines":1344,"value":1287},[1268,1268],{"type":764,"name":1249,"path":1208,"parent":756,"description":1346,"lines":1347,"value":882,"annotation":1349},"A standard python logger.",[1348,1078],69,{"name":1155,"cls":829},{"type":764,"name":1250,"path":1208,"parent":756,"lines":1351,"value":882,"annotation":1353},[934,1352],79,{"name":1354,"cls":829},"unitelabs.bus.utils.autodetect.AutoDetector",{"type":819,"name":1253,"path":1208,"parent":756,"description":1356,"lines":1357,"parameters":1360},"Create a new transport instance.",[1358,1359],81,87,[1361,1362],{"name":872,"kind":826,"required":830},{"name":1033,"kind":1034,"required":42,"default":1035},{"type":819,"name":1254,"path":1208,"parent":756,"description":1364,"lines":1365,"decorators":1368,"parameters":1370,"returns":1375,"examples":1378},"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`.",[1366,1367],89,113,[1369],"abc.abstractmethod",[1371,1372],{"name":872,"kind":826,"required":830},{"name":1373,"kind":1034,"required":42,"default":1035,"description":1374},"**config_kwargs","kwargs sent from `validate`",{"description":1376,"annotation":1377},"True if the result of the inner call matches the expectation from `config_kwargs` else False.",{"name":1029,"cls":829},[1379],{"description":734,"code":1380},">>> 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":1255,"path":1208,"parent":756,"description":1382,"lines":1383,"parameters":1386,"returns":1395,"examples":1398},"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.",[1384,1385],115,157,[1387,1388,1392],{"name":872,"kind":826,"required":830},{"name":1389,"kind":826,"annotation":1390,"required":830,"description":1391},"timeout",{"name":1283,"cls":829},"How long in seconds to wait for a response from the device.",{"name":1393,"kind":1034,"required":42,"default":1035,"description":1394},"**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":1396,"annotation":1397},"Propagated return value from `identity`; True if `identity` returns True else False",{"name":1029,"cls":829},[1399],{"description":734,"code":1400},">>> 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":1256,"path":1208,"parent":756,"description":1402,"lines":1403,"parameters":1406},"Open underlying `Transport`, establish a connection to a device and validate the device's identity.",[1404,1405],159,178,[1407,1408,1413],{"name":872,"kind":826,"required":830},{"name":1409,"kind":826,"annotation":1410,"required":42,"default":1411,"description":1412},"validation_timeout",{"name":1283,"cls":829},"1.0","How long in seconds to wait for a response to `Protocol.validate`.",{"name":1393,"kind":1034,"required":42,"default":1035,"description":1414},"kwargs to be passed to `Protocol.validate` to test device identity against.",{"type":819,"name":1257,"path":1208,"parent":756,"description":1416,"lines":1417,"parameters":1420},"Close underlying `Transport`.\nExplicitly calling `close` will NOT attempt to reconnect to the `Transport`.",[1418,1419],180,187,[1421],{"name":872,"kind":826,"required":830},{"type":819,"name":1258,"path":1208,"parent":756,"description":1423,"lines":1424,"parameters":1427},"Invoked by `transport` when connection is made. Logs the connection.",[1425,1426],189,196,[1428,1429],{"name":872,"kind":826,"required":830},{"name":1430,"kind":826,"annotation":1431,"required":830},"transport",{"name":1432,"cls":829},"asyncio.Transport",{"type":819,"name":1259,"path":1208,"parent":756,"description":1434,"lines":1435,"parameters":1438},"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",[1436,1437],198,224,[1439,1440],{"name":872,"kind":826,"required":830},{"name":1441,"kind":826,"annotation":1442,"required":42,"default":882},"exc",{"left":1443,"slice":1444},{"name":877,"cls":829},{"name":1445,"cls":829},"Exception",{"type":819,"name":1260,"path":1208,"parent":756,"lines":1447,"parameters":1450},[1448,1449],226,227,[1451],{"name":872,"kind":826,"required":830},{"type":819,"name":1261,"path":1208,"parent":756,"lines":1453,"parameters":1456},[1454,1455],229,230,[1457],{"name":872,"kind":826,"required":830},{"type":819,"name":1262,"path":1208,"parent":756,"description":1459,"lines":1460,"parameters":1463},"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.",[1461,1462],232,245,[1464,1465],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":1466,"required":830,"description":1467},{"name":828,"cls":829},"The data received.",{"type":819,"name":1263,"path":1208,"parent":756,"description":1469,"lines":1470,"parameters":1473},"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.",[1471,1472],247,259,[1474,1475],{"name":872,"kind":826,"required":830},{"name":1441,"kind":826,"annotation":1476,"required":830,"description":1486},{"left":1477,"slice":1479},{"name":1478,"cls":829},"typing.Union",{"elements":1480},[1481,1482],{"name":1445,"cls":829},{"left":1483,"slice":1485},{"name":1484,"cls":829},"type",{"name":1445,"cls":829},"The error received.",{"type":819,"name":1264,"path":1208,"parent":756,"description":1488,"lines":1489,"parameters":1491,"returns":1502,"throws":1507,"examples":1516},"Executes a `Command` by sending the `Request` within the `Command` to the `Transport`.",[1490,1230],261,[1492,1493],{"name":872,"kind":826,"required":830},{"name":1494,"kind":826,"annotation":1495,"required":830,"description":1501},"command",{"left":1496,"slice":1497},{"name":752,"cls":829},{"elements":1498},[1499,1500],{"name":1210,"cls":829},{"name":1211,"cls":829},"The `Command` to be executed.",{"description":1503,"annotation":1504},"The deserialized response, created by `command.result()` or None if `Command.is_void` is True.",{"left":1505,"slice":1506},{"name":877,"cls":829},{"name":1211,"cls":829},[1508,1512],{"description":1509,"annotation":1510},"If the transport is not open, does not currently allow writing, or\nis busy processing and cannot accept more work at the moment.",{"name":1511,"cls":829},"RuntimeError",{"description":1513,"annotation":1514},"If the response is not received within the specified timeout.",{"name":1515,"cls":829},"TimeoutError",[1517,1520],{"description":1518,"code":1519},"Use with a single command.",">>> response = await protocol.execute(ByteCommand(b\"test\"))",{"description":1521,"code":1522},"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":1524,"parent":739,"packages":1525,"attributes":1528,"classes":1530},"unitelabs\u002Fbus\u002Futils\u002F__init__.py",[1526,1527],"unitelabs.bus.utils.device_manager","unitelabs.bus.utils.autodetect",[1529],"unitelabs.bus.utils.__all__",[1354,1531,759],"unitelabs.bus.utils.device_manager.DeviceInfo",{"type":764,"name":1529,"path":1524,"parent":745,"lines":1533,"value":1535},[1534,1534],4,[1536,778,1537],"AutoDetector","DeviceInfo",{"type":738,"name":1526,"path":1539,"parent":745,"attributes":1540,"classes":1542},"unitelabs\u002Fbus\u002Futils\u002Fdevice_manager.py",[1541],"unitelabs.bus.utils.device_manager.devices",[1543,1531,1544,759],"unitelabs.bus.utils.device_manager.NoSuchDeviceFound","unitelabs.bus.utils.device_manager.DeviceManager",{"type":842,"name":1543,"path":1539,"parent":1526,"lines":1546,"bases":1547,"mro":1550},[801,766],[1548],{"annotation":1549},{"name":1445,"cls":829},[1543],{"type":842,"name":1531,"path":1539,"parent":1526,"description":1552,"lines":1553,"decorators":1554,"attributes":1556,"functions":1568,"mro":1572},"Translation of `serial.tools.list_ports.ListPortInfo` for unified interface between USB and Serial `DeviceManagers`.\nAttrs here represent valid filter criteria during device search.",[845,1046],[1555],"dataclasses.dataclass",[1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567],"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",[1569,1570,1571],"unitelabs.bus.utils.device_manager.DeviceInfo.__init__","unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__","unitelabs.bus.utils.device_manager.DeviceInfo.__repr__",[1531],{"type":764,"name":1557,"path":1539,"parent":1531,"lines":1574,"value":882,"annotation":1575},[1092,1092],{"name":913,"cls":829},{"type":764,"name":1558,"path":1539,"parent":1531,"lines":1577,"value":882,"annotation":1579},[1578,1578],19,{"name":913,"cls":829},{"type":764,"name":1559,"path":1539,"parent":1531,"lines":1581,"value":882,"annotation":1582},[1188,1188],{"left":1583,"slice":1584},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1560,"path":1539,"parent":1531,"lines":1586,"value":882,"annotation":1587},[1009,1009],{"left":1588,"slice":1589},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1561,"path":1539,"parent":1531,"lines":1591,"value":882,"annotation":1592},[885,885],{"left":1593,"slice":1594},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1562,"path":1539,"parent":1531,"lines":1596,"value":882,"annotation":1597},[869,869],{"left":1598,"slice":1599},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1563,"path":1539,"parent":1531,"lines":1601,"value":882,"annotation":1603},[1602,1602],25,{"left":1604,"slice":1605},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1564,"path":1539,"parent":1531,"lines":1607,"value":882,"annotation":1608},[892,892],{"left":1609,"slice":1610},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1565,"path":1539,"parent":1531,"lines":1612,"value":882,"annotation":1613},[1147,1147],{"left":1614,"slice":1615},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1566,"path":1539,"parent":1531,"lines":1617,"value":882,"annotation":1619},[1618,1618],28,{"left":1620,"slice":1621},{"name":877,"cls":829},{"name":913,"cls":829},{"type":764,"name":1567,"path":1539,"parent":1531,"lines":1623,"value":882,"annotation":1624},[893,893],{"left":1625,"slice":1626},{"name":877,"cls":829},{"name":913,"cls":829},{"type":819,"name":1570,"path":1539,"parent":1531,"lines":1628,"parameters":1629},[898,1043],[1630],{"name":872,"kind":826,"required":830},{"type":819,"name":1571,"path":1539,"parent":1531,"lines":1632,"parameters":1633},[911,1046],[1634],{"name":872,"kind":826,"required":830},{"type":819,"name":1569,"path":1539,"parent":1531,"lines":1636,"parameters":1638},[1637,1637],0,[1639,1640,1642,1645,1650,1655,1660,1665,1670,1675,1680,1685],{"name":872,"kind":826,"required":830},{"name":1021,"kind":826,"annotation":1641,"required":830},{"name":913,"cls":829},{"name":1643,"kind":826,"annotation":1644,"required":830},"name",{"name":913,"cls":829},{"name":1646,"kind":826,"annotation":1647,"required":42,"default":882},"description",{"left":1648,"slice":1649},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1651,"kind":826,"annotation":1652,"required":42,"default":882},"hwid",{"left":1653,"slice":1654},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1656,"kind":826,"annotation":1657,"required":42,"default":882},"vid",{"left":1658,"slice":1659},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1661,"kind":826,"annotation":1662,"required":42,"default":882},"pid",{"left":1663,"slice":1664},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1666,"kind":826,"annotation":1667,"required":42,"default":882},"serial_number",{"left":1668,"slice":1669},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1671,"kind":826,"annotation":1672,"required":42,"default":882},"location",{"left":1673,"slice":1674},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1676,"kind":826,"annotation":1677,"required":42,"default":882},"manufacturer",{"left":1678,"slice":1679},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1681,"kind":826,"annotation":1682,"required":42,"default":882},"product",{"left":1683,"slice":1684},{"name":877,"cls":829},{"name":913,"cls":829},{"name":1686,"kind":826,"annotation":1687,"required":42,"default":882},"interface",{"left":1688,"slice":1689},{"name":877,"cls":829},{"name":913,"cls":829},{"type":842,"name":1544,"path":1539,"parent":1526,"description":1691,"lines":1692,"functions":1694,"mro":1699},"Detect, filter, and get info for connected devices.",[917,1693],57,[1695,1696,1697,1698],"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",[1544],{"type":819,"name":1695,"path":1539,"parent":1544,"lines":1701,"decorators":1702,"parameters":1704,"returns":1715},[1055,1307],[1703,1369],"classmethod",[1705,1707],{"name":1706,"kind":826,"required":830},"cls",{"name":1056,"kind":826,"annotation":1708,"required":830},{"left":1709,"slice":1711},{"name":1710,"cls":829},"typing.Dict",{"elements":1712},[1713,1714],{"name":913,"cls":829},{"name":913,"cls":829},{"description":835,"annotation":1716},{"left":1717,"slice":1718},{"name":1710,"cls":829},{"elements":1719},[1720,1721],{"name":913,"cls":829},{"name":913,"cls":829},{"type":819,"name":1696,"path":1539,"parent":1544,"lines":1723,"decorators":1724,"parameters":1725,"returns":1727},[1010,1059],[1703,1369],[1726],{"name":1706,"kind":826,"required":830},{"description":835,"annotation":1728},{"left":1729,"slice":1730},{"name":880,"cls":829},{"name":1531,"cls":829},{"type":819,"name":1697,"path":1539,"parent":1544,"lines":1732,"decorators":1735,"parameters":1736,"returns":1742},[1733,1734],51,53,[1703,1369],[1737,1738,1741],{"name":1706,"kind":826,"required":830},{"name":1739,"kind":826,"annotation":1740,"required":830},"device_info",{"name":1531,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035},{"description":835,"annotation":1743},{"name":1029,"cls":829},{"type":819,"name":1698,"path":1539,"parent":1544,"lines":1745,"decorators":1746,"parameters":1747,"returns":1750},[1325,1693],[1703,1369],[1748,1749],{"name":1706,"kind":826,"required":830},{"name":1033,"kind":1034,"required":42,"default":1035},{"description":835,"annotation":1751},{"left":1752,"slice":1753},{"name":880,"cls":829},{"name":1531,"cls":829},{"type":842,"name":759,"path":1539,"parent":1526,"description":1755,"lines":1756,"bases":1758,"attributes":1761,"functions":1763,"mro":1768},"Detect, filter, and get info for connected serial devices.",[1333,1757],154,[1759],{"annotation":1760},{"name":1544,"cls":829},[1762],"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS",[1764,1765,1766,1767],"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,1544],{"type":764,"name":1762,"path":1539,"parent":759,"lines":1770,"value":1772},[1342,1771],78,"['device', 'name', 'description', 'hwid', 'vid', 'pid', 'serial_number', 'location', 'manufacturer', 'product', 'interface']",{"type":819,"name":1764,"path":1539,"parent":759,"description":1774,"lines":1775,"decorators":1777,"parameters":1778,"returns":1788},"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,1776],94,[1703],[1779,1780],{"name":1706,"kind":826,"required":830},{"name":1056,"kind":826,"annotation":1781,"required":830,"description":1787},{"left":1782,"slice":1783},{"name":1710,"cls":829},{"elements":1784},[1785,1786],{"name":913,"cls":829},{"name":913,"cls":829},"A dictionary of key-value pairs to filter.",{"description":1789,"annotation":1790},"The filtered dictionary.",{"left":1791,"slice":1792},{"name":1710,"cls":829},{"elements":1793},[1794,1795],{"name":913,"cls":829},{"name":913,"cls":829},{"type":819,"name":1765,"path":1539,"parent":759,"description":1797,"lines":1798,"decorators":1801,"parameters":1802,"returns":1804},"Get all connected devices.",[1799,1800],96,109,[1703],[1803],{"name":1706,"kind":826,"required":830},{"description":1805,"annotation":1806},"A list of all devices detected.",{"left":1807,"slice":1808},{"name":880,"cls":829},{"name":1531,"cls":829},{"type":819,"name":1766,"path":1539,"parent":759,"description":1810,"lines":1811,"decorators":1814,"parameters":1815,"returns":1822},"Determine if the `DeviceInfo` instance's attributes match the filter `**kwargs`",[1812,1813],111,132,[1703],[1816,1817,1820],{"name":1706,"kind":826,"required":830},{"name":1739,"kind":826,"annotation":1818,"required":830,"description":1819},{"name":1531,"cls":829},"The device to check for a match against.",{"name":1033,"kind":1034,"required":42,"default":1035,"description":1821},"The key-value pairs, which will be filtered, and then used to evaluate the device for a match.",{"description":1823,"annotation":1824},"True if the `DeviceInfo` matches (or no kwargs provided, or all kwargs have been filtered), else False.",{"name":1029,"cls":829},{"type":819,"name":1767,"path":1539,"parent":759,"description":1826,"lines":1827,"decorators":1829,"parameters":1830,"returns":1834},"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.",[1828,1757],134,[1703],[1831,1832],{"name":1706,"kind":826,"required":830},{"name":1033,"kind":1034,"required":42,"default":1035,"description":1833},"Search criteria for finding a device.",{"description":1835,"annotation":1836},"A list of devices which match all `**kwargs` provided.",{"left":1837,"slice":1838},{"name":880,"cls":829},{"name":1531,"cls":829},{"type":764,"name":1541,"path":1539,"parent":1526,"lines":1840,"value":1842},[1841,1841],158,"SerialDeviceManager().get_all()",{"type":738,"name":1527,"path":1844,"parent":745,"classes":1845},"unitelabs\u002Fbus\u002Futils\u002Fautodetect.py",[1846,1354],"unitelabs.bus.utils.autodetect.TransportType",{"type":842,"name":1846,"path":1844,"parent":1527,"lines":1848,"bases":1849,"attributes":1853,"mro":1857},[802,1178],[1850],{"annotation":1851},{"name":1852,"cls":829},"enum.Enum",[1854,1855,1856],"unitelabs.bus.utils.autodetect.TransportType.serial","unitelabs.bus.utils.autodetect.TransportType.usb","unitelabs.bus.utils.autodetect.TransportType.unknown",[1846],{"type":764,"name":1854,"path":1844,"parent":1846,"lines":1859,"value":1861},[1860,1860],15,"enum.auto()",{"type":764,"name":1855,"path":1844,"parent":1846,"lines":1863,"value":1861},[868,868],{"type":764,"name":1856,"path":1844,"parent":1846,"lines":1865,"value":1861},[1178,1178],{"type":842,"name":1354,"path":1844,"parent":1527,"description":1867,"lines":1868,"attributes":1870,"functions":1880,"mro":1887},"This class is used by the `unitelabs.bus.Protocol` to cycle through possible devices until the correct device is found.",[1188,1869],148,[1871,1872,1873,1874,1875,1876,1877,1878,1879],"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",[1881,1882,1883,1884,1885,1886],"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",[1354],{"type":764,"name":1871,"path":1844,"parent":1354,"lines":1889,"value":882,"annotation":1890},[893,893],{"name":1846,"cls":829},{"type":819,"name":1881,"path":1844,"parent":1354,"lines":1892,"parameters":1893},[898,917],[1894,1895,1899],{"name":872,"kind":826,"required":830},{"name":1896,"kind":826,"annotation":1897,"required":830,"description":1898},"protocol",{"name":756,"cls":829},"The `unitelabs.bus.Protocol` instance to use.",{"name":1033,"kind":1034,"required":42,"default":1035,"description":1900},"Kwargs used to initialize the `Protocol` instance, which contains `Transport` init kwargs.",{"type":764,"name":1872,"path":1844,"parent":1354,"lines":1902,"value":1896},[899,899],{"type":764,"name":1873,"path":1844,"parent":1354,"lines":1904,"value":1056},[1039,1039],{"type":764,"name":1874,"path":1844,"parent":1354,"lines":1906,"value":882},[910,910],{"type":764,"name":1875,"path":1844,"parent":1354,"lines":1908,"value":1056},[911,911],{"type":764,"name":1876,"path":1844,"parent":1354,"lines":1910,"value":1030},[916,916],{"type":819,"name":1882,"path":1844,"parent":1354,"description":1912,"lines":1913,"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`.",[922,1734],[1915],{"name":872,"kind":826,"required":830},{"type":764,"name":1877,"path":1844,"parent":1354,"lines":1917,"value":882,"annotation":1918},[923,1693],{"name":1155,"cls":829},{"type":764,"name":1878,"path":1844,"parent":1354,"lines":1920,"value":882,"annotation":1921},[1333,1336],{"left":1922,"slice":1923},{"name":1484,"cls":829},{"name":1544,"cls":829},{"type":819,"name":1883,"path":1844,"parent":1354,"description":1925,"lines":1926,"parameters":1928,"returns":1930},"Get the correct `DeviceManager` based on the `TransportType`.",[1342,1927],71,[1929],{"name":872,"kind":826,"required":830},{"description":835,"annotation":1931},{"left":1932,"slice":1933},{"name":1484,"cls":829},{"name":1544,"cls":829},{"type":764,"name":1879,"path":1844,"parent":1354,"description":1935,"lines":1936,"value":882,"annotation":1938},"Whether or not we are currently trying to connect to a device",[1937,846],74,{"name":1029,"cls":829},{"type":819,"name":1884,"path":1844,"parent":1354,"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`.",[1771,1942],108,[1944,1945,1948],{"name":872,"kind":826,"required":830},{"name":1409,"kind":826,"annotation":1946,"required":830,"description":1947},{"name":1283,"cls":829},"How long in seconds to wait for a response from `Protocol.validate`.",{"name":1393,"kind":1034,"required":42,"default":1035,"description":1949},"kwargs from `Protocol.validate` used to validate the connection.",{"type":819,"name":1885,"path":1844,"parent":1354,"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":1409,"kind":826,"annotation":1958,"required":830,"description":1947},{"name":1283,"cls":829},{"name":1021,"kind":826,"annotation":1960,"required":830,"description":1961},{"name":1531,"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":1029,"cls":829},{"type":819,"name":1886,"path":1844,"parent":1354,"description":1966,"lines":1967,"parameters":1969},"Update the `Protocol`s underlying `Transport` to connect to the given `device`.",[1968,1869],131,[1970,1971],{"name":872,"kind":826,"required":830},{"name":1021,"kind":826,"annotation":1972,"required":830,"description":1973},{"name":1531,"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,1092],[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},[1860,1578],[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},[868,868],"5",{"type":764,"name":2012,"path":2000,"parent":1986,"lines":2020,"value":2021},[1178,1178],"6",{"type":764,"name":2013,"path":2000,"parent":1986,"lines":2023,"value":2024},[1092,1092],"7",{"type":764,"name":2014,"path":2000,"parent":1986,"lines":2026,"value":2027},[1578,1578],"8",{"type":842,"name":1987,"path":2000,"parent":1977,"lines":2029,"bases":2030,"attributes":2035,"mro":2041},[1009,1147],[2031,2033],{"annotation":2032},{"name":913,"cls":829},{"annotation":2034},{"name":1852,"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},[885,885],"'N'",{"type":764,"name":2037,"path":2000,"parent":1987,"lines":2046,"value":2047},[869,869],"'O'",{"type":764,"name":2038,"path":2000,"parent":1987,"lines":2049,"value":2050},[1602,1602],"'E'",{"type":764,"name":2039,"path":2000,"parent":1987,"lines":2052,"value":2053},[892,892],"'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":2060,"attributes":2065,"mro":2069},[2059,1039],30,[2061,2063],{"annotation":2062},{"name":1283,"cls":829},{"annotation":2064},{"name":1852,"cls":829},[2066,2067,2068],"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":2066,"path":2000,"parent":1988,"lines":2071,"value":1411},[898,898],{"type":764,"name":2067,"path":2000,"parent":1988,"lines":2073,"value":2074},[899,899],"1.5",{"type":764,"name":2068,"path":2000,"parent":1988,"lines":2076,"value":2077},[1039,1039],"2.0",{"type":764,"name":2002,"path":2000,"parent":1977,"lines":2079,"value":2080},[911,911],"0.0005",{"type":842,"name":757,"path":2000,"parent":1977,"description":2082,"lines":2083,"bases":2085,"attributes":2088,"functions":2092,"mro":2105},"Transport for serial devices.",[1159,2084],168,[2086],{"annotation":2087},{"name":951,"cls":829},[2089,2090,2091,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",[2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,978,979,980,981,982,983,984,985,986,987,988,989,2104,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":2093,"path":2000,"parent":757,"lines":2107,"parameters":2109},[2108,1078],50,[2110,2111,2115,2120,2125,2130],{"name":872,"kind":826,"required":830},{"name":2112,"kind":826,"annotation":2113,"required":830,"description":2114},"port",{"name":913,"cls":829},"The port where the serial device is connected.",{"name":2116,"kind":826,"annotation":2117,"required":42,"default":2118,"description":2119},"baudrate",{"name":1075,"cls":829},"9600","The baud rate.",{"name":2121,"kind":826,"annotation":2122,"required":42,"default":2123,"description":2124},"bytesize",{"name":1986,"cls":829},{"name":2014,"cls":829},"Number of data bits.",{"name":2126,"kind":826,"annotation":2127,"required":42,"default":2128,"description":2129},"parity",{"name":1987,"cls":829},{"name":2036,"cls":829},"Parity checking method for error-detection.",{"name":2131,"kind":826,"annotation":2132,"required":42,"default":2133,"description":2134},"stopbits",{"name":1988,"cls":829},{"name":2066,"cls":829},"The number of stopbits.",{"type":764,"name":2089,"path":2000,"parent":757,"lines":2136,"value":2137},[1348,1348],"_serial",{"type":764,"name":2090,"path":2000,"parent":757,"lines":2139,"value":2140},[1068,1068],"1024",{"type":764,"name":2091,"path":2000,"parent":757,"lines":2142,"value":1314},[1078,1078],{"type":819,"name":2094,"path":2000,"parent":757,"description":2144,"lines":2145,"parameters":2146},"Opens underlying serial port, if not already open.",[1937,947],[2147],{"name":872,"kind":826,"required":830},{"type":819,"name":2095,"path":2000,"parent":757,"description":2149,"lines":2150,"parameters":2153},"Closes underlying serial port, if open.",[2151,2152],82,88,[2154],{"name":872,"kind":826,"required":830},{"type":819,"name":2096,"path":2000,"parent":757,"lines":2156,"parameters":2159},[2157,2158],93,102,[2160],{"name":872,"kind":826,"required":830},{"type":819,"name":2097,"path":2000,"parent":757,"lines":2162,"parameters":2164},[2163,1953],104,[2165],{"name":872,"kind":826,"required":830},{"type":819,"name":2098,"path":2000,"parent":757,"lines":2167,"parameters":2170},[2168,2169],112,118,[2171],{"name":872,"kind":826,"required":830},{"type":819,"name":2099,"path":2000,"parent":757,"lines":2173,"parameters":2176,"returns":2178},[2174,2175],120,127,[2177],{"name":872,"kind":826,"required":830},{"description":835,"annotation":2179},{"left":2180,"slice":2181},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":2100,"path":2000,"parent":757,"description":2183,"lines":2184,"parameters":2185,"throws":2187},"Adds a writer to the loop if not already added.",[1813,1869],[2186],{"name":872,"kind":826,"required":830},[2188],{"description":2189,"annotation":2190},"If the serial port is not open.",{"name":2191,"cls":829},"serial.PortNotOpenError",{"type":819,"name":2101,"path":2000,"parent":757,"lines":2193,"parameters":2196},[2194,2195],150,153,[2197],{"name":872,"kind":826,"required":830},{"type":819,"name":2102,"path":2000,"parent":757,"description":2199,"lines":2200,"parameters":2203},"Removes a writer from the loop.",[2201,2202],155,165,[2204],{"name":872,"kind":826,"required":830},{"type":819,"name":2103,"path":2000,"parent":757,"lines":2206,"parameters":2208,"returns":2212},[2207,2084],167,[2209,2210],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2211,"required":830},{"name":828,"cls":829},{"description":835,"annotation":2213},{"name":1075,"cls":829},{"type":738,"name":1978,"path":2215,"parent":746,"classes":2216},"unitelabs\u002Fbus\u002Ftransports\u002Fread_transport.py",[1004],{"type":842,"name":1004,"path":2215,"parent":1978,"description":2218,"lines":2219,"bases":2220,"attributes":2226,"functions":2227,"mro":2234},"Interface for read-only transports.",[766,1813],[2221,2223],{"annotation":2222},{"name":1006,"cls":829},{"annotation":2224},{"name":2225,"cls":829},"asyncio.ReadTransport",[959,964,965,966],[2228,978,979,980,981,982,983,2229,2230,984,2231,985,986,998,999,1000,2232,2233,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":2228,"path":2215,"parent":1004,"lines":2236,"parameters":2237},[845,1222],[2238],{"name":872,"kind":826,"required":830},{"type":764,"name":959,"path":2215,"parent":1004,"lines":2240,"value":1030},[1222,1222],{"type":819,"name":978,"path":2215,"parent":1004,"description":2242,"lines":2243,"parameters":2244},"Opens the transport and sets state to allow future read operations.",[1860,1009],[2245],{"name":872,"kind":826,"required":830},{"type":819,"name":979,"path":2215,"parent":1004,"description":2247,"lines":2248,"parameters":2249},"Closes the transport and sets state to disallow further read operations.",[869,2059],[2250],{"name":872,"kind":826,"required":830},{"type":819,"name":980,"path":2215,"parent":1004,"description":2252,"lines":2253,"parameters":2254,"returns":2256},"Whether or not reading operations are currently being performed.",[899,1159],[2255],{"name":872,"kind":826,"required":830},{"description":2257,"annotation":2258},"True if the transport is receiving, otherwise False.",{"name":1029,"cls":829},{"type":819,"name":981,"path":2215,"parent":1004,"description":2260,"lines":2261,"parameters":2263},"Pause the receiving end.\n\nNo data will be passed to the protocol's `data_received()`\nmethod until `resume_reading()` is called.",[2262,1059],41,[2264],{"name":872,"kind":826,"required":830},{"type":819,"name":982,"path":2215,"parent":1004,"description":2266,"lines":2267,"parameters":2268},"Resume the receiving end.\n\nData received will once again be passed to the protocol's\n`data_received()` method.",[1733,1330],[2269],{"name":872,"kind":826,"required":830},{"type":819,"name":983,"path":2215,"parent":1004,"description":2271,"lines":2272,"parameters":2274},"Closes the transport immediately and updates state to disable further\nread operations.",[2273,1927],61,[2275,2276],{"name":872,"kind":826,"required":830},{"name":2277,"kind":826,"annotation":2278,"required":42,"default":882,"description":2281},"exception",{"left":2279,"slice":2280},{"name":877,"cls":829},{"name":1445,"cls":829},"The Exception to propagate to the protocol when aborting, if connected.",{"type":819,"name":2229,"path":2215,"parent":1004,"description":2283,"lines":2284,"parameters":2285},"Set state to enable future read operations.",[929,1771],[2286],{"name":872,"kind":826,"required":830},{"type":819,"name":2230,"path":2215,"parent":1004,"description":2288,"lines":2289,"parameters":2291},"Set state to disable further read operations.",[947,2290],85,[2292],{"name":872,"kind":826,"required":830},{"type":819,"name":984,"path":2215,"parent":1004,"description":2294,"lines":2295,"parameters":2297},"Safely and asynchronously read data from the transport.",[1359,2296],98,[2298],{"name":872,"kind":826,"required":830},{"type":819,"name":2231,"path":2215,"parent":1004,"description":2300,"lines":2301,"parameters":2303,"returns":2305},"Read data from the transport.\nCalled within `_safe_read` for asynchronous reading.",[2302,1800],100,[2304],{"name":872,"kind":826,"required":830},{"description":2306,"annotation":2307},"Data read from the transport.",{"left":2308,"slice":2309},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":985,"path":2215,"parent":1004,"description":2311,"lines":2312,"parameters":2314,"returns":2316},"Read all available data from the transport. Repeatedly calls `_read` and\naggregates the results until no further data is available.",[1812,2313],124,[2315],{"name":872,"kind":826,"required":830},{"description":2317,"annotation":2318},"All available data from the transport.",{"name":828,"cls":829},{"type":819,"name":986,"path":2215,"parent":1004,"description":2320,"lines":2321,"parameters":2323},"Clears out all available read data without notifying the protocol. Calls `read_all` and throws away the result.",[2322,1813],126,[2324],{"name":872,"kind":826,"required":830},{"type":738,"name":1979,"path":2326,"parent":746,"classes":2327},"unitelabs\u002Fbus\u002Ftransports\u002Ftransport.py",[951],{"type":842,"name":951,"path":2326,"parent":1979,"description":2329,"lines":2330,"bases":2331,"attributes":2338,"functions":2339,"mro":2342},"Interface defining bidirectional communication with a device.\n\nTransports read bytes from and write bytes to a device.",[766,1046],[2332,2334,2336],{"annotation":2333},{"name":1432,"cls":829},{"annotation":2335},{"name":1004,"cls":829},{"annotation":2337},{"name":1005,"cls":829},[959,960,961,962,963,964,965,966],[972,973,974,975,2340,976,977,2341,2228,978,979,980,981,982,983,984,985,986,987,988,989,2104,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":2326,"parent":951,"lines":2344,"parameters":2345},[1860,868],[2346],{"name":872,"kind":826,"required":830},{"type":819,"name":973,"path":2326,"parent":951,"lines":2348,"parameters":2349},[1092,1578],[2350],{"name":872,"kind":826,"required":830},{"type":819,"name":974,"path":2326,"parent":951,"lines":2352,"parameters":2353},[767,1009],[2354],{"name":872,"kind":826,"required":830},{"type":819,"name":975,"path":2326,"parent":951,"lines":2356,"parameters":2357},[869,1602],[2358],{"name":872,"kind":826,"required":830},{"type":819,"name":2340,"path":2326,"parent":951,"lines":2360,"parameters":2361,"returns":2363},[1147,1618],[2362],{"name":872,"kind":826,"required":830},{"description":835,"annotation":2364},{"left":2365,"slice":2366},{"name":877,"cls":829},{"name":828,"cls":829},{"type":819,"name":976,"path":2326,"parent":951,"lines":2368,"parameters":2369},[2059,898],[2370],{"name":872,"kind":826,"required":830},{"type":819,"name":977,"path":2326,"parent":951,"lines":2372,"parameters":2373},[1039,1043],[2374],{"name":872,"kind":826,"required":830},{"type":819,"name":2341,"path":2326,"parent":951,"lines":2376,"parameters":2377,"returns":2381},[911,1046],[2378,2379],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2380,"required":830},{"name":828,"cls":829},{"description":835,"annotation":2382},{"name":1075,"cls":829},{"type":738,"name":1980,"path":2384,"parent":746,"attributes":2385,"classes":2388},"unitelabs\u002Fbus\u002Ftransports\u002Fusb_transport.py",[2386,2387],"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME","unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE",[758],{"type":764,"name":2386,"path":2384,"parent":1980,"lines":2390,"value":2391},[1860,1860],"0.1",{"type":764,"name":2387,"path":2384,"parent":1980,"lines":2393,"value":2394},[868,868],"0",{"type":842,"name":758,"path":2384,"parent":1980,"description":2396,"lines":2397,"bases":2399,"attributes":2402,"functions":2412,"mro":2423},"Transport for devices connected via USB.\n\nBy default, this implementation uses Interface 0 of Configuration 1 on the device.",[1578,2398],215,[2400],{"annotation":2401},{"name":951,"cls":829},[2403,2404,2405,2406,2407,2408,2409,2410,2411,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",[2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,978,979,980,981,982,983,984,985,986,987,988,989,2104,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":2413,"path":2384,"parent":758,"lines":2425,"parameters":2426},[898,2108],[2427,2428,2432,2435,2439],{"name":872,"kind":826,"required":830},{"name":2429,"kind":826,"annotation":2430,"required":830,"description":2431},"vendor",{"name":1075,"cls":829},"The vendor ID of the USB device.",{"name":1681,"kind":826,"annotation":2433,"required":830,"description":2434},{"name":1075,"cls":829},"The product ID of the USB device.",{"name":1896,"kind":826,"annotation":2436,"required":830,"description":2438},{"name":2437,"cls":829},"asyncio.BaseProtocol","The protocol instance to use for communication.",{"name":2440,"kind":826,"annotation":2441,"required":42,"default":2442,"description":2443},"interface_index",{"name":1075,"cls":829},{"name":2387,"cls":829},"The index of the USB Interface to use. Defaults to 0.",{"type":764,"name":2403,"path":2384,"parent":758,"lines":2445,"value":2429},[917,917],{"type":764,"name":2404,"path":2384,"parent":758,"lines":2447,"value":1681},[2262,2262],{"type":764,"name":2405,"path":2384,"parent":758,"lines":2449,"value":1278},[922,922],{"type":764,"name":2406,"path":2384,"parent":758,"lines":2451,"value":1896},[1055,1055],{"type":764,"name":2407,"path":2384,"parent":758,"lines":2453,"value":2440},[1304,1304],{"type":764,"name":2408,"path":2384,"parent":758,"lines":2455,"value":882,"annotation":2456},[1310,1310],{"left":2457,"slice":2458},{"name":877,"cls":829},{"name":2459,"cls":829},"usb.core.Device",{"type":764,"name":2409,"path":2384,"parent":758,"lines":2461,"value":882,"annotation":2462},[1010,1010],{"left":2463,"slice":2464},{"name":877,"cls":829},{"name":2465,"cls":829},"usb.core.Endpoint",{"type":764,"name":2410,"path":2384,"parent":758,"lines":2467,"value":882,"annotation":2468},[1313,1313],{"left":2469,"slice":2470},{"name":877,"cls":829},{"name":2465,"cls":829},{"type":764,"name":2411,"path":2384,"parent":758,"lines":2472,"value":886},[2108,2108],{"type":819,"name":2414,"path":2384,"parent":758,"lines":2474,"parameters":2475},[1060,2296],[2476],{"name":872,"kind":826,"required":830},{"type":819,"name":2415,"path":2384,"parent":758,"lines":2478,"parameters":2479},[2302,2158],[2480],{"name":872,"kind":826,"required":830},{"type":819,"name":2416,"path":2384,"parent":758,"lines":2482,"parameters":2484},[2483,2168],107,[2485],{"name":872,"kind":826,"required":830},{"type":819,"name":2417,"path":2384,"parent":758,"lines":2487,"parameters":2489},[2488,2313],119,[2490],{"name":872,"kind":826,"required":830},{"type":819,"name":2418,"path":2384,"parent":758,"lines":2492,"parameters":2493},[2322,1954],[2494],{"name":872,"kind":826,"required":830},{"type":819,"name":2419,"path":2384,"parent":758,"description":2496,"lines":2497,"parameters":2500},"Read data from the transport.",[2498,2499],133,156,[2501],{"name":872,"kind":826,"required":830},{"type":819,"name":2420,"path":2384,"parent":758,"lines":2503,"parameters":2505},[1425,2504],193,[2506],{"name":872,"kind":826,"required":830},{"type":819,"name":2421,"path":2384,"parent":758,"lines":2508,"parameters":2511},[2509,2510],201,205,[2512],{"name":872,"kind":826,"required":830},{"type":819,"name":2422,"path":2384,"parent":758,"lines":2514,"parameters":2516},[2515,2398],207,[2517,2518],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"required":830},{"type":738,"name":1981,"path":2520,"parent":746,"description":2521,"classes":2522},"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":2520,"parent":1981,"description":2524,"lines":2525,"bases":2527,"attributes":2533,"functions":2534,"mro":2542},"Interface for write-only transports.",[845,2526],308,[2528,2530],{"annotation":2529},{"name":1006,"cls":829},{"annotation":2531},{"name":2532,"cls":829},"asyncio.WriteTransport",[960,961,962,963,964,965,966],[2535,2536,2537,987,988,989,2104,990,991,992,993,2538,2539,2540,994,2541,995,996,997,998,999,1000,2232,2233,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":2535,"path":2520,"parent":1005,"lines":2544,"parameters":2545},[802,1188],[2546],{"name":872,"kind":826,"required":830},{"type":764,"name":960,"path":2520,"parent":1005,"lines":2548,"value":1030},[1178,1178],{"type":764,"name":961,"path":2520,"parent":1005,"lines":2550,"value":1030},[1092,1092],{"type":764,"name":962,"path":2520,"parent":1005,"lines":2552,"value":1314,"annotation":2553},[1578,1578],{"left":2554,"slice":2555},{"name":880,"cls":829},{"left":2556,"slice":2557},{"name":1478,"cls":829},{"elements":2558},[2559,2560,2562],{"name":828,"cls":829},{"name":2561,"cls":829},"bytearray",{"name":2563,"cls":829},"memoryview",{"type":819,"name":2536,"path":2520,"parent":1005,"description":2565,"lines":2566,"parameters":2567},"Opens the transport and if write buffer currently contains data, sets state to allow future write operations.",[1009,893],[2568],{"name":872,"kind":826,"required":830},{"type":819,"name":2537,"path":2520,"parent":1005,"description":2570,"lines":2571,"parameters":2572},"Closes the transport. If write buffer is empty, sets state to disallow further write operations.",[898,916],[2573],{"name":872,"kind":826,"required":830},{"type":764,"name":963,"path":2520,"parent":1005,"description":2575,"lines":2576,"value":882,"annotation":2577},"Whether or not there is data in the write buffer waiting to be written.",[2262,1010],{"name":1029,"cls":829},{"type":819,"name":987,"path":2520,"parent":1005,"description":2579,"lines":2580,"parameters":2581,"returns":2583},"Calculate the current size of the write buffer.",[1059,923],[2582],{"name":872,"kind":826,"required":830},{"description":2584,"annotation":2585},"The number of bytes in the write buffer.",{"name":1075,"cls":829},{"type":819,"name":988,"path":2520,"parent":1005,"description":2587,"lines":2588,"parameters":2589,"returns":2591},"Get the high and low watermarks for write flow control.",[928,1268],[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":1075,"cls":829},{"name":1075,"cls":829},{"type":819,"name":989,"path":2520,"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,2296],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":1075,"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":1075,"cls":829},"The minimum allowed number of bytes in the write buffer.",{"type":819,"name":2104,"path":2520,"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.",[2302,1384],[2622,2623],{"name":872,"kind":826,"required":830},{"name":938,"kind":826,"annotation":2624,"required":830,"description":2631},{"left":2625,"slice":2626},{"name":1478,"cls":829},{"elements":2627},[2628,2629,2630],{"name":828,"cls":829},{"name":2561,"cls":829},{"name":2563,"cls":829},"The bytes to write to the Transport.",{"type":819,"name":990,"path":2520,"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":1029,"cls":829},{"type":819,"name":991,"path":2520,"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.",[2175,1828],[2646],{"name":872,"kind":826,"required":830},{"type":819,"name":992,"path":2520,"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,1869],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":1478,"cls":829},{"elements":2661},[2662,2663,2664],{"name":828,"cls":829},{"name":2561,"cls":829},{"name":2563,"cls":829},"The list of bytes to concatenate and write to the Transport.",{"type":819,"name":993,"path":2520,"parent":1005,"description":2667,"lines":2668,"parameters":2669},"Flush the write buffer and disable further writing.",[2194,1385],[2670],{"name":872,"kind":826,"required":830},{"type":819,"name":2538,"path":2520,"parent":1005,"description":2672,"lines":2673,"parameters":2674},"Sets state to allow future write operations, if transport is still open.",[1404,2202],[2675],{"name":872,"kind":826,"required":830},{"type":819,"name":2539,"path":2520,"parent":1005,"description":2677,"lines":2678,"parameters":2680},"Sets state to disallow future write operations.",[2207,2679],172,[2681],{"name":872,"kind":826,"required":830},{"type":819,"name":2540,"path":2520,"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":2277,"kind":826,"required":42,"default":882,"description":2690},"The exception to propagate to the transport when closing.",{"type":819,"name":994,"path":2520,"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,1449],186,[2696],{"name":872,"kind":826,"required":830},{"type":819,"name":2541,"path":2520,"parent":1005,"description":2698,"lines":2699,"parameters":2701,"returns":2705},"Write data to the Transport.\nCalled within `_safe_write` for asynchronous writing.",[1454,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":1075,"cls":829},{"type":819,"name":995,"path":2520,"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":2520,"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":2520,"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,2526],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":1075,"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":1075,"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},[1534,1534],"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,2232,2762,2233,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,1222],[2768],{"name":872,"kind":826,"required":830},{"type":764,"name":964,"path":2739,"parent":1006,"lines":2770,"value":2771},[845,845],"asyncio.get_event_loop_policy().get_event_loop()",{"type":764,"name":965,"path":2739,"parent":1006,"lines":2773,"value":882,"annotation":2774},[1218,1218],{"left":2775,"slice":2776},{"name":877,"cls":829},{"name":2741,"cls":829},{"type":764,"name":966,"path":2739,"parent":1006,"lines":2778,"value":1278},[1222,1222],{"type":819,"name":998,"path":2739,"parent":1006,"description":2780,"lines":2781,"parameters":2782,"returns":2784},"Get the current `Protocol` associated with this transport.",[1860,885],[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.",[1602,917],[2793,2794],{"name":872,"kind":826,"required":830},{"name":1896,"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.",[922,2108],[2806],{"name":872,"kind":826,"required":830},{"description":2808,"annotation":2809},"True if the transport is closing or closed, False otherwise.",{"name":1029,"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.",[1060,1268],[2814],{"name":872,"kind":826,"required":830},{"type":819,"name":2232,"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,929],[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.",[934,1366],[2824],{"name":872,"kind":826,"required":830},{"type":819,"name":2233,"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,1799],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.",[2296,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,2169],105,[2842,2843],{"name":872,"kind":826,"required":830},{"name":2277,"kind":826,"annotation":2844,"required":42,"default":882,"description":2847},{"left":2845,"slice":2846},{"name":877,"cls":829},{"name":1445,"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.",[2174,2748],[2852,2853,2856],{"name":872,"kind":826,"required":830},{"name":2277,"kind":826,"annotation":2854,"required":830,"description":2855},{"name":1445,"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,1210,1211],"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,911],[2882],{"name":1389,"kind":826,"annotation":2883,"required":42,"default":2884,"description":2885},{"name":1283,"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,1178],[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,1602],[1555],[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},[1092,1092],{"name":828,"cls":829},{"type":764,"name":2903,"path":2895,"parent":753,"lines":2912,"value":882,"annotation":2913},[1578,1578],{"left":2914,"slice":2915},{"name":877,"cls":829},{"name":1283,"cls":829},{"type":819,"name":2906,"path":2895,"parent":753,"lines":2917,"parameters":2918},[767,1602],[2919],{"name":872,"kind":826,"required":830},{"type":819,"name":2905,"path":2895,"parent":753,"lines":2921,"parameters":2922},[1637,1637],[2923,2924,2927],{"name":872,"kind":826,"required":830},{"name":2925,"kind":826,"annotation":2926,"required":830},"payload",{"name":828,"cls":829},{"name":1389,"kind":826,"annotation":2928,"required":42,"default":882},{"left":2929,"slice":2930},{"name":877,"cls":829},{"name":1283,"cls":829},{"type":738,"name":2865,"path":2932,"parent":747,"attributes":2933,"classes":2934},"unitelabs\u002Fbus\u002Fcommands\u002Fcommand.py",[1210,1211],[752],{"type":764,"name":1210,"path":2932,"parent":2865,"lines":2936,"value":2937},[822,822],"typing.TypeVar('InType_co', covariant=True)",{"type":764,"name":1211,"path":2932,"parent":2865,"lines":2939,"value":2940},[845,845],"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":1210,"cls":829},{"name":1211,"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},[893,917],[2982,2983,2986,2991],{"name":872,"kind":826,"required":830},{"name":2857,"kind":826,"annotation":2984,"required":830,"description":2985},{"name":1210,"cls":829},"The contents of the message to be sent to the device, pre-serialization.",{"name":1389,"kind":826,"annotation":2987,"required":42,"default":882,"description":2990},{"left":2988,"slice":2989},{"name":877,"cls":829},{"name":1283,"cls":829},"How long is seconds to wait for a response.",{"name":2992,"kind":826,"annotation":2993,"required":42,"default":1030,"description":2996},"is_void",{"left":2994,"slice":2995},{"name":877,"cls":829},{"name":1029,"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},[910,910],{"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},[911,911],{"left":3005,"slice":3006},{"name":877,"cls":829},{"name":753,"cls":829},{"type":764,"name":2957,"path":2932,"parent":752,"lines":3008,"value":2857},[1046,1046],{"type":764,"name":2958,"path":2932,"parent":752,"lines":3010,"value":1389},[916,916],{"type":764,"name":2959,"path":2932,"parent":752,"lines":3012,"value":3013},[1159,1159],"b''",{"type":764,"name":2960,"path":2932,"parent":752,"lines":3015,"value":2992},[917,917],{"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.",[1055,1330],{"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,1078],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.",[1937,2290],[3029],{"name":872,"kind":826,"required":830},{"description":3031,"annotation":3032},"The deserialized `Response.payload`",{"left":3033,"slice":3034},{"name":877,"cls":829},{"name":1211,"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.",[1359,3038],97,[1369],[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":1210,"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,1800],99,[1369],[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":1211,"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,2322],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":1029,"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,1828],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.",[2195,2202],[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":1029,"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.",[2207,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":1029,"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,1010],[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},[1578,2059],[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":1033,"kind":1034,"required":42,"default":1035,"description":3166},"Additional `Command` kwargs.",{"type":764,"name":3135,"path":3121,"parent":2873,"lines":3168,"value":3152},[1618,1618],{"type":764,"name":3136,"path":3121,"parent":2873,"lines":3170,"value":3157},[893,893],{"type":764,"name":3137,"path":3121,"parent":2873,"lines":3172,"value":3161},[2059,2059],{"type":819,"name":3140,"path":3121,"parent":2873,"lines":3174,"parameters":3175,"returns":3181},[899,916],[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},[917,1304],[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},[1310,1010],[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":1029,"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,1092],[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},[845,1218],[3224,3225,3227],{"name":872,"kind":826,"required":830},{"name":1494,"kind":826,"annotation":3226,"required":830},{"name":828,"cls":829},{"name":1389,"kind":826,"annotation":3228,"required":42,"default":882},{"left":3229,"slice":3230},{"name":877,"cls":829},{"name":1283,"cls":829},{"type":819,"name":3218,"path":3202,"parent":2872,"lines":3232,"parameters":3233,"returns":3239},[802,1860],[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},[1178,1092],[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.",[1091,911],[1555],[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},[1188,1188],{"name":753,"cls":829},{"type":819,"name":3262,"path":3252,"parent":754,"lines":3269,"parameters":3270},[1009,892],[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.",[1618,911],[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},[1637,1637],[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,893],[3315,3322,3324,3326],{"name":1095,"kind":826,"annotation":3316,"required":830,"description":3321},{"left":3317,"slice":3318},{"name":1098,"cls":829},{"elements":3319},[1101,3320],{"name":3309,"cls":829},"A callable that returns an instance of the protocol to be used.",{"name":2429,"kind":826,"annotation":3323,"required":830,"description":2431},{"name":1075,"cls":829},{"name":1681,"kind":826,"annotation":3325,"required":830,"description":2434},{"name":1075,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035,"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.",[899,1325],[3340,3342,3344],{"name":2429,"kind":826,"annotation":3341,"required":830,"description":2431},{"name":1075,"cls":829},{"name":1681,"kind":826,"annotation":3343,"required":830,"description":2434},{"name":1075,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035,"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,1159],[3363,3369,3372,3374,3377,3380,3383],{"name":1095,"kind":826,"annotation":3364,"required":830,"description":3321},{"left":3365,"slice":3366},{"name":1098,"cls":829},{"elements":3367},[1101,3368],{"name":3309,"cls":829},{"name":2112,"kind":826,"annotation":3370,"required":830,"description":3371},{"name":913,"cls":829},"The port of the serial device.",{"name":2116,"kind":826,"annotation":3373,"required":42,"default":2118},{"name":1075,"cls":829},{"name":2121,"kind":826,"annotation":3375,"required":42,"default":3376},{"name":1986,"cls":829},{"name":2014,"cls":829},{"name":2126,"kind":826,"annotation":3378,"required":42,"default":3379},{"name":1987,"cls":829},{"name":2036,"cls":829},{"name":2131,"kind":826,"annotation":3381,"required":42,"default":3382},{"name":1988,"cls":829},{"name":2066,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035,"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.",[1091,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":1095,"kind":826,"annotation":3415,"required":830},{"left":3416,"slice":3417},{"name":1098,"cls":829},{"elements":3418},[1101,3419],{"name":3309,"cls":829},{"name":1033,"kind":1034,"required":42,"default":1035},{"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.7",1781787401178]