12.4. Kézfogás és képességegyeztetés¶
A kamera és a gazda egyaránt saját elképzelésekkel érkezik a transzporthoz arról, hogyan kellene futnia a protokollnak: mely CRC-módok, kötelezőek-e a nyugtázások, mekkora a legnagyobb hasznos teher, amelyet pufferelni tudnak. Mielőtt megindul a valódi forgalom, lebonyolítanak egy kézfogást, amely a munkamenet hátralévő részére rögzíti ezeket a paramétereket.
12.4.1. A gazda nyitja a kapcsolatot¶
A kamera oldal a protokollverem-et boot időben indítja el (vagy az alkalmazás újraindítja azt a protocol.init() hívással a paraméterek módosításához), majd csendesen várja a gazdát. A kamera szemszögéből nincs semmi teendő, amíg meg nem érkezik egy csomag.
A gazda oldal megnyitja a transzportot – USB portot vagy UART-ot –, és azonnal küld egy PROTO_SYNC csomagot (0x00 műveletkód). Ennek a csomagnak van egy mágikus hasznos terhe, amely lehetővé teszi, hogy a kamera felismerje akkor is, ha a két oldal kiesett a szinkronból, és ez az egyetlen csomag, amelyre a kamera valaha is válaszol, mielőtt a képességek egyeztetése megtörténne.
Ha a kamera nem válaszol az újraküldési időkorláton belül, a gazda ismét elküldi a PROTO_SYNC-et, legfeljebb rtx_retries alkalommal. Ezután feladja, és kapcsolódási hibát jelent. Ez az újrapróbálkozás teszi lehetővé, hogy a „húzd ki, dugd vissza, indítsd újra a gazda szkriptet” működjön anélkül, hogy a kamerának tudnia kellene a gazda távozásáról.
12.4.2. Képességcsere¶
Amint a kamera nyugtázza a szinkront, a gazda küldi a PROTO_GET_CAPS-et (0x01 műveletkód), hogy megkérdezze, mit támogat a kamera. A válasz hasznos terhe a következőket jelenti:
CRC-ellenőrzés engedélyezve vagy letiltva
Sorszámkövetés engedélyezve vagy letiltva
Nyugtázások engedélyezve vagy letiltva
Eseményértesítések engedélyezve vagy letiltva
A kamera maximális hasznos teherének mérete bájtokban
Az aktuális újraküldési újrapróbálkozás-szám, időkorlát és lekérdezési paraméterek
A gazda összeveti ezeket a saját konfigurációjával. Ha a gazdának módosítania kell bármelyiket – például hogy kisebb maximális hasznos terhet egyeztessen, mert a fogadópuffere kisebb a kamerájénál –, akkor küld egy PROTO_SET_CAPS-et (0x02 műveletkód) az új értékekkel. A kamera újrakonfigurálja a vermét, és nyugtáz. Innentől kezdve minden vezetéken áthaladó csomag ezt a közös szerződést követi.
Ha a gazda semmit nem ír felül, az alapértelmezések mind bekapcsolva vannak: CRC-ellenőrzés, sorszámkövetés, nyugtázások és eseményértesítések. Az alapértelmezett maximális hasznos teher a kamera kártyánkénti puffere mínusz 14 bájt keretezési többletköltség (a 10 bájtos fejléc plusz a 4 bájtos záró hasznos teher CRC). A legtöbb kamera-laptop munkához az alapértelmezések a helyes kiindulópont; a megbízhatósági oldal tárgyalja, mikor és miért kapcsol ki egy alkalmazás egyes részeket belőlük.
12.4.3. Csatornafelderítés¶
A képességek után a gazda küldi a CHANNEL_LIST-et (0x20 műveletkód). A kamera a regisztrált csatornák listájával válaszol – a négy beépítettel (stdin, stdout, stream, profile) plusz bármellyel, amelyet az alkalmazás a protocol.register() hívással regisztrált. Minden bejegyzés tartalmazza a csatorna azonosítóját, nevét és képességjelzőit (csak olvasható, csak írható, zárolható).
A gazda eltárolja a listát, és később használja, amikor az alkalmazás kódja channel_read("frame")-et vagy channel_write("config", ...)-ot kér – a nevet egyszer feloldja csatornaazonosítóra, majd ezen a csatornán minden további csomag közvetlenül az azonosítót használja.
Ha a kamera új csatornát regisztrál a kezdeti lista után – ami gyakori, amikor egy alkalmazás a kézfogás után kezd futni –, akkor a kamera kibocsát egy CHANNEL_REGISTERED eseménycsomagot. A gazda ezekre figyel, és frissíti a belső csatornalistáját, így egy korán csatlakozott gazda szkript úgy látja megjelenni az újonnan regisztrált csatornákat, hogy nem kell újraindulnia.
A kézfogás a kapcsolat felépítésekor néhány körutat vesz igénybe, azután soha nem ismétlődik. Az állandósult állapotú forgalom csak csomagokból áll: keretezett bájtok be, keretezett bájtok ki, a csatornaazonosítók mindkét oldalon már ismertek.