12.7. Callback channel¶
Objek backend yang diberikan ke protocol.register() adalah kelas Python. Pustaka protokol tidak menanyakan kelas metode mana yang diimplementasikannya; pustaka memeriksa instance dan menghubungkan yang ditemukannya. Introspeksi itulah yang membuat antarmuka backend fleksibel: backend paling kecil yang berguna terdiri dari dua metode, yang paling lengkap terdiri dari dua belas, dan aplikasi memilih setiap kemampuan satu metode sekaligus.
12.7.1. Aturan introspeksi¶
Ketika protocol.register() dijalankan, pustaka menelusuri daftar tetap nama-nama yang dapat dipanggil dan mengikat setiap yang ditemukan pada instance backend:
Menambahkan
readke kelas mengaktifkanCHANNEL_FLAG_READ. Panggilan host kechannel_read()hanya mencapai backend jika flag ini diset.Menambahkan
writemengaktifkanCHANNEL_FLAG_WRITE, memungkinkanchannel_write().Menambahkan
lockdanunlockmengaktifkanCHANNEL_FLAG_LOCK, memungkinkan host mengunci channel untuk pembacaan atomik multi-paket.Menambahkan
pollmemungkinkan host bertanya "apakah ada yang siap?" dengan murah, tanpa memaksakan pembacaan penuh.
Metode yang hilang bukan merupakan kesalahan -- pustaka protokol hanya menonaktifkan kemampuan yang sesuai. Backend dengan hanya size dan read adalah valid sepenuhnya; itu adalah channel data hanya-baca.
12.7.2. Channel sensor hanya-baca¶
Channel sensor yang menerbitkan pembacaan baru setiap kali host bertanya, menolak penulisan host, melatih empat dari callback:
import protocol
import struct
class TempChannel:
def __init__(self, read_sensor):
self._read_sensor = read_sensor
self._buf = b''
self._fresh = False
def poll(self):
# Tell the host whether a reading is waiting.
return self._fresh
def size(self):
# Sample fresh data on every host-side size query.
value = self._read_sensor()
self._buf = struct.pack('<f', value)
self._fresh = True
return len(self._buf)
def read(self, offset, size):
end = offset + size
if end >= len(self._buf):
self._fresh = False
return self._buf[offset:end]
protocol.register(name='temp', backend=TempChannel(read_temperature))
Menelusuri apa yang dilakukan setiap metode:
pollmengembalikan flag kesegaran. Host memanggilnya sebelum membaca dan melewati pembacaan sepenuhnya ketika mengembalikanFalse. Ini menghemat biaya round-trip untuk "belum ada data baru."sizemeregenerasi buffer sesuai permintaan dan melaporkan panjangnya. Melakukan pengambilan sampel di sini berarti backend tidak memerlukan tugas latar belakang -- panggilan host mendorong setiap pengukuran.readmengembalikan irisan buffer. Pustaka protokol mungkin memanggilnya lebih dari sekali ketika buffer lebih besar dari payload maks yang dinegosiasikan; argumenoffsetmenelusuri fragmen-fragmen tersebut.Tidak adanya
writeberarti penulisan host ditolak di lapisan framing, sebelum backend terlibat.
12.7.3. Set callback lengkap¶
Sebagai referensi, setiap metode yang dicari pustaka pada backend:
Metode |
Mengembalikan |
Tujuan |
|---|---|---|
|
object |
Inisialisasi satu kali opsional ketika channel pertama kali terikat ke host. Kembalikan nilai non- |
|
bool |
Kembalikan |
|
bool |
Ambil channel untuk transfer multi-paket atomik. |
|
bool |
Lepaskan |
|
int |
Jumlah byte yang saat ini dapat dibaca dari channel. |
|
tuple |
Hingga empat bilangan bulat yang mendeskripsikan struktur data (misalnya tinggi citra, lebar, jumlah byte). Digunakan oleh host untuk membongkar buffer bertipe. |
|
bytes |
Kembalikan hingga size byte mulai dari offset. Dipanggil sekali per fragmen ketika payload melebihi maks yang dinegosiasikan. |
|
bytes |
Varian tanpa-salinan dari |
|
int |
Host menulis data pada offset. |
|
int |
Opcode yang didefinisikan aplikasi di luar model baca/tulis. Nilai kembalian negatif adalah kesalahan. |
|
object |
Buang semua data yang di-buffer. Dipanggil ketika host ingin mereset channel. |
|
bool |
Hanya bermakna pada backend yang merepresentasikan transport fisik (channel USB bawaan). Channel aplikasi tidak memerlukan ini. |
Itulah seluruh antarmuka backend. Dua belas nama metode, semua opsional, dan pustaka protokol memutuskan apa yang dapat dilakukan setiap channel berdasarkan metode mana yang ada.