Private
Public Access
2
0

firmata: provide timeout for i2c read calls

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Brendan Le Foll
2016-03-16 17:00:17 +00:00
parent 451dcbad6c
commit 67eaf78fbf

View File

@@ -176,15 +176,27 @@ mraa_firmata_send_i2c_read_cont_req(mraa_i2c_context dev, uint8_t command, int l
return MRAA_SUCCESS;
}
static mraa_result_t
mraa_firmata_i2c_wait(int addr, int reg)
{
int i = 0;
for (i = 0; firmata_dev->i2cmsg[addr][reg] == -1; i++) {
if (i > 50) {
return MRAA_ERROR_UNSPECIFIED;
}
usleep(500);
}
return MRAA_SUCCESS;
}
static uint8_t
mraa_firmata_i2c_read_byte(mraa_i2c_context dev)
{
if (mraa_firmata_send_i2c_read_req(dev, 1) == MRAA_SUCCESS) {
while (firmata_dev->i2cmsg[dev->addr][0] == -1) {
usleep(500);
}
if (mraa_firmata_i2c_wait(dev->addr, 0) == MRAA_SUCCESS) {
return firmata_dev->i2cmsg[dev->addr][0];
}
}
return 0;
}
@@ -192,10 +204,7 @@ static uint16_t
mraa_firmata_i2c_read_word_data(mraa_i2c_context dev, uint8_t command)
{
if (mraa_firmata_send_i2c_read_cont_req(dev, command, 2) == MRAA_SUCCESS) {
while (firmata_dev->i2cmsg[dev->addr][command] == -1) {
usleep(500);
}
if (mraa_firmata_i2c_wait(dev->addr, command) == MRAA_SUCCESS) {
uint8_t* rawdata[2];
rawdata[0] = firmata_dev->i2cmsg[dev->addr][command];
rawdata[1] = firmata_dev->i2cmsg[dev->addr][command+1];
@@ -206,6 +215,7 @@ mraa_firmata_i2c_read_word_data(mraa_i2c_context dev, uint8_t command)
return data;
}
}
return 0;
}
@@ -213,13 +223,11 @@ static int
mraa_firmata_i2c_read_bytes_data(mraa_i2c_context dev, uint8_t command, uint8_t* data, int length)
{
if (mraa_firmata_send_i2c_read_cont_req(dev, command, length) == MRAA_SUCCESS) {
while (firmata_dev->i2cmsg[dev->addr][command] == -1) {
usleep(500);
}
if (mraa_firmata_i2c_wait(dev->addr, command) == MRAA_SUCCESS) {
memcpy(data, &firmata_dev->i2cmsg[dev->addr][command], sizeof(int)*length);
return length;
}
}
return 0;
}
@@ -227,15 +235,14 @@ static int
mraa_firmata_i2c_read(mraa_i2c_context dev, uint8_t* data, int length)
{
if (mraa_firmata_send_i2c_read_req(dev, length) == MRAA_SUCCESS) {
while (firmata_dev->i2cmsg[dev->addr][0] == -1) {
usleep(500);
}
if (mraa_firmata_i2c_wait(dev->addr, 0) == MRAA_SUCCESS) {
int i = 0;
for (i = 0; i < length; i++) {
data[i] = firmata_dev->i2cmsg[dev->addr][i];
}
return length;
}
}
return 0;
}
@@ -244,12 +251,10 @@ static uint8_t
mraa_firmata_i2c_read_byte_data(mraa_i2c_context dev, uint8_t command)
{
if (mraa_firmata_send_i2c_read_cont_req(dev, command, 1) == MRAA_SUCCESS) {
while (firmata_dev->i2cmsg[dev->addr][command] == -1) {
usleep(500);
}
if (mraa_firmata_i2c_wait(dev->addr, command) == MRAA_SUCCESS) {
return firmata_dev->i2cmsg[dev->addr][command];
}
}
return 0;
}