Skip to content

Commit 8686cb6

Browse files
Merge pull request #226 from firmata/restart-i2c
enable option to auto restart i2c transmission per issue #82
2 parents 2c82cc1 + 3e1cd22 commit 8686cb6

File tree

5 files changed

+105
-25
lines changed

5 files changed

+105
-25
lines changed

examples/StandardFirmata/StandardFirmata.ino

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
2121
See file LICENSE.txt for further informations on licensing terms.
2222
23-
Last updated by Jeff Hoefs: November 7th, 2015
23+
Last updated by Jeff Hoefs: December 9th, 2015
2424
*/
2525

2626
#include <Servo.h>
@@ -33,6 +33,9 @@
3333
#define I2C_STOP_READING B00011000
3434
#define I2C_READ_WRITE_MODE_MASK B00011000
3535
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
36+
#define I2C_END_TX_MASK B01000000
37+
#define I2C_STOP_TX 1
38+
#define I2C_RESTART_TX 0
3639
#define I2C_MAX_QUERIES 8
3740
#define I2C_REGISTER_NOT_SPECIFIED -1
3841

@@ -66,6 +69,7 @@ struct i2c_device_info {
6669
byte addr;
6770
int reg;
6871
byte bytes;
72+
byte stopTX;
6973
};
7074

7175
/* for i2c read continuous more */
@@ -146,14 +150,14 @@ void detachServo(byte pin)
146150
servoPinMap[pin] = 255;
147151
}
148152

149-
void readAndReportData(byte address, int theRegister, byte numBytes) {
153+
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
150154
// allow I2C requests that don't require a register read
151155
// for example, some devices using an interrupt pin to signify new data available
152156
// do not always require the register read so upon interrupt you call Wire.requestFrom()
153157
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
154158
Wire.beginTransmission(address);
155159
wireWrite((byte)theRegister);
156-
Wire.endTransmission();
160+
Wire.endTransmission(stopTX); // default = true
157161
// do not set a value of 0
158162
if (i2cReadDelayTime > 0) {
159163
// delay is necessary for some devices such as WiiNunchuck
@@ -435,6 +439,7 @@ void reportDigitalCallback(byte port, int value)
435439
void sysexCallback(byte command, byte argc, byte *argv)
436440
{
437441
byte mode;
442+
byte stopTX;
438443
byte slaveAddress;
439444
byte data;
440445
int slaveRegister;
@@ -451,6 +456,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
451456
slaveAddress = argv[0];
452457
}
453458

459+
// need to invert the logic here since 0 will be default for client
460+
// libraries that have not updated to add support for restart tx
461+
if (argv[1] & I2C_END_TX_MASK) {
462+
stopTX = I2C_RESTART_TX;
463+
}
464+
else {
465+
stopTX = I2C_STOP_TX; // default
466+
}
467+
454468
switch (mode) {
455469
case I2C_WRITE:
456470
Wire.beginTransmission(slaveAddress);
@@ -472,7 +486,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
472486
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
473487
data = argv[2] + (argv[3] << 7); // bytes to read
474488
}
475-
readAndReportData(slaveAddress, (int)slaveRegister, data);
489+
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
476490
break;
477491
case I2C_READ_CONTINUOUSLY:
478492
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
@@ -494,6 +508,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
494508
query[queryIndex].addr = slaveAddress;
495509
query[queryIndex].reg = slaveRegister;
496510
query[queryIndex].bytes = data;
511+
query[queryIndex].stopTX = stopTX;
497512
break;
498513
case I2C_STOP_READING:
499514
byte queryIndexToSkip;
@@ -517,6 +532,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
517532
query[i].addr = query[i + 1].addr;
518533
query[i].reg = query[i + 1].reg;
519534
query[i].bytes = query[i + 1].bytes;
535+
query[i].stopTX = query[i + 1].stopTX;
520536
}
521537
}
522538
queryIndex--;
@@ -765,7 +781,7 @@ void loop()
765781
// report i2c data for all device with read continuous mode enabled
766782
if (queryIndex > -1) {
767783
for (byte i = 0; i < queryIndex + 1; i++) {
768-
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
784+
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
769785
}
770786
}
771787
}

examples/StandardFirmataChipKIT/StandardFirmataChipKIT.ino

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
2222
See file LICENSE.txt for further informations on licensing terms.
2323
24-
Last updated by Jeff Hoefs: November 7th, 2015
24+
Last updated by Jeff Hoefs: December 9th, 2015
2525
*/
2626

2727
#include <SoftPWMServo.h> // Gives us PWM and Servo on every pin
@@ -34,6 +34,9 @@
3434
#define I2C_STOP_READING B00011000
3535
#define I2C_READ_WRITE_MODE_MASK B00011000
3636
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
37+
#define I2C_END_TX_MASK B01000000
38+
#define I2C_STOP_TX 1
39+
#define I2C_RESTART_TX 0
3740
#define I2C_MAX_QUERIES 8
3841
#define I2C_REGISTER_NOT_SPECIFIED -1
3942

@@ -67,6 +70,7 @@ struct i2c_device_info {
6770
byte addr;
6871
int reg;
6972
byte bytes;
73+
byte stopTX;
7074
};
7175

7276
/* for i2c read continuous more */
@@ -147,14 +151,14 @@ void detachServo(byte pin)
147151
servoPinMap[pin] = 255;
148152
}
149153

150-
void readAndReportData(byte address, int theRegister, byte numBytes) {
154+
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
151155
// allow I2C requests that don't require a register read
152156
// for example, some devices using an interrupt pin to signify new data available
153157
// do not always require the register read so upon interrupt you call Wire.requestFrom()
154158
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
155159
Wire.beginTransmission(address);
156160
wireWrite((byte)theRegister);
157-
Wire.endTransmission();
161+
Wire.endTransmission(stopTX); // default = true
158162
// do not set a value of 0
159163
if (i2cReadDelayTime > 0) {
160164
// delay is necessary for some devices such as WiiNunchuck
@@ -446,6 +450,7 @@ void reportDigitalCallback(byte port, int value)
446450
void sysexCallback(byte command, byte argc, byte *argv)
447451
{
448452
byte mode;
453+
byte stopTX;
449454
byte slaveAddress;
450455
byte data;
451456
int slaveRegister;
@@ -462,6 +467,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
462467
slaveAddress = argv[0];
463468
}
464469

470+
// need to invert the logic here since 0 will be default for client
471+
// libraries that have not updated to add support for restart tx
472+
if (argv[1] & I2C_END_TX_MASK) {
473+
stopTX = I2C_RESTART_TX;
474+
}
475+
else {
476+
stopTX = I2C_STOP_TX; // default
477+
}
478+
465479
switch (mode) {
466480
case I2C_WRITE:
467481
Wire.beginTransmission(slaveAddress);
@@ -483,7 +497,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
483497
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
484498
data = argv[2] + (argv[3] << 7); // bytes to read
485499
}
486-
readAndReportData(slaveAddress, (int)slaveRegister, data);
500+
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
487501
break;
488502
case I2C_READ_CONTINUOUSLY:
489503
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
@@ -505,6 +519,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
505519
query[queryIndex].addr = slaveAddress;
506520
query[queryIndex].reg = slaveRegister;
507521
query[queryIndex].bytes = data;
522+
query[queryIndex].stopTX = stopTX;
508523
break;
509524
case I2C_STOP_READING:
510525
byte queryIndexToSkip;
@@ -528,6 +543,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
528543
query[i].addr = query[i + 1].addr;
529544
query[i].reg = query[i + 1].reg;
530545
query[i].bytes = query[i + 1].bytes;
546+
query[i].stopTX = query[i + 1].stopTX;
531547
}
532548
}
533549
queryIndex--;
@@ -771,7 +787,7 @@ void loop()
771787
// report i2c data for all device with read continuous mode enabled
772788
if (queryIndex > -1) {
773789
for (byte i = 0; i < queryIndex + 1; i++) {
774-
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
790+
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
775791
}
776792
}
777793
}

examples/StandardFirmataEthernet/StandardFirmataEthernet.ino

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
2121
See file LICENSE.txt for further informations on licensing terms.
2222
23-
Last updated by Jeff Hoefs: November 7th, 2015
23+
Last updated by Jeff Hoefs: December 9th, 2015
2424
*/
2525

2626
/*
@@ -61,6 +61,9 @@
6161
#define I2C_STOP_READING B00011000
6262
#define I2C_READ_WRITE_MODE_MASK B00011000
6363
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
64+
#define I2C_END_TX_MASK B01000000
65+
#define I2C_STOP_TX 1
66+
#define I2C_RESTART_TX 0
6467
#define I2C_MAX_QUERIES 8
6568
#define I2C_REGISTER_NOT_SPECIFIED -1
6669

@@ -184,6 +187,7 @@ struct i2c_device_info {
184187
byte addr;
185188
int reg;
186189
byte bytes;
190+
byte stopTX;
187191
};
188192

189193
/* for i2c read continuous mode */
@@ -264,14 +268,14 @@ void detachServo(byte pin)
264268
servoPinMap[pin] = 255;
265269
}
266270

267-
void readAndReportData(byte address, int theRegister, byte numBytes) {
271+
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
268272
// allow I2C requests that don't require a register read
269273
// for example, some devices using an interrupt pin to signify new data available
270274
// do not always require the register read so upon interrupt you call Wire.requestFrom()
271275
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
272276
Wire.beginTransmission(address);
273277
wireWrite((byte)theRegister);
274-
Wire.endTransmission();
278+
Wire.endTransmission(stopTX); // default = true
275279
// do not set a value of 0
276280
if (i2cReadDelayTime > 0) {
277281
// delay is necessary for some devices such as WiiNunchuck
@@ -553,6 +557,7 @@ void reportDigitalCallback(byte port, int value)
553557
void sysexCallback(byte command, byte argc, byte *argv)
554558
{
555559
byte mode;
560+
byte stopTX;
556561
byte slaveAddress;
557562
byte data;
558563
int slaveRegister;
@@ -569,6 +574,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
569574
slaveAddress = argv[0];
570575
}
571576

577+
// need to invert the logic here since 0 will be default for client
578+
// libraries that have not updated to add support for restart tx
579+
if (argv[1] & I2C_END_TX_MASK) {
580+
stopTX = I2C_RESTART_TX;
581+
}
582+
else {
583+
stopTX = I2C_STOP_TX; // default
584+
}
585+
572586
switch (mode) {
573587
case I2C_WRITE:
574588
Wire.beginTransmission(slaveAddress);
@@ -590,7 +604,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
590604
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
591605
data = argv[2] + (argv[3] << 7); // bytes to read
592606
}
593-
readAndReportData(slaveAddress, (int)slaveRegister, data);
607+
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
594608
break;
595609
case I2C_READ_CONTINUOUSLY:
596610
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
@@ -612,6 +626,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
612626
query[queryIndex].addr = slaveAddress;
613627
query[queryIndex].reg = slaveRegister;
614628
query[queryIndex].bytes = data;
629+
query[queryIndex].stopTX = stopTX;
615630
break;
616631
case I2C_STOP_READING:
617632
byte queryIndexToSkip;
@@ -635,6 +650,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
635650
query[i].addr = query[i + 1].addr;
636651
query[i].reg = query[i + 1].reg;
637652
query[i].bytes = query[i + 1].bytes;
653+
query[i].stopTX = query[i + 1].stopTX;
638654
}
639655
}
640656
queryIndex--;
@@ -915,7 +931,7 @@ void loop()
915931
// report i2c data for all device with read continuous mode enabled
916932
if (queryIndex > -1) {
917933
for (byte i = 0; i < queryIndex + 1; i++) {
918-
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
934+
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
919935
}
920936
}
921937
}

0 commit comments

Comments
 (0)