rpc — rpc biblioteka¶
Modul rpc na OpenMV Cam omogućuje vam povezivanje OpenMV Cam s drugim mikrokontrolerom ili računalom te izvršavanje udaljenih python (ili procedurnih) poziva na vašem OpenMV Cam. Modul rpc također omogućuje i obratno, ako želite da vaš OpenMV Cam može izvršavati udaljene procedurne (ili python) pozive na drugom mikrokontroleru ili računalu.
Kako koristiti biblioteku¶
Minimalni slave koji izlaže jedan povratni poziv preko UART:
import rpc
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
interface = rpc.rpc_uart_slave(baudrate=115200)
def snapshot(_):
return csi0.snapshot().compress().bytearray()
interface.register_callback(snapshot)
interface.loop() # Does not return.
Odgovarajući master koji od slave-a traži JPEG sličicu:
import rpc
interface = rpc.rpc_uart_master(baudrate=115200)
result = interface.call("snapshot")
if result is None:
print("communication failed")
elif len(result) == 0:
print("remote function not registered on the slave")
else:
# result is a memoryview of the JPEG bytes returned by the slave.
print("received", len(result), "bytes")
Zamijenite rpc_uart_master / rpc_uart_slave odgovarajućim can, i2c ili spi parom kako biste koristili drugi transportni sloj.
Općenito, da bi upravljački uređaj koristio rpc biblioteku, stvorit ćete objekt sučelja pomoću rpc biblioteke. Na primjer:
interface = rpc.rpc_uart_master(baudrate=115200)
Ovo stvara UART sučelje za komunikaciju s rpc slave-om.
Nakon što je sučelje stvoreno, samo trebate učiniti:
memory_view_object_result = interface.call("remote_function_or_method_name", bytes_object_argument)
I rpc biblioteka pokušat će izvršiti ono "remote_function_or_method_name" na slave-u. Udaljena funkcija ili metoda primit će bytes_object_argument koji može biti veličine do 2^32-1 bajtova. Nakon što udaljena metoda završi s izvršavanjem, vratit će memory_view_object_result koji također može biti veličine do 2^32-1 bajtova. Budući da su argument i odgovor oboje generički spremnici bajtova, kroz rpc biblioteku možete proslijediti bilo što i primiti bilo koju vrstu odgovora. Jednostavan način prosljeđivanja argumenata jest korištenje struct.pack() za stvaranje argumenta i struct.unpack() za primanje argumenta na drugoj strani. Što se tiče odgovora, druga strana može poslati string objekt ili json string kao rezultat koji master zatim može interpretirati.
Što se tiče pogrešaka, ako pokušate izvršiti nepostojeći naziv funkcije ili metode, metoda rpc_master.call() vratit će prazan bytes() objekt. Ako rpc biblioteka ne uspije komunicirati sa slave-om, rpc biblioteka vratit će None.
Kako bi stvari ostale jednostavne, rpc biblioteka ne održava vezu između master i slave uređaja. Metoda rpc_master.call() obuhvaća pokušaj povezivanja sa slave-om, pokretanje izvršavanja udaljene funkcije ili metode te dohvaćanje rezultata.
Sada, na strani slave-a morate stvoriti rpc sučelje za komunikaciju s master-om. To izgleda ovako:
interface = rpc.rpc_uart_slave(baudrate=115200)
Ovo će stvoriti sloj UART sučelja za komunikaciju s rpc master-om.
Nakon što stvorite slave sučelje, zatim morate registrirati povratne pozive koje master može pozvati pomoću objekta sučelja:
def remote_function_or_method_name(memoryview_object_argument):
<lots of code>
return bytes_object_result
interface.register_callback(remote_function_or_method_name)
Na slave-u možete registrirati onoliko povratnih poziva koliko želite. Konačno, nakon što završite s registriranjem povratnih poziva, samo trebate izvršiti:
interface.loop()
Na slave-u kako biste pokrenuli rpc biblioteku i počeli osluškivati master. Imajte na umu da se metoda rpc_slave.loop() ne vraća.
class rpc – rpc osnovna klasa¶
Osnovnu klasu rpc ponovno implementiraju klase rpc_master i rpc_slave kako bi stvorile master i slave sučelja. Nije namijenjena izravnom korištenju.
- class rpc.rpc¶
Stvara
rpcobjekt. Nije namijenjeno izravnom korištenju.- get_bytes(buff: bytearray | memoryview, timeout_ms: int) bytes | None¶
Ponovno implementirano u transportno-specifičnim podklasama. Puni
buffbajtovima iz temeljnog sučelja unutartimeout_msmilisekundi. VraćaNoneu slučaju isteka vremena.
- put_bytes(data: bytes | memoryview, timeout_ms: int) None¶
Ponovno implementirano u transportno-specifičnim podklasama. Šalje
datapreko temeljnog sučelja unutartimeout_msmilisekundi.
- stream_reader(call_back: Callable[[memoryview], None], queue_depth: int = 1, read_timeout_ms: int = 5000) None¶
Prima tok korisnih podataka od udaljenog
rpc.stream_writer. Treba se pozvati iz unutrašnjostirpc_slavepovratnog poziva (ili izravno nakon uspješnogrpc_master.call) jednom kad su se obje strane sinkronizirale.call_back– pozivljivi objekt koji se poziva jednom za svaki primljeni paket podataka kaocall_back(data)gdje jedatamemoryview. Povratna vrijednost se zanemaruje.queue_depth– broj sličica u letu koje pisač smije poslati prije nego što pričeka čitač. Veće vrijednosti povećavaju propusnost po cijenu memorije.read_timeout_ms– milisekunde čekanja po paketu podataka.
Vraća se kod bilo koje pogreške. Za otkazivanje, podignite iznimku unutar
call_back; udaljena strana će isteći vremenski.
- stream_writer(call_back: Callable[[], bytes | memoryview], write_timeout_ms: int = 5000) None¶
Šalje tok korisnih podataka udaljenom
rpc.stream_reader. Treba se pozvati iz unutrašnjostirpc_slavepovratnog poziva (ili izravno nakon uspješnogrpc_master.call) jednom kad su se obje strane sinkronizirale.call_back– pozivljivi objekt koji se poziva bez argumenata i koji vraća sljedećibytesilimemoryviewpaket podataka za slanje.write_timeout_ms– milisekunde čekanja pri slanju svakog paketa podataka.
Vraća se kod bilo koje pogreške. Za otkazivanje, podignite iznimku unutar
call_back; udaljena strana će isteći vremenski.
class rpc_master – rpc_master osnovna klasa¶
rpc_master je osnovna klasa. Koristite jednu od transportno-specifičnih podklasa (rpc_can_master, rpc_i2c_master, rpc_spi_master, rpc_uart_master).
- class rpc.rpc_master¶
Stvara
rpc_masterobjekt. Nije namijenjeno izravnom korištenju.- call(name: str, data: bytes = bytes(), send_timeout: int = 1000, recv_timeout: int = 1000) memoryview | None¶
Izvršava udaljeni poziv na slave uređaju.
name– string naziv udaljene funkcije ili metode za izvršavanje.data–bytes-oliki objekt proslijeđen kao argument udaljenoj funkciji.send_timeout– milisekunde čekanja tijekom povezivanja sa slave-om i pokretanja izvršavanja udaljene funkcije. Jednom kad master počne slati argument, ovo se više ne primjenjuje; biblioteka dopušta do 5 sekundi za prijenos argumenta.recv_timeout– milisekunde čekanja da slave počne vraćati odgovor. Jednom kad master počne primati odgovor, ovo se više ne primjenjuje; biblioteka dopušta do 5 sekundi za prijenos odgovora.
Vraća
memoryviewodgovora u slučaju uspjeha, prazanbytes()ako udaljeni naziv ne postoji na slave-u, iliNoneu slučaju neuspjeha komunikacije.
class rpc_slave – rpc_slave osnovna klasa¶
rpc_slave je osnovna klasa. Koristite jednu od transportno-specifičnih podklasa (rpc_can_slave, rpc_i2c_slave, rpc_spi_slave, rpc_uart_slave).
- class rpc.rpc_slave¶
Stvara
rpc_slaveobjekt. Nije namijenjeno izravnom korištenju.- register_callback(cb: Callable[[memoryview], bytes | memoryview]) None¶
Registrira povratni poziv koji master može pozvati po nazivu.
cbje pozivljivi objekt koji prima jedanmemoryviewargument i vraćabytes-oliki objekt.__name__povratnog poziva koristi se kao ključ za pretraživanje.
- schedule_callback(cb: Callable[[], None]) None¶
Zakazuje
cb(pozivljivi objekt koji ne prima argumente) za jednokratno izvršavanje, neposredno nakon što trenutno pokrenuti rpc povratni poziv uspješno vrati svoj odgovor master-u. Mora se pozvati iz unutrašnjosti rpc povratnog poziva. Omogućuje izvršavanje dugotrajnog posla ilirpc.get_bytes/rpc.put_bytesprijenosa preskakanjem između rpc transakcija. Ponovno registrirajte pri svakom pozivu ako je potrebno ponovljeno izvršavanje.
- setup_loop_callback(cb: Callable[[], None]) None¶
Registrira
cb(pozivljivi objekt koji ne prima argumente) za poziv pri svakoj iteracijirpc_slave.loop. Za razliku odrpc_slave.schedule_callback, ovaj povratni poziv ostaje registriran. Mora biti neblokirajući; brzina poziva je promjenjiva.
- loop(recv_timeout: int = 1000, send_timeout: int = 1000) None¶
Pokreće petlju otpreme rpc slave-a. Ne vraća se osim iznimkom podignutom iz povratnog poziva.
recv_timeout– milisekunde čekanja na naredbu od master-a prije ponovnog pokušaja.send_timeout– milisekunde čekanja da master potvrdi primitak odgovora prije povratka na primanje.
class rpc_can_master – CAN Master sučelje¶
Upravljajte drugim rpc uređajem preko CAN-a.
- class rpc.rpc_can_master(message_id: int = 0x7FF, bit_rate: int = 250000, sample_point: float = 75, can_bus: int = 2)¶
message_id– 11-bitni CAN message id koji se koristi za prijenos podataka.bit_rate– CAN brzina u bitovima po sekundi.sample_point– postotak točke uzorkovanja Tseg1/Tseg2 (npr. 50.0, 62.5, 75, 87.5).can_bus– broj CAN periferije.
message_idibit_ratemaster-a i slave-a moraju se podudarati. Sabirnica mora biti terminirana s 120 oma.
class rpc_can_slave – CAN Slave sučelje¶
Budite upravljani drugim rpc uređajem preko CAN-a.
class rpc_i2c_master – I2C Master sučelje¶
Upravljajte drugim rpc uređajem preko I2C-a.
- class rpc.rpc_i2c_master(slave_addr: int = 0x12, rate: int = 100000, i2c_bus: int = 2)¶
slave_addr– 7-bitna I2C adresa slave uređaja.rate– frekvencija takta I2C sabirnice u Hz.i2c_bus– broj I2C periferije.
Adrese master-a i slave-a moraju se podudarati. Vanjski pull-up otpornici potrebni su na SCL i SDA, a oba uređaja moraju dijeliti zajedničko uzemljenje.
class rpc_i2c_slave – I2C Slave sučelje¶
Budite upravljani drugim rpc uređajem preko I2C-a.
class rpc_spi_master – SPI Master sučelje¶
Upravljajte drugim rpc uređajem preko SPI-a.
- class rpc.rpc_spi_master(cs_pin: str = 'P3', freq: int = 1000000, clk_polarity: int = 1, clk_phase: int = 0, spi_bus: int = 2)¶
cs_pin– naziv chip-select pina.freq– frekvencija takta SPI sabirnice u Hz.clk_polarity– razina takta u mirovanju (0 ili 1).clk_phase– uzorkovanje podataka na prvom (0) ili drugom (1) bridu takta.spi_bus– broj SPI periferije.
Postavke master-a i slave-a moraju se podudarati. Spojite CS, SCLK, MOSI, MISO izravno. Oba uređaja moraju dijeliti zajedničko uzemljenje.
class rpc_spi_slave – SPI Slave sučelje¶
Budite upravljani drugim rpc uređajem preko SPI-a.
- class rpc.rpc_spi_slave(cs_pin: str = 'P3', clk_polarity: int = 1, clk_phase: int = 0, spi_bus: int = 2)¶
cs_pin– naziv ulaznog chip-select pina.clk_polarity– razina takta u mirovanju (0 ili 1).clk_phase– uzorkovanje podataka na prvom (0) ili drugom (1) bridu takta.spi_bus– broj SPI periferije.
class rpc_uart_master – UART Master sučelje¶
Upravljajte drugim rpc uređajem preko asinkrone serijske veze (UART).
- class rpc.rpc_uart_master(baudrate: int = 9600, uart_port: int = 3)¶
baudrate– serijska brzina prijenosa (baud).uart_port– broj UART periferije.
Brzine prijenosa (baud) master-a i slave-a moraju se podudarati. Spojite master TX na slave RX i master RX na slave TX. Oba uređaja moraju dijeliti zajedničko uzemljenje.
class rpc_uart_slave – UART Slave sučelje¶
Budite upravljani drugim rpc uređajem preko asinkrone serijske veze (UART).