Merge branch 'master' of github.com:adafruit/Adafruit_BusIO

This commit is contained in:
lady ada 2021-09-29 13:13:06 -04:00
commit 86cb7eefc8
4 changed files with 29 additions and 44 deletions

View File

@ -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) {

View File

@ -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))

View File

@ -1,7 +1,7 @@
# Adafruit Bus IO Library [![Build Status](https://github.com/adafruit/Adafruit_BusIO/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_BusIO/actions) # Adafruit Bus IO Library [![Build Status](https://github.com/adafruit/Adafruit_BusIO/workflows/Arduino%20Library%20CI/badge.svg)](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!

View File

@ -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