[{"data":1,"prerenderedAt":4606},["ShallowReactive",2],{"navigation":3,"reference-meta:python-bus\u002F0.2.0":733,"reference-data:python-bus\u002F0.2.0":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":4586,"version":4605},{"unitelabs.bus":737,"unitelabs.bus.__all__":774,"unitelabs.bus.exceptions":801,"unitelabs.bus.exceptions.InputValidationError":805,"unitelabs.bus.exceptions.CommandValidationError":816,"unitelabs.bus.exceptions.CommandExecutionError":824,"unitelabs.bus.exceptions.CommandMethodValidationError":833,"unitelabs.bus.exceptions.NoSuchDeviceFound":841,"unitelabs.bus.testing":849,"unitelabs.bus.testing.__all__":870,"unitelabs.bus.testing.stub":882,"unitelabs.bus.testing.stub.Stub":886,"unitelabs.bus.testing.stub.stub_maker":890,"unitelabs.bus.testing.serial_device_mock":920,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock":924,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__init__":948,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.cancel":965,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.reader":969,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__enter__":972,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.__exit__":977,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.port":989,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.open":995,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.close":1001,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.receive":1007,"unitelabs.bus.testing.serial_device_mock.SerialDeviceMock.received":1013,"unitelabs.bus.testing.mock_transport":1021,"unitelabs.bus.testing.mock_transport.MockTransport":1025,"unitelabs.bus.testing.mock_transport.MockTransport.__init__":1089,"unitelabs.bus.testing.mock_transport.MockTransport.stubs":1119,"unitelabs.bus.testing.mock_transport.MockTransport.device":1122,"unitelabs.bus.testing.mock_transport.MockTransport.autorespond":1125,"unitelabs.bus.testing.mock_transport.MockTransport.queue":1127,"unitelabs.bus.testing.mock_transport.MockTransport.mock":1131,"unitelabs.bus.testing.mock_transport.MockTransport.kwargs":1135,"unitelabs.bus.testing.mock_transport.MockTransport.write":1139,"unitelabs.bus.testing.mock_transport.MockTransport._add_to_queue":1147,"unitelabs.bus.testing.mock_transport.MockTransport._write":1171,"unitelabs.bus.testing.mock_transport.MockTransport._read":1182,"unitelabs.bus.testing.udp_device_mock":1191,"unitelabs.bus.testing.udp_device_mock.UDP_SERVER_ADDR":1196,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock":1199,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__init__":1221,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.socket":1232,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.cancel":1235,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.loop":1237,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__enter__":1241,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__exit__":1246,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.host":1254,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.port":1258,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.address":1261,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.open":1271,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.close":1276,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.receive":1281,"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.received":1290,"unitelabs.bus.testing.mock_factory":1300,"unitelabs.bus.testing.mock_factory.create_mock_connection":1305,"unitelabs.bus.testing.device_mock":1334,"unitelabs.bus.testing.device_mock.DeviceMock":1338,"unitelabs.bus.testing.device_mock.DeviceMock.__init__":1350,"unitelabs.bus.testing.device_mock.DeviceMock.stubs":1362,"unitelabs.bus.testing.device_mock.DeviceMock.logger":1367,"unitelabs.bus.testing.device_mock.DeviceMock.get_response":1372,"unitelabs.bus.testing.fixtures":1387,"unitelabs.bus.testing.fixtures.mock_factory":1397,"unitelabs.bus.testing.fixtures.serial_device":1407,"unitelabs.bus.testing.fixtures.udp_device":1417,"unitelabs.bus.testing.fixtures.mk_partial_protocol":1426,"unitelabs.bus.testing.fixtures.mk_stubbed_protocol":1464,"unitelabs.bus.testing.fixtures.protocol":1508,"unitelabs.bus.protocols":1518,"unitelabs.bus.protocols.__all__":1525,"unitelabs.bus.protocols.protocol":1529,"unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY":1539,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS":1542,"unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS":1545,"unitelabs.bus.protocols.protocol.Protocol":1548,"unitelabs.bus.protocols.protocol.Protocol.__init__":1591,"unitelabs.bus.protocols.protocol.Protocol.transport":1628,"unitelabs.bus.protocols.protocol.Protocol._transport_allows_writing":1634,"unitelabs.bus.protocols.protocol.Protocol._transport_factory":1636,"unitelabs.bus.protocols.protocol.Protocol._transport_kwargs":1638,"unitelabs.bus.protocols.protocol.Protocol._commands":1640,"unitelabs.bus.protocols.protocol.Protocol.lock":1647,"unitelabs.bus.protocols.protocol.Protocol.is_open":1650,"unitelabs.bus.protocols.protocol.Protocol.autodetect":1654,"unitelabs.bus.protocols.protocol.Protocol._autodetector":1656,"unitelabs.bus.protocols.protocol.Protocol._validation_kwargs":1658,"unitelabs.bus.protocols.protocol.Protocol.is_validated":1661,"unitelabs.bus.protocols.protocol.Protocol.reconnect":1664,"unitelabs.bus.protocols.protocol.Protocol.reconnect_delay":1667,"unitelabs.bus.protocols.protocol.Protocol.remaining_reconnect_attempts":1670,"unitelabs.bus.protocols.protocol.Protocol.max_reconnect_attempts":1673,"unitelabs.bus.protocols.protocol.Protocol.logger":1675,"unitelabs.bus.protocols.protocol.Protocol.autodetector":1679,"unitelabs.bus.protocols.protocol.Protocol.connect":1684,"unitelabs.bus.protocols.protocol.Protocol._connect_transport":1712,"unitelabs.bus.protocols.protocol.Protocol.identity":1720,"unitelabs.bus.protocols.protocol.Protocol.validate":1741,"unitelabs.bus.protocols.protocol.Protocol.open":1761,"unitelabs.bus.protocols.protocol.Protocol.close":1775,"unitelabs.bus.protocols.protocol.Protocol.connection_made":1782,"unitelabs.bus.protocols.protocol.Protocol.connection_lost":1792,"unitelabs.bus.protocols.protocol.Protocol.pause_writing":1804,"unitelabs.bus.protocols.protocol.Protocol.resume_writing":1810,"unitelabs.bus.protocols.protocol.Protocol.data_received":1816,"unitelabs.bus.protocols.protocol.Protocol.datagram_received":1826,"unitelabs.bus.protocols.protocol.Protocol.error_received":1845,"unitelabs.bus.protocols.protocol.Protocol.execute":1862,"unitelabs.bus.utils":1896,"unitelabs.bus.utils.__all__":1905,"unitelabs.bus.utils.device_manager":1910,"unitelabs.bus.utils.device_manager.DeviceInfo":1916,"unitelabs.bus.utils.device_manager.DeviceInfo.device":1938,"unitelabs.bus.utils.device_manager.DeviceInfo.name":1942,"unitelabs.bus.utils.device_manager.DeviceInfo.description":1945,"unitelabs.bus.utils.device_manager.DeviceInfo.hwid":1950,"unitelabs.bus.utils.device_manager.DeviceInfo.vid":1955,"unitelabs.bus.utils.device_manager.DeviceInfo.pid":1961,"unitelabs.bus.utils.device_manager.DeviceInfo.serial_number":1968,"unitelabs.bus.utils.device_manager.DeviceInfo.location":1973,"unitelabs.bus.utils.device_manager.DeviceInfo.manufacturer":1978,"unitelabs.bus.utils.device_manager.DeviceInfo.product":1983,"unitelabs.bus.utils.device_manager.DeviceInfo.interface":1988,"unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__":1993,"unitelabs.bus.utils.device_manager.DeviceInfo.__repr__":1997,"unitelabs.bus.utils.device_manager.DeviceInfo.__init__":2001,"unitelabs.bus.utils.device_manager.DeviceManager":2056,"unitelabs.bus.utils.device_manager.DeviceManager.filter_kwargs":2065,"unitelabs.bus.utils.device_manager.DeviceManager.get_all":2088,"unitelabs.bus.utils.device_manager.DeviceManager.check_device_match":2097,"unitelabs.bus.utils.device_manager.DeviceManager.filter":2108,"unitelabs.bus.utils.device_manager.SerialDeviceManager":2119,"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS":2134,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter_kwargs":2137,"unitelabs.bus.utils.device_manager.SerialDeviceManager.get_all":2160,"unitelabs.bus.utils.device_manager.SerialDeviceManager.check_device_match":2173,"unitelabs.bus.utils.device_manager.SerialDeviceManager.filter":2189,"unitelabs.bus.utils.device_manager.devices":2203,"unitelabs.bus.utils.autodetect":2206,"unitelabs.bus.utils.autodetect.TransportType":2210,"unitelabs.bus.utils.autodetect.TransportType.serial":2221,"unitelabs.bus.utils.autodetect.TransportType.usb":2224,"unitelabs.bus.utils.autodetect.TransportType.unknown":2226,"unitelabs.bus.utils.autodetect.AutoDetector":2228,"unitelabs.bus.utils.autodetect.AutoDetector._transport_type":2250,"unitelabs.bus.utils.autodetect.AutoDetector.__init__":2253,"unitelabs.bus.utils.autodetect.AutoDetector.protocol":2263,"unitelabs.bus.utils.autodetect.AutoDetector._transport_kwargs":2265,"unitelabs.bus.utils.autodetect.AutoDetector._device_manager":2267,"unitelabs.bus.utils.autodetect.AutoDetector._validation_kwargs":2269,"unitelabs.bus.utils.autodetect.AutoDetector._is_resolving":2271,"unitelabs.bus.utils.autodetect.AutoDetector.get_transport_type":2273,"unitelabs.bus.utils.autodetect.AutoDetector.logger":2278,"unitelabs.bus.utils.autodetect.AutoDetector.device_manager":2282,"unitelabs.bus.utils.autodetect.AutoDetector.get_device_manager":2287,"unitelabs.bus.utils.autodetect.AutoDetector.is_resolving":2298,"unitelabs.bus.utils.autodetect.AutoDetector.resolve":2302,"unitelabs.bus.utils.autodetect.AutoDetector._connect":2312,"unitelabs.bus.utils.autodetect.AutoDetector._update_protocol_transport":2326,"unitelabs.bus.transports":2334,"unitelabs.bus.transports.__all__":2349,"unitelabs.bus.transports.serial_transport":2359,"unitelabs.bus.transports.serial_transport.ByteSize":2364,"unitelabs.bus.transports.serial_transport.ByteSize.FIVEBITS":2376,"unitelabs.bus.transports.serial_transport.ByteSize.SIXBITS":2379,"unitelabs.bus.transports.serial_transport.ByteSize.SEVENBITS":2382,"unitelabs.bus.transports.serial_transport.ByteSize.EIGHTBITS":2385,"unitelabs.bus.transports.serial_transport.Parity":2388,"unitelabs.bus.transports.serial_transport.Parity.NONE":2402,"unitelabs.bus.transports.serial_transport.Parity.ODD":2405,"unitelabs.bus.transports.serial_transport.Parity.EVEN":2408,"unitelabs.bus.transports.serial_transport.Parity.MARK":2411,"unitelabs.bus.transports.serial_transport.Parity.SPACE":2414,"unitelabs.bus.transports.serial_transport.StopBits":2417,"unitelabs.bus.transports.serial_transport.StopBits.ONE":2429,"unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE":2432,"unitelabs.bus.transports.serial_transport.StopBits.TWO":2435,"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME":2438,"unitelabs.bus.transports.serial_transport.SerialTransport":2441,"unitelabs.bus.transports.serial_transport.SerialTransport.__init__":2466,"unitelabs.bus.transports.serial_transport.SerialTransport._serial":2494,"unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size":2497,"unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer":2500,"unitelabs.bus.transports.serial_transport.SerialTransport._open":2502,"unitelabs.bus.transports.serial_transport.SerialTransport._close":2508,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_reader":2515,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_read":2520,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_reader":2525,"unitelabs.bus.transports.serial_transport.SerialTransport._read":2531,"unitelabs.bus.transports.serial_transport.SerialTransport._ensure_writer":2541,"unitelabs.bus.transports.serial_transport.SerialTransport._poll_write":2552,"unitelabs.bus.transports.serial_transport.SerialTransport._remove_writer":2557,"unitelabs.bus.transports.serial_transport.SerialTransport._write":2564,"unitelabs.bus.transports.read_transport":2573,"unitelabs.bus.transports.read_transport.ReadTransport":2576,"unitelabs.bus.transports.read_transport.ReadTransport.__init__":2594,"unitelabs.bus.transports.read_transport.ReadTransport._has_reader":2598,"unitelabs.bus.transports.read_transport.ReadTransport.open":2600,"unitelabs.bus.transports.read_transport.ReadTransport.close":2605,"unitelabs.bus.transports.read_transport.ReadTransport.is_reading":2610,"unitelabs.bus.transports.read_transport.ReadTransport.pause_reading":2618,"unitelabs.bus.transports.read_transport.ReadTransport.resume_reading":2623,"unitelabs.bus.transports.read_transport.ReadTransport._abort":2629,"unitelabs.bus.transports.read_transport.ReadTransport._ensure_reader":2641,"unitelabs.bus.transports.read_transport.ReadTransport._remove_reader":2647,"unitelabs.bus.transports.read_transport.ReadTransport._safe_read":2652,"unitelabs.bus.transports.read_transport.ReadTransport._read":2658,"unitelabs.bus.transports.read_transport.ReadTransport.read_all":2668,"unitelabs.bus.transports.read_transport.ReadTransport.clear_read_buffer":2677,"unitelabs.bus.transports.transport":2682,"unitelabs.bus.transports.transport.Transport":2685,"unitelabs.bus.transports.transport.Transport._open":2700,"unitelabs.bus.transports.transport.Transport._close":2704,"unitelabs.bus.transports.transport.Transport._ensure_reader":2708,"unitelabs.bus.transports.transport.Transport._remove_reader":2712,"unitelabs.bus.transports.transport.Transport._read":2716,"unitelabs.bus.transports.transport.Transport._ensure_writer":2724,"unitelabs.bus.transports.transport.Transport._remove_writer":2728,"unitelabs.bus.transports.transport.Transport._write":2732,"unitelabs.bus.transports.usb_transport":2740,"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME":2746,"unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE":2749,"unitelabs.bus.transports.usb_transport.USBTransport":2752,"unitelabs.bus.transports.usb_transport.USBTransport.__init__":2780,"unitelabs.bus.transports.usb_transport.USBTransport.vendor":2800,"unitelabs.bus.transports.usb_transport.USBTransport.product":2802,"unitelabs.bus.transports.usb_transport.USBTransport._closing":2804,"unitelabs.bus.transports.usb_transport.USBTransport._protocol":2806,"unitelabs.bus.transports.usb_transport.USBTransport._interface_index":2808,"unitelabs.bus.transports.usb_transport.USBTransport._device":2810,"unitelabs.bus.transports.usb_transport.USBTransport.read_endpoint":2816,"unitelabs.bus.transports.usb_transport.USBTransport.write_endpoint":2822,"unitelabs.bus.transports.usb_transport.USBTransport._reader_event":2827,"unitelabs.bus.transports.usb_transport.USBTransport._open":2829,"unitelabs.bus.transports.usb_transport.USBTransport._close":2833,"unitelabs.bus.transports.usb_transport.USBTransport._ensure_reader":2837,"unitelabs.bus.transports.usb_transport.USBTransport._remove_reader":2841,"unitelabs.bus.transports.usb_transport.USBTransport.__read":2846,"unitelabs.bus.transports.usb_transport.USBTransport._read":2851,"unitelabs.bus.transports.usb_transport.USBTransport._ensure_writer":2861,"unitelabs.bus.transports.usb_transport.USBTransport._remove_writer":2866,"unitelabs.bus.transports.usb_transport.USBTransport._write":2872,"unitelabs.bus.transports.write_transport":2879,"unitelabs.bus.transports.write_transport.WriteTransport":2883,"unitelabs.bus.transports.write_transport.WriteTransport.__init__":2903,"unitelabs.bus.transports.write_transport.WriteTransport._has_writer":2907,"unitelabs.bus.transports.write_transport.WriteTransport._is_writing_paused":2909,"unitelabs.bus.transports.write_transport.WriteTransport._write_buffer":2911,"unitelabs.bus.transports.write_transport.WriteTransport.open":2924,"unitelabs.bus.transports.write_transport.WriteTransport.close":2929,"unitelabs.bus.transports.write_transport.WriteTransport.writes_pending":2934,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_size":2938,"unitelabs.bus.transports.write_transport.WriteTransport.get_write_buffer_limits":2946,"unitelabs.bus.transports.write_transport.WriteTransport.set_write_buffer_limits":2959,"unitelabs.bus.transports.write_transport.WriteTransport.write":2976,"unitelabs.bus.transports.write_transport.WriteTransport.can_write_eof":2990,"unitelabs.bus.transports.write_transport.WriteTransport.write_eof":2998,"unitelabs.bus.transports.write_transport.WriteTransport.writelines":3004,"unitelabs.bus.transports.write_transport.WriteTransport.flush":3023,"unitelabs.bus.transports.write_transport.WriteTransport._ensure_writer":3030,"unitelabs.bus.transports.write_transport.WriteTransport._remove_writer":3036,"unitelabs.bus.transports.write_transport.WriteTransport._abort":3043,"unitelabs.bus.transports.write_transport.WriteTransport._safe_write":3055,"unitelabs.bus.transports.write_transport.WriteTransport._write":3062,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_pause_writing":3074,"unitelabs.bus.transports.write_transport.WriteTransport._maybe_resume_protocol":3081,"unitelabs.bus.transports.write_transport.WriteTransport._set_write_buffer_limits":3087,"unitelabs.bus.transports.base_transport":3106,"unitelabs.bus.transports.base_transport.P":3111,"unitelabs.bus.transports.base_transport.BaseTransport":3114,"unitelabs.bus.transports.base_transport.BaseTransport.__init__":3133,"unitelabs.bus.transports.base_transport.BaseTransport._loop":3137,"unitelabs.bus.transports.base_transport.BaseTransport._protocol":3140,"unitelabs.bus.transports.base_transport.BaseTransport._is_closing":3146,"unitelabs.bus.transports.base_transport.BaseTransport.get_protocol":3148,"unitelabs.bus.transports.base_transport.BaseTransport.set_protocol":3158,"unitelabs.bus.transports.base_transport.BaseTransport.is_closing":3171,"unitelabs.bus.transports.base_transport.BaseTransport.open":3179,"unitelabs.bus.transports.base_transport.BaseTransport._open":3184,"unitelabs.bus.transports.base_transport.BaseTransport.close":3189,"unitelabs.bus.transports.base_transport.BaseTransport._close":3195,"unitelabs.bus.transports.base_transport.BaseTransport.abort":3202,"unitelabs.bus.transports.base_transport.BaseTransport._abort":3207,"unitelabs.bus.transports.base_transport.BaseTransport._exception":3217,"unitelabs.bus.commands":3229,"unitelabs.bus.commands.multiline":3243,"unitelabs.bus.commands.multiline.multiline":3247,"unitelabs.bus.commands.__all__":3255,"unitelabs.bus.commands.request":3262,"unitelabs.bus.commands.request.Request":3265,"unitelabs.bus.commands.request.Request.payload":3276,"unitelabs.bus.commands.request.Request.timeout":3279,"unitelabs.bus.commands.request.Request.__post_init__":3284,"unitelabs.bus.commands.request.Request.__init__":3288,"unitelabs.bus.commands.command":3301,"unitelabs.bus.commands.command.InType":3312,"unitelabs.bus.commands.command.OutType":3315,"unitelabs.bus.commands.command.ResType":3318,"unitelabs.bus.commands.command.P":3321,"unitelabs.bus.commands.command.T":3324,"unitelabs.bus.commands.command.Parser":3327,"unitelabs.bus.commands.command.Serializer":3330,"unitelabs.bus.commands.command.Serializer.__call__":3341,"unitelabs.bus.commands.command.SelfSerializer":3354,"unitelabs.bus.commands.command.SelfSerializer.__call__":3364,"unitelabs.bus.commands.command.Deserializer":3377,"unitelabs.bus.commands.command.Deserializer.__call__":3387,"unitelabs.bus.commands.command.SelfDeserializer":3397,"unitelabs.bus.commands.command.SelfDeserializer.__call__":3407,"unitelabs.bus.commands.command.Command":3419,"unitelabs.bus.commands.command.Command.receiver":3460,"unitelabs.bus.commands.command.Command.__new__":3465,"unitelabs.bus.commands.command.Command.__init__":3483,"unitelabs.bus.commands.command.Command._response":3499,"unitelabs.bus.commands.command.Command._request":3504,"unitelabs.bus.commands.command.Command.message":3509,"unitelabs.bus.commands.command.Command.timeout":3511,"unitelabs.bus.commands.command.Command._response_buffer":3514,"unitelabs.bus.commands.command.Command.is_void":3517,"unitelabs.bus.commands.command.Command._parsers":3519,"unitelabs.bus.commands.command.Command.request":3524,"unitelabs.bus.commands.command.Command.response":3528,"unitelabs.bus.commands.command.Command.result":3534,"unitelabs.bus.commands.command.Command.serialize":3543,"unitelabs.bus.commands.command.Command._serialize":3557,"unitelabs.bus.commands.command.Command.deserialize":3568,"unitelabs.bus.commands.command.Command._deserialize":3581,"unitelabs.bus.commands.command.Command.validate_request":3592,"unitelabs.bus.commands.command.Command._set_response":3603,"unitelabs.bus.commands.command.Command.validate_response":3610,"unitelabs.bus.commands.command.Command._validate_response":3620,"unitelabs.bus.commands.command.Command.match_response":3633,"unitelabs.bus.commands.command.Command.parsers":3649,"unitelabs.bus.commands.command.Command.add_parser":3656,"unitelabs.bus.commands.command.Command.parse":3685,"unitelabs.bus.commands.builder":3693,"unitelabs.bus.commands.builder.P":3703,"unitelabs.bus.commands.builder.T":3705,"unitelabs.bus.commands.builder.R":3708,"unitelabs.bus.commands.builder.S_InType":3711,"unitelabs.bus.commands.builder.D_OutType":3714,"unitelabs.bus.commands.builder.CommandBuilder":3717,"unitelabs.bus.commands.builder.CommandBuilder.__init__":3750,"unitelabs.bus.commands.builder.CommandBuilder._command":3769,"unitelabs.bus.commands.builder.CommandBuilder._cmd_cls_name":3771,"unitelabs.bus.commands.builder.CommandBuilder._serializer":3773,"unitelabs.bus.commands.builder.CommandBuilder._deserializer":3775,"unitelabs.bus.commands.builder.CommandBuilder._response_validator":3777,"unitelabs.bus.commands.builder.CommandBuilder._response_validator_timeout":3779,"unitelabs.bus.commands.builder.CommandBuilder._timeout":3781,"unitelabs.bus.commands.builder.CommandBuilder._is_void":3783,"unitelabs.bus.commands.builder.CommandBuilder._parsers":3785,"unitelabs.bus.commands.builder.CommandBuilder.create_command_method":3790,"unitelabs.bus.commands.builder.CommandBuilder.with_serializer":3842,"unitelabs.bus.commands.builder.CommandBuilder.with_deserializer":3871,"unitelabs.bus.commands.builder.CommandBuilder.with_parser":3909,"unitelabs.bus.commands.builder.CommandBuilder.with_timeout":3932,"unitelabs.bus.commands.builder.CommandBuilder.without_response":3948,"unitelabs.bus.commands.builder.CommandBuilder.with_multiline":3964,"unitelabs.bus.commands.builder.CommandBuilder.build":4000,"unitelabs.bus.commands.serial_command":4031,"unitelabs.bus.commands.serial_command.SerialCommand":4034,"unitelabs.bus.commands.serial_command.SerialCommand.__init__":4055,"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator":4078,"unitelabs.bus.commands.serial_command.SerialCommand._write_terminator":4080,"unitelabs.bus.commands.serial_command.SerialCommand._encoding":4082,"unitelabs.bus.commands.serial_command.SerialCommand._serialize":4084,"unitelabs.bus.commands.serial_command.SerialCommand._deserialize":4094,"unitelabs.bus.commands.serial_command.SerialCommand._validate_response":4104,"unitelabs.bus.commands.http_command":4112,"unitelabs.bus.commands.http_command._Method":4117,"unitelabs.bus.commands.http_command._Method.OPTIONS":4135,"unitelabs.bus.commands.http_command._Method.GET":4138,"unitelabs.bus.commands.http_command._Method.HEAD":4141,"unitelabs.bus.commands.http_command._Method.POST":4144,"unitelabs.bus.commands.http_command._Method.PUT":4147,"unitelabs.bus.commands.http_command._Method.DELETE":4150,"unitelabs.bus.commands.http_command._Method.TRACE":4153,"unitelabs.bus.commands.http_command._Method.CONNECT":4156,"unitelabs.bus.commands.http_command._Method.PATCH":4159,"unitelabs.bus.commands.http_command.HTTPResponse":4162,"unitelabs.bus.commands.http_command.HTTPResponse.status_code":4172,"unitelabs.bus.commands.http_command.HTTPResponse.headers":4175,"unitelabs.bus.commands.http_command.HTTPResponse.payload":4184,"unitelabs.bus.commands.http_command.HTTPResponse.__init__":4189,"unitelabs.bus.commands.http_command.HTTPCommand":4208,"unitelabs.bus.commands.http_command.HTTPCommand.Method":4230,"unitelabs.bus.commands.http_command.HTTPCommand.__init__":4236,"unitelabs.bus.commands.http_command.HTTPCommand.host":4279,"unitelabs.bus.commands.http_command.HTTPCommand.path":4281,"unitelabs.bus.commands.http_command.HTTPCommand.method":4283,"unitelabs.bus.commands.http_command.HTTPCommand.headers":4285,"unitelabs.bus.commands.http_command.HTTPCommand._serialize":4288,"unitelabs.bus.commands.http_command.HTTPCommand._deserialize":4296,"unitelabs.bus.commands.byte_command":4304,"unitelabs.bus.commands.byte_command.ByteCommand":4307,"unitelabs.bus.commands.byte_command.ByteCommand.__init__":4324,"unitelabs.bus.commands.byte_command.ByteCommand._serialize":4339,"unitelabs.bus.commands.byte_command.ByteCommand._deserialize":4349,"unitelabs.bus.commands.response":4357,"unitelabs.bus.commands.response.Response":4360,"unitelabs.bus.commands.response.Response.request":4371,"unitelabs.bus.commands.response.Response.__post_init__":4374,"unitelabs.bus.commands.response.Response.__handle_done":4378,"unitelabs.bus.commands.response.Response.__init__":4390,"unitelabs.bus.factories":4396,"unitelabs.bus.factories.__all__":4408,"unitelabs.bus.factories.usb_factory":4411,"unitelabs.bus.factories.usb_factory.create_usb_connection":4415,"unitelabs.bus.factories.serial_factory":4440,"unitelabs.bus.factories.serial_factory.create_serial_connection":4444,"unitelabs.bus.factories.transport_factory":4479,"unitelabs.bus.factories.transport_factory.P":4483,"unitelabs.bus.factories.transport_factory.TransportFactory":4486,"unitelabs.bus.factories.transport_factory.TransportFactory.__call__":4495,"unitelabs.bus.factories.tcp_factory":4513,"unitelabs.bus.factories.tcp_factory.create_tcp_connection":4517,"unitelabs.bus.factories.udp_factory":4545,"unitelabs.bus.factories.udp_factory.create_udp_connection":4549},{"type":738,"name":739,"path":740,"parent":741,"packages":742,"attributes":750,"classes":752,"functions":769},"package","unitelabs.bus","unitelabs\u002Fbus\u002F__init__.py","unitelabs",[743,744,745,746,747,748,749],"unitelabs.bus.exceptions","unitelabs.bus.testing","unitelabs.bus.protocols","unitelabs.bus.utils","unitelabs.bus.transports","unitelabs.bus.commands","unitelabs.bus.factories",[751],"unitelabs.bus.__all__",[753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768],"unitelabs.bus.commands.byte_command.ByteCommand","unitelabs.bus.commands.command.Command","unitelabs.bus.commands.builder.CommandBuilder","unitelabs.bus.commands.http_command.HTTPCommand","unitelabs.bus.commands.request.Request","unitelabs.bus.commands.response.Response","unitelabs.bus.commands.serial_command.SerialCommand","unitelabs.bus.exceptions.CommandExecutionError","unitelabs.bus.exceptions.CommandValidationError","unitelabs.bus.exceptions.InputValidationError","unitelabs.bus.exceptions.NoSuchDeviceFound","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",[770,771,772,773],"unitelabs.bus.factories.serial_factory.create_serial_connection","unitelabs.bus.factories.tcp_factory.create_tcp_connection","unitelabs.bus.factories.usb_factory.create_usb_connection","unitelabs.bus.factories.udp_factory.create_udp_connection",{"type":775,"name":751,"path":740,"parent":739,"lines":776,"value":779},"attribute",[777,778],15,37,[780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800],"Protocol","Command","CommandBuilder","Request","Response","ByteCommand","SerialCommand","HTTPCommand","TransportFactory","create_serial_connection","create_usb_connection","create_udp_connection","create_tcp_connection","SerialTransport","USBTransport","SerialDeviceManager","InputValidationError","CommandValidationError","CommandExecutionError","NoSuchDeviceFound","testing",{"type":738,"name":743,"path":802,"parent":739,"classes":803},"unitelabs\u002Fbus\u002Fexceptions.py",[762,761,760,804,763],"unitelabs.bus.exceptions.CommandMethodValidationError",{"type":806,"name":762,"path":802,"parent":743,"lines":807,"bases":810,"mro":815},"class",[808,809],1,2,[811],{"annotation":812},{"name":813,"cls":814},"ValueError","ExprName",[762],{"type":806,"name":761,"path":802,"parent":743,"lines":817,"bases":820,"mro":823},[818,819],5,6,[821],{"annotation":822},{"name":762,"cls":814},[761,762],{"type":806,"name":760,"path":802,"parent":743,"lines":825,"bases":828,"mro":832},[826,827],9,10,[829],{"annotation":830},{"name":831,"cls":814},"Exception",[760],{"type":806,"name":804,"path":802,"parent":743,"lines":834,"bases":837,"mro":840},[835,836],13,14,[838],{"annotation":839},{"name":831,"cls":814},[804],{"type":806,"name":763,"path":802,"parent":743,"lines":842,"bases":845,"mro":848},[843,844],17,18,[846],{"annotation":847},{"name":831,"cls":814},[763],{"type":738,"name":744,"path":850,"parent":739,"packages":851,"attributes":859,"classes":862,"functions":867},"unitelabs\u002Fbus\u002Ftesting\u002F__init__.py",[852,853,854,855,856,857,858],"unitelabs.bus.testing.stub","unitelabs.bus.testing.serial_device_mock","unitelabs.bus.testing.mock_transport","unitelabs.bus.testing.udp_device_mock","unitelabs.bus.testing.mock_factory","unitelabs.bus.testing.device_mock","unitelabs.bus.testing.fixtures",[860,861],"unitelabs.bus.testing.stub.Stub","unitelabs.bus.testing.__all__",[863,864,865,866],"unitelabs.bus.testing.device_mock.DeviceMock","unitelabs.bus.testing.mock_transport.MockTransport","unitelabs.bus.testing.serial_device_mock.SerialDeviceMock","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock",[868,869],"unitelabs.bus.testing.stub.stub_maker","unitelabs.bus.testing.mock_factory.create_mock_connection",{"type":775,"name":861,"path":850,"parent":744,"lines":871,"value":874},[872,873],8,16,[875,876,877,878,879,880,881],"DeviceMock","SerialDeviceMock","create_mock_connection","MockTransport","Stub","stub_maker","UDPDeviceMock",{"type":738,"name":852,"path":883,"parent":744,"attributes":884,"functions":885},"unitelabs\u002Fbus\u002Ftesting\u002Fstub.py",[860],[868],{"type":775,"name":860,"path":883,"parent":852,"lines":887,"value":889},[888,888],4,"typing.Callable[[bytes], typing.Union[None, bytes, collections.abc.Generator[bytes, None, None]]]",{"type":891,"name":868,"path":883,"parent":852,"description":892,"lines":893,"parameters":896,"returns":917},"function","Create a stub for a given request and expected response. Stubs can be used in combination with\na `DeviceMock` to simulate request-specific device response behavior.",[894,895],7,29,[897,904],{"name":898,"kind":899,"annotation":900,"required":902,"description":903},"request","positional or keyword",{"name":901,"cls":814},"bytes",true,"The bytes that the device will receive.",{"name":905,"kind":899,"annotation":906,"required":902,"description":916},"expected_response",{"left":907,"slice":909},{"name":908,"cls":814},"typing.Union",{"elements":910},[911,912],{"name":901,"cls":814},{"left":913,"slice":915},{"name":914,"cls":814},"collections.abc.Sequence",{"name":901,"cls":814},"The response that the device will send upon receipt of `request`,\nif it is a `Sequence`, then the device will send all responses in the `Sequence` in order.",{"description":918,"annotation":919},null,{"name":860,"cls":814},{"type":738,"name":853,"path":921,"parent":744,"attributes":922,"classes":923},"unitelabs\u002Fbus\u002Ftesting\u002Fserial_device_mock.py",[860],[865],{"type":806,"name":865,"path":921,"parent":853,"description":925,"lines":926,"bases":929,"attributes":932,"functions":938,"mro":947},"A device mock implementation that simulates a serial connection.\n\nThis implementation uses `pty` to simulate a serial connection, and thus\nis not supported on Windows.",[927,928],11,80,[930],{"annotation":931},{"name":863,"cls":814},[933,934,935,936,937],"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",[939,940,941,942,943,944,945,946],"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",[865,863],{"type":891,"name":939,"path":921,"parent":865,"lines":949,"parameters":952},[950,951],19,27,[953,955],{"name":954,"kind":899,"required":902},"self",{"name":956,"kind":899,"annotation":957,"required":42,"default":964},"stubs",{"left":958,"slice":960},{"name":959,"cls":814},"typing.Optional",{"left":961,"slice":963},{"name":962,"cls":814},"list",{"name":860,"cls":814},"None",{"type":775,"name":933,"path":921,"parent":865,"lines":966,"value":968},[967,967],26,"threading.Event()",{"type":775,"name":934,"path":921,"parent":865,"lines":970,"value":971},[951,951],"threading.Thread(target=self.receive, daemon=True)",{"type":891,"name":940,"path":921,"parent":865,"lines":973,"parameters":975},[895,974],32,[976],{"name":954,"kind":899,"required":902},{"type":891,"name":941,"path":921,"parent":865,"lines":978,"parameters":981},[979,980],34,35,[982,983,985,987],{"name":954,"kind":899,"required":902},{"name":984,"kind":899,"required":902},"exc_type",{"name":986,"kind":899,"required":902},"exc_val",{"name":988,"kind":899,"required":902},"exc_tb",{"type":775,"name":935,"path":921,"parent":865,"lines":990,"value":964,"annotation":993},[991,992],38,39,{"name":994,"cls":814},"str",{"type":891,"name":942,"path":921,"parent":865,"lines":996,"parameters":999},[997,998],41,43,[1000],{"name":954,"kind":899,"required":902},{"type":891,"name":943,"path":921,"parent":865,"lines":1002,"parameters":1005},[1003,1004],45,59,[1006],{"name":954,"kind":899,"required":902},{"type":891,"name":944,"path":921,"parent":865,"lines":1008,"parameters":1011},[1009,1010],61,77,[1012],{"name":954,"kind":899,"required":902},{"type":891,"name":945,"path":921,"parent":865,"lines":1014,"parameters":1016},[1015,928],79,[1017,1018],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1020,"required":902},"data",{"name":901,"cls":814},{"type":738,"name":854,"path":1022,"parent":744,"attributes":1023,"classes":1024},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_transport.py",[860],[864],{"type":806,"name":864,"path":1022,"parent":854,"description":1026,"lines":1027,"bases":1029,"attributes":1033,"functions":1048,"mro":1085},"Mocks `Transport` functionality. Must provide either `stubs`\nor set `autorespond=True` to get responses.",[835,1028],115,[1030],{"annotation":1031},{"name":1032,"cls":814},"unitelabs.bus.transports.transport.Transport",[1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047],"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",[1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084],"unitelabs.bus.testing.mock_transport.MockTransport.__init__","unitelabs.bus.testing.mock_transport.MockTransport.write","unitelabs.bus.testing.mock_transport.MockTransport._add_to_queue","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",[864,1032,1086,1087,1088],"unitelabs.bus.transports.read_transport.ReadTransport","unitelabs.bus.transports.write_transport.WriteTransport","unitelabs.bus.transports.base_transport.BaseTransport",{"type":891,"name":1049,"path":1022,"parent":864,"lines":1090,"parameters":1093},[1091,1092],28,53,[1094,1095,1102,1108,1114],{"name":954,"kind":899,"required":902},{"name":956,"kind":899,"annotation":1096,"required":42,"default":964,"description":1101},{"left":1097,"slice":1098},{"name":959,"cls":814},{"left":1099,"slice":1100},{"name":962,"cls":814},{"name":860,"cls":814},"List of callable functions that return responses based matching to requests.",{"name":1103,"kind":899,"annotation":1104,"required":42,"default":964,"description":1107},"device",{"left":1105,"slice":1106},{"name":959,"cls":814},{"name":863,"cls":814},"A `DeviceMock` through which device communication will be mocked.",{"name":1109,"kind":899,"annotation":1110,"required":42,"default":1112,"description":1113},"autorespond",{"name":1111,"cls":814},"bool","False","Whether to return request bytes without checking `stubs`, i.e. loopback responses.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":1118},"**kwargs","variadic keyword","{}","Any additional `Transport` init kwargs.",{"type":775,"name":1034,"path":1022,"parent":864,"lines":1120,"value":1121},[992,992],"stubs or []",{"type":775,"name":1035,"path":1022,"parent":864,"lines":1123,"value":1103},[1124,1124],40,{"type":775,"name":1036,"path":1022,"parent":864,"lines":1126,"value":1109},[998,998],{"type":775,"name":1037,"path":1022,"parent":864,"lines":1128,"value":1130},[1129,1129],44,"queue.Queue()",{"type":775,"name":1038,"path":1022,"parent":864,"lines":1132,"value":1134},[1133,1133],46,"unittest.mock.Mock()",{"type":775,"name":1039,"path":1022,"parent":864,"lines":1136,"value":1138},[1137,1137],49,"kwargs",{"type":891,"name":1050,"path":1022,"parent":864,"lines":1140,"parameters":1143},[1141,1142],55,58,[1144,1145],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1146,"required":902},{"name":901,"cls":814},{"type":891,"name":1051,"path":1022,"parent":864,"description":1148,"lines":1149,"parameters":1152,"returns":1168},"Add a values to response `Queue`.",[1150,1151],60,85,[1153,1154],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":1156,"required":902,"description":1167},"response",{"left":1157,"slice":1158},{"name":959,"cls":814},{"left":1159,"slice":1160},{"name":908,"cls":814},{"elements":1161},[1162,1163],{"name":901,"cls":814},{"left":1164,"slice":1166},{"name":1165,"cls":814},"collections.abc.Generator",{"name":901,"cls":814},"The `Stub` response to add to the queue, if it is a `Generator`\nthen all values will be added to the queue in order.",{"description":1169,"annotation":1170},"`True` if a response was added to the queue, `False` otherwise.",{"name":1111,"cls":814},{"type":891,"name":1052,"path":1022,"parent":864,"lines":1172,"parameters":1175,"returns":1179},[1173,1174],87,105,[1176,1177],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1178,"required":902},{"name":901,"cls":814},{"description":918,"annotation":1180},{"name":1181,"cls":814},"int",{"type":891,"name":1053,"path":1022,"parent":864,"lines":1183,"parameters":1185,"returns":1187},[1184,1028],107,[1186],{"name":954,"kind":899,"required":902},{"description":918,"annotation":1188},{"left":1189,"slice":1190},{"name":959,"cls":814},{"name":901,"cls":814},{"type":738,"name":855,"path":1192,"parent":744,"attributes":1193,"classes":1195},"unitelabs\u002Fbus\u002Ftesting\u002Fudp_device_mock.py",[860,1194],"unitelabs.bus.testing.udp_device_mock.UDP_SERVER_ADDR",[866],{"type":775,"name":1194,"path":1192,"parent":855,"lines":1197,"value":1198},[827,827],"('127.0.0.1', 0)",{"type":806,"name":866,"path":1192,"parent":855,"lines":1200,"bases":1202,"attributes":1205,"functions":1212,"mro":1220},[835,1201],76,[1203],{"annotation":1204},{"name":863,"cls":814},[1206,1207,1208,1209,1210,1211,936,937],"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.socket","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.cancel","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.loop","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.host","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.port","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.address",[1213,1214,1215,1216,1217,1218,1219,946],"unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__init__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__enter__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.__exit__","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.open","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.close","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.receive","unitelabs.bus.testing.udp_device_mock.UDPDeviceMock.received",[866,863],{"type":891,"name":1213,"path":1192,"parent":866,"lines":1222,"parameters":1224},[836,1223],23,[1225,1226],{"name":954,"kind":899,"required":902},{"name":956,"kind":899,"annotation":1227,"required":42,"default":964},{"left":1228,"slice":1229},{"name":959,"cls":814},{"left":1230,"slice":1231},{"name":962,"cls":814},{"name":860,"cls":814},{"type":775,"name":1206,"path":1192,"parent":866,"lines":1233,"value":1234},[873,873],"socket.socket(socket.AF_INET, socket.SOCK_DGRAM)",{"type":775,"name":1207,"path":1192,"parent":866,"lines":1236,"value":968},[844,844],{"type":775,"name":1208,"path":1192,"parent":866,"lines":1238,"value":1240},[1239,1239],21,"asyncio.get_running_loop()",{"type":891,"name":1214,"path":1192,"parent":866,"lines":1242,"parameters":1244},[1243,951],25,[1245],{"name":954,"kind":899,"required":902},{"type":891,"name":1215,"path":1192,"parent":866,"lines":1247,"parameters":1249},[895,1248],30,[1250,1251,1252,1253],{"name":954,"kind":899,"required":902},{"name":984,"kind":899,"required":902},{"name":986,"kind":899,"required":902},{"name":988,"kind":899,"required":902},{"type":775,"name":1209,"path":1192,"parent":866,"lines":1255,"value":964,"annotation":1257},[1256,979],33,{"name":994,"cls":814},{"type":775,"name":1210,"path":1192,"parent":866,"lines":1259,"value":964,"annotation":1260},[778,991],{"name":1181,"cls":814},{"type":775,"name":1211,"path":1192,"parent":866,"lines":1262,"value":964,"annotation":1264},[997,1263],42,{"left":1265,"slice":1267},{"name":1266,"cls":814},"tuple",{"elements":1268},[1269,1270],{"name":994,"cls":814},{"name":1181,"cls":814},{"type":891,"name":1216,"path":1192,"parent":866,"lines":1272,"parameters":1274},[1129,1273],48,[1275],{"name":954,"kind":899,"required":902},{"type":891,"name":1217,"path":1192,"parent":866,"lines":1277,"parameters":1279},[1278,1092],50,[1280],{"name":954,"kind":899,"required":902},{"type":891,"name":1218,"path":1192,"parent":866,"lines":1282,"parameters":1284,"returns":1286},[1141,1283],73,[1285],{"name":954,"kind":899,"required":902},{"description":918,"annotation":1287},{"left":1288,"slice":1289},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":1219,"path":1192,"parent":866,"lines":1291,"parameters":1293},[1292,1201],75,[1294,1295,1297],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1296,"required":902},{"name":901,"cls":814},{"name":1298,"kind":899,"annotation":1299,"required":902},"client_addr",{"name":994,"cls":814},{"type":738,"name":856,"path":1301,"parent":744,"attributes":1302,"functions":1304},"unitelabs\u002Fbus\u002Ftesting\u002Fmock_factory.py",[1303,860],"unitelabs.bus.factories.transport_factory.P",[869],{"type":891,"name":869,"path":1301,"parent":856,"lines":1306,"parameters":1308,"returns":1327},[872,1307],20,[1309,1319,1326],{"name":1310,"kind":1311,"annotation":1312,"required":902},"protocol_factory","positional-only",{"left":1313,"slice":1315},{"name":1314,"cls":814},"typing.Callable",{"elements":1316},[1317,1318],"...",{"name":1303,"cls":814},{"name":956,"kind":1320,"annotation":1321,"required":42,"default":964},"keyword-only",{"left":1322,"slice":1323},{"name":959,"cls":814},{"left":1324,"slice":1325},{"name":962,"cls":814},{"name":860,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":1328},{"left":1329,"slice":1330},{"name":1266,"cls":814},{"elements":1331},[1332,1333],{"name":864,"cls":814},{"name":1303,"cls":814},{"type":738,"name":857,"path":1335,"parent":744,"attributes":1336,"classes":1337},"unitelabs\u002Fbus\u002Ftesting\u002Fdevice_mock.py",[860],[863],{"type":806,"name":863,"path":1335,"parent":857,"description":1339,"lines":1340,"bases":1342,"attributes":1346,"functions":1347,"mro":1349},"Abstract base class to mock devices (hardware or software components) for\ntesting purposes.",[827,1341],62,[1343],{"annotation":1344},{"name":1345,"cls":814},"contextlib.AbstractContextManager",[936,937],[1348,946],"unitelabs.bus.testing.device_mock.DeviceMock.__init__",[863],{"type":891,"name":1348,"path":1335,"parent":863,"lines":1351,"parameters":1353},[1223,1352],24,[1354,1355],{"name":954,"kind":899,"required":902},{"name":956,"kind":899,"annotation":1356,"required":42,"default":964,"description":1361},{"left":1357,"slice":1358},{"name":959,"cls":814},{"left":1359,"slice":1360},{"name":962,"cls":814},{"name":860,"cls":814},"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":775,"name":936,"path":1335,"parent":863,"lines":1363,"value":964,"annotation":1364},[951,1091],{"left":1365,"slice":1366},{"name":962,"cls":814},{"name":860,"cls":814},{"type":775,"name":937,"path":1335,"parent":863,"description":1368,"lines":1369,"value":964,"annotation":1370},"A standard python logger available to debug device mocks.",[980,991],{"name":1371,"cls":814},"logging.Logger",{"type":891,"name":946,"path":1335,"parent":863,"description":1373,"lines":1374,"parameters":1375,"returns":1380},"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.",[1124,1341],[1376,1377],{"name":954,"kind":899,"required":902},{"name":898,"kind":899,"annotation":1378,"required":902,"description":1379},{"name":901,"cls":814},"The request sent to the hardware.",{"description":1381,"annotation":1382},"The response corresponding to the received request.",{"left":1383,"slice":1384},{"name":959,"cls":814},{"left":1385,"slice":1386},{"name":1165,"cls":814},{"name":901,"cls":814},{"type":738,"name":858,"path":1388,"parent":744,"description":1389,"functions":1390},"unitelabs\u002Fbus\u002Ftesting\u002Ffixtures.py","Pytest plugin for testing using `unitelabs.bus`. Can be integrated into your testing infrastructure\nby adding `pytest_plugins = [\"unitelabs.bus.testing.fixtures\"]` to your `conftest.py`.",[868,869,1391,1392,1393,1394,1395,1396],"unitelabs.bus.testing.fixtures.mock_factory","unitelabs.bus.testing.fixtures.serial_device","unitelabs.bus.testing.fixtures.udp_device","unitelabs.bus.testing.fixtures.mk_partial_protocol","unitelabs.bus.testing.fixtures.mk_stubbed_protocol","unitelabs.bus.testing.fixtures.protocol",{"type":891,"name":1391,"path":1388,"parent":858,"description":1398,"lines":1399,"decorators":1400,"parameters":1402,"returns":1405},"Returns `create_mock_connection` function that uses `pytest-asyncio` event-loop fixture\nto ensure no global loop exists.",[1223,1248],[1401],"pytest.fixture",[1403],{"name":1404,"kind":899,"required":902},"event_loop",{"description":918,"annotation":1406},{"name":764,"cls":814},{"type":891,"name":1392,"path":1388,"parent":858,"lines":1408,"decorators":1409,"returns":1410},[1256,778],[1401],{"description":918,"annotation":1411},{"left":1412,"slice":1414},{"name":1413,"cls":814},"typing.AsyncGenerator",{"elements":1415},[1416,964],{"name":865,"cls":814},{"type":891,"name":1393,"path":1388,"parent":858,"lines":1418,"decorators":1419,"returns":1420},[1124,1129],[1401],{"description":918,"annotation":1421},{"left":1422,"slice":1423},{"name":1413,"cls":814},{"elements":1424},[1425,964],{"name":866,"cls":814},{"type":891,"name":1394,"path":1388,"parent":858,"description":1427,"lines":1428,"decorators":1431,"parameters":1432,"returns":1435,"examples":1454},"Utility function that returns a partial object of the `Protocol` class. If the `Protocol` class\nhas `transport_factory` as an __init__ parameter, a partial of the `transport_factory` will be created with `**kwargs`\nand set on the `protocol`, otherwise the `protocol` is returned without setting the `transport`.",[1429,1430],47,100,[1401],[1433],{"name":1434,"kind":899,"required":902},"mock_factory",{"description":1436,"annotation":1437},"A function that accepts a `Protocol` class and a `TransportFactory` function and returns a callable partial of the `Protocol` class.",{"left":1438,"slice":1439},{"name":1314,"cls":814},{"elements":1440},[1441,1448],{"elements":1442},[1443,1447],{"left":1444,"slice":1446},{"name":1445,"cls":814},"type",{"name":765,"cls":814},{"name":764,"cls":814},{"left":1449,"slice":1450},{"name":1314,"cls":814},{"elements":1451},[1452,1453],{},{"name":765,"cls":814},[1455,1458,1461],{"description":1456,"code":1457},"Create an instance of `MyProtocol` with a `SerialTransport`.",">>> kwargs = {\"port\": \"\u002Fdev\u002FttyUSB0\"}\n>>> protocol_factory = mk_partial_protocol(MyProtocol, create_serial_connection, **kwargs)\n>>> protocol = protocol_factory()",{"description":1459,"code":1460},"Use default `MockTransport` as `transport_factory`.",">>> protocol_factory = mk_partial_protocol(MyProtocol)\n>>> protocol = protocol_factory()",{"description":1462,"code":1463},"Use with a protocol that lacks `transport_factory` parameter;\nmust set `_transport_factory` and `_transport_kwargs` on protocol.",">>> protocol_factory = mk_partial_protocol(MyOtherProtocol, **kwargs)\n>>> protocol = protocol_factory()\n>>> protocol._transport_factory = functools.partial(create_mock_connection, **kwargs)\n>>> protocol._transport_kwargs = kwargs",{"type":891,"name":1395,"path":1388,"parent":858,"description":1465,"lines":1466,"decorators":1469,"parameters":1470,"returns":1474},"Create an opened instance of `protocol` configured with `data` to mock\ndevice responses.",[1467,1468],103,154,[1401],[1471,1472],{"name":1434,"kind":899,"required":902},{"name":1473,"kind":899,"required":902},"mk_partial_protocol",{"description":918,"annotation":1475},{"left":1476,"slice":1477},{"name":1314,"cls":814},{"elements":1478},[1479,1507],{"elements":1480},[1481,1484,1500],{"left":1482,"slice":1483},{"name":1445,"cls":814},{"name":765,"cls":814},{"left":1485,"slice":1486},{"name":959,"cls":814},{"left":1487,"slice":1489},{"name":1488,"cls":814},"dict",{"elements":1490},[1491,1492],{"name":901,"cls":814},{"left":1493,"slice":1494},{"name":908,"cls":814},{"elements":1495},[1496,1497],{"name":901,"cls":814},{"left":1498,"slice":1499},{"name":914,"cls":814},{"name":901,"cls":814},{"left":1501,"slice":1502},{"name":1488,"cls":814},{"elements":1503},[1504,1505],{"name":994,"cls":814},{"name":1506,"cls":814},"typing.Any",{"name":765,"cls":814},{"type":891,"name":1396,"path":1388,"parent":858,"description":1509,"lines":1510,"decorators":1513,"parameters":1514},"A pytest fixture that provides an opened instance of the `Protocol` class,\ninitialized with customizable parameters. The `Protocol` instance will\nautomatically  be cleaned up after use.\n\nExamples:\n1. Using the fixture with default parameters:\n>>> async def test_with_default_protocol(protocol: Protocol):\n>>>     assert protocol is not None\n\n2. Parameterizing the fixture to customize `Protocol` initialization:\n>>> @pytest.mark.parametrize(\"protocol\", [{\"max_reconnect_attempts\": 2}], indirect=[\"protocol\"])\n>>> async def test_with_custom_protocol(protocol: Protocol):\n>>>     assert protocol.max_reconnect_attempts == 2",[1511,1512],157,181,[1401],[1515],{"name":898,"kind":899,"annotation":1516,"required":902},{"name":1517,"cls":814},"pytest.FixtureRequest",{"type":738,"name":745,"path":1519,"parent":739,"packages":1520,"attributes":1522,"classes":1524},"unitelabs\u002Fbus\u002Fprotocols\u002F__init__.py",[1521],"unitelabs.bus.protocols.protocol",[1523],"unitelabs.bus.protocols.__all__",[765],{"type":775,"name":1523,"path":1519,"parent":745,"lines":1526,"value":1528},[1527,1527],3,[780],{"type":738,"name":1521,"path":1530,"parent":745,"attributes":1531,"classes":1538},"unitelabs\u002Fbus\u002Fprotocols\u002Fprotocol.py",[1532,1533,1534,1535,1536,1537],"unitelabs.bus.commands.command.InType","unitelabs.bus.commands.command.OutType","unitelabs.bus.protocols.protocol.DEFAULT_RECONNECT_DELAY","unitelabs.bus.commands.command.ResType","unitelabs.bus.protocols.protocol.DEFAULT_MAX_RECONNECT_ATTEMPTS","unitelabs.bus.protocols.protocol.DEFAULT_MAX_PARALLEL_COMMANDS",[765],{"type":775,"name":1534,"path":1530,"parent":1521,"lines":1540,"value":1541},[836,836],"20.0",{"type":775,"name":1536,"path":1530,"parent":1521,"lines":1543,"value":1544},[777,777],"3",{"type":775,"name":1537,"path":1530,"parent":1521,"lines":1546,"value":1547},[873,873],"1",{"type":806,"name":765,"path":1530,"parent":1521,"description":1549,"lines":1550,"bases":1552,"attributes":1556,"functions":1574,"mro":1590},"Base communication Protocol.",[950,1551],368,[1553],{"annotation":1554},{"name":1555,"cls":814},"asyncio.Protocol",[1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573],"unitelabs.bus.protocols.protocol.Protocol.transport","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.lock","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",[1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589],"unitelabs.bus.protocols.protocol.Protocol.__init__","unitelabs.bus.protocols.protocol.Protocol.connect","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.datagram_received","unitelabs.bus.protocols.protocol.Protocol.error_received","unitelabs.bus.protocols.protocol.Protocol.execute",[765],{"type":891,"name":1575,"path":1530,"parent":765,"lines":1592,"parameters":1595},[1593,1594],36,70,[1596,1597,1601,1606,1612,1617,1621,1626],{"name":954,"kind":899,"required":902},{"name":1598,"kind":899,"annotation":1599,"required":902,"description":1600},"transport_factory",{"name":764,"cls":814},"A callable used to create a connection to a transport.",{"name":1602,"kind":899,"annotation":1603,"required":42,"default":1604,"description":1605},"reconnect",{"name":1111,"cls":814},"True","Whether or not to a attempt to reconnect to a device when the connection is lost.",{"name":1607,"kind":899,"annotation":1608,"required":42,"default":1610,"description":1611},"reconnect_delay",{"name":1609,"cls":814},"float",{"name":1534,"cls":814},"How long in seconds to wait between reconnection attempts.",{"name":1613,"kind":899,"annotation":1614,"required":42,"default":1615,"description":1616},"max_reconnect_attempts",{"name":1181,"cls":814},{"name":1536,"cls":814},"How many times to attempt to reconnect to a device before\nconnection is considered lost.",{"name":1618,"kind":899,"annotation":1619,"required":42,"default":1112,"description":1620},"autodetect",{"name":1111,"cls":814},"Whether or not to use autodetection for device connectivity.",{"name":1622,"kind":899,"annotation":1623,"required":42,"default":1624,"description":1625},"max_parallel_commands",{"name":1181,"cls":814},{"name":1537,"cls":814},"The maximum number of commands to process in parallel.\nThis should be 1 for serial transports, but can be configured to allow more\ndepending on the processing capacity of alternative transports.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":1627},"additional kwargs, including kwargs for use with `TransportFactory`.",{"type":775,"name":1557,"path":1530,"parent":765,"lines":1629,"value":964,"annotation":1630},[1133,1133],{"left":1631,"slice":1632},{"name":959,"cls":814},{"name":1633,"cls":814},"asyncio.Transport",{"type":775,"name":1558,"path":1530,"parent":765,"lines":1635,"value":1604},[1273,1273],{"type":775,"name":1559,"path":1530,"parent":765,"lines":1637,"value":1598},[1137,1137],{"type":775,"name":1560,"path":1530,"parent":765,"lines":1639,"value":1138},[1278,1278],{"type":775,"name":1561,"path":1530,"parent":765,"lines":1641,"value":1643,"annotation":1644},[1642,1642],52,"[]",{"left":1645,"slice":1646},{"name":962,"cls":814},{"name":754,"cls":814},{"type":775,"name":1562,"path":1530,"parent":765,"lines":1648,"value":1649},[1092,1092],"asyncio.BoundedSemaphore(value=max_parallel_commands)",{"type":775,"name":1563,"path":1530,"parent":765,"lines":1651,"value":1653},[1652,1652],56,"asyncio.Event()",{"type":775,"name":1564,"path":1530,"parent":765,"lines":1655,"value":1618},[1004,1004],{"type":775,"name":1565,"path":1530,"parent":765,"lines":1657,"value":964},[1150,1150],{"type":775,"name":1566,"path":1530,"parent":765,"lines":1659,"value":964},[1660,1660],63,{"type":775,"name":1567,"path":1530,"parent":765,"lines":1662,"value":1653},[1663,1663],64,{"type":775,"name":1568,"path":1530,"parent":765,"lines":1665,"value":1602},[1666,1666],67,{"type":775,"name":1569,"path":1530,"parent":765,"lines":1668,"value":1607},[1669,1669],68,{"type":775,"name":1570,"path":1530,"parent":765,"lines":1671,"value":1613},[1672,1672],69,{"type":775,"name":1571,"path":1530,"parent":765,"lines":1674,"value":1613},[1594,1594],{"type":775,"name":1572,"path":1530,"parent":765,"description":1676,"lines":1677,"value":964,"annotation":1678},"A standard python logger.",[1283,1201],{"name":1371,"cls":814},{"type":775,"name":1573,"path":1530,"parent":765,"lines":1680,"value":964,"annotation":1682},[1015,1681],83,{"name":1683,"cls":814},"unitelabs.bus.utils.autodetect.AutoDetector",{"type":891,"name":1576,"path":1530,"parent":765,"description":1685,"lines":1686,"parameters":1688,"returns":1698},"Open a connection to a new `Transport`. Closes the old connection, if it exists,\nbefore opening the new connection.",[1151,1687],109,[1689,1690,1695],{"name":954,"kind":899,"required":902},{"name":1598,"kind":899,"annotation":1691,"required":42,"default":964,"description":1694},{"left":1692,"slice":1693},{"name":959,"cls":814},{"name":764,"cls":814},"A callable used to create a connection to a transport, defaults to `self._transport_factory`,\nset from the constructor.",{"name":1696,"kind":1116,"required":42,"default":1117,"description":1697},"**transport_kwargs","Kwargs to pass into the `transport_factory`.",{"description":1699,"annotation":1700},"A tuple containing the `TransportFactory` and kwargs for the previously connected `Transport`.",{"left":1701,"slice":1703},{"name":1702,"cls":814},"typing.Tuple",{"elements":1704},[1705,1706],{"name":764,"cls":814},{"left":1707,"slice":1708},{"name":1488,"cls":814},{"elements":1709},[1710,1711],{"name":994,"cls":814},{"name":1506,"cls":814},{"type":891,"name":1577,"path":1530,"parent":765,"description":1713,"lines":1714,"parameters":1717},"Create a new transport instance.",[1715,1716],111,117,[1718,1719],{"name":954,"kind":899,"required":902},{"name":1115,"kind":1116,"required":42,"default":1117},{"type":891,"name":1578,"path":1530,"parent":765,"description":1721,"lines":1722,"parameters":1725,"returns":1730,"throws":1733,"examples":1738},"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`.",[1723,1724],119,149,[1726,1727],{"name":954,"kind":899,"required":902},{"name":1728,"kind":1116,"required":42,"default":1117,"description":1729},"**config_kwargs","kwargs sent from `validate`",{"description":1731,"annotation":1732},"True if the result of the inner call matches the expectation from `config_kwargs` else False.",{"name":1111,"cls":814},[1734],{"description":1735,"annotation":1736},"if `autodetect=True` and `identity` is not implemented.",{"name":1737,"cls":814},"NotImplementedError",[1739],{"description":734,"code":1740},">>> 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":891,"name":1579,"path":1530,"parent":765,"description":1742,"lines":1743,"parameters":1746,"returns":1755,"examples":1758},"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.",[1744,1745],151,193,[1747,1748,1752],{"name":954,"kind":899,"required":902},{"name":1749,"kind":899,"annotation":1750,"required":902,"description":1751},"timeout",{"name":1609,"cls":814},"How long in seconds to wait for a response from the device.",{"name":1753,"kind":1116,"required":42,"default":1117,"description":1754},"**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":1756,"annotation":1757},"Propagated return value from `identity`; True if `identity` returns True else False",{"name":1111,"cls":814},[1759],{"description":734,"code":1760},">>> p = Protocol(t:TransportFactory, **kwargs)  # kwargs passed to `Protocol` p and `Transport` t\n>>> p.open(**config_kwargs)                     # user-parsed config variables set",{"type":891,"name":1580,"path":1530,"parent":765,"description":1762,"lines":1763,"parameters":1766},"Open underlying `Transport`, establish a connection to a device and validate the device's identity.",[1764,1765],195,213,[1767,1768,1773],{"name":954,"kind":899,"required":902},{"name":1769,"kind":899,"annotation":1770,"required":42,"default":1771,"description":1772},"validation_timeout",{"name":1609,"cls":814},"1.0","How long in seconds to wait for a response to `Protocol.validate`.",{"name":1753,"kind":1116,"required":42,"default":1117,"description":1774},"kwargs to be passed to `Protocol.validate` to test device identity against.",{"type":891,"name":1581,"path":1530,"parent":765,"description":1776,"lines":1777,"parameters":1780},"Close underlying `Transport`.\nExplicitly calling `close` will NOT attempt to reconnect to the `Transport`.",[1778,1779],215,223,[1781],{"name":954,"kind":899,"required":902},{"type":891,"name":1582,"path":1530,"parent":765,"description":1783,"lines":1784,"parameters":1787},"Invoked by `transport` when connection is made. Logs the connection.",[1785,1786],225,232,[1788,1789],{"name":954,"kind":899,"required":902},{"name":1790,"kind":899,"annotation":1791,"required":902},"transport",{"name":1633,"cls":814},{"type":891,"name":1583,"path":1530,"parent":765,"description":1793,"lines":1794,"parameters":1797},"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",[1795,1796],234,261,[1798,1799],{"name":954,"kind":899,"required":902},{"name":1800,"kind":899,"annotation":1801,"required":42,"default":964},"exc",{"left":1802,"slice":1803},{"name":959,"cls":814},{"name":831,"cls":814},{"type":891,"name":1584,"path":1530,"parent":765,"lines":1805,"parameters":1808},[1806,1807],263,264,[1809],{"name":954,"kind":899,"required":902},{"type":891,"name":1585,"path":1530,"parent":765,"lines":1811,"parameters":1814},[1812,1813],266,267,[1815],{"name":954,"kind":899,"required":902},{"type":891,"name":1586,"path":1530,"parent":765,"description":1817,"lines":1818,"parameters":1821},"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.",[1819,1820],269,282,[1822,1823],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1824,"required":902,"description":1825},{"name":901,"cls":814},"The data received.",{"type":891,"name":1587,"path":1530,"parent":765,"description":1827,"lines":1828,"parameters":1831},"Invoked by transport when a datagram is received.",[1829,1830],284,293,[1832,1833,1836],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":1834,"required":902,"description":1835},{"name":901,"cls":814},"The datagram data received.",{"name":1837,"kind":899,"annotation":1838,"required":902,"description":1844},"addr",{"left":1839,"slice":1840},{"name":1266,"cls":814},{"elements":1841},[1842,1843],{"name":994,"cls":814},{"name":1181,"cls":814},"The address of the sender.",{"type":891,"name":1588,"path":1530,"parent":765,"description":1846,"lines":1847,"parameters":1850},"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.",[1848,1849],295,307,[1851,1852],{"name":954,"kind":899,"required":902},{"name":1800,"kind":899,"annotation":1853,"required":902,"description":1861},{"left":1854,"slice":1855},{"name":908,"cls":814},{"elements":1856},[1857,1858],{"name":831,"cls":814},{"left":1859,"slice":1860},{"name":1445,"cls":814},{"name":831,"cls":814},"The error received.",{"type":891,"name":1589,"path":1530,"parent":765,"description":1863,"lines":1864,"parameters":1866,"returns":1878,"throws":1881,"examples":1889},"Executes a `Command` by sending the `Request` within the `Command` to the `Transport`.",[1865,1551],309,[1867,1868],{"name":954,"kind":899,"required":902},{"name":1869,"kind":899,"annotation":1870,"required":902,"description":1877},"command",{"left":1871,"slice":1872},{"name":754,"cls":814},{"elements":1873},[1874,1875,1876],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":1535,"cls":814},"The `Command` to be executed.",{"description":1879,"annotation":1880},"The deserialized response, created by `command.result()` or None if `Command.is_void` is True.",{"name":1535,"cls":814},[1882,1885],{"description":1883,"annotation":1884},"If the transport is not open, does not currently allow writing, or\nis busy processing and cannot accept more work at the moment.",{"name":760,"cls":814},{"description":1886,"annotation":1887},"If the response is not received within the specified timeout.",{"name":1888,"cls":814},"TimeoutError",[1890,1893],{"description":1891,"code":1892},"Use with a single command.",">>> response = await protocol.execute(ByteCommand(b\"test\"))",{"description":1894,"code":1895},"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>>>   *[protocol.execute(ByteCommand(req)) for req in [b\"test1\", b\"test2\"]],\n>>>   return_exceptions=True,\n>>> )",{"type":738,"name":746,"path":1897,"parent":739,"packages":1898,"attributes":1901,"classes":1903},"unitelabs\u002Fbus\u002Futils\u002F__init__.py",[1899,1900],"unitelabs.bus.utils.device_manager","unitelabs.bus.utils.autodetect",[1902],"unitelabs.bus.utils.__all__",[1683,1904,768],"unitelabs.bus.utils.device_manager.DeviceInfo",{"type":775,"name":1902,"path":1897,"parent":746,"lines":1906,"value":1907},[888,888],[1908,795,1909],"AutoDetector","DeviceInfo",{"type":738,"name":1899,"path":1911,"parent":746,"attributes":1912,"classes":1914},"unitelabs\u002Fbus\u002Futils\u002Fdevice_manager.py",[1913],"unitelabs.bus.utils.device_manager.devices",[1904,1915,768],"unitelabs.bus.utils.device_manager.DeviceManager",{"type":806,"name":1904,"path":1911,"parent":1899,"description":1917,"lines":1918,"decorators":1919,"attributes":1921,"functions":1933,"mro":1937},"Translation of `serial.tools.list_ports.ListPortInfo` for unified interface between USB and Serial `DeviceManagers`.\nAttrs here represent valid filter criteria during device search.",[894,1593],[1920],"dataclasses.dataclass",[1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932],"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",[1934,1935,1936],"unitelabs.bus.utils.device_manager.DeviceInfo.__init__","unitelabs.bus.utils.device_manager.DeviceInfo.__post_init__","unitelabs.bus.utils.device_manager.DeviceInfo.__repr__",[1904],{"type":775,"name":1922,"path":1911,"parent":1904,"description":1939,"lines":1940,"value":964,"annotation":1941},"Port path",[836,836],{"name":994,"cls":814},{"type":775,"name":1923,"path":1911,"parent":1904,"lines":1943,"value":964,"annotation":1944},[873,873],{"name":994,"cls":814},{"type":775,"name":1924,"path":1911,"parent":1904,"lines":1946,"value":964,"annotation":1947},[843,843],{"left":1948,"slice":1949},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1925,"path":1911,"parent":1904,"lines":1951,"value":964,"annotation":1952},[950,950],{"left":1953,"slice":1954},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1926,"path":1911,"parent":1904,"description":1956,"lines":1957,"value":964,"annotation":1958},"Vendor identifier",[1307,1307],{"left":1959,"slice":1960},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1927,"path":1911,"parent":1904,"description":1962,"lines":1963,"value":964,"annotation":1965},"Product identifier",[1964,1964],22,{"left":1966,"slice":1967},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1928,"path":1911,"parent":1904,"lines":1969,"value":964,"annotation":1970},[1352,1352],{"left":1971,"slice":1972},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1929,"path":1911,"parent":1904,"lines":1974,"value":964,"annotation":1975},[1243,1243],{"left":1976,"slice":1977},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1930,"path":1911,"parent":1904,"lines":1979,"value":964,"annotation":1980},[967,967],{"left":1981,"slice":1982},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1931,"path":1911,"parent":1904,"lines":1984,"value":964,"annotation":1985},[951,951],{"left":1986,"slice":1987},{"name":959,"cls":814},{"name":994,"cls":814},{"type":775,"name":1932,"path":1911,"parent":1904,"lines":1989,"value":964,"annotation":1990},[1091,1091],{"left":1991,"slice":1992},{"name":959,"cls":814},{"name":994,"cls":814},{"type":891,"name":1935,"path":1911,"parent":1904,"lines":1994,"parameters":1995},[1248,1256],[1996],{"name":954,"kind":899,"required":902},{"type":891,"name":1936,"path":1911,"parent":1904,"lines":1998,"parameters":1999},[980,1593],[2000],{"name":954,"kind":899,"required":902},{"type":891,"name":1934,"path":1911,"parent":1904,"lines":2002,"parameters":2004},[2003,2003],0,[2005,2006,2008,2011,2016,2021,2026,2031,2036,2041,2046,2051],{"name":954,"kind":899,"required":902},{"name":1103,"kind":899,"annotation":2007,"required":902},{"name":994,"cls":814},{"name":2009,"kind":899,"annotation":2010,"required":902},"name",{"name":994,"cls":814},{"name":2012,"kind":899,"annotation":2013,"required":42,"default":964},"description",{"left":2014,"slice":2015},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2017,"kind":899,"annotation":2018,"required":42,"default":964},"hwid",{"left":2019,"slice":2020},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2022,"kind":899,"annotation":2023,"required":42,"default":964},"vid",{"left":2024,"slice":2025},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2027,"kind":899,"annotation":2028,"required":42,"default":964},"pid",{"left":2029,"slice":2030},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2032,"kind":899,"annotation":2033,"required":42,"default":964},"serial_number",{"left":2034,"slice":2035},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2037,"kind":899,"annotation":2038,"required":42,"default":964},"location",{"left":2039,"slice":2040},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2042,"kind":899,"annotation":2043,"required":42,"default":964},"manufacturer",{"left":2044,"slice":2045},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2047,"kind":899,"annotation":2048,"required":42,"default":964},"product",{"left":2049,"slice":2050},{"name":959,"cls":814},{"name":994,"cls":814},{"name":2052,"kind":899,"annotation":2053,"required":42,"default":964},"interface",{"left":2054,"slice":2055},{"name":959,"cls":814},{"name":994,"cls":814},{"type":806,"name":1915,"path":1911,"parent":1899,"description":2057,"lines":2058,"functions":2059,"mro":2064},"Detect, filter, and get info for connected devices.",[992,1652],[2060,2061,2062,2063],"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",[1915],{"type":891,"name":2060,"path":1911,"parent":1915,"lines":2066,"decorators":2067,"parameters":2070,"returns":2081},[1263,1129],[2068,2069],"classmethod","abc.abstractmethod",[2071,2073],{"name":2072,"kind":899,"required":902},"cls",{"name":1138,"kind":899,"annotation":2074,"required":902},{"left":2075,"slice":2077},{"name":2076,"cls":814},"typing.Dict",{"elements":2078},[2079,2080],{"name":994,"cls":814},{"name":994,"cls":814},{"description":918,"annotation":2082},{"left":2083,"slice":2084},{"name":2076,"cls":814},{"elements":2085},[2086,2087],{"name":994,"cls":814},{"name":994,"cls":814},{"type":891,"name":2061,"path":1911,"parent":1915,"lines":2089,"decorators":2090,"parameters":2091,"returns":2093},[1133,1273],[2068,2069],[2092],{"name":2072,"kind":899,"required":902},{"description":918,"annotation":2094},{"left":2095,"slice":2096},{"name":962,"cls":814},{"name":1904,"cls":814},{"type":891,"name":2062,"path":1911,"parent":1915,"lines":2098,"decorators":2099,"parameters":2100,"returns":2106},[1278,1642],[2068,2069],[2101,2102,2105],{"name":2072,"kind":899,"required":902},{"name":2103,"kind":899,"annotation":2104,"required":902},"device_info",{"name":1904,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":2107},{"name":1111,"cls":814},{"type":891,"name":2063,"path":1911,"parent":1915,"lines":2109,"decorators":2111,"parameters":2112,"returns":2115},[2110,1652],54,[2068,2069],[2113,2114],{"name":2072,"kind":899,"required":902},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":2116},{"left":2117,"slice":2118},{"name":962,"cls":814},{"name":1904,"cls":814},{"type":806,"name":768,"path":1911,"parent":1899,"description":2120,"lines":2121,"bases":2123,"attributes":2126,"functions":2128,"mro":2133},"Detect, filter, and get info for connected serial devices.",[1004,2122],153,[2124],{"annotation":2125},{"name":1915,"cls":814},[2127],"unitelabs.bus.utils.device_manager.SerialDeviceManager.SERIAL_SEARCH_KEYS",[2129,2130,2131,2132],"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",[768,1915],{"type":775,"name":2127,"path":1911,"parent":768,"lines":2135,"value":2136},[1663,1010],"['device', 'name', 'description', 'hwid', 'vid', 'pid', 'serial_number', 'location', 'manufacturer', 'product', 'interface']",{"type":891,"name":2129,"path":1911,"parent":768,"description":2138,"lines":2139,"decorators":2141,"parameters":2142,"returns":2152},"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`.",[1015,2140],93,[2068],[2143,2144],{"name":2072,"kind":899,"required":902},{"name":1138,"kind":899,"annotation":2145,"required":902,"description":2151},{"left":2146,"slice":2147},{"name":1488,"cls":814},{"elements":2148},[2149,2150],{"name":994,"cls":814},{"name":994,"cls":814},"A dictionary of key-value pairs to filter.",{"description":2153,"annotation":2154},"The filtered dictionary.",{"left":2155,"slice":2156},{"name":1488,"cls":814},{"elements":2157},[2158,2159],{"name":994,"cls":814},{"name":994,"cls":814},{"type":891,"name":2130,"path":1911,"parent":768,"description":2161,"lines":2162,"decorators":2165,"parameters":2166,"returns":2168},"Get all connected devices.",[2163,2164],95,108,[2068],[2167],{"name":2072,"kind":899,"required":902},{"description":2169,"annotation":2170},"A list of all devices detected.",{"left":2171,"slice":2172},{"name":962,"cls":814},{"name":1904,"cls":814},{"type":891,"name":2131,"path":1911,"parent":768,"description":2174,"lines":2175,"decorators":2178,"parameters":2179,"returns":2186},"Determine if the `DeviceInfo` instance's attributes match the filter `**kwargs`",[2176,2177],110,131,[2068],[2180,2181,2184],{"name":2072,"kind":899,"required":902},{"name":2103,"kind":899,"annotation":2182,"required":902,"description":2183},{"name":1904,"cls":814},"The device to check for a match against.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":2185},"The key-value pairs, which will be filtered, and then used to evaluate the device for a match.",{"description":2187,"annotation":2188},"True if the `DeviceInfo` matches (or no kwargs provided, or all kwargs have been filtered), else False.",{"name":1111,"cls":814},{"type":891,"name":2132,"path":1911,"parent":768,"description":2190,"lines":2191,"decorators":2193,"parameters":2194,"returns":2198},"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.",[2192,2122],133,[2068],[2195,2196],{"name":2072,"kind":899,"required":902},{"name":1115,"kind":1116,"required":42,"default":1117,"description":2197},"Search criteria for finding a device.",{"description":2199,"annotation":2200},"A list of devices which match all `**kwargs` provided.",{"left":2201,"slice":2202},{"name":962,"cls":814},{"name":1904,"cls":814},{"type":775,"name":1913,"path":1911,"parent":1899,"lines":2204,"value":2205},[1511,1511],"SerialDeviceManager().get_all()",{"type":738,"name":1900,"path":2207,"parent":746,"classes":2208},"unitelabs\u002Fbus\u002Futils\u002Fautodetect.py",[2209,1683],"unitelabs.bus.utils.autodetect.TransportType",{"type":806,"name":2209,"path":2207,"parent":1900,"lines":2211,"bases":2212,"attributes":2216,"mro":2220},[777,844],[2213],{"annotation":2214},{"name":2215,"cls":814},"enum.Enum",[2217,2218,2219],"unitelabs.bus.utils.autodetect.TransportType.serial","unitelabs.bus.utils.autodetect.TransportType.usb","unitelabs.bus.utils.autodetect.TransportType.unknown",[2209],{"type":775,"name":2217,"path":2207,"parent":2209,"lines":2222,"value":2223},[873,873],"enum.auto()",{"type":775,"name":2218,"path":2207,"parent":2209,"lines":2225,"value":2223},[843,843],{"type":775,"name":2219,"path":2207,"parent":2209,"lines":2227,"value":2223},[844,844],{"type":806,"name":1683,"path":2207,"parent":1900,"description":2229,"lines":2230,"attributes":2232,"functions":2242,"mro":2249},"This class is used by the `unitelabs.bus.Protocol` to cycle through possible devices until the correct device is found.",[1239,2231],148,[2233,2234,2235,2236,2237,2238,2239,2240,2241],"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",[2243,2244,2245,2246,2247,2248],"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",[1683],{"type":775,"name":2233,"path":2207,"parent":1683,"lines":2251,"value":964,"annotation":2252},[1248,1248],{"name":2209,"cls":814},{"type":891,"name":2243,"path":2207,"parent":1683,"lines":2254,"parameters":2255},[974,997],[2256,2257,2261],{"name":954,"kind":899,"required":902},{"name":2258,"kind":899,"annotation":2259,"required":902,"description":2260},"protocol",{"name":765,"cls":814},"The `unitelabs.bus.Protocol` instance to use.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":2262},"Kwargs used to initialize the `Protocol` instance, which contains `Transport` init kwargs.",{"type":775,"name":2234,"path":2207,"parent":1683,"lines":2264,"value":2258},[1256,1256],{"type":775,"name":2235,"path":2207,"parent":1683,"lines":2266,"value":1138},[979,979],{"type":775,"name":2236,"path":2207,"parent":1683,"lines":2268,"value":964},[1593,1593],{"type":775,"name":2237,"path":2207,"parent":1683,"lines":2270,"value":1138},[778,778],{"type":775,"name":2238,"path":2207,"parent":1683,"lines":2272,"value":1112},[992,992],{"type":891,"name":2244,"path":2207,"parent":1683,"description":2274,"lines":2275,"parameters":2276},"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`.",[998,2110],[2277],{"name":954,"kind":899,"required":902},{"type":775,"name":2239,"path":2207,"parent":1683,"lines":2279,"value":964,"annotation":2281},[2280,1142],57,{"name":1371,"cls":814},{"type":775,"name":2240,"path":2207,"parent":1683,"lines":2283,"value":964,"annotation":2284},[1009,1663],{"left":2285,"slice":2286},{"name":1445,"cls":814},{"name":1915,"cls":814},{"type":891,"name":2245,"path":2207,"parent":1683,"description":2288,"lines":2289,"parameters":2292,"returns":2294},"Get the correct `DeviceManager` based on the `TransportType`.",[2290,2291],66,72,[2293],{"name":954,"kind":899,"required":902},{"description":918,"annotation":2295},{"left":2296,"slice":2297},{"name":1445,"cls":814},{"name":1915,"cls":814},{"type":775,"name":2241,"path":2207,"parent":1683,"description":2299,"lines":2300,"value":964,"annotation":2301},"Whether or not we are currently trying to connect to a device",[1292,1010],{"name":1111,"cls":814},{"type":891,"name":2246,"path":2207,"parent":1683,"description":2303,"lines":2304,"parameters":2305},"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`.",[1015,1687],[2306,2307,2310],{"name":954,"kind":899,"required":902},{"name":1769,"kind":899,"annotation":2308,"required":902,"description":2309},{"name":1609,"cls":814},"How long in seconds to wait for a response from `Protocol.validate`.",{"name":1753,"kind":1116,"required":42,"default":1117,"description":2311},"kwargs from `Protocol.validate` used to validate the connection.",{"type":891,"name":2247,"path":2207,"parent":1683,"description":2313,"lines":2314,"parameters":2316,"returns":2323},"Updates the `transport` on the `protocol` and attempts to open said `transport`\nand validate the connection using `Protocol.validate`.",[1715,2315],129,[2317,2318,2320],{"name":954,"kind":899,"required":902},{"name":1769,"kind":899,"annotation":2319,"required":902,"description":2309},{"name":1609,"cls":814},{"name":1103,"kind":899,"annotation":2321,"required":902,"description":2322},{"name":1904,"cls":814},"The device to which we wish to attempt to validate a connection.",{"description":2324,"annotation":2325},"Whether or not the connection was successfully made and validated.",{"name":1111,"cls":814},{"type":891,"name":2248,"path":2207,"parent":1683,"description":2327,"lines":2328,"parameters":2329},"Update the `Protocol`s underlying `Transport` to connect to the given `device`.",[2177,2231],[2330,2331],{"name":954,"kind":899,"required":902},{"name":1103,"kind":899,"annotation":2332,"required":902,"description":2333},{"name":1904,"cls":814},"The `DeviceInfo` of the new device to connect the `Protocol` to.",{"type":738,"name":747,"path":2335,"parent":739,"packages":2336,"attributes":2343,"classes":2345},"unitelabs\u002Fbus\u002Ftransports\u002F__init__.py",[2337,2338,2339,2340,2341,2342],"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",[2344],"unitelabs.bus.transports.__all__",[1088,1086,2346,2347,766,2348,1032,767,1087],"unitelabs.bus.transports.serial_transport.ByteSize","unitelabs.bus.transports.serial_transport.Parity","unitelabs.bus.transports.serial_transport.StopBits",{"type":775,"name":2344,"path":2335,"parent":747,"lines":2350,"value":2351},[872,844],[2352,2353,2354,2355,793,2356,2357,2358,794],"BaseTransport","ReadTransport","WriteTransport","Transport","ByteSize","Parity","StopBits",{"type":738,"name":2337,"path":2360,"parent":747,"attributes":2361,"classes":2363},"unitelabs\u002Fbus\u002Ftransports\u002Fserial_transport.py",[2362],"unitelabs.bus.transports.serial_transport.POLL_WAIT_TIME",[2346,2347,2348,766],{"type":806,"name":2346,"path":2360,"parent":2337,"lines":2365,"bases":2366,"attributes":2370,"mro":2375},[777,950],[2367],{"annotation":2368},{"name":2369,"cls":814},"enum.IntEnum",[2371,2372,2373,2374],"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",[2346],{"type":775,"name":2371,"path":2360,"parent":2346,"lines":2377,"value":2378},[873,873],"5",{"type":775,"name":2372,"path":2360,"parent":2346,"lines":2380,"value":2381},[843,843],"6",{"type":775,"name":2373,"path":2360,"parent":2346,"lines":2383,"value":2384},[844,844],"7",{"type":775,"name":2374,"path":2360,"parent":2346,"lines":2386,"value":2387},[950,950],"8",{"type":806,"name":2347,"path":2360,"parent":2337,"lines":2389,"bases":2390,"attributes":2395,"mro":2401},[1964,951],[2391,2393],{"annotation":2392},{"name":994,"cls":814},{"annotation":2394},{"name":2215,"cls":814},[2396,2397,2398,2399,2400],"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",[2347],{"type":775,"name":2396,"path":2360,"parent":2347,"lines":2403,"value":2404},[1223,1223],"'N'",{"type":775,"name":2397,"path":2360,"parent":2347,"lines":2406,"value":2407},[1352,1352],"'O'",{"type":775,"name":2398,"path":2360,"parent":2347,"lines":2409,"value":2410},[1243,1243],"'E'",{"type":775,"name":2399,"path":2360,"parent":2347,"lines":2412,"value":2413},[967,967],"'M'",{"type":775,"name":2400,"path":2360,"parent":2347,"lines":2415,"value":2416},[951,951],"'S'",{"type":806,"name":2348,"path":2360,"parent":2337,"lines":2418,"bases":2419,"attributes":2424,"mro":2428},[1248,1256],[2420,2422],{"annotation":2421},{"name":1609,"cls":814},{"annotation":2423},{"name":2215,"cls":814},[2425,2426,2427],"unitelabs.bus.transports.serial_transport.StopBits.ONE","unitelabs.bus.transports.serial_transport.StopBits.ONE_POINT_FIVE","unitelabs.bus.transports.serial_transport.StopBits.TWO",[2348],{"type":775,"name":2425,"path":2360,"parent":2348,"lines":2430,"value":1771},[2431,2431],31,{"type":775,"name":2426,"path":2360,"parent":2348,"lines":2433,"value":2434},[974,974],"1.5",{"type":775,"name":2427,"path":2360,"parent":2348,"lines":2436,"value":2437},[1256,1256],"2.0",{"type":775,"name":2362,"path":2360,"parent":2337,"lines":2439,"value":2440},[1593,1593],"0.0005",{"type":806,"name":766,"path":2360,"parent":2337,"description":2442,"lines":2443,"bases":2445,"attributes":2448,"functions":2452,"mro":2465},"Transport for serial devices.",[992,2444],168,[2446],{"annotation":2447},{"name":1032,"cls":814},[2449,2450,2451,1040,1041,1042,1043,1044,1045,1046,1047],"unitelabs.bus.transports.serial_transport.SerialTransport._serial","unitelabs.bus.transports.serial_transport.SerialTransport._max_read_size","unitelabs.bus.transports.serial_transport.SerialTransport._read_buffer",[2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,2464,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084],"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",[766,1032,1086,1087,1088],{"type":891,"name":2453,"path":2360,"parent":766,"lines":2467,"parameters":2468},[1278,2291],[2469,2470,2474,2479,2484,2489],{"name":954,"kind":899,"required":902},{"name":2471,"kind":899,"annotation":2472,"required":902,"description":2473},"port",{"name":994,"cls":814},"The port where the serial device is connected.",{"name":2475,"kind":899,"annotation":2476,"required":42,"default":2477,"description":2478},"baudrate",{"name":1181,"cls":814},"9600","The baud rate.",{"name":2480,"kind":899,"annotation":2481,"required":42,"default":2482,"description":2483},"bytesize",{"name":2346,"cls":814},{"name":2374,"cls":814},"Number of data bits.",{"name":2485,"kind":899,"annotation":2486,"required":42,"default":2487,"description":2488},"parity",{"name":2347,"cls":814},{"name":2396,"cls":814},"Parity checking method for error-detection.",{"name":2490,"kind":899,"annotation":2491,"required":42,"default":2492,"description":2493},"stopbits",{"name":2348,"cls":814},{"name":2425,"cls":814},"The number of stopbits.",{"type":775,"name":2449,"path":2360,"parent":766,"lines":2495,"value":2496},[1672,1672],"_serial",{"type":775,"name":2450,"path":2360,"parent":766,"lines":2498,"value":2499},[1594,1594],"1024",{"type":775,"name":2451,"path":2360,"parent":766,"lines":2501,"value":1643},[2291,2291],{"type":891,"name":2454,"path":2360,"parent":766,"description":2503,"lines":2504,"parameters":2506},"Opens underlying serial port, if not already open.",[2505,928],74,[2507],{"name":954,"kind":899,"required":902},{"type":891,"name":2455,"path":2360,"parent":766,"description":2509,"lines":2510,"parameters":2513},"Closes underlying serial port, if open.",[2511,2512],82,88,[2514],{"name":954,"kind":899,"required":902},{"type":891,"name":2456,"path":2360,"parent":766,"lines":2516,"parameters":2518},[2140,2517],102,[2519],{"name":954,"kind":899,"required":902},{"type":891,"name":2457,"path":2360,"parent":766,"lines":2521,"parameters":2523},[2522,2176],104,[2524],{"name":954,"kind":899,"required":902},{"type":891,"name":2458,"path":2360,"parent":766,"lines":2526,"parameters":2529},[2527,2528],112,118,[2530],{"name":954,"kind":899,"required":902},{"type":891,"name":2459,"path":2360,"parent":766,"lines":2532,"parameters":2535,"returns":2537},[2533,2534],120,127,[2536],{"name":954,"kind":899,"required":902},{"description":918,"annotation":2538},{"left":2539,"slice":2540},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":2460,"path":2360,"parent":766,"description":2542,"lines":2543,"parameters":2545,"throws":2547},"Adds a writer to the loop if not already added.",[2544,2231],132,[2546],{"name":954,"kind":899,"required":902},[2548],{"description":2549,"annotation":2550},"If the serial port is not open.",{"name":2551,"cls":814},"serial.PortNotOpenError",{"type":891,"name":2461,"path":2360,"parent":766,"lines":2553,"parameters":2555},[2554,2122],150,[2556],{"name":954,"kind":899,"required":902},{"type":891,"name":2462,"path":2360,"parent":766,"description":2558,"lines":2559,"parameters":2562},"Removes a writer from the loop.",[2560,2561],155,165,[2563],{"name":954,"kind":899,"required":902},{"type":891,"name":2463,"path":2360,"parent":766,"lines":2565,"parameters":2567,"returns":2571},[2566,2444],167,[2568,2569],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":2570,"required":902},{"name":901,"cls":814},{"description":918,"annotation":2572},{"name":1181,"cls":814},{"type":738,"name":2338,"path":2574,"parent":747,"classes":2575},"unitelabs\u002Fbus\u002Ftransports\u002Fread_transport.py",[1086],{"type":806,"name":1086,"path":2574,"parent":2338,"description":2577,"lines":2578,"bases":2579,"attributes":2585,"functions":2586,"mro":2593},"Interface for read-only transports.",[872,2192],[2580,2582],{"annotation":2581},{"name":1088,"cls":814},{"annotation":2583},{"name":2584,"cls":814},"asyncio.ReadTransport",[1040,1045,1046,1047],[2587,1060,1061,1062,1063,1064,1065,2588,2589,1066,2590,1067,1068,1080,1081,1082,2591,2592,1083,1084],"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",[1086,1088],{"type":891,"name":2587,"path":2574,"parent":1086,"lines":2595,"parameters":2596},[927,835],[2597],{"name":954,"kind":899,"required":902},{"type":775,"name":1040,"path":2574,"parent":1086,"lines":2599,"value":1112},[835,835],{"type":891,"name":1060,"path":2574,"parent":1086,"description":2601,"lines":2602,"parameters":2603},"Opens the transport and sets state to allow future read operations.",[777,1964],[2604],{"name":954,"kind":899,"required":902},{"type":891,"name":1061,"path":2574,"parent":1086,"description":2606,"lines":2607,"parameters":2608},"Closes the transport and sets state to disallow further read operations.",[1352,1248],[2609],{"name":954,"kind":899,"required":902},{"type":891,"name":1062,"path":2574,"parent":1086,"description":2611,"lines":2612,"parameters":2613,"returns":2615},"Whether or not reading operations are currently being performed.",[974,992],[2614],{"name":954,"kind":899,"required":902},{"description":2616,"annotation":2617},"True if the transport is receiving, otherwise False.",{"name":1111,"cls":814},{"type":891,"name":1063,"path":2574,"parent":1086,"description":2619,"lines":2620,"parameters":2621},"Pause the receiving end.\n\nNo data will be passed to the protocol's `data_received()`\nmethod until `resume_reading()` is called.",[997,1137],[2622],{"name":954,"kind":899,"required":902},{"type":891,"name":1064,"path":2574,"parent":1086,"description":2624,"lines":2625,"parameters":2627},"Resume the receiving end.\n\nData received will once again be passed to the protocol's\n`data_received()` method.",[2626,1004],51,[2628],{"name":954,"kind":899,"required":902},{"type":891,"name":1065,"path":2574,"parent":1086,"description":2630,"lines":2631,"parameters":2633},"Closes the transport immediately and updates state to disable further\nread operations.",[1009,2632],71,[2634,2635],{"name":954,"kind":899,"required":902},{"name":2636,"kind":899,"annotation":2637,"required":42,"default":964,"description":2640},"exception",{"left":2638,"slice":2639},{"name":959,"cls":814},{"name":831,"cls":814},"The Exception to propagate to the protocol when aborting, if connected.",{"type":891,"name":2588,"path":2574,"parent":1086,"description":2642,"lines":2643,"parameters":2645},"Set state to enable future read operations.",[1283,2644],78,[2646],{"name":954,"kind":899,"required":902},{"type":891,"name":2589,"path":2574,"parent":1086,"description":2648,"lines":2649,"parameters":2650},"Set state to disable further read operations.",[928,1151],[2651],{"name":954,"kind":899,"required":902},{"type":891,"name":1066,"path":2574,"parent":1086,"description":2653,"lines":2654,"parameters":2656},"Safely and asynchronously read data from the transport.",[1173,2655],98,[2657],{"name":954,"kind":899,"required":902},{"type":891,"name":2590,"path":2574,"parent":1086,"description":2659,"lines":2660,"parameters":2661,"returns":2663},"Read data from the transport.\nCalled within `_safe_read` for asynchronous reading.",[1430,1687],[2662],{"name":954,"kind":899,"required":902},{"description":2664,"annotation":2665},"Data read from the transport.",{"left":2666,"slice":2667},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":1067,"path":2574,"parent":1086,"description":2669,"lines":2670,"parameters":2672,"returns":2674},"Read all available data from the transport. Repeatedly calls `_read` and\naggregates the results until no further data is available.",[1715,2671],125,[2673],{"name":954,"kind":899,"required":902},{"description":2675,"annotation":2676},"All available data from the transport.",{"name":901,"cls":814},{"type":891,"name":1068,"path":2574,"parent":1086,"description":2678,"lines":2679,"parameters":2680},"Clears out all available read data without notifying the protocol. Calls `read_all` and throws away the result.",[2534,2192],[2681],{"name":954,"kind":899,"required":902},{"type":738,"name":2339,"path":2683,"parent":747,"classes":2684},"unitelabs\u002Fbus\u002Ftransports\u002Ftransport.py",[1032],{"type":806,"name":1032,"path":2683,"parent":2339,"description":2686,"lines":2687,"bases":2688,"attributes":2695,"functions":2696,"mro":2699},"Interface defining bidirectional communication with a device.\n\nTransports read bytes from and write bytes to a device.",[872,778],[2689,2691,2693],{"annotation":2690},{"name":1633,"cls":814},{"annotation":2692},{"name":1086,"cls":814},{"annotation":2694},{"name":1087,"cls":814},[1040,1041,1042,1043,1044,1045,1046,1047],[1054,1055,1056,1057,2697,1058,1059,2698,2587,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,2464,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084],"unitelabs.bus.transports.transport.Transport._read","unitelabs.bus.transports.transport.Transport._write",[1032,1086,1087,1088],{"type":891,"name":1054,"path":2683,"parent":1032,"lines":2701,"parameters":2702},[777,873],[2703],{"name":954,"kind":899,"required":902},{"type":891,"name":1055,"path":2683,"parent":1032,"lines":2705,"parameters":2706},[844,950],[2707],{"name":954,"kind":899,"required":902},{"type":891,"name":1056,"path":2683,"parent":1032,"lines":2709,"parameters":2710},[1239,1964],[2711],{"name":954,"kind":899,"required":902},{"type":891,"name":1057,"path":2683,"parent":1032,"lines":2713,"parameters":2714},[1352,1243],[2715],{"name":954,"kind":899,"required":902},{"type":891,"name":2697,"path":2683,"parent":1032,"lines":2717,"parameters":2718,"returns":2720},[951,1091],[2719],{"name":954,"kind":899,"required":902},{"description":918,"annotation":2721},{"left":2722,"slice":2723},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":1058,"path":2683,"parent":1032,"lines":2725,"parameters":2726},[1248,2431],[2727],{"name":954,"kind":899,"required":902},{"type":891,"name":1059,"path":2683,"parent":1032,"lines":2729,"parameters":2730},[1256,979],[2731],{"name":954,"kind":899,"required":902},{"type":891,"name":2698,"path":2683,"parent":1032,"lines":2733,"parameters":2734,"returns":2738},[1593,778],[2735,2736],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":2737,"required":902},{"name":901,"cls":814},{"description":918,"annotation":2739},{"name":1181,"cls":814},{"type":738,"name":2340,"path":2741,"parent":747,"attributes":2742,"classes":2745},"unitelabs\u002Fbus\u002Ftransports\u002Fusb_transport.py",[2743,2744],"unitelabs.bus.transports.usb_transport.POLL_WAIT_TIME","unitelabs.bus.transports.usb_transport.DEFAULT_USB_INTERFACE",[767],{"type":775,"name":2743,"path":2741,"parent":2340,"lines":2747,"value":2748},[777,777],"0.1",{"type":775,"name":2744,"path":2741,"parent":2340,"lines":2750,"value":2751},[873,873],"0",{"type":806,"name":767,"path":2741,"parent":2340,"description":2753,"lines":2754,"bases":2755,"attributes":2758,"functions":2768,"mro":2779},"Transport for devices connected via USB.\n\nBy default, this implementation uses Interface 0 of Configuration 1 on the device.",[950,1778],[2756],{"annotation":2757},{"name":1032,"cls":814},[2759,2760,2761,2762,2763,2764,2765,2766,2767,1040,1041,1042,1043,1044,1045,1047],"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",[2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,2464,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084],"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",[767,1032,1086,1087,1088],{"type":891,"name":2769,"path":2741,"parent":767,"lines":2781,"parameters":2782},[2431,1278],[2783,2784,2788,2791,2795],{"name":954,"kind":899,"required":902},{"name":2785,"kind":899,"annotation":2786,"required":902,"description":2787},"vendor",{"name":1181,"cls":814},"The vendor ID of the USB device.",{"name":2047,"kind":899,"annotation":2789,"required":902,"description":2790},{"name":1181,"cls":814},"The product ID of the USB device.",{"name":2258,"kind":899,"annotation":2792,"required":902,"description":2794},{"name":2793,"cls":814},"asyncio.BaseProtocol","The protocol instance to use for communication.",{"name":2796,"kind":899,"annotation":2797,"required":42,"default":2798,"description":2799},"interface_index",{"name":1181,"cls":814},{"name":2744,"cls":814},"The index of the USB Interface to use. Defaults to 0.",{"type":775,"name":2759,"path":2741,"parent":767,"lines":2801,"value":2785},[1124,1124],{"type":775,"name":2760,"path":2741,"parent":767,"lines":2803,"value":2047},[997,997],{"type":775,"name":2761,"path":2741,"parent":767,"lines":2805,"value":1604},[1263,1263],{"type":775,"name":2762,"path":2741,"parent":767,"lines":2807,"value":2258},[998,998],{"type":775,"name":2763,"path":2741,"parent":767,"lines":2809,"value":2796},[1129,1129],{"type":775,"name":2764,"path":2741,"parent":767,"lines":2811,"value":964,"annotation":2812},[1133,1133],{"left":2813,"slice":2814},{"name":959,"cls":814},{"name":2815,"cls":814},"usb.core.Device",{"type":775,"name":2765,"path":2741,"parent":767,"lines":2817,"value":964,"annotation":2818},[1429,1429],{"left":2819,"slice":2820},{"name":959,"cls":814},{"name":2821,"cls":814},"usb.core.Endpoint",{"type":775,"name":2766,"path":2741,"parent":767,"lines":2823,"value":964,"annotation":2824},[1273,1273],{"left":2825,"slice":2826},{"name":959,"cls":814},{"name":2821,"cls":814},{"type":775,"name":2767,"path":2741,"parent":767,"lines":2828,"value":968},[1278,1278],{"type":891,"name":2770,"path":2741,"parent":767,"lines":2830,"parameters":2831},[1642,2655],[2832],{"name":954,"kind":899,"required":902},{"type":891,"name":2771,"path":2741,"parent":767,"lines":2834,"parameters":2835},[1430,2517],[2836],{"name":954,"kind":899,"required":902},{"type":891,"name":2772,"path":2741,"parent":767,"lines":2838,"parameters":2839},[1184,2527],[2840],{"name":954,"kind":899,"required":902},{"type":891,"name":2773,"path":2741,"parent":767,"lines":2842,"parameters":2844},[1723,2843],124,[2845],{"name":954,"kind":899,"required":902},{"type":891,"name":2774,"path":2741,"parent":767,"lines":2847,"parameters":2849},[2848,2315],126,[2850],{"name":954,"kind":899,"required":902},{"type":891,"name":2775,"path":2741,"parent":767,"description":2852,"lines":2853,"parameters":2855,"returns":2857},"Read data from the transport.",[2192,2854],156,[2856],{"name":954,"kind":899,"required":902},{"description":918,"annotation":2858},{"left":2859,"slice":2860},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":2776,"path":2741,"parent":767,"lines":2862,"parameters":2864},[2863,1745],189,[2865],{"name":954,"kind":899,"required":902},{"type":891,"name":2777,"path":2741,"parent":767,"lines":2867,"parameters":2870},[2868,2869],201,205,[2871],{"name":954,"kind":899,"required":902},{"type":891,"name":2778,"path":2741,"parent":767,"lines":2873,"parameters":2875},[2874,1778],207,[2876,2877],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":2878,"required":902},{"name":901,"cls":814},{"type":738,"name":2341,"path":2880,"parent":747,"description":2881,"classes":2882},"unitelabs\u002Fbus\u002Ftransports\u002Fwrite_transport.py","Modified from https:\u002F\u002Fgithub.com\u002Fpyserial\u002Fpyserial-asyncio\u002Fblob\u002Fmaster\u002Fserial_asyncio\u002F__init__.py",[1087],{"type":806,"name":1087,"path":2880,"parent":2341,"description":2884,"lines":2885,"bases":2887,"attributes":2893,"functions":2894,"mro":2902},"Interface for write-only transports.",[835,2886],316,[2888,2890],{"annotation":2889},{"name":1088,"cls":814},{"annotation":2891},{"name":2892,"cls":814},"asyncio.WriteTransport",[1041,1042,1043,1044,1045,1046,1047],[2895,2896,2897,1069,1070,1071,2464,1072,1073,1074,1075,2898,2899,2900,1076,2901,1077,1078,1079,1080,1081,1082,2591,2592,1083,1084],"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",[1087,1088],{"type":891,"name":2895,"path":2880,"parent":1087,"lines":2904,"parameters":2905},[873,1964],[2906],{"name":954,"kind":899,"required":902},{"type":775,"name":1041,"path":2880,"parent":1087,"lines":2908,"value":1112},[950,950],{"type":775,"name":1042,"path":2880,"parent":1087,"lines":2910,"value":1112},[1307,1307],{"type":775,"name":1043,"path":2880,"parent":1087,"lines":2912,"value":1643,"annotation":2913},[1239,1239],{"left":2914,"slice":2915},{"name":962,"cls":814},{"left":2916,"slice":2917},{"name":908,"cls":814},{"elements":2918},[2919,2920,2922],{"name":901,"cls":814},{"name":2921,"cls":814},"bytearray",{"name":2923,"cls":814},"memoryview",{"type":891,"name":2896,"path":2880,"parent":1087,"description":2925,"lines":2926,"parameters":2927},"Opens the transport and if write buffer currently contains data, sets state to allow future write operations.",[1352,2431],[2928],{"name":954,"kind":899,"required":902},{"type":891,"name":2897,"path":2880,"parent":1087,"description":2930,"lines":2931,"parameters":2932},"Closes the transport. If write buffer is empty, sets state to disallow further write operations.",[1256,1124],[2933],{"name":954,"kind":899,"required":902},{"type":775,"name":1044,"path":2880,"parent":1087,"description":2935,"lines":2936,"value":964,"annotation":2937},"Whether or not there is data in the write buffer waiting to be written.",[998,1137],{"name":1111,"cls":814},{"type":891,"name":1069,"path":2880,"parent":1087,"description":2939,"lines":2940,"parameters":2941,"returns":2943},"Calculate the current size of the write buffer.",[2626,1142],[2942],{"name":954,"kind":899,"required":902},{"description":2944,"annotation":2945},"The number of bytes in the write buffer.",{"name":1181,"cls":814},{"type":891,"name":1070,"path":2880,"parent":1087,"description":2947,"lines":2948,"parameters":2949,"returns":2951},"Get the high and low watermarks for write flow control.",[1150,1669],[2950],{"name":954,"kind":899,"required":902},{"description":2952,"annotation":2953},"a tuple (low, high) where low and high are positive number of bytes.",{"left":2954,"slice":2955},{"name":1266,"cls":814},{"elements":2956},[2957,2958],{"name":1181,"cls":814},{"name":1181,"cls":814},{"type":891,"name":1071,"path":2880,"parent":1087,"description":2960,"lines":2961,"parameters":2962},"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.",[1594,1430],[2963,2964,2970],{"name":954,"kind":899,"required":902},{"name":2965,"kind":899,"annotation":2966,"required":42,"default":964,"description":2969},"high",{"left":2967,"slice":2968},{"name":959,"cls":814},{"name":1181,"cls":814},"The maximum allowed number of bytes in the write buffer.",{"name":2971,"kind":899,"annotation":2972,"required":42,"default":964,"description":2975},"low",{"left":2973,"slice":2974},{"name":959,"cls":814},{"name":1181,"cls":814},"The minimum allowed number of bytes in the write buffer.",{"type":891,"name":2464,"path":2880,"parent":1087,"description":2977,"lines":2978,"parameters":2979},"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.",[2517,1716],[2980,2981],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":2982,"required":902,"description":2989},{"left":2983,"slice":2984},{"name":908,"cls":814},{"elements":2985},[2986,2987,2988],{"name":901,"cls":814},{"name":2921,"cls":814},{"name":2923,"cls":814},"The bytes to write to the Transport.",{"type":891,"name":1072,"path":2880,"parent":1087,"description":2991,"lines":2992,"parameters":2993,"returns":2995},"Whether or not this transport has implemented `write_eof()` method.",[1723,2534],[2994],{"name":954,"kind":899,"required":902},{"description":2996,"annotation":2997},"True if this transport supports `write_eof()`, False if not.",{"name":1111,"cls":814},{"type":891,"name":1073,"path":2880,"parent":1087,"description":2999,"lines":3000,"parameters":3002},"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.",[2315,3001],136,[3003],{"name":954,"kind":899,"required":902},{"type":891,"name":1074,"path":2880,"parent":1087,"description":3005,"lines":3006,"parameters":3008},"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.",[3007,2554],138,[3009,3010],{"name":954,"kind":899,"required":902},{"name":3011,"kind":899,"annotation":3012,"required":902,"description":3022},"list_of_data",{"left":3013,"slice":3015},{"name":3014,"cls":814},"typing.Iterable",{"left":3016,"slice":3017},{"name":908,"cls":814},{"elements":3018},[3019,3020,3021],{"name":901,"cls":814},{"name":2921,"cls":814},{"name":2923,"cls":814},"The list of bytes to concatenate and write to the Transport.",{"type":891,"name":1075,"path":2880,"parent":1087,"description":3024,"lines":3025,"parameters":3028},"Flush the write buffer and disable further writing.",[3026,3027],152,159,[3029],{"name":954,"kind":899,"required":902},{"type":891,"name":2898,"path":2880,"parent":1087,"description":3031,"lines":3032,"parameters":3034},"Sets state to allow future write operations, if transport is still open.",[3033,2566],161,[3035],{"name":954,"kind":899,"required":902},{"type":891,"name":2899,"path":2880,"parent":1087,"description":3037,"lines":3038,"parameters":3041},"Sets state to disallow future write operations.",[3039,3040],169,174,[3042],{"name":954,"kind":899,"required":902},{"type":891,"name":2900,"path":2880,"parent":1087,"description":3044,"lines":3045,"parameters":3048},"Closes the transport immediately and sets state to disallow further\nwrite operations.",[3046,3047],176,186,[3049,3050],{"name":954,"kind":899,"required":902},{"name":2636,"kind":899,"annotation":3051,"required":42,"default":964,"description":3054},{"left":3052,"slice":3053},{"name":959,"cls":814},{"name":831,"cls":814},"The exception to propagate to the transport when closing.",{"type":891,"name":1076,"path":2880,"parent":1087,"description":3056,"lines":3057,"parameters":3060},"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.",[3058,3059],188,229,[3061],{"name":954,"kind":899,"required":902},{"type":891,"name":2901,"path":2880,"parent":1087,"description":3063,"lines":3064,"parameters":3067,"returns":3071},"Write data to the Transport.\nCalled within `_safe_write` for asynchronous writing.",[3065,3066],231,243,[3068,3069],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":3070,"required":902,"description":2989},{"name":901,"cls":814},{"description":3072,"annotation":3073},"the number of bytes written.",{"name":1181,"cls":814},{"type":891,"name":1077,"path":2880,"parent":1087,"description":3075,"lines":3076,"parameters":3079},"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()`.",[3077,3078],245,262,[3080],{"name":954,"kind":899,"required":902},{"type":891,"name":1078,"path":2880,"parent":1087,"description":3082,"lines":3083,"parameters":3085},"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()`.",[1807,3084],280,[3086],{"name":954,"kind":899,"required":902},{"type":891,"name":1079,"path":2880,"parent":1087,"description":3088,"lines":3089,"parameters":3090,"throws":3102},"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).",[1820,2886],[3091,3092,3097],{"name":954,"kind":899,"required":902},{"name":2971,"kind":899,"annotation":3093,"required":42,"default":964,"description":3096},{"left":3094,"slice":3095},{"name":959,"cls":814},{"name":1181,"cls":814},"The low-water limit for write flow control.",{"name":2965,"kind":899,"annotation":3098,"required":42,"default":964,"description":3101},{"left":3099,"slice":3100},{"name":959,"cls":814},{"name":1181,"cls":814},"The high-water limit for write flow control.",[3103],{"description":3104,"annotation":3105},"if the high-water limit is less than the low-water limit,\nor the low-water limit is less than 0.",{"name":762,"cls":814},{"type":738,"name":2342,"path":3107,"parent":747,"attributes":3108,"classes":3110},"unitelabs\u002Fbus\u002Ftransports\u002Fbase_transport.py",[3109],"unitelabs.bus.transports.base_transport.P",[1088],{"type":775,"name":3109,"path":3107,"parent":2342,"lines":3112,"value":3113},[888,888],"typing.TypeVar('P', bound=asyncio.BaseProtocol)",{"type":806,"name":1088,"path":3107,"parent":2342,"lines":3115,"bases":3117,"attributes":3126,"functions":3127,"mro":3132},[894,3116],137,[3118,3121],{"annotation":3119},{"name":3120,"cls":814},"asyncio.BaseTransport",{"annotation":3122},{"left":3123,"slice":3125},{"name":3124,"cls":814},"typing.Generic",{"name":3109,"cls":814},[1045,1046,1047],[3128,1080,1081,1082,3129,2591,3130,2592,1083,3131,1084],"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",[1088],{"type":891,"name":3128,"path":3107,"parent":1088,"lines":3134,"parameters":3135},[872,835],[3136],{"name":954,"kind":899,"required":902},{"type":775,"name":1045,"path":3107,"parent":1088,"lines":3138,"value":3139},[927,927],"asyncio.get_event_loop_policy().get_event_loop()",{"type":775,"name":1046,"path":3107,"parent":1088,"lines":3141,"value":964,"annotation":3143},[3142,3142],12,{"left":3144,"slice":3145},{"name":959,"cls":814},{"name":3109,"cls":814},{"type":775,"name":1047,"path":3107,"parent":1088,"lines":3147,"value":1604},[835,835],{"type":891,"name":1080,"path":3107,"parent":1088,"description":3149,"lines":3150,"parameters":3151,"returns":3153},"Get the current `Protocol` associated with this transport.",[777,1223],[3152],{"name":954,"kind":899,"required":902},{"description":3154,"annotation":3155},"The current `Protocol` instance.",{"left":3156,"slice":3157},{"name":959,"cls":814},{"name":3109,"cls":814},{"type":891,"name":1081,"path":3107,"parent":1088,"description":3159,"lines":3160,"parameters":3161,"throws":3166},"Associate a new `Protocol` with this transport.",[1243,1124],[3162,3163],{"name":954,"kind":899,"required":902},{"name":2258,"kind":899,"annotation":3164,"required":902,"description":3165},{"name":3109,"cls":814},"The new `Protocol` instance.",[3167],{"description":3168,"annotation":3169},"If the protocol is not an instance of asyncio.BaseProtocol\nor None.",{"name":3170,"cls":814},"TypeError",{"type":891,"name":1082,"path":3107,"parent":1088,"description":3172,"lines":3173,"parameters":3174,"returns":3176},"Whether the transport is closing or closed.",[1263,1278],[3175],{"name":954,"kind":899,"required":902},{"description":3177,"annotation":3178},"True if the transport is closing or closed, False otherwise.",{"name":1111,"cls":814},{"type":891,"name":3129,"path":3107,"parent":1088,"description":3180,"lines":3181,"parameters":3182},"Open the transport and inform the `Protocol` whether the connection was\nestablished successfully.",[1642,2290],[3183],{"name":954,"kind":899,"required":902},{"type":891,"name":2591,"path":3107,"parent":1088,"description":3185,"lines":3186,"parameters":3187},"Underlying action performed when calling `open`.\nSubclasses override this method to specify behavior when opening the\nconnection.",[1669,1283],[3188],{"name":954,"kind":899,"required":902},{"type":891,"name":3130,"path":3107,"parent":1088,"description":3190,"lines":3191,"parameters":3193},"Close the transport and inform the protocol whether the connection was\nterminated successfully.",[1292,3192],89,[3194],{"name":954,"kind":899,"required":902},{"type":891,"name":2592,"path":3107,"parent":1088,"description":3196,"lines":3197,"parameters":3200},"Underlying action performed when calling `close`.\nSubclasses override this method to specify behavior when closing the\nconnection.",[3198,3199],91,96,[3201],{"name":954,"kind":899,"required":902},{"type":891,"name":1083,"path":3107,"parent":1088,"description":3203,"lines":3204,"parameters":3205},"Close the transport immediately.",[2655,1467],[3206],{"name":954,"kind":899,"required":902},{"type":891,"name":3131,"path":3107,"parent":1088,"description":3208,"lines":3209,"parameters":3210},"Underlying action performed when calling `abort`.\n\nSubclasses may override this method to specify behavior when aborting the\nconnection.",[1174,2528],[3211,3212],{"name":954,"kind":899,"required":902},{"name":2636,"kind":899,"annotation":3213,"required":42,"default":964,"description":3216},{"left":3214,"slice":3215},{"name":959,"cls":814},{"name":831,"cls":814},"The Exception to propagate to the protocol, if connected.",{"type":891,"name":1084,"path":3107,"parent":1088,"description":3218,"lines":3219,"parameters":3220},"Report a fatal error to the event-loop and abort the transport.",[2533,3116],[3221,3222,3225],{"name":954,"kind":899,"required":902},{"name":2636,"kind":899,"annotation":3223,"required":902,"description":3224},{"name":831,"cls":814},"The Exception to pass on the the loop's exception handler.",{"name":3226,"kind":899,"annotation":3227,"required":902,"description":3228},"message",{"name":994,"cls":814},"Human-readable text describing the exception's execution state, cause, etc.",{"type":738,"name":748,"path":3230,"parent":739,"packages":3231,"attributes":3240,"classes":3242},"unitelabs\u002Fbus\u002Fcommands\u002F__init__.py",[3232,3233,3234,3235,3236,3237,3238,3239],"unitelabs.bus.commands.multiline","unitelabs.bus.commands.request","unitelabs.bus.commands.command","unitelabs.bus.commands.builder","unitelabs.bus.commands.serial_command","unitelabs.bus.commands.http_command","unitelabs.bus.commands.byte_command","unitelabs.bus.commands.response",[3241,1532,1533,1535],"unitelabs.bus.commands.__all__",[755,753,754,756,757,758,759],{"type":738,"name":3232,"path":3244,"parent":748,"functions":3245},"unitelabs\u002Fbus\u002Fcommands\u002Fmultiline.py",[3246],"unitelabs.bus.commands.multiline.multiline",{"type":891,"name":3246,"path":3244,"parent":3232,"description":3248,"lines":3249,"parameters":3250},"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`.",[819,1593],[3251],{"name":1749,"kind":899,"annotation":3252,"required":42,"default":3253,"description":3254},{"name":1609,"cls":814},"0.01","The wait time in seconds before calling the `_validate_response` method.",{"type":775,"name":3241,"path":3230,"parent":748,"lines":3256,"value":3257},[827,1964],[781,782,3258,3259,3260,786,785,783,784,3261,787],"InType","OutType","ResType","multiline",{"type":738,"name":3233,"path":3263,"parent":748,"classes":3264},"unitelabs\u002Fbus\u002Fcommands\u002Frequest.py",[757],{"type":806,"name":757,"path":3263,"parent":3233,"description":3266,"lines":3267,"decorators":3268,"attributes":3269,"functions":3272,"mro":3275},"`Protocol`s use `Request`s to specify data that is sent to a `Transport`.",[872,974],[1920],[3270,3271],"unitelabs.bus.commands.request.Request.payload","unitelabs.bus.commands.request.Request.timeout",[3273,3274],"unitelabs.bus.commands.request.Request.__init__","unitelabs.bus.commands.request.Request.__post_init__",[757],{"type":775,"name":3270,"path":3263,"parent":757,"lines":3277,"value":964,"annotation":3278},[1243,1243],{"name":901,"cls":814},{"type":775,"name":3271,"path":3263,"parent":757,"lines":3280,"value":964,"annotation":3281},[967,967],{"left":3282,"slice":3283},{"name":959,"cls":814},{"name":1609,"cls":814},{"type":891,"name":3274,"path":3263,"parent":757,"lines":3285,"parameters":3286},[1091,974],[3287],{"name":954,"kind":899,"required":902},{"type":891,"name":3273,"path":3263,"parent":757,"lines":3289,"parameters":3290},[2003,2003],[3291,3292,3296],{"name":954,"kind":899,"required":902},{"name":3293,"kind":899,"annotation":3294,"required":902,"description":3295},"payload",{"name":901,"cls":814},"The payload of the request.",{"name":1749,"kind":899,"annotation":3297,"required":42,"default":964,"description":3300},{"left":3298,"slice":3299},{"name":959,"cls":814},{"name":1609,"cls":814},"The duration in seconds to wait for a response before\nraising a timeout exception. Set to 0.0 to wait indefinitely.",{"type":738,"name":3234,"path":3302,"parent":748,"attributes":3303,"classes":3307},"unitelabs\u002Fbus\u002Fcommands\u002Fcommand.py",[1532,1533,1535,3304,3305,3306],"unitelabs.bus.commands.command.P","unitelabs.bus.commands.command.T","unitelabs.bus.commands.command.Parser",[3308,3309,3310,3311,754],"unitelabs.bus.commands.command.Serializer","unitelabs.bus.commands.command.SelfSerializer","unitelabs.bus.commands.command.Deserializer","unitelabs.bus.commands.command.SelfDeserializer",{"type":775,"name":1532,"path":3302,"parent":3234,"lines":3313,"value":3314},[835,835],"typing.TypeVar('InType')",{"type":775,"name":1533,"path":3302,"parent":3234,"lines":3316,"value":3317},[836,836],"typing.TypeVar('OutType')",{"type":775,"name":1535,"path":3302,"parent":3234,"lines":3319,"value":3320},[777,777],"TypeVar('ResType', default=OutType)",{"type":775,"name":3304,"path":3302,"parent":3234,"lines":3322,"value":3323},[843,843],"ParamSpec('P')",{"type":775,"name":3305,"path":3302,"parent":3234,"lines":3325,"value":3326},[844,844],"typing.TypeVar('T')",{"type":775,"name":3306,"path":3302,"parent":3234,"lines":3328,"value":3329},[1307,1307],"typing.Callable[P, T]",{"type":806,"name":3308,"path":3302,"parent":3234,"lines":3331,"bases":3332,"functions":3338,"mro":3340},[1223,1352],[3333],{"annotation":3334},{"left":3335,"slice":3337},{"name":3336,"cls":814},"typing.Protocol",{"name":1532,"cls":814},[3339],"unitelabs.bus.commands.command.Serializer.__call__",[3308],{"type":891,"name":3339,"path":3302,"parent":3308,"lines":3342,"parameters":3343,"returns":3352},[1352,1352],[3344,3345,3347,3351],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":3346,"required":902},{"name":1532,"cls":814},{"name":3348,"kind":3349,"required":42,"default":3350},"*args","variadic positional","()",{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":3353},{"name":901,"cls":814},{"type":806,"name":3309,"path":3302,"parent":3234,"lines":3355,"bases":3356,"functions":3361,"mro":3363},[951,1091],[3357],{"annotation":3358},{"left":3359,"slice":3360},{"name":3336,"cls":814},{"name":1532,"cls":814},[3362],"unitelabs.bus.commands.command.SelfSerializer.__call__",[3309],{"type":891,"name":3362,"path":3302,"parent":3309,"lines":3365,"parameters":3366,"returns":3375},[1091,1091],[3367,3368,3371,3373,3374],{"name":954,"kind":899,"required":902},{"name":3369,"kind":899,"annotation":3370,"required":902},"cmd",{"name":754,"cls":814},{"name":3226,"kind":899,"annotation":3372,"required":902},{"name":1532,"cls":814},{"name":3348,"kind":3349,"required":42,"default":3350},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":3376},{"name":901,"cls":814},{"type":806,"name":3310,"path":3302,"parent":3234,"lines":3378,"bases":3379,"functions":3384,"mro":3386},[2431,974],[3380],{"annotation":3381},{"left":3382,"slice":3383},{"name":3336,"cls":814},{"name":1533,"cls":814},[3385],"unitelabs.bus.commands.command.Deserializer.__call__",[3310],{"type":891,"name":3385,"path":3302,"parent":3310,"lines":3388,"parameters":3389,"returns":3395},[974,974],[3390,3391,3393,3394],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":3392,"required":902},{"name":901,"cls":814},{"name":3348,"kind":3349,"required":42,"default":3350},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":3396},{"name":1533,"cls":814},{"type":806,"name":3311,"path":3302,"parent":3234,"lines":3398,"bases":3399,"functions":3404,"mro":3406},[980,1593],[3400],{"annotation":3401},{"left":3402,"slice":3403},{"name":3336,"cls":814},{"name":1533,"cls":814},[3405],"unitelabs.bus.commands.command.SelfDeserializer.__call__",[3311],{"type":891,"name":3405,"path":3302,"parent":3311,"lines":3408,"parameters":3409,"returns":3417},[1593,1593],[3410,3411,3413,3415,3416],{"name":954,"kind":899,"required":902},{"name":3369,"kind":899,"annotation":3412,"required":902},{"name":754,"cls":814},{"name":1155,"kind":899,"annotation":3414,"required":902},{"name":901,"cls":814},{"name":3348,"kind":3349,"required":42,"default":3350},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":3418},{"name":1533,"cls":814},{"type":806,"name":754,"path":3302,"parent":3234,"description":3420,"lines":3421,"bases":3423,"attributes":3432,"functions":3444,"mro":3459},"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,\nthe second type parameter determines the type returned by deserialization,\nand the third type parameter determines the type returned by the `result` method, e.g.\n`Command[str, typing.List[str], typing.List[bool]]` would ingest strings from the user,\nbe converted to a list of strings for the parser and then return a list of booleans when\nused with `Protocol.execute`.\n\nSubclasses which change the constructor signature should be careful to preserve the `timeout` and `is_void`\nparameters. Removal of these arguments may result in compatability issues with the `CommandBuilder`.",[992,3422],298,[3424],{"annotation":3425},{"left":3426,"slice":3427},{"name":3124,"cls":814},{"elements":3428},[3429,3430,3431],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":1535,"cls":814},[3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443],"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._parsers","unitelabs.bus.commands.command.Command.request","unitelabs.bus.commands.command.Command.response","unitelabs.bus.commands.command.Command.parsers",[3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458],"unitelabs.bus.commands.command.Command.__new__","unitelabs.bus.commands.command.Command.__init__","unitelabs.bus.commands.command.Command.result","unitelabs.bus.commands.command.Command.serialize","unitelabs.bus.commands.command.Command._serialize","unitelabs.bus.commands.command.Command.deserialize","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","unitelabs.bus.commands.command.Command.add_parser","unitelabs.bus.commands.command.Command.parse",[754],{"type":775,"name":3433,"path":3302,"parent":754,"lines":3461,"value":964,"annotation":3462},[1142,1142],{"left":3463,"slice":3464},{"name":959,"cls":814},{"name":765,"cls":814},{"type":891,"name":3445,"path":3302,"parent":754,"lines":3466,"parameters":3467,"returns":3474},[2290,1672],[3468,3469,3470,3473],{"name":2072,"kind":899,"required":902},{"name":3348,"kind":3349,"required":42,"default":3350},{"name":3471,"kind":1320,"annotation":3472,"required":42,"default":1112},"is_void",{"name":1111,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":3475},{"left":3476},{"left":3477,"slice":3478},{"name":754,"cls":814},{"elements":3479},[3480,3481,3482],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":1535,"cls":814},{"type":891,"name":3446,"path":3302,"parent":754,"lines":3484,"parameters":3486},[2632,3485],84,[3487,3488,3491,3496],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":3489,"required":902,"description":3490},{"name":1532,"cls":814},"The contents of the message to be sent to the device, pre-serialization.",{"name":1749,"kind":899,"annotation":3492,"required":42,"default":964,"description":3495},{"left":3493,"slice":3494},{"name":959,"cls":814},{"name":1609,"cls":814},"How long is seconds to wait for a response.",{"name":3471,"kind":1320,"annotation":3497,"required":42,"default":1112,"description":3498},{"name":1111,"cls":814},"If true, does not return a response. Void commands ignore all response validations.",{"type":775,"name":3434,"path":3302,"parent":754,"lines":3500,"value":964,"annotation":3501},[2644,2644],{"left":3502,"slice":3503},{"name":959,"cls":814},{"name":758,"cls":814},{"type":775,"name":3435,"path":3302,"parent":754,"lines":3505,"value":964,"annotation":3506},[1015,1015],{"left":3507,"slice":3508},{"name":959,"cls":814},{"name":757,"cls":814},{"type":775,"name":3436,"path":3302,"parent":754,"lines":3510,"value":3226},[928,928],{"type":775,"name":3437,"path":3302,"parent":754,"lines":3512,"value":1749},[3513,3513],81,{"type":775,"name":3438,"path":3302,"parent":754,"lines":3515,"value":3516},[2511,2511],"b''",{"type":775,"name":3439,"path":3302,"parent":754,"lines":3518,"value":3471},[1681,1681],{"type":775,"name":3440,"path":3302,"parent":754,"lines":3520,"value":1643,"annotation":3521},[3485,3485],{"left":3522,"slice":3523},{"name":962,"cls":814},{"name":3306,"cls":814},{"type":775,"name":3441,"path":3302,"parent":754,"description":3525,"lines":3526,"value":964,"annotation":3527},"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.",[1173,1467],{"name":757,"cls":814},{"type":775,"name":3442,"path":3302,"parent":754,"description":3529,"lines":3530,"value":964,"annotation":3533},"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.",[3531,3532],106,116,{"name":758,"cls":814},{"type":891,"name":3447,"path":3302,"parent":754,"description":3535,"lines":3536,"parameters":3538,"returns":3540},"Deserializes the `Response.payload.result()` bytes and consecutively applies `self.parsers`.",[2528,3537],130,[3539],{"name":954,"kind":899,"required":902},{"description":3541,"annotation":3542},"The deserialized `Response.payload` or None if `Command.is_void` is True.",{"name":1535,"cls":814},{"type":891,"name":3448,"path":3302,"parent":754,"description":3544,"lines":3545,"parameters":3547,"returns":3554},"Serializes the message into bytes. Uses `self.message` if `message` is None.\nNB: Calling with a custom `message` DOES NOT SET the `self.message'` attribute;\nthe `Request` sent to the device will use the `self.message` attribute.",[2544,3546],145,[3548,3549],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":3550,"required":42,"default":964,"description":3553},{"left":3551,"slice":3552},{"name":959,"cls":814},{"name":1532,"cls":814},"A command input, or None to use `self.message`.",{"description":3555,"annotation":3556},"The serialized message to be sent to the device.",{"name":901,"cls":814},{"type":891,"name":3449,"path":3302,"parent":754,"description":3558,"lines":3559,"decorators":3561,"parameters":3562,"returns":3566},"User-configured serialization method.",[3560,2554],147,[2069],[3563,3564],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":3565,"required":902},{"name":1532,"cls":814},{"description":918,"annotation":3567},{"name":901,"cls":814},{"type":891,"name":3450,"path":3302,"parent":754,"description":3569,"lines":3570,"parameters":3571,"returns":3578},"Deserializes the `response` bytes. Calls `_deserialize` with `self.response` payload if `response` is None.",[3026,3039],[3572,3573],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":3574,"required":42,"default":964,"description":3577},{"left":3575,"slice":3576},{"name":959,"cls":814},{"name":901,"cls":814},"bytes to be deserialized, or None to use `Response` payload.",{"description":3579,"annotation":3580},"None if `self.is_void`, else the deserialized `response`.",{"name":1533,"cls":814},{"type":891,"name":3451,"path":3302,"parent":754,"description":3582,"lines":3583,"decorators":3585,"parameters":3586,"returns":3590},"User-configured deserialization method.",[3584,3040],171,[2069],[3587,3588],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":3589,"required":902},{"name":901,"cls":814},{"description":918,"annotation":3591},{"name":1533,"cls":814},{"type":891,"name":3452,"path":3302,"parent":754,"description":3593,"lines":3594,"parameters":3595,"returns":3600},"Validate a serialized message.\nCalled within `Command.request` before generating a `Request` object.",[3046,3058],[3596,3597],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":3598,"required":902,"description":3599},{"name":901,"cls":814},"The serialized message to set as the `Request.payload`, if valid.",{"description":3601,"annotation":3602},"Whether or not the `message` is valid.",{"name":1111,"cls":814},{"type":891,"name":3453,"path":3302,"parent":754,"description":3604,"lines":3605,"parameters":3608},"Set the result of `self.response.payload` to `self._response_buffer` and clears `self._response_buffer`.",[3606,3607],190,196,[3609],{"name":954,"kind":899,"required":902},{"type":891,"name":3454,"path":3302,"parent":754,"description":3611,"lines":3612,"parameters":3615},"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 \u002F 'valid'.\nIf the response is valid, it sets the `Response.payload.result`\nto the accumulated bytes from the `_response_buffer`.",[3613,3614],198,212,[3616,3617],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":3618,"required":902,"description":3619},{"name":901,"cls":814},"The bytes from the `Transport` to add to the response_buffer and evaluate for completeness.",{"type":891,"name":3455,"path":3302,"parent":754,"description":3621,"lines":3622,"parameters":3625,"returns":3630},"User-configured response validation method.\n\nValidate the data received from the `Transport` and determine if the data is a complete response.\nSubclasses override this method to specify behavior for validating data before setting it as the response.",[3623,3624],214,227,[3626,3627],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":3628,"required":902,"description":3629},{"name":901,"cls":814},"The bytes to evaluate for completeness.",{"description":3631,"annotation":3632},"True if `data` is a complete, valid message from the device, otherwise False.",{"name":1111,"cls":814},{"type":891,"name":3456,"path":3302,"parent":754,"description":3634,"lines":3635,"parameters":3637,"returns":3642,"examples":3645},"For devices that allow parallel command processing, first check if `data` belongs\nto this command and then validate the response.",[3059,3636],256,[3638,3639],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":3640,"required":902,"description":3641},{"name":901,"cls":814},"The bytes to check for match during parallel processing, usually an identifier\nshared by request and response.",{"description":3643,"annotation":3644},"True if the `data` matches to this command, otherwise False.",{"name":1111,"cls":814},[3646],{"description":3647,"code":3648},"For a command which expects responses to begin with the shared identifier `command_id`",">>> class MyCommand(Command):\n>>>   command_id: str = uuid.uuid4().hex\n>>>   def match_response(self, data: bytes):\n>>>     try:\n>>>       processed_data: str = 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":775,"name":3443,"path":3302,"parent":754,"description":3650,"lines":3651,"value":964,"annotation":3653},"Parsers are functions that are applied to the deserialized data when calling `result()`.",[3652,1806],259,{"left":3654,"slice":3655},{"name":962,"cls":814},{"name":3306,"cls":814},{"type":891,"name":3457,"path":3302,"parent":754,"description":3657,"lines":3658,"parameters":3660,"returns":3671,"examples":3679},"Add a parser to the list of parsers applied when calling `result()`.\nParsers are chained together in the order that they are added and are consecutively applied\nto the deserialized data based on the return value of the previous parser, meaning that any\ndata filtered by earlier parsers will no longer be accessible to later parsers.",[3659,1830],265,[3661,3662],{"name":954,"kind":899,"required":902},{"name":3663,"kind":899,"annotation":3664,"required":902,"description":3670},"parser",{"left":3665,"slice":3666},{"name":3306,"cls":814},{"elements":3667},[3668,3669],{"name":3304,"cls":814},{"name":3305,"cls":814},"A function that operates on the deserialized `result` (the first `Parser`), or the result of another `Parser`\n(all parsers after the first are chained together).",{"description":918,"annotation":3672},{"left":3673,"slice":3674},{"name":754,"cls":814},{"elements":3675},[3676,3677,3678],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":3305,"cls":814},[3680,3682],{"description":734,"code":3681},">>> def parser(data) -> dict[str, str]:\n>>>   return {\"data\": data.upper()}\n>>> cmd = SerialCommand(\"message\").add_parser(parser)\nType inference only works as expected with the `Command` returned from `add_parser`",{"description":3683,"code":3684},"Can be chained to add multiple parsers",">>> cmd = SerialCommand(\"message\").add_parser(parser1).add_parser(parser2)",{"type":891,"name":3458,"path":3302,"parent":754,"lines":3686,"parameters":3687,"returns":3691},[1848,3422],[3688,3689],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":3690,"required":902},{"name":1535,"cls":814},{"description":918,"annotation":3692},{"name":1535,"cls":814},{"type":738,"name":3235,"path":3694,"parent":748,"attributes":3695,"classes":3701,"functions":3702},"unitelabs\u002Fbus\u002Fcommands\u002Fbuilder.py",[1532,1533,3696,3697,3698,3699,3700,3306],"unitelabs.bus.commands.builder.P","unitelabs.bus.commands.builder.T","unitelabs.bus.commands.builder.R","unitelabs.bus.commands.builder.S_InType","unitelabs.bus.commands.builder.D_OutType",[755],[3246],{"type":775,"name":3696,"path":3694,"parent":3235,"lines":3704,"value":3323},[836,836],{"type":775,"name":3697,"path":3694,"parent":3235,"lines":3706,"value":3707},[777,777],"TypeVar('T')",{"type":775,"name":3698,"path":3694,"parent":3235,"lines":3709,"value":3710},[873,873],"TypeVar('R', default=InType)",{"type":775,"name":3699,"path":3694,"parent":3235,"lines":3712,"value":3713},[843,843],"TypeVar('S_InType')",{"type":775,"name":3700,"path":3694,"parent":3235,"lines":3715,"value":3716},[844,844],"TypeVar('D_OutType')",{"type":806,"name":755,"path":3694,"parent":3235,"lines":3718,"bases":3720,"attributes":3729,"functions":3739,"mro":3749},[1239,3719],347,[3721],{"annotation":3722},{"left":3723,"slice":3724},{"name":3124,"cls":814},{"elements":3725},[3726,3727,3728],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":3698,"cls":814},[3730,3731,3732,3733,3734,3735,3736,3737,3738],"unitelabs.bus.commands.builder.CommandBuilder._command","unitelabs.bus.commands.builder.CommandBuilder._cmd_cls_name","unitelabs.bus.commands.builder.CommandBuilder._serializer","unitelabs.bus.commands.builder.CommandBuilder._deserializer","unitelabs.bus.commands.builder.CommandBuilder._response_validator","unitelabs.bus.commands.builder.CommandBuilder._response_validator_timeout","unitelabs.bus.commands.builder.CommandBuilder._timeout","unitelabs.bus.commands.builder.CommandBuilder._is_void","unitelabs.bus.commands.builder.CommandBuilder._parsers",[3740,3741,3742,3743,3744,3745,3746,3747,3748],"unitelabs.bus.commands.builder.CommandBuilder.__init__","unitelabs.bus.commands.builder.CommandBuilder.create_command_method","unitelabs.bus.commands.builder.CommandBuilder.with_serializer","unitelabs.bus.commands.builder.CommandBuilder.with_deserializer","unitelabs.bus.commands.builder.CommandBuilder.with_parser","unitelabs.bus.commands.builder.CommandBuilder.with_timeout","unitelabs.bus.commands.builder.CommandBuilder.without_response","unitelabs.bus.commands.builder.CommandBuilder.with_multiline","unitelabs.bus.commands.builder.CommandBuilder.build",[755],{"type":891,"name":3740,"path":3694,"parent":755,"description":3751,"lines":3752,"parameters":3753},"        Class that coordinates the chainable building of a `Command` instance.\n\n        Args:\n          command: The `Command` class to build on top of.\n          cls_name: The name of the `Command` subclass returned by `build`.\n\n        Examples:\n          Call functions individually\n          >>> builder = CommandBuilder(ByteCommand)\n          >>> builder = builder.with_serializer(lambda x: x + b\"\r\n\")\n          >>> builder = builder.with_deserializer(lambda x: x.strip(b\"\r\n\"))\n          >>> cmd = builder.build(\"message\", timeout=0.5, is_void=True)\n\n          Chain functions together\n          >>> cmd = CommandBuilder(ByteCommand)           >>>   .with_serializer(lambda x: x + b\"\r\n\")           >>>   .with_deserializer(lambda x: x.strip(b\"\r\n\"))           >>>   .build(\"message\", timeout=0.5, is_void=True)\n\n          Create multiple commands from the same builder, or builder intermediate\n          >>> crlf_builder = CommandBuilder(ByteCommand)           >>>   .with_serializer(lambda x: x + b\"\r\n\")           >>>   .with_deserializer(lambda x: x.strip(b\"\r\n\"))\n          >>> cmd = crlf_builder.build(\"message\", timeout=0.5)\n          >>> cmd2 = crlf_builder.build(\"message2\", timeout=0.5)\n          >>> cmd3 = crlf_builder.with_serializer(lambda x: x).build(b\"message3\", timeout=0.5)\n          Here `cmd` and `cmd2` both use the same serializer and deserializer methods,\n          but `cmd3` uses a different serializer.",[1964,1341],[3754,3755,3765],{"name":954,"kind":899,"required":902},{"name":1869,"kind":899,"annotation":3756,"required":42,"default":3764},{"left":3757,"slice":3758},{"name":1445,"cls":814},{"left":3759,"slice":3760},{"name":754,"cls":814},{"elements":3761},[3762,3763],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":753,"cls":814},{"name":3766,"kind":899,"annotation":3767,"required":42,"default":3768},"cls_name",{"name":994,"cls":814},"'BuiltCommand'",{"type":775,"name":3730,"path":3694,"parent":755,"lines":3770,"value":1869},[2110,2110],{"type":775,"name":3731,"path":3694,"parent":755,"lines":3772,"value":3766},[1141,1141],{"type":775,"name":3732,"path":3694,"parent":755,"lines":3774,"value":964},[1652,1652],{"type":775,"name":3733,"path":3694,"parent":755,"lines":3776,"value":964},[2280,2280],{"type":775,"name":3734,"path":3694,"parent":755,"lines":3778,"value":964},[1142,1142],{"type":775,"name":3735,"path":3694,"parent":755,"lines":3780,"value":964},[1004,1004],{"type":775,"name":3736,"path":3694,"parent":755,"lines":3782,"value":964},[1150,1150],{"type":775,"name":3737,"path":3694,"parent":755,"lines":3784,"value":1112},[1009,1009],{"type":775,"name":3738,"path":3694,"parent":755,"lines":3786,"value":1643,"annotation":3787},[1341,1341],{"left":3788,"slice":3789},{"name":962,"cls":814},{"name":3306,"cls":814},{"type":891,"name":3741,"path":3694,"parent":755,"description":3791,"lines":3792,"decorators":3793,"parameters":3795,"returns":3807,"throws":3831,"examples":3835},"Wrap a function into a command method.",[1663,2544],[3794],"staticmethod",[3796,3805],{"name":3797,"kind":899,"annotation":3798,"required":902,"description":3804},"func",{"left":3799,"slice":3800},{"name":1314,"cls":814},{"elements":3801},[3802,3803],{"name":3696,"cls":814},{"name":3697,"cls":814},"The function to format into a command method. Must be a callable with a final signature of (input) or (self, input)\nwhen partially loaded with `kwargs`.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":3806},"Keyword arguments to pass to the command method.",{"description":3808,"annotation":3809},"A wrapped, partially-loaded function with the final signature of (input) or (self, input).",{"left":3810,"slice":3811},{"name":908,"cls":814},{"elements":3812},[3813,3825],{"left":3814,"slice":3815},{"name":1314,"cls":814},{"elements":3816},[3817,3824],{"left":3818,"slice":3820},{"name":3819,"cls":814},"typing_extensions.Concatenate",{"elements":3821},[3822,3823],{"name":754,"cls":814},{"name":3696,"cls":814},{"name":3697,"cls":814},{"left":3826,"slice":3827},{"name":1314,"cls":814},{"elements":3828},[3829,3830],{"name":3696,"cls":814},{"name":3697,"cls":814},[3832],{"description":3833,"annotation":3834},"If the function is not a callable with exactly 1 or 2 unset parameters (based on `kwargs` and default values).",{"name":804,"cls":814},[3836,3839],{"description":3837,"code":3838},"Provide a function with all parameters set.",">>> def my_func(message: str, submessage: str, is_complex: bool = False) -> str:\n>>>     return (message + submessage) if is_complex else message\n>>> new_func = builder.create_command_method(my_func, submessage=\"shhh\", is_complex=True)\nThe new function signature is (message: str) -> str",{"description":3840,"code":3841},"Missing parameters may cause a `TypeError`",">>> new_func = builder.create_command_method(my_func, is_complex=True)\nThe new function signature is (self, message: str) -> str\n  A `TypeError` will be raised. The underlying function has a true signature (message: str, submessage: str)\n  `Command` will be passed in as the first parameter.",{"type":891,"name":3742,"path":3694,"parent":755,"description":3843,"lines":3844,"parameters":3846,"returns":3863},"Set a serializer to apply to the `Command.message` before sending it to the device.\n\nThe serializer will be called with the message to send to the device as the first and only argument.\nAdditional arguments can be preloaded into the serializer with `**kwargs`.",[3845,2122],134,[3847,3848,3861],{"name":954,"kind":899,"required":902},{"name":3849,"kind":899,"annotation":3850,"required":902,"description":3860},"serializer",{"left":3851,"slice":3852},{"name":908,"cls":814},{"elements":3853},[3854,3857],{"left":3855,"slice":3856},{"name":3308,"cls":814},{"name":3699,"cls":814},{"left":3858,"slice":3859},{"name":3309,"cls":814},{"name":3699,"cls":814},"The serializer function to apply.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":3862},"Keyword arguments to pass to the serializer.",{"description":918,"annotation":3864},{"left":3865,"slice":3866},{"name":755,"cls":814},{"elements":3867},[3868,3869,3870],{"name":3699,"cls":814},{"name":1533,"cls":814},{"name":3698,"cls":814},{"type":891,"name":3743,"path":3694,"parent":755,"description":3872,"lines":3873,"parameters":3874,"returns":3891,"examples":3899},"Set a deserializer function to apply to the `Command.response` recieved from the device.\n\nThe deserializer will be called with the response bytes as the first and only argument.\nAdditional arguments can be preloaded into the deserializer with  `**kwargs`.\n\nThis function will wrap the deserializer in a check for null values to ensure that calls without `response'\nuse the `Response.payload.result()`.",[2560,1745],[3875,3876,3889],{"name":954,"kind":899,"required":902},{"name":3877,"kind":899,"annotation":3878,"required":902,"description":3888},"deserializer",{"left":3879,"slice":3880},{"name":908,"cls":814},{"elements":3881},[3882,3885],{"left":3883,"slice":3884},{"name":3310,"cls":814},{"name":3700,"cls":814},{"left":3886,"slice":3887},{"name":3311,"cls":814},{"name":3700,"cls":814},"The deserializer function to apply.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":3890},"Keyword arguments to pass to the deserializer.",{"description":918,"annotation":3892},{"left":3893,"slice":3894},{"name":755,"cls":814},{"elements":3895},[3896,3897,3898],{"name":1532,"cls":814},{"name":3700,"cls":814},{"name":3698,"cls":814},[3900,3903,3906],{"description":3901,"code":3902},"Use an existing deserializer function.",">>> builder = CommandBuilder(ByteCommand)\n>>> def deserializer(response: bytes) -> bytes:\n>>>     return response.strip()\n>>> builder.with_deserializer(deserializer)",{"description":3904,"code":3905},"Equivalent functionality with a lambda function.",">>> builder = CommandBuilder(ByteCommand)\n>>> builder.with_deserializer(lambda response: response.strip())",{"description":3907,"code":3908},"Use a custom deserializer function containing kwargs.",">>> def deserializer(response: bytes, match: str, multi: typing.Optional[bool]) -> str:\n>>>     pass\n>>> builder.with_deserializer(deserializer, match=\"foo\", multi=True)\nAll parameters for the deserializer _must_ be passed as kwargs.",{"type":891,"name":3744,"path":3694,"parent":755,"description":3910,"lines":3911,"parameters":3912,"returns":3924},"Add a partial parser function to the `Command`, which will be applied,\nin order, to the deserialized data when calling `Command.result()`.\n\nParsers are chained together consequetively and must pass data through to the next parser.",[1764,3623],[3913,3914,3922],{"name":954,"kind":899,"required":902},{"name":3663,"kind":899,"annotation":3915,"required":902,"description":3921},{"left":3916,"slice":3917},{"name":3306,"cls":814},{"elements":3918},[3919,3920],{"name":3696,"cls":814},{"name":3697,"cls":814},"The parser function to apply.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":3923},"Keyword arguments to pass to the parser.",{"description":918,"annotation":3925},{"left":3926,"slice":3927},{"name":755,"cls":814},{"elements":3928},[3929,3930,3931],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":3697,"cls":814},{"type":891,"name":3745,"path":3694,"parent":755,"description":3933,"lines":3934,"parameters":3936,"returns":3941,"throws":3944},"Set the timeout to apply to the command.\n\nAlternative to setting `timeout` in `build`, will be overriden by `timeout` in `build`, if provided.",[3935,3065],216,[3937,3938],{"name":954,"kind":899,"required":902},{"name":1749,"kind":899,"annotation":3939,"required":902,"description":3940},{"name":1609,"cls":814},"The timeout to apply to the command.",{"description":918,"annotation":3942},{"name":3943,"cls":814},"typing_extensions.Self",[3945],{"description":3946,"annotation":3947},"If the timeout is lower than 0.",{"name":761,"cls":814},{"type":891,"name":3746,"path":3694,"parent":755,"description":3949,"lines":3950,"parameters":3953,"returns":3955,"examples":3961},"Set the command to be a void command, i.e. return None as a response.\n\nAlternative to setting `is_void` in `build`, will be overriden by `is_void` in `build`, if provided.",[3951,3952],233,246,[3954],{"name":954,"kind":899,"required":902},{"description":918,"annotation":3956},{"left":3957,"slice":3958},{"name":755,"cls":814},{"elements":3959},[3960,964,964],{"name":1532,"cls":814},[3962],{"description":734,"code":3963},">>> builder = CommandBuilder().without_response()\n>>> cmd: Command[bytes, None, None] = builder.build(b\"message\")\n>>> res = await protocol.execute(cmd)\n>>> assert res is None",{"type":891,"name":3747,"path":3694,"parent":755,"description":3965,"lines":3966,"parameters":3969,"returns":3998},"Handle multi-line responses.\n\n        Examples:\n          Use the base class's `_validate_response` method.\n          >>> builder = CommandBuilder().with_multiline(0.01)\n          >>> cmd = builder.build(b\"message\")\n\n          Provide a custom validation function.\n          >>> builder = builder.with_multiline(0.01, validate_response=lambda x: x.endswith(b\"\r\n\"))\n          >>> cmd = builder.build(b\"message\")\n\n        Args:\n          timeout: The time in seconds to wait for more data before calling the `_validate_response` method.\n          validate_response: The function to replace the `Command._validate_response` method.\n\n        Raises:\n          CommandValidationError: If the timeout is lower than 0.",[3967,3968],248,287,[3970,3971,3973],{"name":954,"kind":899,"required":902},{"name":1749,"kind":899,"annotation":3972,"required":902},{"name":1609,"cls":814},{"name":3974,"kind":899,"annotation":3975,"required":42,"default":964},"validate_response",{"left":3976,"slice":3977},{"name":959,"cls":814},{"left":3978,"slice":3979},{"name":908,"cls":814},{"elements":3980},[3981,3989],{"left":3982,"slice":3983},{"name":1314,"cls":814},{"elements":3984},[3985,3988],{"elements":3986},[3987],{"name":901,"cls":814},{"name":1111,"cls":814},{"left":3990,"slice":3991},{"name":1314,"cls":814},{"elements":3992},[3993,3997],{"elements":3994},[3995,3996],{"name":754,"cls":814},{"name":901,"cls":814},{"name":1111,"cls":814},{"description":918,"annotation":3999},{"name":3943,"cls":814},{"type":891,"name":3748,"path":3694,"parent":755,"description":4001,"lines":4002,"parameters":4004,"returns":4022},"Build the `Command` instance with the previously set serializer, deserializer and parsers.",[4003,3719],289,[4005,4006,4009,4011,4015,4020],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4007,"required":902,"description":4008},{"name":1532,"cls":814},"The message to send to the device.",{"name":3348,"kind":3349,"required":42,"default":3350,"description":4010},"Additional positional arguments to pass to the command.",{"name":1749,"kind":1320,"annotation":4012,"required":42,"default":964,"description":3940},{"left":4013,"slice":4014},{"name":959,"cls":814},{"name":1609,"cls":814},{"name":3471,"kind":1320,"annotation":4016,"required":42,"default":964,"description":4019},{"left":4017,"slice":4018},{"name":959,"cls":814},{"name":1111,"cls":814},"Whether the command is a void command.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":4021},"Additional keyword arguments to pass to the command.",{"description":4023,"annotation":4024},"A custom `Command` instance.",{"left":4025,"slice":4026},{"name":754,"cls":814},{"elements":4027},[4028,4029,4030],{"name":1532,"cls":814},{"name":1533,"cls":814},{"name":3698,"cls":814},{"type":738,"name":3236,"path":4032,"parent":748,"classes":4033},"unitelabs\u002Fbus\u002Fcommands\u002Fserial_command.py",[759],{"type":806,"name":759,"path":4032,"parent":3236,"description":4035,"lines":4036,"bases":4037,"attributes":4045,"functions":4049,"mro":4054},"Command for use with serial communication device.",[819,1129],[4038],{"annotation":4039},{"left":4040,"slice":4041},{"name":754,"cls":814},{"elements":4042},[4043,4044],{"name":994,"cls":814},{"name":994,"cls":814},[4046,4047,4048,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443],"unitelabs.bus.commands.serial_command.SerialCommand._read_terminator","unitelabs.bus.commands.serial_command.SerialCommand._write_terminator","unitelabs.bus.commands.serial_command.SerialCommand._encoding",[4050,4051,4052,4053,3445,3447,3448,3450,3452,3453,3454,3456,3457,3458],"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",[759,754],{"type":891,"name":4050,"path":4032,"parent":759,"lines":4056,"parameters":4057},[950,1248],[4058,4059,4062,4067,4071,4076],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4060,"required":902,"description":4061},{"name":994,"cls":814},"the string message to send to the device.",{"name":4063,"kind":899,"annotation":4064,"required":42,"default":4065,"description":4066},"read_terminator",{"name":901,"cls":814},"b'\\r\\n'","the byte-string expected at the end of messages coming from the device.",{"name":4068,"kind":899,"annotation":4069,"required":42,"default":4065,"description":4070},"write_terminator",{"name":901,"cls":814},"the byte-string to append to our string `message` which indicates to the device that\na complete message has been received.",{"name":4072,"kind":899,"annotation":4073,"required":42,"default":4074,"description":4075},"encoding",{"name":994,"cls":814},"'ascii'","The encoding used to convert between strings and bytes.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":4077},"Additional `Command` kwargs.",{"type":775,"name":4046,"path":4032,"parent":759,"lines":4079,"value":4063},[1091,1091],{"type":775,"name":4047,"path":4032,"parent":759,"lines":4081,"value":4068},[895,895],{"type":775,"name":4048,"path":4032,"parent":759,"lines":4083,"value":4072},[1248,1248],{"type":891,"name":4051,"path":4032,"parent":759,"lines":4085,"parameters":4086,"returns":4092},[974,991],[4087,4088],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4089,"required":42,"default":964},{"left":4090,"slice":4091},{"name":959,"cls":814},{"name":994,"cls":814},{"description":918,"annotation":4093},{"name":901,"cls":814},{"type":891,"name":4052,"path":4032,"parent":759,"lines":4095,"parameters":4096,"returns":4102},[1124,997],[4097,4098],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":4099,"required":902},{"left":4100,"slice":4101},{"name":959,"cls":814},{"name":901,"cls":814},{"description":918,"annotation":4103},{"name":994,"cls":814},{"type":891,"name":4053,"path":4032,"parent":759,"lines":4105,"parameters":4106,"returns":4110},[998,1129],[4107,4108],{"name":954,"kind":899,"required":902},{"name":1019,"kind":899,"annotation":4109,"required":902},{"name":901,"cls":814},{"description":918,"annotation":4111},{"name":1111,"cls":814},{"type":738,"name":3237,"path":4113,"parent":748,"classes":4114},"unitelabs\u002Fbus\u002Fcommands\u002Fhttp_command.py",[4115,4116,756],"unitelabs.bus.commands.http_command._Method","unitelabs.bus.commands.http_command.HTTPResponse",{"type":806,"name":4115,"path":4113,"parent":3237,"lines":4118,"bases":4119,"attributes":4124,"mro":4134},[827,950],[4120,4122],{"annotation":4121},{"name":994,"cls":814},{"annotation":4123},{"name":2215,"cls":814},[4125,4126,4127,4128,4129,4130,4131,4132,4133],"unitelabs.bus.commands.http_command._Method.OPTIONS","unitelabs.bus.commands.http_command._Method.GET","unitelabs.bus.commands.http_command._Method.HEAD","unitelabs.bus.commands.http_command._Method.POST","unitelabs.bus.commands.http_command._Method.PUT","unitelabs.bus.commands.http_command._Method.DELETE","unitelabs.bus.commands.http_command._Method.TRACE","unitelabs.bus.commands.http_command._Method.CONNECT","unitelabs.bus.commands.http_command._Method.PATCH",[4115],{"type":775,"name":4125,"path":4113,"parent":4115,"lines":4136,"value":4137},[927,927],"'OPTIONS'",{"type":775,"name":4126,"path":4113,"parent":4115,"lines":4139,"value":4140},[3142,3142],"'GET'",{"type":775,"name":4127,"path":4113,"parent":4115,"lines":4142,"value":4143},[835,835],"'HEAD'",{"type":775,"name":4128,"path":4113,"parent":4115,"lines":4145,"value":4146},[836,836],"'POST'",{"type":775,"name":4129,"path":4113,"parent":4115,"lines":4148,"value":4149},[777,777],"'PUT'",{"type":775,"name":4130,"path":4113,"parent":4115,"lines":4151,"value":4152},[873,873],"'DELETE'",{"type":775,"name":4131,"path":4113,"parent":4115,"lines":4154,"value":4155},[843,843],"'TRACE'",{"type":775,"name":4132,"path":4113,"parent":4115,"lines":4157,"value":4158},[844,844],"'CONNECT'",{"type":775,"name":4133,"path":4113,"parent":4115,"lines":4160,"value":4161},[950,950],"'PATCH'",{"type":806,"name":4116,"path":4113,"parent":3237,"lines":4163,"decorators":4164,"attributes":4165,"functions":4169,"mro":4171},[1964,967],[1920],[4166,4167,4168],"unitelabs.bus.commands.http_command.HTTPResponse.status_code","unitelabs.bus.commands.http_command.HTTPResponse.headers","unitelabs.bus.commands.http_command.HTTPResponse.payload",[4170],"unitelabs.bus.commands.http_command.HTTPResponse.__init__",[4116],{"type":775,"name":4166,"path":4113,"parent":4116,"lines":4173,"value":964,"annotation":4174},[1352,1352],{"name":1181,"cls":814},{"type":775,"name":4167,"path":4113,"parent":4116,"lines":4176,"value":4177,"annotation":4178},[1243,1243],"dataclasses.field(default_factory=dict)",{"left":4179,"slice":4180},{"name":1488,"cls":814},{"elements":4181},[4182,4183],{"name":994,"cls":814},{"name":994,"cls":814},{"type":775,"name":4168,"path":4113,"parent":4116,"lines":4185,"value":964,"annotation":4186},[967,967],{"left":4187,"slice":4188},{"name":959,"cls":814},{"name":901,"cls":814},{"type":891,"name":4170,"path":4113,"parent":4116,"lines":4190,"parameters":4191},[2003,2003],[4192,4193,4196,4204],{"name":954,"kind":899,"required":902},{"name":4194,"kind":899,"annotation":4195,"required":902},"status_code",{"name":1181,"cls":814},{"name":4197,"kind":899,"annotation":4198,"required":42},"headers",{"left":4199,"slice":4200},{"name":1488,"cls":814},{"elements":4201},[4202,4203],{"name":994,"cls":814},{"name":994,"cls":814},{"name":3293,"kind":899,"annotation":4205,"required":42,"default":964},{"left":4206,"slice":4207},{"name":959,"cls":814},{"name":901,"cls":814},{"type":806,"name":756,"path":4113,"parent":3237,"description":4209,"lines":4210,"bases":4211,"attributes":4219,"functions":4225,"mro":4229},"An HTTP Request.",[895,3513],[4212],{"annotation":4213},{"left":4214,"slice":4215},{"name":754,"cls":814},{"elements":4216},[4217,4218],{"name":901,"cls":814},{"name":4116,"cls":814},[4220,4221,4222,4223,4224,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443],"unitelabs.bus.commands.http_command.HTTPCommand.Method","unitelabs.bus.commands.http_command.HTTPCommand.host","unitelabs.bus.commands.http_command.HTTPCommand.path","unitelabs.bus.commands.http_command.HTTPCommand.method","unitelabs.bus.commands.http_command.HTTPCommand.headers",[4226,4227,4228,3445,3447,3448,3450,3452,3453,3454,3455,3456,3457,3458],"unitelabs.bus.commands.http_command.HTTPCommand.__init__","unitelabs.bus.commands.http_command.HTTPCommand._serialize","unitelabs.bus.commands.http_command.HTTPCommand._deserialize",[756,754],{"type":775,"name":4220,"path":4113,"parent":756,"lines":4231,"value":4232,"annotation":4233},[998,998],"_Method",{"left":4234,"slice":4235},{"name":1445,"cls":814},{"name":4115,"cls":814},{"type":891,"name":4226,"path":4113,"parent":756,"lines":4237,"parameters":4238},[1003,1150],[4239,4240,4245,4251,4256,4261,4271,4276],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4241,"required":42,"default":964,"description":4244},{"left":4242,"slice":4243},{"name":959,"cls":814},{"name":901,"cls":814},"The `body` of the request.",{"name":4246,"kind":899,"annotation":4247,"required":42,"default":964,"description":4250},"host",{"left":4248,"slice":4249},{"name":959,"cls":814},{"name":994,"cls":814},"The host of the remote server.",{"name":4252,"kind":899,"annotation":4253,"required":42,"default":4254,"description":4255},"path",{"name":994,"cls":814},"'\u002F'","The path of the HTTP request.",{"name":4257,"kind":899,"annotation":4258,"required":42,"default":4259,"description":4260},"method",{"name":4115,"cls":814},{"name":4126,"cls":814},"The type of HTTP request.",{"name":4197,"kind":899,"annotation":4262,"required":42,"default":964,"description":4270},{"left":4263,"slice":4264},{"name":959,"cls":814},{"left":4265,"slice":4266},{"name":1488,"cls":814},{"elements":4267},[4268,4269],{"name":994,"cls":814},{"name":994,"cls":814},"The headers of the HTTP request.",{"name":1749,"kind":899,"annotation":4272,"required":42,"default":964,"description":4275},{"left":4273,"slice":4274},{"name":959,"cls":814},{"name":1609,"cls":814},"How long in seconds to wait for a response.",{"name":3471,"kind":899,"annotation":4277,"required":42,"default":1112,"description":4278},{"name":1111,"cls":814},"Whether or not we should wait for a response at all.",{"type":775,"name":4221,"path":4113,"parent":756,"lines":4280,"value":4246},[2280,2280],{"type":775,"name":4222,"path":4113,"parent":756,"lines":4282,"value":4252},[1142,1142],{"type":775,"name":4223,"path":4113,"parent":756,"lines":4284,"value":4257},[1004,1004],{"type":775,"name":4224,"path":4113,"parent":756,"lines":4286,"value":4287},[1150,1150],"headers or {}",{"type":891,"name":4227,"path":4113,"parent":756,"lines":4289,"parameters":4290,"returns":4294},[1341,1594],[4291,4292],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4293,"required":902},{"name":901,"cls":814},{"description":918,"annotation":4295},{"name":901,"cls":814},{"type":891,"name":4228,"path":4113,"parent":756,"lines":4297,"parameters":4298,"returns":4302},[2291,3513],[4299,4300],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":4301,"required":902},{"name":901,"cls":814},{"description":918,"annotation":4303},{"name":4116,"cls":814},{"type":738,"name":3238,"path":4305,"parent":748,"classes":4306},"unitelabs\u002Fbus\u002Fcommands\u002Fbyte_command.py",[753],{"type":806,"name":753,"path":4305,"parent":3238,"description":4308,"lines":4309,"bases":4310,"attributes":4318,"functions":4319,"mro":4323},"The most basic form of a `Command`, which ingests and returns bytes.",[819,1352],[4311],{"annotation":4312},{"left":4313,"slice":4314},{"name":754,"cls":814},{"elements":4315},[4316,4317],{"name":901,"cls":814},{"name":901,"cls":814},[3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443],[4320,4321,4322,3445,3447,3448,3450,3452,3453,3454,3455,3456,3457,3458],"unitelabs.bus.commands.byte_command.ByteCommand.__init__","unitelabs.bus.commands.byte_command.ByteCommand._serialize","unitelabs.bus.commands.byte_command.ByteCommand._deserialize",[753,754],{"type":891,"name":4320,"path":4305,"parent":753,"lines":4325,"parameters":4326},[927,844],[4327,4328,4330,4334,4338],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4329,"required":902},{"name":901,"cls":814},{"name":1749,"kind":899,"annotation":4331,"required":42,"default":964},{"left":4332,"slice":4333},{"name":959,"cls":814},{"name":1609,"cls":814},{"name":3471,"kind":899,"annotation":4335,"required":42,"default":1112},{"left":4336,"slice":4337},{"name":959,"cls":814},{"name":1111,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117},{"type":891,"name":4321,"path":4305,"parent":753,"lines":4340,"parameters":4341,"returns":4347},[1307,1239],[4342,4343],{"name":954,"kind":899,"required":902},{"name":3226,"kind":899,"annotation":4344,"required":42,"default":964},{"left":4345,"slice":4346},{"name":959,"cls":814},{"name":901,"cls":814},{"description":918,"annotation":4348},{"name":901,"cls":814},{"type":891,"name":4322,"path":4305,"parent":753,"lines":4350,"parameters":4351,"returns":4355},[1223,1352],[4352,4353],{"name":954,"kind":899,"required":902},{"name":1155,"kind":899,"annotation":4354,"required":902},{"name":901,"cls":814},{"description":918,"annotation":4356},{"name":901,"cls":814},{"type":738,"name":3239,"path":4358,"parent":748,"classes":4359},"unitelabs\u002Fbus\u002Fcommands\u002Fresponse.py",[758],{"type":806,"name":758,"path":4358,"parent":3239,"description":4361,"lines":4362,"decorators":4363,"attributes":4364,"functions":4366,"mro":4370},"Protocols use `Response`s to specify data that is received from a transport.",[826,1593],[1920],[4365],"unitelabs.bus.commands.response.Response.request",[4367,4368,4369],"unitelabs.bus.commands.response.Response.__init__","unitelabs.bus.commands.response.Response.__post_init__","unitelabs.bus.commands.response.Response.__handle_done",[758],{"type":775,"name":4365,"path":4358,"parent":758,"lines":4372,"value":964,"annotation":4373},[1307,1307],{"name":757,"cls":814},{"type":891,"name":4368,"path":4358,"parent":758,"lines":4375,"parameters":4376},[1964,967],[4377],{"name":954,"kind":899,"required":902},{"type":891,"name":4369,"path":4358,"parent":758,"description":4379,"lines":4380,"parameters":4381},"The callback to be run when the payload `Future` becomes done.",[1091,1593],[4382,4383],{"name":954,"kind":899,"required":902},{"name":4384,"kind":899,"annotation":4385,"required":902,"description":4389},"_payload",{"left":4386,"slice":4388},{"name":4387,"cls":814},"asyncio.Future",{"name":901,"cls":814},"The `Future` object.",{"type":891,"name":4367,"path":4358,"parent":758,"lines":4391,"parameters":4392},[2003,2003],[4393,4394],{"name":954,"kind":899,"required":902},{"name":898,"kind":899,"annotation":4395,"required":902},{"name":757,"cls":814},{"type":738,"name":749,"path":4397,"parent":739,"packages":4398,"attributes":4404,"classes":4406,"functions":4407},"unitelabs\u002Fbus\u002Ffactories\u002F__init__.py",[4399,4400,4401,4402,4403],"unitelabs.bus.factories.usb_factory","unitelabs.bus.factories.serial_factory","unitelabs.bus.factories.transport_factory","unitelabs.bus.factories.tcp_factory","unitelabs.bus.factories.udp_factory",[4405],"unitelabs.bus.factories.__all__",[764],[770,771,772,773],{"type":775,"name":4405,"path":4397,"parent":749,"lines":4409,"value":4410},[894,835],[788,789,790,791,792],{"type":738,"name":4399,"path":4412,"parent":749,"attributes":4413,"functions":4414},"unitelabs\u002Fbus\u002Ffactories\u002Fusb_factory.py",[1303],[772],{"type":891,"name":772,"path":4412,"parent":4399,"description":4416,"lines":4417,"parameters":4418,"returns":4432},"Create a USB connection with a device based on specified `vendor` and `product` IDs.",[894,778],[4419,4426,4428,4430],{"name":1310,"kind":1311,"annotation":4420,"required":902,"description":4425},{"left":4421,"slice":4422},{"name":1314,"cls":814},{"elements":4423},[1317,4424],{"name":1303,"cls":814},"A callable that returns an instance of the protocol to be used.",{"name":2785,"kind":1320,"annotation":4427,"required":902,"description":2787},{"name":1181,"cls":814},{"name":2047,"kind":1320,"annotation":4429,"required":902,"description":2790},{"name":1181,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117,"description":4431},"Additional keyword arguments to be passed to the `UsbTransport` constructor.",{"description":4433,"annotation":4434},"A tuple containing the `UsbTransport` instance and the protocol instance.",{"left":4435,"slice":4436},{"name":1266,"cls":814},{"elements":4437},[4438,4439],{"name":767,"cls":814},{"name":1303,"cls":814},{"type":738,"name":4400,"path":4441,"parent":749,"attributes":4442,"functions":4443},"unitelabs\u002Fbus\u002Ffactories\u002Fserial_factory.py",[1303],[770],{"type":891,"name":770,"path":4441,"parent":4400,"description":4445,"lines":4446,"parameters":4447,"returns":4471},"Create a serial connection with the specified port.",[894,1133],[4448,4455,4458,4460,4463,4466,4469],{"name":1310,"kind":1311,"annotation":4449,"required":902,"description":4454},{"left":4450,"slice":4451},{"name":1314,"cls":814},{"elements":4452},[1317,4453],{"name":1303,"cls":814},"A callable that returns an instance of the `Protocol` to be used.",{"name":2471,"kind":1320,"annotation":4456,"required":902,"description":4457},{"name":994,"cls":814},"The port of the serial device.",{"name":2475,"kind":1320,"annotation":4459,"required":42,"default":2477,"description":2478},{"name":1181,"cls":814},{"name":2480,"kind":1320,"annotation":4461,"required":42,"default":4462,"description":2483},{"name":2346,"cls":814},{"name":2374,"cls":814},{"name":2485,"kind":1320,"annotation":4464,"required":42,"default":4465,"description":2488},{"name":2347,"cls":814},{"name":2396,"cls":814},{"name":2490,"kind":1320,"annotation":4467,"required":42,"default":4468,"description":2493},{"name":2348,"cls":814},{"name":2425,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117,"description":4470},"Additional keyword arguments to be passed to the `SerialTransport` constructor.",{"description":4472,"annotation":4473},"A tuple containing the `SerialTransport` instance and the `Protocol` instance.",{"left":4474,"slice":4475},{"name":1266,"cls":814},{"elements":4476},[4477,4478],{"name":766,"cls":814},{"name":1303,"cls":814},{"type":738,"name":4401,"path":4480,"parent":749,"attributes":4481,"classes":4482},"unitelabs\u002Fbus\u002Ffactories\u002Ftransport_factory.py",[1303],[764],{"type":775,"name":1303,"path":4480,"parent":4401,"lines":4484,"value":4485},[888,888],"typing.TypeVar('P', bound=asyncio.Protocol, covariant=True)",{"type":806,"name":764,"path":4480,"parent":4401,"description":4487,"lines":4488,"bases":4489,"functions":4492,"mro":4494},"Interface representing a factory for creating transports.",[894,950],[4490],{"annotation":4491},{"name":3336,"cls":814},[4493],"unitelabs.bus.factories.transport_factory.TransportFactory.__call__",[764],{"type":891,"name":4493,"path":4480,"parent":764,"lines":4496,"parameters":4497,"returns":4506},[950,950],[4498,4499,4505],{"name":954,"kind":1311,"required":902},{"name":1310,"kind":1311,"annotation":4500,"required":902},{"left":4501,"slice":4502},{"name":1314,"cls":814},{"elements":4503},[1317,4504],{"name":1303,"cls":814},{"name":1115,"kind":1116,"required":42,"default":1117},{"description":918,"annotation":4507},{"left":4508,"slice":4509},{"name":1266,"cls":814},{"elements":4510},[4511,4512],{"name":1633,"cls":814},{"name":1303,"cls":814},{"type":738,"name":4402,"path":4514,"parent":749,"attributes":4515,"functions":4516},"unitelabs\u002Fbus\u002Ffactories\u002Ftcp_factory.py",[1303],[771],{"type":891,"name":771,"path":4514,"parent":4402,"description":4518,"lines":4519,"parameters":4520,"returns":4537},"Create and open a streaming TCP connection to a given address specified by host and port.",[894,1593],[4521,4528,4531,4535],{"name":1310,"kind":1311,"annotation":4522,"required":902,"description":4527},{"left":4523,"slice":4524},{"name":1314,"cls":814},{"elements":4525},[1317,4526],{"name":1303,"cls":814},"A callable that returns an instance if the `Protocol` to be used.",{"name":4246,"kind":1320,"annotation":4529,"required":42,"default":4530,"description":4250},{"name":994,"cls":814},"'localhost'",{"name":2471,"kind":1320,"annotation":4532,"required":42,"default":4533,"description":4534},{"name":1181,"cls":814},"80","The port number of the remote server.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":4536},"Additional keyword arguments passed to `loop.create_connection`.",{"description":4538,"annotation":4539},"A tuple containing the transport and protocol.",{"left":4540,"slice":4541},{"name":1266,"cls":814},{"elements":4542},[4543,4544],{"name":1633,"cls":814},{"name":1303,"cls":814},{"type":738,"name":4403,"path":4546,"parent":749,"attributes":4547,"functions":4548},"unitelabs\u002Fbus\u002Ffactories\u002Fudp_factory.py",[1303],[773],{"type":891,"name":773,"path":4546,"parent":4403,"description":4550,"lines":4551,"parameters":4552,"returns":4578},"Create a UDP connection with the specified server (sender) and client (receiver) addresses.",[872,998],[4553,4559,4563,4568,4572,4576],{"name":1310,"kind":1311,"annotation":4554,"required":902,"description":4454},{"left":4555,"slice":4556},{"name":1314,"cls":814},{"elements":4557},[1317,4558],{"name":1303,"cls":814},{"name":4560,"kind":1320,"annotation":4561,"required":42,"default":2751,"description":4562},"server_port",{"name":1181,"cls":814},"The port of the UDP server.",{"name":4564,"kind":1320,"annotation":4565,"required":42,"default":4566,"description":4567},"server_host",{"name":994,"cls":814},"''","The IP address of the UDP server.",{"name":4569,"kind":1320,"annotation":4570,"required":42,"default":2751,"description":4571},"client_port",{"name":1181,"cls":814},"The desired port of the client.",{"name":4573,"kind":1320,"annotation":4574,"required":42,"default":4566,"description":4575},"client_host",{"name":994,"cls":814},"The desired IP address of the client.",{"name":1115,"kind":1116,"required":42,"default":1117,"description":4577},"Additional keyword arguments to be passed to the `UDPTransport` constructor.",{"description":4579,"annotation":4580},"A tuple containing the `UDPTransport` instance and the `Protocol` instance.",{"left":4581,"slice":4582},{"name":1266,"cls":814},{"elements":4583},[4584,4585],{"name":1633,"cls":814},{"name":1303,"cls":814},[4587,4590,4594,4598,4602],{"dist_name":4588,"name":4588,"version":4589},"python","\u003C4.0,>=3.9",{"dist_name":4591,"name":4592,"version":4593},"pyserial","serial","3.5",{"dist_name":4595,"name":4596,"version":4597},"pyusb","usb","1.2.1",{"dist_name":4599,"name":4600,"version":4601},"typing-extensions","typing_extensions","4.12.2",{"dist_name":4603,"name":4603,"version":4604},"wrapt","1.17.0","0.2.0",1781787397389]