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 rpc objekt. Nije namijenjeno izravnom korištenju.

get_bytes(buff: bytearray | memoryview, timeout_ms: int) bytes | None

Ponovno implementirano u transportno-specifičnim podklasama. Puni buff bajtovima iz temeljnog sučelja unutar timeout_ms milisekundi. Vraća None u slučaju isteka vremena.

put_bytes(data: bytes | memoryview, timeout_ms: int) None

Ponovno implementirano u transportno-specifičnim podklasama. Šalje data preko temeljnog sučelja unutar timeout_ms milisekundi.

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šnjosti rpc_slave povratnog poziva (ili izravno nakon uspješnog rpc_master.call) jednom kad su se obje strane sinkronizirale.

  • call_back – pozivljivi objekt koji se poziva jednom za svaki primljeni paket podataka kao call_back(data) gdje je data memoryview. 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šnjosti rpc_slave povratnog poziva (ili izravno nakon uspješnog rpc_master.call) jednom kad su se obje strane sinkronizirale.

  • call_back – pozivljivi objekt koji se poziva bez argumenata i koji vraća sljedeći bytes ili memoryview paket 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_master objekt. 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.

  • databytes-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 memoryview odgovora u slučaju uspjeha, prazan bytes() ako udaljeni naziv ne postoji na slave-u, ili None u 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_slave objekt. Nije namijenjeno izravnom korištenju.

register_callback(cb: Callable[[memoryview], bytes | memoryview]) None

Registrira povratni poziv koji master može pozvati po nazivu. cb je pozivljivi objekt koji prima jedan memoryview argument i vraća bytes-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 ili rpc.get_bytes/rpc.put_bytes prijenosa 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 iteraciji rpc_slave.loop. Za razliku od rpc_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_id i bit_rate master-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.rpc_can_slave(message_id: int = 0x7FF, bit_rate: int = 250000, sample_point: float = 75, can_bus: int = 2)

Pogledajte rpc_can_master za opise argumenata.

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.rpc_i2c_slave(slave_addr: int = 0x12, i2c_bus: int = 2)
  • slave_addr – 7-bitna I2C adresa na koju ovaj slave odgovara.

  • i2c_bus – broj I2C periferije.

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).

class rpc.rpc_uart_slave(baudrate: int = 9600, uart_port: int = 3)
  • baudrate – serijska brzina prijenosa (baud).

  • uart_port – broj UART periferije.