@@ -677,7 +677,7 @@ bool rpc_slave::loop(unsigned long recv_timeout, unsigned long send_timeout)
677
677
return false ;
678
678
}
679
679
680
- #if !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_NRF52840)
680
+ #if !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_NRF52840) && !defined(ARDUINO_ARCH_MBED)
681
681
void rpc_can_master::_flush ()
682
682
{
683
683
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)
751
751
}
752
752
#endif
753
753
754
+ #if (!defined(ARDUINO_ARCH_ESP32)) && (!defined(ARDUINO_ARCH_ESP8266))
755
+
754
756
#define RPC_I2C_MASTER_IMPLEMENTATION (name, port ) \
755
757
void rpc_i2c##name##_master::_flush() \
756
758
{ \
757
759
for (int i = port.available (); i > 0 ; i--) port.read (); \
758
760
} \
759
- \
761
+ \
760
762
bool rpc_i2c##name##_master::get_bytes(uint8_t *buff, size_t size, unsigned long timeout) \
761
763
{ \
762
764
(void ) timeout; \
@@ -800,81 +802,165 @@ bool rpc_i2c##name##_master::put_bytes(uint8_t *data, size_t size, unsigned long
800
802
return ok; \
801
803
}
802
804
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
+
805
854
#endif
806
855
856
+ RPC_I2C_MASTER_IMPLEMENTATION (,Wire)
857
+
807
858
#if WIRE_HOWMANY > 1
808
859
RPC_I2C_MASTER_IMPLEMENTATION (1 ,Wire1)
809
860
#endif
810
861
862
+ #undef RPC_I2C_MASTER_IMPLEMENTATION
811
863
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; \
821
909
}
822
910
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)
830
912
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
835
916
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
846
920
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
857
924
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 ; \
864
947
}
865
948
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)
869
950
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
878
964
879
965
#define RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (name, port ) \
880
966
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
896
982
return port.write ((char *) buff, size) == size; \
897
983
}
898
984
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
+
899
1005
#ifdef SERIAL_PORT_HARDWARE
900
1006
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (,SERIAL_PORT_HARDWARE)
901
1007
#endif
@@ -928,6 +1034,8 @@ RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
928
1034
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (7 ,SERIAL_PORT_HARDWARE7)
929
1035
#endif
930
1036
1037
+ #endif
1038
+
931
1039
#ifdef SERIAL_PORT_USBVIRTUAL
932
1040
RPC_HARDWARE_SERIAL_UART_MASTER_IMPLEMENTATION (USB,SERIAL_PORT_USBVIRTUAL)
933
1041
#endif
@@ -952,6 +1060,26 @@ bool rpc_hardware_serial##name##_uart_slave::put_bytes(uint8_t *buff, size_t siz
952
1060
return port.write ((char *) buff, size) == size; \
953
1061
}
954
1062
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
+
955
1083
#ifdef SERIAL_PORT_HARDWARE
956
1084
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (,SERIAL_PORT_HARDWARE)
957
1085
#endif
@@ -984,6 +1112,8 @@ RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION(6,SERIAL_PORT_HARDWARE6)
984
1112
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (7 ,SERIAL_PORT_HARDWARE7)
985
1113
#endif
986
1114
1115
+ #endif
1116
+
987
1117
#ifdef SERIAL_PORT_USBVIRTUAL
988
1118
RPC_HARDWARE_SERIAL_UART_SLAVE_IMPLEMENTATION (USB,SERIAL_PORT_USBVIRTUAL)
989
1119
#endif
0 commit comments