Skip to content

Commit

Permalink
Wire buffer length improvments. (#8398)
Browse files Browse the repository at this point in the history
* Enable I2C_BUFFER_LENGTH definition for Wire lib

Based on
paclema/arduino-esp32@375a89e

We should have been very careful when #defining things to not use a name
that could conflict with the user's own code, so this marks that old
define as deprecated.

If you opt-into the new behavior, you do not get the old BUFFER_LENGTH
constant.

As a bonus, changing these uint8_ts to size_t both reduces the code
size & improves performance.

* Increase buffer indexing variable size

I looked over the users of these variables and they should be fine with
no additional changes. The existing methods already have an option to
use size_t rather than uint8_t.

There's a few methods which return int instead of size_t, which isn't
great from a portability perspective but will be fine since this only is
designed to run on the ESP8266.
  • Loading branch information
flaviut authored Dec 14, 2021
1 parent 55ef3e7 commit 42aa0e6
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 16 deletions.
18 changes: 9 additions & 9 deletions libraries/Wire/Wire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ extern "C" {

// Initialize Class Variables //////////////////////////////////////////////////

uint8_t TwoWire::rxBuffer[BUFFER_LENGTH];
uint8_t TwoWire::rxBufferIndex = 0;
uint8_t TwoWire::rxBufferLength = 0;
uint8_t TwoWire::rxBuffer[I2C_BUFFER_LENGTH];
size_t TwoWire::rxBufferIndex = 0;
size_t TwoWire::rxBufferLength = 0;

uint8_t TwoWire::txAddress = 0;
uint8_t TwoWire::txBuffer[BUFFER_LENGTH];
uint8_t TwoWire::txBufferIndex = 0;
uint8_t TwoWire::txBufferLength = 0;
uint8_t TwoWire::txBuffer[I2C_BUFFER_LENGTH];
size_t TwoWire::txBufferIndex = 0;
size_t TwoWire::txBufferLength = 0;

uint8_t TwoWire::transmitting = 0;
void (*TwoWire::user_onRequest)(void);
Expand Down Expand Up @@ -122,9 +122,9 @@ void TwoWire::setClockStretchLimit(uint32_t limit)

size_t TwoWire::requestFrom(uint8_t address, size_t size, bool sendStop)
{
if (size > BUFFER_LENGTH)
if (size > I2C_BUFFER_LENGTH)
{
size = BUFFER_LENGTH;
size = I2C_BUFFER_LENGTH;
}
size_t read = (twi_readFrom(address, rxBuffer, size, sendStop) == 0) ? size : 0;
rxBufferIndex = 0;
Expand Down Expand Up @@ -183,7 +183,7 @@ size_t TwoWire::write(uint8_t data)
{
if (transmitting)
{
if (txBufferLength >= BUFFER_LENGTH)
if (txBufferLength >= I2C_BUFFER_LENGTH)
{
setWriteError();
return 0;
Expand Down
13 changes: 6 additions & 7 deletions libraries/Wire/Wire.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,23 @@
#include "Stream.h"



#ifndef I2C_BUFFER_LENGTH
// DEPRECATED: Do not use BUFFER_LENGTH, prefer I2C_BUFFER_LENGTH
#define BUFFER_LENGTH 128
#else
#define BUFFER_LENGTH I2C_BUFFER_LENGTH
#define I2C_BUFFER_LENGTH BUFFER_LENGTH
#endif

class TwoWire : public Stream
{
private:
static uint8_t rxBuffer[];
static uint8_t rxBufferIndex;
static uint8_t rxBufferLength;
static size_t rxBufferIndex;
static size_t rxBufferLength;

static uint8_t txAddress;
static uint8_t txBuffer[];
static uint8_t txBufferIndex;
static uint8_t txBufferLength;
static size_t txBufferIndex;
static size_t txBufferLength;

static uint8_t transmitting;
static void (*user_onRequest)(void);
Expand Down

0 comments on commit 42aa0e6

Please sign in to comment.