Merge branch 'master' of github.com:adafruit/Adafruit_BusIO
This commit is contained in:
commit
86cb7eefc8
|
|
@ -77,10 +77,19 @@ bool Adafruit_I2CDevice::detected(void) {
|
||||||
bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
||||||
const uint8_t *prefix_buffer,
|
const uint8_t *prefix_buffer,
|
||||||
size_t prefix_len) {
|
size_t prefix_len) {
|
||||||
|
if ((len + prefix_len) > maxBufferSize()) {
|
||||||
|
// currently not guaranteed to work if more than 32 bytes!
|
||||||
|
// we will need to find out if some platforms have larger
|
||||||
|
// I2C buffer sizes :/
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice could not write such a large buffer"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_wire->beginTransmission(_addr);
|
_wire->beginTransmission(_addr);
|
||||||
|
|
||||||
// Write the prefix data (usually an address)
|
// Write the prefix data (usually an address)
|
||||||
// This is required to be less than _maxBufferSize, so no need to chunkify
|
|
||||||
if ((prefix_len != 0) && (prefix_buffer != NULL)) {
|
if ((prefix_len != 0) && (prefix_buffer != NULL)) {
|
||||||
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
|
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
|
|
@ -90,32 +99,14 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the data itself, chunkify if needed
|
// Write the data itself
|
||||||
size_t bufferSize = maxBufferSize();
|
if (_wire->write(buffer, len) != len) {
|
||||||
if (bufferSize >= len) {
|
|
||||||
// can just write
|
|
||||||
if (_wire->write(buffer, len) != len) {
|
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// must chunkify
|
|
||||||
size_t pos = 0;
|
|
||||||
uint8_t write_buffer[bufferSize];
|
|
||||||
while (pos < len) {
|
|
||||||
size_t write_len = len - pos > bufferSize ? bufferSize : len - pos;
|
|
||||||
for (size_t i = 0; i < write_len; i++)
|
|
||||||
write_buffer[i] = buffer[pos++];
|
|
||||||
if (_wire->write(write_buffer, write_len) != write_len) {
|
|
||||||
#ifdef DEBUG_SERIAL
|
|
||||||
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
|
|
||||||
DEBUG_SERIAL.print(F("\tI2CWRITE @ 0x"));
|
DEBUG_SERIAL.print(F("\tI2CWRITE @ 0x"));
|
||||||
|
|
@ -146,7 +137,7 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
||||||
|
|
||||||
if (_wire->endTransmission(stop) == 0) {
|
if (_wire->endTransmission(stop) == 0) {
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
DEBUG_SERIAL.println("Sent!");
|
// DEBUG_SERIAL.println("Sent!");
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -166,24 +157,16 @@ bool Adafruit_I2CDevice::write(const uint8_t *buffer, size_t len, bool stop,
|
||||||
* @return True if read was successful, otherwise false.
|
* @return True if read was successful, otherwise false.
|
||||||
*/
|
*/
|
||||||
bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {
|
bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {
|
||||||
size_t bufferSize = maxBufferSize();
|
size_t pos = 0;
|
||||||
if (bufferSize >= len) {
|
while (pos < len) {
|
||||||
// can just read
|
size_t read_len =
|
||||||
return _read(buffer, len, stop);
|
((len - pos) > maxBufferSize()) ? maxBufferSize() : (len - pos);
|
||||||
} else {
|
bool read_stop = (pos < (len - read_len)) ? false : stop;
|
||||||
// must chunkify
|
if (!_read(buffer + pos, read_len, read_stop))
|
||||||
size_t pos = 0;
|
return false;
|
||||||
uint8_t read_buffer[bufferSize];
|
pos += read_len;
|
||||||
while (pos < len) {
|
|
||||||
size_t read_len = len - pos > bufferSize ? bufferSize : len - pos;
|
|
||||||
if (!_read(read_buffer, read_len, false)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (size_t i = 0; i < read_len; i++)
|
|
||||||
buffer[pos++] = read_buffer[i];
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Adafruit_I2CDevice::_read(uint8_t *buffer, size_t len, bool stop) {
|
bool Adafruit_I2CDevice::_read(uint8_t *buffer, size_t len, bool stop) {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
#if !defined(SPI_INTERFACES_COUNT) || \
|
#if !defined(SPI_INTERFACES_COUNT) || \
|
||||||
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
|
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# Adafruit Bus IO Library [](https://github.com/adafruit/Adafruit_BusIO/actions)
|
# Adafruit Bus IO Library [](https://github.com/adafruit/Adafruit_BusIO/actions)
|
||||||
|
|
||||||
|
|
||||||
This is a helper libary to abstract away I2C & SPI transactions and registers
|
This is a helper libary to abstract away I2C & SPI transactions and registers
|
||||||
|
|
||||||
Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
|
Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
name=Adafruit BusIO
|
name=Adafruit BusIO
|
||||||
version=1.9.1
|
version=1.9.3
|
||||||
author=Adafruit
|
author=Adafruit
|
||||||
maintainer=Adafruit <info@adafruit.com>
|
maintainer=Adafruit <info@adafruit.com>
|
||||||
sentence=This is a library for abstracting away UART, I2C and SPI interfacing
|
sentence=This is a library for abstracting away UART, I2C and SPI interfacing
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue