Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions examples/StandardFirmata/StandardFirmata.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

See file LICENSE.txt for further informations on licensing terms.

Last updated by Jeff Hoefs: November 7th, 2015
Last updated by Jeff Hoefs: December 9th, 2015
*/

#include <Servo.h>
Expand All @@ -33,6 +33,9 @@
#define I2C_STOP_READING B00011000
#define I2C_READ_WRITE_MODE_MASK B00011000
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
#define I2C_END_TX_MASK B01000000
#define I2C_STOP_TX 1
#define I2C_RESTART_TX 0
#define I2C_MAX_QUERIES 8
#define I2C_REGISTER_NOT_SPECIFIED -1

Expand Down Expand Up @@ -66,6 +69,7 @@ struct i2c_device_info {
byte addr;
int reg;
byte bytes;
byte stopTX;
};

/* for i2c read continuous more */
Expand Down Expand Up @@ -146,14 +150,14 @@ void detachServo(byte pin)
servoPinMap[pin] = 255;
}

void readAndReportData(byte address, int theRegister, byte numBytes) {
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
// allow I2C requests that don't require a register read
// for example, some devices using an interrupt pin to signify new data available
// do not always require the register read so upon interrupt you call Wire.requestFrom()
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
Wire.beginTransmission(address);
wireWrite((byte)theRegister);
Wire.endTransmission();
Wire.endTransmission(stopTX); // default = true
// do not set a value of 0
if (i2cReadDelayTime > 0) {
// delay is necessary for some devices such as WiiNunchuck
Expand Down Expand Up @@ -435,6 +439,7 @@ void reportDigitalCallback(byte port, int value)
void sysexCallback(byte command, byte argc, byte *argv)
{
byte mode;
byte stopTX;
byte slaveAddress;
byte data;
int slaveRegister;
Expand All @@ -451,6 +456,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveAddress = argv[0];
}

// need to invert the logic here since 0 will be default for client
// libraries that have not updated to add support for restart tx
if (argv[1] & I2C_END_TX_MASK) {
stopTX = I2C_RESTART_TX;
}
else {
stopTX = I2C_STOP_TX; // default
}

switch (mode) {
case I2C_WRITE:
Wire.beginTransmission(slaveAddress);
Expand All @@ -472,7 +486,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
data = argv[2] + (argv[3] << 7); // bytes to read
}
readAndReportData(slaveAddress, (int)slaveRegister, data);
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
break;
case I2C_READ_CONTINUOUSLY:
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
Expand All @@ -494,6 +508,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[queryIndex].addr = slaveAddress;
query[queryIndex].reg = slaveRegister;
query[queryIndex].bytes = data;
query[queryIndex].stopTX = stopTX;
break;
case I2C_STOP_READING:
byte queryIndexToSkip;
Expand All @@ -517,6 +532,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[i].addr = query[i + 1].addr;
query[i].reg = query[i + 1].reg;
query[i].bytes = query[i + 1].bytes;
query[i].stopTX = query[i + 1].stopTX;
}
}
queryIndex--;
Expand Down Expand Up @@ -765,7 +781,7 @@ void loop()
// report i2c data for all device with read continuous mode enabled
if (queryIndex > -1) {
for (byte i = 0; i < queryIndex + 1; i++) {
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
}
}
}
Expand Down
26 changes: 21 additions & 5 deletions examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

See file LICENSE.txt for further informations on licensing terms.

Last updated by Jeff Hoefs: November 7th, 2015
Last updated by Jeff Hoefs: December 9th, 2015
*/

#include <SoftPWMServo.h> // Gives us PWM and Servo on every pin
Expand All @@ -34,6 +34,9 @@
#define I2C_STOP_READING B00011000
#define I2C_READ_WRITE_MODE_MASK B00011000
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
#define I2C_END_TX_MASK B01000000
#define I2C_STOP_TX 1
#define I2C_RESTART_TX 0
#define I2C_MAX_QUERIES 8
#define I2C_REGISTER_NOT_SPECIFIED -1

Expand Down Expand Up @@ -67,6 +70,7 @@ struct i2c_device_info {
byte addr;
int reg;
byte bytes;
byte stopTX;
};

/* for i2c read continuous more */
Expand Down Expand Up @@ -147,14 +151,14 @@ void detachServo(byte pin)
servoPinMap[pin] = 255;
}

void readAndReportData(byte address, int theRegister, byte numBytes) {
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
// allow I2C requests that don't require a register read
// for example, some devices using an interrupt pin to signify new data available
// do not always require the register read so upon interrupt you call Wire.requestFrom()
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
Wire.beginTransmission(address);
wireWrite((byte)theRegister);
Wire.endTransmission();
Wire.endTransmission(stopTX); // default = true
// do not set a value of 0
if (i2cReadDelayTime > 0) {
// delay is necessary for some devices such as WiiNunchuck
Expand Down Expand Up @@ -446,6 +450,7 @@ void reportDigitalCallback(byte port, int value)
void sysexCallback(byte command, byte argc, byte *argv)
{
byte mode;
byte stopTX;
byte slaveAddress;
byte data;
int slaveRegister;
Expand All @@ -462,6 +467,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveAddress = argv[0];
}

// need to invert the logic here since 0 will be default for client
// libraries that have not updated to add support for restart tx
if (argv[1] & I2C_END_TX_MASK) {
stopTX = I2C_RESTART_TX;
}
else {
stopTX = I2C_STOP_TX; // default
}

switch (mode) {
case I2C_WRITE:
Wire.beginTransmission(slaveAddress);
Expand All @@ -483,7 +497,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
data = argv[2] + (argv[3] << 7); // bytes to read
}
readAndReportData(slaveAddress, (int)slaveRegister, data);
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
break;
case I2C_READ_CONTINUOUSLY:
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
Expand All @@ -505,6 +519,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[queryIndex].addr = slaveAddress;
query[queryIndex].reg = slaveRegister;
query[queryIndex].bytes = data;
query[queryIndex].stopTX = stopTX;
break;
case I2C_STOP_READING:
byte queryIndexToSkip;
Expand All @@ -528,6 +543,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[i].addr = query[i + 1].addr;
query[i].reg = query[i + 1].reg;
query[i].bytes = query[i + 1].bytes;
query[i].stopTX = query[i + 1].stopTX;
}
}
queryIndex--;
Expand Down Expand Up @@ -771,7 +787,7 @@ void loop()
// report i2c data for all device with read continuous mode enabled
if (queryIndex > -1) {
for (byte i = 0; i < queryIndex + 1; i++) {
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
}
}
}
Expand Down
26 changes: 21 additions & 5 deletions examples/StandardFirmataEthernet/StandardFirmataEthernet.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

See file LICENSE.txt for further informations on licensing terms.

Last updated by Jeff Hoefs: November 7th, 2015
Last updated by Jeff Hoefs: December 9th, 2015
*/

/*
Expand Down Expand Up @@ -61,6 +61,9 @@
#define I2C_STOP_READING B00011000
#define I2C_READ_WRITE_MODE_MASK B00011000
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
#define I2C_END_TX_MASK B01000000
#define I2C_STOP_TX 1
#define I2C_RESTART_TX 0
#define I2C_MAX_QUERIES 8
#define I2C_REGISTER_NOT_SPECIFIED -1

Expand Down Expand Up @@ -184,6 +187,7 @@ struct i2c_device_info {
byte addr;
int reg;
byte bytes;
byte stopTX;
};

/* for i2c read continuous mode */
Expand Down Expand Up @@ -264,14 +268,14 @@ void detachServo(byte pin)
servoPinMap[pin] = 255;
}

void readAndReportData(byte address, int theRegister, byte numBytes) {
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
// allow I2C requests that don't require a register read
// for example, some devices using an interrupt pin to signify new data available
// do not always require the register read so upon interrupt you call Wire.requestFrom()
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
Wire.beginTransmission(address);
wireWrite((byte)theRegister);
Wire.endTransmission();
Wire.endTransmission(stopTX); // default = true
// do not set a value of 0
if (i2cReadDelayTime > 0) {
// delay is necessary for some devices such as WiiNunchuck
Expand Down Expand Up @@ -553,6 +557,7 @@ void reportDigitalCallback(byte port, int value)
void sysexCallback(byte command, byte argc, byte *argv)
{
byte mode;
byte stopTX;
byte slaveAddress;
byte data;
int slaveRegister;
Expand All @@ -569,6 +574,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveAddress = argv[0];
}

// need to invert the logic here since 0 will be default for client
// libraries that have not updated to add support for restart tx
if (argv[1] & I2C_END_TX_MASK) {
stopTX = I2C_RESTART_TX;
}
else {
stopTX = I2C_STOP_TX; // default
}

switch (mode) {
case I2C_WRITE:
Wire.beginTransmission(slaveAddress);
Expand All @@ -590,7 +604,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
data = argv[2] + (argv[3] << 7); // bytes to read
}
readAndReportData(slaveAddress, (int)slaveRegister, data);
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
break;
case I2C_READ_CONTINUOUSLY:
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
Expand All @@ -612,6 +626,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[queryIndex].addr = slaveAddress;
query[queryIndex].reg = slaveRegister;
query[queryIndex].bytes = data;
query[queryIndex].stopTX = stopTX;
break;
case I2C_STOP_READING:
byte queryIndexToSkip;
Expand All @@ -635,6 +650,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
query[i].addr = query[i + 1].addr;
query[i].reg = query[i + 1].reg;
query[i].bytes = query[i + 1].bytes;
query[i].stopTX = query[i + 1].stopTX;
}
}
queryIndex--;
Expand Down Expand Up @@ -915,7 +931,7 @@ void loop()
// report i2c data for all device with read continuous mode enabled
if (queryIndex > -1) {
for (byte i = 0; i < queryIndex + 1; i++) {
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
}
}
}
Expand Down
Loading