Skip to content

Commit cb21cf5

Browse files
authored
Merge pull request #65 from caternuson/busio_better_chunk
Update chunk
2 parents b903c7e + 4188870 commit cb21cf5

File tree

2 files changed

+26
-43
lines changed

2 files changed

+26
-43
lines changed

Adafruit_I2CDevice.cpp

+25-42
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,19 @@ bool Adafruit_I2CDevice::detected(void) {
7777
bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
7878
const uint8_t *prefix_buffer,
7979
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("\tI2CDevice could not write such a large buffer"));
86+
#endif
87+
return false;
88+
}
89+
8090
_wire->beginTransmission(_addr);
8191

8292
// Write the prefix data (usually an address)
83-
// This is required to be less than _maxBufferSize, so no need to chunkify
8493
if ((prefix_len != 0) && (prefix_buffer != NULL)) {
8594
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
8695
#ifdef DEBUG_SERIAL
@@ -90,32 +99,14 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
9099
}
91100
}
92101

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) {
98104
#ifdef DEBUG_SERIAL
99-
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
105+
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
100106
#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("\tI2CDevice failed to write"));
114-
#endif
115-
return false;
116-
}
117-
}
107+
return false;
118108
}
109+
119110
#ifdef DEBUG_SERIAL
120111

121112
DEBUG_SERIAL.print(F("\tI2CWRITE @ 0x"));
@@ -146,7 +137,7 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
146137

147138
if (_wire->endTransmission(stop) == 0) {
148139
#ifdef DEBUG_SERIAL
149-
DEBUG_SERIAL.println("Sent!");
140+
// DEBUG_SERIAL.println("Sent!");
150141
#endif
151142
return true;
152143
} else {
@@ -166,24 +157,16 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
166157
* @return True if read was successful, otherwise false.
167158
*/
168159
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;
186168
}
169+
return true;
187170
}
188171

189172
bool Adafruit_I2CDevice::_read(uint8_t *buffer, size_t len, bool stop) {

library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Adafruit BusIO
2-
version=1.9.1
2+
version=1.9.2
33
author=Adafruit
44
maintainer=Adafruit <[email protected]>
55
sentence=This is a library for abstracting away UART, I2C and SPI interfacing

0 commit comments

Comments
 (0)