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