12.4. El sıkışma ve yetenek anlaşması

Kamera ve ana bilgisayar, protokolün nasıl çalışması gerektiğine dair kendi fikirleriyle aktarım katmanına gelir: hangi CRC modları, ACK’lerin gerekli olup olmadığı, arabelleğe alabilecekleri en büyük yükün ne olduğu. Gerçek trafik başlamadan önce, oturumun geri kalanı için bu parametreleri sabitleyen bir el sıkışma alışverişi yaparlar.

12.4.1. Ana bilgisayar bağlantıyı açar

Kamera tarafı protokol yığınını önyüklemede başlatır (veya uygulama parametreleri değiştirmek için protocol.init() ile yeniden başlatır) ve ardından bir ana bilgisayar bekleyerek sessizce durur. Kameranın bakış açısından, bir paket gelene kadar yapacak bir şey yoktur.

Ana bilgisayar tarafı aktarımı açar – USB bağlantı noktası veya UART – ve hemen bir PROTO_SYNC paketi (işlem kodu 0x00) gönderir. Bu paket, her iki taraf da senkronizasyondan çıkmış olsa bile kameranın onu tanımasını sağlayan sihirli bir yüke sahiptir ve yetenekler anlaşılmadan önce kameranın yanıt verdiği tek pakettir.

Kamera yeniden iletim zaman aşımı içinde yanıt vermezse, ana bilgisayar rtx_retries kez olmak üzere yeniden PROTO_SYNC gönderir. Bundan sonra vazgeçer ve bir bağlantı hatası bildirir. Yeniden deneme, kameranın ana bilgisayarın gittiğini bilmesine gerek kalmadan “çıkar, yeniden tak, ana bilgisayar betiğini yeniden başlat” işleminin çalışmasını sağlayan şeydir.

12.4.2. Yetenek alışverişi

Kamera senkronizasyonu onayladıktan sonra, ana bilgisayar kameranın neyi desteklediğini sormak için PROTO_GET_CAPS (işlem kodu 0x01) gönderir. Yanıt yükü şunları bildirir:

  • CRC doğrulamasının etkin veya devre dışı olduğu

  • Sıra numarası izlemenin etkin veya devre dışı olduğu

  • ACK’lerin etkin veya devre dışı olduğu

  • Olay bildirimlerinin etkin veya devre dışı olduğu

  • Kameranın bayt cinsinden maksimum yük boyutu

  • Geçerli yeniden iletim deneme sayısı, zaman aşımı ve yoklama parametreleri

Ana bilgisayar bunları kendi yapılandırmasıyla karşılaştırır. Ana bilgisayarın bunlardan herhangi birini değiştirmesi gerekiyorsa – örneğin, alma arabelleği kameranınkinden daha küçük olduğu için daha küçük bir maksimum yük anlaşması yapmak için – yeni değerlerle PROTO_SET_CAPS (işlem kodu 0x02) gönderir. Kamera yığınını yeniden yapılandırır ve onaylar. Bundan sonra, kabloyu geçen her paket bu paylaşılan sözleşmeye uyar.

Ana bilgisayar hiçbir şeyi geçersiz kılmazsa, varsayılanların tümü açıktır: CRC doğrulaması, sıra numarası izleme, ACK’ler ve olay bildirimleri. Varsayılan maksimum yük, kameranın kart başına arabelleğinden 14 baytlık çerçeveleme ek yükü çıkarılarak elde edilir (10 baytlık başlık artı 4 baytlık sondaki yük CRC’si). Çoğu kamera-dizüstü çalışması için varsayılanlar doğru başlangıç noktasıdır; güvenilirlik sayfası, bir uygulamanın bunların hangi parçalarını ne zaman ve neden devre dışı bıraktığını ele alır.

12.4.3. Kanal keşfi

Yeteneklerden sonra, ana bilgisayar CHANNEL_LIST (işlem kodu 0x20) gönderir. Kamera kayıtlı kanalların bir listesiyle yanıt verir – dört yerleşik kanal (stdin, stdout, stream, profile) artı uygulamanın protocol.register() ile kaydettiği herhangi biri. Her giriş kanalın kimliğini, adını ve yetenek bayraklarını (salt okunur, salt yazılır, kilitlenebilir) taşır.

Ana bilgisayar listeyi saklar ve uygulama kodu channel_read("frame") veya channel_write("config", ...) istediğinde daha sonra kullanır – ad bir kez kanal kimliğine eşlenir, ardından o kanaldaki sonraki her paket kimliği doğrudan kullanır.

Kamera ilk listeden sonra yeni bir kanal kaydederse – el sıkışmadan sonra bir uygulama çalışmaya başladığında yaygın – kamera bir CHANNEL_REGISTERED olay paketi yayar. Ana bilgisayar bunları dinler ve dahili kanal listesini yeniler, böylece erken bağlanan bir ana bilgisayar betiği, yeniden başlatmadan yeni kaydedilen kanalların ortaya çıktığını görür.

El sıkışma, bağlantı kurulumunda birkaç gidiş-dönüş alır ve ardından bir daha asla tekrarlanmaz. Kararlı durum trafiği yalnızca paketlerdir: içeri çerçevelenmiş baytlar, dışarı çerçevelenmiş baytlar, her iki tarafta da zaten bilinen kanal kimlikleri.