12.10. Afronding

Een cam aangesloten op een USB-kabel die frames streamt naar een hostprogramma, configuratie-updates terugneemt van de host, en het loskoppelen/opnieuw aansluiten overleeft zonder de synchronisatie te verliezen – met verborgen heruitzendingen, meerdere logische streams die één poort delen, en nul framing-code in de toepassing – komt voort uit ongeveer veertig regels code aan de cam-zijde en een vergelijkbare hoeveelheid op de host. De protocolbibliotheek verandert een byte-pijplijn in een programmeerbaar kanaaloppervlak en houdt alles onder de toepassing onzichtbaar.

12.10.1. Wat het hoofdstuk heeft opgebouwd

  • Een mentaal model met vier lagen van de stack: transport, framing, betrouwbaarheid, kanalen. Elke laag lost één probleem op en negeert alles erboven.

  • Het pakketformaat op de draad – 10-byte header met CRC, variabele payload, afsluitende CRC. Klein genoeg om byte voor byte door te lopen.

  • De handshake die de cam en host uitvoeren wanneer een transport verbinding maakt: PROTO_SYNC, capability-uitwisseling, kanaalontdekking.

  • De betrouwbaarheidsmachinerie daarbovenop: volgnummers, ACKs, NAKs, heruitzendingen met exponentiële backoff, de tien statuscodes.

  • Het kanaalmodel: tot 32 benoemde logische streams op één draad, met ingebouwde stdin / stdout / stream / profile en toepassingskanalen geregistreerd per Python-klasse.

  • De backend-interface – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – en hoe de protocolbibliotheek de op een backend aanwezige methoden gebruikt om te bepalen wat het kanaal ondersteunt.

  • De host-zijde: de Camera-klasse van de openmv-python SDK, de magische baudrate van 921600 die USB-CDC in protocolmodus schakelt, en het round-trip-patroon channel_size / channel_read / channel_write.

  • Een frame-streamingpatroon – single-buffer capture, readp met een vergrendeling, send_event voor nieuw-frame-meldingen – en een bidirectioneel configuratiepatroon (host-beschrijfbaar kanaal, JSON round-trip) die samen de basis vormen voor elke interactieve cam-tool.

12.10.2. Referentie-routekaart

De referentiepagina’s van de bibliotheek zijn de opzoekbestemmingen wanneer een van deze functies opduikt in echte code:

  • protocol — OpenMV-protocolkanalen – de protocol-module, protocol.init(), protocol.register(), ProtocolChannel, kanaalvlagconstanten, en de maximale-payloadtabel per cam.

  • De host-SDK – pip install openmv, openmv.camera.Camera. Methoden die in dit hoofdstuk aan bod komen: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec(), en stop().

  • De repository openmv-projects – echte tools gebouwd op de protocolbibliotheek. De directory tools/ bevat thermal-overlay-calibration (RGB + thermische uitlijning-GUI), ccm-tuning (kleurcorrectiematrix-tuner), genx320-event-streaming en genx320-overlay-calibration (event-camera-tooling). Elk gebruikt de patronen uit dit hoofdstuk van begin tot eind.

12.10.3. Waar je het hierna kunt brengen

Een paar richtingen waarin cam-projecten van hieruit gaan:

  • Een host-GUI bouwen. Een framekanaal dat een videowidget voedt, een of twee configuratiekanalen die schuifregelaars en knoppen voeden. Voor de GUI-laag zelf is DearPyGui de natuurlijke keuze – puur Python, installeerbaar via pip, snel genoeg voor live preview, en waar elke bestaande OpenMV-hosttool als eerste naar grijpt.

  • Multi-kanaals telemetrie-dashboard. Meerdere toepassingskanalen op dezelfde cam (sensormetingen, tellers, statusgebeurtenissen) die elk in een eigen callback worden ververst, en een host-GUI die ze op een timer leest en elk afzonderlijk weergeeft. De onafhankelijke flow-control van de kanaallaag betekent dat één trage leesactie de andere niet ophoudt.

  • Op afstand afstemmen via UART. Dezelfde kanaal-callbacks; de toepassing roept protocol.init aan om van USB naar een UART-transport te schakelen. De cam blijft headless draaien en een Python-script op een Raspberry Pi of laptop praat ermee via een seriële verbinding voor afstemming in het veld.

Het draadformaat, de betrouwbaarheidslaag en de kanaalabstractie veranderen niet. Het kiezen van het transport dat bij de implementatie past en het toevoegen van een kanaal voor elk ding dat de host moet zien of instellen, is van hieruit de hele engineeringtaak.