Skip to content

Commit 01055c4

Browse files
committed
Update to support MBED boards
1 parent 6f0ad02 commit 01055c4

File tree

3 files changed

+344
-103
lines changed

3 files changed

+344
-103
lines changed

library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=OpenMV Arduino RPC
2-
version=1.0.3
2+
version=1.0.4
33
author=OpenMV
44
maintainer=OpenMV
55
sentence=OpenMV Arduino RPC Interface Library

src/openmvrpc.cpp

+191-61
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ bool rpc_slave::loop(unsigned long recv_timeout, unsigned long send_timeout)
677677
return false;
678678
}
679679

680-
#if !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_NRF52840)
680+
#if !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_NRF52840) && !defined(ARDUINO_ARCH_MBED)
681681
void rpc_can_master::_flush()
682682
{
683683
for (int i = 0, ii = CAN.parsePacket(); i < ii; i++) CAN.read();
@@ -751,12 +751,14 @@ bool rpc_can_slave::put_bytes(uint8_t *data, size_t size, unsigned long timeout)
751751
}
752752
#endif
753753

754+
#if (!defined(ARDUINO_ARCH_ESP32)) && (!defined(ARDUINO_ARCH_ESP8266))
755+
754756
#define RPC_I2C_MASTER_IMPLEMENTATION(name, port) \
755757
void rpc_i2c##name##_master::_flush() \
756758
{ \
757759
for (int i = port.available(); i > 0; i--) port.read(); \
758760
} \
759-
\
761+
\
760762
bool rpc_i2c##name##_master::get_bytes(uint8_t *buff, size_t size, unsigned long timeout) \
761763
{ \
762764
(void) timeout; \
@@ -800,81 +802,165 @@ bool rpc_i2c##name##_master::put_bytes(uint8_t *data, size_t size, unsigned long
800802
return ok; \
801803
}
802804

803-
#if WIRE_HOWMANY > 0
804-
RPC_I2C_MASTER_IMPLEMENTATION(,Wire)
805+
#else
806+
807+
#define RPC_I2C_MASTER_IMPLEMENTATION(name, port) \
808+
void rpc_i2c##name##_master::_flush() \
809+
{ \
810+
for (int i = port.available(); i > 0; i--) port.read(); \
811+
} \
812+
\
813+
bool rpc_i2c##name##_master::get_bytes(uint8_t *buff, size_t size, unsigned long timeout) \
814+
{ \
815+
(void) timeout; \
816+
bool ok = true; \
817+
port.begin(); \
818+
port.setClock(__rate); \
819+
\
820+
for (size_t i = 0; i < size; i += 32) { \
821+
size_t size_remaining = size - i; \
822+
uint8_t request_size = min(size_remaining, 32); \
823+
uint8_t request_stop = size_remaining <= 32; \
824+
delayMicroseconds(100); \
825+
if (port.requestFrom(__slave_addr, request_size, request_stop) != request_size) { ok = false; break; } \
826+
for (size_t j = 0; j < request_size; j++) buff[i+j] = port.read(); \
827+
} \
828+
\
829+
if (ok) ok = ok && (!_same(buff, size)); \
830+
if (!ok) delay(_get_short_timeout); \
831+
return ok; \
832+
} \
833+
\
834+
bool rpc_i2c##name##_master::put_bytes(uint8_t *data, size_t size, unsigned long timeout) \
835+
{ \
836+
\
837+
(void) timeout; \
838+
bool ok = true; \
839+
port.begin(); \
840+
port.setClock(__rate); \
841+
\
842+
for (size_t i = 0; i < size; i += 32) { \
843+
size_t size_remaining = size - i; \
844+
uint8_t request_size = min(size_remaining, 32); \
845+
uint8_t request_stop = size_remaining <= 32; \
846+
delayMicroseconds(100); \
847+
port.beginTransmission(__slave_addr); \
848+
if ((port.write(data + i, request_size) != request_size) || port.endTransmission(request_stop)) { ok = false; break; } \
849+
} \
850+
\
851+
return ok; \
852+
}
853+
805854
#endif
806855

856+
RPC_I2C_MASTER_IMPLEMENTATION(,Wire)
857+
807858
#if WIRE_HOWMANY > 1
808859
RPC_I2C_MASTER_IMPLEMENTATION(1,Wire1)
809860
#endif
810861

862+
#undef RPC_I2C_MASTER_IMPLEMENTATION
811863

812-
volatile uint8_t *rpc_i2c_slave::__bytes_buff = NULL;
813-
volatile int rpc_i2c_slave::__bytes_size = 0;
814-
815-
void rpc_i2c_slave::onReceiveHandler(int numBytes)
816-
{
817-
if (!__bytes_size) return;
818-
for (int i = 0, j = min(__bytes_size, numBytes); i < j; i++) __bytes_buff[i] = Wire.read();
819-
__bytes_buff += numBytes;
820-
__bytes_size -= numBytes;
864+
#define RPC_I2C_SLAVE_IMPLEMENTATION(name, port) \
865+
volatile uint8_t *rpc_i2c##name##_slave::__bytes_buff = NULL; \
866+
volatile int rpc_i2c##name##_slave::__bytes_size = 0; \
867+
\
868+
void rpc_i2c##name##_slave::onReceiveHandler(int numBytes) \
869+
{ \
870+
if (!__bytes_size) return; \
871+
for (int i = 0, j = min(__bytes_size, numBytes); i < j; i++) __bytes_buff[i] = port.read(); \
872+
__bytes_buff += numBytes; \
873+
__bytes_size -= numBytes; \
874+
} \
875+
\
876+
void rpc_i2c##name##_slave::onRequestHandler() \
877+
{ \
878+
if (!__bytes_size) return; \
879+
size_t written = port.write((uint8_t *) __bytes_buff, min(__bytes_size, 32)); \
880+
__bytes_buff += written; \
881+
__bytes_size -= written; \
882+
} \
883+
\
884+
void rpc_i2c##name##_slave::_flush() \
885+
{ \
886+
for (int i = port.available(); i > 0; i--) port.read(); \
887+
} \
888+
\
889+
bool rpc_i2c##name##_slave::get_bytes(uint8_t *buff, size_t size, unsigned long timeout) \
890+
{ \
891+
__bytes_buff = buff; \
892+
__bytes_size = size; \
893+
unsigned long start = millis(); \
894+
while (((millis() - start) <= timeout) && __bytes_size); \
895+
bool ok = !__bytes_size; \
896+
__bytes_size = 0; \
897+
return ok; \
898+
} \
899+
\
900+
bool rpc_i2c##name##_slave::put_bytes(uint8_t *data, size_t size, unsigned long timeout) \
901+
{ \
902+
__bytes_buff = data; \
903+
__bytes_size = size; \
904+
unsigned long start = millis(); \
905+
while (((millis() - start) <= timeout) && __bytes_size); \
906+
bool ok = !__bytes_size; \
907+
__bytes_size = 0; \
908+
return ok; \
821909
}
822910

823-
void rpc_i2c_slave::onRequestHandler()
824-
{
825-
if (!__bytes_size) return;
826-
size_t written = Wire.write((uint8_t *) __bytes_buff, min(__bytes_size, 32));
827-
__bytes_buff += written;
828-
__bytes_size -= written;
829-
}
911+
RPC_I2C_SLAVE_IMPLEMENTATION(,Wire)
830912

831-
void rpc_i2c_slave::_flush()
832-
{
833-
for (int i = Wire.available(); i > 0; i--) Wire.read();
834-
}
913+
#if WIRE_HOWMANY > 1
914+
RPC_I2C_SLAVE_IMPLEMENTATION(1,Wire1)
915+
#endif
835916

836-
bool rpc_i2c_slave::get_bytes(uint8_t *buff, size_t size, unsigned long timeout)
837-
{
838-
__bytes_buff = buff;
839-
__bytes_size = size;
840-
unsigned long start = millis();
841-
while (((millis() - start) <= timeout) && __bytes_size);
842-
bool ok = !__bytes_size;
843-
__bytes_size = 0;
844-
return ok;
845-
}
917+
#if WIRE_HOWMANY > 2
918+
RPC_I2C_SLAVE_IMPLEMENTATION(2,Wire2)
919+
#endif
846920

847-
bool rpc_i2c_slave::put_bytes(uint8_t *data, size_t size, unsigned long timeout)
848-
{
849-
__bytes_buff = data;
850-
__bytes_size = size;
851-
unsigned long start = millis();
852-
while (((millis() - start) <= timeout) && __bytes_size);
853-
bool ok = !__bytes_size;
854-
__bytes_size = 0;
855-
return ok;
856-
}
921+
#if WIRE_HOWMANY > 3
922+
RPC_I2C_SLAVE_IMPLEMENTATION(3,Wire3)
923+
#endif
857924

858-
bool rpc_spi_master::get_bytes(uint8_t *buff, size_t size, unsigned long timeout)
859-
{
860-
put_bytes(buff, size, timeout);
861-
bool ok = !_same(buff, size);
862-
if (!ok) delay(_get_short_timeout);
863-
return ok;
925+
#undef RPC_I2C_SLAVE_IMPLEMENTATION
926+
927+
#define RPC_SPI_MASTER_IMPLEMENTATION(name, port) \
928+
bool rpc_spi##name##_master::get_bytes(uint8_t *buff, size_t size, unsigned long timeout) \
929+
{ \
930+
put_bytes(buff, size, timeout); \
931+
bool ok = !_same(buff, size); \
932+
if (!ok) delay(_get_short_timeout); \
933+
return ok; \
934+
} \
935+
\
936+
bool rpc_spi##name##_master::put_bytes(uint8_t *data, size_t size, unsigned long timeout) \
937+
{ \
938+
(void) timeout; \
939+
\
940+
digitalWrite(__cs_pin, LOW); \
941+
delayMicroseconds(100); /* Give slave time to get ready */ \
942+
port.beginTransaction(__settings); \
943+
port.transfer(data, size); \
944+
port.endTransaction(); \
945+
digitalWrite(__cs_pin, HIGH); \
946+
return true; \
864947
}
865948

866-
bool rpc_spi_master::put_bytes(uint8_t *data, size_t size, unsigned long timeout)
867-
{
868-
(void) timeout;
949+
RPC_SPI_MASTER_IMPLEMENTATION(,SPI)
869950

870-
digitalWrite(__cs_pin, LOW);
871-
delayMicroseconds(100); // Give slave time to get ready
872-
SPI.beginTransaction(__settings);
873-
SPI.transfer(data, size);
874-
SPI.endTransaction();
875-
digitalWrite(__cs_pin, HIGH);
876-
return true;
877-
}
951+
#if SPI_HOWMANY > 1
952+
RPC_SPI_MASTER_IMPLEMENTATION(1,SPI1)
953+
#endif
954+
955+
#if SPI_HOWMANY > 2
956+
RPC_SPI_MASTER_IMPLEMENTATION(2,SPI2)
957+
#endif
958+
959+
#if SPI_HOWMANY > 3
960+
RPC_SPI_MASTER_IMPLEMENTATION(3,SPI3)
961+
#endif
962+
963+
#undef RPC_SPI_MASTER_IMPLEMENTATION
878964

879965
#define RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(name, port) \
880966
void rpc_hardware_serial##name##_uart_master::_flush() \
@@ -896,6 +982,26 @@ bool rpc_hardware_serial##name##_uart_master::put_bytes(uint8_t *buff, size_t si
896982
return port.write((char *) buff, size) == size; \
897983
}
898984

985+
#ifdef SERIAL_HOWMANY
986+
987+
#if SERIAL_HOWMANY > 0
988+
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(1,Serial1)
989+
#endif
990+
991+
#if SERIAL_HOWMANY > 1
992+
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(2,Serial2)
993+
#endif
994+
995+
#if SERIAL_HOWMANY > 2
996+
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(3,Serial3)
997+
#endif
998+
999+
#if SERIAL_HOWMANY > 3
1000+
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(4,Serial4)
1001+
#endif
1002+
1003+
#else
1004+
8991005
#ifdef SERIAL_PORT_HARDWARE
9001006
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(,SERIAL_PORT_HARDWARE)
9011007
#endif
@@ -928,6 +1034,8 @@ RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
9281034
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(7,SERIAL_PORT_HARDWARE7)
9291035
#endif
9301036

1037+
#endif
1038+
9311039
#ifdef SERIAL_PORT_USBVIRTUAL
9321040
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(USB,SERIAL_PORT_USBVIRTUAL)
9331041
#endif
@@ -952,6 +1060,26 @@ bool rpc_hardware_serial##name##_uart_slave::put_bytes(uint8_t *buff, size_t siz
9521060
return port.write((char *) buff, size) == size; \
9531061
}
9541062

1063+
#ifdef SERIAL_HOWMANY
1064+
1065+
#if SERIAL_HOWMANY > 0
1066+
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(1,Serial1)
1067+
#endif
1068+
1069+
#if SERIAL_HOWMANY > 1
1070+
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(2,Serial2)
1071+
#endif
1072+
1073+
#if SERIAL_HOWMANY > 2
1074+
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(3,Serial3)
1075+
#endif
1076+
1077+
#if SERIAL_HOWMANY > 3
1078+
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(4,Serial4)
1079+
#endif
1080+
1081+
#else
1082+
9551083
#ifdef SERIAL_PORT_HARDWARE
9561084
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(,SERIAL_PORT_HARDWARE)
9571085
#endif
@@ -984,6 +1112,8 @@ RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
9841112
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(7,SERIAL_PORT_HARDWARE7)
9851113
#endif
9861114

1115+
#endif
1116+
9871117
#ifdef SERIAL_PORT_USBVIRTUAL
9881118
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(USB,SERIAL_PORT_USBVIRTUAL)
9891119
#endif

0 commit comments

Comments
 (0)