12.10. Recapitulare

O cameră conectată la un cablu USB care transmite în flux cadre către un program gazdă, acceptă actualizări de configurare înapoi de la gazdă și supraviețuiește deconectării/reconectării fără a pierde sincronizarea – cu retransmisiile ascunse, mai multe fluxuri logice care partajează un singur port și zero cod de încadrare în aplicație – rezultă din aproximativ patruzeci de linii de cod pe partea camerei și o cantitate similară pe partea gazdei. Biblioteca de protocol transformă o conductă de octeți într-o suprafață de canale programabilă și menține invizibil tot ce se află sub aplicație.

12.10.1. Ce a construit acest capitol

  • Un model mental cu patru straturi al stivei: transport, încadrare, fiabilitate, canale. Fiecare strat rezolvă o singură problemă și ignoră tot ce se află deasupra.

  • Formatul pachetului pe fir – antet de 10 octeți cu CRC, sarcină utilă variabilă, CRC final. Suficient de mic pentru a fi parcurs octet cu octet.

  • Negocierea (handshake) pe care camera și gazda o execută când se conectează un transport: PROTO_SYNC, schimb de capabilități, descoperirea canalelor.

  • Mecanismul de fiabilitate de deasupra: numere de secvență, ACK-uri, NAK-uri, retransmisii cu retragere exponențială (exponential backoff), cele zece coduri de stare.

  • Modelul de canal: până la 32 de fluxuri logice denumite pe un singur fir, cu canalele încorporate stdin / stdout / stream / profile și canale de aplicație înregistrate prin clasă Python.

  • Interfața de backend – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – și modul în care biblioteca de protocol folosește metodele prezente pe un backend pentru a decide ce suportă canalul.

  • Partea gazdei: clasa Camera din SDK-ul openmv-python, rata magică de 921600 baud care comută USB-CDC în modul protocol și modelul dus-întors channel_size / channel_read / channel_write.

  • Un model de transmitere în flux a cadrelor – captură cu un singur tampon (buffer), readp cu un zăvor (latch), send_event pentru notificări de cadru nou – și un model de configurare bidirecțional (canal modificabil de gazdă, dus-întors JSON) care împreună formează fundamentul fiecărui instrument interactiv pentru cameră.

12.10.2. Foaie de parcurs pentru referință

Paginile de referință ale bibliotecii sunt destinațiile de căutare atunci când una dintre aceste funcționalități apare în cod real:

  • protocol — Canale de protocol OpenMV – modulul protocol, protocol.init(), protocol.register(), ProtocolChannel, constantele de indicatori de canal și tabelul de sarcină utilă maximă per cameră.

  • SDK-ul gazdei – pip install openmv, openmv.camera.Camera. Metode abordate în acest capitol: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec() și stop().

  • Depozitul openmv-projects – instrumente reale construite pe biblioteca de protocol. Directorul tools/ include thermal-overlay-calibration (GUI de aliniere RGB + termică), ccm-tuning (reglator al matricei de corecție a culorii), genx320-event-streaming și genx320-overlay-calibration (instrumente pentru camera de evenimente). Fiecare dintre acestea folosește modelele din acest capitol de la cap la coadă.

12.10.3. Unde să mergeți mai departe

Câteva direcții în care se îndreaptă de aici proiectele cu camere:

  • Construirea unui GUI gazdă. Un canal de cadre care alimentează un widget video, unul sau două canale de configurare care alimentează glisoare și butoane. Pentru stratul GUI propriu-zis, DearPyGui este alegerea firească – pur Python, instalabil prin pip, suficient de rapid pentru previzualizare în timp real și ceea ce caută mai întâi orice instrument gazdă OpenMV existent.

  • Tablou de bord de telemetrie multicanal. Mai multe canale de aplicație pe aceeași cameră (citiri de senzori, contoare, evenimente de stare), fiecare reîmprospătat în propria funcție de retroapelare (callback), și un GUI gazdă care le citește pe baza unui temporizator și le redă pe fiecare separat. Controlul independent al fluxului din stratul de canale înseamnă că o citire lentă nu blochează celelalte.

  • Reglare la distanță prin UART. Aceleași funcții de retroapelare (callback) pentru canale; aplicația apelează protocol.init pentru a comuta de la USB la un transport UART. Camera continuă să ruleze fără ecran, iar un script Python pe un Raspberry Pi sau pe un laptop comunică cu ea printr-o linie serială pentru reglare în teren.

Formatul pe fir, stratul de fiabilitate și abstractizarea canalelor nu se schimbă. Alegerea transportului care se potrivește implementării și adăugarea câte unui canal pentru fiecare lucru pe care gazda trebuie să îl vadă sau să îl seteze reprezintă întreaga muncă de inginerie de aici încolo.