aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Campbell <leecam@google.com>2016-03-09 19:06:07 -0800
committerLee Campbell <leecam@google.com>2016-03-10 09:54:47 -0800
commit0a407224a1e2b6f15fb56386f8a2633a703417e3 (patch)
tree1dbf2b1b6855b6af3239eee884d956d01bc1aa01
parente2d5fe09e909fbff34cba9d9c5f5e1464a194030 (diff)
downloadperipheralmanager-0a407224a1e2b6f15fb56386f8a2633a703417e3.tar.gz
Fix SPI Transfer rx code
TEST: Read SPI data from a sensor Change-Id: I4a853d89f177fd281c0cb29d64bc57d82d7a0478
-rw-r--r--client/spi_device_impl.cc18
-rw-r--r--daemon/peripheral_manager_client.cc8
2 files changed, 15 insertions, 11 deletions
diff --git a/client/spi_device_impl.cc b/client/spi_device_impl.cc
index 81d863c..e21ca5a 100644
--- a/client/spi_device_impl.cc
+++ b/client/spi_device_impl.cc
@@ -22,6 +22,7 @@
using android::sp;
using android::os::IPeripheralManagerClient;
+using android::binder::Status;
SpiDeviceImpl::SpiDeviceImpl(const std::string& name,
sp<IPeripheralManagerClient> client)
@@ -43,15 +44,18 @@ int SpiDeviceImpl::WriteBuffer(const uint8_t* data, size_t len) {
int SpiDeviceImpl::Transfer(const uint8_t* tx_data,
uint8_t* rx_data,
size_t len) {
- std::unique_ptr<std::vector<uint8_t>> sent(nullptr);
- std::unique_ptr<std::vector<uint8_t>> received(
- rx_data ? new std::vector<uint8_t> : nullptr);
+ std::unique_ptr<std::vector<uint8_t>> sent;
+ std::unique_ptr<std::vector<uint8_t>> received;
- if (tx_data != nullptr)
- sent.reset(new std::vector<uint8_t>(tx_data, tx_data + len));
+ if (tx_data == nullptr)
+ return EINVAL;
- return client_->SpiDeviceTransfer(name_, sent, &received, len)
- .serviceSpecificErrorCode();
+ sent.reset(new std::vector<uint8_t>(tx_data, tx_data + len));
+
+ Status status = client_->SpiDeviceTransfer(name_, sent, &received, len);
+ if (status.isOk() && rx_data)
+ memcpy(rx_data, received->data(), len);
+ return status.serviceSpecificErrorCode();
}
int SpiDeviceImpl::SetFrequency(uint32_t freq_hz) {
diff --git a/daemon/peripheral_manager_client.cc b/daemon/peripheral_manager_client.cc
index 5bffd6f..5eaa2e5 100644
--- a/daemon/peripheral_manager_client.cc
+++ b/daemon/peripheral_manager_client.cc
@@ -173,15 +173,15 @@ Status PeripheralManagerClient::SpiDeviceTransfer(
if (!spi_devices_.count(name))
return Status::fromServiceSpecificError(EPERM);
- uint8_t* data_sent = tx_data ? tx_data->data() : nullptr;
if (!rx_data) {
- if (spi_devices_.find(name)->second->Transfer(data_sent, nullptr, size)) {
+ if (spi_devices_.find(name)->second->Transfer(tx_data->data(), nullptr,
+ size)) {
return Status::ok();
}
} else {
rx_data->reset(new std::vector<uint8_t>(size));
- if (spi_devices_.find(name)->second->Transfer(data_sent, (*rx_data)->data(),
- size)) {
+ if (spi_devices_.find(name)->second->Transfer(tx_data->data(),
+ (*rx_data)->data(), size)) {
return Status::ok();
}
}