@@ -77,10 +77,19 @@ bool Adafruit_I2CDevice::detected(void) {
77
77
bool Adafruit_I2CDevice::write (const uint8_t *buffer, size_t len, bool stop,
78
78
const uint8_t *prefix_buffer,
79
79
size_t prefix_len) {
80
+ if ((len + prefix_len) > maxBufferSize ()) {
81
+ // currently not guaranteed to work if more than 32 bytes!
82
+ // we will need to find out if some platforms have larger
83
+ // I2C buffer sizes :/
84
+ #ifdef DEBUG_SERIAL
85
+ DEBUG_SERIAL.println (F (" \t I2CDevice could not write such a large buffer" ));
86
+ #endif
87
+ return false ;
88
+ }
89
+
80
90
_wire->beginTransmission (_addr);
81
91
82
92
// Write the prefix data (usually an address)
83
- // This is required to be less than _maxBufferSize, so no need to chunkify
84
93
if ((prefix_len != 0 ) && (prefix_buffer != NULL )) {
85
94
if (_wire->write (prefix_buffer, prefix_len) != prefix_len) {
86
95
#ifdef DEBUG_SERIAL
@@ -90,32 +99,14 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
90
99
}
91
100
}
92
101
93
- // Write the data itself, chunkify if needed
94
- size_t bufferSize = maxBufferSize ();
95
- if (bufferSize >= len) {
96
- // can just write
97
- if (_wire->write (buffer, len) != len) {
102
+ // Write the data itself
103
+ if (_wire->write (buffer, len) != len) {
98
104
#ifdef DEBUG_SERIAL
99
- DEBUG_SERIAL.println (F (" \t I2CDevice failed to write" ));
105
+ DEBUG_SERIAL.println (F (" \t I2CDevice failed to write" ));
100
106
#endif
101
- return false ;
102
- }
103
- } else {
104
- // must chunkify
105
- size_t pos = 0 ;
106
- uint8_t write_buffer[bufferSize];
107
- while (pos < len) {
108
- size_t write_len = len - pos > bufferSize ? bufferSize : len - pos;
109
- for (size_t i = 0 ; i < write_len; i++)
110
- write_buffer[i] = buffer[pos++];
111
- if (_wire->write (write_buffer, write_len) != write_len) {
112
- #ifdef DEBUG_SERIAL
113
- DEBUG_SERIAL.println (F (" \t I2CDevice failed to write" ));
114
- #endif
115
- return false ;
116
- }
117
- }
107
+ return false ;
118
108
}
109
+
119
110
#ifdef DEBUG_SERIAL
120
111
121
112
DEBUG_SERIAL.print (F (" \t I2CWRITE @ 0x" ));
@@ -146,7 +137,7 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
146
137
147
138
if (_wire->endTransmission (stop) == 0 ) {
148
139
#ifdef DEBUG_SERIAL
149
- DEBUG_SERIAL.println (" Sent!" );
140
+ // DEBUG_SERIAL.println("Sent!");
150
141
#endif
151
142
return true ;
152
143
} else {
@@ -166,24 +157,16 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
166
157
* @return True if read was successful, otherwise false.
167
158
*/
168
159
bool Adafruit_I2CDevice::read (uint8_t *buffer, size_t len, bool stop) {
169
- size_t bufferSize = maxBufferSize ();
170
- if (bufferSize >= len) {
171
- // can just read
172
- return _read (buffer, len, stop);
173
- } else {
174
- // must chunkify
175
- size_t pos = 0 ;
176
- uint8_t read_buffer[bufferSize];
177
- while (pos < len) {
178
- size_t read_len = len - pos > bufferSize ? bufferSize : len - pos;
179
- if (!_read (read_buffer, read_len, false )) {
180
- return false ;
181
- }
182
- for (size_t i = 0 ; i < read_len; i++)
183
- buffer[pos++] = read_buffer[i];
184
- }
185
- return true ;
160
+ size_t pos = 0 ;
161
+ while (pos < len) {
162
+ size_t read_len =
163
+ ((len - pos) > maxBufferSize ()) ? maxBufferSize () : (len - pos);
164
+ bool read_stop = (pos < (len - read_len)) ? false : stop;
165
+ if (!_read (buffer + pos, read_len, read_stop))
166
+ return false ;
167
+ pos += read_len;
186
168
}
169
+ return true ;
187
170
}
188
171
189
172
bool Adafruit_I2CDevice::_read (uint8_t *buffer, size_t len, bool stop) {
0 commit comments