Skip to content

Commit 9e36b26

Browse files
Merge pull request firmata#156 from rwaldron/i2c-read-continuous-without-slave-configurable
Update I2C_READ_CONTINUOUSLY to match I2C_READ w/ no provided slaveRegister
2 parents fc82a6e + e28b079 commit 9e36b26

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

examples/StandardFirmata/StandardFirmata.ino

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ unsigned int samplingInterval = 19; // how often to run the main loop (
7070
/* i2c data */
7171
struct i2c_device_info {
7272
byte addr;
73-
byte reg;
73+
int reg;
7474
byte bytes;
7575
};
7676

@@ -329,10 +329,10 @@ void sysexCallback(byte command, byte argc, byte *argv)
329329
{
330330
byte mode;
331331
byte slaveAddress;
332-
byte slaveRegister;
333332
byte data;
334-
unsigned int delayTime;
335-
333+
int slaveRegister;
334+
unsigned int delayTime;
335+
336336
switch(command) {
337337
case I2C_REQUEST:
338338
mode = argv[1] & I2C_READ_WRITE_MODE_MASK;
@@ -363,24 +363,34 @@ void sysexCallback(byte command, byte argc, byte *argv)
363363
// a slave register is specified
364364
slaveRegister = argv[2] + (argv[3] << 7);
365365
data = argv[4] + (argv[5] << 7); // bytes to read
366-
readAndReportData(slaveAddress, (int)slaveRegister, data);
367366
}
368367
else {
369368
// a slave register is NOT specified
369+
slaveRegister = REGISTER_NOT_SPECIFIED;
370370
data = argv[2] + (argv[3] << 7); // bytes to read
371-
readAndReportData(slaveAddress, (int)REGISTER_NOT_SPECIFIED, data);
372371
}
372+
readAndReportData(slaveAddress, (int)slaveRegister, data);
373373
break;
374374
case I2C_READ_CONTINUOUSLY:
375375
if ((queryIndex + 1) >= MAX_QUERIES) {
376376
// too many queries, just ignore
377377
Firmata.sendString("too many queries");
378378
break;
379379
}
380+
if (argc == 6) {
381+
// a slave register is specified
382+
slaveRegister = argv[2] + (argv[3] << 7);
383+
data = argv[4] + (argv[5] << 7); // bytes to read
384+
}
385+
else {
386+
// a slave register is NOT specified
387+
slaveRegister = (int)REGISTER_NOT_SPECIFIED;
388+
data = argv[2] + (argv[3] << 7); // bytes to read
389+
}
380390
queryIndex++;
381391
query[queryIndex].addr = slaveAddress;
382-
query[queryIndex].reg = argv[2] + (argv[3] << 7);
383-
query[queryIndex].bytes = argv[4] + (argv[5] << 7);
392+
query[queryIndex].reg = slaveRegister;
393+
query[queryIndex].bytes = data;
384394
break;
385395
case I2C_STOP_READING:
386396
byte queryIndexToSkip;

utility/I2CFirmata.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ void I2CFirmata::handleI2CRequest(byte argc, byte *argv)
113113
{
114114
byte mode;
115115
byte slaveAddress;
116-
byte slaveRegister;
117116
byte data;
117+
int slaveRegister;
118118
mode = argv[1] & I2C_READ_WRITE_MODE_MASK;
119119
if (argv[1] & I2C_10BIT_ADDRESS_MODE_MASK) {
120120
Firmata.sendString("10-bit addressing not supported");
@@ -157,10 +157,20 @@ void I2CFirmata::handleI2CRequest(byte argc, byte *argv)
157157
Firmata.sendString("too many queries");
158158
break;
159159
}
160+
if (argc == 6) {
161+
// a slave register is specified
162+
slaveRegister = argv[2] + (argv[3] << 7);
163+
data = argv[4] + (argv[5] << 7); // bytes to read
164+
}
165+
else {
166+
// a slave register is NOT specified
167+
slaveRegister = (int)REGISTER_NOT_SPECIFIED;
168+
data = argv[2] + (argv[3] << 7); // bytes to read
169+
}
160170
queryIndex++;
161171
query[queryIndex].addr = slaveAddress;
162-
query[queryIndex].reg = argv[2] + (argv[3] << 7);
163-
query[queryIndex].bytes = argv[4] + (argv[5] << 7);
172+
query[queryIndex].reg = slaveRegister;
173+
query[queryIndex].bytes = data;
164174
break;
165175
case I2C_STOP_READING:
166176
byte queryIndexToSkip;

utility/I2CFirmata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
/* i2c data */
3737
struct i2c_device_info {
3838
byte addr;
39-
byte reg;
39+
int reg;
4040
byte bytes;
4141
};
4242

0 commit comments

Comments
 (0)