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.