Skip to content

Commit 3e1cd22

Browse files
add i2c restart to all standardfirmata variants
1 parent bbae507 commit 3e1cd22

File tree

5 files changed

+85
-21
lines changed

5 files changed

+85
-21
lines changed

examples/StandardFirmata/StandardFirmata.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
#define I2C_END_TX_MASK B01000000
3737
#define I2C_STOP_TX 1
3838
#define I2C_RESTART_TX 0
39-
4039
#define I2C_MAX_QUERIES 8
4140
#define I2C_REGISTER_NOT_SPECIFIED -1
4241

@@ -465,6 +464,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
465464
else {
466465
stopTX = I2C_STOP_TX; // default
467466
}
467+
468468
switch (mode) {
469469
case I2C_WRITE:
470470
Wire.beginTransmission(slaveAddress);

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
}

examples/StandardFirmataEthernetPlus/StandardFirmataEthernetPlus.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
/*
@@ -76,6 +76,9 @@
7676
#define I2C_STOP_READING B00011000
7777
#define I2C_READ_WRITE_MODE_MASK B00011000
7878
#define I2C_10BIT_ADDRESS_MODE_MASK B00100000
79+
#define I2C_END_TX_MASK B01000000
80+
#define I2C_STOP_TX 1
81+
#define I2C_RESTART_TX 0
7982
#define I2C_MAX_QUERIES 8
8083
#define I2C_REGISTER_NOT_SPECIFIED -1
8184

@@ -175,6 +178,7 @@ struct i2c_device_info {
175178
byte addr;
176179
int reg;
177180
byte bytes;
181+
byte stopTX;
178182
};
179183

180184
/* for i2c read continuous mode */
@@ -352,14 +356,14 @@ void detachServo(byte pin)
352356
servoPinMap[pin] = 255;
353357
}
354358

355-
void readAndReportData(byte address, int theRegister, byte numBytes) {
359+
void readAndReportData(byte address, int theRegister, byte numBytes, byte stopTX) {
356360
// allow I2C requests that don't require a register read
357361
// for example, some devices using an interrupt pin to signify new data available
358362
// do not always require the register read so upon interrupt you call Wire.requestFrom()
359363
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
360364
Wire.beginTransmission(address);
361365
wireWrite((byte)theRegister);
362-
Wire.endTransmission();
366+
Wire.endTransmission(stopTX); // default = true
363367
// do not set a value of 0
364368
if (i2cReadDelayTime > 0) {
365369
// delay is necessary for some devices such as WiiNunchuck
@@ -641,6 +645,7 @@ void reportDigitalCallback(byte port, int value)
641645
void sysexCallback(byte command, byte argc, byte *argv)
642646
{
643647
byte mode;
648+
byte stopTX;
644649
byte slaveAddress;
645650
byte data;
646651
int slaveRegister;
@@ -657,6 +662,15 @@ void sysexCallback(byte command, byte argc, byte *argv)
657662
slaveAddress = argv[0];
658663
}
659664

665+
// need to invert the logic here since 0 will be default for client
666+
// libraries that have not updated to add support for restart tx
667+
if (argv[1] & I2C_END_TX_MASK) {
668+
stopTX = I2C_RESTART_TX;
669+
}
670+
else {
671+
stopTX = I2C_STOP_TX; // default
672+
}
673+
660674
switch (mode) {
661675
case I2C_WRITE:
662676
Wire.beginTransmission(slaveAddress);
@@ -678,7 +692,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
678692
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
679693
data = argv[2] + (argv[3] << 7); // bytes to read
680694
}
681-
readAndReportData(slaveAddress, (int)slaveRegister, data);
695+
readAndReportData(slaveAddress, (int)slaveRegister, data, stopTX);
682696
break;
683697
case I2C_READ_CONTINUOUSLY:
684698
if ((queryIndex + 1) >= I2C_MAX_QUERIES) {
@@ -700,6 +714,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
700714
query[queryIndex].addr = slaveAddress;
701715
query[queryIndex].reg = slaveRegister;
702716
query[queryIndex].bytes = data;
717+
query[queryIndex].stopTX = stopTX;
703718
break;
704719
case I2C_STOP_READING:
705720
byte queryIndexToSkip;
@@ -723,6 +738,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
723738
query[i].addr = query[i + 1].addr;
724739
query[i].reg = query[i + 1].reg;
725740
query[i].bytes = query[i + 1].bytes;
741+
query[i].stopTX = query[i + 1].stopTX;
726742
}
727743
}
728744
queryIndex--;
@@ -1161,7 +1177,7 @@ void loop()
11611177
// report i2c data for all device with read continuous mode enabled
11621178
if (queryIndex > -1) {
11631179
for (byte i = 0; i < queryIndex + 1; i++) {
1164-
readAndReportData(query[i].addr, query[i].reg, query[i].bytes);
1180+
readAndReportData(query[i].addr, query[i].reg, query[i].bytes, query[i].stopTX);
11651181
}
11661182
}
11671183
}

0 commit comments

Comments
 (0)