From d3b54c359949e05af4384fd5ebfa9b70527a0d51 Mon Sep 17 00:00:00 2001 From: Jake Dahl <jacob.dahl@tealdrones.com> Date: Thu, 11 Oct 2018 09:35:21 -0600 Subject: [PATCH] more changes based on suggestions --- src/lib/drivers/smbus/SMBus.cpp | 51 +++++++++++---------------------- 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/src/lib/drivers/smbus/SMBus.cpp b/src/lib/drivers/smbus/SMBus.cpp index c04fedcacf..2b563aca9d 100644 --- a/src/lib/drivers/smbus/SMBus.cpp +++ b/src/lib/drivers/smbus/SMBus.cpp @@ -69,33 +69,23 @@ int SMBus::read_word(const uint8_t cmd_code, void *data) int SMBus::block_read(const uint8_t cmd_code, void *data, const uint8_t length, bool use_pec) { unsigned byte_count = 0; - // Length of data (32max). byte_count(1), cmd_code(2) (sometimes), pec(1) (optional) - uint8_t rx_data[32 + 4]; + // addr(wr), cmd_code, addr(r), byte_count, data (32 bytes max), pec + uint8_t rx_data[32 + 5]; - int result = transfer(&cmd_code, 1, (uint8_t *)rx_data, length + 2); + int result = transfer(&cmd_code, 1, (uint8_t *)&rx_data[3], length + 2); - byte_count = rx_data[0]; + uint8_t device_address = get_device_address(); + rx_data[0] = (device_address << 1) | 0x00; + rx_data[1] = cmd_code; + rx_data[2] = (device_address << 1) | 0x01; + byte_count = rx_data[3]; - // byte_count, data[length], PEC - memcpy(data, &rx_data[1], byte_count); + memcpy(data, &rx_data[4], byte_count); if (use_pec) { + uint8_t pec = get_pec(rx_data, byte_count + 4); - // addr(wr), cmd_code, addr(r), byte_count, rx_data[] - uint8_t device_address = get_device_address(); - uint8_t full_data_packet[32 + 4] = {}; - - full_data_packet[0] = (device_address << 1) | 0x00; - full_data_packet[1] = cmd_code; - full_data_packet[2] = (device_address << 1) | 0x01; - full_data_packet[3] = byte_count; - - memcpy(&full_data_packet[4], &rx_data[1], byte_count); - - uint8_t pec = get_pec(full_data_packet, byte_count + 4); - - // First byte is byte count, followed by data. - if (pec != ((uint8_t *)rx_data)[byte_count + 1]) { + if (pec != rx_data[byte_count + 4]) { result = -EINVAL; } } @@ -122,20 +112,13 @@ int SMBus::block_write(const uint8_t cmd_code, void *data, uint8_t byte_count, b int result = 0; // If block_write fails, try up to 10 times. - while (i < 10) { - result = transfer((uint8_t *)buf, byte_count + 2, nullptr, 0); - - if (result != PX4_OK) { - i++; - - if (i == 10) { - PX4_WARN("Block_write failed 10 times"); - result = -EINVAL; - } + while (i < 10 && (result = transfer((uint8_t *)buf, byte_count + 2, nullptr, 0)) != PX4_OK) { + i++; + } - } else { - break; - } + if (i == 10) { + PX4_WARN("Block_write failed 10 times"); + result = -EINVAL; } return result; -- GitLab