12.4. Rukovanje i pregovaranje o sposobnostima#

Kamera i domaćin oboje dolaze do transporta s vlastitim zamislima o tome kako bi protokol trebao raditi: koji CRC načini, jesu li potvrde (ACK) obavezne, koliki je najveći sadržaj koji mogu spremiti u međuspremnik. Prije nego što stvarni promet započne, razmjenjuju rukovanje koje te parametre utvrđuje za ostatak sesije.

12.4.1. Domaćin otvara vezu#

Strana kamere pokreće protokolni sloj pri pokretanju (ili ga aplikacija ponovno pokreće pomoću protocol.init() radi promjene parametara), a zatim mirno čeka domaćina. S gledišta kamere nema se što raditi dok ne stigne paket.

Strana domaćina otvara transport – USB port ili UART – i odmah šalje PROTO_SYNC paket (opcode 0x00). Taj paket ima čaroban sadržaj koji omogućuje kameri da ga prepozna čak i ako su obje strane izgubile sinkronizaciju, i to je jedini paket na koji kamera ikada odgovara prije nego što se ispregovaraju sposobnosti.

Ako kamera ne odgovori unutar isteka vremena za ponovni prijenos, domaćin ponovno šalje PROTO_SYNC, do rtx_retries puta. Nakon toga odustaje i prijavljuje neuspjeh veze. Ponovni pokušaj je ono što omogućuje da „izvuci, ponovno priključi, ponovno pokreni skriptu domaćina” radi bez da kamera mora znati da je domaćin nestao.

12.4.2. Razmjena sposobnosti#

Kada kamera potvrdi sinkronizaciju, domaćin šalje PROTO_GET_CAPS (opcode 0x01) kako bi pitao što kamera podržava. Sadržaj odgovora prijavljuje:

  • CRC provjera omogućena ili onemogućena

  • Praćenje rednog broja omogućeno ili onemogućeno

  • Potvrde (ACK) omogućene ili onemogućene

  • Obavijesti o događajima omogućene ili onemogućene

  • Maksimalna veličina sadržaja kamere u bajtovima

  • Trenutni broj ponovnih pokušaja prijenosa, istek vremena i parametri ispitivanja

Domaćin to uspoređuje s vlastitom konfiguracijom. Ako domaćin treba promijeniti bilo što od toga – na primjer, ispregovarati manji maksimalni sadržaj jer je njegov prijemni međuspremnik manji od kamerinog – šalje PROTO_SET_CAPS (opcode 0x02) s novim vrijednostima. Kamera ponovno konfigurira svoj sloj i potvrđuje. Od tog trenutka svaki paket koji prijeđe žicu slijedi taj zajednički ugovor.

Ako domaćin ništa ne nadjača, zadane postavke su sve uključene: CRC provjera, praćenje rednog broja, potvrde (ACK) i obavijesti o događajima. Zadani maksimalni sadržaj je kamerin međuspremnik po pojedinoj ploči umanjen za 14 bajtova troška uokvirivanja (10-bajtno zaglavlje plus 4-bajtni završni CRC sadržaja). Za većinu radova između kamere i prijenosnog računala zadane su postavke prava polazna točka; stranica o pouzdanosti objašnjava kada i zašto aplikacija isključuje pojedine njihove dijelove.

12.4.3. Otkrivanje kanala#

Nakon sposobnosti, domaćin šalje CHANNEL_LIST (opcode 0x20). Kamera odgovara popisom registriranih kanala – četiri ugrađena (stdin, stdout, stream, profile) plus svaki koji je aplikacija registrirala pomoću protocol.register(). Svaki unos nosi ID kanala, njegovo ime i njegove zastavice sposobnosti (samo za čitanje, samo za pisanje, može se zaključati).

Domaćin pohranjuje popis i koristi ga kasnije kada aplikacijski kod zatraži channel_read("frame") ili channel_write("config", ...) – ime se jednom prevodi u ID kanala, a zatim svaki sljedeći paket na tom kanalu izravno koristi ID.

Ako kamera registrira novi kanal nakon početnog popisa – što je uobičajeno kada aplikacija počne raditi nakon rukovanja – kamera emitira paket događaja CHANNEL_REGISTERED. Domaćin osluškuje takve pakete i osvježava svoj interni popis kanala, pa skripta domaćina koja se rano priključila vidi kako se novoregistrirani kanali pojavljuju bez ponovnog pokretanja.

Rukovanje traje nekoliko povratnih putova pri uspostavi veze, a zatim se nikada ne ponavlja. Promet u stabilnom stanju samo su paketi: uokvireni bajtovi unutra, uokvireni bajtovi van, s ID-evima kanala koji su već poznati na obje strane.