33
33
#define I2C_STOP_READING B00011000
34
34
#define I2C_READ_WRITE_MODE_MASK B00011000
35
35
#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
39
+
36
40
#define I2C_MAX_QUERIES 8
37
41
#define I2C_REGISTER_NOT_SPECIFIED -1
38
42
@@ -66,6 +70,7 @@ struct i2c_device_info {
66
70
byte addr;
67
71
int reg;
68
72
byte bytes;
73
+ byte stopTX;
69
74
};
70
75
71
76
/* for i2c read continuous more */
@@ -153,7 +158,7 @@ void readAndReportData(byte address, int theRegister, byte numBytes) {
153
158
if (theRegister != I2C_REGISTER_NOT_SPECIFIED) {
154
159
Wire.beginTransmission (address);
155
160
wireWrite ((byte)theRegister);
156
- Wire.endTransmission ();
161
+ Wire.endTransmission (stopTX); // default = true
157
162
// do not set a value of 0
158
163
if (i2cReadDelayTime > 0 ) {
159
164
// delay is necessary for some devices such as WiiNunchuck
@@ -435,6 +440,7 @@ void reportDigitalCallback(byte port, int value)
435
440
void sysexCallback (byte command, byte argc, byte *argv)
436
441
{
437
442
byte mode;
443
+ byte stopTX;
438
444
byte slaveAddress;
439
445
byte data;
440
446
int slaveRegister;
@@ -451,6 +457,14 @@ void sysexCallback(byte command, byte argc, byte *argv)
451
457
slaveAddress = argv[0 ];
452
458
}
453
459
460
+ // need to invert the logic here since 0 will be default for client
461
+ // libraries that have not updated to add support for restart tx
462
+ if (argv[1 ] & I2C_END_TX_MASK) {
463
+ stopTX = I2C_RESTART_TX;
464
+ }
465
+ else {
466
+ stopTX = I2C_STOP_TX; // default
467
+ }
454
468
switch (mode) {
455
469
case I2C_WRITE:
456
470
Wire.beginTransmission (slaveAddress);
@@ -472,7 +486,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
472
486
slaveRegister = I2C_REGISTER_NOT_SPECIFIED;
473
487
data = argv[2 ] + (argv[3 ] << 7 ); // bytes to read
474
488
}
475
- readAndReportData (slaveAddress, (int )slaveRegister, data);
489
+ readAndReportData (slaveAddress, (int )slaveRegister, data, stopTX );
476
490
break ;
477
491
case I2C_READ_CONTINUOUSLY:
478
492
if ((queryIndex + 1 ) >= I2C_MAX_QUERIES) {
@@ -494,6 +508,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
494
508
query[queryIndex].addr = slaveAddress;
495
509
query[queryIndex].reg = slaveRegister;
496
510
query[queryIndex].bytes = data;
511
+ query[queryIndex].stopTX = stopTX;
497
512
break ;
498
513
case I2C_STOP_READING:
499
514
byte queryIndexToSkip;
@@ -517,6 +532,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
517
532
query[i].addr = query[i + 1 ].addr ;
518
533
query[i].reg = query[i + 1 ].reg ;
519
534
query[i].bytes = query[i + 1 ].bytes ;
535
+ query[i].stopTX = query[i + 1 ].stopTX ;
520
536
}
521
537
}
522
538
queryIndex--;
@@ -765,7 +781,7 @@ void loop()
765
781
// report i2c data for all device with read continuous mode enabled
766
782
if (queryIndex > -1 ) {
767
783
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 );
769
785
}
770
786
}
771
787
}
0 commit comments