diff --git a/examples/StandardFirmata/StandardFirmata.ino b/examples/StandardFirmata/StandardFirmata.ino index 2488c79e..6f94829c 100755 --- a/examples/StandardFirmata/StandardFirmata.ino +++ b/examples/StandardFirmata/StandardFirmata.ino @@ -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 @@ -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 @@ -66,6 +69,7 @@ struct i2c_device_info { byte addr; int reg; byte bytes; + byte stopTX; }; /* for i2c read continuous more */ @@ -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 @@ -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; @@ -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); @@ -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) { @@ -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; @@ -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--; @@ -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); } } } diff --git a/examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino b/examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino index 11434206..044cdbac 100644 --- a/examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino +++ b/examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino @@ -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 // Gives us PWM and Servo on every pin @@ -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 @@ -67,6 +70,7 @@ struct i2c_device_info { byte addr; int reg; byte bytes; + byte stopTX; }; /* for i2c read continuous more */ @@ -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 @@ -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; @@ -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); @@ -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) { @@ -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; @@ -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--; @@ -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); } } } diff --git a/examples/StandardFirmataEthernet/StandardFirmataEthernet.ino b/examples/StandardFirmataEthernet/StandardFirmataEthernet.ino index 0a1d7f73..acb04864 100644 --- a/examples/StandardFirmataEthernet/StandardFirmataEthernet.ino +++ b/examples/StandardFirmataEthernet/StandardFirmataEthernet.ino @@ -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 */ /* @@ -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 @@ -184,6 +187,7 @@ struct i2c_device_info { byte addr; int reg; byte bytes; + byte stopTX; }; /* for i2c read continuous mode */ @@ -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 @@ -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; @@ -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); @@ -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) { @@ -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; @@ -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--; @@ -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); } } } diff --git a/examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.ino b/examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.ino index ad8f600c..a296f74a 100644 --- a/examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.ino +++ b/examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.ino @@ -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 */ /* @@ -76,6 +76,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 @@ -175,6 +178,7 @@ struct i2c_device_info { byte addr; int reg; byte bytes; + byte stopTX; }; /* for i2c read continuous mode */ @@ -352,14 +356,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 @@ -641,6 +645,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; @@ -657,6 +662,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); @@ -678,7 +692,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) { @@ -700,6 +714,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; @@ -723,6 +738,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--; @@ -1161,7 +1177,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); } } } diff --git a/examples/StandardFirmataPlus/StandardFirmataPlus.ino b/examples/StandardFirmataPlus/StandardFirmataPlus.ino index 9951735d..fddf93fa 100644 --- a/examples/StandardFirmataPlus/StandardFirmataPlus.ino +++ b/examples/StandardFirmataPlus/StandardFirmataPlus.ino @@ -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 */ /* @@ -59,6 +59,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 @@ -102,6 +105,7 @@ struct i2c_device_info { byte addr; int reg; byte bytes; + byte stopTX; }; /* for i2c read continuous more */ @@ -280,14 +284,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 @@ -573,6 +577,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; @@ -589,6 +594,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); @@ -610,7 +624,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) { @@ -632,6 +646,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; @@ -655,6 +670,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--; @@ -1073,7 +1089,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); } } }