@@ -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)
681681void 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 ) \
755757void rpc_i2c##name##_master::_flush() \
756758{ \
757759 for (int i = port.available (); i > 0 ; i--) port.read (); \
758760} \
759- \
761+ \
760762bool 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
808859RPC_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 ) \
880966void 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
9001006RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (,SERIAL_PORT_HARDWARE)
9011007#endif
@@ -928,6 +1034,8 @@ RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
9281034RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (7 ,SERIAL_PORT_HARDWARE7)
9291035#endif
9301036
1037+ #endif
1038+
9311039#ifdef SERIAL_PORT_USBVIRTUAL
9321040RPC_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
9561084RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (,SERIAL_PORT_HARDWARE)
9571085#endif
@@ -984,6 +1112,8 @@ RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
9841112RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (7 ,SERIAL_PORT_HARDWARE7)
9851113#endif
9861114
1115+ #endif
1116+
9871117#ifdef SERIAL_PORT_USBVIRTUAL
9881118RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (USB,SERIAL_PORT_USBVIRTUAL)
9891119#endif
0 commit comments